69 lines
2.6 KiB
JavaScript
69 lines
2.6 KiB
JavaScript
document.addEventListener('DOMContentLoaded', () => {
|
|
const navbar = document.querySelector('.site-navbar');
|
|
const onScroll = () => {
|
|
if (navbar) {
|
|
navbar.classList.toggle('scrolled', window.scrollY > 12);
|
|
}
|
|
};
|
|
|
|
document.addEventListener('scroll', onScroll, { passive: true });
|
|
onScroll();
|
|
|
|
if (window.bootstrap && typeof bootstrap.Toast === 'function') {
|
|
document.querySelectorAll('.toast').forEach((toastElement) => {
|
|
const toast = new bootstrap.Toast(toastElement, { delay: 5200 });
|
|
toast.show();
|
|
});
|
|
}
|
|
|
|
const filterButtons = document.querySelectorAll('[data-service-filter]');
|
|
const serviceItems = document.querySelectorAll('[data-service-track]');
|
|
|
|
if (filterButtons.length && serviceItems.length) {
|
|
filterButtons.forEach((button) => {
|
|
button.addEventListener('click', () => {
|
|
const filter = button.dataset.serviceFilter || 'all';
|
|
filterButtons.forEach((candidate) => candidate.classList.toggle('active', candidate === button));
|
|
serviceItems.forEach((item) => {
|
|
const track = item.dataset.serviceTrack || '';
|
|
const visible = filter === 'all' || track === filter;
|
|
item.classList.toggle('d-none', !visible);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
document.querySelectorAll('[data-copy-target]').forEach((button) => {
|
|
button.addEventListener('click', async () => {
|
|
const target = document.querySelector(button.dataset.copyTarget || '');
|
|
if (!target) return;
|
|
|
|
const originalText = button.textContent;
|
|
try {
|
|
await navigator.clipboard.writeText(target.textContent.trim());
|
|
button.textContent = 'Copied';
|
|
window.setTimeout(() => {
|
|
button.textContent = originalText;
|
|
}, 1600);
|
|
} catch (error) {
|
|
button.textContent = 'Unavailable';
|
|
window.setTimeout(() => {
|
|
button.textContent = originalText;
|
|
}, 1600);
|
|
}
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('[data-char-count]').forEach((textarea) => {
|
|
const counter = document.querySelector(textarea.dataset.charCount || '');
|
|
if (!counter) return;
|
|
|
|
const updateCount = () => {
|
|
counter.textContent = `${textarea.value.length} / ${textarea.maxLength}`;
|
|
};
|
|
|
|
textarea.addEventListener('input', updateCount);
|
|
updateCount();
|
|
});
|
|
});
|