// theme.jsx — 3 visual directions + i18n for the PantryWise admin
// Themes are applied by writing CSS custom properties onto :root.

const ADMIN_THEMES = {
  // ── Direction 1 (default): Nocturne — dark high-tech ───────────────
  nocturne: {
    key: 'nocturne',
    label: { fr: 'Nocturne', en: 'Nocturne' },
    isDark: true,
    swatch: ['#0C100E', '#6FE0A8', '#5FB6D6'],
    vars: {
      '--bg': '#0A0E0C',
      '--bg-grad': 'radial-gradient(1200px 700px at 78% -10%, rgba(111,224,168,0.10), transparent 60%), radial-gradient(900px 600px at 10% 110%, rgba(95,182,214,0.07), transparent 55%), #0A0E0C',
      '--panel': '#0E1311',
      '--card': '#121815',
      '--card-2': '#172019',
      '--card-hover': '#1A231C',
      '--ink': '#ECF1EC',
      '--ink-2': '#9AA39C',
      '--ink-3': '#646E66',
      '--line': '#1F2823',
      '--line-2': '#283129',
      '--accent': '#6FE0A8',
      '--accent-ink': '#06281A',
      '--accent-soft': 'rgba(111,224,168,0.13)',
      '--accent-2': '#5FB6D6',
      '--accent-2-soft': 'rgba(95,182,214,0.13)',
      '--pos': '#5FD6A0',
      '--pos-soft': 'rgba(95,214,160,0.14)',
      '--neg': '#F0786E',
      '--neg-soft': 'rgba(240,120,110,0.14)',
      '--warn': '#EBB85C',
      '--warn-soft': 'rgba(235,184,92,0.14)',
      '--info': '#7FA8E8',
      '--info-soft': 'rgba(127,168,232,0.14)',
      '--chart-1': '#6FE0A8',
      '--chart-2': '#5FB6D6',
      '--chart-3': '#EBB85C',
      '--chart-4': '#B58CE0',
      '--chart-5': '#F0786E',
      '--grid': 'rgba(255,255,255,0.05)',
      '--shadow': '0 1px 0 rgba(255,255,255,0.03) inset, 0 18px 40px -24px rgba(0,0,0,0.8)',
      '--glow': '0 0 0 1px rgba(111,224,168,0.25), 0 0 28px -6px rgba(111,224,168,0.4)',
      '--sidebar': '#0C110F',
    },
  },
  // ── Direction 2: Clair — light SaaS ────────────────────────────────
  clair: {
    key: 'clair',
    label: { fr: 'Clair', en: 'Light' },
    isDark: false,
    swatch: ['#F4F7FB', '#3B6FE0', '#0EA5B5'],
    vars: {
      '--bg': '#EEF2F7',
      '--bg-grad': 'linear-gradient(180deg, #F4F7FB 0%, #EAEFF5 100%)',
      '--panel': '#FFFFFF',
      '--card': '#FFFFFF',
      '--card-2': '#F6F9FC',
      '--card-hover': '#F1F5FA',
      '--ink': '#11203A',
      '--ink-2': '#5A6B82',
      '--ink-3': '#92A0B3',
      '--line': '#E4EAF1',
      '--line-2': '#EEF2F7',
      '--accent': '#3B6FE0',
      '--accent-ink': '#FFFFFF',
      '--accent-soft': 'rgba(59,111,224,0.10)',
      '--accent-2': '#0EA5B5',
      '--accent-2-soft': 'rgba(14,165,181,0.10)',
      '--pos': '#1F9D62',
      '--pos-soft': 'rgba(31,157,98,0.12)',
      '--neg': '#DC5547',
      '--neg-soft': 'rgba(220,85,71,0.12)',
      '--warn': '#D9930E',
      '--warn-soft': 'rgba(217,147,14,0.14)',
      '--info': '#3B6FE0',
      '--info-soft': 'rgba(59,111,224,0.12)',
      '--chart-1': '#3B6FE0',
      '--chart-2': '#0EA5B5',
      '--chart-3': '#D9930E',
      '--chart-4': '#7A5AF0',
      '--chart-5': '#DC5547',
      '--grid': 'rgba(17,32,58,0.06)',
      '--shadow': '0 1px 2px rgba(17,32,58,0.04), 0 12px 28px -18px rgba(17,32,58,0.18)',
      '--glow': '0 0 0 1px rgba(59,111,224,0.18), 0 8px 24px -10px rgba(59,111,224,0.30)',
      '--sidebar': '#FFFFFF',
    },
  },
  // ── Direction 3: Sauge — elevated brand ───────────────────────────
  sauge: {
    key: 'sauge',
    label: { fr: 'Sauge', en: 'Sage' },
    isDark: false,
    swatch: ['#FAF8F3', '#4F8267', '#C68A2E'],
    vars: {
      '--bg': '#F3F0E8',
      '--bg-grad': 'linear-gradient(180deg, #FAF8F3 0%, #F1EDE2 100%)',
      '--panel': '#FFFFFF',
      '--card': '#FFFFFF',
      '--card-2': '#F7F4ED',
      '--card-hover': '#F3EFE6',
      '--ink': '#1F2A24',
      '--ink-2': '#4B5650',
      '--ink-3': '#8A8678',
      '--line': '#E6E2D8',
      '--line-2': '#EFECE3',
      '--accent': '#4F8267',
      '--accent-ink': '#FFFFFF',
      '--accent-soft': 'rgba(79,130,103,0.12)',
      '--accent-2': '#C68A2E',
      '--accent-2-soft': 'rgba(198,138,46,0.13)',
      '--pos': '#4F8267',
      '--pos-soft': 'rgba(79,130,103,0.14)',
      '--neg': '#B85149',
      '--neg-soft': 'rgba(184,81,73,0.13)',
      '--warn': '#C68A2E',
      '--warn-soft': 'rgba(198,138,46,0.14)',
      '--info': '#4A6FA5',
      '--info-soft': 'rgba(74,111,165,0.13)',
      '--chart-1': '#4F8267',
      '--chart-2': '#4A6FA5',
      '--chart-3': '#C68A2E',
      '--chart-4': '#8A6BA8',
      '--chart-5': '#B85149',
      '--grid': 'rgba(31,42,36,0.06)',
      '--shadow': '0 1px 2px rgba(31,42,36,0.04), 0 12px 28px -18px rgba(31,42,36,0.16)',
      '--glow': '0 0 0 1px rgba(79,130,103,0.18), 0 8px 24px -10px rgba(79,130,103,0.28)',
      '--sidebar': '#FFFFFF',
    },
  },
};

