insikt.js 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"insikt.es.js","sources":["../src/index.js"],"sourcesContent":["const VERSION = '1.0.0';\n\nconst state = {\n initialized: false,\n panelVisible: false,\n logs: [],\n requests: [],\n errors: [],\n ui: {\n root: null,\n panel: null,\n fab: null\n }\n};\n\nfunction initInsikt(options = {}) {\n if (state.initialized) return;\n state.initialized = true;\n \n createUI();\n attachConsoleProxy();\n attachGlobalErrorHandler();\n \n console.log(`[INSIKT v${VERSION}] initialized`);\n}\n\nfunction destroyInsikt() {\n removeUI();\n state.initialized = false;\n console.log('[INSIKT] destroyed');\n}\n\nfunction toggleInsikt() {\n state.panelVisible = !state.panelVisible;\n if (state.ui.panel) {\n state.ui.panel.style.display = state.panelVisible ? 'block' : 'none';\n }\n}\n\nfunction clearLogs() {\n state.logs = [];\n state.requests = [];\n state.errors = [];\n // TODO: Add UI clear logic here\n}\n\nfunction createUI() {\n // TODO: Build elegant, minimalist overlay UI\n state.ui.root = document.createElement('div');\n state.ui.root.id = 'insikt-root';\n document.body.appendChild(state.ui.root);\n}\n\nfunction removeUI() {\n if (state.ui.root) {\n state.ui.root.remove();\n state.ui.root = null;\n }\n}\n\nfunction attachConsoleProxy() {\n const originalLog = console.log;\n console.log = (...args) => {\n state.logs.push({ type: 'log', args, timestamp: Date.now() });\n originalLog.apply(console, args);\n };\n}\n\nfunction attachGlobalErrorHandler() {\n window.addEventListener('error', (event) => {\n state.errors.push({ error: event.error, timestamp: Date.now() });\n });\n}\n\n// Public API\nconst insiktAPI = {\n version: VERSION,\n init: initInsikt,\n destroy: destroyInsikt,\n toggle: toggleInsikt,\n clear: clearLogs\n};\n\n// Auto-initialize in browser environments\nif (typeof window !== 'undefined') {\n window.insikt = insiktAPI;\n if (!window.__INSIKT_INITIALIZED__) {\n window.__INSIKT_INITIALIZED__ = true;\n // Defer initialization to ensure DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initInsikt);\n } else {\n initInsikt();\n }\n }\n}\n\nexport { initInsikt, destroyInsikt, toggleInsikt, clearLogs };\nexport default insiktAPI;\n"],"names":[],"mappings":"AAAA,MAAM,UAAU;AAEhB,MAAM,QAAQ;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,MAAM,CAAA;AAAA,EACN,UAAU,CAAA;AAAA,EACV,QAAQ,CAAA;AAAA,EACR,IAAI;AAAA,IACF,MAAM;AAAA,EAGR;AACF;AAEA,SAAS,WAAW,UAAU,IAAI;AAChC,MAAI,MAAM,YAAa;AACvB,QAAM,cAAc;AAEpB,WAAQ;AACR,qBAAkB;AAClB,2BAAwB;AAExB,UAAQ,IAAI,YAAY,OAAO,eAAe;AAChD;AAEA,SAAS,gBAAgB;AACvB,WAAQ;AACR,QAAM,cAAc;AACpB,UAAQ,IAAI,oBAAoB;AAClC;AAEA,SAAS,eAAe;AACtB,QAAM,eAAe,CAAC,MAAM;AAI9B;AAEA,SAAS,YAAY;AACnB,QAAM,OAAO,CAAA;AACb,QAAM,WAAW,CAAA;AACjB,QAAM,SAAS,CAAA;AAEjB;AAEA,SAAS,WAAW;AAElB,QAAM,GAAG,OAAO,SAAS,cAAc,KAAK;AAC5C,QAAM,GAAG,KAAK,KAAK;AACnB,WAAS,KAAK,YAAY,MAAM,GAAG,IAAI;AACzC;AAEA,SAAS,WAAW;AAClB,MAAI,MAAM,GAAG,MAAM;AACjB,UAAM,GAAG,KAAK,OAAM;AACpB,UAAM,GAAG,OAAO;AAAA,EAClB;AACF;AAEA,SAAS,qBAAqB;AAC5B,QAAM,cAAc,QAAQ;AAC5B,UAAQ,MAAM,IAAI,SAAS;AACzB,UAAM,KAAK,KAAK,EAAE,MAAM,OAAO,MAAM,WAAW,KAAK,IAAG,GAAI;AAC5D,gBAAY,MAAM,SAAS,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,2BAA2B;AAClC,SAAO,iBAAiB,SAAS,CAAC,UAAU;AAC1C,UAAM,OAAO,KAAK,EAAE,OAAO,MAAM,OAAO,WAAW,KAAK,IAAG,GAAI;AAAA,EACjE,CAAC;AACH;AAGK,MAAC,YAAY;AAAA,EAChB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AACT;AAGA,IAAI,OAAO,WAAW,aAAa;AACjC,SAAO,SAAS;AAChB,MAAI,CAAC,OAAO,wBAAwB;AAClC,WAAO,yBAAyB;AAEhC,QAAI,SAAS,eAAe,WAAW;AACrC,eAAS,iBAAiB,oBAAoB,UAAU;AAAA,IAC1D,OAAO;AACL,iBAAU;AAAA,IACZ;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"insikt.es.js","sources":["../insikt.js"],"sourcesContent":["(function() {\n 'use strict';\n\n // ═══════════════════════════════════════════════════════════════\n // 1. INJECT CSS (Scoped to #dc-panel and #dc-fab)\n // ═══════════════════════════════════════════════════════════════\n const css = `\n @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Syne:wght@400;600;700;800&display=swap');\n\n :root {\n --dc-bg0: #0d0d0f;\n --dc-bg1: #141418;\n --dc-bg2: #1c1c22;\n --dc-bg3: #242430;\n --dc-border: #2a2a38;\n --dc-accent: #7c6af7;\n --dc-accent2: #f768a4;\n --dc-green: #3dffa0;\n --dc-orange: #ffb347;\n --dc-red: #ff5c6e;\n --dc-blue: #5bcefa;\n --dc-text0: #f0f0f8;\n --dc-text1: #a8a8c0;\n --dc-text2: #606078;\n --dc-mono: 'JetBrains Mono', monospace;\n --dc-sans: 'Syne', sans-serif;\n }\n\n /* Scope resets strictly to our elements */\n #dc-panel, #dc-fab { box-sizing: border-box; }\n #dc-panel *, #dc-fab * { box-sizing: inherit; }\n\n /* ── FAB ────────────────────────────── */\n #dc-fab {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 44px;\n height: 44px;\n border-radius: 12px;\n background: var(--dc-accent);\n color: #fff;\n border: none;\n font-size: 18px;\n cursor: pointer;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 24px rgba(124,106,247,0.5);\n transition: all 0.2s ease;\n font-family: var(--dc-mono);\n padding: 0;\n margin: 0;\n }\n\n #dc-fab:hover { transform: scale(1.05); box-shadow: 0 6px 30px rgba(124,106,247,0.7); }\n #dc-fab:active { transform: scale(0.95); }\n\n .dc-fab-badge {\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 18px;\n height: 18px;\n background: var(--dc-red);\n color: #fff;\n font-size: 10px;\n font-weight: 700;\n border-radius: 9px;\n display: none;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n font-family: var(--dc-mono);\n }\n\n /* ── CONSOLE PANEL ───────────────────── */\n #dc-panel {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 320px;\n min-height: 120px;\n max-height: 85vh;\n background: var(--dc-bg1);\n border-top: 1px solid var(--dc-border);\n border-radius: 14px 14px 0 0;\n box-shadow: 0 -12px 50px rgba(0,0,0,0.6);\n display: none;\n flex-direction: column;\n z-index: 99998;\n overflow: hidden;\n font-family: var(--dc-mono);\n color: var(--dc-text0);\n }\n\n #dc-panel.visible {\n display: flex;\n animation: dcSlideUp 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes dcSlideUp {\n from { transform: translateY(100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n\n /* Drag handle */\n #dc-drag {\n width: 100%;\n height: 22px;\n background: var(--dc-bg2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ns-resize;\n border-radius: 14px 14px 0 0;\n flex-shrink: 0;\n touch-action: none;\n user-select: none;\n }\n\n #dc-drag::before {\n content: '';\n width: 36px;\n height: 4px;\n background: var(--dc-border);\n border-radius: 2px;\n transition: background 0.2s;\n }\n\n #dc-drag:hover::before { background: var(--dc-accent); }\n\n /* Header bar */\n #dc-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n #dc-title {\n font-size: 11px;\n font-weight: 700;\n color: var(--dc-accent);\n letter-spacing: 0.1em;\n text-transform: uppercase;\n flex: 1;\n }\n\n .dc-pulse {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dc-green);\n animation: dcPulse 2s infinite;\n flex-shrink: 0;\n }\n\n @keyframes dcPulse {\n 0%,100% { opacity: 1; box-shadow: 0 0 0 0 rgba(61,255,160,0.4); }\n 50% { opacity: 0.6; box-shadow: 0 0 0 5px rgba(61,255,160,0); }\n }\n\n .dc-hbtn {\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 7px;\n background: var(--dc-bg3);\n color: var(--dc-text1);\n font-size: 13px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n padding: 0;\n }\n\n .dc-hbtn:hover { background: var(--dc-border); color: var(--dc-text0); }\n\n /* Tabs */\n #dc-tabs {\n display: flex;\n background: var(--dc-bg0);\n border-bottom: 1px solid var(--dc-border);\n overflow-x: auto;\n scrollbar-width: none;\n flex-shrink: 0;\n }\n\n #dc-tabs::-webkit-scrollbar { display: none; }\n\n .dc-tab {\n padding: 10px 14px;\n background: none;\n border: none;\n color: var(--dc-text2);\n font-family: var(--dc-mono);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.05em;\n cursor: pointer;\n white-space: nowrap;\n border-bottom: 2px solid transparent;\n transition: all 0.15s;\n position: relative;\n }\n\n .dc-tab:hover { color: var(--dc-text1); }\n\n .dc-tab.active {\n color: var(--dc-accent);\n border-bottom-color: var(--dc-accent);\n }\n\n .dc-tab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n background: var(--dc-accent);\n color: #fff;\n font-size: 9px;\n font-weight: 700;\n border-radius: 8px;\n padding: 0 4px;\n margin-left: 5px;\n }\n\n /* Tab panels */\n .dc-panel-content {\n display: none;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n\n .dc-panel-content.active { display: flex; }\n\n .dc-scroll {\n flex: 1;\n overflow-y: auto;\n padding: 10px 12px;\n scrollbar-width: thin;\n scrollbar-color: var(--dc-border) transparent;\n }\n\n .dc-scroll::-webkit-scrollbar { width: 4px; }\n .dc-scroll::-webkit-scrollbar-thumb { background: var(--dc-border); border-radius: 2px; }\n\n /* ── LOG ENTRIES ──────────────────────── */\n .dc-entry {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 5px;\n margin-bottom: 3px;\n font-size: 12px;\n line-height: 1.5;\n word-break: break-word;\n animation: dcFadeIn 0.1s ease;\n }\n\n @keyframes dcFadeIn { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: none; } }\n\n .dc-entry-log { color: var(--dc-text0); }\n .dc-entry-warn { color: var(--dc-orange); background: rgba(255,179,71,0.07); border-left: 2px solid var(--dc-orange); }\n .dc-entry-error { color: var(--dc-red); background: rgba(255,92,110,0.07); border-left: 2px solid var(--dc-red); }\n .dc-entry-info { color: var(--dc-blue); background: rgba(91,206,250,0.06); border-left: 2px solid var(--dc-blue); }\n .dc-entry-cmd { color: var(--dc-accent); background: rgba(124,106,247,0.06); }\n\n .dc-ts {\n color: var(--dc-text2);\n font-size: 10px;\n font-weight: 400;\n flex-shrink: 0;\n letter-spacing: 0;\n }\n\n .dc-entry pre {\n white-space: pre-wrap;\n word-break: break-all;\n background: var(--dc-bg0);\n padding: 6px 8px;\n border-radius: 5px;\n margin-top: 4px;\n font-size: 11px;\n color: var(--dc-green);\n width: 100%;\n }\n\n /* ── REPL INPUT ───────────────────────── */\n .dc-repl {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-top: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-input {\n flex: 1;\n padding: 8px 12px;\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text0);\n font-family: var(--dc-mono);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s;\n }\n\n .dc-input:focus { border-color: var(--dc-accent); box-shadow: 0 0 0 2px rgba(124,106,247,0.15); }\n\n .dc-run-btn {\n padding: 8px 14px;\n background: var(--dc-accent);\n border: none;\n border-radius: 8px;\n color: #fff;\n font-family: var(--dc-mono);\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.15s;\n letter-spacing: 0.05em;\n }\n\n .dc-run-btn:hover { background: #8f7ffb; }\n .dc-run-btn:active { transform: scale(0.96); }\n\n /* ── NETWORK TAB ──────────────────────── */\n .dc-net-filter {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-filter-input {\n flex: 1;\n padding: 7px 10px;\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text0);\n font-family: var(--dc-mono);\n font-size: 12px;\n outline: none;\n }\n\n .dc-filter-input:focus { border-color: var(--dc-accent); }\n\n .dc-clear-btn {\n padding: 7px 12px;\n background: var(--dc-bg3);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text1);\n font-family: var(--dc-mono);\n font-size: 11px;\n cursor: pointer;\n }\n\n .dc-clear-btn:hover { border-color: var(--dc-red); color: var(--dc-red); }\n\n .dc-req {\n padding: 9px 10px;\n border-radius: 6px;\n margin-bottom: 4px;\n background: var(--dc-bg2);\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.15s;\n }\n\n .dc-req:hover { border-color: var(--dc-border); }\n .dc-req.expanded { border-color: var(--dc-accent); }\n\n .dc-req-top {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 11px;\n }\n\n .dc-method {\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.05em;\n flex-shrink: 0;\n }\n\n .m-GET { background: rgba(61,255,160,0.15); color: var(--dc-green); }\n .m-POST { background: rgba(91,206,250,0.15); color: var(--dc-blue); }\n .m-PUT { background: rgba(255,179,71,0.15); color: var(--dc-orange); }\n .m-DELETE { background: rgba(255,92,110,0.15); color: var(--dc-red); }\n .m-PATCH { background: rgba(124,106,247,0.15); color: var(--dc-accent); }\n .m-UNK { background: var(--dc-bg3); color: var(--dc-text2); }\n\n .dc-req-url {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dc-text0);\n }\n\n .dc-req-status { flex-shrink: 0; }\n .s-ok { color: var(--dc-green); }\n .s-redir { color: var(--dc-orange); }\n .s-err { color: var(--dc-red); }\n\n .dc-req-meta {\n color: var(--dc-text2);\n font-size: 10px;\n margin-top: 3px;\n }\n\n .dc-req-detail {\n display: none;\n margin-top: 8px;\n background: var(--dc-bg0);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 11px;\n color: var(--dc-text1);\n }\n\n .dc-req-detail.open { display: block; }\n\n .dc-detail-section { margin-bottom: 10px; }\n .dc-detail-title { color: var(--dc-accent); font-weight: 700; margin-bottom: 4px; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; }\n .dc-detail-row { padding: 2px 0; word-break: break-all; }\n .dc-detail-key { color: var(--dc-text2); }\n\n /* ── STORAGE TAB ──────────────────────── */\n .dc-storage-nav {\n display: flex;\n gap: 4px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-st-btn {\n padding: 5px 12px;\n border: 1px solid var(--dc-border);\n border-radius: 100px;\n background: none;\n color: var(--dc-text2);\n font-family: var(--dc-mono);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .dc-st-btn.active { background: var(--dc-accent); border-color: var(--dc-accent); color: #fff; }\n .dc-st-btn:hover:not(.active) { border-color: var(--dc-text2); color: var(--dc-text1); }\n\n .dc-storage-actions {\n display: flex;\n justify-content: flex-end;\n padding: 6px 12px;\n flex-shrink: 0;\n }\n\n .dc-db-card {\n background: var(--dc-bg2);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n margin-bottom: 8px;\n overflow: hidden;\n }\n\n .dc-db-header {\n padding: 10px 14px;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--dc-bg3);\n transition: background 0.15s;\n }\n\n .dc-db-header:hover { background: var(--dc-border); }\n\n .dc-db-name { color: var(--dc-blue); font-size: 12px; font-weight: 700; }\n .dc-db-meta { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-db-body { display: none; padding: 10px; }\n .dc-db-card.open .dc-db-body { display: block; }\n\n .dc-store-item {\n padding: 8px 10px;\n background: var(--dc-bg0);\n border-radius: 5px;\n margin-bottom: 6px;\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.15s;\n }\n\n .dc-store-item:hover { border-color: var(--dc-border); }\n .dc-store-name { color: var(--dc-text0); font-size: 12px; font-weight: 600; }\n .dc-store-meta { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-data-viewer {\n display: none;\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n }\n\n .dc-data-viewer.open { display: block; }\n\n .dc-data-row {\n padding: 6px 8px;\n border-bottom: 1px solid var(--dc-border);\n font-size: 11px;\n }\n\n .dc-data-key { color: #ffd700; font-weight: 600; }\n .dc-data-val { color: var(--dc-blue); margin-top: 3px; word-break: break-all; }\n\n .dc-kv-row {\n display: flex;\n gap: 8px;\n align-items: baseline;\n padding: 6px 0;\n border-bottom: 1px solid var(--dc-border);\n font-size: 11px;\n }\n\n .dc-kv-key { color: #ffd700; font-weight: 600; min-width: 100px; word-break: break-all; }\n .dc-kv-val { color: var(--dc-blue); flex: 1; word-break: break-all; }\n\n .dc-empty {\n padding: 24px;\n text-align: center;\n color: var(--dc-text2);\n font-size: 12px;\n }\n\n /* ── DOM TAB ──────────────────────────────────── */\n .dc-dom-toolbar {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-dom-btn {\n padding: 5px 12px;\n border: 1px solid var(--dc-border);\n border-radius: 100px;\n background: none;\n color: var(--dc-text2);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .dc-dom-btn:hover { border-color: var(--dc-accent); color: var(--dc-accent); }\n .dc-dom-btn.picking { background: var(--dc-accent2); border-color: var(--dc-accent2); color: #fff; }\n\n .dc-tree { font-size: 12px; }\n\n .dc-node-label {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 4px;\n border-radius: 4px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n transition: background 0.1s;\n }\n\n .dc-node-label:hover { background: var(--dc-bg3); }\n\n .dc-arrow { color: var(--dc-text2); width: 12px; flex-shrink: 0; font-size: 9px; }\n .dc-tag { color: var(--dc-accent2); font-weight: 600; }\n .dc-id { color: var(--dc-blue); }\n .dc-cls { color: var(--dc-orange); }\n .dc-txt-preview { color: var(--dc-text2); font-size: 10px; max-width: 150px; overflow: hidden; text-overflow: ellipsis; }\n\n .dc-children { margin-left: 16px; display: none; }\n .dc-children.open { display: block; }\n\n .dc-node-detail {\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n padding: 12px;\n margin: 8px 0;\n font-size: 11px;\n }\n\n .dc-attr-row { padding: 3px 0; }\n .dc-attr-name { color: var(--dc-blue); }\n .dc-attr-val { color: var(--dc-green); }\n\n /* ── SYSTEM TAB ───────────────────────────────── */\n .dc-sys-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n padding: 10px 12px;\n }\n\n .dc-sys-card {\n background: var(--dc-bg2);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n padding: 12px 14px;\n }\n\n .dc-sys-label {\n color: var(--dc-text2);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 5px;\n }\n\n .dc-sys-val {\n color: var(--dc-text0);\n font-size: 11px;\n line-height: 1.4;\n }\n\n .dc-sys-full { grid-column: 1 / -1; }\n\n /* ── SETTINGS TAB ─────────────────────────────── */\n .dc-settings-body { padding: 10px 12px; }\n\n .dc-setting-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 0;\n border-bottom: 1px solid var(--dc-border);\n }\n\n .dc-setting-row:last-child { border-bottom: none; }\n\n .dc-setting-info { flex: 1; }\n .dc-setting-name { color: var(--dc-text0); font-size: 12px; font-weight: 600; }\n .dc-setting-desc { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n flex-shrink: 0;\n }\n\n .dc-toggle input { opacity: 0; width: 0; height: 0; }\n\n .dc-toggle-track {\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: var(--dc-border);\n border-radius: 11px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track { background: var(--dc-accent); }\n\n .dc-toggle-track::after {\n content: '';\n position: absolute;\n width: 16px;\n height: 16px;\n background: white;\n border-radius: 50%;\n top: 3px; left: 3px;\n transition: transform 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track::after { transform: translateX(18px); }\n\n .dc-select {\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n color: var(--dc-text0);\n font-size: 12px;\n padding: 6px 10px;\n outline: none;\n }\n\n /* ── PICK highlight ───────────────────────────── */\n .dc-pick-highlight {\n outline: 2px dashed var(--dc-accent2) !important;\n outline-offset: 2px;\n background: rgba(247,104,164,0.08) !important;\n }\n `;\n\n const style = document.createElement('style');\n style.textContent = css;\n document.head.appendChild(style);\n\n // ═══════════════════════════════════════════════════════════════\n // 2. INJECT HTML\n // ═══════════════════════════════════════════════════════════════\n const html = `\n <button id=\"dc-fab\" title=\"DevConsole\">\n <span id=\"dc-fab-icon\">⌥</span>\n <span class=\"dc-fab-badge\" id=\"dc-error-badge\">0</span>\n </button>\n\n <div id=\"dc-panel\">\n <div id=\"dc-drag\"></div>\n <div id=\"dc-header\">\n <span id=\"dc-title\">DevConsole</span>\n <span class=\"dc-pulse\"></span>\n <button class=\"dc-hbtn\" id=\"dc-clear-btn\" title=\"Clear active tab\">🗑</button>\n <button class=\"dc-hbtn\" id=\"dc-copy-btn\" title=\"Copy logs to clipboard\">📋</button>\n <button class=\"dc-hbtn\" id=\"dc-minimize-btn\" title=\"Minimize\">−</button>\n </div>\n\n <div id=\"dc-tabs\">\n <button class=\"dc-tab active\" data-tab=\"console\">Console<span class=\"dc-tab-count\" id=\"cnt-console\" style=\"display:none\"></span></button>\n <button class=\"dc-tab\" data-tab=\"network\">Network<span class=\"dc-tab-count\" id=\"cnt-network\" style=\"display:none\"></span></button>\n <button class=\"dc-tab\" data-tab=\"storage\">Storage</button>\n <button class=\"dc-tab\" data-tab=\"dom\">DOM</button>\n <button class=\"dc-tab\" data-tab=\"system\">System</button>\n <button class=\"dc-tab\" data-tab=\"settings\">⚙</button>\n </div>\n\n <div class=\"dc-panel-content active\" id=\"panel-console\">\n <div class=\"dc-scroll\" id=\"console-output\"></div>\n <div class=\"dc-repl\">\n <input class=\"dc-input\" id=\"repl-input\" placeholder=\"▶ execute javascript…\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\">\n <button class=\"dc-run-btn\" id=\"repl-run\">RUN</button>\n </div>\n </div>\n\n <div class=\"dc-panel-content\" id=\"panel-network\">\n <div class=\"dc-net-filter\">\n <input class=\"dc-filter-input\" id=\"net-filter\" placeholder=\"Filter by URL or method…\">\n <button class=\"dc-clear-btn\" id=\"net-clear\">Clear</button>\n </div>\n <div class=\"dc-scroll\" id=\"network-output\"></div>\n </div>\n\n <div class=\"dc-panel-content\" id=\"panel-storage\">\n <div class=\"dc-storage-nav\">\n <button class=\"dc-st-btn active\" data-storage=\"indexeddb\">IndexedDB</button>\n <button class=\"dc-st-btn\" data-storage=\"localstorage\">LocalStorage</button>\n <button class=\"dc-st-btn\" data-storage=\"sessionstorage\">SessionStorage</button>\n </div>\n <div class=\"dc-storage-actions\">\n <button class=\"dc-clear-btn\" id=\"storage-refresh\">↺ Refresh</button>\n </div>\n <div class=\"dc-scroll\" id=\"storage-output\"></div>\n </div>\n\n <div class=\"dc-panel-content\" id=\"panel-dom\">\n <div class=\"dc-dom-toolbar\">\n <button class=\"dc-dom-btn\" id=\"dom-refresh-btn\">↺ Refresh tree</button>\n <button class=\"dc-dom-btn\" id=\"dom-pick-btn\">⊕ Pick element</button>\n <button class=\"dc-dom-btn\" id=\"dom-collapse-btn\">Collapse all</button>\n </div>\n <div class=\"dc-scroll\" id=\"dom-output\"></div>\n </div>\n\n <div class=\"dc-panel-content\" id=\"panel-system\">\n <div class=\"dc-scroll\">\n <div class=\"dc-sys-grid\" id=\"system-output\"></div>\n </div>\n </div>\n\n <div class=\"dc-panel-content\" id=\"panel-settings\">\n <div class=\"dc-scroll dc-settings-body\" id=\"settings-output\"></div>\n </div>\n </div>\n `;\n \n document.body.insertAdjacentHTML('beforeend', html);\n\n // ═══════════════════════════════════════════════════════════════\n // 3. LOGIC\n // ═══════════════════════════════════════════════════════════════\n \n const S = {\n logs: [],\n network: [],\n dbs: [],\n activeTab: 'console',\n activeStorage: 'indexeddb',\n isPicking: false,\n replHistory: [],\n replHistoryIdx: -1,\n errorCount: 0,\n settings: {\n timestamps: true,\n autoScroll: true,\n maxEntries: 500,\n fontSize: 12,\n monitorNetwork: true,\n captureErrors: true,\n theme: 'dark',\n }\n };\n\n function saveSettings() {\n try { localStorage.setItem('__dc_settings', JSON.stringify(S.settings)); } catch(e) {}\n }\n\n function loadSettings() {\n try {\n const saved = localStorage.getItem('__dc_settings');\n if (saved) S.settings = { ...S.settings, ...JSON.parse(saved) };\n } catch(e) {}\n }\n loadSettings();\n\n const el = {\n fab: () => document.getElementById('dc-fab'),\n panel: () => document.getElementById('dc-panel'),\n consOut: () => document.getElementById('console-output'),\n netOut: () => document.getElementById('network-output'),\n storOut: () => document.getElementById('storage-output'),\n domOut: () => document.getElementById('dom-output'),\n sysOut: () => document.getElementById('system-output'),\n settOut: () => document.getElementById('settings-output'),\n replIn: () => document.getElementById('repl-input'),\n netFlt: () => document.getElementById('net-filter'),\n badge: () => document.getElementById('dc-error-badge'),\n cntC: () => document.getElementById('cnt-console'),\n cntN: () => document.getElementById('cnt-network'),\n };\n\n function ts() {\n const d = new Date();\n return `${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}:${String(d.getSeconds()).padStart(2,'0')}.${String(d.getMilliseconds()).padStart(3,'0')}`;\n }\n\n function escHtml(s) {\n return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');\n }\n\n function formatArg(a) {\n if (a === null) return '<span style=\"color:#aaa\">null</span>';\n if (a === undefined) return '<span style=\"color:#aaa\">undefined</span>';\n if (typeof a === 'object') {\n try {\n const s = JSON.stringify(a, null, 2);\n return `<pre>${escHtml(s)}</pre>`;\n } catch(e) { return String(a); }\n }\n return escHtml(String(a));\n }\n\n function truncUrl(url, max=55) {\n if (!url || url.length <= max) return url;\n try {\n const u = new URL(url);\n const tail = u.pathname.split('/').pop() || '';\n return `${u.hostname}/…/${tail}`;\n } catch(e) {\n return url.slice(0,max)+'…';\n }\n }\n\n function statusClass(code) {\n if (!code) return '';\n if (code < 300) return 's-ok';\n if (code < 400) return 's-redir';\n return 's-err';\n }\n\n function methodClass(m) {\n return `m-${['GET','POST','PUT','DELETE','PATCH'].includes(m) ? m : 'UNK'}`;\n }\n\n // ══ CONSOLE INTERCEPT ═════════════════════════════════════════════\n const _orig = {};\n ['log','warn','error','info'].forEach(level => {\n _orig[level] = console[level].bind(console);\n console[level] = (...args) => {\n _orig[level](...args);\n addLog(level, args);\n };\n });\n\n function addLog(type, args) {\n if (type === 'error') {\n S.errorCount++;\n const b = el.badge();\n if (b) { b.textContent = S.errorCount > 99 ? '99+' : S.errorCount; b.style.display = 'flex'; }\n }\n S.logs.push({ type, args, ts: ts() });\n if (S.logs.length > S.settings.maxEntries) S.logs.shift();\n updateTabCount('console', S.logs.length);\n if (S.activeTab === 'console') renderConsole();\n }\n\n function renderConsole() {\n const o = el.consOut(); if (!o) return;\n const frag = document.createDocumentFragment();\n S.logs.forEach(log => {\n const d = document.createElement('div');\n d.className = `dc-entry dc-entry-${log.type}`;\n const tsHtml = S.settings.timestamps ? `<span class=\"dc-ts\">${log.ts}</span>` : '';\n const msgHtml = log.args.map(formatArg).join(' ');\n d.innerHTML = `${tsHtml}<span>${msgHtml}</span>`;\n d.style.fontSize = S.settings.fontSize + 'px';\n frag.appendChild(d);\n });\n o.innerHTML = '';\n o.appendChild(frag);\n if (S.settings.autoScroll) o.scrollTop = o.scrollHeight;\n }\n\n // ══ ERROR CAPTURE ═════════════════════════════════════════════════\n if (S.settings.captureErrors) {\n window.onerror = (msg, src, line, col) => {\n addLog('error', [`${msg} @ ${src}:${line}:${col}`]);\n return false;\n };\n window.addEventListener('unhandledrejection', e => {\n addLog('error', [`Unhandled Promise Rejection: ${e.reason}`]);\n });\n }\n\n // ══ NETWORK INTERCEPT ═════════════════════════════════════════════\n const _origFetch = window.fetch;\n window.fetch = async (...args) => {\n const startTime = Date.now();\n let method = 'GET';\n let url = args[0] instanceof Request ? args[0].url : String(args[0]);\n if (args[1] && args[1].method) method = args[1].method.toUpperCase();\n if (args[0] instanceof Request) method = args[0].method.toUpperCase();\n const req = { method, url, ts: ts(), startTime, status: null, duration: null, headers: {}, error: null };\n\n try {\n const res = await _origFetch(...args);\n req.status = res.status;\n req.statusText = res.statusText;\n req.duration = Date.now() - startTime;\n try { res.headers.forEach((v,k) => { req.headers[k] = v; }); } catch(e) {}\n addNetReq(req);\n return res;\n } catch(e) {\n req.error = e.message;\n req.duration = Date.now() - startTime;\n addNetReq(req);\n throw e;\n }\n };\n\n const _origOpen = XMLHttpRequest.prototype.open;\n const _origSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function(method, url) {\n this.__dcReq = { method: method.toUpperCase(), url: String(url), ts: ts(), startTime: 0 };\n return _origOpen.apply(this, arguments);\n };\n\n XMLHttpRequest.prototype.send = function(body) {\n if (this.__dcReq) {\n const req = this.__dcReq;\n req.startTime = Date.now();\n this.addEventListener('loadend', () => {\n req.status = this.status;\n req.statusText = this.statusText;\n req.duration = Date.now() - req.startTime;\n req.headers = {};\n const raw = this.getAllResponseHeaders();\n if (raw) raw.split('\\r\\n').filter(Boolean).forEach(line => {\n const i = line.indexOf(': ');\n if (i > 0) req.headers[line.slice(0,i)] = line.slice(i+2);\n });\n req.error = this.status === 0 ? 'Request failed' : null;\n addNetReq(req);\n });\n }\n return _origSend.apply(this, arguments);\n };\n\n function addNetReq(req) {\n S.network.unshift(req);\n if (S.network.length > S.settings.maxEntries) S.network.pop();\n updateTabCount('network', S.network.length);\n if (S.activeTab === 'network') renderNetwork();\n }\n\n function renderNetwork(filter) {\n const o = el.netOut(); if (!o) return;\n filter = filter !== undefined ? filter : (el.netFlt() ? el.netFlt().value : '');\n const filtered = filter\n ? S.network.filter(r => r.url.toLowerCase().includes(filter.toLowerCase()) || r.method.toLowerCase().includes(filter.toLowerCase()))\n : S.network;\n\n o.innerHTML = filtered.map((req, i) => {\n const sc = req.error ? 's-err' : statusClass(req.status);\n const mc = methodClass(req.method);\n const statusLabel = req.status ? `<span class=\"dc-req-status ${sc}\">${req.status}</span>` : (req.error ? `<span class=\"dc-req-status s-err\">ERR</span>` : '<span class=\"dc-req-status\" style=\"color:var(--dc-text2)\">…</span>');\n const durLabel = req.duration != null ? `${req.duration}ms · ` : '';\n const headersHtml = Object.keys(req.headers).length\n ? Object.entries(req.headers).map(([k,v]) => `<div class=\"dc-detail-row\"><span class=\"dc-detail-key\">${escHtml(k)}: </span>${escHtml(v)}</div>`).join('')\n : '<div class=\"dc-detail-row\" style=\"color:var(--dc-text2)\">none</div>';\n return `<div class=\"dc-req\" id=\"req-${i}\" onclick=\"window.__dcToggleReq(${i})\">\n <div class=\"dc-req-top\">\n <span class=\"dc-method ${mc}\">${req.method}</span>\n <span class=\"dc-req-url\" title=\"${escHtml(req.url)}\">${escHtml(truncUrl(req.url))}</span>\n ${statusLabel}\n </div>\n <div class=\"dc-req-meta\">${durLabel}${req.ts}${req.error ? ' · ' + escHtml(req.error) : ''}</div>\n <div class=\"dc-req-detail\" id=\"req-detail-${i}\">\n <div class=\"dc-detail-section\">\n <div class=\"dc-detail-title\">General</div>\n <div class=\"dc-detail-row\"><span class=\"dc-detail-key\">URL: </span>${escHtml(req.url)}</div>\n <div class=\"dc-detail-row\"><span class=\"dc-detail-key\">Method: </span>${req.method}</div>\n <div class=\"dc-detail-row\"><span class=\"dc-detail-key\">Status: </span>${req.status || req.error || '–'} ${req.statusText || ''}</div>\n <div class=\"dc-detail-row\"><span class=\"dc-detail-key\">Duration: </span>${req.duration != null ? req.duration+'ms' : '–'}</div>\n </div>\n <div class=\"dc-detail-section\">\n <div class=\"dc-detail-title\">Response Headers</div>\n ${headersHtml}\n </div>\n </div>\n </div>`;\n\n }).join('') || '<div class=\"dc-empty\">No requests captured yet</div>';\n }\n\n window.__dcToggleReq = function(i) {\n const detail = document.getElementById(`req-detail-${i}`);\n const card = document.getElementById(`req-${i}`);\n if (!detail) return;\n const isOpen = detail.classList.contains('open');\n detail.classList.toggle('open', !isOpen);\n card.classList.toggle('expanded', !isOpen);\n };\n\n // ══ STORAGE ═══════════════════════════════════════════════════════\n async function loadStorage() {\n S.dbs = [];\n if (!window.indexedDB) return;\n try {\n if (indexedDB.databases) {\n const list = await indexedDB.databases();\n for (const d of list) {\n try { await inspectDb(d.name, d.version); } catch(e) {}\n }\n }\n } catch(e) {}\n renderStorage();\n }\n\n function inspectDb(name, version) {\n return new Promise((res, rej) => {\n const req = indexedDB.open(name, version);\n req.onerror = () => rej(req.error);\n req.onsuccess = () => {\n const db = req.result;\n const info = { name: db.name, version: db.version, stores: [] };\n const storeNames = [...db.objectStoreNames];\n let pending = storeNames.length;\n if (!pending) { db.close(); S.dbs.push(info); return res(info); }\n\n storeNames.forEach(storeName => {\n inspectStore(db, storeName).then(storeInfo => {\n info.stores.push(storeInfo);\n if (--pending === 0) { db.close(); S.dbs.push(info); res(info); }\n }).catch(() => {\n info.stores.push({ name: storeName, count: 0, keyPath: null, data: [] });\n if (--pending === 0) { db.close(); S.dbs.push(info); res(info); }\n });\n });\n };\n });\n }\n\n function inspectStore(db, storeName) {\n return new Promise((res, rej) => {\n const tx = db.transaction([storeName], 'readonly');\n const store = tx.objectStore(storeName);\n const cntReq = store.count();\n cntReq.onsuccess = () => {\n const info = { name: storeName, count: cntReq.result, keyPath: store.keyPath, data: [] };\n const getReq = store.getAll(undefined, 20);\n getReq.onsuccess = () => { info.data = getReq.result; res(info); };\n getReq.onerror = () => res(info);\n };\n cntReq.onerror = () => res({ name: storeName, count: 0, keyPath: null, data: [] });\n });\n }\n\n function renderStorage() {\n const o = el.storOut(); if (!o) return;\n switch (S.activeStorage) {\n case 'indexeddb': renderIDB(o); break;\n case 'localstorage': renderKV(o, localStorage, 'localStorage'); break;\n case 'sessionstorage': renderKV(o, sessionStorage, 'sessionStorage'); break;\n }\n }\n\n function renderIDB(o) {\n if (!S.dbs.length) { o.innerHTML = '<div class=\"dc-empty\">No IndexedDB databases found</div>'; return; }\n o.innerHTML = S.dbs.map((db, di) => `<div class=\"dc-db-card\" id=\"db-card-${di}\">\n <div class=\"dc-db-header\" onclick=\"window.__dcToggleDb(${di})\">\n <div>\n <div class=\"dc-db-name\">${escHtml(db.name)}</div>\n <div class=\"dc-db-meta\">v${db.version} · ${db.stores.length} store${db.stores.length !== 1 ? 's' : ''}</div>\n </div>\n <span style=\"color:var(--dc-text2);font-size:11px\">▼</span>\n </div>\n <div class=\"dc-db-body\">\n ${db.stores.map((st, si) => `\n <div class=\"dc-store-item\" onclick=\"window.__dcToggleStore(${di},${si})\">\n <div class=\"dc-store-name\">${escHtml(st.name)}</div>\n <div class=\"dc-store-meta\">${st.count} records · keyPath: ${st.keyPath || 'none'}</div>\n <div class=\"dc-data-viewer\" id=\"store-${di}-${si}\">\n ${st.data.length ? st.data.slice(0,20).map(item => `\n <div class=\"dc-data-row\">\n <div class=\"dc-data-key\">· ${escHtml(getKey(item, st.keyPath))}</div>\n <div class=\"dc-data-val\">${escHtml(fmtVal(item))}</div>\n </div>`).join('') : '<div style=\"color:var(--dc-text2);font-size:11px;padding:8px\">Empty store</div>'}\n </div>\n </div>`).join('')}\n </div>\n </div>`).join('');\n }\n\n function getKey(obj, keyPath) {\n if (!keyPath) return '—';\n return typeof keyPath === 'string' ? String(obj[keyPath] ?? '—') : JSON.stringify(keyPath);\n }\n\n function fmtVal(v) {\n if (typeof v === 'object' && v !== null) {\n const s = JSON.stringify(v, null, 2);\n return s.length > 300 ? s.slice(0, 300) + '…' : s;\n }\n const s = String(v);\n return s.length > 200 ? s.slice(0,200)+'…' : s;\n }\n\n function renderKV(o, storage, name) {\n const items = [];\n for (let i = 0; i < storage.length; i++) {\n const k = storage.key(i);\n items.push({ k, v: storage.getItem(k) });\n }\n if (!items.length) { o.innerHTML = `<div class=\"dc-empty\">No ${name} items</div>`; return; }\n o.innerHTML = `<div style=\"padding:4px 0\">` + items.map(({k,v}) => `\n <div class=\"dc-kv-row\">\n <span class=\"dc-kv-key\">${escHtml(k)}</span>\n <span class=\"dc-kv-val\">${escHtml(fmtVal(v))}</span>\n </div>`).join('') + `</div>`;\n }\n\n window.__dcToggleDb = function(di) {\n const card = document.getElementById(`db-card-${di}`);\n if (card) card.classList.toggle('open');\n };\n\n window.__dcToggleStore = function(di, si) {\n const viewer = document.getElementById(`store-${di}-${si}`);\n if (viewer) viewer.classList.toggle('open');\n };\n\n // ══ DOM TREE ══════════════════════════════════════════════════════\n function renderDomTree() {\n const o = el.domOut(); if (!o) return;\n o.innerHTML = '';\n const tree = document.createElement('div');\n tree.className = 'dc-tree';\n tree.appendChild(buildNode(document.body));\n o.appendChild(tree);\n }\n\n function buildNode(nodeEl) {\n const wrap = document.createElement('div');\n const children = [...nodeEl.children];\n const hasChildren = children.length > 0;\n\n const label = document.createElement('div');\n label.className = 'dc-node-label';\n\n const arrow = document.createElement('span');\n arrow.className = 'dc-arrow';\n arrow.textContent = hasChildren ? '▶' : ' ';\n label.appendChild(arrow);\n\n const tag = document.createElement('span');\n tag.className = 'dc-tag';\n tag.textContent = `<${nodeEl.tagName.toLowerCase()}`;\n label.appendChild(tag);\n\n if (nodeEl.id) {\n const id = document.createElement('span');\n id.className = 'dc-id';\n id.textContent = ` #${nodeEl.id}`;\n label.appendChild(id);\n }\n\n if (nodeEl.className && typeof nodeEl.className === 'string' && nodeEl.className.trim()) {\n const cls = document.createElement('span');\n cls.className = 'dc-cls';\n const clsStr = nodeEl.className.trim().split(/\\s+/).slice(0,3).map(c => `.${c}`).join('');\n cls.textContent = clsStr;\n label.appendChild(cls);\n }\n\n const close = document.createElement('span');\n close.className = 'dc-tag';\n close.textContent = '>';\n label.appendChild(close);\n\n const txtContent = nodeEl.childNodes.length ? ([...nodeEl.childNodes].find(n => n.nodeType === 3 && n.textContent.trim())) : null;\n if (txtContent) {\n const preview = document.createElement('span');\n preview.className = 'dc-txt-preview';\n preview.textContent = ' ' + txtContent.textContent.trim().slice(0,30);\n label.appendChild(preview);\n }\n\n label.addEventListener('click', (e) => {\n e.stopPropagation();\n if (hasChildren) {\n const childDiv = wrap.querySelector(':scope > .dc-children');\n const isOpen = childDiv && childDiv.classList.contains('open');\n if (childDiv) childDiv.classList.toggle('open', !isOpen);\n arrow.textContent = (!isOpen) ? '▼' : '▶';\n }\n showNodeDetail(nodeEl);\n });\n\n wrap.appendChild(label);\n\n if (hasChildren) {\n const childDiv = document.createElement('div');\n childDiv.className = 'dc-children';\n children.forEach(child => childDiv.appendChild(buildNode(child)));\n wrap.appendChild(childDiv);\n }\n\n return wrap;\n }\n\n function showNodeDetail(targetEl) {\n const existing = document.getElementById('dc-node-detail');\n if (existing) existing.remove();\n\n const d = document.createElement('div');\n d.className = 'dc-node-detail';\n d.id = 'dc-node-detail';\n\n const tag = `<${targetEl.tagName.toLowerCase()}>`;\n const attrs = [...targetEl.attributes];\n const styles = window.getComputedStyle(targetEl);\n\n d.innerHTML = `<div style=\"color:var(--dc-accent2);font-size:12px;font-weight:700;margin-bottom:8px\">${escHtml(tag)}</div>\n ${attrs.length ? `<div class=\"dc-detail-title\">Attributes</div>${attrs.map(a => `<div class=\"dc-attr-row\"><span class=\"dc-attr-name\">${escHtml(a.name)}</span>=<span class=\"dc-attr-val\">\"${escHtml(a.value)}\"</span></div>`).join('')}` : ''}\n <div class=\"dc-detail-title\" style=\"margin-top:8px\">Geometry</div>\n <div class=\"dc-attr-row\"><span class=\"dc-attr-name\">size: </span><span class=\"dc-attr-val\">${Math.round(targetEl.offsetWidth)}×${Math.round(targetEl.offsetHeight)}</span></div>\n <div class=\"dc-attr-row\"><span class=\"dc-attr-name\">display: </span><span class=\"dc-attr-val\">${styles.display}</span></div>\n <div class=\"dc-attr-row\"><span class=\"dc-attr-name\">position: </span><span class=\"dc-attr-val\">${styles.position}</span></div>`;\n \n el.domOut().prepend(d);\n }\n\n let _pickHandler = null;\n let _pickedEl = null;\n\n function startPicking() {\n S.isPicking = true;\n document.getElementById('dom-pick-btn').classList.add('picking');\n\n _pickHandler = (e) => {\n if (e.target.closest('#dc-panel') || e.target.closest('#dc-fab')) return;\n e.preventDefault(); e.stopPropagation();\n if (_pickedEl) _pickedEl.classList.remove('dc-pick-highlight');\n _pickedEl = e.target;\n _pickedEl.classList.add('dc-pick-highlight');\n showNodeDetail(_pickedEl);\n stopPicking();\n };\n\n document.addEventListener('click', _pickHandler, true);\n document.addEventListener('mouseover', (e) => {\n if (!S.isPicking) return;\n if (e.target.closest('#dc-panel') || e.target.closest('#dc-fab')) return;\n if (_pickedEl) _pickedEl.classList.remove('dc-pick-highlight');\n _pickedEl = e.target;\n _pickedEl.classList.add('dc-pick-highlight');\n }, true);\n }\n\n function stopPicking() {\n S.isPicking = false;\n const btn = document.getElementById('dom-pick-btn');\n if (btn) btn.classList.remove('picking');\n if (_pickHandler) { document.removeEventListener('click', _pickHandler, true); _pickHandler = null; }\n }\n\n // ══ SYSTEM INFO ═══════════════════════════════════════════════════\n function renderSystem() {\n const o = el.sysOut(); if (!o) return;\n const nav = navigator;\n const perf = window.performance;\n const mem = perf && perf.memory;\n const conn = nav.connection || nav.mozConnection || nav.webkitConnection;\n\n const cards = [\n ['Screen', `${screen.width}×${screen.height} (devicePR: ${window.devicePixelRatio})`],\n ['Viewport', `${window.innerWidth}×${window.innerHeight}`],\n ['Platform', nav.platform || '—'],\n ['Language', nav.language || '—'],\n ['Online', nav.onLine ? '✅ Online' : '❌ Offline'],\n ['Cookies', nav.cookieEnabled ? 'Enabled' : 'Disabled'],\n ['HW Concurrency', nav.hardwareConcurrency || '—'],\n ];\n\n if (conn) {\n cards.push(['Connection', `${conn.effectiveType || '—'} · ${conn.downlink || '—'} Mbps`]);\n cards.push(['RTT', conn.rtt != null ? `${conn.rtt}ms` : '—']);\n }\n\n if (mem) {\n const mb = v => (v / 1048576).toFixed(1) + ' MB';\n cards.push(['Heap Used', mb(mem.usedJSHeapSize)]);\n cards.push(['Heap Limit', mb(mem.jsHeapSizeLimit)]);\n }\n\n if (perf) {\n const nav2 = perf.getEntriesByType && perf.getEntriesByType('navigation')[0];\n if (nav2) {\n cards.push(['Page Load', `${Math.round(nav2.loadEventEnd)}ms`]);\n cards.push(['DOM Ready', `${Math.round(nav2.domContentLoadedEventEnd)}ms`]);\n }\n }\n\n o.innerHTML = cards.map(([label, val]) =>\n `<div class=\"dc-sys-card\"><div class=\"dc-sys-label\">${label}</div><div class=\"dc-sys-val\">${escHtml(String(val))}</div></div>`\n ).join('') +\n `<div class=\"dc-sys-card dc-sys-full\"><div class=\"dc-sys-label\">User Agent</div><div class=\"dc-sys-val\" style=\"word-break:break-all;font-size:10px\">${escHtml(nav.userAgent)}</div></div>`;\n }\n\n // ══ SETTINGS RENDER ═══════════════════════════════════════════════\n function renderSettings() {\n const o = el.settOut(); if (!o) return;\n o.innerHTML = `\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">Timestamps</div>\n <div class=\"dc-setting-desc\">Show time prefix on each log entry</div>\n </div>\n <label class=\"dc-toggle\"><input type=\"checkbox\" id=\"s-ts\" ${S.settings.timestamps ? 'checked' : ''}><span class=\"dc-toggle-track\"></span></label>\n </div>\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">Auto-scroll</div>\n <div class=\"dc-setting-desc\">Scroll to latest entry automatically</div>\n </div>\n <label class=\"dc-toggle\"><input type=\"checkbox\" id=\"s-as\" ${S.settings.autoScroll ? 'checked' : ''}><span class=\"dc-toggle-track\"></span></label>\n </div>\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">Capture Global Errors</div>\n <div class=\"dc-setting-desc\">window.onerror + unhandledrejection</div>\n </div>\n <label class=\"dc-toggle\"><input type=\"checkbox\" id=\"s-ce\" ${S.settings.captureErrors ? 'checked' : ''}><span class=\"dc-toggle-track\"></span></label>\n </div>\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">Monitor Network</div>\n <div class=\"dc-setting-desc\">Intercept fetch + XHR requests</div>\n </div>\n <label class=\"dc-toggle\"><input type=\"checkbox\" id=\"s-mn\" ${S.settings.monitorNetwork ? 'checked' : ''}><span class=\"dc-toggle-track\"></span></label>\n </div>\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">Font Size</div>\n <div class=\"dc-setting-desc\">Console output font size (px)</div>\n </div>\n <select class=\"dc-select\" id=\"s-fs\">\n ${[10,11,12,13,14].map(s => `<option value=\"${s}\" ${S.settings.fontSize===s?'selected':''}>${s}px</option>`).join('')}\n </select>\n </div>\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">Max Log Entries</div>\n <div class=\"dc-setting-desc\">Older entries are discarded</div>\n </div>\n <select class=\"dc-select\" id=\"s-me\">\n ${[100,250,500,1000,2000].map(s => `<option value=\"${s}\" ${S.settings.maxEntries===s?'selected':''}>${s}</option>`).join('')}\n </select>\n </div>\n <div class=\"dc-setting-row\" style=\"border:none\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\" style=\"color:var(--dc-red)\">Clear All Data</div>\n <div class=\"dc-setting-desc\">Wipe logs and network history</div>\n </div>\n <button class=\"dc-clear-btn\" onclick=\"window.__dcClearAll()\">Clear</button>\n </div>`;\n\n document.getElementById('s-ts').onchange = e => { S.settings.timestamps = e.target.checked; saveSettings(); renderConsole(); };\n document.getElementById('s-as').onchange = e => { S.settings.autoScroll = e.target.checked; saveSettings(); };\n document.getElementById('s-ce').onchange = e => { S.settings.captureErrors = e.target.checked; saveSettings(); };\n document.getElementById('s-mn').onchange = e => { S.settings.monitorNetwork = e.target.checked; saveSettings(); };\n document.getElementById('s-fs').onchange = e => { S.settings.fontSize = parseInt(e.target.value); saveSettings(); if (S.activeTab === 'console') renderConsole(); };\n document.getElementById('s-me').onchange = e => { S.settings.maxEntries = parseInt(e.target.value); saveSettings(); };\n }\n\n window.__dcClearAll = function() {\n S.logs = []; S.network = []; S.errorCount = 0;\n const b = el.badge(); if (b) { b.style.display = 'none'; }\n updateTabCount('console', 0);\n updateTabCount('network', 0);\n if (S.activeTab === 'console') renderConsole();\n if (S.activeTab === 'network') renderNetwork();\n };\n\n // ══ TABS ══════════════════════════════════════════════════════════\n function switchTab(name) {\n S.activeTab = name;\n document.querySelectorAll('.dc-tab').forEach(b => b.classList.toggle('active', b.dataset.tab === name));\n document.querySelectorAll('.dc-panel-content').forEach(p => p.classList.toggle('active', p.id === `panel-${name}`));\n\n switch(name) {\n case 'console': renderConsole(); break;\n case 'network': renderNetwork(); break;\n case 'storage': loadStorage(); break;\n case 'dom': renderDomTree(); break;\n case 'system': renderSystem(); break;\n case 'settings': renderSettings(); break;\n }\n }\n\n function updateTabCount(tab, n) {\n const el2 = document.getElementById(`cnt-${tab}`);\n if (!el2) return;\n if (n > 0) { el2.textContent = n > 999 ? '999+' : n; el2.style.display = 'inline-flex'; }\n else el2.style.display = 'none';\n }\n\n // ══ PANEL TOGGLE ══════════════════════════════════════════════════\n let _panelOpen = false;\n\n function togglePanel() {\n _panelOpen = !_panelOpen;\n const panel = el.panel();\n if (_panelOpen) {\n panel.style.display = 'flex';\n requestAnimationFrame(() => { panel.classList.add('visible'); });\n switchTab(S.activeTab);\n } else {\n panel.classList.remove('visible');\n setTimeout(() => { panel.style.display = 'none'; }, 260);\n }\n \n if (_panelOpen) {\n el.fab().innerHTML = `✕<span class=\"dc-fab-badge\" id=\"dc-error-badge\" style=\"display:${S.errorCount>0?'flex':'none'}\">${S.errorCount}</span>`;\n } else {\n el.fab().innerHTML = `⌥<span class=\"dc-fab-badge\" id=\"dc-error-badge\" style=\"display:${S.errorCount>0?'flex':'none'}\">${S.errorCount}</span>`;\n }\n }\n\n // ══ DRAG RESIZE ═══════════════════════════════════════════════════\n (function initDrag() {\n const handle = document.getElementById('dc-drag');\n const panel = document.getElementById('dc-panel');\n let dragging = false, startY = 0, startH = 0;\n\n function onStart(e) {\n dragging = true;\n startY = e.clientY || (e.touches && e.touches[0].clientY);\n startH = panel.offsetHeight;\n document.body.style.userSelect = 'none';\n }\n function onMove(e) {\n if (!dragging) return;\n const y = e.clientY || (e.touches && e.touches[0].clientY);\n const newH = Math.max(120, Math.min(window.innerHeight * 0.85, startH + (startY - y)));\n panel.style.height = newH + 'px';\n }\n function onEnd() {\n dragging = false;\n document.body.style.userSelect = '';\n }\n\n handle.addEventListener('mousedown', onStart);\n handle.addEventListener('touchstart', onStart, { passive: true });\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n document.addEventListener('mouseup', onEnd);\n document.addEventListener('touchend', onEnd);\n })();\n\n // ══ REPL ══════════════════════════════════════════════════════════\n function initRepl() {\n const input = el.replIn();\n if (!input) return;\n\n function execute() {\n const code = input.value.trim();\n if (!code) return;\n S.replHistory.unshift(code);\n if (S.replHistory.length > 50) S.replHistory.pop();\n S.replHistoryIdx = -1;\n\n const entry = document.createElement('div');\n entry.className = 'dc-entry dc-entry-cmd';\n entry.style.fontSize = S.settings.fontSize + 'px';\n entry.innerHTML = `<span class=\"dc-ts\">${ts()}</span><span>▶ ${escHtml(code)}</span>`;\n el.consOut().appendChild(entry);\n\n try {\n const result = (0, eval)(code);\n if (result !== undefined) {\n const resEntry = document.createElement('div');\n resEntry.className = 'dc-entry dc-entry-log';\n resEntry.style.fontSize = S.settings.fontSize + 'px';\n resEntry.innerHTML = `<span class=\"dc-ts\">${ts()}</span><span>${formatArg(result)}</span>`;\n el.consOut().appendChild(resEntry);\n }\n } catch(err) {\n const errEntry = document.createElement('div');\n errEntry.className = 'dc-entry dc-entry-error';\n errEntry.style.fontSize = S.settings.fontSize + 'px';\n errEntry.innerHTML = `<span class=\"dc-ts\">${ts()}</span><span>${escHtml(err.toString())}</span>`;\n el.consOut().appendChild(errEntry);\n }\n\n input.value = '';\n if (S.settings.autoScroll) el.consOut().scrollTop = el.consOut().scrollHeight;\n switchTab('console');\n\n }\n\n input.addEventListener('keydown', e => {\n if (e.key === 'Enter') { execute(); return; }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n S.replHistoryIdx = Math.min(S.replHistoryIdx + 1, S.replHistory.length - 1);\n input.value = S.replHistory[S.replHistoryIdx] || '';\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n S.replHistoryIdx = Math.max(S.replHistoryIdx - 1, -1);\n input.value = S.replHistoryIdx >= 0 ? S.replHistory[S.replHistoryIdx] : '';\n }\n });\n\n // Run button\n const runBtn = document.getElementById('repl-run');\n if (runBtn) runBtn.addEventListener('click', execute);\n }\n\n // ══ EVENT WIRING ══════════════════════════════════════════════════\n document.getElementById('dc-fab').addEventListener('click', togglePanel);\n document.getElementById('dc-minimize-btn').addEventListener('click', togglePanel);\n\n document.querySelectorAll('.dc-tab').forEach(btn => {\n btn.addEventListener('click', () => switchTab(btn.dataset.tab));\n });\n\n document.getElementById('dc-clear-btn').addEventListener('click', () => {\n switch(S.activeTab) {\n case 'console': S.logs = []; updateTabCount('console', 0); renderConsole(); break;\n case 'network': S.network = []; updateTabCount('network', 0); renderNetwork(); break;\n default: break;\n }\n });\n\n document.getElementById('dc-copy-btn').addEventListener('click', () => {\n let text = '';\n if (S.activeTab === 'console') {\n text = S.logs.map(l => `[${l.ts}] [${l.type.toUpperCase()}] ${l.args.map(a => typeof a === 'object' ? JSON.stringify(a,null,2) : String(a)).join(' ')}`).join('\\n');\n } else if (S.activeTab === 'network') {\n text = S.network.map(r => `[${r.ts}] ${r.method} ${r.url} → ${r.status || 'ERR'} (${r.duration}ms)`).join('\\n');\n }\n if (text) {\n navigator.clipboard ? navigator.clipboard.writeText(text).catch(() => {}) : (() => {})();\n console.log('📋 Copied to clipboard');\n }\n });\n\n // Network filter\n el.netFlt().addEventListener('input', e => renderNetwork(e.target.value));\n document.getElementById('net-clear').addEventListener('click', () => { S.network = []; updateTabCount('network', 0); renderNetwork(); });\n\n // Storage sub-tabs\n document.querySelectorAll('.dc-st-btn').forEach(btn => {\n btn.addEventListener('click', () => {\n S.activeStorage = btn.dataset.storage;\n document.querySelectorAll('.dc-st-btn').forEach(b => b.classList.toggle('active', b === btn));\n renderStorage();\n });\n });\n\n document.getElementById('storage-refresh').addEventListener('click', loadStorage);\n\n // DOM toolbar\n document.getElementById('dom-refresh-btn').addEventListener('click', renderDomTree);\n document.getElementById('dom-pick-btn').addEventListener('click', () => {\n S.isPicking ? stopPicking() : startPicking();\n });\n document.getElementById('dom-collapse-btn').addEventListener('click', () => {\n document.querySelectorAll('.dc-children.open').forEach(c => c.classList.remove('open'));\n document.querySelectorAll('.dc-arrow').forEach(a => { if (a.textContent === '▼') a.textContent = '▶'; });\n });\n\n // ══ SPA / DOM CHANGE WATCHER ══════════════════════════════════════\n let _lastUrl = location.href;\n setInterval(() => {\n if (location.href !== _lastUrl) {\n _lastUrl = location.href;\n addLog('info', ['🔄 SPA navigation detected:', location.href]);\n }\n }, 1000);\n\n // ══ INIT ══════════════════════════════════════════════════════════\n initRepl();\n renderConsole();\n\n addLog('log', ['✅ DevConsole v2.0 loaded — click ⌥ to open']);\n window.insikt = {\n toggle: togglePanel,\n clear: window.__dcClearAll,\n init: () => { /* already auto-inits, guard against double-run */ },\n destroy: () => {\n const fab = el.fab(), panel = el.panel();\n if (fab) fab.remove();\n if (panel) panel.remove();\n ['log','warn','error','info'].forEach(l => { if (_orig[l]) console[l] = _orig[l]; });\n window.fetch = _origFetch;\n XMLHttpRequest.prototype.open = _origOpen;\n XMLHttpRequest.prototype.send = _origSend;\n }\n };\n\n})();\n"],"names":["s"],"mappings":"CAAC,WAAW;AAMV,QAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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"}
@@ -1,2 +1,2 @@
1
- !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).insikt={})}(this,function(e){"use strict";const o="1.0.0",i={initialized:!1,panelVisible:!1,logs:[],requests:[],errors:[],ui:{root:null}};function t(e={}){i.initialized||(i.initialized=!0,i.ui.root=document.createElement("div"),i.ui.root.id="insikt-root",document.body.appendChild(i.ui.root),function(){const e=console.log;console.log=(...o)=>{i.logs.push({type:"log",args:o,timestamp:Date.now()}),e.apply(console,o)}}(),window.addEventListener("error",e=>{i.errors.push({error:e.error,timestamp:Date.now()})}),console.log(`[INSIKT v${o}] initialized`))}function n(){i.ui.root&&(i.ui.root.remove(),i.ui.root=null),i.initialized=!1,console.log("[INSIKT] destroyed")}function s(){i.panelVisible=!i.panelVisible}function l(){i.logs=[],i.requests=[],i.errors=[]}const r={version:o,init:t,destroy:n,toggle:s,clear:l};"undefined"!=typeof window&&(window.insikt=r,window.__INSIKT_INITIALIZED__||(window.__INSIKT_INITIALIZED__=!0,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t())),e.clearLogs=l,e.default=r,e.destroyInsikt=n,e.initInsikt=t,e.toggleInsikt=s,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ !function(n){"function"==typeof define&&define.amd?define(n):n()}(function(){"use strict";!function(){const n=document.createElement("style");n.textContent="\n @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Syne:wght@400;600;700;800&display=swap');\n\n :root {\n --dc-bg0: #0d0d0f;\n --dc-bg1: #141418;\n --dc-bg2: #1c1c22;\n --dc-bg3: #242430;\n --dc-border: #2a2a38;\n --dc-accent: #7c6af7;\n --dc-accent2: #f768a4;\n --dc-green: #3dffa0;\n --dc-orange: #ffb347;\n --dc-red: #ff5c6e;\n --dc-blue: #5bcefa;\n --dc-text0: #f0f0f8;\n --dc-text1: #a8a8c0;\n --dc-text2: #606078;\n --dc-mono: 'JetBrains Mono', monospace;\n --dc-sans: 'Syne', sans-serif;\n }\n\n /* Scope resets strictly to our elements */\n #dc-panel, #dc-fab { box-sizing: border-box; }\n #dc-panel *, #dc-fab * { box-sizing: inherit; }\n\n /* ── FAB ────────────────────────────── */\n #dc-fab {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 44px;\n height: 44px;\n border-radius: 12px;\n background: var(--dc-accent);\n color: #fff;\n border: none;\n font-size: 18px;\n cursor: pointer;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 24px rgba(124,106,247,0.5);\n transition: all 0.2s ease;\n font-family: var(--dc-mono);\n padding: 0;\n margin: 0;\n }\n\n #dc-fab:hover { transform: scale(1.05); box-shadow: 0 6px 30px rgba(124,106,247,0.7); }\n #dc-fab:active { transform: scale(0.95); }\n\n .dc-fab-badge {\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 18px;\n height: 18px;\n background: var(--dc-red);\n color: #fff;\n font-size: 10px;\n font-weight: 700;\n border-radius: 9px;\n display: none;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n font-family: var(--dc-mono);\n }\n\n /* ── CONSOLE PANEL ───────────────────── */\n #dc-panel {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 320px;\n min-height: 120px;\n max-height: 85vh;\n background: var(--dc-bg1);\n border-top: 1px solid var(--dc-border);\n border-radius: 14px 14px 0 0;\n box-shadow: 0 -12px 50px rgba(0,0,0,0.6);\n display: none;\n flex-direction: column;\n z-index: 99998;\n overflow: hidden;\n font-family: var(--dc-mono);\n color: var(--dc-text0);\n }\n\n #dc-panel.visible {\n display: flex;\n animation: dcSlideUp 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes dcSlideUp {\n from { transform: translateY(100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n\n /* Drag handle */\n #dc-drag {\n width: 100%;\n height: 22px;\n background: var(--dc-bg2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ns-resize;\n border-radius: 14px 14px 0 0;\n flex-shrink: 0;\n touch-action: none;\n user-select: none;\n }\n\n #dc-drag::before {\n content: '';\n width: 36px;\n height: 4px;\n background: var(--dc-border);\n border-radius: 2px;\n transition: background 0.2s;\n }\n\n #dc-drag:hover::before { background: var(--dc-accent); }\n\n /* Header bar */\n #dc-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n #dc-title {\n font-size: 11px;\n font-weight: 700;\n color: var(--dc-accent);\n letter-spacing: 0.1em;\n text-transform: uppercase;\n flex: 1;\n }\n\n .dc-pulse {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dc-green);\n animation: dcPulse 2s infinite;\n flex-shrink: 0;\n }\n\n @keyframes dcPulse {\n 0%,100% { opacity: 1; box-shadow: 0 0 0 0 rgba(61,255,160,0.4); }\n 50% { opacity: 0.6; box-shadow: 0 0 0 5px rgba(61,255,160,0); }\n }\n\n .dc-hbtn {\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 7px;\n background: var(--dc-bg3);\n color: var(--dc-text1);\n font-size: 13px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n padding: 0;\n }\n\n .dc-hbtn:hover { background: var(--dc-border); color: var(--dc-text0); }\n\n /* Tabs */\n #dc-tabs {\n display: flex;\n background: var(--dc-bg0);\n border-bottom: 1px solid var(--dc-border);\n overflow-x: auto;\n scrollbar-width: none;\n flex-shrink: 0;\n }\n\n #dc-tabs::-webkit-scrollbar { display: none; }\n\n .dc-tab {\n padding: 10px 14px;\n background: none;\n border: none;\n color: var(--dc-text2);\n font-family: var(--dc-mono);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.05em;\n cursor: pointer;\n white-space: nowrap;\n border-bottom: 2px solid transparent;\n transition: all 0.15s;\n position: relative;\n }\n\n .dc-tab:hover { color: var(--dc-text1); }\n\n .dc-tab.active {\n color: var(--dc-accent);\n border-bottom-color: var(--dc-accent);\n }\n\n .dc-tab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n background: var(--dc-accent);\n color: #fff;\n font-size: 9px;\n font-weight: 700;\n border-radius: 8px;\n padding: 0 4px;\n margin-left: 5px;\n }\n\n /* Tab panels */\n .dc-panel-content {\n display: none;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n\n .dc-panel-content.active { display: flex; }\n\n .dc-scroll {\n flex: 1;\n overflow-y: auto;\n padding: 10px 12px;\n scrollbar-width: thin;\n scrollbar-color: var(--dc-border) transparent;\n }\n\n .dc-scroll::-webkit-scrollbar { width: 4px; }\n .dc-scroll::-webkit-scrollbar-thumb { background: var(--dc-border); border-radius: 2px; }\n\n /* ── LOG ENTRIES ──────────────────────── */\n .dc-entry {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 5px;\n margin-bottom: 3px;\n font-size: 12px;\n line-height: 1.5;\n word-break: break-word;\n animation: dcFadeIn 0.1s ease;\n }\n\n @keyframes dcFadeIn { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: none; } }\n\n .dc-entry-log { color: var(--dc-text0); }\n .dc-entry-warn { color: var(--dc-orange); background: rgba(255,179,71,0.07); border-left: 2px solid var(--dc-orange); }\n .dc-entry-error { color: var(--dc-red); background: rgba(255,92,110,0.07); border-left: 2px solid var(--dc-red); }\n .dc-entry-info { color: var(--dc-blue); background: rgba(91,206,250,0.06); border-left: 2px solid var(--dc-blue); }\n .dc-entry-cmd { color: var(--dc-accent); background: rgba(124,106,247,0.06); }\n\n .dc-ts {\n color: var(--dc-text2);\n font-size: 10px;\n font-weight: 400;\n flex-shrink: 0;\n letter-spacing: 0;\n }\n\n .dc-entry pre {\n white-space: pre-wrap;\n word-break: break-all;\n background: var(--dc-bg0);\n padding: 6px 8px;\n border-radius: 5px;\n margin-top: 4px;\n font-size: 11px;\n color: var(--dc-green);\n width: 100%;\n }\n\n /* ── REPL INPUT ───────────────────────── */\n .dc-repl {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-top: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-input {\n flex: 1;\n padding: 8px 12px;\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text0);\n font-family: var(--dc-mono);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s;\n }\n\n .dc-input:focus { border-color: var(--dc-accent); box-shadow: 0 0 0 2px rgba(124,106,247,0.15); }\n\n .dc-run-btn {\n padding: 8px 14px;\n background: var(--dc-accent);\n border: none;\n border-radius: 8px;\n color: #fff;\n font-family: var(--dc-mono);\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.15s;\n letter-spacing: 0.05em;\n }\n\n .dc-run-btn:hover { background: #8f7ffb; }\n .dc-run-btn:active { transform: scale(0.96); }\n\n /* ── NETWORK TAB ──────────────────────── */\n .dc-net-filter {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-filter-input {\n flex: 1;\n padding: 7px 10px;\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text0);\n font-family: var(--dc-mono);\n font-size: 12px;\n outline: none;\n }\n\n .dc-filter-input:focus { border-color: var(--dc-accent); }\n\n .dc-clear-btn {\n padding: 7px 12px;\n background: var(--dc-bg3);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text1);\n font-family: var(--dc-mono);\n font-size: 11px;\n cursor: pointer;\n }\n\n .dc-clear-btn:hover { border-color: var(--dc-red); color: var(--dc-red); }\n\n .dc-req {\n padding: 9px 10px;\n border-radius: 6px;\n margin-bottom: 4px;\n background: var(--dc-bg2);\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.15s;\n }\n\n .dc-req:hover { border-color: var(--dc-border); }\n .dc-req.expanded { border-color: var(--dc-accent); }\n\n .dc-req-top {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 11px;\n }\n\n .dc-method {\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.05em;\n flex-shrink: 0;\n }\n\n .m-GET { background: rgba(61,255,160,0.15); color: var(--dc-green); }\n .m-POST { background: rgba(91,206,250,0.15); color: var(--dc-blue); }\n .m-PUT { background: rgba(255,179,71,0.15); color: var(--dc-orange); }\n .m-DELETE { background: rgba(255,92,110,0.15); color: var(--dc-red); }\n .m-PATCH { background: rgba(124,106,247,0.15); color: var(--dc-accent); }\n .m-UNK { background: var(--dc-bg3); color: var(--dc-text2); }\n\n .dc-req-url {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dc-text0);\n }\n\n .dc-req-status { flex-shrink: 0; }\n .s-ok { color: var(--dc-green); }\n .s-redir { color: var(--dc-orange); }\n .s-err { color: var(--dc-red); }\n\n .dc-req-meta {\n color: var(--dc-text2);\n font-size: 10px;\n margin-top: 3px;\n }\n\n .dc-req-detail {\n display: none;\n margin-top: 8px;\n background: var(--dc-bg0);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 11px;\n color: var(--dc-text1);\n }\n\n .dc-req-detail.open { display: block; }\n\n .dc-detail-section { margin-bottom: 10px; }\n .dc-detail-title { color: var(--dc-accent); font-weight: 700; margin-bottom: 4px; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; }\n .dc-detail-row { padding: 2px 0; word-break: break-all; }\n .dc-detail-key { color: var(--dc-text2); }\n\n /* ── STORAGE TAB ──────────────────────── */\n .dc-storage-nav {\n display: flex;\n gap: 4px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-st-btn {\n padding: 5px 12px;\n border: 1px solid var(--dc-border);\n border-radius: 100px;\n background: none;\n color: var(--dc-text2);\n font-family: var(--dc-mono);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .dc-st-btn.active { background: var(--dc-accent); border-color: var(--dc-accent); color: #fff; }\n .dc-st-btn:hover:not(.active) { border-color: var(--dc-text2); color: var(--dc-text1); }\n\n .dc-storage-actions {\n display: flex;\n justify-content: flex-end;\n padding: 6px 12px;\n flex-shrink: 0;\n }\n\n .dc-db-card {\n background: var(--dc-bg2);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n margin-bottom: 8px;\n overflow: hidden;\n }\n\n .dc-db-header {\n padding: 10px 14px;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--dc-bg3);\n transition: background 0.15s;\n }\n\n .dc-db-header:hover { background: var(--dc-border); }\n\n .dc-db-name { color: var(--dc-blue); font-size: 12px; font-weight: 700; }\n .dc-db-meta { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-db-body { display: none; padding: 10px; }\n .dc-db-card.open .dc-db-body { display: block; }\n\n .dc-store-item {\n padding: 8px 10px;\n background: var(--dc-bg0);\n border-radius: 5px;\n margin-bottom: 6px;\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.15s;\n }\n\n .dc-store-item:hover { border-color: var(--dc-border); }\n .dc-store-name { color: var(--dc-text0); font-size: 12px; font-weight: 600; }\n .dc-store-meta { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-data-viewer {\n display: none;\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n }\n\n .dc-data-viewer.open { display: block; }\n\n .dc-data-row {\n padding: 6px 8px;\n border-bottom: 1px solid var(--dc-border);\n font-size: 11px;\n }\n\n .dc-data-key { color: #ffd700; font-weight: 600; }\n .dc-data-val { color: var(--dc-blue); margin-top: 3px; word-break: break-all; }\n\n .dc-kv-row {\n display: flex;\n gap: 8px;\n align-items: baseline;\n padding: 6px 0;\n border-bottom: 1px solid var(--dc-border);\n font-size: 11px;\n }\n\n .dc-kv-key { color: #ffd700; font-weight: 600; min-width: 100px; word-break: break-all; }\n .dc-kv-val { color: var(--dc-blue); flex: 1; word-break: break-all; }\n\n .dc-empty {\n padding: 24px;\n text-align: center;\n color: var(--dc-text2);\n font-size: 12px;\n }\n\n /* ── DOM TAB ──────────────────────────────────── */\n .dc-dom-toolbar {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-dom-btn {\n padding: 5px 12px;\n border: 1px solid var(--dc-border);\n border-radius: 100px;\n background: none;\n color: var(--dc-text2);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .dc-dom-btn:hover { border-color: var(--dc-accent); color: var(--dc-accent); }\n .dc-dom-btn.picking { background: var(--dc-accent2); border-color: var(--dc-accent2); color: #fff; }\n\n .dc-tree { font-size: 12px; }\n\n .dc-node-label {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 4px;\n border-radius: 4px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n transition: background 0.1s;\n }\n\n .dc-node-label:hover { background: var(--dc-bg3); }\n\n .dc-arrow { color: var(--dc-text2); width: 12px; flex-shrink: 0; font-size: 9px; }\n .dc-tag { color: var(--dc-accent2); font-weight: 600; }\n .dc-id { color: var(--dc-blue); }\n .dc-cls { color: var(--dc-orange); }\n .dc-txt-preview { color: var(--dc-text2); font-size: 10px; max-width: 150px; overflow: hidden; text-overflow: ellipsis; }\n\n .dc-children { margin-left: 16px; display: none; }\n .dc-children.open { display: block; }\n\n .dc-node-detail {\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n padding: 12px;\n margin: 8px 0;\n font-size: 11px;\n }\n\n .dc-attr-row { padding: 3px 0; }\n .dc-attr-name { color: var(--dc-blue); }\n .dc-attr-val { color: var(--dc-green); }\n\n /* ── SYSTEM TAB ───────────────────────────────── */\n .dc-sys-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n padding: 10px 12px;\n }\n\n .dc-sys-card {\n background: var(--dc-bg2);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n padding: 12px 14px;\n }\n\n .dc-sys-label {\n color: var(--dc-text2);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 5px;\n }\n\n .dc-sys-val {\n color: var(--dc-text0);\n font-size: 11px;\n line-height: 1.4;\n }\n\n .dc-sys-full { grid-column: 1 / -1; }\n\n /* ── SETTINGS TAB ─────────────────────────────── */\n .dc-settings-body { padding: 10px 12px; }\n\n .dc-setting-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 0;\n border-bottom: 1px solid var(--dc-border);\n }\n\n .dc-setting-row:last-child { border-bottom: none; }\n\n .dc-setting-info { flex: 1; }\n .dc-setting-name { color: var(--dc-text0); font-size: 12px; font-weight: 600; }\n .dc-setting-desc { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n flex-shrink: 0;\n }\n\n .dc-toggle input { opacity: 0; width: 0; height: 0; }\n\n .dc-toggle-track {\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: var(--dc-border);\n border-radius: 11px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track { background: var(--dc-accent); }\n\n .dc-toggle-track::after {\n content: '';\n position: absolute;\n width: 16px;\n height: 16px;\n background: white;\n border-radius: 50%;\n top: 3px; left: 3px;\n transition: transform 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track::after { transform: translateX(18px); }\n\n .dc-select {\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n color: var(--dc-text0);\n font-size: 12px;\n padding: 6px 10px;\n outline: none;\n }\n\n /* ── PICK highlight ───────────────────────────── */\n .dc-pick-highlight {\n outline: 2px dashed var(--dc-accent2) !important;\n outline-offset: 2px;\n background: rgba(247,104,164,0.08) !important;\n }\n ",document.head.appendChild(n);document.body.insertAdjacentHTML("beforeend",'\n <button id="dc-fab" title="DevConsole">\n <span id="dc-fab-icon">⌥</span>\n <span class="dc-fab-badge" id="dc-error-badge">0</span>\n </button>\n\n <div id="dc-panel">\n <div id="dc-drag"></div>\n <div id="dc-header">\n <span id="dc-title">DevConsole</span>\n <span class="dc-pulse"></span>\n <button class="dc-hbtn" id="dc-clear-btn" title="Clear active tab">🗑</button>\n <button class="dc-hbtn" id="dc-copy-btn" title="Copy logs to clipboard">📋</button>\n <button class="dc-hbtn" id="dc-minimize-btn" title="Minimize">−</button>\n </div>\n\n <div id="dc-tabs">\n <button class="dc-tab active" data-tab="console">Console<span class="dc-tab-count" id="cnt-console" style="display:none"></span></button>\n <button class="dc-tab" data-tab="network">Network<span class="dc-tab-count" id="cnt-network" style="display:none"></span></button>\n <button class="dc-tab" data-tab="storage">Storage</button>\n <button class="dc-tab" data-tab="dom">DOM</button>\n <button class="dc-tab" data-tab="system">System</button>\n <button class="dc-tab" data-tab="settings">⚙</button>\n </div>\n\n <div class="dc-panel-content active" id="panel-console">\n <div class="dc-scroll" id="console-output"></div>\n <div class="dc-repl">\n <input class="dc-input" id="repl-input" placeholder="▶ execute javascript…" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">\n <button class="dc-run-btn" id="repl-run">RUN</button>\n </div>\n </div>\n\n <div class="dc-panel-content" id="panel-network">\n <div class="dc-net-filter">\n <input class="dc-filter-input" id="net-filter" placeholder="Filter by URL or method…">\n <button class="dc-clear-btn" id="net-clear">Clear</button>\n </div>\n <div class="dc-scroll" id="network-output"></div>\n </div>\n\n <div class="dc-panel-content" id="panel-storage">\n <div class="dc-storage-nav">\n <button class="dc-st-btn active" data-storage="indexeddb">IndexedDB</button>\n <button class="dc-st-btn" data-storage="localstorage">LocalStorage</button>\n <button class="dc-st-btn" data-storage="sessionstorage">SessionStorage</button>\n </div>\n <div class="dc-storage-actions">\n <button class="dc-clear-btn" id="storage-refresh">↺ Refresh</button>\n </div>\n <div class="dc-scroll" id="storage-output"></div>\n </div>\n\n <div class="dc-panel-content" id="panel-dom">\n <div class="dc-dom-toolbar">\n <button class="dc-dom-btn" id="dom-refresh-btn">↺ Refresh tree</button>\n <button class="dc-dom-btn" id="dom-pick-btn">⊕ Pick element</button>\n <button class="dc-dom-btn" id="dom-collapse-btn">Collapse all</button>\n </div>\n <div class="dc-scroll" id="dom-output"></div>\n </div>\n\n <div class="dc-panel-content" id="panel-system">\n <div class="dc-scroll">\n <div class="dc-sys-grid" id="system-output"></div>\n </div>\n </div>\n\n <div class="dc-panel-content" id="panel-settings">\n <div class="dc-scroll dc-settings-body" id="settings-output"></div>\n </div>\n </div>\n ');const e={logs:[],network:[],dbs:[],activeTab:"console",activeStorage:"indexeddb",isPicking:!1,replHistory:[],replHistoryIdx:-1,errorCount:0,settings:{timestamps:!0,autoScroll:!0,maxEntries:500,fontSize:12,monitorNetwork:!0,captureErrors:!0,theme:"dark"}};function t(){try{localStorage.setItem("__dc_settings",JSON.stringify(e.settings))}catch(n){}}!function(){try{const n=localStorage.getItem("__dc_settings");n&&(e.settings={...e.settings,...JSON.parse(n)})}catch(n){}}();const o=()=>document.getElementById("dc-fab"),d=()=>document.getElementById("dc-panel"),r=()=>document.getElementById("console-output"),a=()=>document.getElementById("network-output"),c=()=>document.getElementById("storage-output"),s=()=>document.getElementById("dom-output"),i=()=>document.getElementById("system-output"),l=()=>document.getElementById("settings-output"),p=()=>document.getElementById("repl-input"),g=()=>document.getElementById("net-filter"),u=()=>document.getElementById("dc-error-badge");function b(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}:${String(n.getSeconds()).padStart(2,"0")}.${String(n.getMilliseconds()).padStart(3,"0")}`}function v(n){return String(n).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function m(n){if(null===n)return'<span style="color:#aaa">null</span>';if(void 0===n)return'<span style="color:#aaa">undefined</span>';if("object"==typeof n)try{return`<pre>${v(JSON.stringify(n,null,2))}</pre>`}catch(e){return String(n)}return v(String(n))}const f={};function x(n,t){if("error"===n){e.errorCount++;const n=u();n&&(n.textContent=e.errorCount>99?"99+":e.errorCount,n.style.display="flex")}e.logs.push({type:n,args:t,ts:b()}),e.logs.length>e.settings.maxEntries&&e.logs.shift(),R("console",e.logs.length),"console"===e.activeTab&&h()}function h(){const n=r();if(!n)return;const t=document.createDocumentFragment();e.logs.forEach(n=>{const o=document.createElement("div");o.className=`dc-entry dc-entry-${n.type}`;const d=e.settings.timestamps?`<span class="dc-ts">${n.ts}</span>`:"",r=n.args.map(m).join(" ");o.innerHTML=`${d}<span>${r}</span>`,o.style.fontSize=e.settings.fontSize+"px",t.appendChild(o)}),n.innerHTML="",n.appendChild(t),e.settings.autoScroll&&(n.scrollTop=n.scrollHeight)}["log","warn","error","info"].forEach(n=>{f[n]=console[n].bind(console),console[n]=(...e)=>{f[n](...e),x(n,e)}}),e.settings.captureErrors&&(window.onerror=(n,e,t,o)=>(x("error",[`${n} @ ${e}:${t}:${o}`]),!1),window.addEventListener("unhandledrejection",n=>{x("error",[`Unhandled Promise Rejection: ${n.reason}`])}));const y=window.fetch;window.fetch=async(...n)=>{const e=Date.now();let t="GET",o=n[0]instanceof Request?n[0].url:String(n[0]);n[1]&&n[1].method&&(t=n[1].method.toUpperCase()),n[0]instanceof Request&&(t=n[0].method.toUpperCase());const d={method:t,url:o,ts:b(),startTime:e,status:null,duration:null,headers:{},error:null};try{const t=await y(...n);d.status=t.status,d.statusText=t.statusText,d.duration=Date.now()-e;try{t.headers.forEach((n,e)=>{d.headers[e]=n})}catch(r){}return E(d),t}catch(r){throw d.error=r.message,d.duration=Date.now()-e,E(d),r}};const k=XMLHttpRequest.prototype.open,w=XMLHttpRequest.prototype.send;function E(n){e.network.unshift(n),e.network.length>e.settings.maxEntries&&e.network.pop(),R("network",e.network.length),"network"===e.activeTab&&$()}function $(n){const t=a();if(!t)return;const o=(n=void 0!==n?n:g()?g().value:"")?e.network.filter(e=>e.url.toLowerCase().includes(n.toLowerCase())||e.method.toLowerCase().includes(n.toLowerCase())):e.network;t.innerHTML=o.map((n,e)=>{const t=n.error?"s-err":(o=n.status)?o<300?"s-ok":o<400?"s-redir":"s-err":"";var o;const d=(r=n.method,`m-${["GET","POST","PUT","DELETE","PATCH"].includes(r)?r:"UNK"}`);var r;const a=n.status?`<span class="dc-req-status ${t}">${n.status}</span>`:n.error?'<span class="dc-req-status s-err">ERR</span>':'<span class="dc-req-status" style="color:var(--dc-text2)">…</span>',c=null!=n.duration?`${n.duration}ms · `:"",s=Object.keys(n.headers).length?Object.entries(n.headers).map(([n,e])=>`<div class="dc-detail-row"><span class="dc-detail-key">${v(n)}: </span>${v(e)}</div>`).join(""):'<div class="dc-detail-row" style="color:var(--dc-text2)">none</div>';return`<div class="dc-req" id="req-${e}" onclick="window.__dcToggleReq(${e})">\n <div class="dc-req-top">\n <span class="dc-method ${d}">${n.method}</span>\n <span class="dc-req-url" title="${v(n.url)}">${v(function(n,e=55){if(!n||n.length<=e)return n;try{const e=new URL(n),t=e.pathname.split("/").pop()||"";return`${e.hostname}/…/${t}`}catch(t){return n.slice(0,e)+"…"}}(n.url))}</span>\n ${a}\n </div>\n <div class="dc-req-meta">${c}${n.ts}${n.error?" · "+v(n.error):""}</div>\n <div class="dc-req-detail" id="req-detail-${e}">\n <div class="dc-detail-section">\n <div class="dc-detail-title">General</div>\n <div class="dc-detail-row"><span class="dc-detail-key">URL: </span>${v(n.url)}</div>\n <div class="dc-detail-row"><span class="dc-detail-key">Method: </span>${n.method}</div>\n <div class="dc-detail-row"><span class="dc-detail-key">Status: </span>${n.status||n.error||"–"} ${n.statusText||""}</div>\n <div class="dc-detail-row"><span class="dc-detail-key">Duration: </span>${null!=n.duration?n.duration+"ms":"–"}</div>\n </div>\n <div class="dc-detail-section">\n <div class="dc-detail-title">Response Headers</div>\n ${s}\n </div>\n </div>\n </div>`}).join("")||'<div class="dc-empty">No requests captured yet</div>'}async function S(){if(e.dbs=[],window.indexedDB){try{if(indexedDB.databases){const e=await indexedDB.databases();for(const t of e)try{await L(t.name,t.version)}catch(n){}}}catch(n){}C()}}function L(n,t){return new Promise((o,d)=>{const r=indexedDB.open(n,t);r.onerror=()=>d(r.error),r.onsuccess=()=>{const n=r.result,t={name:n.name,version:n.version,stores:[]},d=[...n.objectStoreNames];let a=d.length;if(!a)return n.close(),e.dbs.push(t),o(t);d.forEach(d=>{(function(n,e){return new Promise((t,o)=>{const d=n.transaction([e],"readonly").objectStore(e),r=d.count();r.onsuccess=()=>{const n={name:e,count:r.result,keyPath:d.keyPath,data:[]},o=d.getAll(void 0,20);o.onsuccess=()=>{n.data=o.result,t(n)},o.onerror=()=>t(n)},r.onerror=()=>t({name:e,count:0,keyPath:null,data:[]})})})(n,d).then(d=>{t.stores.push(d),0===--a&&(n.close(),e.dbs.push(t),o(t))}).catch(()=>{t.stores.push({name:d,count:0,keyPath:null,data:[]}),0===--a&&(n.close(),e.dbs.push(t),o(t))})})}})}function C(){const n=c();if(n)switch(e.activeStorage){case"indexeddb":!function(n){if(!e.dbs.length)return void(n.innerHTML='<div class="dc-empty">No IndexedDB databases found</div>');n.innerHTML=e.dbs.map((n,e)=>`<div class="dc-db-card" id="db-card-${e}">\n <div class="dc-db-header" onclick="window.__dcToggleDb(${e})">\n <div>\n <div class="dc-db-name">${v(n.name)}</div>\n <div class="dc-db-meta">v${n.version} · ${n.stores.length} store${1!==n.stores.length?"s":""}</div>\n </div>\n <span style="color:var(--dc-text2);font-size:11px">▼</span>\n </div>\n <div class="dc-db-body">\n ${n.stores.map((n,t)=>`\n <div class="dc-store-item" onclick="window.__dcToggleStore(${e},${t})">\n <div class="dc-store-name">${v(n.name)}</div>\n <div class="dc-store-meta">${n.count} records · keyPath: ${n.keyPath||"none"}</div>\n <div class="dc-data-viewer" id="store-${e}-${t}">\n ${n.data.length?n.data.slice(0,20).map(e=>{return`\n <div class="dc-data-row">\n <div class="dc-data-key">· ${v((t=e,o=n.keyPath,o?"string"==typeof o?String(t[o]??"—"):JSON.stringify(o):"—"))}</div>\n <div class="dc-data-val">${v(T(e))}</div>\n </div>`;var t,o}).join(""):'<div style="color:var(--dc-text2);font-size:11px;padding:8px">Empty store</div>'}\n </div>\n </div>`).join("")}\n </div>\n </div>`).join("")}(n);break;case"localstorage":z(n,localStorage,"localStorage");break;case"sessionstorage":z(n,sessionStorage,"sessionStorage")}}function T(n){if("object"==typeof n&&null!==n){const e=JSON.stringify(n,null,2);return e.length>300?e.slice(0,300)+"…":e}const e=String(n);return e.length>200?e.slice(0,200)+"…":e}function z(n,e,t){const o=[];for(let d=0;d<e.length;d++){const n=e.key(d);o.push({k:n,v:e.getItem(n)})}o.length?n.innerHTML='<div style="padding:4px 0">'+o.map(({k:n,v:e})=>`\n <div class="dc-kv-row">\n <span class="dc-kv-key">${v(n)}</span>\n <span class="dc-kv-val">${v(T(e))}</span>\n </div>`).join("")+"</div>":n.innerHTML=`<div class="dc-empty">No ${t} items</div>`}function I(){const n=s();if(!n)return;n.innerHTML="";const e=document.createElement("div");e.className="dc-tree",e.appendChild(H(document.body)),n.appendChild(e)}function H(n){const e=document.createElement("div"),t=[...n.children],o=t.length>0,d=document.createElement("div");d.className="dc-node-label";const r=document.createElement("span");r.className="dc-arrow",r.textContent=o?"▶":" ",d.appendChild(r);const a=document.createElement("span");if(a.className="dc-tag",a.textContent=`<${n.tagName.toLowerCase()}`,d.appendChild(a),n.id){const e=document.createElement("span");e.className="dc-id",e.textContent=` #${n.id}`,d.appendChild(e)}if(n.className&&"string"==typeof n.className&&n.className.trim()){const e=document.createElement("span");e.className="dc-cls";const t=n.className.trim().split(/\s+/).slice(0,3).map(n=>`.${n}`).join("");e.textContent=t,d.appendChild(e)}const c=document.createElement("span");c.className="dc-tag",c.textContent=">",d.appendChild(c);const s=n.childNodes.length?[...n.childNodes].find(n=>3===n.nodeType&&n.textContent.trim()):null;if(s){const n=document.createElement("span");n.className="dc-txt-preview",n.textContent=" "+s.textContent.trim().slice(0,30),d.appendChild(n)}if(d.addEventListener("click",t=>{if(t.stopPropagation(),o){const n=e.querySelector(":scope > .dc-children"),t=n&&n.classList.contains("open");n&&n.classList.toggle("open",!t),r.textContent=t?"▶":"▼"}B(n)}),e.appendChild(d),o){const n=document.createElement("div");n.className="dc-children",t.forEach(e=>n.appendChild(H(e))),e.appendChild(n)}return e}function B(n){const e=document.getElementById("dc-node-detail");e&&e.remove();const t=document.createElement("div");t.className="dc-node-detail",t.id="dc-node-detail";const o=`<${n.tagName.toLowerCase()}>`,d=[...n.attributes],r=window.getComputedStyle(n);t.innerHTML=`<div style="color:var(--dc-accent2);font-size:12px;font-weight:700;margin-bottom:8px">${v(o)}</div>\n ${d.length?`<div class="dc-detail-title">Attributes</div>${d.map(n=>`<div class="dc-attr-row"><span class="dc-attr-name">${v(n.name)}</span>=<span class="dc-attr-val">"${v(n.value)}"</span></div>`).join("")}`:""}\n <div class="dc-detail-title" style="margin-top:8px">Geometry</div>\n <div class="dc-attr-row"><span class="dc-attr-name">size: </span><span class="dc-attr-val">${Math.round(n.offsetWidth)}×${Math.round(n.offsetHeight)}</span></div>\n <div class="dc-attr-row"><span class="dc-attr-name">display: </span><span class="dc-attr-val">${r.display}</span></div>\n <div class="dc-attr-row"><span class="dc-attr-name">position: </span><span class="dc-attr-val">${r.position}</span></div>`,s().prepend(t)}XMLHttpRequest.prototype.open=function(n,e){return this.__dcReq={method:n.toUpperCase(),url:String(e),ts:b(),startTime:0},k.apply(this,arguments)},XMLHttpRequest.prototype.send=function(n){if(this.__dcReq){const n=this.__dcReq;n.startTime=Date.now(),this.addEventListener("loadend",()=>{n.status=this.status,n.statusText=this.statusText,n.duration=Date.now()-n.startTime,n.headers={};const e=this.getAllResponseHeaders();e&&e.split("\r\n").filter(Boolean).forEach(e=>{const t=e.indexOf(": ");t>0&&(n.headers[e.slice(0,t)]=e.slice(t+2))}),n.error=0===this.status?"Request failed":null,E(n)})}return w.apply(this,arguments)},window.__dcToggleReq=function(n){const e=document.getElementById(`req-detail-${n}`),t=document.getElementById(`req-${n}`);if(!e)return;const o=e.classList.contains("open");e.classList.toggle("open",!o),t.classList.toggle("expanded",!o)},window.__dcToggleDb=function(n){const e=document.getElementById(`db-card-${n}`);e&&e.classList.toggle("open")},window.__dcToggleStore=function(n,e){const t=document.getElementById(`store-${n}-${e}`);t&&t.classList.toggle("open")};let q=null,N=null;function M(){e.isPicking=!1;const n=document.getElementById("dom-pick-btn");n&&n.classList.remove("picking"),q&&(document.removeEventListener("click",q,!0),q=null)}function j(n){switch(e.activeTab=n,document.querySelectorAll(".dc-tab").forEach(e=>e.classList.toggle("active",e.dataset.tab===n)),document.querySelectorAll(".dc-panel-content").forEach(e=>e.classList.toggle("active",e.id===`panel-${n}`)),n){case"console":h();break;case"network":$();break;case"storage":S();break;case"dom":I();break;case"system":!function(){const n=i();if(!n)return;const e=navigator,t=window.performance,o=t&&t.memory,d=e.connection||e.mozConnection||e.webkitConnection,r=[["Screen",`${screen.width}×${screen.height} (devicePR: ${window.devicePixelRatio})`],["Viewport",`${window.innerWidth}×${window.innerHeight}`],["Platform",e.platform||"—"],["Language",e.language||"—"],["Online",e.onLine?"✅ Online":"❌ Offline"],["Cookies",e.cookieEnabled?"Enabled":"Disabled"],["HW Concurrency",e.hardwareConcurrency||"—"]];if(d&&(r.push(["Connection",`${d.effectiveType||"—"} · ${d.downlink||"—"} Mbps`]),r.push(["RTT",null!=d.rtt?`${d.rtt}ms`:"—"])),o){const n=n=>(n/1048576).toFixed(1)+" MB";r.push(["Heap Used",n(o.usedJSHeapSize)]),r.push(["Heap Limit",n(o.jsHeapSizeLimit)])}if(t){const n=t.getEntriesByType&&t.getEntriesByType("navigation")[0];n&&(r.push(["Page Load",`${Math.round(n.loadEventEnd)}ms`]),r.push(["DOM Ready",`${Math.round(n.domContentLoadedEventEnd)}ms`]))}n.innerHTML=r.map(([n,e])=>`<div class="dc-sys-card"><div class="dc-sys-label">${n}</div><div class="dc-sys-val">${v(String(e))}</div></div>`).join("")+`<div class="dc-sys-card dc-sys-full"><div class="dc-sys-label">User Agent</div><div class="dc-sys-val" style="word-break:break-all;font-size:10px">${v(e.userAgent)}</div></div>`}();break;case"settings":!function(){const n=l();n&&(n.innerHTML=`\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Timestamps</div>\n <div class="dc-setting-desc">Show time prefix on each log entry</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-ts" ${e.settings.timestamps?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Auto-scroll</div>\n <div class="dc-setting-desc">Scroll to latest entry automatically</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-as" ${e.settings.autoScroll?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Capture Global Errors</div>\n <div class="dc-setting-desc">window.onerror + unhandledrejection</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-ce" ${e.settings.captureErrors?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Monitor Network</div>\n <div class="dc-setting-desc">Intercept fetch + XHR requests</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-mn" ${e.settings.monitorNetwork?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Font Size</div>\n <div class="dc-setting-desc">Console output font size (px)</div>\n </div>\n <select class="dc-select" id="s-fs">\n ${[10,11,12,13,14].map(n=>`<option value="${n}" ${e.settings.fontSize===n?"selected":""}>${n}px</option>`).join("")}\n </select>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Max Log Entries</div>\n <div class="dc-setting-desc">Older entries are discarded</div>\n </div>\n <select class="dc-select" id="s-me">\n ${[100,250,500,1e3,2e3].map(n=>`<option value="${n}" ${e.settings.maxEntries===n?"selected":""}>${n}</option>`).join("")}\n </select>\n </div>\n <div class="dc-setting-row" style="border:none">\n <div class="dc-setting-info">\n <div class="dc-setting-name" style="color:var(--dc-red)">Clear All Data</div>\n <div class="dc-setting-desc">Wipe logs and network history</div>\n </div>\n <button class="dc-clear-btn" onclick="window.__dcClearAll()">Clear</button>\n </div>`,document.getElementById("s-ts").onchange=n=>{e.settings.timestamps=n.target.checked,t(),h()},document.getElementById("s-as").onchange=n=>{e.settings.autoScroll=n.target.checked,t()},document.getElementById("s-ce").onchange=n=>{e.settings.captureErrors=n.target.checked,t()},document.getElementById("s-mn").onchange=n=>{e.settings.monitorNetwork=n.target.checked,t()},document.getElementById("s-fs").onchange=n=>{e.settings.fontSize=parseInt(n.target.value),t(),"console"===e.activeTab&&h()},document.getElementById("s-me").onchange=n=>{e.settings.maxEntries=parseInt(n.target.value),t()})}()}}function R(n,e){const t=document.getElementById(`cnt-${n}`);t&&(e>0?(t.textContent=e>999?"999+":e,t.style.display="inline-flex"):t.style.display="none")}window.__dcClearAll=function(){e.logs=[],e.network=[],e.errorCount=0;const n=u();n&&(n.style.display="none"),R("console",0),R("network",0),"console"===e.activeTab&&h(),"network"===e.activeTab&&$()};let P=!1;function A(){P=!P;const n=d();P?(n.style.display="flex",requestAnimationFrame(()=>{n.classList.add("visible")}),j(e.activeTab)):(n.classList.remove("visible"),setTimeout(()=>{n.style.display="none"},260)),o().innerHTML=P?`✕<span class="dc-fab-badge" id="dc-error-badge" style="display:${e.errorCount>0?"flex":"none"}">${e.errorCount}</span>`:`⌥<span class="dc-fab-badge" id="dc-error-badge" style="display:${e.errorCount>0?"flex":"none"}">${e.errorCount}</span>`}!function(){const n=document.getElementById("dc-drag"),e=document.getElementById("dc-panel");let t=!1,o=0,d=0;function r(n){t=!0,o=n.clientY||n.touches&&n.touches[0].clientY,d=e.offsetHeight,document.body.style.userSelect="none"}function a(n){if(!t)return;const r=n.clientY||n.touches&&n.touches[0].clientY,a=Math.max(120,Math.min(.85*window.innerHeight,d+(o-r)));e.style.height=a+"px"}function c(){t=!1,document.body.style.userSelect=""}n.addEventListener("mousedown",r),n.addEventListener("touchstart",r,{passive:!0}),document.addEventListener("mousemove",a),document.addEventListener("touchmove",a,{passive:!0}),document.addEventListener("mouseup",c),document.addEventListener("touchend",c)}(),document.getElementById("dc-fab").addEventListener("click",A),document.getElementById("dc-minimize-btn").addEventListener("click",A),document.querySelectorAll(".dc-tab").forEach(n=>{n.addEventListener("click",()=>j(n.dataset.tab))}),document.getElementById("dc-clear-btn").addEventListener("click",()=>{switch(e.activeTab){case"console":e.logs=[],R("console",0),h();break;case"network":e.network=[],R("network",0),$()}}),document.getElementById("dc-copy-btn").addEventListener("click",()=>{let n="";"console"===e.activeTab?n=e.logs.map(n=>`[${n.ts}] [${n.type.toUpperCase()}] ${n.args.map(n=>"object"==typeof n?JSON.stringify(n,null,2):String(n)).join(" ")}`).join("\n"):"network"===e.activeTab&&(n=e.network.map(n=>`[${n.ts}] ${n.method} ${n.url} → ${n.status||"ERR"} (${n.duration}ms)`).join("\n")),n&&(navigator.clipboard&&navigator.clipboard.writeText(n).catch(()=>{}),console.log("📋 Copied to clipboard"))}),g().addEventListener("input",n=>$(n.target.value)),document.getElementById("net-clear").addEventListener("click",()=>{e.network=[],R("network",0),$()}),document.querySelectorAll(".dc-st-btn").forEach(n=>{n.addEventListener("click",()=>{e.activeStorage=n.dataset.storage,document.querySelectorAll(".dc-st-btn").forEach(e=>e.classList.toggle("active",e===n)),C()})}),document.getElementById("storage-refresh").addEventListener("click",S),document.getElementById("dom-refresh-btn").addEventListener("click",I),document.getElementById("dom-pick-btn").addEventListener("click",()=>{e.isPicking?M():(e.isPicking=!0,document.getElementById("dom-pick-btn").classList.add("picking"),q=n=>{n.target.closest("#dc-panel")||n.target.closest("#dc-fab")||(n.preventDefault(),n.stopPropagation(),N&&N.classList.remove("dc-pick-highlight"),N=n.target,N.classList.add("dc-pick-highlight"),B(N),M())},document.addEventListener("click",q,!0),document.addEventListener("mouseover",n=>{e.isPicking&&(n.target.closest("#dc-panel")||n.target.closest("#dc-fab")||(N&&N.classList.remove("dc-pick-highlight"),N=n.target,N.classList.add("dc-pick-highlight")))},!0))}),document.getElementById("dom-collapse-btn").addEventListener("click",()=>{document.querySelectorAll(".dc-children.open").forEach(n=>n.classList.remove("open")),document.querySelectorAll(".dc-arrow").forEach(n=>{"▼"===n.textContent&&(n.textContent="▶")})});let D=location.href;setInterval(()=>{location.href!==D&&(D=location.href,x("info",["🔄 SPA navigation detected:",location.href]))},1e3),function(){const n=p();if(!n)return;function t(){const t=n.value.trim();if(!t)return;e.replHistory.unshift(t),e.replHistory.length>50&&e.replHistory.pop(),e.replHistoryIdx=-1;const o=document.createElement("div");o.className="dc-entry dc-entry-cmd",o.style.fontSize=e.settings.fontSize+"px",o.innerHTML=`<span class="dc-ts">${b()}</span><span>▶ ${v(t)}</span>`,r().appendChild(o);try{const n=(0,eval)(t);if(void 0!==n){const t=document.createElement("div");t.className="dc-entry dc-entry-log",t.style.fontSize=e.settings.fontSize+"px",t.innerHTML=`<span class="dc-ts">${b()}</span><span>${m(n)}</span>`,r().appendChild(t)}}catch(d){const n=document.createElement("div");n.className="dc-entry dc-entry-error",n.style.fontSize=e.settings.fontSize+"px",n.innerHTML=`<span class="dc-ts">${b()}</span><span>${v(d.toString())}</span>`,r().appendChild(n)}n.value="",e.settings.autoScroll&&(r().scrollTop=r().scrollHeight),j("console")}n.addEventListener("keydown",o=>{"Enter"!==o.key?("ArrowUp"===o.key&&(o.preventDefault(),e.replHistoryIdx=Math.min(e.replHistoryIdx+1,e.replHistory.length-1),n.value=e.replHistory[e.replHistoryIdx]||""),"ArrowDown"===o.key&&(o.preventDefault(),e.replHistoryIdx=Math.max(e.replHistoryIdx-1,-1),n.value=e.replHistoryIdx>=0?e.replHistory[e.replHistoryIdx]:"")):t()});const o=document.getElementById("repl-run");o&&o.addEventListener("click",t)}(),h(),x("log",["✅ DevConsole v2.0 loaded — click ⌥ to open"]),window.insikt={toggle:A,clear:window.__dcClearAll,init:()=>{},destroy:()=>{const n=o(),e=d();n&&n.remove(),e&&e.remove(),["log","warn","error","info"].forEach(n=>{f[n]&&(console[n]=f[n])}),window.fetch=y,XMLHttpRequest.prototype.open=k,XMLHttpRequest.prototype.send=w}}}()});
2
2
  //# sourceMappingURL=insikt.umd.js.map