uidex 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/menu.ts","../../src/core/utils.ts","../../src/core/overlay.ts","../../src/core/inspector.ts","../../src/core/modal.ts","../../src/core/registry.ts","../../src/core/css-text.ts","../../src/core/shadow.ts","../../src/core/uidex-ui.ts"],"sourcesContent":["import type { ButtonPosition } from './types';\n\nexport const POSITION_CLASSES: Record<ButtonPosition, string> = {\n 'bottom-right': 'uidex-bottom-right',\n 'bottom-left': 'uidex-bottom-left',\n 'top-right': 'uidex-top-right',\n 'top-left': 'uidex-top-left',\n};\n\nconst NS = 'http://www.w3.org/2000/svg';\n\n/** Create a base SVG icon with standard stroke attributes. */\nfunction createIconSVG(children: SVGElement[]): SVGSVGElement {\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('class', 'uidex-trigger-icon');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n for (const child of children) svg.appendChild(child);\n return svg;\n}\n\nfunction createListSVG(): SVGSVGElement {\n const lines = [6, 12, 18].map((y) => {\n const line = document.createElementNS(NS, 'line');\n line.setAttribute('x1', '4');\n line.setAttribute('y1', String(y));\n line.setAttribute('x2', '20');\n line.setAttribute('y2', String(y));\n return line;\n });\n return createIconSVG(lines);\n}\n\nfunction createSelectSVG(): SVGSVGElement {\n const path1 = document.createElementNS(NS, 'path');\n path1.setAttribute('d', 'M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z');\n const path2 = document.createElementNS(NS, 'path');\n path2.setAttribute('d', 'M13 13l6 6');\n return createIconSVG([path1, path2]);\n}\n\nfunction createCopySVG(): SVGSVGElement {\n const rect = document.createElementNS(NS, 'rect');\n rect.setAttribute('x', '9');\n rect.setAttribute('y', '9');\n rect.setAttribute('width', '13');\n rect.setAttribute('height', '13');\n rect.setAttribute('rx', '2');\n const path = document.createElementNS(NS, 'path');\n path.setAttribute('d', 'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1');\n return createIconSVG([rect, path]);\n}\n\nfunction createFeedbackSVG(): SVGSVGElement {\n const path = document.createElementNS(NS, 'path');\n path.setAttribute('d', 'M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z');\n return createIconSVG([path]);\n}\n\nexport interface MenuOptions {\n onInspectToggle?: () => void;\n onCopyToggle?: () => void;\n onFeedbackToggle?: () => void;\n onExpandClick?: () => void;\n}\n\nexport class Menu {\n private container: HTMLDivElement | null = null;\n private group: HTMLDivElement | null = null;\n private expandBtn: HTMLButtonElement | null = null;\n private inspectBtn: HTMLButtonElement | null = null;\n private copyBtn: HTMLButtonElement | null = null;\n private feedbackBtn: HTMLButtonElement | null = null;\n private options: MenuOptions;\n\n // Drag state\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragStartLeft = 0;\n private dragStartTop = 0;\n private hasDragged = false;\n\n private boundPointerDown: (e: PointerEvent) => void;\n private boundPointerMove: (e: PointerEvent) => void;\n private boundPointerUp: (e: PointerEvent) => void;\n\n constructor(options: MenuOptions = {}) {\n this.options = options;\n this.boundPointerDown = this.handlePointerDown.bind(this);\n this.boundPointerMove = this.handlePointerMove.bind(this);\n this.boundPointerUp = this.handlePointerUp.bind(this);\n }\n\n getContainer(): HTMLDivElement | null {\n return this.container;\n }\n\n /** Update a button's active state. */\n private setButtonActive(btn: HTMLButtonElement | null, active: boolean): void {\n if (!btn) return;\n btn.classList.toggle('uidex-trigger-btn--active', active);\n btn.setAttribute('aria-pressed', String(active));\n }\n\n setInspectActive(active: boolean): void {\n this.setButtonActive(this.inspectBtn, active);\n }\n\n setCopyActive(active: boolean): void {\n this.setButtonActive(this.copyBtn, active);\n }\n\n setFeedbackActive(active: boolean): void {\n this.setButtonActive(this.feedbackBtn, active);\n }\n\n private createButton(\n modifier: string,\n ariaLabel: string,\n title: string,\n icon: SVGSVGElement,\n onClick: () => void,\n toggle = false\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `uidex-trigger-btn uidex-trigger-btn--${modifier}`;\n btn.setAttribute('aria-label', ariaLabel);\n if (toggle) btn.setAttribute('aria-pressed', 'false');\n btn.title = title;\n btn.appendChild(icon);\n btn.addEventListener('click', () => {\n if (this.hasDragged) return;\n onClick();\n });\n return btn;\n }\n\n create(): HTMLDivElement {\n // Container\n this.container = document.createElement('div');\n this.container.className = 'uidex-container';\n\n // Button group\n this.group = document.createElement('div');\n this.group.className = 'uidex-trigger-group';\n\n this.inspectBtn = this.createButton('inspect', 'Toggle select mode', 'Select mode', createSelectSVG(), () => this.options.onInspectToggle?.(), true);\n this.copyBtn = this.createButton('copy', 'Toggle copy mode', 'Copy mode', createCopySVG(), () => this.options.onCopyToggle?.(), true);\n this.feedbackBtn = this.createButton('feedback', 'Toggle feedback mode', 'Feedback mode', createFeedbackSVG(), () => this.options.onFeedbackToggle?.(), true);\n this.expandBtn = this.createButton('expand', 'Open panel', 'Open panel', createListSVG(), () => this.options.onExpandClick?.());\n\n // Assemble: inspect | copy | feedback | expand\n const buttons = [this.inspectBtn, this.copyBtn, this.feedbackBtn, this.expandBtn];\n for (let i = 0; i < buttons.length; i++) {\n if (i > 0) {\n const divider = document.createElement('div');\n divider.className = 'uidex-trigger-divider';\n this.group.appendChild(divider);\n }\n this.group.appendChild(buttons[i]);\n }\n\n // Drag support on the group\n this.group.addEventListener('pointerdown', this.boundPointerDown);\n\n this.container.appendChild(this.group);\n\n return this.container;\n }\n\n destroy(): void {\n document.removeEventListener('pointermove', this.boundPointerMove);\n document.removeEventListener('pointerup', this.boundPointerUp);\n if (this.container && this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.container = null;\n this.group = null;\n this.expandBtn = null;\n this.inspectBtn = null;\n this.copyBtn = null;\n this.feedbackBtn = null;\n }\n\n // ——— Drag handling ———\n\n private handlePointerDown(e: PointerEvent): void {\n if (!this.container) return;\n\n this.hasDragged = false;\n this.isDragging = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n\n // Get current position from computed style\n const rect = this.container.getBoundingClientRect();\n this.dragStartLeft = rect.left;\n this.dragStartTop = rect.top;\n\n this.container.classList.add('uidex-container--dragging');\n\n document.addEventListener('pointermove', this.boundPointerMove);\n document.addEventListener('pointerup', this.boundPointerUp);\n }\n\n private handlePointerMove(e: PointerEvent): void {\n if (!this.isDragging || !this.container) return;\n\n const dx = e.clientX - this.dragStartX;\n const dy = e.clientY - this.dragStartY;\n\n // Only start visual drag after 4px threshold\n if (!this.hasDragged && Math.abs(dx) < 4 && Math.abs(dy) < 4) return;\n this.hasDragged = true;\n\n const newLeft = this.dragStartLeft + dx;\n const newTop = this.dragStartTop + dy;\n\n // Remove all position classes and use absolute positioning\n this.container.classList.remove(\n 'uidex-bottom-right',\n 'uidex-bottom-left',\n 'uidex-top-right',\n 'uidex-top-left'\n );\n\n this.container.style.left = `${newLeft}px`;\n this.container.style.top = `${newTop}px`;\n this.container.style.right = 'auto';\n this.container.style.bottom = 'auto';\n }\n\n private handlePointerUp(): void {\n if (!this.isDragging || !this.container) return;\n\n this.isDragging = false;\n this.container.classList.remove('uidex-container--dragging');\n\n document.removeEventListener('pointermove', this.boundPointerMove);\n document.removeEventListener('pointerup', this.boundPointerUp);\n\n if (!this.hasDragged) return;\n\n // Snap to nearest corner\n this.snapToCorner();\n }\n\n private snapToCorner(): void {\n if (!this.container) return;\n\n const rect = this.container.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const vpW = window.innerWidth;\n const vpH = window.innerHeight;\n\n const isRight = centerX > vpW / 2;\n const isBottom = centerY > vpH / 2;\n\n let corner: ButtonPosition;\n if (isBottom && isRight) corner = 'bottom-right';\n else if (isBottom && !isRight) corner = 'bottom-left';\n else if (!isBottom && isRight) corner = 'top-right';\n else corner = 'top-left';\n\n // Reset inline styles and apply corner class\n this.container.style.left = '';\n this.container.style.top = '';\n this.container.style.right = '';\n this.container.style.bottom = '';\n\n this.container.classList.add(POSITION_CLASSES[corner]);\n }\n}\n","export function classNames(\n ...classes: (string | undefined | null | false)[]\n): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport function getContrastColor(hexColor: string): string {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.5 ? '#000000' : '#ffffff';\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const hexValue = hex.replace('#', '');\n const r = parseInt(hexValue.substring(0, 2), 16);\n const g = parseInt(hexValue.substring(2, 4), 16);\n const b = parseInt(hexValue.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport function resolveColor(\n color: string | undefined,\n colorMap?: Record<string, string>\n): string | undefined {\n if (!color) return undefined;\n if (color.startsWith('#')) return color;\n return colorMap?.[color] ?? color;\n}\n","import type { OverlayOptions, LabelPosition } from './types';\nimport { classNames, getContrastColor, resolveColor } from './utils';\n\n// Default matches --uidex-color-primary in style.css\nconst DEFAULT_COLOR = '#e5e5e5';\nconst DEFAULT_BORDER_STYLE = 'solid';\nconst DEFAULT_BORDER_WIDTH = 2;\nconst DEFAULT_LABEL_POSITION: LabelPosition = 'top-left';\n\nconst LABEL_POSITION_CLASSES: Record<LabelPosition, string> = {\n 'top-left': 'uidex-label-top-left',\n 'top-right': 'uidex-label-top-right',\n 'bottom-left': 'uidex-label-bottom-left',\n 'bottom-right': 'uidex-label-bottom-right',\n};\n\nexport class Overlay {\n private element: HTMLDivElement | null = null;\n private labelElement: HTMLSpanElement | null = null;\n private target: HTMLElement | null = null;\n private options: OverlayOptions;\n private boundUpdatePosition: () => void;\n private rafId: number | null = null;\n\n constructor(options: OverlayOptions = {}) {\n this.options = options;\n this.boundUpdatePosition = () => {\n if (this.rafId !== null) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.updatePosition();\n });\n };\n }\n\n show(target: HTMLElement, label?: string): void {\n this.target = target;\n\n if (!this.element) {\n this.createElement();\n }\n\n if (label !== undefined) {\n this.options.label = label;\n }\n\n this.updateLabel();\n this.updatePosition();\n this.addListeners();\n\n if (this.element && !this.element.parentNode) {\n document.body.appendChild(this.element);\n }\n }\n\n hide(): void {\n this.removeListeners();\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.target = null;\n }\n\n destroy(): void {\n this.hide();\n this.element = null;\n this.labelElement = null;\n }\n\n updateOptions(options: Partial<OverlayOptions>): void {\n this.options = { ...this.options, ...options };\n this.updateStyles();\n this.updateLabel();\n }\n\n private createElement(): void {\n this.element = document.createElement('div');\n this.element.className = 'uidex-overlay';\n this.element.setAttribute('data-testid', 'annotation-overlay');\n\n // Critical positioning styles are set inline because the overlay\n // lives in document.body, outside the Shadow DOM where the CSS is.\n this.element.style.position = 'fixed';\n this.element.style.pointerEvents = 'none';\n this.element.style.zIndex = '2147483645';\n\n this.labelElement = document.createElement('span');\n this.element.appendChild(this.labelElement);\n\n this.updateStyles();\n }\n\n private updateStyles(): void {\n if (!this.element) return;\n\n const {\n color,\n borderStyle = DEFAULT_BORDER_STYLE,\n borderWidth = DEFAULT_BORDER_WIDTH,\n colors,\n } = this.options;\n\n const resolvedColor = resolveColor(color, colors) ?? DEFAULT_COLOR;\n\n this.element.style.borderColor = resolvedColor;\n this.element.style.borderWidth = `${borderWidth}px`;\n this.element.style.borderStyle = borderStyle;\n }\n\n private updateLabel(): void {\n if (!this.labelElement) return;\n\n const {\n label,\n showLabel = true,\n labelPosition = DEFAULT_LABEL_POSITION,\n color,\n colors,\n } = this.options;\n\n if (!showLabel || !label) {\n this.labelElement.style.display = 'none';\n return;\n }\n\n const resolvedColor = resolveColor(color, colors) ?? DEFAULT_COLOR;\n\n this.labelElement.style.display = '';\n this.labelElement.className = classNames(\n 'uidex-label',\n LABEL_POSITION_CLASSES[labelPosition]\n );\n\n // Inline styles required because the overlay lives outside the Shadow DOM\n this.labelElement.style.position = 'absolute';\n this.labelElement.style.fontFamily =\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace';\n this.labelElement.style.fontSize = '11px';\n this.labelElement.style.fontWeight = '500';\n this.labelElement.style.padding = '2px 6px';\n this.labelElement.style.borderRadius = '4px';\n this.labelElement.style.whiteSpace = 'nowrap';\n this.labelElement.style.backgroundColor = resolvedColor;\n this.labelElement.style.color = getContrastColor(resolvedColor);\n this.labelElement.textContent = label;\n\n // Position the label relative to the overlay\n this.applyLabelPosition(labelPosition);\n }\n\n private applyLabelPosition(position: LabelPosition): void {\n if (!this.labelElement) return;\n\n // Reset all positioning\n this.labelElement.style.top = '';\n this.labelElement.style.bottom = '';\n this.labelElement.style.left = '';\n this.labelElement.style.right = '';\n this.labelElement.style.transform = '';\n\n switch (position) {\n case 'top-left':\n this.labelElement.style.top = '-8px';\n this.labelElement.style.left = '-2px';\n this.labelElement.style.transform = 'translateY(-100%)';\n break;\n case 'top-right':\n this.labelElement.style.top = '-8px';\n this.labelElement.style.right = '-2px';\n this.labelElement.style.transform = 'translateY(-100%)';\n break;\n case 'bottom-left':\n this.labelElement.style.bottom = '-8px';\n this.labelElement.style.left = '-2px';\n this.labelElement.style.transform = 'translateY(100%)';\n break;\n case 'bottom-right':\n this.labelElement.style.bottom = '-8px';\n this.labelElement.style.right = '-2px';\n this.labelElement.style.transform = 'translateY(100%)';\n break;\n }\n }\n\n private updatePosition(): void {\n if (!this.element || !this.target) return;\n\n const rect = this.target.getBoundingClientRect();\n\n // position: fixed is viewport-relative, matching getBoundingClientRect()\n this.element.style.top = `${rect.top}px`;\n this.element.style.left = `${rect.left}px`;\n this.element.style.width = `${rect.width}px`;\n this.element.style.height = `${rect.height}px`;\n }\n\n private addListeners(): void {\n window.addEventListener('resize', this.boundUpdatePosition);\n window.addEventListener('scroll', this.boundUpdatePosition, { capture: true, passive: true });\n }\n\n private removeListeners(): void {\n window.removeEventListener('resize', this.boundUpdatePosition);\n window.removeEventListener('scroll', this.boundUpdatePosition, { capture: true } as EventListenerOptions);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n}\n","import type { KeyboardShortcut } from './types';\n\nconst DEFAULT_SHORTCUT: KeyboardShortcut = {\n key: 'u',\n shiftKey: true,\n metaKey: true,\n};\n\nconst INSPECTING_CLASS = 'uidex-inspecting';\nconst INSPECTING_STYLE_ID = 'uidex-inspecting-style';\nconst INSPECTING_CSS = `body.${INSPECTING_CLASS},body.${INSPECTING_CLASS} *{cursor:crosshair!important}`;\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return (\n target.isContentEditable ||\n target.getAttribute('contenteditable') === 'true' ||\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT'\n );\n}\n\nfunction matchesShortcut(e: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n return (\n e.key.toLowerCase() === shortcut.key.toLowerCase() &&\n !!e.ctrlKey === !!shortcut.ctrlKey &&\n !!e.shiftKey === !!shortcut.shiftKey &&\n !!e.altKey === !!shortcut.altKey &&\n !!e.metaKey === !!shortcut.metaKey\n );\n}\n\nfunction findAnnotatedAncestor(\n target: EventTarget\n): { element: HTMLElement; id: string } | null {\n if (!(target instanceof Element)) return null;\n if (target.closest('.uidex-container')) return null;\n const annotated = target.closest('[data-uidex]');\n if (!(annotated instanceof HTMLElement)) return null;\n const id = annotated.getAttribute('data-uidex');\n if (!id) return null;\n return { element: annotated, id };\n}\n\nexport interface InspectorOptions {\n shortcut?: KeyboardShortcut;\n onHighlight?: (element: HTMLElement | null, id: string | null) => void;\n onSelect?: (element: HTMLElement, id: string) => void;\n onActivate?: () => void;\n onDeactivate?: () => void;\n}\n\nexport class Inspector {\n private active = false;\n private shortcut: KeyboardShortcut;\n private currentTarget: HTMLElement | null = null;\n\n private onHighlight: InspectorOptions['onHighlight'];\n private onSelect: InspectorOptions['onSelect'];\n private onActivate: InspectorOptions['onActivate'];\n private onDeactivate: InspectorOptions['onDeactivate'];\n\n private boundKeyDown: (e: KeyboardEvent) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundClick: (e: MouseEvent) => void;\n\n constructor(options: InspectorOptions = {}) {\n this.shortcut = options.shortcut ?? DEFAULT_SHORTCUT;\n this.onHighlight = options.onHighlight;\n this.onSelect = options.onSelect;\n this.onActivate = options.onActivate;\n this.onDeactivate = options.onDeactivate;\n\n this.boundKeyDown = this.handleKeyDown.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundClick = this.handleClick.bind(this);\n }\n\n mount(): void {\n document.addEventListener('keydown', this.boundKeyDown);\n\n // Inject inspect-mode cursor style into the document (not shadow DOM)\n if (!document.getElementById(INSPECTING_STYLE_ID)) {\n const style = document.createElement('style');\n style.id = INSPECTING_STYLE_ID;\n style.textContent = INSPECTING_CSS;\n document.head.appendChild(style);\n }\n }\n\n destroy(): void {\n if (this.active) {\n this.deactivate();\n }\n document.removeEventListener('keydown', this.boundKeyDown);\n document.getElementById(INSPECTING_STYLE_ID)?.remove();\n }\n\n activate(): void {\n if (this.active) return;\n this.active = true;\n this.currentTarget = null;\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('click', this.boundClick, true);\n document.body.classList.add(INSPECTING_CLASS);\n\n this.onActivate?.();\n }\n\n deactivate(): void {\n if (!this.active) return;\n this.active = false;\n this.currentTarget = null;\n\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('click', this.boundClick, true);\n document.body.classList.remove(INSPECTING_CLASS);\n\n this.onHighlight?.(null, null);\n this.onDeactivate?.();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n private handleKeyDown(e: KeyboardEvent): void {\n if (this.active && e.key === 'Escape') {\n e.preventDefault();\n this.deactivate();\n return;\n }\n\n if (isEditableTarget(e.target)) return;\n\n if (matchesShortcut(e, this.shortcut)) {\n e.preventDefault();\n if (this.active) {\n this.deactivate();\n } else {\n this.activate();\n }\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const result = findAnnotatedAncestor(e.target!);\n\n if (result) {\n if (result.element !== this.currentTarget) {\n this.currentTarget = result.element;\n this.onHighlight?.(result.element, result.id);\n }\n } else if (this.currentTarget) {\n this.currentTarget = null;\n this.onHighlight?.(null, null);\n }\n }\n\n private handleClick(e: MouseEvent): void {\n if (!(e.target instanceof Element)) return;\n\n // Don't intercept clicks on uidex's own UI\n if (e.target.closest('.uidex-container')) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const result = findAnnotatedAncestor(e.target);\n if (result) {\n this.onSelect?.(result.element, result.id);\n }\n\n this.deactivate();\n }\n}\n","import type { UidexLocation, UidexMap, FeedbackReport, FeedbackType, FeedbackSeverity } from './types';\n\nexport type ModalView =\n | { type: 'page'; dir: string }\n | { type: 'feature'; dir: string }\n | { type: 'component'; id: string }\n | { type: 'graph' };\n\nexport interface ModalPage {\n title: string;\n dir: string;\n content: string;\n componentIds: string[];\n}\n\nexport interface ModalFeature {\n title: string;\n dir: string;\n content: string;\n componentIds: string[];\n}\n\nexport interface ModalData {\n pages: ModalPage[];\n features: ModalFeature[];\n components: UidexMap;\n presentIds: Set<string>;\n}\n\nexport interface ModalOptions {\n onComponentNavigate?: (id: string) => void;\n elementGetter?: (id: string) => Element | null;\n}\n\nexport class Modal {\n private backdrop: HTMLDivElement | null = null;\n private sidebar: HTMLDivElement | null = null;\n private mainContent: HTMLDivElement | null = null;\n private renderTarget: ShadowRoot | HTMLElement = document.body;\n private boundKeyDown: (e: KeyboardEvent) => void;\n\n private data: ModalData = {\n pages: [],\n features: [],\n components: {},\n presentIds: new Set(),\n };\n\n private currentView: ModalView | null = null;\n private modalType: 'panel' | 'feedback' | null = null;\n private sidebarLevel: 'root' | 'pages' | 'features' | 'components' = 'root';\n private expandedGroups: Set<string> = new Set();\n private searchQuery = '';\n private searchInput: HTMLInputElement | null = null;\n private options: ModalOptions;\n\n private static readonly VIEW_TYPE_TO_LEVEL = {\n page: 'pages',\n feature: 'features',\n component: 'components',\n graph: 'root',\n } as const;\n\n /** Strip the scanner root dir (e.g. \"app\") so pages display as routes: app → /, app/foo → /foo */\n private static formatPageDir(dir: string): string {\n const parts = dir.split('/');\n // Remove the first segment (scanner root like \"app\" or \"src\")\n const route = parts.slice(1).join('/');\n return '/' + route;\n }\n\n constructor(options: ModalOptions = {}) {\n this.options = options;\n this.boundKeyDown = this.handleKeyDown.bind(this);\n }\n\n /** Set the shadow root to render modals into. */\n setShadowRoot(root: ShadowRoot): void {\n this.renderTarget = root;\n }\n\n /** Update the data model. Refreshes sidebar and content if modal is open. */\n setData(data: ModalData): void {\n this.data = data;\n if (this.backdrop) {\n this.renderSidebar();\n if (this.currentView) {\n this.renderMainContent(this.currentView);\n }\n }\n }\n\n /** Open the modal. If already open, navigates to the given view. */\n open(view?: ModalView): void {\n if (this.backdrop && this.modalType === 'panel') {\n if (view) this.navigateTo(view);\n return;\n }\n\n this.createShell();\n\n const targetView = view ?? this.getDefaultView();\n if (targetView) {\n this.navigateTo(targetView);\n }\n }\n\n /** Navigate to a view within the open modal. */\n navigateTo(view: ModalView): void {\n this.currentView = view;\n\n // Clear search on navigation\n if (this.searchQuery) {\n this.searchQuery = '';\n if (this.searchInput) this.searchInput.value = '';\n }\n\n // Sync sidebar level to match the view type\n const newLevel = Modal.VIEW_TYPE_TO_LEVEL[view.type];\n const levelChanged = this.sidebarLevel !== newLevel;\n if (levelChanged) {\n this.sidebarLevel = newLevel;\n }\n\n // Auto-expand the group containing this component\n if (view.type === 'component') {\n this.expandedGroups.add(this.getComponentPrefix(view.id));\n }\n\n // Single sidebar render/update\n if (levelChanged || view.type === 'component') {\n this.renderSidebar();\n } else {\n this.updateSidebarActive();\n }\n\n this.renderMainContent(view);\n\n if (view.type === 'component') {\n this.options.onComponentNavigate?.(view.id);\n }\n }\n\n hide(): void {\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n this.backdrop = null;\n this.sidebar = null;\n this.mainContent = null;\n this.currentView = null;\n this.modalType = null;\n this.sidebarLevel = 'root';\n this.expandedGroups = new Set();\n this.searchQuery = '';\n this.searchInput = null;\n document.removeEventListener('keydown', this.boundKeyDown);\n }\n\n destroy(): void {\n this.hide();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n // ——— Default view selection ———\n\n private getDefaultView(): ModalView | null {\n // First visible page (has components on current page)\n const visiblePage = this.data.pages.find((p) =>\n p.componentIds.some((id) => this.data.presentIds.has(id))\n );\n if (visiblePage) return { type: 'page', dir: visiblePage.dir };\n\n if (this.data.pages.length > 0)\n return { type: 'page', dir: this.data.pages[0].dir };\n\n if (this.data.features.length > 0)\n return { type: 'feature', dir: this.data.features[0].dir };\n\n const firstPresent = [...this.data.presentIds][0];\n if (firstPresent) return { type: 'component', id: firstPresent };\n\n const firstId = Object.keys(this.data.components)[0];\n if (firstId) return { type: 'component', id: firstId };\n\n return null;\n }\n\n // ——— Shell creation ———\n\n /**\n * Create the shared modal frame: backdrop, dialog, header (title + close), and mount.\n * Returns the dialog and header elements so callers can append extra header/body content.\n */\n private createModalFrame(opts: {\n type: 'panel' | 'feedback';\n title: string;\n ariaLabel: string;\n }): { dialog: HTMLDivElement; header: HTMLDivElement } {\n this.hide();\n this.modalType = opts.type;\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'uidex-modal-backdrop';\n this.backdrop.addEventListener('click', (e) => {\n if (e.target === this.backdrop) this.hide();\n });\n\n const dialog = document.createElement('div');\n dialog.className = `uidex-modal uidex-modal--${opts.type}`;\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-label', opts.ariaLabel);\n\n const header = document.createElement('div');\n header.className = 'uidex-modal-header';\n\n const title = document.createElement('h2');\n title.className = 'uidex-modal-title';\n title.textContent = opts.title;\n header.appendChild(title);\n\n return { dialog, header };\n }\n\n /** Finalize modal frame: append close button to header, header to dialog, mount to DOM. */\n private mountModalFrame(\n dialog: HTMLDivElement,\n header: HTMLDivElement\n ): void {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'uidex-modal-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.textContent = '\\u00d7';\n closeBtn.addEventListener('click', () => this.hide());\n header.appendChild(closeBtn);\n\n dialog.appendChild(header);\n this.backdrop!.appendChild(dialog);\n this.renderTarget.appendChild(this.backdrop!);\n document.addEventListener('keydown', this.boundKeyDown);\n }\n\n private createShell(): void {\n const { dialog, header } = this.createModalFrame({\n type: 'panel',\n title: 'uidex',\n ariaLabel: 'uidex',\n });\n\n this.searchInput = document.createElement('input');\n this.searchInput.type = 'text';\n this.searchInput.className = 'uidex-search-input';\n this.searchInput.placeholder = 'Search\\u2026';\n this.searchInput.addEventListener('input', () => {\n this.searchQuery = this.searchInput!.value;\n this.renderSidebar();\n });\n this.searchInput.addEventListener('keydown', (e) => {\n if (e.key !== 'Escape' || this.searchQuery) {\n e.stopPropagation();\n }\n\n if (e.key === 'Enter') {\n const results = this.getSearchResults();\n if (results.pages.length > 0) {\n this.navigateTo({ type: 'page', dir: results.pages[0].dir });\n } else if (results.features.length > 0) {\n this.navigateTo({ type: 'feature', dir: results.features[0].dir });\n } else if (results.components.length > 0) {\n this.navigateTo({ type: 'component', id: results.components[0] });\n }\n e.preventDefault();\n }\n if (e.key === 'Escape' && this.searchQuery) {\n this.searchQuery = '';\n this.searchInput!.value = '';\n this.renderSidebar();\n }\n });\n header.appendChild(this.searchInput);\n\n this.mountModalFrame(dialog, header);\n\n // Body: sidebar + main content\n const body = document.createElement('div');\n body.className = 'uidex-panel-body';\n\n this.sidebar = document.createElement('div');\n this.sidebar.className = 'uidex-panel-sidebar';\n this.renderSidebar();\n\n this.mainContent = document.createElement('div');\n this.mainContent.className = 'uidex-panel-main';\n\n body.appendChild(this.sidebar);\n body.appendChild(this.mainContent);\n\n dialog.appendChild(body);\n }\n\n // ——— Sidebar ———\n\n private renderSidebar(): void {\n if (!this.sidebar) return;\n this.sidebar.innerHTML = '';\n\n if (this.searchQuery) {\n this.renderSearchResults();\n } else if (this.sidebarLevel === 'root') {\n this.renderSidebarRoot();\n } else {\n this.renderSidebarSublevel(this.sidebarLevel);\n }\n\n this.updateSidebarActive();\n }\n\n private renderSidebarRoot(): void {\n if (!this.sidebar) return;\n\n const categories: { label: string; level: 'pages' | 'features' | 'components'; count: number }[] = [];\n\n if (this.data.pages.length > 0) {\n categories.push({ label: 'Pages', level: 'pages', count: this.data.pages.length });\n }\n if (this.data.features.length > 0) {\n categories.push({ label: 'Features', level: 'features', count: this.data.features.length });\n }\n const componentCount = Object.keys(this.data.components).length;\n if (componentCount > 0) {\n categories.push({ label: 'Components', level: 'components', count: componentCount });\n }\n\n for (const cat of categories) {\n const item = document.createElement('div');\n item.className = `uidex-sidebar-root-item uidex-sidebar-root-item--${cat.level}`;\n item.addEventListener('click', () => {\n this.sidebarLevel = cat.level;\n this.renderSidebar();\n // Select first item in this category if no current view matches\n if (!this.currentView || !this.currentViewMatchesLevel(cat.level)) {\n const firstView = this.getFirstViewForLevel(cat.level);\n if (firstView) this.navigateTo(firstView);\n }\n });\n\n const label = document.createElement('span');\n label.className = 'uidex-sidebar-root-label';\n label.textContent = cat.label;\n item.appendChild(label);\n\n const count = document.createElement('span');\n count.className = 'uidex-sidebar-count';\n count.textContent = `(${cat.count})`;\n item.appendChild(count);\n\n const chevron = document.createElement('span');\n chevron.className = 'uidex-sidebar-chevron';\n chevron.textContent = '\\u203A';\n item.appendChild(chevron);\n\n this.sidebar.appendChild(item);\n }\n\n // Map item (only if relationships exist)\n const hasRelationships = this.data.pages.length > 0 || this.data.features.length > 0;\n if (hasRelationships) {\n const divider = document.createElement('div');\n divider.className = 'uidex-sidebar-divider';\n this.sidebar.appendChild(divider);\n\n const mapItem = document.createElement('div');\n mapItem.className = 'uidex-sidebar-root-item';\n mapItem.dataset.viewType = 'graph';\n mapItem.addEventListener('click', () => this.navigateTo({ type: 'graph' }));\n\n const mapLabel = document.createElement('span');\n mapLabel.className = 'uidex-sidebar-root-label';\n mapLabel.textContent = 'Map';\n mapItem.appendChild(mapLabel);\n\n const mapChevron = document.createElement('span');\n mapChevron.className = 'uidex-sidebar-chevron';\n mapChevron.textContent = '\\u203A';\n mapItem.appendChild(mapChevron);\n\n this.sidebar.appendChild(mapItem);\n }\n }\n\n private renderSidebarSublevel(level: 'pages' | 'features' | 'components'): void {\n if (!this.sidebar) return;\n\n const labelMap = { pages: 'Pages', features: 'Features', components: 'Components' } as const;\n\n // Back button\n const back = document.createElement('div');\n back.className = 'uidex-sidebar-back';\n back.addEventListener('click', () => {\n this.sidebarLevel = 'root';\n this.renderSidebar();\n });\n\n const arrow = document.createElement('span');\n arrow.className = 'uidex-sidebar-back-arrow';\n arrow.textContent = '\\u2039';\n back.appendChild(arrow);\n\n const backLabel = document.createElement('span');\n backLabel.textContent = labelMap[level];\n back.appendChild(backLabel);\n\n this.sidebar.appendChild(back);\n\n // Items\n if (level === 'pages') {\n for (const page of this.data.pages) {\n const hasVisible = page.componentIds.some((id) => this.data.presentIds.has(id));\n const item = this.createSidebarItem(Modal.formatPageDir(page.dir), !hasVisible);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--pages');\n item.dataset.viewType = 'page';\n item.dataset.viewId = page.dir;\n item.addEventListener('click', () => this.navigateTo({ type: 'page', dir: page.dir }));\n this.sidebar.appendChild(item);\n }\n } else if (level === 'features') {\n for (const feature of this.data.features) {\n const hasVisible = feature.componentIds.some((id) => this.data.presentIds.has(id));\n const item = this.createSidebarItem(feature.title, !hasVisible);\n item.classList.add('uidex-sidebar-item--features');\n item.dataset.viewType = 'feature';\n item.dataset.viewId = feature.dir;\n item.addEventListener('click', () => this.navigateTo({ type: 'feature', dir: feature.dir }));\n this.sidebar.appendChild(item);\n }\n } else {\n const groups = this.groupComponentsByPrefix(Object.keys(this.data.components));\n\n // Auto-expand if there's only one group\n if (groups.size === 1) {\n const onlyKey = groups.keys().next().value!;\n this.expandedGroups.add(onlyKey);\n }\n\n for (const [prefix, ids] of groups) {\n const isExpanded = this.expandedGroups.has(prefix);\n\n // Group header\n const header = document.createElement('div');\n header.className = 'uidex-sidebar-group-header';\n if (isExpanded) header.classList.add('uidex-sidebar-group-header--expanded');\n header.addEventListener('click', () => {\n if (this.expandedGroups.has(prefix)) {\n this.expandedGroups.delete(prefix);\n } else {\n this.expandedGroups.add(prefix);\n }\n this.renderSidebar();\n });\n\n const chevron = document.createElement('span');\n chevron.className = 'uidex-sidebar-group-chevron';\n chevron.textContent = '\\u203A';\n header.appendChild(chevron);\n\n const label = document.createElement('span');\n label.className = 'uidex-sidebar-group-label';\n label.textContent = prefix;\n header.appendChild(label);\n\n const count = document.createElement('span');\n count.className = 'uidex-sidebar-group-count';\n count.textContent = `${ids.length}`;\n header.appendChild(count);\n\n this.sidebar.appendChild(header);\n\n // Expanded items\n if (isExpanded) {\n for (const id of ids) {\n const isPresent = this.data.presentIds.has(id);\n const item = this.createSidebarItem(id, !isPresent);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--grouped', 'uidex-sidebar-item--components');\n item.dataset.viewType = 'component';\n item.dataset.viewId = id;\n item.addEventListener('click', () => this.navigateTo({ type: 'component', id }));\n this.sidebar.appendChild(item);\n }\n }\n }\n }\n }\n\n private currentViewMatchesLevel(level: 'pages' | 'features' | 'components'): boolean {\n if (!this.currentView) return false;\n return Modal.VIEW_TYPE_TO_LEVEL[this.currentView.type] === level;\n }\n\n private getFirstViewForLevel(level: 'pages' | 'features' | 'components'): ModalView | null {\n if (level === 'pages' && this.data.pages.length > 0) {\n return { type: 'page', dir: this.data.pages[0].dir };\n }\n if (level === 'features' && this.data.features.length > 0) {\n return { type: 'feature', dir: this.data.features[0].dir };\n }\n if (level === 'components') {\n const firstId = Object.keys(this.data.components)[0];\n if (firstId) return { type: 'component', id: firstId };\n }\n return null;\n }\n\n private getComponentPrefix(id: string): string {\n const dashIndex = id.indexOf('-');\n return dashIndex === -1 ? id : id.substring(0, dashIndex);\n }\n\n private groupComponentsByPrefix(ids: string[]): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const id of ids) {\n const prefix = this.getComponentPrefix(id);\n let group = groups.get(prefix);\n if (!group) {\n group = [];\n groups.set(prefix, group);\n }\n group.push(id);\n }\n return groups;\n }\n\n private createSidebarItem(text: string, dimmed: boolean): HTMLDivElement {\n const item = document.createElement('div');\n item.className = 'uidex-sidebar-item';\n if (dimmed) item.classList.add('uidex-sidebar-item--dimmed');\n item.textContent = text;\n return item;\n }\n\n private updateSidebarActive(): void {\n if (!this.sidebar || !this.currentView) return;\n\n // Map item active state\n const mapItem = this.sidebar.querySelector('[data-view-type=\"graph\"]');\n if (mapItem) {\n (mapItem as HTMLElement).classList.toggle(\n 'uidex-sidebar-root-item--active',\n this.currentView.type === 'graph'\n );\n }\n\n if (this.currentView.type === 'graph') return;\n\n const activeId =\n this.currentView.type === 'component'\n ? this.currentView.id\n : this.currentView.dir;\n\n for (const el of this.sidebar.querySelectorAll('.uidex-sidebar-item')) {\n const item = el as HTMLElement;\n const matches =\n item.dataset.viewType === this.currentView.type &&\n item.dataset.viewId === activeId;\n item.classList.toggle('uidex-sidebar-item--active', matches);\n }\n }\n\n // ——— Search ———\n\n private getSearchResults(): {\n pages: ModalPage[];\n features: ModalFeature[];\n components: string[];\n } {\n const q = this.searchQuery.toLowerCase();\n return {\n pages: this.data.pages.filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n Modal.formatPageDir(p.dir).toLowerCase().includes(q)\n ),\n features: this.data.features.filter(\n (f) =>\n f.title.toLowerCase().includes(q) || f.dir.toLowerCase().includes(q)\n ),\n components: Object.keys(this.data.components).filter((id) => {\n if (id.toLowerCase().includes(q)) return true;\n const doc = this.data.components[id]?.find((l) => l.doc)?.doc;\n return doc ? doc.toLowerCase().includes(q) : false;\n }),\n };\n }\n\n private renderSearchResults(): void {\n if (!this.sidebar) return;\n\n const results = this.getSearchResults();\n const hasResults =\n results.pages.length > 0 ||\n results.features.length > 0 ||\n results.components.length > 0;\n\n if (!hasResults) {\n const empty = document.createElement('div');\n empty.className = 'uidex-search-empty';\n empty.textContent = 'No results';\n this.sidebar.appendChild(empty);\n return;\n }\n\n if (results.pages.length > 0) {\n const label = document.createElement('div');\n label.className = 'uidex-search-group-label uidex-search-group-label--pages';\n label.textContent = 'Pages';\n this.sidebar.appendChild(label);\n\n for (const page of results.pages) {\n const item = this.createSidebarItem(Modal.formatPageDir(page.dir), false);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--pages');\n item.addEventListener('click', () =>\n this.navigateTo({ type: 'page', dir: page.dir })\n );\n this.sidebar.appendChild(item);\n }\n }\n\n if (results.features.length > 0) {\n const label = document.createElement('div');\n label.className = 'uidex-search-group-label uidex-search-group-label--features';\n label.textContent = 'Features';\n this.sidebar.appendChild(label);\n\n for (const feature of results.features) {\n const item = this.createSidebarItem(feature.title, false);\n item.classList.add('uidex-sidebar-item--features');\n item.addEventListener('click', () =>\n this.navigateTo({ type: 'feature', dir: feature.dir })\n );\n this.sidebar.appendChild(item);\n }\n }\n\n if (results.components.length > 0) {\n const label = document.createElement('div');\n label.className = 'uidex-search-group-label uidex-search-group-label--components';\n label.textContent = 'Components';\n this.sidebar.appendChild(label);\n\n for (const id of results.components) {\n const item = this.createSidebarItem(id, false);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--components');\n item.addEventListener('click', () =>\n this.navigateTo({ type: 'component', id })\n );\n this.sidebar.appendChild(item);\n }\n }\n }\n\n // ——— Main content rendering ———\n\n private renderMainContent(view: ModalView): void {\n if (!this.mainContent) return;\n this.mainContent.innerHTML = '';\n this.mainContent.scrollTop = 0;\n\n switch (view.type) {\n case 'page':\n this.renderPageView(view.dir);\n break;\n case 'feature':\n this.renderFeatureView(view.dir);\n break;\n case 'component':\n this.renderComponentView(view.id);\n break;\n case 'graph':\n this.renderGraphView();\n break;\n }\n }\n\n private renderPageView(dir: string): void {\n const page = this.data.pages.find((p) => p.dir === dir);\n if (!page || !this.mainContent) return;\n\n const title = document.createElement('h3');\n title.className = 'uidex-main-title';\n title.textContent = page.title;\n this.mainContent.appendChild(title);\n\n const dirCode = document.createElement('code');\n dirCode.className = 'uidex-modal-code';\n dirCode.textContent = Modal.formatPageDir(page.dir);\n this.mainContent.appendChild(dirCode);\n\n if (page.content.trim()) {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section uidex-modal-section--spaced';\n section.appendChild(this.renderMarkdown(page.content));\n this.mainContent.appendChild(section);\n }\n\n // Related features\n const pageComponentSet = new Set(page.componentIds);\n const relatedFeatures = this.data.features.filter((f) =>\n f.componentIds.some((cid) => pageComponentSet.has(cid))\n );\n if (relatedFeatures.length > 0) {\n this.mainContent.appendChild(\n this.createFeatureChipsSection(relatedFeatures)\n );\n }\n\n if (page.componentIds.length > 0) {\n this.mainContent.appendChild(\n this.createComponentChipsSection(page.componentIds, (id) =>\n this.navigateTo({ type: 'component', id })\n )\n );\n }\n }\n\n private renderFeatureView(dir: string): void {\n const feature = this.data.features.find((f) => f.dir === dir);\n if (!feature || !this.mainContent) return;\n\n const badge = document.createElement('div');\n badge.className = 'uidex-badge uidex-badge--features';\n badge.textContent = 'Feature';\n this.mainContent.appendChild(badge);\n\n const title = document.createElement('h3');\n title.className = 'uidex-main-title';\n title.textContent = feature.title;\n this.mainContent.appendChild(title);\n\n const dirCode = document.createElement('code');\n dirCode.className = 'uidex-modal-code';\n dirCode.textContent = feature.dir;\n this.mainContent.appendChild(dirCode);\n\n if (feature.content.trim()) {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section uidex-modal-section--spaced';\n section.appendChild(this.renderMarkdown(feature.content));\n this.mainContent.appendChild(section);\n }\n\n if (feature.componentIds.length > 0) {\n const absentIds = new Set(\n feature.componentIds.filter((id) => !this.data.presentIds.has(id))\n );\n this.mainContent.appendChild(\n this.createComponentChipsSection(\n feature.componentIds,\n (id) => this.navigateTo({ type: 'component', id }),\n absentIds\n )\n );\n }\n }\n\n private renderComponentView(id: string): void {\n if (!this.mainContent) return;\n\n const locations = this.data.components[id] ?? [];\n const element = this.options.elementGetter?.(id) ?? null;\n\n // Component name\n const title = document.createElement('h3');\n title.className = 'uidex-main-title uidex-main-title--mono';\n title.textContent = id;\n this.mainContent.appendChild(title);\n\n // Absent indicator\n if (!this.data.presentIds.has(id)) {\n const notice = document.createElement('div');\n notice.className = 'uidex-absent-notice';\n notice.textContent = 'Not on current page';\n this.mainContent.appendChild(notice);\n }\n\n // Feature membership\n const parentFeatures = this.data.features.filter((f) =>\n f.componentIds.includes(id)\n );\n if (parentFeatures.length > 0) {\n this.mainContent.appendChild(\n this.createFeatureChipsSection(parentFeatures)\n );\n }\n\n // Doc/description\n const doc = locations.find((l) => l.doc)?.doc;\n if (doc) {\n const docSection = document.createElement('div');\n docSection.className = 'uidex-modal-section';\n const docLabel = document.createElement('div');\n docLabel.className = 'uidex-modal-label';\n docLabel.textContent = 'Description';\n const docText = document.createElement('p');\n docText.className = 'uidex-modal-doc';\n docText.textContent = doc;\n docSection.appendChild(docLabel);\n docSection.appendChild(docText);\n this.mainContent.appendChild(docSection);\n }\n\n // Element info\n if (element) {\n const elSection = document.createElement('div');\n elSection.className = 'uidex-modal-section';\n const elLabel = document.createElement('div');\n elLabel.className = 'uidex-modal-label';\n elLabel.textContent = 'Element';\n const elCode = document.createElement('code');\n elCode.className = 'uidex-modal-code';\n elCode.textContent = this.describeElement(element);\n elSection.appendChild(elLabel);\n elSection.appendChild(elCode);\n this.mainContent.appendChild(elSection);\n }\n\n // Source file locations\n if (locations.length > 0) {\n const locSection = document.createElement('div');\n locSection.className = 'uidex-modal-section';\n const locLabel = document.createElement('div');\n locLabel.className = 'uidex-modal-label';\n locLabel.textContent = locations.length === 1 ? 'Source' : 'Sources';\n locSection.appendChild(locLabel);\n\n for (const loc of locations) {\n const row = document.createElement('div');\n row.className = 'uidex-modal-location';\n\n const pathText = document.createElement('code');\n pathText.className = 'uidex-modal-code';\n pathText.textContent = `${loc.filePath}:${loc.line}`;\n\n const copyBtn = document.createElement('button');\n copyBtn.className = 'uidex-modal-copy';\n copyBtn.textContent = 'Copy';\n copyBtn.addEventListener('click', () => {\n navigator.clipboard\n .writeText(`${loc.filePath}:${loc.line}`)\n .then(() => {\n copyBtn.textContent = 'Copied!';\n setTimeout(() => {\n copyBtn.textContent = 'Copy';\n }, 1500);\n })\n .catch(() => {});\n });\n\n row.appendChild(pathText);\n row.appendChild(copyBtn);\n locSection.appendChild(row);\n }\n\n this.mainContent.appendChild(locSection);\n }\n\n // Environment info\n const env = this.collectEnv();\n const envSection = document.createElement('div');\n envSection.className = 'uidex-modal-section';\n const envLabel = document.createElement('div');\n envLabel.className = 'uidex-modal-label';\n envLabel.textContent = 'Environment';\n envSection.appendChild(envLabel);\n\n const envItems = [\n `${env.viewport.width} \\u00d7 ${env.viewport.height} viewport`,\n env.browserName,\n window.location.hostname + window.location.pathname,\n ];\n for (const item of envItems) {\n const envLine = document.createElement('div');\n envLine.className = 'uidex-modal-env-item';\n envLine.textContent = item;\n envSection.appendChild(envLine);\n }\n this.mainContent.appendChild(envSection);\n }\n\n // ——— Graph view ———\n\n private renderGraphView(): void {\n if (!this.mainContent) return;\n\n const pages = this.data.pages;\n const features = this.data.features;\n const allComponentIds = Object.keys(this.data.components);\n\n // Determine which components are connected to pages/features\n const connectedIds = new Set<string>();\n for (const p of pages) {\n for (const cid of p.componentIds) {\n if (this.data.components[cid]) connectedIds.add(cid);\n }\n }\n for (const f of features) {\n for (const cid of f.componentIds) {\n if (this.data.components[cid]) connectedIds.add(cid);\n }\n }\n\n const shownComponentIds = allComponentIds.filter((id) => connectedIds.has(id));\n const unconnectedCount = allComponentIds.length - shownComponentIds.length;\n\n if (shownComponentIds.length === 0 && pages.length === 0 && features.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'uidex-empty-message';\n empty.textContent = 'No relationships to display';\n this.mainContent.appendChild(empty);\n return;\n }\n\n // Layout constants\n const SVG_W = 440;\n const NODE_W = 110;\n const NODE_H = 24;\n const NODE_GAP = 6;\n const COL_HEADER_Y = 14;\n const START_Y = 28;\n\n // Determine columns\n type Col = { type: 'pages' | 'features' | 'components'; x: number };\n const columns: Col[] = [];\n if (pages.length > 0) columns.push({ type: 'pages', x: 0 });\n if (features.length > 0) columns.push({ type: 'features', x: 0 });\n if (shownComponentIds.length > 0) columns.push({ type: 'components', x: 0 });\n\n const colSpacing = SVG_W / columns.length;\n for (let i = 0; i < columns.length; i++) {\n columns[i].x = colSpacing * i + colSpacing / 2;\n }\n\n const colX: Record<string, number> = {};\n for (const c of columns) colX[c.type] = c.x;\n\n // Build nodes\n interface GNode {\n type: 'page' | 'feature' | 'component';\n key: string;\n label: string;\n x: number;\n y: number;\n }\n\n const nodes: GNode[] = [];\n const posOf: Record<string, { x: number; y: number }> = {};\n\n const addNodes = (\n type: GNode['type'],\n items: { key: string; label: string }[],\n cx: number\n ) => {\n items.forEach((item, i) => {\n const y = START_Y + i * (NODE_H + NODE_GAP);\n nodes.push({ type, key: item.key, label: item.label, x: cx, y });\n posOf[item.key] = { x: cx, y };\n });\n };\n\n if (colX['pages'] !== undefined) {\n addNodes(\n 'page',\n pages.map((p) => ({ key: `page:${p.dir}`, label: Modal.formatPageDir(p.dir) })),\n colX['pages']\n );\n }\n if (colX['features'] !== undefined) {\n addNodes(\n 'feature',\n features.map((f) => ({ key: `feature:${f.dir}`, label: f.title })),\n colX['features']\n );\n }\n if (colX['components'] !== undefined) {\n addNodes(\n 'component',\n shownComponentIds.map((id) => ({ key: `component:${id}`, label: id })),\n colX['components']\n );\n }\n\n // Build edges\n interface GEdge {\n fromKey: string;\n toKey: string;\n type: 'page' | 'feature';\n }\n const edges: GEdge[] = [];\n\n for (const p of pages) {\n for (const cid of p.componentIds) {\n if (connectedIds.has(cid)) {\n edges.push({ fromKey: `page:${p.dir}`, toKey: `component:${cid}`, type: 'page' });\n }\n }\n }\n for (const f of features) {\n for (const cid of f.componentIds) {\n if (connectedIds.has(cid)) {\n edges.push({ fromKey: `feature:${f.dir}`, toKey: `component:${cid}`, type: 'feature' });\n }\n }\n }\n\n // Calculate height\n const maxItems = Math.max(pages.length, features.length, shownComponentIds.length);\n const svgH = START_Y + maxItems * (NODE_H + NODE_GAP) + 12;\n\n // Create SVG\n const NS = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('viewBox', `0 0 ${SVG_W} ${svgH}`);\n svg.style.width = '100%';\n svg.style.height = 'auto';\n svg.classList.add('uidex-graph-svg');\n\n // Column headers\n const headerLabels: Record<string, string> = {\n pages: 'PAGES',\n features: 'FEATURES',\n components: 'COMPONENTS',\n };\n for (const col of columns) {\n const text = document.createElementNS(NS, 'text');\n text.setAttribute('x', String(col.x));\n text.setAttribute('y', String(COL_HEADER_Y));\n text.setAttribute('text-anchor', 'middle');\n text.classList.add('uidex-graph-header', `uidex-graph-header--${col.type}`);\n text.textContent = headerLabels[col.type];\n svg.appendChild(text);\n }\n\n // Edges\n const edgeGroup = document.createElementNS(NS, 'g');\n for (const edge of edges) {\n const from = posOf[edge.fromKey];\n const to = posOf[edge.toKey];\n if (!from || !to) continue;\n\n const x1 = from.x + NODE_W / 2;\n const y1 = from.y + NODE_H / 2;\n const x2 = to.x - NODE_W / 2;\n const y2 = to.y + NODE_H / 2;\n const midX = (x1 + x2) / 2;\n\n const path = document.createElementNS(NS, 'path');\n path.setAttribute(\n 'd',\n `M${x1},${y1} C${midX},${y1} ${midX},${y2} ${x2},${y2}`\n );\n path.classList.add('uidex-graph-edge', `uidex-graph-edge--${edge.type}`);\n path.dataset.from = edge.fromKey;\n path.dataset.to = edge.toKey;\n edgeGroup.appendChild(path);\n }\n svg.appendChild(edgeGroup);\n\n // Nodes\n const nodeGroup = document.createElementNS(NS, 'g');\n const truncate = (s: string, max: number) =>\n s.length > max ? s.slice(0, max - 1) + '\\u2026' : s;\n\n for (const node of nodes) {\n const g = document.createElementNS(NS, 'g');\n g.classList.add('uidex-graph-node', `uidex-graph-node--${node.type}`);\n g.dataset.key = node.key;\n\n const rect = document.createElementNS(NS, 'rect');\n rect.setAttribute('x', String(node.x - NODE_W / 2));\n rect.setAttribute('y', String(node.y));\n rect.setAttribute('width', String(NODE_W));\n rect.setAttribute('height', String(NODE_H));\n g.appendChild(rect);\n\n const text = document.createElementNS(NS, 'text');\n text.setAttribute('x', String(node.x));\n text.setAttribute('y', String(node.y + NODE_H / 2 + 3.5));\n text.setAttribute('text-anchor', 'middle');\n text.classList.add('uidex-graph-label');\n text.textContent = truncate(node.label, 14);\n g.appendChild(text);\n\n // Click to navigate\n g.addEventListener('click', () => {\n if (node.type === 'page') {\n this.navigateTo({ type: 'page', dir: node.key.slice(5) });\n } else if (node.type === 'feature') {\n this.navigateTo({ type: 'feature', dir: node.key.slice(8) });\n } else {\n this.navigateTo({ type: 'component', id: node.key.slice(10) });\n }\n });\n\n // Hover highlight\n g.addEventListener('mouseenter', () => {\n svg.classList.add('uidex-graph--hover');\n g.classList.add('uidex-graph-node--highlighted');\n for (const edge of edgeGroup.children) {\n const el = edge as SVGElement;\n if (el.dataset.from === node.key || el.dataset.to === node.key) {\n el.classList.add('uidex-graph-edge--highlighted');\n const otherKey =\n el.dataset.from === node.key ? el.dataset.to : el.dataset.from;\n const otherNode = nodeGroup.querySelector(`[data-key=\"${otherKey}\"]`);\n if (otherNode) otherNode.classList.add('uidex-graph-node--highlighted');\n }\n }\n });\n\n g.addEventListener('mouseleave', () => {\n svg.classList.remove('uidex-graph--hover');\n for (const el of svg.querySelectorAll('.uidex-graph-node--highlighted')) {\n el.classList.remove('uidex-graph-node--highlighted');\n }\n for (const el of svg.querySelectorAll('.uidex-graph-edge--highlighted')) {\n el.classList.remove('uidex-graph-edge--highlighted');\n }\n });\n\n nodeGroup.appendChild(g);\n }\n svg.appendChild(nodeGroup);\n\n // Title\n const title = document.createElement('h3');\n title.className = 'uidex-main-title';\n title.textContent = 'Map';\n this.mainContent.appendChild(title);\n\n // SVG container\n const container = document.createElement('div');\n container.className = 'uidex-graph';\n container.appendChild(svg);\n this.mainContent.appendChild(container);\n\n // Unconnected note\n if (unconnectedCount > 0) {\n const note = document.createElement('div');\n note.className = 'uidex-graph-note';\n note.textContent = `${unconnectedCount} component${unconnectedCount === 1 ? '' : 's'} without page or feature connections`;\n this.mainContent.appendChild(note);\n }\n }\n\n // ——— Feedback ———\n\n /** Open a dedicated feedback modal for a specific component. */\n openFeedback(id: string): void {\n this.createFeedbackShell(id);\n }\n\n private createFeedbackShell(id: string): void {\n const locations = this.data.components[id] ?? [];\n const element = this.options.elementGetter?.(id) ?? null;\n\n const { dialog, header } = this.createModalFrame({\n type: 'feedback',\n title: 'Feedback',\n ariaLabel: 'Feedback',\n });\n\n const componentLabel = document.createElement('code');\n componentLabel.className = 'uidex-modal-code uidex-modal-code--inline';\n componentLabel.textContent = id;\n header.appendChild(componentLabel);\n\n const spacer = document.createElement('div');\n spacer.className = 'uidex-header-spacer';\n header.appendChild(spacer);\n\n this.mountModalFrame(dialog, header);\n\n // Body — component context + feedback form\n this.mainContent = document.createElement('div');\n this.mainContent.className = 'uidex-modal-body';\n this.renderFeedbackContext(id, locations);\n this.renderFeedbackFormContent(id, locations, element);\n dialog.appendChild(this.mainContent);\n }\n\n /** Render component context (features, pages, doc) above the feedback form. */\n private renderFeedbackContext(id: string, locations: UidexLocation[]): void {\n if (!this.mainContent) return;\n let hasContext = false;\n\n // Feature badges\n const parentFeatures = this.data.features.filter((f) =>\n f.componentIds.includes(id)\n );\n if (parentFeatures.length > 0) {\n const container = this.createChipContainer();\n for (const feature of parentFeatures) {\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--features';\n chip.textContent = feature.title;\n container.appendChild(chip);\n }\n this.mainContent.appendChild(container);\n hasContext = true;\n }\n\n // Page badge\n const parentPage = this.data.pages.find((p) =>\n p.componentIds.includes(id)\n );\n if (parentPage) {\n const container = this.createChipContainer();\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--pages';\n chip.textContent = Modal.formatPageDir(parentPage.dir);\n container.appendChild(chip);\n this.mainContent.appendChild(container);\n hasContext = true;\n }\n\n // Doc/description\n const doc = locations.find((l) => l.doc)?.doc;\n if (doc) {\n const docText = document.createElement('p');\n docText.className = 'uidex-modal-doc uidex-modal-doc--spaced';\n docText.textContent = doc;\n this.mainContent.appendChild(docText);\n hasContext = true;\n }\n\n // Divider before form\n if (hasContext) {\n const divider = document.createElement('div');\n divider.className = 'uidex-main-divider';\n this.mainContent.appendChild(divider);\n }\n }\n\n private createChipContainer(): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'uidex-chips uidex-chips--spaced';\n return container;\n }\n\n private renderFeedbackFormContent(\n id: string,\n locations: UidexLocation[],\n element: Element | null\n ): void {\n if (!this.mainContent) return;\n\n const form = document.createElement('form');\n form.className = 'uidex-form';\n form.addEventListener('submit', (e) => e.preventDefault());\n\n // Type selector\n const typeSelect = this.createSelect('Type', [\n { value: 'bug', label: 'Bug Report' },\n { value: 'feature', label: 'Feature Request' },\n { value: 'improvement', label: 'Improvement' },\n { value: 'question', label: 'Question' },\n ]);\n form.appendChild(typeSelect.group);\n\n // Severity selector\n const severitySelect = this.createSelect(\n 'Severity',\n [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n { value: 'critical', label: 'Critical' },\n ],\n 'medium'\n );\n form.appendChild(severitySelect.group);\n\n // Description textarea\n const descGroup = this.createFormGroup('Description');\n const textarea = document.createElement('textarea');\n textarea.className = 'uidex-form-textarea';\n textarea.placeholder = 'Describe the issue or idea...';\n textarea.rows = 4;\n descGroup.appendChild(textarea);\n form.appendChild(descGroup);\n\n // Screenshot toggle\n const screenshotGroup = document.createElement('div');\n screenshotGroup.className = 'uidex-form-group';\n const screenshotLabel = document.createElement('label');\n screenshotLabel.className = 'uidex-form-toggle';\n const screenshotCheckbox = document.createElement('input');\n screenshotCheckbox.type = 'checkbox';\n screenshotCheckbox.className = 'uidex-form-checkbox';\n screenshotCheckbox.checked = true;\n screenshotLabel.appendChild(screenshotCheckbox);\n const screenshotText = document.createElement('span');\n screenshotText.className = 'uidex-form-toggle-text';\n screenshotText.textContent = 'Include screenshot';\n screenshotLabel.appendChild(screenshotText);\n screenshotGroup.appendChild(screenshotLabel);\n form.appendChild(screenshotGroup);\n\n // Submit button\n const submitBtn = document.createElement('button');\n submitBtn.type = 'button';\n submitBtn.className = 'uidex-form-submit';\n submitBtn.textContent = 'Submit';\n submitBtn.addEventListener('click', async () => {\n if (!textarea.value.trim()) {\n textarea.focus();\n return;\n }\n\n submitBtn.disabled = true;\n\n let screenshot: string | undefined;\n if (screenshotCheckbox.checked) {\n const freshElement = this.options.elementGetter?.(id) ?? element;\n if (freshElement) {\n submitBtn.textContent = 'Capturing\\u2026';\n screenshot =\n (await this.captureElementScreenshot(freshElement)) ?? undefined;\n }\n }\n\n const env = this.collectEnv();\n const page = this.data.pages.find((p) => p.componentIds.includes(id));\n\n const report: FeedbackReport = {\n type: typeSelect.select.value as FeedbackType,\n severity: severitySelect.select.value as FeedbackSeverity,\n description: textarea.value.trim(),\n componentId: id,\n element: element ? this.describeElement(element) : null,\n sources: locations.map((l) => ({ filePath: l.filePath, line: l.line })),\n url: env.url,\n path: window.location.pathname,\n route: page?.dir ?? null,\n timestamp: new Date().toISOString(),\n viewport: env.viewport,\n screen: env.screen,\n userAgent: env.userAgent,\n screenshot,\n };\n\n console.log('[uidex] Feedback submitted:', report);\n\n submitBtn.textContent = 'Submitted!';\n setTimeout(() => {\n submitBtn.textContent = 'Submit';\n submitBtn.disabled = false;\n }, 1500);\n });\n form.appendChild(submitBtn);\n\n this.mainContent.appendChild(form);\n }\n\n // ——— Component chips ———\n\n private createComponentChip(\n id: string,\n onComponentClick?: (id: string) => void,\n absent?: boolean\n ): HTMLSpanElement {\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--components';\n if (absent) chip.classList.add('uidex-chip--absent');\n chip.textContent = id;\n if (onComponentClick) {\n chip.style.cursor = 'pointer';\n chip.addEventListener('click', () => onComponentClick(id));\n }\n return chip;\n }\n\n private createFeatureChipsSection(features: ModalFeature[]): HTMLDivElement {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section';\n\n const label = document.createElement('div');\n label.className = 'uidex-modal-label';\n label.textContent = features.length === 1 ? 'Feature' : 'Features';\n section.appendChild(label);\n\n const container = document.createElement('div');\n container.className = 'uidex-chips';\n\n for (const feature of features) {\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--features';\n chip.textContent = feature.title;\n chip.style.cursor = 'pointer';\n chip.addEventListener('click', () =>\n this.navigateTo({ type: 'feature', dir: feature.dir })\n );\n container.appendChild(chip);\n }\n\n section.appendChild(container);\n return section;\n }\n\n private createComponentChipsSection(\n componentIds: string[],\n onComponentClick?: (id: string) => void,\n absentIds?: Set<string>\n ): HTMLDivElement {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section';\n\n const label = document.createElement('div');\n label.className = 'uidex-modal-label';\n label.textContent = `Components (${componentIds.length})`;\n section.appendChild(label);\n\n const container = document.createElement('div');\n container.className = 'uidex-chips';\n\n for (const id of componentIds) {\n container.appendChild(\n this.createComponentChip(id, onComponentClick, absentIds?.has(id))\n );\n }\n\n section.appendChild(container);\n return section;\n }\n\n // ——— Form helpers ———\n\n private createFormGroup(labelText: string): HTMLDivElement {\n const group = document.createElement('div');\n group.className = 'uidex-form-group';\n const label = document.createElement('label');\n label.className = 'uidex-form-label';\n label.textContent = labelText;\n group.appendChild(label);\n return group;\n }\n\n private createSelect(\n labelText: string,\n options: { value: string; label: string }[],\n defaultValue?: string\n ): { group: HTMLDivElement; select: HTMLSelectElement } {\n const group = this.createFormGroup(labelText);\n const select = document.createElement('select');\n select.className = 'uidex-form-select';\n for (const opt of options) {\n const option = document.createElement('option');\n option.value = opt.value;\n option.textContent = opt.label;\n if (opt.value === defaultValue) option.selected = true;\n select.appendChild(option);\n }\n group.appendChild(select);\n return { group, select };\n }\n\n // ——— Markdown rendering ———\n\n private createChecklistItem(text: string, checked = false): HTMLLIElement {\n const li = document.createElement('li');\n li.className = 'uidex-checklist-item';\n\n const label = document.createElement('label');\n label.className = 'uidex-checklist-label';\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'uidex-checklist-checkbox';\n checkbox.checked = checked;\n\n label.appendChild(checkbox);\n const span = document.createElement('span');\n span.textContent = text;\n label.appendChild(span);\n\n li.appendChild(label);\n return li;\n }\n\n private renderMarkdown(content: string): HTMLElement {\n const container = document.createElement('div');\n container.className = 'uidex-page-content';\n const lines = content.split('\\n');\n let currentList: HTMLUListElement | null = null;\n let skippedFirstH1 = false;\n let inAcceptanceSection = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!trimmed) {\n currentList = null;\n continue;\n }\n\n // Headings\n const headingMatch = trimmed.match(/^(#{1,6})\\s+(.+)/);\n if (headingMatch) {\n if (!skippedFirstH1 && headingMatch[1].length === 1) {\n skippedFirstH1 = true;\n continue;\n }\n currentList = null;\n inAcceptanceSection = /^acceptance$/i.test(headingMatch[2].trim());\n const level = headingMatch[1].length;\n const tag = (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const)[\n level - 1\n ];\n const heading = document.createElement(tag);\n heading.textContent = headingMatch[2];\n container.appendChild(heading);\n continue;\n }\n\n // Checkbox list items: - [ ] and - [x]\n const checkboxMatch = trimmed.match(/^- \\[([ xX])\\]\\s+(.*)/);\n if (checkboxMatch) {\n if (!currentList) {\n currentList = document.createElement('ul');\n currentList.className = 'uidex-checklist';\n container.appendChild(currentList);\n }\n currentList.appendChild(\n this.createChecklistItem(checkboxMatch[2], checkboxMatch[1] !== ' ')\n );\n continue;\n }\n\n // Plain list items: - text (render with checkboxes under Acceptance headings)\n if (trimmed.startsWith('- ')) {\n if (!currentList) {\n currentList = document.createElement('ul');\n currentList.className = 'uidex-checklist';\n container.appendChild(currentList);\n }\n const text = trimmed.slice(2);\n if (inAcceptanceSection) {\n currentList.appendChild(this.createChecklistItem(text));\n } else {\n const li = document.createElement('li');\n li.className = 'uidex-checklist-item';\n li.textContent = text;\n currentList.appendChild(li);\n }\n continue;\n }\n\n // Paragraph\n currentList = null;\n const p = document.createElement('p');\n p.textContent = trimmed;\n container.appendChild(p);\n }\n\n return container;\n }\n\n // ——— Screenshot capture ———\n\n /**\n * Capture an element by cloning it with inlined computed styles into an\n * SVG foreignObject, rendering to canvas via an <img> data-URI, and\n * returning a PNG data-URL.\n */\n private async captureElementScreenshot(\n element: Element\n ): Promise<string | null> {\n try {\n const rect = element.getBoundingClientRect();\n const width = Math.ceil(rect.width);\n const height = Math.ceil(rect.height);\n if (width <= 0 || height <= 0 || width > 4096 || height > 4096)\n return null;\n\n const clone = element.cloneNode(true) as Element;\n this.inlineComputedStyles(element, clone);\n\n const wrapper = document.createElement('div');\n wrapper.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n wrapper.style.overflow = 'hidden';\n wrapper.appendChild(clone);\n\n const serialized = new XMLSerializer().serializeToString(wrapper);\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">` +\n `<foreignObject width=\"100%\" height=\"100%\">` +\n serialized +\n `</foreignObject></svg>`;\n\n // Inline data-URI avoids blob URL cross-origin canvas tainting\n const img = new Image();\n img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n\n return await Promise.race([\n new Promise<string | null>((resolve) => {\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return resolve(null);\n ctx.drawImage(img, 0, 0);\n resolve(canvas.toDataURL('image/png'));\n } catch {\n // Canvas tainted by cross-origin SVG foreignObject content\n resolve(null);\n }\n };\n img.onerror = () => resolve(null);\n }),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 5000)),\n ]);\n } catch {\n return null;\n }\n }\n\n /** Visual CSS properties worth inlining for a screenshot clone. */\n private static readonly VISUAL_PROPS = [\n 'display',\n 'position',\n 'box-sizing',\n 'width',\n 'min-width',\n 'max-width',\n 'height',\n 'min-height',\n 'max-height',\n 'margin',\n 'padding',\n 'border',\n 'border-radius',\n 'overflow',\n 'flex-direction',\n 'flex-wrap',\n 'flex-grow',\n 'flex-shrink',\n 'flex-basis',\n 'align-items',\n 'justify-content',\n 'gap',\n 'grid-template-columns',\n 'grid-template-rows',\n 'grid-column',\n 'grid-row',\n 'color',\n 'background',\n 'background-color',\n 'background-image',\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n 'text-decoration',\n 'text-transform',\n 'white-space',\n 'word-break',\n 'opacity',\n 'visibility',\n 'transform',\n 'box-shadow',\n 'text-shadow',\n 'vertical-align',\n 'list-style',\n 'text-overflow',\n ];\n\n /** Recursively copy visual computed styles from source onto a cloned target. */\n private inlineComputedStyles(source: Element, target: Element): void {\n if (source instanceof HTMLElement && target instanceof HTMLElement) {\n const computed = window.getComputedStyle(source);\n for (const prop of Modal.VISUAL_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value) {\n target.style.setProperty(prop, value);\n }\n }\n }\n\n const srcChildren = source.children;\n const tgtChildren = target.children;\n for (let i = 0; i < srcChildren.length; i++) {\n if (tgtChildren[i]) {\n this.inlineComputedStyles(srcChildren[i], tgtChildren[i]);\n }\n }\n }\n\n // ——— Utilities ———\n\n private collectEnv() {\n return {\n viewport: { width: window.innerWidth, height: window.innerHeight },\n screen: { width: screen.width, height: screen.height },\n userAgent: navigator.userAgent,\n browserName: this.getBrowserName(),\n url: window.location.href,\n };\n }\n\n private getBrowserName(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Firefox/')) return 'Firefox';\n if (ua.includes('Edg/')) return 'Edge';\n if (ua.includes('Chrome/')) return 'Chrome';\n if (ua.includes('Safari/') && !ua.includes('Chrome')) return 'Safari';\n return 'Unknown browser';\n }\n\n private describeElement(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const classes = element.className\n ? `.${String(element.className).split(/\\s+/).join('.')}`\n : '';\n return `<${tag}${id}${classes}>`;\n }\n\n private handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n this.hide();\n }\n }\n}\n","import type { UidexMap, UidexPage, UidexFeature } from './types';\n\nlet registeredComponents: UidexMap | null = null;\nlet registeredPages: UidexPage[] | null = null;\nlet registeredFeatures: UidexFeature[] | null = null;\n\nexport function registerComponents(components: UidexMap): void {\n registeredComponents = components;\n}\n\nexport function getComponents(): UidexMap | null {\n return registeredComponents;\n}\n\nexport function registerPages(pages: UidexPage[]): void {\n registeredPages = pages;\n}\n\nexport function getPages(): UidexPage[] | null {\n return registeredPages;\n}\n\nexport function registerFeatures(features: UidexFeature[]): void {\n registeredFeatures = features;\n}\n\nexport function getFeatures(): UidexFeature[] | null {\n return registeredFeatures;\n}\n","// AUTO-GENERATED — do not edit. Run `npm run generate:css` to regenerate.\n// Source: src/core/style.css\nconst cssText = \"/* Design tokens — :host targets the shadow root, :where(:root) for standalone use */\\n/* Theme: shadcn lyra — monochromatic, sharp, monospace */\\n:where(:host, :root) {\\n /* Colors — dark theme (lyra neutral) */\\n --uidex-color-primary: #e5e5e5;\\n --uidex-color-primary-hover: #ffffff;\\n --uidex-color-bg: #1c1c1c;\\n --uidex-color-bg-elevated: #2e2e2e;\\n --uidex-color-text: #f9f9f9;\\n --uidex-color-text-strong: #ffffff;\\n --uidex-color-text-muted: #ababab; /* chrome: labels, counts, placeholders */\\n --uidex-color-text-secondary: #ababab; /* content: doc text, descriptions */\\n --uidex-color-surface-hover: rgba(255, 255, 255, 0.08);\\n --uidex-color-surface-active: rgba(255, 255, 255, 0.12);\\n --uidex-color-border: rgba(255, 255, 255, 0.1);\\n --uidex-color-border-light: rgba(255, 255, 255, 0.06);\\n --uidex-color-backdrop: rgba(0, 0, 0, 0.6);\\n\\n /* Category colors */\\n --uidex-color-pages: #60a5fa;\\n --uidex-color-features: #a78bfa;\\n --uidex-color-components: #34d399;\\n\\n /* Shadows — minimal, border-driven definition */\\n --uidex-shadow-sm: none;\\n --uidex-shadow-md: 0 0 0 1px var(--uidex-color-border);\\n --uidex-shadow-lg: 0 0 0 1px var(--uidex-color-border);\\n\\n /* Border radius — lyra: none */\\n --uidex-radius-sm: 0;\\n --uidex-radius-md: 0;\\n --uidex-radius-lg: 0;\\n --uidex-radius-full: 0;\\n\\n /* Z-index — high enough to stay above app UI */\\n --uidex-z-container: 2147483644;\\n --uidex-z-overlay: 2147483645;\\n --uidex-z-modal: 2147483646;\\n\\n /* Typography — mono-first (lyra). Both stacks are mono by default;\\n consumers can override --uidex-font-sans to restore a proportional body font. */\\n --uidex-font-sans: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\\n --uidex-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\\n --uidex-font-size-xs: 11px;\\n --uidex-font-size-sm: 12px;\\n --uidex-font-size-md: 13px;\\n --uidex-font-size-lg: 14px;\\n\\n /* Transitions */\\n --uidex-transition-fast: 0.1s ease;\\n --uidex-transition-normal: 0.15s ease;\\n --uidex-transition-smooth: 0.2s ease;\\n}\\n\\n/* ——— Container ——— */\\n.uidex-container {\\n position: fixed;\\n z-index: var(--uidex-z-container);\\n pointer-events: auto;\\n font-family: var(--uidex-font-sans);\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n\\n.uidex-bottom-right { bottom: 20px; right: 20px; }\\n.uidex-bottom-left { bottom: 20px; left: 20px; }\\n.uidex-top-right { top: 20px; right: 20px; }\\n.uidex-top-left { top: 20px; left: 20px; }\\n\\n/* ——— Trigger button group ——— */\\n.uidex-trigger-group {\\n display: flex;\\n align-items: center;\\n border-radius: 0;\\n background: var(--uidex-color-bg);\\n border: 1px solid var(--uidex-color-border);\\n overflow: hidden;\\n user-select: none;\\n height: 32px;\\n}\\n\\n.uidex-trigger-group:hover {\\n border-color: rgba(255, 255, 255, 0.16);\\n}\\n\\n.uidex-trigger-btn {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 6px;\\n height: 100%;\\n padding: 0 10px;\\n border: none;\\n background: transparent;\\n color: var(--uidex-color-text-muted);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 500;\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast);\\n}\\n\\n.uidex-trigger-btn:hover {\\n background: var(--uidex-color-surface-hover);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-trigger-btn:active {\\n background: var(--uidex-color-surface-active);\\n transform: translateY(1px);\\n}\\n\\n.uidex-trigger-btn--active {\\n color: var(--uidex-color-text-strong);\\n background: var(--uidex-color-surface-active);\\n}\\n\\n.uidex-trigger-btn--active:hover {\\n background: rgba(255, 255, 255, 0.16);\\n}\\n\\n.uidex-trigger-divider {\\n width: 1px;\\n height: 16px;\\n background: var(--uidex-color-border);\\n flex-shrink: 0;\\n}\\n\\n.uidex-trigger-icon {\\n width: 14px;\\n height: 14px;\\n flex-shrink: 0;\\n}\\n\\n/* ——— Draggable ——— */\\n.uidex-container--dragging {\\n transition: none !important;\\n}\\n\\n.uidex-container--dragging .uidex-trigger-btn {\\n cursor: grabbing !important;\\n}\\n\\n/* ——— Inspect mode cursor ——— */\\nbody.uidex-inspecting,\\nbody.uidex-inspecting * {\\n cursor: crosshair !important;\\n}\\n\\n/* ——— Modal ——— */\\n.uidex-modal-backdrop {\\n position: fixed;\\n inset: 0;\\n z-index: var(--uidex-z-modal);\\n pointer-events: auto;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: var(--uidex-color-backdrop);\\n}\\n\\n.uidex-modal {\\n background: var(--uidex-color-bg);\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n max-width: calc(100vw - 32px);\\n max-height: calc(100vh - 64px);\\n font-family: var(--uidex-font-sans);\\n}\\n\\n.uidex-modal-header {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n padding: 12px 16px;\\n border-bottom: 1px solid var(--uidex-color-border);\\n}\\n\\n.uidex-modal-title {\\n margin: 0;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text-strong);\\n font-family: var(--uidex-font-mono);\\n text-transform: uppercase;\\n letter-spacing: 0.05em;\\n}\\n\\n.uidex-modal-close {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 28px;\\n height: 28px;\\n border: 1px solid transparent;\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text-muted);\\n font-size: 18px;\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast), border-color var(--uidex-transition-fast);\\n}\\n\\n.uidex-modal-close:hover {\\n background: var(--uidex-color-surface-hover);\\n border-color: var(--uidex-color-border);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-modal-close:active {\\n transform: translateY(1px);\\n}\\n\\n.uidex-modal-body {\\n padding: 12px 16px;\\n}\\n\\n.uidex-modal-section {\\n margin-bottom: 12px;\\n}\\n\\n.uidex-modal-section:last-child {\\n margin-bottom: 0;\\n}\\n\\n.uidex-modal-label {\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--uidex-color-text-muted);\\n margin-bottom: 6px;\\n}\\n\\n.uidex-modal-section--spaced {\\n margin-top: 12px;\\n}\\n\\n.uidex-modal-doc {\\n margin: 0;\\n font-size: var(--uidex-font-size-sm);\\n line-height: 1.5;\\n color: var(--uidex-color-text-secondary);\\n}\\n\\n.uidex-modal-code {\\n display: block;\\n font-family: var(--uidex-font-mono);\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text);\\n background: var(--uidex-color-bg-elevated);\\n padding: 6px 10px;\\n border-radius: 0;\\n border: 1px solid var(--uidex-color-border);\\n word-break: break-all;\\n}\\n\\n.uidex-modal-location {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n margin-bottom: 6px;\\n}\\n\\n.uidex-modal-location:last-child {\\n margin-bottom: 0;\\n}\\n\\n.uidex-modal-location .uidex-modal-code {\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.uidex-modal-copy {\\n flex-shrink: 0;\\n padding: 4px 10px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: var(--uidex-color-bg-elevated);\\n color: var(--uidex-color-text-secondary);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 500;\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast);\\n white-space: nowrap;\\n}\\n\\n.uidex-modal-copy:hover {\\n background: var(--uidex-color-surface-hover);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-modal-copy:active {\\n transform: translateY(1px);\\n}\\n\\n.uidex-modal-env-item {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-secondary);\\n line-height: 1.6;\\n}\\n\\n.uidex-empty-message {\\n padding: 16px 12px;\\n color: var(--uidex-color-text-muted);\\n font-size: var(--uidex-font-size-sm);\\n text-align: center;\\n}\\n\\n/* ——— Panel layout (sidebar modal) ——— */\\n.uidex-modal--panel {\\n width: calc(100vw - 32px);\\n max-width: 720px;\\n height: calc(100vh - 64px);\\n max-height: 600px;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n.uidex-panel-body {\\n display: flex;\\n flex: 1;\\n min-height: 0;\\n}\\n\\n.uidex-panel-sidebar {\\n width: 200px;\\n flex-shrink: 0;\\n border-right: 1px solid var(--uidex-color-border);\\n overflow-y: auto;\\n padding: 0;\\n scrollbar-width: thin;\\n scrollbar-color: rgba(255, 255, 255, 0.1) transparent;\\n}\\n\\n.uidex-panel-sidebar::-webkit-scrollbar {\\n width: 6px;\\n}\\n\\n.uidex-panel-sidebar::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n\\n.uidex-panel-sidebar::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.1);\\n border-radius: 0;\\n}\\n\\n.uidex-panel-main {\\n flex: 1;\\n min-width: 0;\\n overflow-y: auto;\\n padding: 16px 20px;\\n scrollbar-width: thin;\\n scrollbar-color: rgba(255, 255, 255, 0.1) transparent;\\n}\\n\\n.uidex-panel-main::-webkit-scrollbar {\\n width: 6px;\\n}\\n\\n.uidex-panel-main::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n\\n.uidex-panel-main::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.1);\\n border-radius: 0;\\n}\\n\\n/* ——— Sidebar navigation ——— */\\n.uidex-sidebar-back {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n padding: 6px 8px;\\n margin: 0;\\n border-bottom: 1px solid var(--uidex-color-border);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text-secondary);\\n cursor: pointer;\\n transition: color var(--uidex-transition-fast);\\n position: sticky;\\n top: 0;\\n background: var(--uidex-color-bg);\\n z-index: 1;\\n}\\n\\n.uidex-sidebar-back:hover {\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-sidebar-back-arrow {\\n font-size: 16px;\\n line-height: 1;\\n}\\n\\n.uidex-sidebar-root-item {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n padding: 6px 10px;\\n border-radius: 0;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 500;\\n color: var(--uidex-color-text);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n}\\n\\n.uidex-sidebar-root-item:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-sidebar-root-label {\\n flex: 0 0 auto;\\n}\\n\\n.uidex-sidebar-count {\\n font-size: var(--uidex-font-size-xs);\\n color: var(--uidex-color-text-muted);\\n font-weight: 400;\\n}\\n\\n.uidex-sidebar-chevron {\\n margin-left: auto;\\n font-size: 16px;\\n line-height: 1;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-sidebar-item {\\n padding: 4px 10px;\\n border-radius: 0;\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.uidex-sidebar-item:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-sidebar-item--active {\\n background: var(--uidex-color-surface-active);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-sidebar-item--active:hover {\\n background: var(--uidex-color-surface-active);\\n}\\n\\n.uidex-sidebar-item--dimmed {\\n opacity: 0.5;\\n}\\n\\n.uidex-sidebar-item--mono {\\n font-family: var(--uidex-font-mono);\\n}\\n\\n.uidex-sidebar-item--grouped {\\n padding-left: 24px;\\n}\\n\\n/* Sidebar category colors */\\n.uidex-sidebar-item--pages.uidex-sidebar-item--active {\\n color: var(--uidex-color-pages);\\n}\\n\\n.uidex-sidebar-item--features.uidex-sidebar-item--active {\\n color: var(--uidex-color-features);\\n}\\n\\n.uidex-sidebar-item--components.uidex-sidebar-item--active {\\n color: var(--uidex-color-components);\\n}\\n\\n.uidex-sidebar-root-item--pages .uidex-sidebar-root-label {\\n color: var(--uidex-color-pages);\\n}\\n\\n.uidex-sidebar-root-item--features .uidex-sidebar-root-label {\\n color: var(--uidex-color-features);\\n}\\n\\n.uidex-sidebar-root-item--components .uidex-sidebar-root-label {\\n color: var(--uidex-color-components);\\n}\\n\\n/* ——— Sidebar component groups ——— */\\n.uidex-sidebar-group-header {\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n padding: 4px 10px;\\n border-radius: 0;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n user-select: none;\\n}\\n\\n.uidex-sidebar-group-header:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-sidebar-group-chevron {\\n font-size: 14px;\\n line-height: 1;\\n color: var(--uidex-color-text-muted);\\n width: 14px;\\n text-align: center;\\n flex-shrink: 0;\\n transition: transform var(--uidex-transition-normal);\\n transform: rotate(0deg);\\n}\\n\\n.uidex-sidebar-group-header--expanded .uidex-sidebar-group-chevron {\\n transform: rotate(90deg);\\n}\\n\\n.uidex-sidebar-group-count {\\n margin-left: auto;\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 400;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n/* ——— Search ——— */\\n.uidex-search-input {\\n flex: 1;\\n min-width: 0;\\n padding: 4px 8px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text);\\n font-size: var(--uidex-font-size-sm);\\n font-family: var(--uidex-font-mono);\\n outline: none;\\n box-sizing: border-box;\\n}\\n\\n.uidex-search-input::placeholder {\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-search-input:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n}\\n\\n.uidex-search-group-label {\\n padding: 8px 10px 2px;\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-search-group-label--pages { color: var(--uidex-color-pages); }\\n.uidex-search-group-label--features { color: var(--uidex-color-features); }\\n.uidex-search-group-label--components { color: var(--uidex-color-components); }\\n\\n.uidex-search-empty {\\n padding: 20px 10px;\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-muted);\\n text-align: center;\\n}\\n\\n.uidex-sidebar-divider {\\n height: 1px;\\n background: var(--uidex-color-border);\\n margin: 4px 10px;\\n}\\n\\n.uidex-sidebar-root-item--active {\\n background: var(--uidex-color-surface-active);\\n}\\n\\n/* ——— Main content ——— */\\n.uidex-main-title {\\n margin: 0 0 8px;\\n font-size: var(--uidex-font-size-lg);\\n font-weight: 600;\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-main-title--mono {\\n font-family: var(--uidex-font-mono);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-main-divider {\\n height: 1px;\\n background: var(--uidex-color-border);\\n margin: 16px 0;\\n}\\n\\n.uidex-absent-notice {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-muted);\\n font-style: italic;\\n margin-bottom: 12px;\\n}\\n\\n/* ——— Page content in modal ——— */\\n.uidex-page-content {\\n font-size: var(--uidex-font-size-sm);\\n line-height: 1.6;\\n color: var(--uidex-color-text);\\n}\\n\\n.uidex-page-content h2,\\n.uidex-page-content h3,\\n.uidex-page-content h4,\\n.uidex-page-content h5,\\n.uidex-page-content h6 {\\n margin: 12px 0 6px;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text-strong);\\n text-transform: uppercase;\\n letter-spacing: 0.04em;\\n}\\n\\n.uidex-page-content h2 {\\n font-size: var(--uidex-font-size-md);\\n}\\n\\n.uidex-page-content p {\\n margin: 0 0 8px;\\n}\\n\\n.uidex-checklist {\\n list-style: none;\\n margin: 0 0 8px;\\n padding-left: 0;\\n}\\n\\n.uidex-checklist-item {\\n margin-bottom: 4px;\\n}\\n\\n.uidex-checklist-label {\\n display: flex;\\n align-items: baseline;\\n gap: 8px;\\n cursor: pointer;\\n}\\n\\n.uidex-checklist-checkbox {\\n flex-shrink: 0;\\n margin: 0;\\n accent-color: var(--uidex-color-text-strong);\\n}\\n\\n/* ——— Chips ——— */\\n.uidex-chips {\\n display: flex;\\n flex-wrap: wrap;\\n gap: 4px;\\n}\\n\\n.uidex-chip {\\n display: inline-block;\\n padding: 2px 8px;\\n border-radius: 0;\\n background: transparent;\\n border: 1px solid var(--uidex-color-border);\\n font-family: var(--uidex-font-mono);\\n font-size: var(--uidex-font-size-xs);\\n color: var(--uidex-color-text);\\n transition: background-color var(--uidex-transition-fast);\\n}\\n\\n.uidex-chip:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-chip--absent {\\n opacity: 0.4;\\n}\\n\\n.uidex-chip--pages {\\n color: var(--uidex-color-pages);\\n border-color: color-mix(in srgb, var(--uidex-color-pages) 30%, transparent);\\n}\\n\\n.uidex-chip--features {\\n color: var(--uidex-color-features);\\n border-color: color-mix(in srgb, var(--uidex-color-features) 30%, transparent);\\n}\\n\\n.uidex-chip--components {\\n color: var(--uidex-color-components);\\n border-color: color-mix(in srgb, var(--uidex-color-components) 30%, transparent);\\n}\\n\\n/* ——— Category badges ——— */\\n.uidex-badge {\\n display: inline-block;\\n padding: 2px 8px;\\n border-radius: 0;\\n border: 1px solid var(--uidex-color-border);\\n background: transparent;\\n color: var(--uidex-color-text-muted);\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n margin-bottom: 12px;\\n}\\n\\n.uidex-badge--pages {\\n color: var(--uidex-color-pages);\\n border-color: color-mix(in srgb, var(--uidex-color-pages) 30%, transparent);\\n}\\n\\n.uidex-badge--features {\\n color: var(--uidex-color-features);\\n border-color: color-mix(in srgb, var(--uidex-color-features) 30%, transparent);\\n}\\n\\n.uidex-badge--components {\\n color: var(--uidex-color-components);\\n border-color: color-mix(in srgb, var(--uidex-color-components) 30%, transparent);\\n}\\n\\n/* ——— Feedback modal ——— */\\n.uidex-modal--feedback {\\n width: calc(100vw - 32px);\\n max-width: 400px;\\n}\\n\\n.uidex-modal-code--inline {\\n border: none;\\n background: none;\\n padding: 0;\\n}\\n\\n.uidex-header-spacer {\\n flex: 1;\\n}\\n\\n.uidex-chips--spaced {\\n margin-bottom: 8px;\\n}\\n\\n.uidex-modal-doc--spaced {\\n margin-bottom: 12px;\\n}\\n\\n/* ——— Feedback form ——— */\\n.uidex-form {\\n display: flex;\\n flex-direction: column;\\n gap: 12px;\\n}\\n\\n.uidex-form-group {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n}\\n\\n.uidex-form-label {\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-form-select {\\n appearance: none;\\n padding: 6px 10px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text);\\n font-size: var(--uidex-font-size-sm);\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n outline: none;\\n background-image: url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ababab' d='M3 5l3 3 3-3'/%3E%3C/svg%3E\\\");\\n background-repeat: no-repeat;\\n background-position: right 8px center;\\n padding-right: 26px;\\n}\\n\\n.uidex-form-select:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n}\\n\\n.uidex-form-textarea {\\n padding: 8px 10px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text);\\n font-size: var(--uidex-font-size-sm);\\n font-family: var(--uidex-font-mono);\\n line-height: 1.5;\\n resize: vertical;\\n outline: none;\\n min-height: 80px;\\n}\\n\\n.uidex-form-textarea::placeholder {\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-form-textarea:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n}\\n\\n.uidex-form-submit {\\n padding: 6px 16px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: var(--uidex-color-primary);\\n color: var(--uidex-color-bg);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n align-self: flex-end;\\n}\\n\\n.uidex-form-submit:hover {\\n background: var(--uidex-color-primary-hover);\\n}\\n\\n.uidex-form-submit:active {\\n transform: translateY(1px);\\n}\\n\\n.uidex-form-submit:disabled {\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n/* ——— Form toggle ——— */\\n.uidex-form-toggle {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n cursor: pointer;\\n}\\n\\n.uidex-form-checkbox {\\n flex-shrink: 0;\\n margin: 0;\\n accent-color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-form-toggle-text {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-secondary);\\n}\\n\\n/* ——— Responsive ——— */\\n@media (max-width: 600px) {\\n .uidex-modal--panel {\\n width: auto;\\n }\\n\\n .uidex-panel-body {\\n flex-direction: column;\\n }\\n\\n .uidex-panel-sidebar {\\n width: auto;\\n max-height: 200px;\\n border-right: none;\\n border-bottom: 1px solid var(--uidex-color-border);\\n }\\n}\\n\\n/* ——— Graph ——— */\\n.uidex-graph {\\n margin-top: 8px;\\n}\\n\\n.uidex-graph-svg {\\n display: block;\\n}\\n\\n.uidex-graph-header {\\n font-size: 10px;\\n font-weight: 600;\\n letter-spacing: 0.08em;\\n}\\n\\n.uidex-graph-header--pages { fill: var(--uidex-color-pages); }\\n.uidex-graph-header--features { fill: var(--uidex-color-features); }\\n.uidex-graph-header--components { fill: var(--uidex-color-components); }\\n\\n.uidex-graph-node {\\n cursor: pointer;\\n}\\n\\n.uidex-graph-node rect {\\n fill: var(--uidex-color-bg-elevated);\\n stroke: var(--uidex-color-border);\\n stroke-width: 1;\\n}\\n\\n.uidex-graph-node:hover rect {\\n fill: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-graph-node--page rect { stroke: color-mix(in srgb, var(--uidex-color-pages) 50%, transparent); }\\n.uidex-graph-node--feature rect { stroke: color-mix(in srgb, var(--uidex-color-features) 50%, transparent); }\\n.uidex-graph-node--component rect { stroke: color-mix(in srgb, var(--uidex-color-components) 50%, transparent); }\\n\\n.uidex-graph-label {\\n font-size: 10px;\\n font-family: var(--uidex-font-mono);\\n fill: var(--uidex-color-text);\\n}\\n\\n.uidex-graph-edge {\\n fill: none;\\n stroke-width: 1;\\n opacity: 0.3;\\n}\\n\\n.uidex-graph-edge--page { stroke: var(--uidex-color-pages); }\\n.uidex-graph-edge--feature { stroke: var(--uidex-color-features); }\\n\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-edge { opacity: 0.08; }\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-node { opacity: 0.3; }\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-edge--highlighted { opacity: 0.6; stroke-width: 1.5; }\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-node--highlighted { opacity: 1; }\\n\\n.uidex-graph-note {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-muted);\\n margin-top: 12px;\\n font-style: italic;\\n}\\n\\n/* ——— Overlay ———\\n NOTE: The overlay renders in document.body (outside the Shadow DOM)\\n so all its styles are set inline in overlay.ts. These CSS classes\\n are retained only for consumers who import style.css standalone. */\\n.uidex-overlay {\\n position: fixed;\\n pointer-events: none;\\n z-index: 2147483645;\\n}\\n\";\nexport default cssText;\n","import cssText from './css-text';\n\n/**\n * Injects the uidex styles into a shadow root as a <style> element.\n * This isolates all uidex CSS from the host page.\n */\nexport function injectStyles(shadowRoot: ShadowRoot): void {\n const style = document.createElement('style');\n style.textContent = cssText;\n shadowRoot.appendChild(style);\n}\n","import type { UidexUIOptions, UidexMap } from './types';\nimport type { ModalView } from './modal';\nimport { Menu, POSITION_CLASSES } from './menu';\nimport { Overlay } from './overlay';\nimport { Inspector } from './inspector';\nimport { Modal } from './modal';\nimport { getComponents, getPages, getFeatures } from './registry';\nimport { injectStyles } from './shadow';\n\ntype ActiveMode = 'inspect' | 'copy' | 'feedback';\n\nexport class UidexUI {\n private menu: Menu;\n private overlay: Overlay;\n private modal: Modal;\n private inspector: Inspector | null;\n private options: UidexUIOptions;\n private mounted = false;\n private shadowHost: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private observer: MutationObserver | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private copyTimer: ReturnType<typeof setTimeout> | null = null;\n private currentPresentIds: string[] = [];\n private activeMode: ActiveMode | null = null;\n\n constructor(options: UidexUIOptions = {}) {\n this.options = options;\n\n this.overlay = new Overlay({\n color: options.config?.defaults?.color,\n borderStyle: options.config?.defaults?.borderStyle,\n borderWidth: options.config?.defaults?.borderWidth,\n showLabel: options.config?.defaults?.showLabel,\n labelPosition: options.config?.defaults?.labelPosition,\n colors: options.config?.colors,\n });\n\n this.modal = new Modal({\n onComponentNavigate: (id) => {\n const element = this.findElement(id);\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n this.options.onSelect?.(id);\n },\n elementGetter: (id) => this.findElement(id),\n });\n\n this.menu = new Menu({\n onInspectToggle: () => this.toggleMode('inspect'),\n onCopyToggle: () => this.toggleMode('copy'),\n onFeedbackToggle: () => this.toggleMode('feedback'),\n onExpandClick: () => this.handleExpandClick(),\n });\n\n if (options.inspectShortcut === false) {\n this.inspector = null;\n } else {\n this.inspector = new Inspector({\n shortcut: options.inspectShortcut,\n onHighlight: (_element, id) => this.handleHighlight(id),\n onSelect: (_element, id) => this.handleSelect(id),\n onActivate: () => {\n this.updateMenuActiveStates();\n },\n onDeactivate: () => {\n this.overlay.hide();\n this.activeMode = null;\n this.updateMenuActiveStates();\n },\n });\n }\n }\n\n mount(container?: HTMLElement): void {\n if (this.mounted) return;\n\n const components = this.getComponentsMap();\n const componentIds = Object.keys(components);\n\n if (componentIds.length === 0) return;\n\n // Create Shadow DOM host — zero-size, no layout impact,\n // but allows pointer events to reach fixed-position children (modal backdrop).\n this.shadowHost = document.createElement('div');\n this.shadowHost.id = 'uidex-root';\n // Fixed position keeps the host out of document flow so it cannot\n // contribute to scrollable overflow. Children (also fixed) position\n // relative to the viewport regardless of the host's box.\n this.shadowHost.style.position = 'fixed';\n this.shadowHost.style.top = '0';\n this.shadowHost.style.left = '0';\n this.shadowHost.style.width = '0';\n this.shadowHost.style.height = '0';\n this.shadowHost.style.pointerEvents = 'none';\n\n this.shadowRoot = this.shadowHost.attachShadow({ mode: 'open' });\n\n // Inject styles into shadow root\n injectStyles(this.shadowRoot);\n\n // Filter to only components present in the DOM right now\n const presentIds = this.scanPresentIds(componentIds);\n\n const menuContainer = this.menu.create();\n\n // Apply position class\n const position = this.options.buttonPosition ?? 'bottom-right';\n menuContainer.classList.add(POSITION_CLASSES[position]);\n\n // Mount shadow host and UI inside shadow root\n const mountTarget = container ?? document.body;\n mountTarget.appendChild(this.shadowHost);\n this.shadowRoot.appendChild(menuContainer);\n\n // Modal renders into shadow root too\n this.modal.setShadowRoot(this.shadowRoot);\n\n // Provide modal with current data\n this.updateModalData(presentIds);\n\n this.inspector?.mount();\n\n // Watch for DOM changes (SPA navigation, dynamic rendering)\n this.startObserving();\n\n this.mounted = true;\n }\n\n destroy(): void {\n if (!this.mounted) return;\n\n this.stopObserving();\n if (this.copyTimer !== null) {\n clearTimeout(this.copyTimer);\n this.copyTimer = null;\n }\n this.inspector?.destroy();\n this.menu.destroy();\n this.overlay.destroy();\n this.modal.destroy();\n\n if (this.shadowHost && this.shadowHost.parentNode) {\n this.shadowHost.parentNode.removeChild(this.shadowHost);\n }\n this.shadowHost = null;\n this.shadowRoot = null;\n this.mounted = false;\n }\n\n startInspect(): void {\n this.inspector?.activate();\n }\n\n stopInspect(): void {\n this.inspector?.deactivate();\n }\n\n isInspecting(): boolean {\n return this.inspector?.isActive() ?? false;\n }\n\n /** Open the modal panel, optionally to a specific view. */\n openPanel(view?: ModalView): void {\n this.modal.open(view);\n }\n\n private toggleMode(mode: ActiveMode): void {\n if (this.inspector?.isActive()) {\n if (this.activeMode === mode) {\n this.inspector.deactivate();\n } else {\n this.activeMode = mode;\n this.updateMenuActiveStates();\n }\n } else {\n this.activeMode = mode;\n this.inspector?.activate();\n }\n }\n\n private updateMenuActiveStates(): void {\n this.menu.setInspectActive(this.activeMode === 'inspect');\n this.menu.setCopyActive(this.activeMode === 'copy');\n this.menu.setFeedbackActive(this.activeMode === 'feedback');\n }\n\n private getComponentsMap(): UidexMap {\n return this.options.components ?? getComponents() ?? {};\n }\n\n private getPagesArray() {\n return this.options.pages ?? getPages() ?? [];\n }\n\n private getFeaturesArray() {\n return this.options.features ?? getFeatures() ?? [];\n }\n\n private extractPageTitle(content: string): string {\n const match = content.match(/^#\\s+(.+)/m);\n return match ? match[1].trim() : 'Untitled';\n }\n\n /** Hamburger button handler — open modal to default (current page) view. */\n private handleExpandClick(): void {\n this.inspector?.deactivate();\n this.overlay.hide();\n this.modal.open();\n }\n\n /** Selection handler — routes by active mode. */\n private handleSelect(id: string): void {\n switch (this.activeMode) {\n case 'inspect':\n this.overlay.hide();\n this.modal.open({ type: 'component', id });\n break;\n case 'copy':\n this.handleCopySelect(id);\n break;\n case 'feedback':\n this.overlay.hide();\n this.modal.openFeedback(id);\n break;\n }\n }\n\n private handleCopySelect(id: string): void {\n const components = this.getComponentsMap();\n const locations = components[id];\n if (!locations || locations.length === 0) return;\n\n const loc = locations[0];\n const text = `${loc.filePath}:${loc.line}`;\n navigator.clipboard.writeText(text).catch(() => {});\n\n // Flash \"Copied!\" on overlay, then hide\n const element = this.findElement(id);\n if (element instanceof HTMLElement) {\n this.overlay.show(element, 'Copied!');\n this.copyTimer = setTimeout(() => {\n this.copyTimer = null;\n this.overlay.hide();\n }, 600);\n }\n }\n\n private findElement(id: string): Element | null {\n return document.querySelector(`[data-uidex=\"${id}\"]`);\n }\n\n private handleHighlight(id: string | null): void {\n if (id) {\n const element = this.findElement(id);\n if (element instanceof HTMLElement) {\n this.overlay.show(element, id);\n }\n } else {\n this.overlay.hide();\n }\n }\n\n /** Push current pages/features/components/presentIds to the modal. */\n private updateModalData(presentIds: string[]): void {\n const pages = this.getPagesArray();\n const features = this.getFeaturesArray();\n const components = this.getComponentsMap();\n\n this.modal.setData({\n pages: pages.map((p) => ({\n title: this.extractPageTitle(p.content),\n dir: p.dir,\n content: p.content,\n componentIds: p.componentIds,\n })),\n features: features.map((f) => ({\n title: this.extractPageTitle(f.content),\n dir: f.dir,\n content: f.content,\n componentIds: f.componentIds,\n })),\n components,\n presentIds: new Set(presentIds),\n });\n }\n\n // ——— DOM observation for SPA navigation ———\n\n /** Scan which registered component IDs are currently in the DOM. */\n private scanPresentIds(allIds?: string[]): string[] {\n const componentIds = allIds ?? Object.keys(this.getComponentsMap());\n\n // Single querySelectorAll instead of N individual querySelector calls\n const found = new Set<string>();\n for (const el of document.querySelectorAll('[data-uidex]')) {\n const id = el.getAttribute('data-uidex');\n if (id) found.add(id);\n }\n\n const presentIds = componentIds.filter((id) => found.has(id));\n this.currentPresentIds = presentIds;\n return presentIds;\n }\n\n /** Schedule a debounced refresh of the modal data after DOM mutations. */\n private scheduleRefresh(): void {\n if (this.refreshTimer !== null) return;\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = null;\n this.refresh();\n }, 100);\n }\n\n /** Re-scan the DOM and update modal data if the set of present IDs changed. */\n private refresh(): void {\n const oldIds = this.currentPresentIds;\n const newIds = this.scanPresentIds();\n\n // Quick equality check — same length and same elements\n if (\n newIds.length === oldIds.length &&\n newIds.every((id, i) => id === oldIds[i])\n ) {\n return;\n }\n\n this.updateModalData(newIds);\n }\n\n private startObserving(): void {\n this.observer = new MutationObserver(() => this.scheduleRefresh());\n this.observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-uidex'],\n });\n }\n\n private stopObserving(): void {\n if (this.refreshTimer !== null) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.observer?.disconnect();\n this.observer = null;\n }\n}\n\nexport function createUidexUI(options: UidexUIOptions = {}): UidexUI {\n return new UidexUI(options);\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["NS"]}
1
+ {"version":3,"sources":["../../src/core/menu.ts","../../src/core/utils.ts","../../src/core/overlay.ts","../../src/core/inspector.ts","../../src/core/ingest.ts","../../src/core/modal.ts","../../src/core/registry.ts","../../src/core/css-text.ts","../../src/core/shadow.ts","../../src/core/uidex-ui.ts"],"sourcesContent":["import type { ButtonPosition } from './types';\n\nexport const POSITION_CLASSES: Record<ButtonPosition, string> = {\n 'bottom-right': 'uidex-bottom-right',\n 'bottom-left': 'uidex-bottom-left',\n 'top-right': 'uidex-top-right',\n 'top-left': 'uidex-top-left',\n};\n\nconst NS = 'http://www.w3.org/2000/svg';\n\n/** Create a base SVG icon with standard stroke attributes. */\nfunction createIconSVG(children: SVGElement[]): SVGSVGElement {\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('class', 'uidex-trigger-icon');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n for (const child of children) svg.appendChild(child);\n return svg;\n}\n\nfunction createListSVG(): SVGSVGElement {\n const lines = [6, 12, 18].map((y) => {\n const line = document.createElementNS(NS, 'line');\n line.setAttribute('x1', '4');\n line.setAttribute('y1', String(y));\n line.setAttribute('x2', '20');\n line.setAttribute('y2', String(y));\n return line;\n });\n return createIconSVG(lines);\n}\n\nfunction createSelectSVG(): SVGSVGElement {\n const path1 = document.createElementNS(NS, 'path');\n path1.setAttribute('d', 'M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z');\n const path2 = document.createElementNS(NS, 'path');\n path2.setAttribute('d', 'M13 13l6 6');\n return createIconSVG([path1, path2]);\n}\n\nfunction createCopySVG(): SVGSVGElement {\n const rect = document.createElementNS(NS, 'rect');\n rect.setAttribute('x', '9');\n rect.setAttribute('y', '9');\n rect.setAttribute('width', '13');\n rect.setAttribute('height', '13');\n rect.setAttribute('rx', '2');\n const path = document.createElementNS(NS, 'path');\n path.setAttribute('d', 'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1');\n return createIconSVG([rect, path]);\n}\n\nfunction createFeedbackSVG(): SVGSVGElement {\n const path = document.createElementNS(NS, 'path');\n path.setAttribute('d', 'M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z');\n return createIconSVG([path]);\n}\n\nexport interface MenuOptions {\n onInspectToggle?: () => void;\n onCopyToggle?: () => void;\n onFeedbackToggle?: () => void;\n onExpandClick?: () => void;\n}\n\nexport class Menu {\n private container: HTMLDivElement | null = null;\n private group: HTMLDivElement | null = null;\n private expandBtn: HTMLButtonElement | null = null;\n private inspectBtn: HTMLButtonElement | null = null;\n private copyBtn: HTMLButtonElement | null = null;\n private feedbackBtn: HTMLButtonElement | null = null;\n private options: MenuOptions;\n\n // Drag state\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragStartLeft = 0;\n private dragStartTop = 0;\n private hasDragged = false;\n\n private boundPointerDown: (e: PointerEvent) => void;\n private boundPointerMove: (e: PointerEvent) => void;\n private boundPointerUp: (e: PointerEvent) => void;\n\n constructor(options: MenuOptions = {}) {\n this.options = options;\n this.boundPointerDown = this.handlePointerDown.bind(this);\n this.boundPointerMove = this.handlePointerMove.bind(this);\n this.boundPointerUp = this.handlePointerUp.bind(this);\n }\n\n getContainer(): HTMLDivElement | null {\n return this.container;\n }\n\n /** Update a button's active state. */\n private setButtonActive(btn: HTMLButtonElement | null, active: boolean): void {\n if (!btn) return;\n btn.classList.toggle('uidex-trigger-btn--active', active);\n btn.setAttribute('aria-pressed', String(active));\n }\n\n setInspectActive(active: boolean): void {\n this.setButtonActive(this.inspectBtn, active);\n }\n\n setCopyActive(active: boolean): void {\n this.setButtonActive(this.copyBtn, active);\n }\n\n setFeedbackActive(active: boolean): void {\n this.setButtonActive(this.feedbackBtn, active);\n }\n\n private createButton(\n modifier: string,\n ariaLabel: string,\n title: string,\n icon: SVGSVGElement,\n onClick: () => void,\n toggle = false\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `uidex-trigger-btn uidex-trigger-btn--${modifier}`;\n btn.setAttribute('aria-label', ariaLabel);\n if (toggle) btn.setAttribute('aria-pressed', 'false');\n btn.title = title;\n btn.appendChild(icon);\n btn.addEventListener('click', () => {\n if (this.hasDragged) return;\n onClick();\n });\n return btn;\n }\n\n create(): HTMLDivElement {\n // Container\n this.container = document.createElement('div');\n this.container.className = 'uidex-container';\n\n // Button group\n this.group = document.createElement('div');\n this.group.className = 'uidex-trigger-group';\n\n this.inspectBtn = this.createButton('inspect', 'Toggle select mode', 'Select mode', createSelectSVG(), () => this.options.onInspectToggle?.(), true);\n this.copyBtn = this.createButton('copy', 'Toggle copy mode', 'Copy mode', createCopySVG(), () => this.options.onCopyToggle?.(), true);\n this.feedbackBtn = this.createButton('feedback', 'Toggle feedback mode', 'Feedback mode', createFeedbackSVG(), () => this.options.onFeedbackToggle?.(), true);\n this.expandBtn = this.createButton('expand', 'Open panel', 'Open panel', createListSVG(), () => this.options.onExpandClick?.());\n\n // Assemble: inspect | copy | feedback | expand\n const buttons = [this.inspectBtn, this.copyBtn, this.feedbackBtn, this.expandBtn];\n for (let i = 0; i < buttons.length; i++) {\n if (i > 0) {\n const divider = document.createElement('div');\n divider.className = 'uidex-trigger-divider';\n this.group.appendChild(divider);\n }\n this.group.appendChild(buttons[i]);\n }\n\n // Drag support on the group\n this.group.addEventListener('pointerdown', this.boundPointerDown);\n\n this.container.appendChild(this.group);\n\n return this.container;\n }\n\n destroy(): void {\n document.removeEventListener('pointermove', this.boundPointerMove);\n document.removeEventListener('pointerup', this.boundPointerUp);\n if (this.container && this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.container = null;\n this.group = null;\n this.expandBtn = null;\n this.inspectBtn = null;\n this.copyBtn = null;\n this.feedbackBtn = null;\n }\n\n // ——— Drag handling ———\n\n private handlePointerDown(e: PointerEvent): void {\n if (!this.container) return;\n\n this.hasDragged = false;\n this.isDragging = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n\n // Get current position from computed style\n const rect = this.container.getBoundingClientRect();\n this.dragStartLeft = rect.left;\n this.dragStartTop = rect.top;\n\n this.container.classList.add('uidex-container--dragging');\n\n document.addEventListener('pointermove', this.boundPointerMove);\n document.addEventListener('pointerup', this.boundPointerUp);\n }\n\n private handlePointerMove(e: PointerEvent): void {\n if (!this.isDragging || !this.container) return;\n\n const dx = e.clientX - this.dragStartX;\n const dy = e.clientY - this.dragStartY;\n\n // Only start visual drag after 4px threshold\n if (!this.hasDragged && Math.abs(dx) < 4 && Math.abs(dy) < 4) return;\n this.hasDragged = true;\n\n const newLeft = this.dragStartLeft + dx;\n const newTop = this.dragStartTop + dy;\n\n // Remove all position classes and use absolute positioning\n this.container.classList.remove(\n 'uidex-bottom-right',\n 'uidex-bottom-left',\n 'uidex-top-right',\n 'uidex-top-left'\n );\n\n this.container.style.left = `${newLeft}px`;\n this.container.style.top = `${newTop}px`;\n this.container.style.right = 'auto';\n this.container.style.bottom = 'auto';\n }\n\n private handlePointerUp(): void {\n if (!this.isDragging || !this.container) return;\n\n this.isDragging = false;\n this.container.classList.remove('uidex-container--dragging');\n\n document.removeEventListener('pointermove', this.boundPointerMove);\n document.removeEventListener('pointerup', this.boundPointerUp);\n\n if (!this.hasDragged) return;\n\n // Snap to nearest corner\n this.snapToCorner();\n }\n\n private snapToCorner(): void {\n if (!this.container) return;\n\n const rect = this.container.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const vpW = window.innerWidth;\n const vpH = window.innerHeight;\n\n const isRight = centerX > vpW / 2;\n const isBottom = centerY > vpH / 2;\n\n let corner: ButtonPosition;\n if (isBottom && isRight) corner = 'bottom-right';\n else if (isBottom && !isRight) corner = 'bottom-left';\n else if (!isBottom && isRight) corner = 'top-right';\n else corner = 'top-left';\n\n // Reset inline styles and apply corner class\n this.container.style.left = '';\n this.container.style.top = '';\n this.container.style.right = '';\n this.container.style.bottom = '';\n\n this.container.classList.add(POSITION_CLASSES[corner]);\n }\n}\n","export function classNames(\n ...classes: (string | undefined | null | false)[]\n): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport function getContrastColor(hexColor: string): string {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.5 ? '#000000' : '#ffffff';\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const hexValue = hex.replace('#', '');\n const r = parseInt(hexValue.substring(0, 2), 16);\n const g = parseInt(hexValue.substring(2, 4), 16);\n const b = parseInt(hexValue.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport function resolveColor(\n color: string | undefined,\n colorMap?: Record<string, string>\n): string | undefined {\n if (!color) return undefined;\n if (color.startsWith('#')) return color;\n return colorMap?.[color] ?? color;\n}\n","import type { OverlayOptions, LabelPosition } from './types';\nimport { classNames, getContrastColor, resolveColor } from './utils';\n\n// Default matches --uidex-color-primary in style.css\nconst DEFAULT_COLOR = '#e5e5e5';\nconst DEFAULT_BORDER_STYLE = 'solid';\nconst DEFAULT_BORDER_WIDTH = 2;\nconst DEFAULT_LABEL_POSITION: LabelPosition = 'top-left';\n\nconst LABEL_POSITION_CLASSES: Record<LabelPosition, string> = {\n 'top-left': 'uidex-label-top-left',\n 'top-right': 'uidex-label-top-right',\n 'bottom-left': 'uidex-label-bottom-left',\n 'bottom-right': 'uidex-label-bottom-right',\n};\n\nexport class Overlay {\n private element: HTMLDivElement | null = null;\n private labelElement: HTMLSpanElement | null = null;\n private target: HTMLElement | null = null;\n private options: OverlayOptions;\n private boundUpdatePosition: () => void;\n private rafId: number | null = null;\n\n constructor(options: OverlayOptions = {}) {\n this.options = options;\n this.boundUpdatePosition = () => {\n if (this.rafId !== null) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.updatePosition();\n });\n };\n }\n\n show(target: HTMLElement, label?: string): void {\n this.target = target;\n\n if (!this.element) {\n this.createElement();\n }\n\n if (label !== undefined) {\n this.options.label = label;\n }\n\n this.updateLabel();\n this.updatePosition();\n this.addListeners();\n\n if (this.element && !this.element.parentNode) {\n document.body.appendChild(this.element);\n }\n }\n\n hide(): void {\n this.removeListeners();\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.target = null;\n }\n\n destroy(): void {\n this.hide();\n this.element = null;\n this.labelElement = null;\n }\n\n updateOptions(options: Partial<OverlayOptions>): void {\n this.options = { ...this.options, ...options };\n this.updateStyles();\n this.updateLabel();\n }\n\n private createElement(): void {\n this.element = document.createElement('div');\n this.element.className = 'uidex-overlay';\n this.element.setAttribute('data-testid', 'annotation-overlay');\n\n // Critical positioning styles are set inline because the overlay\n // lives in document.body, outside the Shadow DOM where the CSS is.\n this.element.style.position = 'fixed';\n this.element.style.pointerEvents = 'none';\n this.element.style.zIndex = '2147483645';\n\n this.labelElement = document.createElement('span');\n this.element.appendChild(this.labelElement);\n\n this.updateStyles();\n }\n\n private updateStyles(): void {\n if (!this.element) return;\n\n const {\n color,\n borderStyle = DEFAULT_BORDER_STYLE,\n borderWidth = DEFAULT_BORDER_WIDTH,\n colors,\n } = this.options;\n\n const resolvedColor = resolveColor(color, colors) ?? DEFAULT_COLOR;\n\n this.element.style.borderColor = resolvedColor;\n this.element.style.borderWidth = `${borderWidth}px`;\n this.element.style.borderStyle = borderStyle;\n }\n\n private updateLabel(): void {\n if (!this.labelElement) return;\n\n const {\n label,\n showLabel = true,\n labelPosition = DEFAULT_LABEL_POSITION,\n color,\n colors,\n } = this.options;\n\n if (!showLabel || !label) {\n this.labelElement.style.display = 'none';\n return;\n }\n\n const resolvedColor = resolveColor(color, colors) ?? DEFAULT_COLOR;\n\n this.labelElement.style.display = '';\n this.labelElement.className = classNames(\n 'uidex-label',\n LABEL_POSITION_CLASSES[labelPosition]\n );\n\n // Inline styles required because the overlay lives outside the Shadow DOM\n this.labelElement.style.position = 'absolute';\n this.labelElement.style.fontFamily =\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace';\n this.labelElement.style.fontSize = '11px';\n this.labelElement.style.fontWeight = '500';\n this.labelElement.style.padding = '2px 6px';\n this.labelElement.style.borderRadius = '4px';\n this.labelElement.style.whiteSpace = 'nowrap';\n this.labelElement.style.backgroundColor = resolvedColor;\n this.labelElement.style.color = getContrastColor(resolvedColor);\n this.labelElement.textContent = label;\n\n // Position the label relative to the overlay\n this.applyLabelPosition(labelPosition);\n }\n\n private applyLabelPosition(position: LabelPosition): void {\n if (!this.labelElement) return;\n\n // Reset all positioning\n this.labelElement.style.top = '';\n this.labelElement.style.bottom = '';\n this.labelElement.style.left = '';\n this.labelElement.style.right = '';\n this.labelElement.style.transform = '';\n\n switch (position) {\n case 'top-left':\n this.labelElement.style.top = '-8px';\n this.labelElement.style.left = '-2px';\n this.labelElement.style.transform = 'translateY(-100%)';\n break;\n case 'top-right':\n this.labelElement.style.top = '-8px';\n this.labelElement.style.right = '-2px';\n this.labelElement.style.transform = 'translateY(-100%)';\n break;\n case 'bottom-left':\n this.labelElement.style.bottom = '-8px';\n this.labelElement.style.left = '-2px';\n this.labelElement.style.transform = 'translateY(100%)';\n break;\n case 'bottom-right':\n this.labelElement.style.bottom = '-8px';\n this.labelElement.style.right = '-2px';\n this.labelElement.style.transform = 'translateY(100%)';\n break;\n }\n }\n\n private updatePosition(): void {\n if (!this.element || !this.target) return;\n\n const rect = this.target.getBoundingClientRect();\n\n // position: fixed is viewport-relative, matching getBoundingClientRect()\n this.element.style.top = `${rect.top}px`;\n this.element.style.left = `${rect.left}px`;\n this.element.style.width = `${rect.width}px`;\n this.element.style.height = `${rect.height}px`;\n }\n\n private addListeners(): void {\n window.addEventListener('resize', this.boundUpdatePosition);\n window.addEventListener('scroll', this.boundUpdatePosition, { capture: true, passive: true });\n }\n\n private removeListeners(): void {\n window.removeEventListener('resize', this.boundUpdatePosition);\n window.removeEventListener('scroll', this.boundUpdatePosition, { capture: true } as EventListenerOptions);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n}\n","import type { KeyboardShortcut } from './types';\n\nconst DEFAULT_SHORTCUT: KeyboardShortcut = {\n key: 'u',\n shiftKey: true,\n metaKey: true,\n};\n\nconst INSPECTING_CLASS = 'uidex-inspecting';\nconst INSPECTING_STYLE_ID = 'uidex-inspecting-style';\nconst INSPECTING_CSS = `body.${INSPECTING_CLASS},body.${INSPECTING_CLASS} *{cursor:crosshair!important}`;\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return (\n target.isContentEditable ||\n target.getAttribute('contenteditable') === 'true' ||\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT'\n );\n}\n\nfunction matchesShortcut(e: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n return (\n e.key.toLowerCase() === shortcut.key.toLowerCase() &&\n !!e.ctrlKey === !!shortcut.ctrlKey &&\n !!e.shiftKey === !!shortcut.shiftKey &&\n !!e.altKey === !!shortcut.altKey &&\n !!e.metaKey === !!shortcut.metaKey\n );\n}\n\nfunction findAnnotatedAncestor(\n target: EventTarget\n): { element: HTMLElement; id: string } | null {\n if (!(target instanceof Element)) return null;\n if (target.closest('.uidex-container')) return null;\n const annotated = target.closest('[data-uidex]');\n if (!(annotated instanceof HTMLElement)) return null;\n const id = annotated.getAttribute('data-uidex');\n if (!id) return null;\n return { element: annotated, id };\n}\n\nexport interface InspectorOptions {\n shortcut?: KeyboardShortcut;\n onHighlight?: (element: HTMLElement | null, id: string | null) => void;\n onSelect?: (element: HTMLElement, id: string) => void;\n onActivate?: () => void;\n onDeactivate?: () => void;\n}\n\nexport class Inspector {\n private active = false;\n private shortcut: KeyboardShortcut;\n private currentTarget: HTMLElement | null = null;\n\n private onHighlight: InspectorOptions['onHighlight'];\n private onSelect: InspectorOptions['onSelect'];\n private onActivate: InspectorOptions['onActivate'];\n private onDeactivate: InspectorOptions['onDeactivate'];\n\n private boundKeyDown: (e: KeyboardEvent) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundClick: (e: MouseEvent) => void;\n\n constructor(options: InspectorOptions = {}) {\n this.shortcut = options.shortcut ?? DEFAULT_SHORTCUT;\n this.onHighlight = options.onHighlight;\n this.onSelect = options.onSelect;\n this.onActivate = options.onActivate;\n this.onDeactivate = options.onDeactivate;\n\n this.boundKeyDown = this.handleKeyDown.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundClick = this.handleClick.bind(this);\n }\n\n mount(): void {\n document.addEventListener('keydown', this.boundKeyDown);\n\n // Inject inspect-mode cursor style into the document (not shadow DOM)\n if (!document.getElementById(INSPECTING_STYLE_ID)) {\n const style = document.createElement('style');\n style.id = INSPECTING_STYLE_ID;\n style.textContent = INSPECTING_CSS;\n document.head.appendChild(style);\n }\n }\n\n destroy(): void {\n if (this.active) {\n this.deactivate();\n }\n document.removeEventListener('keydown', this.boundKeyDown);\n document.getElementById(INSPECTING_STYLE_ID)?.remove();\n }\n\n activate(): void {\n if (this.active) return;\n this.active = true;\n this.currentTarget = null;\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('click', this.boundClick, true);\n document.body.classList.add(INSPECTING_CLASS);\n\n this.onActivate?.();\n }\n\n deactivate(): void {\n if (!this.active) return;\n this.active = false;\n this.currentTarget = null;\n\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('click', this.boundClick, true);\n document.body.classList.remove(INSPECTING_CLASS);\n\n this.onHighlight?.(null, null);\n this.onDeactivate?.();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n private handleKeyDown(e: KeyboardEvent): void {\n if (this.active && e.key === 'Escape') {\n e.preventDefault();\n this.deactivate();\n return;\n }\n\n if (isEditableTarget(e.target)) return;\n\n if (matchesShortcut(e, this.shortcut)) {\n e.preventDefault();\n if (this.active) {\n this.deactivate();\n } else {\n this.activate();\n }\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const result = findAnnotatedAncestor(e.target!);\n\n if (result) {\n if (result.element !== this.currentTarget) {\n this.currentTarget = result.element;\n this.onHighlight?.(result.element, result.id);\n }\n } else if (this.currentTarget) {\n this.currentTarget = null;\n this.onHighlight?.(null, null);\n }\n }\n\n private handleClick(e: MouseEvent): void {\n if (!(e.target instanceof Element)) return;\n\n // Don't intercept clicks on uidex's own UI\n if (e.target.closest('.uidex-container')) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const result = findAnnotatedAncestor(e.target);\n if (result) {\n this.onSelect?.(result.element, result.id);\n }\n\n this.deactivate();\n }\n}\n","import type { ConsoleLogEntry, NetworkErrorEntry, FeedbackReport } from './types';\n\nconst MAX_CONSOLE_LOGS = 50;\nconst MAX_NETWORK_ERRORS = 20;\n\n// Saved before any interception so submitFeedback always uses the real fetch.\nlet nativeFetch: typeof fetch | null = null;\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport class IngestCapture {\n private consoleLogs: ConsoleLogEntry[] = [];\n private networkErrors: NetworkErrorEntry[] = [];\n private originalConsoleWarn: typeof console.warn | null = null;\n private originalConsoleError: typeof console.error | null = null;\n private originalFetch: typeof fetch | null = null;\n\n constructor(\n private captureConsole: boolean,\n private captureNetwork: boolean,\n ) {}\n\n start(): void {\n this.consoleLogs = [];\n this.networkErrors = [];\n if (this.captureConsole) this.interceptConsole();\n if (this.captureNetwork) this.interceptNetwork();\n }\n\n stop(): void {\n this.restoreConsole();\n this.restoreNetwork();\n }\n\n getConsoleLogs(): ConsoleLogEntry[] {\n return [...this.consoleLogs];\n }\n\n getNetworkErrors(): NetworkErrorEntry[] {\n return [...this.networkErrors];\n }\n\n private interceptConsole(): void {\n if (this.originalConsoleWarn) return;\n this.originalConsoleWarn = console.warn;\n this.originalConsoleError = console.error;\n\n console.warn = (...args: unknown[]) => {\n this.addConsoleLog('warn', args);\n this.originalConsoleWarn!.apply(console, args);\n };\n\n console.error = (...args: unknown[]) => {\n this.addConsoleLog('error', args);\n this.originalConsoleError!.apply(console, args);\n };\n }\n\n private addConsoleLog(level: 'warn' | 'error', args: unknown[]): void {\n this.consoleLogs.push({\n level,\n message: args.map(safeStringify).join(' '),\n timestamp: new Date().toISOString(),\n });\n if (this.consoleLogs.length > MAX_CONSOLE_LOGS) {\n this.consoleLogs.shift();\n }\n }\n\n private restoreConsole(): void {\n if (this.originalConsoleWarn) {\n console.warn = this.originalConsoleWarn;\n this.originalConsoleWarn = null;\n }\n if (this.originalConsoleError) {\n console.error = this.originalConsoleError;\n this.originalConsoleError = null;\n }\n }\n\n private interceptNetwork(): void {\n if (this.originalFetch) return;\n this.originalFetch = window.fetch;\n if (!nativeFetch) nativeFetch = this.originalFetch;\n\n window.fetch = async (...args: Parameters<typeof fetch>) => {\n try {\n const response = await this.originalFetch!.apply(window, args);\n if (!response.ok) {\n this.addNetworkError(args[0], args[1]?.method, response.status, response.statusText);\n }\n return response;\n } catch (error) {\n this.addNetworkError(\n args[0],\n args[1]?.method,\n null,\n error instanceof Error ? error.message : 'Network error',\n );\n throw error;\n }\n };\n }\n\n private addNetworkError(\n input: RequestInfo | URL,\n method: string | undefined,\n status: number | null,\n statusText: string,\n ): void {\n let url: string;\n if (typeof input === 'string') {\n url = input;\n } else if (input instanceof URL) {\n url = input.href;\n } else {\n url = (input as Request).url;\n method ??= (input as Request).method;\n }\n this.networkErrors.push({\n url,\n method: method ?? 'GET',\n status,\n statusText,\n timestamp: new Date().toISOString(),\n });\n if (this.networkErrors.length > MAX_NETWORK_ERRORS) {\n this.networkErrors.shift();\n }\n }\n\n private restoreNetwork(): void {\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n }\n}\n\nexport function generateSessionId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport async function submitFeedback(\n endpoint: string,\n apiKey: string,\n report: FeedbackReport,\n): Promise<{ id: string; sequenceNumber: number }> {\n // Use the native fetch to avoid self-capture by IngestCapture.\n const fetchFn = nativeFetch ?? fetch;\n const response = await fetchFn(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(report),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Ingest failed (${response.status}): ${text}`);\n }\n\n return response.json();\n}\n","import type {\n UidexLocation,\n UidexMap,\n FeedbackReport,\n FeedbackResult,\n FeedbackType,\n FeedbackSeverity,\n IngestConfig,\n ConsoleLogEntry,\n NetworkErrorEntry,\n} from './types';\nimport { submitFeedback } from './ingest';\n\nexport type ModalView =\n | { type: 'page'; dir: string }\n | { type: 'feature'; dir: string }\n | { type: 'component'; id: string }\n | { type: 'graph' };\n\nexport interface ModalPage {\n title: string;\n dir: string;\n content: string;\n componentIds: string[];\n}\n\nexport interface ModalFeature {\n title: string;\n dir: string;\n content: string;\n componentIds: string[];\n}\n\nexport interface ModalData {\n pages: ModalPage[];\n features: ModalFeature[];\n components: UidexMap;\n presentIds: Set<string>;\n}\n\nexport interface ModalOptions {\n onComponentNavigate?: (id: string) => void;\n elementGetter?: (id: string) => Element | null;\n ingest?: IngestConfig;\n onSubmit?: (report: FeedbackReport, result: FeedbackResult) => void;\n sessionId?: string;\n getConsoleLogs?: () => ConsoleLogEntry[];\n getNetworkErrors?: () => NetworkErrorEntry[];\n}\n\nexport class Modal {\n private backdrop: HTMLDivElement | null = null;\n private sidebar: HTMLDivElement | null = null;\n private mainContent: HTMLDivElement | null = null;\n private renderTarget: ShadowRoot | HTMLElement = document.body;\n private boundKeyDown: (e: KeyboardEvent) => void;\n\n private data: ModalData = {\n pages: [],\n features: [],\n components: {},\n presentIds: new Set(),\n };\n\n private currentView: ModalView | null = null;\n private modalType: 'panel' | 'feedback' | null = null;\n private sidebarLevel: 'root' | 'pages' | 'features' | 'components' = 'root';\n private expandedGroups: Set<string> = new Set();\n private searchQuery = '';\n private searchInput: HTMLInputElement | null = null;\n private options: ModalOptions;\n\n private static readonly VIEW_TYPE_TO_LEVEL = {\n page: 'pages',\n feature: 'features',\n component: 'components',\n graph: 'root',\n } as const;\n\n /** Strip the scanner root dir (e.g. \"app\") so pages display as routes: app → /, app/foo → /foo */\n private static formatPageDir(dir: string): string {\n const parts = dir.split('/');\n // Remove the first segment (scanner root like \"app\" or \"src\")\n const route = parts.slice(1).join('/');\n return '/' + route;\n }\n\n constructor(options: ModalOptions = {}) {\n this.options = options;\n this.boundKeyDown = this.handleKeyDown.bind(this);\n }\n\n /** Set the shadow root to render modals into. */\n setShadowRoot(root: ShadowRoot): void {\n this.renderTarget = root;\n }\n\n /** Update the data model. Refreshes sidebar and content if modal is open. */\n setData(data: ModalData): void {\n this.data = data;\n if (this.backdrop) {\n this.renderSidebar();\n if (this.currentView) {\n this.renderMainContent(this.currentView);\n }\n }\n }\n\n /** Open the modal. If already open, navigates to the given view. */\n open(view?: ModalView): void {\n if (this.backdrop && this.modalType === 'panel') {\n if (view) this.navigateTo(view);\n return;\n }\n\n this.createShell();\n\n const targetView = view ?? this.getDefaultView();\n if (targetView) {\n this.navigateTo(targetView);\n }\n }\n\n /** Navigate to a view within the open modal. */\n navigateTo(view: ModalView): void {\n this.currentView = view;\n\n // Clear search on navigation\n if (this.searchQuery) {\n this.searchQuery = '';\n if (this.searchInput) this.searchInput.value = '';\n }\n\n // Sync sidebar level to match the view type\n const newLevel = Modal.VIEW_TYPE_TO_LEVEL[view.type];\n const levelChanged = this.sidebarLevel !== newLevel;\n if (levelChanged) {\n this.sidebarLevel = newLevel;\n }\n\n // Auto-expand the group containing this component\n if (view.type === 'component') {\n this.expandedGroups.add(this.getComponentPrefix(view.id));\n }\n\n // Single sidebar render/update\n if (levelChanged || view.type === 'component') {\n this.renderSidebar();\n } else {\n this.updateSidebarActive();\n }\n\n this.renderMainContent(view);\n\n if (view.type === 'component') {\n this.options.onComponentNavigate?.(view.id);\n }\n }\n\n hide(): void {\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n this.backdrop = null;\n this.sidebar = null;\n this.mainContent = null;\n this.currentView = null;\n this.modalType = null;\n this.sidebarLevel = 'root';\n this.expandedGroups = new Set();\n this.searchQuery = '';\n this.searchInput = null;\n document.removeEventListener('keydown', this.boundKeyDown);\n }\n\n destroy(): void {\n this.hide();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n // ——— Default view selection ———\n\n private getDefaultView(): ModalView | null {\n // First visible page (has components on current page)\n const visiblePage = this.data.pages.find((p) =>\n p.componentIds.some((id) => this.data.presentIds.has(id))\n );\n if (visiblePage) return { type: 'page', dir: visiblePage.dir };\n\n if (this.data.pages.length > 0)\n return { type: 'page', dir: this.data.pages[0].dir };\n\n if (this.data.features.length > 0)\n return { type: 'feature', dir: this.data.features[0].dir };\n\n const firstPresent = [...this.data.presentIds][0];\n if (firstPresent) return { type: 'component', id: firstPresent };\n\n const firstId = Object.keys(this.data.components)[0];\n if (firstId) return { type: 'component', id: firstId };\n\n return null;\n }\n\n // ——— Shell creation ———\n\n /**\n * Create the shared modal frame: backdrop, dialog, header (title + close), and mount.\n * Returns the dialog and header elements so callers can append extra header/body content.\n */\n private createModalFrame(opts: {\n type: 'panel' | 'feedback';\n title: string;\n ariaLabel: string;\n }): { dialog: HTMLDivElement; header: HTMLDivElement } {\n this.hide();\n this.modalType = opts.type;\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'uidex-modal-backdrop';\n this.backdrop.addEventListener('click', (e) => {\n if (e.target === this.backdrop) this.hide();\n });\n\n const dialog = document.createElement('div');\n dialog.className = `uidex-modal uidex-modal--${opts.type}`;\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-label', opts.ariaLabel);\n\n const header = document.createElement('div');\n header.className = 'uidex-modal-header';\n\n const title = document.createElement('h2');\n title.className = 'uidex-modal-title';\n title.textContent = opts.title;\n header.appendChild(title);\n\n return { dialog, header };\n }\n\n /** Finalize modal frame: append close button to header, header to dialog, mount to DOM. */\n private mountModalFrame(\n dialog: HTMLDivElement,\n header: HTMLDivElement\n ): void {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'uidex-modal-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.textContent = '\\u00d7';\n closeBtn.addEventListener('click', () => this.hide());\n header.appendChild(closeBtn);\n\n dialog.appendChild(header);\n this.backdrop!.appendChild(dialog);\n this.renderTarget.appendChild(this.backdrop!);\n document.addEventListener('keydown', this.boundKeyDown);\n }\n\n private createShell(): void {\n const { dialog, header } = this.createModalFrame({\n type: 'panel',\n title: 'uidex',\n ariaLabel: 'uidex',\n });\n\n this.searchInput = document.createElement('input');\n this.searchInput.type = 'text';\n this.searchInput.className = 'uidex-search-input';\n this.searchInput.placeholder = 'Search\\u2026';\n this.searchInput.addEventListener('input', () => {\n this.searchQuery = this.searchInput!.value;\n this.renderSidebar();\n });\n this.searchInput.addEventListener('keydown', (e) => {\n if (e.key !== 'Escape' || this.searchQuery) {\n e.stopPropagation();\n }\n\n if (e.key === 'Enter') {\n const results = this.getSearchResults();\n if (results.pages.length > 0) {\n this.navigateTo({ type: 'page', dir: results.pages[0].dir });\n } else if (results.features.length > 0) {\n this.navigateTo({ type: 'feature', dir: results.features[0].dir });\n } else if (results.components.length > 0) {\n this.navigateTo({ type: 'component', id: results.components[0] });\n }\n e.preventDefault();\n }\n if (e.key === 'Escape' && this.searchQuery) {\n this.searchQuery = '';\n this.searchInput!.value = '';\n this.renderSidebar();\n }\n });\n header.appendChild(this.searchInput);\n\n this.mountModalFrame(dialog, header);\n\n // Body: sidebar + main content\n const body = document.createElement('div');\n body.className = 'uidex-panel-body';\n\n this.sidebar = document.createElement('div');\n this.sidebar.className = 'uidex-panel-sidebar';\n this.renderSidebar();\n\n this.mainContent = document.createElement('div');\n this.mainContent.className = 'uidex-panel-main';\n\n body.appendChild(this.sidebar);\n body.appendChild(this.mainContent);\n\n dialog.appendChild(body);\n }\n\n // ——— Sidebar ———\n\n private renderSidebar(): void {\n if (!this.sidebar) return;\n this.sidebar.innerHTML = '';\n\n if (this.searchQuery) {\n this.renderSearchResults();\n } else if (this.sidebarLevel === 'root') {\n this.renderSidebarRoot();\n } else {\n this.renderSidebarSublevel(this.sidebarLevel);\n }\n\n this.updateSidebarActive();\n }\n\n private renderSidebarRoot(): void {\n if (!this.sidebar) return;\n\n const categories: { label: string; level: 'pages' | 'features' | 'components'; count: number }[] = [];\n\n if (this.data.pages.length > 0) {\n categories.push({ label: 'Pages', level: 'pages', count: this.data.pages.length });\n }\n if (this.data.features.length > 0) {\n categories.push({ label: 'Features', level: 'features', count: this.data.features.length });\n }\n const componentCount = Object.keys(this.data.components).length;\n if (componentCount > 0) {\n categories.push({ label: 'Components', level: 'components', count: componentCount });\n }\n\n for (const cat of categories) {\n const item = document.createElement('div');\n item.className = `uidex-sidebar-root-item uidex-sidebar-root-item--${cat.level}`;\n item.addEventListener('click', () => {\n this.sidebarLevel = cat.level;\n this.renderSidebar();\n // Select first item in this category if no current view matches\n if (!this.currentView || !this.currentViewMatchesLevel(cat.level)) {\n const firstView = this.getFirstViewForLevel(cat.level);\n if (firstView) this.navigateTo(firstView);\n }\n });\n\n const label = document.createElement('span');\n label.className = 'uidex-sidebar-root-label';\n label.textContent = cat.label;\n item.appendChild(label);\n\n const count = document.createElement('span');\n count.className = 'uidex-sidebar-count';\n count.textContent = `(${cat.count})`;\n item.appendChild(count);\n\n const chevron = document.createElement('span');\n chevron.className = 'uidex-sidebar-chevron';\n chevron.textContent = '\\u203A';\n item.appendChild(chevron);\n\n this.sidebar.appendChild(item);\n }\n\n // Map item (only if relationships exist)\n const hasRelationships = this.data.pages.length > 0 || this.data.features.length > 0;\n if (hasRelationships) {\n const divider = document.createElement('div');\n divider.className = 'uidex-sidebar-divider';\n this.sidebar.appendChild(divider);\n\n const mapItem = document.createElement('div');\n mapItem.className = 'uidex-sidebar-root-item';\n mapItem.dataset.viewType = 'graph';\n mapItem.addEventListener('click', () => this.navigateTo({ type: 'graph' }));\n\n const mapLabel = document.createElement('span');\n mapLabel.className = 'uidex-sidebar-root-label';\n mapLabel.textContent = 'Map';\n mapItem.appendChild(mapLabel);\n\n const mapChevron = document.createElement('span');\n mapChevron.className = 'uidex-sidebar-chevron';\n mapChevron.textContent = '\\u203A';\n mapItem.appendChild(mapChevron);\n\n this.sidebar.appendChild(mapItem);\n }\n }\n\n private renderSidebarSublevel(level: 'pages' | 'features' | 'components'): void {\n if (!this.sidebar) return;\n\n const labelMap = { pages: 'Pages', features: 'Features', components: 'Components' } as const;\n\n // Back button\n const back = document.createElement('div');\n back.className = 'uidex-sidebar-back';\n back.addEventListener('click', () => {\n this.sidebarLevel = 'root';\n this.renderSidebar();\n });\n\n const arrow = document.createElement('span');\n arrow.className = 'uidex-sidebar-back-arrow';\n arrow.textContent = '\\u2039';\n back.appendChild(arrow);\n\n const backLabel = document.createElement('span');\n backLabel.textContent = labelMap[level];\n back.appendChild(backLabel);\n\n this.sidebar.appendChild(back);\n\n // Items\n if (level === 'pages') {\n for (const page of this.data.pages) {\n const hasVisible = page.componentIds.some((id) => this.data.presentIds.has(id));\n const item = this.createSidebarItem(Modal.formatPageDir(page.dir), !hasVisible);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--pages');\n item.dataset.viewType = 'page';\n item.dataset.viewId = page.dir;\n item.addEventListener('click', () => this.navigateTo({ type: 'page', dir: page.dir }));\n this.sidebar.appendChild(item);\n }\n } else if (level === 'features') {\n for (const feature of this.data.features) {\n const hasVisible = feature.componentIds.some((id) => this.data.presentIds.has(id));\n const item = this.createSidebarItem(feature.title, !hasVisible);\n item.classList.add('uidex-sidebar-item--features');\n item.dataset.viewType = 'feature';\n item.dataset.viewId = feature.dir;\n item.addEventListener('click', () => this.navigateTo({ type: 'feature', dir: feature.dir }));\n this.sidebar.appendChild(item);\n }\n } else {\n const groups = this.groupComponentsByPrefix(Object.keys(this.data.components));\n\n // Auto-expand if there's only one group\n if (groups.size === 1) {\n const onlyKey = groups.keys().next().value!;\n this.expandedGroups.add(onlyKey);\n }\n\n for (const [prefix, ids] of groups) {\n const isExpanded = this.expandedGroups.has(prefix);\n\n // Group header\n const header = document.createElement('div');\n header.className = 'uidex-sidebar-group-header';\n if (isExpanded) header.classList.add('uidex-sidebar-group-header--expanded');\n header.addEventListener('click', () => {\n if (this.expandedGroups.has(prefix)) {\n this.expandedGroups.delete(prefix);\n } else {\n this.expandedGroups.add(prefix);\n }\n this.renderSidebar();\n });\n\n const chevron = document.createElement('span');\n chevron.className = 'uidex-sidebar-group-chevron';\n chevron.textContent = '\\u203A';\n header.appendChild(chevron);\n\n const label = document.createElement('span');\n label.className = 'uidex-sidebar-group-label';\n label.textContent = prefix;\n header.appendChild(label);\n\n const count = document.createElement('span');\n count.className = 'uidex-sidebar-group-count';\n count.textContent = `${ids.length}`;\n header.appendChild(count);\n\n this.sidebar.appendChild(header);\n\n // Expanded items\n if (isExpanded) {\n for (const id of ids) {\n const isPresent = this.data.presentIds.has(id);\n const item = this.createSidebarItem(id, !isPresent);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--grouped', 'uidex-sidebar-item--components');\n item.dataset.viewType = 'component';\n item.dataset.viewId = id;\n item.addEventListener('click', () => this.navigateTo({ type: 'component', id }));\n this.sidebar.appendChild(item);\n }\n }\n }\n }\n }\n\n private currentViewMatchesLevel(level: 'pages' | 'features' | 'components'): boolean {\n if (!this.currentView) return false;\n return Modal.VIEW_TYPE_TO_LEVEL[this.currentView.type] === level;\n }\n\n private getFirstViewForLevel(level: 'pages' | 'features' | 'components'): ModalView | null {\n if (level === 'pages' && this.data.pages.length > 0) {\n return { type: 'page', dir: this.data.pages[0].dir };\n }\n if (level === 'features' && this.data.features.length > 0) {\n return { type: 'feature', dir: this.data.features[0].dir };\n }\n if (level === 'components') {\n const firstId = Object.keys(this.data.components)[0];\n if (firstId) return { type: 'component', id: firstId };\n }\n return null;\n }\n\n private getComponentPrefix(id: string): string {\n const dashIndex = id.indexOf('-');\n return dashIndex === -1 ? id : id.substring(0, dashIndex);\n }\n\n private groupComponentsByPrefix(ids: string[]): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const id of ids) {\n const prefix = this.getComponentPrefix(id);\n let group = groups.get(prefix);\n if (!group) {\n group = [];\n groups.set(prefix, group);\n }\n group.push(id);\n }\n return groups;\n }\n\n private createSidebarItem(text: string, dimmed: boolean): HTMLDivElement {\n const item = document.createElement('div');\n item.className = 'uidex-sidebar-item';\n if (dimmed) item.classList.add('uidex-sidebar-item--dimmed');\n item.textContent = text;\n return item;\n }\n\n private updateSidebarActive(): void {\n if (!this.sidebar || !this.currentView) return;\n\n // Map item active state\n const mapItem = this.sidebar.querySelector('[data-view-type=\"graph\"]');\n if (mapItem) {\n (mapItem as HTMLElement).classList.toggle(\n 'uidex-sidebar-root-item--active',\n this.currentView.type === 'graph'\n );\n }\n\n if (this.currentView.type === 'graph') return;\n\n const activeId =\n this.currentView.type === 'component'\n ? this.currentView.id\n : this.currentView.dir;\n\n for (const el of this.sidebar.querySelectorAll('.uidex-sidebar-item')) {\n const item = el as HTMLElement;\n const matches =\n item.dataset.viewType === this.currentView.type &&\n item.dataset.viewId === activeId;\n item.classList.toggle('uidex-sidebar-item--active', matches);\n }\n }\n\n // ——— Search ———\n\n private getSearchResults(): {\n pages: ModalPage[];\n features: ModalFeature[];\n components: string[];\n } {\n const q = this.searchQuery.toLowerCase();\n return {\n pages: this.data.pages.filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n Modal.formatPageDir(p.dir).toLowerCase().includes(q)\n ),\n features: this.data.features.filter(\n (f) =>\n f.title.toLowerCase().includes(q) || f.dir.toLowerCase().includes(q)\n ),\n components: Object.keys(this.data.components).filter((id) => {\n if (id.toLowerCase().includes(q)) return true;\n const doc = this.data.components[id]?.find((l) => l.doc)?.doc;\n return doc ? doc.toLowerCase().includes(q) : false;\n }),\n };\n }\n\n private renderSearchResults(): void {\n if (!this.sidebar) return;\n\n const results = this.getSearchResults();\n const hasResults =\n results.pages.length > 0 ||\n results.features.length > 0 ||\n results.components.length > 0;\n\n if (!hasResults) {\n const empty = document.createElement('div');\n empty.className = 'uidex-search-empty';\n empty.textContent = 'No results';\n this.sidebar.appendChild(empty);\n return;\n }\n\n if (results.pages.length > 0) {\n const label = document.createElement('div');\n label.className = 'uidex-search-group-label uidex-search-group-label--pages';\n label.textContent = 'Pages';\n this.sidebar.appendChild(label);\n\n for (const page of results.pages) {\n const item = this.createSidebarItem(Modal.formatPageDir(page.dir), false);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--pages');\n item.addEventListener('click', () =>\n this.navigateTo({ type: 'page', dir: page.dir })\n );\n this.sidebar.appendChild(item);\n }\n }\n\n if (results.features.length > 0) {\n const label = document.createElement('div');\n label.className = 'uidex-search-group-label uidex-search-group-label--features';\n label.textContent = 'Features';\n this.sidebar.appendChild(label);\n\n for (const feature of results.features) {\n const item = this.createSidebarItem(feature.title, false);\n item.classList.add('uidex-sidebar-item--features');\n item.addEventListener('click', () =>\n this.navigateTo({ type: 'feature', dir: feature.dir })\n );\n this.sidebar.appendChild(item);\n }\n }\n\n if (results.components.length > 0) {\n const label = document.createElement('div');\n label.className = 'uidex-search-group-label uidex-search-group-label--components';\n label.textContent = 'Components';\n this.sidebar.appendChild(label);\n\n for (const id of results.components) {\n const item = this.createSidebarItem(id, false);\n item.classList.add('uidex-sidebar-item--mono', 'uidex-sidebar-item--components');\n item.addEventListener('click', () =>\n this.navigateTo({ type: 'component', id })\n );\n this.sidebar.appendChild(item);\n }\n }\n }\n\n // ——— Main content rendering ———\n\n private renderMainContent(view: ModalView): void {\n if (!this.mainContent) return;\n this.mainContent.innerHTML = '';\n this.mainContent.scrollTop = 0;\n\n switch (view.type) {\n case 'page':\n this.renderPageView(view.dir);\n break;\n case 'feature':\n this.renderFeatureView(view.dir);\n break;\n case 'component':\n this.renderComponentView(view.id);\n break;\n case 'graph':\n this.renderGraphView();\n break;\n }\n }\n\n private renderPageView(dir: string): void {\n const page = this.data.pages.find((p) => p.dir === dir);\n if (!page || !this.mainContent) return;\n\n const title = document.createElement('h3');\n title.className = 'uidex-main-title';\n title.textContent = page.title;\n this.mainContent.appendChild(title);\n\n const dirCode = document.createElement('code');\n dirCode.className = 'uidex-modal-code';\n dirCode.textContent = Modal.formatPageDir(page.dir);\n this.mainContent.appendChild(dirCode);\n\n if (page.content.trim()) {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section uidex-modal-section--spaced';\n section.appendChild(this.renderMarkdown(page.content));\n this.mainContent.appendChild(section);\n }\n\n // Related features\n const pageComponentSet = new Set(page.componentIds);\n const relatedFeatures = this.data.features.filter((f) =>\n f.componentIds.some((cid) => pageComponentSet.has(cid))\n );\n if (relatedFeatures.length > 0) {\n this.mainContent.appendChild(\n this.createFeatureChipsSection(relatedFeatures)\n );\n }\n\n if (page.componentIds.length > 0) {\n this.mainContent.appendChild(\n this.createComponentChipsSection(page.componentIds, (id) =>\n this.navigateTo({ type: 'component', id })\n )\n );\n }\n }\n\n private renderFeatureView(dir: string): void {\n const feature = this.data.features.find((f) => f.dir === dir);\n if (!feature || !this.mainContent) return;\n\n const badge = document.createElement('div');\n badge.className = 'uidex-badge uidex-badge--features';\n badge.textContent = 'Feature';\n this.mainContent.appendChild(badge);\n\n const title = document.createElement('h3');\n title.className = 'uidex-main-title';\n title.textContent = feature.title;\n this.mainContent.appendChild(title);\n\n const dirCode = document.createElement('code');\n dirCode.className = 'uidex-modal-code';\n dirCode.textContent = feature.dir;\n this.mainContent.appendChild(dirCode);\n\n if (feature.content.trim()) {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section uidex-modal-section--spaced';\n section.appendChild(this.renderMarkdown(feature.content));\n this.mainContent.appendChild(section);\n }\n\n if (feature.componentIds.length > 0) {\n const absentIds = new Set(\n feature.componentIds.filter((id) => !this.data.presentIds.has(id))\n );\n this.mainContent.appendChild(\n this.createComponentChipsSection(\n feature.componentIds,\n (id) => this.navigateTo({ type: 'component', id }),\n absentIds\n )\n );\n }\n }\n\n private renderComponentView(id: string): void {\n if (!this.mainContent) return;\n\n const locations = this.data.components[id] ?? [];\n const element = this.options.elementGetter?.(id) ?? null;\n\n // Component name\n const title = document.createElement('h3');\n title.className = 'uidex-main-title uidex-main-title--mono';\n title.textContent = id;\n this.mainContent.appendChild(title);\n\n // Absent indicator\n if (!this.data.presentIds.has(id)) {\n const notice = document.createElement('div');\n notice.className = 'uidex-absent-notice';\n notice.textContent = 'Not on current page';\n this.mainContent.appendChild(notice);\n }\n\n // Feature membership\n const parentFeatures = this.data.features.filter((f) =>\n f.componentIds.includes(id)\n );\n if (parentFeatures.length > 0) {\n this.mainContent.appendChild(\n this.createFeatureChipsSection(parentFeatures)\n );\n }\n\n // Doc/description\n const doc = locations.find((l) => l.doc)?.doc;\n if (doc) {\n const docSection = document.createElement('div');\n docSection.className = 'uidex-modal-section';\n const docLabel = document.createElement('div');\n docLabel.className = 'uidex-modal-label';\n docLabel.textContent = 'Description';\n const docText = document.createElement('p');\n docText.className = 'uidex-modal-doc';\n docText.textContent = doc;\n docSection.appendChild(docLabel);\n docSection.appendChild(docText);\n this.mainContent.appendChild(docSection);\n }\n\n // Element info\n if (element) {\n const elSection = document.createElement('div');\n elSection.className = 'uidex-modal-section';\n const elLabel = document.createElement('div');\n elLabel.className = 'uidex-modal-label';\n elLabel.textContent = 'Element';\n const elCode = document.createElement('code');\n elCode.className = 'uidex-modal-code';\n elCode.textContent = this.describeElement(element);\n elSection.appendChild(elLabel);\n elSection.appendChild(elCode);\n this.mainContent.appendChild(elSection);\n }\n\n // Source file locations\n if (locations.length > 0) {\n const locSection = document.createElement('div');\n locSection.className = 'uidex-modal-section';\n const locLabel = document.createElement('div');\n locLabel.className = 'uidex-modal-label';\n locLabel.textContent = locations.length === 1 ? 'Source' : 'Sources';\n locSection.appendChild(locLabel);\n\n for (const loc of locations) {\n const row = document.createElement('div');\n row.className = 'uidex-modal-location';\n\n const pathText = document.createElement('code');\n pathText.className = 'uidex-modal-code';\n pathText.textContent = `${loc.filePath}:${loc.line}`;\n\n const copyBtn = document.createElement('button');\n copyBtn.className = 'uidex-modal-copy';\n copyBtn.textContent = 'Copy';\n copyBtn.addEventListener('click', () => {\n navigator.clipboard\n .writeText(`${loc.filePath}:${loc.line}`)\n .then(() => {\n copyBtn.textContent = 'Copied!';\n setTimeout(() => {\n copyBtn.textContent = 'Copy';\n }, 1500);\n })\n .catch(() => {});\n });\n\n row.appendChild(pathText);\n row.appendChild(copyBtn);\n locSection.appendChild(row);\n }\n\n this.mainContent.appendChild(locSection);\n }\n\n // Environment info\n const env = this.collectEnv();\n const envSection = document.createElement('div');\n envSection.className = 'uidex-modal-section';\n const envLabel = document.createElement('div');\n envLabel.className = 'uidex-modal-label';\n envLabel.textContent = 'Environment';\n envSection.appendChild(envLabel);\n\n const envItems = [\n `${env.viewport.width} \\u00d7 ${env.viewport.height} viewport`,\n env.browserName,\n window.location.hostname + window.location.pathname,\n ];\n for (const item of envItems) {\n const envLine = document.createElement('div');\n envLine.className = 'uidex-modal-env-item';\n envLine.textContent = item;\n envSection.appendChild(envLine);\n }\n this.mainContent.appendChild(envSection);\n }\n\n // ——— Graph view ———\n\n private renderGraphView(): void {\n if (!this.mainContent) return;\n\n const pages = this.data.pages;\n const features = this.data.features;\n const allComponentIds = Object.keys(this.data.components);\n\n // Determine which components are connected to pages/features\n const connectedIds = new Set<string>();\n for (const p of pages) {\n for (const cid of p.componentIds) {\n if (this.data.components[cid]) connectedIds.add(cid);\n }\n }\n for (const f of features) {\n for (const cid of f.componentIds) {\n if (this.data.components[cid]) connectedIds.add(cid);\n }\n }\n\n const shownComponentIds = allComponentIds.filter((id) => connectedIds.has(id));\n const unconnectedCount = allComponentIds.length - shownComponentIds.length;\n\n if (shownComponentIds.length === 0 && pages.length === 0 && features.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'uidex-empty-message';\n empty.textContent = 'No relationships to display';\n this.mainContent.appendChild(empty);\n return;\n }\n\n // Layout constants\n const SVG_W = 440;\n const NODE_W = 110;\n const NODE_H = 24;\n const NODE_GAP = 6;\n const COL_HEADER_Y = 14;\n const START_Y = 28;\n\n // Determine columns\n type Col = { type: 'pages' | 'features' | 'components'; x: number };\n const columns: Col[] = [];\n if (pages.length > 0) columns.push({ type: 'pages', x: 0 });\n if (features.length > 0) columns.push({ type: 'features', x: 0 });\n if (shownComponentIds.length > 0) columns.push({ type: 'components', x: 0 });\n\n const colSpacing = SVG_W / columns.length;\n for (let i = 0; i < columns.length; i++) {\n columns[i].x = colSpacing * i + colSpacing / 2;\n }\n\n const colX: Record<string, number> = {};\n for (const c of columns) colX[c.type] = c.x;\n\n // Build nodes\n interface GNode {\n type: 'page' | 'feature' | 'component';\n key: string;\n label: string;\n x: number;\n y: number;\n }\n\n const nodes: GNode[] = [];\n const posOf: Record<string, { x: number; y: number }> = {};\n\n const addNodes = (\n type: GNode['type'],\n items: { key: string; label: string }[],\n cx: number\n ) => {\n items.forEach((item, i) => {\n const y = START_Y + i * (NODE_H + NODE_GAP);\n nodes.push({ type, key: item.key, label: item.label, x: cx, y });\n posOf[item.key] = { x: cx, y };\n });\n };\n\n if (colX['pages'] !== undefined) {\n addNodes(\n 'page',\n pages.map((p) => ({ key: `page:${p.dir}`, label: Modal.formatPageDir(p.dir) })),\n colX['pages']\n );\n }\n if (colX['features'] !== undefined) {\n addNodes(\n 'feature',\n features.map((f) => ({ key: `feature:${f.dir}`, label: f.title })),\n colX['features']\n );\n }\n if (colX['components'] !== undefined) {\n addNodes(\n 'component',\n shownComponentIds.map((id) => ({ key: `component:${id}`, label: id })),\n colX['components']\n );\n }\n\n // Build edges\n interface GEdge {\n fromKey: string;\n toKey: string;\n type: 'page' | 'feature';\n }\n const edges: GEdge[] = [];\n\n for (const p of pages) {\n for (const cid of p.componentIds) {\n if (connectedIds.has(cid)) {\n edges.push({ fromKey: `page:${p.dir}`, toKey: `component:${cid}`, type: 'page' });\n }\n }\n }\n for (const f of features) {\n for (const cid of f.componentIds) {\n if (connectedIds.has(cid)) {\n edges.push({ fromKey: `feature:${f.dir}`, toKey: `component:${cid}`, type: 'feature' });\n }\n }\n }\n\n // Calculate height\n const maxItems = Math.max(pages.length, features.length, shownComponentIds.length);\n const svgH = START_Y + maxItems * (NODE_H + NODE_GAP) + 12;\n\n // Create SVG\n const NS = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('viewBox', `0 0 ${SVG_W} ${svgH}`);\n svg.style.width = '100%';\n svg.style.height = 'auto';\n svg.classList.add('uidex-graph-svg');\n\n // Column headers\n const headerLabels: Record<string, string> = {\n pages: 'PAGES',\n features: 'FEATURES',\n components: 'COMPONENTS',\n };\n for (const col of columns) {\n const text = document.createElementNS(NS, 'text');\n text.setAttribute('x', String(col.x));\n text.setAttribute('y', String(COL_HEADER_Y));\n text.setAttribute('text-anchor', 'middle');\n text.classList.add('uidex-graph-header', `uidex-graph-header--${col.type}`);\n text.textContent = headerLabels[col.type];\n svg.appendChild(text);\n }\n\n // Edges\n const edgeGroup = document.createElementNS(NS, 'g');\n for (const edge of edges) {\n const from = posOf[edge.fromKey];\n const to = posOf[edge.toKey];\n if (!from || !to) continue;\n\n const x1 = from.x + NODE_W / 2;\n const y1 = from.y + NODE_H / 2;\n const x2 = to.x - NODE_W / 2;\n const y2 = to.y + NODE_H / 2;\n const midX = (x1 + x2) / 2;\n\n const path = document.createElementNS(NS, 'path');\n path.setAttribute(\n 'd',\n `M${x1},${y1} C${midX},${y1} ${midX},${y2} ${x2},${y2}`\n );\n path.classList.add('uidex-graph-edge', `uidex-graph-edge--${edge.type}`);\n path.dataset.from = edge.fromKey;\n path.dataset.to = edge.toKey;\n edgeGroup.appendChild(path);\n }\n svg.appendChild(edgeGroup);\n\n // Nodes\n const nodeGroup = document.createElementNS(NS, 'g');\n const truncate = (s: string, max: number) =>\n s.length > max ? s.slice(0, max - 1) + '\\u2026' : s;\n\n for (const node of nodes) {\n const g = document.createElementNS(NS, 'g');\n g.classList.add('uidex-graph-node', `uidex-graph-node--${node.type}`);\n g.dataset.key = node.key;\n\n const rect = document.createElementNS(NS, 'rect');\n rect.setAttribute('x', String(node.x - NODE_W / 2));\n rect.setAttribute('y', String(node.y));\n rect.setAttribute('width', String(NODE_W));\n rect.setAttribute('height', String(NODE_H));\n g.appendChild(rect);\n\n const text = document.createElementNS(NS, 'text');\n text.setAttribute('x', String(node.x));\n text.setAttribute('y', String(node.y + NODE_H / 2 + 3.5));\n text.setAttribute('text-anchor', 'middle');\n text.classList.add('uidex-graph-label');\n text.textContent = truncate(node.label, 14);\n g.appendChild(text);\n\n // Click to navigate\n g.addEventListener('click', () => {\n if (node.type === 'page') {\n this.navigateTo({ type: 'page', dir: node.key.slice(5) });\n } else if (node.type === 'feature') {\n this.navigateTo({ type: 'feature', dir: node.key.slice(8) });\n } else {\n this.navigateTo({ type: 'component', id: node.key.slice(10) });\n }\n });\n\n // Hover highlight\n g.addEventListener('mouseenter', () => {\n svg.classList.add('uidex-graph--hover');\n g.classList.add('uidex-graph-node--highlighted');\n for (const edge of edgeGroup.children) {\n const el = edge as SVGElement;\n if (el.dataset.from === node.key || el.dataset.to === node.key) {\n el.classList.add('uidex-graph-edge--highlighted');\n const otherKey =\n el.dataset.from === node.key ? el.dataset.to : el.dataset.from;\n const otherNode = nodeGroup.querySelector(`[data-key=\"${otherKey}\"]`);\n if (otherNode) otherNode.classList.add('uidex-graph-node--highlighted');\n }\n }\n });\n\n g.addEventListener('mouseleave', () => {\n svg.classList.remove('uidex-graph--hover');\n for (const el of svg.querySelectorAll('.uidex-graph-node--highlighted')) {\n el.classList.remove('uidex-graph-node--highlighted');\n }\n for (const el of svg.querySelectorAll('.uidex-graph-edge--highlighted')) {\n el.classList.remove('uidex-graph-edge--highlighted');\n }\n });\n\n nodeGroup.appendChild(g);\n }\n svg.appendChild(nodeGroup);\n\n // Title\n const title = document.createElement('h3');\n title.className = 'uidex-main-title';\n title.textContent = 'Map';\n this.mainContent.appendChild(title);\n\n // SVG container\n const container = document.createElement('div');\n container.className = 'uidex-graph';\n container.appendChild(svg);\n this.mainContent.appendChild(container);\n\n // Unconnected note\n if (unconnectedCount > 0) {\n const note = document.createElement('div');\n note.className = 'uidex-graph-note';\n note.textContent = `${unconnectedCount} component${unconnectedCount === 1 ? '' : 's'} without page or feature connections`;\n this.mainContent.appendChild(note);\n }\n }\n\n // ——— Feedback ———\n\n /** Open a dedicated feedback modal for a specific component. */\n openFeedback(id: string): void {\n this.createFeedbackShell(id);\n }\n\n private createFeedbackShell(id: string): void {\n const locations = this.data.components[id] ?? [];\n const element = this.options.elementGetter?.(id) ?? null;\n\n const { dialog, header } = this.createModalFrame({\n type: 'feedback',\n title: 'Feedback',\n ariaLabel: 'Feedback',\n });\n\n const componentLabel = document.createElement('code');\n componentLabel.className = 'uidex-modal-code uidex-modal-code--inline';\n componentLabel.textContent = id;\n header.appendChild(componentLabel);\n\n const spacer = document.createElement('div');\n spacer.className = 'uidex-header-spacer';\n header.appendChild(spacer);\n\n this.mountModalFrame(dialog, header);\n\n // Body — component context + feedback form\n this.mainContent = document.createElement('div');\n this.mainContent.className = 'uidex-modal-body';\n this.renderFeedbackContext(id, locations);\n this.renderFeedbackFormContent(id, locations, element);\n dialog.appendChild(this.mainContent);\n }\n\n /** Render component context (features, pages, doc) above the feedback form. */\n private renderFeedbackContext(id: string, locations: UidexLocation[]): void {\n if (!this.mainContent) return;\n let hasContext = false;\n\n // Feature badges\n const parentFeatures = this.data.features.filter((f) =>\n f.componentIds.includes(id)\n );\n if (parentFeatures.length > 0) {\n const container = this.createChipContainer();\n for (const feature of parentFeatures) {\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--features';\n chip.textContent = feature.title;\n container.appendChild(chip);\n }\n this.mainContent.appendChild(container);\n hasContext = true;\n }\n\n // Page badge\n const parentPage = this.data.pages.find((p) =>\n p.componentIds.includes(id)\n );\n if (parentPage) {\n const container = this.createChipContainer();\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--pages';\n chip.textContent = Modal.formatPageDir(parentPage.dir);\n container.appendChild(chip);\n this.mainContent.appendChild(container);\n hasContext = true;\n }\n\n // Doc/description\n const doc = locations.find((l) => l.doc)?.doc;\n if (doc) {\n const docText = document.createElement('p');\n docText.className = 'uidex-modal-doc uidex-modal-doc--spaced';\n docText.textContent = doc;\n this.mainContent.appendChild(docText);\n hasContext = true;\n }\n\n // Divider before form\n if (hasContext) {\n const divider = document.createElement('div');\n divider.className = 'uidex-main-divider';\n this.mainContent.appendChild(divider);\n }\n }\n\n private createChipContainer(): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'uidex-chips uidex-chips--spaced';\n return container;\n }\n\n private renderFeedbackFormContent(\n id: string,\n locations: UidexLocation[],\n element: Element | null\n ): void {\n if (!this.mainContent) return;\n\n const form = document.createElement('form');\n form.className = 'uidex-form';\n form.addEventListener('submit', (e) => e.preventDefault());\n\n // Type selector\n const typeSelect = this.createSelect('Type', [\n { value: 'bug', label: 'Bug Report' },\n { value: 'feature', label: 'Feature Request' },\n { value: 'improvement', label: 'Improvement' },\n { value: 'question', label: 'Question' },\n ]);\n form.appendChild(typeSelect.group);\n\n // Severity selector\n const severitySelect = this.createSelect(\n 'Severity',\n [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n { value: 'critical', label: 'Critical' },\n ],\n 'medium'\n );\n form.appendChild(severitySelect.group);\n\n // Title input\n const titleGroup = this.createFormGroup('Title');\n const titleInput = document.createElement('input');\n titleInput.type = 'text';\n titleInput.className = 'uidex-form-input';\n titleInput.placeholder = 'Brief summary (optional)';\n titleInput.maxLength = 200;\n titleGroup.appendChild(titleInput);\n form.appendChild(titleGroup);\n\n // Description textarea\n const descGroup = this.createFormGroup('Description');\n const textarea = document.createElement('textarea');\n textarea.className = 'uidex-form-textarea';\n textarea.placeholder = 'Describe the issue or idea...';\n textarea.rows = 4;\n descGroup.appendChild(textarea);\n form.appendChild(descGroup);\n\n let emailInput: HTMLInputElement | undefined;\n let nameInput: HTMLInputElement | undefined;\n if (this.options.ingest && !this.options.ingest.reporter) {\n const reporterGroup = this.createFormGroup('Reporter');\n nameInput = document.createElement('input');\n nameInput.type = 'text';\n nameInput.className = 'uidex-form-input';\n nameInput.placeholder = 'Name (optional)';\n reporterGroup.appendChild(nameInput);\n emailInput = document.createElement('input');\n emailInput.type = 'email';\n emailInput.className = 'uidex-form-input';\n emailInput.placeholder = 'Email (optional)';\n reporterGroup.appendChild(emailInput);\n form.appendChild(reporterGroup);\n }\n\n // Screenshot toggle\n const screenshotGroup = document.createElement('div');\n screenshotGroup.className = 'uidex-form-group';\n const screenshotLabel = document.createElement('label');\n screenshotLabel.className = 'uidex-form-toggle';\n const screenshotCheckbox = document.createElement('input');\n screenshotCheckbox.type = 'checkbox';\n screenshotCheckbox.className = 'uidex-form-checkbox';\n screenshotCheckbox.checked = true;\n screenshotLabel.appendChild(screenshotCheckbox);\n const screenshotText = document.createElement('span');\n screenshotText.className = 'uidex-form-toggle-text';\n screenshotText.textContent = 'Include screenshot';\n screenshotLabel.appendChild(screenshotText);\n screenshotGroup.appendChild(screenshotLabel);\n form.appendChild(screenshotGroup);\n\n // Submit button\n const submitBtn = document.createElement('button');\n submitBtn.type = 'button';\n submitBtn.className = 'uidex-form-submit';\n submitBtn.textContent = 'Submit';\n submitBtn.addEventListener('click', async () => {\n if (!textarea.value.trim()) {\n textarea.focus();\n return;\n }\n\n submitBtn.disabled = true;\n\n let screenshot: string | undefined;\n if (screenshotCheckbox.checked) {\n const freshElement = this.options.elementGetter?.(id) ?? element;\n if (freshElement) {\n submitBtn.textContent = 'Capturing\\u2026';\n screenshot =\n (await this.captureElementScreenshot(freshElement)) ?? undefined;\n }\n }\n\n const env = this.collectEnv();\n const page = this.data.pages.find((p) => p.componentIds.includes(id));\n const { ingest } = this.options;\n\n // Resolve reporter identity\n const reporterEmail =\n ingest?.reporter?.email || emailInput?.value.trim() || undefined;\n const reporterName =\n ingest?.reporter?.name || nameInput?.value.trim() || undefined;\n\n const titleValue = titleInput.value.trim();\n\n const report: FeedbackReport = {\n type: typeSelect.select.value as FeedbackType,\n severity: severitySelect.select.value as FeedbackSeverity,\n ...(titleValue ? { title: titleValue } : {}),\n description: textarea.value.trim(),\n componentId: id,\n element: element ? this.describeElement(element) : null,\n sources: locations.map((l) => ({ filePath: l.filePath, line: l.line })),\n url: env.url,\n path: window.location.pathname,\n route: page?.dir ?? null,\n timestamp: new Date().toISOString(),\n pageTitle: document.title,\n locale: navigator.language,\n sessionId: this.options.sessionId ?? '',\n viewport: env.viewport,\n screen: env.screen,\n userAgent: env.userAgent,\n screenshot,\n ...(reporterEmail ? { reporterEmail } : {}),\n ...(reporterName ? { reporterName } : {}),\n ...(ingest?.environment ? { environment: ingest.environment } : {}),\n ...(ingest?.appVersion ? { appVersion: ingest.appVersion } : {}),\n ...(ingest?.metadata ? { metadata: ingest.metadata } : {}),\n };\n\n const consoleLogs = this.options.getConsoleLogs?.();\n if (consoleLogs && consoleLogs.length > 0) {\n report.consoleLogs = consoleLogs;\n }\n const networkErrors = this.options.getNetworkErrors?.();\n if (networkErrors && networkErrors.length > 0) {\n report.networkErrors = networkErrors;\n }\n\n const showSuccess = (autoClose: boolean) => {\n submitBtn.textContent = 'Submitted!';\n if (autoClose) {\n setTimeout(() => this.hide(), 1500);\n } else {\n setTimeout(() => {\n submitBtn.textContent = 'Submit';\n submitBtn.disabled = false;\n }, 1500);\n }\n };\n\n if (ingest) {\n submitBtn.textContent = 'Submitting\\u2026';\n try {\n const serverResult = await submitFeedback(\n ingest.endpoint,\n ingest.apiKey,\n report,\n );\n this.options.onSubmit?.(report, {\n ok: true,\n id: serverResult.id,\n sequenceNumber: serverResult.sequenceNumber,\n });\n showSuccess(true);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Unknown error';\n console.warn('[uidex] Feedback submission failed:', errorMessage);\n this.options.onSubmit?.(report, { ok: false, error: errorMessage });\n submitBtn.textContent = 'Failed \\u2014 retry?';\n submitBtn.disabled = false;\n }\n } else {\n if (!this.options.onSubmit) {\n console.log('[uidex] Feedback submitted:', report);\n }\n this.options.onSubmit?.(report, { ok: true, id: '', sequenceNumber: 0 });\n showSuccess(false);\n }\n });\n form.appendChild(submitBtn);\n\n this.mainContent.appendChild(form);\n }\n\n // ——— Component chips ———\n\n private createComponentChip(\n id: string,\n onComponentClick?: (id: string) => void,\n absent?: boolean\n ): HTMLSpanElement {\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--components';\n if (absent) chip.classList.add('uidex-chip--absent');\n chip.textContent = id;\n if (onComponentClick) {\n chip.style.cursor = 'pointer';\n chip.addEventListener('click', () => onComponentClick(id));\n }\n return chip;\n }\n\n private createFeatureChipsSection(features: ModalFeature[]): HTMLDivElement {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section';\n\n const label = document.createElement('div');\n label.className = 'uidex-modal-label';\n label.textContent = features.length === 1 ? 'Feature' : 'Features';\n section.appendChild(label);\n\n const container = document.createElement('div');\n container.className = 'uidex-chips';\n\n for (const feature of features) {\n const chip = document.createElement('span');\n chip.className = 'uidex-chip uidex-chip--features';\n chip.textContent = feature.title;\n chip.style.cursor = 'pointer';\n chip.addEventListener('click', () =>\n this.navigateTo({ type: 'feature', dir: feature.dir })\n );\n container.appendChild(chip);\n }\n\n section.appendChild(container);\n return section;\n }\n\n private createComponentChipsSection(\n componentIds: string[],\n onComponentClick?: (id: string) => void,\n absentIds?: Set<string>\n ): HTMLDivElement {\n const section = document.createElement('div');\n section.className = 'uidex-modal-section';\n\n const label = document.createElement('div');\n label.className = 'uidex-modal-label';\n label.textContent = `Components (${componentIds.length})`;\n section.appendChild(label);\n\n const container = document.createElement('div');\n container.className = 'uidex-chips';\n\n for (const id of componentIds) {\n container.appendChild(\n this.createComponentChip(id, onComponentClick, absentIds?.has(id))\n );\n }\n\n section.appendChild(container);\n return section;\n }\n\n // ——— Form helpers ———\n\n private createFormGroup(labelText: string): HTMLDivElement {\n const group = document.createElement('div');\n group.className = 'uidex-form-group';\n const label = document.createElement('label');\n label.className = 'uidex-form-label';\n label.textContent = labelText;\n group.appendChild(label);\n return group;\n }\n\n private createSelect(\n labelText: string,\n options: { value: string; label: string }[],\n defaultValue?: string\n ): { group: HTMLDivElement; select: HTMLSelectElement } {\n const group = this.createFormGroup(labelText);\n const select = document.createElement('select');\n select.className = 'uidex-form-select';\n for (const opt of options) {\n const option = document.createElement('option');\n option.value = opt.value;\n option.textContent = opt.label;\n if (opt.value === defaultValue) option.selected = true;\n select.appendChild(option);\n }\n group.appendChild(select);\n return { group, select };\n }\n\n // ——— Markdown rendering ———\n\n private createChecklistItem(text: string, checked = false): HTMLLIElement {\n const li = document.createElement('li');\n li.className = 'uidex-checklist-item';\n\n const label = document.createElement('label');\n label.className = 'uidex-checklist-label';\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'uidex-checklist-checkbox';\n checkbox.checked = checked;\n\n label.appendChild(checkbox);\n const span = document.createElement('span');\n span.textContent = text;\n label.appendChild(span);\n\n li.appendChild(label);\n return li;\n }\n\n private renderMarkdown(content: string): HTMLElement {\n const container = document.createElement('div');\n container.className = 'uidex-page-content';\n const lines = content.split('\\n');\n let currentList: HTMLUListElement | null = null;\n let skippedFirstH1 = false;\n let inAcceptanceSection = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!trimmed) {\n currentList = null;\n continue;\n }\n\n // Headings\n const headingMatch = trimmed.match(/^(#{1,6})\\s+(.+)/);\n if (headingMatch) {\n if (!skippedFirstH1 && headingMatch[1].length === 1) {\n skippedFirstH1 = true;\n continue;\n }\n currentList = null;\n inAcceptanceSection = /^acceptance$/i.test(headingMatch[2].trim());\n const level = headingMatch[1].length;\n const tag = (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const)[\n level - 1\n ];\n const heading = document.createElement(tag);\n heading.textContent = headingMatch[2];\n container.appendChild(heading);\n continue;\n }\n\n // Checkbox list items: - [ ] and - [x]\n const checkboxMatch = trimmed.match(/^- \\[([ xX])\\]\\s+(.*)/);\n if (checkboxMatch) {\n if (!currentList) {\n currentList = document.createElement('ul');\n currentList.className = 'uidex-checklist';\n container.appendChild(currentList);\n }\n currentList.appendChild(\n this.createChecklistItem(checkboxMatch[2], checkboxMatch[1] !== ' ')\n );\n continue;\n }\n\n // Plain list items: - text (render with checkboxes under Acceptance headings)\n if (trimmed.startsWith('- ')) {\n if (!currentList) {\n currentList = document.createElement('ul');\n currentList.className = 'uidex-checklist';\n container.appendChild(currentList);\n }\n const text = trimmed.slice(2);\n if (inAcceptanceSection) {\n currentList.appendChild(this.createChecklistItem(text));\n } else {\n const li = document.createElement('li');\n li.className = 'uidex-checklist-item';\n li.textContent = text;\n currentList.appendChild(li);\n }\n continue;\n }\n\n // Paragraph\n currentList = null;\n const p = document.createElement('p');\n p.textContent = trimmed;\n container.appendChild(p);\n }\n\n return container;\n }\n\n // ——— Screenshot capture ———\n\n /**\n * Capture an element by cloning it with inlined computed styles into an\n * SVG foreignObject, rendering to canvas via an <img> data-URI, and\n * returning a PNG data-URL.\n */\n private async captureElementScreenshot(\n element: Element\n ): Promise<string | null> {\n try {\n const rect = element.getBoundingClientRect();\n const width = Math.ceil(rect.width);\n const height = Math.ceil(rect.height);\n if (width <= 0 || height <= 0 || width > 4096 || height > 4096)\n return null;\n\n const clone = element.cloneNode(true) as Element;\n this.inlineComputedStyles(element, clone);\n\n const wrapper = document.createElement('div');\n wrapper.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n wrapper.style.overflow = 'hidden';\n wrapper.appendChild(clone);\n\n const serialized = new XMLSerializer().serializeToString(wrapper);\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">` +\n `<foreignObject width=\"100%\" height=\"100%\">` +\n serialized +\n `</foreignObject></svg>`;\n\n // Inline data-URI avoids blob URL cross-origin canvas tainting\n const img = new Image();\n img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n\n return await Promise.race([\n new Promise<string | null>((resolve) => {\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return resolve(null);\n ctx.drawImage(img, 0, 0);\n resolve(canvas.toDataURL('image/png'));\n } catch {\n // Canvas tainted by cross-origin SVG foreignObject content\n resolve(null);\n }\n };\n img.onerror = () => resolve(null);\n }),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 5000)),\n ]);\n } catch {\n return null;\n }\n }\n\n /** Visual CSS properties worth inlining for a screenshot clone. */\n private static readonly VISUAL_PROPS = [\n 'display',\n 'position',\n 'box-sizing',\n 'width',\n 'min-width',\n 'max-width',\n 'height',\n 'min-height',\n 'max-height',\n 'margin',\n 'padding',\n 'border',\n 'border-radius',\n 'overflow',\n 'flex-direction',\n 'flex-wrap',\n 'flex-grow',\n 'flex-shrink',\n 'flex-basis',\n 'align-items',\n 'justify-content',\n 'gap',\n 'grid-template-columns',\n 'grid-template-rows',\n 'grid-column',\n 'grid-row',\n 'color',\n 'background',\n 'background-color',\n 'background-image',\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n 'text-decoration',\n 'text-transform',\n 'white-space',\n 'word-break',\n 'opacity',\n 'visibility',\n 'transform',\n 'box-shadow',\n 'text-shadow',\n 'vertical-align',\n 'list-style',\n 'text-overflow',\n ];\n\n /** Recursively copy visual computed styles from source onto a cloned target. */\n private inlineComputedStyles(source: Element, target: Element): void {\n if (source instanceof HTMLElement && target instanceof HTMLElement) {\n const computed = window.getComputedStyle(source);\n for (const prop of Modal.VISUAL_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value) {\n target.style.setProperty(prop, value);\n }\n }\n }\n\n const srcChildren = source.children;\n const tgtChildren = target.children;\n for (let i = 0; i < srcChildren.length; i++) {\n if (tgtChildren[i]) {\n this.inlineComputedStyles(srcChildren[i], tgtChildren[i]);\n }\n }\n }\n\n // ——— Utilities ———\n\n private collectEnv() {\n return {\n viewport: { width: window.innerWidth, height: window.innerHeight },\n screen: { width: screen.width, height: screen.height },\n userAgent: navigator.userAgent,\n browserName: this.getBrowserName(),\n url: window.location.href,\n };\n }\n\n private getBrowserName(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Firefox/')) return 'Firefox';\n if (ua.includes('Edg/')) return 'Edge';\n if (ua.includes('Chrome/')) return 'Chrome';\n if (ua.includes('Safari/') && !ua.includes('Chrome')) return 'Safari';\n return 'Unknown browser';\n }\n\n private describeElement(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const classes = element.className\n ? `.${String(element.className).split(/\\s+/).join('.')}`\n : '';\n return `<${tag}${id}${classes}>`;\n }\n\n private handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n this.hide();\n }\n }\n}\n","import type { UidexMap, UidexPage, UidexFeature } from './types';\n\nlet registeredComponents: UidexMap | null = null;\nlet registeredPages: UidexPage[] | null = null;\nlet registeredFeatures: UidexFeature[] | null = null;\n\nexport function registerComponents(components: UidexMap): void {\n registeredComponents = components;\n}\n\nexport function getComponents(): UidexMap | null {\n return registeredComponents;\n}\n\nexport function registerPages(pages: UidexPage[]): void {\n registeredPages = pages;\n}\n\nexport function getPages(): UidexPage[] | null {\n return registeredPages;\n}\n\nexport function registerFeatures(features: UidexFeature[]): void {\n registeredFeatures = features;\n}\n\nexport function getFeatures(): UidexFeature[] | null {\n return registeredFeatures;\n}\n","// AUTO-GENERATED — do not edit. Run `npm run generate:css` to regenerate.\n// Source: src/core/style.css\nconst cssText = \"/* Design tokens — :host targets the shadow root, :where(:root) for standalone use */\\n/* Theme: shadcn lyra — monochromatic, sharp, monospace */\\n:where(:host, :root) {\\n /* Colors — dark theme (lyra neutral) */\\n --uidex-color-primary: #e5e5e5;\\n --uidex-color-primary-hover: #ffffff;\\n --uidex-color-bg: #1c1c1c;\\n --uidex-color-bg-elevated: #2e2e2e;\\n --uidex-color-text: #f9f9f9;\\n --uidex-color-text-strong: #ffffff;\\n --uidex-color-text-muted: #ababab; /* chrome: labels, counts, placeholders */\\n --uidex-color-text-secondary: #ababab; /* content: doc text, descriptions */\\n --uidex-color-surface-hover: rgba(255, 255, 255, 0.08);\\n --uidex-color-surface-active: rgba(255, 255, 255, 0.12);\\n --uidex-color-border: rgba(255, 255, 255, 0.1);\\n --uidex-color-border-light: rgba(255, 255, 255, 0.06);\\n --uidex-color-backdrop: rgba(0, 0, 0, 0.6);\\n\\n /* Category colors */\\n --uidex-color-pages: #60a5fa;\\n --uidex-color-features: #a78bfa;\\n --uidex-color-components: #34d399;\\n\\n /* Shadows — minimal, border-driven definition */\\n --uidex-shadow-sm: none;\\n --uidex-shadow-md: 0 0 0 1px var(--uidex-color-border);\\n --uidex-shadow-lg: 0 0 0 1px var(--uidex-color-border);\\n\\n /* Border radius — lyra: none */\\n --uidex-radius-sm: 0;\\n --uidex-radius-md: 0;\\n --uidex-radius-lg: 0;\\n --uidex-radius-full: 0;\\n\\n /* Z-index — high enough to stay above app UI */\\n --uidex-z-container: 2147483644;\\n --uidex-z-overlay: 2147483645;\\n --uidex-z-modal: 2147483646;\\n\\n /* Typography — mono-first (lyra). Both stacks are mono by default;\\n consumers can override --uidex-font-sans to restore a proportional body font. */\\n --uidex-font-sans: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\\n --uidex-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\\n --uidex-font-size-xs: 11px;\\n --uidex-font-size-sm: 12px;\\n --uidex-font-size-md: 13px;\\n --uidex-font-size-lg: 14px;\\n\\n /* Transitions */\\n --uidex-transition-fast: 0.1s ease;\\n --uidex-transition-normal: 0.15s ease;\\n --uidex-transition-smooth: 0.2s ease;\\n}\\n\\n/* ——— Container ——— */\\n.uidex-container {\\n position: fixed;\\n z-index: var(--uidex-z-container);\\n pointer-events: auto;\\n font-family: var(--uidex-font-sans);\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n\\n.uidex-bottom-right { bottom: 20px; right: 20px; }\\n.uidex-bottom-left { bottom: 20px; left: 20px; }\\n.uidex-top-right { top: 20px; right: 20px; }\\n.uidex-top-left { top: 20px; left: 20px; }\\n\\n/* ——— Trigger button group ——— */\\n.uidex-trigger-group {\\n display: flex;\\n align-items: center;\\n border-radius: 0;\\n background: var(--uidex-color-bg);\\n border: 1px solid var(--uidex-color-border);\\n overflow: hidden;\\n user-select: none;\\n height: 32px;\\n}\\n\\n.uidex-trigger-group:hover {\\n border-color: rgba(255, 255, 255, 0.16);\\n}\\n\\n.uidex-trigger-btn {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 6px;\\n height: 100%;\\n padding: 0 10px;\\n border: none;\\n background: transparent;\\n color: var(--uidex-color-text-muted);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 500;\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast);\\n}\\n\\n.uidex-trigger-btn:hover {\\n background: var(--uidex-color-surface-hover);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-trigger-btn:active {\\n background: var(--uidex-color-surface-active);\\n transform: translateY(1px);\\n}\\n\\n.uidex-trigger-btn--active {\\n color: var(--uidex-color-text-strong);\\n background: var(--uidex-color-surface-active);\\n}\\n\\n.uidex-trigger-btn--active:hover {\\n background: rgba(255, 255, 255, 0.16);\\n}\\n\\n.uidex-trigger-divider {\\n width: 1px;\\n height: 16px;\\n background: var(--uidex-color-border);\\n flex-shrink: 0;\\n}\\n\\n.uidex-trigger-icon {\\n width: 14px;\\n height: 14px;\\n flex-shrink: 0;\\n}\\n\\n/* ——— Draggable ——— */\\n.uidex-container--dragging {\\n transition: none !important;\\n}\\n\\n.uidex-container--dragging .uidex-trigger-btn {\\n cursor: grabbing !important;\\n}\\n\\n/* ——— Inspect mode cursor ——— */\\nbody.uidex-inspecting,\\nbody.uidex-inspecting * {\\n cursor: crosshair !important;\\n}\\n\\n/* ——— Modal ——— */\\n.uidex-modal-backdrop {\\n position: fixed;\\n inset: 0;\\n z-index: var(--uidex-z-modal);\\n pointer-events: auto;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: var(--uidex-color-backdrop);\\n}\\n\\n.uidex-modal {\\n background: var(--uidex-color-bg);\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n max-width: calc(100vw - 32px);\\n max-height: calc(100vh - 64px);\\n font-family: var(--uidex-font-sans);\\n}\\n\\n.uidex-modal-header {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n padding: 12px 16px;\\n border-bottom: 1px solid var(--uidex-color-border);\\n}\\n\\n.uidex-modal-title {\\n margin: 0;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text-strong);\\n font-family: var(--uidex-font-mono);\\n text-transform: uppercase;\\n letter-spacing: 0.05em;\\n}\\n\\n.uidex-modal-close {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 28px;\\n height: 28px;\\n border: 1px solid transparent;\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text-muted);\\n font-size: 18px;\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast), border-color var(--uidex-transition-fast);\\n}\\n\\n.uidex-modal-close:hover {\\n background: var(--uidex-color-surface-hover);\\n border-color: var(--uidex-color-border);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-modal-close:active {\\n transform: translateY(1px);\\n}\\n\\n.uidex-modal-body {\\n padding: 12px 16px;\\n}\\n\\n.uidex-modal-section {\\n margin-bottom: 12px;\\n}\\n\\n.uidex-modal-section:last-child {\\n margin-bottom: 0;\\n}\\n\\n.uidex-modal-label {\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--uidex-color-text-muted);\\n margin-bottom: 6px;\\n}\\n\\n.uidex-modal-section--spaced {\\n margin-top: 12px;\\n}\\n\\n.uidex-modal-doc {\\n margin: 0;\\n font-size: var(--uidex-font-size-sm);\\n line-height: 1.5;\\n color: var(--uidex-color-text-secondary);\\n}\\n\\n.uidex-modal-code {\\n display: block;\\n font-family: var(--uidex-font-mono);\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text);\\n background: var(--uidex-color-bg-elevated);\\n padding: 6px 10px;\\n border-radius: 0;\\n border: 1px solid var(--uidex-color-border);\\n word-break: break-all;\\n}\\n\\n.uidex-modal-location {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n margin-bottom: 6px;\\n}\\n\\n.uidex-modal-location:last-child {\\n margin-bottom: 0;\\n}\\n\\n.uidex-modal-location .uidex-modal-code {\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.uidex-modal-copy {\\n flex-shrink: 0;\\n padding: 4px 10px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: var(--uidex-color-bg-elevated);\\n color: var(--uidex-color-text-secondary);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 500;\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast);\\n white-space: nowrap;\\n}\\n\\n.uidex-modal-copy:hover {\\n background: var(--uidex-color-surface-hover);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-modal-copy:active {\\n transform: translateY(1px);\\n}\\n\\n.uidex-modal-env-item {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-secondary);\\n line-height: 1.6;\\n}\\n\\n.uidex-empty-message {\\n padding: 16px 12px;\\n color: var(--uidex-color-text-muted);\\n font-size: var(--uidex-font-size-sm);\\n text-align: center;\\n}\\n\\n/* ——— Panel layout (sidebar modal) ——— */\\n.uidex-modal--panel {\\n width: calc(100vw - 32px);\\n max-width: 720px;\\n height: calc(100vh - 64px);\\n max-height: 600px;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n.uidex-panel-body {\\n display: flex;\\n flex: 1;\\n min-height: 0;\\n}\\n\\n.uidex-panel-sidebar {\\n width: 200px;\\n flex-shrink: 0;\\n border-right: 1px solid var(--uidex-color-border);\\n overflow-y: auto;\\n padding: 0;\\n scrollbar-width: thin;\\n scrollbar-color: rgba(255, 255, 255, 0.1) transparent;\\n}\\n\\n.uidex-panel-sidebar::-webkit-scrollbar {\\n width: 6px;\\n}\\n\\n.uidex-panel-sidebar::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n\\n.uidex-panel-sidebar::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.1);\\n border-radius: 0;\\n}\\n\\n.uidex-panel-main {\\n flex: 1;\\n min-width: 0;\\n overflow-y: auto;\\n padding: 16px 20px;\\n scrollbar-width: thin;\\n scrollbar-color: rgba(255, 255, 255, 0.1) transparent;\\n}\\n\\n.uidex-panel-main::-webkit-scrollbar {\\n width: 6px;\\n}\\n\\n.uidex-panel-main::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n\\n.uidex-panel-main::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.1);\\n border-radius: 0;\\n}\\n\\n/* ——— Sidebar navigation ——— */\\n.uidex-sidebar-back {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n padding: 6px 8px;\\n margin: 0;\\n border-bottom: 1px solid var(--uidex-color-border);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text-secondary);\\n cursor: pointer;\\n transition: color var(--uidex-transition-fast);\\n position: sticky;\\n top: 0;\\n background: var(--uidex-color-bg);\\n z-index: 1;\\n}\\n\\n.uidex-sidebar-back:hover {\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-sidebar-back-arrow {\\n font-size: 16px;\\n line-height: 1;\\n}\\n\\n.uidex-sidebar-root-item {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n padding: 6px 10px;\\n border-radius: 0;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 500;\\n color: var(--uidex-color-text);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n}\\n\\n.uidex-sidebar-root-item:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-sidebar-root-label {\\n flex: 0 0 auto;\\n}\\n\\n.uidex-sidebar-count {\\n font-size: var(--uidex-font-size-xs);\\n color: var(--uidex-color-text-muted);\\n font-weight: 400;\\n}\\n\\n.uidex-sidebar-chevron {\\n margin-left: auto;\\n font-size: 16px;\\n line-height: 1;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-sidebar-item {\\n padding: 4px 10px;\\n border-radius: 0;\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.uidex-sidebar-item:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-sidebar-item--active {\\n background: var(--uidex-color-surface-active);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-sidebar-item--active:hover {\\n background: var(--uidex-color-surface-active);\\n}\\n\\n.uidex-sidebar-item--dimmed {\\n opacity: 0.5;\\n}\\n\\n.uidex-sidebar-item--mono {\\n font-family: var(--uidex-font-mono);\\n}\\n\\n.uidex-sidebar-item--grouped {\\n padding-left: 24px;\\n}\\n\\n/* Sidebar category colors */\\n.uidex-sidebar-item--pages.uidex-sidebar-item--active {\\n color: var(--uidex-color-pages);\\n}\\n\\n.uidex-sidebar-item--features.uidex-sidebar-item--active {\\n color: var(--uidex-color-features);\\n}\\n\\n.uidex-sidebar-item--components.uidex-sidebar-item--active {\\n color: var(--uidex-color-components);\\n}\\n\\n.uidex-sidebar-root-item--pages .uidex-sidebar-root-label {\\n color: var(--uidex-color-pages);\\n}\\n\\n.uidex-sidebar-root-item--features .uidex-sidebar-root-label {\\n color: var(--uidex-color-features);\\n}\\n\\n.uidex-sidebar-root-item--components .uidex-sidebar-root-label {\\n color: var(--uidex-color-components);\\n}\\n\\n/* ——— Sidebar component groups ——— */\\n.uidex-sidebar-group-header {\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n padding: 4px 10px;\\n border-radius: 0;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n user-select: none;\\n}\\n\\n.uidex-sidebar-group-header:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-sidebar-group-chevron {\\n font-size: 14px;\\n line-height: 1;\\n color: var(--uidex-color-text-muted);\\n width: 14px;\\n text-align: center;\\n flex-shrink: 0;\\n transition: transform var(--uidex-transition-normal);\\n transform: rotate(0deg);\\n}\\n\\n.uidex-sidebar-group-header--expanded .uidex-sidebar-group-chevron {\\n transform: rotate(90deg);\\n}\\n\\n.uidex-sidebar-group-count {\\n margin-left: auto;\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 400;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n/* ——— Search ——— */\\n.uidex-search-input {\\n flex: 1;\\n min-width: 0;\\n padding: 4px 8px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text);\\n font-size: var(--uidex-font-size-sm);\\n font-family: var(--uidex-font-mono);\\n outline: none;\\n box-sizing: border-box;\\n}\\n\\n.uidex-search-input::placeholder {\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-search-input:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n}\\n\\n.uidex-search-group-label {\\n padding: 8px 10px 2px;\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-search-group-label--pages { color: var(--uidex-color-pages); }\\n.uidex-search-group-label--features { color: var(--uidex-color-features); }\\n.uidex-search-group-label--components { color: var(--uidex-color-components); }\\n\\n.uidex-search-empty {\\n padding: 20px 10px;\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-muted);\\n text-align: center;\\n}\\n\\n.uidex-sidebar-divider {\\n height: 1px;\\n background: var(--uidex-color-border);\\n margin: 4px 10px;\\n}\\n\\n.uidex-sidebar-root-item--active {\\n background: var(--uidex-color-surface-active);\\n}\\n\\n/* ——— Main content ——— */\\n.uidex-main-title {\\n margin: 0 0 8px;\\n font-size: var(--uidex-font-size-lg);\\n font-weight: 600;\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-main-title--mono {\\n font-family: var(--uidex-font-mono);\\n color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-main-divider {\\n height: 1px;\\n background: var(--uidex-color-border);\\n margin: 16px 0;\\n}\\n\\n.uidex-absent-notice {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-muted);\\n font-style: italic;\\n margin-bottom: 12px;\\n}\\n\\n/* ——— Page content in modal ——— */\\n.uidex-page-content {\\n font-size: var(--uidex-font-size-sm);\\n line-height: 1.6;\\n color: var(--uidex-color-text);\\n}\\n\\n.uidex-page-content h2,\\n.uidex-page-content h3,\\n.uidex-page-content h4,\\n.uidex-page-content h5,\\n.uidex-page-content h6 {\\n margin: 12px 0 6px;\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n color: var(--uidex-color-text-strong);\\n text-transform: uppercase;\\n letter-spacing: 0.04em;\\n}\\n\\n.uidex-page-content h2 {\\n font-size: var(--uidex-font-size-md);\\n}\\n\\n.uidex-page-content p {\\n margin: 0 0 8px;\\n}\\n\\n.uidex-checklist {\\n list-style: none;\\n margin: 0 0 8px;\\n padding-left: 0;\\n}\\n\\n.uidex-checklist-item {\\n margin-bottom: 4px;\\n}\\n\\n.uidex-checklist-label {\\n display: flex;\\n align-items: baseline;\\n gap: 8px;\\n cursor: pointer;\\n}\\n\\n.uidex-checklist-checkbox {\\n flex-shrink: 0;\\n margin: 0;\\n accent-color: var(--uidex-color-text-strong);\\n}\\n\\n/* ——— Chips ——— */\\n.uidex-chips {\\n display: flex;\\n flex-wrap: wrap;\\n gap: 4px;\\n}\\n\\n.uidex-chip {\\n display: inline-block;\\n padding: 2px 8px;\\n border-radius: 0;\\n background: transparent;\\n border: 1px solid var(--uidex-color-border);\\n font-family: var(--uidex-font-mono);\\n font-size: var(--uidex-font-size-xs);\\n color: var(--uidex-color-text);\\n transition: background-color var(--uidex-transition-fast);\\n}\\n\\n.uidex-chip:hover {\\n background: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-chip--absent {\\n opacity: 0.4;\\n}\\n\\n.uidex-chip--pages {\\n color: var(--uidex-color-pages);\\n border-color: color-mix(in srgb, var(--uidex-color-pages) 30%, transparent);\\n}\\n\\n.uidex-chip--features {\\n color: var(--uidex-color-features);\\n border-color: color-mix(in srgb, var(--uidex-color-features) 30%, transparent);\\n}\\n\\n.uidex-chip--components {\\n color: var(--uidex-color-components);\\n border-color: color-mix(in srgb, var(--uidex-color-components) 30%, transparent);\\n}\\n\\n/* ——— Category badges ——— */\\n.uidex-badge {\\n display: inline-block;\\n padding: 2px 8px;\\n border-radius: 0;\\n border: 1px solid var(--uidex-color-border);\\n background: transparent;\\n color: var(--uidex-color-text-muted);\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n margin-bottom: 12px;\\n}\\n\\n.uidex-badge--pages {\\n color: var(--uidex-color-pages);\\n border-color: color-mix(in srgb, var(--uidex-color-pages) 30%, transparent);\\n}\\n\\n.uidex-badge--features {\\n color: var(--uidex-color-features);\\n border-color: color-mix(in srgb, var(--uidex-color-features) 30%, transparent);\\n}\\n\\n.uidex-badge--components {\\n color: var(--uidex-color-components);\\n border-color: color-mix(in srgb, var(--uidex-color-components) 30%, transparent);\\n}\\n\\n/* ——— Feedback modal ——— */\\n.uidex-modal--feedback {\\n width: calc(100vw - 32px);\\n max-width: 400px;\\n}\\n\\n.uidex-modal-code--inline {\\n border: none;\\n background: none;\\n padding: 0;\\n}\\n\\n.uidex-header-spacer {\\n flex: 1;\\n}\\n\\n.uidex-chips--spaced {\\n margin-bottom: 8px;\\n}\\n\\n.uidex-modal-doc--spaced {\\n margin-bottom: 12px;\\n}\\n\\n/* ——— Feedback form ——— */\\n.uidex-form {\\n display: flex;\\n flex-direction: column;\\n gap: 12px;\\n}\\n\\n.uidex-form-group {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n}\\n\\n.uidex-form-label {\\n font-size: var(--uidex-font-size-xs);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-form-select,\\n.uidex-form-input,\\n.uidex-form-textarea {\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: transparent;\\n color: var(--uidex-color-text);\\n font-size: var(--uidex-font-size-sm);\\n font-family: var(--uidex-font-mono);\\n outline: none;\\n}\\n\\n.uidex-form-select:focus,\\n.uidex-form-input:focus,\\n.uidex-form-textarea:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n}\\n\\n.uidex-form-input::placeholder,\\n.uidex-form-textarea::placeholder {\\n color: var(--uidex-color-text-muted);\\n}\\n\\n.uidex-form-select {\\n appearance: none;\\n padding: 6px 10px;\\n cursor: pointer;\\n background-image: url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ababab' d='M3 5l3 3 3-3'/%3E%3C/svg%3E\\\");\\n background-repeat: no-repeat;\\n background-position: right 8px center;\\n padding-right: 26px;\\n}\\n\\n.uidex-form-input {\\n padding: 6px 10px;\\n width: 100%;\\n box-sizing: border-box;\\n}\\n\\n.uidex-form-input + .uidex-form-input {\\n margin-top: 6px;\\n}\\n\\n.uidex-form-textarea {\\n padding: 8px 10px;\\n line-height: 1.5;\\n resize: vertical;\\n min-height: 80px;\\n}\\n\\n.uidex-form-submit {\\n padding: 6px 16px;\\n border: 1px solid var(--uidex-color-border);\\n border-radius: 0;\\n background: var(--uidex-color-primary);\\n color: var(--uidex-color-bg);\\n font-size: var(--uidex-font-size-sm);\\n font-weight: 600;\\n font-family: var(--uidex-font-mono);\\n cursor: pointer;\\n transition: background-color var(--uidex-transition-fast);\\n align-self: flex-end;\\n}\\n\\n.uidex-form-submit:hover {\\n background: var(--uidex-color-primary-hover);\\n}\\n\\n.uidex-form-submit:not(:disabled):active {\\n transform: translateY(1px);\\n}\\n\\n.uidex-form-submit:disabled {\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n/* ——— Form toggle ——— */\\n.uidex-form-toggle {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n cursor: pointer;\\n}\\n\\n.uidex-form-checkbox {\\n flex-shrink: 0;\\n margin: 0;\\n accent-color: var(--uidex-color-text-strong);\\n}\\n\\n.uidex-form-toggle-text {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-secondary);\\n}\\n\\n/* ——— Responsive ——— */\\n@media (max-width: 600px) {\\n .uidex-modal--panel {\\n width: auto;\\n }\\n\\n .uidex-panel-body {\\n flex-direction: column;\\n }\\n\\n .uidex-panel-sidebar {\\n width: auto;\\n max-height: 200px;\\n border-right: none;\\n border-bottom: 1px solid var(--uidex-color-border);\\n }\\n}\\n\\n/* ——— Graph ——— */\\n.uidex-graph {\\n margin-top: 8px;\\n}\\n\\n.uidex-graph-svg {\\n display: block;\\n}\\n\\n.uidex-graph-header {\\n font-size: 10px;\\n font-weight: 600;\\n letter-spacing: 0.08em;\\n}\\n\\n.uidex-graph-header--pages { fill: var(--uidex-color-pages); }\\n.uidex-graph-header--features { fill: var(--uidex-color-features); }\\n.uidex-graph-header--components { fill: var(--uidex-color-components); }\\n\\n.uidex-graph-node {\\n cursor: pointer;\\n}\\n\\n.uidex-graph-node rect {\\n fill: var(--uidex-color-bg-elevated);\\n stroke: var(--uidex-color-border);\\n stroke-width: 1;\\n}\\n\\n.uidex-graph-node:hover rect {\\n fill: var(--uidex-color-surface-hover);\\n}\\n\\n.uidex-graph-node--page rect { stroke: color-mix(in srgb, var(--uidex-color-pages) 50%, transparent); }\\n.uidex-graph-node--feature rect { stroke: color-mix(in srgb, var(--uidex-color-features) 50%, transparent); }\\n.uidex-graph-node--component rect { stroke: color-mix(in srgb, var(--uidex-color-components) 50%, transparent); }\\n\\n.uidex-graph-label {\\n font-size: 10px;\\n font-family: var(--uidex-font-mono);\\n fill: var(--uidex-color-text);\\n}\\n\\n.uidex-graph-edge {\\n fill: none;\\n stroke-width: 1;\\n opacity: 0.3;\\n}\\n\\n.uidex-graph-edge--page { stroke: var(--uidex-color-pages); }\\n.uidex-graph-edge--feature { stroke: var(--uidex-color-features); }\\n\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-edge { opacity: 0.08; }\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-node { opacity: 0.3; }\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-edge--highlighted { opacity: 0.6; stroke-width: 1.5; }\\n.uidex-graph-svg.uidex-graph--hover .uidex-graph-node--highlighted { opacity: 1; }\\n\\n.uidex-graph-note {\\n font-size: var(--uidex-font-size-sm);\\n color: var(--uidex-color-text-muted);\\n margin-top: 12px;\\n font-style: italic;\\n}\\n\\n/* ——— Overlay ———\\n NOTE: The overlay renders in document.body (outside the Shadow DOM)\\n so all its styles are set inline in overlay.ts. These CSS classes\\n are retained only for consumers who import style.css standalone. */\\n.uidex-overlay {\\n position: fixed;\\n pointer-events: none;\\n z-index: 2147483645;\\n}\\n\";\nexport default cssText;\n","import cssText from './css-text';\n\n/**\n * Injects the uidex styles into a shadow root as a <style> element.\n * This isolates all uidex CSS from the host page.\n */\nexport function injectStyles(shadowRoot: ShadowRoot): void {\n const style = document.createElement('style');\n style.textContent = cssText;\n shadowRoot.appendChild(style);\n}\n","import type { UidexUIOptions, UidexMap } from './types';\nimport type { ModalView } from './modal';\nimport { Menu, POSITION_CLASSES } from './menu';\nimport { Overlay } from './overlay';\nimport { Inspector } from './inspector';\nimport { Modal } from './modal';\nimport { getComponents, getPages, getFeatures } from './registry';\nimport { injectStyles } from './shadow';\nimport { IngestCapture, generateSessionId } from './ingest';\n\ntype ActiveMode = 'inspect' | 'copy' | 'feedback';\n\nexport class UidexUI {\n private menu: Menu;\n private overlay: Overlay;\n private modal: Modal;\n private inspector: Inspector | null;\n private options: UidexUIOptions;\n private mounted = false;\n private shadowHost: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private observer: MutationObserver | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private copyTimer: ReturnType<typeof setTimeout> | null = null;\n private currentPresentIds: string[] = [];\n private activeMode: ActiveMode | null = null;\n private sessionId: string;\n private capture: IngestCapture | null = null;\n\n constructor(options: UidexUIOptions = {}) {\n this.options = options;\n this.sessionId = generateSessionId();\n\n if (options.ingest?.captureConsole || options.ingest?.captureNetwork) {\n this.capture = new IngestCapture(\n options.ingest.captureConsole ?? false,\n options.ingest.captureNetwork ?? false,\n );\n }\n\n this.overlay = new Overlay({\n color: options.config?.defaults?.color,\n borderStyle: options.config?.defaults?.borderStyle,\n borderWidth: options.config?.defaults?.borderWidth,\n showLabel: options.config?.defaults?.showLabel,\n labelPosition: options.config?.defaults?.labelPosition,\n colors: options.config?.colors,\n });\n\n this.modal = new Modal({\n onComponentNavigate: (id) => {\n const element = this.findElement(id);\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n this.options.onSelect?.(id);\n },\n elementGetter: (id) => this.findElement(id),\n ingest: options.ingest,\n onSubmit: options.onSubmit,\n sessionId: this.sessionId,\n getConsoleLogs: () => this.capture?.getConsoleLogs() ?? [],\n getNetworkErrors: () => this.capture?.getNetworkErrors() ?? [],\n });\n\n this.menu = new Menu({\n onInspectToggle: () => this.toggleMode('inspect'),\n onCopyToggle: () => this.toggleMode('copy'),\n onFeedbackToggle: () => this.toggleMode('feedback'),\n onExpandClick: () => this.handleExpandClick(),\n });\n\n if (options.inspectShortcut === false) {\n this.inspector = null;\n } else {\n this.inspector = new Inspector({\n shortcut: options.inspectShortcut,\n onHighlight: (_element, id) => this.handleHighlight(id),\n onSelect: (_element, id) => this.handleSelect(id),\n onActivate: () => {\n this.updateMenuActiveStates();\n },\n onDeactivate: () => {\n this.overlay.hide();\n this.activeMode = null;\n this.updateMenuActiveStates();\n },\n });\n }\n }\n\n mount(container?: HTMLElement): void {\n if (this.mounted) return;\n\n const components = this.getComponentsMap();\n const componentIds = Object.keys(components);\n\n if (componentIds.length === 0) return;\n\n // Create Shadow DOM host — zero-size, no layout impact,\n // but allows pointer events to reach fixed-position children (modal backdrop).\n this.shadowHost = document.createElement('div');\n this.shadowHost.id = 'uidex-root';\n // Fixed position keeps the host out of document flow so it cannot\n // contribute to scrollable overflow. Children (also fixed) position\n // relative to the viewport regardless of the host's box.\n this.shadowHost.style.position = 'fixed';\n this.shadowHost.style.top = '0';\n this.shadowHost.style.left = '0';\n this.shadowHost.style.width = '0';\n this.shadowHost.style.height = '0';\n this.shadowHost.style.pointerEvents = 'none';\n\n this.shadowRoot = this.shadowHost.attachShadow({ mode: 'open' });\n\n // Inject styles into shadow root\n injectStyles(this.shadowRoot);\n\n // Filter to only components present in the DOM right now\n const presentIds = this.scanPresentIds(componentIds);\n\n const menuContainer = this.menu.create();\n\n // Apply position class\n const position = this.options.buttonPosition ?? 'bottom-right';\n menuContainer.classList.add(POSITION_CLASSES[position]);\n\n // Mount shadow host and UI inside shadow root\n const mountTarget = container ?? document.body;\n mountTarget.appendChild(this.shadowHost);\n this.shadowRoot.appendChild(menuContainer);\n\n // Modal renders into shadow root too\n this.modal.setShadowRoot(this.shadowRoot);\n\n // Provide modal with current data\n this.updateModalData(presentIds);\n\n this.inspector?.mount();\n this.capture?.start();\n\n // Watch for DOM changes (SPA navigation, dynamic rendering)\n this.startObserving();\n\n this.mounted = true;\n }\n\n destroy(): void {\n if (!this.mounted) return;\n\n this.stopObserving();\n this.capture?.stop();\n if (this.copyTimer !== null) {\n clearTimeout(this.copyTimer);\n this.copyTimer = null;\n }\n this.inspector?.destroy();\n this.menu.destroy();\n this.overlay.destroy();\n this.modal.destroy();\n\n if (this.shadowHost && this.shadowHost.parentNode) {\n this.shadowHost.parentNode.removeChild(this.shadowHost);\n }\n this.shadowHost = null;\n this.shadowRoot = null;\n this.mounted = false;\n }\n\n startInspect(): void {\n this.inspector?.activate();\n }\n\n stopInspect(): void {\n this.inspector?.deactivate();\n }\n\n isInspecting(): boolean {\n return this.inspector?.isActive() ?? false;\n }\n\n /** Open the modal panel, optionally to a specific view. */\n openPanel(view?: ModalView): void {\n this.modal.open(view);\n }\n\n private toggleMode(mode: ActiveMode): void {\n if (this.inspector?.isActive()) {\n if (this.activeMode === mode) {\n this.inspector.deactivate();\n } else {\n this.activeMode = mode;\n this.updateMenuActiveStates();\n }\n } else {\n this.activeMode = mode;\n this.inspector?.activate();\n }\n }\n\n private updateMenuActiveStates(): void {\n this.menu.setInspectActive(this.activeMode === 'inspect');\n this.menu.setCopyActive(this.activeMode === 'copy');\n this.menu.setFeedbackActive(this.activeMode === 'feedback');\n }\n\n private getComponentsMap(): UidexMap {\n return this.options.components ?? getComponents() ?? {};\n }\n\n private getPagesArray() {\n return this.options.pages ?? getPages() ?? [];\n }\n\n private getFeaturesArray() {\n return this.options.features ?? getFeatures() ?? [];\n }\n\n private extractPageTitle(content: string): string {\n const match = content.match(/^#\\s+(.+)/m);\n return match ? match[1].trim() : 'Untitled';\n }\n\n /** Hamburger button handler — open modal to default (current page) view. */\n private handleExpandClick(): void {\n this.inspector?.deactivate();\n this.overlay.hide();\n this.modal.open();\n }\n\n /** Selection handler — routes by active mode. */\n private handleSelect(id: string): void {\n switch (this.activeMode) {\n case 'inspect':\n this.overlay.hide();\n this.modal.open({ type: 'component', id });\n break;\n case 'copy':\n this.handleCopySelect(id);\n break;\n case 'feedback':\n this.overlay.hide();\n this.modal.openFeedback(id);\n break;\n }\n }\n\n private handleCopySelect(id: string): void {\n const components = this.getComponentsMap();\n const locations = components[id];\n if (!locations || locations.length === 0) return;\n\n const loc = locations[0];\n const text = `${loc.filePath}:${loc.line}`;\n navigator.clipboard.writeText(text).catch(() => {});\n\n // Flash \"Copied!\" on overlay, then hide\n const element = this.findElement(id);\n if (element instanceof HTMLElement) {\n this.overlay.show(element, 'Copied!');\n this.copyTimer = setTimeout(() => {\n this.copyTimer = null;\n this.overlay.hide();\n }, 600);\n }\n }\n\n private findElement(id: string): Element | null {\n return document.querySelector(`[data-uidex=\"${id}\"]`);\n }\n\n private handleHighlight(id: string | null): void {\n if (id) {\n const element = this.findElement(id);\n if (element instanceof HTMLElement) {\n this.overlay.show(element, id);\n }\n } else {\n this.overlay.hide();\n }\n }\n\n /** Push current pages/features/components/presentIds to the modal. */\n private updateModalData(presentIds: string[]): void {\n const pages = this.getPagesArray();\n const features = this.getFeaturesArray();\n const components = this.getComponentsMap();\n\n this.modal.setData({\n pages: pages.map((p) => ({\n title: this.extractPageTitle(p.content),\n dir: p.dir,\n content: p.content,\n componentIds: p.componentIds,\n })),\n features: features.map((f) => ({\n title: this.extractPageTitle(f.content),\n dir: f.dir,\n content: f.content,\n componentIds: f.componentIds,\n })),\n components,\n presentIds: new Set(presentIds),\n });\n }\n\n // ——— DOM observation for SPA navigation ———\n\n /** Scan which registered component IDs are currently in the DOM. */\n private scanPresentIds(allIds?: string[]): string[] {\n const componentIds = allIds ?? Object.keys(this.getComponentsMap());\n\n // Single querySelectorAll instead of N individual querySelector calls\n const found = new Set<string>();\n for (const el of document.querySelectorAll('[data-uidex]')) {\n const id = el.getAttribute('data-uidex');\n if (id) found.add(id);\n }\n\n const presentIds = componentIds.filter((id) => found.has(id));\n this.currentPresentIds = presentIds;\n return presentIds;\n }\n\n /** Schedule a debounced refresh of the modal data after DOM mutations. */\n private scheduleRefresh(): void {\n if (this.refreshTimer !== null) return;\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = null;\n this.refresh();\n }, 100);\n }\n\n /** Re-scan the DOM and update modal data if the set of present IDs changed. */\n private refresh(): void {\n const oldIds = this.currentPresentIds;\n const newIds = this.scanPresentIds();\n\n // Quick equality check — same length and same elements\n if (\n newIds.length === oldIds.length &&\n newIds.every((id, i) => id === oldIds[i])\n ) {\n return;\n }\n\n this.updateModalData(newIds);\n }\n\n private startObserving(): void {\n this.observer = new MutationObserver(() => this.scheduleRefresh());\n this.observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-uidex'],\n });\n }\n\n private stopObserving(): void {\n if (this.refreshTimer !== null) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.observer?.disconnect();\n this.observer = null;\n }\n}\n\nexport function createUidexUI(options: UidexUIOptions = {}): UidexUI {\n return new UidexUI(options);\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["NS"]}