45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
import { state } from './state.js';
|
|
import { Login } from './login.js';
|
|
import { Onboarding } from './onboarding.js';
|
|
import { Dashboard } from './dashboard.js';
|
|
|
|
const App = {
|
|
async init() {
|
|
state.load();
|
|
this.render();
|
|
},
|
|
|
|
async transition(to) {
|
|
const container = document.getElementById('view-container');
|
|
const loader = document.getElementById('loader');
|
|
|
|
await gsap.to(container, { opacity: 0, y: -20, duration: 0.5, ease: "power2.inOut" });
|
|
|
|
loader.classList.remove('hidden');
|
|
gsap.fromTo(loader, { opacity: 0 }, { opacity: 1, duration: 0.4 });
|
|
|
|
state.view = to;
|
|
state.save();
|
|
|
|
setTimeout(() => {
|
|
this.render();
|
|
gsap.to(loader, { opacity: 0, duration: 0.4, onComplete: () => loader.classList.add('hidden') });
|
|
gsap.fromTo(container, { opacity: 0, y: 20 }, { opacity: 1, y: 0, duration: 0.8, ease: "power3.out" });
|
|
}, 1000);
|
|
},
|
|
|
|
render() {
|
|
if (!state.isLoggedIn) {
|
|
Login.render(() => this.transition('onboarding'));
|
|
} else if (state.view === 'onboarding') {
|
|
Onboarding.render(() => this.transition('dashboard'));
|
|
} else {
|
|
Dashboard.render();
|
|
}
|
|
lucide.createIcons();
|
|
}
|
|
};
|
|
|
|
window.addEventListener('DOMContentLoaded', () => App.init());
|
|
export default App;
|