125 lines
4.1 KiB
JavaScript
125 lines
4.1 KiB
JavaScript
// Custom JavaScript for Speakr documentation
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Add smooth scrolling for anchor links
|
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
anchor.addEventListener('click', function (e) {
|
|
const href = this.getAttribute('href');
|
|
if (href === '#') return;
|
|
|
|
e.preventDefault();
|
|
const target = document.querySelector(href);
|
|
if (target) {
|
|
target.scrollIntoView({
|
|
behavior: 'smooth',
|
|
block: 'start'
|
|
});
|
|
|
|
// Update URL without jumping
|
|
history.pushState(null, null, href);
|
|
}
|
|
});
|
|
});
|
|
|
|
// Add external link indicators
|
|
document.querySelectorAll('a[href^="http"]').forEach(link => {
|
|
if (!link.hostname.includes(window.location.hostname)) {
|
|
link.setAttribute('target', '_blank');
|
|
link.setAttribute('rel', 'noopener noreferrer');
|
|
|
|
// Add external icon if not already present
|
|
if (!link.querySelector('.external-icon')) {
|
|
const icon = document.createElement('span');
|
|
icon.className = 'external-icon';
|
|
icon.innerHTML = ' ↗';
|
|
icon.style.fontSize = '0.75em';
|
|
icon.style.verticalAlign = 'super';
|
|
link.appendChild(icon);
|
|
}
|
|
}
|
|
});
|
|
|
|
// Enhance search functionality
|
|
const searchInput = document.querySelector('.md-search__input');
|
|
if (searchInput) {
|
|
// Add keyboard shortcut hint
|
|
searchInput.setAttribute('placeholder', 'Search (Press "/" to focus)');
|
|
|
|
// Add "/" keyboard shortcut
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.key === '/' && !searchInput.matches(':focus')) {
|
|
e.preventDefault();
|
|
searchInput.focus();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Add responsive tables wrapper
|
|
document.querySelectorAll('table').forEach(table => {
|
|
if (!table.parentElement.classList.contains('table-wrapper')) {
|
|
const wrapper = document.createElement('div');
|
|
wrapper.className = 'table-wrapper';
|
|
wrapper.style.overflowX = 'auto';
|
|
table.parentElement.insertBefore(wrapper, table);
|
|
wrapper.appendChild(table);
|
|
}
|
|
});
|
|
|
|
// Add image zoom functionality
|
|
document.querySelectorAll('.md-content img').forEach(img => {
|
|
img.style.cursor = 'zoom-in';
|
|
img.addEventListener('click', function() {
|
|
const overlay = document.createElement('div');
|
|
overlay.style.position = 'fixed';
|
|
overlay.style.top = '0';
|
|
overlay.style.left = '0';
|
|
overlay.style.width = '100%';
|
|
overlay.style.height = '100%';
|
|
overlay.style.background = 'rgba(0, 0, 0, 0.9)';
|
|
overlay.style.zIndex = '9999';
|
|
overlay.style.display = 'flex';
|
|
overlay.style.alignItems = 'center';
|
|
overlay.style.justifyContent = 'center';
|
|
overlay.style.cursor = 'zoom-out';
|
|
|
|
const zoomedImg = document.createElement('img');
|
|
zoomedImg.src = img.src;
|
|
zoomedImg.style.maxWidth = '90%';
|
|
zoomedImg.style.maxHeight = '90%';
|
|
zoomedImg.style.objectFit = 'contain';
|
|
|
|
overlay.appendChild(zoomedImg);
|
|
document.body.appendChild(overlay);
|
|
|
|
overlay.addEventListener('click', function() {
|
|
document.body.removeChild(overlay);
|
|
});
|
|
|
|
// Close on Escape key
|
|
document.addEventListener('keydown', function closeOnEscape(e) {
|
|
if (e.key === 'Escape' && document.body.contains(overlay)) {
|
|
document.body.removeChild(overlay);
|
|
document.removeEventListener('keydown', closeOnEscape);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
// Add loading indicator for slow operations
|
|
window.addEventListener('load', function() {
|
|
// Remove any loading indicators
|
|
const loader = document.querySelector('.page-loader');
|
|
if (loader) {
|
|
loader.style.display = 'none';
|
|
}
|
|
});
|
|
|
|
// Print-friendly styling
|
|
window.addEventListener('beforeprint', function() {
|
|
document.body.classList.add('print-mode');
|
|
});
|
|
|
|
window.addEventListener('afterprint', function() {
|
|
document.body.classList.remove('print-mode');
|
|
}); |