estructura inicial
This commit is contained in:
+178
@@ -0,0 +1,178 @@
|
||||
/* ============================================================
|
||||
IDE CONSULTORES – SCRIPTS GLOBALES
|
||||
============================================================ */
|
||||
|
||||
/* ── THEME TOGGLE ──────────────────────────────────────────── */
|
||||
(function () {
|
||||
const stored = localStorage.getItem('ide-theme') || 'light';
|
||||
document.documentElement.setAttribute('data-theme', stored);
|
||||
})();
|
||||
|
||||
function initThemeToggle() {
|
||||
const btn = document.querySelector('.theme-toggle');
|
||||
if (!btn) return;
|
||||
|
||||
function updateBtn() {
|
||||
const isDark = document.documentElement.getAttribute('data-theme') === 'dark';
|
||||
btn.textContent = isDark ? '☀ Claro' : '☾ Oscuro';
|
||||
}
|
||||
|
||||
updateBtn();
|
||||
|
||||
btn.addEventListener('click', () => {
|
||||
const current = document.documentElement.getAttribute('data-theme');
|
||||
const next = current === 'dark' ? 'light' : 'dark';
|
||||
document.documentElement.setAttribute('data-theme', next);
|
||||
localStorage.setItem('ide-theme', next);
|
||||
updateBtn();
|
||||
});
|
||||
}
|
||||
|
||||
/* ── HAMBURGER MENU ─────────────────────────────────────────── */
|
||||
function initHamburger() {
|
||||
const btn = document.querySelector('.hamburger');
|
||||
const menu = document.querySelector('.mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
|
||||
btn.addEventListener('click', () => {
|
||||
menu.classList.toggle('open');
|
||||
});
|
||||
|
||||
document.addEventListener('click', (e) => {
|
||||
if (!btn.contains(e.target) && !menu.contains(e.target)) {
|
||||
menu.classList.remove('open');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ── ACTIVE NAV LINK ─────────────────────────────────────────── */
|
||||
function initActiveNav() {
|
||||
const path = window.location.pathname.split('/').pop() || 'index.html';
|
||||
document.querySelectorAll('.navbar__links a, .mobile-menu a').forEach(a => {
|
||||
const href = a.getAttribute('href');
|
||||
if (href === path) a.classList.add('active');
|
||||
});
|
||||
}
|
||||
|
||||
/* ── SCROLL FADE-IN ─────────────────────────────────────────── */
|
||||
function initFadeIn() {
|
||||
const els = document.querySelectorAll('.fade-in');
|
||||
if (!els.length) return;
|
||||
|
||||
const obs = new IntersectionObserver((entries) => {
|
||||
entries.forEach(e => {
|
||||
if (e.isIntersecting) { e.target.classList.add('visible'); obs.unobserve(e.target); }
|
||||
});
|
||||
}, { threshold: 0.12 });
|
||||
|
||||
els.forEach(el => obs.observe(el));
|
||||
}
|
||||
|
||||
/* ── MODAL ────────────────────────────────────────────────────── */
|
||||
function openModal(id) {
|
||||
const overlay = document.getElementById(id);
|
||||
if (!overlay) return;
|
||||
overlay.classList.add('open');
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
|
||||
function closeModal(id) {
|
||||
const overlay = document.getElementById(id);
|
||||
if (!overlay) return;
|
||||
overlay.classList.remove('open');
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
|
||||
function initModals() {
|
||||
// Close on overlay click
|
||||
document.querySelectorAll('.modal-overlay').forEach(overlay => {
|
||||
overlay.addEventListener('click', (e) => {
|
||||
if (e.target === overlay) closeModal(overlay.id);
|
||||
});
|
||||
});
|
||||
// Close buttons
|
||||
document.querySelectorAll('.modal__close').forEach(btn => {
|
||||
btn.addEventListener('click', () => {
|
||||
const overlay = btn.closest('.modal-overlay');
|
||||
if (overlay) closeModal(overlay.id);
|
||||
});
|
||||
});
|
||||
// Escape key
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
document.querySelectorAll('.modal-overlay.open').forEach(o => closeModal(o.id));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ── CONTACT FORM ─────────────────────────────────────────────── */
|
||||
function initContactForm() {
|
||||
const form = document.querySelector('.contact-form');
|
||||
if (!form) return;
|
||||
|
||||
form.addEventListener('submit', (e) => {
|
||||
e.preventDefault();
|
||||
const btn = form.querySelector('[type="submit"]');
|
||||
const original = btn.textContent;
|
||||
btn.textContent = '✓ ¡Enviado!';
|
||||
btn.disabled = true;
|
||||
btn.style.background = '#1E9A7F';
|
||||
setTimeout(() => {
|
||||
btn.textContent = original;
|
||||
btn.disabled = false;
|
||||
btn.style.background = '';
|
||||
form.reset();
|
||||
}, 3000);
|
||||
});
|
||||
}
|
||||
|
||||
/* ── ACCORDION / DESAFÍOS ─────────────────────────────────────── */
|
||||
function initAccordion() {
|
||||
document.querySelectorAll('.accordion-trigger').forEach(trigger => {
|
||||
trigger.addEventListener('click', () => {
|
||||
const panel = trigger.nextElementSibling;
|
||||
const isOpen = panel.classList.contains('open');
|
||||
|
||||
// Close all
|
||||
document.querySelectorAll('.accordion-panel').forEach(p => p.classList.remove('open'));
|
||||
document.querySelectorAll('.accordion-trigger').forEach(t => t.classList.remove('open'));
|
||||
|
||||
if (!isOpen) {
|
||||
panel.classList.add('open');
|
||||
trigger.classList.add('open');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* ── FILTER TABS ──────────────────────────────────────────────── */
|
||||
function initFilterTabs() {
|
||||
document.querySelectorAll('.filter-tab').forEach(tab => {
|
||||
tab.addEventListener('click', () => {
|
||||
const group = tab.closest('.filter-tabs');
|
||||
group.querySelectorAll('.filter-tab').forEach(t => t.classList.remove('active'));
|
||||
tab.classList.add('active');
|
||||
|
||||
const filter = tab.dataset.filter;
|
||||
document.querySelectorAll('.filterable').forEach(item => {
|
||||
if (filter === 'all' || item.dataset.cat === filter) {
|
||||
item.style.display = '';
|
||||
} else {
|
||||
item.style.display = 'none';
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* ── INIT ─────────────────────────────────────────────────────── */
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
initThemeToggle();
|
||||
initHamburger();
|
||||
initActiveNav();
|
||||
initFadeIn();
|
||||
initModals();
|
||||
initContactForm();
|
||||
initAccordion();
|
||||
initFilterTabs();
|
||||
});
|
||||
Reference in New Issue
Block a user