1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AdManager-Ct0IrFQq.js","assets/vendor-react-Bay9Y7Lb.js","assets/index-D0Bmh-UX.js","assets/vendor-i18n-R-bMoYp_.js","assets/vendor-dVNaLJx_.js","assets/vendor-DqKRdbjz.css","assets/index-WEfYDNmt.css","assets/AdminModuleStudio-DjF-FEL6.js","assets/ai-DU77DB8o.js","assets/vendor-ai-DIIXepW_.js","assets/AdminSettings-qDZf9At9.js","assets/AdminWireguard-DvDYRT_d.js","assets/vendor-framer-C8eEgkdL.js","assets/AiSettings-BoPY5f8A.js","assets/AdminShared-P_hor2hS.js","assets/AppearanceSettings-Dla95Hy3.js","assets/ArchiveImporter-n0Q0QYy4.js","assets/synth-BE1TSTD4.js","assets/vendor-react-three-MDLA5jog.js","assets/wasm-synth-adapter-BrqgBX1y.js","assets/vendor-spessasynth-DH8n6o_V.js","assets/vendor-audio-DH3w0BzW.js","assets/BIDashboard-DcWnvIuE.js","assets/BackupManager-D8hVThKF.js","assets/CinematicStudio-BoU7Bw9s.js","assets/Musician3D-D56sI7cs.js","assets/ClimateControl-DAlqu7Gg.js","assets/ClusterSync-DKKIVbtK.js","assets/useIdlePollingPause-Al1AXAz9.js","assets/CollectionManager-Cr8WrcZS.js","assets/CreditManager-wYOeDl1g.js","assets/credit-rules-8PgauDOD.js","assets/DataMigration-D3CXrQtz.js","assets/DatabaseManager-BqSTDDnc.js","assets/DevAgent-BghXVV06.js","assets/DocuCenter-D0hYjWMZ.js","assets/EmailSettings-CBkm3rKS.js","assets/FileSystem-Gq9PfcKK.js","assets/GraphicManager-RJLdonMh.js","assets/utils-BYCVoSTN.js","assets/labTools-BATZiaPB.js","assets/HelpCenterManager-D-9RnvrU.js","assets/LiveMonitor-DatH1KEW.js","assets/MediaLibrary-CsRy_8DG.js","assets/Waveform-MxtdejK7.js","assets/UserAvatar-BQN4jlY-.js","assets/GlobeFlag-V1uaxVEK.js","assets/MenuManager-1Nkr2IrM.js","assets/PerformanceMonitor-BzGDNWTK.js","assets/PuppetStudio-CpqKJqXk.js","assets/StagePuppetEngine-BtPqoUG7.js","assets/IkMath-D6fi1ppd.js","assets/vendor-gsap-50Lx19ak.js","assets/InstrumentMappings-UYUlFRMy.js","assets/RegionManager-CnhTdhVc.js","assets/ScanAndTag-DszYOwrm.js","assets/ScoreImporter-CXoMCKwM.js","assets/SearchConsoleSettings-8eK2Diqe.js","assets/SearchSettings-BSlJndKx.js","assets/SiteModuleStudio-qY8wsxxx.js","assets/SocialSettings-D4xNlkDk.js","assets/SoundfontManager-C6kr0CCX.js","assets/SoundfontQualityLab-B9zmg6dJ.js","assets/SharedKeyboard-B3r3Jaho.js","assets/useMidiKeyboard-DlyEIN8T.js","assets/SouthparkActionsStudio-DE8P5dhV.js","assets/SouthparkCharacter-BNwA9Wd0.js","assets/SouthparkStageDesigner-D3wJTqgo.js","assets/SouthparkStageBanner-BCxT9awg.js","assets/SouthparkStudio-3yAVRK5D.js","assets/SouthparkVariants-DgWdjJ-T.js","assets/SouthparkOrchestraVisualizer-BGIvyqzT.js","assets/SpamConfigTabs-Bz5cy6i6.js","assets/SubscriptionManager-DgMZeVgt.js","assets/SubscriptionSettings-D4ahxxuJ.js","assets/SystemInfo-D4Z1kN9f.js","assets/SystemManager-BSBbLvNx.js","assets/SystemMonitor-BtaKLdqu.js","assets/SystemSettings-CbmXa8gg.js","assets/TranslationManager-1sTCXwQ0.js","assets/TrustScoreConfig-D0xv0bQl.js","assets/TagManager-COGvUhIS.js","assets/TicketSupport--Koo4yg7.js","assets/TrustSafety-cHE1J5RX.js","assets/UnifiedLogs-BQXbYxtq.js","assets/UserManagement-DFmAfWJ0.js","assets/WebScraper-YXZBgNTW.js","assets/WorkerManager-CTxYVO4S.js"])))=>i.map(i=>d[i]); 2import { r as reactExports, j as jsxRuntimeExports, R as React } from "./vendor-react-Bay9Y7Lb.js"; 3import { _ as __vitePreload } from "./vendor-react-three-MDLA5jog.js"; 4import { S as SettingsProvider, a as api } from "./index-D0Bmh-UX.js"; 5import { cJ as ShieldAlert, a$ as Shield, cL as RefreshCw, dS as ChevronsRight, dT as ChevronsLeft, bf as Search, cb as Pin, dU as Thermometer, dV as Film, dW as Smile, cf as Activity, bg as Music, c0 as Share2, dX as Server, ci as Cpu, df as SlidersVertical, b9 as Settings, bq as Coins, dY as Book, dZ as Archive, bF as CircleQuestionMark, aZ as Mail, bH as Hash, d_ as ArrowLeftRight, d$ as Languages, bn as Globe, bJ as PanelsTopLeft, bG as Box, cE as Key, d7 as Image, e0 as Palette, ck as HardDrive, dO as LifeBuoy, ch as Database, dN as Users, e1 as Calculator, cl as OctagonAlert, e2 as Bot, e3 as ChartNoAxesColumnIncreasing, e4 as DatabaseZap, cB as ChevronDown, bk as LogOut, aW as X } from "./vendor-dVNaLJx_.js"; 6import "./vendor-i18n-R-bMoYp_.js"; 7const adminModuleFiles = /* @__PURE__ */ Object.assign({
7"./AdminModules/AdManager.tsx": () => __vitePreload(() => import("./AdManager-Ct0IrFQq.js"), true ? __vite__mapDeps([0,1,2,3,4,5,6]) : void 0),
7"./AdminModules/AdminModuleStudio.tsx": () => __vitePreload(() => import("./AdminModuleStudio-DjF-FEL6.js"), true ? __vite__mapDeps([7,1,2,3,4,5,6,8,9]) : void 0),
7"./AdminModules/AdminSettings.tsx": () => __vitePreload(() => import("./AdminSettings-qDZf9At9.js"), true ? __vite__mapDeps([10,1,2,3,4,5,6]) : void 0),
7"./AdminModules/AdminWireguard.tsx": () => __vitePreload(() => import("./AdminWireguard-DvDYRT_d.js"), true ? __vite__mapDeps([11,1,4,3,5,12]) : void 0),
7"./AdminModules/AiSettings.tsx": () => __vitePreload(() => import("./AiSettings-BoPY5f8A.js"), true ? __vite__mapDeps([13,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/AppearanceSettings.tsx": () => __vitePreload(() => import("./AppearanceSettings-Dla95Hy3.js"), true ? __vite__mapDeps([15,1,2,3,4,5,6]) : void 0),
7"./AdminModules/ArchiveImporter.tsx": () => __vitePreload(() => import("./ArchiveImporter-n0Q0QYy4.js"), true ? __vite__mapDeps([16,1,2,3,4,5,6,17,18,19,20,21]) : void 0),
7"./AdminModules/BIDashboard.tsx": () => __vitePreload(() => import("./BIDashboard-DcWnvIuE.js"), true ? __vite__mapDeps([22,1,2,3,4,5,6]) : void 0),
7"./AdminModules/BackupManager.tsx": () => __vitePreload(() => import("./BackupManager-D8hVThKF.js"), true ? __vite__mapDeps([23,1,4,3,5]) : void 0),
7"./AdminModules/CinematicStudio.tsx": () => __vitePreload(() => import("./CinematicStudio-BoU7Bw9s.js"), true ? __vite__mapDeps([24,1,18,4,3,5,25]) : void 0),
7"./AdminModules/ClimateControl.tsx": () => __vitePreload(() => import("./ClimateControl-DAlqu7Gg.js"), true ? __vite__mapDeps([26,1,2,3,4,5,6]) : void 0),
7"./AdminModules/ClusterSync.tsx": () => __vitePreload(() => import("./ClusterSync-DKKIVbtK.js"), true ? __vite__mapDeps([27,1,2,3,4,5,6,28]) : void 0),
7"./AdminModules/CollectionManager.tsx": () => __vitePreload(() => import("./CollectionManager-Cr8WrcZS.js"), true ? __vite__mapDeps([29,1,2,3,4,5,6,8,9]) : void 0),
7"./AdminModules/CreditManager.tsx": () => __vitePreload(() => import("./CreditManager-wYOeDl1g.js"), true ? __vite__mapDeps([30,1,2,3,4,5,6,31,14]) : void 0),
7"./AdminModules/DataMigration.tsx": () => __vitePreload(() => import("./DataMigration-D3CXrQtz.js"), true ? __vite__mapDeps([32,1,2,3,4,5,6,16,17,18,19,20,21]) : void 0),
7"./AdminModules/DatabaseManager.tsx": () => __vitePreload(() => import("./DatabaseManager-BqSTDDnc.js"), true ? __vite__mapDeps([33,1,14,4,3,5,2,6]) : void 0),
7"./AdminModules/DevAgent.tsx": () => __vitePreload(() => import("./DevAgent-BghXVV06.js"), true ? __vite__mapDeps([34,1,2,3,4,5,6,8,9]) : void 0),
7"./AdminModules/DocuCenter.tsx": () => __vitePreload(() => import("./DocuCenter-D0hYjWMZ.js"), true ? __vite__mapDeps([35,1,4,3,5]) : void 0),
7"./AdminModules/EmailSettings.tsx": () => __vitePreload(() => import("./EmailSettings-CBkm3rKS.js"), true ? __vite__mapDeps([36,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/FileSystem.tsx": () => __vitePreload(() => import("./FileSystem-Gq9PfcKK.js"), true ? __vite__mapDeps([37,1,2,3,4,5,6]) : void 0),
7"./AdminModules/GraphicManager.tsx": () => __vitePreload(() => import("./GraphicManager-RJLdonMh.js"), true ? __vite__mapDeps([38,1,2,3,4,5,6,39,8,9,14,40]) : void 0),
7"./AdminModules/HelpCenterManager.tsx": () => __vitePreload(() => import("./HelpCenterManager-D-9RnvrU.js"), true ? __vite__mapDeps([41,1,2,3,4,5,6,14,8,9]) : void 0),
7"./AdminModules/LiveMonitor.tsx": () => __vitePreload(() => import("./LiveMonitor-DatH1KEW.js"), true ? __vite__mapDeps([42,1,2,3,4,5,6]) : void 0),
7"./AdminModules/MediaLibrary.tsx": () => __vitePreload(() => import("./MediaLibrary-CsRy_8DG.js"), true ? __vite__mapDeps([43,1,2,3,4,5,6,17,18,19,20,21,14,39,44,12,45,46]) : void 0),
7"./AdminModules/MenuManager.tsx": () => __vitePreload(() => import("./MenuManager-1Nkr2IrM.js"), true ? __vite__mapDeps([47,1,2,3,4,5,6]) : void 0),
7"./AdminModules/PerformanceMonitor.tsx": () => __vitePreload(() => import("./PerformanceMonitor-BzGDNWTK.js"), true ? __vite__mapDeps([48,1,2,3,4,5,6]) : void 0),
7"./AdminModules/PuppetStudio.tsx": () => __vitePreload(() => import("./PuppetStudio-CpqKJqXk.js"), true ? __vite__mapDeps([49,1,4,3,5,50,17,18,19,20,21,51,52,12,53,39,2,6]) : void 0),
7"./AdminModules/RegionManager.tsx": () => __vitePreload(() => import("./RegionManager-CnhTdhVc.js"), true ? __vite__mapDeps([54,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/ScanAndTag.tsx": () => __vitePreload(() => import("./ScanAndTag-DszYOwrm.js"), true ? __vite__mapDeps([55,1,2,3,4,5,6]) : void 0),
7"./AdminModules/ScoreImporter.tsx": () => __vitePreload(() => import("./ScoreImporter-CXoMCKwM.js"), true ? __vite__mapDeps([56,1,4,3,5]) : void 0),
7"./AdminModules/SearchConsoleSettings.tsx": () => __vitePreload(() => import("./SearchConsoleSettings-8eK2Diqe.js"), true ? __vite__mapDeps([57,1,2,3,4,5,6]) : void 0),
7"./AdminModules/SearchSettings.tsx": () => __vitePreload(() => import("./SearchSettings-BSlJndKx.js"), true ? __vite__mapDeps([58,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/SiteModuleStudio.tsx": () => __vitePreload(() => import("./SiteModuleStudio-qY8wsxxx.js"), true ? __vite__mapDeps([59,1,2,3,4,5,6,8,9,39]) : void 0),
7"./AdminModules/SocialSettings.tsx": () => __vitePreload(() => import("./SocialSettings-D4xNlkDk.js"), true ? __vite__mapDeps([60,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/SoundfontManager.tsx": () => __vitePreload(() => import("./SoundfontManager-C6kr0CCX.js"), true ? __vite__mapDeps([61,1,2,3,4,5,6,39,62,63,18,64,19,20]) : void 0),
7"./AdminModules/SoundfontQualityLab.tsx": () => __vitePreload(() => import("./SoundfontQualityLab-B9zmg6dJ.js"), true ? __vite__mapDeps([62,1,2,3,4,5,6,63,18,64,19,20,39]) : void 0),
7"./AdminModules/SouthparkActionsStudio.tsx": () => __vitePreload(() => import("./SouthparkActionsStudio-DE8P5dhV.js"), true ? __vite__mapDeps([65,1,66,51,12,4,3,5,39,2,6]) : void 0),
7"./AdminModules/SouthparkStageDesigner.tsx": () => __vitePreload(() => import("./SouthparkStageDesigner-D3wJTqgo.js"), true ? __vite__mapDeps([67,1,50,17,18,4,3,5,19,20,21,51,52,12,66,68]) : void 0),
7"./AdminModules/SouthparkStudio.tsx": () => __vitePreload(() => import("./SouthparkStudio-3yAVRK5D.js"), true ? __vite__mapDeps([69,1,66,51,12,4,3,5,70,71,17,18,19,20,21,50,52,68,39,2,6,67,65]) : void 0),
7"./AdminModules/SpamConfigTabs.tsx": () => __vitePreload(() => import("./SpamConfigTabs-Bz5cy6i6.js"), true ? __vite__mapDeps([72,1,2,3,4,5,6]) : void 0),
7"./AdminModules/SubscriptionManager.tsx": () => __vitePreload(() => import("./SubscriptionManager-DgMZeVgt.js"), true ? __vite__mapDeps([73,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/SubscriptionSettings.tsx": () => __vitePreload(() => import("./SubscriptionSettings-D4ahxxuJ.js"), true ? __vite__mapDeps([74,1,2,3,4,5,6,14]) : void 0),
7"./AdminModules/SystemInfo.tsx": () => __vitePreload(() => import("./SystemInfo-D4Z1kN9f.js"), true ? __vite__mapDeps([75,1,2,3,4,5,6]) : void 0),
7"./AdminModules/SystemManager.tsx": () => __vitePreload(() => import("./SystemManager-BSBbLvNx.js"), true ? __vite__mapDeps([76,1,4,3,5]) : void 0),
7"./AdminModules/SystemMonitor.tsx": () => __vitePreload(() => import("./SystemMonitor-BtaKLdqu.js"), true ? __vite__mapDeps([77,1,2,3,4,5,6]) : void 0),
7"./AdminModules/SystemSettings.tsx": () => __vitePreload(() => import("./SystemSettings-CbmXa8gg.js"), true ? __vite__mapDeps([78,1,54,2,3,4,5,6,14,79,8,9,39,10,60,36,15,80,45,72,30,31,74,58,23,13]) : void 0),
7"./AdminModules/TagManager.tsx": () => __vitePreload(() => import("./TagManager-COGvUhIS.js"), true ? __vite__mapDeps([81,1,2,3,4,5,6,14,8,9,39]) : void 0),
7"./AdminModules/TicketSupport.tsx": () => __vitePreload(() => import("./TicketSupport--Koo4yg7.js"), true ? __vite__mapDeps([82,1,2,3,4,5,6,14,39]) : void 0),
7"./AdminModules/TranslationManager.tsx": () => __vitePreload(() => import("./TranslationManager-1sTCXwQ0.js"), true ? __vite__mapDeps([79,1,2,3,4,5,6,14,8,9,39]) : void 0),
7"./AdminModules/TrustSafety.tsx": () => __vitePreload(() => import("./TrustSafety-cHE1J5RX.js"), true ? __vite__mapDeps([83,1,2,3,4,5,6,45]) : void 0),
7"./AdminModules/TrustScoreConfig.tsx": () => __vitePreload(() => import("./TrustScoreConfig-D0xv0bQl.js"), true ? __vite__mapDeps([80,1,2,3,4,5,6,14,45,72]) : void 0),
7"./AdminModules/UnifiedLogs.tsx": () => __vitePreload(() => import("./UnifiedLogs-BQXbYxtq.js"), true ? __vite__mapDeps([84,1,2,3,4,5,6]) : void 0),
7"./AdminModules/UserManagement.tsx": () => __vitePreload(() => import("./UserManagement-DFmAfWJ0.js"), true ? __vite__mapDeps([85,1,2,3,4,5,6,14,45]) : void 0),
7"./AdminModules/WebScraper.tsx": () => __vitePreload(() => import("./WebScraper-YXZBgNTW.js"), true ? __vite__mapDeps([86,1,4,3,5]) : void 0),
7"./AdminModules/WorkerManager.tsx": () => __vitePreload(() => import("./WorkerManager-CTxYVO4S.js"), true ? __vite__mapDeps([87,1,2,3,4,5,6,28]) : void 0)
7 }); 8const getLazyComponent = (filename) => { 9 let importFn = adminModuleFiles[`./AdminModules/${filename}.tsx`]; 10 if (!importFn) { 11 const pascalName = filename.split(/[_-]/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(""); 12 importFn = adminModuleFiles[`./AdminModules/${pascalName}.tsx`]; 13 } 14 if (importFn) { 15 return React.lazy(importFn); 16 } 17 return null; 18}; 19const lazyComponentsCache = {}; 20const getComponentForModule = (filename) => { 21 if (!lazyComponentsCache[filename]) { 22 const comp = getLazyComponent(filename); 23 if (comp) { 24 lazyComponentsCache[filename] = comp; 25 } 26 } 27 return lazyComponentsCache[filename]; 28}; 29const LEGACY_COMPONENT_MAP = { 30 "dashboard": { filename: "BIDashboard", label: "Intelligence Dashboard", iconKey: "dashboard" }, 31 "documentation": { filename: "DocuCenter", label: "DocuCenter", iconKey: "book" }, 32 "dev_agent": { filename: "DevAgent", label: "AI Developer", iconKey: "bot" }, 33 "trust": { filename: "TrustSafety", label: "Trust & Safety", iconKey: "trust" }, 34 "users": { filename: "UserManagement", label: "User Governance", iconKey: "users" }, 35 "media": { filename: "MediaLibrary", label: "Content Assets", iconKey: "media" }, 36 "worker_manager": { filename: "WorkerManager", label: "Worker Manager", iconKey: "worker" }, 37 "tags": { filename: "TagManager", label: "Tag Dictionary", iconKey: "hash" }, 38 "tickets": { filename: "TicketSupport", label: "Support Desk", iconKey: "tickets" }, 39 "help_content": { filename: "HelpCenterManager", label: "Support & Resources", iconKey: "help-circle" }, 40 "modules": { filename: "AdminModuleStudio", label: "Admin Module Studio", iconKey: "modules" }, 41 "site_modules": { filename: "SiteModuleStudio", label: "Site Architect", iconKey: "site_modules" }, 42 "menu_manager": { filename: "MenuManager", label: "Menu Manager", iconKey: "menu" }, 43 "files": { filename: "FileSystem", label: "File System", iconKey: "files" }, 44 "graphics": { filename: "GraphicManager", label: "Graphic Manager", iconKey: "graphics" }, 45 "database": { filename: "DatabaseManager", label: "Schema & Data", iconKey: "database" }, 46 "info": { filename: "SystemInfo", label: "System Overview", iconKey: "info" }, 47 "logs": { filename: "UnifiedLogs", label: "Unified Logs", iconKey: "logs" }, 48 "system_settings": { filename: "SystemSettings", label: "System Settings", iconKey: "system_settings" }, 49 "backup": { filename: "BackupManager", label: "Backup Manager", iconKey: "archive" }, 50 "appearance": { filename: "AppearanceSettings", label: "Appearance", iconKey: "appearance" }, 51 "settings": { filename: "AdminSettings", label: "Admin Roles", iconKey: "key" }, 52 "languages": { filename: "TranslationManager", label: "Translation Manager", iconKey: "languages" }, 53 "system_manager": { filename: "SystemManager", label: "System Deployments", iconKey: "server" }, 54 "ai_settings": { filename: "AiSettings", label: "AI Configuration", iconKey: "bot" }, 55 "email_settings": { filename: "EmailSettings", label: "Email Configuration", iconKey: "mail" }, 56 "search_settings": { filename: "SearchSettings", label: "Search Engine", iconKey: "search" }, 57 "social_settings": { filename: "SocialSettings", label: "Social & Sharing", iconKey: "share2" }, 58 "trust_score_config": { filename: "TrustScoreConfig", label: "Trust Score Rules", iconKey: "shield-alert" }, 59 "region_manager": { filename: "RegionManager", label: "Regional Settings", iconKey: "globe" }, 60 "migration": { filename: "DataMigration", label: "Data Migration", iconKey: "refresh-cw" }, 61 "coins": { filename: "CreditManager", label: "Usage & Quotas", iconKey: "coins" }, 62 "subscription_manager": { filename: "SubscriptionManager", label: "Supporter Registry", iconKey: "users" }, 63 "soundfonts": { filename: "SoundfontManager", label: "Soundfont Engine", iconKey: "music" }, 64 "scraper": { filename: "WebScraper", label: "Web Scraper & Importer", iconKey: "globe" }, 65 "archive_importer": { filename: "ArchiveImporter", label: "High-Speed MIDI Archive Importer", iconKey: "archive" }, 66 "cluster_sync": { filename: "ClusterSync", label: "Multi-Region Cluster", iconKey: "globe" }, 67 "wireguard": { filename: "AdminWireguard", label: "Wireguard Management", iconKey: "shield" },
68 "monitoring": { filename: "SystemMonitor", label: "Infrastructure Analytics", iconKey: "activity" }, 69 "gsc_settings": { filename: "SearchConsoleSettings", label: "Google Search Console", iconKey: "globe" }, 70 "puppets": { filename: "PuppetStudio", label: "Puppet Studio", iconKey: "smile" }, 71 "live_monitor": { filename: "LiveMonitor", label: "Live Monitor", iconKey: "activity" }, 72 "performance_monitor": { filename: "PerformanceMonitor", label: "User Experience Logger", iconKey: "activity" }, 73 "ads": { filename: "AdManager", label: "Ad Monetization", iconKey: "coins" }, 74 "collections": { filename: "CollectionManager", label: "MIDI Collections", iconKey: "site_modules" }, 75 "scan_tag": { filename: "ScanAndTag", label: "Scan & Tag", iconKey: "music" }, 76 "cinematic_studio": { filename: "CinematicStudio", label: "Cinematic Studio", iconKey: "film" }, 77 "score_importer": { filename: "ScoreImporter", label: "Score Importer", iconKey: "music" }, 78 "southpark_studio": { filename: "SouthparkStudio", label: "South Park Studio", iconKey: "smile" }, 79 "climate_control": { filename: "ClimateControl", label: "Climate & AC Guardian", iconKey: "thermometer" } 80}; 81const LESS_USED_MODULE_IDS = /* @__PURE__ */ new Set([ 82 "ai_settings", 83 "appearance", 84 "email_settings", 85 "search_settings", 86 "social_settings", 87 "trust_score_config", 88 "region_manager", 89 "languages", 90 "migration", 91 "backup", 92 "system_manager", 93 "soundfonts", 94 "graphics", 95 "files", 96 "coins", 97 "ads" 98]); 99const ADMIN_MENU_GROUPS = [ 100 { 101 name: "Dashboard & Performance", 102 icon: ChartNoAxesColumnIncreasing, 103 items: ["dashboard", "climate_control", "info", "logs", "worker_manager", "system_manager", "wireguard", "monitoring", "live_monitor", "performance_monitor"] 104 }, 105 { 106 name: "Content & Media", 107 icon: Database, 108 items: ["media", "tags", "scan_tag", "graphics", "files", "documentation", "soundfonts", "scraper", "archive_importer", "score_importer"] 109 }, 110 { 111 name: "User Governance", 112 icon: Users, 113 items: ["users", "coins", "trust", "tickets"] 114 }, 115 { 116 name: "Creative Studio", 117 icon: PanelsTopLeft, 118 items: ["modules", "site_modules", "collections", "menu_manager", "languages", "region_manager", "puppets", "cinematic_studio", "southpark_studio"] 119 }, 120 { 121 name: "Database Operations", 122 icon: DatabaseZap, 123 items: ["backup", "database", "migration", "cluster_sync"] 124 }, 125 { 126 name: "System Settings", 127 icon: SlidersVertical, 128 items: ["system_settings"], 129 children: ["ai_settings", "appearance", "email_settings", "search_settings", "social_settings", "trust_score_config", "settings", "gsc_settings", "ads"] 130 } 131]; 132const ICON_MAP = { 133 "dashboard": ChartNoAxesColumnIncreasing, 134 "bot": Bot, 135 "trust": OctagonAlert, 136 "calculator": Calculator, 137 "users": Users, 138 "media": Database, 139 "tickets": LifeBuoy, 140 "files": HardDrive, 141 "database": Server, 142 "appearance": Palette, 143 "graphics": Image, 144 "logs": Activity, 145 "key": Key, 146 "modules": Box, 147 "site_modules": PanelsTopLeft, 148 "menu": PanelsTopLeft, 149 "info": Server, 150 "globe": Globe, 151 "languages": Languages, 152 "refresh-cw": ArrowLeftRight, 153 "hash": Hash, 154 "mail": Mail, 155 "help-circle": CircleQuestionMark, 156 "social": Share2, 157 "search": Search, 158 "archive": Archive, 159 "book": Book, 160 "coins": Coins, 161 "settings": Settings, 162 "system_settings": SlidersVertical, 163 "worker": Cpu, 164 "server": Server, 165 "shield-alert": ShieldAlert, 166 "share2": Share2, 167 "music": Music, 168 "activity": Activity, 169 "smile": Smile, 170 "film": Film, 171 "thermometer": Thermometer 172}; 173const QuickJump = ({ isOpen, onClose, modules, onSelect }) => { 174 const [search, setSearch] = reactExports.useState(""); 175 const [selectedIndex, setSelectedIndex] = reactExports.useState(0); 176 const inputRef = reactExports.useRef(null); 177 const filtered = reactExports.useMemo(() => { 178 if (!search) return modules.slice(0, 10); 179 return modules.filter((m) => m.label.toLowerCase().includes(search.toLowerCase())).slice(0, 10); 180 }, [search, modules]); 181 reactExports.useEffect(() => { 182 if (isOpen) { 183 setSearch(""); 184 setSelectedIndex(0); 185 setTimeout(() => { 186 var _a; 187 return (_a = inputRef.current) == null ? void 0 : _a.focus(); 188 }, 10); 189 } 190 }, [isOpen]); 191 const handleKeyDown = (e) => { 192 if (e.key === "ArrowDown") { 193 setSelectedIndex((prev) => (prev + 1) % filtered.length); 194 e.preventDefault(); 195 } else if (e.key === "ArrowUp") { 196 setSelectedIndex((prev) => (prev - 1 + filtered.length) % filtered.length); 197 e.preventDefault(); 198 } else if (e.key === "Enter" && filtered[selectedIndex]) { 199 onSelect(filtered[selectedIndex].id); 200 onClose(); 201 } else if (e.key === "Escape") { 202 onClose(); 203 } 204 }; 205 if (!isOpen) return null; 206 return /* @__PURE__ */ jsxRuntimeExports.jsx( 207 "div", 208 { 209 className: "fixed inset-0 z-[100] flex items-start justify-center pt-[15vh] bg-black/60 backdrop-blur-sm animate-in fade-in duration-200", 210 onClick: onClose, 211 children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 212 "div", 213 { 214 className: "w-full max-w-xl bg-zinc-900 border border-zinc-800 rounded-xl shadow-2xl overflow-hidden animate-in zoom-in-95 duration-200", 215 onClick: (e) => e.stopPropagation(), 216 children: [
217 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 border-b border-zinc-800 flex items-center gap-3", children: [ 218 /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "text-zinc-500", size: 20 }), 219 /* @__PURE__ */ jsxRuntimeExports.jsx( 220 "input", 221 { 222 ref: inputRef, 223 type: "text", 224 placeholder: "Search modules... (ââ to navigate, Enter to select)", 225 className: "flex-1 bg-transparent border-none outline-none text-white text-lg", 226 value: search, 227 onChange: (e) => setSearch(e.target.value), 228 onKeyDown: handleKeyDown 229 } 230 ), 231 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 232 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1 px-2 py-1 bg-zinc-800 rounded text-[10px] text-zinc-400 font-mono", children: /* @__PURE__ */ jsxRuntimeExports.jsx("kbd", { children: "ESC" }) }),
233 /* @__PURE__ */ jsxRuntimeExports.jsx( 234 "button", 235 { 236 onClick: onClose, 237 className: "p-1 hover:bg-zinc-800 rounded-lg text-zinc-500 hover:text-white transition-colors", 238 children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { size: 18 }) 239 } 240 ) 241 ] }) 242 ] }), 243 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-h-[60vh] overflow-y-auto p-2", children: [ 244 filtered.map((m, i) => { 245 const Icon = ICON_MAP[m.iconKey] || Box; 246 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 247 "a", 248 { 249 href: `/admin/${m.id}`, 250 className: `flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors ${i === selectedIndex ? "bg-indigo-600 text-white" : "text-zinc-400 hover:bg-zinc-800 hover:text-white"} block`, 251 onClick: (e) => { 252 onSelect(m.id, e); 253 if (!(e.ctrlKey || e.metaKey || e.button === 1)) { 254 onClose(); 255 } 256 }, 257 children: [
258 /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { size: 18 }), 259 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium", children: m.label }), 260 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto text-xs opacity-50 font-mono", children: m.id }) 261 ] 262 }, 263 m.id 264 ); 265 }), 266 filtered.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-8 text-center text-zinc-500", children: "No modules found" }) 267 ] }) 268 ] 269 } 270 ) 271 } 272 ); 273}; 274const AdminPage = ({ onUploadClick, onExit }) => { 275 const [user] = reactExports.useState(() => { 276 const saved = localStorage.getItem("hamie_session"); 277 try { 278 return saved ? JSON.parse(saved) : null; 279 } catch { 280 return null; 281 } 282 }); 283 const [isLocked, setIsLocked] = reactExports.useState(true); 284 const [pin, setPin] = reactExports.useState(""); 285 const [error, setError] = reactExports.useState(""); 286 const [isLoading, setIsLoading] = reactExports.useState(false); 287 const [activeRole, setActiveRole] = reactExports.useState(null); 288 const [rememberMe, setRememberMe] = reactExports.useState(false); 289 const initialModule = window.location.pathname.startsWith("/admin/") ? window.location.pathname.replace("/admin/", "") : "dashboard"; 290 const [activeModuleId, setActiveModuleId] = reactExports.useState(initialModule); 291 const [systemInfo, setSystemInfo] = reactExports.useState(null); 292 const nodeName = reactExports.useMemo(() => { 293 if (typeof window !== "undefined") { 294 const host = window.location.hostname || ""; 295 const href = window.location.href || ""; 296 if (host.includes("192.168.40.") || host.includes("jp") || href.includes("192.168.40.") || href.includes("jp")) { 297 return "JP"; 298 } 299 if (host.includes("192.168.1.") || host.includes("hamienet.ca")) { 300 return "HK"; 301 } 302 } 303 if (!systemInfo || !systemInfo.environment) return "HK"; 304 const env = systemInfo.environment; 305 if (env.CLUSTER_NODE) return env.CLUSTER_NODE.toUpperCase(); 306 if (env.NODE_LOCATION) return env.NODE_LOCATION.toUpperCase(); 307 if (env.REGION) return env.REGION.toUpperCase(); 308 if (env.DATABASE_URL) { 309 if (env.DATABASE_URL.includes("192.168.40.") || env.DATABASE_URL.includes("5434") || env.DATABASE_URL.includes("jp")) return "JP"; 310 if (env.DATABASE_URL.includes("192.168.1.115")) return "HK"; 311 } 312 return "HK"; 313 }, [systemInfo]); 314 const [dbModules, setDbModules] = reactExports.useState([]); 315 const [isSidebarCollapsed, setIsSidebarCollapsed] = reactExports.useState(() => { 316 if (typeof window === "undefined") return true; 317 const path = window.location.pathname; 318 return !(path === "/admin" || path === "/admin/"); 319 }); 320 const [expandedGroups, setExpandedGroups] = reactExports.useState(["Dashboard & Performance", "System Settings"]); 321 const [isQuickJumpOpen, setIsQuickJumpOpen] = reactExports.useState(false); 322 const [pinnedModuleIds, setPinnedModuleIds] = reactExports.useState([]); 323 const [refreshTrigger] = reactExports.useState(0); 324 const [entryError, setEntryError] = reactExports.useState(null); 325 const [customMenu, setCustomMenu] = reactExports.useState(null); 326 const [hideLessUsed, setHideLessUsed] = reactExports.useState(() => { 327 return localStorage.getItem("hamienet_hide_less_used") === "true"; 328 }); 329 reactExports.useEffect(() => { 330 localStorage.setItem("hamienet_hide_less_used", String(hideLessUsed)); 331 }, [hideLessUsed]); 332 reactExports.useEffect(() => { 333 const handleKeyDown = (e) => { 334 if ((e.ctrlKey || e.metaKey) && e.key === "k") { 335 e.preventDefault(); 336 setIsQuickJumpOpen(true); 337 } 338 }; 339 window.addEventListener("keydown", handleKeyDown); 340 return () => window.removeEventListener("keydown", handleKeyDown); 341 }, []); 342 reactExports.useEffect(() => { 343 const handlePopState = () => { 344 if (window.location.pathname.startsWith("/admin/")) {
345 setActiveModuleId(window.location.pathname.replace("/admin/", "")); 346 } else if (window.location.pathname === "/admin") { 347 setActiveModuleId("dashboard"); 348 } 349 }; 350 window.addEventListener("popstate", handlePopState); 351 return () => window.removeEventListener("popstate", handlePopState); 352 }, []); 353 reactExports.useEffect(() => { 354 const checkStatus = async () => { 355 try { 356 const status = await api.getAdminStatus(); 357 if (status.verified && status.role) { 358 setIsLocked(false); 359 setActiveRole(status.role); 360 return; 361 } 362 const grantToken = localStorage.getItem("hamienet_admin_grant"); 363 if (grantToken) { 364 setIsLoading(true); 365 try { 366 const reverify = await api.reverifyAdmin(grantToken); 367 if (reverify.verified && reverify.role) { 368 setIsLocked(false); 369 setActiveRole(reverify.role); 370 } else { 371 localStorage.removeItem("hamienet_admin_grant"); 372 } 373 } catch (e) { 374 console.error("Auto-reverification failed:", e); 375 } finally { 376 setIsLoading(false); 377 } 378 } 379 } catch (err) { 380 console.error("Verification sync failed:", err); 381 } 382 }; 383 checkStatus(); 384 }, []); 385 reactExports.useEffect(() => { 386 const loadData = async () => { 387 var _a, _b; 388 try { 389 const [info, modules, menuConfig] = await Promise.all([ 390 api.getSystemInfo().catch(() => ({ dataSource: "ERROR", dbLatency: 0 })), 391 api.getAdminModules().catch(() => []), 392 api.getSystemSetting("admin_menu_config").catch(() => null) 393 ]); 394 setSystemInfo(info); 395 setDbModules(modules || []); 396 if (menuConfig && Array.isArray(menuConfig.value)) { 397 const existingIds = new Set(menuConfig.value.map((item) => item.id)); 398 const missingModules = Object.keys(LEGACY_COMPONENT_MAP).filter((id) => !existingIds.has(id)); 399 if (missingModules.length > 0) { 400 const updatedMenu = [...menuConfig.value]; 401 missingModules.forEach((id) => { 402 if (id === "live_monitor") { 403 const insertIdx = updatedMenu.findIndex((item) => item.id === "logs" || item.id === "info" || item.id === "dashboard"); 404 if (insertIdx !== -1) { 405 updatedMenu.splice(insertIdx + 1, 0, { id: "live_monitor", type: "module" }); 406 return; 407 } 408 } 409 updatedMenu.push({ id, type: "module" }); 410 }); 411 setCustomMenu(updatedMenu); 412 } else { 413 setCustomMenu(menuConfig.value); 414 } 415 } else { 416 setCustomMenu(null); 417 } 418 setEntryError(null); 419 } catch (err) { 420 console.error("CRITICAL: AdminPage loadData failed", err); 421 if (((_a = err.message) == null ? void 0 : _a.includes("403")) || ((_b = err.message) == null ? void 0 : _b.includes("Access Denied"))) { 422 setEntryError("Session Authorization Failed. Please ensure you are logged in as an administrator."); 423 } else { 424 setEntryError("Failed to initialize Admin Studio. Check your connection."); 425 } 426 } 427 }; 428 loadData(); 429 }, [refreshTrigger]); 430 reactExports.useEffect(() => { 431 const loadPins = async () => { 432 try { 433 const dbPins = await api.getAdminPins(); 434 if (Array.isArray(dbPins) && dbPins.length > 0) { 435 setPinnedModuleIds(dbPins); 436 localStorage.setItem("hamienet_admin_pins", JSON.stringify(dbPins)); 437 return; 438 } 439 const localData = localStorage.getItem("hamienet_admin_pins"); 440 if (localData) { 441 try { 442 const parsed = JSON.parse(localData); 443 if (Array.isArray(parsed)) { 444 setPinnedModuleIds(parsed); 445 } 446 } catch (e) { 447 console.error("Failed to parse local pins", e); 448 } 449 } 450 } catch (err) { 451 console.error("Failed to load pinned modules", err); 452 const localData = localStorage.getItem("hamienet_admin_pins"); 453 if (localData) { 454 try { 455 const parsed = JSON.parse(localData); 456 if (Array.isArray(parsed)) setPinnedModuleIds(parsed); 457 } catch (e) { 458 } 459 } 460 } 461 }; 462 if (!isLocked) loadPins(); 463 }, [isLocked]); 464 const allModules = reactExports.useMemo(() => { 465 const list = [];
466 Object.entries(LEGACY_COMPONENT_MAP).forEach(([id, cfg]) => { 467 list.push({ 468 id, 469 label: cfg.label, 470 iconKey: cfg.iconKey, 471 type: "module", 472 component: getComponentForModule(cfg.filename) 473 }); 474 }); 475 dbModules.forEach((mod) => { 476 if (!list.find((l) => l.id === mod.id)) { 477 list.push({ 478 id: mod.id, 479 label: mod.name, 480 iconKey: mod.iconKey || "box", 481 type: "module", 482 component: getComponentForModule(mod.id) || (() => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-10", children: [ 483 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold mb-4", children: mod.name }), 484 /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "p-4 bg-zinc-900 rounded", children: mod.content }) 485 ] })) 486 }); 487 } 488 }); 489 return list; 490 }, [dbModules]); 491 const authorizedModules = reactExports.useMemo(() => { 492 try { 493 if (!activeRole) return []; 494 console.log("[AdminPortal] Current activeRole:", { 495 id: activeRole.id, 496 name: activeRole.name, 497 isSuperAdmin: activeRole.isSuperAdmin, 498 allowedType: typeof activeRole.allowedModules, 499 allowedIsArray: Array.isArray(activeRole.allowedModules) 500 }); 501 return allModules.filter((mod) => { 502 if (!mod) return false; 503 if (activeRole.isSuperAdmin) return true; 504 let allowed = activeRole.allowedModules; 505 if (typeof allowed === "string") { 506 try { 507 allowed = JSON.parse(allowed); 508 } catch (e) { 509 return false; 510 } 511 } 512 if (!allowed || !Array.isArray(allowed)) return false; 513 if (allowed.includes("all")) return true; 514 return allowed.includes(mod.id); 515 }); 516 } catch (err) { 517 console.error("Critical error in authorizedModules filter:", err); 518 return []; 519 } 520 }, [allModules, activeRole]); 521 const activeModuleItem = authorizedModules.find((m) => m.id === activeModuleId); 522 const ActiveModule = activeModuleItem == null ? void 0 : activeModuleItem.component; 523 const filteredMenu = reactExports.useMemo(() => { 524 if (!customMenu) return null; 525 if (!hideLessUsed) return customMenu; 526 const result = []; 527 let tempHeading = null; 528 let tempSeparator = null; 529 customMenu.forEach((item) => { 530 if (item.type === "heading") { 531 tempHeading = item; 532 } else if (item.type === "separator") { 533 tempSeparator = item; 534 } else { 535 const mod = authorizedModules.find((m) => m.id === item.id); 536 if (mod && !LESS_USED_MODULE_IDS.has(item.id)) { 537 if (tempSeparator) { 538 result.push(tempSeparator); 539 tempSeparator = null; 540 } 541 if (tempHeading) { 542 result.push(tempHeading); 543 tempHeading = null; 544 } 545 result.push(item); 546 } 547 } 548 }); 549 return result; 550 }, [customMenu, hideLessUsed, authorizedModules]); 551 reactExports.useEffect(() => { 552 if (activeModuleItem) { 553 document.title = `${activeModuleItem.label} | Admin Studio`; 554 } else { 555 document.title = "Admin Studio"; 556 } 557 return () => { 558 document.title = "HamieNet"; 559 }; 560 }, [activeModuleItem]); 561 const verifyPin = async (pinToVerify) => { 562 if (pinToVerify.length < 6) return; 563 setIsLoading(true); 564 setError(""); 565 try { 566 const data = await api.verifyAdminPin(pinToVerify, rememberMe); 567 if (data && data.id) { 568 setActiveRole(data); 569 setIsLocked(false); 570 if (rememberMe && data.adminToken) { 571 localStorage.setItem("hamienet_admin_grant", data.adminToken); 572 } 573 } else { 574 setError("Invalid PIN"); 575 setPin(""); 576 } 577 } catch (err) { 578 console.error("PIN verification error", err); 579 setError("Verification failed"); 580 setPin(""); 581 } finally { 582 setIsLoading(false); 583 } 584 }; 585 const handlePinSubmit = async (e) => { 586 e == null ? void 0 : e.preventDefault(); 587 await verifyPin(pin); 588 }; 589 const handleLogout = () => { 590 localStorage.removeItem("hamienet_admin_grant"); 591 setIsLocked(true); 592 setActiveRole(null); 593 setError(""); 594 }; 595 const toggleGroup = (name) => { 596 setExpandedGroups((prev) => prev.includes(name) ? prev.filter((n) => n !== name) : [...prev, name]); 597 }; 598 const navigateTo = (id, e) => { 599 if (e && (e.ctrlKey || e.metaKey || e.button === 1)) { 600 return; 601 } 602 if (e) { 603 e.preventDefault(); 604 } 605 setActiveModuleId(id); 606 window.history.pushState({}, "", `/admin/${id}`); 607 setIsSidebarCollapsed(true); 608 }; 609 const togglePin = async (moduleId, e) => { 610 e.preventDefault(); 611 e.stopPropagation(); 612 const currentPins = Array.isArray(pinnedModuleIds) ? pinnedModuleIds : []; 613 const newPins = currentPins.includes(moduleId) ? currentPins.filter((id) => id !== moduleId) : [...currentPins, moduleId]; 614 setPinnedModuleIds(newPins); 615 localStorage.setItem("hamienet_admin_pins", JSON.stringify(newPins)); 616 try { 617 await api.saveAdminPins(newPins); 618 } catch (err) { 619 console.error("Failed to save pins to DB:", err); 620 } 621 }; 622 if (!user || user.role !== "ADMIN") { 623 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-screen items-center justify-center bg-[#050505] text-white p-10 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-md", children: [
624 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-red-600/20 rounded-full flex items-center justify-center mb-6 mx-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ShieldAlert, { className: "text-red-600", size: 32 }) }), 625 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-black mb-4 tracking-tighter uppercase", children: "Restricted Area" }), 626 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-zinc-500 mb-8 leading-relaxed", children: "Access to the Admin Studio requires an authenticated administrator account. Please sign in with your administrative credentials to continue." }), 627 /* @__PURE__ */ jsxRuntimeExports.jsx( 628 "button", 629 { 630 onClick: () => window.location.href = "/?auth=login", 631 className: "px-8 py-3 bg-white text-black rounded-full font-bold hover:bg-zinc-200 transition-all", 632 children: "Return to Site" 633 } 634 ) 635 ] }) }); 636 } 637 if (isLocked) { 638 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-screen items-center justify-center bg-[#111]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-full max-w-sm p-8 bg-zinc-900 border border-zinc-800 rounded-2xl shadow-2xl", children: [
639 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center mb-8", children: [ 640 /* @__PURE__ */ jsxRuntimeExports.jsx(Shield, { size: 48, className: "mx-auto text-indigo-500 mb-4" }), 641 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-bold text-white", children: "Admin Studio" }) 642 ] }), 643 /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handlePinSubmit, children: [ 644 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center gap-2 mb-4", children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx( 645 "input", 646 { 647 type: "password", 648 maxLength: 1, 649 autoFocus: i === 0, 650 value: pin[i] || "", 651 className: "w-10 h-12 bg-zinc-800 border border-zinc-700 rounded text-center text-xl text-white outline-none focus:border-indigo-500", 652 onChange: (e) => { 653 var _a; 654 const val = e.target.value.replace(/[^0-9]/g, ""); 655 if (!val && e.target.value) return; 656 const newPinArr = pin.split(""); 657 newPinArr[i] = val; 658 const nextPin = newPinArr.join(""); 659 setPin(nextPin); 660 if (val && i < 5) { 661 (_a = e.target.nextElementSibling) == null ? void 0 : _a.focus(); 662 } 663 if (nextPin.length === 6) { 664 verifyPin(nextPin); 665 } 666 } 667 }, 668 i 669 )) }),
670 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-3 mb-6 px-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-2 cursor-pointer group", children: [ 671 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex items-center justify-center", children: [ 672 /* @__PURE__ */ jsxRuntimeExports.jsx( 673 "input", 674 { 675 type: "checkbox", 676 className: "sr-only", 677 checked: rememberMe, 678 onChange: (e) => setRememberMe(e.target.checked) 679 } 680 ), 681 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `w-5 h-5 border rounded transition-all duration-200 flex items-center justify-center ${rememberMe ? "bg-indigo-600 border-indigo-600" : "bg-transparent border-zinc-700 group-hover:border-zinc-500"}`, children: rememberMe && /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-3.5 h-3.5 text-white", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: "4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) }) }) 682 ] }),
683 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-zinc-400 group-hover:text-zinc-300 transition-colors select-none", children: "Remember this device" }) 684 ] }) }), 685 error && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-red-400 text-center text-sm", children: error }), 686 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "submit", disabled: isLoading || pin.length < 6, className: "w-full mt-6 bg-indigo-600 text-white font-bold py-3 rounded-lg", children: isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "animate-spin mx-auto" }) : "Unlock" }) 687 ] }) 688 ] }) }); 689 } 690 if (entryError) { 691 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-screen items-center justify-center bg-black text-white p-10 text-center", children: [ 692 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-red-600/20 rounded-full flex items-center justify-center mb-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-2xl font-bold text-red-500", children: "!" }) }),
693 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-black mb-4 uppercase", children: "Initialization Error" }), 694 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-zinc-500 mb-8 max-w-sm text-sm", children: entryError }), 695 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => window.location.reload(), className: "px-6 py-2 bg-white text-black rounded-full font-bold hover:bg-zinc-200", children: "Retry Connection" }) 696 ] }); 697 } 698 return /* @__PURE__ */ jsxRuntimeExports.jsxs(SettingsProvider, { children: [ 699 /* @__PURE__ */ jsxRuntimeExports.jsx("style", { children: ` 700 .sidebar-transition { transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1); } 701 .item-transition { transition: all 0.2s ease; } 702 .custom-scrollbar::-webkit-scrollbar { width: 4px; } 703 .custom-scrollbar::-webkit-scrollbar-track { background: transparent; } 704 .custom-scrollbar::-webkit-scrollbar-thumb { background: #333; border-radius: 10px; } 705 .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: #444; } 706 ` }), 707 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-screen bg-zinc-950 text-white overflow-hidden font-sans", children: [
708 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `bg-[#0d0d0d] border-r border-zinc-800 flex flex-col sidebar-transition ${isSidebarCollapsed ? "w-20" : "w-72"}`, children: [ 709 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-16 border-b border-zinc-800 flex items-center justify-between px-5 shrink-0", children: [ 710 !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [ 711 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 bg-indigo-600 rounded flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Shield, { size: 18, className: "text-white" }) }), 712 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [ 713 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-bold tracking-tight text-sm leading-tight", children: [ 714 "Command Center (", 715 nodeName, 716 ")" 717 ] }), 718 (() => { 719 var _a, _b; 720 const version = (_a = document.querySelector('meta[name="git-version"]')) == null ? void 0 : _a.getAttribute("content"); 721 const buildTime = (_b = document.querySelector('meta[name="build-time"]')) == null ? void 0 : _b.getAttribute("content"); 722 let formattedBuildTime = ""; 723 if (buildTime) { 724 try { 725 const d = new Date(buildTime); 726 if (!isNaN(d.getTime())) { 727 const pad = (n) => String(n).padStart(2, "0"); 728 formattedBuildTime = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; 729 } else { 730 formattedBuildTime = buildTime; 731 } 732 } catch (e) { 733 formattedBuildTime = buildTime; 734 } 735 } 736 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col text-[10px] text-zinc-500 font-mono tracking-wider mt-0.5 leading-tight", children: [
737 version && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: version }), 738 formattedBuildTime && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 739 "Build: ", 740 formattedBuildTime 741 ] }) 742 ] }); 743 })() 744 ] }) 745 ] }), 746 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => setIsSidebarCollapsed(!isSidebarCollapsed), className: "p-2 hover:bg-zinc-800 rounded-lg text-zinc-500 hover:text-white transition-colors", children: isSidebarCollapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronsRight, { size: 20 }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronsLeft, { size: 20 }) }) 747 ] }), 748 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-2 space-y-2", children: [ 749 !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs( 750 "button", 751 { 752 onClick: () => setIsQuickJumpOpen(true), 753 className: "w-full flex items-center gap-2 px-3 py-1.5 bg-zinc-900 border border-zinc-800 rounded-lg text-[10px] text-zinc-500 hover:border-zinc-700 transition-colors mb-2", 754 children: [
755 /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { size: 14 }), 756 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Quick Jump..." }), 757 /* @__PURE__ */ jsxRuntimeExports.jsx("kbd", { className: "ml-auto font-mono opacity-50", children: "Ctrl+K" }) 758 ] 759 } 760 ), 761 !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-3 py-2 flex items-center justify-between bg-zinc-900/40 border border-zinc-800/50 rounded-lg mb-3 select-none", children: [ 762 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-black text-zinc-500 uppercase tracking-widest", children: "Hide Utilities" }), 763 /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "relative flex items-center cursor-pointer", children: [ 764 /* @__PURE__ */ jsxRuntimeExports.jsx( 765 "input", 766 { 767 type: "checkbox", 768 checked: hideLessUsed, 769 onChange: (e) => setHideLessUsed(e.target.checked), 770 className: "sr-only peer" 771 } 772 ),
773 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `w-8 h-4 rounded-full transition-all duration-200 relative ${hideLessUsed ? "bg-indigo-600" : "bg-zinc-800"}`, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `absolute top-0.5 w-3 h-3 bg-white rounded-full transition-all duration-200 ${hideLessUsed ? "left-[17px]" : "left-0.5"}` }) }) 774 ] }) 775 ] }), 776 Array.isArray(pinnedModuleIds) && pinnedModuleIds.length > 0 && !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [ 777 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-3 py-1.5 text-[10px] uppercase tracking-widest font-bold text-indigo-400/70 bg-indigo-500/5 rounded-md mb-1", children: [ 778 /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { size: 10, className: "rotate-45" }), 779 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Pinned Access" }) 780 ] }), 781 /* @__P
781URE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-1", children: pinnedModuleIds.filter((id) => !!id).map((id) => { 782 const mod = authorizedModules.find((m) => m.id === id); 783 if (!mod) return null; 784 const Icon = ICON_MAP[mod.iconKey] || Box; 785 const isActive = activeModuleId === mod.id; 786 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "group relative", children: [ 787 /* @__PURE__ */ jsxRuntimeExports.jsxs( 788 "a", 789 { 790 href: `/admin/${id}`, 791 onClick: (e) => navigateTo(id, e), 792 className: `w-full flex items-center gap-3 p-1.5 rounded-lg text-[13px] item-transition ${isActive ? "bg-indigo-600/20 text-indigo-300 border border-indigo-600/30" : "text-zinc-400 hover:bg-zinc-800/50 hover:text-zinc-200 border border-transparent"}`, 793 children: [ 794 /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { size: 16, className: isActive ? "text-indigo-400" : "" }),
795 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate flex-1 text-left", children: mod.label }) 796 ] 797 } 798 ), 799 /* @__PURE__ */ jsxRuntimeExports.jsx( 800 "button", 801 { 802 onClick: (e) => togglePin(id, e), 803 className: "absolute right-2 top-1/2 -translate-y-1/2 p-1.5 opacity-0 group-hover:opacity-100 hover:bg-zinc-700/50 rounded-md text-zinc-500 hover:text-indigo-400 transition-all", 804 title: "Unpin", 805 children: /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { size: 14, className: "fill-indigo-500/30" }) 806 } 807 ) 808 ] }, `pinned-${id}`); 809 }) }) 810 ] }), 811 filteredMenu ? filteredMenu.map((item) => { 812 if (item.type === "separator") { 813 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-px bg-zinc-800/60 my-4 mx-2" }, item.id); 814 } 815 if (item.type === "heading") { 816 return !isSidebarCollapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-1.5 text-[10px] uppercase tracking-widest font-black text-indigo-400/80 bg-indigo-500/5 rounded-md border border-indigo-600/10 mb-1 mt-3", children: item.label || "SECTION" }, item.id) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-px bg-zinc-800/60 my-4 mx-2" }, item.id); 817 } 818 const mod = authorizedModules.find((m) => m.id === item.id); 819 if (!mod) return null; 820 const Icon = ICON_MAP[mod.iconKey] || Box; 821 const isActive = activeModuleId === mod.id; 822 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "group relative", children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 823 "a", 824 { 825 href: `/admin/${mod.id}`, 826 onClick: (e) => navigateTo(mod.id, e), 827 className: `w-full flex items-center gap-3 p-1.5 rounded-lg text-[13px] item-transition ${isActive ? "bg-indigo-600/10 text-indigo-400 border border-indigo-600/20" : "text-zinc-400 hover:bg-zinc-800/50 hover:text-zinc-200 border border-transparent"} ${isSidebarCollapsed ? "justify-center" : ""}`, 828 title: isSidebarCollapsed ? mod.label : "", 829 children: [
830 /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { size: 16, className: isActive ? "text-indigo-400" : "" }), 831 !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 832 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate flex-1 text-left", children: mod.label }), 833 /* @__PURE__ */ jsxRuntimeExports.jsx( 834 "button", 835 { 836 onClick: (e) => togglePin(mod.id, e), 837 className: `p-1 rounded-md transition-all ${Array.isArray(pinnedModuleIds) && pinnedModuleIds.includes(mod.id) ? "text-indigo-400 opacity-100" : "text-zinc-600 hover:text-zinc-400 opacity-0 group-hover:opacity-100"}`, 838 children: /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { size: 14, className: Array.isArray(pinnedModuleIds) && pinnedModuleIds.includes(mod.id) ? "fill-indigo-500/30" : "" }) 839 } 840 ) 841 ] }) 842 ] 843 } 844 ) }, mod.id); 845 }) : ADMIN_MENU_GROUPS.map((group) => { 846 var _a; 847 const isExpanded = expandedGroups.includes(group.name); 848 const groupItems = authorizedModules.filter((m) => group.items.includes(m.id) && (!hideLessUsed || !LESS_USED_MODULE_IDS.has(m.id))); 849 const visibleChildren = ((_a = group.children) == null ? void 0 : _a.filter((childId) => { 850 const childMod = authorizedModules.find((m) => m.id === childId); 851 return childMod && (!hideLessUsed || !LESS_USED_MODULE_IDS.has(childId)); 852 })) || []; 853 const hasChildren = visibleChildren.length > 0; 854 if (groupItems.length === 0 && !hasChildren) return null; 855 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [ 856 !isSidebarCollapsed ? /* @__PURE__ */ jsxRuntimeExports.jsxs( 857 "button", 858 { 859 onClick: () => toggleGroup(group.name), 860 className: "w-full flex items-center gap-2 px-3 py-1.5 text-[10px] uppercase tracking-widest font-black text-zinc-500 hover:text-zinc-300 transition-colors bg-zinc-900/40 rounded-md border border-zinc-800/50 mb-1", 861 children: [
862 /* @__PURE__ */ jsxRuntimeExports.jsx(group.icon, { size: 12 }), 863 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: group.name }), 864 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { size: 10, className: `ml-auto transition-transform ${isExpanded ? "" : "-rotate-90"}` }) 865 ] 866 } 867 ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-px bg-zinc-800 my-4 mx-2" }), 868 (isExpanded || isSidebarCollapsed) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [ 869 groupItems.map((mod) => { 870 const Icon = ICON_MAP[mod.iconKey] || Box; 871 const isActive = activeModuleId === mod.id; 872 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "group relative", children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 873 "a", 874 { 875 href: `/admin/${mod.id}`, 876 onClick: (e) => navigateTo(mod.id, e), 877 className: `w-full flex items-center gap-3 p-1.5 rounded-lg text-[13px] item-transition ${isActive ? "bg-indigo-600/10 text-indigo-400 border border-indigo-600/20" : "text-zinc-400 hover:bg-zinc-800/50 hover:text-zinc-200 border border-transparent"} ${isSidebarCollapsed ? "justify-center" : ""}`, 878 title: isSidebarCollapsed ? mod.label : "", 879 children: [
880 /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { size: 16, className: isActive ? "text-indigo-400" : "" }), 881 !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 882 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate flex-1 text-left", children: mod.label }), 883 /* @__PURE__ */ jsxRuntimeExports.jsx( 884 "button", 885 { 886 onClick: (e) => togglePin(mod.id, e), 887 className: `p-1 rounded-md transition-all ${Array.isArray(pinnedModuleIds) && pinnedModuleIds.includes(mod.id) ? "text-indigo-400 opacity-100" : "text-zinc-600 hover:text-zinc-400 opacity-0 group-hover:opacity-100"}`, 888 children: /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { size: 14, className: Array.isArray(pinnedModuleIds) && pinnedModuleIds.includes(mod.id) ? "fill-indigo-500/30" : "" }) 889 } 890 ) 891 ] }) 892 ] 893 } 894 ) }, mod.id); 895 }), 896 group.name === "System Settings" && !isSidebarCollapsed && isExpanded && hasChildren && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-4 pl-4 border-l border-zinc-800 space-y-1 mt-1", children: visibleChildren.map((childId) => { 897 const childMod = authorizedModules.find((m) => m.id === childId); 898 if (!childMod) return null; 899 const ChildIcon = ICON_MAP[childMod.iconKey] || Settings; 900 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 901 "a", 902 { 903 href: `/admin/${childId}`, 904 onClick: (e) => navigateTo(childId, e), 905 className: `w-full flex items-center gap-3 p-2 rounded-lg text-xs item-transition ${activeModuleId === childId ? "text-indigo-400 font-bold" : "text-zinc-500 hover:text-zinc-300"}`, 906 children: [
907 /* @__PURE__ */ jsxRuntimeExports.jsx(ChildIcon, { size: 14 }), 908 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: childMod.label }) 909 ] 910 }, 911 childId 912 ); 913 }) }) 914 ] }) 915 ] }, group.name); 916 }) 917 ] }), 918 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 border-t border-zinc-800 bg-[#0a0a0a]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [ 919 !isSidebarCollapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 920 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-bold truncate text-white uppercase tracking-tighter", children: activeRole == null ? void 0 : activeRole.name }), 921 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 text-[10px] text-zinc-500", children: [
922 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-1.5 h-1.5 bg-emerald-500 rounded-full animate-pulse" }), 923 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Verified Admin" }) 924 ] }), 925 systemInfo && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 mt-2 text-[9px] font-mono text-zinc-500", children: [ 926 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 cursor-help", title: "Data Source", children: [ 927 /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { size: 10, className: systemInfo.dataSource === "LIVE" ? "text-emerald-500" : "text-amber-500" }), 928 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: systemInfo.dataSource }) 929 ] }), 930 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 cursor-help", title: "DB Latency", children: [ 931 /* @__PURE__ */ jsxRuntimeExports.jsx(Activity, { size: 10, className: systemInfo.dbLatency < 50 ? "text-emerald-500" : systemInfo.dbLatency < 100 ? "text-amber-500" : "text-red-500" }),
932 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 933 systemInfo.dbLatency, 934 "ms" 935 ] }) 936 ] }) 937 ] }) 938 ] }), 939 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: onExit || handleLogout, className: "p-2.5 hover:bg-zinc-800 rounded-lg text-zinc-500 hover:text-white transition-all", title: "Exit / Lock", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LogOut, { size: 18 }) }) 940 ] }) }) 941 ] }), 942 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex flex-col overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: "flex-1 overflow-auto bg-black relative flex flex-col min-h-0 custom-scrollbar", children: /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-4", children: [ 943 /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "animate-spin text-indigo-500", size: 32 }),
944 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-zinc-500 font-mono uppercase tracking-widest", children: "Initialising Module..." }) 945 ] }), children: ActiveModule && /* @__PURE__ */ jsxRuntimeExports.jsx(ActiveModule, { refreshTrigger, onUploadClick, activeRole }) }) }) }), 946 /* @__PURE__ */ jsxRuntimeExports.jsx( 947 QuickJump, 948 { 949 isOpen: isQuickJumpOpen, 950 onClose: () => setIsQuickJumpOpen(false), 951 modules: authorizedModules, 952 onSelect: navigateTo 953 } 954 ) 955 ] }) 956 ] }); 957}; 958const AdminApp = ({ onExit }) => { 959 const content = /* @__PURE__ */ jsxRuntimeExports.jsx(AdminPage, { onUploadClick: () => alert("Uploads handled via Media Library in Admin Mode"), onExit }); 960 if (onExit) { 961 return content; 962 } 963 return /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsProvider, { children: content }); 964}; 965export { 966 AdminApp as default 967};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.