blissful-web-agentation 1.0.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/dist/agentation.cjs.js +851 -0
- package/dist/agentation.cjs.js.map +1 -0
- package/dist/agentation.d.ts +19 -0
- package/dist/agentation.esm.mjs +845 -0
- package/dist/agentation.esm.mjs.map +1 -0
- package/dist/agentation.iife.js +864 -0
- package/dist/agentation.iife.js.map +1 -0
- package/dist/agentation.iife.min.js +2 -0
- package/dist/agentation.iife.min.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentation.iife.js","sources":["../src/core/state.ts","../src/ui/styles.css","../src/ui/styles.ts","../src/ui/shadow-host.ts","../src/ui/icons.ts","../src/utils/dom.ts","../src/overlay/highlight.ts","../src/utils/format.ts","../src/overlay/label.ts","../src/selector/generator.ts","../src/panel/style-reader.ts","../src/utils/clipboard.ts","../src/panel/style-panel.ts","../src/events/mouse.ts","../src/events/keyboard.ts","../src/events/scroll-resize.ts","../src/core/inspector.ts","../src/index.ts","../src/index-iife.ts"],"sourcesContent":["const STORAGE_KEY = 'agentation-prefs';\n\nexport interface InspectorState {\n active: boolean;\n hoveredElement: HTMLElement | null;\n selectedElement: HTMLElement | null;\n panelVisible: boolean;\n shadowHost: HTMLElement | null;\n shadowRoot: ShadowRoot | null;\n highlightColor: string;\n theme: 'dark' | 'light';\n}\n\ninterface StoredPrefs {\n active: boolean;\n highlightColor: string;\n theme: 'dark' | 'light';\n}\n\nconst defaults: StoredPrefs = {\n active: false,\n highlightColor: '#0063F7',\n theme: 'dark',\n};\n\nfunction loadPrefs(): StoredPrefs {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n return { ...defaults, ...parsed };\n }\n } catch {\n // localStorage unavailable or corrupted\n }\n return { ...defaults };\n}\n\nconst prefs = loadPrefs();\n\nexport const state: InspectorState = {\n active: false,\n hoveredElement: null,\n selectedElement: null,\n panelVisible: false,\n shadowHost: null,\n shadowRoot: null,\n highlightColor: prefs.highlightColor,\n theme: prefs.theme,\n};\n\n// Whether the inspector should auto-activate on init\nexport const savedActive: boolean = prefs.active;\n\nexport function savePrefs(): void {\n try {\n const data: StoredPrefs = {\n active: state.active,\n highlightColor: state.highlightColor,\n theme: state.theme,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch {\n // localStorage unavailable\n }\n}\n\nexport function resetState(): void {\n state.active = false;\n state.hoveredElement = null;\n state.selectedElement = null;\n state.panelVisible = false;\n state.highlightColor = '#0063F7';\n state.theme = 'dark';\n}\n","export default \"/* ============================================\\n Agentation — Element Inspector Styles\\n ============================================\\n Edit these to customize the inspector's look.\\n All styles are scoped inside Shadow DOM so they\\n won't leak into the host page.\\n ============================================ */\\n\\n/* --- Host container (don't remove) --- */\\n\\n@import url('https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap');\\n\\n:host {\\n position: fixed !important;\\n top: 0 !important;\\n left: 0 !important;\\n width: 0 !important;\\n height: 0 !important;\\n overflow: visible !important;\\n z-index: 2147483647 !important;\\n pointer-events: none !important;\\n font-family: \\\"Geist\\\", sans-serif;\\n}\\n\\n*, *::before, *::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n}\\n\\n/* --- Highlight overlay (blue border on hover) --- */\\n\\n.ag-highlight {\\n position: fixed;\\n pointer-events: none;\\n border: 2px solid #0063F7;\\n background: #0063f717;\\n border-radius: 2px;\\n transition: top 0.15s cubic-bezier(0.4, 0, 0.2, 1), left 0.15s cubic-bezier(0.4, 0, 0.2, 1), width 0.15s cubic-bezier(0.4, 0, 0.2, 1), height 0.15s cubic-bezier(0.4, 0, 0.2, 1);\\n z-index: 2147483646;\\n}\\n\\n/* --- Floating label (tag name badge) --- */\\n\\n.ag-label {\\n position: fixed;\\n pointer-events: none;\\n background: #28293D;\\n color: #f1f5f9;\\n font-size: 12px;\\n font-weight: 500;\\n line-height: 1;\\n padding: 4px 8px;\\n border-radius: 4px;\\n white-space: nowrap;\\n z-index: 2147483647;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\\n}\\n\\n.ag-label .ag-tag {\\n color: #57EBA1;\\n font-weight: 600;\\n}\\n\\n.ag-label .ag-class {\\n color: #DDA5E9;\\n}\\n\\n.ag-label .ag-dims {\\n color: #94a3b8;\\n margin-left: 6px;\\n}\\n\\n/* --- Toolbar (bottom-right bar) --- */\\n\\n.ag-toolbar {\\n position: fixed;\\n bottom: 16px;\\n right: 16px;\\n display: flex;\\n align-items: center;\\n gap: 0;\\n pointer-events: auto;\\n z-index: 2147483647;\\n background: #1a1a1a;\\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\\n border-radius: 10px;\\n border: 0.5px solid rgba(255, 255, 255, 0.08);\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.75), 0 0.5px 0 0 rgba(255, 255, 255, 0.05) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.05) inset, 0 0 0 0.5px rgba(255, 255, 255, 0.10) inset;\\n padding: 2px;\\n}\\n\\n.ag-toolbar:active {\\n transform: scale(.99);\\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\\n}\\n\\n.ag-toolbar.ag-light {\\n background: #ffff;\\n border-color: none;\\n box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.06), 0px 1px 2px -1px rgba(0, 0, 0, 0.06), 0px 2px 4px 0px rgba(0, 0, 0, 0.04);\\n}\\n\\n.ag-toolbar-divider {\\n width: 1px;\\n height: 20px;\\n background: rgba(255, 255, 255, 0.1);\\n flex-shrink: 0;\\n margin: 0 2px;\\n}\\n\\n.ag-toolbar.ag-light .ag-toolbar-divider {\\n background: rgba(0, 0, 0, 0.12);\\n}\\n\\n/* --- Toggle button (inside toolbar) --- */\\n\\n.ag-toggle {\\n height: 34px;\\n border-radius: 8px;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.5);\\n border: none;\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 0 8px;\\n transition: all 0.15s ease;\\n font-family: \\\"Geist\\\", sans-serif;\\n font-size: 12px;\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n\\n.ag-toggle:hover {\\n background: rgba(255, 255, 255, 0.06);\\n}\\n\\n.ag-toggle.active {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle {\\n color: rgba(0, 0, 0, 0.45);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle.active {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.ag-toggle-label {\\n pointer-events: none;\\n}\\n\\n.ag-toggle-track {\\n width: 40px;\\n height: 24px;\\n border-radius: 12px;\\n background: rgba(255, 255, 255, 0.12);\\n position: relative;\\n transition: background 0.2s ease;\\n pointer-events: none;\\n flex-shrink: 0;\\n}\\n\\n.ag-toggle.active .ag-toggle-track {\\n background: #0063F7;\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle-track {\\n background: rgba(0, 0, 0, 0.15);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle.active .ag-toggle-track {\\n background: #0063F7;\\n}\\n\\n.ag-toggle-knob {\\n position: absolute;\\n top: 3px;\\n left: 3px;\\n width: 18px;\\n height: 18px;\\n border-radius: 50%;\\n background: rgba(255, 255, 255, 1);\\n box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.04), 0 2px 2px 0 rgba(0, 0, 0, 0.02), 0 0.5px 0 0 rgba(255, 255, 255, 0.20) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.10) inset, 0 0 0 0.5px rgba(0, 0, 0, 0.15) inset;\\n transition: all 0.2s ease;\\n}\\n\\n.ag-toggle.active .ag-toggle-knob {\\n left: 19px;\\n background: #fff;\\n}\\n\\n/* --- Color picker --- */\\n\\n.ag-color-picker {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 34px;\\n height: 34px;\\n cursor: pointer;\\n border-radius: 8px;\\n transition: background 0.15s ease;\\n position: relative;\\n}\\n\\n.ag-color-picker:hover {\\n background: rgba(255, 255, 255, 0.06);\\n}\\n\\n.ag-toolbar.ag-light .ag-color-picker:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.ag-color-swatch {\\n width: 18px;\\n height: 18px;\\n border-radius: 50%;\\n border: 2px solid rgba(255, 255, 255, 0.2);\\n pointer-events: none;\\n}\\n\\n.ag-toolbar.ag-light .ag-color-swatch {\\n border-color: rgba(0, 0, 0, 0.15);\\n}\\n\\n.ag-color-picker input[type=\\\"color\\\"] {\\n position: absolute;\\n width: 100%;\\n height: 100%;\\n opacity: 0;\\n cursor: pointer;\\n top: 0;\\n left: 0;\\n}\\n\\n/* --- Theme toggle --- */\\n\\n@keyframes ag-icon-out {\\n from { transform: scale(1); opacity: 1; filter: blur(0); }\\n to { transform: scale(0.5); opacity: 0.5; filter: blur(2px); }\\n}\\n\\n@keyframes ag-icon-in {\\n from { transform: scale(0.5); opacity: 0.5; filter: blur(2px); }\\n to { transform: scale(1); opacity: 1; filter: blur(0); }\\n}\\n\\n.ag-theme-btn {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 34px;\\n height: 34px;\\n background: transparent;\\n border: none;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n border-radius: 8px;\\n transition: background 0.15s ease, color 0.15s ease;\\n}\\n\\n.ag-theme-btn:hover {\\n background: rgba(255, 255, 255, 0.06);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n\\n.ag-toolbar.ag-light .ag-theme-btn {\\n color: rgba(0, 0, 0, 0.35);\\n}\\n\\n.ag-toolbar.ag-light .ag-theme-btn:hover {\\n background: rgba(0, 0, 0, 0.05);\\n color: rgba(0, 0, 0, 0.75);\\n}\\n\\n.ag-theme-icon {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.ag-theme-icon.ag-icon-out {\\n animation: ag-icon-out 0.15s ease forwards;\\n}\\n\\n.ag-theme-icon.ag-icon-in {\\n animation: ag-icon-in 0.15s ease forwards;\\n}\\n\\n/* --- Style panel (dark) --- */\\n\\n.ag-panel {\\n position: fixed;\\n pointer-events: auto;\\n background: #000;\\n color: #fff;\\n border-radius: 12px;\\n width: 340px;\\n max-height: 480px;\\n overflow-y: auto;\\n overscroll-behavior: none;\\n font-size: 12px;\\n line-height: 1.5;\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.75), 0 4px 24px rgba(0, 0, 0, 0.5), 0 0.5px 0 0 rgba(255, 255, 255, 0.05) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.05) inset, 0 0 0 0.5px rgba(255, 255, 255, 0.10) inset;\\n z-index: 2147483647;\\n\\n /* enter/exit animation */\\n opacity: 0;\\n filter: blur(4px);\\n transform: scale(0.96) translateY(4px);\\n transition: opacity 0.18s ease, filter 0.18s ease, transform 0.18s ease;\\n}\\n\\n.ag-panel.ag-panel-visible {\\n opacity: 1;\\n filter: blur(0);\\n transform: scale(1) translateY(0);\\n}\\n\\n.ag-panel.ag-panel-hiding {\\n opacity: 0;\\n filter: blur(4px);\\n transform: scale(0.96) translateY(4px);\\n}\\n\\n.ag-panel-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 8px 14px;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\\n position: sticky;\\n top: 0;\\n background: #000;\\n border-radius: 12px 12px 0 0;\\n z-index: 1;\\n}\\n\\n.ag-panel-title {\\n font-weight: 600;\\n color: #57EBA1;\\n font-size: 14px;\\n}\\n\\n.ag-panel-actions {\\n display: flex;\\n gap: 6px;\\n}\\n\\n.ag-panel-btn {\\n background: #1a1a1a;\\n color: #888;\\n border: 1px solid #2a2a2a;\\n border-radius: 6px;\\n padding: 4px 8px;\\n cursor: pointer;\\n font-size: 11px;\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n pointer-events: auto;\\n transition: all 0.1s ease;\\n}\\n\\n.ag-panel-btn:hover {\\n background: #2a2a2a;\\n color: #fff;\\n border-color: #444;\\n}\\n\\n.ag-panel-btn.copied {\\n background: #065f46;\\n color: #6ee7b7;\\n border-color: #059669;\\n}\\n\\n.ag-panel-close {\\n background: none;\\n border: none;\\n color: rgba(255, 255, 255, 0.5);\\n cursor: pointer;\\n padding-left: 12px;\\n border-left: 1px solid #2a2a2a;\\n display: flex;\\n align-items: center;\\n pointer-events: auto;\\n transition: all 0.1s ease;\\n}\\n\\n.ag-panel-close:hover {\\n color: rgba(255, 255, 255, 1);\\n}\\n\\n/* --- Selector display --- */\\n\\n.ag-selector {\\n padding: 8px 14px;\\n background: #28293D;\\n font-family: \\\"Geist Mono\\\", monospace;\\n font-size: 11px;\\n color: #DDA5E9;\\n word-break: break-all;\\n}\\n\\n/* --- Style sections --- */\\n\\n.ag-section {\\n padding: 10px 14px 0 14px;\\n /* border-bottom: 1px solid rgba(255, 255, 255, 0.1); */\\n}\\n\\n.ag-section:last-child {\\n padding-bottom: 14px;\\n border-bottom: none;\\n}\\n\\n.ag-section-title {\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.5);\\n text-transform: uppercase;\\n font-size: 10px;\\n letter-spacing: 0.5px;\\n margin-bottom: 6px;\\n}\\n\\n/* --- Code block (property list) --- */\\n\\n.ag-code {\\n background: #1a1a1a;\\n border-radius: 8px;\\n padding: 10px 14px;\\n font-family: \\\"Geist Mono\\\", monospace;\\n font-size: 12px;\\n line-height: 1.7;\\n}\\n\\n.ag-code-line {\\n white-space: normal;\\n word-break: break-all;\\n}\\n\\n.ag-prop-name {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.ag-prop-value {\\n color: #DDA5E9;\\n}\\n\\n/* --- Scrollbar --- */\\n\\n.ag-panel::-webkit-scrollbar {\\n display: none;\\n}\\n\\n/* ============================================\\n Light theme overrides\\n ============================================ */\\n\\n.ag-panel.ag-light {\\n background: #fff;\\n color: #1a1a1a;\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.1), 0 4px 24px rgba(0, 0, 0, 0.12);\\n}\\n\\n.ag-panel.ag-light .ag-panel-header {\\n background: #fff;\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n\\n.ag-panel.ag-light .ag-panel-title {\\n color: #0d7c4a;\\n}\\n\\n.ag-panel.ag-light .ag-panel-btn {\\n background: #f0f0f0;\\n color: #666;\\n border-color: #e0e0e0;\\n}\\n\\n.ag-panel.ag-light .ag-panel-btn:hover {\\n background: #e0e0e0;\\n color: #111;\\n border-color: #ccc;\\n}\\n\\n.ag-panel.ag-light .ag-panel-close {\\n color: rgba(0, 0, 0, 0.4);\\n border-left-color: #e0e0e0;\\n}\\n\\n.ag-panel.ag-light .ag-panel-close:hover {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.ag-panel.ag-light .ag-selector {\\n background: #f0f0f5;\\n color: #8b5cf6;\\n}\\n\\n.ag-panel.ag-light .ag-section {\\n border-bottom-color: rgba(0, 0, 0, 0.06);\\n}\\n\\n.ag-panel.ag-light .ag-section-title {\\n color: rgba(0, 0, 0, 0.45);\\n}\\n\\n.ag-panel.ag-light .ag-code {\\n background: #f5f5f5;\\n}\\n\\n.ag-panel.ag-light .ag-prop-name {\\n color: rgba(0, 0, 0, 0.75);\\n}\\n\\n.ag-panel.ag-light .ag-prop-value {\\n color: #7c3aed;\\n}\\n\";","import cssText from './styles.css';\nexport const STYLES: string = cssText;\n","import { state } from '../core/state';\nimport { STYLES } from './styles';\n\nconst HOST_ID = 'agentation-inspector';\n\nexport function createShadowHost(): ShadowRoot {\n // Remove existing if any\n const existing = document.getElementById(HOST_ID);\n if (existing) existing.remove();\n\n const host = document.createElement('div');\n host.id = HOST_ID;\n host.setAttribute('data-agentation', 'true');\n\n // Set inline styles on the host so page CSS can't interfere\n host.style.cssText = 'position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;overflow:visible!important;z-index:2147483647!important;pointer-events:none!important;';\n\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = STYLES;\n shadow.appendChild(style);\n\n document.body.appendChild(host);\n\n state.shadowHost = host;\n state.shadowRoot = shadow;\n\n return shadow;\n}\n\nexport function destroyShadowHost(): void {\n if (state.shadowHost) {\n state.shadowHost.remove();\n state.shadowHost = null;\n state.shadowRoot = null;\n }\n}\n","export const ICONS = {\n inspect: `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>`,\n\n close: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`,\n\n copy: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>`,\n\n check: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n\n sun: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>`,\n\n moon: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>`,\n};\n","import { state } from '../core/state';\n\nconst SKIP_TAGS = new Set([\n 'SCRIPT', 'STYLE', 'LINK', 'META', 'HEAD', 'TITLE', 'BR', 'WBR',\n 'NOSCRIPT', 'TEMPLATE',\n]);\n\nexport function isInteractable(el: Element): boolean {\n if (!(el instanceof HTMLElement)) return false;\n if (SKIP_TAGS.has(el.tagName)) return false;\n\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) return false;\n\n return true;\n}\n\nexport function isOwnElement(el: Element): boolean {\n if (!state.shadowHost) return false;\n return state.shadowHost === el || state.shadowHost.contains(el);\n}\n","import { state } from '../core/state';\n\nlet highlightEl: HTMLElement | null = null;\n\nfunction ensureHighlight(): HTMLElement {\n if (highlightEl && state.shadowRoot?.contains(highlightEl)) {\n return highlightEl;\n }\n\n highlightEl = document.createElement('div');\n highlightEl.className = 'ag-highlight';\n state.shadowRoot?.appendChild(highlightEl);\n return highlightEl;\n}\n\nexport function showHighlight(target: HTMLElement): void {\n const el = ensureHighlight();\n const rect = target.getBoundingClientRect();\n\n el.style.top = `${rect.top}px`;\n el.style.left = `${rect.left}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.borderColor = state.highlightColor;\n el.style.background = state.highlightColor + '17';\n el.style.display = 'block';\n}\n\nexport function hideHighlight(): void {\n if (highlightEl) {\n highlightEl.style.display = 'none';\n }\n}\n\nexport function destroyHighlight(): void {\n if (highlightEl) {\n highlightEl.remove();\n highlightEl = null;\n }\n}\n","export function formatDimensions(width: number, height: number): string {\n return `${Math.round(width)} × ${Math.round(height)}`;\n}\n\nexport function formatPadding(\n top: string,\n right: string,\n bottom: string,\n left: string\n): string {\n const t = parseFloat(top) || 0;\n const r = parseFloat(right) || 0;\n const b = parseFloat(bottom) || 0;\n const l = parseFloat(left) || 0;\n\n if (t === r && r === b && b === l) {\n return `${t}px`;\n }\n if (t === b && r === l) {\n return `${t}px ${r}px`;\n }\n if (r === l) {\n return `${t}px ${r}px ${b}px`;\n }\n return `${t}px ${r}px ${b}px ${l}px`;\n}\n\nexport function formatBorderRadius(\n tl: string,\n tr: string,\n br: string,\n bl: string\n): string {\n const topLeft = parseFloat(tl) || 0;\n const topRight = parseFloat(tr) || 0;\n const bottomRight = parseFloat(br) || 0;\n const bottomLeft = parseFloat(bl) || 0;\n\n if (topLeft === topRight && topRight === bottomRight && bottomRight === bottomLeft) {\n return `${topLeft}px`;\n }\n if (topLeft === bottomRight && topRight === bottomLeft) {\n return `${topLeft}px ${topRight}px`;\n }\n return `${topLeft}px ${topRight}px ${bottomRight}px ${bottomLeft}px`;\n}\n","import { state } from '../core/state';\nimport { formatDimensions } from '../utils/format';\n\nlet labelEl: HTMLElement | null = null;\n\nfunction ensureLabel(): HTMLElement {\n if (labelEl && state.shadowRoot?.contains(labelEl)) {\n return labelEl;\n }\n\n labelEl = document.createElement('div');\n labelEl.className = 'ag-label';\n state.shadowRoot?.appendChild(labelEl);\n return labelEl;\n}\n\nexport function showLabel(target: HTMLElement): void {\n const el = ensureLabel();\n const rect = target.getBoundingClientRect();\n\n // Build content\n const tag = target.tagName.toLowerCase();\n const classes = Array.from(target.classList)\n .slice(0, 3)\n .map(c => `.${c}`)\n .join('');\n const dims = formatDimensions(rect.width, rect.height);\n\n el.innerHTML =\n `<span class=\"ag-tag\">${tag}</span>` +\n (classes ? `<span class=\"ag-class\">${classes}</span>` : '') +\n `<span class=\"ag-dims\">${dims}</span>`;\n\n // Position above the element, or below if too close to top\n const labelHeight = 24;\n const gap = 6;\n let top = rect.top - labelHeight - gap;\n if (top < 4) {\n top = rect.bottom + gap;\n }\n\n let left = rect.left;\n // Clamp to viewport\n el.style.display = 'block';\n el.style.top = `${top}px`;\n el.style.left = `${Math.max(4, left)}px`;\n\n // Adjust if overflows right side\n requestAnimationFrame(() => {\n const labelRect = el.getBoundingClientRect();\n if (labelRect.right > window.innerWidth - 4) {\n el.style.left = `${window.innerWidth - labelRect.width - 4}px`;\n }\n });\n}\n\nexport function hideLabel(): void {\n if (labelEl) {\n labelEl.style.display = 'none';\n }\n}\n\nexport function destroyLabel(): void {\n if (labelEl) {\n labelEl.remove();\n labelEl = null;\n }\n}\n","const FRAMEWORK_CLASS_PATTERNS = [\n /^v-/, /^ng-/, /^_ng/, /^svelte-/, /^css-/, /^jsx-/, /^sc-/,\n /^__/, /^css-\\d/, /^rs-/, /^emotion-/,\n /^[a-zA-Z]{1,3}[A-Z][a-zA-Z0-9]{4,8}$/, // CSS-module hashes like \"aBcDeFgH\"\n];\n\nfunction isFrameworkClass(cls: string): boolean {\n return FRAMEWORK_CLASS_PATTERNS.some(p => p.test(cls));\n}\n\nfunction escapeSelector(str: string): string {\n if (typeof CSS !== 'undefined' && CSS.escape) {\n return CSS.escape(str);\n }\n // Fallback for environments without CSS.escape (e.g. jsdom)\n return str.replace(/([\\0-\\x1f\\x7f]|^-?\\d|^-$|[^\\x80-\\uFFFF\\w-])/g, (ch) => {\n if (ch === '\\0') return '\\uFFFD';\n return '\\\\' + ch;\n });\n}\n\nfunction getNthChildIndex(el: Element): number {\n let index = 1;\n let sibling = el.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === el.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n return index;\n}\n\nfunction getSiblingCount(el: Element): number {\n let count = 0;\n const parent = el.parentElement;\n if (!parent) return 0;\n for (let i = 0; i < parent.children.length; i++) {\n if (parent.children[i].tagName === el.tagName) count++;\n }\n return count;\n}\n\nfunction buildSegment(el: Element): string {\n const tag = el.tagName.toLowerCase();\n\n // Prefer ID\n if (el.id && !isFrameworkClass(el.id)) {\n return `#${escapeSelector(el.id)}`;\n }\n\n // Use meaningful classes\n const classes = Array.from(el.classList).filter(c => !isFrameworkClass(c));\n if (classes.length > 0) {\n const classSelector = tag + classes.map(c => `.${escapeSelector(c)}`).join('');\n // Check if unique among siblings\n const parent = el.parentElement;\n if (parent) {\n const matches = parent.querySelectorAll(`:scope > ${classSelector}`);\n if (matches.length === 1) return classSelector;\n }\n }\n\n // Fallback to nth-of-type\n if (getSiblingCount(el) > 1) {\n return `${tag}:nth-of-type(${getNthChildIndex(el)})`;\n }\n\n return tag;\n}\n\nexport function generateSelector(el: Element): string {\n // If element has a unique ID, just return that\n if (el.id && !isFrameworkClass(el.id)) {\n const id = `#${escapeSelector(el.id)}`;\n if (document.querySelectorAll(id).length === 1) return id;\n }\n\n const parts: string[] = [];\n let current: Element | null = el;\n\n while (current && current !== document.documentElement && current !== document.body) {\n const segment = buildSegment(current);\n parts.unshift(segment);\n\n // If the selector is already unique, stop climbing\n if (segment.startsWith('#')) break;\n\n const candidate = parts.join(' > ');\n try {\n if (document.querySelectorAll(candidate).length === 1) break;\n } catch {\n // invalid selector, keep climbing\n }\n\n current = current.parentElement;\n }\n\n // Prepend body if needed for uniqueness\n const selector = parts.join(' > ');\n try {\n if (document.querySelectorAll(selector).length !== 1) {\n return 'body > ' + selector;\n }\n } catch {\n // return as-is\n }\n\n return selector;\n}\n","export interface StyleCategory {\n name: string;\n properties: { name: string; value: string }[];\n}\n\nconst CATEGORIES: { name: string; props: string[] }[] = [\n {\n name: 'Typography',\n props: [\n 'font-family', 'font-size', 'font-weight', 'font-style',\n 'line-height', 'letter-spacing', 'text-align', 'text-decoration',\n 'text-transform', 'color',\n ],\n },\n {\n name: 'Box Model',\n props: [\n 'width', 'height', 'padding', 'margin',\n 'border', 'border-radius',\n ],\n },\n {\n name: 'Background',\n props: [\n 'background-color', 'background-image', 'background-size',\n 'background-position', 'opacity',\n ],\n },\n {\n name: 'Layout',\n props: [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'z-index', 'overflow', 'float', 'clear',\n ],\n },\n {\n name: 'Flexbox / Grid',\n props: [\n 'flex-direction', 'flex-wrap', 'justify-content', 'align-items',\n 'align-content', 'gap', 'grid-template-columns', 'grid-template-rows',\n 'grid-column', 'grid-row',\n ],\n },\n];\n\nfunction isDefaultValue(prop: string, value: string): boolean {\n const defaults: Record<string, Set<string>> = {\n 'font-style': new Set(['normal']),\n 'letter-spacing': new Set(['normal', '0px']),\n 'text-decoration': new Set(['none', 'none solid rgb(0, 0, 0)']),\n 'text-transform': new Set(['none']),\n 'background-image': new Set(['none']),\n 'background-size': new Set(['auto']),\n 'background-position': new Set(['0% 0%']),\n 'opacity': new Set(['1']),\n 'top': new Set(['auto']),\n 'right': new Set(['auto']),\n 'bottom': new Set(['auto']),\n 'left': new Set(['auto']),\n 'z-index': new Set(['auto']),\n 'overflow': new Set(['visible']),\n 'float': new Set(['none']),\n 'clear': new Set(['none']),\n 'flex-direction': new Set(['row']),\n 'flex-wrap': new Set(['nowrap']),\n 'grid-template-columns': new Set(['none']),\n 'grid-template-rows': new Set(['none']),\n 'grid-column': new Set(['auto', 'auto / auto']),\n 'grid-row': new Set(['auto', 'auto / auto']),\n };\n\n return defaults[prop]?.has(value) ?? false;\n}\n\nfunction readShorthand(cs: CSSStyleDeclaration, prop: string): string {\n if (prop === 'padding') {\n const t = cs.paddingTop, r = cs.paddingRight, b = cs.paddingBottom, l = cs.paddingLeft;\n if (t === r && r === b && b === l) return t;\n if (t === b && r === l) return `${t} ${r}`;\n return `${t} ${r} ${b} ${l}`;\n }\n if (prop === 'margin') {\n const t = cs.marginTop, r = cs.marginRight, b = cs.marginBottom, l = cs.marginLeft;\n if (t === r && r === b && b === l) return t;\n if (t === b && r === l) return `${t} ${r}`;\n return `${t} ${r} ${b} ${l}`;\n }\n if (prop === 'border') {\n return `${cs.borderTopWidth} ${cs.borderTopStyle} ${cs.borderTopColor}`;\n }\n if (prop === 'border-radius') {\n const tl = cs.borderTopLeftRadius, tr = cs.borderTopRightRadius;\n const br = cs.borderBottomRightRadius, bl = cs.borderBottomLeftRadius;\n if (tl === tr && tr === br && br === bl) return tl;\n return `${tl} ${tr} ${br} ${bl}`;\n }\n return cs.getPropertyValue(prop);\n}\n\nexport function extractStyles(el: HTMLElement): StyleCategory[] {\n const cs = getComputedStyle(el);\n const result: StyleCategory[] = [];\n\n for (const cat of CATEGORIES) {\n const properties: { name: string; value: string }[] = [];\n\n for (const prop of cat.props) {\n const value = readShorthand(cs, prop);\n if (value && !isDefaultValue(prop, value)) {\n properties.push({ name: prop, value });\n }\n }\n\n if (properties.length > 0) {\n result.push({ name: cat.name, properties });\n }\n }\n\n return result;\n}\n\nexport function formatStylesForClipboard(categories: StyleCategory[]): string {\n const lines: string[] = [];\n for (const cat of categories) {\n lines.push(`/* ${cat.name} */`);\n for (const p of cat.properties) {\n lines.push(`${p.name}: ${p.value};`);\n }\n lines.push('');\n }\n return lines.join('\\n').trim();\n}\n","export async function copyToClipboard(text: string): Promise<boolean> {\n if (navigator.clipboard && window.isSecureContext) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // fall through to fallback\n }\n }\n\n // Fallback for non-HTTPS contexts\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n const ok = document.execCommand('copy');\n return ok;\n } catch {\n return false;\n } finally {\n document.body.removeChild(textarea);\n }\n}\n","import { state } from '../core/state';\nimport { ICONS } from '../ui/icons';\nimport { generateSelector } from '../selector/generator';\nimport { extractStyles, formatStylesForClipboard } from './style-reader';\nimport { copyToClipboard } from '../utils/clipboard';\n\nlet panelEl: HTMLElement | null = null;\n// Store as page (document) coordinates so panel scrolls with the page\nlet pageClickX = 0;\nlet pageClickY = 0;\n\nfunction createPanelHTML(el: HTMLElement, selector: string): string {\n const categories = extractStyles(el);\n const tag = el.tagName.toLowerCase();\n\n let sectionsHTML = '';\n for (const cat of categories) {\n let linesHTML = '';\n for (const p of cat.properties) {\n linesHTML += `<div class=\"ag-code-line\"><span class=\"ag-prop-name\">${p.name}</span>: <span class=\"ag-prop-value\">${escapeHTML(p.value)}</span>;</div>`;\n }\n sectionsHTML += `<div class=\"ag-section\"><div class=\"ag-section-title\">${cat.name}</div><div class=\"ag-code\">${linesHTML}</div></div>`;\n }\n\n return `\n <div class=\"ag-panel-header\">\n <span class=\"ag-panel-title\"><${tag}></span>\n <div class=\"ag-panel-actions\">\n <button class=\"ag-panel-btn\" data-action=\"copy-selector\" title=\"Copy selector\">\n ${ICONS.copy} Selector\n </button>\n <button class=\"ag-panel-btn\" data-action=\"copy-styles\" title=\"Copy all styles\">\n ${ICONS.copy} Styles\n </button>\n <button class=\"ag-panel-close\" data-action=\"close\" title=\"Close panel\">\n ${ICONS.close}\n </button>\n </div>\n </div>\n <div class=\"ag-selector\">${escapeHTML(selector)}</div>\n ${sectionsHTML}\n `;\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction positionPanel(): void {\n if (!panelEl) return;\n const panelWidth = 340;\n const gap = 12;\n\n // Convert page coords → viewport coords so panel scrolls with the page\n const viewX = pageClickX - window.scrollX;\n const viewY = pageClickY - window.scrollY;\n\n // Position to the right of the click point\n let left = viewX + gap;\n if (left + panelWidth > window.innerWidth - 8) {\n left = viewX - panelWidth - gap;\n if (left < 8) {\n left = window.innerWidth - panelWidth - 8;\n }\n }\n\n let top = viewY - 20;\n if (top + 480 > window.innerHeight - 8) {\n top = Math.max(8, window.innerHeight - 488);\n }\n if (top < 8) top = 8;\n\n panelEl.style.top = `${top}px`;\n panelEl.style.left = `${left}px`;\n}\n\nfunction handlePanelClick(e: Event): void {\n const target = e.target as HTMLElement;\n const btn = target.closest('[data-action]') as HTMLElement | null;\n if (!btn) return;\n\n const action = btn.dataset.action;\n\n if (action === 'close') {\n hidePanel();\n return;\n }\n\n if (action === 'copy-selector' && state.selectedElement) {\n const selector = generateSelector(state.selectedElement);\n copyToClipboard(selector).then(() => flashCopied(btn));\n return;\n }\n\n if (action === 'copy-styles' && state.selectedElement) {\n const categories = extractStyles(state.selectedElement);\n const text = formatStylesForClipboard(categories);\n copyToClipboard(text).then(() => flashCopied(btn));\n return;\n }\n}\n\nfunction flashCopied(btn: HTMLElement): void {\n const original = btn.innerHTML;\n btn.innerHTML = `${ICONS.check} Copied!`;\n btn.classList.add('copied');\n setTimeout(() => {\n btn.innerHTML = original;\n btn.classList.remove('copied');\n }, 1500);\n}\n\nexport function showPanel(target: HTMLElement, cursorX: number, cursorY: number): void {\n hidePanel(true);\n\n state.selectedElement = target;\n state.panelVisible = true;\n // Store as page (document) coordinates\n pageClickX = cursorX + window.scrollX;\n pageClickY = cursorY + window.scrollY;\n\n const selector = generateSelector(target);\n\n panelEl = document.createElement('div');\n panelEl.className = 'ag-panel' + (state.theme === 'light' ? ' ag-light' : '');\n panelEl.innerHTML = createPanelHTML(target, selector);\n panelEl.addEventListener('click', handlePanelClick);\n\n state.shadowRoot?.appendChild(panelEl);\n positionPanel();\n\n // Trigger enter animation on next frame\n requestAnimationFrame(() => {\n panelEl?.classList.add('ag-panel-visible');\n });\n}\n\nexport function hidePanel(immediate = false): void {\n if (!panelEl) return;\n\n if (immediate) {\n // Remove instantly (used when replacing with a new panel)\n panelEl.removeEventListener('click', handlePanelClick);\n panelEl.remove();\n panelEl = null;\n state.selectedElement = null;\n state.panelVisible = false;\n return;\n }\n\n // Animate out\n const el = panelEl;\n el.classList.remove('ag-panel-visible');\n el.classList.add('ag-panel-hiding');\n\n const onDone = () => {\n el.removeEventListener('transitionend', onDone);\n el.removeEventListener('click', handlePanelClick);\n el.remove();\n if (panelEl === el) panelEl = null;\n };\n el.addEventListener('transitionend', onDone, { once: true });\n // Fallback in case transitionend doesn't fire\n setTimeout(onDone, 250);\n\n state.selectedElement = null;\n state.panelVisible = false;\n}\n\nexport function repositionPanel(): void {\n if (panelEl && state.panelVisible) {\n positionPanel();\n }\n}\n\nexport function destroyPanel(): void {\n hidePanel(true);\n}\n","import { state } from '../core/state';\nimport { isInteractable, isOwnElement } from '../utils/dom';\nimport { showHighlight, hideHighlight } from '../overlay/highlight';\nimport { showLabel, hideLabel } from '../overlay/label';\nimport { showPanel, hidePanel } from '../panel/style-panel';\n\nfunction onMouseMove(e: MouseEvent): void {\n if (!state.active) return;\n\n const target = e.target as Element;\n if (!target || isOwnElement(target) || !isInteractable(target)) {\n return;\n }\n\n const el = target as HTMLElement;\n if (state.hoveredElement === el) return;\n\n state.hoveredElement = el;\n showHighlight(el);\n showLabel(el);\n}\n\nfunction onMouseOut(e: MouseEvent): void {\n if (!state.active) return;\n\n // Only hide if mouse actually left the element (not entering a child)\n const related = e.relatedTarget as Element | null;\n if (related && !isOwnElement(related) && isInteractable(related)) {\n return;\n }\n\n state.hoveredElement = null;\n hideHighlight();\n hideLabel();\n}\n\nfunction onClick(e: MouseEvent): void {\n if (!state.active) return;\n\n const target = e.target as Element;\n if (!target || isOwnElement(target)) return;\n if (!isInteractable(target)) return;\n\n // Prevent the page from handling the click\n e.preventDefault();\n e.stopPropagation();\n\n const el = target as HTMLElement;\n\n if (state.panelVisible && state.selectedElement === el) {\n hidePanel();\n } else {\n showPanel(el, e.clientX, e.clientY);\n }\n}\n\nexport function bindMouseEvents(): void {\n document.addEventListener('mousemove', onMouseMove, true);\n document.addEventListener('click', onClick, true);\n}\n\nexport function unbindMouseEvents(): void {\n document.removeEventListener('mousemove', onMouseMove, true);\n document.removeEventListener('click', onClick, true);\n hideHighlight();\n hideLabel();\n}\n","import { state } from '../core/state';\nimport { hidePanel } from '../panel/style-panel';\n\nlet toggleCallback: (() => void) | null = null;\n\nfunction onKeyDown(e: KeyboardEvent): void {\n // Ctrl+Shift+A (or Cmd+Shift+A on Mac) — toggle inspector\n if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'A') {\n e.preventDefault();\n e.stopPropagation();\n toggleCallback?.();\n return;\n }\n\n // Escape — close panel or deactivate\n if (e.key === 'Escape' && state.active) {\n e.preventDefault();\n if (state.panelVisible) {\n hidePanel();\n } else {\n toggleCallback?.();\n }\n return;\n }\n}\n\nexport function bindKeyboardEvents(onToggle: () => void): void {\n toggleCallback = onToggle;\n document.addEventListener('keydown', onKeyDown, true);\n}\n\nexport function unbindKeyboardEvents(): void {\n document.removeEventListener('keydown', onKeyDown, true);\n toggleCallback = null;\n}\n","import { state } from '../core/state';\nimport { showHighlight } from '../overlay/highlight';\nimport { showLabel } from '../overlay/label';\nimport { repositionPanel } from '../panel/style-panel';\n\nlet rafId: number | null = null;\n\nfunction update(): void {\n rafId = null;\n\n if (!state.active) return;\n\n if (state.hoveredElement) {\n showHighlight(state.hoveredElement);\n showLabel(state.hoveredElement);\n }\n\n if (state.panelVisible) {\n repositionPanel();\n }\n}\n\nfunction onScrollOrResize(): void {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(update);\n}\n\nexport function bindScrollResize(): void {\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize, true);\n}\n\nexport function unbindScrollResize(): void {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize, true);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n}\n","import { state, savedActive, resetState, savePrefs } from './state';\nimport { createShadowHost, destroyShadowHost } from '../ui/shadow-host';\nimport { ICONS } from '../ui/icons';\nimport { bindMouseEvents, unbindMouseEvents } from '../events/mouse';\nimport { bindKeyboardEvents, unbindKeyboardEvents } from '../events/keyboard';\nimport { bindScrollResize, unbindScrollResize } from '../events/scroll-resize';\nimport { showHighlight, hideHighlight, destroyHighlight } from '../overlay/highlight';\nimport { hideLabel, destroyLabel } from '../overlay/label';\nimport { hidePanel, destroyPanel } from '../panel/style-panel';\n\nlet toolbar: HTMLElement | null = null;\nlet themeBtn: HTMLElement | null = null;\n\nexport class Inspector {\n private initialized = false;\n\n init(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n const shadow = createShadowHost();\n this.createToolbar(shadow);\n bindKeyboardEvents(() => this.toggle());\n bindScrollResize();\n\n // Restore saved theme on the toolbar\n if (state.theme === 'light') {\n toolbar?.classList.add('ag-light');\n }\n\n // Restore active state from previous session\n if (savedActive) {\n this.activate();\n }\n }\n\n private createToolbar(shadow: ShadowRoot): void {\n toolbar = document.createElement('div');\n toolbar.className = 'ag-toolbar';\n\n // Inspect toggle\n const toggleBtn = document.createElement('button');\n toggleBtn.className = 'ag-toggle';\n toggleBtn.innerHTML = `<span class=\"ag-toggle-label\">Inspect</span><span class=\"ag-toggle-track\"><span class=\"ag-toggle-knob\"></span></span>`;\n toggleBtn.title = 'Toggle Element Inspector (Ctrl+Shift+A)';\n toggleBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggle();\n });\n\n // Divider\n const div1 = document.createElement('span');\n div1.className = 'ag-toolbar-divider';\n\n // Color picker\n const colorWrap = document.createElement('label');\n colorWrap.className = 'ag-color-picker';\n colorWrap.title = 'Highlight color';\n const colorSwatch = document.createElement('span');\n colorSwatch.className = 'ag-color-swatch';\n colorSwatch.style.background = state.highlightColor;\n const colorInput = document.createElement('input');\n colorInput.type = 'color';\n colorInput.value = state.highlightColor;\n colorInput.addEventListener('input', (e) => {\n e.stopPropagation();\n const val = (e.target as HTMLInputElement).value;\n state.highlightColor = val;\n colorSwatch.style.background = val;\n if (state.hoveredElement) {\n showHighlight(state.hoveredElement);\n }\n savePrefs();\n });\n colorInput.addEventListener('click', (e) => e.stopPropagation());\n colorWrap.appendChild(colorSwatch);\n colorWrap.appendChild(colorInput);\n\n // Divider\n const div2 = document.createElement('span');\n div2.className = 'ag-toolbar-divider';\n\n // Theme toggle\n themeBtn = document.createElement('button');\n themeBtn.className = 'ag-theme-btn';\n themeBtn.title = 'Toggle light/dark panel';\n const initIcon = state.theme === 'dark' ? ICONS.sun : ICONS.moon;\n themeBtn.innerHTML = `<span class=\"ag-theme-icon\">${initIcon}</span>`;\n themeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleTheme();\n });\n\n toolbar.appendChild(toggleBtn);\n toolbar.appendChild(div1);\n toolbar.appendChild(colorWrap);\n toolbar.appendChild(div2);\n toolbar.appendChild(themeBtn);\n shadow.appendChild(toolbar);\n }\n\n private toggleTheme(): void {\n state.theme = state.theme === 'dark' ? 'light' : 'dark';\n\n // Animate icon swap\n if (themeBtn) {\n const iconWrap = themeBtn.querySelector('.ag-theme-icon') as HTMLElement | null;\n if (iconWrap) {\n iconWrap.classList.add('ag-icon-out');\n setTimeout(() => {\n const newIcon = state.theme === 'dark' ? ICONS.sun : ICONS.moon;\n iconWrap.innerHTML = newIcon;\n iconWrap.classList.remove('ag-icon-out');\n iconWrap.classList.add('ag-icon-in');\n iconWrap.addEventListener('animationend', () => {\n iconWrap.classList.remove('ag-icon-in');\n }, { once: true });\n }, 150);\n }\n }\n\n state.shadowRoot?.querySelector('.ag-panel')?.classList.toggle('ag-light', state.theme === 'light');\n toolbar?.classList.toggle('ag-light', state.theme === 'light');\n savePrefs();\n }\n\n activate(): void {\n if (state.active) return;\n state.active = true;\n toolbar?.querySelector('.ag-toggle')?.classList.add('active');\n bindMouseEvents();\n savePrefs();\n }\n\n deactivate(): void {\n if (!state.active) return;\n state.active = false;\n toolbar?.querySelector('.ag-toggle')?.classList.remove('active');\n unbindMouseEvents();\n hideHighlight();\n hideLabel();\n hidePanel();\n state.hoveredElement = null;\n savePrefs();\n }\n\n toggle(): void {\n if (state.active) {\n this.deactivate();\n } else {\n this.activate();\n }\n }\n\n destroy(): void {\n this.deactivate();\n unbindKeyboardEvents();\n unbindScrollResize();\n destroyHighlight();\n destroyLabel();\n destroyPanel();\n destroyShadowHost();\n resetState();\n toolbar = null;\n themeBtn = null;\n this.initialized = false;\n }\n\n get isActive(): boolean {\n return state.active;\n }\n}\n","import { Inspector } from './core/inspector';\nexport { Inspector } from './core/inspector';\nexport { generateSelector } from './selector/generator';\n\nlet instance: Inspector | null = null;\n\nexport function init(): Inspector {\n if (!instance) {\n instance = new Inspector();\n }\n instance.init();\n return instance;\n}\n\nexport function destroy(): void {\n instance?.destroy();\n instance = null;\n}\n\nexport function getInstance(): Inspector | null {\n return instance;\n}\n","import { init, destroy, getInstance, Inspector } from './index';\nexport { generateSelector } from './selector/generator';\nexport { init, destroy, getInstance, Inspector };\n\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => init());\n } else {\n init();\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var Agentation=function(n){"use strict";const e="agentation-prefs",t={active:!1,highlightColor:"#0063F7",theme:"dark"};const o=function(){try{const n=localStorage.getItem(e);if(n){const e=JSON.parse(n);return{...t,...e}}}catch{}return{...t}}(),a={active:!1,hoveredElement:null,selectedElement:null,panelVisible:!1,shadowHost:null,shadowRoot:null,highlightColor:o.highlightColor,theme:o.theme},i=o.active;function r(){try{const n={active:a.active,highlightColor:a.highlightColor,theme:a.theme};localStorage.setItem(e,JSON.stringify(n))}catch{}}const l="agentation-inspector";const s={close:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',copy:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>',check:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',sun:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>',moon:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>'},c=new Set(["SCRIPT","STYLE","LINK","META","HEAD","TITLE","BR","WBR","NOSCRIPT","TEMPLATE"]);function g(n){if(!(n instanceof HTMLElement))return!1;if(c.has(n.tagName))return!1;const e=n.getBoundingClientRect();return 0!==e.width||0!==e.height}function d(n){return!!a.shadowHost&&(a.shadowHost===n||a.shadowHost.contains(n))}let p=null;function u(n){const e=(p&&a.shadowRoot?.contains(p)||(p=document.createElement("div"),p.className="ag-highlight",a.shadowRoot?.appendChild(p)),p),t=n.getBoundingClientRect();e.style.top=`${t.top}px`,e.style.left=`${t.left}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.style.borderColor=a.highlightColor,e.style.background=a.highlightColor+"17",e.style.display="block"}function h(){p&&(p.style.display="none")}let m=null;function b(n){const e=(m&&a.shadowRoot?.contains(m)||(m=document.createElement("div"),m.className="ag-label",a.shadowRoot?.appendChild(m)),m),t=n.getBoundingClientRect(),o=n.tagName.toLowerCase(),i=Array.from(n.classList).slice(0,3).map(n=>`.${n}`).join(""),r=(l=t.width,s=t.height,`${Math.round(l)} × ${Math.round(s)}`);var l,s;e.innerHTML=`<span class="ag-tag">${o}</span>`+(i?`<span class="ag-class">${i}</span>`:"")+`<span class="ag-dims">${r}</span>`;let c=t.top-24-6;c<4&&(c=t.bottom+6);let g=t.left;e.style.display="block",e.style.top=`${c}px`,e.style.left=`${Math.max(4,g)}px`,requestAnimationFrame(()=>{const n=e.getBoundingClientRect();n.right>window.innerWidth-4&&(e.style.left=window.innerWidth-n.width-4+"px")})}function f(){m&&(m.style.display="none")}const x=[/^v-/,/^ng-/,/^_ng/,/^svelte-/,/^css-/,/^jsx-/,/^sc-/,/^__/,/^css-\d/,/^rs-/,/^emotion-/,/^[a-zA-Z]{1,3}[A-Z][a-zA-Z0-9]{4,8}$/];function v(n){return x.some(e=>e.test(n))}function y(n){return"undefined"!=typeof CSS&&CSS.escape?CSS.escape(n):n.replace(/([\0-\x1f\x7f]|^-?\d|^-$|[^\x80-\uFFFF\w-])/g,n=>"\0"===n?"�":"\\"+n)}function w(n){const e=n.tagName.toLowerCase();if(n.id&&!v(n.id))return`#${y(n.id)}`;const t=Array.from(n.classList).filter(n=>!v(n));if(t.length>0){const o=e+t.map(n=>`.${y(n)}`).join(""),a=n.parentElement;if(a){if(1===a.querySelectorAll(`:scope > ${o}`).length)return o}}return function(n){let e=0;const t=n.parentElement;if(!t)return 0;for(let o=0;o<t.children.length;o++)t.children[o].tagName===n.tagName&&e++;return e}(n)>1?`${e}:nth-of-type(${function(n){let e=1,t=n.previousElementSibling;for(;t;)t.tagName===n.tagName&&e++,t=t.previousElementSibling;return e}(n)})`:e}function k(n){if(n.id&&!v(n.id)){const e=`#${y(n.id)}`;if(1===document.querySelectorAll(e).length)return e}const e=[];let t=n;for(;t&&t!==document.documentElement&&t!==document.body;){const n=w(t);if(e.unshift(n),n.startsWith("#"))break;const o=e.join(" > ");try{if(1===document.querySelectorAll(o).length)break}catch{}t=t.parentElement}const o=e.join(" > ");try{if(1!==document.querySelectorAll(o).length)return"body > "+o}catch{}return o}const E=[{name:"Typography",props:["font-family","font-size","font-weight","font-style","line-height","letter-spacing","text-align","text-decoration","text-transform","color"]},{name:"Box Model",props:["width","height","padding","margin","border","border-radius"]},{name:"Background",props:["background-color","background-image","background-size","background-position","opacity"]},{name:"Layout",props:["display","position","top","right","bottom","left","z-index","overflow","float","clear"]},{name:"Flexbox / Grid",props:["flex-direction","flex-wrap","justify-content","align-items","align-content","gap","grid-template-columns","grid-template-rows","grid-column","grid-row"]}];function S(n,e){const t={"font-style":new Set(["normal"]),"letter-spacing":new Set(["normal","0px"]),"text-decoration":new Set(["none","none solid rgb(0, 0, 0)"]),"text-transform":new Set(["none"]),"background-image":new Set(["none"]),"background-size":new Set(["auto"]),"background-position":new Set(["0% 0%"]),opacity:new Set(["1"]),top:new Set(["auto"]),right:new Set(["auto"]),bottom:new Set(["auto"]),left:new Set(["auto"]),"z-index":new Set(["auto"]),overflow:new Set(["visible"]),float:new Set(["none"]),clear:new Set(["none"]),"flex-direction":new Set(["row"]),"flex-wrap":new Set(["nowrap"]),"grid-template-columns":new Set(["none"]),"grid-template-rows":new Set(["none"]),"grid-column":new Set(["auto","auto / auto"]),"grid-row":new Set(["auto","auto / auto"])};return t[n]?.has(e)??!1}function L(n,e){if("padding"===e){const e=n.paddingTop,t=n.paddingRight,o=n.paddingBottom,a=n.paddingLeft;return e===t&&t===o&&o===a?e:e===o&&t===a?`${e} ${t}`:`${e} ${t} ${o} ${a}`}if("margin"===e){const e=n.marginTop,t=n.marginRight,o=n.marginBottom,a=n.marginLeft;return e===t&&t===o&&o===a?e:e===o&&t===a?`${e} ${t}`:`${e} ${t} ${o} ${a}`}if("border"===e)return`${n.borderTopWidth} ${n.borderTopStyle} ${n.borderTopColor}`;if("border-radius"===e){const e=n.borderTopLeftRadius,t=n.borderTopRightRadius,o=n.borderBottomRightRadius,a=n.borderBottomLeftRadius;return e===t&&t===o&&o===a?e:`${e} ${t} ${o} ${a}`}return n.getPropertyValue(e)}function C(n){const e=getComputedStyle(n),t=[];for(const n of E){const o=[];for(const t of n.props){const n=L(e,t);n&&!S(t,n)&&o.push({name:t,value:n})}o.length>0&&t.push({name:n.name,properties:o})}return t}async function $(n){if(navigator.clipboard&&window.isSecureContext)try{return await navigator.clipboard.writeText(n),!0}catch{}const e=document.createElement("textarea");e.value=n,e.style.position="fixed",e.style.left="-9999px",e.style.top="-9999px",e.style.opacity="0",document.body.appendChild(e),e.focus(),e.select();try{return document.execCommand("copy")}catch{return!1}finally{document.body.removeChild(e)}}let T=null,z=0,A=0;function R(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function H(){if(!T)return;const n=z-window.scrollX,e=A-window.scrollY;let t=n+12;t+340>window.innerWidth-8&&(t=n-340-12,t<8&&(t=window.innerWidth-340-8));let o=e-20;o+480>window.innerHeight-8&&(o=Math.max(8,window.innerHeight-488)),o<8&&(o=8),T.style.top=`${o}px`,T.style.left=`${t}px`}function M(n){const e=n.target.closest("[data-action]");if(!e)return;const t=e.dataset.action;if("close"!==t){if("copy-selector"===t&&a.selectedElement){return void $(k(a.selectedElement)).then(()=>N(e))}if("copy-styles"===t&&a.selectedElement){const n=function(n){const e=[];for(const t of n){e.push(`/* ${t.name} */`);for(const n of t.properties)e.push(`${n.name}: ${n.value};`);e.push("")}return e.join("\n").trim()}(C(a.selectedElement));return void $(n).then(()=>N(e))}}else j()}function N(n){const e=n.innerHTML;n.innerHTML=`${s.check} Copied!`,n.classList.add("copied"),setTimeout(()=>{n.innerHTML=e,n.classList.remove("copied")},1500)}function B(n,e,t){j(!0),a.selectedElement=n,a.panelVisible=!0,z=e+window.scrollX,A=t+window.scrollY;const o=k(n);T=document.createElement("div"),T.className="ag-panel"+("light"===a.theme?" ag-light":""),T.innerHTML=function(n,e){const t=C(n),o=n.tagName.toLowerCase();let a="";for(const n of t){let e="";for(const t of n.properties)e+=`<div class="ag-code-line"><span class="ag-prop-name">${t.name}</span>: <span class="ag-prop-value">${R(t.value)}</span>;</div>`;a+=`<div class="ag-section"><div class="ag-section-title">${n.name}</div><div class="ag-code">${e}</div></div>`}return`\n <div class="ag-panel-header">\n <span class="ag-panel-title"><${o}></span>\n <div class="ag-panel-actions">\n <button class="ag-panel-btn" data-action="copy-selector" title="Copy selector">\n ${s.copy} Selector\n </button>\n <button class="ag-panel-btn" data-action="copy-styles" title="Copy all styles">\n ${s.copy} Styles\n </button>\n <button class="ag-panel-close" data-action="close" title="Close panel">\n ${s.close}\n </button>\n </div>\n </div>\n <div class="ag-selector">${R(e)}</div>\n ${a}\n `}(n,o),T.addEventListener("click",M),a.shadowRoot?.appendChild(T),H(),requestAnimationFrame(()=>{T?.classList.add("ag-panel-visible")})}function j(n=!1){if(!T)return;if(n)return T.removeEventListener("click",M),T.remove(),T=null,a.selectedElement=null,void(a.panelVisible=!1);const e=T;e.classList.remove("ag-panel-visible"),e.classList.add("ag-panel-hiding");const t=()=>{e.removeEventListener("transitionend",t),e.removeEventListener("click",M),e.remove(),T===e&&(T=null)};e.addEventListener("transitionend",t,{once:!0}),setTimeout(t,250),a.selectedElement=null,a.panelVisible=!1}function F(n){if(!a.active)return;const e=n.target;if(!e||d(e)||!g(e))return;const t=e;a.hoveredElement!==t&&(a.hoveredElement=t,u(t),b(t))}function D(n){if(!a.active)return;const e=n.target;if(!e||d(e))return;if(!g(e))return;n.preventDefault(),n.stopPropagation();const t=e;a.panelVisible&&a.selectedElement===t?j():B(t,n.clientX,n.clientY)}let q=null;function I(n){return(n.ctrlKey||n.metaKey)&&n.shiftKey&&"A"===n.key?(n.preventDefault(),n.stopPropagation(),void q?.()):"Escape"===n.key&&a.active?(n.preventDefault(),void(a.panelVisible?j():q?.())):void 0}let V=null;function P(){V=null,a.active&&(a.hoveredElement&&(u(a.hoveredElement),b(a.hoveredElement)),a.panelVisible&&T&&a.panelVisible&&H())}function G(){null===V&&(V=requestAnimationFrame(P))}let W=null,Y=null;class O{constructor(){this.initialized=!1}init(){if(this.initialized)return;this.initialized=!0;const n=function(){const n=document.getElementById(l);n&&n.remove();const e=document.createElement("div");e.id=l,e.setAttribute("data-agentation","true"),e.style.cssText="position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;overflow:visible!important;z-index:2147483647!important;pointer-events:none!important;";const t=e.attachShadow({mode:"open"}),o=document.createElement("style");return o.textContent='/* ============================================\n Agentation — Element Inspector Styles\n ============================================\n Edit these to customize the inspector\'s look.\n All styles are scoped inside Shadow DOM so they\n won\'t leak into the host page.\n ============================================ */\n\n/* --- Host container (don\'t remove) --- */\n\n@import url(\'https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap\');\n\n:host {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n width: 0 !important;\n height: 0 !important;\n overflow: visible !important;\n z-index: 2147483647 !important;\n pointer-events: none !important;\n font-family: "Geist", sans-serif;\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n/* --- Highlight overlay (blue border on hover) --- */\n\n.ag-highlight {\n position: fixed;\n pointer-events: none;\n border: 2px solid #0063F7;\n background: #0063f717;\n border-radius: 2px;\n transition: top 0.15s cubic-bezier(0.4, 0, 0.2, 1), left 0.15s cubic-bezier(0.4, 0, 0.2, 1), width 0.15s cubic-bezier(0.4, 0, 0.2, 1), height 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 2147483646;\n}\n\n/* --- Floating label (tag name badge) --- */\n\n.ag-label {\n position: fixed;\n pointer-events: none;\n background: #28293D;\n color: #f1f5f9;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n padding: 4px 8px;\n border-radius: 4px;\n white-space: nowrap;\n z-index: 2147483647;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n.ag-label .ag-tag {\n color: #57EBA1;\n font-weight: 600;\n}\n\n.ag-label .ag-class {\n color: #DDA5E9;\n}\n\n.ag-label .ag-dims {\n color: #94a3b8;\n margin-left: 6px;\n}\n\n/* --- Toolbar (bottom-right bar) --- */\n\n.ag-toolbar {\n position: fixed;\n bottom: 16px;\n right: 16px;\n display: flex;\n align-items: center;\n gap: 0;\n pointer-events: auto;\n z-index: 2147483647;\n background: #1a1a1a;\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 10px;\n border: 0.5px solid rgba(255, 255, 255, 0.08);\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.75), 0 0.5px 0 0 rgba(255, 255, 255, 0.05) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.05) inset, 0 0 0 0.5px rgba(255, 255, 255, 0.10) inset;\n padding: 2px;\n}\n\n.ag-toolbar:active {\n transform: scale(.99);\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.ag-toolbar.ag-light {\n background: #ffff;\n border-color: none;\n box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.06), 0px 1px 2px -1px rgba(0, 0, 0, 0.06), 0px 2px 4px 0px rgba(0, 0, 0, 0.04);\n}\n\n.ag-toolbar-divider {\n width: 1px;\n height: 20px;\n background: rgba(255, 255, 255, 0.1);\n flex-shrink: 0;\n margin: 0 2px;\n}\n\n.ag-toolbar.ag-light .ag-toolbar-divider {\n background: rgba(0, 0, 0, 0.12);\n}\n\n/* --- Toggle button (inside toolbar) --- */\n\n.ag-toggle {\n height: 34px;\n border-radius: 8px;\n background: transparent;\n color: rgba(255, 255, 255, 0.5);\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 8px;\n transition: all 0.15s ease;\n font-family: "Geist", sans-serif;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.ag-toggle:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n.ag-toggle.active {\n color: rgba(255, 255, 255, 0.9);\n}\n\n.ag-toolbar.ag-light .ag-toggle {\n color: rgba(0, 0, 0, 0.45);\n}\n\n.ag-toolbar.ag-light .ag-toggle:hover {\n background: rgba(0, 0, 0, 0.05);\n}\n\n.ag-toolbar.ag-light .ag-toggle.active {\n color: rgba(0, 0, 0, 0.85);\n}\n\n.ag-toggle-label {\n pointer-events: none;\n}\n\n.ag-toggle-track {\n width: 40px;\n height: 24px;\n border-radius: 12px;\n background: rgba(255, 255, 255, 0.12);\n position: relative;\n transition: background 0.2s ease;\n pointer-events: none;\n flex-shrink: 0;\n}\n\n.ag-toggle.active .ag-toggle-track {\n background: #0063F7;\n}\n\n.ag-toolbar.ag-light .ag-toggle-track {\n background: rgba(0, 0, 0, 0.15);\n}\n\n.ag-toolbar.ag-light .ag-toggle.active .ag-toggle-track {\n background: #0063F7;\n}\n\n.ag-toggle-knob {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.04), 0 2px 2px 0 rgba(0, 0, 0, 0.02), 0 0.5px 0 0 rgba(255, 255, 255, 0.20) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.10) inset, 0 0 0 0.5px rgba(0, 0, 0, 0.15) inset;\n transition: all 0.2s ease;\n}\n\n.ag-toggle.active .ag-toggle-knob {\n left: 19px;\n background: #fff;\n}\n\n/* --- Color picker --- */\n\n.ag-color-picker {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.15s ease;\n position: relative;\n}\n\n.ag-color-picker:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n.ag-toolbar.ag-light .ag-color-picker:hover {\n background: rgba(0, 0, 0, 0.05);\n}\n\n.ag-color-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid rgba(255, 255, 255, 0.2);\n pointer-events: none;\n}\n\n.ag-toolbar.ag-light .ag-color-swatch {\n border-color: rgba(0, 0, 0, 0.15);\n}\n\n.ag-color-picker input[type="color"] {\n position: absolute;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n top: 0;\n left: 0;\n}\n\n/* --- Theme toggle --- */\n\n@keyframes ag-icon-out {\n from { transform: scale(1); opacity: 1; filter: blur(0); }\n to { transform: scale(0.5); opacity: 0.5; filter: blur(2px); }\n}\n\n@keyframes ag-icon-in {\n from { transform: scale(0.5); opacity: 0.5; filter: blur(2px); }\n to { transform: scale(1); opacity: 1; filter: blur(0); }\n}\n\n.ag-theme-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n background: transparent;\n border: none;\n color: rgba(255, 255, 255, 0.4);\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.ag-theme-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n color: rgba(255, 255, 255, 0.8);\n}\n\n.ag-toolbar.ag-light .ag-theme-btn {\n color: rgba(0, 0, 0, 0.35);\n}\n\n.ag-toolbar.ag-light .ag-theme-btn:hover {\n background: rgba(0, 0, 0, 0.05);\n color: rgba(0, 0, 0, 0.75);\n}\n\n.ag-theme-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.ag-theme-icon.ag-icon-out {\n animation: ag-icon-out 0.15s ease forwards;\n}\n\n.ag-theme-icon.ag-icon-in {\n animation: ag-icon-in 0.15s ease forwards;\n}\n\n/* --- Style panel (dark) --- */\n\n.ag-panel {\n position: fixed;\n pointer-events: auto;\n background: #000;\n color: #fff;\n border-radius: 12px;\n width: 340px;\n max-height: 480px;\n overflow-y: auto;\n overscroll-behavior: none;\n font-size: 12px;\n line-height: 1.5;\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.75), 0 4px 24px rgba(0, 0, 0, 0.5), 0 0.5px 0 0 rgba(255, 255, 255, 0.05) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.05) inset, 0 0 0 0.5px rgba(255, 255, 255, 0.10) inset;\n z-index: 2147483647;\n\n /* enter/exit animation */\n opacity: 0;\n filter: blur(4px);\n transform: scale(0.96) translateY(4px);\n transition: opacity 0.18s ease, filter 0.18s ease, transform 0.18s ease;\n}\n\n.ag-panel.ag-panel-visible {\n opacity: 1;\n filter: blur(0);\n transform: scale(1) translateY(0);\n}\n\n.ag-panel.ag-panel-hiding {\n opacity: 0;\n filter: blur(4px);\n transform: scale(0.96) translateY(4px);\n}\n\n.ag-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n position: sticky;\n top: 0;\n background: #000;\n border-radius: 12px 12px 0 0;\n z-index: 1;\n}\n\n.ag-panel-title {\n font-weight: 600;\n color: #57EBA1;\n font-size: 14px;\n}\n\n.ag-panel-actions {\n display: flex;\n gap: 6px;\n}\n\n.ag-panel-btn {\n background: #1a1a1a;\n color: #888;\n border: 1px solid #2a2a2a;\n border-radius: 6px;\n padding: 4px 8px;\n cursor: pointer;\n font-size: 11px;\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: auto;\n transition: all 0.1s ease;\n}\n\n.ag-panel-btn:hover {\n background: #2a2a2a;\n color: #fff;\n border-color: #444;\n}\n\n.ag-panel-btn.copied {\n background: #065f46;\n color: #6ee7b7;\n border-color: #059669;\n}\n\n.ag-panel-close {\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.5);\n cursor: pointer;\n padding-left: 12px;\n border-left: 1px solid #2a2a2a;\n display: flex;\n align-items: center;\n pointer-events: auto;\n transition: all 0.1s ease;\n}\n\n.ag-panel-close:hover {\n color: rgba(255, 255, 255, 1);\n}\n\n/* --- Selector display --- */\n\n.ag-selector {\n padding: 8px 14px;\n background: #28293D;\n font-family: "Geist Mono", monospace;\n font-size: 11px;\n color: #DDA5E9;\n word-break: break-all;\n}\n\n/* --- Style sections --- */\n\n.ag-section {\n padding: 10px 14px 0 14px;\n /* border-bottom: 1px solid rgba(255, 255, 255, 0.1); */\n}\n\n.ag-section:last-child {\n padding-bottom: 14px;\n border-bottom: none;\n}\n\n.ag-section-title {\n font-weight: 500;\n color: rgba(255, 255, 255, 0.5);\n text-transform: uppercase;\n font-size: 10px;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n/* --- Code block (property list) --- */\n\n.ag-code {\n background: #1a1a1a;\n border-radius: 8px;\n padding: 10px 14px;\n font-family: "Geist Mono", monospace;\n font-size: 12px;\n line-height: 1.7;\n}\n\n.ag-code-line {\n white-space: normal;\n word-break: break-all;\n}\n\n.ag-prop-name {\n color: rgba(255, 255, 255, 0.85);\n}\n\n.ag-prop-value {\n color: #DDA5E9;\n}\n\n/* --- Scrollbar --- */\n\n.ag-panel::-webkit-scrollbar {\n display: none;\n}\n\n/* ============================================\n Light theme overrides\n ============================================ */\n\n.ag-panel.ag-light {\n background: #fff;\n color: #1a1a1a;\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.1), 0 4px 24px rgba(0, 0, 0, 0.12);\n}\n\n.ag-panel.ag-light .ag-panel-header {\n background: #fff;\n border-bottom-color: rgba(0, 0, 0, 0.08);\n}\n\n.ag-panel.ag-light .ag-panel-title {\n color: #0d7c4a;\n}\n\n.ag-panel.ag-light .ag-panel-btn {\n background: #f0f0f0;\n color: #666;\n border-color: #e0e0e0;\n}\n\n.ag-panel.ag-light .ag-panel-btn:hover {\n background: #e0e0e0;\n color: #111;\n border-color: #ccc;\n}\n\n.ag-panel.ag-light .ag-panel-close {\n color: rgba(0, 0, 0, 0.4);\n border-left-color: #e0e0e0;\n}\n\n.ag-panel.ag-light .ag-panel-close:hover {\n color: rgba(0, 0, 0, 0.85);\n}\n\n.ag-panel.ag-light .ag-selector {\n background: #f0f0f5;\n color: #8b5cf6;\n}\n\n.ag-panel.ag-light .ag-section {\n border-bottom-color: rgba(0, 0, 0, 0.06);\n}\n\n.ag-panel.ag-light .ag-section-title {\n color: rgba(0, 0, 0, 0.45);\n}\n\n.ag-panel.ag-light .ag-code {\n background: #f5f5f5;\n}\n\n.ag-panel.ag-light .ag-prop-name {\n color: rgba(0, 0, 0, 0.75);\n}\n\n.ag-panel.ag-light .ag-prop-value {\n color: #7c3aed;\n}\n',t.appendChild(o),document.body.appendChild(e),a.shadowHost=e,a.shadowRoot=t,t}();this.createToolbar(n),q=()=>this.toggle(),document.addEventListener("keydown",I,!0),window.addEventListener("scroll",G,!0),window.addEventListener("resize",G,!0),"light"===a.theme&&W?.classList.add("ag-light"),i&&this.activate()}createToolbar(n){W=document.createElement("div"),W.className="ag-toolbar";const e=document.createElement("button");e.className="ag-toggle",e.innerHTML='<span class="ag-toggle-label">Inspect</span><span class="ag-toggle-track"><span class="ag-toggle-knob"></span></span>',e.title="Toggle Element Inspector (Ctrl+Shift+A)",e.addEventListener("click",n=>{n.stopPropagation(),this.toggle()});const t=document.createElement("span");t.className="ag-toolbar-divider";const o=document.createElement("label");o.className="ag-color-picker",o.title="Highlight color";const i=document.createElement("span");i.className="ag-color-swatch",i.style.background=a.highlightColor;const l=document.createElement("input");l.type="color",l.value=a.highlightColor,l.addEventListener("input",n=>{n.stopPropagation();const e=n.target.value;a.highlightColor=e,i.style.background=e,a.hoveredElement&&u(a.hoveredElement),r()}),l.addEventListener("click",n=>n.stopPropagation()),o.appendChild(i),o.appendChild(l);const c=document.createElement("span");c.className="ag-toolbar-divider",Y=document.createElement("button"),Y.className="ag-theme-btn",Y.title="Toggle light/dark panel";const g="dark"===a.theme?s.sun:s.moon;Y.innerHTML=`<span class="ag-theme-icon">${g}</span>`,Y.addEventListener("click",n=>{n.stopPropagation(),this.toggleTheme()}),W.appendChild(e),W.appendChild(t),W.appendChild(o),W.appendChild(c),W.appendChild(Y),n.appendChild(W)}toggleTheme(){if(a.theme="dark"===a.theme?"light":"dark",Y){const n=Y.querySelector(".ag-theme-icon");n&&(n.classList.add("ag-icon-out"),setTimeout(()=>{const e="dark"===a.theme?s.sun:s.moon;n.innerHTML=e,n.classList.remove("ag-icon-out"),n.classList.add("ag-icon-in"),n.addEventListener("animationend",()=>{n.classList.remove("ag-icon-in")},{once:!0})},150))}a.shadowRoot?.querySelector(".ag-panel")?.classList.toggle("ag-light","light"===a.theme),W?.classList.toggle("ag-light","light"===a.theme),r()}activate(){a.active||(a.active=!0,W?.querySelector(".ag-toggle")?.classList.add("active"),document.addEventListener("mousemove",F,!0),document.addEventListener("click",D,!0),r())}deactivate(){a.active&&(a.active=!1,W?.querySelector(".ag-toggle")?.classList.remove("active"),document.removeEventListener("mousemove",F,!0),document.removeEventListener("click",D,!0),h(),f(),h(),f(),j(),a.hoveredElement=null,r())}toggle(){a.active?this.deactivate():this.activate()}destroy(){this.deactivate(),document.removeEventListener("keydown",I,!0),q=null,window.removeEventListener("scroll",G,!0),window.removeEventListener("resize",G,!0),null!==V&&(cancelAnimationFrame(V),V=null),p&&(p.remove(),p=null),m&&(m.remove(),m=null),j(!0),a.shadowHost&&(a.shadowHost.remove(),a.shadowHost=null,a.shadowRoot=null),a.active=!1,a.hoveredElement=null,a.selectedElement=null,a.panelVisible=!1,a.highlightColor="#0063F7",a.theme="dark",W=null,Y=null,this.initialized=!1}get isActive(){return a.active}}let K=null;function X(){return K||(K=new O),K.init(),K}return"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>X()):X()),n.Inspector=O,n.destroy=function(){K?.destroy(),K=null},n.generateSelector=k,n.getInstance=function(){return K},n.init=X,n}({});
|
|
2
|
+
//# sourceMappingURL=agentation.iife.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentation.iife.min.js","sources":["../src/core/state.ts","../src/ui/styles.ts","../src/ui/shadow-host.ts","../src/ui/icons.ts","../src/utils/dom.ts","../src/overlay/highlight.ts","../src/overlay/label.ts","../src/utils/format.ts","../src/selector/generator.ts","../src/panel/style-reader.ts","../src/utils/clipboard.ts","../src/panel/style-panel.ts","../src/events/mouse.ts","../src/events/keyboard.ts","../src/events/scroll-resize.ts","../src/core/inspector.ts","../src/ui/styles.css","../src/index.ts","../src/index-iife.ts"],"sourcesContent":["const STORAGE_KEY = 'agentation-prefs';\n\nexport interface InspectorState {\n active: boolean;\n hoveredElement: HTMLElement | null;\n selectedElement: HTMLElement | null;\n panelVisible: boolean;\n shadowHost: HTMLElement | null;\n shadowRoot: ShadowRoot | null;\n highlightColor: string;\n theme: 'dark' | 'light';\n}\n\ninterface StoredPrefs {\n active: boolean;\n highlightColor: string;\n theme: 'dark' | 'light';\n}\n\nconst defaults: StoredPrefs = {\n active: false,\n highlightColor: '#0063F7',\n theme: 'dark',\n};\n\nfunction loadPrefs(): StoredPrefs {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n return { ...defaults, ...parsed };\n }\n } catch {\n // localStorage unavailable or corrupted\n }\n return { ...defaults };\n}\n\nconst prefs = loadPrefs();\n\nexport const state: InspectorState = {\n active: false,\n hoveredElement: null,\n selectedElement: null,\n panelVisible: false,\n shadowHost: null,\n shadowRoot: null,\n highlightColor: prefs.highlightColor,\n theme: prefs.theme,\n};\n\n// Whether the inspector should auto-activate on init\nexport const savedActive: boolean = prefs.active;\n\nexport function savePrefs(): void {\n try {\n const data: StoredPrefs = {\n active: state.active,\n highlightColor: state.highlightColor,\n theme: state.theme,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch {\n // localStorage unavailable\n }\n}\n\nexport function resetState(): void {\n state.active = false;\n state.hoveredElement = null;\n state.selectedElement = null;\n state.panelVisible = false;\n state.highlightColor = '#0063F7';\n state.theme = 'dark';\n}\n","import cssText from './styles.css';\nexport const STYLES: string = cssText;\n","import { state } from '../core/state';\nimport { STYLES } from './styles';\n\nconst HOST_ID = 'agentation-inspector';\n\nexport function createShadowHost(): ShadowRoot {\n // Remove existing if any\n const existing = document.getElementById(HOST_ID);\n if (existing) existing.remove();\n\n const host = document.createElement('div');\n host.id = HOST_ID;\n host.setAttribute('data-agentation', 'true');\n\n // Set inline styles on the host so page CSS can't interfere\n host.style.cssText = 'position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;overflow:visible!important;z-index:2147483647!important;pointer-events:none!important;';\n\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = STYLES;\n shadow.appendChild(style);\n\n document.body.appendChild(host);\n\n state.shadowHost = host;\n state.shadowRoot = shadow;\n\n return shadow;\n}\n\nexport function destroyShadowHost(): void {\n if (state.shadowHost) {\n state.shadowHost.remove();\n state.shadowHost = null;\n state.shadowRoot = null;\n }\n}\n","export const ICONS = {\n inspect: `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>`,\n\n close: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`,\n\n copy: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>`,\n\n check: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n\n sun: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>`,\n\n moon: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>`,\n};\n","import { state } from '../core/state';\n\nconst SKIP_TAGS = new Set([\n 'SCRIPT', 'STYLE', 'LINK', 'META', 'HEAD', 'TITLE', 'BR', 'WBR',\n 'NOSCRIPT', 'TEMPLATE',\n]);\n\nexport function isInteractable(el: Element): boolean {\n if (!(el instanceof HTMLElement)) return false;\n if (SKIP_TAGS.has(el.tagName)) return false;\n\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) return false;\n\n return true;\n}\n\nexport function isOwnElement(el: Element): boolean {\n if (!state.shadowHost) return false;\n return state.shadowHost === el || state.shadowHost.contains(el);\n}\n","import { state } from '../core/state';\n\nlet highlightEl: HTMLElement | null = null;\n\nfunction ensureHighlight(): HTMLElement {\n if (highlightEl && state.shadowRoot?.contains(highlightEl)) {\n return highlightEl;\n }\n\n highlightEl = document.createElement('div');\n highlightEl.className = 'ag-highlight';\n state.shadowRoot?.appendChild(highlightEl);\n return highlightEl;\n}\n\nexport function showHighlight(target: HTMLElement): void {\n const el = ensureHighlight();\n const rect = target.getBoundingClientRect();\n\n el.style.top = `${rect.top}px`;\n el.style.left = `${rect.left}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.borderColor = state.highlightColor;\n el.style.background = state.highlightColor + '17';\n el.style.display = 'block';\n}\n\nexport function hideHighlight(): void {\n if (highlightEl) {\n highlightEl.style.display = 'none';\n }\n}\n\nexport function destroyHighlight(): void {\n if (highlightEl) {\n highlightEl.remove();\n highlightEl = null;\n }\n}\n","import { state } from '../core/state';\nimport { formatDimensions } from '../utils/format';\n\nlet labelEl: HTMLElement | null = null;\n\nfunction ensureLabel(): HTMLElement {\n if (labelEl && state.shadowRoot?.contains(labelEl)) {\n return labelEl;\n }\n\n labelEl = document.createElement('div');\n labelEl.className = 'ag-label';\n state.shadowRoot?.appendChild(labelEl);\n return labelEl;\n}\n\nexport function showLabel(target: HTMLElement): void {\n const el = ensureLabel();\n const rect = target.getBoundingClientRect();\n\n // Build content\n const tag = target.tagName.toLowerCase();\n const classes = Array.from(target.classList)\n .slice(0, 3)\n .map(c => `.${c}`)\n .join('');\n const dims = formatDimensions(rect.width, rect.height);\n\n el.innerHTML =\n `<span class=\"ag-tag\">${tag}</span>` +\n (classes ? `<span class=\"ag-class\">${classes}</span>` : '') +\n `<span class=\"ag-dims\">${dims}</span>`;\n\n // Position above the element, or below if too close to top\n const labelHeight = 24;\n const gap = 6;\n let top = rect.top - labelHeight - gap;\n if (top < 4) {\n top = rect.bottom + gap;\n }\n\n let left = rect.left;\n // Clamp to viewport\n el.style.display = 'block';\n el.style.top = `${top}px`;\n el.style.left = `${Math.max(4, left)}px`;\n\n // Adjust if overflows right side\n requestAnimationFrame(() => {\n const labelRect = el.getBoundingClientRect();\n if (labelRect.right > window.innerWidth - 4) {\n el.style.left = `${window.innerWidth - labelRect.width - 4}px`;\n }\n });\n}\n\nexport function hideLabel(): void {\n if (labelEl) {\n labelEl.style.display = 'none';\n }\n}\n\nexport function destroyLabel(): void {\n if (labelEl) {\n labelEl.remove();\n labelEl = null;\n }\n}\n","export function formatDimensions(width: number, height: number): string {\n return `${Math.round(width)} × ${Math.round(height)}`;\n}\n\nexport function formatPadding(\n top: string,\n right: string,\n bottom: string,\n left: string\n): string {\n const t = parseFloat(top) || 0;\n const r = parseFloat(right) || 0;\n const b = parseFloat(bottom) || 0;\n const l = parseFloat(left) || 0;\n\n if (t === r && r === b && b === l) {\n return `${t}px`;\n }\n if (t === b && r === l) {\n return `${t}px ${r}px`;\n }\n if (r === l) {\n return `${t}px ${r}px ${b}px`;\n }\n return `${t}px ${r}px ${b}px ${l}px`;\n}\n\nexport function formatBorderRadius(\n tl: string,\n tr: string,\n br: string,\n bl: string\n): string {\n const topLeft = parseFloat(tl) || 0;\n const topRight = parseFloat(tr) || 0;\n const bottomRight = parseFloat(br) || 0;\n const bottomLeft = parseFloat(bl) || 0;\n\n if (topLeft === topRight && topRight === bottomRight && bottomRight === bottomLeft) {\n return `${topLeft}px`;\n }\n if (topLeft === bottomRight && topRight === bottomLeft) {\n return `${topLeft}px ${topRight}px`;\n }\n return `${topLeft}px ${topRight}px ${bottomRight}px ${bottomLeft}px`;\n}\n","const FRAMEWORK_CLASS_PATTERNS = [\n /^v-/, /^ng-/, /^_ng/, /^svelte-/, /^css-/, /^jsx-/, /^sc-/,\n /^__/, /^css-\\d/, /^rs-/, /^emotion-/,\n /^[a-zA-Z]{1,3}[A-Z][a-zA-Z0-9]{4,8}$/, // CSS-module hashes like \"aBcDeFgH\"\n];\n\nfunction isFrameworkClass(cls: string): boolean {\n return FRAMEWORK_CLASS_PATTERNS.some(p => p.test(cls));\n}\n\nfunction escapeSelector(str: string): string {\n if (typeof CSS !== 'undefined' && CSS.escape) {\n return CSS.escape(str);\n }\n // Fallback for environments without CSS.escape (e.g. jsdom)\n return str.replace(/([\\0-\\x1f\\x7f]|^-?\\d|^-$|[^\\x80-\\uFFFF\\w-])/g, (ch) => {\n if (ch === '\\0') return '\\uFFFD';\n return '\\\\' + ch;\n });\n}\n\nfunction getNthChildIndex(el: Element): number {\n let index = 1;\n let sibling = el.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === el.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n return index;\n}\n\nfunction getSiblingCount(el: Element): number {\n let count = 0;\n const parent = el.parentElement;\n if (!parent) return 0;\n for (let i = 0; i < parent.children.length; i++) {\n if (parent.children[i].tagName === el.tagName) count++;\n }\n return count;\n}\n\nfunction buildSegment(el: Element): string {\n const tag = el.tagName.toLowerCase();\n\n // Prefer ID\n if (el.id && !isFrameworkClass(el.id)) {\n return `#${escapeSelector(el.id)}`;\n }\n\n // Use meaningful classes\n const classes = Array.from(el.classList).filter(c => !isFrameworkClass(c));\n if (classes.length > 0) {\n const classSelector = tag + classes.map(c => `.${escapeSelector(c)}`).join('');\n // Check if unique among siblings\n const parent = el.parentElement;\n if (parent) {\n const matches = parent.querySelectorAll(`:scope > ${classSelector}`);\n if (matches.length === 1) return classSelector;\n }\n }\n\n // Fallback to nth-of-type\n if (getSiblingCount(el) > 1) {\n return `${tag}:nth-of-type(${getNthChildIndex(el)})`;\n }\n\n return tag;\n}\n\nexport function generateSelector(el: Element): string {\n // If element has a unique ID, just return that\n if (el.id && !isFrameworkClass(el.id)) {\n const id = `#${escapeSelector(el.id)}`;\n if (document.querySelectorAll(id).length === 1) return id;\n }\n\n const parts: string[] = [];\n let current: Element | null = el;\n\n while (current && current !== document.documentElement && current !== document.body) {\n const segment = buildSegment(current);\n parts.unshift(segment);\n\n // If the selector is already unique, stop climbing\n if (segment.startsWith('#')) break;\n\n const candidate = parts.join(' > ');\n try {\n if (document.querySelectorAll(candidate).length === 1) break;\n } catch {\n // invalid selector, keep climbing\n }\n\n current = current.parentElement;\n }\n\n // Prepend body if needed for uniqueness\n const selector = parts.join(' > ');\n try {\n if (document.querySelectorAll(selector).length !== 1) {\n return 'body > ' + selector;\n }\n } catch {\n // return as-is\n }\n\n return selector;\n}\n","export interface StyleCategory {\n name: string;\n properties: { name: string; value: string }[];\n}\n\nconst CATEGORIES: { name: string; props: string[] }[] = [\n {\n name: 'Typography',\n props: [\n 'font-family', 'font-size', 'font-weight', 'font-style',\n 'line-height', 'letter-spacing', 'text-align', 'text-decoration',\n 'text-transform', 'color',\n ],\n },\n {\n name: 'Box Model',\n props: [\n 'width', 'height', 'padding', 'margin',\n 'border', 'border-radius',\n ],\n },\n {\n name: 'Background',\n props: [\n 'background-color', 'background-image', 'background-size',\n 'background-position', 'opacity',\n ],\n },\n {\n name: 'Layout',\n props: [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'z-index', 'overflow', 'float', 'clear',\n ],\n },\n {\n name: 'Flexbox / Grid',\n props: [\n 'flex-direction', 'flex-wrap', 'justify-content', 'align-items',\n 'align-content', 'gap', 'grid-template-columns', 'grid-template-rows',\n 'grid-column', 'grid-row',\n ],\n },\n];\n\nfunction isDefaultValue(prop: string, value: string): boolean {\n const defaults: Record<string, Set<string>> = {\n 'font-style': new Set(['normal']),\n 'letter-spacing': new Set(['normal', '0px']),\n 'text-decoration': new Set(['none', 'none solid rgb(0, 0, 0)']),\n 'text-transform': new Set(['none']),\n 'background-image': new Set(['none']),\n 'background-size': new Set(['auto']),\n 'background-position': new Set(['0% 0%']),\n 'opacity': new Set(['1']),\n 'top': new Set(['auto']),\n 'right': new Set(['auto']),\n 'bottom': new Set(['auto']),\n 'left': new Set(['auto']),\n 'z-index': new Set(['auto']),\n 'overflow': new Set(['visible']),\n 'float': new Set(['none']),\n 'clear': new Set(['none']),\n 'flex-direction': new Set(['row']),\n 'flex-wrap': new Set(['nowrap']),\n 'grid-template-columns': new Set(['none']),\n 'grid-template-rows': new Set(['none']),\n 'grid-column': new Set(['auto', 'auto / auto']),\n 'grid-row': new Set(['auto', 'auto / auto']),\n };\n\n return defaults[prop]?.has(value) ?? false;\n}\n\nfunction readShorthand(cs: CSSStyleDeclaration, prop: string): string {\n if (prop === 'padding') {\n const t = cs.paddingTop, r = cs.paddingRight, b = cs.paddingBottom, l = cs.paddingLeft;\n if (t === r && r === b && b === l) return t;\n if (t === b && r === l) return `${t} ${r}`;\n return `${t} ${r} ${b} ${l}`;\n }\n if (prop === 'margin') {\n const t = cs.marginTop, r = cs.marginRight, b = cs.marginBottom, l = cs.marginLeft;\n if (t === r && r === b && b === l) return t;\n if (t === b && r === l) return `${t} ${r}`;\n return `${t} ${r} ${b} ${l}`;\n }\n if (prop === 'border') {\n return `${cs.borderTopWidth} ${cs.borderTopStyle} ${cs.borderTopColor}`;\n }\n if (prop === 'border-radius') {\n const tl = cs.borderTopLeftRadius, tr = cs.borderTopRightRadius;\n const br = cs.borderBottomRightRadius, bl = cs.borderBottomLeftRadius;\n if (tl === tr && tr === br && br === bl) return tl;\n return `${tl} ${tr} ${br} ${bl}`;\n }\n return cs.getPropertyValue(prop);\n}\n\nexport function extractStyles(el: HTMLElement): StyleCategory[] {\n const cs = getComputedStyle(el);\n const result: StyleCategory[] = [];\n\n for (const cat of CATEGORIES) {\n const properties: { name: string; value: string }[] = [];\n\n for (const prop of cat.props) {\n const value = readShorthand(cs, prop);\n if (value && !isDefaultValue(prop, value)) {\n properties.push({ name: prop, value });\n }\n }\n\n if (properties.length > 0) {\n result.push({ name: cat.name, properties });\n }\n }\n\n return result;\n}\n\nexport function formatStylesForClipboard(categories: StyleCategory[]): string {\n const lines: string[] = [];\n for (const cat of categories) {\n lines.push(`/* ${cat.name} */`);\n for (const p of cat.properties) {\n lines.push(`${p.name}: ${p.value};`);\n }\n lines.push('');\n }\n return lines.join('\\n').trim();\n}\n","export async function copyToClipboard(text: string): Promise<boolean> {\n if (navigator.clipboard && window.isSecureContext) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // fall through to fallback\n }\n }\n\n // Fallback for non-HTTPS contexts\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n const ok = document.execCommand('copy');\n return ok;\n } catch {\n return false;\n } finally {\n document.body.removeChild(textarea);\n }\n}\n","import { state } from '../core/state';\nimport { ICONS } from '../ui/icons';\nimport { generateSelector } from '../selector/generator';\nimport { extractStyles, formatStylesForClipboard } from './style-reader';\nimport { copyToClipboard } from '../utils/clipboard';\n\nlet panelEl: HTMLElement | null = null;\n// Store as page (document) coordinates so panel scrolls with the page\nlet pageClickX = 0;\nlet pageClickY = 0;\n\nfunction createPanelHTML(el: HTMLElement, selector: string): string {\n const categories = extractStyles(el);\n const tag = el.tagName.toLowerCase();\n\n let sectionsHTML = '';\n for (const cat of categories) {\n let linesHTML = '';\n for (const p of cat.properties) {\n linesHTML += `<div class=\"ag-code-line\"><span class=\"ag-prop-name\">${p.name}</span>: <span class=\"ag-prop-value\">${escapeHTML(p.value)}</span>;</div>`;\n }\n sectionsHTML += `<div class=\"ag-section\"><div class=\"ag-section-title\">${cat.name}</div><div class=\"ag-code\">${linesHTML}</div></div>`;\n }\n\n return `\n <div class=\"ag-panel-header\">\n <span class=\"ag-panel-title\"><${tag}></span>\n <div class=\"ag-panel-actions\">\n <button class=\"ag-panel-btn\" data-action=\"copy-selector\" title=\"Copy selector\">\n ${ICONS.copy} Selector\n </button>\n <button class=\"ag-panel-btn\" data-action=\"copy-styles\" title=\"Copy all styles\">\n ${ICONS.copy} Styles\n </button>\n <button class=\"ag-panel-close\" data-action=\"close\" title=\"Close panel\">\n ${ICONS.close}\n </button>\n </div>\n </div>\n <div class=\"ag-selector\">${escapeHTML(selector)}</div>\n ${sectionsHTML}\n `;\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction positionPanel(): void {\n if (!panelEl) return;\n const panelWidth = 340;\n const gap = 12;\n\n // Convert page coords → viewport coords so panel scrolls with the page\n const viewX = pageClickX - window.scrollX;\n const viewY = pageClickY - window.scrollY;\n\n // Position to the right of the click point\n let left = viewX + gap;\n if (left + panelWidth > window.innerWidth - 8) {\n left = viewX - panelWidth - gap;\n if (left < 8) {\n left = window.innerWidth - panelWidth - 8;\n }\n }\n\n let top = viewY - 20;\n if (top + 480 > window.innerHeight - 8) {\n top = Math.max(8, window.innerHeight - 488);\n }\n if (top < 8) top = 8;\n\n panelEl.style.top = `${top}px`;\n panelEl.style.left = `${left}px`;\n}\n\nfunction handlePanelClick(e: Event): void {\n const target = e.target as HTMLElement;\n const btn = target.closest('[data-action]') as HTMLElement | null;\n if (!btn) return;\n\n const action = btn.dataset.action;\n\n if (action === 'close') {\n hidePanel();\n return;\n }\n\n if (action === 'copy-selector' && state.selectedElement) {\n const selector = generateSelector(state.selectedElement);\n copyToClipboard(selector).then(() => flashCopied(btn));\n return;\n }\n\n if (action === 'copy-styles' && state.selectedElement) {\n const categories = extractStyles(state.selectedElement);\n const text = formatStylesForClipboard(categories);\n copyToClipboard(text).then(() => flashCopied(btn));\n return;\n }\n}\n\nfunction flashCopied(btn: HTMLElement): void {\n const original = btn.innerHTML;\n btn.innerHTML = `${ICONS.check} Copied!`;\n btn.classList.add('copied');\n setTimeout(() => {\n btn.innerHTML = original;\n btn.classList.remove('copied');\n }, 1500);\n}\n\nexport function showPanel(target: HTMLElement, cursorX: number, cursorY: number): void {\n hidePanel(true);\n\n state.selectedElement = target;\n state.panelVisible = true;\n // Store as page (document) coordinates\n pageClickX = cursorX + window.scrollX;\n pageClickY = cursorY + window.scrollY;\n\n const selector = generateSelector(target);\n\n panelEl = document.createElement('div');\n panelEl.className = 'ag-panel' + (state.theme === 'light' ? ' ag-light' : '');\n panelEl.innerHTML = createPanelHTML(target, selector);\n panelEl.addEventListener('click', handlePanelClick);\n\n state.shadowRoot?.appendChild(panelEl);\n positionPanel();\n\n // Trigger enter animation on next frame\n requestAnimationFrame(() => {\n panelEl?.classList.add('ag-panel-visible');\n });\n}\n\nexport function hidePanel(immediate = false): void {\n if (!panelEl) return;\n\n if (immediate) {\n // Remove instantly (used when replacing with a new panel)\n panelEl.removeEventListener('click', handlePanelClick);\n panelEl.remove();\n panelEl = null;\n state.selectedElement = null;\n state.panelVisible = false;\n return;\n }\n\n // Animate out\n const el = panelEl;\n el.classList.remove('ag-panel-visible');\n el.classList.add('ag-panel-hiding');\n\n const onDone = () => {\n el.removeEventListener('transitionend', onDone);\n el.removeEventListener('click', handlePanelClick);\n el.remove();\n if (panelEl === el) panelEl = null;\n };\n el.addEventListener('transitionend', onDone, { once: true });\n // Fallback in case transitionend doesn't fire\n setTimeout(onDone, 250);\n\n state.selectedElement = null;\n state.panelVisible = false;\n}\n\nexport function repositionPanel(): void {\n if (panelEl && state.panelVisible) {\n positionPanel();\n }\n}\n\nexport function destroyPanel(): void {\n hidePanel(true);\n}\n","import { state } from '../core/state';\nimport { isInteractable, isOwnElement } from '../utils/dom';\nimport { showHighlight, hideHighlight } from '../overlay/highlight';\nimport { showLabel, hideLabel } from '../overlay/label';\nimport { showPanel, hidePanel } from '../panel/style-panel';\n\nfunction onMouseMove(e: MouseEvent): void {\n if (!state.active) return;\n\n const target = e.target as Element;\n if (!target || isOwnElement(target) || !isInteractable(target)) {\n return;\n }\n\n const el = target as HTMLElement;\n if (state.hoveredElement === el) return;\n\n state.hoveredElement = el;\n showHighlight(el);\n showLabel(el);\n}\n\nfunction onMouseOut(e: MouseEvent): void {\n if (!state.active) return;\n\n // Only hide if mouse actually left the element (not entering a child)\n const related = e.relatedTarget as Element | null;\n if (related && !isOwnElement(related) && isInteractable(related)) {\n return;\n }\n\n state.hoveredElement = null;\n hideHighlight();\n hideLabel();\n}\n\nfunction onClick(e: MouseEvent): void {\n if (!state.active) return;\n\n const target = e.target as Element;\n if (!target || isOwnElement(target)) return;\n if (!isInteractable(target)) return;\n\n // Prevent the page from handling the click\n e.preventDefault();\n e.stopPropagation();\n\n const el = target as HTMLElement;\n\n if (state.panelVisible && state.selectedElement === el) {\n hidePanel();\n } else {\n showPanel(el, e.clientX, e.clientY);\n }\n}\n\nexport function bindMouseEvents(): void {\n document.addEventListener('mousemove', onMouseMove, true);\n document.addEventListener('click', onClick, true);\n}\n\nexport function unbindMouseEvents(): void {\n document.removeEventListener('mousemove', onMouseMove, true);\n document.removeEventListener('click', onClick, true);\n hideHighlight();\n hideLabel();\n}\n","import { state } from '../core/state';\nimport { hidePanel } from '../panel/style-panel';\n\nlet toggleCallback: (() => void) | null = null;\n\nfunction onKeyDown(e: KeyboardEvent): void {\n // Ctrl+Shift+A (or Cmd+Shift+A on Mac) — toggle inspector\n if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'A') {\n e.preventDefault();\n e.stopPropagation();\n toggleCallback?.();\n return;\n }\n\n // Escape — close panel or deactivate\n if (e.key === 'Escape' && state.active) {\n e.preventDefault();\n if (state.panelVisible) {\n hidePanel();\n } else {\n toggleCallback?.();\n }\n return;\n }\n}\n\nexport function bindKeyboardEvents(onToggle: () => void): void {\n toggleCallback = onToggle;\n document.addEventListener('keydown', onKeyDown, true);\n}\n\nexport function unbindKeyboardEvents(): void {\n document.removeEventListener('keydown', onKeyDown, true);\n toggleCallback = null;\n}\n","import { state } from '../core/state';\nimport { showHighlight } from '../overlay/highlight';\nimport { showLabel } from '../overlay/label';\nimport { repositionPanel } from '../panel/style-panel';\n\nlet rafId: number | null = null;\n\nfunction update(): void {\n rafId = null;\n\n if (!state.active) return;\n\n if (state.hoveredElement) {\n showHighlight(state.hoveredElement);\n showLabel(state.hoveredElement);\n }\n\n if (state.panelVisible) {\n repositionPanel();\n }\n}\n\nfunction onScrollOrResize(): void {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(update);\n}\n\nexport function bindScrollResize(): void {\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize, true);\n}\n\nexport function unbindScrollResize(): void {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize, true);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n}\n","import { state, savedActive, resetState, savePrefs } from './state';\nimport { createShadowHost, destroyShadowHost } from '../ui/shadow-host';\nimport { ICONS } from '../ui/icons';\nimport { bindMouseEvents, unbindMouseEvents } from '../events/mouse';\nimport { bindKeyboardEvents, unbindKeyboardEvents } from '../events/keyboard';\nimport { bindScrollResize, unbindScrollResize } from '../events/scroll-resize';\nimport { showHighlight, hideHighlight, destroyHighlight } from '../overlay/highlight';\nimport { hideLabel, destroyLabel } from '../overlay/label';\nimport { hidePanel, destroyPanel } from '../panel/style-panel';\n\nlet toolbar: HTMLElement | null = null;\nlet themeBtn: HTMLElement | null = null;\n\nexport class Inspector {\n private initialized = false;\n\n init(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n const shadow = createShadowHost();\n this.createToolbar(shadow);\n bindKeyboardEvents(() => this.toggle());\n bindScrollResize();\n\n // Restore saved theme on the toolbar\n if (state.theme === 'light') {\n toolbar?.classList.add('ag-light');\n }\n\n // Restore active state from previous session\n if (savedActive) {\n this.activate();\n }\n }\n\n private createToolbar(shadow: ShadowRoot): void {\n toolbar = document.createElement('div');\n toolbar.className = 'ag-toolbar';\n\n // Inspect toggle\n const toggleBtn = document.createElement('button');\n toggleBtn.className = 'ag-toggle';\n toggleBtn.innerHTML = `<span class=\"ag-toggle-label\">Inspect</span><span class=\"ag-toggle-track\"><span class=\"ag-toggle-knob\"></span></span>`;\n toggleBtn.title = 'Toggle Element Inspector (Ctrl+Shift+A)';\n toggleBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggle();\n });\n\n // Divider\n const div1 = document.createElement('span');\n div1.className = 'ag-toolbar-divider';\n\n // Color picker\n const colorWrap = document.createElement('label');\n colorWrap.className = 'ag-color-picker';\n colorWrap.title = 'Highlight color';\n const colorSwatch = document.createElement('span');\n colorSwatch.className = 'ag-color-swatch';\n colorSwatch.style.background = state.highlightColor;\n const colorInput = document.createElement('input');\n colorInput.type = 'color';\n colorInput.value = state.highlightColor;\n colorInput.addEventListener('input', (e) => {\n e.stopPropagation();\n const val = (e.target as HTMLInputElement).value;\n state.highlightColor = val;\n colorSwatch.style.background = val;\n if (state.hoveredElement) {\n showHighlight(state.hoveredElement);\n }\n savePrefs();\n });\n colorInput.addEventListener('click', (e) => e.stopPropagation());\n colorWrap.appendChild(colorSwatch);\n colorWrap.appendChild(colorInput);\n\n // Divider\n const div2 = document.createElement('span');\n div2.className = 'ag-toolbar-divider';\n\n // Theme toggle\n themeBtn = document.createElement('button');\n themeBtn.className = 'ag-theme-btn';\n themeBtn.title = 'Toggle light/dark panel';\n const initIcon = state.theme === 'dark' ? ICONS.sun : ICONS.moon;\n themeBtn.innerHTML = `<span class=\"ag-theme-icon\">${initIcon}</span>`;\n themeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleTheme();\n });\n\n toolbar.appendChild(toggleBtn);\n toolbar.appendChild(div1);\n toolbar.appendChild(colorWrap);\n toolbar.appendChild(div2);\n toolbar.appendChild(themeBtn);\n shadow.appendChild(toolbar);\n }\n\n private toggleTheme(): void {\n state.theme = state.theme === 'dark' ? 'light' : 'dark';\n\n // Animate icon swap\n if (themeBtn) {\n const iconWrap = themeBtn.querySelector('.ag-theme-icon') as HTMLElement | null;\n if (iconWrap) {\n iconWrap.classList.add('ag-icon-out');\n setTimeout(() => {\n const newIcon = state.theme === 'dark' ? ICONS.sun : ICONS.moon;\n iconWrap.innerHTML = newIcon;\n iconWrap.classList.remove('ag-icon-out');\n iconWrap.classList.add('ag-icon-in');\n iconWrap.addEventListener('animationend', () => {\n iconWrap.classList.remove('ag-icon-in');\n }, { once: true });\n }, 150);\n }\n }\n\n state.shadowRoot?.querySelector('.ag-panel')?.classList.toggle('ag-light', state.theme === 'light');\n toolbar?.classList.toggle('ag-light', state.theme === 'light');\n savePrefs();\n }\n\n activate(): void {\n if (state.active) return;\n state.active = true;\n toolbar?.querySelector('.ag-toggle')?.classList.add('active');\n bindMouseEvents();\n savePrefs();\n }\n\n deactivate(): void {\n if (!state.active) return;\n state.active = false;\n toolbar?.querySelector('.ag-toggle')?.classList.remove('active');\n unbindMouseEvents();\n hideHighlight();\n hideLabel();\n hidePanel();\n state.hoveredElement = null;\n savePrefs();\n }\n\n toggle(): void {\n if (state.active) {\n this.deactivate();\n } else {\n this.activate();\n }\n }\n\n destroy(): void {\n this.deactivate();\n unbindKeyboardEvents();\n unbindScrollResize();\n destroyHighlight();\n destroyLabel();\n destroyPanel();\n destroyShadowHost();\n resetState();\n toolbar = null;\n themeBtn = null;\n this.initialized = false;\n }\n\n get isActive(): boolean {\n return state.active;\n }\n}\n","export default \"/* ============================================\\n Agentation — Element Inspector Styles\\n ============================================\\n Edit these to customize the inspector's look.\\n All styles are scoped inside Shadow DOM so they\\n won't leak into the host page.\\n ============================================ */\\n\\n/* --- Host container (don't remove) --- */\\n\\n@import url('https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap');\\n\\n:host {\\n position: fixed !important;\\n top: 0 !important;\\n left: 0 !important;\\n width: 0 !important;\\n height: 0 !important;\\n overflow: visible !important;\\n z-index: 2147483647 !important;\\n pointer-events: none !important;\\n font-family: \\\"Geist\\\", sans-serif;\\n}\\n\\n*, *::before, *::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n}\\n\\n/* --- Highlight overlay (blue border on hover) --- */\\n\\n.ag-highlight {\\n position: fixed;\\n pointer-events: none;\\n border: 2px solid #0063F7;\\n background: #0063f717;\\n border-radius: 2px;\\n transition: top 0.15s cubic-bezier(0.4, 0, 0.2, 1), left 0.15s cubic-bezier(0.4, 0, 0.2, 1), width 0.15s cubic-bezier(0.4, 0, 0.2, 1), height 0.15s cubic-bezier(0.4, 0, 0.2, 1);\\n z-index: 2147483646;\\n}\\n\\n/* --- Floating label (tag name badge) --- */\\n\\n.ag-label {\\n position: fixed;\\n pointer-events: none;\\n background: #28293D;\\n color: #f1f5f9;\\n font-size: 12px;\\n font-weight: 500;\\n line-height: 1;\\n padding: 4px 8px;\\n border-radius: 4px;\\n white-space: nowrap;\\n z-index: 2147483647;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\\n}\\n\\n.ag-label .ag-tag {\\n color: #57EBA1;\\n font-weight: 600;\\n}\\n\\n.ag-label .ag-class {\\n color: #DDA5E9;\\n}\\n\\n.ag-label .ag-dims {\\n color: #94a3b8;\\n margin-left: 6px;\\n}\\n\\n/* --- Toolbar (bottom-right bar) --- */\\n\\n.ag-toolbar {\\n position: fixed;\\n bottom: 16px;\\n right: 16px;\\n display: flex;\\n align-items: center;\\n gap: 0;\\n pointer-events: auto;\\n z-index: 2147483647;\\n background: #1a1a1a;\\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\\n border-radius: 10px;\\n border: 0.5px solid rgba(255, 255, 255, 0.08);\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.75), 0 0.5px 0 0 rgba(255, 255, 255, 0.05) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.05) inset, 0 0 0 0.5px rgba(255, 255, 255, 0.10) inset;\\n padding: 2px;\\n}\\n\\n.ag-toolbar:active {\\n transform: scale(.99);\\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\\n}\\n\\n.ag-toolbar.ag-light {\\n background: #ffff;\\n border-color: none;\\n box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.06), 0px 1px 2px -1px rgba(0, 0, 0, 0.06), 0px 2px 4px 0px rgba(0, 0, 0, 0.04);\\n}\\n\\n.ag-toolbar-divider {\\n width: 1px;\\n height: 20px;\\n background: rgba(255, 255, 255, 0.1);\\n flex-shrink: 0;\\n margin: 0 2px;\\n}\\n\\n.ag-toolbar.ag-light .ag-toolbar-divider {\\n background: rgba(0, 0, 0, 0.12);\\n}\\n\\n/* --- Toggle button (inside toolbar) --- */\\n\\n.ag-toggle {\\n height: 34px;\\n border-radius: 8px;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.5);\\n border: none;\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 0 8px;\\n transition: all 0.15s ease;\\n font-family: \\\"Geist\\\", sans-serif;\\n font-size: 12px;\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n\\n.ag-toggle:hover {\\n background: rgba(255, 255, 255, 0.06);\\n}\\n\\n.ag-toggle.active {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle {\\n color: rgba(0, 0, 0, 0.45);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle.active {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.ag-toggle-label {\\n pointer-events: none;\\n}\\n\\n.ag-toggle-track {\\n width: 40px;\\n height: 24px;\\n border-radius: 12px;\\n background: rgba(255, 255, 255, 0.12);\\n position: relative;\\n transition: background 0.2s ease;\\n pointer-events: none;\\n flex-shrink: 0;\\n}\\n\\n.ag-toggle.active .ag-toggle-track {\\n background: #0063F7;\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle-track {\\n background: rgba(0, 0, 0, 0.15);\\n}\\n\\n.ag-toolbar.ag-light .ag-toggle.active .ag-toggle-track {\\n background: #0063F7;\\n}\\n\\n.ag-toggle-knob {\\n position: absolute;\\n top: 3px;\\n left: 3px;\\n width: 18px;\\n height: 18px;\\n border-radius: 50%;\\n background: rgba(255, 255, 255, 1);\\n box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.04), 0 2px 2px 0 rgba(0, 0, 0, 0.02), 0 0.5px 0 0 rgba(255, 255, 255, 0.20) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.10) inset, 0 0 0 0.5px rgba(0, 0, 0, 0.15) inset;\\n transition: all 0.2s ease;\\n}\\n\\n.ag-toggle.active .ag-toggle-knob {\\n left: 19px;\\n background: #fff;\\n}\\n\\n/* --- Color picker --- */\\n\\n.ag-color-picker {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 34px;\\n height: 34px;\\n cursor: pointer;\\n border-radius: 8px;\\n transition: background 0.15s ease;\\n position: relative;\\n}\\n\\n.ag-color-picker:hover {\\n background: rgba(255, 255, 255, 0.06);\\n}\\n\\n.ag-toolbar.ag-light .ag-color-picker:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.ag-color-swatch {\\n width: 18px;\\n height: 18px;\\n border-radius: 50%;\\n border: 2px solid rgba(255, 255, 255, 0.2);\\n pointer-events: none;\\n}\\n\\n.ag-toolbar.ag-light .ag-color-swatch {\\n border-color: rgba(0, 0, 0, 0.15);\\n}\\n\\n.ag-color-picker input[type=\\\"color\\\"] {\\n position: absolute;\\n width: 100%;\\n height: 100%;\\n opacity: 0;\\n cursor: pointer;\\n top: 0;\\n left: 0;\\n}\\n\\n/* --- Theme toggle --- */\\n\\n@keyframes ag-icon-out {\\n from { transform: scale(1); opacity: 1; filter: blur(0); }\\n to { transform: scale(0.5); opacity: 0.5; filter: blur(2px); }\\n}\\n\\n@keyframes ag-icon-in {\\n from { transform: scale(0.5); opacity: 0.5; filter: blur(2px); }\\n to { transform: scale(1); opacity: 1; filter: blur(0); }\\n}\\n\\n.ag-theme-btn {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 34px;\\n height: 34px;\\n background: transparent;\\n border: none;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n border-radius: 8px;\\n transition: background 0.15s ease, color 0.15s ease;\\n}\\n\\n.ag-theme-btn:hover {\\n background: rgba(255, 255, 255, 0.06);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n\\n.ag-toolbar.ag-light .ag-theme-btn {\\n color: rgba(0, 0, 0, 0.35);\\n}\\n\\n.ag-toolbar.ag-light .ag-theme-btn:hover {\\n background: rgba(0, 0, 0, 0.05);\\n color: rgba(0, 0, 0, 0.75);\\n}\\n\\n.ag-theme-icon {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.ag-theme-icon.ag-icon-out {\\n animation: ag-icon-out 0.15s ease forwards;\\n}\\n\\n.ag-theme-icon.ag-icon-in {\\n animation: ag-icon-in 0.15s ease forwards;\\n}\\n\\n/* --- Style panel (dark) --- */\\n\\n.ag-panel {\\n position: fixed;\\n pointer-events: auto;\\n background: #000;\\n color: #fff;\\n border-radius: 12px;\\n width: 340px;\\n max-height: 480px;\\n overflow-y: auto;\\n overscroll-behavior: none;\\n font-size: 12px;\\n line-height: 1.5;\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.75), 0 4px 24px rgba(0, 0, 0, 0.5), 0 0.5px 0 0 rgba(255, 255, 255, 0.05) inset, 0 -0.5px 0 0 rgba(0, 0, 0, 0.05) inset, 0 0 0 0.5px rgba(255, 255, 255, 0.10) inset;\\n z-index: 2147483647;\\n\\n /* enter/exit animation */\\n opacity: 0;\\n filter: blur(4px);\\n transform: scale(0.96) translateY(4px);\\n transition: opacity 0.18s ease, filter 0.18s ease, transform 0.18s ease;\\n}\\n\\n.ag-panel.ag-panel-visible {\\n opacity: 1;\\n filter: blur(0);\\n transform: scale(1) translateY(0);\\n}\\n\\n.ag-panel.ag-panel-hiding {\\n opacity: 0;\\n filter: blur(4px);\\n transform: scale(0.96) translateY(4px);\\n}\\n\\n.ag-panel-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: 8px 14px;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\\n position: sticky;\\n top: 0;\\n background: #000;\\n border-radius: 12px 12px 0 0;\\n z-index: 1;\\n}\\n\\n.ag-panel-title {\\n font-weight: 600;\\n color: #57EBA1;\\n font-size: 14px;\\n}\\n\\n.ag-panel-actions {\\n display: flex;\\n gap: 6px;\\n}\\n\\n.ag-panel-btn {\\n background: #1a1a1a;\\n color: #888;\\n border: 1px solid #2a2a2a;\\n border-radius: 6px;\\n padding: 4px 8px;\\n cursor: pointer;\\n font-size: 11px;\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n pointer-events: auto;\\n transition: all 0.1s ease;\\n}\\n\\n.ag-panel-btn:hover {\\n background: #2a2a2a;\\n color: #fff;\\n border-color: #444;\\n}\\n\\n.ag-panel-btn.copied {\\n background: #065f46;\\n color: #6ee7b7;\\n border-color: #059669;\\n}\\n\\n.ag-panel-close {\\n background: none;\\n border: none;\\n color: rgba(255, 255, 255, 0.5);\\n cursor: pointer;\\n padding-left: 12px;\\n border-left: 1px solid #2a2a2a;\\n display: flex;\\n align-items: center;\\n pointer-events: auto;\\n transition: all 0.1s ease;\\n}\\n\\n.ag-panel-close:hover {\\n color: rgba(255, 255, 255, 1);\\n}\\n\\n/* --- Selector display --- */\\n\\n.ag-selector {\\n padding: 8px 14px;\\n background: #28293D;\\n font-family: \\\"Geist Mono\\\", monospace;\\n font-size: 11px;\\n color: #DDA5E9;\\n word-break: break-all;\\n}\\n\\n/* --- Style sections --- */\\n\\n.ag-section {\\n padding: 10px 14px 0 14px;\\n /* border-bottom: 1px solid rgba(255, 255, 255, 0.1); */\\n}\\n\\n.ag-section:last-child {\\n padding-bottom: 14px;\\n border-bottom: none;\\n}\\n\\n.ag-section-title {\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.5);\\n text-transform: uppercase;\\n font-size: 10px;\\n letter-spacing: 0.5px;\\n margin-bottom: 6px;\\n}\\n\\n/* --- Code block (property list) --- */\\n\\n.ag-code {\\n background: #1a1a1a;\\n border-radius: 8px;\\n padding: 10px 14px;\\n font-family: \\\"Geist Mono\\\", monospace;\\n font-size: 12px;\\n line-height: 1.7;\\n}\\n\\n.ag-code-line {\\n white-space: normal;\\n word-break: break-all;\\n}\\n\\n.ag-prop-name {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.ag-prop-value {\\n color: #DDA5E9;\\n}\\n\\n/* --- Scrollbar --- */\\n\\n.ag-panel::-webkit-scrollbar {\\n display: none;\\n}\\n\\n/* ============================================\\n Light theme overrides\\n ============================================ */\\n\\n.ag-panel.ag-light {\\n background: #fff;\\n color: #1a1a1a;\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.1), 0 4px 24px rgba(0, 0, 0, 0.12);\\n}\\n\\n.ag-panel.ag-light .ag-panel-header {\\n background: #fff;\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n\\n.ag-panel.ag-light .ag-panel-title {\\n color: #0d7c4a;\\n}\\n\\n.ag-panel.ag-light .ag-panel-btn {\\n background: #f0f0f0;\\n color: #666;\\n border-color: #e0e0e0;\\n}\\n\\n.ag-panel.ag-light .ag-panel-btn:hover {\\n background: #e0e0e0;\\n color: #111;\\n border-color: #ccc;\\n}\\n\\n.ag-panel.ag-light .ag-panel-close {\\n color: rgba(0, 0, 0, 0.4);\\n border-left-color: #e0e0e0;\\n}\\n\\n.ag-panel.ag-light .ag-panel-close:hover {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.ag-panel.ag-light .ag-selector {\\n background: #f0f0f5;\\n color: #8b5cf6;\\n}\\n\\n.ag-panel.ag-light .ag-section {\\n border-bottom-color: rgba(0, 0, 0, 0.06);\\n}\\n\\n.ag-panel.ag-light .ag-section-title {\\n color: rgba(0, 0, 0, 0.45);\\n}\\n\\n.ag-panel.ag-light .ag-code {\\n background: #f5f5f5;\\n}\\n\\n.ag-panel.ag-light .ag-prop-name {\\n color: rgba(0, 0, 0, 0.75);\\n}\\n\\n.ag-panel.ag-light .ag-prop-value {\\n color: #7c3aed;\\n}\\n\";","import { Inspector } from './core/inspector';\nexport { Inspector } from './core/inspector';\nexport { generateSelector } from './selector/generator';\n\nlet instance: Inspector | null = null;\n\nexport function init(): Inspector {\n if (!instance) {\n instance = new Inspector();\n }\n instance.init();\n return instance;\n}\n\nexport function destroy(): void {\n instance?.destroy();\n instance = null;\n}\n\nexport function getInstance(): Inspector | null {\n return instance;\n}\n","import { init, destroy, getInstance, Inspector } from './index';\nexport { generateSelector } from './selector/generator';\nexport { init, destroy, getInstance, Inspector };\n\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => init());\n } else {\n init();\n }\n}\n"],"names":["STORAGE_KEY","defaults","active","highlightColor","theme","prefs","raw","localStorage","getItem","parsed","JSON","parse","loadPrefs","state","hoveredElement","selectedElement","panelVisible","shadowHost","shadowRoot","savedActive","savePrefs","data","setItem","stringify","HOST_ID","ICONS","close","copy","check","sun","moon","SKIP_TAGS","Set","isInteractable","el","HTMLElement","has","tagName","rect","getBoundingClientRect","width","height","isOwnElement","contains","highlightEl","showHighlight","target","document","createElement","className","appendChild","style","top","left","borderColor","background","display","hideHighlight","labelEl","showLabel","tag","toLowerCase","classes","Array","from","classList","slice","map","c","join","dims","Math","round","innerHTML","bottom","max","requestAnimationFrame","labelRect","right","window","innerWidth","hideLabel","FRAMEWORK_CLASS_PATTERNS","isFrameworkClass","cls","some","p","test","escapeSelector","str","CSS","escape","replace","ch","buildSegment","id","filter","length","classSelector","parent","parentElement","querySelectorAll","count","i","children","getSiblingCount","index","sibling","previousElementSibling","getNthChildIndex","generateSelector","parts","current","documentElement","body","segment","unshift","startsWith","candidate","selector","CATEGORIES","name","props","isDefaultValue","prop","value","opacity","overflow","float","clear","readShorthand","cs","t","paddingTop","r","paddingRight","b","paddingBottom","l","paddingLeft","marginTop","marginRight","marginBottom","marginLeft","borderTopWidth","borderTopStyle","borderTopColor","tl","borderTopLeftRadius","tr","borderTopRightRadius","br","borderBottomRightRadius","bl","borderBottomLeftRadius","getPropertyValue","extractStyles","getComputedStyle","result","cat","properties","push","async","copyToClipboard","text","navigator","clipboard","isSecureContext","writeText","textarea","position","focus","select","execCommand","removeChild","panelEl","pageClickX","pageClickY","escapeHTML","positionPanel","viewX","scrollX","viewY","scrollY","innerHeight","handlePanelClick","e","btn","closest","action","dataset","then","flashCopied","categories","lines","trim","formatStylesForClipboard","hidePanel","original","add","setTimeout","remove","showPanel","cursorX","cursorY","sectionsHTML","linesHTML","createPanelHTML","addEventListener","immediate","removeEventListener","onDone","once","onMouseMove","onClick","preventDefault","stopPropagation","clientX","clientY","toggleCallback","onKeyDown","ctrlKey","metaKey","shiftKey","key","rafId","update","onScrollOrResize","toolbar","themeBtn","Inspector","constructor","this","initialized","init","shadow","existing","getElementById","host","setAttribute","cssText","attachShadow","mode","textContent","createShadowHost","createToolbar","toggle","activate","toggleBtn","title","div1","colorWrap","colorSwatch","colorInput","type","val","div2","initIcon","toggleTheme","iconWrap","querySelector","newIcon","deactivate","destroy","cancelAnimationFrame","isActive","instance","readyState"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "blissful-web-agentation",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Framework-agnostic dev-time element inspector",
|
|
5
|
+
"main": "dist/agentation.cjs.js",
|
|
6
|
+
"module": "dist/agentation.esm.mjs",
|
|
7
|
+
"types": "dist/agentation.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/agentation.esm.mjs",
|
|
11
|
+
"require": "./dist/agentation.cjs.js",
|
|
12
|
+
"types": "./dist/agentation.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"css-inspector",
|
|
20
|
+
"element-inspector",
|
|
21
|
+
"devtools",
|
|
22
|
+
"developer-tools",
|
|
23
|
+
"css-debugger",
|
|
24
|
+
"framework-agnostic",
|
|
25
|
+
"style-inspector"
|
|
26
|
+
],
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "rollup -c rollup.config.mjs",
|
|
30
|
+
"watch": "rollup -c rollup.config.mjs -w",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest",
|
|
33
|
+
"dev": "npx serve ."
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"rollup": "^4.9.0",
|
|
37
|
+
"rollup-plugin-esbuild": "^6.1.0",
|
|
38
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
39
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
40
|
+
"typescript": "^5.3.0",
|
|
41
|
+
"vitest": "^1.2.0",
|
|
42
|
+
"jsdom": "^24.0.0"
|
|
43
|
+
},
|
|
44
|
+
"license": "MIT"
|
|
45
|
+
}
|