insikt.js 1.1.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.
- package/README.md +110 -78
- package/dist/insikt.es.js +2117 -414
- package/dist/insikt.es.js.map +1 -1
- package/dist/insikt.umd.js +1 -1
- package/dist/insikt.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/insikt.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(n){"function"==typeof define&&define.amd?define(n):n()}(function(){"use strict";!function(){const n=document.createElement("style");n.textContent="\n @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Syne:wght@400;600;700;800&display=swap');\n\n :root {\n --dc-bg0: #0d0d0f;\n --dc-bg1: #141418;\n --dc-bg2: #1c1c22;\n --dc-bg3: #242430;\n --dc-border: #2a2a38;\n --dc-accent: #7c6af7;\n --dc-accent2: #f768a4;\n --dc-green: #3dffa0;\n --dc-orange: #ffb347;\n --dc-red: #ff5c6e;\n --dc-blue: #5bcefa;\n --dc-text0: #f0f0f8;\n --dc-text1: #a8a8c0;\n --dc-text2: #606078;\n --dc-mono: 'JetBrains Mono', monospace;\n --dc-sans: 'Syne', sans-serif;\n }\n\n /* Scope resets strictly to our elements */\n #dc-panel, #dc-fab { box-sizing: border-box; }\n #dc-panel *, #dc-fab * { box-sizing: inherit; }\n\n /* ── FAB ────────────────────────────── */\n #dc-fab {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 44px;\n height: 44px;\n border-radius: 12px;\n background: var(--dc-accent);\n color: #fff;\n border: none;\n font-size: 18px;\n cursor: pointer;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 24px rgba(124,106,247,0.5);\n transition: all 0.2s ease;\n font-family: var(--dc-mono);\n padding: 0;\n margin: 0;\n }\n\n #dc-fab:hover { transform: scale(1.05); box-shadow: 0 6px 30px rgba(124,106,247,0.7); }\n #dc-fab:active { transform: scale(0.95); }\n\n .dc-fab-badge {\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 18px;\n height: 18px;\n background: var(--dc-red);\n color: #fff;\n font-size: 10px;\n font-weight: 700;\n border-radius: 9px;\n display: none;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n font-family: var(--dc-mono);\n }\n\n /* ── CONSOLE PANEL ───────────────────── */\n #dc-panel {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 320px;\n min-height: 120px;\n max-height: 85vh;\n background: var(--dc-bg1);\n border-top: 1px solid var(--dc-border);\n border-radius: 14px 14px 0 0;\n box-shadow: 0 -12px 50px rgba(0,0,0,0.6);\n display: none;\n flex-direction: column;\n z-index: 99998;\n overflow: hidden;\n font-family: var(--dc-mono);\n color: var(--dc-text0);\n }\n\n #dc-panel.visible {\n display: flex;\n animation: dcSlideUp 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes dcSlideUp {\n from { transform: translateY(100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n }\n\n /* Drag handle */\n #dc-drag {\n width: 100%;\n height: 22px;\n background: var(--dc-bg2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ns-resize;\n border-radius: 14px 14px 0 0;\n flex-shrink: 0;\n touch-action: none;\n user-select: none;\n }\n\n #dc-drag::before {\n content: '';\n width: 36px;\n height: 4px;\n background: var(--dc-border);\n border-radius: 2px;\n transition: background 0.2s;\n }\n\n #dc-drag:hover::before { background: var(--dc-accent); }\n\n /* Header bar */\n #dc-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n #dc-title {\n font-size: 11px;\n font-weight: 700;\n color: var(--dc-accent);\n letter-spacing: 0.1em;\n text-transform: uppercase;\n flex: 1;\n }\n\n .dc-pulse {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dc-green);\n animation: dcPulse 2s infinite;\n flex-shrink: 0;\n }\n\n @keyframes dcPulse {\n 0%,100% { opacity: 1; box-shadow: 0 0 0 0 rgba(61,255,160,0.4); }\n 50% { opacity: 0.6; box-shadow: 0 0 0 5px rgba(61,255,160,0); }\n }\n\n .dc-hbtn {\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 7px;\n background: var(--dc-bg3);\n color: var(--dc-text1);\n font-size: 13px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n padding: 0;\n }\n\n .dc-hbtn:hover { background: var(--dc-border); color: var(--dc-text0); }\n\n /* Tabs */\n #dc-tabs {\n display: flex;\n background: var(--dc-bg0);\n border-bottom: 1px solid var(--dc-border);\n overflow-x: auto;\n scrollbar-width: none;\n flex-shrink: 0;\n }\n\n #dc-tabs::-webkit-scrollbar { display: none; }\n\n .dc-tab {\n padding: 10px 14px;\n background: none;\n border: none;\n color: var(--dc-text2);\n font-family: var(--dc-mono);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.05em;\n cursor: pointer;\n white-space: nowrap;\n border-bottom: 2px solid transparent;\n transition: all 0.15s;\n position: relative;\n }\n\n .dc-tab:hover { color: var(--dc-text1); }\n\n .dc-tab.active {\n color: var(--dc-accent);\n border-bottom-color: var(--dc-accent);\n }\n\n .dc-tab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n background: var(--dc-accent);\n color: #fff;\n font-size: 9px;\n font-weight: 700;\n border-radius: 8px;\n padding: 0 4px;\n margin-left: 5px;\n }\n\n /* Tab panels */\n .dc-panel-content {\n display: none;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n\n .dc-panel-content.active { display: flex; }\n\n .dc-scroll {\n flex: 1;\n overflow-y: auto;\n padding: 10px 12px;\n scrollbar-width: thin;\n scrollbar-color: var(--dc-border) transparent;\n }\n\n .dc-scroll::-webkit-scrollbar { width: 4px; }\n .dc-scroll::-webkit-scrollbar-thumb { background: var(--dc-border); border-radius: 2px; }\n\n /* ── LOG ENTRIES ──────────────────────── */\n .dc-entry {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 5px;\n margin-bottom: 3px;\n font-size: 12px;\n line-height: 1.5;\n word-break: break-word;\n animation: dcFadeIn 0.1s ease;\n }\n\n @keyframes dcFadeIn { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: none; } }\n\n .dc-entry-log { color: var(--dc-text0); }\n .dc-entry-warn { color: var(--dc-orange); background: rgba(255,179,71,0.07); border-left: 2px solid var(--dc-orange); }\n .dc-entry-error { color: var(--dc-red); background: rgba(255,92,110,0.07); border-left: 2px solid var(--dc-red); }\n .dc-entry-info { color: var(--dc-blue); background: rgba(91,206,250,0.06); border-left: 2px solid var(--dc-blue); }\n .dc-entry-cmd { color: var(--dc-accent); background: rgba(124,106,247,0.06); }\n\n .dc-ts {\n color: var(--dc-text2);\n font-size: 10px;\n font-weight: 400;\n flex-shrink: 0;\n letter-spacing: 0;\n }\n\n .dc-entry pre {\n white-space: pre-wrap;\n word-break: break-all;\n background: var(--dc-bg0);\n padding: 6px 8px;\n border-radius: 5px;\n margin-top: 4px;\n font-size: 11px;\n color: var(--dc-green);\n width: 100%;\n }\n\n /* ── REPL INPUT ───────────────────────── */\n .dc-repl {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-top: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-input {\n flex: 1;\n padding: 8px 12px;\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text0);\n font-family: var(--dc-mono);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s;\n }\n\n .dc-input:focus { border-color: var(--dc-accent); box-shadow: 0 0 0 2px rgba(124,106,247,0.15); }\n\n .dc-run-btn {\n padding: 8px 14px;\n background: var(--dc-accent);\n border: none;\n border-radius: 8px;\n color: #fff;\n font-family: var(--dc-mono);\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n transition: all 0.15s;\n letter-spacing: 0.05em;\n }\n\n .dc-run-btn:hover { background: #8f7ffb; }\n .dc-run-btn:active { transform: scale(0.96); }\n\n /* ── NETWORK TAB ──────────────────────── */\n .dc-net-filter {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-filter-input {\n flex: 1;\n padding: 7px 10px;\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text0);\n font-family: var(--dc-mono);\n font-size: 12px;\n outline: none;\n }\n\n .dc-filter-input:focus { border-color: var(--dc-accent); }\n\n .dc-clear-btn {\n padding: 7px 12px;\n background: var(--dc-bg3);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n color: var(--dc-text1);\n font-family: var(--dc-mono);\n font-size: 11px;\n cursor: pointer;\n }\n\n .dc-clear-btn:hover { border-color: var(--dc-red); color: var(--dc-red); }\n\n .dc-req {\n padding: 9px 10px;\n border-radius: 6px;\n margin-bottom: 4px;\n background: var(--dc-bg2);\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.15s;\n }\n\n .dc-req:hover { border-color: var(--dc-border); }\n .dc-req.expanded { border-color: var(--dc-accent); }\n\n .dc-req-top {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 11px;\n }\n\n .dc-method {\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.05em;\n flex-shrink: 0;\n }\n\n .m-GET { background: rgba(61,255,160,0.15); color: var(--dc-green); }\n .m-POST { background: rgba(91,206,250,0.15); color: var(--dc-blue); }\n .m-PUT { background: rgba(255,179,71,0.15); color: var(--dc-orange); }\n .m-DELETE { background: rgba(255,92,110,0.15); color: var(--dc-red); }\n .m-PATCH { background: rgba(124,106,247,0.15); color: var(--dc-accent); }\n .m-UNK { background: var(--dc-bg3); color: var(--dc-text2); }\n\n .dc-req-url {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dc-text0);\n }\n\n .dc-req-status { flex-shrink: 0; }\n .s-ok { color: var(--dc-green); }\n .s-redir { color: var(--dc-orange); }\n .s-err { color: var(--dc-red); }\n\n .dc-req-meta {\n color: var(--dc-text2);\n font-size: 10px;\n margin-top: 3px;\n }\n\n .dc-req-detail {\n display: none;\n margin-top: 8px;\n background: var(--dc-bg0);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 11px;\n color: var(--dc-text1);\n }\n\n .dc-req-detail.open { display: block; }\n\n .dc-detail-section { margin-bottom: 10px; }\n .dc-detail-title { color: var(--dc-accent); font-weight: 700; margin-bottom: 4px; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; }\n .dc-detail-row { padding: 2px 0; word-break: break-all; }\n .dc-detail-key { color: var(--dc-text2); }\n\n /* ── STORAGE TAB ──────────────────────── */\n .dc-storage-nav {\n display: flex;\n gap: 4px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-st-btn {\n padding: 5px 12px;\n border: 1px solid var(--dc-border);\n border-radius: 100px;\n background: none;\n color: var(--dc-text2);\n font-family: var(--dc-mono);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .dc-st-btn.active { background: var(--dc-accent); border-color: var(--dc-accent); color: #fff; }\n .dc-st-btn:hover:not(.active) { border-color: var(--dc-text2); color: var(--dc-text1); }\n\n .dc-storage-actions {\n display: flex;\n justify-content: flex-end;\n padding: 6px 12px;\n flex-shrink: 0;\n }\n\n .dc-db-card {\n background: var(--dc-bg2);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n margin-bottom: 8px;\n overflow: hidden;\n }\n\n .dc-db-header {\n padding: 10px 14px;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--dc-bg3);\n transition: background 0.15s;\n }\n\n .dc-db-header:hover { background: var(--dc-border); }\n\n .dc-db-name { color: var(--dc-blue); font-size: 12px; font-weight: 700; }\n .dc-db-meta { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-db-body { display: none; padding: 10px; }\n .dc-db-card.open .dc-db-body { display: block; }\n\n .dc-store-item {\n padding: 8px 10px;\n background: var(--dc-bg0);\n border-radius: 5px;\n margin-bottom: 6px;\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.15s;\n }\n\n .dc-store-item:hover { border-color: var(--dc-border); }\n .dc-store-name { color: var(--dc-text0); font-size: 12px; font-weight: 600; }\n .dc-store-meta { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-data-viewer {\n display: none;\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n }\n\n .dc-data-viewer.open { display: block; }\n\n .dc-data-row {\n padding: 6px 8px;\n border-bottom: 1px solid var(--dc-border);\n font-size: 11px;\n }\n\n .dc-data-key { color: #ffd700; font-weight: 600; }\n .dc-data-val { color: var(--dc-blue); margin-top: 3px; word-break: break-all; }\n\n .dc-kv-row {\n display: flex;\n gap: 8px;\n align-items: baseline;\n padding: 6px 0;\n border-bottom: 1px solid var(--dc-border);\n font-size: 11px;\n }\n\n .dc-kv-key { color: #ffd700; font-weight: 600; min-width: 100px; word-break: break-all; }\n .dc-kv-val { color: var(--dc-blue); flex: 1; word-break: break-all; }\n\n .dc-empty {\n padding: 24px;\n text-align: center;\n color: var(--dc-text2);\n font-size: 12px;\n }\n\n /* ── DOM TAB ──────────────────────────────────── */\n .dc-dom-toolbar {\n display: flex;\n gap: 8px;\n padding: 8px 12px;\n background: var(--dc-bg2);\n border-bottom: 1px solid var(--dc-border);\n flex-shrink: 0;\n }\n\n .dc-dom-btn {\n padding: 5px 12px;\n border: 1px solid var(--dc-border);\n border-radius: 100px;\n background: none;\n color: var(--dc-text2);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .dc-dom-btn:hover { border-color: var(--dc-accent); color: var(--dc-accent); }\n .dc-dom-btn.picking { background: var(--dc-accent2); border-color: var(--dc-accent2); color: #fff; }\n\n .dc-tree { font-size: 12px; }\n\n .dc-node-label {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 4px;\n border-radius: 4px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n transition: background 0.1s;\n }\n\n .dc-node-label:hover { background: var(--dc-bg3); }\n\n .dc-arrow { color: var(--dc-text2); width: 12px; flex-shrink: 0; font-size: 9px; }\n .dc-tag { color: var(--dc-accent2); font-weight: 600; }\n .dc-id { color: var(--dc-blue); }\n .dc-cls { color: var(--dc-orange); }\n .dc-txt-preview { color: var(--dc-text2); font-size: 10px; max-width: 150px; overflow: hidden; text-overflow: ellipsis; }\n\n .dc-children { margin-left: 16px; display: none; }\n .dc-children.open { display: block; }\n\n .dc-node-detail {\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n padding: 12px;\n margin: 8px 0;\n font-size: 11px;\n }\n\n .dc-attr-row { padding: 3px 0; }\n .dc-attr-name { color: var(--dc-blue); }\n .dc-attr-val { color: var(--dc-green); }\n\n /* ── SYSTEM TAB ───────────────────────────────── */\n .dc-sys-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n padding: 10px 12px;\n }\n\n .dc-sys-card {\n background: var(--dc-bg2);\n border: 1px solid var(--dc-border);\n border-radius: 8px;\n padding: 12px 14px;\n }\n\n .dc-sys-label {\n color: var(--dc-text2);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 5px;\n }\n\n .dc-sys-val {\n color: var(--dc-text0);\n font-size: 11px;\n line-height: 1.4;\n }\n\n .dc-sys-full { grid-column: 1 / -1; }\n\n /* ── SETTINGS TAB ─────────────────────────────── */\n .dc-settings-body { padding: 10px 12px; }\n\n .dc-setting-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 0;\n border-bottom: 1px solid var(--dc-border);\n }\n\n .dc-setting-row:last-child { border-bottom: none; }\n\n .dc-setting-info { flex: 1; }\n .dc-setting-name { color: var(--dc-text0); font-size: 12px; font-weight: 600; }\n .dc-setting-desc { color: var(--dc-text2); font-size: 10px; margin-top: 2px; }\n\n .dc-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n flex-shrink: 0;\n }\n\n .dc-toggle input { opacity: 0; width: 0; height: 0; }\n\n .dc-toggle-track {\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: var(--dc-border);\n border-radius: 11px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track { background: var(--dc-accent); }\n\n .dc-toggle-track::after {\n content: '';\n position: absolute;\n width: 16px;\n height: 16px;\n background: white;\n border-radius: 50%;\n top: 3px; left: 3px;\n transition: transform 0.2s;\n }\n\n .dc-toggle input:checked + .dc-toggle-track::after { transform: translateX(18px); }\n\n .dc-select {\n background: var(--dc-bg0);\n border: 1px solid var(--dc-border);\n border-radius: 6px;\n color: var(--dc-text0);\n font-size: 12px;\n padding: 6px 10px;\n outline: none;\n }\n\n /* ── PICK highlight ───────────────────────────── */\n .dc-pick-highlight {\n outline: 2px dashed var(--dc-accent2) !important;\n outline-offset: 2px;\n background: rgba(247,104,164,0.08) !important;\n }\n ",document.head.appendChild(n);document.body.insertAdjacentHTML("beforeend",'\n <button id="dc-fab" title="DevConsole">\n <span id="dc-fab-icon">⌥</span>\n <span class="dc-fab-badge" id="dc-error-badge">0</span>\n </button>\n\n <div id="dc-panel">\n <div id="dc-drag"></div>\n <div id="dc-header">\n <span id="dc-title">DevConsole</span>\n <span class="dc-pulse"></span>\n <button class="dc-hbtn" id="dc-clear-btn" title="Clear active tab">🗑</button>\n <button class="dc-hbtn" id="dc-copy-btn" title="Copy logs to clipboard">📋</button>\n <button class="dc-hbtn" id="dc-minimize-btn" title="Minimize">−</button>\n </div>\n\n <div id="dc-tabs">\n <button class="dc-tab active" data-tab="console">Console<span class="dc-tab-count" id="cnt-console" style="display:none"></span></button>\n <button class="dc-tab" data-tab="network">Network<span class="dc-tab-count" id="cnt-network" style="display:none"></span></button>\n <button class="dc-tab" data-tab="storage">Storage</button>\n <button class="dc-tab" data-tab="dom">DOM</button>\n <button class="dc-tab" data-tab="system">System</button>\n <button class="dc-tab" data-tab="settings">⚙</button>\n </div>\n\n <div class="dc-panel-content active" id="panel-console">\n <div class="dc-scroll" id="console-output"></div>\n <div class="dc-repl">\n <input class="dc-input" id="repl-input" placeholder="▶ execute javascript…" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">\n <button class="dc-run-btn" id="repl-run">RUN</button>\n </div>\n </div>\n\n <div class="dc-panel-content" id="panel-network">\n <div class="dc-net-filter">\n <input class="dc-filter-input" id="net-filter" placeholder="Filter by URL or method…">\n <button class="dc-clear-btn" id="net-clear">Clear</button>\n </div>\n <div class="dc-scroll" id="network-output"></div>\n </div>\n\n <div class="dc-panel-content" id="panel-storage">\n <div class="dc-storage-nav">\n <button class="dc-st-btn active" data-storage="indexeddb">IndexedDB</button>\n <button class="dc-st-btn" data-storage="localstorage">LocalStorage</button>\n <button class="dc-st-btn" data-storage="sessionstorage">SessionStorage</button>\n </div>\n <div class="dc-storage-actions">\n <button class="dc-clear-btn" id="storage-refresh">↺ Refresh</button>\n </div>\n <div class="dc-scroll" id="storage-output"></div>\n </div>\n\n <div class="dc-panel-content" id="panel-dom">\n <div class="dc-dom-toolbar">\n <button class="dc-dom-btn" id="dom-refresh-btn">↺ Refresh tree</button>\n <button class="dc-dom-btn" id="dom-pick-btn">⊕ Pick element</button>\n <button class="dc-dom-btn" id="dom-collapse-btn">Collapse all</button>\n </div>\n <div class="dc-scroll" id="dom-output"></div>\n </div>\n\n <div class="dc-panel-content" id="panel-system">\n <div class="dc-scroll">\n <div class="dc-sys-grid" id="system-output"></div>\n </div>\n </div>\n\n <div class="dc-panel-content" id="panel-settings">\n <div class="dc-scroll dc-settings-body" id="settings-output"></div>\n </div>\n </div>\n ');const e={logs:[],network:[],dbs:[],activeTab:"console",activeStorage:"indexeddb",isPicking:!1,replHistory:[],replHistoryIdx:-1,errorCount:0,settings:{timestamps:!0,autoScroll:!0,maxEntries:500,fontSize:12,monitorNetwork:!0,captureErrors:!0,theme:"dark"}};function t(){try{localStorage.setItem("__dc_settings",JSON.stringify(e.settings))}catch(n){}}!function(){try{const n=localStorage.getItem("__dc_settings");n&&(e.settings={...e.settings,...JSON.parse(n)})}catch(n){}}();const o=()=>document.getElementById("dc-fab"),d=()=>document.getElementById("dc-panel"),r=()=>document.getElementById("console-output"),a=()=>document.getElementById("network-output"),c=()=>document.getElementById("storage-output"),s=()=>document.getElementById("dom-output"),i=()=>document.getElementById("system-output"),l=()=>document.getElementById("settings-output"),p=()=>document.getElementById("repl-input"),g=()=>document.getElementById("net-filter"),u=()=>document.getElementById("dc-error-badge");function b(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}:${String(n.getSeconds()).padStart(2,"0")}.${String(n.getMilliseconds()).padStart(3,"0")}`}function v(n){return String(n).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function m(n){if(null===n)return'<span style="color:#aaa">null</span>';if(void 0===n)return'<span style="color:#aaa">undefined</span>';if("object"==typeof n)try{return`<pre>${v(JSON.stringify(n,null,2))}</pre>`}catch(e){return String(n)}return v(String(n))}const f={};function x(n,t){if("error"===n){e.errorCount++;const n=u();n&&(n.textContent=e.errorCount>99?"99+":e.errorCount,n.style.display="flex")}e.logs.push({type:n,args:t,ts:b()}),e.logs.length>e.settings.maxEntries&&e.logs.shift(),R("console",e.logs.length),"console"===e.activeTab&&h()}function h(){const n=r();if(!n)return;const t=document.createDocumentFragment();e.logs.forEach(n=>{const o=document.createElement("div");o.className=`dc-entry dc-entry-${n.type}`;const d=e.settings.timestamps?`<span class="dc-ts">${n.ts}</span>`:"",r=n.args.map(m).join(" ");o.innerHTML=`${d}<span>${r}</span>`,o.style.fontSize=e.settings.fontSize+"px",t.appendChild(o)}),n.innerHTML="",n.appendChild(t),e.settings.autoScroll&&(n.scrollTop=n.scrollHeight)}["log","warn","error","info"].forEach(n=>{f[n]=console[n].bind(console),console[n]=(...e)=>{f[n](...e),x(n,e)}}),e.settings.captureErrors&&(window.onerror=(n,e,t,o)=>(x("error",[`${n} @ ${e}:${t}:${o}`]),!1),window.addEventListener("unhandledrejection",n=>{x("error",[`Unhandled Promise Rejection: ${n.reason}`])}));const y=window.fetch;window.fetch=async(...n)=>{const e=Date.now();let t="GET",o=n[0]instanceof Request?n[0].url:String(n[0]);n[1]&&n[1].method&&(t=n[1].method.toUpperCase()),n[0]instanceof Request&&(t=n[0].method.toUpperCase());const d={method:t,url:o,ts:b(),startTime:e,status:null,duration:null,headers:{},error:null};try{const t=await y(...n);d.status=t.status,d.statusText=t.statusText,d.duration=Date.now()-e;try{t.headers.forEach((n,e)=>{d.headers[e]=n})}catch(r){}return E(d),t}catch(r){throw d.error=r.message,d.duration=Date.now()-e,E(d),r}};const k=XMLHttpRequest.prototype.open,w=XMLHttpRequest.prototype.send;function E(n){e.network.unshift(n),e.network.length>e.settings.maxEntries&&e.network.pop(),R("network",e.network.length),"network"===e.activeTab&&$()}function $(n){const t=a();if(!t)return;const o=(n=void 0!==n?n:g()?g().value:"")?e.network.filter(e=>e.url.toLowerCase().includes(n.toLowerCase())||e.method.toLowerCase().includes(n.toLowerCase())):e.network;t.innerHTML=o.map((n,e)=>{const t=n.error?"s-err":(o=n.status)?o<300?"s-ok":o<400?"s-redir":"s-err":"";var o;const d=(r=n.method,`m-${["GET","POST","PUT","DELETE","PATCH"].includes(r)?r:"UNK"}`);var r;const a=n.status?`<span class="dc-req-status ${t}">${n.status}</span>`:n.error?'<span class="dc-req-status s-err">ERR</span>':'<span class="dc-req-status" style="color:var(--dc-text2)">…</span>',c=null!=n.duration?`${n.duration}ms · `:"",s=Object.keys(n.headers).length?Object.entries(n.headers).map(([n,e])=>`<div class="dc-detail-row"><span class="dc-detail-key">${v(n)}: </span>${v(e)}</div>`).join(""):'<div class="dc-detail-row" style="color:var(--dc-text2)">none</div>';return`<div class="dc-req" id="req-${e}" onclick="window.__dcToggleReq(${e})">\n <div class="dc-req-top">\n <span class="dc-method ${d}">${n.method}</span>\n <span class="dc-req-url" title="${v(n.url)}">${v(function(n,e=55){if(!n||n.length<=e)return n;try{const e=new URL(n),t=e.pathname.split("/").pop()||"";return`${e.hostname}/…/${t}`}catch(t){return n.slice(0,e)+"…"}}(n.url))}</span>\n ${a}\n </div>\n <div class="dc-req-meta">${c}${n.ts}${n.error?" · "+v(n.error):""}</div>\n <div class="dc-req-detail" id="req-detail-${e}">\n <div class="dc-detail-section">\n <div class="dc-detail-title">General</div>\n <div class="dc-detail-row"><span class="dc-detail-key">URL: </span>${v(n.url)}</div>\n <div class="dc-detail-row"><span class="dc-detail-key">Method: </span>${n.method}</div>\n <div class="dc-detail-row"><span class="dc-detail-key">Status: </span>${n.status||n.error||"–"} ${n.statusText||""}</div>\n <div class="dc-detail-row"><span class="dc-detail-key">Duration: </span>${null!=n.duration?n.duration+"ms":"–"}</div>\n </div>\n <div class="dc-detail-section">\n <div class="dc-detail-title">Response Headers</div>\n ${s}\n </div>\n </div>\n </div>`}).join("")||'<div class="dc-empty">No requests captured yet</div>'}async function S(){if(e.dbs=[],window.indexedDB){try{if(indexedDB.databases){const e=await indexedDB.databases();for(const t of e)try{await L(t.name,t.version)}catch(n){}}}catch(n){}C()}}function L(n,t){return new Promise((o,d)=>{const r=indexedDB.open(n,t);r.onerror=()=>d(r.error),r.onsuccess=()=>{const n=r.result,t={name:n.name,version:n.version,stores:[]},d=[...n.objectStoreNames];let a=d.length;if(!a)return n.close(),e.dbs.push(t),o(t);d.forEach(d=>{(function(n,e){return new Promise((t,o)=>{const d=n.transaction([e],"readonly").objectStore(e),r=d.count();r.onsuccess=()=>{const n={name:e,count:r.result,keyPath:d.keyPath,data:[]},o=d.getAll(void 0,20);o.onsuccess=()=>{n.data=o.result,t(n)},o.onerror=()=>t(n)},r.onerror=()=>t({name:e,count:0,keyPath:null,data:[]})})})(n,d).then(d=>{t.stores.push(d),0===--a&&(n.close(),e.dbs.push(t),o(t))}).catch(()=>{t.stores.push({name:d,count:0,keyPath:null,data:[]}),0===--a&&(n.close(),e.dbs.push(t),o(t))})})}})}function C(){const n=c();if(n)switch(e.activeStorage){case"indexeddb":!function(n){if(!e.dbs.length)return void(n.innerHTML='<div class="dc-empty">No IndexedDB databases found</div>');n.innerHTML=e.dbs.map((n,e)=>`<div class="dc-db-card" id="db-card-${e}">\n <div class="dc-db-header" onclick="window.__dcToggleDb(${e})">\n <div>\n <div class="dc-db-name">${v(n.name)}</div>\n <div class="dc-db-meta">v${n.version} · ${n.stores.length} store${1!==n.stores.length?"s":""}</div>\n </div>\n <span style="color:var(--dc-text2);font-size:11px">▼</span>\n </div>\n <div class="dc-db-body">\n ${n.stores.map((n,t)=>`\n <div class="dc-store-item" onclick="window.__dcToggleStore(${e},${t})">\n <div class="dc-store-name">${v(n.name)}</div>\n <div class="dc-store-meta">${n.count} records · keyPath: ${n.keyPath||"none"}</div>\n <div class="dc-data-viewer" id="store-${e}-${t}">\n ${n.data.length?n.data.slice(0,20).map(e=>{return`\n <div class="dc-data-row">\n <div class="dc-data-key">· ${v((t=e,o=n.keyPath,o?"string"==typeof o?String(t[o]??"—"):JSON.stringify(o):"—"))}</div>\n <div class="dc-data-val">${v(T(e))}</div>\n </div>`;var t,o}).join(""):'<div style="color:var(--dc-text2);font-size:11px;padding:8px">Empty store</div>'}\n </div>\n </div>`).join("")}\n </div>\n </div>`).join("")}(n);break;case"localstorage":z(n,localStorage,"localStorage");break;case"sessionstorage":z(n,sessionStorage,"sessionStorage")}}function T(n){if("object"==typeof n&&null!==n){const e=JSON.stringify(n,null,2);return e.length>300?e.slice(0,300)+"…":e}const e=String(n);return e.length>200?e.slice(0,200)+"…":e}function z(n,e,t){const o=[];for(let d=0;d<e.length;d++){const n=e.key(d);o.push({k:n,v:e.getItem(n)})}o.length?n.innerHTML='<div style="padding:4px 0">'+o.map(({k:n,v:e})=>`\n <div class="dc-kv-row">\n <span class="dc-kv-key">${v(n)}</span>\n <span class="dc-kv-val">${v(T(e))}</span>\n </div>`).join("")+"</div>":n.innerHTML=`<div class="dc-empty">No ${t} items</div>`}function I(){const n=s();if(!n)return;n.innerHTML="";const e=document.createElement("div");e.className="dc-tree",e.appendChild(H(document.body)),n.appendChild(e)}function H(n){const e=document.createElement("div"),t=[...n.children],o=t.length>0,d=document.createElement("div");d.className="dc-node-label";const r=document.createElement("span");r.className="dc-arrow",r.textContent=o?"▶":" ",d.appendChild(r);const a=document.createElement("span");if(a.className="dc-tag",a.textContent=`<${n.tagName.toLowerCase()}`,d.appendChild(a),n.id){const e=document.createElement("span");e.className="dc-id",e.textContent=` #${n.id}`,d.appendChild(e)}if(n.className&&"string"==typeof n.className&&n.className.trim()){const e=document.createElement("span");e.className="dc-cls";const t=n.className.trim().split(/\s+/).slice(0,3).map(n=>`.${n}`).join("");e.textContent=t,d.appendChild(e)}const c=document.createElement("span");c.className="dc-tag",c.textContent=">",d.appendChild(c);const s=n.childNodes.length?[...n.childNodes].find(n=>3===n.nodeType&&n.textContent.trim()):null;if(s){const n=document.createElement("span");n.className="dc-txt-preview",n.textContent=" "+s.textContent.trim().slice(0,30),d.appendChild(n)}if(d.addEventListener("click",t=>{if(t.stopPropagation(),o){const n=e.querySelector(":scope > .dc-children"),t=n&&n.classList.contains("open");n&&n.classList.toggle("open",!t),r.textContent=t?"▶":"▼"}B(n)}),e.appendChild(d),o){const n=document.createElement("div");n.className="dc-children",t.forEach(e=>n.appendChild(H(e))),e.appendChild(n)}return e}function B(n){const e=document.getElementById("dc-node-detail");e&&e.remove();const t=document.createElement("div");t.className="dc-node-detail",t.id="dc-node-detail";const o=`<${n.tagName.toLowerCase()}>`,d=[...n.attributes],r=window.getComputedStyle(n);t.innerHTML=`<div style="color:var(--dc-accent2);font-size:12px;font-weight:700;margin-bottom:8px">${v(o)}</div>\n ${d.length?`<div class="dc-detail-title">Attributes</div>${d.map(n=>`<div class="dc-attr-row"><span class="dc-attr-name">${v(n.name)}</span>=<span class="dc-attr-val">"${v(n.value)}"</span></div>`).join("")}`:""}\n <div class="dc-detail-title" style="margin-top:8px">Geometry</div>\n <div class="dc-attr-row"><span class="dc-attr-name">size: </span><span class="dc-attr-val">${Math.round(n.offsetWidth)}×${Math.round(n.offsetHeight)}</span></div>\n <div class="dc-attr-row"><span class="dc-attr-name">display: </span><span class="dc-attr-val">${r.display}</span></div>\n <div class="dc-attr-row"><span class="dc-attr-name">position: </span><span class="dc-attr-val">${r.position}</span></div>`,s().prepend(t)}XMLHttpRequest.prototype.open=function(n,e){return this.__dcReq={method:n.toUpperCase(),url:String(e),ts:b(),startTime:0},k.apply(this,arguments)},XMLHttpRequest.prototype.send=function(n){if(this.__dcReq){const n=this.__dcReq;n.startTime=Date.now(),this.addEventListener("loadend",()=>{n.status=this.status,n.statusText=this.statusText,n.duration=Date.now()-n.startTime,n.headers={};const e=this.getAllResponseHeaders();e&&e.split("\r\n").filter(Boolean).forEach(e=>{const t=e.indexOf(": ");t>0&&(n.headers[e.slice(0,t)]=e.slice(t+2))}),n.error=0===this.status?"Request failed":null,E(n)})}return w.apply(this,arguments)},window.__dcToggleReq=function(n){const e=document.getElementById(`req-detail-${n}`),t=document.getElementById(`req-${n}`);if(!e)return;const o=e.classList.contains("open");e.classList.toggle("open",!o),t.classList.toggle("expanded",!o)},window.__dcToggleDb=function(n){const e=document.getElementById(`db-card-${n}`);e&&e.classList.toggle("open")},window.__dcToggleStore=function(n,e){const t=document.getElementById(`store-${n}-${e}`);t&&t.classList.toggle("open")};let q=null,N=null;function M(){e.isPicking=!1;const n=document.getElementById("dom-pick-btn");n&&n.classList.remove("picking"),q&&(document.removeEventListener("click",q,!0),q=null)}function j(n){switch(e.activeTab=n,document.querySelectorAll(".dc-tab").forEach(e=>e.classList.toggle("active",e.dataset.tab===n)),document.querySelectorAll(".dc-panel-content").forEach(e=>e.classList.toggle("active",e.id===`panel-${n}`)),n){case"console":h();break;case"network":$();break;case"storage":S();break;case"dom":I();break;case"system":!function(){const n=i();if(!n)return;const e=navigator,t=window.performance,o=t&&t.memory,d=e.connection||e.mozConnection||e.webkitConnection,r=[["Screen",`${screen.width}×${screen.height} (devicePR: ${window.devicePixelRatio})`],["Viewport",`${window.innerWidth}×${window.innerHeight}`],["Platform",e.platform||"—"],["Language",e.language||"—"],["Online",e.onLine?"✅ Online":"❌ Offline"],["Cookies",e.cookieEnabled?"Enabled":"Disabled"],["HW Concurrency",e.hardwareConcurrency||"—"]];if(d&&(r.push(["Connection",`${d.effectiveType||"—"} · ${d.downlink||"—"} Mbps`]),r.push(["RTT",null!=d.rtt?`${d.rtt}ms`:"—"])),o){const n=n=>(n/1048576).toFixed(1)+" MB";r.push(["Heap Used",n(o.usedJSHeapSize)]),r.push(["Heap Limit",n(o.jsHeapSizeLimit)])}if(t){const n=t.getEntriesByType&&t.getEntriesByType("navigation")[0];n&&(r.push(["Page Load",`${Math.round(n.loadEventEnd)}ms`]),r.push(["DOM Ready",`${Math.round(n.domContentLoadedEventEnd)}ms`]))}n.innerHTML=r.map(([n,e])=>`<div class="dc-sys-card"><div class="dc-sys-label">${n}</div><div class="dc-sys-val">${v(String(e))}</div></div>`).join("")+`<div class="dc-sys-card dc-sys-full"><div class="dc-sys-label">User Agent</div><div class="dc-sys-val" style="word-break:break-all;font-size:10px">${v(e.userAgent)}</div></div>`}();break;case"settings":!function(){const n=l();n&&(n.innerHTML=`\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Timestamps</div>\n <div class="dc-setting-desc">Show time prefix on each log entry</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-ts" ${e.settings.timestamps?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Auto-scroll</div>\n <div class="dc-setting-desc">Scroll to latest entry automatically</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-as" ${e.settings.autoScroll?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Capture Global Errors</div>\n <div class="dc-setting-desc">window.onerror + unhandledrejection</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-ce" ${e.settings.captureErrors?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Monitor Network</div>\n <div class="dc-setting-desc">Intercept fetch + XHR requests</div>\n </div>\n <label class="dc-toggle"><input type="checkbox" id="s-mn" ${e.settings.monitorNetwork?"checked":""}><span class="dc-toggle-track"></span></label>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Font Size</div>\n <div class="dc-setting-desc">Console output font size (px)</div>\n </div>\n <select class="dc-select" id="s-fs">\n ${[10,11,12,13,14].map(n=>`<option value="${n}" ${e.settings.fontSize===n?"selected":""}>${n}px</option>`).join("")}\n </select>\n </div>\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">Max Log Entries</div>\n <div class="dc-setting-desc">Older entries are discarded</div>\n </div>\n <select class="dc-select" id="s-me">\n ${[100,250,500,1e3,2e3].map(n=>`<option value="${n}" ${e.settings.maxEntries===n?"selected":""}>${n}</option>`).join("")}\n </select>\n </div>\n <div class="dc-setting-row" style="border:none">\n <div class="dc-setting-info">\n <div class="dc-setting-name" style="color:var(--dc-red)">Clear All Data</div>\n <div class="dc-setting-desc">Wipe logs and network history</div>\n </div>\n <button class="dc-clear-btn" onclick="window.__dcClearAll()">Clear</button>\n </div>`,document.getElementById("s-ts").onchange=n=>{e.settings.timestamps=n.target.checked,t(),h()},document.getElementById("s-as").onchange=n=>{e.settings.autoScroll=n.target.checked,t()},document.getElementById("s-ce").onchange=n=>{e.settings.captureErrors=n.target.checked,t()},document.getElementById("s-mn").onchange=n=>{e.settings.monitorNetwork=n.target.checked,t()},document.getElementById("s-fs").onchange=n=>{e.settings.fontSize=parseInt(n.target.value),t(),"console"===e.activeTab&&h()},document.getElementById("s-me").onchange=n=>{e.settings.maxEntries=parseInt(n.target.value),t()})}()}}function R(n,e){const t=document.getElementById(`cnt-${n}`);t&&(e>0?(t.textContent=e>999?"999+":e,t.style.display="inline-flex"):t.style.display="none")}window.__dcClearAll=function(){e.logs=[],e.network=[],e.errorCount=0;const n=u();n&&(n.style.display="none"),R("console",0),R("network",0),"console"===e.activeTab&&h(),"network"===e.activeTab&&$()};let P=!1;function A(){P=!P;const n=d();P?(n.style.display="flex",requestAnimationFrame(()=>{n.classList.add("visible")}),j(e.activeTab)):(n.classList.remove("visible"),setTimeout(()=>{n.style.display="none"},260)),o().innerHTML=P?`✕<span class="dc-fab-badge" id="dc-error-badge" style="display:${e.errorCount>0?"flex":"none"}">${e.errorCount}</span>`:`⌥<span class="dc-fab-badge" id="dc-error-badge" style="display:${e.errorCount>0?"flex":"none"}">${e.errorCount}</span>`}!function(){const n=document.getElementById("dc-drag"),e=document.getElementById("dc-panel");let t=!1,o=0,d=0;function r(n){t=!0,o=n.clientY||n.touches&&n.touches[0].clientY,d=e.offsetHeight,document.body.style.userSelect="none"}function a(n){if(!t)return;const r=n.clientY||n.touches&&n.touches[0].clientY,a=Math.max(120,Math.min(.85*window.innerHeight,d+(o-r)));e.style.height=a+"px"}function c(){t=!1,document.body.style.userSelect=""}n.addEventListener("mousedown",r),n.addEventListener("touchstart",r,{passive:!0}),document.addEventListener("mousemove",a),document.addEventListener("touchmove",a,{passive:!0}),document.addEventListener("mouseup",c),document.addEventListener("touchend",c)}(),document.getElementById("dc-fab").addEventListener("click",A),document.getElementById("dc-minimize-btn").addEventListener("click",A),document.querySelectorAll(".dc-tab").forEach(n=>{n.addEventListener("click",()=>j(n.dataset.tab))}),document.getElementById("dc-clear-btn").addEventListener("click",()=>{switch(e.activeTab){case"console":e.logs=[],R("console",0),h();break;case"network":e.network=[],R("network",0),$()}}),document.getElementById("dc-copy-btn").addEventListener("click",()=>{let n="";"console"===e.activeTab?n=e.logs.map(n=>`[${n.ts}] [${n.type.toUpperCase()}] ${n.args.map(n=>"object"==typeof n?JSON.stringify(n,null,2):String(n)).join(" ")}`).join("\n"):"network"===e.activeTab&&(n=e.network.map(n=>`[${n.ts}] ${n.method} ${n.url} → ${n.status||"ERR"} (${n.duration}ms)`).join("\n")),n&&(navigator.clipboard&&navigator.clipboard.writeText(n).catch(()=>{}),console.log("📋 Copied to clipboard"))}),g().addEventListener("input",n=>$(n.target.value)),document.getElementById("net-clear").addEventListener("click",()=>{e.network=[],R("network",0),$()}),document.querySelectorAll(".dc-st-btn").forEach(n=>{n.addEventListener("click",()=>{e.activeStorage=n.dataset.storage,document.querySelectorAll(".dc-st-btn").forEach(e=>e.classList.toggle("active",e===n)),C()})}),document.getElementById("storage-refresh").addEventListener("click",S),document.getElementById("dom-refresh-btn").addEventListener("click",I),document.getElementById("dom-pick-btn").addEventListener("click",()=>{e.isPicking?M():(e.isPicking=!0,document.getElementById("dom-pick-btn").classList.add("picking"),q=n=>{n.target.closest("#dc-panel")||n.target.closest("#dc-fab")||(n.preventDefault(),n.stopPropagation(),N&&N.classList.remove("dc-pick-highlight"),N=n.target,N.classList.add("dc-pick-highlight"),B(N),M())},document.addEventListener("click",q,!0),document.addEventListener("mouseover",n=>{e.isPicking&&(n.target.closest("#dc-panel")||n.target.closest("#dc-fab")||(N&&N.classList.remove("dc-pick-highlight"),N=n.target,N.classList.add("dc-pick-highlight")))},!0))}),document.getElementById("dom-collapse-btn").addEventListener("click",()=>{document.querySelectorAll(".dc-children.open").forEach(n=>n.classList.remove("open")),document.querySelectorAll(".dc-arrow").forEach(n=>{"▼"===n.textContent&&(n.textContent="▶")})});let D=location.href;setInterval(()=>{location.href!==D&&(D=location.href,x("info",["🔄 SPA navigation detected:",location.href]))},1e3),function(){const n=p();if(!n)return;function t(){const t=n.value.trim();if(!t)return;e.replHistory.unshift(t),e.replHistory.length>50&&e.replHistory.pop(),e.replHistoryIdx=-1;const o=document.createElement("div");o.className="dc-entry dc-entry-cmd",o.style.fontSize=e.settings.fontSize+"px",o.innerHTML=`<span class="dc-ts">${b()}</span><span>▶ ${v(t)}</span>`,r().appendChild(o);try{const n=(0,eval)(t);if(void 0!==n){const t=document.createElement("div");t.className="dc-entry dc-entry-log",t.style.fontSize=e.settings.fontSize+"px",t.innerHTML=`<span class="dc-ts">${b()}</span><span>${m(n)}</span>`,r().appendChild(t)}}catch(d){const n=document.createElement("div");n.className="dc-entry dc-entry-error",n.style.fontSize=e.settings.fontSize+"px",n.innerHTML=`<span class="dc-ts">${b()}</span><span>${v(d.toString())}</span>`,r().appendChild(n)}n.value="",e.settings.autoScroll&&(r().scrollTop=r().scrollHeight),j("console")}n.addEventListener("keydown",o=>{"Enter"!==o.key?("ArrowUp"===o.key&&(o.preventDefault(),e.replHistoryIdx=Math.min(e.replHistoryIdx+1,e.replHistory.length-1),n.value=e.replHistory[e.replHistoryIdx]||""),"ArrowDown"===o.key&&(o.preventDefault(),e.replHistoryIdx=Math.max(e.replHistoryIdx-1,-1),n.value=e.replHistoryIdx>=0?e.replHistory[e.replHistoryIdx]:"")):t()});const o=document.getElementById("repl-run");o&&o.addEventListener("click",t)}(),h(),x("log",["✅ DevConsole v2.0 loaded — click ⌥ to open"]),window.insikt={toggle:A,clear:window.__dcClearAll,init:()=>{},destroy:()=>{const n=o(),e=d();n&&n.remove(),e&&e.remove(),["log","warn","error","info"].forEach(n=>{f[n]&&(console[n]=f[n])}),window.fetch=y,XMLHttpRequest.prototype.open=k,XMLHttpRequest.prototype.send=w}}}()});
|
|
1
|
+
!function(n){"function"==typeof define&&define.amd?define(n):n()}(function(){"use strict";!function(){const n="1.2.0",e="__insikt_buffer__",t="__dc_settings",o=document.createElement("style");o.textContent="\n @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Syne:wght@400;600;700;800&display=swap');\n\n :root {\n --dc-bg0: #0d0d0f;\n --dc-bg1: #141418;\n --dc-bg2: #1c1c22;\n --dc-bg3: #242430;\n --dc-border: #2a2a38;\n --dc-accent: #7c6af7;\n --dc-accent2: #f768a4;\n --dc-green: #3dffa0;\n --dc-orange: #ffb347;\n --dc-red: #ff5c6e;\n --dc-blue: #5bcefa;\n --dc-text0: #f0f0f8;\n --dc-text1: #a8a8c0;\n --dc-text2: #606078;\n --dc-mono: 'JetBrains Mono', monospace;\n --dc-sans: 'Syne', sans-serif;\n }\n\n #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 ",document.head.appendChild(o);document.body.insertAdjacentHTML("beforeend",'\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 ');const r={logs:[],network:[],dbs:[],activeTab:"console",activeStorage:"indexeddb",isPicking:!1,replHistory:[],replHistoryIdx:-1,errorCount:0,groupDepth:0,nextLogId:1,settings:{timestamps:!0,autoScroll:!0,maxEntries:500,fontSize:12,monitorNetwork:!0,captureErrors:!0,persistBuffer:!1,theme:"dark"}};function d(){try{localStorage.setItem(t,JSON.stringify(r.settings))}catch(n){}}!function(){try{const n=localStorage.getItem(t);if(n){const e=JSON.parse(n);r.settings={...r.settings,...e}}}catch(n){}}();const c=()=>document.getElementById("dc-fab"),a=()=>document.getElementById("dc-panel"),s=()=>document.getElementById("console-output"),i=()=>document.getElementById("network-output"),l=()=>document.getElementById("storage-output"),p=()=>document.getElementById("dom-output"),u=()=>document.getElementById("system-output"),g=()=>document.getElementById("settings-output"),m=()=>document.getElementById("repl-input"),b=()=>document.getElementById("net-filter"),f=()=>document.getElementById("dc-error-badge");function v(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}:${String(n.getSeconds()).padStart(2,"0")}.${String(n.getMilliseconds()).padStart(3,"0")}`}function h(n){return String(n).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function x(n,e){const t=document.getElementById(`cnt-${n}`);t&&(e>0?(t.textContent=e>999?"999+":e,t.style.display="inline-flex"):t.style.display="none")}const y=100;function k(n,e=0,t=new WeakSet){if(null===n)return{kind:"null"};if(void 0===n)return{kind:"undefined"};const o=typeof n;if("string"===o)return{kind:"string",value:n};if("number"===o)return Number.isNaN(n)?{kind:"number",value:"NaN"}:n===1/0?{kind:"number",value:"Infinity"}:n===-1/0?{kind:"number",value:"-Infinity"}:{kind:"number",value:n};if("boolean"===o)return{kind:"boolean",value:n};if("bigint"===o)return{kind:"bigint",value:n.toString()+"n"};if("symbol"===o)return{kind:"symbol",value:String(n)};if("function"===o)return{kind:"function",value:n.name?`[Function ${n.name}]`:"[Function]"};if("object"!==o)return{kind:"string",value:String(n)};if(t.has(n))return{kind:"circular"};if(e>=8)return{kind:"object",ctor:w(n),entries:[],truncated:!0};if(t.add(n),n instanceof Date)return{kind:"date",value:isNaN(n.getTime())?"Invalid Date":n.toISOString()};if(n instanceof RegExp)return{kind:"regexp",value:String(n)};if(n instanceof Error){const o={kind:"error",ctor:n.name||"Error",message:String(n.message||""),stack:n.stack?String(n.stack):"",entries:[]};try{Object.keys(n).slice(0,y).forEach(r=>{o.entries.push({key:r,value:k(n[r],e+1,t)})})}catch(a){}return o}if(Array.isArray(n)){const o={kind:"array",length:n.length,entries:[],truncated:!1},r=Math.min(n.length,y);for(let d=0;d<r;d++)try{o.entries.push({key:String(d),index:!0,value:k(n[d],e+1,t)})}catch(a){o.entries.push({key:String(d),index:!0,value:{kind:"string",value:"[Uninspectable]"}})}return n.length>r&&(o.truncated=!0),t.delete(n),o}const r={kind:"object",ctor:w(n),entries:[],truncated:!1};let d=[];try{d=Object.keys(n)}catch(a){}const c=Math.min(d.length,y);for(let s=0;s<c;s++){const o=d[s];try{r.entries.push({key:o,value:k(n[o],e+1,t)})}catch(a){r.entries.push({key:o,value:{kind:"string",value:"[Uninspectable]"}})}}return d.length>c&&(r.truncated=!0),t.delete(n),r}function w(n){try{if(n&&n.constructor&&n.constructor.name)return n.constructor.name}catch(e){}return"Object"}function E(n){return n.map(n=>k(n))}function C(n,e={}){const t=document.createElement("span");if(t.className="dc-value",!n||"string"!=typeof n.kind)return t.textContent=String(n),t;switch(n.kind){case"null":return t.classList.add("dc-primitive-null"),t.textContent="null",t;case"undefined":return t.classList.add("dc-primitive-undefined"),t.textContent="undefined",t;case"string":return t.classList.add("dc-primitive-string"),t.textContent=`"${n.value}"`,t;case"number":return t.classList.add("dc-primitive-number"),t.textContent=String(n.value),t;case"boolean":return t.classList.add("dc-primitive-boolean"),t.textContent=String(n.value),t;case"bigint":return t.classList.add("dc-primitive-bigint"),t.textContent=String(n.value),t;case"symbol":return t.classList.add("dc-primitive-symbol"),t.textContent=String(n.value),t;case"function":return t.classList.add("dc-primitive-function"),t.textContent=String(n.value),t;case"date":return t.classList.add("dc-primitive-string"),t.textContent=`Date("${n.value}")`,t;case"regexp":return t.classList.add("dc-primitive-string"),t.textContent=n.value,t;case"circular":return t.classList.add("dc-primitive-null"),t.textContent="[Circular]",t;case"error":return S(n,{summary:`${n.ctor||"Error"}: ${n.message||""}`});case"array":return S(n,{summary:`[${null!=n.length?n.length+" items":"…"}]`});case"object":return S(n,{summary:`{${n.ctor&&"Object"!==n.ctor?n.ctor+" ":""}…}`});default:return t.textContent="[Unknown]",t}}function S(n,e={}){const t=document.createElement("span");t.className="dc-object-node";const o=document.createElement("span");o.className="dc-object-toggle";const r=document.createElement("span");r.className="dc-object-arrow",r.textContent="▶";const d=document.createElement("span");d.className="dc-object-summary",d.textContent=e.summary||"{…}",o.appendChild(r),o.appendChild(d);const c=document.createElement("div");c.className="dc-object-children";const a=Array.isArray(n.entries)?n.entries:[];if(a.forEach(n=>{const t=document.createElement("div");t.className="dc-object-row";const o=document.createElement("span");o.className=n.index?"dc-object-key-index":"dc-object-key",o.textContent=n.index?`[${n.key}] `:`${n.key}: `,t.appendChild(o),t.appendChild(C(n.value,{depth:(e.depth||0)+1})),c.appendChild(t)}),n.truncated){const n=document.createElement("div");n.className="dc-object-more",n.textContent="… more",c.appendChild(n)}if("error"===n.kind&&n.stack){const e=document.createElement("div");e.className="dc-object-more",e.style.whiteSpace="pre-wrap",e.style.marginTop="4px",e.textContent=n.stack,c.appendChild(e)}return o.addEventListener("click",n=>{n.stopPropagation();const e=c.classList.toggle("open");r.textContent=e?"▼":"▶"}),t.appendChild(o),(a.length||n.truncated||n.stack)&&t.appendChild(c),t}function N(n,e){e&&e.length?e.forEach((e,t)=>{t>0&&n.appendChild(document.createTextNode(" ")),n.appendChild(C(e))}):n.textContent=""}const L={};function $(n,e,t={}){if("error"===n){r.errorCount++;const n=f();n&&(n.textContent=r.errorCount>99?"99+":r.errorCount,n.style.display="flex")}const o={id:r.nextLogId++,type:n,args:E(e),ts:v(),groupDepth:null!=t.groupDepth?t.groupDepth:r.groupDepth,restored:!1};r.logs.push(o),B(),G(),x("console",r.logs.length),"console"===r.activeTab&&I()}function T(n,e){const t=r.groupDepth,o={id:r.nextLogId++,type:"group",args:E(e),ts:v(),groupDepth:t,collapsed:!!n,restored:!1};r.logs.push(o),r.groupDepth++,B(),G(),x("console",r.logs.length),"console"===r.activeTab&&I()}function z(n){if(!Array.isArray(n))return{tabular:!1,value:k(n)};const e=n.slice(0,y).map((n,e)=>{const t={};return n&&"object"==typeof n&&!Array.isArray(n)?Object.keys(n).slice(0,y).forEach(e=>{t[e]=k(n[e])}):t.value=k(n),{index:e,cells:t}});return{tabular:!0,rows:e,truncated:n.length>e.length}}function B(){const n=Math.max(1,Number(r.settings.maxEntries)||500);for(;r.logs.length>n;)r.logs.shift()}function I(){const n=s();if(!n)return;if(n.innerHTML="",!r.logs.length)return void(n.innerHTML='<div class="dc-empty">No console entries yet</div>');const e=document.createDocumentFragment();let t=null,o=-1;r.logs.forEach((n,r)=>{if(n.restored||!0!==t||e.appendChild(function(){const n=document.createElement("div");return n.className="dc-reload-separator",n.textContent="reloaded",n}()),t=!!n.restored,r<o)return;const d=q(n,r);d&&(e.appendChild(d),"group"===n.type&&d.dataset.groupEnd&&(o=parseInt(d.dataset.groupEnd,10)))}),n.appendChild(e),r.settings.autoScroll&&(n.scrollTop=n.scrollHeight)}function q(n,e){if("group"===n.type)return function(n,e){const t=document.createElement("div");t.className="dc-entry dc-entry-group",t.style.fontSize=r.settings.fontSize+"px";const o=document.createElement("span");o.className="dc-group-arrow",o.textContent="▶";const d=document.createElement("span");if(d.className="dc-entry-body",N(d,n.args),r.settings.timestamps){const e=document.createElement("span");e.className="dc-ts",e.textContent=n.ts,t.appendChild(e)}t.appendChild(o),t.appendChild(d);const c=document.createElement("div");c.className="dc-group-children";const a=function(n,e){for(let t=n+1;t<r.logs.length;t++){const n=r.logs[t];if("group"===n.type&&n.groupDepth<=e)return t;if(n.groupDepth<e)return t}return r.logs.length}(e,n.groupDepth);if(a>e+1){const d=document.createDocumentFragment();for(let n=e+1;n<a;n++){const e=q(r.logs[n],n);e&&d.appendChild(e)}c.appendChild(d),n.collapsed?c.classList.add("collapsed"):o.classList.add("open"),t.addEventListener("click",n=>{n.stopPropagation();const e=c.classList.toggle("collapsed");o.classList.toggle("open",!e)}),t.dataset.groupEnd=String(a),t.appendChild(c)}return t}(n,e);if("table"===n.type)return function(n){const e=document.createElement("div");e.className="dc-entry dc-entry-table",n.groupDepth>0&&e.classList.add("dc-grouped");if(e.style.fontSize=r.settings.fontSize+"px",r.settings.timestamps){const t=document.createElement("span");t.className="dc-ts",t.textContent=n.ts,e.appendChild(t)}const t=document.createElement("div");t.className="dc-entry-body";const o=n.table;if(!o||!o.tabular)return N(t,n.args),e.appendChild(t),e;const d=document.createElement("div");d.className="dc-table-wrap";const c=document.createElement("table");c.className="dc-console-table";const a=new Set;o.rows.forEach(n=>{Object.keys(n.cells).forEach(n=>a.add(n))});const s=[...a],i=document.createElement("thead"),l=document.createElement("tr"),p=document.createElement("th");p.textContent="(index)",l.appendChild(p),s.forEach(n=>{const e=document.createElement("th");e.textContent=n,l.appendChild(e)}),i.appendChild(l),c.appendChild(i);const u=document.createElement("tbody");if(o.rows.forEach(n=>{const e=document.createElement("tr"),t=document.createElement("td");t.textContent=String(n.index),e.appendChild(t),s.forEach(t=>{const o=document.createElement("td");n.cells[t]?o.appendChild(C(n.cells[t])):o.textContent="—",e.appendChild(o)}),u.appendChild(e)}),c.appendChild(u),d.appendChild(c),t.appendChild(d),o.truncated){const n=document.createElement("div");n.className="dc-object-more",n.textContent="… more rows",t.appendChild(n)}return e.appendChild(t),e}(n);const t=document.createElement("div");if(t.className=`dc-entry dc-entry-${n.type}`,n.groupDepth>0&&t.classList.add("dc-grouped"),t.style.fontSize=r.settings.fontSize+"px",r.settings.timestamps){const e=document.createElement("span");e.className="dc-ts",e.textContent=n.ts,t.appendChild(e)}const o=document.createElement("span");return o.className="dc-entry-body",N(o,n.args),t.appendChild(o),t}["log","warn","error","info","table","group","groupCollapsed","groupEnd"].forEach(n=>{"function"==typeof console[n]&&(L[n]=console[n].bind(console))}),["log","warn","error","info"].forEach(n=>{L[n]&&(console[n]=(...e)=>{L[n](...e),$(n,e)})}),L.table&&(console.table=(...n)=>{L.table(...n),function(n){const e=n.length>0?n[0]:void 0,t={id:r.nextLogId++,type:"table",args:E(n),table:z(e),ts:v(),groupDepth:r.groupDepth,restored:!1};r.logs.push(t),B(),G(),x("console",r.logs.length),"console"===r.activeTab&&I()}(n)}),L.group&&(console.group=(...n)=>{L.group(...n),T(!1,n)}),L.groupCollapsed&&(console.groupCollapsed=(...n)=>{L.groupCollapsed(...n),T(!0,n)}),L.groupEnd&&(console.groupEnd=(...n)=>{L.groupEnd(...n),r.groupDepth=Math.max(0,r.groupDepth-1)});let H=window.onerror;function j(n){$("error",[n.reason instanceof Error?n.reason:`Unhandled Promise Rejection: ${String(n.reason)}`])}r.settings.captureErrors&&(H=window.onerror,window.onerror=function(n,e,t,o,r){if($("error",[r||`${n} @ ${e}:${t}:${o}`]),"function"==typeof H)try{return H.apply(this,arguments)}catch(d){}return!1},window.addEventListener("unhandledrejection",j));const R=window.fetch;function D(n){if(!n)return!1;const e=n.toLowerCase();return e.includes("application/octet-stream")||e.includes("image/")||e.includes("audio/")||e.includes("video/")||e.includes("application/pdf")||e.includes("application/zip")||e.includes("application/gzip")||e.includes("application/wasm")}function A(n){return!n||!D(n)}function M(n){if(null==n)return null;if("string"==typeof n)return n;if(n instanceof URLSearchParams)return n.toString();if(n instanceof FormData){const t={};try{n.forEach((n,e)=>{n instanceof File?t[e]=`[File ${n.name}, ${n.size} bytes]`:t[e]=String(n)})}catch(e){return"[FormData]"}return JSON.stringify(t,null,2)}if(n instanceof Blob)return D(n.type)?null:`[Blob ${n.type||"unknown"}, ${n.size} bytes]`;if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return null;try{return JSON.stringify(n,null,2)}catch(e){return String(n)}}R&&(window.fetch=async(...n)=>{if(!r.settings.monitorNetwork)return R.apply(window,n);const e=Date.now();let t="GET",o="";try{o=n[0]instanceof Request?n[0].url:String(n[0]),n[1]&&n[1].method&&(t=String(n[1].method).toUpperCase()),n[0]instanceof Request&&(t=n[0].method.toUpperCase())}catch(c){o=String(n[0])}const d={method:t,url:o,ts:v(),startTime:e,status:null,statusText:"",duration:null,headers:{},requestHeaders:{},requestBody:null,responseBody:null,error:null};try{(n[0]instanceof Request?n[0]:new Request(o,n[1])).headers.forEach((n,e)=>{d.requestHeaders[e]=n})}catch(c){}d.requestBody=await async function(n,e){try{if(e&&null!=e.body)return M(e.body);if(n instanceof Request){const e=n.clone();return e.bodyUsed||!A(e.headers.get("content-type"))?null:await e.text()}}catch(c){}return null}(n[0],n[1]);try{const t=await R.apply(window,n);d.status=t.status,d.statusText=t.statusText,d.duration=Date.now()-e;try{t.headers.forEach((n,e)=>{d.headers[e]=n})}catch(c){}return U(d),async function(n){try{if(!A(n.headers.get("content-type")||""))return null;const e=n.clone();return e.bodyUsed?null:await e.text()}catch(c){return null}}(t).then(n=>{null!=n&&(d.responseBody=n,"network"===r.activeTab&&F(),G())}).catch(()=>{}),t}catch(c){throw d.error=c&&c.message?c.message:String(c),d.duration=Date.now()-e,U(d),c}});const P=XMLHttpRequest.prototype.open,_=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,e){return r.settings.monitorNetwork?(this.__dcReq={method:String(n).toUpperCase(),url:String(e),ts:v(),startTime:0,requestBody:null,responseBody:null,requestHeaders:{}},P.apply(this,arguments)):P.apply(this,arguments)};const O=XMLHttpRequest.prototype.setRequestHeader;function U(n){r.network.unshift(n),r.network.length>r.settings.maxEntries&&r.network.pop(),G(),x("network",r.network.length),"network"===r.activeTab&&F()}function F(n){const e=i();if(!e)return;const t=(n=void 0!==n?n:b()?b().value:"").trim().toLowerCase(),o=t?r.network.filter(n=>String(n.url).toLowerCase().includes(t)||String(n.method).toLowerCase().includes(t)):r.network;e.innerHTML="",o.length?o.forEach(n=>{e.appendChild(function(n){const e=document.createElement("div");e.className="dc-req";const t=document.createElement("div");t.className="dc-req-top";const o=document.createElement("span");o.className="dc-method "+(r=n.method,`m-${["GET","POST","PUT","DELETE","PATCH"].includes(r)?r:"UNK"}`),o.textContent=n.method;var r;const d=document.createElement("span");d.className="dc-req-url",d.title=n.url,d.textContent=function(n,e=55){if(!n||n.length<=e)return n;try{const e=new URL(n),t=e.pathname.split("/").pop()||"";return`${e.hostname}/…/${t}`}catch(t){return n.slice(0,e)+"…"}}(n.url);const c=document.createElement("span");c.className="dc-req-status "+(n.error?"s-err":(a=n.status,a?a<300?"s-ok":a<400?"s-redir":"s-err":"")),c.textContent=n.status?String(n.status):n.error?"ERR":"…",t.appendChild(o),t.appendChild(d),t.appendChild(c);var a;const s=document.createElement("div");s.className="dc-req-meta";const i=null!=n.duration?`${n.duration}ms · `:"";s.textContent=`${i}${n.ts}`+(n.error?` · ${n.error}`:"");const l=document.createElement("div");return l.className="dc-req-detail",function(n,e){(function(n,e,t){const o=document.createElement("div");o.className="dc-detail-section";const r=document.createElement("div");r.className="dc-detail-title",r.textContent=e,o.appendChild(r),t.forEach(([n,e])=>{const t=document.createElement("div");t.className="dc-detail-row";const r=document.createElement("span");r.className="dc-detail-key",r.textContent=`${n}: `,t.appendChild(r),t.appendChild(document.createTextNode(String(e??"–"))),o.appendChild(t)}),n.appendChild(o)})(n,"General",[["URL",e.url],["Method",e.method],["Status",`${e.status||e.error||"–"} ${e.statusText||""}`],["Duration",null!=e.duration?`${e.duration}ms`:"–"]]),J(n,"Request Headers",e.requestHeaders),K(n,"Request Body",e.requestBody),J(n,"Response Headers",e.headers),K(n,"Response Body",e.responseBody)}(l,n),e.appendChild(t),e.appendChild(s),e.appendChild(l),e.addEventListener("click",n=>{if(n.target.closest(".dc-body-toggle"))return;const t=l.classList.toggle("open");e.classList.toggle("expanded",t)}),e}(n))}):e.innerHTML='<div class="dc-empty">No requests captured yet</div>'}function J(n,e,t){const o=document.createElement("div");o.className="dc-detail-section";const r=document.createElement("div");r.className="dc-detail-title",r.textContent=e,o.appendChild(r);const d=t?Object.entries(t):[];if(d.length)d.forEach(([n,e])=>{const t=document.createElement("div");t.className="dc-detail-row";const r=document.createElement("span");r.className="dc-detail-key",r.textContent=`${n}: `,t.appendChild(r),t.appendChild(document.createTextNode(String(e))),o.appendChild(t)});else{const n=document.createElement("div");n.className="dc-detail-row",n.style.color="var(--dc-text2)",n.textContent="none",o.appendChild(n)}n.appendChild(o)}function K(n,e,t){if(null==t||""===t)return;const o=document.createElement("div");o.className="dc-detail-section";const r=document.createElement("div");r.className="dc-detail-title",r.textContent=e,o.appendChild(r);const d=document.createElement("div");d.className="dc-body-block";const c=String(t);if(c.length<=10240){const n=document.createElement("pre");n.className="dc-body-pre",n.textContent=X(c),d.appendChild(n)}else{const n=document.createElement("pre");n.className="dc-body-pre",n.textContent=X(c.slice(0,10240))+"\n…";const e=document.createElement("pre");e.className="dc-body-full",e.textContent=X(c);const t=document.createElement("div");t.className="dc-body-truncated",t.textContent=`Showing first 10 KB of ${a=c.length,a<1024?`${a} B`:a<1048576?`${(a/1024).toFixed(1)} KB`:`${(a/1024/1024).toFixed(1)} MB`}.`;const o=document.createElement("button");o.className="dc-body-toggle",o.textContent="Show full",o.addEventListener("click",n=>{n.stopPropagation();const t=e.classList.toggle("open");o.textContent=t?"Hide full":"Show full"}),d.appendChild(n),d.appendChild(t),d.appendChild(o),d.appendChild(e)}var a;o.appendChild(d),n.appendChild(o)}function X(n){const e=n.trim();if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))try{return JSON.stringify(JSON.parse(e),null,2)}catch(t){}return n}function G(){if(r.settings.persistBuffer)try{const t={version:n,savedAt:Date.now(),logs:r.logs.slice(-r.settings.maxEntries),network:r.network.slice(0,r.settings.maxEntries)};sessionStorage.setItem(e,JSON.stringify(t))}catch(t){}}function W(){try{sessionStorage.removeItem(e)}catch(n){}}async function Y(){if(r.dbs=[],window.indexedDB){try{if(indexedDB.databases){const e=await indexedDB.databases();for(const t of e)try{await V(t.name,t.version)}catch(n){}}}catch(n){}Q()}}function V(n,e){return new Promise((t,o)=>{const d=indexedDB.open(n,e);d.onerror=()=>o(d.error),d.onsuccess=()=>{const n=d.result,e={name:n.name,version:n.version,stores:[]},o=[...n.objectStoreNames];let c=o.length;if(!c)return n.close(),r.dbs.push(e),t(e);o.forEach(o=>{(function(n,e){return new Promise((t,o)=>{const r=n.transaction([e],"readonly").objectStore(e),d=r.count();d.onsuccess=()=>{const n={name:e,count:d.result,keyPath:r.keyPath,data:[]},o=r.getAll(void 0,20);o.onsuccess=()=>{n.data=o.result,t(n)},o.onerror=()=>t(n)},d.onerror=()=>t({name:e,count:0,keyPath:null,data:[]})})})(n,o).then(o=>{e.stores.push(o),0===--c&&(n.close(),r.dbs.push(e),t(e))}).catch(()=>{e.stores.push({name:o,count:0,keyPath:null,data:[]}),0===--c&&(n.close(),r.dbs.push(e),t(e))})})}})}function Q(){const n=l();if(n)switch(r.activeStorage){case"indexeddb":!function(n){if(!r.dbs.length)return void(n.innerHTML='<div class="dc-empty">No IndexedDB databases found</div>');n.innerHTML=r.dbs.map((n,e)=>`\n <div class="dc-db-card" id="db-card-${e}">\n <div class="dc-db-header" onclick="window.__dcToggleDb(${e})">\n <div>\n <div class="dc-db-name">${h(n.name)}</div>\n <div class="dc-db-meta">\n v${n.version} ·\n ${n.stores.length}\n store${1!==n.stores.length?"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 ${n.stores.map((n,t)=>`\n <div class="dc-store-item" onclick="window.__dcToggleStore(${e},${t})">\n <div class="dc-store-name">${h(n.name)}</div>\n <div class="dc-store-meta">\n ${n.count} records ·\n keyPath: ${n.keyPath||"none"}\n </div>\n\n <div class="dc-data-viewer" id="store-${e}-${t}">\n ${n.data.length?n.data.slice(0,20).map(e=>{return`\n <div class="dc-data-row">\n <div class="dc-data-key">\n · ${h((t=e,o=n.keyPath,o?"string"==typeof o?String(t[o]??"—"):JSON.stringify(o):"—"))}\n </div>\n <div class="dc-data-val">\n ${h(function(n){if("object"==typeof n&&null!==n)try{const e=JSON.stringify(n,null,2);return e.length>300?e.slice(0,300)+"…":e}catch(t){return"[Unserializable]"}const e=String(n);return e.length>200?e.slice(0,200)+"…":e}(e))}\n </div>\n </div>\n `;var t,o}).join(""):'<div style="color:var(--dc-text2);font-size:11px;padding:8px">Empty store</div>'}\n </div>\n </div>\n `).join("")}\n </div>\n </div>\n `).join("")}(n);break;case"localstorage":renderKV(n,localStorage,"localStorage");break;case"sessionstorage":renderKV(n,sessionStorage,"sessionStorage")}}function Z(){const n=p();if(!n)return;n.innerHTML="";const e=document.createElement("div");e.className="dc-tree",e.appendChild(nn(document.body)),n.appendChild(e)}function nn(n){const e=document.createElement("div"),t=[...n.children],o=t.length>0,r=document.createElement("div");r.className="dc-node-label";const d=document.createElement("span");d.className="dc-arrow",d.textContent=o?"▶":" ",r.appendChild(d);const c=document.createElement("span");if(c.className="dc-tag",c.textContent=`<${n.tagName.toLowerCase()}`,r.appendChild(c),n.id){const e=document.createElement("span");e.className="dc-id",e.textContent=` #${n.id}`,r.appendChild(e)}if(n.className&&"string"==typeof n.className&&n.className.trim()){const e=document.createElement("span");e.className="dc-cls";const t=n.className.trim().split(/\s+/).slice(0,3).map(n=>`.${n}`).join("");e.textContent=t,r.appendChild(e)}const a=document.createElement("span");a.className="dc-tag",a.textContent=">",r.appendChild(a);const s=n.childNodes.length?[...n.childNodes].find(n=>3===n.nodeType&&n.textContent.trim()):null;if(s){const n=document.createElement("span");n.className="dc-txt-preview",n.textContent=" "+s.textContent.trim().slice(0,30),r.appendChild(n)}if(r.addEventListener("click",t=>{if(t.stopPropagation(),o){const n=e.querySelector(":scope > .dc-children"),t=n&&n.classList.contains("open");n&&n.classList.toggle("open",!t),d.textContent=t?"▶":"▼"}en(n)}),e.appendChild(r),o){const n=document.createElement("div");n.className="dc-children",t.forEach(e=>{n.appendChild(nn(e))}),e.appendChild(n)}return e}function en(n){const e=document.getElementById("dc-node-detail");e&&e.remove();const t=document.createElement("div");t.className="dc-node-detail",t.id="dc-node-detail";const o=`<${n.tagName.toLowerCase()}>`,r=[...n.attributes],d=window.getComputedStyle(n);t.innerHTML=`\n <div style="color:var(--dc-accent2);font-size:12px;font-weight:700;margin-bottom:8px">\n ${h(o)}\n </div>\n\n ${r.length?`\n <div class="dc-detail-title">Attributes</div>\n ${r.map(n=>`\n <div class="dc-attr-row">\n <span class="dc-attr-name">${h(n.name)}</span>=\n <span class="dc-attr-val">"${h(n.value)}"</span>\n </div>\n `).join("")}\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(n.offsetWidth)}×${Math.round(n.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">${d.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">${d.position}</span>\n </div>\n `,p().prepend(t)}XMLHttpRequest.prototype.setRequestHeader=function(n,e){return this.__dcReq&&(this.__dcReq.requestHeaders[n]=String(e)),O.apply(this,arguments)},XMLHttpRequest.prototype.send=function(n){if(!r.settings.monitorNetwork||!this.__dcReq)return _.apply(this,arguments);const e=this.__dcReq;return e.startTime=Date.now(),e.requestBody=M(n),this.addEventListener("loadend",()=>{e.status=this.status,e.statusText=this.statusText,e.duration=Date.now()-e.startTime,e.headers={};try{const n=this.getAllResponseHeaders();n&&n.split("\r\n").filter(Boolean).forEach(n=>{const t=n.indexOf(": ");t>0&&(e.headers[n.slice(0,t)]=n.slice(t+2))})}catch(n){}e.error=0===this.status?"Request failed":null;try{const n=this.responseType||"";if(""===n||"text"===n){A(e.headers["content-type"]||"")&&(e.responseBody=this.responseText||null)}}catch(n){}U(e)}),_.apply(this,arguments)},function(){if(r.settings.persistBuffer)try{const n=sessionStorage.getItem(e);if(!n)return;const t=JSON.parse(n);if(!t||"object"!=typeof t)return;Array.isArray(t.logs)&&(r.logs=t.logs.map(n=>({...n,restored:!0}))),Array.isArray(t.network)&&(r.network=t.network),r.logs.forEach(n=>{n.id>=r.nextLogId&&(r.nextLogId=n.id+1)}),x("console",r.logs.length),x("network",r.network.length)}catch(n){try{sessionStorage.removeItem(e)}catch(t){}}}(),window.__dcToggleDb=function(n){const e=document.getElementById(`db-card-${n}`);e&&e.classList.toggle("open")},window.__dcToggleStore=function(n,e){const t=document.getElementById(`store-${n}-${e}`);t&&t.classList.toggle("open")};let tn=null,on=null,rn=null;function dn(){r.isPicking=!1;const n=document.getElementById("dom-pick-btn");n&&n.classList.remove("picking"),tn&&(document.removeEventListener("click",tn,!0),tn=null),on&&(document.removeEventListener("mouseover",on,!0),on=null)}function cn(n,e,t,o){return`\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">${e}</div>\n <div class="dc-setting-desc">${t}</div>\n </div>\n <label class="dc-toggle">\n <input type="checkbox" id="${n}" ${o?"checked":""}>\n <span class="dc-toggle-track"></span>\n </label>\n </div>`}function an(n,e,t,o,r){return`\n <div class="dc-setting-row">\n <div class="dc-setting-info">\n <div class="dc-setting-name">${e}</div>\n <div class="dc-setting-desc">${t}</div>\n </div>\n <select class="dc-select" id="${n}">\n ${o.map(n=>`<option value="${n}" ${r===n?"selected":""}>${n}</option>`).join("")}\n </select>\n </div>`}function sn(n){switch(r.activeTab=n,document.querySelectorAll(".dc-tab").forEach(e=>e.classList.toggle("active",e.dataset.tab===n)),document.querySelectorAll(".dc-panel-content").forEach(e=>e.classList.toggle("active",e.id===`panel-${n}`)),n){case"console":I();break;case"network":F();break;case"storage":Y();break;case"dom":Z();break;case"system":!function(){const n=u();if(!n)return;const e=navigator,t=window.performance,o=t&&t.memory,r=e.connection||e.mozConnection||e.webkitConnection,d=[["Screen",`${screen.width}×${screen.height} (devicePR: ${window.devicePixelRatio})`],["Viewport",`${window.innerWidth}×${window.innerHeight}`],["Platform",e.platform||"—"],["Language",e.language||"—"],["Online",e.onLine?"✅ Online":"❌ Offline"],["Cookies",e.cookieEnabled?"Enabled":"Disabled"],["HW Concurrency",e.hardwareConcurrency||"—"]];if(r&&(d.push(["Connection",`${r.effectiveType||"—"} · ${r.downlink||"—"} Mbps`]),d.push(["RTT",null!=r.rtt?`${r.rtt}ms`:"—"])),o){const n=n=>(n/1048576).toFixed(1)+" MB";d.push(["Heap Used",n(o.usedJSHeapSize)]),d.push(["Heap Limit",n(o.jsHeapSizeLimit)])}if(t){const n=t.getEntriesByType&&t.getEntriesByType("navigation")[0];n&&(d.push(["Page Load",`${Math.round(n.loadEventEnd)}ms`]),d.push(["DOM Ready",`${Math.round(n.domContentLoadedEventEnd)}ms`]))}n.innerHTML=d.map(([n,e])=>`\n <div class="dc-sys-card">\n <div class="dc-sys-label">${h(n)}</div>\n <div class="dc-sys-val">${h(String(e))}</div>\n </div>\n `).join("")+`\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 ${h(e.userAgent)}\n </div>\n </div>\n `}();break;case"settings":!function(){const n=g();if(!n)return;const e=r.settings;n.innerHTML=cn("s-ts","Timestamps","Show time prefix on each log entry",e.timestamps)+cn("s-as","Auto-scroll","Scroll to latest entry automatically",e.autoScroll)+cn("s-ce","Capture Global Errors","window.onerror + unhandledrejection",e.captureErrors)+cn("s-mn","Monitor Network","Intercept fetch + XHR requests",e.monitorNetwork)+cn("s-pb","Persist Across Reload","Keep console and network history in sessionStorage",e.persistBuffer)+an("s-fs","Font Size","Console output font size (px)",[10,11,12,13,14],e.fontSize)+an("s-me","Max Log Entries","Older entries are discarded",[100,250,500,1e3,2e3],e.maxEntries)+'<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>',document.getElementById("s-ts").onchange=n=>{e.timestamps=n.target.checked,d(),I()},document.getElementById("s-as").onchange=n=>{e.autoScroll=n.target.checked,d()},document.getElementById("s-ce").onchange=n=>{e.captureErrors=n.target.checked,d()},document.getElementById("s-mn").onchange=n=>{e.monitorNetwork=n.target.checked,d()},document.getElementById("s-pb").onchange=n=>{e.persistBuffer=n.target.checked,d(),e.persistBuffer?G():W()},document.getElementById("s-fs").onchange=n=>{e.fontSize=parseInt(n.target.value,10),d(),"console"===r.activeTab&&I()},document.getElementById("s-me").onchange=n=>{e.maxEntries=parseInt(n.target.value,10),B(),r.network.length>e.maxEntries&&(r.network=r.network.slice(0,e.maxEntries)),d(),G(),x("console",r.logs.length),x("network",r.network.length),I()},document.getElementById("dc-settings-clear").addEventListener("click",window.__dcClearAll)}()}}window.__dcClearAll=function(){r.logs=[],r.network=[],r.errorCount=0,r.groupDepth=0,W();const n=f();n&&(n.style.display="none",n.textContent="0"),x("console",0),x("network",0),I(),F()};let ln=!1;function pn(){ln=!ln;const n=a();ln?(n.style.display="flex",requestAnimationFrame(()=>{n.classList.add("visible")}),sn(r.activeTab)):(n.classList.remove("visible"),setTimeout(()=>{ln||(n.style.display="none")},260)),function(){const n=c();n&&(n.innerHTML=`${ln?"✕":"⌥"}<span class="dc-fab-badge" id="dc-error-badge" style="display:${r.errorCount>0?"flex":"none"}">${r.errorCount}</span>`)}()}function un(n){if(!n)return"";switch(n.kind){case"string":return`"${n.value}"`;case"null":case"undefined":case"number":case"boolean":case"bigint":case"symbol":case"function":return String(n.value??n.kind);case"date":case"regexp":case"circular":return String(n.value||`[${n.kind}]`);case"error":return`${n.ctor}: ${n.message}`;case"array":case"object":try{return JSON.stringify(n,null,2)}catch(e){return"[Object]"}default:return"[Unknown]"}}!function(){const n=document.getElementById("dc-drag"),e=document.getElementById("dc-panel");let t=!1,o=0,r=0;function d(n){t=!0,o=n.clientY||n.touches&&n.touches[0].clientY,r=e.offsetHeight,document.body.style.userSelect="none"}function c(n){if(!t)return;const d=n.clientY||n.touches&&n.touches[0].clientY,c=Math.max(120,Math.min(.85*window.innerHeight,r+(o-d)));e.style.height=c+"px"}function a(){t=!1,document.body.style.userSelect=""}n.addEventListener("mousedown",d),n.addEventListener("touchstart",d,{passive:!0}),document.addEventListener("mousemove",c),document.addEventListener("touchmove",c,{passive:!0}),document.addEventListener("mouseup",a),document.addEventListener("touchend",a)}(),document.getElementById("dc-fab").addEventListener("click",pn),document.getElementById("dc-minimize-btn").addEventListener("click",pn),document.querySelectorAll(".dc-tab").forEach(n=>{n.addEventListener("click",()=>sn(n.dataset.tab))}),document.getElementById("dc-clear-btn").addEventListener("click",()=>{switch(r.activeTab){case"console":r.logs=[],r.groupDepth=0,W(),x("console",0),I();break;case"network":r.network=[],W(),x("network",0),F()}}),document.getElementById("dc-copy-btn").addEventListener("click",()=>{let n="";"console"===r.activeTab?n=r.logs.map(n=>`[${n.ts}] [${String(n.type).toUpperCase()}] ${function(n){if("table"===n.type&&n.table)try{return JSON.stringify(n.table,null,2)}catch(e){}return(n.args||[]).map(un).join(" ")}(n)}`).join("\n"):"network"===r.activeTab&&(n=r.network.map(n=>`[${n.ts}] ${n.method} ${n.url} → ${n.status||"ERR"} (${n.duration}ms)`+(n.requestBody?`\nRequest: ${n.requestBody}`:"")+(n.responseBody?`\nResponse: ${n.responseBody}`:"")).join("\n\n")),n&&navigator.clipboard&&navigator.clipboard.writeText&&navigator.clipboard.writeText(n).catch(()=>{})}),b().addEventListener("input",n=>F(n.target.value)),document.getElementById("net-clear").addEventListener("click",()=>{r.network=[],W(),x("network",0),F()}),document.querySelectorAll(".dc-st-btn").forEach(n=>{n.addEventListener("click",()=>{r.activeStorage=n.dataset.storage,document.querySelectorAll(".dc-st-btn").forEach(e=>e.classList.toggle("active",e===n)),Q()})}),document.getElementById("storage-refresh").addEventListener("click",Y),document.getElementById("dom-refresh-btn").addEventListener("click",Z),document.getElementById("dom-pick-btn").addEventListener("click",()=>{r.isPicking?dn():function(){r.isPicking=!0;const n=document.getElementById("dom-pick-btn");n&&n.classList.add("picking"),tn=n=>{n.target.closest("#dc-panel")||n.target.closest("#dc-fab")||(n.preventDefault(),n.stopPropagation(),rn&&rn.classList.remove("dc-pick-highlight"),rn=n.target,rn.classList.add("dc-pick-highlight"),en(rn),dn())},on=n=>{r.isPicking&&(n.target.closest("#dc-panel")||n.target.closest("#dc-fab")||(rn&&rn.classList.remove("dc-pick-highlight"),rn=n.target,rn.classList.add("dc-pick-highlight")))},document.addEventListener("click",tn,!0),document.addEventListener("mouseover",on,!0)}()}),document.getElementById("dom-collapse-btn").addEventListener("click",()=>{document.querySelectorAll(".dc-children.open").forEach(n=>n.classList.remove("open")),document.querySelectorAll(".dc-arrow").forEach(n=>{"▼"===n.textContent&&(n.textContent="▶")})});let gn=location.href;setInterval(()=>{location.href!==gn&&(gn=location.href,$("info",["🔄 SPA navigation detected:",location.href]))},1e3),function(){const n=m();if(!n)return;function e(){const e=n.value.trim();if(!e)return;r.replHistory.unshift(e),r.replHistory.length>50&&r.replHistory.pop(),r.replHistoryIdx=-1;const t=document.createElement("div");if(t.className="dc-entry dc-entry-cmd",t.style.fontSize=r.settings.fontSize+"px",r.settings.timestamps){const n=document.createElement("span");n.className="dc-ts",n.textContent=v(),t.appendChild(n)}const o=document.createElement("span");o.className="dc-entry-body",o.textContent=`▶ ${e}`,t.appendChild(o),s().appendChild(t);try{const n=(0,eval)(e);if(void 0!==n){const e=document.createElement("div");if(e.className="dc-entry dc-entry-log",e.style.fontSize=r.settings.fontSize+"px",r.settings.timestamps){const n=document.createElement("span");n.className="dc-ts",n.textContent=v(),e.appendChild(n)}const t=document.createElement("span");t.className="dc-entry-body",t.appendChild(C(k(n))),e.appendChild(t),s().appendChild(e)}}catch(d){const n=document.createElement("div");if(n.className="dc-entry dc-entry-error",n.style.fontSize=r.settings.fontSize+"px",r.settings.timestamps){const e=document.createElement("span");e.className="dc-ts",e.textContent=v(),n.appendChild(e)}const e=document.createElement("span");e.className="dc-entry-body",e.appendChild(C(k(d))),n.appendChild(e),s().appendChild(n)}n.value="",r.settings.autoScroll&&(s().scrollTop=s().scrollHeight),sn("console")}n.addEventListener("keydown",t=>{"Enter"!==t.key?("ArrowUp"===t.key&&(t.preventDefault(),r.replHistoryIdx=Math.min(r.replHistoryIdx+1,r.replHistory.length-1),n.value=r.replHistory[r.replHistoryIdx]||""),"ArrowDown"===t.key&&(t.preventDefault(),r.replHistoryIdx=Math.max(r.replHistoryIdx-1,-1),n.value=r.replHistoryIdx>=0?r.replHistory[r.replHistoryIdx]:"")):e()});const t=document.getElementById("repl-run");t&&t.addEventListener("click",e)}(),I(),r.logs.length?(r.logs.forEach(n=>{n.restored=!0}),$("info",[`🔄 INSIKT v${n} resumed after reload`])):$("log",[`✅ INSIKT v${n} loaded — click ⌥ to open`]),window.insikt={version:n,toggle:pn,clear:window.__dcClearAll,init:()=>{},destroy:()=>{const n=c(),e=a();n&&n.remove(),e&&e.remove(),["log","warn","error","info","table","group","groupCollapsed","groupEnd"].forEach(n=>{L[n]&&(console[n]=L[n])}),R&&(window.fetch=R),XMLHttpRequest.prototype.open=P,XMLHttpRequest.prototype.send=_,XMLHttpRequest.prototype.setRequestHeader=O,window.onerror=H,window.removeEventListener("unhandledrejection",j),dn(),o&&o.parentNode&&o.parentNode.removeChild(o),delete window.__dcToggleReq,delete window.__dcToggleDb,delete window.__dcToggleStore,delete window.__dcClearAll,delete window.insikt}}}()});
|
|
2
2
|
//# sourceMappingURL=insikt.umd.js.map
|