function applyAdminTheme(key) {
  const theme = ADMIN_THEMES[key] || ADMIN_THEMES.nocturne;
  const root = document.documentElement;
  Object.entries(theme.vars).forEach(([k, v]) => root.style.setProperty(k, v));
  root.setAttribute('data-theme', key);
  root.style.colorScheme = theme.isDark ? 'dark' : 'light';
}

// ── i18n ────────────────────────────────────────────────────────────
const ADMIN_I18N = {
  fr: {
    brand: 'PantryWise',
    console: 'Console admin',
    search: 'Rechercher utilisateurs, foyers, recettes…',
    // nav
    nav_overview: "Vue d'ensemble",
    nav_users: 'Utilisateurs',
    nav_households: 'Foyers & familles',
    nav_engagement: 'Engagement',
    nav_content: 'Recettes & aliments',
    nav_impact: 'Anti-gaspillage',
    nav_revenue: 'Revenus',
    nav_costs: 'Coûts & infra',
    nav_geo: 'Géographie',
    nav_system: 'Système & bugs',
    nav_groups_main: 'Pilotage',
    nav_groups_product: 'Produit',
    nav_groups_business: 'Affaires',
    nav_groups_ops: 'Opérations',
    // periods
    period: 'Période',
    p_7d: '7 j', p_30d: '30 j', p_90d: '90 j', p_12m: '12 mois',
    vs_prev: 'vs période préc.',
    live: 'En direct',
    export: 'Exporter',
    today: "Aujourd'hui",
    // overview
    ov_title: "Vue d'ensemble",
    ov_sub: 'Santé du produit en un coup d’œil',
    kpi_users: 'Utilisateurs',
    kpi_mau: 'Actifs mensuels',
    kpi_dau: 'Actifs ce jour',
    kpi_households: 'Foyers actifs',
    kpi_items: 'Aliments suivis',
    kpi_cooked: 'Recettes cuisinées',
    kpi_scans: 'Scans IA',
    kpi_saved_kg: 'Gaspillage évité',
    kpi_saved_money: 'Économies estimées',
    kpi_mrr: 'MRR projeté',
    kpi_margin: 'Marge brute',
    kpi_retention: 'Rétention 30 j',
    growth_title: 'Croissance des utilisateurs',
    growth_new: 'Nouveaux', growth_active: 'Actifs',
    activity_title: 'Activité de la plateforme',
    funnel_title: "Tunnel d'activation",
    breakdown_title: 'Inventaire par emplacement',
    top_regions: 'Top régions',
    recent_signups: 'Inscriptions récentes',
    health_title: 'Santé système',
    // generic chart / table
    name: 'Nom', email: 'Courriel', region: 'Région', plan: 'Forfait', joined: 'Inscrit', status: 'État',
    last_active: 'Vu', items: 'Aliments', household: 'Foyer', cooked: 'Cuisinées', scans: 'Scans',
    free: 'Gratuit', premium: 'Premium', trial: 'Essai',
    active: 'Actif', dormant: 'Dormant', churned: 'Parti', new: 'Nouveau',
    // users
    us_title: 'Utilisateurs',
    us_sub: 'Acquisition, activité et rétention',
    retention_title: 'Rétention par cohorte',
    churn_title: 'Taux de désabonnement',
    channels_title: "Canaux d'acquisition",
    dau_mau_title: 'DAU / MAU (engagement)',
    platform_split: 'Répartition plateforme',
    all_users: 'Tous les utilisateurs',
    // households
    hh_title: 'Foyers & familles',
    hh_sub: 'Partage familial et collaboration',
    hh_total: 'Foyers',
    hh_shared: 'Foyers partagés',
    hh_avg_size: 'Taille moyenne',
    hh_invites: 'Invitations envoyées',
    hh_size_dist: 'Taille des foyers',
    hh_collab: 'Collaboration par foyer',
    members: 'membres',
    // engagement
    en_title: 'Engagement',
    en_sub: 'Usage des fonctionnalités',
    feat_adoption: 'Adoption des fonctionnalités',
    en_calendar: 'Plan de repas',
    en_scan_photo: 'Scan photo IA',
    en_scan_barcode: 'Scan code-barres',
    en_grocery: "Liste d'épicerie",
    en_recipes: 'Recettes',
    en_privacy: 'Confidentialité données',
    en_favorites: 'Favoris',
    en_leftovers: 'Restants',
    stickiness: 'Fidélité (DAU/MAU)',
    sessions_title: 'Sessions par jour de semaine',
    notif_opt: 'Notifications activées',
    scan_title: 'Scans IA par jour',
    scan_photo: 'Photo', scan_barcode: 'Code-barres',
    privacy_title: 'Confidentialité de la bouffe',
    privacy_sub: "Données gardées privées vs partagées dans le foyer",
    privacy_private: 'Gardé privé', privacy_shared: 'Partagé foyer',
    // content
    co_title: 'Recettes & aliments',
    co_sub: 'Contenu le plus utilisé et populaire',
    recipe_types: 'Types de recettes ajoutées',
    type_breakfast: 'Petit-déj', type_lunch: 'Lunch', type_dinner: 'Souper', type_snack: 'Collation', type_dessert: 'Dessert',
    top_recipes: 'Recettes les plus cuisinées',
    top_foods: 'Aliments les plus suivis',
    most_saved: 'Plus sauvés du gaspillage',
    most_fav: 'Recettes préférées',
    times_cooked: 'fois cuisinée', times_saved: 'sauvés', favorited: 'favoris',
    // impact
    im_title: 'Anti-gaspillage',
    im_sub: 'Impact écologique et économique',
    im_kg: 'Nourriture sauvée',
    im_money: 'Argent économisé',
    im_co2: 'CO₂ évité',
    im_per_user: 'Par utilisateur / mois',
    im_trend: 'Tendance du gaspillage évité',
    im_by_cat: 'Sauvé par catégorie',
    im_leaderboard: 'Foyers les plus efficaces',
    cat_produce: 'Fruits & légumes', cat_dairy: 'Produits laitiers', cat_meat: 'Viandes', cat_bakery: 'Boulangerie', cat_pantry: 'Garde-manger',
    // revenue
    re_title: 'Revenus & abonnements',
    re_sub: 'Monétisation — actuelle et projetée',
    re_banner: 'Pas encore monétisé — modèle prêt à activer',
    re_banner_sub: "L'app est gratuite aujourd'hui. Voici le plan de revenus configuré et la projection.",
    re_mrr: 'MRR', re_arr: 'ARR projeté', re_paying: 'Abonnés payants', re_arpu: 'ARPU',
    re_conv: 'Taux de conversion', re_ltv: 'LTV', re_churn_rev: 'Churn revenus',
    re_current: 'Aujourd’hui', re_projected: 'Projeté',
    re_pricing: 'Forfaits',
    re_tier_free: 'Gratuit', re_tier_premium: 'Premium', re_tier_family: 'Famille',
    re_scan_packs: 'Crédits de scan IA',
    re_scan_sub: 'Achat à l’unité — payé par scan',
    re_scan_price: 'Prix par scan', re_scan_rev: 'Revenus scans',
    re_mrr_proj: 'Projection MRR (12 mois)',
    re_streams: 'Sources de revenus',
    re_str_sub: 'Abonnements', re_str_scan: 'Crédits scan', re_str_partner: 'Partenariats épicerie',
    perMonth: '/mois', perYear: '/an', perScan: '/scan',
    re_assumptions: 'Hypothèses de conversion',
    re_assume_note: 'Ajuste les leviers pour recalculer la projection',
    lever_conv: 'Conversion gratuit → payant', lever_price: 'Prix Premium', lever_growth: 'Croissance mensuelle',
    // costs
    cost_title: 'Coûts & infrastructure',
    cost_sub: 'Ce que la plateforme coûte à opérer',
    cost_total: 'Coût mensuel total',
    cost_per_user: 'Coût par utilisateur actif',
    cost_per_scan: 'Coût par scan IA',
    cost_margin: 'Marge brute (projetée)',
    cost_breakdown: 'Répartition des coûts',
    cost_claude: 'Claude Vision (IA)',
    cost_cf_workers: 'Cloudflare Workers',
    cost_cf_pages: 'Cloudflare Pages',
    cost_cf_r2: 'Cloudflare R2 (stockage)',
    cost_cf_d1: 'Cloudflare D1 (base)',
    cost_cf_kv: 'Cloudflare KV',
    cost_domain: 'Domaine & DNS',
    cost_email: 'Email transactionnel',
    cost_trend: 'Évolution des coûts',
    cost_unit_econ: 'Économie unitaire',
    cost_revenue_vs: 'Revenus projetés vs coûts',
    cost_api_usage: 'Usage des API',
    api: 'API', calls: 'Appels', cost: 'Coût', unit_cost: 'Coût unitaire',
    cost_burn: 'Burn mensuel actuel',
    cost_runway_note: 'Aucun revenu — coûts couverts par le fondateur',
    // geo
    geo_title: 'Géographie',
    geo_sub: 'Où sont les utilisateurs',
    geo_regions: 'Par région',
    geo_cities: 'Top villes',
    geo_map: 'Répartition (Québec & Canada)',
    geo_users: 'utilisateurs',
    geo_intl: 'International',
    // system
    sys_title: 'Système & bugs',
    sys_sub: 'Santé technique et tickets',
    sys_uptime: 'Disponibilité',
    sys_latency: 'Latence API (p95)',
    sys_errors: "Taux d'erreur",
    sys_crash: 'Crash-free',
    sys_open_bugs: 'Bugs ouverts',
    sys_bugs_title: 'Tickets de bugs',
    sys_severity: 'Gravité', sys_platform: 'Plateforme', sys_reported: 'Signalé',
    sev_critical: 'Critique', sev_high: 'Élevé', sev_medium: 'Moyen', sev_low: 'Faible',
    st_open: 'Ouvert', st_progress: 'En cours', st_resolved: 'Résolu',
    sys_latency_trend: 'Latence (24 h)',
    sys_errors_trend: "Erreurs par type",
    // misc
    online: 'en ligne', viewAll: 'Voir tout', updated: 'Mis à jour', ago: 'il y a',
    min: 'min', hr: 'h', day: 'j',
  },
  en: {
    brand: 'PantryWise',
    console: 'Admin console',
    search: 'Search users, households, recipes…',
    nav_overview: 'Overview',
    nav_users: 'Users',
    nav_households: 'Households',
    nav_engagement: 'Engagement',
    nav_content: 'Recipes & food',
    nav_impact: 'Waste saved',
    nav_revenue: 'Revenue',
    nav_costs: 'Costs & infra',
    nav_geo: 'Geography',
    nav_system: 'System & bugs',
    nav_groups_main: 'Pulse',
    nav_groups_product: 'Product',
    nav_groups_business: 'Business',
    nav_groups_ops: 'Operations',
    period: 'Period',
    p_7d: '7 d', p_30d: '30 d', p_90d: '90 d', p_12m: '12 mo',
    vs_prev: 'vs prev.',
    live: 'Live',
    export: 'Export',
    today: 'Today',
    ov_title: 'Overview',
    ov_sub: 'Product health at a glance',
    kpi_users: 'Total users',
    kpi_mau: 'Monthly active',
    kpi_dau: 'Active today',
    kpi_households: 'Active households',
    kpi_items: 'Items tracked',
    kpi_cooked: 'Recipes cooked',
    kpi_scans: 'AI scans',
    kpi_saved_kg: 'Waste prevented',
    kpi_saved_money: 'Estimated savings',
    kpi_mrr: 'Projected MRR',
    kpi_margin: 'Gross margin',
    kpi_retention: '30-day retention',
    growth_title: 'User growth',
    growth_new: 'New', growth_active: 'Active',
    activity_title: 'Platform activity',
    funnel_title: 'Activation funnel',
    breakdown_title: 'Inventory by location',
    top_regions: 'Top regions',
    recent_signups: 'Recent signups',
    health_title: 'System health',
    name: 'Name', email: 'Email', region: 'Region', plan: 'Plan', joined: 'Joined', status: 'Status',
    last_active: 'Seen', items: 'Items', household: 'Household', cooked: 'Cooked', scans: 'Scans',
    free: 'Free', premium: 'Premium', trial: 'Trial',
    active: 'Active', dormant: 'Dormant', churned: 'Churned', new: 'New',
    us_title: 'Users',
    us_sub: 'Acquisition, activity and retention',
    retention_title: 'Cohort retention',
    churn_title: 'Churn rate',
    channels_title: 'Acquisition channels',
    dau_mau_title: 'DAU / MAU (engagement)',
    platform_split: 'Platform split',
    all_users: 'All users',
    hh_title: 'Households & families',
    hh_sub: 'Family sharing and collaboration',
    hh_total: 'Households',
    hh_shared: 'Shared households',
    hh_avg_size: 'Average size',
    hh_invites: 'Invites sent',
    hh_size_dist: 'Household size',
    hh_collab: 'Collaboration per household',
    members: 'members',
    en_title: 'Engagement',
    en_sub: 'Feature usage',
    feat_adoption: 'Feature adoption',
    en_calendar: 'Meal plan',
    en_scan_photo: 'AI photo scan',
    en_scan_barcode: 'Barcode scan',
    en_grocery: 'Grocery list',
    en_recipes: 'Recipes',
    en_privacy: 'Data privacy',
    en_favorites: 'Favorites',
    en_leftovers: 'Leftovers',
    stickiness: 'Stickiness (DAU/MAU)',
    sessions_title: 'Sessions by weekday',
    notif_opt: 'Notifications enabled',
    scan_title: 'AI scans per day',
    scan_photo: 'Photo', scan_barcode: 'Barcode',
    privacy_title: 'Food privacy',
    privacy_sub: 'Data kept private vs shared in household',
    privacy_private: 'Kept private', privacy_shared: 'Household shared',
    co_title: 'Recipes & food',
    co_sub: 'Most used and popular content',
    recipe_types: 'Recipe types added',
    type_breakfast: 'Breakfast', type_lunch: 'Lunch', type_dinner: 'Dinner', type_snack: 'Snack', type_dessert: 'Dessert',
    top_recipes: 'Most cooked recipes',
    top_foods: 'Most tracked foods',
    most_saved: 'Most rescued from waste',
    most_fav: 'Favorite recipes',
    times_cooked: 'times cooked', times_saved: 'rescued', favorited: 'favorites',
    im_title: 'Waste saved',
    im_sub: 'Environmental and economic impact',
    im_kg: 'Food rescued',
    im_money: 'Money saved',
    im_co2: 'CO₂ avoided',
    im_per_user: 'Per user / month',
    im_trend: 'Waste-prevented trend',
    im_by_cat: 'Rescued by category',
    im_leaderboard: 'Most efficient households',
    cat_produce: 'Produce', cat_dairy: 'Dairy', cat_meat: 'Meat', cat_bakery: 'Bakery', cat_pantry: 'Pantry',
    re_title: 'Revenue & subscriptions',
    re_sub: 'Monetization — current and projected',
    re_banner: 'Not monetized yet — model ready to switch on',
    re_banner_sub: 'The app is free today. Here is the configured revenue plan and projection.',
    re_mrr: 'MRR', re_arr: 'Projected ARR', re_paying: 'Paying subscribers', re_arpu: 'ARPU',
    re_conv: 'Conversion rate', re_ltv: 'LTV', re_churn_rev: 'Revenue churn',
    re_current: 'Today', re_projected: 'Projected',
    re_pricing: 'Plans',
    re_tier_free: 'Free', re_tier_premium: 'Premium', re_tier_family: 'Family',
    re_scan_packs: 'AI scan credits',
    re_scan_sub: 'Pay per scan — one-off purchase',
    re_scan_price: 'Price per scan', re_scan_rev: 'Scan revenue',
    re_mrr_proj: 'MRR projection (12 months)',
    re_streams: 'Revenue streams',
    re_str_sub: 'Subscriptions', re_str_scan: 'Scan credits', re_str_partner: 'Grocery partnerships',
    perMonth: '/mo', perYear: '/yr', perScan: '/scan',
    re_assumptions: 'Conversion assumptions',
    re_assume_note: 'Adjust the levers to recompute the projection',
    lever_conv: 'Free → paid conversion', lever_price: 'Premium price', lever_growth: 'Monthly growth',
    cost_title: 'Costs & infrastructure',
    cost_sub: 'What the platform costs to run',
    cost_total: 'Total monthly cost',
    cost_per_user: 'Cost per active user',
    cost_per_scan: 'Cost per AI scan',
    cost_margin: 'Gross margin (projected)',
    cost_breakdown: 'Cost breakdown',
    cost_claude: 'Claude Vision (AI)',
    cost_cf_workers: 'Cloudflare Workers',
    cost_cf_pages: 'Cloudflare Pages',
    cost_cf_r2: 'Cloudflare R2 (storage)',
    cost_cf_d1: 'Cloudflare D1 (database)',
    cost_cf_kv: 'Cloudflare KV',
    cost_domain: 'Domain & DNS',
    cost_email: 'Transactional email',
    cost_trend: 'Cost trend',
    cost_unit_econ: 'Unit economics',
    cost_revenue_vs: 'Projected revenue vs costs',
    cost_api_usage: 'API usage',
    api: 'API', calls: 'Calls', cost: 'Cost', unit_cost: 'Unit cost',
    cost_burn: 'Current monthly burn',
    cost_runway_note: 'No revenue yet — costs covered by founder',
    geo_title: 'Geography',
    geo_sub: 'Where users are',
    geo_regions: 'By region',
    geo_cities: 'Top cities',
    geo_map: 'Distribution (Quebec & Canada)',
    geo_users: 'users',
    geo_intl: 'International',
    sys_title: 'System & bugs',
    sys_sub: 'Technical health and tickets',
    sys_uptime: 'Uptime',
    sys_latency: 'API latency (p95)',
    sys_errors: 'Error rate',
    sys_crash: 'Crash-free',
    sys_open_bugs: 'Open bugs',
    sys_bugs_title: 'Bug tickets',
    sys_severity: 'Severity', sys_platform: 'Platform', sys_reported: 'Reported',
    sev_critical: 'Critical', sev_high: 'High', sev_medium: 'Medium', sev_low: 'Low',
    st_open: 'Open', st_progress: 'In progress', st_resolved: 'Resolved',
    sys_latency_trend: 'Latency (24 h)',
    sys_errors_trend: 'Errors by type',
    online: 'online', viewAll: 'View all', updated: 'Updated', ago: 'ago',
    min: 'min', hr: 'h', day: 'd',
  },
};

const tA = (lang, k) => (ADMIN_I18N[lang] || ADMIN_I18N.fr)[k] || k;

Object.assign(window, { ADMIN_THEMES, applyAdminTheme, ADMIN_I18N, tA });
