insikt.js 1.0.0 → 1.2.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.umd.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":["VERSION","state","initialized","panelVisible","logs","requests","errors","ui","root","initInsikt","options","document","createElement","id","body","appendChild","originalLog","console","log","args","push","type","timestamp","Date","now","apply","attachConsoleProxy","window","addEventListener","event","error","destroyInsikt","remove","toggleInsikt","clearLogs","insiktAPI","version","init","destroy","toggle","clear","insikt","__INSIKT_INITIALIZED__","readyState"],"mappings":"6OAAA,MAAMA,EAAU,QAEVC,EAAQ,CACZC,aAAa,EACbC,cAAc,EACdC,KAAM,GACNC,SAAU,GACVC,OAAQ,GACRC,GAAI,CACFC,KAAM,OAMV,SAASC,EAAWC,EAAU,IACxBT,EAAMC,cACVD,EAAMC,aAAc,EA+BpBD,EAAMM,GAAGC,KAAOG,SAASC,cAAc,OACvCX,EAAMM,GAAGC,KAAKK,GAAK,cACnBF,SAASG,KAAKC,YAAYd,EAAMM,GAAGC,MAUrC,WACE,MAAMQ,EAAcC,QAAQC,IAC5BD,QAAQC,IAAM,IAAIC,KAChBlB,EAAMG,KAAKgB,KAAK,CAAEC,KAAM,MAAOF,OAAMG,UAAWC,KAAKC,QACrDR,EAAYS,MAAMR,QAASE,GAE/B,CA9CEO,GAiDAC,OAAOC,iBAAiB,QAAUC,IAChC5B,EAAMK,OAAOc,KAAK,CAAEU,MAAOD,EAAMC,MAAOR,UAAWC,KAAKC,UA/C1DP,QAAQC,IAAI,YAAYlB,kBAC1B,CAEA,SAAS+B,IA4BH9B,EAAMM,GAAGC,OACXP,EAAMM,GAAGC,KAAKwB,SACd/B,EAAMM,GAAGC,KAAO,MA5BlBP,EAAMC,aAAc,EACpBe,QAAQC,IAAI,qBACd,CAEA,SAASe,IACPhC,EAAME,cAAgBF,EAAME,YAI9B,CAEA,SAAS+B,IACPjC,EAAMG,KAAO,GACbH,EAAMI,SAAW,GACjBJ,EAAMK,OAAS,EAEjB,CA+BK,MAAC6B,EAAY,CAChBC,QAASpC,EACTqC,KAAM5B,EACN6B,QAASP,EACTQ,OAAQN,EACRO,MAAON,GAIa,oBAAXP,SACTA,OAAOc,OAASN,EACXR,OAAOe,yBACVf,OAAOe,wBAAyB,EAEJ,YAAxB/B,SAASgC,WACXhC,SAASiB,iBAAiB,mBAAoBnB,GAE9CA"}
1
+ {"version":3,"file":"insikt.umd.js","sources":["../insikt.js"],"sourcesContent":["(function() {\n 'use strict';\n\n // ═══════════════════════════════════════════════════════════════\n // INSIKT v1.2\n // Mobile-first browser debugging / inspection console\n // Zero dependencies\n // ═══════════════════════════════════════════════════════════════\n\n const VERSION = '1.2.0';\n const BUFFER_KEY = '__insikt_buffer__';\n const SETTINGS_KEY = '__dc_settings';\n const BODY_DISPLAY_LIMIT = 10 * 1024;\n\n // ═══════════════════════════════════════════════════════════════\n // 1. INJECT CSS\n // ═══════════════════════════════════════════════════════════════\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 #dc-panel, #dc-fab { box-sizing: border-box; }\n #dc-panel *, #dc-fab * { box-sizing: inherit; }\n\n /* ── FAB ────────────────────────────── */\n\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 {\n transform: scale(1.05);\n box-shadow: 0 6px 30px rgba(124,106,247,0.7);\n }\n\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 /* ── PANEL ───────────────────────────── */\n\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\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 ──────────────────────────── */\n\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% {\n opacity: 1;\n box-shadow: 0 0 0 0 rgba(61,255,160,0.4);\n }\n 50% {\n opacity: 0.6;\n box-shadow: 0 0 0 5px rgba(61,255,160,0);\n }\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 {\n background: var(--dc-border);\n color: var(--dc-text0);\n }\n\n /* ── TABS ────────────────────────────── */\n\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 /* ── PANEL CONTENT ───────────────────── */\n\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 {\n background: var(--dc-border);\n border-radius: 2px;\n }\n\n /* ── LOG ENTRIES ──────────────────────── */\n\n .dc-entry {\n display: flex;\n align-items: flex-start;\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 position: relative;\n }\n\n @keyframes dcFadeIn {\n from {\n opacity: 0;\n transform: translateY(2px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n .dc-entry-log {\n color: var(--dc-text0);\n }\n\n .dc-entry-warn {\n color: var(--dc-orange);\n background: rgba(255,179,71,0.07);\n border-left: 2px solid var(--dc-orange);\n }\n\n .dc-entry-error {\n color: var(--dc-red);\n background: rgba(255,92,110,0.07);\n border-left: 2px solid var(--dc-red);\n }\n\n .dc-entry-info {\n color: var(--dc-blue);\n background: rgba(91,206,250,0.06);\n border-left: 2px solid var(--dc-blue);\n }\n\n .dc-entry-cmd {\n color: var(--dc-accent);\n background: rgba(124,106,247,0.06);\n }\n\n .dc-entry-table {\n color: var(--dc-text0);\n background: rgba(124,106,247,0.04);\n border-left: 2px solid var(--dc-accent);\n display: block;\n }\n\n .dc-entry-group {\n color: var(--dc-accent);\n background: rgba(124,106,247,0.05);\n cursor: pointer;\n user-select: none;\n font-weight: 600;\n }\n\n .dc-entry-group:hover {\n background: rgba(124,106,247,0.10);\n }\n\n .dc-group-arrow {\n display: inline-block;\n width: 12px;\n color: var(--dc-text2);\n font-size: 9px;\n transition: transform 0.15s;\n }\n\n .dc-group-arrow.open {\n transform: rotate(90deg);\n }\n\n .dc-group-children {\n display: block;\n }\n\n .dc-group-children.collapsed {\n display: none;\n }\n\n .dc-grouped {\n margin-left: 18px;\n border-left: 1px solid var(--dc-border);\n border-radius: 0;\n }\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 white-space: nowrap;\n }\n\n .dc-entry-body {\n min-width: 0;\n flex: 1;\n }\n\n /* ── OBJECT INSPECTOR ───────────────── */\n\n .dc-value {\n font-family: var(--dc-mono);\n font-size: inherit;\n line-height: 1.5;\n }\n\n .dc-primitive-string { color: var(--dc-green); }\n .dc-primitive-number { color: var(--dc-blue); }\n .dc-primitive-boolean { color: var(--dc-orange); }\n .dc-primitive-null,\n .dc-primitive-undefined {\n color: var(--dc-text2);\n }\n\n .dc-primitive-bigint { color: var(--dc-blue); }\n .dc-primitive-symbol { color: var(--dc-accent2); }\n .dc-primitive-function { color: var(--dc-accent2); }\n\n .dc-object-node {\n display: inline;\n }\n\n .dc-object-toggle {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n cursor: pointer;\n user-select: none;\n color: var(--dc-text1);\n border-radius: 3px;\n padding: 0 2px;\n }\n\n .dc-object-toggle:hover {\n background: var(--dc-bg3);\n }\n\n .dc-object-arrow {\n color: var(--dc-text2);\n width: 10px;\n font-size: 9px;\n display: inline-block;\n }\n\n .dc-object-summary {\n color: var(--dc-text1);\n }\n\n .dc-object-children {\n display: none;\n margin-left: 14px;\n border-left: 1px solid var(--dc-border);\n padding-left: 8px;\n margin-top: 2px;\n margin-bottom: 2px;\n }\n\n .dc-object-children.open {\n display: block;\n }\n\n .dc-object-row {\n display: block;\n padding: 1px 0;\n }\n\n .dc-object-key {\n color: var(--dc-accent2);\n }\n\n .dc-object-key-index {\n color: var(--dc-text2);\n }\n\n .dc-object-more {\n color: var(--dc-text2);\n font-style: italic;\n }\n\n /* ── TABLE ───────────────────────────── */\n\n .dc-table-wrap {\n overflow-x: auto;\n margin-top: 4px;\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n }\n\n .dc-console-table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--dc-mono);\n font-size: 10px;\n min-width: 280px;\n }\n\n .dc-console-table th {\n background: var(--dc-bg3);\n color: var(--dc-accent);\n font-weight: 600;\n text-align: left;\n padding: 5px 7px;\n border-bottom: 1px solid var(--dc-border);\n white-space: nowrap;\n }\n\n .dc-console-table td {\n padding: 5px 7px;\n border-bottom: 1px solid var(--dc-border);\n color: var(--dc-text1);\n vertical-align: top;\n }\n\n .dc-console-table tr:last-child td {\n border-bottom: none;\n }\n\n /* ── REPL ────────────────────────────── */\n\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 {\n border-color: var(--dc-accent);\n box-shadow: 0 0 0 2px rgba(124,106,247,0.15);\n }\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 /* ── RELOAD SEPARATOR ────────────────── */\n\n .dc-reload-separator {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 10px 0;\n color: var(--dc-text2);\n font-size: 9px;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n }\n\n .dc-reload-separator::before,\n .dc-reload-separator::after {\n content: '';\n height: 1px;\n background: var(--dc-border);\n flex: 1;\n }\n\n /* ── NETWORK ─────────────────────────── */\n\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 {\n border-color: var(--dc-red);\n color: var(--dc-red);\n }\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\n .dc-detail-title {\n color: var(--dc-accent);\n font-weight: 700;\n margin-bottom: 4px;\n font-size: 10px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .dc-detail-row {\n padding: 2px 0;\n word-break: break-all;\n }\n\n .dc-detail-key { color: var(--dc-text2); }\n\n .dc-body-block {\n background: var(--dc-bg1);\n border: 1px solid var(--dc-border);\n border-radius: 5px;\n padding: 7px;\n margin-top: 5px;\n }\n\n .dc-body-pre {\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 160px;\n overflow: auto;\n margin: 0;\n font-family: var(--dc-mono);\n font-size: 10px;\n color: var(--dc-green);\n }\n\n .dc-body-truncated {\n color: var(--dc-orange);\n font-size: 9px;\n margin-top: 5px;\n }\n\n .dc-body-full {\n display: none;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 400px;\n overflow: auto;\n margin: 6px 0 0;\n font-family: var(--dc-mono);\n font-size: 10px;\n color: var(--dc-green);\n }\n\n .dc-body-full.open { display: block; }\n\n .dc-body-toggle {\n margin-top: 5px;\n padding: 4px 7px;\n background: var(--dc-bg3);\n border: 1px solid var(--dc-border);\n border-radius: 4px;\n color: var(--dc-text1);\n font-family: var(--dc-mono);\n font-size: 9px;\n cursor: pointer;\n }\n\n /* ── STORAGE ─────────────────────────── */\n\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 {\n background: var(--dc-accent);\n border-color: var(--dc-accent);\n color: #fff;\n }\n\n .dc-st-btn:hover:not(.active) {\n border-color: var(--dc-text2);\n color: var(--dc-text1);\n }\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 {\n color: var(--dc-blue);\n font-size: 12px;\n font-weight: 700;\n }\n\n .dc-db-meta {\n color: var(--dc-text2);\n font-size: 10px;\n margin-top: 2px;\n }\n\n .dc-db-body {\n display: none;\n padding: 10px;\n }\n\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\n .dc-store-name {\n color: var(--dc-text0);\n font-size: 12px;\n font-weight: 600;\n }\n\n .dc-store-meta {\n color: var(--dc-text2);\n font-size: 10px;\n margin-top: 2px;\n }\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 {\n color: #ffd700;\n font-weight: 600;\n }\n\n .dc-data-val {\n color: var(--dc-blue);\n margin-top: 3px;\n word-break: break-all;\n }\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 {\n color: #ffd700;\n font-weight: 600;\n min-width: 100px;\n word-break: break-all;\n }\n\n .dc-kv-val {\n color: var(--dc-blue);\n flex: 1;\n word-break: break-all;\n }\n\n .dc-empty {\n padding: 24px;\n text-align: center;\n color: var(--dc-text2);\n font-size: 12px;\n }\n\n /* ── DOM ─────────────────────────────── */\n\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 {\n border-color: var(--dc-accent);\n color: var(--dc-accent);\n }\n\n .dc-dom-btn.picking {\n background: var(--dc-accent2);\n border-color: var(--dc-accent2);\n color: #fff;\n }\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 {\n color: var(--dc-text2);\n width: 12px;\n flex-shrink: 0;\n font-size: 9px;\n }\n\n .dc-tag {\n color: var(--dc-accent2);\n font-weight: 600;\n }\n\n .dc-id { color: var(--dc-blue); }\n .dc-cls { color: var(--dc-orange); }\n\n .dc-txt-preview {\n color: var(--dc-text2);\n font-size: 10px;\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .dc-children {\n margin-left: 16px;\n display: none;\n }\n\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 ──────────────────────────── */\n\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 ───────────────────────── */\n\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\n .dc-setting-name {\n color: var(--dc-text0);\n font-size: 12px;\n font-weight: 600;\n }\n\n .dc-setting-desc {\n color: var(--dc-text2);\n font-size: 10px;\n margin-top: 2px;\n }\n\n .dc-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n flex-shrink: 0;\n }\n\n .dc-toggle input {\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n .dc-toggle-track {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n 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 {\n background: var(--dc-accent);\n }\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;\n left: 3px;\n transition: transform 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track::after {\n transform: translateX(18px);\n }\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 ─────────────────────────────── */\n\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\n const html = `\n <button id=\"dc-fab\" title=\"INSIKT\">\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\n <div id=\"dc-header\">\n <span id=\"dc-title\">INSIKT</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 active tab\">📋</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\">\n Console<span class=\"dc-tab-count\" id=\"cnt-console\" style=\"display:none\"></span>\n </button>\n <button class=\"dc-tab\" data-tab=\"network\">\n Network<span class=\"dc-tab-count\" id=\"cnt-network\" style=\"display:none\"></span>\n </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\n <div class=\"dc-repl\">\n <input\n class=\"dc-input\"\n id=\"repl-input\"\n placeholder=\"▶ execute javascript…\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n >\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\n class=\"dc-filter-input\"\n id=\"net-filter\"\n placeholder=\"Filter by URL or method…\"\n >\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\n <div class=\"dc-storage-actions\">\n <button class=\"dc-clear-btn\" id=\"storage-refresh\">↺ Refresh</button>\n </div>\n\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. STATE\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 groupDepth: 0,\n nextLogId: 1,\n settings: {\n timestamps: true,\n autoScroll: true,\n maxEntries: 500,\n fontSize: 12,\n monitorNetwork: true,\n captureErrors: true,\n persistBuffer: false,\n theme: 'dark'\n }\n };\n\n // ═══════════════════════════════════════════════════════════════\n // 4. HELPERS\n // ═══════════════════════════════════════════════════════════════\n\n function saveSettings() {\n try {\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(S.settings));\n } catch(e) {}\n }\n\n function loadSettings() {\n try {\n const saved = localStorage.getItem(SETTINGS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n S.settings = { ...S.settings, ...parsed };\n }\n } catch(e) {}\n }\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\n return (\n `${String(d.getHours()).padStart(2,'0')}:` +\n `${String(d.getMinutes()).padStart(2,'0')}:` +\n `${String(d.getSeconds()).padStart(2,'0')}.` +\n `${String(d.getMilliseconds()).padStart(3,'0')}`\n );\n }\n\n function escHtml(s) {\n return String(s)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n function truncUrl(url, max=55) {\n if (!url || url.length <= max) return url;\n\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 function updateTabCount(tab, n) {\n const el2 = document.getElementById(`cnt-${tab}`);\n if (!el2) return;\n\n if (n > 0) {\n el2.textContent = n > 999 ? '999+' : n;\n el2.style.display = 'inline-flex';\n } else {\n el2.style.display = 'none';\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 5. SERIALIZABLE VALUE SNAPSHOT\n // ═══════════════════════════════════════════════════════════════\n\n /*\n * Console objects cannot safely be stored directly:\n *\n * - circular references\n * - DOM nodes\n * - functions\n * - symbols\n * - BigInt\n * - objects changing after console.log()\n *\n * Therefore INSIKT creates a compact inspection representation.\n *\n * depth 0 = root\n * depth 1 = first children\n * depth 2 = second children\n *\n * The UI can still expand deeper nodes because the representation\n * is generated recursively up to SNAPSHOT_DEPTH.\n */\n\n const SNAPSHOT_DEPTH = 8;\n const SNAPSHOT_KEYS = 100;\n\n function snapshotValue(value, depth=0, seen=new WeakSet()) {\n if (value === null) {\n return { kind: 'null' };\n }\n\n if (value === undefined) {\n return { kind: 'undefined' };\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n return { kind: 'string', value };\n }\n\n if (type === 'number') {\n if (Number.isNaN(value)) return { kind: 'number', value: 'NaN' };\n if (value === Infinity) return { kind: 'number', value: 'Infinity' };\n if (value === -Infinity) return { kind: 'number', value: '-Infinity' };\n return { kind: 'number', value };\n }\n\n if (type === 'boolean') {\n return { kind: 'boolean', value };\n }\n\n if (type === 'bigint') {\n return { kind: 'bigint', value: value.toString() + 'n' };\n }\n\n if (type === 'symbol') {\n return { kind: 'symbol', value: String(value) };\n }\n\n if (type === 'function') {\n return {\n kind: 'function',\n value: value.name ? `[Function ${value.name}]` : '[Function]'\n };\n }\n\n if (type !== 'object') {\n return { kind: 'string', value: String(value) };\n }\n\n if (seen.has(value)) {\n return { kind: 'circular' };\n }\n\n if (depth >= SNAPSHOT_DEPTH) {\n return {\n kind: 'object',\n ctor: getConstructorName(value),\n entries: [],\n truncated: true\n };\n }\n\n seen.add(value);\n\n // Date\n if (value instanceof Date) {\n return {\n kind: 'date',\n value: isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString()\n };\n }\n\n // RegExp\n if (value instanceof RegExp) {\n return {\n kind: 'regexp',\n value: String(value)\n };\n }\n\n // Error\n if (value instanceof Error) {\n const result = {\n kind: 'error',\n ctor: value.name || 'Error',\n message: String(value.message || ''),\n stack: value.stack ? String(value.stack) : '',\n entries: []\n };\n\n try {\n Object.keys(value).slice(0, SNAPSHOT_KEYS).forEach(key => {\n result.entries.push({\n key,\n value: snapshotValue(value[key], depth + 1, seen)\n });\n });\n } catch(e) {}\n\n return result;\n }\n\n // Array\n if (Array.isArray(value)) {\n const result = {\n kind: 'array',\n length: value.length,\n entries: [],\n truncated: false\n };\n\n const limit = Math.min(value.length, SNAPSHOT_KEYS);\n\n for (let i = 0; i < limit; i++) {\n try {\n result.entries.push({\n key: String(i),\n index: true,\n value: snapshotValue(value[i], depth + 1, seen)\n });\n } catch(e) {\n result.entries.push({\n key: String(i),\n index: true,\n value: { kind: 'string', value: '[Uninspectable]' }\n });\n }\n }\n\n if (value.length > limit) result.truncated = true;\n\n seen.delete(value);\n return result;\n }\n\n // Generic object\n const result = {\n kind: 'object',\n ctor: getConstructorName(value),\n entries: [],\n truncated: false\n };\n\n let keys = [];\n\n try {\n keys = Object.keys(value);\n } catch(e) {}\n\n const limit = Math.min(keys.length, SNAPSHOT_KEYS);\n\n for (let i = 0; i < limit; i++) {\n const key = keys[i];\n\n try {\n result.entries.push({\n key,\n value: snapshotValue(value[key], depth + 1, seen)\n });\n } catch(e) {\n result.entries.push({\n key,\n value: { kind: 'string', value: '[Uninspectable]' }\n });\n }\n }\n\n if (keys.length > limit) result.truncated = true;\n\n seen.delete(value);\n return result;\n }\n\n function getConstructorName(value) {\n try {\n if (value && value.constructor && value.constructor.name) {\n return value.constructor.name;\n }\n } catch(e) {}\n\n return 'Object';\n }\n\n function snapshotArgs(args) {\n return args.map(a => snapshotValue(a));\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 6. OBJECT INSPECTOR\n // ═══════════════════════════════════════════════════════════════\n\n function renderValue(value, options={}) {\n const node = document.createElement('span');\n node.className = 'dc-value';\n\n if (!value || typeof value.kind !== 'string') {\n node.textContent = String(value);\n return node;\n }\n\n switch(value.kind) {\n case 'null':\n node.classList.add('dc-primitive-null');\n node.textContent = 'null';\n return node;\n\n case 'undefined':\n node.classList.add('dc-primitive-undefined');\n node.textContent = 'undefined';\n return node;\n\n case 'string':\n node.classList.add('dc-primitive-string');\n node.textContent = `\"${value.value}\"`;\n return node;\n\n case 'number':\n node.classList.add('dc-primitive-number');\n node.textContent = String(value.value);\n return node;\n\n case 'boolean':\n node.classList.add('dc-primitive-boolean');\n node.textContent = String(value.value);\n return node;\n\n case 'bigint':\n node.classList.add('dc-primitive-bigint');\n node.textContent = String(value.value);\n return node;\n\n case 'symbol':\n node.classList.add('dc-primitive-symbol');\n node.textContent = String(value.value);\n return node;\n\n case 'function':\n node.classList.add('dc-primitive-function');\n node.textContent = String(value.value);\n return node;\n\n case 'date':\n node.classList.add('dc-primitive-string');\n node.textContent = `Date(\"${value.value}\")`;\n return node;\n\n case 'regexp':\n node.classList.add('dc-primitive-string');\n node.textContent = value.value;\n return node;\n\n case 'circular':\n node.classList.add('dc-primitive-null');\n node.textContent = '[Circular]';\n return node;\n\n case 'error':\n return renderExpandableValue(value, {\n summary: `${value.ctor || 'Error'}: ${value.message || ''}`,\n prefix: ''\n });\n\n case 'array':\n return renderExpandableValue(value, {\n summary: `[${value.length != null ? value.length + ' items' : '…'}]`,\n prefix: ''\n });\n\n case 'object':\n return renderExpandableValue(value, {\n summary: `{${value.ctor && value.ctor !== 'Object' ? value.ctor + ' ' : ''}…}`,\n prefix: ''\n });\n\n default:\n node.textContent = '[Unknown]';\n return node;\n }\n }\n\n function renderExpandableValue(value, options={}) {\n const wrap = document.createElement('span');\n wrap.className = 'dc-object-node';\n\n const toggle = document.createElement('span');\n toggle.className = 'dc-object-toggle';\n\n const arrow = document.createElement('span');\n arrow.className = 'dc-object-arrow';\n arrow.textContent = '▶';\n\n const summary = document.createElement('span');\n summary.className = 'dc-object-summary';\n summary.textContent = options.summary || '{…}';\n\n toggle.appendChild(arrow);\n toggle.appendChild(summary);\n\n const children = document.createElement('div');\n children.className = 'dc-object-children';\n\n const entries = Array.isArray(value.entries) ? value.entries : [];\n\n entries.forEach(entry => {\n const row = document.createElement('div');\n row.className = 'dc-object-row';\n\n const key = document.createElement('span');\n key.className = entry.index\n ? 'dc-object-key-index'\n : 'dc-object-key';\n\n key.textContent = entry.index\n ? `[${entry.key}] `\n : `${entry.key}: `;\n\n row.appendChild(key);\n row.appendChild(renderValue(entry.value, {\n depth: (options.depth || 0) + 1\n }));\n\n children.appendChild(row);\n });\n\n if (value.truncated) {\n const more = document.createElement('div');\n more.className = 'dc-object-more';\n more.textContent = '… more';\n children.appendChild(more);\n }\n\n if (value.kind === 'error' && value.stack) {\n const stack = document.createElement('div');\n stack.className = 'dc-object-more';\n stack.style.whiteSpace = 'pre-wrap';\n stack.style.marginTop = '4px';\n stack.textContent = value.stack;\n children.appendChild(stack);\n }\n\n toggle.addEventListener('click', e => {\n e.stopPropagation();\n\n const open = children.classList.toggle('open');\n arrow.textContent = open ? '▼' : '▶';\n });\n\n wrap.appendChild(toggle);\n\n if (entries.length || value.truncated || value.stack) {\n wrap.appendChild(children);\n }\n\n return wrap;\n }\n\n function renderArgsInto(container, args) {\n if (!args || !args.length) {\n container.textContent = '';\n return;\n }\n\n args.forEach((arg, index) => {\n if (index > 0) {\n container.appendChild(document.createTextNode(' '));\n }\n\n container.appendChild(renderValue(arg));\n });\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 7. CONSOLE INTERCEPTION\n // ═══════════════════════════════════════════════════════════════\n\n const _orig = {};\n\n ['log','warn','error','info','table','group','groupCollapsed','groupEnd'].forEach(level => {\n if (typeof console[level] === 'function') {\n _orig[level] = console[level].bind(console);\n }\n });\n\n ['log','warn','error','info'].forEach(level => {\n if (!_orig[level]) return;\n\n console[level] = (...args) => {\n _orig[level](...args);\n addLog(level, args);\n };\n });\n\n if (_orig.table) {\n console.table = (...args) => {\n _orig.table(...args);\n addTableLog(args);\n };\n }\n\n if (_orig.group) {\n console.group = (...args) => {\n _orig.group(...args);\n addGroupLog(false, args);\n };\n }\n\n if (_orig.groupCollapsed) {\n console.groupCollapsed = (...args) => {\n _orig.groupCollapsed(...args);\n addGroupLog(true, args);\n };\n }\n\n if (_orig.groupEnd) {\n console.groupEnd = (...args) => {\n _orig.groupEnd(...args);\n S.groupDepth = Math.max(0, S.groupDepth - 1);\n };\n }\n\n function addLog(type, args, options={}) {\n if (type === 'error') {\n S.errorCount++;\n\n const b = el.badge();\n\n if (b) {\n b.textContent = S.errorCount > 99 ? '99+' : S.errorCount;\n b.style.display = 'flex';\n }\n }\n\n const entry = {\n id: S.nextLogId++,\n type,\n args: snapshotArgs(args),\n ts: ts(),\n groupDepth: options.groupDepth != null\n ? options.groupDepth\n : S.groupDepth,\n restored: false\n };\n\n S.logs.push(entry);\n trimLogs();\n persistBuffer();\n\n updateTabCount('console', S.logs.length);\n\n if (S.activeTab === 'console') {\n renderConsole();\n }\n }\n\n function addTableLog(args) {\n const source = args.length > 0 ? args[0] : undefined;\n\n const entry = {\n id: S.nextLogId++,\n type: 'table',\n args: snapshotArgs(args),\n table: buildTableSnapshot(source),\n ts: ts(),\n groupDepth: S.groupDepth,\n restored: false\n };\n\n S.logs.push(entry);\n trimLogs();\n persistBuffer();\n\n updateTabCount('console', S.logs.length);\n\n if (S.activeTab === 'console') {\n renderConsole();\n }\n }\n\n function addGroupLog(collapsed, args) {\n const depth = S.groupDepth;\n\n const entry = {\n id: S.nextLogId++,\n type: 'group',\n args: snapshotArgs(args),\n ts: ts(),\n groupDepth: depth,\n collapsed: !!collapsed,\n restored: false\n };\n\n S.logs.push(entry);\n\n S.groupDepth++;\n\n trimLogs();\n persistBuffer();\n\n updateTabCount('console', S.logs.length);\n\n if (S.activeTab === 'console') {\n renderConsole();\n }\n }\n\n function buildTableSnapshot(source) {\n if (!Array.isArray(source)) {\n return {\n tabular: false,\n value: snapshotValue(source)\n };\n }\n\n const rows = source.slice(0, SNAPSHOT_KEYS).map((row, index) => {\n const cells = {};\n\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n Object.keys(row).slice(0, SNAPSHOT_KEYS).forEach(key => {\n cells[key] = snapshotValue(row[key]);\n });\n } else {\n cells.value = snapshotValue(row);\n }\n\n return {\n index,\n cells\n };\n });\n\n return {\n tabular: true,\n rows,\n truncated: source.length > rows.length\n };\n }\n\n function trimLogs() {\n const max = Math.max(1, Number(S.settings.maxEntries) || 500);\n\n while (S.logs.length > max) {\n S.logs.shift();\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 8. CONSOLE RENDERING\n // ═══════════════════════════════════════════════════════════════\n\n function renderConsole() {\n const o = el.consOut();\n if (!o) return;\n\n o.innerHTML = '';\n\n if (!S.logs.length) {\n o.innerHTML = '<div class=\"dc-empty\">No console entries yet</div>';\n return;\n }\n\n const frag = document.createDocumentFragment();\n\n let previousRestored = null;\n let skipUntil = -1;\n\n S.logs.forEach((log, index) => {\n if (!log.restored && previousRestored === true) {\n frag.appendChild(createReloadSeparator());\n }\n\n previousRestored = !!log.restored;\n\n if (index < skipUntil) return;\n\n const entry = createConsoleEntry(log, index);\n\n if (entry) {\n frag.appendChild(entry);\n\n if (log.type === 'group' && entry.dataset.groupEnd) {\n skipUntil = parseInt(entry.dataset.groupEnd, 10);\n }\n }\n });\n\n\n\n o.appendChild(frag);\n\n if (S.settings.autoScroll) {\n o.scrollTop = o.scrollHeight;\n }\n }\n\n function createReloadSeparator() {\n const separator = document.createElement('div');\n separator.className = 'dc-reload-separator';\n separator.textContent = 'reloaded';\n return separator;\n }\n\n function createConsoleEntry(log, index) {\n if (log.type === 'group') {\n return createGroupEntry(log, index);\n }\n\n if (log.type === 'table') {\n return createTableEntry(log, index);\n }\n\n const d = document.createElement('div');\n\n d.className = `dc-entry dc-entry-${log.type}`;\n\n if (log.groupDepth > 0) {\n d.classList.add('dc-grouped');\n }\n\n d.style.fontSize = S.settings.fontSize + 'px';\n\n if (S.settings.timestamps) {\n const timestamp = document.createElement('span');\n timestamp.className = 'dc-ts';\n timestamp.textContent = log.ts;\n d.appendChild(timestamp);\n }\n\n const body = document.createElement('span');\n body.className = 'dc-entry-body';\n\n renderArgsInto(body, log.args);\n\n d.appendChild(body);\n\n return d;\n }\n\n function createGroupEntry(log, index) {\n const d = document.createElement('div');\n\n d.className = 'dc-entry dc-entry-group';\n d.style.fontSize = S.settings.fontSize + 'px';\n\n const arrow = document.createElement('span');\n arrow.className = 'dc-group-arrow';\n arrow.textContent = '▶';\n\n const label = document.createElement('span');\n label.className = 'dc-entry-body';\n\n renderArgsInto(label, log.args);\n\n if (S.settings.timestamps) {\n const timestamp = document.createElement('span');\n timestamp.className = 'dc-ts';\n timestamp.textContent = log.ts;\n d.appendChild(timestamp);\n }\n\n d.appendChild(arrow);\n d.appendChild(label);\n\n const children = document.createElement('div');\n children.className = 'dc-group-children';\n\n const end = findGroupEnd(index, log.groupDepth);\n\n if (end > index + 1) {\n const childFrag = document.createDocumentFragment();\n\n for (let i = index + 1; i < end; i++) {\n const child = createConsoleEntry(S.logs[i], i);\n if (child) {\n childFrag.appendChild(child);\n }\n }\n\n children.appendChild(childFrag);\n\n if (log.collapsed) {\n children.classList.add('collapsed');\n } else {\n arrow.classList.add('open');\n }\n\n d.addEventListener('click', e => {\n e.stopPropagation();\n\n const collapsed = children.classList.toggle('collapsed');\n arrow.classList.toggle('open', !collapsed);\n });\n\n /*\n * The caller must skip child entries when the group itself\n * is rendered. This is handled in renderConsole().\n */\n d.dataset.groupEnd = String(end);\n d.appendChild(children);\n }\n\n return d;\n }\n\n function findGroupEnd(index, depth) {\n for (let i = index + 1; i < S.logs.length; i++) {\n const candidate = S.logs[i];\n\n if (\n candidate.type === 'group' &&\n candidate.groupDepth <= depth\n ) {\n return i;\n }\n\n if (\n candidate.groupDepth < depth\n ) {\n return i;\n }\n }\n\n return S.logs.length;\n }\n\n function createTableEntry(log) {\n const d = document.createElement('div');\n\n d.className = 'dc-entry dc-entry-table';\n\n if (log.groupDepth > 0) {\n d.classList.add('dc-grouped');\n }\n\n d.style.fontSize = S.settings.fontSize + 'px';\n\n if (S.settings.timestamps) {\n const timestamp = document.createElement('span');\n timestamp.className = 'dc-ts';\n timestamp.textContent = log.ts;\n d.appendChild(timestamp);\n }\n\n const body = document.createElement('div');\n body.className = 'dc-entry-body';\n\n const tableData = log.table;\n\n if (!tableData || !tableData.tabular) {\n renderArgsInto(body, log.args);\n d.appendChild(body);\n return d;\n }\n\n const wrap = document.createElement('div');\n wrap.className = 'dc-table-wrap';\n\n const table = document.createElement('table');\n table.className = 'dc-console-table';\n\n const columns = new Set();\n\n tableData.rows.forEach(row => {\n Object.keys(row.cells).forEach(key => columns.add(key));\n });\n\n const columnList = [...columns];\n\n const thead = document.createElement('thead');\n const headRow = document.createElement('tr');\n\n const indexHead = document.createElement('th');\n indexHead.textContent = '(index)';\n headRow.appendChild(indexHead);\n\n columnList.forEach(column => {\n const th = document.createElement('th');\n th.textContent = column;\n headRow.appendChild(th);\n });\n\n thead.appendChild(headRow);\n table.appendChild(thead);\n\n const tbody = document.createElement('tbody');\n\n tableData.rows.forEach(row => {\n const tr = document.createElement('tr');\n\n const indexCell = document.createElement('td');\n indexCell.textContent = String(row.index);\n tr.appendChild(indexCell);\n\n columnList.forEach(column => {\n const td = document.createElement('td');\n\n if (row.cells[column]) {\n td.appendChild(renderValue(row.cells[column]));\n } else {\n td.textContent = '—';\n }\n\n tr.appendChild(td);\n });\n\n tbody.appendChild(tr);\n });\n\n table.appendChild(tbody);\n wrap.appendChild(table);\n body.appendChild(wrap);\n\n if (tableData.truncated) {\n const note = document.createElement('div');\n note.className = 'dc-object-more';\n note.textContent = '… more rows';\n body.appendChild(note);\n }\n\n d.appendChild(body);\n\n return d;\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 9. ERROR CAPTURE\n // ═══════════════════════════════════════════════════════════════\n\n let _origOnError = window.onerror;\n\n function installErrorCapture() {\n if (!S.settings.captureErrors) return;\n\n _origOnError = window.onerror;\n\n window.onerror = function(msg, src, line, col, error) {\n addLog('error', [\n error || `${msg} @ ${src}:${line}:${col}`\n ]);\n\n if (typeof _origOnError === 'function') {\n try {\n return _origOnError.apply(this, arguments);\n } catch(e) {}\n }\n\n return false;\n };\n\n window.addEventListener('unhandledrejection', onUnhandledRejection);\n }\n\n function onUnhandledRejection(e) {\n addLog('error', [\n e.reason instanceof Error\n ? e.reason\n : `Unhandled Promise Rejection: ${String(e.reason)}`\n ]);\n }\n\n installErrorCapture();\n\n // ═══════════════════════════════════════════════════════════════\n // 10. NETWORK INTERCEPTION\n // ═══════════════════════════════════════════════════════════════\n\n const _origFetch = window.fetch;\n\n function isBinaryContentType(contentType) {\n if (!contentType) return false;\n\n const type = contentType.toLowerCase();\n\n return (\n type.includes('application/octet-stream') ||\n type.includes('image/') ||\n type.includes('audio/') ||\n type.includes('video/') ||\n type.includes('application/pdf') ||\n type.includes('application/zip') ||\n type.includes('application/gzip') ||\n type.includes('application/wasm')\n );\n }\n\n function shouldCaptureTextBody(contentType) {\n if (!contentType) return true;\n return !isBinaryContentType(contentType);\n }\n\n async function captureRequestBody(input, init) {\n try {\n if (init && init.body != null) {\n return serializeRequestBody(init.body);\n }\n\n if (input instanceof Request) {\n const clone = input.clone();\n\n if (\n clone.bodyUsed ||\n !shouldCaptureTextBody(clone.headers.get('content-type'))\n ) {\n return null;\n }\n\n return await clone.text();\n }\n } catch(e) {}\n\n return null;\n }\n\n function serializeRequestBody(body) {\n if (body == null) return null;\n\n if (typeof body === 'string') {\n return body;\n }\n\n if (body instanceof URLSearchParams) {\n return body.toString();\n }\n\n if (body instanceof FormData) {\n const result = {};\n\n try {\n body.forEach((value, key) => {\n if (value instanceof File) {\n result[key] = `[File ${value.name}, ${value.size} bytes]`;\n } else {\n result[key] = String(value);\n }\n });\n } catch(e) {\n return '[FormData]';\n }\n\n return JSON.stringify(result, null, 2);\n }\n\n if (body instanceof Blob) {\n return isBinaryContentType(body.type)\n ? null\n : `[Blob ${body.type || 'unknown'}, ${body.size} bytes]`;\n }\n\n if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n return null;\n }\n\n try {\n return JSON.stringify(body, null, 2);\n } catch(e) {\n return String(body);\n }\n }\n\n async function captureResponseBody(response) {\n try {\n const contentType = response.headers.get('content-type') || '';\n\n if (!shouldCaptureTextBody(contentType)) {\n return null;\n }\n\n const clone = response.clone();\n\n if (clone.bodyUsed) return null;\n\n return await clone.text();\n } catch(e) {\n return null;\n }\n }\n\n if (_origFetch) {\n window.fetch = async (...args) => {\n if (!S.settings.monitorNetwork) {\n return _origFetch.apply(window, args);\n }\n\n const startTime = Date.now();\n\n let method = 'GET';\n let url = '';\n\n try {\n url = args[0] instanceof Request\n ? args[0].url\n : String(args[0]);\n\n if (args[1] && args[1].method) {\n method = String(args[1].method).toUpperCase();\n }\n\n if (args[0] instanceof Request) {\n method = args[0].method.toUpperCase();\n }\n } catch(e) {\n url = String(args[0]);\n }\n\n const req = {\n method,\n url,\n ts: ts(),\n startTime,\n status: null,\n statusText: '',\n duration: null,\n headers: {},\n requestHeaders: {},\n requestBody: null,\n responseBody: null,\n error: null\n };\n\n // Capture request headers\n try {\n const request = args[0] instanceof Request\n ? args[0]\n : new Request(url, args[1]);\n\n request.headers.forEach((v,k) => {\n req.requestHeaders[k] = v;\n });\n } catch(e) {}\n\n // Capture request body without consuming the actual body.\n req.requestBody = await captureRequestBody(args[0], args[1]);\n\n try {\n const res = await _origFetch.apply(window, args);\n\n req.status = res.status;\n req.statusText = res.statusText;\n req.duration = Date.now() - startTime;\n\n try {\n res.headers.forEach((v,k) => {\n req.headers[k] = v;\n });\n } catch(e) {}\n\n /*\n * Add the request immediately so the network entry appears\n * without waiting for potentially large response bodies.\n */\n addNetReq(req);\n\n /*\n * Response clone is independent of the application's response.\n * Capturing happens in the background.\n */\n captureResponseBody(res).then(body => {\n if (body == null) return;\n\n req.responseBody = body;\n\n if (S.activeTab === 'network') {\n renderNetwork();\n }\n\n persistBuffer();\n }).catch(() => {});\n\n return res;\n } catch(e) {\n req.error = e && e.message\n ? e.message\n : String(e);\n\n req.duration = Date.now() - startTime;\n\n addNetReq(req);\n\n throw e;\n }\n };\n }\n\n const _origOpen = XMLHttpRequest.prototype.open;\n const _origSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function(method, url) {\n if (!S.settings.monitorNetwork) {\n return _origOpen.apply(this, arguments);\n }\n\n this.__dcReq = {\n method: String(method).toUpperCase(),\n url: String(url),\n ts: ts(),\n startTime: 0,\n requestBody: null,\n responseBody: null,\n requestHeaders: {}\n };\n\n return _origOpen.apply(this, arguments);\n };\n\n const _origSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;\n\n XMLHttpRequest.prototype.setRequestHeader = function(name, value) {\n if (this.__dcReq) {\n this.__dcReq.requestHeaders[name] = String(value);\n }\n\n return _origSetRequestHeader.apply(this, arguments);\n };\n\n XMLHttpRequest.prototype.send = function(body) {\n if (!S.settings.monitorNetwork || !this.__dcReq) {\n return _origSend.apply(this, arguments);\n }\n\n const req = this.__dcReq;\n\n req.startTime = Date.now();\n req.requestBody = serializeRequestBody(body);\n\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\n try {\n const raw = this.getAllResponseHeaders();\n\n if (raw) {\n raw\n .split('\\r\\n')\n .filter(Boolean)\n .forEach(line => {\n const i = line.indexOf(': ');\n\n if (i > 0) {\n req.headers[line.slice(0,i)] = line.slice(i+2);\n }\n });\n }\n } catch(e) {}\n\n req.error = this.status === 0\n ? 'Request failed'\n : null;\n\n /*\n * Never attempt responseText for binary response types.\n */\n try {\n const responseType = this.responseType || '';\n\n if (\n responseType === '' ||\n responseType === 'text'\n ) {\n const contentType = req.headers['content-type'] || '';\n\n if (shouldCaptureTextBody(contentType)) {\n req.responseBody = this.responseText || null;\n }\n }\n } catch(e) {}\n\n addNetReq(req);\n });\n\n return _origSend.apply(this, arguments);\n };\n\n function addNetReq(req) {\n S.network.unshift(req);\n\n if (S.network.length > S.settings.maxEntries) {\n S.network.pop();\n }\n\n persistBuffer();\n\n updateTabCount('network', S.network.length);\n\n if (S.activeTab === 'network') {\n renderNetwork();\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 11. NETWORK RENDERING\n // ═══════════════════════════════════════════════════════════════\n\n function renderNetwork(filter) {\n const o = el.netOut();\n if (!o) return;\n\n filter = filter !== undefined\n ? filter\n : (el.netFlt() ? el.netFlt().value : '');\n\n const needle = filter.trim().toLowerCase();\n\n const filtered = needle\n ? S.network.filter(r =>\n String(r.url).toLowerCase().includes(needle) ||\n String(r.method).toLowerCase().includes(needle)\n )\n : S.network;\n\n o.innerHTML = '';\n\n if (!filtered.length) {\n o.innerHTML = '<div class=\"dc-empty\">No requests captured yet</div>';\n return;\n }\n\n filtered.forEach(req => {\n o.appendChild(createNetworkEntry(req));\n });\n }\n\n function createNetworkEntry(req) {\n const card = document.createElement('div');\n card.className = 'dc-req';\n\n const top = document.createElement('div');\n top.className = 'dc-req-top';\n\n const method = document.createElement('span');\n method.className = `dc-method ${methodClass(req.method)}`;\n method.textContent = req.method;\n\n const url = document.createElement('span');\n url.className = 'dc-req-url';\n url.title = req.url;\n url.textContent = truncUrl(req.url);\n\n const status = document.createElement('span');\n status.className = `dc-req-status ${\n req.error ? 's-err' : statusClass(req.status)\n }`;\n\n status.textContent = req.status\n ? String(req.status)\n : req.error\n ? 'ERR'\n : '…';\n\n top.appendChild(method);\n top.appendChild(url);\n top.appendChild(status);\n\n const meta = document.createElement('div');\n meta.className = 'dc-req-meta';\n\n const dur = req.duration != null\n ? `${req.duration}ms · `\n : '';\n\n meta.textContent =\n `${dur}${req.ts}` +\n (req.error ? ` · ${req.error}` : '');\n\n const detail = document.createElement('div');\n detail.className = 'dc-req-detail';\n\n buildNetworkDetail(detail, req);\n\n card.appendChild(top);\n card.appendChild(meta);\n card.appendChild(detail);\n\n card.addEventListener('click', e => {\n /*\n * Do not collapse when interacting with body \"show full\".\n */\n if (e.target.closest('.dc-body-toggle')) return;\n\n const open = detail.classList.toggle('open');\n card.classList.toggle('expanded', open);\n });\n\n return card;\n }\n\n function buildNetworkDetail(detail, req) {\n addDetailSection(detail, 'General', [\n ['URL', req.url],\n ['Method', req.method],\n ['Status', `${req.status || req.error || '–'} ${req.statusText || ''}`],\n ['Duration', req.duration != null ? `${req.duration}ms` : '–']\n ]);\n\n addHeaderSection(\n detail,\n 'Request Headers',\n req.requestHeaders\n );\n\n addBodySection(\n detail,\n 'Request Body',\n req.requestBody\n );\n\n addHeaderSection(\n detail,\n 'Response Headers',\n req.headers\n );\n\n addBodySection(\n detail,\n 'Response Body',\n req.responseBody\n );\n }\n\n function addDetailSection(parent, title, rows) {\n const section = document.createElement('div');\n section.className = 'dc-detail-section';\n\n const heading = document.createElement('div');\n heading.className = 'dc-detail-title';\n heading.textContent = title;\n\n section.appendChild(heading);\n\n rows.forEach(([key, value]) => {\n const row = document.createElement('div');\n row.className = 'dc-detail-row';\n\n const keyEl = document.createElement('span');\n keyEl.className = 'dc-detail-key';\n keyEl.textContent = `${key}: `;\n\n row.appendChild(keyEl);\n row.appendChild(document.createTextNode(String(value ?? '–')));\n\n section.appendChild(row);\n });\n\n parent.appendChild(section);\n }\n\n function addHeaderSection(parent, title, headers) {\n const section = document.createElement('div');\n section.className = 'dc-detail-section';\n\n const heading = document.createElement('div');\n heading.className = 'dc-detail-title';\n heading.textContent = title;\n\n section.appendChild(heading);\n\n const entries = headers\n ? Object.entries(headers)\n : [];\n\n if (!entries.length) {\n const empty = document.createElement('div');\n empty.className = 'dc-detail-row';\n empty.style.color = 'var(--dc-text2)';\n empty.textContent = 'none';\n section.appendChild(empty);\n } else {\n entries.forEach(([key, value]) => {\n const row = document.createElement('div');\n row.className = 'dc-detail-row';\n\n const keyEl = document.createElement('span');\n keyEl.className = 'dc-detail-key';\n keyEl.textContent = `${key}: `;\n\n row.appendChild(keyEl);\n row.appendChild(document.createTextNode(String(value)));\n\n section.appendChild(row);\n });\n }\n\n parent.appendChild(section);\n }\n\n function addBodySection(parent, title, body) {\n if (body == null || body === '') return;\n\n const section = document.createElement('div');\n section.className = 'dc-detail-section';\n\n const heading = document.createElement('div');\n heading.className = 'dc-detail-title';\n heading.textContent = title;\n\n section.appendChild(heading);\n\n const block = document.createElement('div');\n block.className = 'dc-body-block';\n\n const text = String(body);\n\n if (text.length <= BODY_DISPLAY_LIMIT) {\n const pre = document.createElement('pre');\n pre.className = 'dc-body-pre';\n pre.textContent = formatBodyForDisplay(text);\n block.appendChild(pre);\n } else {\n const preview = document.createElement('pre');\n preview.className = 'dc-body-pre';\n preview.textContent =\n formatBodyForDisplay(text.slice(0, BODY_DISPLAY_LIMIT)) +\n '\\n…';\n\n const full = document.createElement('pre');\n full.className = 'dc-body-full';\n full.textContent = formatBodyForDisplay(text);\n\n const note = document.createElement('div');\n note.className = 'dc-body-truncated';\n note.textContent =\n `Showing first 10 KB of ${formatBytes(text.length)}.`;\n\n const toggle = document.createElement('button');\n toggle.className = 'dc-body-toggle';\n toggle.textContent = 'Show full';\n\n toggle.addEventListener('click', e => {\n e.stopPropagation();\n\n const open = full.classList.toggle('open');\n\n toggle.textContent = open\n ? 'Hide full'\n : 'Show full';\n });\n\n block.appendChild(preview);\n block.appendChild(note);\n block.appendChild(toggle);\n block.appendChild(full);\n }\n\n section.appendChild(block);\n parent.appendChild(section);\n }\n\n function formatBodyForDisplay(text) {\n const trimmed = text.trim();\n\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch(e) {}\n }\n\n return text;\n }\n\n function formatBytes(bytes) {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 12. PERSISTENT BUFFER\n // ═══════════════════════════════════════════════════════════════\n\n function persistBuffer() {\n if (!S.settings.persistBuffer) return;\n\n try {\n const payload = {\n version: VERSION,\n savedAt: Date.now(),\n logs: S.logs.slice(-S.settings.maxEntries),\n network: S.network.slice(0, S.settings.maxEntries)\n };\n\n sessionStorage.setItem(\n BUFFER_KEY,\n JSON.stringify(payload)\n );\n } catch(e) {\n /*\n * Storage may fail due to quota/private browsing/etc.\n * Debugging must never break the application.\n */\n }\n }\n\n function restoreBuffer() {\n if (!S.settings.persistBuffer) return;\n\n try {\n const raw = sessionStorage.getItem(BUFFER_KEY);\n if (!raw) return;\n\n const payload = JSON.parse(raw);\n\n if (!payload || typeof payload !== 'object') return;\n\n if (Array.isArray(payload.logs)) {\n S.logs = payload.logs.map(log => ({\n ...log,\n restored: true\n }));\n }\n\n if (Array.isArray(payload.network)) {\n S.network = payload.network;\n }\n\n S.logs.forEach(log => {\n if (log.id >= S.nextLogId) {\n S.nextLogId = log.id + 1;\n }\n });\n\n /*\n * Restored entries should be followed by a new reload\n * separator. The separator is generated visually when a\n * fresh entry follows restored entries.\n */\n updateTabCount('console', S.logs.length);\n updateTabCount('network', S.network.length);\n } catch(e) {\n try {\n sessionStorage.removeItem(BUFFER_KEY);\n } catch(err) {}\n }\n }\n\n function clearPersistentBuffer() {\n try {\n sessionStorage.removeItem(BUFFER_KEY);\n } catch(e) {}\n }\n\n restoreBuffer();\n\n // ═══════════════════════════════════════════════════════════════\n // 13. STORAGE\n // ═══════════════════════════════════════════════════════════════\n\n async function loadStorage() {\n S.dbs = [];\n\n if (!window.indexedDB) return;\n\n try {\n if (indexedDB.databases) {\n const list = await indexedDB.databases();\n\n for (const d of list) {\n try {\n await inspectDb(d.name, d.version);\n } catch(e) {}\n }\n }\n } catch(e) {}\n\n renderStorage();\n }\n\n function inspectDb(name, version) {\n return new Promise((res, rej) => {\n const req = indexedDB.open(name, version);\n\n req.onerror = () => rej(req.error);\n\n req.onsuccess = () => {\n const db = req.result;\n\n const info = {\n name: db.name,\n version: db.version,\n stores: []\n };\n\n const storeNames = [...db.objectStoreNames];\n let pending = storeNames.length;\n\n if (!pending) {\n db.close();\n S.dbs.push(info);\n return res(info);\n }\n\n storeNames.forEach(storeName => {\n inspectStore(db, storeName)\n .then(storeInfo => {\n info.stores.push(storeInfo);\n\n if (--pending === 0) {\n db.close();\n S.dbs.push(info);\n res(info);\n }\n })\n .catch(() => {\n info.stores.push({\n name: storeName,\n count: 0,\n keyPath: null,\n data: []\n });\n\n if (--pending === 0) {\n db.close();\n S.dbs.push(info);\n res(info);\n }\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\n const cntReq = store.count();\n\n cntReq.onsuccess = () => {\n const info = {\n name: storeName,\n count: cntReq.result,\n keyPath: store.keyPath,\n data: []\n };\n\n const getReq = store.getAll(undefined, 20);\n\n getReq.onsuccess = () => {\n info.data = getReq.result;\n res(info);\n };\n\n getReq.onerror = () => res(info);\n };\n\n cntReq.onerror = () => res({\n name: storeName,\n count: 0,\n keyPath: null,\n data: []\n });\n });\n }\n\n function renderStorage() {\n const o = el.storOut();\n if (!o) return;\n\n switch(S.activeStorage) {\n case 'indexeddb':\n renderIDB(o);\n break;\n\n case 'localstorage':\n renderKV(o, localStorage, 'localStorage');\n break;\n\n case 'sessionstorage':\n renderKV(o, sessionStorage, 'sessionStorage');\n break;\n }\n }\n\n function renderIDB(o) {\n if (!S.dbs.length) {\n o.innerHTML =\n '<div class=\"dc-empty\">No IndexedDB databases found</div>';\n return;\n }\n\n o.innerHTML = S.dbs.map((db, di) => `\n <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\">\n v${db.version} ·\n ${db.stores.length}\n store${db.stores.length !== 1 ? 's' : ''}\n </div>\n </div>\n <span style=\"color:var(--dc-text2);font-size:11px\">▼</span>\n </div>\n\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\">\n ${st.count} records ·\n keyPath: ${st.keyPath || 'none'}\n </div>\n\n <div class=\"dc-data-viewer\" id=\"store-${di}-${si}\">\n ${\n st.data.length\n ? st.data.slice(0,20).map(item => `\n <div class=\"dc-data-row\">\n <div class=\"dc-data-key\">\n · ${escHtml(getKey(item, st.keyPath))}\n </div>\n <div class=\"dc-data-val\">\n ${escHtml(fmtVal(item))}\n </div>\n </div>\n `).join('')\n : '<div style=\"color:var(--dc-text2);font-size:11px;padding:8px\">Empty store</div>'\n }\n </div>\n </div>\n `).join('')}\n </div>\n </div>\n `).join('');\n }\n\n function getKey(obj, keyPath) {\n if (!keyPath) return '—';\n\n return typeof keyPath === 'string'\n ? String(obj[keyPath] ?? '—')\n : JSON.stringify(keyPath);\n }\n\n function fmtVal(v) {\n if (typeof v === 'object' && v !== null) {\n try {\n const s = JSON.stringify(v, null, 2);\n return s.length > 300\n ? s.slice(0,300) + '…'\n : s;\n } catch(e) {\n return '[Unserializable]';\n }\n }\n\n const s = String(v);\n\n return s.length > 200\n ? s.slice(0,200) + '…'\n : s;\n }\n\n window.__dcToggleDb = function(di) {\n const card = document.getElementById(`db-card-${di}`);\n\n if (card) {\n card.classList.toggle('open');\n }\n };\n\n window.__dcToggleStore = function(di, si) {\n const viewer =\n document.getElementById(`store-${di}-${si}`);\n\n if (viewer) {\n viewer.classList.toggle('open');\n }\n };\n\n // ═══════════════════════════════════════════════════════════════\n // 14. DOM TREE\n // ═══════════════════════════════════════════════════════════════\n\n function renderDomTree() {\n const o = el.domOut();\n if (!o) return;\n\n o.innerHTML = '';\n\n const tree = document.createElement('div');\n tree.className = 'dc-tree';\n\n tree.appendChild(buildNode(document.body));\n\n o.appendChild(tree);\n }\n\n function buildNode(nodeEl) {\n const wrap = document.createElement('div');\n\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 (\n nodeEl.className &&\n typeof nodeEl.className === 'string' &&\n nodeEl.className.trim()\n ) {\n const cls = document.createElement('span');\n cls.className = 'dc-cls';\n\n const clsStr = nodeEl.className\n .trim()\n .split(/\\s+/)\n .slice(0,3)\n .map(c => `.${c}`)\n .join('');\n\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\n ? [...nodeEl.childNodes]\n .find(n =>\n n.nodeType === 3 &&\n n.textContent.trim()\n )\n : null;\n\n if (txtContent) {\n const preview = document.createElement('span');\n preview.className = 'dc-txt-preview';\n preview.textContent =\n ' ' +\n txtContent.textContent\n .trim()\n .slice(0,30);\n\n label.appendChild(preview);\n }\n\n label.addEventListener('click', e => {\n e.stopPropagation();\n\n if (hasChildren) {\n const childDiv =\n wrap.querySelector(':scope > .dc-children');\n\n const isOpen =\n childDiv &&\n childDiv.classList.contains('open');\n\n if (childDiv) {\n childDiv.classList.toggle('open', !isOpen);\n }\n\n arrow.textContent = !isOpen ? '▼' : '▶';\n }\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\n children.forEach(child => {\n childDiv.appendChild(buildNode(child));\n });\n\n wrap.appendChild(childDiv);\n }\n\n return wrap;\n }\n\n function showNodeDetail(targetEl) {\n const existing =\n document.getElementById('dc-node-detail');\n\n if (existing) existing.remove();\n\n const d = document.createElement('div');\n\n d.className = 'dc-node-detail';\n d.id = 'dc-node-detail';\n\n const tag =\n `<${targetEl.tagName.toLowerCase()}>`;\n\n const attrs = [...targetEl.attributes];\n const styles = window.getComputedStyle(targetEl);\n\n d.innerHTML = `\n <div style=\"color:var(--dc-accent2);font-size:12px;font-weight:700;margin-bottom:8px\">\n ${escHtml(tag)}\n </div>\n\n ${\n attrs.length\n ? `\n <div class=\"dc-detail-title\">Attributes</div>\n ${\n attrs.map(a => `\n <div class=\"dc-attr-row\">\n <span class=\"dc-attr-name\">${escHtml(a.name)}</span>=\n <span class=\"dc-attr-val\">\"${escHtml(a.value)}\"</span>\n </div>\n `).join('')\n }\n `\n : ''\n }\n\n <div class=\"dc-detail-title\" style=\"margin-top:8px\">\n Geometry\n </div>\n\n <div class=\"dc-attr-row\">\n <span class=\"dc-attr-name\">size: </span>\n <span class=\"dc-attr-val\">\n ${Math.round(targetEl.offsetWidth)}×${Math.round(targetEl.offsetHeight)}\n </span>\n </div>\n\n <div class=\"dc-attr-row\">\n <span class=\"dc-attr-name\">display: </span>\n <span class=\"dc-attr-val\">${styles.display}</span>\n </div>\n\n <div class=\"dc-attr-row\">\n <span class=\"dc-attr-name\">position: </span>\n <span class=\"dc-attr-val\">${styles.position}</span>\n </div>\n `;\n\n el.domOut().prepend(d);\n }\n\n let _pickHandler = null;\n let _pickHoverHandler = null;\n let _pickedEl = null;\n\n function startPicking() {\n S.isPicking = true;\n\n const button =\n document.getElementById('dom-pick-btn');\n\n if (button) button.classList.add('picking');\n\n _pickHandler = e => {\n if (\n e.target.closest('#dc-panel') ||\n e.target.closest('#dc-fab')\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n if (_pickedEl) {\n _pickedEl.classList.remove('dc-pick-highlight');\n }\n\n _pickedEl = e.target;\n _pickedEl.classList.add('dc-pick-highlight');\n\n showNodeDetail(_pickedEl);\n stopPicking();\n };\n\n _pickHoverHandler = e => {\n if (!S.isPicking) return;\n\n if (\n e.target.closest('#dc-panel') ||\n e.target.closest('#dc-fab')\n ) {\n return;\n }\n\n if (_pickedEl) {\n _pickedEl.classList.remove('dc-pick-highlight');\n }\n\n _pickedEl = e.target;\n _pickedEl.classList.add('dc-pick-highlight');\n };\n\n document.addEventListener(\n 'click',\n _pickHandler,\n true\n );\n\n document.addEventListener(\n 'mouseover',\n _pickHoverHandler,\n true\n );\n }\n\n function stopPicking() {\n S.isPicking = false;\n\n const button =\n document.getElementById('dom-pick-btn');\n\n if (button) {\n button.classList.remove('picking');\n }\n\n if (_pickHandler) {\n document.removeEventListener(\n 'click',\n _pickHandler,\n true\n );\n\n _pickHandler = null;\n }\n\n if (_pickHoverHandler) {\n document.removeEventListener(\n 'mouseover',\n _pickHoverHandler,\n true\n );\n\n _pickHoverHandler = null;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 15. SYSTEM INFO\n // ═══════════════════════════════════════════════════════════════\n\n function renderSystem() {\n const o = el.sysOut();\n if (!o) return;\n\n const nav = navigator;\n const perf = window.performance;\n const mem = perf && perf.memory;\n const conn =\n nav.connection ||\n nav.mozConnection ||\n 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([\n 'Connection',\n `${conn.effectiveType || '—'} · ${conn.downlink || '—'} Mbps`\n ]);\n\n cards.push([\n 'RTT',\n conn.rtt != null ? `${conn.rtt}ms` : '—'\n ]);\n }\n\n if (mem) {\n const mb = v =>\n (v / 1048576).toFixed(1) + ' MB';\n\n cards.push([\n 'Heap Used',\n mb(mem.usedJSHeapSize)\n ]);\n\n cards.push([\n 'Heap Limit',\n mb(mem.jsHeapSizeLimit)\n ]);\n }\n\n if (perf) {\n const nav2 =\n perf.getEntriesByType &&\n perf.getEntriesByType('navigation')[0];\n\n if (nav2) {\n cards.push([\n 'Page Load',\n `${Math.round(nav2.loadEventEnd)}ms`\n ]);\n\n cards.push([\n 'DOM Ready',\n `${Math.round(nav2.domContentLoadedEventEnd)}ms`\n ]);\n }\n }\n\n o.innerHTML =\n cards.map(([label, val]) => `\n <div class=\"dc-sys-card\">\n <div class=\"dc-sys-label\">${escHtml(label)}</div>\n <div class=\"dc-sys-val\">${escHtml(String(val))}</div>\n </div>\n `).join('') +\n\n `\n <div class=\"dc-sys-card dc-sys-full\">\n <div class=\"dc-sys-label\">User Agent</div>\n <div\n class=\"dc-sys-val\"\n style=\"word-break:break-all;font-size:10px\"\n >\n ${escHtml(nav.userAgent)}\n </div>\n </div>\n `;\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 16. SETTINGS\n // ═══════════════════════════════════════════════════════════════\n\n function makeToggle(id, name, desc, checked) {\n return `\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">${name}</div>\n <div class=\"dc-setting-desc\">${desc}</div>\n </div>\n <label class=\"dc-toggle\">\n <input type=\"checkbox\" id=\"${id}\" ${checked ? 'checked' : ''}>\n <span class=\"dc-toggle-track\"></span>\n </label>\n </div>`;\n }\n\n function makeSelect(id, name, desc, options, current) {\n return `\n <div class=\"dc-setting-row\">\n <div class=\"dc-setting-info\">\n <div class=\"dc-setting-name\">${name}</div>\n <div class=\"dc-setting-desc\">${desc}</div>\n </div>\n <select class=\"dc-select\" id=\"${id}\">\n ${options.map(v => `<option value=\"${v}\" ${current === v ? 'selected' : ''}>${v}</option>`).join('')}\n </select>\n </div>`;\n }\n\n function renderSettings() {\n const o = el.settOut();\n if (!o) return;\n\n const ss = S.settings;\n\n o.innerHTML =\n makeToggle('s-ts', 'Timestamps', 'Show time prefix on each log entry', ss.timestamps) +\n makeToggle('s-as', 'Auto-scroll', 'Scroll to latest entry automatically', ss.autoScroll) +\n makeToggle('s-ce', 'Capture Global Errors','window.onerror + unhandledrejection', ss.captureErrors) +\n makeToggle('s-mn', 'Monitor Network', 'Intercept fetch + XHR requests', ss.monitorNetwork) +\n makeToggle('s-pb', 'Persist Across Reload','Keep console and network history in sessionStorage', ss.persistBuffer) +\n makeSelect('s-fs', 'Font Size', 'Console output font size (px)', [10,11,12,13,14], ss.fontSize) +\n makeSelect('s-me', 'Max Log Entries', 'Older entries are discarded', [100,250,500,1000,2000], ss.maxEntries) +\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, network history and persistent buffer</div>\n </div>\n <button class=\"dc-clear-btn\" id=\"dc-settings-clear\">Clear</button>\n </div>`;\n\n document.getElementById('s-ts').onchange = e => { ss.timestamps = e.target.checked; saveSettings(); renderConsole(); };\n document.getElementById('s-as').onchange = e => { ss.autoScroll = e.target.checked; saveSettings(); };\n document.getElementById('s-ce').onchange = e => { ss.captureErrors = e.target.checked; saveSettings(); };\n document.getElementById('s-mn').onchange = e => { ss.monitorNetwork= e.target.checked; saveSettings(); };\n document.getElementById('s-pb').onchange = e => {\n ss.persistBuffer = e.target.checked;\n saveSettings();\n ss.persistBuffer ? persistBuffer() : clearPersistentBuffer();\n };\n document.getElementById('s-fs').onchange = e => {\n ss.fontSize = parseInt(e.target.value, 10);\n saveSettings();\n if (S.activeTab === 'console') renderConsole();\n };\n document.getElementById('s-me').onchange = e => {\n ss.maxEntries = parseInt(e.target.value, 10);\n trimLogs();\n if (S.network.length > ss.maxEntries) S.network = S.network.slice(0, ss.maxEntries);\n saveSettings();\n persistBuffer();\n updateTabCount('console', S.logs.length);\n updateTabCount('network', S.network.length);\n renderConsole();\n };\n document.getElementById('dc-settings-clear').addEventListener('click', window.__dcClearAll);\n }\n\n\n\n window.__dcClearAll = function() {\n S.logs = [];\n S.network = [];\n S.errorCount = 0;\n S.groupDepth = 0;\n\n clearPersistentBuffer();\n\n const b = el.badge();\n\n if (b) {\n b.style.display = 'none';\n b.textContent = '0';\n }\n\n updateTabCount('console', 0);\n updateTabCount('network', 0);\n\n renderConsole();\n renderNetwork();\n };\n\n // ═══════════════════════════════════════════════════════════════\n // 17. TABS\n // ═══════════════════════════════════════════════════════════════\n\n function switchTab(name) {\n S.activeTab = name;\n\n document.querySelectorAll('.dc-tab')\n .forEach(b =>\n b.classList.toggle(\n 'active',\n b.dataset.tab === name\n )\n );\n\n document.querySelectorAll('.dc-panel-content')\n .forEach(p =>\n p.classList.toggle(\n 'active',\n p.id === `panel-${name}`\n )\n );\n\n switch(name) {\n case 'console':\n renderConsole();\n break;\n\n case 'network':\n renderNetwork();\n break;\n\n case 'storage':\n loadStorage();\n break;\n\n case 'dom':\n renderDomTree();\n break;\n\n case 'system':\n renderSystem();\n break;\n\n case 'settings':\n renderSettings();\n break;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 18. PANEL TOGGLE\n // ═══════════════════════════════════════════════════════════════\n\n let _panelOpen = false;\n\n function updateFab() {\n const fab = el.fab();\n if (!fab) return;\n\n fab.innerHTML =\n `${_panelOpen ? '✕' : '⌥'}` +\n `<span class=\"dc-fab-badge\" id=\"dc-error-badge\" ` +\n `style=\"display:${S.errorCount > 0 ? 'flex' : 'none'}\">` +\n `${S.errorCount}` +\n `</span>`;\n }\n\n function togglePanel() {\n _panelOpen = !_panelOpen;\n\n const panel = el.panel();\n\n if (_panelOpen) {\n panel.style.display = 'flex';\n\n requestAnimationFrame(() => {\n panel.classList.add('visible');\n });\n\n switchTab(S.activeTab);\n } else {\n panel.classList.remove('visible');\n\n setTimeout(() => {\n if (!_panelOpen) {\n panel.style.display = 'none';\n }\n }, 260);\n }\n\n updateFab();\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 19. DRAG RESIZE\n // ═══════════════════════════════════════════════════════════════\n\n (function initDrag() {\n const handle =\n document.getElementById('dc-drag');\n\n const panel =\n document.getElementById('dc-panel');\n\n let dragging = false;\n let startY = 0;\n let startH = 0;\n\n function onStart(e) {\n dragging = true;\n\n startY =\n e.clientY ||\n (e.touches && e.touches[0].clientY);\n\n startH = panel.offsetHeight;\n\n document.body.style.userSelect = 'none';\n }\n\n function onMove(e) {\n if (!dragging) return;\n\n const y =\n e.clientY ||\n (e.touches && e.touches[0].clientY);\n\n const newH = Math.max(\n 120,\n Math.min(\n window.innerHeight * 0.85,\n startH + (startY - y)\n )\n );\n\n panel.style.height = newH + 'px';\n }\n\n function onEnd() {\n dragging = false;\n document.body.style.userSelect = '';\n }\n\n handle.addEventListener(\n 'mousedown',\n onStart\n );\n\n handle.addEventListener(\n 'touchstart',\n onStart,\n { passive: true }\n );\n\n document.addEventListener(\n 'mousemove',\n onMove\n );\n\n document.addEventListener(\n 'touchmove',\n onMove,\n { passive: true }\n );\n\n document.addEventListener(\n 'mouseup',\n onEnd\n );\n\n document.addEventListener(\n 'touchend',\n onEnd\n );\n })();\n\n // ═══════════════════════════════════════════════════════════════\n // 20. REPL\n // ═══════════════════════════════════════════════════════════════\n\n function initRepl() {\n const input = el.replIn();\n\n if (!input) return;\n\n function execute() {\n const code = input.value.trim();\n\n if (!code) return;\n\n S.replHistory.unshift(code);\n\n if (S.replHistory.length > 50) {\n S.replHistory.pop();\n }\n\n S.replHistoryIdx = -1;\n\n const entry = document.createElement('div');\n\n entry.className =\n 'dc-entry dc-entry-cmd';\n\n entry.style.fontSize =\n S.settings.fontSize + 'px';\n\n if (S.settings.timestamps) {\n const timestamp = document.createElement('span');\n timestamp.className = 'dc-ts';\n timestamp.textContent = ts();\n entry.appendChild(timestamp);\n }\n\n const body = document.createElement('span');\n body.className = 'dc-entry-body';\n\n body.textContent = `▶ ${code}`;\n\n entry.appendChild(body);\n\n el.consOut().appendChild(entry);\n\n try {\n const result = (0, eval)(code);\n\n if (result !== undefined) {\n const resEntry =\n document.createElement('div');\n\n resEntry.className =\n 'dc-entry dc-entry-log';\n\n resEntry.style.fontSize =\n S.settings.fontSize + 'px';\n\n if (S.settings.timestamps) {\n const timestamp =\n document.createElement('span');\n\n timestamp.className = 'dc-ts';\n timestamp.textContent = ts();\n\n resEntry.appendChild(timestamp);\n }\n\n const resultBody =\n document.createElement('span');\n\n resultBody.className =\n 'dc-entry-body';\n\n resultBody.appendChild(\n renderValue(snapshotValue(result))\n );\n\n resEntry.appendChild(resultBody);\n\n el.consOut().appendChild(resEntry);\n }\n } catch(err) {\n const errEntry =\n document.createElement('div');\n\n errEntry.className =\n 'dc-entry dc-entry-error';\n\n errEntry.style.fontSize =\n S.settings.fontSize + 'px';\n\n if (S.settings.timestamps) {\n const timestamp =\n document.createElement('span');\n\n timestamp.className = 'dc-ts';\n timestamp.textContent = ts();\n\n errEntry.appendChild(timestamp);\n }\n\n const body =\n document.createElement('span');\n\n body.className =\n 'dc-entry-body';\n\n body.appendChild(\n renderValue(snapshotValue(err))\n );\n\n errEntry.appendChild(body);\n\n el.consOut().appendChild(errEntry);\n }\n\n input.value = '';\n\n if (S.settings.autoScroll) {\n el.consOut().scrollTop =\n el.consOut().scrollHeight;\n }\n\n switchTab('console');\n }\n\n input.addEventListener('keydown', e => {\n if (e.key === 'Enter') {\n execute();\n return;\n }\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n\n S.replHistoryIdx =\n Math.min(\n S.replHistoryIdx + 1,\n S.replHistory.length - 1\n );\n\n input.value =\n S.replHistory[S.replHistoryIdx] || '';\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n\n S.replHistoryIdx =\n Math.max(\n S.replHistoryIdx - 1,\n -1\n );\n\n input.value =\n S.replHistoryIdx >= 0\n ? S.replHistory[S.replHistoryIdx]\n : '';\n }\n });\n\n const runBtn =\n document.getElementById('repl-run');\n\n if (runBtn) {\n runBtn.addEventListener(\n 'click',\n execute\n );\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 21. EVENT WIRING\n // ═══════════════════════════════════════════════════════════════\n\n document\n .getElementById('dc-fab')\n .addEventListener(\n 'click',\n togglePanel\n );\n\n document\n .getElementById('dc-minimize-btn')\n .addEventListener(\n 'click',\n togglePanel\n );\n\n document.querySelectorAll('.dc-tab')\n .forEach(btn => {\n btn.addEventListener(\n 'click',\n () => switchTab(btn.dataset.tab)\n );\n });\n\n document\n .getElementById('dc-clear-btn')\n .addEventListener(\n 'click',\n () => {\n switch(S.activeTab) {\n case 'console':\n S.logs = [];\n S.groupDepth = 0;\n clearPersistentBuffer();\n updateTabCount('console', 0);\n renderConsole();\n break;\n\n case 'network':\n S.network = [];\n clearPersistentBuffer();\n updateTabCount('network', 0);\n renderNetwork();\n break;\n\n default:\n break;\n }\n }\n );\n\n document\n .getElementById('dc-copy-btn')\n .addEventListener(\n 'click',\n () => {\n let text = '';\n\n if (S.activeTab === 'console') {\n text = S.logs\n .map(l =>\n `[${l.ts}] [${String(l.type).toUpperCase()}] ${formatLogForCopy(l)}`\n )\n .join('\\n');\n }\n\n else if (S.activeTab === 'network') {\n text = S.network\n .map(r =>\n `[${r.ts}] ${r.method} ${r.url} → ` +\n `${r.status || 'ERR'} (${r.duration}ms)` +\n (r.requestBody\n ? `\\nRequest: ${r.requestBody}`\n : '') +\n (r.responseBody\n ? `\\nResponse: ${r.responseBody}`\n : '')\n )\n .join('\\n\\n');\n }\n\n if (!text) return;\n\n if (\n navigator.clipboard &&\n navigator.clipboard.writeText\n ) {\n navigator.clipboard\n .writeText(text)\n .catch(() => {});\n }\n }\n );\n\n function formatLogForCopy(log) {\n if (log.type === 'table' && log.table) {\n try {\n return JSON.stringify(log.table, null, 2);\n } catch(e) {}\n }\n\n return (log.args || [])\n .map(snapshotToText)\n .join(' ');\n }\n\n function snapshotToText(value) {\n if (!value) return '';\n\n switch(value.kind) {\n case 'string':\n return `\"${value.value}\"`;\n\n case 'null':\n case 'undefined':\n case 'number':\n case 'boolean':\n case 'bigint':\n case 'symbol':\n case 'function':\n return String(value.value ?? value.kind);\n\n case 'date':\n case 'regexp':\n case 'circular':\n return String(value.value || `[${value.kind}]`);\n\n case 'error':\n return `${value.ctor}: ${value.message}`;\n\n case 'array':\n case 'object':\n try {\n return JSON.stringify(value, null, 2);\n } catch(e) {\n return '[Object]';\n }\n\n default:\n return '[Unknown]';\n }\n }\n\n // Network filter\n el.netFlt().addEventListener(\n 'input',\n e => renderNetwork(e.target.value)\n );\n\n document\n .getElementById('net-clear')\n .addEventListener(\n 'click',\n () => {\n S.network = [];\n clearPersistentBuffer();\n updateTabCount('network', 0);\n renderNetwork();\n }\n );\n\n // Storage sub-tabs\n document.querySelectorAll('.dc-st-btn')\n .forEach(btn => {\n btn.addEventListener(\n 'click',\n () => {\n S.activeStorage =\n btn.dataset.storage;\n\n document\n .querySelectorAll('.dc-st-btn')\n .forEach(b =>\n b.classList.toggle(\n 'active',\n b === btn\n )\n );\n\n renderStorage();\n }\n );\n });\n\n document\n .getElementById('storage-refresh')\n .addEventListener(\n 'click',\n loadStorage\n );\n\n // DOM toolbar\n document\n .getElementById('dom-refresh-btn')\n .addEventListener(\n 'click',\n renderDomTree\n );\n\n document\n .getElementById('dom-pick-btn')\n .addEventListener(\n 'click',\n () => {\n S.isPicking\n ? stopPicking()\n : startPicking();\n }\n );\n\n document\n .getElementById('dom-collapse-btn')\n .addEventListener(\n 'click',\n () => {\n document\n .querySelectorAll('.dc-children.open')\n .forEach(c =>\n c.classList.remove('open')\n );\n\n document\n .querySelectorAll('.dc-arrow')\n .forEach(a => {\n if (a.textContent === '▼') {\n a.textContent = '▶';\n }\n });\n }\n );\n\n // ═══════════════════════════════════════════════════════════════\n // 22. SPA NAVIGATION WATCHER\n // ═══════════════════════════════════════════════════════════════\n\n let _lastUrl = location.href;\n\n setInterval(() => {\n if (location.href !== _lastUrl) {\n _lastUrl = location.href;\n\n addLog(\n 'info',\n ['🔄 SPA navigation detected:', location.href]\n );\n }\n }, 1000);\n\n // ═══════════════════════════════════════════════════════════════\n // 23. INIT\n // ═══════════════════════════════════════════════════════════════\n\n initRepl();\n\n renderConsole();\n\n /*\n * Only generate the startup entry for a genuinely new session.\n * If persisted entries were restored, the separator is more useful\n * than another generic startup log.\n */\n if (!S.logs.length) {\n addLog(\n 'log',\n [`✅ INSIKT v${VERSION} loaded — click ⌥ to open`]\n );\n } else {\n /*\n * Mark all restored entries and then add a new live entry.\n * renderConsole() will place the separator between them.\n */\n S.logs.forEach(log => {\n log.restored = true;\n });\n\n addLog(\n 'info',\n [`🔄 INSIKT v${VERSION} resumed after reload`]\n );\n }\n\n // ═══════════════════════════════════════════════════════════════\n // 24. PUBLIC API\n // ═══════════════════════════════════════════════════════════════\n\n window.insikt = {\n version: VERSION,\n\n toggle: togglePanel,\n\n clear: window.__dcClearAll,\n\n init: () => {\n /*\n * Already initialized automatically.\n * Kept for API compatibility.\n */\n },\n\n destroy: () => {\n const fab = el.fab();\n const panel = el.panel();\n\n if (fab) fab.remove();\n if (panel) panel.remove();\n\n ['log','warn','error','info','table','group','groupCollapsed','groupEnd']\n .forEach(level => {\n if (_orig[level]) {\n console[level] = _orig[level];\n }\n });\n\n if (_origFetch) {\n window.fetch = _origFetch;\n }\n\n XMLHttpRequest.prototype.open = _origOpen;\n XMLHttpRequest.prototype.send = _origSend;\n XMLHttpRequest.prototype.setRequestHeader =\n _origSetRequestHeader;\n\n window.onerror = _origOnError;\n\n window.removeEventListener(\n 'unhandledrejection',\n onUnhandledRejection\n );\n\n stopPicking();\n\n if (style && style.parentNode) {\n style.parentNode.removeChild(style);\n }\n\n delete window.__dcToggleReq;\n delete window.__dcToggleDb;\n delete window.__dcToggleStore;\n delete window.__dcClearAll;\n\n delete window.insikt;\n }\n };\n\n})();\n"],"names":["VERSION","BUFFER_KEY","SETTINGS_KEY","style","document","createElement","textContent","head","appendChild","body","insertAdjacentHTML","S","logs","network","dbs","activeTab","activeStorage","isPicking","replHistory","replHistoryIdx","errorCount","groupDepth","nextLogId","settings","timestamps","autoScroll","maxEntries","fontSize","monitorNetwork","captureErrors","persistBuffer","theme","saveSettings","localStorage","setItem","JSON","stringify","e","saved","getItem","parsed","parse","loadSettings","el","getElementById","ts","d","Date","String","getHours","padStart","getMinutes","getSeconds","getMilliseconds","escHtml","s","replace","updateTabCount","tab","n","el2","display","SNAPSHOT_KEYS","snapshotValue","value","depth","seen","WeakSet","kind","type","Number","isNaN","Infinity","toString","name","has","ctor","getConstructorName","entries","truncated","add","getTime","toISOString","RegExp","Error","result","message","stack","Object","keys","slice","forEach","key","push","Array","isArray","length","limit","Math","min","i","index","delete","constructor","snapshotArgs","args","map","a","renderValue","options","node","className","classList","renderExpandableValue","summary","wrap","toggle","arrow","children","entry","row","more","whiteSpace","marginTop","addEventListener","stopPropagation","open","renderArgsInto","container","arg","createTextNode","_orig","addLog","b","id","restored","trimLogs","renderConsole","addGroupLog","collapsed","buildTableSnapshot","source","tabular","rows","cells","max","shift","o","innerHTML","frag","createDocumentFragment","previousRestored","skipUntil","log","separator","createReloadSeparator","createConsoleEntry","dataset","groupEnd","parseInt","scrollTop","scrollHeight","label","timestamp","end","candidate","findGroupEnd","childFrag","child","createGroupEntry","tableData","table","columns","Set","columnList","thead","headRow","indexHead","column","th","tbody","tr","indexCell","td","note","createTableEntry","level","console","bind","addTableLog","group","groupCollapsed","_origOnError","window","onerror","onUnhandledRejection","reason","msg","src","line","col","error","apply","this","arguments","_origFetch","fetch","isBinaryContentType","contentType","toLowerCase","includes","shouldCaptureTextBody","serializeRequestBody","URLSearchParams","FormData","File","size","Blob","ArrayBuffer","isView","async","startTime","now","method","url","Request","toUpperCase","req","status","statusText","duration","headers","requestHeaders","requestBody","responseBody","v","k","input","init","clone","bodyUsed","get","text","captureRequestBody","res","addNetReq","response","captureResponseBody","then","renderNetwork","catch","_origOpen","XMLHttpRequest","prototype","_origSend","send","__dcReq","_origSetRequestHeader","setRequestHeader","unshift","pop","filter","needle","trim","filtered","r","card","top","m","title","u","URL","tail","pathname","split","hostname","truncUrl","code","meta","dur","detail","parent","section","heading","keyEl","addDetailSection","addHeaderSection","addBodySection","buildNetworkDetail","target","closest","createNetworkEntry","empty","color","block","pre","formatBodyForDisplay","preview","full","bytes","toFixed","trimmed","startsWith","endsWith","payload","version","savedAt","sessionStorage","clearPersistentBuffer","removeItem","loadStorage","indexedDB","databases","list","inspectDb","renderStorage","Promise","rej","onsuccess","db","info","stores","storeNames","objectStoreNames","pending","close","storeName","store","transaction","objectStore","cntReq","count","keyPath","data","getReq","getAll","inspectStore","storeInfo","di","st","si","item","obj","fmtVal","join","renderIDB","renderKV","renderDomTree","tree","buildNode","nodeEl","hasChildren","tag","tagName","cls","clsStr","c","txtContent","childNodes","find","nodeType","childDiv","querySelector","isOpen","contains","showNodeDetail","targetEl","existing","remove","attrs","attributes","styles","getComputedStyle","round","offsetWidth","offsetHeight","position","prepend","raw","getAllResponseHeaders","Boolean","indexOf","responseType","responseText","err","restoreBuffer","__dcToggleDb","__dcToggleStore","viewer","_pickHandler","_pickHoverHandler","_pickedEl","stopPicking","button","removeEventListener","makeToggle","desc","checked","makeSelect","current","switchTab","querySelectorAll","p","nav","navigator","perf","performance","mem","memory","conn","connection","mozConnection","webkitConnection","cards","screen","width","height","devicePixelRatio","innerWidth","innerHeight","platform","language","onLine","cookieEnabled","hardwareConcurrency","effectiveType","downlink","rtt","mb","usedJSHeapSize","jsHeapSizeLimit","nav2","getEntriesByType","loadEventEnd","domContentLoadedEventEnd","val","userAgent","renderSystem","ss","onchange","__dcClearAll","renderSettings","_panelOpen","togglePanel","panel","requestAnimationFrame","setTimeout","fab","updateFab","snapshotToText","handle","dragging","startY","startH","onStart","clientY","touches","userSelect","onMove","y","newH","onEnd","passive","btn","l","formatLogForCopy","clipboard","writeText","storage","preventDefault","startPicking","_lastUrl","location","href","setInterval","execute","eval","resEntry","resultBody","errEntry","runBtn","initRepl","insikt","clear","destroy","parentNode","removeChild","__dcToggleReq"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insikt.js",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "A mobile-first in-browser developer console and debugging overlay.",
5
5
  "license": "MIT",
6
6
  "type": "module",