// Main app — routing + state + iPhone shell const { useState, useEffect, useRef, useCallback } = React; // ─── Persistência local (localStorage) ──────────────────────────── const STORAGE_KEY = 'cdv:state:v1'; const BOOTSTRAP_KEY = 'cdv:bootstrapped:v1'; function loadState() { try { const raw = localStorage.getItem(STORAGE_KEY); if (!raw) return null; const parsed = JSON.parse(raw); return parsed && typeof parsed === 'object' ? parsed : null; } catch (e) { return null; } } function loadBootstrap() { try { return localStorage.getItem(BOOTSTRAP_KEY) === '1'; } catch (e) { return false; } } const USER_KEY = 'cdv:user:v1'; function loadUser() { try { const raw = localStorage.getItem(USER_KEY); return raw ? JSON.parse(raw) : null; } catch (e) { return null; } } function persistUser(user) { try { if (user) localStorage.setItem(USER_KEY, JSON.stringify(user)); else localStorage.removeItem(USER_KEY); } catch (e) {} } function persistState(state) { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (e) { // storage cheio ou bloqueado — ignora silenciosamente } } function resetAllData() { try { localStorage.removeItem(STORAGE_KEY); localStorage.removeItem(BOOTSTRAP_KEY); localStorage.removeItem(USER_KEY); } catch (e) {} } // ─── Preferência de tema ────────────────────────────────────────── const THEME_PREF_KEY = 'cdv:themePref:v1'; function loadThemePref() { try { const v = localStorage.getItem(THEME_PREF_KEY); return v === 'light' || v === 'dark' || v === 'auto' ? v : 'auto'; } catch (e) { return 'auto'; } } function saveThemePref(pref) { try { localStorage.setItem(THEME_PREF_KEY, pref); } catch (e) {} } // Aplica tema sincronamente antes da hidratação do React para evitar flash (function applyInitialTheme() { try { const pref = loadThemePref(); const mode = window.resolveTheme ? window.resolveTheme(pref) : 'dark'; if (window.applyTheme) window.applyTheme(mode); } catch (e) {} })(); // Expor reset global para o cliente poder limpar dados via console se precisar window.CDV_RESET = resetAllData; const PhoneShell = ({ children, dark = true }) => (