/** * App - Main Entry Point * Initializes all features */ import './styles/main.css'; import { initLanguageProvider, createLanguageToggle } from '../features/language'; import { initCursorProvider } from '../features/cursor'; import { initNavigationProvider } from '../features/navigation'; import { initFAQProvider } from '../features/faq'; import { initContactProvider } from '../features/contact'; import { initAnimations } from '../shared/utils/animations'; const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; window.addEventListener('error', (event) => { console.warn('[AK Studio] Uncaught error:', event.error?.message || event.message); }); window.addEventListener('unhandledrejection', (event) => { console.warn('[AK Studio] Unhandled rejection:', event.reason?.message || event.reason); }); class App { constructor() { this.init(); } private init(): void { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => this.setupFeatures()); } else { this.setupFeatures(); } } private setupFeatures(): void { initLanguageProvider(); initCursorProvider(); initNavigationProvider(); initFAQProvider(); initContactProvider(); const languageToggleContainer = document.getElementById('languageToggle'); if (languageToggleContainer) { const languageToggle = createLanguageToggle(); languageToggleContainer.appendChild(languageToggle); } if (!prefersReducedMotion) { setTimeout(() => { initAnimations(); }, 50); } else { document.querySelectorAll('.title-line, .step-number, .stat-number').forEach(el => { (el as HTMLElement).style.opacity = '1'; (el as HTMLElement).style.transform = 'none'; }); } this.initScrollProgress(); } private initScrollProgress(): void { const scrollProgress = document.getElementById('scrollProgress'); let ticking = false; window.addEventListener('scroll', () => { if (!ticking) { requestAnimationFrame(() => { if (scrollProgress) { const scrollTop = document.documentElement.scrollTop; const scrollHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight; const progress = (scrollTop / scrollHeight) * 100; scrollProgress.style.width = `${progress}%`; } ticking = false; }); ticking = true; } }, { passive: true }); } } new App();