Files
jap_web_ng/src/main.ts
T

84 lines
2.5 KiB
TypeScript
Raw Normal View History

2026-09-13 18:43:42 +03:00
import './style.css';
2026-09-14 14:32:38 +03:00
import { renderHomePage } from './home-page.ts';
2026-09-15 10:54:09 +03:00
import { renderDecksPage } from './decks-page.ts';
2026-09-14 14:32:38 +03:00
import { renderSyncPage } from './sync-page.ts';
2026-09-14 16:56:59 +03:00
import { initWorker } from './sqlite-api.ts';
2026-09-13 18:43:42 +03:00
2026-09-15 10:54:09 +03:00
// Каркас приложения: топ-бар + бургер-меню + страницы (Главная / Колоды / Синхронизация).
2026-09-14 14:32:38 +03:00
2026-09-15 10:54:09 +03:00
type Page = 'home' | 'decks' | 'sync';
2026-09-14 14:32:38 +03:00
const PAGE_TITLES: Record<Page, string> = {
home: 'Главная',
2026-09-15 10:54:09 +03:00
decks: 'Колоды',
2026-09-14 14:32:38 +03:00
sync: 'Синхронизация',
};
function requireEl<T extends HTMLElement>(id: string): T {
const el = document.getElementById(id);
if (!el) throw new Error(`[JapLearn] Не найден элемент #${id}`);
return el as T;
}
const burgerBtn = requireEl<HTMLButtonElement>('burger-btn');
const drawer = requireEl<HTMLElement>('drawer');
const overlay = requireEl<HTMLElement>('drawer-overlay');
const pageTitle = requireEl<HTMLElement>('page-title');
const pageRoot = requireEl<HTMLElement>('page');
let drawerOpen = false;
function setDrawer(open: boolean): void {
drawerOpen = open;
drawer.classList.toggle('open', open);
overlay.hidden = !open;
burgerBtn.setAttribute('aria-expanded', String(open));
drawer.setAttribute('aria-hidden', String(!open));
document.body.classList.toggle('drawer-open', open);
}
function setActiveButton(page: Page): void {
drawer.querySelectorAll<HTMLButtonElement>('.drawer-btn').forEach((btn) => {
btn.classList.toggle('active', btn.dataset.page === page);
});
}
function renderPage(page: Page): void {
pageTitle.textContent = PAGE_TITLES[page];
setActiveButton(page);
if (page === 'home') {
2026-09-15 10:51:04 +03:00
renderHomePage(pageRoot, {});
2026-09-15 10:54:09 +03:00
} else if (page === 'decks') {
renderDecksPage(pageRoot);
2026-09-14 14:32:38 +03:00
} else {
renderSyncPage(pageRoot);
2026-09-13 18:43:42 +03:00
}
}
2026-09-14 14:32:38 +03:00
burgerBtn.addEventListener('click', () => {
setDrawer(!drawerOpen);
});
overlay.addEventListener('click', () => {
setDrawer(false);
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && drawerOpen) setDrawer(false);
});
drawer.querySelectorAll<HTMLButtonElement>('.drawer-btn').forEach((btn) => {
btn.addEventListener('click', () => {
const page = btn.dataset.page as Page | undefined;
2026-09-15 10:54:09 +03:00
if (page === 'home' || page === 'decks' || page === 'sync') renderPage(page);
2026-09-14 14:32:38 +03:00
setDrawer(false);
});
});
2026-09-13 18:43:42 +03:00
2026-09-14 16:56:59 +03:00
2026-09-14 14:32:38 +03:00
// Старт: главная страница, меню закрыто
2026-09-14 16:56:59 +03:00
await initWorker();
2026-09-14 14:32:38 +03:00
setDrawer(false);
renderPage('home');
console.log('[JapLearn] crossOriginIsolated =', window.crossOriginIsolated);