/* ============================================= HELLION NEWTAB — state.js Globaler State, Default-Werte, Hilfsfunktionen ============================================= */ let boards = []; // Papierkorb als EIGENER Store-Key (nicht im boards-Payload), isoliert das Quota-Risiko (CR-04/TRASH-02). // Eintrag-Schema: { item, type: 'bookmark'|'board', deletedAt, originBoardId } let trash = []; let settings = { compact: false, shortenTitles: false, newTab: true, showDesc: false, hideExtra: false, visibleCount: 10, bgUrl: '', theme: 'nebula', showSearch: true, searchEngine: 'google', toolbarPos: 'right', imageRefEnabled: false, language: 'auto' }; // uid() lebt jetzt in quicksave-core.js (globalThis.uid), damit Seite und // Background-Worker dieselbe ID-Erzeugung teilen. Hier bewusst KEINE eigene Deklaration. function escHtml(str) { return String(str) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"'); } function getDefaultBoards() { return [ { id: uid(), title: 'Getting Started', bookmarks: [ { id: uid(), title: 'GitHub', url: 'https://github.com', desc: '' }, { id: uid(), title: 'MDN Web Docs', url: 'https://developer.mozilla.org', desc: '' }, { id: uid(), title: 'Next.js Docs', url: 'https://nextjs.org/docs', desc: '' }, ], blurred: false } ]; } async function saveBoards() { await Store.set('boards', boards); } async function saveTrash() { await Store.set('trash', trash); } async function saveSettings() { await Store.set('settings', settings); } // ---- VIEW TRANSITIONS ---- // Fuehrt eine synchrone DOM-Mutation mit nativem View-Transition-Fade aus. // Feature-Detection-Fallback (Firefox < 144): instant. reduced-motion kappt das Fade ueber den ungeschichteten @media-Block. function withViewTransition(mutate) { if (document.startViewTransition) { document.startViewTransition(mutate); } else { mutate(); } }