uidex 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +263 -263
- package/dist/cli/cli.cjs +3243 -0
- package/dist/cli/cli.cjs.map +1 -0
- package/dist/cloud/index.cjs +149 -0
- package/dist/cloud/index.cjs.map +1 -0
- package/dist/cloud/index.d.cts +108 -0
- package/dist/cloud/index.d.ts +108 -0
- package/dist/cloud/index.js +120 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/headless/index.cjs +3580 -0
- package/dist/headless/index.cjs.map +1 -0
- package/dist/headless/index.d.cts +214 -0
- package/dist/headless/index.d.ts +214 -0
- package/dist/headless/index.js +3562 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/index.cjs +7977 -3301
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +898 -108
- package/dist/index.d.ts +898 -108
- package/dist/index.js +7934 -3270
- package/dist/index.js.map +1 -1
- package/dist/playwright/index.cjs +164 -24
- package/dist/playwright/index.cjs.map +1 -1
- package/dist/playwright/index.d.cts +32 -55
- package/dist/playwright/index.d.ts +32 -55
- package/dist/playwright/index.js +148 -21
- package/dist/playwright/index.js.map +1 -1
- package/dist/playwright/reporter.cjs +62 -28
- package/dist/playwright/reporter.cjs.map +1 -1
- package/dist/playwright/reporter.d.cts +24 -12
- package/dist/playwright/reporter.d.ts +24 -12
- package/dist/playwright/reporter.js +62 -28
- package/dist/playwright/reporter.js.map +1 -1
- package/dist/react/index.cjs +7970 -3267
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +670 -108
- package/dist/react/index.d.ts +670 -108
- package/dist/react/index.js +8016 -3274
- package/dist/react/index.js.map +1 -1
- package/dist/scan/index.cjs +3281 -0
- package/dist/scan/index.cjs.map +1 -0
- package/dist/scan/index.d.cts +373 -0
- package/dist/scan/index.d.ts +373 -0
- package/dist/scan/index.js +3224 -0
- package/dist/scan/index.js.map +1 -0
- package/package.json +74 -56
- package/templates/claude/audit.md +37 -0
- package/templates/claude/rules.md +212 -0
- package/claude/audit-command.md +0 -16
- package/claude/rules.md +0 -88
- package/dist/core/index.cjs +0 -3490
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.d.cts +0 -441
- package/dist/core/index.d.ts +0 -441
- package/dist/core/index.global.js +0 -3469
- package/dist/core/index.global.js.map +0 -1
- package/dist/core/index.js +0 -3444
- package/dist/core/index.js.map +0 -1
- package/dist/core/style.css +0 -971
- package/dist/scripts/cli.cjs +0 -1168
- package/uidex.schema.json +0 -93
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/react/UidexDevtools.tsx","../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","../src/react/UidexOverlay.tsx"],"sourcesContent":["export * from './react';\n","import { useEffect, useMemo, useRef } from 'react';\nimport { UidexUI } from '../core/uidex-ui';\nimport type {\n UidexMap,\n UidexConfig,\n ButtonPosition,\n KeyboardShortcut,\n IngestConfig,\n FeedbackReport,\n FeedbackResult,\n} from '../core/types';\n\nexport interface UidexDevtoolsProps {\n components?: UidexMap;\n config?: UidexConfig;\n buttonPosition?: ButtonPosition;\n disabled?: boolean;\n onSelect?: (id: string) => void;\n /** Keyboard shortcut to toggle inspect mode. Default: Shift+Cmd+U. Set to false to disable. */\n inspectShortcut?: KeyboardShortcut | false;\n /** Ingest configuration for submitting feedback to a server. */\n ingest?: IngestConfig;\n /** Called after feedback submission with the report and result. */\n onSubmit?: (report: FeedbackReport, result: FeedbackResult) => void;\n}\n\nexport function UidexDevtools({\n components,\n config,\n buttonPosition = 'bottom-right',\n disabled = false,\n onSelect,\n inspectShortcut,\n ingest,\n onSubmit,\n}: UidexDevtoolsProps) {\n const uiRef = useRef<UidexUI | null>(null);\n\n // Stabilize inspectShortcut so a new object with identical values\n // doesn't trigger a full teardown/rebuild of UidexUI.\n const stableShortcut = useMemo(\n () => inspectShortcut,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n inspectShortcut === false\n ? false\n : `${inspectShortcut?.key}:${inspectShortcut?.ctrlKey}:${inspectShortcut?.shiftKey}:${inspectShortcut?.altKey}:${inspectShortcut?.metaKey}`,\n ]\n );\n\n // Stabilize ingest so a new object with identical values doesn't\n // trigger a full teardown/rebuild (which would lose captured logs).\n const stableIngest = useMemo(\n () => ingest,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n ingest\n ? `${ingest.endpoint}:${ingest.apiKey}:${ingest.environment}:${ingest.appVersion}:${ingest.captureConsole}:${ingest.captureNetwork}:${ingest.reporter?.email}:${ingest.reporter?.name}`\n : undefined,\n ]\n );\n\n // Use a ref for onSubmit so re-renders with a new callback don't\n // trigger teardown/rebuild.\n const onSubmitRef = useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n const ui = new UidexUI({\n components,\n config,\n buttonPosition,\n onSelect,\n inspectShortcut: stableShortcut,\n ingest: stableIngest,\n onSubmit: (...args) => onSubmitRef.current?.(...args),\n });\n\n ui.mount();\n uiRef.current = ui;\n\n return () => {\n ui.destroy();\n uiRef.current = null;\n };\n }, [components, config, buttonPosition, disabled, onSelect, stableShortcut, stableIngest]);\n\n return null;\n}\n","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\nconst DEFAULT_COLOR = '#3b82f6';\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 // If the label would be clipped outside the viewport, move it inside\n this.clampLabel(rect);\n }\n\n /** Move the label inside the overlay when there is no room outside. */\n private clampLabel(rect: DOMRect): void {\n if (!this.labelElement || this.labelElement.style.display === 'none') return;\n\n const {\n labelPosition = DEFAULT_LABEL_POSITION,\n } = this.options;\n\n const isTop = labelPosition === 'top-left' || labelPosition === 'top-right';\n const labelHeight = 20; // approximate: 11px font + 4px padding + border\n\n if (isTop && rect.top < labelHeight) {\n // No room above — place inside top edge\n this.labelElement.style.top = '4px';\n this.labelElement.style.transform = '';\n } else if (!isTop && (window.innerHeight - rect.bottom) < labelHeight) {\n // No room below — place inside bottom edge\n this.labelElement.style.bottom = '4px';\n this.labelElement.style.transform = '';\n }\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 this.shadowHost.style.zIndex = '2147483646';\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","import { useEffect, useRef } from 'react';\nimport { Overlay } from '../core/overlay';\nimport type { BorderStyle, LabelPosition } from '../core/types';\n\nexport interface UidexOverlayProps {\n target: HTMLElement | null;\n color?: string;\n borderStyle?: BorderStyle;\n borderWidth?: number;\n label?: string;\n showLabel?: boolean;\n labelPosition?: LabelPosition;\n colors?: Record<string, string>;\n}\n\nexport function UidexOverlay({\n target,\n color,\n borderStyle,\n borderWidth,\n label,\n showLabel,\n labelPosition,\n colors,\n}: UidexOverlayProps) {\n const overlayRef = useRef<Overlay | null>(null);\n\n // Create overlay once on mount\n useEffect(() => {\n const overlay = new Overlay();\n overlayRef.current = overlay;\n\n return () => {\n overlay.destroy();\n overlayRef.current = null;\n };\n }, []);\n\n // Update options when they change\n useEffect(() => {\n overlayRef.current?.updateOptions({\n color,\n borderStyle,\n borderWidth,\n showLabel,\n labelPosition,\n colors,\n });\n }, [color, borderStyle, borderWidth, showLabel, labelPosition, colors]);\n\n // Show/hide overlay when target changes\n useEffect(() => {\n if (!overlayRef.current) return;\n\n if (target) {\n overlayRef.current.show(target, label);\n } else {\n overlayRef.current.hide();\n }\n }, [target, label]);\n\n return null;\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAChB,IAAO,mBAAQ;;;ACGR,SAAS,aAAa,YAA8B;AACzD,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,cAAc;AACpB,aAAW,YAAY,KAAK;AAC9B;;;ACEO,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,aAAiC;AAAA,EACjC,aAAgC;AAAA,EAChC,WAAoC;AAAA,EACpC,eAAqD;AAAA,EACrD,YAAkD;AAAA,EAClD,oBAA8B,CAAC;AAAA,EAC/B,aAAgC;AAAA,EAChC;AAAA,EACA,UAAgC;AAAA,EAExC,YAAY,UAA0B,CAAC,GAAG;AACxC,SAAK,UAAU;AACf,SAAK,YAAY,kBAAkB;AAEnC,QAAI,QAAQ,QAAQ,kBAAkB,QAAQ,QAAQ,gBAAgB;AACpE,WAAK,UAAU,IAAI;AAAA,QACjB,QAAQ,OAAO,kBAAkB;AAAA,QACjC,QAAQ,OAAO,kBAAkB;AAAA,MACnC;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,QAAQ;AAAA,MACzB,OAAO,QAAQ,QAAQ,UAAU;AAAA,MACjC,aAAa,QAAQ,QAAQ,UAAU;AAAA,MACvC,aAAa,QAAQ,QAAQ,UAAU;AAAA,MACvC,WAAW,QAAQ,QAAQ,UAAU;AAAA,MACrC,eAAe,QAAQ,QAAQ,UAAU;AAAA,MACzC,QAAQ,QAAQ,QAAQ;AAAA,IAC1B,CAAC;AAED,SAAK,QAAQ,IAAI,MAAM;AAAA,MACrB,qBAAqB,CAAC,OAAO;AAC3B,cAAM,UAAU,KAAK,YAAY,EAAE;AACnC,YAAI,WAAW,OAAO,QAAQ,mBAAmB,YAAY;AAC3D,kBAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,QAChE;AACA,aAAK,QAAQ,WAAW,EAAE;AAAA,MAC5B;AAAA,MACA,eAAe,CAAC,OAAO,KAAK,YAAY,EAAE;AAAA,MAC1C,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,gBAAgB,MAAM,KAAK,SAAS,eAAe,KAAK,CAAC;AAAA,MACzD,kBAAkB,MAAM,KAAK,SAAS,iBAAiB,KAAK,CAAC;AAAA,IAC/D,CAAC;AAED,SAAK,OAAO,IAAI,KAAK;AAAA,MACnB,iBAAiB,MAAM,KAAK,WAAW,SAAS;AAAA,MAChD,cAAc,MAAM,KAAK,WAAW,MAAM;AAAA,MAC1C,kBAAkB,MAAM,KAAK,WAAW,UAAU;AAAA,MAClD,eAAe,MAAM,KAAK,kBAAkB;AAAA,IAC9C,CAAC;AAED,QAAI,QAAQ,oBAAoB,OAAO;AACrC,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK,YAAY,IAAI,UAAU;AAAA,QAC7B,UAAU,QAAQ;AAAA,QAClB,aAAa,CAAC,UAAU,OAAO,KAAK,gBAAgB,EAAE;AAAA,QACtD,UAAU,CAAC,UAAU,OAAO,KAAK,aAAa,EAAE;AAAA,QAChD,YAAY,MAAM;AAChB,eAAK,uBAAuB;AAAA,QAC9B;AAAA,QACA,cAAc,MAAM;AAClB,eAAK,QAAQ,KAAK;AAClB,eAAK,aAAa;AAClB,eAAK,uBAAuB;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAA+B;AACnC,QAAI,KAAK,QAAS;AAElB,UAAM,aAAa,KAAK,iBAAiB;AACzC,UAAM,eAAe,OAAO,KAAK,UAAU;AAE3C,QAAI,aAAa,WAAW,EAAG;AAI/B,SAAK,aAAa,SAAS,cAAc,KAAK;AAC9C,SAAK,WAAW,KAAK;AAIrB,SAAK,WAAW,MAAM,WAAW;AACjC,SAAK,WAAW,MAAM,MAAM;AAC5B,SAAK,WAAW,MAAM,OAAO;AAC7B,SAAK,WAAW,MAAM,QAAQ;AAC9B,SAAK,WAAW,MAAM,SAAS;AAC/B,SAAK,WAAW,MAAM,gBAAgB;AACtC,SAAK,WAAW,MAAM,SAAS;AAE/B,SAAK,aAAa,KAAK,WAAW,aAAa,EAAE,MAAM,OAAO,CAAC;AAG/D,iBAAa,KAAK,UAAU;AAG5B,UAAM,aAAa,KAAK,eAAe,YAAY;AAEnD,UAAM,gBAAgB,KAAK,KAAK,OAAO;AAGvC,UAAM,WAAW,KAAK,QAAQ,kBAAkB;AAChD,kBAAc,UAAU,IAAI,iBAAiB,QAAQ,CAAC;AAGtD,UAAM,cAAc,aAAa,SAAS;AAC1C,gBAAY,YAAY,KAAK,UAAU;AACvC,SAAK,WAAW,YAAY,aAAa;AAGzC,SAAK,MAAM,cAAc,KAAK,UAAU;AAGxC,SAAK,gBAAgB,UAAU;AAE/B,SAAK,WAAW,MAAM;AACtB,SAAK,SAAS,MAAM;AAGpB,SAAK,eAAe;AAEpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,QAAS;AAEnB,SAAK,cAAc;AACnB,SAAK,SAAS,KAAK;AACnB,QAAI,KAAK,cAAc,MAAM;AAC3B,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,WAAW,QAAQ;AACxB,SAAK,KAAK,QAAQ;AAClB,SAAK,QAAQ,QAAQ;AACrB,SAAK,MAAM,QAAQ;AAEnB,QAAI,KAAK,cAAc,KAAK,WAAW,YAAY;AACjD,WAAK,WAAW,WAAW,YAAY,KAAK,UAAU;AAAA,IACxD;AACA,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,eAAqB;AACnB,SAAK,WAAW,SAAS;AAAA,EAC3B;AAAA,EAEA,cAAoB;AAClB,SAAK,WAAW,WAAW;AAAA,EAC7B;AAAA,EAEA,eAAwB;AACtB,WAAO,KAAK,WAAW,SAAS,KAAK;AAAA,EACvC;AAAA;AAAA,EAGA,UAAU,MAAwB;AAChC,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AAAA,EAEQ,WAAW,MAAwB;AACzC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,UAAI,KAAK,eAAe,MAAM;AAC5B,aAAK,UAAU,WAAW;AAAA,MAC5B,OAAO;AACL,aAAK,aAAa;AAClB,aAAK,uBAAuB;AAAA,MAC9B;AAAA,IACF,OAAO;AACL,WAAK,aAAa;AAClB,WAAK,WAAW,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,SAAK,KAAK,iBAAiB,KAAK,eAAe,SAAS;AACxD,SAAK,KAAK,cAAc,KAAK,eAAe,MAAM;AAClD,SAAK,KAAK,kBAAkB,KAAK,eAAe,UAAU;AAAA,EAC5D;AAAA,EAEQ,mBAA6B;AACnC,WAAO,KAAK,QAAQ,cAAc,cAAc,KAAK,CAAC;AAAA,EACxD;AAAA,EAEQ,gBAAgB;AACtB,WAAO,KAAK,QAAQ,SAAS,SAAS,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEQ,mBAAmB;AACzB,WAAO,KAAK,QAAQ,YAAY,YAAY,KAAK,CAAC;AAAA,EACpD;AAAA,EAEQ,iBAAiB,SAAyB;AAChD,UAAM,QAAQ,QAAQ,MAAM,YAAY;AACxC,WAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,EACnC;AAAA;AAAA,EAGQ,oBAA0B;AAChC,SAAK,WAAW,WAAW;AAC3B,SAAK,QAAQ,KAAK;AAClB,SAAK,MAAM,KAAK;AAAA,EAClB;AAAA;AAAA,EAGQ,aAAa,IAAkB;AACrC,YAAQ,KAAK,YAAY;AAAA,MACvB,KAAK;AACH,aAAK,QAAQ,KAAK;AAClB,aAAK,MAAM,KAAK,EAAE,MAAM,aAAa,GAAG,CAAC;AACzC;AAAA,MACF,KAAK;AACH,aAAK,iBAAiB,EAAE;AACxB;AAAA,MACF,KAAK;AACH,aAAK,QAAQ,KAAK;AAClB,aAAK,MAAM,aAAa,EAAE;AAC1B;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,iBAAiB,IAAkB;AACzC,UAAM,aAAa,KAAK,iBAAiB;AACzC,UAAM,YAAY,WAAW,EAAE;AAC/B,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG;AAE1C,UAAM,MAAM,UAAU,CAAC;AACvB,UAAM,OAAO,GAAG,IAAI,QAAQ,IAAI,IAAI,IAAI;AACxC,cAAU,UAAU,UAAU,IAAI,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGlD,UAAM,UAAU,KAAK,YAAY,EAAE;AACnC,QAAI,mBAAmB,aAAa;AAClC,WAAK,QAAQ,KAAK,SAAS,SAAS;AACpC,WAAK,YAAY,WAAW,MAAM;AAChC,aAAK,YAAY;AACjB,aAAK,QAAQ,KAAK;AAAA,MACpB,GAAG,GAAG;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,YAAY,IAA4B;AAC9C,WAAO,SAAS,cAAc,gBAAgB,EAAE,IAAI;AAAA,EACtD;AAAA,EAEQ,gBAAgB,IAAyB;AAC/C,QAAI,IAAI;AACN,YAAM,UAAU,KAAK,YAAY,EAAE;AACnC,UAAI,mBAAmB,aAAa;AAClC,aAAK,QAAQ,KAAK,SAAS,EAAE;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,WAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGQ,gBAAgB,YAA4B;AAClD,UAAM,QAAQ,KAAK,cAAc;AACjC,UAAM,WAAW,KAAK,iBAAiB;AACvC,UAAM,aAAa,KAAK,iBAAiB;AAEzC,SAAK,MAAM,QAAQ;AAAA,MACjB,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,QACvB,OAAO,KAAK,iBAAiB,EAAE,OAAO;AAAA,QACtC,KAAK,EAAE;AAAA,QACP,SAAS,EAAE;AAAA,QACX,cAAc,EAAE;AAAA,MAClB,EAAE;AAAA,MACF,UAAU,SAAS,IAAI,CAAC,OAAO;AAAA,QAC7B,OAAO,KAAK,iBAAiB,EAAE,OAAO;AAAA,QACtC,KAAK,EAAE;AAAA,QACP,SAAS,EAAE;AAAA,QACX,cAAc,EAAE;AAAA,MAClB,EAAE;AAAA,MACF;AAAA,MACA,YAAY,IAAI,IAAI,UAAU;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKQ,eAAe,QAA6B;AAClD,UAAM,eAAe,UAAU,OAAO,KAAK,KAAK,iBAAiB,CAAC;AAGlE,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,MAAM,SAAS,iBAAiB,cAAc,GAAG;AAC1D,YAAM,KAAK,GAAG,aAAa,YAAY;AACvC,UAAI,GAAI,OAAM,IAAI,EAAE;AAAA,IACtB;AAEA,UAAM,aAAa,aAAa,OAAO,CAAC,OAAO,MAAM,IAAI,EAAE,CAAC;AAC5D,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,kBAAwB;AAC9B,QAAI,KAAK,iBAAiB,KAAM;AAChC,SAAK,eAAe,WAAW,MAAM;AACnC,WAAK,eAAe;AACpB,WAAK,QAAQ;AAAA,IACf,GAAG,GAAG;AAAA,EACR;AAAA;AAAA,EAGQ,UAAgB;AACtB,UAAM,SAAS,KAAK;AACpB,UAAM,SAAS,KAAK,eAAe;AAGnC,QACE,OAAO,WAAW,OAAO,UACzB,OAAO,MAAM,CAAC,IAAI,MAAM,OAAO,OAAO,CAAC,CAAC,GACxC;AACA;AAAA,IACF;AAEA,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,WAAW,IAAI,iBAAiB,MAAM,KAAK,gBAAgB,CAAC;AACjE,SAAK,SAAS,QAAQ,SAAS,MAAM;AAAA,MACnC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,iBAAiB,CAAC,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,iBAAiB,MAAM;AAC9B,mBAAa,KAAK,YAAY;AAC9B,WAAK,eAAe;AAAA,IACtB;AACA,SAAK,UAAU,WAAW;AAC1B,SAAK,WAAW;AAAA,EAClB;AACF;;;AVtVO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,YAAQ,qBAAuB,IAAI;AAIzC,QAAM,qBAAiB;AAAA,IACrB,MAAM;AAAA;AAAA,IAEN;AAAA,MACE,oBAAoB,QAChB,QACA,GAAG,iBAAiB,GAAG,IAAI,iBAAiB,OAAO,IAAI,iBAAiB,QAAQ,IAAI,iBAAiB,MAAM,IAAI,iBAAiB,OAAO;AAAA,IAC7I;AAAA,EACF;AAIA,QAAM,mBAAe;AAAA,IACnB,MAAM;AAAA;AAAA,IAEN;AAAA,MACE,SACI,GAAG,OAAO,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,WAAW,IAAI,OAAO,UAAU,IAAI,OAAO,cAAc,IAAI,OAAO,cAAc,IAAI,OAAO,UAAU,KAAK,IAAI,OAAO,UAAU,IAAI,KACnL;AAAA,IACN;AAAA,EACF;AAIA,QAAM,kBAAc,qBAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,8BAAU,MAAM;AACd,QAAI,UAAU;AACZ;AAAA,IACF;AAEA,UAAM,KAAK,IAAI,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,UAAU,IAAI,SAAS,YAAY,UAAU,GAAG,IAAI;AAAA,IACtD,CAAC;AAED,OAAG,MAAM;AACT,UAAM,UAAU;AAEhB,WAAO,MAAM;AACX,SAAG,QAAQ;AACX,YAAM,UAAU;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,YAAY,QAAQ,gBAAgB,UAAU,UAAU,gBAAgB,YAAY,CAAC;AAEzF,SAAO;AACT;;;AW5FA,IAAAC,gBAAkC;AAe3B,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,iBAAa,sBAAuB,IAAI;AAG9C,+BAAU,MAAM;AACd,UAAM,UAAU,IAAI,QAAQ;AAC5B,eAAW,UAAU;AAErB,WAAO,MAAM;AACX,cAAQ,QAAQ;AAChB,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,+BAAU,MAAM;AACd,eAAW,SAAS,cAAc;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,aAAa,aAAa,WAAW,eAAe,MAAM,CAAC;AAGtE,+BAAU,MAAM;AACd,QAAI,CAAC,WAAW,QAAS;AAEzB,QAAI,QAAQ;AACV,iBAAW,QAAQ,KAAK,QAAQ,KAAK;AAAA,IACvC,OAAO;AACL,iBAAW,QAAQ,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SAAO;AACT;","names":["NS","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/cloud/types.ts","../src/cloud/client.ts","../src/cloud/sdk-cloud.ts","../src/entities/types.ts","../src/entities/registry.ts","../src/entities/style.ts","../src/entities/display-name.ts","../src/views/built-in/ids.ts","../src/internal/clipboard.ts","../src/internal/dark-mode.ts","../src/ui/toast.ts","../src/views/built-in/feedback/markdown.ts","../src/views/built-in/feedback/schema.ts","../src/views/built-in/feedback/snapshot.ts","../src/views/built-in/feedback/view-builder.ts","../src/views/built-in/feedback/sdk-feedback.ts","../src/ingest/console.ts","../src/ingest/native-fetch.ts","../src/ingest/network.ts","../src/ingest/index.ts","../src/internal/cleanup.ts","../src/session/store.ts","../src/flows/highlight.ts","../src/flows/surface.ts","../src/styles/tailwind.built.css","../src/surface/constants.ts","../src/surface/host.ts","../src/surface/cursor-tooltip.ts","../src/surface/inspector.ts","../src/surface/menu-bar.ts","../src/surface/overlay.ts","../src/surface/theme.ts","../src/surface/shell.ts","../src/surface/keys.ts","../src/internal/dev.ts","../src/views/core/types.ts","../src/views/core/registry.ts","../src/internal/cn.ts","../src/internal/el.ts","../src/ui/cva.ts","../src/ui/badge.ts","../src/views/primitives/chip.ts","../src/views/primitives/kind-icon.ts","../src/views/primitives/icon-tile.ts","../src/views/primitives/kind-chip.ts","../src/machines/scroll-area.ts","../src/machines/machine.ts","../src/machines/normalize.ts","../src/views/builder/spread-props.ts","../src/views/render/custom.ts","../src/views/render/detail.ts","../src/views/builder/filter.ts","../src/views/labels.ts","../src/ui/button.ts","../src/ui/list-item.ts","../src/views/primitives/button.ts","../src/ui/kbd.ts","../src/views/primitives/row.ts","../src/views/primitives/entity-link.ts","../src/views/primitives/section.ts","../src/views/primitives/text.ts","../src/views/render/form.ts","../src/flows/form.ts","../src/ui/field.ts","../src/ui/form.ts","../src/ui/input.ts","../src/ui/select.ts","../src/machines/combobox.ts","../src/views/render/list.ts","../src/views/render/index.ts","../src/views/core/mount.ts","../src/views/core/shell.ts","../src/machines/menu.ts","../src/ui/menu.ts","../src/views/core/actions-popup.ts","../src/views/core/stack.ts","../src/views/built-in/command-palette.ts","../src/views/builder/page-context.ts","../src/views/builder/format-location.ts","../src/views/builder/resolve.ts","../src/views/builder/detail-builder.ts","../src/views/built-in/entity-detail.ts","../src/views/built-in/explore-page.ts","../src/views/built-in/feedback/host-feedback.ts","../src/views/built-in/flow-detail.ts","../src/views/built-in/glossary.ts","../src/views/built-in/index.ts","../src/create-uidex.ts"],"sourcesContent":["// Core factory\nexport { createUidex } from \"./create-uidex\"\nexport type { CreateUidexOptions, Uidex } from \"./create-uidex\"\n\n// Entities — data model\nexport {\n ENTITY_KINDS,\n UnknownEntityKindError,\n assertEntityKind,\n createRegistry,\n displayName,\n entityKey,\n isMetaKind,\n KIND_STYLE,\n prettify,\n} from \"./entities\"\nexport type {\n Element,\n Entity,\n EntityByKind,\n EntityKind,\n EntityRef,\n Feature,\n Flow,\n KindStyleEntry,\n Location,\n Metadata,\n MetaEntityKind,\n Page,\n Primitive,\n Region,\n Registry,\n Route,\n Scope,\n Widget,\n} from \"./entities\"\n\n// Session\nexport { createSession, resolveTheme } from \"./session\"\nexport type {\n CreateSessionOptions,\n ResolvedTheme,\n SessionActions,\n SessionSnapshot,\n SessionState,\n SessionStore,\n ThemePreference,\n ViewStackEntry,\n} from \"./session\"\n\n// Surface (chrome layer)\nexport {\n createCursorTooltip,\n createHighlightController,\n createInspector,\n createMenuBar,\n createOverlay,\n createSurfaceHost,\n createSurfaceShell,\n createThemeDetector,\n defaultResolveMatch,\n resolveEntityElement,\n SURFACE_CONTAINER_CLASS,\n SURFACE_HOST_CLASS,\n SURFACE_IGNORE_SELECTOR,\n Z_BASE,\n Z_CHROME,\n Z_OVERLAY,\n} from \"./surface\"\nexport type {\n Corner,\n CreateSurfaceShellOptions,\n CursorTooltip,\n CursorTooltipDeps,\n Inspector,\n InspectorMatch,\n InspectorOptions,\n MenuBar,\n MenuBarOptions,\n Overlay,\n OverlayShowOptions,\n SurfaceHost,\n SurfaceHostOptions,\n SurfaceShell,\n ThemeDetector,\n ThemeDetectorDeps,\n} from \"./surface\"\n\n// Views\nexport {\n commandPaletteView,\n componentDetailView,\n createViewRegistrar,\n createViewStack,\n DEFAULT_VIEWS,\n featureDetailView,\n feedbackView,\n flowDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n ViewValidationError,\n widgetDetailView,\n} from \"./views\"\nexport type {\n Cleanup,\n CloudAdapter,\n ConsoleLogEntry,\n CustomSurface,\n DetailAction,\n DetailActionIcon,\n DetailActionRunContext,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n FeedbackExternalLink,\n FeedbackPayload,\n FeedbackResult,\n FeedbackSuggestedTarget,\n FormField,\n FormSubmit,\n FormSubmitResult,\n FormSurface,\n FormValue,\n HighlightController,\n IngestConfig,\n IngestConfigEpic,\n ListItem,\n ListSurface,\n NetworkErrorEntry,\n ShellAction,\n ShellHint,\n SourceRef,\n View,\n ViewContext,\n ViewDirectory,\n ViewPalette,\n ViewPushTarget,\n Viewport,\n ViewRegistrar,\n ViewRegistrarOptions,\n ViewStack,\n ViewStackOptions,\n ViewSurface,\n} from \"./views\"\n\n// Ingest (console/network capture)\nexport {\n createConsoleCapture,\n createIngest,\n createNetworkCapture,\n getNativeFetch,\n nativeFetch,\n resolveIngestOptions,\n} from \"./ingest\"\nexport type {\n ConsoleCapture,\n ConsoleEntry,\n ConsoleLevel,\n Ingest,\n IngestOptions,\n NetworkCapture,\n NetworkEntry,\n} from \"./ingest\"\n","export type {\n CloudAdapter,\n FeedbackExternalLink,\n FeedbackPayload,\n FeedbackResult,\n FeedbackSuggestedTarget,\n IngestConfig,\n IngestConfigEpic,\n SourceRef,\n} from \"../ingest/feedback-contract\"\n\nexport const DEFAULT_CLOUD_ENDPOINT = \"https://app.uidex.dev\"\n\nexport interface CloudOptions {\n projectKey: string\n endpoint?: string\n fetch?: typeof fetch\n}\n\nexport class CloudError extends Error {\n readonly status: number\n readonly retryAfter?: number\n readonly details?: unknown\n\n constructor(\n message: string,\n options: { status: number; retryAfter?: number; details?: unknown }\n ) {\n super(message)\n this.name = \"CloudError\"\n this.status = options.status\n this.retryAfter = options.retryAfter\n this.details = options.details\n }\n}\n","import {\n CloudError,\n DEFAULT_CLOUD_ENDPOINT,\n type CloudAdapter,\n type CloudOptions,\n type FeedbackPayload,\n type FeedbackResult,\n type IngestConfig,\n} from \"./types\"\n\nfunction resolveFetch(override?: typeof fetch): typeof fetch {\n if (override) return override\n if (\n typeof globalThis !== \"undefined\" &&\n typeof globalThis.fetch === \"function\"\n ) {\n return globalThis.fetch.bind(globalThis)\n }\n throw new Error(\n \"uidex/cloud: global fetch is not available; pass a `fetch` override\"\n )\n}\n\nfunction trimEndpoint(endpoint: string): string {\n return endpoint.endsWith(\"/\") ? endpoint.slice(0, -1) : endpoint\n}\n\nfunction parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined\n const seconds = Number(header)\n if (Number.isFinite(seconds) && seconds >= 0) return seconds\n const date = Date.parse(header)\n if (Number.isFinite(date)) {\n const delta = Math.ceil((date - Date.now()) / 1000)\n return delta > 0 ? delta : 0\n }\n return undefined\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n const text = await response.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n}\n\nfunction errorMessage(body: unknown, fallback: string): string {\n if (\n body &&\n typeof body === \"object\" &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return (body as { error: string }).error\n }\n return fallback\n}\n\nexport function cloud(options: CloudOptions): CloudAdapter {\n const projectKey = options.projectKey\n if (!projectKey) {\n throw new Error(\"uidex/cloud: `projectKey` is required\")\n }\n const endpoint = trimEndpoint(options.endpoint ?? DEFAULT_CLOUD_ENDPOINT)\n const fetchImpl = resolveFetch(options.fetch)\n const authHeader = `Bearer ${projectKey}`\n\n async function submit(payload: FeedbackPayload): Promise<FeedbackResult> {\n const response = await fetchImpl(`${endpoint}/api/ingest`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n },\n body: JSON.stringify(payload),\n })\n\n const body = await readBody(response)\n\n if (!response.ok) {\n const retryAfter =\n response.status === 429\n ? parseRetryAfter(response.headers.get(\"Retry-After\"))\n : undefined\n throw new CloudError(\n errorMessage(body, `Feedback submission failed (${response.status})`),\n { status: response.status, retryAfter, details: body }\n )\n }\n\n if (!body || typeof body !== \"object\") {\n throw new CloudError(\"Feedback submission returned an empty response\", {\n status: response.status,\n })\n }\n return body as FeedbackResult\n }\n\n async function getConfig(): Promise<IngestConfig> {\n const response = await fetchImpl(`${endpoint}/api/ingest/config`, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: authHeader,\n },\n })\n\n const body = await readBody(response)\n\n if (!response.ok) {\n const retryAfter =\n response.status === 429\n ? parseRetryAfter(response.headers.get(\"Retry-After\"))\n : undefined\n throw new CloudError(\n errorMessage(body, `Ingest config request failed (${response.status})`),\n { status: response.status, retryAfter, details: body }\n )\n }\n\n if (!body || typeof body !== \"object\") {\n throw new CloudError(\"Ingest config returned an empty response\", {\n status: response.status,\n })\n }\n return body as IngestConfig\n }\n\n return {\n feedback: { submit },\n integrations: { getConfig },\n }\n}\n","import { cloud } from \"./client\"\nimport type { CloudAdapter } from \"./types\"\n\nexport const sdkCloud: CloudAdapter = cloud({\n projectKey: UIDEX_SDK_CLOUD_PROJECT_KEY,\n endpoint: UIDEX_SDK_CLOUD_ENDPOINT,\n})\n","export const ENTITY_KINDS = [\n \"route\",\n \"page\",\n \"feature\",\n \"widget\",\n \"region\",\n \"element\",\n \"primitive\",\n \"flow\",\n] as const\n\nexport type EntityKind = (typeof ENTITY_KINDS)[number]\n\nexport type Scope = string\n\nexport interface Location {\n file: string\n line?: number\n column?: number\n}\n\nexport interface EntityRef {\n kind: EntityKind\n id: string\n}\n\nexport interface Metadata {\n name?: string\n description?: string\n acceptance?: string[]\n notes?: string\n composes?: EntityRef[]\n flows?: readonly string[]\n features?: string[]\n widgets?: string[]\n}\n\ninterface EntityWithMetaBase {\n id: string\n loc?: Location\n scopes?: Scope[]\n meta?: Metadata\n}\n\nexport interface Route {\n kind: \"route\"\n path: string\n page: string\n}\n\nexport interface Flow {\n kind: \"flow\"\n id: string\n loc: Location\n touches: string[]\n}\n\nexport interface Page extends EntityWithMetaBase {\n kind: \"page\"\n}\n\nexport interface Feature extends EntityWithMetaBase {\n kind: \"feature\"\n}\n\nexport interface Widget extends EntityWithMetaBase {\n kind: \"widget\"\n}\n\nexport interface Region extends EntityWithMetaBase {\n kind: \"region\"\n}\n\nexport interface Element extends EntityWithMetaBase {\n kind: \"element\"\n}\n\nexport interface Primitive extends EntityWithMetaBase {\n kind: \"primitive\"\n}\n\nexport type Entity =\n | Route\n | Page\n | Feature\n | Widget\n | Region\n | Element\n | Primitive\n | Flow\n\nexport type EntityByKind<K extends EntityKind> = Extract<Entity, { kind: K }>\n\nexport type MetaEntityKind = Exclude<EntityKind, \"route\" | \"flow\">\n\nexport function isMetaKind(kind: EntityKind): kind is MetaEntityKind {\n return kind !== \"route\" && kind !== \"flow\"\n}\n\nexport function isMetaEntity(\n entity: Entity\n): entity is Extract<Entity, { kind: MetaEntityKind }> {\n return isMetaKind(entity.kind)\n}\n\nexport function entityKey(entity: Entity): string {\n return entity.kind === \"route\" ? entity.path : entity.id\n}\n\nexport function sameRef(a: EntityRef | null, b: EntityRef | null): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n return a.kind === b.kind && a.id === b.id\n}\n\nexport class UnknownEntityKindError extends Error {\n readonly kind: string\n constructor(kind: string) {\n super(`Unknown entity kind: ${kind}`)\n this.name = \"UnknownEntityKindError\"\n this.kind = kind\n }\n}\n\nconst KIND_SET: ReadonlySet<string> = new Set<string>(ENTITY_KINDS)\n\nexport function assertEntityKind(kind: string): asserts kind is EntityKind {\n if (!KIND_SET.has(kind)) throw new UnknownEntityKindError(kind)\n}\n","import {\n assertEntityKind,\n entityKey,\n isMetaEntity,\n isMetaKind,\n type Entity,\n type EntityByKind,\n type EntityKind,\n type Flow,\n type Metadata,\n type Scope,\n} from \"./types\"\n\nexport interface Registry {\n add(entity: Entity): void\n get<K extends EntityKind>(kind: K, id: string): EntityByKind<K> | undefined\n list<K extends EntityKind>(kind: K): ReadonlyArray<EntityByKind<K>>\n query(predicate: (entity: Entity) => boolean): Entity[]\n byScope(scope: Scope): Entity[]\n touchedBy(flowId: string): Entity[]\n}\n\ntype KindStore = {\n [K in EntityKind]: Map<string, EntityByKind<K>>\n}\n\nfunction emptyStore(): KindStore {\n return {\n route: new Map(),\n page: new Map(),\n feature: new Map(),\n widget: new Map(),\n region: new Map(),\n element: new Map(),\n primitive: new Map(),\n flow: new Map(),\n }\n}\n\nfunction computeFlowIds(flows: Iterable<Flow>, targetId: string): string[] {\n const ids: string[] = []\n for (const flow of flows) {\n if (flow.touches.includes(targetId)) ids.push(flow.id)\n }\n return ids\n}\n\nfunction freezeEntity<E extends Entity>(entity: E, flows: Iterable<Flow>): E {\n if (!isMetaKind(entity.kind)) return entity\n const withMeta = entity as Extract<Entity, { meta?: Metadata }>\n if (withMeta.meta === undefined) return entity\n const computedFlows = Object.freeze(computeFlowIds(flows, withMeta.id))\n const mergedMeta: Metadata = { ...withMeta.meta, flows: computedFlows }\n return { ...entity, meta: Object.freeze(mergedMeta) } as E\n}\n\nexport function createRegistry(): Registry {\n const store = emptyStore()\n let flowsCache: Flow[] | null = null\n\n const getFlows = (): Flow[] => {\n if (flowsCache === null) flowsCache = Array.from(store.flow.values())\n return flowsCache\n }\n\n const add = (entity: Entity): void => {\n assertEntityKind(entity.kind)\n const key = entityKey(entity)\n ;(store[entity.kind] as Map<string, Entity>).set(key, entity)\n flowsCache = null\n }\n\n const get = <K extends EntityKind>(\n kind: K,\n id: string\n ): EntityByKind<K> | undefined => {\n assertEntityKind(kind)\n const raw = store[kind].get(id) as EntityByKind<K> | undefined\n if (raw === undefined) return undefined\n return freezeEntity(raw, getFlows())\n }\n\n const list = <K extends EntityKind>(\n kind: K\n ): ReadonlyArray<EntityByKind<K>> => {\n assertEntityKind(kind)\n const flows = getFlows()\n return Array.from(store[kind].values(), (e) =>\n freezeEntity(e as EntityByKind<K>, flows)\n )\n }\n\n const allEntities = function* (): Generator<Entity> {\n for (const kind of Object.keys(store) as EntityKind[]) {\n for (const entity of store[kind].values()) {\n yield entity as Entity\n }\n }\n }\n\n const query = (predicate: (entity: Entity) => boolean): Entity[] => {\n const flows = getFlows()\n const result: Entity[] = []\n for (const entity of allEntities()) {\n if (predicate(entity)) result.push(freezeEntity(entity, flows))\n }\n return result\n }\n\n const byScope = (scope: Scope): Entity[] =>\n query(\n (entity) =>\n \"scopes\" in entity &&\n Array.isArray(entity.scopes) &&\n entity.scopes.includes(scope)\n )\n\n const touchedBy = (flowId: string): Entity[] => {\n const flow = store.flow.get(flowId)\n if (flow === undefined) return []\n const ids = new Set(flow.touches)\n return query((entity) => {\n if (!isMetaEntity(entity)) return false\n return ids.has(entity.id)\n })\n }\n\n return { add, get, list, query, byScope, touchedBy }\n}\n","import {\n Circle,\n FileText,\n type IconNode,\n LayoutGrid,\n LayoutPanelTop,\n MousePointerClick,\n Route as RouteIcon,\n Sparkles,\n Workflow,\n} from \"lucide\"\nimport type { EntityKind } from \"./types\"\n\nexport interface KindStyleEntry {\n icon: IconNode\n tone: string\n chip: string\n color: string\n label: string\n}\n\nexport const KIND_STYLE: Record<EntityKind, KindStyleEntry> = {\n route: {\n icon: RouteIcon,\n tone: \"text-blue-700 dark:text-blue-300\",\n chip: \"bg-blue-400/20 text-blue-700 group-data-hover:bg-blue-400/30 dark:bg-blue-400/10 dark:text-blue-300 dark:group-data-hover:bg-blue-400/15\",\n color: \"#60a5fa\",\n label: \"Route\",\n },\n page: {\n icon: FileText,\n tone: \"text-emerald-700 dark:text-emerald-300\",\n chip: \"bg-emerald-400/20 text-emerald-700 group-data-hover:bg-emerald-400/30 dark:bg-emerald-400/10 dark:text-emerald-300 dark:group-data-hover:bg-emerald-400/15\",\n color: \"#34d399\",\n label: \"Page\",\n },\n feature: {\n icon: Sparkles,\n tone: \"text-amber-700 dark:text-amber-300\",\n chip: \"bg-amber-400/20 text-amber-700 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-300 dark:group-data-hover:bg-amber-400/15\",\n color: \"#fbbf24\",\n label: \"Feature\",\n },\n widget: {\n icon: LayoutGrid,\n tone: \"text-violet-700 dark:text-violet-300\",\n chip: \"bg-violet-400/20 text-violet-700 group-data-hover:bg-violet-400/30 dark:bg-violet-400/10 dark:text-violet-300 dark:group-data-hover:bg-violet-400/15\",\n color: \"#a78bfa\",\n label: \"Widget\",\n },\n region: {\n icon: LayoutPanelTop,\n tone: \"text-cyan-700 dark:text-cyan-300\",\n chip: \"bg-cyan-400/20 text-cyan-700 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-300 dark:group-data-hover:bg-cyan-400/15\",\n color: \"#22d3ee\",\n label: \"Region\",\n },\n element: {\n icon: MousePointerClick,\n tone: \"text-rose-700 dark:text-rose-300\",\n chip: \"bg-rose-400/20 text-rose-700 group-data-hover:bg-rose-400/30 dark:bg-rose-400/10 dark:text-rose-300 dark:group-data-hover:bg-rose-400/15\",\n color: \"#fb7185\",\n label: \"Element\",\n },\n primitive: {\n icon: Circle,\n tone: \"text-slate-700 dark:text-slate-300\",\n chip: \"bg-slate-400/20 text-slate-700 group-data-hover:bg-slate-400/30 dark:bg-slate-400/10 dark:text-slate-300 dark:group-data-hover:bg-slate-400/15\",\n color: \"#94a3b8\",\n label: \"Primitive\",\n },\n flow: {\n icon: Workflow,\n tone: \"text-fuchsia-700 dark:text-fuchsia-300\",\n chip: \"bg-fuchsia-400/20 text-fuchsia-700 group-data-hover:bg-fuchsia-400/30 dark:bg-fuchsia-400/10 dark:text-fuchsia-300 dark:group-data-hover:bg-fuchsia-400/15\",\n color: \"#e879f9\",\n label: \"Flow\",\n },\n}\n","import type { Entity } from \"./types\"\n\nexport function prettify(id: string): string {\n const parts = id.split(/[-_]+/).filter(Boolean)\n const words = parts.flatMap((part) => part.split(/(?=[A-Z])/).filter(Boolean))\n if (words.length === 0) return \"\"\n return words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(\" \")\n}\n\nexport function displayName(entity: Entity, node?: Element | null): string {\n if (entity.kind === \"route\") return prettify(entity.page)\n if (entity.kind !== \"flow\") {\n const authored = entity.meta?.name\n if (authored) return authored\n }\n const aria = node?.getAttribute(\"aria-label\")?.trim()\n if (aria) return aria\n return prettify(entity.id)\n}\n","export const BUILT_IN_VIEW_IDS = {\n commandPalette: \"command-palette\",\n explorePage: \"explore-page\",\n feedback: \"feedback\",\n glossary: \"glossary\",\n sdkFeedback: \"sdk-feedback\",\n} as const\n","export async function copyToClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n return true\n }\n } catch {\n // fall through to legacy path\n }\n try {\n if (typeof document === \"undefined\") return false\n const textarea = document.createElement(\"textarea\")\n textarea.value = text\n textarea.setAttribute(\"readonly\", \"\")\n textarea.style.position = \"fixed\"\n textarea.style.opacity = \"0\"\n document.body.appendChild(textarea)\n textarea.select()\n const ok = document.execCommand(\"copy\")\n document.body.removeChild(textarea)\n return ok\n } catch {\n return false\n }\n}\n","export function isDarkMode(): boolean {\n if (typeof document !== \"undefined\") {\n const root = document.documentElement\n if (root?.classList.contains(\"dark\")) return true\n if (root?.classList.contains(\"light\")) return false\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\"\n ) {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n }\n return false\n}\n","import { isDarkMode } from \"../internal/dark-mode\"\n\nexport function showCopiedToast(message: string): void {\n if (typeof document === \"undefined\") return\n const dark = isDarkMode()\n const toast = document.createElement(\"div\")\n toast.setAttribute(\"data-uidex-toast\", \"\")\n Object.assign(toast.style, {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%) scale(0.96)\",\n padding: \"12px 20px\",\n fontSize: \"14px\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n fontWeight: \"500\",\n color: dark ? \"#0a0a0a\" : \"#fafafa\",\n background: dark ? \"rgba(255, 255, 255, 0.98)\" : \"rgba(28, 28, 30, 0.95)\",\n border: dark\n ? \"1px solid rgba(0, 0, 0, 0.08)\"\n : \"1px solid rgba(255, 255, 255, 0.08)\",\n borderRadius: \"10px\",\n boxShadow: dark\n ? \"0 8px 24px rgba(0, 0, 0, 0.35), 0 2px 6px rgba(0, 0, 0, 0.2)\"\n : \"0 8px 24px rgba(0, 0, 0, 0.35), 0 2px 6px rgba(0, 0, 0, 0.25)\",\n zIndex: \"2147483647\",\n pointerEvents: \"none\",\n opacity: \"0\",\n transition: \"opacity 120ms ease-out, transform 160ms ease-out\",\n whiteSpace: \"nowrap\",\n } satisfies Partial<CSSStyleDeclaration>)\n toast.textContent = message\n document.body.appendChild(toast)\n\n requestAnimationFrame(() => {\n toast.style.opacity = \"1\"\n toast.style.transform = \"translate(-50%, -50%) scale(1)\"\n })\n\n setTimeout(() => {\n toast.style.opacity = \"0\"\n toast.style.transform = \"translate(-50%, -50%) scale(0.96)\"\n setTimeout(() => toast.remove(), 200)\n }, 1200)\n}\n","import type { FeedbackPayload } from \"../../core/types\"\n\nfunction capitalize(s: string): string {\n return s.length === 0 ? s : s[0].toUpperCase() + s.slice(1)\n}\n\nexport function renderPayloadMarkdown(payload: FeedbackPayload): string {\n const heading = payload.title ?? `${capitalize(payload.type)} Feedback`\n const lines: string[] = [\n `# ${heading}`,\n \"\",\n `- **Type:** ${payload.type}`,\n `- **Severity:** ${payload.severity}`,\n `- **Component:** \\`${payload.componentId}\\``,\n \"\",\n \"## Description\",\n \"\",\n payload.description || \"_(no description)_\",\n \"\",\n \"## Context\",\n \"\",\n `- **URL:** ${payload.url}`,\n `- **Path:** ${payload.path}`,\n ...(payload.pageTitle ? [`- **Page title:** ${payload.pageTitle}`] : []),\n `- **Viewport:** ${payload.viewport.width}×${payload.viewport.height}`,\n `- **Screen:** ${payload.screen.width}×${payload.screen.height}`,\n `- **User agent:** ${payload.userAgent}`,\n `- **Timestamp:** ${payload.timestamp}`,\n ]\n return lines.join(\"\\n\") + \"\\n\"\n}\n","import { z } from \"zod\"\nimport type { FormField } from \"../../core/surface\"\n\nexport const feedbackSchema = z.object({\n type: z.enum([\"bug\", \"feature\", \"improvement\", \"question\"]),\n severity: z.enum([\"low\", \"medium\", \"high\", \"critical\"]),\n title: z.string().optional(),\n description: z\n .string()\n .trim()\n .min(1, { message: \"Description is required.\" }),\n})\n\nexport const feedbackFields: FormField[] = [\n {\n kind: \"select\",\n name: \"type\",\n label: \"Type\",\n options: [\n { value: \"bug\", label: \"Bug\" },\n { value: \"feature\", label: \"Feature\" },\n { value: \"improvement\", label: \"Improvement\" },\n { value: \"question\", label: \"Question\" },\n ],\n },\n {\n kind: \"select\",\n name: \"severity\",\n label: \"Severity\",\n value: \"medium\",\n options: [\n { value: \"low\", label: \"Low\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"high\", label: \"High\" },\n { value: \"critical\", label: \"Critical\" },\n ],\n },\n {\n kind: \"text\",\n name: \"title\",\n label: \"Title\",\n placeholder: \"Short summary (optional)\",\n },\n {\n kind: \"textarea\",\n name: \"description\",\n label: \"Description\",\n placeholder: \"Describe what happened…\",\n required: true,\n },\n]\n","export interface FeedbackContextSnapshot {\n url: string\n path: string\n userAgent: string\n pageTitle: string | undefined\n timestamp: string\n viewport: { width: number; height: number }\n screen: { width: number; height: number }\n}\n\nexport function collectFeedbackContextSnapshot(): FeedbackContextSnapshot {\n const nav = typeof navigator !== \"undefined\" ? navigator : undefined\n const loc = typeof location !== \"undefined\" ? location : undefined\n const win = typeof window !== \"undefined\" ? window : undefined\n const doc = typeof document !== \"undefined\" ? document : undefined\n const viewport = {\n width: win?.innerWidth ?? 0,\n height: win?.innerHeight ?? 0,\n }\n const screenSize = {\n width: typeof screen !== \"undefined\" ? screen.width : 0,\n height: typeof screen !== \"undefined\" ? screen.height : 0,\n }\n return {\n url: loc?.href ?? \"\",\n path: loc?.pathname ?? \"\",\n userAgent: nav?.userAgent ?? \"\",\n pageTitle: doc?.title,\n timestamp: new Date().toISOString(),\n viewport,\n screen: screenSize,\n }\n}\n","import { copyToClipboard } from \"../../../internal/clipboard\"\nimport { showCopiedToast } from \"../../../ui/toast\"\nimport type { FormField, FormSurface, FormValue } from \"../../core/surface\"\nimport type {\n CloudAdapter,\n FeedbackPayload,\n FeedbackResult,\n View,\n ViewContext,\n} from \"../../core/types\"\nimport { renderPayloadMarkdown } from \"./markdown\"\nimport { feedbackFields, feedbackSchema } from \"./schema\"\nimport { collectFeedbackContextSnapshot } from \"./snapshot\"\n\nexport interface CreateFeedbackViewConfig {\n id: string\n resolveCloud: (\n ctx: ViewContext\n ) => CloudAdapter<unknown, unknown, unknown> | null\n componentId: (ctx: ViewContext) => string\n submitLabels: { ready: string; noCloud: string }\n successToast: (result: FeedbackResult) => string\n failureToast: (err: unknown) => string\n /**\n * Optional prefix prepended to `description` before submit/fallback-copy.\n * Used by sdk-feedback to stamp the SDK version in every report.\n */\n prependDescription?: () => string\n}\n\nfunction buildPayload(\n componentId: string,\n values: Record<string, FormValue>,\n prefix: string\n): FeedbackPayload {\n const snapshot = collectFeedbackContextSnapshot()\n const title = String(values.title ?? \"\").trim()\n const description = String(values.description ?? \"\").trim()\n return {\n type: (values.type as FeedbackPayload[\"type\"]) ?? \"bug\",\n severity: (values.severity as FeedbackPayload[\"severity\"]) ?? \"medium\",\n title: title || undefined,\n description: prefix ? `${prefix}${description}` : description,\n componentId,\n ...snapshot,\n }\n}\n\nasync function copyFallback(\n payload: FeedbackPayload,\n ctx: ViewContext,\n toastMessage: string\n): Promise<void> {\n const markdown = renderPayloadMarkdown(payload)\n const copied = await copyToClipboard(markdown)\n if (!copied) console.log(\"[uidex] feedback markdown:\\n\" + markdown)\n ctx.close()\n showCopiedToast(copied ? toastMessage : \"Copy failed\")\n}\n\nexport function createFeedbackView(config: CreateFeedbackViewConfig): View {\n const {\n id,\n resolveCloud,\n componentId,\n submitLabels,\n successToast,\n failureToast,\n prependDescription,\n } = config\n\n const fields: FormField[] = feedbackFields\n\n return {\n id,\n matches: () => false,\n searchable: false,\n hints: (ctx) => [\n {\n key: \"⌘↵\",\n label: resolveCloud(ctx) ? submitLabels.ready : submitLabels.noCloud,\n },\n ],\n focusTarget: (host) =>\n host.querySelector<HTMLElement>(\n \"[data-uidex-form='feedback'] select, [data-uidex-form='feedback'] input, [data-uidex-form='feedback'] textarea\"\n ),\n surface: (ctx): FormSurface => {\n const cloud = resolveCloud(ctx)\n return {\n kind: \"form\",\n id: \"feedback\",\n fields,\n schema: feedbackSchema,\n submit: {\n label: cloud ? submitLabels.ready : submitLabels.noCloud,\n onSubmit: async (values) => {\n const prefix = prependDescription ? prependDescription() : \"\"\n const payload = buildPayload(componentId(ctx), values, prefix)\n if (!cloud) {\n await copyFallback(payload, ctx, \"Copied to Clipboard\")\n return\n }\n try {\n const result = (await cloud.feedback.submit(\n payload\n )) as FeedbackResult\n ctx.close()\n showCopiedToast(successToast(result))\n return\n } catch (err) {\n await copyFallback(payload, ctx, failureToast(err))\n return\n }\n },\n },\n }\n },\n }\n}\n","import type { ShellAction, ViewContext } from \"../../core/types\"\nimport { BUILT_IN_VIEW_IDS } from \"../ids\"\nimport { createFeedbackView } from \"./view-builder\"\n\nexport function resolveSdkComponentId(ctx: ViewContext): string {\n const stack = ctx.getStack()\n const underlying = stack[stack.length - 2]\n return underlying ? `uidex-sdk:${underlying.id}` : \"uidex-sdk\"\n}\n\nfunction successToast(): string {\n return \"Thanks — your report was sent to uidex\"\n}\n\nexport const sdkFeedbackView = createFeedbackView({\n id: BUILT_IN_VIEW_IDS.sdkFeedback,\n resolveCloud: (ctx) => ctx.sdkCloud,\n componentId: (ctx) => resolveSdkComponentId(ctx),\n submitLabels: { ready: \"Send feedback\", noCloud: \"Copy report\" },\n successToast,\n failureToast: () => \"Couldn't reach uidex — copied report to clipboard\",\n prependDescription: () => `uidex-sdk v${UIDEX_SDK_VERSION}\\n\\n`,\n})\n\nexport function reportUidexIssueAction(ctx: ViewContext): ShellAction {\n return {\n id: \"report-uidex-issue\",\n label: \"Report uidex issue\",\n perform: () => ctx.push({ id: BUILT_IN_VIEW_IDS.sdkFeedback, ref: null }),\n intent: { kind: \"push\", viewId: BUILT_IN_VIEW_IDS.sdkFeedback },\n }\n}\n","export type ConsoleLevel = \"warn\" | \"error\"\n\nexport interface ConsoleEntry {\n level: ConsoleLevel\n message: string\n timestamp: string\n}\n\nexport interface ConsoleCaptureOptions {\n limit?: number\n target?: Console\n now?: () => Date\n}\n\nexport interface ConsoleCapture {\n start(): void\n stop(): void\n readonly isActive: boolean\n entries(): readonly ConsoleEntry[]\n clear(): void\n}\n\nconst DEFAULT_LIMIT = 50\nconst LEVELS: readonly ConsoleLevel[] = [\"warn\", \"error\"]\n\nfunction formatMessage(args: readonly unknown[]): string {\n return args\n .map((arg) => {\n if (typeof arg === \"string\") return arg\n if (arg instanceof Error) return arg.stack ?? arg.message\n try {\n return JSON.stringify(arg)\n } catch {\n return String(arg)\n }\n })\n .join(\" \")\n}\n\nexport function createConsoleCapture(\n options: ConsoleCaptureOptions = {}\n): ConsoleCapture {\n const limit = options.limit ?? DEFAULT_LIMIT\n const target = options.target ?? console\n const now = options.now ?? (() => new Date())\n const buffer: ConsoleEntry[] = []\n const originals: Partial<Record<ConsoleLevel, (...args: unknown[]) => void>> =\n {}\n let active = false\n\n function record(level: ConsoleLevel, args: readonly unknown[]): void {\n const entry: ConsoleEntry = {\n level,\n message: formatMessage(args),\n timestamp: now().toISOString(),\n }\n buffer.push(entry)\n if (buffer.length > limit) buffer.splice(0, buffer.length - limit)\n }\n\n function start(): void {\n if (active) return\n for (const level of LEVELS) {\n const original = target[level] as (...args: unknown[]) => void\n originals[level] = original\n const wrapped = (...args: unknown[]): void => {\n record(level, args)\n original.call(target, ...args)\n }\n ;(target as unknown as Record<string, unknown>)[level] = wrapped\n }\n active = true\n }\n\n function stop(): void {\n if (!active) return\n for (const level of LEVELS) {\n const original = originals[level]\n if (original) {\n ;(target as unknown as Record<string, unknown>)[level] = original\n }\n delete originals[level]\n }\n active = false\n }\n\n return {\n start,\n stop,\n get isActive() {\n return active\n },\n entries() {\n return buffer.slice()\n },\n clear() {\n buffer.length = 0\n },\n }\n}\n","// Captured at module load so `cloud.feedback.submit` (and anything else that\n// routes through this reference) is never observed by runtime fetch wrappers.\nexport const nativeFetch: typeof fetch | undefined =\n typeof globalThis !== \"undefined\" && typeof globalThis.fetch === \"function\"\n ? globalThis.fetch.bind(globalThis)\n : undefined\n\nexport function getNativeFetch(): typeof fetch | undefined {\n return nativeFetch\n}\n","import { nativeFetch } from \"./native-fetch\"\n\nexport interface NetworkEntry {\n method: string\n url: string\n status: number\n timestamp: string\n error?: string\n}\n\nexport interface NetworkCaptureOptions {\n limit?: number\n target?: {\n fetch?: typeof fetch\n }\n now?: () => Date\n}\n\nexport interface NetworkCapture {\n start(): void\n stop(): void\n readonly isActive: boolean\n entries(): readonly NetworkEntry[]\n clear(): void\n}\n\nconst DEFAULT_LIMIT = 20\n\nfunction resolveMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase()\n if (\n typeof input !== \"string\" &&\n !(input instanceof URL) &&\n \"method\" in input\n ) {\n return (input as Request).method.toUpperCase()\n }\n return \"GET\"\n}\n\nfunction resolveUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input\n if (input instanceof URL) return input.toString()\n return (input as Request).url\n}\n\nexport function createNetworkCapture(\n options: NetworkCaptureOptions = {}\n): NetworkCapture {\n const limit = options.limit ?? DEFAULT_LIMIT\n const target = (options.target ?? globalThis) as {\n fetch?: typeof fetch\n }\n const now = options.now ?? (() => new Date())\n const buffer: NetworkEntry[] = []\n let original: typeof fetch | undefined\n let active = false\n\n function push(entry: NetworkEntry): void {\n buffer.push(entry)\n if (buffer.length > limit) buffer.splice(0, buffer.length - limit)\n }\n\n function start(): void {\n if (active) return\n const baseline = target.fetch ?? nativeFetch\n if (!baseline) return\n original = baseline\n const wrapped: typeof fetch = async (input, init) => {\n const method = resolveMethod(input, init)\n const url = resolveUrl(input)\n try {\n const res = await baseline(input, init)\n if (res.status >= 400) {\n push({\n method,\n url,\n status: res.status,\n timestamp: now().toISOString(),\n })\n }\n return res\n } catch (err) {\n push({\n method,\n url,\n status: 0,\n timestamp: now().toISOString(),\n error: err instanceof Error ? err.message : String(err),\n })\n throw err\n }\n }\n target.fetch = wrapped\n active = true\n }\n\n function stop(): void {\n if (!active) return\n if (original) target.fetch = original\n original = undefined\n active = false\n }\n\n return {\n start,\n stop,\n get isActive() {\n return active\n },\n entries() {\n return buffer.slice()\n },\n clear() {\n buffer.length = 0\n },\n }\n}\n","import type { SessionStore } from \"../session\"\nimport {\n createConsoleCapture,\n type ConsoleCapture,\n type ConsoleCaptureOptions,\n} from \"./console\"\nimport {\n createNetworkCapture,\n type NetworkCapture,\n type NetworkCaptureOptions,\n} from \"./network\"\n\nexport type { ConsoleEntry, ConsoleLevel, ConsoleCapture } from \"./console\"\nexport type { NetworkEntry, NetworkCapture } from \"./network\"\nexport { createConsoleCapture } from \"./console\"\nexport { createNetworkCapture } from \"./network\"\nexport { getNativeFetch, nativeFetch } from \"./native-fetch\"\nexport type {\n CloudAdapter,\n ConsoleLogEntry,\n FeedbackExternalLink,\n FeedbackPayload,\n FeedbackResult,\n FeedbackSuggestedTarget,\n IngestConfig,\n IngestConfigEpic,\n NetworkErrorEntry,\n SourceRef,\n Viewport,\n} from \"./feedback-contract\"\n\nexport interface IngestOptions {\n captureConsole?: boolean\n captureNetwork?: boolean\n consoleLimit?: number\n networkLimit?: number\n consoleTarget?: ConsoleCaptureOptions[\"target\"]\n networkTarget?: NetworkCaptureOptions[\"target\"]\n now?: () => Date\n}\n\nexport interface Ingest {\n start(): void\n stop(): void\n readonly isActive: boolean\n readonly console: ConsoleCapture | null\n readonly network: NetworkCapture | null\n}\n\nexport interface CreateIngestOptions extends IngestOptions {\n session?: SessionStore\n}\n\nexport function createIngest(options: CreateIngestOptions = {}): Ingest {\n const { session, ...opts } = options\n const wantConsole = opts.captureConsole !== false\n const wantNetwork = opts.captureNetwork !== false\n\n const consoleCapture: ConsoleCapture | null = wantConsole\n ? createConsoleCapture({\n limit: opts.consoleLimit,\n target: opts.consoleTarget,\n now: opts.now,\n })\n : null\n const networkCapture: NetworkCapture | null = wantNetwork\n ? createNetworkCapture({\n limit: opts.networkLimit,\n target: opts.networkTarget,\n now: opts.now,\n })\n : null\n\n let active = false\n\n function start(): void {\n if (active) return\n consoleCapture?.start()\n networkCapture?.start()\n active = Boolean(consoleCapture?.isActive || networkCapture?.isActive)\n if (active) session?.getState().actions.setIngest(true)\n }\n\n function stop(): void {\n if (!active) return\n consoleCapture?.stop()\n networkCapture?.stop()\n active = false\n session?.getState().actions.setIngest(false)\n }\n\n return {\n start,\n stop,\n get isActive() {\n return active\n },\n console: consoleCapture,\n network: networkCapture,\n }\n}\n\nexport function resolveIngestOptions(\n explicit: IngestOptions | null | undefined,\n hasCloud: boolean\n): IngestOptions | null {\n if (explicit === null) return null\n if (explicit === undefined) {\n return hasCloud ? { captureConsole: true, captureNetwork: true } : null\n }\n if (explicit.captureConsole === false && explicit.captureNetwork === false) {\n return null\n }\n return explicit\n}\n","export type Cleanup = () => void\n\nexport interface Disposable {\n destroy(): void\n}\n\nexport interface CleanupStack {\n add(cleanup: Cleanup | Disposable | null | undefined): void\n drain(): void\n}\n\nexport function createCleanupStack(): CleanupStack {\n const stack: Cleanup[] = []\n return {\n add(cleanup) {\n if (!cleanup) return\n if (typeof cleanup === \"function\") stack.push(cleanup)\n else stack.push(() => cleanup.destroy())\n },\n drain() {\n for (let i = stack.length - 1; i >= 0; i--) {\n try {\n stack[i]()\n } catch (err) {\n console.error(\"[uidex] cleanup threw\", err)\n }\n }\n stack.length = 0\n },\n }\n}\n\nexport function composeCleanups(cleanups: readonly Cleanup[]): Cleanup {\n return () => {\n for (let i = cleanups.length - 1; i >= 0; i--) {\n try {\n cleanups[i]?.()\n } catch (err) {\n console.error(\"[uidex] cleanup threw\", err)\n }\n }\n }\n}\n","import { createActor, type Actor } from \"xstate\"\nimport { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport { sameRef } from \"../entities\"\nimport { highlightMachine, type HighlightContext } from \"../flows/highlight\"\nimport {\n surfaceMachine,\n type SurfaceEvent,\n type SurfaceInput,\n} from \"../flows/surface\"\nimport type {\n ResolvedTheme,\n SessionSnapshot,\n SessionState,\n ThemePreference,\n ViewStackEntry,\n} from \"./types\"\n\nexport type SessionStore = StoreApi<SessionState> & {\n send(event: SurfaceEvent): void\n}\n\nexport interface SurfaceBindings {\n mountInspector?: () => void\n destroyInspector?: () => void\n openActionsPopup?: () => void\n closePopup?: () => void\n}\n\nexport interface HighlightBindings {\n showOverlay?: (context: HighlightContext) => void\n hideOverlay?: () => void\n updateOverlay?: (context: HighlightContext) => void\n}\n\nexport interface SessionBindings {\n surface?: SurfaceBindings\n highlight?: HighlightBindings\n}\n\nexport interface CreateSessionOptions extends Partial<SessionSnapshot> {\n detectTheme?: () => ResolvedTheme\n /**\n * Action implementations injected into the surface machine and its\n * highlight child actor. Implementations may be closures that read from\n * mutable refs filled in after `createSession` returns (e.g., the SDK's\n * shell isn't available until `mount`).\n */\n bindings?: SessionBindings\n}\n\nconst defaultSnapshot: SessionSnapshot = {\n hover: null,\n selection: null,\n stack: [],\n pinnedHighlight: null,\n inspectorActive: false,\n theme: \"auto\",\n resolvedTheme: \"light\",\n ingestActive: false,\n}\n\nexport function resolveTheme(\n preference: ThemePreference,\n detect?: () => ResolvedTheme\n): ResolvedTheme {\n if (preference !== \"auto\") return preference\n if (detect) return detect()\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { matchMedia?: unknown }).matchMedia === \"function\"\n ) {\n const mql = (\n globalThis as {\n matchMedia: (q: string) => { matches: boolean }\n }\n ).matchMedia(\"(prefers-color-scheme: dark)\")\n return mql.matches ? \"dark\" : \"light\"\n }\n return \"light\"\n}\n\ntype SurfaceActor = Actor<typeof surfaceMachine>\n\nfunction projectFromActor(actor: SurfaceActor): SessionSnapshot {\n const sn = actor.getSnapshot()\n const child = sn.children.highlight\n const childSnapshot = child?.getSnapshot()\n const pinned =\n childSnapshot && childSnapshot.value === \"pinned\"\n ? childSnapshot.context.pinnedRef\n : null\n return {\n hover: sn.context.hover,\n selection: sn.context.selection,\n stack: sn.context.stack,\n pinnedHighlight: pinned,\n inspectorActive: sn.matches(\"inspecting\"),\n theme: sn.context.theme,\n resolvedTheme: sn.context.resolvedTheme,\n ingestActive: sn.context.ingestActive,\n }\n}\n\nexport function createSession(\n options: CreateSessionOptions = {}\n): SessionStore {\n const { detectTheme, bindings, ...overrides } = options\n const initialPref: ThemePreference = overrides.theme ?? defaultSnapshot.theme\n const initialResolved: ResolvedTheme =\n overrides.resolvedTheme ?? resolveTheme(initialPref, detectTheme)\n const initialStack: ViewStackEntry[] = overrides.stack ?? []\n\n const input: SurfaceInput = {\n hover: overrides.hover ?? null,\n selection: overrides.selection ?? null,\n pinnedHighlight: null,\n theme: initialPref,\n resolvedTheme: initialResolved,\n ingestActive: overrides.ingestActive ?? false,\n }\n\n const providedHighlight = highlightMachine.provide({\n actions: {\n showOverlay: ({ context }) => bindings?.highlight?.showOverlay?.(context),\n hideOverlay: () => bindings?.highlight?.hideOverlay?.(),\n updateOverlay: ({ context }) =>\n bindings?.highlight?.updateOverlay?.(context),\n },\n })\n\n const providedSurface = surfaceMachine.provide({\n actions: {\n mountInspector: () => bindings?.surface?.mountInspector?.(),\n destroyInspector: () => bindings?.surface?.destroyInspector?.(),\n openActionsPopup: () => bindings?.surface?.openActionsPopup?.(),\n closePopup: () => bindings?.surface?.closePopup?.(),\n },\n actors: {\n highlight: providedHighlight,\n },\n })\n\n const actor = createActor(providedSurface, { input })\n actor.start()\n\n // Hydrate initial state via events (idle.entry resets stack, so we cannot\n // pass it through input).\n if (initialStack.length > 0) {\n actor.send({ type: \"OPEN_PALETTE\" })\n for (let i = 1; i < initialStack.length; i++) {\n actor.send({ type: \"PUSH_VIEW\", entry: initialStack[i] })\n }\n } else if (overrides.inspectorActive) {\n actor.send({ type: \"TOGGLE_INSPECTOR\" })\n }\n if (overrides.pinnedHighlight) {\n actor.send({ type: \"PIN\", ref: overrides.pinnedHighlight })\n }\n\n const store = createStore<SessionState>((_set, get) => ({\n ...projectFromActor(actor),\n actions: {\n hover(ref) {\n if (sameRef(get().hover, ref)) return\n if (ref === null) {\n actor.send({ type: \"UNHOVER\" })\n } else {\n actor.send({ type: \"HOVER\", ref, element: null })\n }\n },\n select(ref) {\n if (sameRef(get().selection, ref)) return\n actor.send({ type: \"SET_SELECTION\", ref })\n },\n pushStack(entry) {\n if (entry.id === \"command-palette\" && get().stack.length === 0) {\n actor.send({ type: \"OPEN_PALETTE\" })\n } else {\n actor.send({ type: \"PUSH_VIEW\", entry })\n }\n },\n popStack() {\n const sn = actor.getSnapshot()\n if (sn.matches(\"palette\")) {\n actor.send({ type: \"ESC\" })\n } else if (sn.matches(\"viewing\")) {\n actor.send({ type: \"POP_VIEW\" })\n }\n },\n clearStack() {\n if (get().stack.length === 0) return\n actor.send({ type: \"CLOSE\" })\n },\n openView(id, ref) {\n const resolvedRef = ref === undefined ? get().selection : ref\n get().actions.pushStack({ id, ref: resolvedRef })\n },\n closeView() {\n get().actions.clearStack()\n },\n setInspectorActive(active) {\n if (get().inspectorActive === active) return\n actor.send({ type: \"TOGGLE_INSPECTOR\" })\n },\n toggleInspector() {\n actor.send({ type: \"TOGGLE_INSPECTOR\" })\n },\n pinHighlight(ref) {\n if (sameRef(get().pinnedHighlight, ref)) return\n actor.send({ type: \"PIN\", ref })\n },\n clearPinnedHighlight() {\n if (get().pinnedHighlight === null) return\n actor.send({ type: \"UNPIN\" })\n },\n setTheme(theme, resolved) {\n const state = get()\n const nextResolved = resolved ?? resolveTheme(theme, detectTheme)\n if (state.theme === theme && state.resolvedTheme === nextResolved)\n return\n actor.send({ type: \"SET_THEME\", theme, resolvedTheme: nextResolved })\n },\n setIngest(active) {\n if (get().ingestActive === active) return\n actor.send({ type: \"SET_INGEST\", active })\n },\n },\n }))\n\n const projectAndSet = (): void => {\n const next = projectFromActor(actor)\n const prev = store.getState()\n const updates: Partial<SessionSnapshot> = {}\n if (!sameRef(prev.hover, next.hover)) updates.hover = next.hover\n if (!sameRef(prev.selection, next.selection))\n updates.selection = next.selection\n if (prev.stack !== next.stack) updates.stack = next.stack\n if (!sameRef(prev.pinnedHighlight, next.pinnedHighlight))\n updates.pinnedHighlight = next.pinnedHighlight\n if (prev.inspectorActive !== next.inspectorActive)\n updates.inspectorActive = next.inspectorActive\n if (prev.theme !== next.theme) updates.theme = next.theme\n if (prev.resolvedTheme !== next.resolvedTheme)\n updates.resolvedTheme = next.resolvedTheme\n if (prev.ingestActive !== next.ingestActive)\n updates.ingestActive = next.ingestActive\n if (Object.keys(updates).length === 0) return\n store.setState(updates)\n }\n actor.subscribe(projectAndSet)\n\n const session = store as SessionStore\n session.send = (event) => actor.send(event)\n return session\n}\n","import { assign, setup } from \"xstate\"\n\nimport type { EntityRef } from \"../entities/types\"\n\nexport interface HighlightContext {\n ref: EntityRef | null\n element: HTMLElement | null\n pinnedRef: EntityRef | null\n color: string | null\n}\n\nexport type HighlightEvent =\n | {\n type: \"HOVER\"\n ref: EntityRef\n element: HTMLElement\n color?: string | null\n }\n | { type: \"UNHOVER\" }\n | { type: \"PIN\"; ref?: EntityRef }\n | { type: \"UNPIN\" }\n\nconst initialContext: HighlightContext = {\n ref: null,\n element: null,\n pinnedRef: null,\n color: null,\n}\n\nexport const highlightMachine = setup({\n types: {} as {\n context: HighlightContext\n events: HighlightEvent\n },\n actions: {\n showOverlay: () => {},\n hideOverlay: () => {},\n updateOverlay: () => {},\n },\n}).createMachine({\n id: \"highlight\",\n initial: \"none\",\n context: initialContext,\n states: {\n none: {\n entry: [\n assign({\n ref: null,\n element: null,\n pinnedRef: null,\n color: null,\n }),\n { type: \"hideOverlay\" },\n ],\n on: {\n HOVER: {\n target: \"transient\",\n actions: assign(({ event }) => ({\n ref: event.ref,\n element: event.element,\n color: event.color ?? null,\n })),\n },\n PIN: {\n target: \"pinned\",\n actions: assign(({ context, event }) => ({\n ref: event.ref ?? context.ref,\n pinnedRef: event.ref ?? context.ref,\n })),\n },\n },\n },\n transient: {\n entry: { type: \"showOverlay\" },\n on: {\n HOVER: {\n actions: [\n assign(({ event }) => ({\n ref: event.ref,\n element: event.element,\n color: event.color ?? null,\n })),\n { type: \"updateOverlay\" },\n ],\n },\n UNHOVER: { target: \"none\" },\n PIN: {\n target: \"pinned\",\n actions: assign(({ context, event }) => ({\n pinnedRef: event.ref ?? context.ref,\n })),\n },\n },\n },\n pinned: {\n entry: { type: \"showOverlay\" },\n on: {\n UNPIN: { target: \"none\" },\n },\n },\n },\n})\n","import { assign, forwardTo, sendTo, setup } from \"xstate\"\n\nimport type { EntityRef } from \"../entities/types\"\nimport type {\n ResolvedTheme,\n ThemePreference,\n ViewStackEntry,\n} from \"../session/types\"\nimport { highlightMachine } from \"./highlight\"\n\nexport interface SurfaceContext {\n stack: ViewStackEntry[]\n hover: EntityRef | null\n selection: EntityRef | null\n pinnedHighlight: EntityRef | null\n theme: ThemePreference\n resolvedTheme: ResolvedTheme\n ingestActive: boolean\n}\n\nexport type SurfaceEvent =\n | { type: \"TOGGLE_INSPECTOR\" }\n | { type: \"OPEN_PALETTE\" }\n | { type: \"PUSH_VIEW\"; entry: ViewStackEntry }\n | { type: \"POP_VIEW\" }\n | { type: \"CLOSE\" }\n | { type: \"ESC\" }\n | { type: \"CMD_K\" }\n | { type: \"SELECT\"; ref: EntityRef | null; entry: ViewStackEntry }\n | { type: \"SET_SELECTION\"; ref: EntityRef | null }\n | {\n type: \"HOVER\"\n ref: EntityRef\n element: HTMLElement | null\n color?: string | null\n }\n | { type: \"UNHOVER\" }\n | { type: \"PIN\"; ref?: EntityRef }\n | { type: \"UNPIN\" }\n | {\n type: \"SET_THEME\"\n theme: ThemePreference\n resolvedTheme: ResolvedTheme\n }\n | { type: \"SET_INGEST\"; active: boolean }\n\nexport type SurfaceInput = Partial<SurfaceContext>\n\nconst initialContext: SurfaceContext = {\n stack: [],\n hover: null,\n selection: null,\n pinnedHighlight: null,\n theme: \"auto\",\n resolvedTheme: \"light\",\n ingestActive: false,\n}\n\nexport const surfaceMachine = setup({\n types: {} as {\n context: SurfaceContext\n events: SurfaceEvent\n children: { highlight: \"highlight\" }\n },\n actors: {\n highlight: highlightMachine,\n },\n actions: {\n mountInspector: () => {},\n destroyInspector: () => {},\n openActionsPopup: () => {},\n closePopup: () => {},\n },\n guards: {\n hasPinnedHighlight: ({ context }) => context.pinnedHighlight !== null,\n hasActions: () => false,\n popupOpen: () => false,\n stackDeeperThanTwo: ({ context }) => context.stack.length > 2,\n stackEqualsTwo: ({ context }) => context.stack.length === 2,\n stackEqualsOne: ({ context }) => context.stack.length === 1,\n paletteAtBottomDepthTwo: ({ context }) =>\n context.stack.length === 2 && context.stack[0]?.id === \"command-palette\",\n },\n}).createMachine({\n id: \"surface\",\n initial: \"idle\",\n context: ({ input }) => ({\n ...initialContext,\n ...((input as SurfaceInput | undefined) ?? {}),\n }),\n invoke: {\n id: \"highlight\",\n src: \"highlight\",\n },\n on: {\n HOVER: {\n actions: [\n assign(({ event }) => ({ hover: event.ref })),\n forwardTo(\"highlight\"),\n ],\n },\n UNHOVER: {\n actions: [assign({ hover: null }), forwardTo(\"highlight\")],\n },\n PIN: {\n actions: [\n assign(({ context, event }) => ({\n pinnedHighlight: event.ref ?? context.hover,\n })),\n forwardTo(\"highlight\"),\n ],\n },\n UNPIN: {\n actions: [assign({ pinnedHighlight: null }), forwardTo(\"highlight\")],\n },\n SET_SELECTION: {\n actions: assign(({ event }) => ({ selection: event.ref })),\n },\n SET_THEME: {\n actions: assign(({ event }) => ({\n theme: event.theme,\n resolvedTheme: event.resolvedTheme,\n })),\n },\n SET_INGEST: {\n actions: assign(({ event }) => ({ ingestActive: event.active })),\n },\n },\n states: {\n idle: {\n entry: assign({ stack: [] }),\n on: {\n TOGGLE_INSPECTOR: { target: \"inspecting\" },\n OPEN_PALETTE: { target: \"palette\" },\n PUSH_VIEW: {\n target: \"viewing\",\n actions: assign(({ event }) => ({ stack: [event.entry] })),\n },\n ESC: {\n guard: \"hasPinnedHighlight\",\n actions: [\n assign({ pinnedHighlight: null }),\n sendTo(\"highlight\", { type: \"UNPIN\" }),\n ],\n },\n },\n },\n inspecting: {\n entry: { type: \"mountInspector\" },\n exit: { type: \"destroyInspector\" },\n on: {\n SELECT: {\n target: \"viewing\",\n actions: assign(({ context, event }) => ({\n selection: event.ref,\n stack: [...context.stack, event.entry],\n })),\n },\n PUSH_VIEW: {\n target: \"viewing\",\n actions: assign(({ event }) => ({ stack: [event.entry] })),\n },\n TOGGLE_INSPECTOR: { target: \"idle\" },\n OPEN_PALETTE: { target: \"palette\" },\n ESC: { target: \"idle\" },\n },\n },\n palette: {\n entry: assign({ stack: [{ id: \"command-palette\", ref: null }] }),\n on: {\n PUSH_VIEW: {\n target: \"viewing\",\n actions: assign(({ context, event }) => ({\n stack: [...context.stack, event.entry],\n })),\n },\n CLOSE: { target: \"idle\" },\n ESC: { target: \"idle\" },\n CMD_K: [\n {\n guard: \"hasActions\",\n actions: { type: \"openActionsPopup\" },\n },\n { target: \"idle\" },\n ],\n },\n },\n viewing: {\n on: {\n PUSH_VIEW: {\n actions: assign(({ context, event }) => ({\n stack: [...context.stack, event.entry],\n })),\n },\n POP_VIEW: [\n {\n guard: \"stackDeeperThanTwo\",\n actions: assign(({ context }) => ({\n stack: context.stack.slice(0, -1),\n })),\n },\n {\n guard: \"paletteAtBottomDepthTwo\",\n target: \"palette\",\n },\n {\n guard: \"stackEqualsTwo\",\n actions: assign(({ context }) => ({\n stack: context.stack.slice(0, -1),\n })),\n },\n {\n guard: \"stackEqualsOne\",\n target: \"idle\",\n },\n ],\n CLOSE: { target: \"idle\" },\n ESC: [\n {\n guard: \"popupOpen\",\n actions: { type: \"closePopup\" },\n },\n {\n guard: \"stackDeeperThanTwo\",\n actions: assign(({ context }) => ({\n stack: context.stack.slice(0, -1),\n })),\n },\n {\n guard: \"paletteAtBottomDepthTwo\",\n target: \"palette\",\n },\n {\n guard: \"stackEqualsTwo\",\n actions: assign(({ context }) => ({\n stack: context.stack.slice(0, -1),\n })),\n },\n {\n guard: \"stackEqualsOne\",\n target: \"idle\",\n },\n ],\n },\n },\n },\n})\n","/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-amber-300: oklch(87.9% 0.169 91.605);\n --color-amber-400: oklch(82.8% 0.189 84.429);\n --color-amber-500: oklch(76.9% 0.188 70.08);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-emerald-300: oklch(84.5% 0.143 164.978);\n --color-emerald-400: oklch(76.5% 0.177 163.223);\n --color-emerald-500: oklch(69.6% 0.17 162.48);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-cyan-300: oklch(86.5% 0.127 207.078);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-blue-300: oklch(80.9% 0.105 251.813);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-violet-300: oklch(81.1% 0.111 293.571);\n --color-violet-400: oklch(70.2% 0.183 293.541);\n --color-violet-700: oklch(49.1% 0.27 292.581);\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-rose-300: oklch(81% 0.117 11.638);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-slate-300: oklch(86.9% 0.022 252.894);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-700: oklch(37.2% 0.044 257.287);\n --color-neutral-50: oklch(98.5% 0 0);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-neutral-800: oklch(26.9% 0 0);\n --color-neutral-950: oklch(14.5% 0 0);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-xl: 36rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --tracking-widest: 0.1em;\n --leading-relaxed: 1.625;\n --radius-xl: calc(var(--radius) * 1.4);\n --radius-2xl: calc(var(--radius) * 1.8);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --blur-sm: 8px;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n Roboto, sans-serif;\n --default-mono-font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n --color-border: var(--border);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none;\n }\n .invisible {\n visibility: hidden;\n }\n .visible {\n visibility: visible;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .start {\n inset-inline-start: var(--spacing);\n }\n .end {\n inset-inline-end: var(--spacing);\n }\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n .bottom-12 {\n bottom: calc(var(--spacing) * 12);\n }\n .z-10 {\n z-index: 10;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .-mx-px {\n margin-inline: -1px;\n }\n .mx-1 {\n margin-inline: calc(var(--spacing) * 1);\n }\n .mx-2 {\n margin-inline: calc(var(--spacing) * 2);\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1);\n }\n .ms-auto {\n margin-inline-start: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .ml-auto {\n margin-left: auto;\n }\n .block {\n display: block;\n }\n .contents {\n display: contents;\n }\n .flex {\n display: flex;\n }\n .hidden {\n display: none;\n }\n .inline {\n display: inline;\n }\n .inline-block {\n display: inline-block;\n }\n .inline-flex {\n display: inline-flex;\n }\n .list-item {\n display: list-item;\n }\n .table {\n display: table;\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n .size-4 {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n .size-6 {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n .size-7 {\n width: calc(var(--spacing) * 7);\n height: calc(var(--spacing) * 7);\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .h-3\\.5 {\n height: calc(var(--spacing) * 3.5);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-4\\.5 {\n height: calc(var(--spacing) * 4.5);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-5\\.5 {\n height: calc(var(--spacing) * 5.5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-7 {\n height: calc(var(--spacing) * 7);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .h-\\[26rem\\] {\n height: 26rem;\n }\n .h-auto {\n height: auto;\n }\n .h-full {\n height: 100%;\n }\n .h-px {\n height: 1px;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-7 {\n min-height: calc(var(--spacing) * 7);\n }\n .min-h-8 {\n min-height: calc(var(--spacing) * 8);\n }\n .min-h-20 {\n min-height: calc(var(--spacing) * 20);\n }\n .w-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\n }\n .w-auto {\n width: auto;\n }\n .w-full {\n width: 100%;\n }\n .w-px {\n width: 1px;\n }\n .max-w-xl {\n max-width: var(--container-xl);\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0);\n }\n .min-w-4 {\n min-width: calc(var(--spacing) * 4);\n }\n .min-w-4\\.5 {\n min-width: calc(var(--spacing) * 4.5);\n }\n .min-w-5 {\n min-width: calc(var(--spacing) * 5);\n }\n .min-w-5\\.5 {\n min-width: calc(var(--spacing) * 5.5);\n }\n .min-w-32 {\n min-width: calc(var(--spacing) * 32);\n }\n .flex-1 {\n flex: 1;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .cursor-default {\n cursor: default;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .resize {\n resize: both;\n }\n .scroll-py-2 {\n scroll-padding-block: calc(var(--spacing) * 2);\n }\n .list-none {\n list-style-type: none;\n }\n .appearance-none {\n appearance: none;\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .gap-0 {\n gap: calc(var(--spacing) * 0);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .self-start {\n align-self: flex-start;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-2xl {\n border-radius: calc(var(--radius) * 1.8);\n }\n .rounded-\\[0\\.25rem\\] {\n border-radius: 0.25rem;\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) * 0.8);\n }\n .rounded-sm {\n border-radius: calc(var(--radius) * 0.6);\n }\n .rounded-t-xl {\n border-top-left-radius: calc(var(--radius) * 1.4);\n border-top-right-radius: calc(var(--radius) * 1.4);\n }\n .rounded-b-\\[calc\\(var\\(--radius-2xl\\)-1px\\)\\] {\n border-bottom-right-radius: calc(var(--radius-2xl) - 1px);\n border-bottom-left-radius: calc(var(--radius-2xl) - 1px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-b-0 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n .border-border {\n border-color: var(--border);\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-input {\n border-color: var(--input);\n }\n .border-primary {\n border-color: var(--primary);\n }\n .border-transparent {\n border-color: transparent;\n }\n .bg-amber-400\\/20 {\n background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);\n }\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-black\\/32 {\n background-color: color-mix(in srgb, #000 32%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 32%, transparent);\n }\n }\n .bg-blue-400\\/20 {\n background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-400) 20%, transparent);\n }\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-cyan-400\\/20 {\n background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-cyan-400) 20%, transparent);\n }\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-destructive\\/10 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n .bg-emerald-400\\/20 {\n background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-400) 20%, transparent);\n }\n }\n .bg-fuchsia-400\\/20 {\n background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);\n }\n }\n .bg-info\\/10 {\n background-color: var(--info);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--info) 10%, transparent);\n }\n }\n .bg-muted {\n background-color: var(--muted);\n }\n .bg-popover {\n background-color: var(--popover);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-rose-400\\/20 {\n background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);\n }\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-slate-400\\/20 {\n background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);\n }\n }\n .bg-success\\/10 {\n background-color: var(--success);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--success) 10%, transparent);\n }\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-violet-400\\/20 {\n background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-violet-400) 20%, transparent);\n }\n }\n .bg-warning\\/10 {\n background-color: var(--warning);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--warning) 10%, transparent);\n }\n }\n .bg-clip-padding {\n background-clip: padding-box;\n }\n .bg-\\[right_0\\.5rem_center\\] {\n background-position: right 0.5rem center;\n }\n .bg-no-repeat {\n background-repeat: no-repeat;\n }\n .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .px-0 {\n padding-inline: calc(var(--spacing) * 0);\n }\n .px-1 {\n padding-inline: calc(var(--spacing) * 1);\n }\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-3\\.5 {\n padding-inline: calc(var(--spacing) * 3.5);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-5 {\n padding-inline: calc(var(--spacing) * 5);\n }\n .py-0 {\n padding-block: calc(var(--spacing) * 0);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n .py-\\[max\\(1rem\\,4vh\\)\\] {\n padding-block: max(1rem, 4vh);\n }\n .ps-2 {\n padding-inline-start: calc(var(--spacing) * 2);\n }\n .pe-3 {\n padding-inline-end: calc(var(--spacing) * 3);\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8);\n }\n .pl-3 {\n padding-left: calc(var(--spacing) * 3);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .font-mono {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n }\n .font-sans {\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n Roboto, sans-serif;\n }\n .text-base {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n .text-base\\/4\\.5 {\n font-size: var(--text-base);\n line-height: calc(var(--spacing) * 4.5);\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .text-\\[0\\.625rem\\] {\n font-size: 0.625rem;\n }\n .leading-relaxed {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-normal {\n --tw-font-weight: var(--font-weight-normal);\n font-weight: var(--font-weight-normal);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .whitespace-normal {\n white-space: normal;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-blue-700 {\n color: var(--color-blue-700);\n }\n .text-cyan-700 {\n color: var(--color-cyan-700);\n }\n .text-destructive-foreground {\n color: var(--destructive-foreground);\n }\n .text-emerald-700 {\n color: var(--color-emerald-700);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-fuchsia-700 {\n color: var(--color-fuchsia-700);\n }\n .text-info-foreground {\n color: var(--info-foreground);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-muted-foreground\\/70 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 70%, transparent);\n }\n }\n .text-popover-foreground {\n color: var(--popover-foreground);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-rose-700 {\n color: var(--color-rose-700);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-slate-700 {\n color: var(--color-slate-700);\n }\n .text-success-foreground {\n color: var(--success-foreground);\n }\n .text-violet-700 {\n color: var(--color-violet-700);\n }\n .text-warning-foreground {\n color: var(--warning-foreground);\n }\n .text-white {\n color: var(--color-white);\n }\n .lowercase {\n text-transform: lowercase;\n }\n .line-through {\n text-decoration-line: line-through;\n }\n .underline {\n text-decoration-line: underline;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .accent-accent {\n accent-color: var(--accent);\n }\n .accent-primary {\n accent-color: var(--primary);\n }\n .opacity-80 {\n opacity: 80%;\n }\n .shadow-lg\\/5 {\n --tw-shadow-alpha: 5%;\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 5%)), 0 4px 6px -4px var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 5%));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs\\/5 {\n --tw-shadow-alpha: 5%;\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, oklab(from rgb(0 0 0 / 0.05) l a b / 5%));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-none {\n --tw-shadow: 0 0 #0000;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .filter {\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .backdrop-blur-sm {\n --tw-backdrop-blur: blur(var(--blur-sm));\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .ease-out {\n --tw-ease: var(--ease-out);\n transition-timing-function: var(--ease-out);\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .\\[clip-path\\:inset\\(0_1px\\)\\] {\n clip-path: inset(0 1px);\n }\n .not-dark\\:bg-clip-padding {\n &:not(*:is(.dark *)) {\n background-clip: padding-box;\n }\n }\n .group-data-hover\\:bg-amber-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-blue-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-cyan-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-emerald-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-fuchsia-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-fuchsia-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-rose-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-slate-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-400) 30%, transparent);\n }\n }\n }\n .group-data-hover\\:bg-violet-400\\/30 {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);\n }\n }\n }\n .placeholder\\:text-muted-foreground {\n &::placeholder {\n color: var(--muted-foreground);\n }\n }\n .before\\:pointer-events-none {\n &::before {\n content: var(--tw-content);\n pointer-events: none;\n }\n }\n .before\\:absolute {\n &::before {\n content: var(--tw-content);\n position: absolute;\n }\n }\n .before\\:inset-0 {\n &::before {\n content: var(--tw-content);\n inset: calc(var(--spacing) * 0);\n }\n }\n .before\\:rounded-\\[calc\\(var\\(--radius-2xl\\)-1px\\)\\] {\n &::before {\n content: var(--tw-content);\n border-radius: calc(var(--radius-2xl) - 1px);\n }\n }\n .before\\:rounded-t-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {\n &::before {\n content: var(--tw-content);\n border-top-left-radius: calc(var(--radius-xl) - 1px);\n border-top-right-radius: calc(var(--radius-xl) - 1px);\n }\n }\n .before\\:bg-muted\\/72 {\n &::before {\n content: var(--tw-content);\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 72%, transparent);\n }\n }\n }\n .before\\:shadow-\\[0_1px_--theme\\(--color-black\\/4\\%\\)\\] {\n &::before {\n content: var(--tw-content);\n --tw-shadow: 0 1px var(--tw-shadow-color, color-mix(in srgb, #000 4%, transparent));\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow: 0 1px var(--tw-shadow-color, color-mix(in oklab, var(--color-black) 4%, transparent));\n }\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-within\\:border-ring {\n &:focus-within {\n border-color: var(--ring);\n }\n }\n .focus-within\\:bg-accent {\n &:focus-within {\n background-color: var(--accent);\n }\n }\n .focus-within\\:text-accent-foreground {\n &:focus-within {\n color: var(--accent-foreground);\n }\n }\n .focus-within\\:ring-\\[3px\\] {\n &:focus-within {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-within\\:ring-ring\\/30 {\n &:focus-within {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 30%, transparent);\n }\n }\n }\n .hover\\:border-destructive\\/30 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-destructive\\/5 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 5%, transparent);\n }\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--accent);\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-2 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n }\n }\n .focus-visible\\:ring-ring\\/30 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 30%, transparent);\n }\n }\n }\n .focus-visible\\:ring-offset-1 {\n &:focus-visible {\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus-visible\\:ring-offset-background {\n &:focus-visible {\n --tw-ring-offset-color: var(--background);\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed;\n }\n }\n .disabled\\:opacity-60 {\n &:disabled {\n opacity: 60%;\n }\n }\n .has-disabled\\:opacity-60 {\n &:has(*:disabled) {\n opacity: 60%;\n }\n }\n .aria-invalid\\:border-destructive\\/40 {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n .aria-invalid\\:focus-visible\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\]\\:opacity-60 {\n &[data-disabled] {\n opacity: 60%;\n }\n }\n .data-\\[disabled\\]\\:opacity-64 {\n &[data-disabled] {\n opacity: 64%;\n }\n }\n .data-\\[highlighted\\]\\:bg-accent {\n &[data-highlighted] {\n background-color: var(--accent);\n }\n }\n .data-\\[highlighted\\]\\:text-accent-foreground {\n &[data-highlighted] {\n color: var(--accent-foreground);\n }\n }\n .sm\\:min-h-7 {\n @media (width >= 40rem) {\n min-height: calc(var(--spacing) * 7);\n }\n }\n .sm\\:py-\\[10vh\\] {\n @media (width >= 40rem) {\n padding-block: 10vh;\n }\n }\n .sm\\:text-sm {\n @media (width >= 40rem) {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .sm\\:text-sm\\/4 {\n @media (width >= 40rem) {\n font-size: var(--text-sm);\n line-height: calc(var(--spacing) * 4);\n }\n }\n .dark\\:bg-amber-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-blue-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-cyan-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-cyan-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-destructive\\/20 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .dark\\:bg-emerald-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-fuchsia-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-fuchsia-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-info\\/20 {\n &:is(.dark *) {\n background-color: var(--info);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--info) 20%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:bg-rose-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-slate-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-success\\/20 {\n &:is(.dark *) {\n background-color: var(--success);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--success) 20%, transparent);\n }\n }\n }\n .dark\\:bg-violet-400\\/10 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-violet-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-warning\\/20 {\n &:is(.dark *) {\n background-color: var(--warning);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--warning) 20%, transparent);\n }\n }\n }\n .dark\\:text-amber-300 {\n &:is(.dark *) {\n color: var(--color-amber-300);\n }\n }\n .dark\\:text-blue-300 {\n &:is(.dark *) {\n color: var(--color-blue-300);\n }\n }\n .dark\\:text-cyan-300 {\n &:is(.dark *) {\n color: var(--color-cyan-300);\n }\n }\n .dark\\:text-emerald-300 {\n &:is(.dark *) {\n color: var(--color-emerald-300);\n }\n }\n .dark\\:text-fuchsia-300 {\n &:is(.dark *) {\n color: var(--color-fuchsia-300);\n }\n }\n .dark\\:text-rose-300 {\n &:is(.dark *) {\n color: var(--color-rose-300);\n }\n }\n .dark\\:text-slate-300 {\n &:is(.dark *) {\n color: var(--color-slate-300);\n }\n }\n .dark\\:text-violet-300 {\n &:is(.dark *) {\n color: var(--color-violet-300);\n }\n }\n .dark\\:group-data-hover\\:bg-amber-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-blue-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-cyan-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-cyan-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-emerald-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-fuchsia-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(74% 0.238 322.16) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-fuchsia-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-rose-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-slate-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:group-data-hover\\:bg-violet-400\\/15 {\n &:is(.dark *) {\n &:is(:where(.group)[data-hover] *) {\n background-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-violet-400) 15%, transparent);\n }\n }\n }\n }\n .dark\\:before\\:shadow-\\[0_-1px_--theme\\(--color-white\\/6\\%\\)\\] {\n &:is(.dark *) {\n &::before {\n content: var(--tw-content);\n --tw-shadow: 0 -1px var(--tw-shadow-color, color-mix(in srgb, #fff 6%, transparent));\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow: 0 -1px var(--tw-shadow-color, color-mix(in oklab, var(--color-white) 6%, transparent));\n }\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'opacity-\\'\\]\\)\\]\\:opacity-80 {\n & svg:not([class*='opacity-']) {\n opacity: 80%;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n}\n@layer base {\n *, ::after, ::before {\n border-color: var(--color-border, currentColor);\n }\n}\n@layer components {\n .uidex-scrollbar {\n scrollbar-width: thin;\n scrollbar-color: var(--muted-foreground) transparent;\n @supports (color: color-mix(in lab, red, red)) {\n scrollbar-color: color-mix(in srgb, var(--muted-foreground) 40%, transparent) transparent;\n }\n }\n .uidex-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .uidex-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n }\n .uidex-scrollbar::-webkit-scrollbar-thumb {\n background-color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix( in srgb, var(--muted-foreground) 35%, transparent );\n }\n border-radius: 9999px;\n border: 2px solid transparent;\n background-clip: content-box;\n }\n .uidex-scrollbar::-webkit-scrollbar-thumb:hover {\n background-color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix( in srgb, var(--muted-foreground) 60%, transparent );\n }\n }\n .uidex-scrollbar::-webkit-scrollbar-corner {\n background: transparent;\n }\n}\n:where(:host, :root) {\n --background: color-mix(\n in srgb,\n oklch(14.5% 0 0) 95%,\n #fff\n );\n @supports (color: color-mix(in lab, red, red)) {\n --background: color-mix(\n in srgb,\n var(--color-neutral-950) 95%,\n var(--color-white)\n );\n }\n --foreground: var(--color-neutral-100);\n --card: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n --card: color-mix(in srgb, var(--background) 98%, var(--color-white));\n }\n --card-foreground: var(--color-neutral-100);\n --popover: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n --popover: color-mix(in srgb, var(--background) 98%, var(--color-white));\n }\n --popover-foreground: var(--color-neutral-100);\n --primary: var(--color-neutral-100);\n --primary-foreground: var(--color-neutral-800);\n --secondary: color-mix(in srgb, #fff 4%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --secondary: color-mix(in srgb, var(--color-white) 4%, transparent);\n }\n --secondary-foreground: var(--color-neutral-100);\n --muted: color-mix(in srgb, #fff 4%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --muted: color-mix(in srgb, var(--color-white) 4%, transparent);\n }\n --muted-foreground: color-mix(\n in srgb,\n oklch(55.6% 0 0) 90%,\n #fff\n );\n @supports (color: color-mix(in lab, red, red)) {\n --muted-foreground: color-mix(\n in srgb,\n var(--color-neutral-500) 90%,\n var(--color-white)\n );\n }\n --accent: color-mix(in srgb, #fff 4%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --accent: color-mix(in srgb, var(--color-white) 4%, transparent);\n }\n --accent-foreground: var(--color-neutral-100);\n --destructive: color-mix(\n in srgb,\n oklch(63.7% 0.237 25.331) 90%,\n #fff\n );\n @supports (color: color-mix(in lab, red, red)) {\n --destructive: color-mix(\n in srgb,\n var(--color-red-500) 90%,\n var(--color-white)\n );\n }\n --destructive-foreground: var(--color-red-400);\n --border: color-mix(in srgb, #fff 6%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --border: color-mix(in srgb, var(--color-white) 6%, transparent);\n }\n --input: color-mix(in srgb, #fff 8%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --input: color-mix(in srgb, var(--color-white) 8%, transparent);\n }\n --ring: var(--color-neutral-500);\n --info: var(--color-blue-500);\n --info-foreground: var(--color-blue-400);\n --success: var(--color-emerald-500);\n --success-foreground: var(--color-emerald-400);\n --warning: var(--color-amber-500);\n --warning-foreground: var(--color-amber-400);\n --radius: 0.625rem;\n}\n:host(.light) {\n --background: var(--color-white);\n --foreground: var(--color-neutral-800);\n --card: var(--color-white);\n --card-foreground: var(--color-neutral-800);\n --popover: var(--color-white);\n --popover-foreground: var(--color-neutral-800);\n --primary: var(--color-neutral-800);\n --primary-foreground: var(--color-neutral-50);\n --secondary: color-mix(in srgb, #000 4%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --secondary: color-mix(in srgb, var(--color-black) 4%, transparent);\n }\n --secondary-foreground: var(--color-neutral-800);\n --muted: color-mix(in srgb, #000 4%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --muted: color-mix(in srgb, var(--color-black) 4%, transparent);\n }\n --muted-foreground: color-mix(\n in srgb,\n oklch(55.6% 0 0) 90%,\n #000\n );\n @supports (color: color-mix(in lab, red, red)) {\n --muted-foreground: color-mix(\n in srgb,\n var(--color-neutral-500) 90%,\n var(--color-black)\n );\n }\n --accent: color-mix(in srgb, #000 4%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --accent: color-mix(in srgb, var(--color-black) 4%, transparent);\n }\n --accent-foreground: var(--color-neutral-800);\n --destructive: var(--color-red-500);\n --destructive-foreground: var(--color-red-700);\n --border: color-mix(in srgb, #000 8%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --border: color-mix(in srgb, var(--color-black) 8%, transparent);\n }\n --input: color-mix(in srgb, #000 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --input: color-mix(in srgb, var(--color-black) 10%, transparent);\n }\n --ring: var(--color-neutral-400);\n --info: var(--color-blue-500);\n --info-foreground: var(--color-blue-700);\n --success: var(--color-emerald-500);\n --success-foreground: var(--color-emerald-700);\n --warning: var(--color-amber-500);\n --warning-foreground: var(--color-amber-700);\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-drop-shadow-size {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-content {\n syntax: \"*\";\n initial-value: \"\";\n inherits: false;\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n --tw-ease: initial;\n --tw-content: \"\";\n }\n }\n}\n","export const SURFACE_HOST_CLASS = \"uidex-surface-host\"\nexport const SURFACE_CONTAINER_CLASS = \"uidex-container\"\n\nexport const Z_BASE = 2147483644\nexport const Z_OVERLAY = 2147483645\nexport const Z_CHROME = 2147483646\n\nexport const SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS},.${SURFACE_CONTAINER_CLASS}`\n\nimport type { EntityKind } from \"../entities\"\n\nexport const UIDEX_ATTR_TO_KIND: ReadonlyArray<readonly [string, EntityKind]> =\n [\n [\"data-uidex\", \"element\"],\n [\"data-uidex-region\", \"region\"],\n [\"data-uidex-widget\", \"widget\"],\n [\"data-uidex-primitive\", \"primitive\"],\n ]\n","import type { ResolvedTheme } from \"../session\"\nimport builtinCss from \"../styles/tailwind.built.css\"\nimport { SURFACE_HOST_CLASS, Z_BASE } from \"./constants\"\n\nexport interface SurfaceHost {\n readonly hostEl: HTMLElement\n readonly shadowRoot: ShadowRoot\n readonly chromeEl: HTMLElement\n applyTheme(theme: ResolvedTheme): void\n destroy(): void\n}\n\nexport interface SurfaceHostOptions {\n mount: Element\n stylesheets?: string[]\n initialTheme?: ResolvedTheme\n}\n\nexport function createSurfaceHost(options: SurfaceHostOptions): SurfaceHost {\n const { mount, stylesheets = [], initialTheme = \"light\" } = options\n\n const hostEl = document.createElement(\"div\")\n hostEl.classList.add(SURFACE_HOST_CLASS)\n hostEl.style.position = \"fixed\"\n hostEl.style.inset = \"0\"\n hostEl.style.pointerEvents = \"none\"\n hostEl.style.zIndex = String(Z_BASE)\n hostEl.classList.add(initialTheme)\n\n const shadow = hostEl.attachShadow({ mode: \"open\" })\n\n applyStylesheets(shadow, [builtinCss, ...stylesheets])\n\n const chromeEl = document.createElement(\"div\")\n chromeEl.classList.add(\"uidex-chrome\")\n chromeEl.style.pointerEvents = \"auto\"\n shadow.appendChild(chromeEl)\n\n mount.appendChild(hostEl)\n\n return {\n hostEl,\n shadowRoot: shadow,\n chromeEl,\n applyTheme(theme) {\n hostEl.classList.remove(\"light\", \"dark\")\n hostEl.classList.add(theme)\n },\n destroy() {\n hostEl.remove()\n },\n }\n}\n\nfunction applyStylesheets(shadow: ShadowRoot, stylesheets: string[]): void {\n if (stylesheets.length === 0) return\n\n const adoptable = supportsConstructableStylesheets(shadow)\n if (adoptable) {\n const sheets: CSSStyleSheet[] = []\n for (const css of stylesheets) {\n const sheet = new CSSStyleSheet()\n sheet.replaceSync(css)\n sheets.push(sheet)\n }\n shadow.adoptedStyleSheets = [...shadow.adoptedStyleSheets, ...sheets]\n return\n }\n\n for (const css of stylesheets) {\n const style = document.createElement(\"style\")\n style.textContent = css\n shadow.appendChild(style)\n }\n}\n\nfunction supportsConstructableStylesheets(shadow: ShadowRoot): boolean {\n if (typeof CSSStyleSheet === \"undefined\") return false\n if (!(\"adoptedStyleSheets\" in shadow)) return false\n try {\n const probe = new CSSStyleSheet()\n probe.replaceSync(\"\")\n return true\n } catch {\n return false\n }\n}\n","import { createElement as createLucideElement } from \"lucide\"\nimport { displayName, KIND_STYLE, type Entity } from \"../entities\"\nimport type { SessionStore } from \"../session\"\nimport { Z_CHROME } from \"./constants\"\n\nconst DEFAULT_TOOLTIP_COLOR = \"#34d399\"\nconst TOOLTIP_OFFSET = 16\nconst ARROW_SIZE = 5\n\nexport type CursorTooltipContent =\n | { entity: Entity; node?: Element | null }\n | string\n\nexport interface CursorTooltip {\n destroy(): void\n /** Present content for the current cursor position. */\n update(\n content: CursorTooltipContent | null,\n cursor: { x: number; y: number } | null\n ): void\n}\n\nexport interface CursorTooltipDeps {\n container: Element\n session: SessionStore\n}\n\nexport function createCursorTooltip(deps: CursorTooltipDeps): CursorTooltip {\n const { container } = deps\n\n const el = document.createElement(\"div\")\n el.setAttribute(\"data-uidex-cursor-tooltip\", \"\")\n el.style.position = \"fixed\"\n el.style.pointerEvents = \"none\"\n el.style.zIndex = String(Z_CHROME)\n el.style.padding = \"4px 8px\"\n el.style.fontSize = \"12px\"\n el.style.fontFamily = \"ui-sans-serif, system-ui, sans-serif\"\n el.style.borderRadius = \"6px\"\n el.style.background = DEFAULT_TOOLTIP_COLOR\n el.style.color = \"#0a0a0a\"\n el.style.display = \"none\"\n el.style.whiteSpace = \"nowrap\"\n el.style.transform = \"translate(-50%, 0)\"\n el.style.alignItems = \"center\"\n el.style.gap = \"6px\"\n\n const arrow = document.createElement(\"div\")\n arrow.setAttribute(\"data-uidex-cursor-tooltip-arrow\", \"\")\n arrow.style.position = \"absolute\"\n arrow.style.left = \"50%\"\n arrow.style.bottom = \"100%\"\n arrow.style.width = \"0\"\n arrow.style.height = \"0\"\n arrow.style.transform = \"translate(-50%, 0)\"\n arrow.style.borderLeft = `${ARROW_SIZE}px solid transparent`\n arrow.style.borderRight = `${ARROW_SIZE}px solid transparent`\n arrow.style.borderBottom = `${ARROW_SIZE}px solid ${DEFAULT_TOOLTIP_COLOR}`\n el.appendChild(arrow)\n\n const body = document.createElement(\"span\")\n body.setAttribute(\"data-uidex-cursor-tooltip-body\", \"\")\n body.style.display = \"inline-flex\"\n body.style.alignItems = \"center\"\n body.style.gap = \"6px\"\n el.appendChild(body)\n\n container.appendChild(el)\n\n let currentContent: CursorTooltipContent | null = null\n let currentCursor: { x: number; y: number } | null = null\n\n const applyColor = (color: string): void => {\n el.style.background = color\n arrow.style.borderBottom = `${ARROW_SIZE}px solid ${color}`\n }\n\n const renderBody = (): void => {\n body.replaceChildren()\n if (typeof currentContent === \"string\") {\n applyColor(DEFAULT_TOOLTIP_COLOR)\n body.append(document.createTextNode(currentContent))\n return\n }\n if (!currentContent) return\n const { entity, node } = currentContent\n const style = KIND_STYLE[entity.kind]\n applyColor(style?.color ?? DEFAULT_TOOLTIP_COLOR)\n if (style) {\n const svg = createLucideElement(style.icon)\n svg.setAttribute(\"aria-hidden\", \"true\")\n svg.setAttribute(\"width\", \"14\")\n svg.setAttribute(\"height\", \"14\")\n svg.style.display = \"block\"\n body.append(svg)\n }\n const label = displayName(entity, node)\n body.append(document.createTextNode(label))\n const rawId = entity.kind === \"route\" ? entity.path : entity.id\n if (rawId && rawId !== label) {\n const subordinate = document.createElement(\"span\")\n subordinate.setAttribute(\"data-uidex-cursor-tooltip-id\", \"\")\n subordinate.style.opacity = \"0.65\"\n subordinate.style.fontFamily =\n \"ui-monospace, SFMono-Regular, Menlo, monospace\"\n subordinate.style.fontSize = \"11px\"\n subordinate.textContent = rawId\n body.append(subordinate)\n }\n }\n\n const render = (): void => {\n if (!currentContent || !currentCursor) {\n el.style.display = \"none\"\n return\n }\n renderBody()\n el.style.display = \"inline-flex\"\n el.style.left = `${currentCursor.x}px`\n el.style.top = `${currentCursor.y + TOOLTIP_OFFSET}px`\n }\n\n return {\n update(content, cursor) {\n currentContent = content\n currentCursor = cursor\n render()\n },\n destroy() {\n el.remove()\n currentContent = null\n currentCursor = null\n },\n }\n}\n","import { displayName, type Entity, type EntityRef } from \"../entities\"\nimport type { Registry } from \"../entities\"\nimport type { SessionStore } from \"../session\"\nimport { SURFACE_IGNORE_SELECTOR, UIDEX_ATTR_TO_KIND } from \"./constants\"\nimport type { Overlay, OverlayShowOptions } from \"./overlay\"\n\nexport interface InspectorMatch {\n element: HTMLElement\n ref: EntityRef\n entity: Entity\n /** Display name resolved via `displayName(entity, element)`. */\n label: string\n}\n\nexport interface InspectorOptions {\n session: SessionStore\n registry?: Registry\n resolve?: (target: Element) => InspectorMatch | null\n onHover?: (\n match: InspectorMatch | null,\n cursor: { x: number; y: number } | null\n ) => void\n onSelect?: (match: InspectorMatch, cursor: { x: number; y: number }) => void\n}\n\nexport interface Inspector {\n mount(): void\n destroy(): void\n}\n\nfunction entityForRef(ref: EntityRef, registry?: Registry): Entity {\n if (registry) {\n const found = registry.get(ref.kind, ref.id)\n if (found) return found\n }\n if (ref.kind === \"route\") return { kind: \"route\", path: ref.id, page: ref.id }\n if (ref.kind === \"flow\") {\n return { kind: \"flow\", id: ref.id, loc: { file: \"\" }, touches: [] }\n }\n return { kind: ref.kind, id: ref.id }\n}\n\nexport function defaultResolveMatch(\n target: Element,\n registry?: Registry\n): InspectorMatch | null {\n if (target.closest(SURFACE_IGNORE_SELECTOR)) return null\n let node: Element | null = target\n while (node) {\n if (node instanceof HTMLElement) {\n for (const [attr, kind] of UIDEX_ATTR_TO_KIND) {\n const id = node.getAttribute(attr)\n if (id) {\n const ref: EntityRef = { kind, id }\n const entity = entityForRef(ref, registry)\n return {\n element: node,\n ref,\n entity,\n label: displayName(entity, node),\n }\n }\n }\n }\n node = node.parentElement\n }\n return null\n}\n\nexport function resolveEntityElement(ref: EntityRef): HTMLElement | null {\n const entry = UIDEX_ATTR_TO_KIND.find(([, kind]) => kind === ref.kind)\n if (!entry) return null\n const [attr] = entry\n const selector = `[${attr}=\"${CSS.escape(ref.id)}\"]`\n const el = document.querySelector(selector)\n if (el instanceof HTMLElement && el.isConnected) return el\n return null\n}\n\nexport interface HighlightControllerLike {\n show(ref: EntityRef, opts?: OverlayShowOptions): void\n hide(): void\n}\n\nexport function createHighlightController(\n overlay: Overlay\n): HighlightControllerLike {\n let lastKey: string | null = null\n return {\n show(ref, opts) {\n const el = resolveEntityElement(ref)\n if (!el) {\n lastKey = null\n overlay.hide()\n return\n }\n const key = `${ref.kind}:${ref.id}`\n if (key === lastKey && overlay.isVisible) return\n lastKey = key\n overlay.show(el, opts)\n },\n hide() {\n lastKey = null\n overlay.hide()\n },\n }\n}\n\nexport function createInspector(options: InspectorOptions): Inspector {\n const {\n session,\n registry,\n resolve = (target) => defaultResolveMatch(target, registry),\n onHover,\n onSelect,\n } = options\n\n let mounted = false\n let currentEl: HTMLElement | null = null\n let cursorStyleEl: HTMLStyleElement | null = null\n\n const onMouseMove = (e: MouseEvent): void => {\n if (!(e.target instanceof Element)) return\n const match = resolve(e.target)\n const cursor = { x: e.clientX, y: e.clientY }\n if (match) {\n if (match.element !== currentEl) {\n currentEl = match.element\n session.getState().actions.hover(match.ref)\n }\n onHover?.(match, cursor)\n } else if (currentEl) {\n currentEl = null\n session.getState().actions.hover(null)\n onHover?.(null, cursor)\n }\n }\n\n const onClick = (e: MouseEvent): void => {\n if (!(e.target instanceof Element)) return\n if (e.target.closest(SURFACE_IGNORE_SELECTOR)) return\n const match = resolve(e.target)\n if (!match) return\n e.preventDefault()\n e.stopPropagation()\n session.getState().actions.select(match.ref)\n onSelect?.(match, { x: e.clientX, y: e.clientY })\n }\n\n return {\n mount() {\n if (mounted) return\n mounted = true\n if (typeof document !== \"undefined\") {\n cursorStyleEl = document.createElement(\"style\")\n cursorStyleEl.setAttribute(\"data-uidex-inspector-cursor\", \"\")\n cursorStyleEl.textContent =\n \"html, body, body * { cursor: crosshair !important; }\"\n document.head.appendChild(cursorStyleEl)\n }\n document.addEventListener(\"mousemove\", onMouseMove)\n document.addEventListener(\"click\", onClick, true)\n },\n destroy() {\n if (!mounted) return\n mounted = false\n currentEl = null\n if (cursorStyleEl) {\n cursorStyleEl.remove()\n cursorStyleEl = null\n }\n document.removeEventListener(\"mousemove\", onMouseMove)\n document.removeEventListener(\"click\", onClick, true)\n session.getState().actions.hover(null)\n onHover?.(null, null)\n },\n }\n}\n","import type { SessionStore } from \"../session\"\nimport { Z_CHROME } from \"./constants\"\n\nexport type Corner = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\"\n\nexport interface MenuBarOptions {\n container: Element\n session: SessionStore\n initialCorner?: Corner\n appTitle?: string\n}\n\nexport interface MenuBar {\n destroy(): void\n snapTo(corner: Corner): void\n snapToNearest(x: number, y: number): void\n readonly corner: Corner\n readonly root: HTMLElement\n}\n\nexport function createMenuBar(options: MenuBarOptions): MenuBar {\n const {\n container,\n session,\n initialCorner = \"bottom-right\",\n appTitle,\n } = options\n\n const root = document.createElement(\"div\")\n root.setAttribute(\"data-uidex-menubar\", \"\")\n root.setAttribute(\"role\", \"toolbar\")\n Object.assign(root.style, {\n position: \"fixed\",\n zIndex: String(Z_CHROME),\n pointerEvents: \"auto\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"6px\",\n borderRadius: \"8px\",\n background: \"rgba(20, 20, 20, 0.92)\",\n color: \"#f5f5f5\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n fontSize: \"12px\",\n userSelect: \"none\",\n cursor: \"grab\",\n })\n\n const buttonStyle = {\n background: \"rgba(255,255,255,0.08)\",\n color: \"inherit\",\n border: \"1px solid rgba(255,255,255,0.12)\",\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n font: \"inherit\",\n cursor: \"pointer\",\n }\n const buttonActiveStyle = {\n background: \"rgba(120, 180, 255, 0.28)\",\n borderColor: \"rgba(120, 180, 255, 0.55)\",\n }\n\n if (appTitle) {\n const titleEl = document.createElement(\"span\")\n titleEl.setAttribute(\"data-uidex-menubar-title\", \"\")\n titleEl.textContent = appTitle\n Object.assign(titleEl.style, {\n padding: \"0 6px 0 4px\",\n fontWeight: \"600\",\n letterSpacing: \"0.01em\",\n whiteSpace: \"nowrap\",\n })\n root.appendChild(titleEl)\n }\n\n const highlightDot = document.createElement(\"span\")\n highlightDot.setAttribute(\"data-uidex-menubar-highlight-indicator\", \"\")\n highlightDot.setAttribute(\"aria-label\", \"Element highlighted (press Esc)\")\n highlightDot.setAttribute(\"role\", \"status\")\n Object.assign(highlightDot.style, {\n display: \"none\",\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n margin: \"0 2px 0 4px\",\n background: \"rgba(120, 180, 255, 0.85)\",\n boxShadow: \"0 0 6px rgba(120, 180, 255, 0.75)\",\n flex: \"0 0 auto\",\n })\n root.appendChild(highlightDot)\n\n const inspectBtn = document.createElement(\"button\")\n inspectBtn.type = \"button\"\n inspectBtn.setAttribute(\"data-uidex-menubar-inspect\", \"\")\n inspectBtn.textContent = \"Inspect\"\n Object.assign(inspectBtn.style, buttonStyle)\n inspectBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n session.send({ type: \"TOGGLE_INSPECTOR\" })\n })\n root.appendChild(inspectBtn)\n\n const paletteBtn = document.createElement(\"button\")\n paletteBtn.type = \"button\"\n paletteBtn.setAttribute(\"data-uidex-menubar-palette\", \"\")\n paletteBtn.textContent = \"⌘K\"\n Object.assign(paletteBtn.style, buttonStyle)\n paletteBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n if (session.getState().stack.length > 0) {\n session.send({ type: \"CLOSE\" })\n } else {\n session.send({ type: \"OPEN_PALETTE\" })\n }\n })\n root.appendChild(paletteBtn)\n container.appendChild(root)\n\n const syncButtonStates = (): void => {\n const state = session.getState()\n inspectBtn.setAttribute(\n \"data-uidex-menubar-inspect-active\",\n state.inspectorActive ? \"true\" : \"false\"\n )\n Object.assign(\n inspectBtn.style,\n state.inspectorActive ? buttonActiveStyle : buttonStyle\n )\n const top = state.stack[state.stack.length - 1] ?? null\n const paletteOpen = top?.id === \"command-palette\"\n paletteBtn.setAttribute(\n \"data-uidex-menubar-palette-active\",\n paletteOpen ? \"true\" : \"false\"\n )\n Object.assign(\n paletteBtn.style,\n paletteOpen ? buttonActiveStyle : buttonStyle\n )\n const highlightActive = state.pinnedHighlight !== null\n highlightDot.setAttribute(\n \"data-uidex-menubar-highlight-active\",\n highlightActive ? \"true\" : \"false\"\n )\n highlightDot.style.display = highlightActive ? \"inline-block\" : \"none\"\n }\n syncButtonStates()\n const unsubscribeSession = session.subscribe(syncButtonStates)\n\n let corner: Corner = initialCorner\n const applyCorner = (): void => {\n const offset = \"16px\"\n root.style.top = corner.startsWith(\"top\") ? offset : \"\"\n root.style.bottom = corner.startsWith(\"bottom\") ? offset : \"\"\n root.style.left = corner.endsWith(\"left\") ? offset : \"\"\n root.style.right = corner.endsWith(\"right\") ? offset : \"\"\n root.setAttribute(\"data-uidex-menubar-corner\", corner)\n }\n applyCorner()\n\n let dragging = false\n let startX = 0\n let startY = 0\n let originLeft = 0\n let originTop = 0\n\n const onMouseMove = (e: MouseEvent): void => {\n if (!dragging) return\n root.style.left = `${originLeft + e.clientX - startX}px`\n root.style.top = `${originTop + e.clientY - startY}px`\n }\n\n const onMouseUp = (e: MouseEvent): void => {\n if (!dragging) return\n dragging = false\n root.style.cursor = \"grab\"\n document.removeEventListener(\"mousemove\", onMouseMove)\n document.removeEventListener(\"mouseup\", onMouseUp)\n snapToNearest(e.clientX, e.clientY)\n }\n\n const onMouseDown = (e: MouseEvent): void => {\n if (e.target instanceof HTMLElement && e.target.closest(\"button\")) return\n const rect = root.getBoundingClientRect()\n dragging = true\n originLeft = rect.left\n originTop = rect.top\n startX = e.clientX\n startY = e.clientY\n root.style.cursor = \"grabbing\"\n Object.assign(root.style, {\n top: `${originTop}px`,\n left: `${originLeft}px`,\n bottom: \"\",\n right: \"\",\n })\n document.addEventListener(\"mousemove\", onMouseMove)\n document.addEventListener(\"mouseup\", onMouseUp)\n e.preventDefault()\n }\n root.addEventListener(\"mousedown\", onMouseDown)\n\n function snapTo(next: Corner): void {\n corner = next\n applyCorner()\n }\n\n function snapToNearest(x: number, y: number): void {\n const horizontal = x / (window.innerWidth || 1) < 0.5 ? \"left\" : \"right\"\n const vertical = y / (window.innerHeight || 1) < 0.5 ? \"top\" : \"bottom\"\n snapTo(`${vertical}-${horizontal}` as Corner)\n }\n\n return {\n destroy() {\n unsubscribeSession()\n root.removeEventListener(\"mousedown\", onMouseDown)\n document.removeEventListener(\"mousemove\", onMouseMove)\n document.removeEventListener(\"mouseup\", onMouseUp)\n root.remove()\n },\n snapTo,\n snapToNearest,\n get corner() {\n return corner\n },\n get root() {\n return root\n },\n }\n}\n","import { Z_OVERLAY } from \"./constants\"\n\nexport interface OverlayShowOptions {\n label?: string\n color?: string\n padding?: number\n borderStyle?: string\n borderWidth?: number\n fillOpacity?: number\n}\n\nexport interface Overlay {\n show(target: Element, options?: OverlayShowOptions): void\n hide(): void\n destroy(): void\n readonly isVisible: boolean\n}\n\ninterface OverlayDeps {\n container: Element\n}\n\nconst DEFAULT_COLOR = \"#34d399\"\nconst DEFAULT_BORDER_WIDTH = 2\nconst DEFAULT_FILL_OPACITY = 0.08\n\nexport function createOverlay(deps: OverlayDeps): Overlay {\n const { container } = deps\n\n const box = document.createElement(\"div\")\n box.setAttribute(\"data-uidex-overlay\", \"\")\n box.style.position = \"fixed\"\n box.style.pointerEvents = \"none\"\n box.style.zIndex = String(Z_OVERLAY)\n box.style.boxSizing = \"border-box\"\n box.style.display = \"none\"\n\n const label = document.createElement(\"div\")\n label.setAttribute(\"data-uidex-overlay-label\", \"\")\n label.style.position = \"absolute\"\n label.style.left = \"0\"\n label.style.bottom = \"100%\"\n label.style.padding = \"2px 6px\"\n label.style.fontSize = \"11px\"\n label.style.fontFamily = \"ui-sans-serif, system-ui, sans-serif\"\n label.style.lineHeight = \"1\"\n label.style.whiteSpace = \"nowrap\"\n label.style.color = \"#0a0a0a\"\n label.style.display = \"none\"\n\n box.appendChild(label)\n container.appendChild(box)\n\n let target: Element | null = null\n let opts: Required<OverlayShowOptions> = {\n label: \"\",\n color: DEFAULT_COLOR,\n padding: 0,\n borderStyle: \"solid\",\n borderWidth: DEFAULT_BORDER_WIDTH,\n fillOpacity: DEFAULT_FILL_OPACITY,\n }\n\n let rafId: number | null = null\n let attached = false\n\n const schedule = (): void => {\n if (rafId !== null) return\n rafId =\n typeof requestAnimationFrame === \"function\"\n ? requestAnimationFrame(() => {\n rafId = null\n updatePosition()\n })\n : (setTimeout(() => {\n rafId = null\n updatePosition()\n }, 0) as unknown as number)\n }\n\n const cancelSchedule = (): void => {\n if (rafId === null) return\n if (typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(rafId)\n else clearTimeout(rafId as unknown as ReturnType<typeof setTimeout>)\n rafId = null\n }\n\n const onScroll = (): void => schedule()\n const onResize = (): void => schedule()\n\n const attach = (): void => {\n if (attached) return\n attached = true\n window.addEventListener(\"resize\", onResize)\n window.addEventListener(\"scroll\", onScroll, {\n capture: true,\n passive: true,\n })\n }\n\n const detach = (): void => {\n if (!attached) return\n attached = false\n window.removeEventListener(\"resize\", onResize)\n window.removeEventListener(\"scroll\", onScroll, {\n capture: true,\n } as EventListenerOptions)\n cancelSchedule()\n }\n\n function updatePosition(): void {\n if (!target) return\n const rect = target.getBoundingClientRect()\n const pad = opts.padding\n box.style.top = `${rect.top - pad}px`\n box.style.left = `${rect.left - pad}px`\n box.style.width = `${rect.width + pad * 2}px`\n box.style.height = `${rect.height + pad * 2}px`\n }\n\n function applyStyles(): void {\n box.style.borderColor = opts.color\n box.style.borderStyle = opts.borderStyle\n box.style.borderWidth = `${opts.borderWidth}px`\n box.style.backgroundColor = rgbaFromColor(opts.color, opts.fillOpacity)\n if (opts.label) {\n label.textContent = opts.label\n label.style.backgroundColor = opts.color\n label.style.display = \"\"\n } else {\n label.textContent = \"\"\n label.style.display = \"none\"\n }\n }\n\n return {\n show(nextTarget, showOpts) {\n target = nextTarget\n opts = {\n label: showOpts?.label ?? \"\",\n color: showOpts?.color ?? DEFAULT_COLOR,\n padding: showOpts?.padding ?? 0,\n borderStyle: showOpts?.borderStyle ?? \"solid\",\n borderWidth: showOpts?.borderWidth ?? DEFAULT_BORDER_WIDTH,\n fillOpacity: showOpts?.fillOpacity ?? DEFAULT_FILL_OPACITY,\n }\n applyStyles()\n updatePosition()\n box.style.display = \"\"\n attach()\n },\n hide() {\n target = null\n box.style.display = \"none\"\n detach()\n },\n destroy() {\n detach()\n box.remove()\n target = null\n },\n get isVisible() {\n return target !== null\n },\n }\n}\n\nfunction rgbaFromColor(color: string, alpha: number): string {\n if (color.startsWith(\"#\")) {\n const hex = color.slice(1)\n const bigint = parseInt(\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex,\n 16\n )\n const r = (bigint >> 16) & 255\n const g = (bigint >> 8) & 255\n const b = bigint & 255\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n }\n return color\n}\n","import type { ResolvedTheme, SessionStore, ThemePreference } from \"../session\"\n\nexport interface ThemeDetector {\n destroy(): void\n /** Resolve the current theme preference against the environment. */\n readonly resolved: ResolvedTheme\n}\n\nexport interface ThemeDetectorDeps {\n session: SessionStore\n onResolve?: (theme: ResolvedTheme) => void\n}\n\ntype HtmlClassToken = \"dark\" | \"light\"\n\nexport function createThemeDetector(deps: ThemeDetectorDeps): ThemeDetector {\n const { session, onResolve } = deps\n\n let resolved: ResolvedTheme = session.getState().resolvedTheme\n\n const detect = (preference: ThemePreference): ResolvedTheme => {\n if (preference !== \"auto\") return preference\n const htmlToken = readHtmlClassToken()\n if (htmlToken) return htmlToken\n if (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\"\n ) {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\"\n }\n return \"light\"\n }\n\n const push = (): void => {\n const preference = session.getState().theme\n const next = detect(preference)\n if (next === resolved) return\n resolved = next\n session.getState().actions.setTheme(preference, next)\n onResolve?.(next)\n }\n\n push()\n\n let mql: MediaQueryList | null = null\n const mqlListener = (): void => push()\n if (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\"\n ) {\n mql = window.matchMedia(\"(prefers-color-scheme: dark)\")\n if (typeof mql.addEventListener === \"function\") {\n mql.addEventListener(\"change\", mqlListener)\n } else if (typeof mql.addListener === \"function\") {\n // Safari < 14\n mql.addListener(mqlListener)\n }\n }\n\n let observer: MutationObserver | null = null\n if (\n typeof MutationObserver !== \"undefined\" &&\n typeof document !== \"undefined\"\n ) {\n observer = new MutationObserver(() => push())\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n })\n }\n\n const unsubscribe = session.subscribe((state, prev) => {\n if (state.theme !== prev.theme) push()\n })\n\n return {\n destroy() {\n unsubscribe()\n if (mql) {\n if (typeof mql.removeEventListener === \"function\") {\n mql.removeEventListener(\"change\", mqlListener)\n } else if (typeof mql.removeListener === \"function\") {\n mql.removeListener(mqlListener)\n }\n }\n observer?.disconnect()\n },\n get resolved() {\n return resolved\n },\n }\n}\n\nfunction readHtmlClassToken(): HtmlClassToken | null {\n if (typeof document === \"undefined\") return null\n const root = document.documentElement\n if (!root) return null\n if (root.classList.contains(\"dark\")) return \"dark\"\n if (root.classList.contains(\"light\")) return \"light\"\n return null\n}\n","import { KIND_STYLE, type Registry } from \"../entities\"\nimport { createCleanupStack, type CleanupStack } from \"../internal/cleanup\"\nimport type { SessionStore } from \"../session\"\nimport { createCursorTooltip, type CursorTooltip } from \"./cursor-tooltip\"\nimport { createSurfaceHost, type SurfaceHost } from \"./host\"\nimport {\n createInspector,\n type Inspector,\n type InspectorOptions,\n} from \"./inspector\"\nimport { createMenuBar, type Corner, type MenuBar } from \"./menu-bar\"\nimport { createOverlay, type Overlay } from \"./overlay\"\nimport { createThemeDetector, type ThemeDetector } from \"./theme\"\n\nexport interface CreateSurfaceShellOptions {\n mount: Element\n registry: Registry\n session: SessionStore\n stylesheets?: string[]\n initialCorner?: Corner\n appTitle?: string\n /**\n * Additional inspector wiring. Hover is pre-wired to overlay + tooltip; pass\n * `onSelect` (and `onAfterHover`) to extend behaviour without rebuilding the\n * host.\n */\n inspector?: Pick<InspectorOptions, \"onSelect\"> & {\n onAfterHover?: InspectorOptions[\"onHover\"]\n }\n}\n\nexport interface SurfaceShell {\n host: SurfaceHost\n overlay: Overlay\n tooltip: CursorTooltip\n inspector: Inspector\n menuBar: MenuBar\n themeDetector: ThemeDetector\n cleanup: CleanupStack\n destroy(): void\n}\n\n/**\n * Builds the chrome bundle shared by `createUidex` and `createHeadless`:\n * host + theme detector + overlay + cursor tooltip + inspector + menu bar.\n * Returns a cleanup stack so callers can register their own teardown in LIFO\n * order, then call `destroy()` once to drain the whole thing.\n */\nexport function createSurfaceShell(\n options: CreateSurfaceShellOptions\n): SurfaceShell {\n const cleanup = createCleanupStack()\n\n const host = createSurfaceHost({\n mount: options.mount,\n stylesheets: options.stylesheets,\n initialTheme: options.session.getState().resolvedTheme,\n })\n cleanup.add(host)\n\n const themeDetector = createThemeDetector({\n session: options.session,\n onResolve: (theme) => host.applyTheme(theme),\n })\n cleanup.add(themeDetector)\n\n const overlay = createOverlay({ container: host.chromeEl })\n cleanup.add(overlay)\n\n const tooltip = createCursorTooltip({\n container: host.chromeEl,\n session: options.session,\n })\n cleanup.add(tooltip)\n\n const afterHover = options.inspector?.onAfterHover\n const inspector = createInspector({\n session: options.session,\n registry: options.registry,\n onSelect: options.inspector?.onSelect,\n onHover: (match, cursor) => {\n if (!match) {\n overlay.hide()\n tooltip.update(null, cursor)\n } else {\n overlay.show(match.element, {\n color: KIND_STYLE[match.ref.kind].color,\n })\n tooltip.update({ entity: match.entity, node: match.element }, cursor)\n }\n afterHover?.(match, cursor)\n },\n })\n cleanup.add(inspector)\n\n const menuBar = createMenuBar({\n container: host.chromeEl,\n session: options.session,\n initialCorner: options.initialCorner,\n appTitle: options.appTitle,\n })\n cleanup.add(menuBar)\n\n return {\n host,\n overlay,\n tooltip,\n inspector,\n menuBar,\n themeDetector,\n cleanup,\n destroy: cleanup.drain,\n }\n}\n","import type { SurfaceEvent } from \"../flows/surface\"\nimport type { SessionStore } from \"../session\"\nimport type { ActionsPopupHandle } from \"../views/core/actions-popup\"\n\nexport interface BindShadowKeysOptions {\n shadowRoot: ShadowRoot\n session: SessionStore\n getActionsPopup: () => ActionsPopupHandle | null\n}\n\nexport function bindShadowKeys(options: BindShadowKeysOptions): () => void {\n const { shadowRoot, session, getActionsPopup } = options\n const send = (event: SurfaceEvent): void => session.send(event)\n\n const onKeydown = (e: KeyboardEvent): void => {\n const isMod = e.metaKey || e.ctrlKey\n const isCmdK = isMod && !e.altKey && !e.shiftKey && e.key === \"k\"\n const isCmdBracket = isMod && !e.altKey && !e.shiftKey && e.key === \"[\"\n const isEsc = e.key === \"Escape\"\n const isPopKey = isEsc || isCmdBracket\n if (!isCmdK && !isPopKey) return\n\n const popup = getActionsPopup()\n if (popup?.isOpen()) {\n if (popup.handleKey(e)) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n if (isPopKey || isCmdK) {\n popup.close()\n e.preventDefault()\n e.stopPropagation()\n }\n return\n }\n\n if (isCmdK) {\n const state = session.getState()\n e.preventDefault()\n e.stopPropagation()\n send(\n state.stack.length === 0 ? { type: \"OPEN_PALETTE\" } : { type: \"CMD_K\" }\n )\n return\n }\n\n const state = session.getState()\n const hasWork =\n state.stack.length > 0 ||\n state.pinnedHighlight !== null ||\n state.inspectorActive\n if (!hasWork) return\n e.preventDefault()\n e.stopPropagation()\n send({ type: \"ESC\" })\n }\n\n shadowRoot.addEventListener(\"keydown\", onKeydown as EventListener, {\n capture: true,\n })\n return () => {\n shadowRoot.removeEventListener(\n \"keydown\",\n onKeydown as EventListener,\n {\n capture: true,\n } as EventListenerOptions\n )\n }\n}\n","export function detectDev(): boolean {\n try {\n if (\n typeof process !== \"undefined\" &&\n typeof process.env?.NODE_ENV === \"string\"\n ) {\n return process.env.NODE_ENV !== \"production\"\n }\n } catch {\n /* ignore */\n }\n return true\n}\n","import type {\n CloudAdapter,\n ConsoleLogEntry,\n FeedbackExternalLink,\n FeedbackPayload,\n FeedbackResult,\n FeedbackSuggestedTarget,\n IngestConfig,\n IngestConfigEpic,\n NetworkErrorEntry,\n SourceRef,\n Viewport,\n} from \"../../ingest/feedback-contract\"\nimport type { EntityKind, EntityRef, Registry } from \"../../entities\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport type { OverlayShowOptions } from \"../../surface/overlay\"\nimport type { ViewSurface } from \"./surface\"\n\nexport type {\n CloudAdapter,\n ConsoleLogEntry,\n FeedbackExternalLink,\n FeedbackPayload,\n FeedbackResult,\n FeedbackSuggestedTarget,\n IngestConfig,\n IngestConfigEpic,\n NetworkErrorEntry,\n SourceRef,\n Viewport,\n}\n\nexport interface ViewPalette {\n label: string\n group?: string\n /**\n * Leading-icon factory rendered as a rounded-square tile on the palette\n * row. Called fresh per render (so a returned SVG isn't reparented).\n */\n icon?: () => Node\n shortcut?: string\n}\n\nexport interface ViewDirectory {\n list(): readonly View[]\n}\n\nexport interface ViewPushTarget {\n id: string\n ref?: EntityRef | null\n}\n\nexport interface HighlightController {\n show(ref: EntityRef, opts?: OverlayShowOptions): void\n hide(): void\n}\n\nexport interface ViewContext {\n ref: EntityRef | null\n registry: Registry\n cloud: CloudAdapter<unknown, unknown, unknown> | null\n sdkCloud: CloudAdapter\n views: ViewDirectory\n /** Push a view onto the stack. Unregistered ids are a no-op. */\n push: (target: ViewPushTarget) => void\n /** Pop the top view off the stack. No-op when the stack is empty. */\n pop: () => void\n /** Clear the entire view stack. */\n close: () => void\n /** Resolve the first view matching `ref` and push it onto the stack. */\n navigate: (ref: EntityRef) => void\n /** Pin the overlay to `ref` until the user presses Esc. */\n pinHighlight: (ref: EntityRef) => void\n /** Shell-owned search input. The shell dispatches its value into the active surface. */\n searchInput: HTMLInputElement\n /** Drives the Surface's singleton overlay from inside a custom surface. */\n highlight: HighlightController\n /** Snapshot of the current view stack (top-most last). */\n getStack: () => readonly ViewStackEntry[]\n}\n\nexport interface ShellHint {\n key: string\n label: string\n}\n\nexport type ShellActionIntent =\n | { kind: \"push\"; viewId: string; refKind?: EntityKind }\n | { kind: \"pop\" }\n | { kind: \"close\" }\n | { kind: \"navigate\"; refKind?: EntityKind }\n | { kind: \"external\"; describe: string }\n\nexport interface ShellAction {\n id: string\n label: string\n shortcut?: string\n perform: () => void | Promise<void>\n intent?: ShellActionIntent\n}\n\nexport type Cleanup = () => void\n\nexport interface View {\n id: string\n matches?: (ref: EntityRef) => boolean\n palette?: ViewPalette\n title?: string | ((ctx: ViewContext) => string)\n /** Show the shell search input when this view is on top. Default: true. */\n searchable?: boolean\n hints?: ShellHint[] | ((ctx: ViewContext) => ShellHint[])\n actions?: (ctx: ViewContext) => ShellAction[]\n /**\n * Element focused when this view becomes the top of the stack. The shell\n * falls back to the first focusable element in the host when omitted, or\n * when the declared target has been removed from the host.\n */\n focusTarget?: (root: HTMLElement, ctx: ViewContext) => HTMLElement | null\n surface: (ctx: ViewContext) => ViewSurface\n}\n\nexport class ViewValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ViewValidationError\"\n }\n}\n","import type { EntityRef } from \"../../entities\"\nimport { detectDev } from \"../../internal/dev\"\nimport type { SessionStore } from \"../../session\"\nimport { ViewValidationError, type View } from \"./types\"\n\nexport interface ViewRegistrar {\n register(view: View): void\n unregister(id: string): void\n list(): readonly View[]\n get(id: string): View | undefined\n findMatch(ref: EntityRef): View | null\n navigate(ref: EntityRef): void\n}\n\nexport interface ViewRegistrarOptions {\n session: SessionStore\n dev?: boolean\n}\n\nexport function createViewRegistrar(\n options: ViewRegistrarOptions\n): ViewRegistrar {\n const views: View[] = []\n const dev = options.dev ?? detectDev()\n\n function validate(view: View): void {\n if (\n view === null ||\n typeof view !== \"object\" ||\n typeof view.id !== \"string\" ||\n view.id.length === 0\n ) {\n throw new ViewValidationError(\"View must have a non-empty string id\")\n }\n if (typeof view.surface !== \"function\") {\n throw new ViewValidationError(\n `View ${view.id}: 'surface' must be a function`\n )\n }\n if (!view.matches && !view.palette) {\n throw new ViewValidationError(\n `View ${view.id}: at least one of 'matches' or 'palette' is required`\n )\n }\n }\n\n function warnOverlaps(incoming: View): void {\n if (!dev || !incoming.matches) return\n const selection = options.session.getState().selection\n if (!selection) return\n if (!incoming.matches(selection)) return\n for (const existing of views) {\n if (existing.id === incoming.id) continue\n if (!existing.matches) continue\n if (existing.matches(selection)) {\n console.warn(\n `[uidex] View \"${incoming.id}\" matches ref ${selection.kind}:${selection.id} ` +\n `also handled by view \"${existing.id}\"; last-registered wins.`\n )\n }\n }\n }\n\n function register(view: View): void {\n validate(view)\n warnOverlaps(view)\n const existingIdx = views.findIndex((p) => p.id === view.id)\n if (existingIdx >= 0) views.splice(existingIdx, 1)\n views.push(view)\n }\n\n function unregister(id: string): void {\n const idx = views.findIndex((p) => p.id === id)\n if (idx < 0) return\n views.splice(idx, 1)\n const state = options.session.getState()\n const top = state.stack[state.stack.length - 1] ?? null\n if (top?.id === id) state.actions.closeView()\n }\n\n function list(): readonly View[] {\n return views.slice()\n }\n\n function get(id: string): View | undefined {\n return views.find((p) => p.id === id)\n }\n\n function findMatch(ref: EntityRef): View | null {\n for (let i = views.length - 1; i >= 0; i--) {\n const view = views[i]\n if (view.matches && view.matches(ref)) return view\n }\n return null\n }\n\n function navigate(ref: EntityRef): void {\n const match = findMatch(ref)\n if (!match) return\n const state = options.session.getState()\n state.actions.select(ref)\n state.actions.pushStack({ id: match.id, ref })\n }\n\n return { register, unregister, list, get, findMatch, navigate }\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"./cn\"\n\ntype Attrs = Record<\n string,\n string | number | boolean | null | undefined | Record<string, string | number>\n>\n\nexport interface ElementOptions {\n class?: ClassValue\n attrs?: Attrs\n text?: string\n html?: never\n dataset?: Record<string, string>\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport type Child = Node | string | null | undefined | false\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n options: ElementOptions = {},\n children: Child | Child[] = []\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag)\n if (options.class) node.className = cn(options.class)\n if (options.attrs) {\n for (const [key, value] of Object.entries(options.attrs)) {\n if (value === undefined || value === null || value === false) continue\n if (value === true) {\n node.setAttribute(key, \"\")\n } else {\n node.setAttribute(key, String(value))\n }\n }\n }\n if (options.dataset) {\n for (const [key, value] of Object.entries(options.dataset)) {\n node.dataset[key] = value\n }\n }\n if (options.style) {\n Object.assign(node.style, options.style)\n }\n if (options.text !== undefined) {\n node.textContent = options.text\n }\n const list = Array.isArray(children) ? children : [children]\n for (const child of list) {\n if (child === null || child === undefined || child === false) continue\n node.append(\n typeof child === \"string\" ? document.createTextNode(child) : child\n )\n }\n return node\n}\n","import type { ClassValue } from \"clsx\"\n\ntype VariantSet = Record<string, Record<string, ClassValue>>\n\ntype VariantValues<V extends VariantSet> = {\n [K in keyof V]?: keyof V[K]\n}\n\nexport interface CvaConfig<V extends VariantSet> {\n variants?: V\n defaultVariants?: VariantValues<V>\n}\n\nexport function cva<V extends VariantSet>(\n base: ClassValue,\n config: CvaConfig<V> = {}\n) {\n return (props: VariantValues<V> = {}): ClassValue[] => {\n const out: ClassValue[] = [base]\n const variants = config.variants\n if (!variants) return out\n for (const key of Object.keys(variants) as Array<keyof V>) {\n const picked =\n (props[key] as string | undefined) ??\n (config.defaultVariants?.[key] as string | undefined)\n if (picked === undefined) continue\n const cls = variants[key][picked as string]\n if (cls) out.push(cls)\n }\n return out\n }\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\nimport { cva } from \"./cva\"\n\nexport type BadgeVariant =\n | \"default\"\n | \"destructive\"\n | \"error\"\n | \"info\"\n | \"outline\"\n | \"secondary\"\n | \"success\"\n | \"warning\"\n\nexport type BadgeSize = \"default\" | \"sm\" | \"lg\"\n\nconst badgeBase =\n \"relative inline-flex shrink-0 items-center justify-center gap-1 whitespace-nowrap rounded-sm border border-transparent font-medium outline-none transition-shadow [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-3 [&_svg]:pointer-events-none [&_svg]:shrink-0\"\n\nexport const badgeVariants = cva(badgeBase, {\n defaultVariants: { size: \"default\", variant: \"default\" },\n variants: {\n size: {\n default: \"h-4.5 min-w-4.5 px-1 text-xs\",\n lg: \"h-5.5 min-w-5.5 px-1.5 text-sm\",\n sm: \"h-4 min-w-4 rounded-[0.25rem] px-1 text-[0.625rem]\",\n },\n variant: {\n default: \"bg-primary text-primary-foreground\",\n destructive: \"bg-destructive text-white\",\n error:\n \"bg-destructive/10 text-destructive-foreground dark:bg-destructive/20\",\n info: \"bg-info/10 text-info-foreground dark:bg-info/20\",\n outline: \"border-input bg-background text-foreground dark:bg-input/30\",\n secondary: \"bg-secondary text-secondary-foreground\",\n success: \"bg-success/10 text-success-foreground dark:bg-success/20\",\n warning: \"bg-warning/10 text-warning-foreground dark:bg-warning/20\",\n },\n },\n})\n\nexport interface CreateBadgeOptions extends Omit<ElementOptions, \"class\"> {\n variant?: BadgeVariant\n size?: BadgeSize\n class?: ClassValue\n}\n\nexport function createBadge(\n options: CreateBadgeOptions = {},\n children: Child | Child[] = []\n): HTMLSpanElement {\n const { variant, size, class: extra, attrs, ...rest } = options\n return el(\n \"span\",\n {\n ...rest,\n class: cn(badgeVariants({ variant, size }), extra),\n attrs: { \"data-slot\": \"badge\", ...attrs },\n },\n children\n )\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../../internal/el\"\nimport { createBadge } from \"../../ui/badge\"\n\nexport interface ChipOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n}\n\nconst CHIP_CLASS =\n \"inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground\"\n\nexport function createChip(\n options: ChipOptions = {},\n children: Child | Child[] = []\n): HTMLSpanElement {\n const { class: extra, ...rest } = options\n return el(\"span\", { ...rest, class: cn(CHIP_CLASS, extra) }, children)\n}\n\nexport function createPillItem(options: ChipOptions = {}): HTMLLIElement {\n const { class: extra, text, attrs, ...rest } = options\n const li = el(\"li\", { ...rest, class: \"list-none\", attrs })\n const badge = createBadge(\n { variant: \"secondary\", size: \"default\", class: extra, text },\n []\n )\n li.append(badge)\n return li\n}\n","import { createElement as createLucideElement } from \"lucide\"\nimport { KIND_STYLE, type EntityKind } from \"../../entities\"\nimport { cn } from \"../../internal/cn\"\nimport { createBadge } from \"../../ui/badge\"\nimport { createIconTile } from \"./icon-tile\"\n\nexport function renderKindIcon(kind: EntityKind): SVGElement {\n const style = KIND_STYLE[kind]\n const svg = createLucideElement(style.icon)\n svg.setAttribute(\"aria-hidden\", \"true\")\n svg.setAttribute(\"class\", cn(\"h-4 w-4 shrink-0\", style.tone))\n return svg\n}\n\n/** Tile-wrapped kind icon for use as the leading slot on list/detail rows. */\nexport function renderKindIconTile(kind: EntityKind): HTMLElement {\n const style = KIND_STYLE[kind]\n return createIconTile(renderKindIcon(kind), { toneClass: style.chip })\n}\n\n/** Inline badge with the kind icon + label, built on the coss `createBadge`. */\nexport function renderKindBadge(kind: EntityKind): HTMLElement {\n const style = KIND_STYLE[kind]\n const icon = createLucideElement(style.icon)\n icon.setAttribute(\"aria-hidden\", \"true\")\n return createBadge(\n {\n class: style.chip,\n attrs: { \"data-uidex-kind-badge\": kind },\n },\n [icon, style.label]\n )\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\n\nconst TILE_CLASS =\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground\"\n\nconst ICON_SIZE_CLASS_RE = /\\b(h-\\d+|w-\\d+|size-\\d+)\\b/g\n\nexport interface IconTileOptions {\n extraClass?: ClassValue\n /** Tailwind color classes (bg/text/hover/dark) replacing the muted default. */\n toneClass?: ClassValue\n /** CSS color applied as a tinted background (supports hex/rgb/var). */\n tint?: string\n /** 0–100, default 15 — enough to read the hue without fighting contrast. */\n tintAlpha?: number\n}\n\nexport function createIconTile(\n inner: Node,\n options: IconTileOptions = {}\n): HTMLElement {\n if (inner instanceof SVGElement) {\n const existing = inner.getAttribute(\"class\") ?? \"\"\n const stripped = existing.replace(ICON_SIZE_CLASS_RE, \"\").trim()\n inner.setAttribute(\"class\", cn(stripped, \"size-3.5 opacity-80\"))\n }\n\n const tile = el(\n \"span\",\n {\n class: cn(TILE_CLASS, options.toneClass, options.extraClass),\n attrs: { \"data-slot\": \"icon-tile\", \"aria-hidden\": \"true\" },\n },\n [inner]\n )\n\n if (options.tint && !options.toneClass) {\n const pct = options.tintAlpha ?? 15\n tile.style.backgroundColor = `color-mix(in srgb, ${options.tint} ${pct}%, transparent)`\n }\n return tile\n}\n","import { displayName, KIND_STYLE, type Entity } from \"../../entities\"\nimport { el } from \"../../internal/el\"\nimport { createChip } from \"./chip\"\nimport { renderKindIcon } from \"./kind-icon\"\n\nexport interface KindChipOptions {\n entity: Entity\n label?: string\n withKindName?: boolean\n node?: Element | null\n}\n\nexport function renderKindChip(options: KindChipOptions): HTMLElement {\n const { entity, label, withKindName, node } = options\n const kind = entity.kind\n const style = KIND_STYLE[kind]\n const chip = createChip({ attrs: { \"data-uidex-kind-chip\": kind } })\n chip.append(renderKindIcon(kind))\n const resolved = label ?? displayName(entity, node)\n const text = withKindName\n ? resolved\n ? `${style.label} · ${resolved}`\n : style.label\n : resolved\n if (text) {\n chip.append(\n el(\"span\", {\n class: \"truncate\",\n text,\n })\n )\n }\n return chip\n}\n","import * as scrollArea from \"@zag-js/scroll-area\"\nimport { createMachineHandle, type MachineHandle } from \"./machine\"\nimport { normalizeProps, type DomProps } from \"./normalize\"\n\nexport type ScrollAreaProps = scrollArea.Props\nexport type ScrollAreaApi = scrollArea.Api<DomProps>\nexport type ScrollAreaHandle = MachineHandle<ScrollAreaApi>\n\nexport function createScrollArea(\n props: Partial<ScrollAreaProps> = {}\n): ScrollAreaHandle {\n return createMachineHandle(\n scrollArea.machine,\n scrollArea.connect,\n normalizeProps,\n props\n )\n}\n\nexport { scrollArea }\n","import {\n createScope,\n findTransition,\n getExitEnterStates,\n hasTag as hasTagFn,\n INIT_STATE,\n MachineStatus,\n matchesState,\n resolveStateValue,\n type Machine,\n type MachineSchema,\n type Service,\n} from \"@zag-js/core\"\nimport {\n compact,\n ensure,\n isFunction,\n isString,\n toArray,\n warn,\n} from \"@zag-js/utils\"\n\ntype AnyFn = (...args: unknown[]) => unknown\n\ninterface BindableOptions<V> {\n value?: V\n defaultValue?: V\n isEqual?: (a: V, b: V) => boolean\n onChange?: (next: V, prev: V) => void\n sync?: boolean\n debug?: string\n hash?: (value: V) => string\n}\n\ninterface Bindable<V> {\n initial: V\n ref: { current: V }\n get(): V\n set(value: V | ((prev: V) => V)): void\n invoke(next: V, prev: V): void\n hash(value: V): string\n}\n\ninterface BindableFactory {\n <V>(propsFn: () => BindableOptions<V>): Bindable<V>\n cleanup: (fn: () => void) => void\n ref: <V>(defaultValue: V) => { get: () => V; set: (next: V) => void }\n}\n\nfunction createBindable<V>(propsFn: () => BindableOptions<V>): Bindable<V> {\n const initial = (propsFn().value ?? propsFn().defaultValue) as V\n let local = initial\n const ref = { current: initial as V }\n const eq = () => propsFn().isEqual ?? Object.is\n\n const getControlled = () => propsFn().value !== undefined\n\n const setFn = (value: V | ((prev: V) => V)) => {\n const prev = ref.current\n const next = (isFunction(value) ? (value as (p: V) => V)(prev) : value) as V\n if (propsFn().debug) {\n console.log(`[bindable > ${propsFn().debug}] setValue`, { next, prev })\n }\n if (!getControlled()) {\n local = next\n ref.current = next\n }\n if (!eq()(next, prev)) {\n propsFn().onChange?.(next, prev)\n }\n }\n\n const get = () => (getControlled() ? (propsFn().value as V) : local)\n\n // Keep ref in sync when controlled value changes on subsequent reads.\n const syncRef = () => {\n const v = get()\n if (!eq()(v, ref.current)) ref.current = v\n }\n\n return {\n initial,\n ref: new Proxy(ref, {\n get(target, key) {\n if (key === \"current\") {\n syncRef()\n return target.current\n }\n return Reflect.get(target, key)\n },\n }),\n get,\n set: setFn,\n invoke(next, prev) {\n propsFn().onChange?.(next, prev)\n },\n hash(value) {\n return propsFn().hash?.(value) ?? String(value)\n },\n }\n}\n\nexport interface MachineRunner<T extends MachineSchema> {\n service: Service<T>\n start(): void\n stop(): void\n subscribe(listener: () => void): () => void\n update(next: Partial<T[\"props\"]>): void\n}\n\nexport interface MachineHandle<Api> {\n runner: MachineRunner<MachineSchema>\n api: () => Api\n destroy: () => void\n}\n\nexport function createMachineHandle<Props, Api>(\n zagMachine: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n connect: (service: any, normalize: any) => Api,\n normalize: unknown,\n props: Partial<Props> = {} as Partial<Props>\n): MachineHandle<Api> {\n const runner = createMachineRunner(\n zagMachine as Machine<MachineSchema>,\n props as never\n )\n runner.start()\n return {\n runner,\n api: () => connect(runner.service as never, normalize),\n destroy: () => runner.stop(),\n }\n}\n\ntype AnyMachine = Machine<MachineSchema>\n\nexport function createMachineRunner<T extends MachineSchema>(\n machineArg: Machine<T>,\n initialProps: Partial<T[\"props\"]> = {} as Partial<T[\"props\"]>\n): MachineRunner<T> {\n const machine = machineArg as AnyMachine\n let userProps = initialProps\n const unmountFns: Array<() => void> = []\n const listeners = new Set<() => void>()\n const notify = () => listeners.forEach((fn) => fn())\n\n const bindableFactory: BindableFactory = ((propsFn) =>\n createBindable(propsFn)) as BindableFactory\n bindableFactory.cleanup = (fn) => unmountFns.push(fn)\n bindableFactory.ref = <V>(defaultValue: V) => {\n let value = defaultValue\n return {\n get: () => value,\n set: (next: V) => {\n value = next\n },\n }\n }\n\n const debug = (...args: unknown[]) => {\n if ((machine as { debug?: boolean }).debug) {\n console.log(...args)\n }\n }\n\n const propsRef = { current: {} as T[\"props\"] }\n const prop = (key: string) =>\n (propsRef.current as Record<string, unknown>)[key]\n\n const refreshProps = () => {\n const scope = scopeRef.current\n const computedProps =\n (machine as { props?: AnyFn }).props?.({\n props: compact(userProps) as Record<string, unknown>,\n scope,\n }) ?? userProps\n propsRef.current = computedProps as T[\"props\"]\n }\n\n const defaultGetRootNode = () =>\n typeof document !== \"undefined\" ? document : (null as never)\n\n const scopeRef = {\n current: createScope({\n id: (initialProps as { id?: string }).id,\n ids: (initialProps as { ids?: Record<string, string> }).ids,\n getRootNode:\n (\n initialProps as {\n getRootNode?: () => Node | ShadowRoot | Document\n }\n ).getRootNode ?? defaultGetRootNode,\n }),\n }\n refreshProps()\n\n const effectsMap = new Map<string, () => void>()\n let transitionRef: {\n actions?: unknown\n target?: string\n reenter?: boolean\n } | null = null\n let previousEvent: { type: string } = { type: \"\" }\n let currentEvent: { type: string } = { type: \"\" }\n\n const getEvent = () => ({\n ...currentEvent,\n current() {\n return currentEvent\n },\n previous() {\n return previousEvent\n },\n })\n\n const getState = () => ({\n ...state,\n matches(...values: string[]) {\n return values.some((v) => matchesState(state.ref.current as string, v))\n },\n hasTag(tag: string) {\n return hasTagFn(machine, state.ref.current as string, tag)\n },\n })\n\n const getParams = () => ({\n state: getState(),\n context: ctx,\n event: getEvent(),\n prop,\n send,\n action,\n guard,\n track: trackFn,\n refs,\n computed,\n flush,\n scope: scopeRef.current,\n choose,\n })\n\n const action = (keys: unknown) => {\n const strs = (isFunction(keys) ? (keys as AnyFn)(getParams()) : keys) as\n | string[]\n | undefined\n if (!strs) return\n const fns = strs.map((s) => {\n const fn = (\n machine as { implementations?: { actions?: Record<string, AnyFn> } }\n ).implementations?.actions?.[s]\n if (!fn) warn(`[uidex] No implementation found for action \"${s}\"`)\n return fn\n })\n for (const fn of fns) fn?.(getParams())\n }\n\n const guard = (str: unknown) => {\n if (isFunction(str)) return (str as AnyFn)(getParams())\n return (\n machine as { implementations?: { guards?: Record<string, AnyFn> } }\n ).implementations?.guards?.[str as string](getParams())\n }\n\n const effect = (keys: unknown) => {\n const strs = (isFunction(keys) ? (keys as AnyFn)(getParams()) : keys) as\n | string[]\n | undefined\n if (!strs) return\n const fns = strs.map((s) => {\n const fn = (\n machine as { implementations?: { effects?: Record<string, AnyFn> } }\n ).implementations?.effects?.[s]\n if (!fn) warn(`[uidex] No implementation found for effect \"${s}\"`)\n return fn\n })\n const localCleanups: Array<() => void> = []\n for (const fn of fns) {\n const cleanup = fn?.(getParams())\n if (typeof cleanup === \"function\") {\n localCleanups.push(cleanup as () => void)\n }\n }\n return () => localCleanups.forEach((fn) => fn())\n }\n\n const choose = (transitions: unknown) =>\n (toArray(transitions) as Array<{ guard?: unknown }>).find((t) => {\n let result = !t.guard\n if (isString(t.guard)) result = !!guard(t.guard)\n else if (isFunction(t.guard)) result = !!(t.guard as AnyFn)(getParams())\n return result\n })\n\n const computed = (key: string) => {\n ensure(\n (machine as { computed?: unknown }).computed,\n () => `[uidex] No computed object found on machine`\n )\n const fn = (machine as { computed: Record<string, AnyFn> }).computed[key]\n return fn({\n context: ctx,\n event: getEvent(),\n prop,\n refs,\n scope: scopeRef.current,\n computed,\n })\n }\n\n const trackSites = new WeakMap<\n AnyFn,\n { deps: unknown[]; cleanup?: () => void; mounted: boolean }\n >()\n const trackFn = (deps: unknown[] | undefined, fn: AnyFn) => {\n let site = trackSites.get(fn)\n const current = (deps ?? []).map((d) =>\n typeof d === \"function\" ? (d as AnyFn)() : d\n )\n if (!site) {\n site = { deps: current, mounted: false }\n trackSites.set(fn, site)\n return\n }\n const changed =\n current.length !== site.deps.length ||\n current.some((v, i) => !Object.is(v, site!.deps[i]))\n if (changed && site.mounted) {\n site.cleanup?.()\n const cleanup = fn()\n site.cleanup =\n typeof cleanup === \"function\" ? (cleanup as () => void) : undefined\n }\n site.deps = current\n }\n\n const flush = (fn: () => void) => {\n queueMicrotask(() => fn())\n }\n\n // context ------------------------------------------------------------\n let contextFields: Record<string, Bindable<unknown>> = {}\n const ctxContextFn = (machine as { context?: AnyFn }).context\n if (ctxContextFn) {\n contextFields = ctxContextFn({\n prop,\n bindable: bindableFactory,\n scope: scopeRef.current,\n flush,\n getContext() {\n return ctx\n },\n getComputed() {\n return computed\n },\n getRefs() {\n return refs\n },\n getEvent() {\n return getEvent()\n },\n }) as Record<string, Bindable<unknown>>\n }\n\n const ctx = {\n get(key: string) {\n return contextFields[key]?.ref.current\n },\n set(key: string, value: unknown) {\n contextFields[key]?.set(value as never)\n },\n initial(key: string) {\n return contextFields[key]?.initial\n },\n hash(key: string) {\n const current = contextFields[key]?.get()\n return contextFields[key]?.hash(current as never) ?? \"\"\n },\n }\n\n // refs ---------------------------------------------------------------\n const refsInit =\n (machine as { refs?: AnyFn }).refs?.({ prop, context: ctx }) ?? {}\n const refsStore: Record<string, unknown> = { ...(refsInit as object) }\n const refs = {\n get(key: string) {\n return refsStore[key]\n },\n set(key: string, value: unknown) {\n refsStore[key] = value\n },\n }\n\n // state bindable -----------------------------------------------------\n const initialState = resolveStateValue(\n machine,\n (machine as { initialState: AnyFn }).initialState({ prop }) as string\n )\n const state = createBindable<string>(() => ({\n defaultValue: initialState as string,\n onChange(nextState: string, prevState: string) {\n const { exiting, entering } = getExitEnterStates(\n machine,\n prevState,\n nextState,\n transitionRef?.reenter\n ) as {\n exiting: Array<{ path: string; state?: { exit?: unknown } }>\n entering: Array<{\n path: string\n state?: { effects?: unknown; entry?: unknown }\n }>\n }\n exiting.forEach((item) => {\n const exitEffects = effectsMap.get(item.path)\n exitEffects?.()\n effectsMap.delete(item.path)\n })\n exiting.forEach((item) => {\n action(item.state?.exit)\n })\n action(transitionRef?.actions)\n entering.forEach((item) => {\n const cleanup = effect(item.state?.effects)\n if (cleanup) effectsMap.set(item.path, cleanup)\n })\n if (prevState === INIT_STATE) {\n action((machine as { entry?: unknown }).entry)\n const cleanup = effect((machine as { effects?: unknown }).effects)\n if (cleanup) effectsMap.set(INIT_STATE, cleanup)\n }\n entering.forEach((item) => {\n action(item.state?.entry)\n })\n notify()\n },\n }))\n\n let status: MachineStatus = MachineStatus.NotStarted\n let hydrated: string | undefined\n\n const getCurrentState = (): string => state.ref.current\n\n const send = (event: { type: string }) => {\n queueMicrotask(() => {\n if (status !== MachineStatus.Started) return\n previousEvent = currentEvent\n currentEvent = event\n const currentState = getCurrentState()\n const { transitions, source } = findTransition(\n machine,\n currentState,\n event.type\n )\n const transition = choose(transitions) as\n | { actions?: unknown; target?: string; reenter?: boolean }\n | undefined\n if (!transition) return\n transitionRef = transition\n const target = resolveStateValue(\n machine,\n (transition.target ?? currentState) as string,\n source as never\n )\n debug(\"transition\", event.type, transition.target || currentState)\n const changed = target !== currentState\n if (changed) {\n state.set(target as string)\n } else if (transition.reenter) {\n ;(state as unknown as { invoke: AnyFn }).invoke(\n currentState,\n currentState\n )\n } else {\n action(transition.actions ?? [])\n notify()\n }\n })\n }\n\n ;(machine as { watch?: AnyFn }).watch?.(getParams())\n\n const service: Service<T> = {\n state: getState() as Service<T>[\"state\"],\n send,\n context: ctx as Service<T>[\"context\"],\n prop: prop as Service<T>[\"prop\"],\n scope: scopeRef.current,\n refs: refs as Service<T>[\"refs\"],\n computed: computed as Service<T>[\"computed\"],\n event: getEvent() as Service<T>[\"event\"],\n getStatus: () => status,\n }\n\n Object.defineProperty(service, \"state\", {\n get: () => getState(),\n enumerable: true,\n })\n Object.defineProperty(service, \"event\", {\n get: () => getEvent(),\n enumerable: true,\n })\n\n return {\n service,\n start() {\n if (status === MachineStatus.Started) return\n status = MachineStatus.Started\n ;(state as unknown as { invoke: AnyFn }).invoke(\n hydrated ?? state.initial,\n INIT_STATE\n )\n notify()\n },\n stop() {\n if (status === MachineStatus.Stopped) return\n hydrated = getCurrentState()\n status = MachineStatus.Stopped\n effectsMap.forEach((fn) => fn())\n effectsMap.clear()\n transitionRef = null\n while (unmountFns.length) unmountFns.pop()?.()\n listeners.clear()\n queueMicrotask(() => {\n action((machine as { exit?: unknown }).exit)\n })\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n update(next) {\n userProps = { ...userProps, ...next }\n refreshProps()\n notify()\n },\n }\n}\n","import {\n createNormalizer,\n type NormalizeProps,\n type PropTypes,\n} from \"@zag-js/types\"\n\ntype DomProps = PropTypes<Record<string, unknown>>\n\nexport const normalizeProps: NormalizeProps<DomProps> =\n createNormalizer<DomProps>((props) => props)\n\nexport type { DomProps }\n","import { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\n\n// Zag connect() returns React-style prop objects; this bridges them to imperative DOM APIs.\nexport function spreadProps(\n node: HTMLElement,\n props: Record<string, unknown>\n): Cleanup {\n const removers: Cleanup[] = []\n for (const [key, rawValue] of Object.entries(props)) {\n if (key === \"children\" || key === \"dangerouslySetInnerHTML\") continue\n if (key.startsWith(\"on\") && typeof rawValue === \"function\") {\n const eventName = key.slice(2).toLowerCase()\n // React aliases onChange to the `input` event for text-type inputs and\n // textareas so handlers fire on every keystroke. Native DOM `change`\n // only fires on blur, which breaks live-filter UIs like command palette.\n const isTextControl =\n (node instanceof HTMLInputElement &&\n node.type !== \"checkbox\" &&\n node.type !== \"radio\") ||\n node instanceof HTMLTextAreaElement\n const effectiveEvent =\n eventName === \"change\" && isTextControl ? \"input\" : eventName\n const listener = rawValue as EventListener\n node.addEventListener(effectiveEvent, listener)\n removers.push(() => node.removeEventListener(effectiveEvent, listener))\n continue\n }\n // zag's dataAttr/ariaAttr return undefined to mean \"remove\" — treat\n // undefined/null as attribute removal rather than no-op, otherwise\n // state toggles like data-highlighted stick once set.\n if (rawValue === undefined || rawValue === null) {\n node.removeAttribute(key)\n continue\n }\n if (typeof rawValue === \"boolean\") {\n if (rawValue) node.setAttribute(key, \"\")\n else node.removeAttribute(key)\n continue\n }\n if (key === \"style\" && typeof rawValue === \"object\") {\n Object.assign(node.style, rawValue as Record<string, string>)\n continue\n }\n if (key === \"className\" || key === \"class\") {\n node.setAttribute(\"class\", String(rawValue))\n continue\n }\n if (key === \"htmlFor\") {\n node.setAttribute(\"for\", String(rawValue))\n continue\n }\n if (key === \"tabIndex\") {\n node.tabIndex = Number(rawValue)\n continue\n }\n node.setAttribute(key, String(rawValue))\n }\n return composeCleanups(removers)\n}\n\nexport function createPersistentSpreads(): {\n apply(node: HTMLElement, props: Record<string, unknown>): void\n cleanupAll(): void\n} {\n const map = new Map<HTMLElement, Cleanup>()\n return {\n apply(node, props) {\n const prior = map.get(node)\n if (prior) prior()\n map.set(node, spreadProps(node, props))\n },\n cleanupAll() {\n for (const clean of map.values()) clean()\n map.clear()\n },\n }\n}\n","import type { CustomSurface } from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport type { MountedSurface } from \"./index\"\n\nexport function renderCustomSurface(\n surface: CustomSurface,\n ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n const result = surface.render(ctx, root)\n const cleanup = typeof result === \"function\" ? result : () => {}\n return {\n cleanup: () => {\n try {\n cleanup()\n } finally {\n root.replaceChildren()\n }\n },\n }\n}\n","import {\n ChevronDown,\n Copy,\n HelpCircle,\n MessageCircle,\n Target,\n createElement as createLucideElement,\n type IconNode,\n} from \"lucide\"\nimport {\n displayName,\n entityKey,\n type Entity,\n type EntityRef,\n type Flow,\n} from \"../../entities\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport { filterEntities, filterIds } from \"../builder/filter\"\nimport type {\n DetailAction,\n DetailActionIcon,\n DetailActionRunContext,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\nimport { createButton } from \"../primitives/button\"\nimport { createPillItem } from \"../primitives/chip\"\nimport { createEntityLink } from \"../primitives/entity-link\"\nimport { createIconTile } from \"../primitives/icon-tile\"\nimport {\n renderKindBadge,\n renderKindIcon,\n renderKindIconTile,\n} from \"../primitives/kind-icon\"\nimport { fillRow, fillRowWithHandle } from \"../primitives/row\"\nimport { createSection } from \"../primitives/section\"\nimport {\n createCaption,\n createDescription,\n createHeading,\n createMutedText,\n} from \"../primitives/text\"\nimport {\n LIST_GROUP_LABEL_CLASS,\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\nimport type { MountedSurface } from \"./index\"\n\nconst ICON_MAP: Record<DetailActionIcon, IconNode> = {\n copy: Copy,\n \"message-circle\": MessageCircle,\n \"chevron-down\": ChevronDown,\n target: Target,\n}\n\nfunction iconFor(icon: DetailActionIcon | undefined): IconNode | null {\n return icon ? ICON_MAP[icon] : null\n}\n\nfunction renderSubtitle(subtitle: DetailSubtitle): HTMLElement {\n const text = subtitle.extra\n ? `${subtitle.rawId} · ${subtitle.extra}`\n : subtitle.rawId\n return createCaption({\n class: \"px-2\",\n attrs: { \"data-uidex-detail-subtitle\": \"\" },\n text,\n })\n}\n\nfunction renderNotFound(ref: EntityRef): HTMLElement {\n return createMutedText({\n class: \"p-4\",\n attrs: { \"data-uidex-detail-missing\": \"\" },\n text: `${ref.kind}: ${ref.id} not found in registry`,\n })\n}\n\ninterface RenderedActions {\n node: HTMLElement\n buttons: readonly HTMLButtonElement[]\n cleanup: Cleanup\n}\n\nfunction renderActions(\n actions: readonly DetailAction[],\n ctx: ViewContext,\n root: HTMLElement,\n heading?: string\n): RenderedActions {\n const cleanups: Cleanup[] = []\n const buttons: HTMLButtonElement[] = []\n\n const section = el(\"section\", {\n class: \"flex flex-col\",\n attrs: { \"data-uidex-detail-actions\": \"\" },\n })\n if (heading) {\n section.append(el(\"h3\", { class: LIST_GROUP_LABEL_CLASS, text: heading }))\n }\n const list = el(\"div\", {\n class: \"flex flex-col\",\n attrs: { role: \"listbox\", \"aria-label\": heading ?? \"Actions\" },\n })\n section.append(list)\n\n for (const action of actions) {\n const btn = createButton({\n variant: \"action\",\n attrs: {\n role: \"option\",\n tabindex: buttons.length === 0 ? \"0\" : \"-1\",\n \"data-uidex-detail-action\": action.id,\n \"aria-label\": action.ariaLabel ?? action.label,\n },\n })\n let leading: Node | undefined\n const icon = iconFor(action.icon)\n if (icon) {\n const svg = createLucideElement(icon)\n svg.setAttribute(\"aria-hidden\", \"true\")\n svg.setAttribute(\"class\", \"h-4 w-4 shrink-0\")\n leading = createIconTile(svg)\n }\n const { label: labelEl } = fillRowWithHandle(btn, {\n leading,\n label: action.label,\n trailing: action.hint,\n })\n\n let revertTimer: ReturnType<typeof setTimeout> | null = null\n const runCtx: DetailActionRunContext = {\n setLabel(next, durationMs) {\n if (revertTimer !== null) {\n clearTimeout(revertTimer)\n revertTimer = null\n }\n labelEl.textContent = next\n if (durationMs && durationMs > 0) {\n revertTimer = setTimeout(() => {\n labelEl.textContent = action.label\n revertTimer = null\n }, durationMs)\n }\n },\n }\n\n const onClick = async () => {\n if (\"copy\" in action) {\n try {\n await navigator.clipboard?.writeText(action.copy)\n runCtx.setLabel(\"Copied!\", 1200)\n } catch (err) {\n console.warn(\"[uidex] copy action: clipboard write failed\", err)\n runCtx.setLabel(\"Copy failed\", 1500)\n }\n } else if (\"scrollTo\" in action) {\n const target = root.querySelector<HTMLElement>(action.scrollTo)\n target?.scrollIntoView({ block: \"start\", behavior: \"smooth\" })\n } else if (\"push\" in action) {\n ctx.push({ id: action.push.id, ref: action.push.ref ?? null })\n } else if (\"navigate\" in action) {\n ctx.navigate(action.navigate)\n } else if (\"highlight\" in action) {\n ctx.pinHighlight(action.highlight)\n ctx.close()\n } else {\n await action.run(runCtx)\n }\n }\n btn.addEventListener(\"click\", onClick)\n cleanups.push(() => {\n btn.removeEventListener(\"click\", onClick)\n if (revertTimer !== null) clearTimeout(revertTimer)\n })\n buttons.push(btn)\n list.append(btn)\n }\n\n return { node: section, buttons, cleanup: composeCleanups(cleanups) }\n}\n\ninterface RenderedSection {\n node: HTMLElement\n cleanup: Cleanup\n}\n\nfunction renderRefList(\n ctx: ViewContext,\n label: string,\n entities: readonly Entity[],\n dataAttr: string\n): RenderedSection | null {\n if (entities.length === 0) return null\n const cleanups: Cleanup[] = []\n const items = entities.map((entity) => {\n const ref: EntityRef = { kind: entity.kind, id: entityKey(entity) }\n const link = createEntityLink({\n ctx,\n target: ref,\n label: displayName(entity),\n leading: renderKindIconTile(entity.kind),\n })\n cleanups.push(link.cleanup)\n return el(\"li\", {}, [link.node])\n })\n const node = createSection({ heading: label, dataAttr }, items)\n return { node, cleanup: composeCleanups(cleanups) }\n}\n\nfunction renderFlowList(\n ctx: ViewContext,\n flows: readonly Flow[]\n): RenderedSection | null {\n if (flows.length === 0) return null\n const cleanups: Cleanup[] = []\n const items = flows.map((flow) => {\n const link = createEntityLink({\n ctx,\n target: { kind: \"flow\", id: flow.id },\n label: displayName(flow),\n leading: renderKindIconTile(\"flow\"),\n })\n cleanups.push(link.cleanup)\n return el(\"li\", {}, [link.node])\n })\n const node = createSection(\n { heading: SECTION_LABELS.flows, dataAttr: \"data-uidex-detail-flows\" },\n items\n )\n return { node, cleanup: composeCleanups(cleanups) }\n}\n\nfunction renderTouches(\n ctx: ViewContext,\n entities: readonly Entity[],\n unresolved: readonly string[],\n query: string\n): RenderedSection {\n if (entities.length === 0 && unresolved.length === 0) {\n const section = el(\"section\", {\n class: \"flex flex-col gap-2\",\n attrs: { \"data-uidex-detail-touches\": \"\" },\n })\n section.append(\n createHeading({ text: SECTION_LABELS.touches }),\n createMutedText({\n attrs: { \"data-uidex-detail-empty\": \"\" },\n text: query ? \"No matches\" : \"No entities touched\",\n })\n )\n return { node: section, cleanup: () => {} }\n }\n\n const cleanups: Cleanup[] = []\n const items: HTMLElement[] = []\n for (const entity of entities) {\n const link = createEntityLink({\n ctx,\n target: { kind: entity.kind, id: entityKey(entity) },\n label: displayName(entity),\n leading: renderKindIconTile(entity.kind),\n })\n cleanups.push(link.cleanup)\n items.push(el(\"li\", {}, [link.node]))\n }\n for (const id of unresolved) {\n const host = el(\"li\", {\n class: cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"text-muted-foreground\"\n ),\n attrs: {\n \"data-uidex-detail-unresolved\": \"\",\n \"data-uidex-detail-row\": \"unresolved\",\n tabindex: \"-1\",\n },\n })\n const helpIcon = createLucideElement(HelpCircle)\n helpIcon.setAttribute(\"aria-hidden\", \"true\")\n helpIcon.setAttribute(\"class\", \"h-4 w-4 shrink-0\")\n fillRow(host, { leading: createIconTile(helpIcon), label: id })\n items.push(host)\n }\n const node = createSection(\n { heading: SECTION_LABELS.touches, dataAttr: \"data-uidex-detail-touches\" },\n items\n )\n return { node, cleanup: composeCleanups(cleanups) }\n}\n\nfunction renderRoutePaths(paths: readonly string[]): RenderedSection | null {\n if (paths.length === 0) return null\n const node = createSection(\n { heading: SECTION_LABELS.routes, dataAttr: \"data-uidex-detail-routes\" },\n paths.map((p) => {\n const host = el(\"li\", {\n class: cn(LIST_ITEM_CLASS, LIST_ITEM_INTERACTIVE_CLASS),\n attrs: {\n \"data-uidex-detail-row\": \"route\",\n tabindex: \"-1\",\n },\n })\n fillRow(host, {\n leading: renderKindIconTile(\"route\"),\n label: p,\n })\n return host\n })\n )\n return { node, cleanup: () => {} }\n}\n\nfunction renderAcceptanceChecklist(items: readonly string[]): HTMLElement {\n return createSection(\n {\n heading: SECTION_LABELS.acceptance,\n dataAttr: \"data-uidex-detail-acceptance\",\n },\n items.map((text, idx) => {\n const id = `uidex-acceptance-${idx}`\n const checkbox = el(\"input\", {\n attrs: {\n type: \"checkbox\",\n id,\n \"data-uidex-acceptance-item\": String(idx),\n },\n class:\n \"mt-1 h-3.5 w-3.5 shrink-0 cursor-pointer accent-accent focus:outline-none\",\n }) as HTMLInputElement\n const label = el(\"label\", {\n class: cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer items-start\"\n ),\n attrs: { for: id },\n })\n const { label: labelSpan } = fillRowWithHandle(label, {\n leading: checkbox,\n label: text,\n })\n labelSpan.className = \"min-w-0 flex-1 whitespace-normal break-words\"\n const syncChecked = (): void => {\n labelSpan.classList.toggle(\"line-through\", checkbox.checked)\n labelSpan.classList.toggle(\"text-muted-foreground\", checkbox.checked)\n }\n checkbox.addEventListener(\"change\", syncChecked)\n checkbox.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n checkbox.checked = !checkbox.checked\n syncChecked()\n }\n })\n return el(\"li\", {}, [label])\n })\n )\n}\n\nfunction renderSection(\n section: DetailSection,\n ctx: ViewContext,\n query: string\n): RenderedSection | null {\n switch (section.id) {\n case \"description\": {\n if (!section.text) return null\n return {\n node: createDescription({\n class: \"px-2\",\n attrs: { \"data-uidex-detail-description\": \"\" },\n text: section.text,\n }),\n cleanup: () => {},\n }\n }\n case \"acceptance\": {\n if (section.items.length === 0) return null\n return {\n node: renderAcceptanceChecklist(section.items),\n cleanup: () => {},\n }\n }\n case \"scopes\": {\n if (section.scopes.length === 0) return null\n const node = el(\n \"ul\",\n {\n class: \"flex flex-wrap gap-1.5\",\n attrs: { \"data-uidex-detail-scopes\": \"\" },\n },\n section.scopes.map((s) => createPillItem({ text: s }))\n )\n return { node, cleanup: () => {} }\n }\n case \"composes\":\n return renderRefList(\n ctx,\n section.label,\n section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n \"data-uidex-detail-composes\"\n )\n case \"used-by\":\n return renderRefList(\n ctx,\n section.label,\n section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n \"data-uidex-detail-used-by\"\n )\n case \"flows\":\n return renderFlowList(\n ctx,\n section.filterable\n ? filterEntities(section.flows, query)\n : section.flows\n )\n case \"touches\":\n return renderTouches(\n ctx,\n section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n section.filterable\n ? filterIds(section.unresolved, query)\n : section.unresolved,\n query\n )\n case \"routes\":\n return renderRoutePaths(\n section.filterable ? filterIds(section.paths, query) : section.paths\n )\n }\n}\n\nfunction hasFilterableSections(sections: readonly DetailSection[]): boolean {\n return sections.some((s) => \"filterable\" in s && s.filterable === true)\n}\n\nexport function renderDetailSurface(\n surface: DetailSurface,\n ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n if (surface.notFound) {\n root.append(renderNotFound(surface.notFound))\n return { cleanup: () => root.replaceChildren() }\n }\n\n const body = el(\"div\", {\n class: \"flex flex-col gap-3 px-2 py-4\",\n attrs: {\n \"data-uidex-detail-body\": \"\",\n \"data-uidex-detail-kind\": surface.entityKind,\n },\n })\n\n const cleanups: Cleanup[] = []\n\n const headerGroup = el(\"div\", {\n class: \"flex items-center gap-2 px-2\",\n })\n if (surface.title) {\n headerGroup.append(\n el(\"h2\", {\n class:\n \"min-w-0 flex-1 truncate text-base font-semibold text-foreground\",\n attrs: { \"data-uidex-detail-title\": \"\" },\n text: surface.title,\n })\n )\n }\n const kindBadge = renderKindBadge(surface.entityKind)\n kindBadge.classList.add(\"ml-auto\")\n headerGroup.append(kindBadge)\n body.append(headerGroup)\n\n if (surface.subtitle) body.append(renderSubtitle(surface.subtitle))\n\n let actionsNode: HTMLElement | null = null\n if (surface.actions && surface.actions.length > 0) {\n const rendered = renderActions(\n surface.actions,\n ctx,\n root,\n SECTION_LABELS.actions\n )\n cleanups.push(rendered.cleanup)\n actionsNode = rendered.node\n }\n\n const sections = surface.sections ?? []\n const filterable = hasFilterableSections(sections)\n\n const listsContainer = el(\"div\", {\n class: \"flex flex-col gap-3\",\n attrs: { \"data-uidex-detail-sections\": \"\" },\n })\n body.append(listsContainer)\n\n let sectionCleanup: Cleanup = () => {}\n let focusables: HTMLElement[] = []\n\n const focusAt = (rawIdx: number): void => {\n if (focusables.length === 0) return\n const idx = Math.max(0, Math.min(rawIdx, focusables.length - 1))\n for (let i = 0; i < focusables.length; i++) {\n focusables[i].tabIndex = i === idx ? 0 : -1\n }\n focusables[idx].focus()\n }\n\n const FOCUS_SELECTOR =\n \"button[data-uidex-detail-action], button[data-uidex-entity-link], input[data-uidex-acceptance-item], [data-uidex-detail-row]\"\n\n const refreshFocusSequence = (): void => {\n focusables = Array.from(\n listsContainer.querySelectorAll<HTMLElement>(FOCUS_SELECTOR)\n )\n for (let i = 0; i < focusables.length; i++) {\n focusables[i].tabIndex = i === 0 ? 0 : -1\n }\n }\n\n const onNavKeyDown = (e: KeyboardEvent): void => {\n if (\n e.key !== \"ArrowDown\" &&\n e.key !== \"ArrowUp\" &&\n e.key !== \"Home\" &&\n e.key !== \"End\"\n )\n return\n const rootNode = body.getRootNode()\n const active =\n rootNode instanceof ShadowRoot\n ? rootNode.activeElement\n : document.activeElement\n if (!(active instanceof HTMLElement)) return\n\n const inSearch = active === ctx.searchInput\n if (inSearch) {\n if (focusables.length === 0) return\n e.preventDefault()\n const idx =\n e.key === \"ArrowUp\" || e.key === \"End\" ? focusables.length - 1 : 0\n focusAt(idx)\n return\n }\n\n const idx = focusables.indexOf(active)\n if (idx === -1) return\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n if (idx === 0) ctx.searchInput.focus()\n else focusAt(idx - 1)\n return\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n if (idx < focusables.length - 1) focusAt(idx + 1)\n return\n }\n if (e.key === \"Home\") {\n e.preventDefault()\n focusAt(0)\n return\n }\n if (e.key === \"End\") {\n e.preventDefault()\n focusAt(focusables.length - 1)\n return\n }\n }\n\n body.addEventListener(\"keydown\", onNavKeyDown)\n ctx.searchInput.addEventListener(\"keydown\", onNavKeyDown)\n\n function renderSections(query: string): void {\n sectionCleanup()\n listsContainer.replaceChildren()\n const cs: Cleanup[] = []\n let hasFilterableSection = false\n let renderedFilterable = 0\n let actionsPlaced = false\n const placeActions = (): void => {\n if (actionsNode && !actionsPlaced) {\n listsContainer.append(actionsNode)\n actionsPlaced = true\n }\n }\n for (const section of sections) {\n const isFilterable =\n \"filterable\" in section && section.filterable === true\n if (isFilterable) hasFilterableSection = true\n const sectionQuery = isFilterable ? query : \"\"\n const out = renderSection(section, ctx, sectionQuery)\n if (!out) continue\n if (isFilterable) renderedFilterable++\n listsContainer.append(out.node)\n cs.push(out.cleanup)\n if (section.id === \"description\") placeActions()\n }\n if (!actionsPlaced && actionsNode) {\n listsContainer.prepend(actionsNode)\n actionsPlaced = true\n }\n if (query && hasFilterableSection && renderedFilterable === 0) {\n listsContainer.append(\n createMutedText({\n attrs: { \"data-uidex-detail-empty\": \"\" },\n text: \"No matches\",\n })\n )\n }\n sectionCleanup = composeCleanups(cs)\n refreshFocusSequence()\n }\n\n renderSections(\"\")\n\n root.append(body)\n\n const cleanup = composeCleanups([\n ...cleanups,\n () => sectionCleanup(),\n () => {\n body.removeEventListener(\"keydown\", onNavKeyDown)\n ctx.searchInput.removeEventListener(\"keydown\", onNavKeyDown)\n },\n () => root.replaceChildren(),\n ])\n\n const mounted: MountedSurface = { cleanup }\n if (filterable) {\n mounted.onSearch = renderSections\n }\n return mounted\n}\n","import { displayName, entityKey, type Entity } from \"../../entities\"\n\nexport function normalizeQuery(query: string): string {\n return query.trim().toLowerCase()\n}\n\nexport function matchesQuery(haystack: string, query: string): boolean {\n const q = normalizeQuery(query)\n if (!q) return true\n return haystack.toLowerCase().includes(q)\n}\n\nexport function filterEntities<E extends Entity>(\n entities: readonly E[],\n query: string\n): readonly E[] {\n const q = normalizeQuery(query)\n if (!q) return entities\n return entities.filter((e) => {\n const name = displayName(e).toLowerCase()\n const id = entityKey(e).toLowerCase()\n return (\n name.includes(q) || id.includes(q) || e.kind.toLowerCase().includes(q)\n )\n })\n}\n\nexport function filterIds(\n ids: readonly string[],\n query: string\n): readonly string[] {\n const q = normalizeQuery(query)\n if (!q) return ids\n return ids.filter((id) => id.toLowerCase().includes(q))\n}\n","export const SECTION_LABELS = {\n acceptance: \"Acceptance criteria\",\n actions: \"Actions\",\n contains: \"Contains\",\n usedBy: \"Used by\",\n flows: \"Flows\",\n touches: \"Touches\",\n routes: \"Routes\",\n} as const\n\nexport const PALETTE_GROUPS = {\n commands: \"Commands\",\n} as const\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\nimport { cva } from \"./cva\"\n\nexport type ButtonVariant =\n | \"default\"\n | \"destructive\"\n | \"destructive-outline\"\n | \"ghost\"\n | \"link\"\n | \"outline\"\n | \"secondary\"\n\nexport type ButtonSize =\n | \"default\"\n | \"sm\"\n | \"xs\"\n | \"lg\"\n | \"xl\"\n | \"icon\"\n | \"icon-sm\"\n | \"icon-lg\"\n | \"icon-xs\"\n\nconst buttonBase =\n \"focus-visible:ring-ring focus-visible:ring-offset-background disabled:opacity-60 relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border text-sm font-medium outline-none transition-shadow focus-visible:ring-2 focus-visible:ring-offset-1 disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg]:pointer-events-none [&_svg]:shrink-0\"\n\nexport const buttonVariants = cva(buttonBase, {\n defaultVariants: { size: \"default\", variant: \"default\" },\n variants: {\n size: {\n default: \"h-8 px-3\",\n sm: \"h-7 gap-1.5 px-2.5\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs\",\n lg: \"h-9 px-3.5\",\n xl: \"h-10 px-4 text-base\",\n icon: \"size-8\",\n \"icon-sm\": \"size-7\",\n \"icon-lg\": \"size-9\",\n \"icon-xs\": \"size-6 rounded-md\",\n },\n variant: {\n default:\n \"border-primary bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"border-destructive bg-destructive shadow-xs hover:bg-destructive/90 text-white\",\n \"destructive-outline\":\n \"border-input bg-popover text-destructive-foreground shadow-xs/5 hover:border-destructive/30 hover:bg-destructive/5 dark:bg-input/30\",\n ghost:\n \"text-foreground hover:bg-accent hover:text-accent-foreground border-transparent\",\n link: \"text-foreground border-transparent underline-offset-4 hover:underline\",\n outline:\n \"border-input bg-popover text-foreground shadow-xs/5 hover:bg-accent hover:text-accent-foreground dark:bg-input/30\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/90 border-transparent\",\n },\n },\n})\n\nexport interface CreateButtonOptions extends Omit<ElementOptions, \"class\"> {\n variant?: ButtonVariant\n size?: ButtonSize\n class?: ClassValue\n}\n\nexport function createButton(\n options: CreateButtonOptions = {},\n children: Child | Child[] = []\n): HTMLButtonElement {\n const { variant, size, class: extra, attrs, ...rest } = options\n return el(\n \"button\",\n {\n ...rest,\n class: cn(buttonVariants({ variant, size }), extra),\n attrs: { type: \"button\", \"data-slot\": \"button\", ...attrs },\n },\n children\n )\n}\n","export const LIST_ITEM_CLASS =\n \"flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-base outline-none sm:min-h-7 sm:text-sm\"\n\nexport const LIST_ITEM_STATE_CLASS =\n \"data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-64\"\n\nexport const LIST_ITEM_INTERACTIVE_CLASS =\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-within:bg-accent focus-within:text-accent-foreground\"\n\nexport const LIST_GROUP_LABEL_CLASS =\n \"text-muted-foreground px-2 py-1.5 text-xs font-medium\"\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../../internal/el\"\nimport {\n createButton as createUiButton,\n type ButtonSize,\n type ButtonVariant as UiButtonVariant,\n} from \"../../ui/button\"\nimport {\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\n\n// `action` renders a button-shaped palette row so entity links, acceptance\n// rows, and detail actions share the list-item appearance.\nexport type ButtonVariant = \"primary\" | \"action\" | \"link\"\n\nconst VARIANT_MAP: Record<\n Exclude<ButtonVariant, \"action\">,\n { variant: UiButtonVariant; size?: ButtonSize; extra?: ClassValue }\n> = {\n primary: { variant: \"default\", size: \"default\", extra: \"self-start\" },\n link: {\n variant: \"link\",\n extra: \"h-auto w-auto justify-start px-0 py-0 font-normal shadow-none\",\n },\n}\n\nexport interface CreateButtonOptions extends Omit<ElementOptions, \"class\"> {\n variant: ButtonVariant\n class?: ClassValue\n}\n\nexport function createButton(\n options: CreateButtonOptions,\n children: Child | Child[] = []\n): HTMLButtonElement {\n const { variant, class: extraClass, attrs, ...rest } = options\n if (variant === \"action\") {\n return el(\n \"button\",\n {\n ...rest,\n class: cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer text-left font-normal\",\n extraClass\n ),\n attrs: { type: \"button\", \"data-slot\": \"list-item-button\", ...attrs },\n },\n children\n )\n }\n const mapped = VARIANT_MAP[variant]\n return createUiButton(\n {\n ...rest,\n variant: mapped.variant,\n size: mapped.size,\n class: cn(mapped.extra, extraClass),\n attrs,\n },\n children\n )\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\n\nconst KBD_CLASS =\n \"bg-muted text-muted-foreground pointer-events-none inline-flex h-5 min-w-5 select-none items-center justify-center gap-1 rounded px-1 font-sans text-xs font-medium [&_svg:not([class*='size-'])]:size-3\"\n\nconst KBD_GROUP_CLASS = \"inline-flex items-center gap-1\"\n\nconst COMMAND_SHORTCUT_CLASS =\n \"text-muted-foreground/70 ms-auto font-sans text-xs font-medium tracking-widest\"\n\nexport interface CreateKbdOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n}\n\nexport function createKbd(\n options: CreateKbdOptions = {},\n children: Child | Child[] = []\n): HTMLElement {\n const { class: extra, attrs, ...rest } = options\n return el(\n \"kbd\",\n {\n ...rest,\n class: cn(KBD_CLASS, extra),\n attrs: { \"data-slot\": \"kbd\", ...attrs },\n },\n children\n )\n}\n\nexport function createKbdGroup(\n options: CreateKbdOptions = {},\n children: Child | Child[] = []\n): HTMLElement {\n const { class: extra, attrs, ...rest } = options\n return el(\n \"kbd\",\n {\n ...rest,\n class: cn(KBD_GROUP_CLASS, extra),\n attrs: { \"data-slot\": \"kbd-group\", ...attrs },\n },\n children\n )\n}\n\n/**\n * Lighter shortcut text used inside command-palette rows (coss\n * `CommandShortcut`). No background pill — just muted mono-tracked type.\n */\nexport function createCommandShortcut(\n options: CreateKbdOptions = {},\n children: Child | Child[] = []\n): HTMLElement {\n const { class: extra, attrs, ...rest } = options\n return el(\n \"kbd\",\n {\n ...rest,\n class: cn(COMMAND_SHORTCUT_CLASS, extra),\n attrs: { \"data-slot\": \"command-shortcut\", ...attrs },\n },\n children\n )\n}\n","import { el } from \"../../internal/el\"\nimport { createCommandShortcut } from \"../../ui/kbd\"\n\n// Rows are always single-line: `leading`, `label`, optional muted `subtitle`\n// suffix, `trailing` (kbd if string, else raw node).\nexport interface RowContent {\n leading?: Node | null\n label: string\n subtitle?: string\n trailing?: Node | string | null\n}\n\nconst LABEL_CLASS = \"min-w-0 flex-1 truncate\"\nconst SUBTITLE_CLASS = \"truncate text-xs text-muted-foreground\"\n\n/** Returns the mutable label `<span>` so callers can swap its text later. */\nexport function fillRowWithHandle(\n host: HTMLElement,\n content: RowContent\n): { label: HTMLSpanElement } {\n if (content.leading) host.append(content.leading)\n const label = el(\"span\", { class: LABEL_CLASS, text: content.label })\n host.append(label)\n if (content.subtitle) {\n host.append(\n el(\"span\", {\n class: SUBTITLE_CLASS,\n attrs: { \"data-uidex-row-subtitle\": \"\" },\n text: content.subtitle,\n })\n )\n }\n if (content.trailing != null) {\n host.append(\n typeof content.trailing === \"string\"\n ? createCommandShortcut({ text: content.trailing })\n : content.trailing\n )\n }\n return { label }\n}\n\n/**\n * Host is expected to provide its own `flex` container styling (alignment,\n * gap, padding). The row only injects the inner leading/label/trailing slots.\n */\nexport function fillRow(host: HTMLElement, content: RowContent): void {\n fillRowWithHandle(host, content)\n}\n","import type { ClassValue } from \"clsx\"\nimport { KIND_STYLE, type EntityRef } from \"../../entities\"\nimport type { Cleanup } from \"../../internal/cleanup\"\nimport type { ViewContext } from \"../core/types\"\nimport { createButton } from \"./button\"\nimport { fillRow } from \"./row\"\n\nexport interface EntityLinkOptions {\n ctx: ViewContext\n target: EntityRef\n label?: string\n leading?: Node | null\n class?: ClassValue\n}\n\nexport function createEntityLink(options: EntityLinkOptions): {\n node: HTMLButtonElement\n cleanup: Cleanup\n} {\n const { ctx, target, label, leading, class: extraClass } = options\n const node = createButton({\n variant: \"action\",\n class: [\"w-full\", extraClass],\n attrs: {\n \"data-uidex-entity-link\": \"\",\n \"data-uidex-ref-kind\": target.kind,\n \"data-uidex-ref-id\": target.id,\n },\n })\n fillRow(node, { leading, label: label ?? `${target.kind}: ${target.id}` })\n const onClick = () => ctx.navigate(target)\n const preview = (): void => {\n ctx.highlight.show(target, { color: KIND_STYLE[target.kind].color })\n }\n const restoreParent = (): void => {\n if (ctx.ref) {\n ctx.highlight.show(ctx.ref, { color: KIND_STYLE[ctx.ref.kind].color })\n } else {\n ctx.highlight.hide()\n }\n }\n node.addEventListener(\"click\", onClick)\n node.addEventListener(\"mouseenter\", preview)\n node.addEventListener(\"mouseleave\", restoreParent)\n node.addEventListener(\"focus\", preview)\n node.addEventListener(\"blur\", restoreParent)\n return {\n node,\n cleanup: () => {\n node.removeEventListener(\"click\", onClick)\n node.removeEventListener(\"mouseenter\", preview)\n node.removeEventListener(\"mouseleave\", restoreParent)\n node.removeEventListener(\"focus\", preview)\n node.removeEventListener(\"blur\", restoreParent)\n },\n }\n}\n","import { el, type Child } from \"../../internal/el\"\nimport { LIST_GROUP_LABEL_CLASS } from \"../../ui/list-item\"\n\nexport interface CreateSectionOptions {\n heading?: string\n dataAttr: string\n listClass?: string\n}\n\nexport function createSection(\n options: CreateSectionOptions,\n items: Child[]\n): HTMLElement {\n const { heading, dataAttr, listClass = \"flex flex-col\" } = options\n const children: Child[] = []\n if (heading) {\n children.push(el(\"h3\", { class: LIST_GROUP_LABEL_CLASS, text: heading }))\n }\n children.push(el(\"ul\", { class: listClass }, items))\n return el(\n \"section\",\n {\n class: \"flex flex-col\",\n attrs: { [dataAttr]: \"\" },\n },\n children\n )\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { el, type ElementOptions } from \"../../internal/el\"\nimport { LIST_GROUP_LABEL_CLASS } from \"../../ui/list-item\"\n\nexport interface TextOptions extends Omit<ElementOptions, \"class\" | \"text\"> {\n text?: string\n class?: ClassValue\n}\n\nconst CAPTION_CLASS = \"font-mono text-xs text-muted-foreground\"\nconst MUTED_CLASS = \"text-sm text-muted-foreground\"\nconst DESCRIPTION_CLASS = \"text-sm leading-relaxed text-foreground\"\nconst HEADING_CLASS = LIST_GROUP_LABEL_CLASS\n\nexport function createCaption(options: TextOptions = {}): HTMLParagraphElement {\n const { class: extra, ...rest } = options\n return el(\"p\", { ...rest, class: cn(CAPTION_CLASS, extra) })\n}\n\nexport function createMutedText(\n options: TextOptions = {}\n): HTMLParagraphElement {\n const { class: extra, ...rest } = options\n return el(\"p\", { ...rest, class: cn(MUTED_CLASS, extra) })\n}\n\nexport function createDescription(\n options: TextOptions = {}\n): HTMLParagraphElement {\n const { class: extra, ...rest } = options\n return el(\"p\", { ...rest, class: cn(DESCRIPTION_CLASS, extra) })\n}\n\nexport function createHeading(options: TextOptions = {}): HTMLHeadingElement {\n const { class: extra, ...rest } = options\n return el(\"h3\", { ...rest, class: cn(HEADING_CLASS, extra) })\n}\n","import { createActor, fromPromise } from \"xstate\"\n\nimport { formMachine } from \"../../flows/form\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { el } from \"../../internal/el\"\nimport { createButton } from \"../../ui/button\"\nimport { createField, createFieldError, createFieldLabel } from \"../../ui/field\"\nimport { createForm } from \"../../ui/form\"\nimport { createInput, createTextarea } from \"../../ui/input\"\nimport { createNativeSelect } from \"../../ui/select\"\nimport type {\n FormField,\n FormSubmitResult,\n FormSurface,\n FormValue,\n StandardSchemaIssue,\n StandardSchemaV1,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport type { MountedSurface } from \"./index\"\n\ninterface FieldHandle {\n name: string\n node: HTMLElement\n control: HTMLElement\n errorNode: HTMLParagraphElement\n read(): FormValue\n reset(): void\n setError(message: string | null): void\n}\n\nlet fieldSeq = 0\nconst nextFieldId = (): string => `uidex-field-${++fieldSeq}`\n\nfunction issuePathRoot(issue: StandardSchemaIssue): string | undefined {\n const seg = issue.path?.[0]\n if (seg === undefined) return undefined\n if (typeof seg === \"object\" && seg !== null && \"key\" in seg) {\n return String(seg.key)\n }\n return String(seg)\n}\n\nasync function validateWithSchema(\n schema: StandardSchemaV1<Record<string, unknown>>,\n values: Record<string, FormValue>\n): Promise<Record<string, string> | null> {\n const result = await schema[\"~standard\"].validate(values)\n if (!(\"issues\" in result) || !result.issues) return null\n // First issue per field wins — later issues are usually noise once the\n // root cause is fixed and the user re-submits.\n const out: Record<string, string> = {}\n for (const issue of result.issues) {\n const key = issuePathRoot(issue)\n if (!key) continue\n if (out[key]) continue\n out[key] = issue.message\n }\n return Object.keys(out).length > 0 ? out : null\n}\n\nfunction renderField(\n field: FormField,\n initial: FormValue | undefined\n): FieldHandle {\n const controlId = nextFieldId()\n let control: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n let read: () => FormValue\n let reset: () => void\n\n switch (field.kind) {\n case \"select\": {\n const node = createNativeSelect({\n attrs: {\n name: field.name,\n id: controlId,\n required: field.required ?? false,\n },\n })\n for (const opt of field.options) {\n node.append(\n el(\"option\", { attrs: { value: opt.value }, text: opt.label })\n )\n }\n const initialVal =\n typeof initial === \"string\"\n ? initial\n : typeof field.value === \"string\"\n ? field.value\n : field.options[0]?.value\n if (initialVal !== undefined) node.value = initialVal\n control = node\n read = () => node.value\n reset = () => {\n if (initialVal !== undefined) node.value = initialVal\n }\n break\n }\n case \"text\":\n case \"email\": {\n const node = createInput({\n attrs: {\n type: field.kind === \"email\" ? \"email\" : \"text\",\n name: field.name,\n id: controlId,\n placeholder: field.placeholder ?? \"\",\n required: field.required ?? false,\n },\n })\n const initialVal =\n typeof initial === \"string\"\n ? initial\n : typeof field.value === \"string\"\n ? field.value\n : \"\"\n node.value = initialVal\n control = node\n read = () => node.value\n reset = () => {\n node.value = initialVal\n }\n break\n }\n case \"textarea\": {\n const node = createTextarea({\n attrs: {\n name: field.name,\n id: controlId,\n placeholder: field.placeholder ?? \"\",\n required: field.required ?? false,\n rows: field.rows,\n },\n })\n const initialVal =\n typeof initial === \"string\"\n ? initial\n : typeof field.value === \"string\"\n ? field.value\n : \"\"\n node.value = initialVal\n control = node\n read = () => node.value\n reset = () => {\n node.value = initialVal\n }\n break\n }\n case \"checkbox\": {\n const input = el(\"input\", {\n attrs: {\n type: \"checkbox\",\n name: field.name,\n id: controlId,\n },\n class:\n \"border-input bg-popover size-4 cursor-pointer rounded-[0.25rem] border accent-primary\",\n }) as HTMLInputElement\n const initialVal =\n typeof initial === \"boolean\"\n ? initial\n : typeof field.value === \"boolean\"\n ? field.value\n : false\n input.checked = initialVal\n control = input\n read = () => input.checked\n reset = () => {\n input.checked = initialVal\n }\n break\n }\n }\n\n const errorNode = createFieldError()\n const field$ = createField(\n {\n name: field.name,\n class: field.kind === \"checkbox\" ? \"flex-row items-center gap-2\" : \"\",\n },\n []\n )\n\n if (field.kind === \"checkbox\") {\n field$.append(\n control,\n createFieldLabel({ htmlFor: controlId }, field.label)\n )\n } else {\n field$.append(\n createFieldLabel({ htmlFor: controlId }, field.label),\n control\n )\n }\n field$.append(errorNode)\n\n const setError = (message: string | null): void => {\n if (!message) {\n errorNode.hidden = true\n errorNode.textContent = \"\"\n control.removeAttribute(\"aria-invalid\")\n return\n }\n errorNode.hidden = false\n errorNode.textContent = message\n control.setAttribute(\"aria-invalid\", \"true\")\n }\n\n return {\n name: field.name,\n node: field$,\n control,\n errorNode,\n read,\n reset,\n setError,\n }\n}\n\nexport function renderFormSurface(\n surface: FormSurface,\n _ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n const cleanups: Cleanup[] = []\n const fields = surface.fields.map((field) =>\n renderField(field, surface.initial?.[field.name])\n )\n const fieldByName = new Map(fields.map((f) => [f.name, f]))\n\n const status = el(\"p\", {\n class: \"text-muted-foreground text-xs\",\n attrs: {\n \"data-uidex-form-status\": \"\",\n \"aria-live\": \"polite\",\n },\n })\n\n // sr-only preserves native form-submit semantics (Enter in input,\n // `requestSubmit()`) and screen-reader announcement without the button\n // showing — the shell footer surfaces the primary-action hint.\n const submit = createButton({\n variant: \"default\",\n class: \"sr-only\",\n attrs: {\n type: \"submit\",\n \"data-uidex-form-submit\": \"\",\n },\n text: surface.submit.label,\n })\n\n const form = createForm({ attrs: { \"data-uidex-form\": surface.id } }, [\n ...fields.map((f) => f.node),\n submit,\n status,\n ])\n\n function clearAllFieldErrors(): void {\n for (const f of fields) f.setError(null)\n }\n\n function applyFieldErrors(errs: Record<string, string> | undefined): void {\n clearAllFieldErrors()\n if (!errs) return\n for (const [name, message] of Object.entries(errs)) {\n fieldByName.get(name)?.setError(message)\n }\n }\n\n function setStatus(result: FormSubmitResult | null): void {\n status.replaceChildren()\n status.classList.remove(\"text-destructive-foreground\")\n status.classList.add(\"text-muted-foreground\")\n if (!result) return\n if (result.status === \"error\") {\n status.classList.remove(\"text-muted-foreground\")\n status.classList.add(\"text-destructive-foreground\")\n if (!result.fieldErrors) {\n status.textContent = result.message\n }\n return\n }\n if (result.link) {\n status.append(\n document.createTextNode(`${result.message ?? \"Submitted.\"} `),\n el(\"a\", {\n class: \"text-foreground underline underline-offset-4\",\n attrs: {\n href: result.link.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n },\n text: result.link.label ?? \"Open link\",\n })\n )\n } else {\n status.textContent = result.message ?? \"Submitted.\"\n }\n }\n\n const actor = createActor(\n formMachine.provide({\n actions: {\n disableSubmitButton: () => {\n submit.disabled = true\n submit.setAttribute(\"data-loading\", \"\")\n },\n enableSubmitButton: () => {\n submit.disabled = false\n submit.removeAttribute(\"data-loading\")\n },\n showSuccessStatus: ({ context }) => {\n setStatus(context.result)\n clearAllFieldErrors()\n },\n showErrorStatus: ({ context }) => {\n const message =\n context.result?.status === \"error\"\n ? context.result\n : context.errorMessage\n ? { status: \"error\" as const, message: context.errorMessage }\n : null\n setStatus(message)\n },\n applyFieldErrors: ({ context }) => {\n applyFieldErrors(context.fieldErrors ?? undefined)\n },\n clearStatus: () => {\n setStatus(null)\n },\n clearFieldErrors: () => {\n clearAllFieldErrors()\n },\n resetFields: ({ context }) => {\n if (\n context.result?.status === \"success\" &&\n context.result.resetFields\n ) {\n for (const name of context.result.resetFields) {\n fieldByName.get(name)?.reset()\n }\n }\n },\n },\n actors: {\n validate: fromPromise<\n Record<string, string> | null,\n { values: Record<string, FormValue> }\n >(async ({ input }) => {\n if (!surface.schema) return null\n return validateWithSchema(surface.schema, input.values)\n }),\n submit: fromPromise<\n FormSubmitResult,\n { values: Record<string, FormValue> }\n >(\n async ({ input }) =>\n (await surface.submit.onSubmit(input.values)) ?? {\n status: \"success\",\n }\n ),\n },\n })\n )\n actor.start()\n cleanups.push(() => actor.stop())\n\n const onSubmit = (e: SubmitEvent): void => {\n e.preventDefault()\n const values: Record<string, FormValue> = {}\n surface.fields.forEach((field, i) => {\n values[field.name] = fields[i].read()\n })\n const snapshot = actor.getSnapshot()\n if (snapshot.matches(\"success\") || snapshot.matches(\"error\")) {\n actor.send({ type: \"RETRY\" })\n }\n actor.send({ type: \"SUBMIT\", values })\n }\n form.addEventListener(\"submit\", onSubmit)\n cleanups.push(() => form.removeEventListener(\"submit\", onSubmit))\n\n // Submit = Cmd/Ctrl+Enter. Plain Enter in a text input would otherwise\n // implicit-submit, so swallow it; textareas keep Enter = newline.\n const onFormKeyDown = (e: KeyboardEvent): void => {\n if (e.key !== \"Enter\") return\n const isMod = e.metaKey || e.ctrlKey\n if (isMod) {\n e.preventDefault()\n if (typeof form.requestSubmit === \"function\") form.requestSubmit()\n else form.dispatchEvent(new Event(\"submit\", { cancelable: true }))\n return\n }\n if (\n e.target instanceof HTMLInputElement &&\n e.target.type !== \"checkbox\" &&\n e.target.type !== \"radio\"\n ) {\n e.preventDefault()\n }\n }\n form.addEventListener(\"keydown\", onFormKeyDown)\n cleanups.push(() => form.removeEventListener(\"keydown\", onFormKeyDown))\n\n const section = el(\n \"section\",\n {\n class: \"p-4\",\n attrs: { \"data-uidex-form-surface\": surface.id },\n },\n [form]\n )\n root.append(section)\n\n return {\n cleanup: composeCleanups([...cleanups, () => root.replaceChildren()]),\n }\n}\n","import { assign, enqueueActions, fromPromise, setup } from \"xstate\"\n\nimport type { FormSubmitResult, FormValue } from \"../views/core/surface\"\n\nexport interface FormContext {\n values: Record<string, FormValue> | null\n result: FormSubmitResult | null\n fieldErrors: Record<string, string> | null\n errorMessage: string | null\n}\n\nexport type FormEvent =\n | { type: \"SUBMIT\"; values: Record<string, FormValue> }\n | { type: \"VALID\" }\n | { type: \"INVALID\"; fieldErrors: Record<string, string> }\n | { type: \"OK\"; result: FormSubmitResult }\n | { type: \"FAIL\"; result: FormSubmitResult }\n | { type: \"RETRY\" }\n\nexport interface ValidateInput {\n values: Record<string, FormValue>\n}\n\nexport interface SubmitInput {\n values: Record<string, FormValue>\n}\n\nconst initialContext: FormContext = {\n values: null,\n result: null,\n fieldErrors: null,\n errorMessage: null,\n}\n\nexport const formMachine = setup({\n types: {} as {\n context: FormContext\n events: FormEvent\n },\n actions: {\n disableSubmitButton: () => {},\n enableSubmitButton: () => {},\n showSuccessStatus: () => {},\n showErrorStatus: () => {},\n resetFields: () => {},\n applyFieldErrors: () => {},\n clearStatus: () => {},\n clearFieldErrors: () => {},\n },\n actors: {\n validate: fromPromise<Record<string, string> | null, ValidateInput>(\n async () => null\n ),\n submit: fromPromise<FormSubmitResult, SubmitInput>(async () => ({\n status: \"success\",\n })),\n },\n}).createMachine({\n id: \"form\",\n initial: \"idle\",\n context: initialContext,\n states: {\n idle: {\n entry: [\n assign(() => ({\n fieldErrors: null,\n errorMessage: null,\n })),\n { type: \"clearStatus\" },\n { type: \"clearFieldErrors\" },\n ],\n on: {\n SUBMIT: {\n target: \"validating\",\n actions: assign(({ event }) => ({\n values: event.values,\n result: null,\n fieldErrors: null,\n errorMessage: null,\n })),\n },\n },\n },\n validating: {\n invoke: {\n src: \"validate\",\n input: ({ context }) => ({ values: context.values ?? {} }),\n onDone: {\n actions: enqueueActions(({ event, enqueue }) => {\n const errors = event.output\n if (!errors) {\n enqueue.raise({ type: \"VALID\" })\n } else {\n enqueue.raise({ type: \"INVALID\", fieldErrors: errors })\n }\n }),\n },\n onError: {\n actions: enqueueActions(({ event, enqueue }) => {\n const error = event.error\n const message =\n error instanceof Error ? error.message : String(error)\n enqueue.raise({\n type: \"FAIL\",\n result: { status: \"error\", message },\n })\n }),\n },\n },\n on: {\n VALID: { target: \"submitting\" },\n INVALID: {\n target: \"error\",\n actions: assign(({ event }) => ({\n fieldErrors: event.fieldErrors,\n errorMessage: \"Please fix the errors above.\",\n result: {\n status: \"error\",\n message: \"Please fix the errors above.\",\n fieldErrors: event.fieldErrors,\n },\n })),\n },\n FAIL: {\n target: \"error\",\n actions: assign(({ event }) => ({\n result: event.result,\n errorMessage:\n event.result.status === \"error\" ? event.result.message : null,\n fieldErrors:\n event.result.status === \"error\"\n ? (event.result.fieldErrors ?? null)\n : null,\n })),\n },\n },\n },\n submitting: {\n entry: { type: \"disableSubmitButton\" },\n exit: { type: \"enableSubmitButton\" },\n invoke: {\n src: \"submit\",\n input: ({ context }) => ({ values: context.values ?? {} }),\n onDone: {\n actions: enqueueActions(({ event, enqueue }) => {\n const result = event.output\n if (result.status === \"success\") {\n enqueue.raise({ type: \"OK\", result })\n } else {\n enqueue.raise({ type: \"FAIL\", result })\n }\n }),\n },\n onError: {\n actions: enqueueActions(({ event, enqueue }) => {\n const error = event.error\n const message =\n error instanceof Error ? error.message : String(error)\n enqueue.raise({\n type: \"FAIL\",\n result: { status: \"error\", message },\n })\n }),\n },\n },\n on: {\n OK: {\n target: \"success\",\n actions: assign(({ event }) => ({\n result: event.result,\n fieldErrors: null,\n errorMessage: null,\n })),\n },\n FAIL: {\n target: \"error\",\n actions: assign(({ event }) => ({\n result: event.result,\n errorMessage:\n event.result.status === \"error\" ? event.result.message : null,\n fieldErrors:\n event.result.status === \"error\"\n ? (event.result.fieldErrors ?? null)\n : null,\n })),\n },\n },\n },\n success: {\n entry: [{ type: \"showSuccessStatus\" }, { type: \"resetFields\" }],\n on: {\n RETRY: { target: \"idle\" },\n },\n },\n error: {\n entry: [{ type: \"showErrorStatus\" }, { type: \"applyFieldErrors\" }],\n on: {\n RETRY: { target: \"idle\" },\n },\n },\n },\n})\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\n\nconst FIELD_ROOT_CLASS = \"flex flex-col items-start gap-2\"\nconst FIELD_LABEL_CLASS =\n \"text-base/4.5 text-foreground inline-flex items-center gap-2 font-medium sm:text-sm/4\"\nconst FIELD_DESCRIPTION_CLASS = \"text-muted-foreground text-xs\"\nconst FIELD_ERROR_CLASS = \"text-destructive-foreground text-xs\"\n\nexport interface CreateFieldOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n name?: string\n}\n\nexport function createField(\n options: CreateFieldOptions = {},\n children: Child | Child[] = []\n): HTMLDivElement {\n const { class: extra, name, attrs, ...rest } = options\n return el(\n \"div\",\n {\n ...rest,\n class: cn(FIELD_ROOT_CLASS, extra),\n attrs: {\n \"data-slot\": \"field\",\n \"data-uidex-primitive\": \"field\",\n ...(name ? { \"data-uidex-field-name\": name } : {}),\n ...attrs,\n },\n },\n children\n ) as HTMLDivElement\n}\n\nexport interface CreateFieldLabelOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n /** When provided, the `<label for>` attribute is set so clicking focuses the control. */\n htmlFor?: string\n}\n\nexport function createFieldLabel(\n options: CreateFieldLabelOptions = {},\n children: Child | Child[] = []\n): HTMLLabelElement {\n const { class: extra, htmlFor, attrs, ...rest } = options\n return el(\n \"label\",\n {\n ...rest,\n class: cn(FIELD_LABEL_CLASS, extra),\n attrs: {\n \"data-slot\": \"field-label\",\n ...(htmlFor ? { for: htmlFor } : {}),\n ...attrs,\n },\n },\n children\n ) as HTMLLabelElement\n}\n\nexport function createFieldDescription(\n options: CreateFieldOptions = {},\n children: Child | Child[] = []\n): HTMLParagraphElement {\n const { class: extra, attrs, ...rest } = options\n return el(\n \"p\",\n {\n ...rest,\n class: cn(FIELD_DESCRIPTION_CLASS, extra),\n attrs: { \"data-slot\": \"field-description\", ...attrs },\n },\n children\n ) as HTMLParagraphElement\n}\n\nexport function createFieldError(\n options: CreateFieldOptions = {}\n): HTMLParagraphElement {\n const { class: extra, attrs, ...rest } = options\n const node = el(\"p\", {\n ...rest,\n class: cn(FIELD_ERROR_CLASS, extra),\n attrs: {\n \"data-slot\": \"field-error\",\n role: \"alert\",\n \"aria-live\": \"polite\",\n ...attrs,\n },\n }) as HTMLParagraphElement\n node.hidden = true\n return node\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\n\nconst FORM_CLASS = \"flex w-full flex-col gap-4\"\n\nexport interface CreateFormOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n}\n\nexport function createForm(\n options: CreateFormOptions = {},\n children: Child | Child[] = []\n): HTMLFormElement {\n const { class: extra, attrs, ...rest } = options\n return el(\n \"form\",\n {\n ...rest,\n class: cn(FORM_CLASS, extra),\n attrs: {\n \"data-slot\": \"form\",\n \"data-uidex-primitive\": \"form\",\n noValidate: true,\n ...attrs,\n },\n },\n children\n ) as HTMLFormElement\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type ElementOptions } from \"../internal/el\"\n\nconst FIELD_CLASS =\n \"border-input bg-popover text-foreground shadow-xs/5 placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/30 aria-invalid:border-destructive/40 aria-invalid:focus-visible:ring-destructive/20 dark:bg-input/30 inline-flex w-full rounded-lg border text-sm outline-none transition-shadow focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-60\"\n\nexport interface CreateInputOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n}\n\nexport function createInput(\n options: CreateInputOptions = {}\n): HTMLInputElement {\n const { class: extra, attrs, ...rest } = options\n return el(\"input\", {\n ...rest,\n class: cn(FIELD_CLASS, \"h-8 px-3\", extra),\n attrs: { \"data-slot\": \"input\", ...attrs },\n }) as HTMLInputElement\n}\n\nexport function createTextarea(\n options: CreateInputOptions = {}\n): HTMLTextAreaElement {\n const { class: extra, attrs, ...rest } = options\n return el(\"textarea\", {\n ...rest,\n class: cn(FIELD_CLASS, \"min-h-20 px-3 py-2\", extra),\n attrs: { \"data-slot\": \"textarea\", ...attrs },\n }) as HTMLTextAreaElement\n}\n","import type { ClassValue } from \"clsx\"\nimport { ChevronsUpDown, createElement as createLucideElement } from \"lucide\"\nimport { cn } from \"../internal/cn\"\nimport { el, type ElementOptions } from \"../internal/el\"\n\nconst SELECT_WRAP_CLASS =\n \"border-input bg-popover text-foreground shadow-xs/5 focus-within:border-ring focus-within:ring-ring/30 aria-invalid:border-destructive/40 dark:bg-input/30 relative inline-flex h-8 w-full items-center rounded-lg border text-sm outline-none transition-shadow focus-within:ring-[3px] has-disabled:opacity-60\"\n\nconst SELECT_CONTROL_CLASS =\n \"absolute inset-0 h-full w-full cursor-pointer appearance-none bg-transparent px-3 pr-8 text-sm text-foreground outline-none disabled:cursor-not-allowed\"\n\nconst NATIVE_SELECT_CLASS =\n \"border-input bg-popover text-foreground shadow-xs/5 focus-visible:border-ring focus-visible:ring-ring/30 aria-invalid:border-destructive/40 dark:bg-input/30 inline-flex h-8 w-full cursor-pointer appearance-none rounded-lg border bg-[right_0.5rem_center] bg-no-repeat pl-3 pr-8 text-sm outline-none transition-shadow focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-60\"\n\nconst SELECT_CHEVRON_CLASS =\n \"pointer-events-none absolute right-2 size-4 text-muted-foreground opacity-80\"\n\nexport interface CreateSelectOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\n}\n\nexport interface SelectHandle {\n wrapper: HTMLElement\n control: HTMLSelectElement\n}\n\n/**\n * Coss-styled select composed of a wrapper `<span>` carrying the\n * border/shadow/chevron and a native `<select>` inside. Use when you can\n * control where the full handle mounts.\n */\nexport function createSelect(options: CreateSelectOptions = {}): SelectHandle {\n const { class: extra, attrs, ...rest } = options\n const control = el(\"select\", {\n ...rest,\n class: SELECT_CONTROL_CLASS,\n attrs: { \"data-slot\": \"select\", ...attrs },\n }) as HTMLSelectElement\n const chevron = createLucideElement(ChevronsUpDown)\n chevron.setAttribute(\"aria-hidden\", \"true\")\n chevron.setAttribute(\"class\", SELECT_CHEVRON_CLASS)\n const wrapper = el(\n \"span\",\n {\n class: cn(SELECT_WRAP_CLASS, extra),\n attrs: { \"data-slot\": \"select-control\" },\n },\n [control, chevron]\n )\n return { wrapper, control }\n}\n\n/**\n * Bare coss-styled native `<select>` — no wrapper, no chevron. Use when the\n * consumer expects a single self-styled element (e.g. the generic form\n * renderer in `views/render/form.ts`).\n */\nexport function createNativeSelect(\n options: CreateSelectOptions = {}\n): HTMLSelectElement {\n const { class: extra, attrs, ...rest } = options\n return el(\"select\", {\n ...rest,\n class: cn(NATIVE_SELECT_CLASS, extra),\n attrs: { \"data-slot\": \"select\", ...attrs },\n }) as HTMLSelectElement\n}\n","import * as combobox from \"@zag-js/combobox\"\nimport { createMachineRunner } from \"./machine\"\nimport { normalizeProps, type DomProps } from \"./normalize\"\n\nexport type ComboboxProps<\n T extends combobox.CollectionItem = combobox.CollectionItem,\n> = combobox.Props<T>\nexport type ComboboxApi<\n T extends combobox.CollectionItem = combobox.CollectionItem,\n> = combobox.Api<DomProps, T>\n\nexport function createCombobox<\n T extends combobox.CollectionItem = combobox.CollectionItem,\n>(props: Partial<ComboboxProps<T>>) {\n const runner = createMachineRunner(\n combobox.machine as unknown as Parameters<typeof createMachineRunner>[0],\n props as never\n )\n runner.start()\n return {\n runner,\n api: () =>\n combobox.connect(\n runner.service as never,\n normalizeProps\n ) as ComboboxApi<T>,\n destroy: () => runner.stop(),\n }\n}\n\nexport type ComboboxHandle<\n T extends combobox.CollectionItem = combobox.CollectionItem,\n> = ReturnType<typeof createCombobox<T>>\n\nexport { combobox }\n","import { KIND_STYLE } from \"../../entities\"\nimport { combobox, createCombobox } from \"../../machines/combobox\"\nimport { createScrollArea } from \"../../machines/scroll-area\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport { matchesQuery } from \"../builder/filter\"\nimport { createPersistentSpreads, spreadProps } from \"../builder/spread-props\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { createElement as createLucideElement, Circle } from \"lucide\"\nimport { createIconTile } from \"../primitives/icon-tile\"\nimport { renderKindIconTile } from \"../primitives/kind-icon\"\nimport { fillRow } from \"../primitives/row\"\nimport { createMutedText } from \"../primitives/text\"\nimport {\n LIST_GROUP_LABEL_CLASS,\n LIST_ITEM_CLASS,\n LIST_ITEM_STATE_CLASS,\n} from \"../../ui/list-item\"\nimport type { MountedSurface } from \"./index\"\n\nfunction defaultFilter(item: ListItem, query: string): boolean {\n return matchesQuery(\n `${item.label} ${item.value} ${item.group ?? \"\"} ${item.subtitle ?? \"\"}`,\n query\n )\n}\n\nfunction rowTag(item: ListItem): string {\n return item.tag ?? item.value\n}\n\nexport function renderListSurface(\n surface: ListSurface,\n ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n const all = surface.items\n const filterFn = surface.filter ?? defaultFilter\n let filteredItems: readonly ListItem[] = all\n\n const allByValue = new Map(all.map((i) => [i.value, i]))\n\n const getRootNode = (): ShadowRoot | Document => {\n const rn = root.getRootNode()\n if (rn instanceof ShadowRoot || rn instanceof Document) return rn\n return root.ownerDocument ?? document\n }\n\n const makeCollection = (items: readonly ListItem[]) =>\n combobox.collection({\n items: items as ListItem[],\n itemToValue: (item) => item.value,\n itemToString: (item) => item.label,\n })\n\n const hasDefault =\n surface.defaultHighlight !== undefined &&\n allByValue.has(surface.defaultHighlight)\n\n const handle = createCombobox<ListItem>({\n id: surface.id,\n getRootNode,\n collection: makeCollection(all),\n defaultOpen: true,\n defaultHighlightedValue: hasDefault ? surface.defaultHighlight : undefined,\n openOnClick: true,\n inputBehavior: \"autohighlight\",\n selectionBehavior: \"preserve\",\n closeOnSelect: false,\n disableLayer: true,\n onSelect: ({ itemValue }) => {\n const item = allByValue.get(itemValue)\n if (!item || !surface.onSelect) return\n surface.onSelect(item)\n },\n onHighlightChange: ({ highlightedValue }) => {\n const item = highlightedValue\n ? allByValue.get(highlightedValue)\n : undefined\n if (item?.preview) {\n ctx.highlight.show(item.preview, {\n color: KIND_STYLE[item.preview.kind].color,\n })\n } else {\n ctx.highlight.hide()\n }\n },\n })\n\n const section = el(\"section\", {\n class: \"flex h-full flex-col overflow-hidden\",\n attrs: { \"data-uidex-list-surface\": surface.id },\n })\n\n const scrollRoot = el(\"div\", {\n class: \"flex-1 min-h-0\",\n attrs: { \"data-uidex-list-scroll-root\": \"\" },\n })\n\n const viewport = el(\"div\", { class: \"uidex-scrollbar h-full w-full\" })\n\n const content = el(\"div\", {\n class: \"scroll-py-2 p-2\",\n attrs: { \"data-uidex-list-content\": \"\" },\n })\n\n viewport.append(content)\n scrollRoot.append(viewport)\n section.append(scrollRoot)\n root.append(section)\n\n const scrollArea = createScrollArea({\n id: `${surface.id}-scroll`,\n getRootNode,\n })\n const scrollSpreads = createPersistentSpreads()\n const applyScrollProps = (): void => {\n const api = scrollArea.api()\n scrollSpreads.apply(\n scrollRoot,\n api.getRootProps() as Record<string, unknown>\n )\n scrollSpreads.apply(\n viewport,\n api.getViewportProps() as Record<string, unknown>\n )\n }\n applyScrollProps()\n const unsubScroll = scrollArea.runner.subscribe(applyScrollProps)\n\n const shellSpreads = createPersistentSpreads()\n const itemSpreads = createPersistentSpreads()\n const groupSpreads = createPersistentSpreads()\n let inputSpreadCleanup: Cleanup = () => {}\n\n const itemNodes = new Map<string, HTMLElement>()\n const itemForValue = new Map<string, ListItem>()\n const groupNodes = new Map<string, HTMLElement>()\n let listEl: HTMLElement | null = null\n let lastCollectionKey = \"\"\n let lastHighlight: string | null = null\n\n const isHidden = (): boolean => root.hasAttribute(\"hidden\")\n\n const collectionKey = (items: readonly ListItem[]): string =>\n items.map((i) => i.value).join(\"\\x00\")\n\n const clearInputSpread = (): void => {\n inputSpreadCleanup()\n inputSpreadCleanup = () => {}\n }\n\n const applyInputSpread = (): void => {\n inputSpreadCleanup()\n const api = handle.api()\n const inputProps = api.getInputProps() as Record<string, unknown>\n // The shell owns the input's placeholder; zag emits `placeholder: undefined`\n // when no prop is passed, which would strip our attribute on re-apply.\n delete inputProps.placeholder\n inputSpreadCleanup = spreadProps(ctx.searchInput, inputProps)\n }\n\n const visibilityObserver = new MutationObserver(() => {\n if (isHidden()) {\n // The stack's syncHighlight owns the overlay while a child view is on\n // top — don't clobber its ref-based highlight here.\n clearInputSpread()\n } else {\n applyInputSpread()\n }\n })\n visibilityObserver.observe(root, {\n attributes: true,\n attributeFilter: [\"hidden\"],\n })\n\n function buildItemBody(itemEl: HTMLElement, item: ListItem): void {\n const leading = resolveLeadingTile(item)\n fillRow(itemEl, {\n leading,\n label: item.label,\n subtitle: item.subtitle,\n trailing: item.shortcut,\n })\n }\n\n function resolveLeadingTile(item: ListItem): HTMLElement {\n if (item.entityChip) return renderKindIconTile(item.entityChip.entity.kind)\n if (item.leading) return createIconTile(item.leading())\n const fallback = createLucideElement(Circle)\n fallback.setAttribute(\"aria-hidden\", \"true\")\n fallback.setAttribute(\"class\", \"size-4\")\n return createIconTile(fallback)\n }\n\n function buildItems(): void {\n itemSpreads.cleanupAll()\n groupSpreads.cleanupAll()\n itemNodes.clear()\n itemForValue.clear()\n groupNodes.clear()\n listEl = null\n content.replaceChildren()\n\n const visible = filteredItems\n if (visible.length === 0) {\n content.append(\n createMutedText({\n class: \"p-4 text-center\",\n attrs: { \"data-uidex-list-empty\": \"\" },\n text: surface.emptyLabel ?? \"No matches\",\n })\n )\n return\n }\n\n const byGroup = new Map<string, ListItem[]>()\n for (const item of visible) {\n const key = item.group ?? \"\"\n const bucket = byGroup.get(key) ?? []\n bucket.push(item)\n byGroup.set(key, bucket)\n }\n\n const list = el(\"ul\", {\n class: \"flex flex-col gap-1\",\n attrs: { \"data-uidex-list-groups\": \"\" },\n })\n listEl = list\n\n for (const [group, items] of byGroup) {\n const groupEl = el(\"li\", {\n class: \"flex flex-col gap-1 py-1\",\n attrs: {\n \"data-uidex-list-group\": \"\",\n \"data-uidex-list-group-name\": group,\n },\n })\n const groupHeading = group\n ? el(\"h3\", { class: LIST_GROUP_LABEL_CLASS, text: group })\n : null\n const groupList = el(\"ul\", { class: \"flex flex-col\" })\n groupNodes.set(group || \"ungrouped\", groupList)\n for (const item of items) {\n const itemEl = el(\"li\", {\n class: cn(LIST_ITEM_CLASS, LIST_ITEM_STATE_CLASS),\n attrs: { \"data-uidex-list-item\": rowTag(item) },\n })\n itemNodes.set(item.value, itemEl)\n itemForValue.set(item.value, item)\n buildItemBody(itemEl, item)\n groupList.append(itemEl)\n }\n if (groupHeading) groupEl.append(groupHeading)\n groupEl.append(groupList)\n list.append(groupEl)\n }\n\n content.append(list)\n }\n\n function applyProps(): void {\n const api = handle.api()\n shellSpreads.apply(section, api.getRootProps() as Record<string, unknown>)\n if (!isHidden()) applyInputSpread()\n shellSpreads.apply(\n content,\n api.getContentProps() as Record<string, unknown>\n )\n if (listEl) {\n shellSpreads.apply(listEl, api.getListProps() as Record<string, unknown>)\n for (const [id, groupList] of groupNodes) {\n groupSpreads.apply(\n groupList,\n api.getItemGroupProps({ id }) as Record<string, unknown>\n )\n }\n }\n for (const [value, itemEl] of itemNodes) {\n const item = itemForValue.get(value)\n if (!item) continue\n itemSpreads.apply(\n itemEl,\n api.getItemProps({ item }) as Record<string, unknown>\n )\n }\n }\n\n function maybeScrollHighlight(): void {\n const api = handle.api()\n const next = api.highlightedValue ?? null\n if (next === lastHighlight) return\n lastHighlight = next\n if (!next) return\n const node = itemNodes.get(next)\n node?.scrollIntoView({ block: \"nearest\" })\n }\n\n function tick(): void {\n const wantKey = collectionKey(filteredItems)\n if (wantKey !== lastCollectionKey) {\n buildItems()\n lastCollectionKey = wantKey\n }\n applyProps()\n maybeScrollHighlight()\n }\n\n const unsub = handle.runner.subscribe(tick)\n\n buildItems()\n lastCollectionKey = collectionKey(filteredItems)\n applyProps()\n if (hasDefault && surface.defaultHighlight) {\n handle.api().setHighlightValue(surface.defaultHighlight)\n const highlightedEl = itemNodes.get(surface.defaultHighlight)\n highlightedEl?.scrollIntoView({ block: \"nearest\" })\n lastHighlight = surface.defaultHighlight\n }\n\n const cleanup = composeCleanups([\n handle.destroy,\n () => ctx.highlight.hide(),\n unsubScroll,\n () => scrollSpreads.cleanupAll(),\n scrollArea.destroy,\n () => visibilityObserver.disconnect(),\n clearInputSpread,\n unsub,\n () => {\n itemSpreads.cleanupAll()\n groupSpreads.cleanupAll()\n shellSpreads.cleanupAll()\n itemNodes.clear()\n itemForValue.clear()\n groupNodes.clear()\n root.replaceChildren()\n },\n ])\n\n const onSearch = (query: string): void => {\n const next = all.filter((item) => filterFn(item, query))\n const nextKey = collectionKey(next)\n if (nextKey === lastCollectionKey) return\n filteredItems = next\n handle.runner.update({ collection: makeCollection(filteredItems) })\n }\n\n return { cleanup, onSearch }\n}\n","import type { Cleanup, ViewContext } from \"../core/types\"\nimport type { ViewSurface } from \"../core/surface\"\nimport { renderCustomSurface } from \"./custom\"\nimport { renderDetailSurface } from \"./detail\"\nimport { renderFormSurface } from \"./form\"\nimport { renderListSurface } from \"./list\"\n\nexport interface MountedSurface {\n cleanup: Cleanup\n onSearch?: (query: string) => void\n}\n\nexport function renderSurface(\n surface: ViewSurface,\n ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n switch (surface.kind) {\n case \"list\":\n return renderListSurface(surface, ctx, root)\n case \"detail\":\n return renderDetailSurface(surface, ctx, root)\n case \"form\":\n return renderFormSurface(surface, ctx, root)\n case \"custom\":\n return renderCustomSurface(surface, ctx, root)\n }\n}\n","import type { EntityRef, Registry } from \"../../entities\"\nimport type { Cleanup } from \"../../internal/cleanup\"\nimport {\n createScrollArea,\n type ScrollAreaHandle,\n} from \"../../machines/scroll-area\"\nimport type { SessionStore } from \"../../session\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport { createPersistentSpreads } from \"../builder/spread-props\"\nimport { renderSurface, type MountedSurface } from \"../render\"\nimport type { ViewRegistrar } from \"./registry\"\nimport type {\n CloudAdapter,\n HighlightController,\n View,\n ViewContext,\n} from \"./types\"\n\nconst SCROLL_ROOT_CLASS = \"absolute inset-0\"\nconst HOST_CLASS = \"uidex-scrollbar h-full w-full\"\n\nexport interface MountedEntry {\n id: string\n ref: EntityRef | null\n view: View\n host: HTMLElement\n scrollRoot: HTMLElement\n scrollArea: ScrollAreaHandle\n scrollCleanup: Cleanup\n ctx: ViewContext\n mounted: MountedSurface\n}\n\nexport interface MountEntryDeps {\n container: HTMLElement\n searchInput: HTMLInputElement\n views: ViewRegistrar\n session: SessionStore\n registry: Registry\n cloud: CloudAdapter | null\n sdkCloud: CloudAdapter\n highlight: HighlightController\n nextScrollSeq(): number\n}\n\nexport function mountEntry(\n entry: ViewStackEntry,\n view: View,\n deps: MountEntryDeps\n): MountedEntry | null {\n const scrollRoot = document.createElement(\"div\")\n scrollRoot.setAttribute(\"data-uidex-view-scroll-root\", \"\")\n scrollRoot.className = SCROLL_ROOT_CLASS\n\n const host = document.createElement(\"div\")\n host.setAttribute(\"data-uidex-view-slot\", \"\")\n host.setAttribute(\"data-uidex-view-id\", view.id)\n host.className = HOST_CLASS\n scrollRoot.appendChild(host)\n deps.container.appendChild(scrollRoot)\n\n const seq = deps.nextScrollSeq()\n const scrollArea = createScrollArea({\n id: `uidex-view-scroll-${view.id}-${seq}`,\n getRootNode: () => {\n const rn = scrollRoot.getRootNode()\n if (rn instanceof ShadowRoot || rn instanceof Document) return rn\n return scrollRoot.ownerDocument ?? document\n },\n })\n\n const scrollSpreads = createPersistentSpreads()\n const applyScrollProps = (): void => {\n const api = scrollArea.api()\n scrollSpreads.apply(\n scrollRoot,\n api.getRootProps() as Record<string, unknown>\n )\n // Zag's getRootProps sets inline `position: relative`, which beats the\n // `absolute inset-0` utility class and collapses the viewport to 0px.\n scrollRoot.style.position = \"absolute\"\n scrollSpreads.apply(host, api.getViewportProps() as Record<string, unknown>)\n }\n applyScrollProps()\n const unsubScroll = scrollArea.runner.subscribe(applyScrollProps)\n const scrollCleanup: Cleanup = () => {\n unsubScroll()\n scrollSpreads.cleanupAll()\n }\n\n const ctx: ViewContext = {\n ref: entry.ref,\n registry: deps.registry,\n cloud: deps.cloud,\n sdkCloud: deps.sdkCloud,\n views: {\n list: () => deps.views.list(),\n },\n push: (target) => {\n if (!deps.views.get(target.id)) return\n deps.session.getState().actions.pushStack({\n id: target.id,\n ref: target.ref ?? null,\n })\n },\n pop: () => deps.session.getState().actions.popStack(),\n close: () => deps.session.getState().actions.clearStack(),\n navigate: (r: EntityRef) => deps.views.navigate(r),\n pinHighlight: (r: EntityRef) =>\n deps.session.getState().actions.pinHighlight(r),\n searchInput: deps.searchInput,\n highlight: deps.highlight,\n getStack: () => deps.session.getState().stack,\n }\n\n let surfaceResult: MountedSurface\n try {\n const surface = view.surface(ctx)\n surfaceResult = renderSurface(surface, ctx, host)\n } catch (err) {\n console.error(`[uidex] View \"${view.id}\" surface() threw`, err)\n scrollCleanup()\n scrollArea.destroy()\n scrollRoot.remove()\n return null\n }\n\n return {\n id: view.id,\n ref: entry.ref,\n view,\n host,\n scrollRoot,\n scrollArea,\n scrollCleanup,\n ctx,\n mounted: surfaceResult,\n }\n}\n\nexport function cleanupMountedEntry(entry: MountedEntry): void {\n try {\n entry.mounted.cleanup()\n } catch (err) {\n console.error(\"[uidex] View cleanup threw\", err)\n }\n entry.scrollCleanup()\n entry.scrollArea.destroy()\n entry.scrollRoot.remove()\n}\n\nexport function setEntryVisibility(\n entry: MountedEntry,\n visible: boolean\n): void {\n if (visible) {\n entry.host.removeAttribute(\"hidden\")\n entry.host.removeAttribute(\"inert\")\n entry.host.removeAttribute(\"aria-hidden\")\n } else {\n entry.host.setAttribute(\"hidden\", \"\")\n entry.host.setAttribute(\"inert\", \"\")\n entry.host.setAttribute(\"aria-hidden\", \"true\")\n }\n}\n","import { ArrowLeft, Search, createElement as createLucideElement } from \"lucide\"\nimport { Z_CHROME } from \"../../surface/constants\"\nimport { createActionsPopup, type ActionsPopupHandle } from \"./actions-popup\"\nimport { createKbd } from \"../../ui/kbd\"\n\nconst BACKDROP_CLASS = \"fixed inset-0 bg-black/32 backdrop-blur-sm\"\n\nconst VIEWPORT_CLASS =\n \"fixed inset-0 flex flex-col items-center px-4 py-[max(1rem,4vh)] sm:py-[10vh]\"\n\nconst FRAME_CLASS =\n \"relative flex h-[26rem] w-full min-w-0 max-w-xl flex-col rounded-2xl border bg-popover text-popover-foreground shadow-lg/5 outline-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:bg-muted/72 before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\"\n\nconst HEADER_CLASS = \"flex shrink-0 items-center gap-1 px-2.5 py-1.5\"\n\nconst SEARCH_WRAPPER_CLASS =\n \"flex h-9 w-full items-center gap-0 text-foreground\"\n\nconst BACK_BUTTON_CLASS =\n \"inline-flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-md bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n\nconst BACK_ICON_CLASS = \"size-4 opacity-80\"\n\nconst SEARCH_ICON_WRAP_CLASS =\n \"inline-flex size-7 shrink-0 items-center justify-center text-muted-foreground\"\n\nconst SEARCH_ICON_CLASS = \"size-4 opacity-80\"\n\nconst LOGO_CLASS =\n \"inline-flex shrink-0 items-center justify-center text-muted-foreground\"\n\nconst LOGO_ICON_CLASS = \"size-4\"\n\nconst SEARCH_INPUT_CLASS =\n \"text-foreground min-w-0 flex-1 bg-transparent ps-2 pe-3 text-sm placeholder:text-muted-foreground focus:outline-none\"\n\nconst HEADER_TITLE_CLASS =\n \"text-foreground min-w-0 flex-1 truncate px-3 text-sm\"\n\nconst HOST_CONTAINER_CLASS =\n \"relative -mx-px min-h-0 flex-1 overflow-hidden rounded-t-xl border border-b-0 bg-popover bg-clip-padding shadow-xs/5 [clip-path:inset(0_1px)] before:pointer-events-none before:absolute before:inset-0 before:rounded-t-[calc(var(--radius-xl)-1px)]\"\n\nconst FOOTER_CLASS =\n \"text-muted-foreground flex items-center justify-between gap-2 rounded-b-[calc(var(--radius-2xl)-1px)] border-t px-5 py-3 text-xs\"\n\nconst FOOTER_SIDE_CLASS = \"flex min-w-0 items-center gap-2\"\n\nconst HINT_CLASS =\n \"inline-flex items-center gap-1.5 text-xs text-muted-foreground\"\n\nconst ACTIONS_TRIGGER_CLASS =\n \"inline-flex h-6 shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n\nexport interface StackShellCallbacks {\n onBack(): void\n onBackdropClick(): void\n onSearchInput(value: string): void\n}\n\nexport interface StackShell {\n backdrop: HTMLElement\n frame: HTMLElement\n header: HTMLElement\n backBtn: HTMLButtonElement\n logo: HTMLElement\n searchIcon: HTMLElement\n headerTitle: HTMLElement\n searchInput: HTMLInputElement\n hostContainer: HTMLElement\n footerLeft: HTMLElement\n footerRight: HTMLElement\n actionsPopup: ActionsPopupHandle\n destroy(): void\n}\n\nexport function createStackShell(\n container: HTMLElement,\n callbacks: StackShellCallbacks\n): StackShell {\n const backdrop = document.createElement(\"div\")\n backdrop.setAttribute(\"data-uidex-view-backdrop\", \"\")\n backdrop.className = BACKDROP_CLASS\n backdrop.style.zIndex = String(Z_CHROME)\n\n const frame = document.createElement(\"div\")\n frame.setAttribute(\"data-uidex-view-stack-frame\", \"\")\n frame.className = FRAME_CLASS\n\n const header = document.createElement(\"header\")\n header.setAttribute(\"data-uidex-view-stack-header\", \"\")\n header.className = HEADER_CLASS\n\n const backBtn = document.createElement(\"button\")\n backBtn.setAttribute(\"type\", \"button\")\n backBtn.setAttribute(\"data-uidex-view-stack-back\", \"\")\n backBtn.setAttribute(\"aria-label\", \"Back\")\n backBtn.className = BACK_BUTTON_CLASS\n const backIcon = createLucideElement(ArrowLeft)\n backIcon.setAttribute(\"aria-hidden\", \"true\")\n backIcon.setAttribute(\"class\", BACK_ICON_CLASS)\n backBtn.append(backIcon)\n backBtn.hidden = true\n const onBackClick = () => callbacks.onBack()\n backBtn.addEventListener(\"click\", onBackClick)\n\n const logo = createUidexLogo()\n logo.setAttribute(\"data-uidex-view-stack-footer-logo\", \"\")\n const searchIcon = createSearchIcon()\n\n const searchInput = document.createElement(\"input\")\n searchInput.setAttribute(\"type\", \"text\")\n searchInput.setAttribute(\"data-uidex-search-input\", \"\")\n searchInput.setAttribute(\"placeholder\", \"Search for command...\")\n searchInput.className = SEARCH_INPUT_CLASS\n const onSearchInput = () => callbacks.onSearchInput(searchInput.value)\n searchInput.addEventListener(\"input\", onSearchInput)\n\n const headerTitle = document.createElement(\"div\")\n headerTitle.setAttribute(\"data-uidex-view-stack-title\", \"\")\n headerTitle.className = HEADER_TITLE_CLASS\n headerTitle.hidden = true\n\n const searchWrap = document.createElement(\"div\")\n searchWrap.setAttribute(\"data-uidex-view-stack-search\", \"\")\n searchWrap.className = SEARCH_WRAPPER_CLASS\n searchWrap.append(backBtn, searchIcon, searchInput, headerTitle)\n header.append(searchWrap)\n\n const hostContainer = document.createElement(\"div\")\n hostContainer.setAttribute(\"data-uidex-view-stack-hosts\", \"\")\n hostContainer.className = HOST_CONTAINER_CLASS\n\n const footer = document.createElement(\"footer\")\n footer.setAttribute(\"data-uidex-view-stack-footer\", \"\")\n footer.className = FOOTER_CLASS\n\n const footerLeft = document.createElement(\"div\")\n footerLeft.setAttribute(\"data-uidex-view-stack-footer-left\", \"\")\n footerLeft.className = FOOTER_SIDE_CLASS\n\n const footerRight = document.createElement(\"div\")\n footerRight.setAttribute(\"data-uidex-view-stack-footer-right\", \"\")\n footerRight.className = FOOTER_SIDE_CLASS\n\n footer.append(footerLeft, footerRight)\n\n const actionsPopup = createActionsPopup()\n\n frame.append(header, hostContainer, footer, actionsPopup.element)\n\n const viewport = document.createElement(\"div\")\n viewport.setAttribute(\"data-uidex-view-viewport\", \"\")\n viewport.className = VIEWPORT_CLASS\n viewport.style.zIndex = String(Z_CHROME)\n viewport.append(frame)\n const onViewportClick = (e: MouseEvent) => {\n if (e.target === viewport) callbacks.onBackdropClick()\n }\n viewport.addEventListener(\"click\", onViewportClick)\n\n container.append(backdrop, viewport)\n\n return {\n backdrop,\n frame,\n header,\n backBtn,\n logo,\n searchIcon,\n headerTitle,\n searchInput,\n hostContainer,\n footerLeft,\n footerRight,\n actionsPopup,\n destroy() {\n backBtn.removeEventListener(\"click\", onBackClick)\n viewport.removeEventListener(\"click\", onViewportClick)\n searchInput.removeEventListener(\"input\", onSearchInput)\n actionsPopup.destroy()\n viewport.remove()\n backdrop.remove()\n },\n }\n}\n\nfunction createSearchIcon(): HTMLElement {\n const wrap = document.createElement(\"span\")\n wrap.setAttribute(\"data-uidex-view-stack-search-icon\", \"\")\n wrap.setAttribute(\"aria-hidden\", \"true\")\n wrap.className = SEARCH_ICON_WRAP_CLASS\n const icon = createLucideElement(Search)\n icon.setAttribute(\"aria-hidden\", \"true\")\n icon.setAttribute(\"class\", SEARCH_ICON_CLASS)\n wrap.append(icon)\n return wrap\n}\n\nfunction createUidexLogo(): HTMLElement {\n const wrap = document.createElement(\"span\")\n wrap.setAttribute(\"data-uidex-view-stack-logo\", \"\")\n wrap.setAttribute(\"aria-hidden\", \"true\")\n wrap.className = LOGO_CLASS\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n svg.setAttribute(\"viewBox\", \"0 0 30 36\")\n svg.setAttribute(\"fill\", \"currentColor\")\n svg.setAttribute(\"aria-hidden\", \"true\")\n svg.setAttribute(\"class\", LOGO_ICON_CLASS)\n const back = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\")\n back.setAttribute(\"x\", \"1\")\n back.setAttribute(\"y\", \"5\")\n back.setAttribute(\"width\", \"22\")\n back.setAttribute(\"height\", \"28\")\n back.setAttribute(\"rx\", \"3\")\n back.setAttribute(\"fill\", \"currentColor\")\n back.setAttribute(\"opacity\", \"0.18\")\n back.setAttribute(\"transform\", \"rotate(-6, 12, 19)\")\n const front = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\")\n front.setAttribute(\"x\", \"7\")\n front.setAttribute(\"y\", \"1\")\n front.setAttribute(\"width\", \"22\")\n front.setAttribute(\"height\", \"28\")\n front.setAttribute(\"rx\", \"3\")\n front.setAttribute(\"fill\", \"currentColor\")\n svg.append(back, front)\n wrap.append(svg)\n return wrap\n}\n\nexport function createHint(key: string, label: string): HTMLElement {\n const wrap = document.createElement(\"span\")\n wrap.className = HINT_CLASS\n const text = document.createElement(\"span\")\n text.textContent = label\n const kbd = createKbd({ text: key })\n wrap.append(text, kbd)\n return wrap\n}\n\nexport function createFooterDivider(): HTMLElement {\n const sep = document.createElement(\"span\")\n sep.setAttribute(\"aria-hidden\", \"true\")\n sep.className = \"mx-1 h-4 w-px bg-border\"\n return sep\n}\n\nexport function createActionsButton(onClick: () => void): HTMLButtonElement {\n const btn = document.createElement(\"button\")\n btn.setAttribute(\"type\", \"button\")\n btn.setAttribute(\"data-uidex-actions-trigger\", \"\")\n btn.setAttribute(\"aria-label\", \"Actions\")\n btn.className = ACTIONS_TRIGGER_CLASS\n const text = document.createElement(\"span\")\n text.textContent = \"Actions\"\n const kbd = createKbd({ text: \"⌘K\" })\n btn.append(text, kbd)\n btn.addEventListener(\"click\", onClick)\n return btn\n}\n","import * as menu from \"@zag-js/menu\"\nimport { createMachineHandle, type MachineHandle } from \"./machine\"\nimport { normalizeProps, type DomProps } from \"./normalize\"\n\nexport type MenuProps = menu.Props\nexport type MenuApi = menu.Api<DomProps>\nexport type MenuHandle = MachineHandle<MenuApi>\n\nexport function createMenu(props: Partial<MenuProps> = {}): MenuHandle {\n return createMachineHandle(menu.machine, menu.connect, normalizeProps, props)\n}\n\nexport { menu }\n","import { cn } from \"../internal/cn\"\nimport { composeCleanups, type Cleanup } from \"../internal/cleanup\"\nimport { el } from \"../internal/el\"\nimport { createMenu as createMenuMachine, menu } from \"../machines/menu\"\nimport { createPersistentSpreads } from \"../views/builder/spread-props\"\nimport { createCommandShortcut } from \"./kbd\"\nimport { LIST_GROUP_LABEL_CLASS } from \"./list-item\"\n\nexport const MENU_POPUP_CLASS =\n \"bg-popover text-popover-foreground shadow-lg border-border flex min-w-32 flex-col overflow-hidden rounded-lg border outline-none\"\n\nexport const MENU_LIST_CLASS = \"flex flex-col p-1\"\n\nexport const MENU_ITEM_CLASS =\n \"text-foreground data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-60 flex min-h-7 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-sm outline-none\"\n\nexport const MENU_GROUP_LABEL_CLASS = LIST_GROUP_LABEL_CLASS\n\nexport const MENU_SEPARATOR_CLASS = \"bg-border mx-2 my-1 h-px\"\n\nexport interface MenuItemDescriptor {\n id: string\n label: string\n shortcut?: string\n disabled?: boolean\n trailing?: Node | null\n onSelect?: () => void\n}\n\nexport interface CreateUiMenuOptions {\n id?: string\n getRootNode?: () => ShadowRoot | Document\n items: MenuItemDescriptor[]\n label?: string\n ariaLabel?: string\n onSelect?(itemId: string): void\n}\n\nexport interface UiMenuHandle {\n /** Popup root; caller positions this inside its own container. */\n readonly popup: HTMLElement\n /** The ul element carrying item rows. */\n readonly list: HTMLElement\n open(): void\n close(): void\n isOpen(): boolean\n /** Forward a keydown from an owned surface (Arrow/Enter/Escape/typeahead). */\n handleKey(e: KeyboardEvent): boolean\n setItems(next: MenuItemDescriptor[]): void\n destroy(): void\n}\n\n// `getPositionerProps` is deliberately skipped so callers own absolute\n// positioning inside their own containers (the palette shell frame, etc.).\nexport function createUiMenu(options: CreateUiMenuOptions): UiMenuHandle {\n let items = options.items\n const spreads = createPersistentSpreads()\n let lastKey = \"\"\n let rowByValue = new Map<string, HTMLElement>()\n const cleanups: Cleanup[] = []\n\n const popup = el(\"div\", {\n class: cn(MENU_POPUP_CLASS, \"hidden\"),\n attrs: { \"data-uidex-primitive\": \"menu\", \"data-slot\": \"menu-popup\" },\n })\n\n const list = el(\"ul\", {\n class: MENU_LIST_CLASS,\n attrs: {\n role: \"menu\",\n \"aria-label\": options.ariaLabel ?? options.label ?? \"Menu\",\n \"data-slot\": \"menu-list\",\n },\n })\n\n popup.append(list)\n\n const handle = createMenuMachine({\n id: options.id,\n getRootNode: options.getRootNode,\n closeOnSelect: true,\n onSelect: (details) => {\n const picked = items.find((it) => it.id === details.value)\n picked?.onSelect?.()\n options.onSelect?.(details.value)\n },\n onOpenChange: ({ open }) => {\n popup.classList.toggle(\"hidden\", !open)\n },\n })\n\n function rebuild(): void {\n spreads.cleanupAll()\n list.replaceChildren()\n rowByValue = new Map()\n for (const item of items) {\n const row = el(\"li\", {\n class: MENU_ITEM_CLASS,\n attrs: {\n \"data-slot\": \"menu-item\",\n \"data-uidex-menu-item\": item.id,\n },\n })\n const label = el(\"span\", {\n class: \"flex-1 truncate\",\n text: item.label,\n })\n row.append(label)\n if (item.trailing) row.append(item.trailing)\n else if (item.shortcut) {\n row.append(createCommandShortcut({ text: item.shortcut }))\n }\n rowByValue.set(item.id, row)\n list.append(row)\n }\n lastKey = items.map((i) => i.id).join(\"\\x00\")\n }\n\n function applyProps(): void {\n const api = handle.api()\n spreads.apply(list, api.getContentProps() as Record<string, unknown>)\n for (const item of items) {\n const row = rowByValue.get(item.id)\n if (!row) continue\n spreads.apply(\n row,\n api.getItemProps({\n value: item.id,\n valueText: item.label,\n disabled: item.disabled ?? false,\n }) as Record<string, unknown>\n )\n }\n }\n\n function tick(): void {\n const wantKey = items.map((i) => i.id).join(\"\\x00\")\n if (wantKey !== lastKey) rebuild()\n applyProps()\n }\n\n rebuild()\n applyProps()\n\n const unsub = handle.runner.subscribe(tick)\n cleanups.push(unsub)\n\n function nextId(currentId: string | null, delta: number): string | null {\n if (items.length === 0) return null\n if (!currentId) {\n return delta > 0 ? items[0].id : items[items.length - 1].id\n }\n const idx = items.findIndex((it) => it.id === currentId)\n if (idx === -1) return items[0].id\n const next = (idx + delta + items.length) % items.length\n return items[next].id\n }\n\n function runHighlighted(): void {\n const api = handle.api()\n const cur = api.highlightedValue\n if (!cur) return\n const item = items.find((it) => it.id === cur)\n if (!item || item.disabled) return\n item.onSelect?.()\n options.onSelect?.(cur)\n api.setOpen(false)\n }\n\n function handleKey(e: KeyboardEvent): boolean {\n const api = handle.api()\n if (!api.open) return false\n switch (e.key) {\n case \"ArrowDown\": {\n const next = nextId(api.highlightedValue, 1)\n if (next) api.setHighlightedValue(next)\n return true\n }\n case \"ArrowUp\": {\n const next = nextId(api.highlightedValue, -1)\n if (next) api.setHighlightedValue(next)\n return true\n }\n case \"Home\": {\n if (items[0]) api.setHighlightedValue(items[0].id)\n return true\n }\n case \"End\": {\n const last = items[items.length - 1]\n if (last) api.setHighlightedValue(last.id)\n return true\n }\n case \"Enter\":\n runHighlighted()\n return true\n case \"Escape\":\n api.setOpen(false)\n return true\n default:\n return false\n }\n }\n\n return {\n popup,\n list,\n open: () => handle.api().setOpen(true),\n close: () => handle.api().setOpen(false),\n isOpen: () => handle.api().open,\n handleKey,\n setItems(next) {\n const wantKey = next.map((i) => i.id).join(\"\\x00\")\n items = next\n if (wantKey === lastKey) return\n rebuild()\n applyProps()\n },\n destroy: () => {\n composeCleanups(cleanups)()\n spreads.cleanupAll()\n handle.destroy()\n popup.remove()\n },\n }\n}\n\nexport { menu as menuMachine }\n","import { el } from \"../../internal/el\"\nimport { createKbd } from \"../../ui/kbd\"\nimport {\n createUiMenu,\n MENU_GROUP_LABEL_CLASS,\n MENU_SEPARATOR_CLASS,\n type MenuItemDescriptor,\n type UiMenuHandle,\n} from \"../../ui/menu\"\nimport type { ShellAction } from \"./types\"\n\nconst POPUP_POSITION_CLASS = \"absolute bottom-12 right-3 z-10 w-56\"\n\nexport interface ActionsPopupHandle {\n readonly element: HTMLElement\n open(actions: ShellAction[]): void\n close(): void\n isOpen(): boolean\n handleKey(e: KeyboardEvent): boolean\n destroy(): void\n}\n\nfunction toDescriptors(actions: ShellAction[]): MenuItemDescriptor[] {\n return actions.map((action) => ({\n id: action.id,\n label: action.label,\n shortcut: action.shortcut,\n // Keep the pill-kbd look inside the actions popup; the menu's default\n // shortcut renders as the lighter `command-shortcut` style.\n trailing: action.shortcut ? createKbd({ text: action.shortcut }) : null,\n onSelect: () => void action.perform(),\n }))\n}\n\nexport function createActionsPopup(): ActionsPopupHandle {\n const menu: UiMenuHandle = createUiMenu({\n items: [],\n ariaLabel: \"Actions\",\n })\n menu.popup.classList.add(...POPUP_POSITION_CLASS.split(\" \"))\n\n const heading = el(\"div\", {\n class: MENU_GROUP_LABEL_CLASS,\n text: \"Actions\",\n attrs: { \"data-slot\": \"menu-group-label\" },\n })\n const separator = el(\"div\", {\n class: MENU_SEPARATOR_CLASS,\n attrs: { role: \"separator\" },\n })\n menu.popup.prepend(separator)\n menu.popup.prepend(heading)\n\n return {\n element: menu.popup,\n open(actions) {\n menu.setItems(toDescriptors(actions))\n menu.open()\n },\n close: menu.close,\n isOpen: menu.isOpen,\n handleKey: (e) => menu.handleKey(e),\n destroy: menu.destroy,\n }\n}\n","import { KIND_STYLE, type Registry } from \"../../entities\"\nimport { detectDev } from \"../../internal/dev\"\nimport type { SessionStore } from \"../../session\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport { renderKindChip } from \"../primitives/kind-chip\"\nimport type { ActionsPopupHandle } from \"./actions-popup\"\nimport {\n cleanupMountedEntry,\n mountEntry,\n setEntryVisibility,\n type MountedEntry,\n} from \"./mount\"\nimport type { ViewRegistrar } from \"./registry\"\nimport {\n createActionsButton,\n createFooterDivider,\n createHint,\n createStackShell,\n type StackShell,\n} from \"./shell\"\nimport type {\n CloudAdapter,\n HighlightController,\n ShellAction,\n ShellHint,\n View,\n ViewContext,\n} from \"./types\"\n\nconst SOFT_STACK_CAP = 10\n\nexport interface ViewStackOptions {\n container: HTMLElement\n views: ViewRegistrar\n session: SessionStore\n registry: Registry\n cloud?: CloudAdapter | null\n sdkCloud: CloudAdapter\n highlight: HighlightController\n globalActions?: (ctx: ViewContext) => ShellAction[]\n dev?: boolean\n}\n\nexport interface ViewStack {\n /**\n * The actions popup belonging to the currently mounted stack shell, or\n * `null` when the shell is not mounted. Exposed so the unified shadow-root\n * keydown handler can intercept keys while the popup is open.\n */\n getActionsPopup(): ActionsPopupHandle | null\n destroy(): void\n}\n\nfunction resolveViewFocusTarget(entry: MountedEntry): HTMLElement | null {\n const fn = entry.view.focusTarget\n if (!fn) return null\n try {\n const target = fn(entry.host, entry.ctx)\n if (target && entry.host.contains(target)) return target\n } catch (err) {\n console.error(`[uidex] view \"${entry.view.id}\" focusTarget() threw`, err)\n }\n return null\n}\n\nfunction focusTopAfterChange(\n entry: MountedEntry,\n searchInput: HTMLInputElement\n): void {\n const preferred = resolveViewFocusTarget(entry)\n const target =\n preferred && preferred !== searchInput ? preferred : searchInput\n const focus = () => {\n try {\n target.focus({ preventScroll: true })\n } catch {\n /* ignore */\n }\n }\n focus()\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(focus)\n }\n}\n\nfunction sameRef(a: MountedEntry[\"ref\"], b: MountedEntry[\"ref\"]): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n return a.kind === b.kind && a.id === b.id\n}\n\nfunction resolveHints(view: View, ctx: ViewContext): ShellHint[] {\n const h = view.hints\n if (!h) return []\n if (typeof h === \"function\") {\n try {\n return h(ctx) ?? []\n } catch (err) {\n console.error(`[uidex] view \"${view.id}\" hints() threw`, err)\n return []\n }\n }\n return h\n}\n\nfunction resolveTitle(view: View, ctx: ViewContext): string {\n const t = view.title\n if (!t) return \"\"\n if (typeof t === \"function\") {\n try {\n return t(ctx) ?? \"\"\n } catch (err) {\n console.error(`[uidex] view \"${view.id}\" title() threw`, err)\n return \"\"\n }\n }\n return t\n}\n\nfunction resolveActions(\n view: View,\n ctx: ViewContext,\n globalActions?: (ctx: ViewContext) => ShellAction[]\n): ShellAction[] {\n const result: ShellAction[] = []\n const fn = view.actions\n if (fn) {\n try {\n const viewActions = fn(ctx) ?? []\n result.push(...viewActions)\n } catch (err) {\n console.error(`[uidex] view \"${view.id}\" actions() threw`, err)\n }\n }\n if (globalActions) {\n try {\n const globals = globalActions(ctx) ?? []\n result.push(...globals)\n } catch (err) {\n console.error(`[uidex] globalActions() threw`, err)\n }\n }\n return result\n}\n\nexport function createViewStack(options: ViewStackOptions): ViewStack {\n const { container, views, session, registry, highlight, sdkCloud } = options\n const cloud = options.cloud ?? null\n const dev = options.dev ?? detectDev()\n\n const mounted: MountedEntry[] = []\n\n let shell: StackShell | null = null\n let warnedForDepth = 0\n let lastStack: readonly ViewStackEntry[] | null = null\n let pendingFallbackQuery: string | null = null\n let scrollAreaSeq = 0\n\n function ensureShell(): StackShell {\n if (shell) return shell\n shell = createStackShell(container, {\n onBack: () => session.getState().actions.popStack(),\n onBackdropClick: () => session.getState().actions.clearStack(),\n onSearchInput: (value) => {\n const top = mounted[mounted.length - 1]\n if (!top) return\n if (top.mounted.onSearch) {\n top.mounted.onSearch(value)\n return\n }\n if (top.view.id === \"command-palette\") return\n pendingFallbackQuery = value\n session\n .getState()\n .actions.pushStack({ id: \"command-palette\", ref: null })\n },\n })\n return shell\n }\n\n function destroyShell(): void {\n shell?.destroy()\n shell = null\n pendingFallbackQuery = null\n }\n\n function syncHighlight(): void {\n const top = mounted[mounted.length - 1]\n if (!top || !top.view.matches || !top.ctx.ref) {\n highlight.hide()\n return\n }\n highlight.show(top.ctx.ref, {\n color: KIND_STYLE[top.ctx.ref.kind].color,\n })\n }\n\n function updateChrome(): void {\n if (!shell) return\n const top = mounted[mounted.length - 1]\n if (!top) return\n\n const atRoot = mounted.length <= 1\n shell.backBtn.hidden = atRoot\n shell.searchIcon.hidden = !atRoot\n\n const searchable = top.view.searchable !== false\n shell.searchInput.hidden = !searchable\n const titleText = searchable ? \"\" : resolveTitle(top.view, top.ctx)\n shell.headerTitle.textContent = titleText\n shell.headerTitle.hidden = searchable || !titleText\n\n shell.footerLeft.replaceChildren()\n const refEntity = top.ctx.ref\n ? top.ctx.registry.get(top.ctx.ref.kind, top.ctx.ref.id)\n : null\n if (refEntity) {\n shell.footerLeft.append(\n renderKindChip({\n entity: refEntity,\n withKindName: true,\n })\n )\n } else {\n shell.footerLeft.append(shell.logo)\n }\n\n shell.footerRight.replaceChildren()\n // Only surface the primary \"Enter\" hint for the top view — arrows/tab/esc\n // are implicit keyboard conventions and don't need chrome explaining them.\n const enterHint = resolveHints(top.view, top.ctx).find((h) =>\n h.key.includes(\"↵\")\n )\n if (enterHint) {\n shell.footerRight.append(createHint(enterHint.key, enterHint.label))\n }\n\n const actions = resolveActions(top.view, top.ctx, options.globalActions)\n if (actions.length > 0) {\n if (enterHint) shell.footerRight.append(createFooterDivider())\n shell.footerRight.append(\n createActionsButton(() => shell?.actionsPopup.open(actions))\n )\n }\n }\n\n function render(): void {\n const stack = session.getState().stack\n if (stack === lastStack) return\n lastStack = stack\n\n if (dev && stack.length > SOFT_STACK_CAP && stack.length > warnedForDepth) {\n console.warn(\n `[uidex] View stack depth ${stack.length} exceeds soft cap of ${SOFT_STACK_CAP}`\n )\n warnedForDepth = stack.length\n }\n if (stack.length <= SOFT_STACK_CAP) warnedForDepth = 0\n\n const resolved: Array<{ entry: ViewStackEntry; view: View }> = []\n for (const entry of stack) {\n const view = views.get(entry.id)\n if (view) resolved.push({ entry, view })\n }\n\n const priorTop = mounted[mounted.length - 1] ?? null\n\n let commonPrefix = 0\n while (\n commonPrefix < resolved.length &&\n commonPrefix < mounted.length &&\n mounted[commonPrefix].id === resolved[commonPrefix].view.id &&\n sameRef(mounted[commonPrefix].ref, resolved[commonPrefix].entry.ref)\n ) {\n commonPrefix++\n }\n\n const popped = mounted.splice(commonPrefix)\n for (let i = popped.length - 1; i >= 0; i--) {\n cleanupMountedEntry(popped[i])\n }\n\n if (resolved.length > commonPrefix) {\n const active = ensureShell()\n for (let i = commonPrefix; i < resolved.length; i++) {\n const record = mountEntry(resolved[i].entry, resolved[i].view, {\n container: active.hostContainer,\n searchInput: active.searchInput,\n views,\n session,\n registry,\n cloud,\n sdkCloud,\n highlight,\n nextScrollSeq: () => ++scrollAreaSeq,\n })\n if (record) mounted.push(record)\n }\n }\n\n if (shell?.actionsPopup.isOpen() && popped.length > 0) {\n shell.actionsPopup.close()\n }\n\n if (mounted.length === 0) {\n destroyShell()\n highlight.hide()\n return\n }\n const topIndex = mounted.length - 1\n for (let i = 0; i < mounted.length; i++) {\n setEntryVisibility(mounted[i], i === topIndex)\n }\n updateChrome()\n syncHighlight()\n\n const newTop = mounted[topIndex]\n if (newTop !== priorTop && shell) {\n const fallbackQuery = pendingFallbackQuery\n pendingFallbackQuery = null\n const initialQuery = fallbackQuery ?? \"\"\n if (fallbackQuery === null) {\n shell.searchInput.value = \"\"\n }\n try {\n newTop.mounted.onSearch?.(initialQuery)\n } catch (err) {\n console.error(`[uidex] view \"${newTop.view.id}\" onSearch threw`, err)\n }\n focusTopAfterChange(newTop, shell.searchInput)\n }\n }\n\n render()\n const unsubscribe = session.subscribe(render)\n\n return {\n getActionsPopup() {\n return shell?.actionsPopup ?? null\n },\n destroy() {\n unsubscribe()\n while (mounted.length > 0) {\n const entry = mounted.pop()!\n cleanupMountedEntry(entry)\n }\n destroyShell()\n highlight.hide()\n },\n }\n}\n","import { Compass, createElement as createLucideElement } from \"lucide\"\nimport type { EntityRef, Page } from \"../../entities\"\nimport { matchesQuery } from \"../builder/filter\"\nimport { buildPageRouteMap, collectPageContext } from \"../builder/page-context\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { PALETTE_GROUPS } from \"../labels\"\nimport { BUILT_IN_VIEW_IDS } from \"./ids\"\n\ntype PaletteItemPayload =\n | { type: \"view\"; id: string; ref?: EntityRef | null }\n | { type: \"entity\"; ref: EntityRef }\n\ninterface PaletteItem extends ListItem {\n payload: PaletteItemPayload\n}\n\nconst CURRENT_PAGE_GROUP = PALETTE_GROUPS.commands\n\nfunction pageDetailsRow(\n page: Page,\n pageRoutes: ReadonlyMap<string, string>\n): PaletteItem {\n const ref: EntityRef = { kind: \"page\", id: page.id }\n const item: PaletteItem = {\n value: `entity:${ref.kind}:${ref.id}`,\n label: \"Page Details\",\n group: CURRENT_PAGE_GROUP,\n tag: `${ref.kind}:${ref.id}`,\n preview: ref,\n entityChip: { entity: page },\n payload: { type: \"entity\", ref },\n }\n const path = pageRoutes.get(page.id)\n if (path) item.subtitle = path\n return item\n}\n\nfunction explorePageRow(totalOnPage: number): PaletteItem {\n return {\n value: `view:${BUILT_IN_VIEW_IDS.explorePage}`,\n label: \"Explore page\",\n subtitle: totalOnPage === 1 ? \"1 item\" : `${totalOnPage} items`,\n group: CURRENT_PAGE_GROUP,\n tag: BUILT_IN_VIEW_IDS.explorePage,\n leading: () => createLucideElement(Compass),\n payload: { type: \"view\", id: BUILT_IN_VIEW_IDS.explorePage },\n }\n}\n\nfunction collectNavigation(ctx: ViewContext): PaletteItem[] {\n const out: PaletteItem[] = []\n for (const view of ctx.views.list()) {\n if (view.id === BUILT_IN_VIEW_IDS.commandPalette) continue\n // Explore page is reachable from the root row above; don't duplicate.\n if (view.id === BUILT_IN_VIEW_IDS.explorePage) continue\n if (!view.palette) continue\n out.push({\n value: `view:${view.id}`,\n label: view.palette.label,\n group: view.palette.group ?? PALETTE_GROUPS.commands,\n shortcut: view.palette.shortcut,\n tag: view.id,\n leading: view.palette.icon,\n payload: { type: \"view\", id: view.id },\n })\n }\n return out\n}\n\nexport const commandPaletteView: View = {\n id: BUILT_IN_VIEW_IDS.commandPalette,\n palette: { label: \"Command palette\", shortcut: \"Cmd+K\" },\n title: \"Command palette\",\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx): ListSurface => {\n const pageCtx = collectPageContext(ctx)\n const pageRoutes = buildPageRouteMap(ctx)\n\n const items: PaletteItem[] = []\n\n if (pageCtx.pageEntity) {\n items.push(pageDetailsRow(pageCtx.pageEntity, pageRoutes))\n }\n\n const onPageCount = pageCtx.composed.length + pageCtx.dom.length\n if (onPageCount > 0) items.push(explorePageRow(onPageCount))\n\n items.push(...collectNavigation(ctx))\n\n const initialHighlight = ctx.ref\n ? `entity:${ctx.ref.kind}:${ctx.ref.id}`\n : undefined\n\n const filter = (item: ListItem, query: string): boolean => {\n const palette = item as PaletteItem\n const rawId =\n palette.payload.type === \"entity\" ? palette.payload.ref.id : \"\"\n return matchesQuery(`${item.label} ${rawId} ${item.group ?? \"\"}`, query)\n }\n\n return {\n kind: \"list\",\n id: \"uidex-command-palette\",\n items,\n defaultHighlight: initialHighlight,\n filter,\n onSelect: (item) => {\n const palette = item as PaletteItem\n if (palette.payload.type === \"view\") {\n ctx.push({ id: palette.payload.id, ref: palette.payload.ref ?? null })\n return\n }\n ctx.navigate(palette.payload.ref)\n },\n }\n },\n}\n","import type { Entity, EntityRef, Page } from \"../../entities\"\nimport {\n SURFACE_IGNORE_SELECTOR,\n UIDEX_ATTR_TO_KIND,\n} from \"../../surface/constants\"\nimport type { ViewContext } from \"../core/types\"\n\nconst ON_THIS_PAGE_SELECTOR = UIDEX_ATTR_TO_KIND.map(\n ([attr]) => `[${attr}]`\n).join(\",\")\n\nfunction routePatternToRegex(pattern: string): RegExp {\n if (pattern === \"/\") return /^\\/$/\n const parts = pattern.split(\"/\").filter(Boolean)\n const regexParts = parts.map((seg) => {\n if (/^\\[\\.{3}[^\\]]+\\]$/.test(seg)) return \".+\"\n if (/^\\[[^\\]]+\\]$/.test(seg)) return \"[^/]+\"\n return seg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n })\n return new RegExp(`^/${regexParts.join(\"/\")}/?$`)\n}\n\n/** Resolve the page entity for the current URL by walking the registry's routes. */\nexport function findCurrentPageId(ctx: ViewContext): string | null {\n if (typeof location === \"undefined\") return null\n const pathname = location.pathname || \"/\"\n const routes = ctx.registry.list(\"route\")\n let best: { path: string; page: string } | null = null\n for (const route of routes) {\n if (!routePatternToRegex(route.path).test(pathname)) continue\n if (!best || route.path.length > best.path.length) {\n best = { path: route.path, page: route.page }\n }\n }\n return best?.page ?? null\n}\n\n/** First route path per page id, for subtitle rendering in palette rows. */\nexport function buildPageRouteMap(\n ctx: ViewContext\n): ReadonlyMap<string, string> {\n const map = new Map<string, string>()\n for (const route of ctx.registry.list(\"route\")) {\n if (!map.has(route.page)) map.set(route.page, route.path)\n }\n return map\n}\n\nexport interface PageEntityHit {\n entity: Entity\n ref: EntityRef\n /** DOM node that surfaced this entity, if discovered via `data-uidex*` scan. */\n node?: Element | null\n}\n\nexport interface PageContext {\n pageId: string | null\n pageEntity: Page | null\n /** Features / widgets the page entity declares via `uidex.composes`. */\n composed: PageEntityHit[]\n /** Entities discovered by scanning the DOM for `data-uidex*` attributes. */\n dom: PageEntityHit[]\n}\n\n/**\n * Collect the entities relevant to the current page: the page entity itself,\n * its declared composes (features + widgets), and anything discovered via the\n * DOM scan. Dedup by `kind:id`; the page entity always wins over DOM dups.\n */\nexport function collectPageContext(ctx: ViewContext): PageContext {\n const seen = new Set<string>()\n const composed: PageEntityHit[] = []\n const dom: PageEntityHit[] = []\n\n const pageId = findCurrentPageId(ctx)\n const pageEntity = pageId ? (ctx.registry.get(\"page\", pageId) ?? null) : null\n\n if (pageEntity) {\n seen.add(`page:${pageEntity.id}`)\n for (const ref of pageEntity.meta?.composes ?? []) {\n if (ref.kind !== \"feature\" && ref.kind !== \"widget\") continue\n const entity = ctx.registry.get(ref.kind, ref.id)\n if (!entity) continue\n const key = `${ref.kind}:${ref.id}`\n if (seen.has(key)) continue\n seen.add(key)\n composed.push({ entity, ref })\n }\n }\n\n if (typeof document !== \"undefined\") {\n const nodes = document.querySelectorAll<HTMLElement>(ON_THIS_PAGE_SELECTOR)\n for (const node of nodes) {\n if (node.closest(SURFACE_IGNORE_SELECTOR)) continue\n for (const [attr, kind] of UIDEX_ATTR_TO_KIND) {\n const id = node.getAttribute(attr)\n if (!id) continue\n const entity = ctx.registry.get(kind, id)\n if (!entity) continue\n const key = `${kind}:${id}`\n if (seen.has(key)) break\n seen.add(key)\n dom.push({ entity, ref: { kind, id }, node })\n break\n }\n }\n }\n\n return { pageId, pageEntity, composed, dom }\n}\n","import type { Location } from \"../../entities\"\n\nexport function formatLocation(loc: Location | undefined): string | null {\n if (!loc) return null\n const suffix =\n loc.line !== undefined\n ? loc.column !== undefined\n ? `:${loc.line}:${loc.column}`\n : `:${loc.line}`\n : \"\"\n return `${loc.file}${suffix}`\n}\n","import {\n isMetaKind,\n type Entity,\n type EntityKind,\n type EntityRef,\n type Flow,\n} from \"../../entities\"\nimport type { ViewContext } from \"../core/types\"\n\nexport function resolveRefs(\n ctx: ViewContext,\n refs: readonly EntityRef[] | undefined\n): readonly Entity[] {\n if (!refs) return []\n const out: Entity[] = []\n for (const ref of refs) {\n const entity = ctx.registry.get(ref.kind, ref.id)\n if (entity) out.push(entity)\n }\n return out\n}\n\nexport function resolveFlows(\n ctx: ViewContext,\n flowIds: readonly string[] | undefined\n): readonly Flow[] {\n if (!flowIds) return []\n const out: Flow[] = []\n for (const id of flowIds) {\n const flow = ctx.registry.get(\"flow\", id)\n if (flow) out.push(flow)\n }\n return out\n}\n\ninterface HasComposes {\n meta?: { composes?: readonly EntityRef[] }\n}\n\nexport function collectUsedBy(\n ctx: ViewContext,\n targetKind: EntityKind,\n targetId: string\n): readonly Entity[] {\n const out: Entity[] = []\n const seen = new Set<string>()\n for (const candidate of ctx.registry.query((e) => {\n if (!isMetaKind(e.kind)) return false\n const composes = (e as HasComposes).meta?.composes\n if (!composes) return false\n return composes.some((c) => c.kind === targetKind && c.id === targetId)\n })) {\n const key = `${candidate.kind}:${candidate.id}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push(candidate)\n }\n return out\n}\n\nexport function collectFlowsTouching(\n ctx: ViewContext,\n targetId: string\n): readonly Flow[] {\n const out: Flow[] = []\n for (const flow of ctx.registry.list(\"flow\")) {\n if (flow.touches.includes(targetId)) out.push(flow)\n }\n return out\n}\n","import {\n displayName,\n type EntityByKind,\n type EntityKind,\n type EntityRef,\n type Location,\n type MetaEntityKind,\n} from \"../../entities\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n} from \"../core/surface\"\nimport { BUILT_IN_VIEW_IDS } from \"../built-in/ids\"\nimport type { ShellHint, View, ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\nimport { formatLocation } from \"./format-location\"\nimport { resolveFlows, resolveRefs } from \"./resolve\"\n\ntype MetaEntity = EntityByKind<MetaEntityKind>\n\nconst DOM_BACKED_KINDS: ReadonlySet<EntityKind> = new Set([\n \"element\",\n \"region\",\n \"widget\",\n \"primitive\",\n])\n\nconst DETAIL_HINTS: readonly ShellHint[] = [{ key: \"↵\", label: \"Open\" }]\n\nexport function copyPathAction(\n ref: EntityRef,\n loc?: Location,\n labelOverride?: string\n): DetailAction {\n const path = `${ref.kind}:${ref.id}`\n return {\n id: \"copy-path\",\n label: labelOverride ?? formatLocation(loc) ?? path,\n ariaLabel: `Copy path ${path}`,\n icon: \"copy\",\n copy: path,\n intent: { kind: \"external\", describe: \"clipboard\" },\n }\n}\n\nexport function feedbackAction(ref: EntityRef): DetailAction {\n return {\n id: \"report-feedback\",\n label: \"Report feedback\",\n icon: \"message-circle\",\n push: { id: BUILT_IN_VIEW_IDS.feedback, ref },\n intent: {\n kind: \"push\",\n viewId: BUILT_IN_VIEW_IDS.feedback,\n refKind: ref.kind,\n },\n }\n}\n\nexport function highlightElementAction(ref: EntityRef): DetailAction {\n return {\n id: \"highlight-element\",\n label: \"Highlight element\",\n icon: \"target\",\n highlight: ref,\n intent: { kind: \"external\", describe: \"highlight\" },\n }\n}\n\nexport interface EntityDetailViewConfig<K extends MetaEntityKind> {\n id: string\n kind: K\n fallbackTitle: string\n /** Render the acceptance section when the entity declares acceptance. Default: true. */\n offerAcceptance?: boolean\n /** Extra sections inserted between the acceptance section and composes. */\n extraSections?(\n ctx: ViewContext,\n entity: EntityByKind<K>\n ): readonly DetailSection[]\n /** Override subtitle. Default: `{ rawId: entity.id }`. */\n subtitle?(\n ctx: ViewContext,\n entity: EntityByKind<K>\n ): DetailSubtitle | undefined\n}\n\nexport function createEntityDetailView<K extends MetaEntityKind>(\n config: EntityDetailViewConfig<K>\n): View {\n const { kind, fallbackTitle, offerAcceptance = true } = config\n return {\n id: config.id,\n matches: (ref) => ref.kind === kind,\n hints: DETAIL_HINTS,\n title: (ctx) => {\n if (!ctx.ref) return fallbackTitle\n const entity = ctx.registry.get(kind, ctx.ref.id)\n return entity ? displayName(entity) : ctx.ref.id\n },\n focusTarget: (host) =>\n host.querySelector<HTMLButtonElement>(\n \"[data-uidex-detail-actions] [data-uidex-detail-action]\"\n ),\n surface: (ctx): DetailSurface => {\n if (!ctx.ref || ctx.ref.kind !== kind) {\n return { kind: \"detail\", entityKind: kind }\n }\n const entity = ctx.registry.get(kind, ctx.ref.id) as\n | EntityByKind<K>\n | undefined\n if (!entity) {\n return { kind: \"detail\", entityKind: kind, notFound: ctx.ref }\n }\n // MetaEntityKind excludes route/flow, so entity always has meta/loc/scopes.\n const metaEntity = entity as MetaEntity\n const meta = metaEntity.meta\n\n const actions: DetailAction[] = [\n copyPathAction(ctx.ref, undefined, \"Copy path\"),\n ]\n if (DOM_BACKED_KINDS.has(kind)) {\n actions.push(highlightElementAction(ctx.ref))\n }\n actions.push(feedbackAction(ctx.ref))\n\n const sections: DetailSection[] = []\n if (metaEntity.scopes?.length) {\n sections.push({ id: \"scopes\", scopes: metaEntity.scopes })\n }\n if (meta?.description) {\n sections.push({ id: \"description\", text: meta.description })\n }\n if (offerAcceptance && meta?.acceptance?.length) {\n sections.push({ id: \"acceptance\", items: meta.acceptance })\n }\n for (const s of config.extraSections?.(ctx, entity) ?? []) {\n sections.push(s)\n }\n sections.push({\n id: \"composes\",\n label: SECTION_LABELS.contains,\n entities: resolveRefs(ctx, meta?.composes),\n filterable: true,\n })\n sections.push({\n id: \"flows\",\n flows: resolveFlows(ctx, meta?.flows),\n filterable: true,\n })\n\n return {\n kind: \"detail\",\n entityKind: kind,\n title: displayName(metaEntity),\n subtitle: config.subtitle?.(ctx, entity),\n actions,\n sections,\n }\n },\n }\n}\n","import type { EntityKind } from \"../../entities\"\nimport { createEntityDetailView } from \"../builder/detail-builder\"\nimport { collectFlowsTouching, collectUsedBy } from \"../builder/resolve\"\nimport type { DetailSection } from \"../core/surface\"\nimport { SECTION_LABELS } from \"../labels\"\n\nfunction usedBySection(\n ctx: Parameters<typeof collectUsedBy>[0],\n kind: EntityKind,\n id: string\n): DetailSection {\n return {\n id: \"used-by\",\n label: SECTION_LABELS.usedBy,\n entities: collectUsedBy(ctx, kind, id),\n filterable: true,\n }\n}\n\nfunction touchedByFlowsSection(\n ctx: Parameters<typeof collectFlowsTouching>[0],\n id: string\n): DetailSection {\n return {\n id: \"flows\",\n flows: collectFlowsTouching(ctx, id),\n filterable: true,\n }\n}\n\nexport const componentDetailView = createEntityDetailView({\n id: \"component-detail\",\n kind: \"element\",\n fallbackTitle: \"Component\",\n extraSections: (ctx, entity) => [\n usedBySection(ctx, \"element\", entity.id),\n touchedByFlowsSection(ctx, entity.id),\n ],\n})\n\nexport const featureDetailView = createEntityDetailView({\n id: \"feature-detail\",\n kind: \"feature\",\n fallbackTitle: \"Feature\",\n extraSections: (ctx, entity) => [usedBySection(ctx, \"feature\", entity.id)],\n})\n\nexport const regionDetailView = createEntityDetailView({\n id: \"region-detail\",\n kind: \"region\",\n fallbackTitle: \"Region\",\n offerAcceptance: false,\n extraSections: (ctx, entity) => [usedBySection(ctx, \"region\", entity.id)],\n})\n\nexport const widgetDetailView = createEntityDetailView({\n id: \"widget-detail\",\n kind: \"widget\",\n fallbackTitle: \"Widget\",\n extraSections: (ctx, entity) => [usedBySection(ctx, \"widget\", entity.id)],\n})\n\nexport const primitiveDetailView = createEntityDetailView({\n id: \"primitive-detail\",\n kind: \"primitive\",\n fallbackTitle: \"Primitive\",\n offerAcceptance: false,\n extraSections: (ctx, entity) => [usedBySection(ctx, \"primitive\", entity.id)],\n})\n\nexport const pageDetailView = createEntityDetailView({\n id: \"page-detail\",\n kind: \"page\",\n fallbackTitle: \"Page\",\n offerAcceptance: true,\n extraSections: (ctx, entity): DetailSection[] => {\n const paths = ctx.registry\n .list(\"route\")\n .filter((r) => r.page === entity.id)\n .map((r) => r.path)\n return [{ id: \"routes\", paths, filterable: true }]\n },\n})\n","import { Compass, createElement as createLucideElement } from \"lucide\"\nimport {\n displayName,\n ENTITY_KINDS,\n type Entity,\n type EntityRef,\n} from \"../../entities\"\nimport { matchesQuery } from \"../builder/filter\"\nimport {\n buildPageRouteMap,\n collectPageContext,\n type PageEntityHit,\n} from \"../builder/page-context\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { BUILT_IN_VIEW_IDS } from \"./ids\"\n\ninterface ExplorePageItem extends ListItem {\n ref: EntityRef\n}\n\nconst KIND_ORDER: ReadonlyMap<string, number> = new Map(\n ENTITY_KINDS.map((kind, index) => [kind, index])\n)\n\nconst KIND_GROUP_LABELS: Partial<Record<Entity[\"kind\"], string>> = {\n feature: \"Features\",\n widget: \"Widgets\",\n region: \"Regions\",\n element: \"Elements\",\n primitive: \"Primitives\",\n page: \"Pages\",\n route: \"Routes\",\n flow: \"Flows\",\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction toItem(\n hit: PageEntityHit,\n pageRoutes: ReadonlyMap<string, string>\n): ExplorePageItem {\n const { entity, ref, node } = hit\n const item: ExplorePageItem = {\n value: `entity:${ref.kind}:${ref.id}`,\n label: displayName(entity, node),\n group: KIND_GROUP_LABELS[entity.kind] ?? capitalize(entity.kind),\n tag: `${ref.kind}:${ref.id}`,\n preview: ref,\n entityChip: { entity, node },\n ref,\n }\n if (entity.kind === \"route\") {\n item.subtitle = entity.path\n } else if (entity.kind === \"page\") {\n const path = pageRoutes.get(entity.id)\n if (path) item.subtitle = path\n }\n return item\n}\n\nexport const explorePageView: View = {\n id: BUILT_IN_VIEW_IDS.explorePage,\n palette: {\n label: \"Explore page\",\n shortcut: \"\",\n icon: () => createLucideElement(Compass),\n },\n title: \"Explore page\",\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const { composed, dom } = collectPageContext(ctx)\n const pageRoutes = buildPageRouteMap(ctx)\n\n const items: ExplorePageItem[] = [\n ...composed.map((hit) => toItem(hit, pageRoutes)),\n ...dom.map((hit) => toItem(hit, pageRoutes)),\n ].sort((a, b) => {\n const ak = KIND_ORDER.get(a.ref.kind) ?? Number.MAX_SAFE_INTEGER\n const bk = KIND_ORDER.get(b.ref.kind) ?? Number.MAX_SAFE_INTEGER\n if (ak !== bk) return ak - bk\n return a.label.localeCompare(b.label)\n })\n\n const filter = (item: ListItem, query: string): boolean => {\n const row = item as ExplorePageItem\n return matchesQuery(\n `${item.label} ${row.ref.id} ${item.group ?? \"\"}`,\n query\n )\n }\n\n return {\n kind: \"list\",\n id: \"uidex-explore-page\",\n items,\n emptyLabel: \"No uidex-annotated elements on this page\",\n filter,\n onSelect: (item) => ctx.navigate((item as ExplorePageItem).ref),\n }\n },\n}\n","import { BUILT_IN_VIEW_IDS } from \"../ids\"\nimport { createFeedbackView } from \"./view-builder\"\n\nexport const feedbackView = createFeedbackView({\n id: BUILT_IN_VIEW_IDS.feedback,\n resolveCloud: (ctx) => ctx.cloud,\n componentId: (ctx) => (ctx.ref ? `${ctx.ref.kind}:${ctx.ref.id}` : \"unknown\"),\n submitLabels: { ready: \"Send feedback\", noCloud: \"Copy report\" },\n successToast: (result) => {\n const ticketKey =\n result.externalLink?.ok && result.externalLink.key\n ? result.externalLink.key\n : null\n return ticketKey\n ? `Feedback submitted (${ticketKey})`\n : \"Feedback submitted\"\n },\n failureToast: (err) => {\n const message = err instanceof Error ? err.message : String(err)\n return `Failed: ${message}`\n },\n})\n","import {\n displayName,\n entityKey,\n isMetaEntity,\n type Entity,\n} from \"../../entities\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSurface,\n} from \"../core/surface\"\nimport type { View } from \"../core/types\"\nimport { copyPathAction, feedbackAction } from \"../builder/detail-builder\"\n\nexport const flowDetailView: View = {\n id: \"flow-detail\",\n matches: (ref) => ref.kind === \"flow\",\n title: (ctx) => {\n if (!ctx.ref) return \"Flow\"\n const entity = ctx.registry.get(\"flow\", ctx.ref.id)\n return entity ? displayName(entity) : ctx.ref.id\n },\n focusTarget: (host) =>\n host.querySelector<HTMLButtonElement>(\n \"[data-uidex-detail-actions] [data-uidex-detail-action]\"\n ),\n surface: (ctx): DetailSurface => {\n if (!ctx.ref || ctx.ref.kind !== \"flow\") {\n return { kind: \"detail\", entityKind: \"flow\" }\n }\n const flow = ctx.registry.get(\"flow\", ctx.ref.id)\n if (!flow) {\n return { kind: \"detail\", entityKind: \"flow\", notFound: ctx.ref }\n }\n\n const touched: Entity[] = []\n const seen = new Set<string>()\n for (const touchedEntity of ctx.registry.touchedBy(flow.id)) {\n if (!isMetaEntity(touchedEntity)) continue\n const key = `${touchedEntity.kind}:${touchedEntity.id}`\n if (seen.has(key)) continue\n seen.add(key)\n touched.push(touchedEntity)\n }\n const touchedIds = new Set(touched.map((t) => entityKey(t)))\n const unresolved = flow.touches.filter((id) => !touchedIds.has(id))\n\n const actions: DetailAction[] = [\n copyPathAction(ctx.ref, flow.loc),\n feedbackAction(ctx.ref),\n ]\n\n const sections: DetailSection[] = [\n {\n id: \"touches\",\n entities: touched,\n unresolved,\n filterable: true,\n },\n ]\n\n return {\n kind: \"detail\",\n entityKind: \"flow\",\n title: displayName(flow),\n actions,\n sections,\n }\n },\n}\n","import { BookOpen, createElement as createLucideElement } from \"lucide\"\nimport {\n ENTITY_KINDS,\n KIND_STYLE,\n type Entity,\n type EntityKind,\n} from \"../../entities\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View } from \"../core/types\"\nimport { PALETTE_GROUPS } from \"../labels\"\nimport { BUILT_IN_VIEW_IDS } from \"./ids\"\n\nconst DESCRIPTIONS: Record<EntityKind, string> = {\n route: \"URL to page mapping, derived from the framework router.\",\n page: \"Route-rendered top-level. Declared via uidex module export.\",\n feature: \"Cross-cutting capability spanning multiple pages.\",\n widget: \"Composite behavioural unit (player, picker, editor).\",\n region: \"Structural area. HTML5 landmark or data-uidex-region.\",\n element: \"Interactive DOM node tagged with data-uidex.\",\n primitive: \"Reusable presentational component under src/components/ui.\",\n flow: \"End-to-end user journey defined by a Playwright describe.\",\n}\n\nfunction syntheticEntity(kind: EntityKind): Entity {\n if (kind === \"route\") return { kind: \"route\", path: kind, page: kind }\n if (kind === \"flow\")\n return { kind: \"flow\", id: kind, loc: { file: \"\" }, touches: [] }\n return { kind, id: kind }\n}\n\nexport const glossaryView: View = {\n id: BUILT_IN_VIEW_IDS.glossary,\n palette: {\n label: \"Glossary\",\n group: PALETTE_GROUPS.commands,\n icon: () => createLucideElement(BookOpen),\n },\n title: \"Glossary\",\n hints: [],\n focusTarget: () => null,\n surface: (): ListSurface => {\n const items: ListItem[] = ENTITY_KINDS.map((kind) => ({\n value: `glossary:${kind}`,\n label: KIND_STYLE[kind].label,\n subtitle: DESCRIPTIONS[kind],\n tag: kind,\n entityChip: { entity: syntheticEntity(kind) },\n }))\n return {\n kind: \"list\",\n id: \"uidex-glossary\",\n items,\n }\n },\n}\n","export { BUILT_IN_VIEW_IDS } from \"./ids\"\n\nimport { commandPaletteView } from \"./command-palette\"\nimport {\n componentDetailView,\n featureDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n widgetDetailView,\n} from \"./entity-detail\"\nimport { explorePageView } from \"./explore-page\"\nimport { feedbackView } from \"./feedback/host-feedback\"\nimport { sdkFeedbackView } from \"./feedback/sdk-feedback\"\nimport { flowDetailView } from \"./flow-detail\"\nimport { glossaryView } from \"./glossary\"\n\nexport { commandPaletteView } from \"./command-palette\"\nexport {\n componentDetailView,\n featureDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n widgetDetailView,\n} from \"./entity-detail\"\nexport { explorePageView } from \"./explore-page\"\nexport { feedbackView } from \"./feedback/host-feedback\"\nexport { sdkFeedbackView } from \"./feedback/sdk-feedback\"\nexport { flowDetailView } from \"./flow-detail\"\nexport { glossaryView } from \"./glossary\"\n\nexport const DEFAULT_VIEWS = [\n commandPaletteView,\n explorePageView,\n componentDetailView,\n pageDetailView,\n featureDetailView,\n widgetDetailView,\n flowDetailView,\n primitiveDetailView,\n regionDetailView,\n feedbackView,\n sdkFeedbackView,\n glossaryView,\n] as const\n","import { sdkCloud } from \"./cloud/sdk-cloud\"\nimport { createRegistry, KIND_STYLE, type Registry } from \"./entities\"\nimport { reportUidexIssueAction } from \"./views/built-in/feedback/sdk-feedback\"\nimport {\n createIngest,\n resolveIngestOptions,\n type Ingest,\n type IngestOptions,\n} from \"./ingest\"\nimport type { HighlightContext } from \"./flows/highlight\"\nimport { createCleanupStack } from \"./internal/cleanup\"\nimport {\n createSession,\n type ResolvedTheme,\n type SessionStore,\n type ThemePreference,\n} from \"./session\"\nimport {\n bindShadowKeys,\n createSurfaceShell,\n resolveEntityElement,\n type Corner,\n type Inspector,\n type Overlay,\n} from \"./surface\"\nimport {\n createViewRegistrar,\n createViewStack,\n DEFAULT_VIEWS,\n type CloudAdapter,\n type HighlightController,\n type View,\n type ViewRegistrar,\n} from \"./views\"\n\nexport interface CreateUidexOptions {\n theme?: ThemePreference\n resolvedTheme?: ResolvedTheme\n stylesheets?: string[]\n initialCorner?: Corner\n /** Shown as a label at the start of the menu bar. */\n appTitle?: string\n cloud?: CloudAdapter | null\n dev?: boolean\n /** Register bundled default views. Defaults to `true`. */\n defaultViews?: boolean\n /** Additional views to register (after defaults). */\n views?: readonly View[]\n /**\n * Override ingest behaviour. When `cloud` is non-null, ingest auto-enables\n * (both console and network capture). Pass `null` to disable entirely, or\n * an options object to override either channel.\n */\n ingest?: IngestOptions | null\n}\n\nexport interface Uidex {\n mount(target?: Element): void\n unmount(): void\n readonly registry: Registry\n readonly session: SessionStore\n readonly views: ViewRegistrar\n readonly cloud: CloudAdapter | null\n readonly ingest: Ingest | null\n readonly shadowRoot: ShadowRoot | null\n}\n\nexport function createUidex(options: CreateUidexOptions = {}): Uidex {\n const registry = createRegistry()\n\n // Mutable refs filled in during mount(); session bindings close over them so\n // the surface machine's actions can mount the inspector and drive the\n // overlay once the shell exists.\n const inspectorRef: { current: Inspector | null } = { current: null }\n const overlayRef: { current: Overlay | null } = { current: null }\n\n const applyOverlay = (ctx: HighlightContext): void => {\n const overlay = overlayRef.current\n if (!overlay) return\n const ref = ctx.pinnedRef ?? ctx.ref\n if (!ref) return\n const el = ctx.element ?? resolveEntityElement(ref)\n if (!el) {\n overlay.hide()\n return\n }\n overlay.show(el, { color: ctx.color ?? KIND_STYLE[ref.kind].color })\n }\n\n const session = createSession({\n theme: options.theme,\n resolvedTheme: options.resolvedTheme,\n bindings: {\n surface: {\n mountInspector: () => inspectorRef.current?.mount(),\n destroyInspector: () => inspectorRef.current?.destroy(),\n },\n highlight: {\n showOverlay: applyOverlay,\n hideOverlay: () => overlayRef.current?.hide(),\n updateOverlay: applyOverlay,\n },\n },\n })\n const views = createViewRegistrar({ session, dev: options.dev })\n const cloud = options.cloud ?? null\n const ingestOpts = resolveIngestOptions(options.ingest, cloud !== null)\n const ingest = ingestOpts ? createIngest({ session, ...ingestOpts }) : null\n\n if (options.defaultViews !== false) {\n for (const view of DEFAULT_VIEWS) views.register(view)\n }\n if (options.views) {\n for (const view of options.views) views.register(view)\n }\n\n let shadowRoot: ShadowRoot | null = null\n const mountCleanup = createCleanupStack()\n let mounted = false\n\n function mount(target?: Element): void {\n if (mounted) return\n const mountTarget =\n target ?? (typeof document !== \"undefined\" ? document.body : null)\n if (!mountTarget) {\n throw new Error(\"createUidex: no mount target available\")\n }\n\n const shell = createSurfaceShell({\n mount: mountTarget,\n registry,\n session,\n stylesheets: options.stylesheets,\n initialCorner: options.initialCorner,\n appTitle: options.appTitle,\n inspector: {\n onSelect: (match) => {\n const view = views.findMatch(match.ref)\n if (!view) return\n session.send({\n type: \"SELECT\",\n ref: match.ref,\n entry: { id: view.id, ref: match.ref },\n })\n },\n },\n })\n shadowRoot = shell.host.shadowRoot\n inspectorRef.current = shell.inspector\n overlayRef.current = shell.overlay\n mountCleanup.add(shell)\n mountCleanup.add(() => {\n inspectorRef.current = null\n overlayRef.current = null\n })\n\n const highlight: HighlightController = {\n show(ref, opts) {\n const el = resolveEntityElement(ref)\n if (!el) {\n session.send({ type: \"UNHOVER\" })\n return\n }\n session.send({\n type: \"HOVER\",\n ref,\n element: el,\n color: opts?.color ?? null,\n })\n },\n hide() {\n session.send({ type: \"UNHOVER\" })\n },\n }\n\n const viewContainer = document.createElement(\"div\")\n viewContainer.setAttribute(\"data-uidex-views\", \"\")\n shell.host.chromeEl.appendChild(viewContainer)\n mountCleanup.add(() => viewContainer.remove())\n\n const viewStack = createViewStack({\n container: viewContainer,\n views,\n session,\n registry,\n cloud,\n sdkCloud,\n highlight,\n globalActions: (ctx) => [reportUidexIssueAction(ctx)],\n })\n mountCleanup.add(viewStack)\n\n if (shadowRoot) {\n mountCleanup.add(\n bindShadowKeys({\n shadowRoot,\n session,\n getActionsPopup: () => viewStack.getActionsPopup(),\n })\n )\n }\n\n if (ingest) {\n ingest.start()\n mountCleanup.add(() => ingest.stop())\n }\n\n mounted = true\n }\n\n function unmount(): void {\n if (!mounted) return\n mountCleanup.drain()\n shadowRoot = null\n mounted = false\n }\n\n return {\n mount,\n unmount,\n registry,\n session,\n views,\n cloud,\n ingest,\n get shadowRoot() {\n return shadowRoot\n },\n }\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["RouteIcon","successToast","cloud","DEFAULT_LIMIT","import_xstate","import_xstate","initialContext","import_lucide","el","createLucideElement","el","state","import_lucide","createLucideElement","connect","machine","hasTagFn","import_types","import_lucide","createButton","createButton","createButton","createLucideElement","idx","import_xstate","import_xstate","initialContext","import_lucide","import_lucide","scrollArea","createLucideElement","scrollArea","import_lucide","menu","createLucideElement","sameRef","sdkCloud","cloud","import_lucide","createLucideElement","import_lucide","capitalize","createLucideElement","import_lucide","createLucideElement","el","cloud"]}
|