uidex 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/integrations/react/index.ts","../../src/integrations/react/provider.tsx","../../src/shared/entities/types.ts","../../src/shared/entities/registry.ts","../../src/shared/entities/style.ts","../../src/shared/entities/display-name.ts","../../src/browser/internal/cleanup.ts","../../src/browser/session/store.ts","../../src/browser/session/mode.ts","../../src/browser/session/navigation.ts","../../src/browser/styles/tailwind.built.css","../../src/browser/surface/constants.ts","../../src/browser/surface/host.ts","../../src/browser/surface/cursor-tooltip.ts","../../src/browser/surface/inspector.ts","../../src/browser/surface/menu-bar.ts","../../src/browser/internal/cn.ts","../../src/browser/internal/el.ts","../../src/browser/surface/keys.ts","../../src/browser/internal/repositioner.ts","../../src/browser/surface/overlay.ts","../../src/browser/surface/theme.ts","../../src/browser/surface/shell.ts","../../src/browser/views/core/types.ts","../../src/browser/views/core/router.ts","../../src/browser/internal/dev.ts","../../src/browser/internal/lit.ts","../../src/browser/internal/lit-icon.ts","../../src/browser/views/primitives/chip.ts","../../src/browser/views/primitives/kind-icon.ts","../../src/browser/ui/cva.ts","../../src/browser/ui/badge.ts","../../src/browser/views/primitives/icon-tile.ts","../../src/browser/views/primitives/kind-chip.ts","../../src/browser/machines/scroll-area.ts","../../src/browser/machines/machine.ts","../../src/browser/machines/normalize.ts","../../src/browser/internal/apply-props.ts","../../src/browser/views/builder/spread-props.ts","../../src/browser/internal/arrow-nav.ts","../../src/browser/views/labels.ts","../../src/browser/ui/list-item.ts","../../src/browser/views/primitives/text.ts","../../src/browser/views/render/detail-actions.ts","../../src/browser/views/render/detail-sections.ts","../../src/browser/views/builder/filter.ts","../../src/browser/views/primitives/entity-presence.ts","../../src/browser/ui/kbd.ts","../../src/browser/views/primitives/row.ts","../../src/browser/views/primitives/entity-link.ts","../../src/browser/views/render/detail.ts","../../src/browser/views/render/list.ts","../../src/browser/views/render/list-controller.ts","../../src/browser/views/render/index.ts","../../src/browser/views/core/mount.ts","../../src/browser/views/core/shell.ts","../../src/browser/machines/menu.ts","../../src/browser/ui/menu.ts","../../src/browser/views/core/actions-popup.ts","../../src/browser/views/core/stack.ts","../../src/browser/views/built-in/ids.ts","../../src/browser/views/built-in/command-palette.ts","../../src/browser/views/builder/format-location.ts","../../src/browser/views/builder/page-context.ts","../../src/browser/internal/screenshot.ts","../../src/browser/report/capture.ts","../../src/browser/views/builder/resolve.ts","../../src/browser/views/builder/detail-builder.ts","../../src/browser/views/built-in/entity-detail.ts","../../src/browser/views/built-in/entity-kind-list.ts","../../src/browser/views/built-in/explore-page.ts","../../src/browser/views/built-in/flow-detail.ts","../../src/browser/views/built-in/flows.ts","../../src/browser/views/built-in/glossary.ts","../../src/browser/views/built-in/index.ts","../../src/browser/create-uidex.ts","../../src/integrations/react/hooks.ts","../../src/integrations/react/mount.tsx","../../src/integrations/react/create-react-view.tsx","../../src/integrations/react/kind-chip.tsx","../../src/integrations/react/devtools.tsx"],"sourcesContent":["\"use client\"\n\nexport { UidexProvider } from \"./provider\"\nexport type { UidexProviderProps } from \"./provider\"\nexport { useUidex, UidexContextError } from \"./hooks\"\nexport { UidexMount } from \"./mount\"\nexport type { UidexMountProps } from \"./mount\"\nexport { createReactView } from \"./create-react-view\"\nexport type { ReactViewDef } from \"./create-react-view\"\nexport { KindChip } from \"./kind-chip\"\nexport type { KindChipProps } from \"./kind-chip\"\nexport { UidexDevtools } from \"./devtools\"\nexport type { UidexDevtoolsProps } from \"./devtools\"\n","\"use client\"\n\nimport { createContext, useEffect, useState, type ReactNode } from \"react\"\nimport {\n createUidex,\n type CreateUidexOptions,\n type Uidex,\n} from \"../../browser/create-uidex\"\n\nexport const UidexContext = createContext<Uidex | null>(null)\n\nexport interface UidexProviderProps {\n /**\n * Pre-built uidex instance (e.g. the `uidex` export from `uidex.gen.ts`).\n * When provided, `config` is ignored.\n */\n instance?: Uidex\n config?: CreateUidexOptions\n children?: ReactNode\n}\n\nexport function UidexProvider({\n instance: externalInstance,\n config,\n children,\n}: UidexProviderProps) {\n const [owned] = useState<{ instance: Uidex } | null>(() => {\n if (externalInstance) return null\n return { instance: createUidex({ ...config }) }\n })\n\n // `owned` is created once (uncontrolled mode). If a caller renders controlled\n // (`instance` set) and later drops the prop, `owned` is null — fall back to\n // null so `useUidex` throws a clear UidexContextError rather than a raw\n // TypeError. Controlled/uncontrolled is not meant to be toggled at runtime.\n const instance = externalInstance ?? owned?.instance ?? null\n\n useEffect(() => {\n if (!owned) return\n return () => {\n owned.instance.unmount()\n }\n }, [owned])\n\n return (\n <UidexContext.Provider value={instance}>{children}</UidexContext.Provider>\n )\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\n/**\n * The four kinds every captured route is expected to render — the state-matrix\n * axis. A capture that only shoots the happy path leaves most of the value on\n * the table, so a missing core kind must be captured or ACKNOWLEDGED (see\n * `Metadata.acknowledge`).\n */\nexport const CORE_STATE_KINDS = [\n \"loading\",\n \"empty\",\n \"populated\",\n \"error\",\n] as const\nexport type CoreStateKind = (typeof CORE_STATE_KINDS)[number]\n/** `variant` is any state outside the matrix (a dialog, wizard step, multi-currency…). */\nexport type StateKind = CoreStateKind | \"variant\"\n\n/**\n * A declared render state of an entity — the \"story\"-like unit: a named\n * condition the page/feature/widget can render in (loading / empty / error /\n * multi-currency / …). Enumerated on the entity (not derived from syntax), it\n * is the contract the visual-states capture must satisfy and the anchor for\n * per-state acceptance criteria. Fixtures + capture mechanics stay in the spec;\n * the registry holds only the name (+ optional kind / per-state acceptance).\n */\nexport interface StateDecl {\n name: string\n /** Canonical kind for the state-matrix axis (defaults to `variant`). */\n kind?: StateKind\n /** Acceptance criteria that only this state can evidence. */\n acceptance?: string[]\n description?: 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 /** Declared render states (see StateDecl); the capture-completeness gate. */\n states?: StateDecl[]\n /**\n * The ONE way to say \"don't complain about this gap\": scope → typed reason.\n *\n * - scope `\"*\"` covers the whole entity (a redirect page that can never be\n * captured, a component whose states are not gated here);\n * - a core-kind scope covers that one cell of this page's route matrix.\n *\n * `type: \"impossible\"` is a permanent design statement and needs a `reason`;\n * `type: \"backlog\"` is debt and does not. Keeping both as values of one field\n * is what makes mislabeling debt as impossible a visible, reviewable edit.\n * `captured-elsewhere` is computed by the workspace and never authored here.\n */\n acknowledge?: Partial<Record<AcknowledgeScope, MetaAcknowledgment>>\n}\n\n/** Scope of an acknowledgment: one core kind, or the whole entity. */\nexport type AcknowledgeScope = CoreStateKind | \"*\"\n\nexport interface MetaAcknowledgment {\n type: \"impossible\" | \"backlog\"\n reason?: 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 FlowStep {\n entityId: string\n action?: string\n}\n\nexport interface Flow {\n kind: \"flow\"\n id: string\n loc: Location\n touches: string[]\n steps: FlowStep[]\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 ReportRecord {\n id: string\n entity?: string\n reporter?: { id?: string; email?: string; name?: string }\n title?: string\n body: string\n type: string\n severity: string\n status: string\n labels?: string[]\n url: string\n route?: string\n pageTitle?: string\n screenshot?: string\n createdAt: string\n}\n\nexport interface Registry {\n add(entity: Entity): void\n get<K extends EntityKind>(kind: K, id: string): EntityByKind<K> | undefined\n matchPattern<K extends EntityKind>(\n kind: K,\n id: string\n ): 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 setReports(\n kind: EntityKind,\n id: string,\n reports: readonly ReportRecord[]\n ): void\n getReports(kind: EntityKind, id: string): readonly ReportRecord[]\n listReportKeys(): readonly string[]\n closeReport?: (reportId: string, status?: string) => void | Promise<void>\n onReportsChange(cb: () => void): () => void\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 const patternCache = new Map<\n EntityKind,\n Array<{ segments: string[]; staticLength: number; entity: Entity }>\n >()\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 patternCache.delete(entity.kind)\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 interface PatternEntry<K extends EntityKind> {\n /** static parts of the key around `*` wildcards, e.g. \"a-*-b\" → [\"a-\", \"-b\"] */\n segments: string[]\n staticLength: number\n entity: EntityByKind<K>\n }\n\n const getPatternsForKind = <K extends EntityKind>(\n kind: K\n ): Array<PatternEntry<K>> => {\n const cached = patternCache.get(kind)\n if (cached !== undefined) return cached as Array<PatternEntry<K>>\n const patterns: Array<PatternEntry<K>> = []\n for (const [key, entity] of store[kind]) {\n if (key.includes(\"*\")) {\n const segments = key.split(\"*\")\n patterns.push({\n segments,\n staticLength: segments.reduce((n, s) => n + s.length, 0),\n entity: entity as EntityByKind<K>,\n })\n }\n }\n patternCache.set(\n kind,\n patterns as Array<{\n segments: string[]\n staticLength: number\n entity: Entity\n }>\n )\n return patterns\n }\n\n // First segment anchored at the start, last at the end, middles matched\n // left-to-right; each `*` matches any run of characters (including none).\n const matchesSegments = (segments: string[], id: string): boolean => {\n const first = segments[0]\n const last = segments[segments.length - 1]\n if (!id.startsWith(first)) return false\n let pos = first.length\n for (let i = 1; i < segments.length - 1; i++) {\n const idx = id.indexOf(segments[i], pos)\n if (idx === -1) return false\n pos = idx + segments[i].length\n }\n return id.endsWith(last) && id.length - last.length >= pos\n }\n\n const matchPattern = <K extends EntityKind>(\n kind: K,\n id: string\n ): EntityByKind<K> | undefined => {\n assertEntityKind(kind)\n const patterns = getPatternsForKind(kind)\n if (patterns.length === 0) return undefined\n let best: PatternEntry<K> | undefined\n for (const entry of patterns) {\n if (\n matchesSegments(entry.segments, id) &&\n (best === undefined || entry.staticLength > best.staticLength)\n ) {\n best = entry\n }\n }\n if (best === undefined) return undefined\n return freezeEntity(best.entity, 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 const reports = new Map<string, readonly ReportRecord[]>()\n const reportsCbs = new Set<() => void>()\n\n const setReports = (\n kind: EntityKind,\n id: string,\n records: readonly ReportRecord[]\n ): void => {\n reports.set(`${kind}:${id}`, records)\n for (const cb of reportsCbs) cb()\n }\n\n const getReports = (kind: EntityKind, id: string): readonly ReportRecord[] =>\n reports.get(`${kind}:${id}`) ?? []\n\n const listReportKeys = (): readonly string[] => Array.from(reports.keys())\n\n const onReportsChange = (cb: () => void): (() => void) => {\n reportsCbs.add(cb)\n return () => reportsCbs.delete(cb)\n }\n\n return {\n add,\n get,\n matchPattern,\n list,\n query,\n byScope,\n touchedBy,\n setReports,\n getReports,\n listReportKeys,\n onReportsChange,\n }\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-400\",\n chip: \"bg-blue-50 text-blue-700 inset-ring inset-ring-blue-700/10 group-data-hover:bg-blue-100 dark:bg-blue-400/10 dark:text-blue-400 dark:inset-ring-blue-400/30 dark:group-data-hover:bg-blue-400/20\",\n color: \"#60a5fa\",\n label: \"Route\",\n },\n page: {\n icon: FileText,\n tone: \"text-emerald-700 dark:text-emerald-400\",\n chip: \"bg-emerald-50 text-emerald-700 inset-ring inset-ring-emerald-600/20 group-data-hover:bg-emerald-100 dark:bg-emerald-400/10 dark:text-emerald-400 dark:inset-ring-emerald-500/20 dark:group-data-hover:bg-emerald-400/20\",\n color: \"#34d399\",\n label: \"Page\",\n },\n feature: {\n icon: Sparkles,\n tone: \"text-amber-700 dark:text-amber-500\",\n chip: \"bg-amber-50 text-amber-800 inset-ring inset-ring-amber-600/20 group-data-hover:bg-amber-100 dark:bg-amber-400/10 dark:text-amber-500 dark:inset-ring-amber-400/20 dark:group-data-hover:bg-amber-400/20\",\n color: \"#fbbf24\",\n label: \"Feature\",\n },\n widget: {\n icon: LayoutGrid,\n tone: \"text-violet-700 dark:text-violet-400\",\n chip: \"bg-violet-50 text-violet-700 inset-ring inset-ring-violet-700/10 group-data-hover:bg-violet-100 dark:bg-violet-400/10 dark:text-violet-400 dark:inset-ring-violet-400/30 dark:group-data-hover:bg-violet-400/20\",\n color: \"#a78bfa\",\n label: \"Widget\",\n },\n region: {\n icon: LayoutPanelTop,\n tone: \"text-cyan-700 dark:text-cyan-400\",\n chip: \"bg-cyan-50 text-cyan-700 inset-ring inset-ring-cyan-700/10 group-data-hover:bg-cyan-100 dark:bg-cyan-400/10 dark:text-cyan-400 dark:inset-ring-cyan-400/30 dark:group-data-hover:bg-cyan-400/20\",\n color: \"#22d3ee\",\n label: \"Region\",\n },\n element: {\n icon: MousePointerClick,\n tone: \"text-rose-700 dark:text-rose-400\",\n chip: \"bg-rose-50 text-rose-700 inset-ring inset-ring-rose-600/10 group-data-hover:bg-rose-100 dark:bg-rose-400/10 dark:text-rose-400 dark:inset-ring-rose-400/20 dark:group-data-hover:bg-rose-400/20\",\n color: \"#fb7185\",\n label: \"Element\",\n },\n primitive: {\n icon: Circle,\n tone: \"text-slate-600 dark:text-slate-400\",\n chip: \"bg-slate-50 text-slate-600 inset-ring inset-ring-slate-500/10 group-data-hover:bg-slate-100 dark:bg-slate-400/10 dark:text-slate-400 dark:inset-ring-slate-400/20 dark:group-data-hover:bg-slate-400/20\",\n color: \"#94a3b8\",\n label: \"Primitive\",\n },\n flow: {\n icon: Workflow,\n tone: \"text-fuchsia-700 dark:text-fuchsia-400\",\n chip: \"bg-fuchsia-50 text-fuchsia-700 inset-ring inset-ring-fuchsia-700/10 group-data-hover:bg-fuchsia-100 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:inset-ring-fuchsia-400/20 dark:group-data-hover:bg-fuchsia-400/20\",\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 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 { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport { type EntityRef } from \"../../shared/entities\"\nimport { createModeStore, type ModeStore } from \"./mode\"\nimport { createNavigationStore, type NavigationStore } from \"./navigation\"\nimport type {\n ResolvedTheme,\n SessionSnapshot,\n SessionState,\n ThemePreference,\n ViewStackEntry,\n} from \"./types\"\n\nexport interface HighlightContext {\n ref: EntityRef | null\n element: HTMLElement | null\n pinnedRef: EntityRef | null\n color: string | null\n}\n\nexport interface HighlightActions {\n hover(\n ref: EntityRef,\n element?: HTMLElement | null,\n color?: string | null\n ): void\n unhover(): void\n pin(ref?: EntityRef): void\n unpin(): void\n}\n\nexport type SessionStore = StoreApi<SessionState> & {\n readonly nav: NavigationStore\n readonly mode: ModeStore\n readonly highlight: HighlightActions\n setTheme(theme: ThemePreference, resolved?: ResolvedTheme): void\n}\n\nexport interface CreateSessionOptions extends Partial<SessionSnapshot> {\n detectTheme?: () => ResolvedTheme\n onMountInspector?: () => void\n onDestroyInspector?: () => void\n onShowOverlay?: (context: HighlightContext) => void\n onHideOverlay?: () => void\n onUpdateOverlay?: (context: HighlightContext) => void\n /** When true, start the session in inspector mode. */\n inspectorActive?: boolean\n}\n\nconst defaultSnapshot: SessionSnapshot = {\n stack: [],\n pinnedHighlight: null,\n mode: \"idle\",\n theme: \"auto\",\n resolvedTheme: \"light\",\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 HighlightMode = \"none\" | \"transient\" | \"pinned\"\n\nexport function createSession(\n options: CreateSessionOptions = {}\n): SessionStore {\n const {\n detectTheme,\n onMountInspector,\n onDestroyInspector,\n onShowOverlay,\n onHideOverlay,\n onUpdateOverlay,\n ...overrides\n } = 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 nav = createNavigationStore()\n const modeStore = createModeStore({\n nav,\n bindings: {\n mountInspector: onMountInspector,\n destroyInspector: onDestroyInspector,\n },\n })\n\n // --- Mutable highlight state ---\n let highlightMode: HighlightMode = \"none\"\n const hlCtx: HighlightContext = {\n ref: null,\n element: null,\n pinnedRef: null,\n color: null,\n }\n\n const highlightActions: HighlightActions = {\n hover(ref, element, color) {\n hlCtx.ref = ref\n hlCtx.element = element ?? null\n hlCtx.color = color ?? null\n if (highlightMode === \"none\") {\n highlightMode = \"transient\"\n onShowOverlay?.(hlCtx)\n } else if (highlightMode === \"transient\") {\n onUpdateOverlay?.(hlCtx)\n }\n },\n\n unhover() {\n if (highlightMode === \"transient\") {\n highlightMode = \"none\"\n hlCtx.ref = null\n hlCtx.element = null\n hlCtx.color = null\n onHideOverlay?.()\n }\n },\n\n pin(ref) {\n const pinRef = ref ?? hlCtx.ref\n hlCtx.pinnedRef = pinRef\n if (highlightMode === \"none\") {\n hlCtx.ref = pinRef\n }\n if (highlightMode !== \"pinned\") {\n highlightMode = \"pinned\"\n onShowOverlay?.(hlCtx)\n }\n store.setState({ pinnedHighlight: hlCtx.pinnedRef })\n },\n\n unpin() {\n if (highlightMode === \"pinned\") {\n highlightMode = \"none\"\n hlCtx.ref = null\n hlCtx.element = null\n hlCtx.pinnedRef = null\n hlCtx.color = null\n onHideOverlay?.()\n }\n store.setState({ pinnedHighlight: null })\n },\n }\n\n // --- Create Zustand store ---\n const store = createStore<SessionState>(() => ({\n ...defaultSnapshot,\n stack: [],\n pinnedHighlight: null,\n mode: \"idle\",\n theme: initialPref,\n resolvedTheme: initialResolved,\n }))\n\n // --- Auto-sync sub-stores → session store ---\n nav.subscribe(() => {\n const { stack } = nav.getState()\n if (store.getState().stack !== stack) {\n store.setState({ stack })\n }\n })\n\n modeStore.subscribe(() => {\n const { mode } = modeStore.getState()\n if (store.getState().mode !== mode) {\n store.setState({ mode })\n }\n })\n\n // --- Build session object ---\n const session = store as SessionStore\n ;(session as { nav: NavigationStore }).nav = nav\n ;(session as { mode: ModeStore }).mode = modeStore\n ;(session as { highlight: HighlightActions }).highlight = highlightActions\n\n session.setTheme = (theme, resolved) => {\n const state = store.getState()\n const nextResolved = resolved ?? resolveTheme(theme, detectTheme)\n if (state.theme === theme && state.resolvedTheme === nextResolved) return\n store.setState({ theme, resolvedTheme: nextResolved })\n }\n\n // --- Hydrate initial state ---\n if (initialStack.length > 0) {\n modeStore.transition.openPalette()\n for (let i = 1; i < initialStack.length; i++) {\n modeStore.transition.pushView(initialStack[i])\n }\n } else if (overrides.inspectorActive) {\n modeStore.transition.openInspector()\n }\n if (overrides.pinnedHighlight) {\n highlightActions.pin(overrides.pinnedHighlight)\n }\n\n return session\n}\n","import { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport type { NavigationStore } from \"./navigation\"\nimport type { ViewStackEntry } from \"./types\"\n\nexport type SurfaceMode = \"idle\" | \"inspecting\" | \"palette\" | \"viewing\"\n\nexport interface ModeSnapshot {\n mode: SurfaceMode\n}\n\nexport interface ModeBindings {\n mountInspector?: () => void\n destroyInspector?: () => void\n}\n\nexport interface ModeTransitions {\n openPalette(): void\n openInspector(): void\n closeInspector(): void\n toggleInspector(): void\n enterViewing(initialStack: ViewStackEntry[]): void\n dismiss(): void\n popOrTransition(): void\n pushView(entry: ViewStackEntry): void\n}\n\nexport type ModeStore = StoreApi<ModeSnapshot> & {\n transition: ModeTransitions\n}\n\nexport interface CreateModeStoreOptions {\n nav: NavigationStore\n bindings?: ModeBindings\n}\n\nconst COMMAND_PALETTE_ENTRY: ViewStackEntry = {\n id: \"command-palette\",\n ref: null,\n}\n\nexport function createModeStore(options: CreateModeStoreOptions): ModeStore {\n const { nav, bindings } = options\n\n const store = createStore<ModeSnapshot>(() => ({\n mode: \"idle\",\n }))\n\n const transition: ModeTransitions = {\n openPalette() {\n const prev = store.getState()\n if (prev.mode === \"inspecting\") {\n bindings?.destroyInspector?.()\n }\n nav.nav.reset([COMMAND_PALETTE_ENTRY])\n store.setState({ mode: \"palette\" })\n },\n\n openInspector() {\n bindings?.mountInspector?.()\n nav.nav.clear()\n store.setState({ mode: \"inspecting\" })\n },\n\n closeInspector() {\n bindings?.destroyInspector?.()\n nav.nav.clear()\n store.setState({ mode: \"idle\" })\n },\n\n toggleInspector() {\n if (store.getState().mode === \"inspecting\") {\n transition.closeInspector()\n } else {\n transition.openInspector()\n }\n },\n\n enterViewing(initialStack) {\n const prev = store.getState()\n if (prev.mode === \"inspecting\") {\n bindings?.destroyInspector?.()\n }\n nav.nav.reset(initialStack)\n store.setState({ mode: \"viewing\" })\n },\n\n dismiss() {\n const prev = store.getState()\n if (prev.mode === \"inspecting\") {\n bindings?.destroyInspector?.()\n }\n nav.nav.clear()\n store.setState({ mode: \"idle\" })\n },\n\n popOrTransition() {\n const { stack } = nav.getState()\n if (stack.length > 2) {\n nav.nav.pop()\n } else if (stack.length === 2 && stack[0]?.id === \"command-palette\") {\n nav.nav.reset([COMMAND_PALETTE_ENTRY])\n store.setState({ mode: \"palette\" })\n } else if (stack.length === 2) {\n nav.nav.pop()\n } else {\n nav.nav.clear()\n store.setState({ mode: \"idle\" })\n }\n },\n\n pushView(entry) {\n const { mode } = store.getState()\n const { stack } = nav.getState()\n\n if (entry.id === \"command-palette\" && stack.length === 0) {\n transition.openPalette()\n return\n }\n\n switch (mode) {\n case \"idle\":\n transition.enterViewing([entry])\n break\n case \"inspecting\":\n bindings?.destroyInspector?.()\n nav.nav.reset([entry])\n store.setState({ mode: \"viewing\" })\n break\n case \"palette\":\n case \"viewing\":\n nav.nav.push(entry)\n if (mode === \"palette\") {\n store.setState({ mode: \"viewing\" })\n }\n break\n }\n },\n }\n\n const modeStore = store as ModeStore\n modeStore.transition = transition\n return modeStore\n}\n","import { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport type { ViewStackEntry } from \"./types\"\n\nexport interface NavigationState {\n stack: ViewStackEntry[]\n}\n\nexport interface NavigationActions {\n push(entry: ViewStackEntry): void\n pop(): void\n clear(): void\n reset(stack: ViewStackEntry[]): void\n}\n\nexport type NavigationStore = StoreApi<NavigationState> & {\n nav: NavigationActions\n}\n\nexport function createNavigationStore(): NavigationStore {\n const store = createStore<NavigationState>(() => ({\n stack: [],\n }))\n\n const nav: NavigationActions = {\n push(entry) {\n store.setState({ stack: [...store.getState().stack, entry] })\n },\n pop() {\n const s = store.getState().stack\n if (s.length <= 1) {\n store.setState({ stack: [] })\n } else {\n store.setState({ stack: s.slice(0, -1) })\n }\n },\n clear() {\n store.setState({ stack: [] })\n },\n reset(stack) {\n store.setState({ stack })\n },\n }\n\n const navStore = store as NavigationStore\n navStore.nav = nav\n return navStore\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-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\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-600: oklch(66.6% 0.179 58.318);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-amber-800: oklch(47.3% 0.137 46.201);\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\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-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-cyan-50: oklch(98.4% 0.019 200.873);\n --color-cyan-100: oklch(95.6% 0.045 203.388);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\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-50: oklch(96.9% 0.016 293.756);\n --color-violet-100: oklch(94.3% 0.029 294.588);\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-50: oklch(97.7% 0.017 320.058);\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\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-tight: -0.025em;\n --tracking-widest: 0.1em;\n --leading-relaxed: 1.625;\n --radius-lg: var(--radius);\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 .\\!visible {\n visibility: visible !important;\n }\n .collapse {\n visibility: collapse;\n }\n .invisible {\n visibility: hidden;\n }\n .visible {\n visibility: visible;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\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 .z-1 {\n z-index: 1;\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 .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-flex {\n display: inline-flex;\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-full {\n height: 100%;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-8 {\n min-height: calc(var(--spacing) * 8);\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-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\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 {\n flex-shrink: 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-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 .flex-col {\n flex-direction: column;\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 .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 .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-full {\n border-radius: calc(infinity * 1px);\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-xl {\n border-radius: calc(var(--radius) * 1.4);\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-amber-500\\/40 {\n border-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 40%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-amber-500) 40%, transparent);\n }\n }\n .border-border {\n border-color: var(--border);\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-info\\/40 {\n border-color: var(--info);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--info) 40%, transparent);\n }\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-50 {\n background-color: var(--color-amber-50);\n }\n .bg-amber-500\\/15 {\n background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-500) 15%, 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-50 {\n background-color: var(--color-blue-50);\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-cyan-50 {\n background-color: var(--color-cyan-50);\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-50 {\n background-color: var(--color-emerald-50);\n }\n .bg-fuchsia-50 {\n background-color: var(--color-fuchsia-50);\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-info\\/15 {\n background-color: var(--info);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--info) 15%, 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-50 {\n background-color: var(--color-rose-50);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-slate-50 {\n background-color: var(--color-slate-50);\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-50 {\n background-color: var(--color-violet-50);\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 .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-1\\.5 {\n padding: calc(var(--spacing) * 1.5);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\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 .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-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 .pt-2 {\n padding-top: calc(var(--spacing) * 2);\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-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 .text-\\[11px\\] {\n font-size: 11px;\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-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\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-600 {\n color: var(--color-amber-600);\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-amber-800 {\n color: var(--color-amber-800);\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-600 {\n color: var(--color-slate-600);\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 .ordinal {\n --tw-ordinal: ordinal;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .line-through {\n text-decoration-line: line-through;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .accent-accent {\n accent-color: var(--accent);\n }\n .opacity-50 {\n opacity: 50%;\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-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 .inset-ring {\n --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-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 .inset-ring-amber-600\\/20 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(66.6% 0.179 58.318) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-600) 20%, transparent);\n }\n }\n .inset-ring-blue-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(48.8% 0.243 264.376) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-700) 10%, transparent);\n }\n }\n .inset-ring-cyan-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(52% 0.105 223.128) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-700) 10%, transparent);\n }\n }\n .inset-ring-emerald-600\\/20 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(59.6% 0.145 163.225) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-600) 20%, transparent);\n }\n }\n .inset-ring-fuchsia-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(51.8% 0.253 323.949) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-700) 10%, transparent);\n }\n }\n .inset-ring-rose-600\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(58.6% 0.253 17.585) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-600) 10%, transparent);\n }\n }\n .inset-ring-slate-500\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(55.4% 0.046 257.417) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-500) 10%, transparent);\n }\n }\n .inset-ring-violet-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(49.1% 0.27 292.581) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-700) 10%, transparent);\n }\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\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 *, :host(.dark) *)) {\n background-clip: padding-box;\n }\n }\n .group-data-hover\\:bg-amber-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-amber-100);\n }\n }\n .group-data-hover\\:bg-blue-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-blue-100);\n }\n }\n .group-data-hover\\:bg-cyan-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-cyan-100);\n }\n }\n .group-data-hover\\:bg-emerald-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-emerald-100);\n }\n }\n .group-data-hover\\:bg-fuchsia-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-fuchsia-100);\n }\n }\n .group-data-hover\\:bg-rose-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-rose-100);\n }\n }\n .group-data-hover\\:bg-slate-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-slate-100);\n }\n }\n .group-data-hover\\:bg-violet-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-violet-100);\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-\\[calc\\(var\\(--radius-lg\\)-1px\\)\\] {\n &::before {\n content: var(--tw-content);\n border-radius: calc(var(--radius-lg) - 1px);\n }\n }\n .before\\:rounded-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {\n &::before {\n content: var(--tw-content);\n border-radius: calc(var(--radius-xl) - 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 .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-amber-500\\/20 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-500) 20%, transparent);\n }\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-info\\/20 {\n &:hover {\n @media (hover: hover) {\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 }\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\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\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-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\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\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .disabled\\:opacity-60 {\n &:disabled {\n opacity: 60%;\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\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 .dark\\:bg-amber-400\\/10 {\n &:is(.dark *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-amber-400);\n }\n }\n .dark\\:text-amber-500 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-amber-500);\n }\n }\n .dark\\:text-blue-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-blue-400);\n }\n }\n .dark\\:text-cyan-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-cyan-400);\n }\n }\n .dark\\:text-emerald-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-emerald-400);\n }\n }\n .dark\\:text-fuchsia-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-fuchsia-400);\n }\n }\n .dark\\:text-rose-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-rose-400);\n }\n }\n .dark\\:text-slate-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-slate-400);\n }\n }\n .dark\\:text-violet-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-violet-400);\n }\n }\n .dark\\:inset-ring-amber-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-blue-400\\/30 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);\n }\n }\n }\n .dark\\:inset-ring-cyan-400\\/30 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);\n }\n }\n }\n .dark\\:inset-ring-emerald-500\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-fuchsia-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-rose-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-slate-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-violet-400\\/30 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);\n }\n }\n }\n .dark\\:group-data-hover\\:bg-amber-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-blue-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-cyan-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-emerald-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-fuchsia-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-rose-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-slate-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-violet-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:before\\:shadow-\\[0_-1px_--theme\\(--color-white\\/6\\%\\)\\] {\n &:is(.dark *, :host(.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 .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:bg-accent {\n [data-kbd-nav] & {\n &:focus-within {\n background-color: var(--accent);\n }\n }\n }\n .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:text-accent-foreground {\n [data-kbd-nav] & {\n &:focus-within {\n color: var(--accent-foreground);\n }\n }\n }\n .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:bg-accent {\n [data-kbd-nav] & {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:text-accent-foreground {\n [data-kbd-nav] & {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n }\n}\n@layer base {\n *, ::after, ::before {\n border-color: var(--color-border, currentColor);\n }\n}\n@layer components {\n [data-highlighted] {\n background-color: var(--accent);\n color: var(--accent-foreground);\n transition: background-color 150ms ease-out;\n }\n [data-kbd-nav] [data-highlighted]:not([data-kbd-highlighted]) {\n background-color: transparent;\n color: inherit;\n }\n [data-kbd-highlighted] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in srgb, var(--accent) 200%, transparent);\n }\n color: var(--accent-foreground);\n }\n .uidex-item-interactive:hover {\n background-color: var(--accent);\n color: var(--accent-foreground);\n }\n [data-kbd-nav] .uidex-item-interactive:hover:not(:focus):not(:focus-within) {\n background-color: transparent;\n color: inherit;\n }\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@keyframes skeleton {\n to {\n background-position: -200% 0;\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-ordinal {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-slashed-zero {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-figure {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-spacing {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-fraction {\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-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: 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\"\n\nexport const Z_BASE = 2147483630\nexport const Z_OVERLAY = 2147483635\nexport const Z_CHROME = 2147483645\n\nexport const SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS}`\n\nimport type { EntityKind } from \"../../shared/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\n/** Entity kinds whose presence is backed by a DOM attribute (resolvable to a live element). */\nexport const DOM_BACKED_KINDS: ReadonlySet<EntityKind> = new Set([\n \"element\",\n \"region\",\n \"widget\",\n \"primitive\",\n])\n","import type { ResolvedTheme } from \"../session\"\nimport builtinCss from \"../styles/tailwind.built.css\"\nimport { SURFACE_HOST_CLASS, Z_BASE, Z_CHROME } 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.position = \"relative\"\n chromeEl.style.zIndex = String(Z_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 \"../../shared/entities\"\nimport { Z_CHROME } from \"./constants\"\n\nconst DEFAULT_TOOLTIP_COLOR = \"#34d399\"\nconst TOOLTIP_OFFSET = 16\nconst ARROW_SIZE = 5\n\nexport type CursorTooltipContent =\n | {\n entity: Entity\n node?: Element | null\n layer?: { index: number; total: number }\n }\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}\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(\"#a1a1aa\")\n el.style.opacity = \"0.6\"\n body.append(document.createTextNode(currentContent))\n return\n }\n if (!currentContent) return\n el.style.opacity = \"1\"\n const { entity, node } = currentContent\n const style = KIND_STYLE[entity.kind]\n const demoted = entity.kind === \"primitive\"\n applyColor(style?.color ?? DEFAULT_TOOLTIP_COLOR)\n if (demoted) el.style.opacity = \"0.55\"\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 if (currentContent.layer) {\n const counter = document.createElement(\"span\")\n counter.setAttribute(\"data-uidex-cursor-tooltip-layer\", \"\")\n counter.style.fontFamily =\n \"ui-monospace, SFMono-Regular, Menlo, monospace\"\n counter.style.fontSize = \"10px\"\n counter.style.lineHeight = \"1\"\n counter.style.padding = \"2px 5px\"\n counter.style.borderRadius = \"4px\"\n counter.style.background = \"rgba(0,0,0,0.18)\"\n counter.textContent = `${currentContent.layer.index + 1}/${currentContent.layer.total}`\n body.append(counter)\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 \"../../shared/entities\"\nimport type { Registry } from \"../../shared/entities\"\nimport type { SessionStore } from \"../session\"\nimport { SURFACE_IGNORE_SELECTOR, UIDEX_ATTR_TO_KIND } from \"./constants\"\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 InspectorMatchStack {\n matches: InspectorMatch[]\n index: number\n current: InspectorMatch\n}\n\nexport interface InspectorOptions {\n session: SessionStore\n registry?: Registry\n resolveAll?: (target: Element) => InspectorMatch[]\n onHover?: (\n stack: InspectorMatchStack | null,\n cursor: { x: number; y: number } | null\n ) => void\n onSelect?: (match: InspectorMatch, cursor: { x: number; y: number }) => void\n onCycle?: (\n stack: InspectorMatchStack,\n cursor: { x: number; y: number }\n ) => void\n /** Fired when the cursor enters an iframe or otherwise leaves the inspectable document. */\n onObscured?: (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 =\n registry.get(ref.kind, ref.id) ??\n registry.matchPattern?.(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 {\n kind: \"flow\",\n id: ref.id,\n loc: { file: \"\" },\n touches: [],\n steps: [],\n }\n }\n return { kind: ref.kind, id: ref.id }\n}\n\nexport function defaultResolveAllMatches(\n target: Element,\n registry?: Registry\n): InspectorMatch[] {\n if (target.closest(SURFACE_IGNORE_SELECTOR)) return []\n const semantic: InspectorMatch[] = []\n const primitives: InspectorMatch[] = []\n const seen = new Set<string>()\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 key = `${kind}:${id}`\n if (!seen.has(key)) {\n seen.add(key)\n const ref: EntityRef = { kind, id }\n const entity = entityForRef(ref, registry)\n const match: InspectorMatch = {\n element: node,\n ref,\n entity,\n label: displayName(entity, node),\n }\n if (kind === \"primitive\") {\n primitives.push(match)\n } else {\n semantic.push(match)\n }\n }\n }\n }\n }\n node = node.parentElement\n }\n return semantic.concat(primitives)\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 function createInspector(options: InspectorOptions): Inspector {\n const {\n session,\n registry,\n resolveAll = (target) => defaultResolveAllMatches(target, registry),\n onHover,\n onSelect,\n onCycle,\n onObscured,\n } = options\n\n let mounted = false\n let currentEl: HTMLElement | null = null\n let cursorStyleEl: HTMLStyleElement | null = null\n let stack: InspectorMatch[] = []\n let layerIndex = 0\n let lastCursor: { x: number; y: number } = { x: 0, y: 0 }\n\n const makeStack = (): InspectorMatchStack | null =>\n stack.length > 0\n ? { matches: stack, index: layerIndex, current: stack[layerIndex] }\n : null\n\n const onDocumentLeave = (): void => {\n currentEl = null\n stack = []\n layerIndex = 0\n session.highlight.unhover()\n onObscured?.(lastCursor)\n }\n\n const onMouseMove = (e: MouseEvent): void => {\n if (!(e.target instanceof Element)) return\n const matches = resolveAll(e.target)\n const cursor = { x: e.clientX, y: e.clientY }\n lastCursor = cursor\n const topEl = matches.length > 0 ? matches[0].element : null\n if (topEl) {\n if (topEl !== currentEl) {\n currentEl = topEl\n stack = matches\n layerIndex = 0\n session.highlight.hover(stack[0].ref)\n }\n onHover?.(makeStack(), cursor)\n } else if (currentEl) {\n currentEl = null\n stack = []\n layerIndex = 0\n session.highlight.unhover()\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 if (stack.length === 0) return\n e.preventDefault()\n e.stopPropagation()\n const match = stack[layerIndex]\n onSelect?.(match, { x: e.clientX, y: e.clientY })\n }\n\n const onContextMenu = (e: MouseEvent): void => {\n if (stack.length <= 1) return\n e.preventDefault()\n e.stopPropagation()\n layerIndex = (layerIndex + 1) % stack.length\n const match = stack[layerIndex]\n session.highlight.hover(match.ref)\n onCycle?.(makeStack()!, lastCursor)\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(\"mouseleave\", onDocumentLeave)\n document.addEventListener(\"click\", onClick, true)\n document.addEventListener(\"contextmenu\", onContextMenu, true)\n },\n destroy() {\n if (!mounted) return\n mounted = false\n currentEl = null\n stack = []\n layerIndex = 0\n if (cursorStyleEl) {\n cursorStyleEl.remove()\n cursorStyleEl = null\n }\n document.removeEventListener(\"mousemove\", onMouseMove)\n document.removeEventListener(\"mouseleave\", onDocumentLeave)\n document.removeEventListener(\"click\", onClick, true)\n document.removeEventListener(\"contextmenu\", onContextMenu, true)\n session.highlight.unhover()\n onHover?.(null, null)\n },\n }\n}\n","import {\n Command,\n Highlighter,\n MousePointerClick,\n createElement as createLucideElement,\n} from \"lucide\"\nimport { cn } from \"../internal/cn\"\nimport { el } from \"../internal/el\"\nimport type { SessionStore } from \"../session\"\nimport { Z_CHROME } from \"./constants\"\nimport { INSPECT_SHORTCUT, formatShortcutLabel } from \"./keys\"\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\nconst ROOT_CLASS =\n \"inline-flex items-center gap-1.5 rounded-xl border border-border bg-popover p-1.5 font-sans text-xs text-popover-foreground shadow-lg/5 select-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:bg-muted/72 before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\"\n\nconst BUTTON_CLASS =\n \"relative z-1 inline-flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent 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 BUTTON_ACTIVE_CLASS =\n \"border-info/40 bg-info/15 text-info-foreground hover:bg-info/20\"\n\nconst TITLE_CLASS =\n \"relative z-1 whitespace-nowrap px-1.5 text-xs font-semibold tracking-tight text-foreground\"\n\nconst BUTTON_HIGHLIGHT_ACTIVE_CLASS =\n \"border-amber-500/40 bg-amber-500/15 text-amber-600 hover:bg-amber-500/20 dark:text-amber-400\"\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 = el(\"div\", {\n class: ROOT_CLASS,\n attrs: {\n \"data-uidex-menubar\": \"\",\n role: \"toolbar\",\n },\n style: {\n position: \"fixed\",\n zIndex: String(Z_CHROME),\n pointerEvents: \"auto\",\n cursor: \"grab\",\n },\n })\n\n let titleEl: HTMLElement | null = null\n if (appTitle) {\n titleEl = el(\"span\", {\n class: TITLE_CLASS,\n attrs: { \"data-uidex-menubar-title\": \"\" },\n text: appTitle,\n })\n root.appendChild(titleEl)\n }\n\n const highlightIcon = createLucideElement(Highlighter)\n highlightIcon.setAttribute(\"class\", \"size-3.5\")\n highlightIcon.setAttribute(\"aria-hidden\", \"true\")\n const highlightBtn = el(\n \"button\",\n {\n class: BUTTON_CLASS,\n attrs: {\n type: \"button\",\n \"data-uidex-menubar-highlight\": \"\",\n \"aria-label\": \"Dismiss highlight\",\n },\n },\n highlightIcon\n )\n highlightBtn.hidden = true\n highlightBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n session.highlight.unpin()\n })\n root.appendChild(highlightBtn)\n\n const inspectIcon = createLucideElement(MousePointerClick)\n inspectIcon.setAttribute(\"class\", \"size-3.5\")\n inspectIcon.setAttribute(\"aria-hidden\", \"true\")\n const inspectBtn = el(\n \"button\",\n {\n class: BUTTON_CLASS,\n attrs: {\n type: \"button\",\n \"data-uidex-menubar-inspect\": \"\",\n \"aria-label\": `Inspect (${formatShortcutLabel(INSPECT_SHORTCUT)})`,\n },\n },\n inspectIcon\n )\n inspectBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n session.mode.transition.toggleInspector()\n inspectBtn.blur()\n })\n root.appendChild(inspectBtn)\n\n const paletteIcon = createLucideElement(Command)\n paletteIcon.setAttribute(\"class\", \"size-3.5\")\n paletteIcon.setAttribute(\"aria-hidden\", \"true\")\n const paletteBtn = el(\n \"button\",\n {\n class: BUTTON_CLASS,\n attrs: {\n type: \"button\",\n \"data-uidex-menubar-palette\": \"\",\n \"aria-label\": \"Command palette\",\n },\n },\n paletteIcon\n )\n paletteBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n if (session.getState().stack.length > 0) {\n session.mode.transition.dismiss()\n } else {\n session.mode.transition.openPalette()\n }\n paletteBtn.blur()\n })\n root.appendChild(paletteBtn)\n container.appendChild(root)\n\n const syncButtonStates = (): void => {\n const state = session.getState()\n\n const inspectActive = state.mode === \"inspecting\"\n inspectBtn.setAttribute(\n \"data-uidex-menubar-inspect-active\",\n inspectActive ? \"true\" : \"false\"\n )\n inspectBtn.className = cn(\n BUTTON_CLASS,\n inspectActive && BUTTON_ACTIVE_CLASS\n )\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 paletteBtn.className = cn(BUTTON_CLASS, paletteOpen && BUTTON_ACTIVE_CLASS)\n\n const highlightActive = state.pinnedHighlight !== null\n highlightBtn.setAttribute(\n \"data-uidex-menubar-highlight-active\",\n highlightActive ? \"true\" : \"false\"\n )\n highlightBtn.className = cn(\n BUTTON_CLASS,\n highlightActive && BUTTON_HIGHLIGHT_ACTIVE_CLASS\n )\n highlightBtn.hidden = !highlightActive\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 { 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 { SessionStore } from \"../session\"\nimport type { ActionsPopupHandle } from \"../views/core/actions-popup\"\n\nexport interface PaletteShortcut {\n /** The key value (e.g. \"k\", \"j\", \";\"). Matched case-insensitively. */\n key: string\n /** Require Cmd (Mac) / Ctrl (Win/Linux). Default: true. */\n mod?: boolean\n /** Require Shift. Default: false. */\n shift?: boolean\n}\n\nconst DEFAULT_SHORTCUT: PaletteShortcut = { key: \"k\" }\n\nexport const ACTIONS_SHORTCUT: PaletteShortcut = { key: \"j\" }\n\nexport const INSPECT_SHORTCUT: PaletteShortcut = { key: \"i\" }\n\nexport function formatShortcutLabel(shortcut: PaletteShortcut): string {\n const parts: string[] = []\n if (shortcut.mod !== false) parts.push(\"⌘\")\n if (shortcut.shift) parts.push(\"⇧\")\n parts.push(shortcut.key.toUpperCase())\n return parts.join(\"\")\n}\n\nfunction matchesShortcut(e: KeyboardEvent, shortcut: PaletteShortcut): boolean {\n const wantMod = shortcut.mod !== false\n const wantShift = shortcut.shift === true\n const hasMod = e.metaKey || e.ctrlKey\n return (\n hasMod === wantMod &&\n e.shiftKey === wantShift &&\n !e.altKey &&\n e.key.toLowerCase() === shortcut.key.toLowerCase()\n )\n}\n\nexport interface KeyBindingHandle {\n destroy(): void\n}\n\nexport interface BindShadowKeysOptions {\n shadowRoot: ShadowRoot\n session: SessionStore\n getActionsPopup: () => ActionsPopupHandle | null\n shortcut?: PaletteShortcut\n}\n\nexport function bindShadowKeys(\n options: BindShadowKeysOptions\n): KeyBindingHandle {\n const { shadowRoot, session, getActionsPopup } = options\n const shortcut = options.shortcut ?? DEFAULT_SHORTCUT\n\n const onKeydown = (e: KeyboardEvent): void => {\n const isMod = e.metaKey || e.ctrlKey\n const isCmdK = matchesShortcut(e, shortcut)\n const isCmdDot = matchesShortcut(e, ACTIONS_SHORTCUT)\n const isCmdI = matchesShortcut(e, INSPECT_SHORTCUT)\n const isCmdBracket = isMod && !e.altKey && !e.shiftKey && e.key === \"[\"\n const isEsc = e.key === \"Escape\"\n const isPopKey = isEsc || isCmdBracket\n if (!isCmdK && !isCmdDot && !isCmdI && !isPopKey) return\n\n const popup = getActionsPopup()\n if (popup?.isOpen()) {\n if (isPopKey || isCmdK || isCmdDot) {\n popup.close()\n e.preventDefault()\n e.stopPropagation()\n }\n return\n }\n\n if (isCmdDot) {\n if (popup) {\n e.preventDefault()\n e.stopPropagation()\n popup.open()\n }\n return\n }\n\n if (isCmdI) {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.toggleInspector()\n return\n }\n\n if (isCmdK) {\n e.preventDefault()\n e.stopPropagation()\n const { mode } = session.mode.getState()\n if (session.nav.getState().stack.length === 0) {\n session.mode.transition.openPalette()\n } else if (mode === \"palette\") {\n if (popup) {\n popup.open()\n } else {\n session.mode.transition.dismiss()\n }\n }\n return\n }\n\n const { mode } = session.mode.getState()\n if (mode === \"viewing\") {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.popOrTransition()\n } else if (mode === \"inspecting\") {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.closeInspector()\n } else if (mode === \"palette\") {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.dismiss()\n } else if (session.getState().pinnedHighlight !== null) {\n e.preventDefault()\n e.stopPropagation()\n session.highlight.unpin()\n }\n }\n\n const doc = shadowRoot.ownerDocument\n doc.addEventListener(\"keydown\", onKeydown, { capture: true })\n shadowRoot.addEventListener(\"keydown\", onKeydown as EventListener, {\n capture: true,\n })\n\n return {\n destroy() {\n doc.removeEventListener(\"keydown\", onKeydown, { capture: true })\n shadowRoot.removeEventListener(\n \"keydown\",\n onKeydown as EventListener,\n {\n capture: true,\n } as EventListenerOptions\n )\n },\n }\n}\n","export interface Repositioner {\n /** Coalesce a reflow into the next animation frame (idempotent until it fires). */\n schedule(): void\n /** Cancel a pending reflow frame, if any. */\n cancel(): void\n /** Start listening for capturing `scroll` and `resize` events on `window`. */\n attach(): void\n /** Stop listening and cancel any pending reflow frame. */\n detach(): void\n}\n\n/**\n * Shared scroll/resize repositioner. Listens for capturing `scroll` and\n * `resize` events on `window` and coalesces reflows into a single\n * `requestAnimationFrame` (falling back to `setTimeout(…, 0)` where rAF is\n * unavailable). `attach`/`detach` are idempotent; `detach` cancels any pending\n * frame.\n */\nexport function createRepositioner(onReflow: () => void): Repositioner {\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 onReflow()\n })\n : (setTimeout(() => {\n rafId = null\n onReflow()\n }, 0) as unknown as number)\n }\n\n const cancel = (): 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 cancel()\n }\n\n return { schedule, cancel, attach, detach }\n}\n","import { createRepositioner } from \"../internal/repositioner\"\nimport { 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 backdrop?: boolean\n}\n\nexport interface Overlay {\n show(target: Element, options?: OverlayShowOptions): void\n hide(): void\n destroy(): void\n onDismiss: (() => void) | null\n readonly isVisible: boolean\n}\n\ninterface OverlayDeps {\n container: Element | ShadowRoot\n}\n\nconst DEFAULT_COLOR = \"#34d399\"\nconst DEFAULT_BORDER_WIDTH = 2\nconst DEFAULT_FILL_OPACITY = 0.08\nconst BACKDROP_OPACITY = 0.45\n\nexport function createOverlay(deps: OverlayDeps): Overlay {\n const { container } = deps\n\n const backdrop = document.createElement(\"div\")\n backdrop.setAttribute(\"data-uidex-overlay-backdrop\", \"\")\n backdrop.style.position = \"fixed\"\n backdrop.style.inset = \"0\"\n backdrop.style.zIndex = String(Z_OVERLAY)\n backdrop.style.backgroundColor = `rgba(0, 0, 0, ${BACKDROP_OPACITY})`\n backdrop.style.opacity = \"0\"\n backdrop.style.visibility = \"hidden\"\n backdrop.style.transition = \"opacity 150ms ease-out\"\n backdrop.style.pointerEvents = \"auto\"\n backdrop.style.cursor = \"default\"\n backdrop.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n overlay.onDismiss?.()\n })\n container.appendChild(backdrop)\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 + 1)\n box.style.boxSizing = \"border-box\"\n box.style.opacity = \"0\"\n box.style.transition = \"opacity 150ms ease-out\"\n box.style.visibility = \"hidden\"\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.addEventListener(\"transitionend\", () => {\n if (box.style.opacity === \"0\") {\n box.style.visibility = \"hidden\"\n }\n })\n backdrop.addEventListener(\"transitionend\", () => {\n if (backdrop.style.opacity === \"0\") {\n backdrop.style.visibility = \"hidden\"\n backdrop.style.clipPath = \"\"\n }\n })\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 backdrop: false,\n }\n\n const repositioner = createRepositioner(() => updatePosition())\n\n function updatePosition(): void {\n if (!target) return\n const rect = target.getBoundingClientRect()\n const pad = opts.padding\n const top = rect.top - pad\n const left = rect.left - pad\n const w = rect.width + pad * 2\n const h = rect.height + pad * 2\n box.style.top = `${top}px`\n box.style.left = `${left}px`\n box.style.width = `${w}px`\n box.style.height = `${h}px`\n\n if (opts.backdrop) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n backdrop.style.clipPath = cutoutPath(vw, vh, left, top, w, h)\n }\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 box.style.borderRadius = \"6px\"\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 if (opts.backdrop) {\n backdrop.style.visibility = \"visible\"\n backdrop.style.opacity = \"1\"\n } else {\n backdrop.style.opacity = \"0\"\n backdrop.style.visibility = \"hidden\"\n backdrop.style.clipPath = \"\"\n }\n }\n\n const overlay: Overlay = {\n onDismiss: null,\n show(nextTarget, showOpts) {\n const wasVisible = target !== null\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 backdrop: showOpts?.backdrop ?? false,\n }\n applyStyles()\n updatePosition()\n if (!wasVisible) {\n box.style.opacity = \"0\"\n box.style.visibility = \"visible\"\n box.offsetHeight // eslint-disable-line @typescript-eslint/no-unused-expressions\n }\n box.style.opacity = \"1\"\n repositioner.attach()\n },\n hide() {\n target = null\n box.style.opacity = \"0\"\n backdrop.style.opacity = \"0\"\n repositioner.detach()\n },\n destroy() {\n repositioner.detach()\n box.remove()\n backdrop.remove()\n target = null\n },\n get isVisible() {\n return target !== null\n },\n }\n\n return overlay\n}\n\n/**\n * Build a `path(evenodd, ...)` that covers the full viewport with a\n * rectangular cutout. Two separate subpaths (each with their own M/Z)\n * avoid the bridging-line artifacts that `polygon()` creates.\n */\nfunction cutoutPath(\n vw: number,\n vh: number,\n x: number,\n y: number,\n w: number,\n h: number\n): string {\n const outer = `M0 0H${vw}V${vh}H0Z`\n const inner = `M${x} ${y}V${y + h}H${x + w}V${y}Z`\n return `path(evenodd,\"${outer}${inner}\")`\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.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 \"../../shared/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 InspectorMatch,\n type InspectorMatchStack,\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?: (\n match: InspectorMatch | null,\n cursor: { x: number; y: number } | null\n ) => void\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.shadowRoot })\n cleanup.add(overlay)\n\n const tooltip = createCursorTooltip({\n container: host.chromeEl,\n })\n cleanup.add(tooltip)\n\n const afterHover = options.inspector?.onAfterHover\n\n const showStack = (\n stack: InspectorMatchStack | null,\n cursor: { x: number; y: number } | null\n ): void => {\n if (!stack) {\n overlay.hide()\n tooltip.update(null, cursor)\n return\n }\n const { current } = stack\n const demoted = current.ref.kind === \"primitive\"\n overlay.show(current.element, {\n color: KIND_STYLE[current.ref.kind].color,\n ...(demoted && { borderStyle: \"dashed\", fillOpacity: 0.04 }),\n })\n tooltip.update(\n {\n entity: current.entity,\n node: current.element,\n layer:\n stack.matches.length > 1\n ? { index: stack.index, total: stack.matches.length }\n : undefined,\n },\n cursor\n )\n }\n\n const inspector = createInspector({\n session: options.session,\n registry: options.registry,\n onSelect: options.inspector?.onSelect,\n onHover: (stack, cursor) => {\n showStack(stack, cursor)\n afterHover?.(stack?.current ?? null, cursor)\n },\n onCycle: (stack, cursor) => {\n showStack(stack, cursor)\n },\n onObscured: (cursor) => {\n overlay.hide()\n tooltip.update(\"iframe\", 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 { EntityKind, EntityRef, Registry } from \"../../../shared/entities\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport type { OverlayShowOptions } from \"../../surface/overlay\"\nimport type { Router } from \"./router\"\nimport type { ViewSurface } from \"./surface\"\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 subtitle?: string | (() => string)\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 views: Router\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 /** 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 icon?: () => Node\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 /** Required unless `render` is provided. */\n surface?: (ctx: ViewContext) => ViewSurface\n /** Direct render for integration adapters (React, etc.). Takes precedence over `surface` when both are present. */\n render?: (ctx: ViewContext, root: HTMLElement) => Cleanup | void\n parent?: (ref: EntityRef | null) => ViewStackEntry | null\n}\n\nexport class ViewValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ViewValidationError\"\n }\n}\n","import { sameRef, type EntityRef } from \"../../../shared/entities\"\nimport type { SessionStore } from \"../../session\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport { ViewValidationError, type View } from \"./types\"\n\nexport interface RouteMatch {\n view: View\n priority: number\n}\n\nexport interface Router {\n resolve(ref: EntityRef): RouteMatch | null\n add(view: View, priority?: number): void\n remove(id: string): void\n get(id: string): View | undefined\n list(): readonly View[]\n buildStack(entry: ViewStackEntry): ViewStackEntry[]\n navigate(ref: EntityRef): void\n recents(): readonly EntityRef[]\n favorites(): readonly EntityRef[]\n toggleFavorite(ref: EntityRef): void\n isFavorite(ref: EntityRef): boolean\n}\n\nexport interface CreateRouterOptions {\n session: SessionStore\n}\n\nexport function createRouter(options: CreateRouterOptions): Router {\n const FAVORITES_KEY = \"uidex:favorites\"\n const MAX_RECENTS = 8\n const entries: Array<{ view: View; priority: number }> = []\n const recentRefs: EntityRef[] = []\n const favoriteRefs: EntityRef[] = []\n\n try {\n const stored = localStorage.getItem(FAVORITES_KEY)\n if (stored) {\n const parsed = JSON.parse(stored) as EntityRef[]\n favoriteRefs.push(...parsed)\n }\n } catch {\n /* ignore — localStorage unavailable or corrupt */\n }\n\n function persistFavorites(): void {\n try {\n localStorage.setItem(FAVORITES_KEY, JSON.stringify(favoriteRefs))\n } catch {\n /* ignore */\n }\n }\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 const hasSurface = typeof view.surface === \"function\"\n const hasRender = typeof view.render === \"function\"\n if (!hasSurface && !hasRender) {\n throw new ViewValidationError(\n `View ${view.id}: a 'surface' function (or a 'render' override) is required`\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 resolve(ref: EntityRef): RouteMatch | null {\n let best: RouteMatch | null = null\n for (const e of entries) {\n if (!e.view.matches?.(ref)) continue\n if (!best || e.priority > best.priority) {\n best = { view: e.view, priority: e.priority }\n }\n }\n return best\n }\n\n function add(view: View, priority = 0): void {\n validate(view)\n const idx = entries.findIndex((e) => e.view.id === view.id)\n if (idx >= 0) entries.splice(idx, 1)\n entries.push({ view, priority })\n }\n\n function remove(id: string): void {\n const idx = entries.findIndex((e) => e.view.id === id)\n if (idx >= 0) entries.splice(idx, 1)\n const { stack } = options.session.nav.getState()\n const top = stack[stack.length - 1] ?? null\n if (top?.id === id) options.session.mode.transition.dismiss()\n }\n\n function get(id: string): View | undefined {\n return entries.find((e) => e.view.id === id)?.view\n }\n\n function list(): readonly View[] {\n return entries.map((e) => e.view)\n }\n\n function buildStack(entry: ViewStackEntry): ViewStackEntry[] {\n const stack: ViewStackEntry[] = [entry]\n let current = entry\n for (let depth = 0; depth < 10; depth++) {\n const view = get(current.id)\n if (!view?.parent) break\n const parentEntry = view.parent(current.ref)\n if (!parentEntry) break\n stack.unshift(parentEntry)\n current = parentEntry\n }\n return stack\n }\n\n function navigate(ref: EntityRef): void {\n const match = resolve(ref)\n if (!match) return\n const idx = recentRefs.findIndex((r) => sameRef(r, ref))\n if (idx >= 0) recentRefs.splice(idx, 1)\n recentRefs.unshift(ref)\n if (recentRefs.length > MAX_RECENTS) recentRefs.length = MAX_RECENTS\n const entry: ViewStackEntry = { id: match.view.id, ref }\n const { mode } = options.session.mode.getState()\n if (mode === \"idle\" || mode === \"inspecting\") {\n options.session.mode.transition.enterViewing(buildStack(entry))\n } else {\n options.session.mode.transition.pushView(entry)\n }\n }\n\n function recents(): readonly EntityRef[] {\n return recentRefs\n }\n\n function favorites(): readonly EntityRef[] {\n return favoriteRefs\n }\n\n function toggleFavorite(ref: EntityRef): void {\n const idx = favoriteRefs.findIndex((r) => sameRef(r, ref))\n if (idx >= 0) {\n favoriteRefs.splice(idx, 1)\n } else {\n favoriteRefs.unshift(ref)\n }\n persistFavorites()\n }\n\n function isFavorite(ref: EntityRef): boolean {\n return favoriteRefs.some((r) => sameRef(r, ref))\n }\n\n return {\n resolve,\n add,\n remove,\n get,\n list,\n buildStack,\n navigate,\n recents,\n favorites,\n toggleFavorite,\n isFavorite,\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","export { html, svg, render, nothing, type TemplateResult } from \"lit-html\"\nexport { ref, createRef, type Ref } from \"lit-html/directives/ref.js\"\nexport { icon } from \"./lit-icon.js\"\n","import { noChange } from \"lit-html\"\nimport {\n Directive,\n directive,\n type PartInfo,\n PartType,\n} from \"lit-html/directive.js\"\nimport { createElement, type IconNode } from \"lucide\"\n\nclass LucideIconDirective extends Directive {\n private _icon: IconNode | undefined\n private _class: string | undefined\n private _el: SVGSVGElement | undefined\n\n constructor(partInfo: PartInfo) {\n super(partInfo)\n if (partInfo.type !== PartType.CHILD) {\n throw new Error(\"icon() can only be used in a child position\")\n }\n }\n\n override update(_part: unknown, [iconNode, className]: [IconNode, string?]) {\n if (iconNode === this._icon && className === this._class) return noChange\n this._icon = iconNode\n this._class = className\n this._el = createElement(iconNode) as unknown as SVGSVGElement\n this._el.setAttribute(\"aria-hidden\", \"true\")\n if (className) this._el.setAttribute(\"class\", className)\n return this._el\n }\n\n render(iconNode: IconNode, className?: string) {\n const el = createElement(iconNode) as unknown as SVGSVGElement\n el.setAttribute(\"aria-hidden\", \"true\")\n if (className) el.setAttribute(\"class\", className)\n return el\n }\n}\n\nexport const icon = directive(LucideIconDirective)\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../../internal/el\"\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","import { createElement as createLucideElement } from \"lucide\"\nimport { KIND_STYLE, type EntityKind } from \"../../../shared/entities\"\nimport { cn } from \"../../internal/cn\"\nimport { html, type TemplateResult } from \"../../internal/lit\"\nimport { icon } from \"../../internal/lit-icon\"\nimport { createBadge, badgeVariants } from \"../../ui/badge\"\nimport { createIconTile, iconTileTpl } from \"./icon-tile\"\n\n// ── Imperative (legacy) — returns HTMLElement / SVGElement ─────────\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 iconEl = createLucideElement(style.icon)\n iconEl.setAttribute(\"aria-hidden\", \"true\")\n return createBadge(\n {\n class: style.chip,\n attrs: { \"data-uidex-kind-badge\": kind },\n },\n [iconEl, style.label]\n )\n}\n\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nexport function kindIconTpl(kind: EntityKind): TemplateResult {\n const style = KIND_STYLE[kind]\n return html`${icon(style.icon, cn(\"h-4 w-4 shrink-0\", style.tone))}`\n}\n\nexport function kindIconTileTpl(kind: EntityKind): TemplateResult {\n const style = KIND_STYLE[kind]\n return iconTileTpl(\n html`${icon(style.icon, cn(\"size-3.5 opacity-80\", style.tone))}`,\n { toneClass: style.chip }\n )\n}\n\nexport function kindBadgeTpl(kind: EntityKind): TemplateResult {\n const style = KIND_STYLE[kind]\n return html`\n <span\n class=${cn(badgeVariants({}), style.chip)}\n data-slot=\"badge\"\n data-uidex-kind-badge=${kind}\n >${icon(style.icon)} ${style.label}</span\n >\n `\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 { html, type TemplateResult } from \"../internal/lit\"\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\n// ── Imperative (legacy) — returns HTMLSpanElement ──────────────────\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nexport function badgeTpl(\n content: TemplateResult | string,\n options: { variant?: BadgeVariant; size?: BadgeSize; class?: ClassValue } = {}\n): TemplateResult {\n const { variant, size, class: extra } = options\n return html`\n <span class=${cn(badgeVariants({ variant, size }), extra)} data-slot=\"badge\"\n >${content}</span\n >\n `\n}\n","import type { ClassValue } from \"clsx\"\nimport type { DirectiveResult } from \"lit-html/directive.js\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport { html, type TemplateResult } from \"../../internal/lit\"\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\n// ── Imperative (legacy) — returns HTMLElement ─────────────────────\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\n/**\n * Template version of the icon tile. Callers pass a properly-sized\n * `TemplateResult` (e.g. from the `icon` directive) — no SVG class\n * stripping needed.\n */\nexport function iconTileTpl(\n inner: TemplateResult | DirectiveResult,\n options: Pick<\n IconTileOptions,\n \"extraClass\" | \"toneClass\" | \"tint\" | \"tintAlpha\"\n > = {}\n): TemplateResult {\n const tintStyle =\n options.tint && !options.toneClass\n ? `background-color: color-mix(in srgb, ${options.tint} ${options.tintAlpha ?? 15}%, transparent)`\n : \"\"\n return html`\n <span\n class=${cn(TILE_CLASS, options.toneClass, options.extraClass)}\n data-slot=\"icon-tile\"\n aria-hidden=\"true\"\n style=${tintStyle}\n >${inner}</span\n >\n `\n}\n","import { displayName, KIND_STYLE, type Entity } from \"../../../shared/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\n// ── Imperative (legacy) — returns HTMLElement ─────────────────────\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 { createNormalizer, type PropTypes } from \"@zag-js/types\"\n\nexport type DomProps = PropTypes<Record<string, unknown>>\n\nexport const normalizeProps = createNormalizer<DomProps>((v) => v)\n","import type { Cleanup } from \"./cleanup\"\n\ntype Props = Record<string, unknown>\n\nexport function applyProps(node: Element, props: Props): Cleanup {\n const removers: Array<() => void> = []\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 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 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(\n (node as HTMLElement).style,\n rawValue as Record<string, string>\n )\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 as HTMLElement).tabIndex = Number(rawValue)\n continue\n }\n node.setAttribute(key, String(rawValue))\n }\n return () => removers.forEach((fn) => fn())\n}\n","import { applyProps } from \"../../internal/apply-props\"\nimport type { Cleanup } from \"../../internal/cleanup\"\n\nexport function spreadProps(\n node: HTMLElement,\n props: Record<string, unknown>\n): Cleanup {\n return applyProps(node, props)\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, applyProps(node, props))\n },\n cleanupAll() {\n for (const clean of map.values()) clean()\n map.clear()\n },\n }\n}\n","import type { Cleanup } from \"./cleanup\"\n\nconst NAV_KEYS = new Set([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"])\n\nexport interface ArrowNavOptions {\n container: HTMLElement\n getItems(): HTMLElement[]\n /** Element to focus when ArrowUp is pressed at the top of the list. */\n escapeTarget?: HTMLElement\n /** Wrap from last→first and first→last. Default: false. */\n wrap?: boolean\n /** Additional elements that should forward arrow keys into the list. */\n extraSources?: HTMLElement[]\n onEnterKbd?: () => void\n}\n\nexport function bindArrowNav(options: ArrowNavOptions): Cleanup {\n const { container, getItems, escapeTarget, onEnterKbd } = options\n const wrap = options.wrap ?? false\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!NAV_KEYS.has(e.key)) return\n onEnterKbd?.()\n const items = getItems()\n if (items.length === 0) return\n\n const active =\n container.getRootNode() instanceof ShadowRoot\n ? (container.getRootNode() as ShadowRoot).activeElement\n : document.activeElement\n if (!(active instanceof HTMLElement)) return\n\n const isEscape = escapeTarget && active === escapeTarget\n if (isEscape) {\n e.preventDefault()\n const idx = e.key === \"ArrowUp\" || e.key === \"End\" ? items.length - 1 : 0\n focusItem(items, idx)\n return\n }\n\n const idx = items.indexOf(active)\n if (idx === -1) {\n if (container.contains(active)) {\n e.preventDefault()\n const entry =\n e.key === \"ArrowUp\" || e.key === \"End\" ? items.length - 1 : 0\n focusItem(items, entry)\n }\n return\n }\n\n e.preventDefault()\n switch (e.key) {\n case \"ArrowUp\":\n if (idx === 0) {\n if (escapeTarget) escapeTarget.focus()\n else if (wrap) focusItem(items, items.length - 1)\n } else {\n focusItem(items, idx - 1)\n }\n break\n case \"ArrowDown\":\n if (idx === items.length - 1) {\n if (wrap) focusItem(items, 0)\n } else {\n focusItem(items, idx + 1)\n }\n break\n case \"Home\":\n focusItem(items, 0)\n break\n case \"End\":\n focusItem(items, items.length - 1)\n break\n }\n }\n\n container.addEventListener(\"keydown\", onKeyDown)\n const extraCleanups: Cleanup[] = []\n for (const src of options.extraSources ?? []) {\n src.addEventListener(\"keydown\", onKeyDown)\n extraCleanups.push(() => src.removeEventListener(\"keydown\", onKeyDown))\n }\n\n return () => {\n container.removeEventListener(\"keydown\", onKeyDown)\n for (const c of extraCleanups) c()\n }\n}\n\nfunction focusItem(items: HTMLElement[], idx: number): void {\n for (let i = 0; i < items.length; i++) {\n items[i].tabIndex = i === idx ? 0 : -1\n }\n items[idx].focus()\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 steps: \"Steps\",\n routes: \"Routes\",\n} as const\n\nexport const PALETTE_GROUPS = {\n commands: \"Commands\",\n currentPage: \"Current Page\",\n favorites: \"Favorites\",\n recents: \"Recents\",\n} as const\n","export const LIST_ITEM_CLASS =\n \"flex min-h-8 cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-base outline-none sm:min-h-7 sm:text-sm data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground\"\n\nexport const LIST_ITEM_STATE_CLASS =\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-64\"\n\nexport const LIST_ITEM_INTERACTIVE_CLASS =\n \"uidex-item-interactive [[data-kbd-nav]_&]:focus:bg-accent [[data-kbd-nav]_&]:focus:text-accent-foreground [[data-kbd-nav]_&]:focus-within:bg-accent [[data-kbd-nav]_&]: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 { html, nothing, type TemplateResult } from \"../../internal/lit\"\nimport { LIST_GROUP_LABEL_CLASS } from \"../../ui/list-item\"\n\nconst MUTED_CLASS = \"text-sm text-muted-foreground\"\nconst HEADING_CLASS = LIST_GROUP_LABEL_CLASS\n\nexport function mutedTextTpl(\n text: string,\n className?: ClassValue\n): TemplateResult {\n return html`<p class=${cn(MUTED_CLASS, className)}>${text}</p>`\n}\n\nexport function headingTpl(\n text: string | undefined,\n className?: ClassValue\n): TemplateResult {\n if (!text) return nothing as unknown as TemplateResult\n return html`<h3 class=${cn(HEADING_CLASS, className)}>${text}</h3>`\n}\n","import {\n ArchiveX,\n Camera,\n ChevronDown,\n Copy,\n Highlighter,\n Inbox,\n MessageCircleWarning,\n StickyNote,\n TicketPlus,\n View,\n createElement as createLucideElement,\n type IconNode,\n} from \"lucide\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport type {\n DetailAction,\n DetailActionIcon,\n DetailActionRunContext,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport {\n LIST_GROUP_LABEL_CLASS,\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\n\nconst ICON_MAP: Record<DetailActionIcon, IconNode> = {\n \"archive-x\": ArchiveX,\n copy: Copy,\n camera: Camera,\n inbox: Inbox,\n \"message-circle-warning\": MessageCircleWarning,\n \"chevron-down\": ChevronDown,\n highlighter: Highlighter,\n \"sticky-note\": StickyNote,\n \"ticket-plus\": TicketPlus,\n view: View,\n}\n\nfunction iconFor(icon: DetailActionIcon | undefined): IconNode | null {\n return icon ? ICON_MAP[icon] : null\n}\n\n// ── Actions (imperative) ─────────────────────────────────────────────\n// Action buttons need mutable label elements (setLabel + revert timer),\n// so they stay imperative.\n\nexport interface RenderedActions {\n node: HTMLElement\n buttons: readonly HTMLButtonElement[]\n cleanup: Cleanup\n}\n\nexport function 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 = el(\"button\", {\n class: cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer text-left font-normal\"\n ),\n attrs: {\n type: \"button\",\n \"data-slot\": \"list-item-button\",\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\n let leading: Node | undefined\n const iconNode = iconFor(action.icon)\n if (iconNode) {\n const svg = createLucideElement(iconNode)\n svg.setAttribute(\"aria-hidden\", \"true\")\n svg.setAttribute(\"class\", \"h-4 w-4 shrink-0\")\n const tile = el(\n \"span\",\n {\n class:\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground\",\n attrs: { \"data-slot\": \"icon-tile\", \"aria-hidden\": \"true\" },\n },\n [svg]\n )\n leading = tile\n }\n\n // Label span needs to be mutable for setLabel()\n const labelSpan = el(\"span\", {\n class: \"min-w-0 flex-1 truncate\",\n text: action.label,\n })\n if (leading) btn.append(leading)\n btn.append(labelSpan)\n if (action.hint) {\n const kbd = el(\"kbd\", {\n class:\n \"text-muted-foreground/70 ms-auto font-sans text-xs font-medium tracking-widest\",\n attrs: { \"data-slot\": \"command-shortcut\" },\n text: action.hint,\n })\n btn.append(kbd)\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 labelSpan.textContent = next\n if (durationMs && durationMs > 0) {\n revertTimer = setTimeout(() => {\n labelSpan.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.views.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","import {\n displayName,\n entityKey,\n type Entity,\n type EntityRef,\n} from \"../../../shared/entities\"\nimport { cn } from \"../../internal/cn\"\nimport { html, render, nothing, type TemplateResult } from \"../../internal/lit\"\nimport {\n html as staticHtml,\n literal,\n type StaticValue,\n} from \"lit-html/static.js\"\nimport { filterEntities, filterIds, normalizeQuery } from \"../builder/filter\"\nimport type {\n DetailSection,\n MetadataEntry,\n ResolvedFlowStep,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\nimport { badgeVariants } from \"../../ui/badge\"\nimport { entityLinkTpl } from \"../primitives/entity-link\"\nimport { kindIconTileTpl } from \"../primitives/kind-icon\"\nimport { rowTpl } from \"../primitives/row\"\nimport { headingTpl, mutedTextTpl } from \"../primitives/text\"\nimport {\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\n\n// ── Section templates ────────────────────────────────────────────────\n\nfunction entityListItems(\n ctx: ViewContext,\n entities: readonly Entity[]\n): TemplateResult {\n return html`${entities.map((entity) => {\n const eRef: EntityRef = { kind: entity.kind, id: entityKey(entity) }\n return html`<li>\n ${entityLinkTpl({\n ctx,\n target: eRef,\n label: displayName(entity),\n leading: kindIconTileTpl(entity.kind),\n })}\n </li>`\n })}`\n}\n\n// lit-html can't bind an attribute *name*, so the distinct\n// `data-uidex-detail-*` markers are spliced in as static values.\nconst DETAIL_SECTION_ATTRS = {\n composes: literal`data-uidex-detail-composes`,\n \"used-by\": literal`data-uidex-detail-used-by`,\n flows: literal`data-uidex-detail-flows`,\n touches: literal`data-uidex-detail-touches`,\n} satisfies Record<string, StaticValue>\n\ntype EntitySectionAttr = keyof typeof DETAIL_SECTION_ATTRS\n\n/**\n * Shared \"heading + <ul> of entityLink rows\" section used by composes,\n * used-by, flows, and touches. When `emptyText` is omitted an empty list\n * renders nothing (returns null); when provided it renders a muted\n * placeholder instead.\n */\nfunction entitySectionTpl(\n ctx: ViewContext,\n opts: {\n label: string\n entities: readonly Entity[]\n dataAttr: EntitySectionAttr\n emptyText?: string\n }\n): TemplateResult | null {\n const { label, entities, dataAttr, emptyText } = opts\n const attr = DETAIL_SECTION_ATTRS[dataAttr]\n if (entities.length === 0) {\n if (emptyText === undefined) return null\n return staticHtml`\n <section class=\"flex flex-col gap-2\" ${attr}>\n ${headingTpl(label)}\n ${mutedTextTpl(emptyText)}\n </section>\n `\n }\n return staticHtml`\n <section class=\"flex flex-col\" ${attr}>\n ${headingTpl(label)}\n <ul class=\"flex flex-col\">\n ${entityListItems(ctx, entities)}\n </ul>\n </section>\n `\n}\n\nfunction filterStepsBy<T>(\n items: readonly T[],\n query: string,\n fields: (item: T) => readonly (string | undefined)[]\n): readonly T[] {\n const q = normalizeQuery(query)\n if (!q) return items\n return items.filter((item) =>\n fields(item).some((field) => field?.toLowerCase().includes(q))\n )\n}\n\nconst resolvedStepFields = (step: ResolvedFlowStep) => [\n displayName(step.entity),\n entityKey(step.entity),\n step.entity.kind,\n step.action,\n]\n\nconst STEP_ROW_CLASS = \"flex items-center gap-2 px-2\"\n\nconst STEP_ORDINAL_CLASS =\n \"relative z-10 inline-flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground text-xs font-medium tabular-nums\"\n\nfunction stepsTpl(\n ctx: ViewContext,\n steps: readonly ResolvedFlowStep[],\n query: string\n): TemplateResult {\n if (steps.length === 0) {\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-steps>\n ${headingTpl(SECTION_LABELS.steps)}\n ${mutedTextTpl(query ? \"No matches\" : \"No steps recorded\")}\n </section>\n `\n }\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-steps>\n ${headingTpl(SECTION_LABELS.steps)}\n <ol class=\"flex flex-col gap-1.5\">\n ${steps.map(\n (step) => html`\n <li class=${STEP_ROW_CLASS} data-uidex-step=${String(step.ordinal)}>\n <span\n class=${STEP_ORDINAL_CLASS}\n data-uidex-step-ordinal\n aria-hidden=\"true\"\n >${String(step.ordinal)}</span\n >\n ${entityLinkTpl({\n ctx,\n target: { kind: step.entity.kind, id: entityKey(step.entity) },\n label: displayName(step.entity),\n leading: kindIconTileTpl(step.entity.kind),\n class: \"min-w-0 flex-1\",\n })}\n ${step.action\n ? html`<span\n class=${cn(\n badgeVariants({ variant: \"secondary\", size: \"sm\" }),\n \"font-mono\"\n )}\n data-slot=\"badge\"\n data-uidex-step-action=${step.action}\n >${step.action}</span\n >`\n : nothing}\n </li>\n `\n )}\n </ol>\n </section>\n `\n}\n\nfunction routePathsTpl(paths: readonly string[]): TemplateResult | null {\n if (paths.length === 0) return null\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-routes>\n ${headingTpl(SECTION_LABELS.routes)}\n <ul class=\"flex flex-col\">\n ${paths.map(\n (p) => html`\n <li\n class=${cn(LIST_ITEM_CLASS, LIST_ITEM_INTERACTIVE_CLASS)}\n data-uidex-detail-row=\"route\"\n tabindex=\"-1\"\n >\n ${rowTpl({\n leading: kindIconTileTpl(\"route\"),\n label: p,\n })}\n </li>\n `\n )}\n </ul>\n </section>\n `\n}\n\nfunction acceptanceChecklistTpl(items: readonly string[]): TemplateResult {\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-acceptance>\n ${headingTpl(SECTION_LABELS.acceptance)}\n <ul class=\"flex flex-col\">\n ${items.map((text, idx) => {\n const id = `uidex-acceptance-${idx}`\n const syncChecked = (e: Event): void => {\n const checkbox = e.currentTarget as HTMLInputElement\n const label = checkbox\n .closest(\"label\")\n ?.querySelector(\n \"[data-uidex-acceptance-label]\"\n ) as HTMLElement | null\n if (label) {\n label.classList.toggle(\"line-through\", checkbox.checked)\n label.classList.toggle(\"text-muted-foreground\", checkbox.checked)\n }\n }\n const onKeydown = (e: KeyboardEvent): void => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n const checkbox = e.currentTarget as HTMLInputElement\n checkbox.checked = !checkbox.checked\n syncChecked(e)\n }\n }\n return html`\n <li>\n <label\n class=${cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer items-start\"\n )}\n for=${id}\n >\n <input\n type=\"checkbox\"\n id=${id}\n data-uidex-acceptance-item=${String(idx)}\n class=\"accent-accent mt-1 h-3.5 w-3.5 shrink-0 cursor-pointer focus:outline-none\"\n @change=${syncChecked}\n @keydown=${onKeydown}\n />\n <span\n class=\"min-w-0 flex-1 whitespace-normal break-words\"\n data-uidex-acceptance-label\n >${text}</span\n >\n </label>\n </li>\n `\n })}\n </ul>\n </section>\n `\n}\n\nfunction screenshotTpl(url: string): TemplateResult {\n return html`\n <section class=\"px-2\">\n ${headingTpl(\"Screenshot\")}\n <img\n src=${url}\n alt=\"Screenshot\"\n class=\"border-border mt-1 w-full rounded-md border\"\n />\n </section>\n `\n}\n\n/**\n * Lazily fetched screenshot (cloud pins travel without one). Hidden until\n * the fetch resolves with a data URL; a missing screenshot or a failed\n * fetch leaves no empty section behind.\n */\nfunction lazyScreenshotEl(load: () => Promise<string | null>): HTMLElement {\n const holder = document.createElement(\"div\")\n holder.hidden = true\n void load().then(\n (url) => {\n if (!url) return\n render(screenshotTpl(url), holder)\n holder.hidden = false\n },\n () => {\n // fetch failed — the detail view is still useful without the image\n }\n )\n return holder\n}\n\nfunction metadataListTpl(entries: readonly MetadataEntry[]): TemplateResult {\n return html`\n <div\n class=\"text-muted-foreground border-border mx-2 border-t pt-2 text-[11px] leading-relaxed\"\n >\n ${entries.map(\n (e) =>\n html`<div class=\"flex gap-1.5 truncate\">\n <span class=\"shrink-0\">${e.label}</span>\n <span class=\"truncate font-mono\">${e.value}</span>\n </div>`\n )}\n </div>\n `\n}\n\nexport function sectionTpl(\n section: DetailSection,\n ctx: ViewContext,\n query: string\n): TemplateResult | null {\n switch (section.id) {\n case \"description\": {\n if (!section.text) return null\n return html`<p\n class=${cn(\"text-foreground text-sm leading-relaxed\", \"px-2\")}\n data-uidex-detail-description\n >\n ${section.text}\n </p>`\n }\n case \"acceptance\": {\n if (section.items.length === 0) return null\n return acceptanceChecklistTpl(section.items)\n }\n case \"composes\":\n return entitySectionTpl(ctx, {\n label: section.label,\n entities: section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n dataAttr: \"composes\",\n })\n case \"used-by\":\n return entitySectionTpl(ctx, {\n label: section.label,\n entities: section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n dataAttr: \"used-by\",\n })\n case \"flows\":\n return entitySectionTpl(ctx, {\n label: SECTION_LABELS.flows,\n entities: section.filterable\n ? filterEntities(section.flows, query)\n : section.flows,\n dataAttr: \"flows\",\n })\n case \"touches\":\n return entitySectionTpl(ctx, {\n label: SECTION_LABELS.touches,\n entities: section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n dataAttr: \"touches\",\n emptyText: query ? \"No matches\" : \"No entities touched\",\n })\n case \"steps\":\n return stepsTpl(\n ctx,\n section.filterable\n ? filterStepsBy(section.steps, query, resolvedStepFields)\n : section.steps,\n query\n )\n case \"routes\":\n return routePathsTpl(\n section.filterable ? filterIds(section.paths, query) : section.paths\n )\n case \"screenshot\":\n if (section.url) return screenshotTpl(section.url)\n if (section.load) return html`${lazyScreenshotEl(section.load)}`\n return null\n case \"metadata\":\n return section.entries.length > 0\n ? metadataListTpl(section.entries)\n : null\n }\n}\n","import { displayName, entityKey, type Entity } from \"../../../shared/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","import type { EntityRef, Registry } from \"../../../shared/entities\"\nimport { DOM_BACKED_KINDS } from \"../../surface/constants\"\nimport { resolveEntityElement } from \"../../surface/inspector\"\n\nconst TOUCH_RESOLVE_KINDS = [\n \"element\",\n \"widget\",\n \"region\",\n \"primitive\",\n] as const\n\nexport function isAbsentFromPage(ref: EntityRef, registry?: Registry): boolean {\n if (DOM_BACKED_KINDS.has(ref.kind)) {\n return !resolveEntityElement(ref)\n }\n if (ref.kind === \"flow\" && registry) {\n const flow = registry.get(\"flow\", ref.id)\n if (!flow) return true\n for (const touchId of flow.touches) {\n for (const kind of TOUCH_RESOLVE_KINDS) {\n const entity = registry.get(kind, touchId)\n if (entity && resolveEntityElement({ kind, id: touchId })) return false\n }\n }\n return true\n }\n return false\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\nimport { html, type TemplateResult } from \"../internal/lit\"\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 COMMAND_SHORTCUT_CLASS =\n \"text-muted-foreground/70 ms-auto font-sans text-xs font-medium tracking-widest\"\n\n// ── Imperative (legacy) — returns HTMLElement ─────────────────────\n\nexport interface CreateKbdOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nexport function kbdTpl(text: string, className?: ClassValue): TemplateResult {\n return html`<kbd class=${cn(KBD_CLASS, className)} data-slot=\"kbd\"\n >${text}</kbd\n >`\n}\n\nexport function commandShortcutTpl(\n text: string,\n className?: ClassValue\n): TemplateResult {\n return html`<kbd\n class=${cn(COMMAND_SHORTCUT_CLASS, className)}\n data-slot=\"command-shortcut\"\n >${text}</kbd\n >`\n}\n","import { el } from \"../../internal/el\"\nimport { html, nothing, type TemplateResult } from \"../../internal/lit\"\nimport { createCommandShortcut, commandShortcutTpl } 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\n/** Template-friendly row content — allows TemplateResult for slots. */\nexport interface RowTplContent {\n leading?: TemplateResult | null\n label: string\n subtitle?: string\n trailing?: TemplateResult | string | null\n}\n\nconst LABEL_CLASS = \"min-w-0 flex-1 truncate\"\nconst SUBTITLE_CLASS = \"truncate text-xs text-muted-foreground\"\n\n// ── Imperative (legacy) — mutates host element ────────────────────\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\n/**\n * Renders the row CONTENTS (leading / label / subtitle / trailing) without a\n * wrapping element, so the caller can place them inside any container.\n */\nexport function rowTpl(content: RowTplContent): TemplateResult {\n return html`\n ${content.leading ?? nothing}\n <span class=${LABEL_CLASS}>${content.label}</span>\n ${content.subtitle\n ? html`<span class=${SUBTITLE_CLASS} data-uidex-row-subtitle\n >${content.subtitle}</span\n >`\n : nothing}\n ${content.trailing != null\n ? typeof content.trailing === \"string\"\n ? commandShortcutTpl(content.trailing)\n : content.trailing\n : nothing}\n `\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { KIND_STYLE, type EntityRef } from \"../../../shared/entities\"\nimport { html, type TemplateResult } from \"../../internal/lit\"\nimport {\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\nimport type { ViewContext } from \"../core/types\"\nimport { isAbsentFromPage } from \"./entity-presence\"\nimport { rowTpl } from \"./row\"\n\nexport interface EntityLinkTplOptions {\n ctx: ViewContext\n target: EntityRef\n label?: string\n leading?: TemplateResult | null\n class?: ClassValue\n}\n\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nconst ACTION_CLASS = cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer text-left font-normal\"\n)\n\n/**\n * Lit-html template for an entity link button. Event handlers use lit-html's\n * `@event` syntax so cleanup is handled automatically on disconnection.\n */\nexport function entityLinkTpl(options: EntityLinkTplOptions): TemplateResult {\n const { ctx, target, label, leading, class: extraClass } = options\n const absent = isAbsentFromPage(target)\n const resolvedLabel = label ?? `${target.kind}: ${target.id}`\n\n const onClick = () => ctx.views.navigate(target)\n const preview = () => {\n ctx.highlight.show(target, { color: KIND_STYLE[target.kind].color })\n }\n const restoreParent = () => {\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\n return html`\n <button\n type=\"button\"\n class=${cn(ACTION_CLASS, \"w-full\", absent && \"opacity-50\", extraClass)}\n data-slot=\"list-item-button\"\n data-uidex-entity-link\n data-uidex-ref-kind=${target.kind}\n data-uidex-ref-id=${target.id}\n title=${absent ? \"Not on this page\" : \"\"}\n @click=${onClick}\n @mouseenter=${preview}\n @mouseleave=${restoreParent}\n @focus=${preview}\n @blur=${restoreParent}\n >\n ${rowTpl({\n leading,\n label: resolvedLabel,\n })}\n </button>\n `\n}\n","import { type EntityRef } from \"../../../shared/entities\"\nimport { bindArrowNav } from \"../../internal/arrow-nav\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport {\n html,\n render,\n nothing,\n createRef,\n ref,\n type TemplateResult,\n} from \"../../internal/lit\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\nimport { badgeTpl } from \"../../ui/badge\"\nimport { kindBadgeTpl } from \"../primitives/kind-icon\"\nimport { mutedTextTpl } from \"../primitives/text\"\nimport type { MountedSurface, SubmitIntent, SubmitIntentSource } from \"./index\"\nimport { renderActions } from \"./detail-actions\"\nimport { sectionTpl } from \"./detail-sections\"\n\nfunction subtitleTpl(subtitle: DetailSubtitle): TemplateResult {\n const text = subtitle.extra\n ? `${subtitle.rawId} · ${subtitle.extra}`\n : subtitle.rawId\n return html`<p\n class=${cn(\"text-muted-foreground font-mono text-xs\", \"px-2\")}\n data-uidex-detail-subtitle\n >\n ${text}\n </p>`\n}\n\nfunction notFoundTpl(ref: EntityRef): TemplateResult {\n return html`<p\n class=${cn(\"text-muted-foreground text-sm\", \"p-4\")}\n data-uidex-detail-missing\n >\n ${ref.kind}: ${ref.id} not found in registry\n </p>`\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 render(notFoundTpl(surface.notFound), root)\n return { cleanup: () => root.replaceChildren() }\n }\n\n const bodyRef = createRef<HTMLDivElement>()\n const sectionsRef = createRef<HTMLDivElement>()\n\n const cleanups: Cleanup[] = []\n\n // ── Build actions (imperative — mutable labels) ──────────────────\n let actionsNode: HTMLElement | null = null\n if (surface.actions && surface.actions.length > 0) {\n const groups = new Map<string, DetailAction[]>()\n for (const action of surface.actions) {\n const key = action.group ?? \"\"\n const list = groups.get(key) ?? []\n list.push(action)\n groups.set(key, list)\n }\n\n if (groups.size <= 1) {\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 } else {\n const wrapper = el(\"div\", {\n class: \"flex flex-col gap-1\",\n attrs: { \"data-uidex-detail-action-groups\": \"\" },\n })\n for (const [heading, groupActions] of groups) {\n const rendered = renderActions(\n groupActions,\n ctx,\n root,\n heading || SECTION_LABELS.actions\n )\n cleanups.push(rendered.cleanup)\n wrapper.append(rendered.node)\n }\n actionsNode = wrapper\n }\n }\n\n const sections = surface.sections ?? []\n const filterable = hasFilterableSections(sections)\n\n // ── Render body template ──────────────────────────────────────────\n render(\n html`\n <div\n ${ref(bodyRef)}\n class=\"flex flex-col gap-3 px-2 py-4\"\n data-uidex-detail-body\n data-uidex-detail-kind=${surface.entityKind}\n >\n <div class=\"flex items-center gap-2 px-2\">\n ${surface.title\n ? html`<h2\n class=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\"\n data-uidex-detail-title\n >\n ${surface.title}\n </h2>`\n : nothing}\n <span class=\"ml-auto flex items-center gap-1\">\n ${surface.unregistered\n ? badgeTpl(\"Unregistered\", { variant: \"warning\", size: \"sm\" })\n : nothing}\n ${kindBadgeTpl(surface.entityKind)}\n </span>\n </div>\n ${surface.subtitle ? subtitleTpl(surface.subtitle) : nothing}\n <div\n ${ref(sectionsRef)}\n class=\"flex flex-col gap-3\"\n data-uidex-detail-sections\n ></div>\n </div>\n `,\n root\n )\n\n const body = bodyRef.value!\n const listsContainer = sectionsRef.value!\n\n // ── Focus management ──────────────────────────────────────────────\n let focusables: HTMLElement[] = []\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 enterKbdMode = (): void => body.setAttribute(\"data-kbd-nav\", \"\")\n const exitKbdMode = (): void => body.removeAttribute(\"data-kbd-nav\")\n body.addEventListener(\"pointermove\", exitKbdMode)\n\n const detachArrowNav = bindArrowNav({\n container: body,\n getItems: () => focusables,\n escapeTarget: ctx.searchInput,\n extraSources: [ctx.searchInput],\n onEnterKbd: enterKbdMode,\n })\n\n // ── Render sections into the ref'd container ──────────────────────\n\n function renderSections(query: string): void {\n let hasFilterableSection = false\n let renderedFilterable = 0\n let actionsPlaced = false\n\n const parts: Array<TemplateResult | HTMLElement> = []\n const placeActions = (): void => {\n if (actionsNode && !actionsPlaced) {\n parts.push(actionsNode)\n actionsPlaced = true\n }\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 = sectionTpl(section, ctx, sectionQuery)\n if (!out) continue\n if (isFilterable) renderedFilterable++\n parts.push(out)\n if (section.id === \"description\") placeActions()\n }\n if (!actionsPlaced && actionsNode) {\n parts.unshift(actionsNode)\n }\n if (query && hasFilterableSection && renderedFilterable === 0) {\n parts.push(mutedTextTpl(\"No matches\"))\n }\n render(html`${parts}`, listsContainer)\n refreshFocusSequence()\n }\n\n renderSections(\"\")\n\n const cleanup = composeCleanups([\n ...cleanups,\n detachArrowNav,\n () => body.removeEventListener(\"pointermove\", exitKbdMode),\n () => root.replaceChildren(),\n ])\n\n const actionLabelById = new Map<string, string>()\n if (surface.actions) {\n for (const action of surface.actions) {\n if (\"copy\" in action) actionLabelById.set(action.id, \"Copy\")\n else if (\"push\" in action) actionLabelById.set(action.id, \"Open\")\n else if (\"navigate\" in action) actionLabelById.set(action.id, \"Open\")\n else if (\"highlight\" in action)\n actionLabelById.set(action.id, \"Highlight\")\n else if (\"scrollTo\" in action) actionLabelById.set(action.id, \"Go to\")\n else actionLabelById.set(action.id, \"Run\")\n }\n }\n\n const getActiveInBody = (): HTMLElement | null => {\n const rootNode = body.getRootNode()\n const active =\n rootNode instanceof ShadowRoot\n ? rootNode.activeElement\n : document.activeElement\n if (active instanceof HTMLElement && body.contains(active)) return active\n return null\n }\n\n let cachedIntent: SubmitIntent | null = null\n\n const resolveIntent = (): SubmitIntent | null => {\n const active = getActiveInBody()\n if (!active) return null\n if (active instanceof HTMLInputElement && active.type === \"checkbox\") {\n return {\n label: active.checked ? \"Uncheck\" : \"Check\",\n perform: () => active.click(),\n }\n }\n const actionId = active.getAttribute(\"data-uidex-detail-action\")\n if (actionId) {\n return {\n label: actionLabelById.get(actionId) ?? \"Run\",\n perform: () => active.click(),\n }\n }\n if (active.hasAttribute(\"data-uidex-entity-link\")) {\n return { label: \"Open\", perform: () => active.click() }\n }\n return { label: \"Open\", perform: () => active.click() }\n }\n\n const submitIntent: SubmitIntentSource = {\n get: () => cachedIntent,\n subscribe(cb) {\n const update = () => {\n cachedIntent = resolveIntent()\n cb()\n }\n body.addEventListener(\"focusin\", update)\n body.addEventListener(\"change\", update)\n ctx.searchInput.addEventListener(\"focus\", update)\n update()\n return () => {\n body.removeEventListener(\"focusin\", update)\n body.removeEventListener(\"change\", update)\n ctx.searchInput.removeEventListener(\"focus\", update)\n }\n },\n }\n\n const mounted: MountedSurface = { cleanup, submitIntent }\n if (filterable) {\n mounted.onSearch = renderSections\n }\n return mounted\n}\n","import { KIND_STYLE } from \"../../../shared/entities\"\nimport { createScrollArea } from \"../../machines/scroll-area\"\nimport { composeCleanups } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport {\n html,\n render,\n nothing,\n createRef,\n ref,\n type TemplateResult,\n} from \"../../internal/lit\"\nimport { icon } from \"../../internal/lit-icon\"\nimport { matchesQuery } from \"../builder/filter\"\nimport { createPersistentSpreads } from \"../builder/spread-props\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { ShellAction, ViewContext } from \"../core/types\"\nimport { Circle } from \"lucide\"\nimport { isAbsentFromPage } from \"../primitives/entity-presence\"\nimport { iconTileTpl } from \"../primitives/icon-tile\"\nimport { kindIconTileTpl } from \"../primitives/kind-icon\"\nimport { rowTpl } from \"../primitives/row\"\nimport { mutedTextTpl } from \"../primitives/text\"\nimport {\n LIST_GROUP_LABEL_CLASS,\n LIST_ITEM_CLASS,\n LIST_ITEM_STATE_CLASS,\n} from \"../../ui/list-item\"\nimport { createListController, type ListController } from \"./list-controller\"\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\nfunction resolveLeadingTpl(item: ListItem): TemplateResult {\n if (item.entityChip) return kindIconTileTpl(item.entityChip.entity.kind)\n if (item.leading) {\n const node = item.leading()\n if (node instanceof SVGElement) {\n const existing = node.getAttribute(\"class\") ?? \"\"\n const stripped = existing\n .replace(/\\b(h-\\d+|w-\\d+|size-\\d+)\\b/g, \"\")\n .trim()\n node.setAttribute(\"class\", cn(stripped, \"size-3.5 opacity-80\"))\n }\n return html`<span\n class=\"bg-muted text-muted-foreground inline-flex size-6 shrink-0 items-center justify-center rounded-md\"\n data-slot=\"icon-tile\"\n aria-hidden=\"true\"\n >${node}</span\n >`\n }\n return iconTileTpl(icon(Circle, \"size-3.5 opacity-80\"))\n}\n\ninterface ListShell {\n section: HTMLElement\n scrollRoot: HTMLDivElement\n viewport: HTMLDivElement\n content: HTMLDivElement\n}\n\nfunction renderShell(surface: ListSurface, root: HTMLElement): ListShell {\n const scrollRootRef = createRef<HTMLDivElement>()\n const viewportRef = createRef<HTMLDivElement>()\n const contentRef = createRef<HTMLDivElement>()\n const sectionRef = createRef<HTMLElement>()\n\n render(\n html`\n <section\n ${ref(sectionRef)}\n class=\"flex h-full flex-col overflow-hidden\"\n data-uidex-list-surface=${surface.id}\n >\n <div\n ${ref(scrollRootRef)}\n class=\"min-h-0 flex-1\"\n data-uidex-list-scroll-root\n >\n <div ${ref(viewportRef)} class=\"uidex-scrollbar h-full w-full\">\n <div\n ${ref(contentRef)}\n class=\"scroll-py-2 p-2\"\n data-uidex-list-content\n ></div>\n </div>\n </div>\n </section>\n `,\n root\n )\n\n return {\n section: sectionRef.value!,\n scrollRoot: scrollRootRef.value!,\n viewport: viewportRef.value!,\n content: contentRef.value!,\n }\n}\n\ninterface ItemMaps {\n itemNodes: Map<string, HTMLElement>\n itemForValue: Map<string, ListItem>\n groupNodes: Map<string, HTMLElement>\n}\n\nfunction buildItemsDom(\n surface: ListSurface,\n ctx: ViewContext,\n filteredItems: readonly ListItem[],\n allByValue: Map<string, ListItem>,\n content: HTMLElement\n): ItemMaps {\n const itemNodes = new Map<string, HTMLElement>()\n const itemForValue = new Map<string, ListItem>()\n const groupNodes = new Map<string, HTMLElement>()\n content.replaceChildren()\n\n if (filteredItems.length === 0) {\n const frag = document.createDocumentFragment()\n render(\n mutedTextTpl(surface.emptyLabel ?? \"No matches\", \"p-4 text-center\"),\n frag\n )\n content.append(frag)\n return { itemNodes, itemForValue, groupNodes }\n }\n\n const byGroup = new Map<string, ListItem[]>()\n for (const item of filteredItems) {\n const key = item.group ?? \"\"\n const bucket = byGroup.get(key) ?? []\n bucket.push(item)\n byGroup.set(key, bucket)\n }\n\n const frag = document.createDocumentFragment()\n render(\n html`\n <ul class=\"flex flex-col gap-1\" data-uidex-list-groups>\n ${Array.from(byGroup.entries()).map(\n ([group, items]) => html`\n <li\n class=\"flex flex-col gap-1 py-1\"\n data-uidex-list-group\n data-uidex-list-group-name=${group}\n >\n ${group\n ? html`<h3 class=${LIST_GROUP_LABEL_CLASS}>${group}</h3>`\n : nothing}\n <ul\n class=\"flex flex-col\"\n data-uidex-group-list=${group || \"ungrouped\"}\n >\n ${items.map((item) => {\n const absent = item.preview\n ? isAbsentFromPage(item.preview, ctx.registry)\n : false\n return html`\n <li\n class=${cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_STATE_CLASS,\n absent && \"opacity-50\"\n )}\n data-uidex-list-item=${rowTag(item)}\n title=${absent ? \"Not on this page\" : \"\"}\n data-uidex-item-value=${item.value}\n >\n ${rowTpl({\n leading: resolveLeadingTpl(item),\n label: item.label,\n subtitle: item.subtitle,\n trailing: item.trailing ?? item.shortcut,\n })}\n </li>\n `\n })}\n </ul>\n </li>\n `\n )}\n </ul>\n `,\n frag\n )\n\n content.append(frag)\n\n for (const el of content.querySelectorAll<HTMLElement>(\n \"[data-uidex-group-list]\"\n )) {\n const id = el.getAttribute(\"data-uidex-group-list\") ?? \"ungrouped\"\n groupNodes.set(id, el)\n }\n for (const el of content.querySelectorAll<HTMLElement>(\n \"[data-uidex-item-value]\"\n )) {\n const value = el.getAttribute(\"data-uidex-item-value\")!\n itemNodes.set(value, el)\n const item = allByValue.get(value)\n if (item) itemForValue.set(value, item)\n }\n\n return { itemNodes, itemForValue, groupNodes }\n}\n\n// ── Public entry point ──────────────────────────────────────────────\n\nexport function renderListSurface(\n surface: ListSurface,\n ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n const all = surface.items\n const searchable = surface.searchable !== false\n const filterFn = searchable ? (surface.filter ?? defaultFilter) : undefined\n let filteredItems: readonly ListItem[] = all\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 hasDefault =\n surface.defaultHighlight !== undefined &&\n allByValue.has(surface.defaultHighlight)\n\n const { scrollRoot, viewport, content } = renderShell(surface, root)\n\n let maps = buildItemsDom(surface, ctx, filteredItems, allByValue, content)\n\n const controller: ListController = createListController({\n surfaceId: surface.id,\n contentEl: content,\n items: filteredItems,\n itemNodes: maps.itemNodes,\n defaultHighlight: hasDefault ? surface.defaultHighlight : undefined,\n onSelect: (value) => {\n const item = allByValue.get(value)\n if (item && surface.onSelect) surface.onSelect(item)\n },\n onHighlightChange: (value) => {\n const item = value ? allByValue.get(value) : 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 searchInput: searchable ? ctx.searchInput : undefined,\n })\n\n // ── Scroll area ──────────────────────────────────────────────────\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 // ── Focus the content element for non-searchable lists ───────────\n if (!searchable) {\n requestAnimationFrame(() => content.focus({ preventScroll: true }))\n }\n\n // ── Track visibility so stacked controllers don't fight ──────────\n const visibilityObserver = new MutationObserver(() => {\n controller.setActive(!root.hidden)\n })\n visibilityObserver.observe(root, {\n attributes: true,\n attributeFilter: [\"hidden\"],\n })\n\n // ── Cleanup ──────────────────────────────────────────────────────\n const cleanup = composeCleanups([\n () => controller.destroy(),\n () => ctx.highlight.hide(),\n () => visibilityObserver.disconnect(),\n unsubScroll,\n () => scrollSpreads.cleanupAll(),\n scrollArea.destroy,\n () => {\n maps.itemNodes.clear()\n maps.itemForValue.clear()\n maps.groupNodes.clear()\n root.replaceChildren()\n },\n ])\n\n // ── Search ───────────────────────────────────────────────────────\n let lastItemKey = filteredItems.map((i) => i.value).join(\"\\x00\")\n\n const onSearch = filterFn\n ? (query: string): void => {\n const next = all.filter((item) => filterFn(item, query))\n const nextKey = next.map((i) => i.value).join(\"\\x00\")\n if (nextKey === lastItemKey) return\n lastItemKey = nextKey\n maps = buildItemsDom(surface, ctx, next, allByValue, content)\n filteredItems = next\n controller.setItems(filteredItems, maps.itemNodes)\n }\n : undefined\n\n // ── Submit intent + highlight actions ────────────────────────────\n const submitIntent = {\n get() {\n const value = controller.getHighlightedValue()\n if (!value) return null\n const item = allByValue.get(value)\n if (!item || !surface.onSelect) return null\n return { label: \"Select\", perform: () => surface.onSelect!(item) }\n },\n subscribe(cb: () => void) {\n return controller.subscribe(cb)\n },\n }\n\n const highlightActions = {\n get(): readonly ShellAction[] {\n const value = controller.getHighlightedValue()\n if (!value) return []\n return allByValue.get(value)?.actions ?? []\n },\n subscribe(cb: () => void) {\n return controller.subscribe(cb)\n },\n }\n\n return { cleanup, onSearch, submitIntent, highlightActions }\n}\n","import type { Cleanup } from \"../../internal/cleanup\"\n\nexport interface ListControllerOptions {\n surfaceId: string\n contentEl: HTMLElement\n items: readonly { value: string }[]\n itemNodes: Map<string, HTMLElement>\n defaultHighlight?: string\n onSelect: (value: string) => void\n onHighlightChange?: (value: string | null) => void\n searchInput?: HTMLInputElement\n}\n\nexport interface ListController {\n getHighlightedValue(): string | null\n highlightValue(value: string | null): void\n setActive(active: boolean): void\n setItems(\n items: readonly { value: string }[],\n itemNodes: Map<string, HTMLElement>\n ): void\n subscribe(cb: () => void): Cleanup\n destroy(): void\n}\n\nexport function createListController(\n opts: ListControllerOptions\n): ListController {\n let items = opts.items\n let itemNodes = opts.itemNodes\n let highlighted: string | null = null\n let kbdMode = false\n const subs = new Set<() => void>()\n\n const { contentEl, onSelect, onHighlightChange } = opts\n\n contentEl.setAttribute(\"role\", \"listbox\")\n contentEl.tabIndex = 0\n contentEl.style.outline = \"none\"\n applyItemAria()\n\n if (opts.defaultHighlight && itemNodes.has(opts.defaultHighlight)) {\n setHighlight(opts.defaultHighlight, false)\n }\n\n function values(): string[] {\n return items.map((i) => i.value)\n }\n\n function notify(): void {\n for (const cb of subs) cb()\n }\n\n function applyItemAria(): void {\n for (const [value, el] of itemNodes) {\n el.setAttribute(\"role\", \"option\")\n el.id = `${opts.surfaceId}-item-${value}`\n }\n }\n\n function setHighlight(value: string | null, scroll = true): void {\n if (value === highlighted) return\n if (highlighted) {\n const prev = itemNodes.get(highlighted)\n if (prev) {\n prev.removeAttribute(\"data-highlighted\")\n prev.removeAttribute(\"data-kbd-highlighted\")\n prev.removeAttribute(\"aria-selected\")\n }\n }\n highlighted = value\n if (value) {\n const el = itemNodes.get(value)\n if (el) {\n el.setAttribute(\"data-highlighted\", \"\")\n el.setAttribute(\"aria-selected\", \"true\")\n if (kbdMode) el.setAttribute(\"data-kbd-highlighted\", \"\")\n contentEl.setAttribute(\"aria-activedescendant\", el.id)\n if (scroll) el.scrollIntoView({ block: \"nearest\" })\n }\n } else {\n contentEl.removeAttribute(\"aria-activedescendant\")\n }\n onHighlightChange?.(value)\n notify()\n }\n\n function enterKbd(): void {\n if (kbdMode) return\n kbdMode = true\n contentEl.setAttribute(\"data-kbd-nav\", \"\")\n }\n\n function exitKbd(): void {\n if (!kbdMode) return\n kbdMode = false\n contentEl.removeAttribute(\"data-kbd-nav\")\n if (highlighted) {\n itemNodes.get(highlighted)?.removeAttribute(\"data-kbd-highlighted\")\n }\n }\n\n function move(delta: number): void {\n const vals = values()\n if (vals.length === 0) return\n enterKbd()\n if (highlighted === null) {\n setHighlight(delta > 0 ? vals[0] : vals[vals.length - 1])\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n return\n }\n const idx = vals.indexOf(highlighted)\n const next = (idx + delta + vals.length) % vals.length\n setHighlight(vals[next])\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n }\n\n let active = true\n\n function handleKeydown(e: KeyboardEvent): void {\n if (!active) return\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault()\n move(1)\n break\n case \"ArrowUp\":\n e.preventDefault()\n move(-1)\n break\n case \"Home\": {\n e.preventDefault()\n enterKbd()\n const first = values()[0]\n if (first != null) {\n setHighlight(first)\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n }\n break\n }\n case \"End\": {\n e.preventDefault()\n enterKbd()\n const vals = values()\n const last = vals[vals.length - 1]\n if (last != null) {\n setHighlight(last)\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n }\n break\n }\n case \"Enter\":\n if (highlighted) {\n e.preventDefault()\n onSelect(highlighted)\n }\n break\n }\n }\n\n function handlePointermove(e: PointerEvent): void {\n const target = (e.target as HTMLElement).closest?.(\n \"[data-uidex-item-value]\"\n )\n if (!target) return\n const value = target.getAttribute(\"data-uidex-item-value\")\n if (!value || value === highlighted) return\n exitKbd()\n setHighlight(value, false)\n }\n\n function handleClick(e: MouseEvent): void {\n const target = (e.target as HTMLElement).closest?.(\n \"[data-uidex-item-value]\"\n )\n if (!target) return\n const value = target.getAttribute(\"data-uidex-item-value\")\n if (!value) return\n onSelect(value)\n }\n\n contentEl.addEventListener(\"keydown\", handleKeydown)\n contentEl.addEventListener(\"pointermove\", handlePointermove)\n contentEl.addEventListener(\"click\", handleClick)\n opts.searchInput?.addEventListener(\"keydown\", handleKeydown)\n\n return {\n getHighlightedValue: () => highlighted,\n highlightValue: (v) => setHighlight(v),\n setActive(v) {\n active = v\n },\n setItems(nextItems, nextNodes) {\n items = nextItems\n itemNodes = nextNodes\n applyItemAria()\n if (nextItems.length > 0) {\n setHighlight(nextItems[0].value)\n } else {\n setHighlight(null)\n }\n },\n subscribe(cb) {\n subs.add(cb)\n return () => subs.delete(cb)\n },\n destroy() {\n contentEl.removeEventListener(\"keydown\", handleKeydown)\n contentEl.removeEventListener(\"pointermove\", handlePointermove)\n contentEl.removeEventListener(\"click\", handleClick)\n opts.searchInput?.removeEventListener(\"keydown\", handleKeydown)\n subs.clear()\n },\n }\n}\n","import type { Cleanup, ShellAction, ViewContext } from \"../core/types\"\nimport type { ViewSurface } from \"../core/surface\"\nimport { renderDetailSurface } from \"./detail\"\nimport { renderListSurface } from \"./list\"\n\nexport interface SubmitIntent {\n label: string\n disabled?: boolean\n perform: () => void\n}\n\nexport interface SubmitIntentSource {\n get(): SubmitIntent | null\n subscribe(cb: () => void): Cleanup\n}\n\nexport interface HighlightActionsSource {\n get(): readonly ShellAction[]\n subscribe(cb: () => void): Cleanup\n}\n\nexport interface MountedSurface {\n cleanup: Cleanup\n onSearch?: (query: string) => void\n submitIntent?: SubmitIntentSource\n highlightActions?: HighlightActionsSource\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 }\n}\n","import type { EntityRef, Registry } from \"../../../shared/entities\"\nimport type { Cleanup } from \"../../internal/cleanup\"\nimport { html, render, createRef, ref } from \"../../internal/lit\"\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 { Router } from \"./router\"\nimport type { HighlightController, View, ViewContext } 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: Router\n session: SessionStore\n registry: Registry\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 scrollRootRef = createRef<HTMLDivElement>()\n const hostRef = createRef<HTMLDivElement>()\n\n // Render scroll-root + host into the container\n const fragment = document.createDocumentFragment()\n render(\n html`\n <div\n ${ref(scrollRootRef)}\n data-uidex-view-scroll-root\n class=${SCROLL_ROOT_CLASS}\n >\n <div\n ${ref(hostRef)}\n data-uidex-view-slot\n data-uidex-view-id=${view.id}\n class=${HOST_CLASS}\n ></div>\n </div>\n `,\n fragment\n )\n\n const scrollRoot = scrollRootRef.value!\n const host = hostRef.value!\n deps.container.appendChild(fragment)\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 views: deps.views,\n push: (target) => {\n if (!deps.views.get(target.id)) return\n deps.session.mode.transition.pushView({\n id: target.id,\n ref: target.ref ?? null,\n })\n },\n pop: () => deps.session.mode.transition.popOrTransition(),\n close: () => deps.session.mode.transition.dismiss(),\n pinHighlight: (r: EntityRef) => deps.session.highlight.pin(r),\n searchInput: deps.searchInput,\n highlight: deps.highlight,\n getStack: () => deps.session.getState().stack,\n }\n\n let surfaceResult: MountedSurface\n try {\n if (view.render) {\n const result = view.render(ctx, host)\n const cleanup = typeof result === \"function\" ? result : () => {}\n surfaceResult = {\n cleanup: () => {\n try {\n cleanup()\n } finally {\n host.replaceChildren()\n }\n },\n }\n } else {\n // validate() guarantees `surface` exists when `render` is absent.\n const surface = view.surface!(ctx)\n surfaceResult = renderSurface(surface, ctx, host)\n }\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 } from \"lucide\"\nimport { Z_CHROME } from \"../../surface/constants\"\nimport type { PaletteShortcut } from \"../../surface/keys\"\nimport { html, render, svg, createRef, ref } from \"../../internal/lit\"\nimport { icon } from \"../../internal/lit-icon\"\nimport { createActionsPopup, type ActionsPopupHandle } from \"./actions-popup\"\nimport { kbdTpl } 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-3 py-1.5 text-xs\"\n\nconst FOOTER_SIDE_CLASS = \"flex min-w-0 items-center\"\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 shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-2.5 py-1.5 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 disabled:pointer-events-none disabled:opacity-50\"\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 _opts?: { shortcut?: PaletteShortcut }\n): StackShell {\n const backdropRef = createRef<HTMLDivElement>()\n const viewportRef = createRef<HTMLDivElement>()\n const frameRef = createRef<HTMLDivElement>()\n const headerRef = createRef<HTMLElement>()\n const backBtnRef = createRef<HTMLButtonElement>()\n const searchIconRef = createRef<HTMLSpanElement>()\n const searchInputRef = createRef<HTMLInputElement>()\n const headerTitleRef = createRef<HTMLDivElement>()\n const hostContainerRef = createRef<HTMLDivElement>()\n const footerLeftRef = createRef<HTMLDivElement>()\n const footerRightRef = createRef<HTMLDivElement>()\n const actionsPopupSlotRef = createRef<HTMLDivElement>()\n\n const actionsPopup = createActionsPopup({\n onOpenChange: (open) => {\n if (hostContainerRef.value)\n hostContainerRef.value.style.pointerEvents = open ? \"none\" : \"\"\n if (!open)\n requestAnimationFrame(() =>\n searchInputRef.value?.focus({ preventScroll: true })\n )\n },\n })\n\n const logo = createUidexLogo()\n logo.setAttribute(\"data-uidex-view-stack-footer-logo\", \"\")\n\n const onBackClick = () => callbacks.onBack()\n const onSearchInput = () => {\n if (searchInputRef.value)\n callbacks.onSearchInput(searchInputRef.value.value)\n }\n const onViewportClick = (e: MouseEvent) => {\n if (e.target === viewportRef.value) callbacks.onBackdropClick()\n }\n\n render(\n html`\n <div\n ${ref(backdropRef)}\n data-uidex-view-backdrop\n class=${BACKDROP_CLASS}\n style=\"z-index: ${Z_CHROME}\"\n ></div>\n <div\n ${ref(viewportRef)}\n data-uidex-view-viewport\n class=${VIEWPORT_CLASS}\n style=\"z-index: ${Z_CHROME}\"\n @click=${onViewportClick}\n >\n <div ${ref(frameRef)} data-uidex-view-stack-frame class=${FRAME_CLASS}>\n <header\n ${ref(headerRef)}\n data-uidex-view-stack-header\n class=${HEADER_CLASS}\n >\n <div data-uidex-view-stack-search class=${SEARCH_WRAPPER_CLASS}>\n <button\n ${ref(backBtnRef)}\n type=\"button\"\n data-uidex-view-stack-back\n aria-label=\"Back\"\n class=${BACK_BUTTON_CLASS}\n hidden\n @click=${onBackClick}\n >\n ${icon(ArrowLeft, BACK_ICON_CLASS)}\n </button>\n <span\n ${ref(searchIconRef)}\n data-uidex-view-stack-search-icon\n aria-hidden=\"true\"\n class=${SEARCH_ICON_WRAP_CLASS}\n >${icon(Search, SEARCH_ICON_CLASS)}</span\n >\n <input\n ${ref(searchInputRef)}\n type=\"text\"\n data-uidex-search-input\n placeholder=\"Search for command...\"\n class=${SEARCH_INPUT_CLASS}\n @input=${onSearchInput}\n />\n <div\n ${ref(headerTitleRef)}\n data-uidex-view-stack-title\n class=${HEADER_TITLE_CLASS}\n hidden\n ></div>\n </div>\n </header>\n <div\n ${ref(hostContainerRef)}\n data-uidex-view-stack-hosts\n class=${HOST_CONTAINER_CLASS}\n ></div>\n <footer data-uidex-view-stack-footer class=${FOOTER_CLASS}>\n <div\n ${ref(footerLeftRef)}\n data-uidex-view-stack-footer-left\n class=${FOOTER_SIDE_CLASS}\n ></div>\n <div\n ${ref(footerRightRef)}\n data-uidex-view-stack-footer-right\n class=${FOOTER_SIDE_CLASS}\n ></div>\n </footer>\n <div ${ref(actionsPopupSlotRef)}></div>\n </div>\n </div>\n `,\n container\n )\n\n // Append the actions popup element into its slot\n actionsPopupSlotRef.value!.replaceWith(actionsPopup.element)\n\n const backdrop = backdropRef.value!\n const frame = frameRef.value!\n const header = headerRef.value! as HTMLElement\n const backBtn = backBtnRef.value!\n const searchIcon = searchIconRef.value!\n const searchInput = searchInputRef.value!\n const headerTitle = headerTitleRef.value!\n const hostContainer = hostContainerRef.value!\n const footerLeft = footerLeftRef.value!\n const footerRight = footerRightRef.value!\n const viewport = viewportRef.value!\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 actionsPopup.destroy()\n viewport.remove()\n backdrop.remove()\n },\n }\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 render(\n html`\n <svg\n viewBox=\"0 0 30 36\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n class=${LOGO_ICON_CLASS}\n >\n ${svg`\n <rect x=\"1\" y=\"5\" width=\"22\" height=\"28\" rx=\"3\"\n fill=\"currentColor\" opacity=\"0.18\"\n transform=\"rotate(-6, 12, 19)\" />\n <rect x=\"7\" y=\"1\" width=\"22\" height=\"28\" rx=\"3\"\n fill=\"currentColor\" />\n `}\n </svg>\n `,\n wrap\n )\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 render(html`<span>${label}</span>${kbdTpl(key)}`, wrap)\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 interface FooterHintButton {\n element: HTMLButtonElement\n setLabel(label: string): void\n setDisabled(disabled: boolean): void\n}\n\nexport function createFooterHintButton(\n key: string,\n label: string,\n onClick: () => void\n): FooterHintButton {\n const btn = document.createElement(\"button\")\n btn.setAttribute(\"type\", \"button\")\n btn.setAttribute(\"aria-label\", label)\n btn.className = ACTIONS_TRIGGER_CLASS\n\n const textRef = createRef<HTMLSpanElement>()\n render(html`<span ${ref(textRef)}>${label}</span>${kbdTpl(key)}`, btn)\n btn.addEventListener(\"click\", onClick)\n\n return {\n element: btn,\n setLabel(next: string) {\n if (textRef.value) textRef.value.textContent = next\n btn.setAttribute(\"aria-label\", next)\n },\n setDisabled(disabled: boolean) {\n btn.disabled = disabled\n btn.setAttribute(\"aria-disabled\", String(disabled))\n },\n }\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","export const MENU_POPUP_CLASS =\n \"bg-popover shadow-lg/5 not-dark:bg-clip-padding relative flex min-w-32 rounded-lg border outline-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] focus:outline-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\"\n\nexport const MENU_LIST_CLASS = \"flex flex-col p-1\"\n\nexport interface MenuItemDescriptor {\n id: string\n label: string\n shortcut?: string\n disabled?: boolean\n leading?: Node | null\n trailing?: Node | null\n onSelect?: () => void\n}\n","import { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { html, render, createRef, ref } from \"../../internal/lit\"\nimport {\n createMenu as createMenuMachine,\n type MenuApi,\n} from \"../../machines/menu\"\nimport { createPersistentSpreads } from \"../builder/spread-props\"\nimport {\n ACTIONS_SHORTCUT,\n formatShortcutLabel,\n type PaletteShortcut,\n} from \"../../surface/keys\"\nimport { kbdTpl } from \"../../ui/kbd\"\nimport { LIST_ITEM_CLASS, LIST_ITEM_STATE_CLASS } from \"../../ui/list-item\"\nimport {\n MENU_LIST_CLASS,\n MENU_POPUP_CLASS,\n type MenuItemDescriptor,\n} from \"../../ui/menu\"\nimport { createIconTile } from \"../primitives/icon-tile\"\nimport { fillRowWithHandle } from \"../primitives/row\"\nimport type { ShellAction } from \"./types\"\n\nconst TRIGGER_CLASS =\n \"inline-flex shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-2.5 py-1.5 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 ActionsPopupHandle {\n readonly trigger: HTMLButtonElement\n readonly element: HTMLElement\n setActions(actions: ShellAction[]): void\n open(): void\n close(): void\n isOpen(): 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 leading: action.icon?.() ?? null,\n trailing: null,\n }))\n}\n\nfunction itemsKey(items: readonly MenuItemDescriptor[]): string {\n return items.map((i) => i.id).join(\"\\x00\")\n}\n\nexport function createActionsPopup(opts?: {\n shortcut?: PaletteShortcut\n onOpenChange?: (open: boolean) => void\n}): ActionsPopupHandle {\n let items: MenuItemDescriptor[] = []\n let actionById = new Map<string, ShellAction>()\n const spreads = createPersistentSpreads()\n let lastKey = \"\"\n let rowByValue = new Map<string, HTMLElement>()\n let labelByValue = new Map<string, HTMLSpanElement>()\n const cleanups: Cleanup[] = []\n\n // Build trigger imperatively — it needs a ref for zag spreading\n const triggerRef = createRef<HTMLButtonElement>()\n const positionerRef = createRef<HTMLDivElement>()\n const popupRef = createRef<HTMLDivElement>()\n const listRef = createRef<HTMLUListElement>()\n\n // Render the entire structure into a document fragment\n const fragment = document.createDocumentFragment()\n render(\n html`\n <div ${ref(positionerRef)} data-slot=\"menu-positioner\">\n <button\n ${ref(triggerRef)}\n type=\"button\"\n data-uidex-actions-trigger\n class=${TRIGGER_CLASS}\n >\n <span>Actions</span>\n ${kbdTpl(formatShortcutLabel(opts?.shortcut ?? ACTIONS_SHORTCUT))}\n </button>\n <div\n ${ref(popupRef)}\n class=\"${MENU_POPUP_CLASS} w-56\"\n data-uidex-primitive=\"menu\"\n data-slot=\"menu-popup\"\n >\n <ul\n ${ref(listRef)}\n class=\"${MENU_LIST_CLASS} w-full\"\n role=\"menu\"\n aria-label=\"Actions\"\n data-slot=\"menu-list\"\n ></ul>\n </div>\n </div>\n `,\n fragment\n )\n\n const trigger = triggerRef.value!\n const positioner = positionerRef.value!\n const popup = popupRef.value!\n const list = listRef.value!\n\n const handle = createMenuMachine({\n getRootNode: () => {\n const rn = positioner.getRootNode()\n if (rn instanceof ShadowRoot || rn instanceof Document) return rn\n return positioner.ownerDocument ?? document\n },\n closeOnSelect: true,\n positioning: {\n placement: \"top-end\",\n gutter: 4,\n },\n onOpenChange: ({ open }: { open: boolean }) => opts?.onOpenChange?.(open),\n onSelect: (details: { value: string }) => {\n const action = actionById.get(details.value)\n if (!action) return\n const result = action.perform()\n if (result instanceof Promise) {\n const labelEl = labelByValue.get(action.id)\n if (labelEl) {\n const original = labelEl.textContent\n labelEl.textContent = \"Done!\"\n setTimeout(() => {\n labelEl.textContent = original\n }, 800)\n }\n }\n },\n })\n\n function rebuild(key: string): void {\n spreads.cleanupAll()\n rowByValue = new Map()\n labelByValue = new Map()\n\n render(\n html`${items.map(\n (item) =>\n html`<li\n class=${cn(LIST_ITEM_CLASS, LIST_ITEM_STATE_CLASS)}\n data-slot=\"menu-item\"\n data-uidex-menu-item=${item.id}\n ></li>`\n )}`,\n list\n )\n\n const rows = list.querySelectorAll<HTMLElement>(\"[data-uidex-menu-item]\")\n rows.forEach((row, i) => {\n const item = items[i]\n const leading = item.leading ? createIconTile(item.leading) : null\n const { label: labelEl } = fillRowWithHandle(row, {\n leading,\n label: item.label,\n trailing: item.shortcut ?? item.trailing ?? null,\n })\n rowByValue.set(item.id, row)\n labelByValue.set(item.id, labelEl)\n })\n\n lastKey = key\n }\n\n function applyProps(): void {\n const api: MenuApi = handle.api()\n spreads.apply(trigger, api.getTriggerProps() as Record<string, unknown>)\n spreads.apply(\n positioner,\n api.getPositionerProps() as Record<string, unknown>\n )\n spreads.apply(popup, 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 key = itemsKey(items)\n if (key !== lastKey) rebuild(key)\n applyProps()\n }\n\n rebuild(itemsKey(items))\n applyProps()\n\n const unsub = handle.runner.subscribe(tick)\n cleanups.push(unsub)\n\n return {\n trigger,\n element: positioner,\n setActions(actions) {\n items = toDescriptors(actions)\n actionById = new Map(actions.map((a) => [a.id, a]))\n const key = itemsKey(items)\n if (key === lastKey) return\n rebuild(key)\n applyProps()\n },\n open: () => handle.api().setOpen(true),\n close: () => handle.api().setOpen(false),\n isOpen: () => handle.api().open,\n destroy: () => {\n composeCleanups(cleanups)()\n spreads.cleanupAll()\n handle.destroy()\n positioner.remove()\n },\n }\n}\n","import { KIND_STYLE, type Registry } from \"../../../shared/entities\"\nimport { detectDev } from \"../../internal/dev\"\nimport { render as litRender, nothing } from \"../../internal/lit\"\nimport type { SessionStore } from \"../../session\"\nimport type { PaletteShortcut } from \"../../surface/keys\"\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 { Router } from \"./router\"\nimport {\n createFooterDivider,\n createFooterHintButton,\n createHint,\n createStackShell,\n type StackShell,\n} from \"./shell\"\nimport type {\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: Router\n session: SessionStore\n registry: Registry\n highlight: HighlightController\n shortcut?: PaletteShortcut\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 if (searchInput.hidden && !isFocusedWithin(entry.host)) {\n const fallback = entry.host.querySelector<HTMLElement>(\n \"[tabindex], button, input, select, textarea, a[href], [data-uidex-list-content]\"\n )\n fallback?.focus({ preventScroll: true })\n }\n }\n focus()\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(focus)\n }\n}\n\nfunction isFocusedWithin(host: HTMLElement): boolean {\n const rootNode = host.getRootNode()\n const active =\n rootNode instanceof ShadowRoot\n ? rootNode.activeElement\n : document.activeElement\n return active instanceof HTMLElement && host.contains(active)\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\n/**\n * Resolve a view prop that may be a static value or a `(ctx) => value`\n * function. Functions are invoked defensively: a throw or nullish return\n * yields `fallback`. Static values are returned as-is (also coalesced to\n * `fallback` when nullish), matching the prior per-prop helpers.\n */\nfunction resolveProp<T>(\n view: View,\n ctx: ViewContext,\n value: T | ((ctx: ViewContext) => T | undefined) | undefined,\n propName: string,\n fallback: T\n): T {\n if (typeof value === \"function\") {\n try {\n return (value as (ctx: ViewContext) => T | undefined)(ctx) ?? fallback\n } catch (err) {\n console.error(`[uidex] view \"${view.id}\" ${propName}() threw`, err)\n return fallback\n }\n }\n return value ?? fallback\n}\n\nexport function createViewStack(options: ViewStackOptions): ViewStack {\n const { container, views, session, registry, highlight } = options\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 let hintChangeSub: (() => void) | null = null\n let highlightActionsSub: (() => void) | null = null\n\n function ensureShell(): StackShell {\n if (shell) return shell\n shell = createStackShell(\n container,\n {\n onBack: () => {\n const { stack } = session.nav.getState()\n if (stack.length <= 1) {\n session.mode.transition.openPalette()\n } else {\n session.mode.transition.popOrTransition()\n }\n },\n onBackdropClick: () => session.mode.transition.dismiss(),\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.mode.transition.pushView({\n id: \"command-palette\",\n ref: null,\n })\n },\n },\n { shortcut: options.shortcut }\n )\n return shell\n }\n\n function destroyShell(): void {\n hintChangeSub?.()\n hintChangeSub = null\n highlightActionsSub?.()\n highlightActionsSub = null\n shell?.destroy()\n shell = null\n pendingFallbackQuery = null\n litRender(nothing, container)\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 /** Toggle the back button vs. the search icon based on stack position. */\n function updateNavButtons(shell: StackShell, top: MountedEntry): void {\n const atRoot = mounted.length <= 1 && top.view.id === \"command-palette\"\n shell.backBtn.hidden = atRoot\n shell.searchIcon.hidden = !atRoot\n }\n\n /** Show the search input for searchable views, otherwise the title text. */\n function updateTitle(shell: StackShell, top: MountedEntry): void {\n const searchable = top.view.searchable !== false\n shell.searchInput.hidden = !searchable\n const titleText = searchable\n ? \"\"\n : resolveProp<string>(top.view, top.ctx, top.view.title, \"title\", \"\")\n shell.headerTitle.textContent = titleText\n shell.headerTitle.hidden = searchable || !titleText\n }\n\n /** Render the footer-left chip for the active ref, or the logo fallback. */\n function updateFooterChip(shell: StackShell, top: MountedEntry): void {\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\n /**\n * Build the enter-hint button (or static hint) into `footerItems`. When the\n * view exposes a live submit-intent, subscribe so the button stays in sync.\n */\n function buildEnterHint(top: MountedEntry, footerItems: HTMLElement[]): void {\n const enterHint = resolveProp<ShellHint[]>(\n top.view,\n top.ctx,\n top.view.hints,\n \"hints\",\n []\n ).find((h) => h.key.includes(\"↵\"))\n const src = top.mounted.submitIntent\n if (src) {\n const key = enterHint?.key ?? \"↵\"\n const intent = src.get()\n const fallbackLabel = enterHint?.label ?? \"Open\"\n const hint = createFooterHintButton(\n key,\n intent?.label ?? fallbackLabel,\n () => src.get()?.perform()\n )\n footerItems.push(hint.element)\n hint.setDisabled(intent?.disabled ?? false)\n hintChangeSub = src.subscribe(() => {\n const next = src.get()\n hint.setLabel(next?.label ?? fallbackLabel)\n hint.setDisabled(next?.disabled ?? false)\n })\n } else if (enterHint) {\n footerItems.push(createHint(enterHint.key, enterHint.label))\n }\n }\n\n /**\n * Populate the actions popup (view + highlight actions), append the footer\n * items and trigger, and subscribe to live highlight-action changes.\n */\n function buildActions(\n shell: StackShell,\n top: MountedEntry,\n footerItems: HTMLElement[]\n ): void {\n const actionsDivider = createFooterDivider()\n const viewActions = resolveProp<ShellAction[]>(\n top.view,\n top.ctx,\n top.view.actions,\n \"actions\",\n []\n )\n const hlSrc = top.mounted.highlightActions\n\n const syncActions = (): void => {\n const hlActions = hlSrc?.get() ?? []\n const combined = [...hlActions, ...viewActions]\n shell.actionsPopup.setActions(combined)\n const visible = combined.length > 0\n shell.actionsPopup.trigger.hidden = !visible\n actionsDivider.hidden = !visible || footerItems.length === 0\n }\n\n if (hlSrc) {\n highlightActionsSub = hlSrc.subscribe(syncActions)\n }\n\n for (let i = 0; i < footerItems.length; i++) {\n if (i > 0) shell.footerRight.append(createFooterDivider())\n shell.footerRight.append(footerItems[i])\n }\n shell.footerRight.append(actionsDivider)\n shell.footerRight.append(shell.actionsPopup.trigger)\n syncActions()\n }\n\n function updateChrome(): void {\n if (!shell) return\n const top = mounted[mounted.length - 1]\n if (!top) return\n\n updateNavButtons(shell, top)\n updateTitle(shell, top)\n updateFooterChip(shell, top)\n\n // Rebuild the footer-right region (enter-hint + actions popup). Drop the\n // prior per-entry subscriptions before re-subscribing in the helpers.\n hintChangeSub?.()\n hintChangeSub = null\n highlightActionsSub?.()\n highlightActionsSub = null\n shell.footerRight.replaceChildren()\n const footerItems: HTMLElement[] = []\n buildEnterHint(top, footerItems)\n buildActions(shell, top, footerItems)\n }\n\n function render(): void {\n if (!container.isConnected) return\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 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 type { EntityKind, EntityRef } from \"../../../shared/entities\"\nimport type { ViewStackEntry } from \"../../session/types\"\n\nexport const BUILT_IN_VIEW_IDS = {\n commandPalette: \"command-palette\",\n elements: \"elements\",\n explorePage: \"explore-page\",\n features: \"features\",\n flows: \"flows\",\n glossary: \"glossary\",\n pages: \"pages\",\n primitives: \"primitives\",\n regions: \"regions\",\n widgets: \"widgets\",\n} as const\n\nexport const LIST_VIEW_FOR_KIND: Record<EntityKind, string> = {\n element: BUILT_IN_VIEW_IDS.elements,\n feature: BUILT_IN_VIEW_IDS.features,\n page: BUILT_IN_VIEW_IDS.pages,\n widget: BUILT_IN_VIEW_IDS.widgets,\n region: BUILT_IN_VIEW_IDS.regions,\n primitive: BUILT_IN_VIEW_IDS.primitives,\n flow: BUILT_IN_VIEW_IDS.flows,\n route: BUILT_IN_VIEW_IDS.pages,\n}\n\nexport const DETAIL_VIEW_FOR_KIND: Record<EntityKind, string> = {\n element: \"component-detail\",\n feature: \"feature-detail\",\n page: \"page-detail\",\n widget: \"widget-detail\",\n region: \"region-detail\",\n primitive: \"primitive-detail\",\n flow: \"flow-detail\",\n route: \"page-detail\",\n}\n\nexport const COMMAND_PALETTE_ENTRY: ViewStackEntry = {\n id: BUILT_IN_VIEW_IDS.commandPalette,\n ref: null,\n}\n\nexport function parentList(ref: EntityRef | null): ViewStackEntry | null {\n if (!ref) return COMMAND_PALETTE_ENTRY\n return { id: LIST_VIEW_FOR_KIND[ref.kind], ref: null }\n}\n\nexport function parentDetail(ref: EntityRef | null): ViewStackEntry | null {\n if (!ref) return COMMAND_PALETTE_ENTRY\n return { id: DETAIL_VIEW_FOR_KIND[ref.kind], ref }\n}\n","import {\n Compass,\n Copy,\n ExternalLink,\n Star,\n StarOff,\n createElement as createLucideElement,\n} from \"lucide\"\nimport {\n displayName,\n KIND_STYLE,\n type Entity,\n type EntityRef,\n type Page,\n} from \"../../../shared/entities\"\nimport { formatShortcutLabel, type PaletteShortcut } from \"../../surface/keys\"\nimport { matchesQuery } from \"../builder/filter\"\nimport { formatLocation } from \"../builder/format-location\"\nimport { buildPageRouteMap, collectPageContext } from \"../builder/page-context\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { ShellAction, 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\nfunction openAction(onSelect: () => void): ShellAction {\n return {\n id: \"open\",\n label: \"Open\",\n icon: () => createLucideElement(ExternalLink),\n perform: onSelect,\n }\n}\n\nfunction favoriteAction(ref: EntityRef, ctx: ViewContext): ShellAction {\n const isFav = ctx.views.isFavorite(ref)\n return {\n id: \"toggle-favorite\",\n label: isFav ? \"Remove from Favorites\" : \"Add to Favorites\",\n shortcut: \"⇧⌘F\",\n icon: () => createLucideElement(isFav ? StarOff : Star),\n perform: () => {\n ctx.views.toggleFavorite(ref)\n ctx.close()\n ctx.push({ id: BUILT_IN_VIEW_IDS.commandPalette, ref: null })\n },\n }\n}\n\nfunction entityActions(\n ref: EntityRef,\n entity: Entity | undefined,\n ctx: ViewContext,\n onSelect: () => void\n): ShellAction[] {\n const actions: ShellAction[] = [openAction(onSelect)]\n if (entity && \"loc\" in entity && entity.loc) {\n const path = formatLocation(entity.loc)\n if (path) {\n actions.push({\n id: \"copy-path\",\n label: \"Copy Source Path\",\n icon: () => createLucideElement(Copy),\n async perform() {\n try {\n await navigator.clipboard.writeText(path)\n } catch {\n // silent\n }\n },\n })\n }\n }\n actions.push(favoriteAction(ref, ctx))\n return actions\n}\n\nfunction viewActions(onSelect: () => void): ShellAction[] {\n return [openAction(onSelect)]\n}\n\nconst CURRENT_PAGE_GROUP = PALETTE_GROUPS.currentPage\n\nfunction pageDetailsRow(\n page: Page,\n pageRoutes: ReadonlyMap<string, string>,\n ctx: ViewContext\n): PaletteItem {\n const ref: EntityRef = { kind: \"page\", id: page.id }\n const onSelect = () => ctx.views.navigate(ref)\n const item: PaletteItem = {\n value: `entity:${ref.kind}:${ref.id}`,\n label: displayName(page),\n group: CURRENT_PAGE_GROUP,\n tag: `${ref.kind}:${ref.id}`,\n preview: ref,\n entityChip: { entity: page },\n actions: entityActions(ref, page, ctx, onSelect),\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, ctx: ViewContext): PaletteItem {\n const onSelect = () =>\n ctx.push({ id: BUILT_IN_VIEW_IDS.explorePage, ref: null })\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 actions: viewActions(onSelect),\n payload: { type: \"view\", id: BUILT_IN_VIEW_IDS.explorePage },\n }\n}\n\nconst PALETTE_EXCLUDED_VIEWS: Set<string> = new Set([\n BUILT_IN_VIEW_IDS.commandPalette,\n BUILT_IN_VIEW_IDS.explorePage,\n BUILT_IN_VIEW_IDS.flows,\n BUILT_IN_VIEW_IDS.elements,\n BUILT_IN_VIEW_IDS.widgets,\n BUILT_IN_VIEW_IDS.regions,\n BUILT_IN_VIEW_IDS.pages,\n BUILT_IN_VIEW_IDS.features,\n BUILT_IN_VIEW_IDS.primitives,\n])\n\nfunction collectNavigation(ctx: ViewContext): PaletteItem[] {\n const out: PaletteItem[] = []\n for (const view of ctx.views.list()) {\n if (PALETTE_EXCLUDED_VIEWS.has(view.id)) continue\n if (!view.palette) continue\n const onSelect = () => ctx.push({ id: view.id, ref: null })\n const subtitle =\n typeof view.palette.subtitle === \"function\"\n ? view.palette.subtitle()\n : view.palette.subtitle\n out.push({\n value: `view:${view.id}`,\n label: view.palette.label,\n subtitle,\n group: view.palette.group ?? PALETTE_GROUPS.commands,\n shortcut: view.palette.shortcut,\n tag: view.id,\n leading: view.palette.icon,\n actions: viewActions(onSelect),\n payload: { type: \"view\", id: view.id },\n })\n }\n return out\n}\n\nexport function createCommandPaletteView(shortcut?: PaletteShortcut): View {\n const shortcutLabel = formatShortcutLabel(shortcut ?? { key: \"k\" })\n return {\n id: BUILT_IN_VIEW_IDS.commandPalette,\n palette: { label: \"Command Palette\", shortcut: shortcutLabel },\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 const favSet = new Set(\n ctx.views.favorites().map((r) => `${r.kind}:${r.id}`)\n )\n\n for (const ref of ctx.views.favorites()) {\n if (ref.kind === \"route\") continue\n const entity = ctx.registry.get(ref.kind, ref.id)\n if (!entity) continue\n const style = KIND_STYLE[ref.kind]\n const onSelect = () => ctx.views.navigate(ref)\n items.push({\n value: `favorite:${ref.kind}:${ref.id}`,\n label: displayName(entity),\n tag: `${ref.kind}:${ref.id}`,\n group: PALETTE_GROUPS.favorites,\n preview: ref,\n entityChip: { entity },\n leading: () => createLucideElement(style.icon),\n actions: entityActions(ref, entity, ctx, onSelect),\n payload: { type: \"entity\", ref },\n })\n }\n\n if (pageCtx.pageEntity) {\n items.push(pageDetailsRow(pageCtx.pageEntity, pageRoutes, ctx))\n }\n\n const onPageCount = pageCtx.composed.length + pageCtx.dom.length\n if (onPageCount > 0) items.push(explorePageRow(onPageCount, ctx))\n\n items.push(...collectNavigation(ctx))\n\n for (const ref of ctx.views.recents()) {\n if (ref.kind === \"route\") continue\n if (favSet.has(`${ref.kind}:${ref.id}`)) continue\n const entity = ctx.registry.get(ref.kind, ref.id)\n if (!entity) continue\n const style = KIND_STYLE[ref.kind]\n const onSelect = () => ctx.views.navigate(ref)\n items.push({\n value: `recent:${ref.kind}:${ref.id}`,\n label: displayName(entity),\n tag: `${ref.kind}:${ref.id}`,\n group: PALETTE_GROUPS.recents,\n preview: ref,\n entityChip: { entity },\n leading: () => createLucideElement(style.icon),\n actions: entityActions(ref, entity, ctx, onSelect),\n payload: { type: \"entity\", ref },\n })\n }\n\n const groupOrder = new Map<string, number>()\n for (const item of items) {\n const g = item.group ?? \"\"\n if (!groupOrder.has(g)) groupOrder.set(g, groupOrder.size)\n }\n items.sort(\n (a, b) =>\n (groupOrder.get(a.group ?? \"\") ?? 0) -\n (groupOrder.get(b.group ?? \"\") ?? 0)\n )\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({\n id: palette.payload.id,\n ref: palette.payload.ref ?? null,\n })\n return\n }\n ctx.views.navigate(palette.payload.ref)\n },\n }\n },\n }\n}\n","import type { Location } from \"../../../shared/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 type { Entity, EntityRef, Page } from \"../../../shared/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/**\n * Find the best-matching route for the current pathname. Returns both the\n * route path pattern and the page id, or `null` when no route matches.\n */\nfunction findCurrentRoute(\n registry: ViewContext[\"registry\"]\n): { path: string; page: string } | null {\n if (typeof location === \"undefined\") return null\n const pathname = location.pathname || \"/\"\n const routes = 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\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 return findCurrentRoute(ctx.registry)?.page ?? null\n}\n\n/** Resolve the route pattern for the current URL (e.g. `/:orgSlug/projects/:slug`). */\nexport function findCurrentRoutePath(\n registry: ViewContext[\"registry\"]\n): string | null {\n return findCurrentRoute(registry)?.path ?? 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 { domToPng, domToWebp } from \"modern-screenshot\"\nimport { SURFACE_HOST_CLASS } from \"../surface/constants\"\n\n/**\n * WebP (lossy) instead of PNG: a full-page capture re-rasterizes every inlined\n * image (including screenshots already on the page), and PNG keeps that\n * lossless — easily tens of MB. WebP at this quality is typically 5-10× smaller\n * with no perceptual loss, which keeps the common case a single sub-`maxPayload`\n * WS frame. Oversized captures still stream in chunks (see cloud `submit`).\n */\nconst WEBP_QUALITY = 0.85\n\nexport interface CaptureScreenshotOptions {\n target?: HTMLElement\n maxWidth?: number\n /**\n * Output encoding. Defaults to \"webp\" (small — for report uploads). Use \"png\"\n * for clipboard writes: the async Clipboard API only reliably accepts\n * image/png, so a webp `ClipboardItem` throws on Chrome/Safari. (On engines\n * without canvas WebP encode — older Safari/WebViews — `domToWebp` already\n * falls back to a PNG data URL; downstream sniffs the real MIME, so that path\n * stays correct, just larger.)\n */\n format?: \"webp\" | \"png\"\n}\n\nfunction resolveBackgroundColor(el: HTMLElement): string {\n let node: HTMLElement | null = el\n while (node) {\n const bg = getComputedStyle(node).backgroundColor\n if (bg && bg !== \"transparent\" && bg !== \"rgba(0, 0, 0, 0)\") return bg\n node = node.parentElement\n }\n return \"#ffffff\"\n}\n\nfunction isUidexChrome(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n const el = node as Element\n if (el.shadowRoot !== null) return true\n return el.classList.contains(SURFACE_HOST_CLASS)\n}\n\nexport async function captureScreenshot(\n options: CaptureScreenshotOptions = {}\n): Promise<string> {\n if (typeof document === \"undefined\") {\n throw new Error(\"captureScreenshot: no document available\")\n }\n const target = options.target ?? document.body\n if (!target) throw new Error(\"captureScreenshot: no target\")\n\n const width = target.scrollWidth || target.clientWidth\n const scale =\n options.maxWidth && width > options.maxWidth ? options.maxWidth / width : 1\n\n const padding = 16\n const height = target.scrollHeight || target.clientHeight\n\n const encode = options.format === \"png\" ? domToPng : domToWebp\n return encode(target, {\n scale,\n quality: WEBP_QUALITY,\n width: width + padding * 2,\n height: height + padding * 2,\n backgroundColor: resolveBackgroundColor(target),\n style: { padding: `${padding}px` },\n filter: (node) => !isUidexChrome(node),\n })\n}\n","export interface ReportContext {\n url: string\n route?: string\n pageTitle?: string\n viewport: { w: number; h: number }\n userAgent: string\n timestamp: string\n}\n\nexport function captureReportContext(): ReportContext {\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 return {\n url: loc?.href ?? \"\",\n route: loc?.pathname,\n userAgent: nav?.userAgent ?? \"\",\n pageTitle: doc?.title,\n timestamp: new Date().toISOString(),\n viewport: {\n w: win?.innerWidth ?? 0,\n h: win?.innerHeight ?? 0,\n },\n }\n}\n","import {\n type Entity,\n type EntityRef,\n type Flow,\n} from \"../../../shared/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\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 EntityRef,\n type Location,\n type MetaEntityKind,\n} from \"../../../shared/entities\"\nimport { captureScreenshot } from \"../../internal/screenshot\"\nimport { DOM_BACKED_KINDS } from \"../../surface/constants\"\nimport { resolveEntityElement } from \"../../surface/inspector\"\nimport { captureReportContext } from \"../../report/capture\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n} from \"../core/surface\"\nimport { parentList } 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 DETAIL_HINTS: ShellHint[] = [{ key: \"↵\", label: \"Open\" }]\n\nexport function copyPathAction(ref: EntityRef, loc?: Location): DetailAction {\n const identifier = `${ref.kind}:${ref.id}`\n const path = formatLocation(loc) ?? identifier\n return {\n id: \"copy-path\",\n label: \"Copy Source Path\",\n ariaLabel: `Copy path ${path}`,\n icon: \"copy\",\n copy: path,\n intent: { kind: \"external\", describe: \"clipboard\" },\n }\n}\n\nexport function buildSnapshotMarkdown(ref: EntityRef, loc?: Location): string {\n const snapshot = captureReportContext()\n const sourcePath = formatLocation(loc)\n const lines: string[] = [\n `#### ${ref.kind}: ${ref.id}`,\n `- **Kind:** ${ref.kind}`,\n `- **ID:** \\`${ref.id}\\``,\n ...(sourcePath ? [`- **Source:** \\`${sourcePath}\\``] : []),\n `#### Context`,\n `- **URL:** ${snapshot.url}`,\n `- **Path:** ${snapshot.route ?? \"\"}`,\n ...(snapshot.pageTitle ? [`- **Page Title:** ${snapshot.pageTitle}`] : []),\n `- **Viewport:** ${snapshot.viewport.w}×${snapshot.viewport.h}`,\n `- **User Agent:** ${snapshot.userAgent}`,\n `- **Timestamp:** ${snapshot.timestamp}`,\n ]\n return lines.join(\"\\n\") + \"\\n\"\n}\n\nexport function copySnapshotAction(\n ref: EntityRef,\n loc?: Location\n): DetailAction {\n return {\n id: \"copy-snapshot\",\n label: \"Copy Markdown Snapshot\",\n icon: \"view\",\n copy: buildSnapshotMarkdown(ref, loc),\n intent: { kind: \"external\", describe: \"clipboard\" },\n }\n}\n\nexport function highlightElementAction(ref: EntityRef): DetailAction {\n return {\n id: \"highlight-element\",\n label: \"Highlight Element\",\n icon: \"highlighter\",\n highlight: ref,\n intent: { kind: \"external\", describe: \"highlight\" },\n }\n}\n\nexport function copyScreenshotAction(ref: EntityRef): DetailAction {\n return {\n id: \"copy-screenshot\",\n label: \"Copy Screenshot\",\n icon: \"camera\",\n intent: { kind: \"external\", describe: \"clipboard\" },\n run: async (ctx) => {\n try {\n ctx.setLabel(\"Capturing…\")\n const target = resolveEntityElement(ref) ?? undefined\n const dataUrl = await captureScreenshot({\n target,\n maxWidth: 1280,\n // Clipboard write requires PNG — the async Clipboard API rejects\n // image/webp (`ClipboardItem` throws on Chrome/Safari).\n format: \"png\",\n })\n const res = await fetch(dataUrl)\n const blob = await res.blob()\n await navigator.clipboard.write([\n new ClipboardItem({ [blob.type]: blob }),\n ])\n ctx.setLabel(\"Copied!\", 1200)\n } catch {\n ctx.setLabel(\"Copy failed\", 1500)\n }\n },\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 parent: parentList,\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 exactEntity = ctx.registry.get(kind, ctx.ref.id) as\n | EntityByKind<K>\n | undefined\n const patternEntity = exactEntity\n ? undefined\n : (ctx.registry.matchPattern?.(kind, ctx.ref.id) as\n | EntityByKind<K>\n | undefined)\n const entity = exactEntity ?? patternEntity\n const metaEntity: MetaEntity | null = entity\n ? (entity as MetaEntity)\n : null\n const meta = metaEntity?.meta\n\n const actions: DetailAction[] = []\n\n // Inspect group\n if (DOM_BACKED_KINDS.has(kind) && resolveEntityElement(ctx.ref)) {\n actions.push({ ...highlightElementAction(ctx.ref), group: \"Inspect\" })\n actions.push({ ...copyScreenshotAction(ctx.ref), group: \"Inspect\" })\n }\n if (metaEntity?.loc) {\n actions.push({\n ...copyPathAction(ctx.ref, metaEntity.loc),\n group: \"Inspect\",\n })\n actions.push({\n ...copySnapshotAction(ctx.ref, metaEntity.loc),\n group: \"Inspect\",\n })\n }\n\n const sections: DetailSection[] = []\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 if (entity) {\n for (const s of config.extraSections?.(ctx, entity) ?? []) {\n sections.push(s)\n }\n }\n if (!DOM_BACKED_KINDS.has(kind)) {\n sections.push({\n id: \"composes\",\n label: SECTION_LABELS.contains,\n entities: resolveRefs(ctx, meta?.composes),\n filterable: true,\n })\n }\n if (DOM_BACKED_KINDS.has(kind) && meta?.features?.length) {\n const featureEntities = meta.features\n .map((fId) => ctx.registry.get(\"feature\", fId))\n .filter((e): e is NonNullable<typeof e> => !!e)\n if (featureEntities.length > 0) {\n sections.push({\n id: \"composes\",\n label: \"Features\",\n entities: featureEntities,\n filterable: true,\n })\n }\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: patternEntity\n ? ctx.ref.id\n : metaEntity\n ? displayName(metaEntity)\n : ctx.ref.id,\n subtitle: exactEntity ? config.subtitle?.(ctx, exactEntity) : undefined,\n unregistered: !entity,\n actions,\n sections,\n }\n },\n }\n}\n","import type { Entity } from \"../../../shared/entities\"\nimport { createEntityDetailView } from \"../builder/detail-builder\"\nimport { collectFlowsTouching } from \"../builder/resolve\"\nimport type { DetailSection } from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\n\n// Features have no DOM presence (they are directories), so \"Used by\" comes\n// from the registry: pages that declare the feature in their `features` list.\nfunction collectFeatureConsumers(\n ctx: ViewContext,\n featureId: string\n): Entity[] {\n return ctx.registry\n .list(\"page\")\n .filter((page) => page.meta?.features?.includes(featureId))\n}\n\nfunction usedBySection(ctx: ViewContext, featureId: string): DetailSection {\n return {\n id: \"used-by\",\n label: SECTION_LABELS.usedBy,\n entities: collectFeatureConsumers(ctx, featureId),\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) => [touchedByFlowsSection(ctx, entity.id)],\n})\n\nexport const featureDetailView = createEntityDetailView({\n id: \"feature-detail\",\n kind: \"feature\",\n fallbackTitle: \"Feature\",\n extraSections: (ctx, entity) => [usedBySection(ctx, entity.id)],\n})\n\nexport const regionDetailView = createEntityDetailView({\n id: \"region-detail\",\n kind: \"region\",\n fallbackTitle: \"Region\",\n offerAcceptance: false,\n})\n\nexport const widgetDetailView = createEntityDetailView({\n id: \"widget-detail\",\n kind: \"widget\",\n fallbackTitle: \"Widget\",\n})\n\nexport const primitiveDetailView = createEntityDetailView({\n id: \"primitive-detail\",\n kind: \"primitive\",\n fallbackTitle: \"Primitive\",\n offerAcceptance: false,\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 {\n displayName,\n entityKey,\n KIND_STYLE,\n type Entity,\n type EntityKind,\n type EntityRef,\n} from \"../../../shared/entities\"\nimport { matchesQuery } from \"../builder/filter\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { BUILT_IN_VIEW_IDS, COMMAND_PALETTE_ENTRY } from \"./ids\"\n\ninterface EntityItem extends ListItem {\n ref: EntityRef\n}\n\nfunction toItem(entity: Entity): EntityItem {\n const ref: EntityRef = { kind: entity.kind, id: entityKey(entity) }\n return {\n value: `entity:${ref.kind}:${ref.id}`,\n label: displayName(entity),\n tag: `${ref.kind}:${ref.id}`,\n preview: ref,\n entityChip: { entity },\n ref,\n }\n}\n\nfunction createEntityKindListView(kind: EntityKind, viewId: string): View {\n const style = KIND_STYLE[kind]\n return {\n id: viewId,\n palette: { label: style.label + \"s\" },\n title: style.label + \"s\",\n parent: () => COMMAND_PALETTE_ENTRY,\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const entities = ctx.registry.list(kind)\n const items: EntityItem[] = (entities as Entity[])\n .map(toItem)\n .sort((a, b) => a.label.localeCompare(b.label))\n\n return {\n kind: \"list\",\n id: `uidex-${kind}s`,\n items,\n emptyLabel: `No ${style.label.toLowerCase()}s registered`,\n filter: (item, query) =>\n matchesQuery(\n `${item.label} ${(item as EntityItem).ref.id} ${item.group ?? \"\"}`,\n query\n ),\n onSelect: (item) => ctx.views.navigate((item as EntityItem).ref),\n }\n },\n }\n}\n\nexport const elementsView = createEntityKindListView(\n \"element\",\n BUILT_IN_VIEW_IDS.elements\n)\nexport const widgetsView = createEntityKindListView(\n \"widget\",\n BUILT_IN_VIEW_IDS.widgets\n)\nexport const regionsView = createEntityKindListView(\n \"region\",\n BUILT_IN_VIEW_IDS.regions\n)\nexport const pagesView = createEntityKindListView(\n \"page\",\n BUILT_IN_VIEW_IDS.pages\n)\nexport const featuresView = createEntityKindListView(\n \"feature\",\n BUILT_IN_VIEW_IDS.features\n)\nexport const primitivesView = createEntityKindListView(\n \"primitive\",\n BUILT_IN_VIEW_IDS.primitives\n)\n","import { Compass, createElement as createLucideElement } from \"lucide\"\nimport {\n displayName,\n ENTITY_KINDS,\n type Entity,\n type EntityRef,\n} from \"../../../shared/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, COMMAND_PALETTE_ENTRY } 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 parent: () => COMMAND_PALETTE_ENTRY,\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.views.navigate((item as ExplorePageItem).ref),\n }\n },\n}\n","import {\n displayName,\n isMetaEntity,\n type Entity,\n type Flow,\n type FlowStep,\n type MetaEntityKind,\n type Registry,\n} from \"../../../shared/entities\"\nimport { parentList } from \"./ids\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSurface,\n ResolvedFlowStep,\n} from \"../core/surface\"\nimport type { View } from \"../core/types\"\nimport { copyPathAction, copySnapshotAction } from \"../builder/detail-builder\"\n\nconst STEP_KINDS: readonly MetaEntityKind[] = [\n \"element\",\n \"widget\",\n \"region\",\n \"page\",\n \"feature\",\n \"primitive\",\n]\n\nexport const flowDetailView: View = {\n id: \"flow-detail\",\n matches: (ref) => ref.kind === \"flow\",\n parent: parentList,\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 actions: DetailAction[] = [\n copyPathAction(ctx.ref, flow.loc),\n copySnapshotAction(ctx.ref, flow.loc),\n ]\n\n const sections: DetailSection[] = [\n flow.steps.length > 0\n ? buildStepsSection(flow.steps, ctx.registry)\n : buildTouchesSection(flow, ctx.registry),\n ]\n\n return {\n kind: \"detail\",\n entityKind: \"flow\",\n title: displayName(flow),\n actions,\n sections,\n }\n },\n}\n\nfunction buildStepsSection(\n flowSteps: readonly FlowStep[],\n registry: Registry\n): DetailSection {\n const steps: ResolvedFlowStep[] = []\n flowSteps.forEach((step, index) => {\n const entity = resolveStepEntity(registry, step.entityId)\n if (entity) {\n steps.push({ ordinal: index + 1, entity, action: step.action })\n }\n })\n return { id: \"steps\", steps, filterable: true }\n}\n\nfunction resolveStepEntity(\n registry: Registry,\n entityId: string\n): Entity | undefined {\n for (const kind of STEP_KINDS) {\n const entity = registry.get(kind, entityId)\n if (entity) return entity\n }\n return undefined\n}\n\nfunction buildTouchesSection(flow: Flow, registry: Registry): DetailSection {\n const touched: Entity[] = []\n const seen = new Set<string>()\n for (const touchedEntity of 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 return {\n id: \"touches\",\n entities: touched,\n filterable: true,\n }\n}\n","import {\n displayName,\n type EntityRef,\n type Flow,\n} from \"../../../shared/entities\"\nimport { matchesQuery } from \"../builder/filter\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { BUILT_IN_VIEW_IDS, COMMAND_PALETTE_ENTRY } from \"./ids\"\n\ninterface FlowItem extends ListItem {\n ref: EntityRef\n}\n\nfunction toItem(flow: Flow): FlowItem {\n const ref: EntityRef = { kind: \"flow\", id: flow.id }\n return {\n value: `entity:flow:${flow.id}`,\n label: displayName(flow),\n subtitle: flow.loc.file || undefined,\n tag: `flow:${flow.id}`,\n preview: ref,\n entityChip: { entity: flow },\n ref,\n }\n}\n\nexport const flowsView: View = {\n id: BUILT_IN_VIEW_IDS.flows,\n palette: { label: \"Flows\" },\n parent: () => COMMAND_PALETTE_ENTRY,\n title: \"Flows\",\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const flows = ctx.registry.list(\"flow\")\n const items: FlowItem[] = flows\n .map(toItem)\n .sort((a, b) => a.label.localeCompare(b.label))\n\n const filter = (item: ListItem, query: string): boolean => {\n const row = item as FlowItem\n return matchesQuery(\n `${item.label} ${row.ref.id} ${item.group ?? \"\"}`,\n query\n )\n }\n\n return {\n kind: \"list\",\n id: \"uidex-flows\",\n items,\n emptyLabel: \"No flows registered\",\n filter,\n onSelect: (item) => ctx.views.navigate((item as FlowItem).ref),\n }\n },\n}\n","import { BookOpen, createElement as createLucideElement } from \"lucide\"\nimport {\n KIND_STYLE,\n type Entity,\n type EntityKind,\n} from \"../../../shared/entities\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { PALETTE_GROUPS } from \"../labels\"\nimport { BUILT_IN_VIEW_IDS, COMMAND_PALETTE_ENTRY } from \"./ids\"\n\nconst KIND_TO_VIEW: Partial<Record<EntityKind, string>> = {\n element: BUILT_IN_VIEW_IDS.elements,\n widget: BUILT_IN_VIEW_IDS.widgets,\n region: BUILT_IN_VIEW_IDS.regions,\n page: BUILT_IN_VIEW_IDS.pages,\n feature: BUILT_IN_VIEW_IDS.features,\n primitive: BUILT_IN_VIEW_IDS.primitives,\n flow: BUILT_IN_VIEW_IDS.flows,\n}\n\nconst BROWSABLE_KINDS: EntityKind[] = [\n \"page\",\n \"feature\",\n \"widget\",\n \"region\",\n \"element\",\n \"primitive\",\n \"flow\",\n]\n\nfunction syntheticEntity(kind: EntityKind): Entity {\n if (kind === \"route\") return { kind: \"route\", path: kind, page: kind }\n if (kind === \"flow\")\n return {\n kind: \"flow\",\n id: kind,\n loc: { file: \"\" },\n touches: [],\n steps: [],\n }\n return { kind, id: kind }\n}\n\nexport const glossaryView: View = {\n id: BUILT_IN_VIEW_IDS.glossary,\n parent: () => COMMAND_PALETTE_ENTRY,\n palette: {\n label: \"Glossary\",\n group: PALETTE_GROUPS.commands,\n icon: () => createLucideElement(BookOpen),\n },\n title: \"Glossary\",\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const items: ListItem[] = BROWSABLE_KINDS.map((kind) => {\n const count =\n kind === \"flow\"\n ? ctx.registry.list(\"flow\").length\n : ctx.registry.list(kind).length\n return {\n value: `glossary:${kind}`,\n label: KIND_STYLE[kind].label + \"s\",\n subtitle: String(count),\n tag: kind,\n entityChip: { entity: syntheticEntity(kind) },\n }\n })\n return {\n kind: \"list\",\n id: \"uidex-glossary\",\n items,\n onSelect: (item) => {\n const kind = item.tag as EntityKind\n const viewId = KIND_TO_VIEW[kind]\n if (viewId) ctx.push({ id: viewId, ref: null })\n },\n }\n },\n}\n","export { BUILT_IN_VIEW_IDS } from \"./ids\"\n\nimport type { PaletteShortcut } from \"../../surface/keys\"\nimport { createCommandPaletteView } from \"./command-palette\"\nimport {\n componentDetailView,\n featureDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n widgetDetailView,\n} from \"./entity-detail\"\nimport {\n elementsView,\n featuresView,\n pagesView,\n primitivesView,\n regionsView,\n widgetsView,\n} from \"./entity-kind-list\"\nimport { explorePageView } from \"./explore-page\"\nimport { flowDetailView } from \"./flow-detail\"\nimport { flowsView } from \"./flows\"\nimport { glossaryView } from \"./glossary\"\n\nexport { createCommandPaletteView } from \"./command-palette\"\nexport {\n componentDetailView,\n featureDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n widgetDetailView,\n} from \"./entity-detail\"\nexport {\n elementsView,\n featuresView,\n pagesView,\n primitivesView,\n regionsView,\n widgetsView,\n} from \"./entity-kind-list\"\nexport { explorePageView } from \"./explore-page\"\nexport { flowDetailView } from \"./flow-detail\"\nexport { flowsView } from \"./flows\"\nexport { glossaryView } from \"./glossary\"\n\nimport type { View } from \"../core/types\"\n\nexport function buildDefaultViews(shortcut?: PaletteShortcut): View[] {\n return [\n createCommandPaletteView(shortcut),\n explorePageView,\n componentDetailView,\n pageDetailView,\n featureDetailView,\n widgetDetailView,\n flowDetailView,\n flowsView,\n elementsView,\n widgetsView,\n regionsView,\n pagesView,\n featuresView,\n primitivesView,\n primitiveDetailView,\n regionDetailView,\n glossaryView,\n ]\n}\n","import { createRegistry, KIND_STYLE, type Registry } from \"../shared/entities\"\nimport { createCleanupStack } from \"./internal/cleanup\"\nimport {\n createSession,\n type HighlightContext,\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 type PaletteShortcut,\n} from \"./surface\"\nimport {\n buildDefaultViews,\n createRouter,\n createViewStack,\n type HighlightController,\n type Router,\n type View,\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 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 /** Keyboard shortcut for the command palette. Defaults to Cmd+K / Ctrl+K. */\n shortcut?: PaletteShortcut\n}\n\nexport interface Uidex {\n mount(target?: Element): void\n unmount(): void\n readonly registry: Registry\n readonly session: SessionStore\n readonly views: Router\n readonly shadowRoot: ShadowRoot | null\n}\n\nexport function createUidex(options: CreateUidexOptions = {}): Uidex {\n const registry = createRegistry()\n\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 const pinned = ctx.pinnedRef !== null\n overlay.show(el, {\n color: ctx.color ?? KIND_STYLE[ref.kind].color,\n backdrop: pinned,\n })\n }\n\n const session = createSession({\n theme: options.theme,\n resolvedTheme: options.resolvedTheme,\n onMountInspector: () => inspectorRef.current?.mount(),\n onDestroyInspector: () => inspectorRef.current?.destroy(),\n onShowOverlay: applyOverlay,\n onHideOverlay: () => overlayRef.current?.hide(),\n onUpdateOverlay: applyOverlay,\n })\n const views = createRouter({ session })\n\n if (options.defaultViews !== false) {\n for (const view of buildDefaultViews(options.shortcut)) views.add(view)\n }\n if (options.views) {\n for (const view of options.views) views.add(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 route = views.resolve(match.ref)\n if (!route) return\n const entry = { id: route.view.id, ref: match.ref }\n session.mode.transition.enterViewing(views.buildStack(entry))\n },\n },\n })\n shadowRoot = shell.host.shadowRoot\n inspectorRef.current = shell.inspector\n overlayRef.current = shell.overlay\n shell.overlay.onDismiss = () => session.highlight.unpin()\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.highlight.unhover()\n return\n }\n session.highlight.hover(ref, el, opts?.color ?? null)\n },\n hide() {\n session.highlight.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 highlight,\n shortcut: options.shortcut,\n })\n mountCleanup.add(viewStack)\n\n if (shadowRoot) {\n const keyBindings = bindShadowKeys({\n shadowRoot,\n session,\n getActionsPopup: () => viewStack.getActionsPopup(),\n shortcut: options.shortcut,\n })\n mountCleanup.add(keyBindings)\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 get shadowRoot() {\n return shadowRoot\n },\n }\n}\n","import { useContext } from \"react\"\nimport type { Uidex } from \"../../browser/create-uidex\"\nimport { UidexContext } from \"./provider\"\n\nexport class UidexContextError extends Error {\n constructor(hookName: string) {\n super(\n `${hookName} must be called inside <UidexProvider>. Wrap your tree with <UidexProvider>.`\n )\n this.name = \"UidexContextError\"\n }\n}\n\nexport function useUidex(): Uidex {\n const ctx = useContext(UidexContext)\n if (!ctx) throw new UidexContextError(\"useUidex\")\n return ctx\n}\n","import { useEffect, useRef } from \"react\"\nimport { useUidex } from \"./hooks\"\n\nexport interface UidexMountProps {\n className?: string\n}\n\nexport function UidexMount({ className }: UidexMountProps) {\n const uidex = useUidex()\n const ref = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n const node = ref.current\n if (!node) return\n uidex.mount(node)\n return () => {\n uidex.unmount()\n }\n }, [uidex])\n\n return <div ref={ref} className={className} data-uidex-mount=\"\" />\n}\n","import { createElement, type ComponentType } from \"react\"\nimport { createRoot } from \"react-dom/client\"\nimport type { EntityRef } from \"../../shared/entities\"\nimport type { View, ViewContext, ViewPalette } from \"../../browser/views\"\nimport type { ViewSurface } from \"../../browser/views/core/surface\"\n\nexport interface ReactViewDef {\n id: string\n matches?: (ref: EntityRef) => boolean\n palette?: ViewPalette\n component: ComponentType<{ ctx: ViewContext }>\n}\n\nconst EMPTY_SURFACE: ViewSurface = {\n kind: \"detail\",\n entityKind: \"element\",\n}\n\nexport function createReactView(def: ReactViewDef): View {\n return {\n id: def.id,\n matches: def.matches,\n palette: def.palette,\n surface: () => EMPTY_SURFACE,\n render(ctx, root) {\n const reactRoot = createRoot(root)\n reactRoot.render(createElement(def.component, { ctx }))\n return () => reactRoot.unmount()\n },\n }\n}\n","\"use client\"\n\nimport { clsx } from \"clsx\"\nimport {\n Circle,\n FileText,\n LayoutGrid,\n LayoutPanelTop,\n MousePointerClick,\n Route as RouteIcon,\n Sparkles,\n Workflow,\n type LucideIcon,\n} from \"lucide-react\"\nimport type { ReactElement } from \"react\"\nimport { twMerge } from \"tailwind-merge\"\nimport { KIND_STYLE, type EntityKind } from \"../../shared/entities\"\n\nconst REACT_ICONS: Record<EntityKind, LucideIcon> = {\n route: RouteIcon,\n page: FileText,\n feature: Sparkles,\n widget: LayoutGrid,\n region: LayoutPanelTop,\n element: MousePointerClick,\n primitive: Circle,\n flow: Workflow,\n}\n\nexport interface KindChipProps {\n kind: EntityKind\n label?: string\n withKindName?: boolean\n className?: string\n}\n\nexport function KindChip({\n kind,\n label,\n withKindName,\n className,\n}: KindChipProps): ReactElement {\n const style = KIND_STYLE[kind]\n const Icon = REACT_ICONS[kind]\n const text = withKindName\n ? label\n ? `${style.label} · ${label}`\n : style.label\n : label\n return (\n <span\n data-uidex-kind-chip={kind}\n className={twMerge(\n clsx(\n \"text-muted-foreground inline-flex items-center gap-1.5 text-xs font-medium\",\n className\n )\n )}\n >\n <Icon\n aria-hidden=\"true\"\n className={twMerge(clsx(\"h-4 w-4 shrink-0\", style.tone))}\n />\n {text ? <span className=\"truncate\">{text}</span> : null}\n </span>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport {\n createUidex,\n type CreateUidexOptions,\n type Uidex,\n} from \"../../browser/create-uidex\"\nimport type { Registry } from \"../../shared/entities\"\nimport { UidexContext } from \"./provider\"\nimport { UidexMount } from \"./mount\"\n\nexport interface UidexDevtoolsProps {\n /**\n * Populates the entity registry (typically `loadRegistry` from `uidex.gen.ts`).\n * Must be idempotent: it is called once per created instance, and under React\n * StrictMode the effect runs setup→cleanup→setup, so it may be invoked against\n * a short-lived instance that is discarded before mount.\n */\n loadRegistry: (target: Registry) => Registry\n /**\n * Optional deferred hydration — populate the registry with data that need not\n * be present at mount (typically the thin element/region source locations from\n * `uidex.gen.locs.ts`, dynamic-imported so they land in a separate chunk). Run\n * on an idle callback after mount, so the initial devtools chunk stays small\n * and the copy-source-path metadata streams in shortly after. Idempotent, like\n * `loadRegistry`.\n */\n loadDeferred?: (target: Registry) => void | Promise<void>\n config?: CreateUidexOptions\n}\n\nexport function UidexDevtools({\n loadRegistry,\n loadDeferred,\n config,\n}: UidexDevtoolsProps) {\n const [instance, setInstance] = useState<Uidex | null>(null)\n\n // Mount-once: the devtools instance is built from the initial props and not\n // rebuilt on later `config`/`loadRegistry` changes. Depending on `config`\n // (a fresh object literal each render) would remount the surface on every\n // render, so the empty dep array is intentional, not an oversight.\n useEffect(() => {\n const inst = createUidex({ ...config })\n loadRegistry(inst.registry)\n setInstance(inst)\n let cancelled = false\n if (loadDeferred) {\n const run = () => {\n // Best-effort: the deferred data (element/region source locations) is\n // non-essential — the inspector degrades gracefully without it — so a\n // failed load must not surface as an unhandled promise rejection.\n if (!cancelled)\n Promise.resolve(loadDeferred(inst.registry)).catch(() => {})\n }\n // Defer to idle so the thin loc data lands after the surface is interactive.\n if (typeof requestIdleCallback === \"function\") requestIdleCallback(run)\n else setTimeout(run, 0)\n }\n return () => {\n cancelled = true\n inst.unmount()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (!instance) return null\n\n return (\n <UidexContext.Provider value={instance}>\n <UidexMount />\n </UidexContext.Provider>\n )\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["RouteIcon","import_vanilla","import_vanilla","ref","import_lucide","el","svg","createLucideElement","render","ref","el","import_lucide","mode","createLucideElement","ref","import_lit_html","import_lucide","el","import_lucide","svg","createLucideElement","ref","connect","machine","hasTagFn","import_types","idx","import_lucide","icon","svg","createLucideElement","ref","staticHtml","ref","import_lucide","el","frag","el","scrollArea","scrollArea","import_lucide","applyProps","sameRef","shell","viewActions","render","COMMAND_PALETTE_ENTRY","ref","import_lucide","ref","createLucideElement","ref","el","ref","ref","ref","COMMAND_PALETTE_ENTRY","import_lucide","toItem","ref","COMMAND_PALETTE_ENTRY","createLucideElement","ref","toItem","ref","COMMAND_PALETTE_ENTRY","import_lucide","COMMAND_PALETTE_ENTRY","createLucideElement","ref","el","import_react","import_react","import_jsx_runtime","ref","import_react","import_clsx","import_tailwind_merge","import_jsx_runtime","RouteIcon","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/integrations/react/index.ts","../../src/integrations/react/provider.tsx","../../src/shared/entities/types.ts","../../src/shared/entities/registry.ts","../../src/shared/entities/style.ts","../../src/shared/entities/display-name.ts","../../src/browser/internal/cleanup.ts","../../src/browser/session/store.ts","../../src/browser/session/mode.ts","../../src/browser/session/navigation.ts","../../src/browser/styles/tailwind.built.css","../../src/browser/surface/constants.ts","../../src/browser/surface/host.ts","../../src/browser/surface/cursor-tooltip.ts","../../src/browser/surface/inspector.ts","../../src/browser/surface/menu-bar.ts","../../src/browser/internal/cn.ts","../../src/browser/internal/el.ts","../../src/browser/surface/keys.ts","../../src/browser/internal/repositioner.ts","../../src/browser/surface/overlay.ts","../../src/browser/surface/theme.ts","../../src/browser/surface/shell.ts","../../src/browser/views/core/types.ts","../../src/browser/views/core/router.ts","../../src/browser/internal/dev.ts","../../src/browser/internal/lit.ts","../../src/browser/internal/lit-icon.ts","../../src/browser/views/primitives/chip.ts","../../src/browser/views/primitives/kind-icon.ts","../../src/browser/ui/cva.ts","../../src/browser/ui/badge.ts","../../src/browser/views/primitives/icon-tile.ts","../../src/browser/views/primitives/kind-chip.ts","../../src/browser/machines/scroll-area.ts","../../src/browser/machines/machine.ts","../../src/browser/machines/normalize.ts","../../src/browser/internal/apply-props.ts","../../src/browser/views/builder/spread-props.ts","../../src/browser/internal/arrow-nav.ts","../../src/browser/views/labels.ts","../../src/browser/ui/list-item.ts","../../src/browser/views/primitives/text.ts","../../src/browser/views/render/detail-actions.ts","../../src/browser/views/render/detail-sections.ts","../../src/browser/views/builder/filter.ts","../../src/browser/views/primitives/entity-presence.ts","../../src/browser/ui/kbd.ts","../../src/browser/views/primitives/row.ts","../../src/browser/views/primitives/entity-link.ts","../../src/browser/views/render/detail.ts","../../src/browser/views/render/list.ts","../../src/browser/views/render/list-controller.ts","../../src/browser/views/render/index.ts","../../src/browser/views/core/mount.ts","../../src/browser/views/core/shell.ts","../../src/browser/machines/menu.ts","../../src/browser/ui/menu.ts","../../src/browser/views/core/actions-popup.ts","../../src/browser/views/core/stack.ts","../../src/browser/views/built-in/ids.ts","../../src/browser/views/built-in/command-palette.ts","../../src/browser/views/builder/format-location.ts","../../src/browser/views/builder/page-context.ts","../../src/browser/internal/screenshot.ts","../../src/browser/report/capture.ts","../../src/browser/views/builder/resolve.ts","../../src/browser/views/builder/detail-builder.ts","../../src/browser/views/built-in/entity-detail.ts","../../src/browser/views/built-in/entity-kind-list.ts","../../src/browser/views/built-in/explore-page.ts","../../src/browser/views/built-in/flow-detail.ts","../../src/browser/views/built-in/flows.ts","../../src/browser/views/built-in/glossary.ts","../../src/browser/views/built-in/index.ts","../../src/browser/create-uidex.ts","../../src/integrations/react/hooks.ts","../../src/integrations/react/mount.tsx","../../src/integrations/react/create-react-view.tsx","../../src/integrations/react/kind-chip.tsx","../../src/integrations/react/devtools.tsx"],"sourcesContent":["\"use client\"\n\nexport { UidexProvider } from \"./provider\"\nexport type { UidexProviderProps } from \"./provider\"\nexport { useUidex, UidexContextError } from \"./hooks\"\nexport { UidexMount } from \"./mount\"\nexport type { UidexMountProps } from \"./mount\"\nexport { createReactView } from \"./create-react-view\"\nexport type { ReactViewDef } from \"./create-react-view\"\nexport { KindChip } from \"./kind-chip\"\nexport type { KindChipProps } from \"./kind-chip\"\nexport { UidexDevtools } from \"./devtools\"\nexport type { UidexDevtoolsProps } from \"./devtools\"\n","\"use client\"\n\nimport { createContext, useEffect, useState, type ReactNode } from \"react\"\nimport {\n createUidex,\n type CreateUidexOptions,\n type Uidex,\n} from \"../../browser/create-uidex\"\n\nexport const UidexContext = createContext<Uidex | null>(null)\n\nexport interface UidexProviderProps {\n /**\n * Pre-built uidex instance (e.g. the `uidex` export from `uidex.gen.ts`).\n * When provided, `config` is ignored.\n */\n instance?: Uidex\n config?: CreateUidexOptions\n children?: ReactNode\n}\n\nexport function UidexProvider({\n instance: externalInstance,\n config,\n children,\n}: UidexProviderProps) {\n const [owned] = useState<{ instance: Uidex } | null>(() => {\n if (externalInstance) return null\n return { instance: createUidex({ ...config }) }\n })\n\n // `owned` is created once (uncontrolled mode). If a caller renders controlled\n // (`instance` set) and later drops the prop, `owned` is null — fall back to\n // null so `useUidex` throws a clear UidexContextError rather than a raw\n // TypeError. Controlled/uncontrolled is not meant to be toggled at runtime.\n const instance = externalInstance ?? owned?.instance ?? null\n\n useEffect(() => {\n if (!owned) return\n return () => {\n owned.instance.unmount()\n }\n }, [owned])\n\n return (\n <UidexContext.Provider value={instance}>{children}</UidexContext.Provider>\n )\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\n/**\n * The four kinds every captured route is expected to render — the state-matrix\n * axis. A capture that only shoots the happy path leaves most of the value on\n * the table, so a missing core kind must be captured or ACKNOWLEDGED (see\n * `Metadata.acknowledge`).\n */\nexport const CORE_STATE_KINDS = [\n \"loading\",\n \"empty\",\n \"populated\",\n \"error\",\n] as const\nexport type CoreStateKind = (typeof CORE_STATE_KINDS)[number]\n/** `variant` is any state outside the matrix (a dialog, wizard step, multi-currency…). */\nexport type StateKind = CoreStateKind | \"variant\"\n\n/**\n * A declared render state of an entity — the \"story\"-like unit: a named\n * condition the page/feature/widget can render in (loading / empty / error /\n * multi-currency / …). Enumerated on the entity (not derived from syntax), it\n * is the contract the visual-states capture must satisfy and the anchor for\n * per-state acceptance criteria. Fixtures + capture mechanics stay in the spec;\n * the registry holds only the name (+ optional kind / per-state acceptance).\n */\nexport interface StateDecl {\n name: string\n /** Canonical kind for the state-matrix axis (defaults to `variant`). */\n kind?: StateKind\n /**\n * Acceptance criteria that only this state can evidence. Normalized into the\n * same `{ id, rev, text }` regime as entity-level `acceptance` (one\n * criterion-id namespace per entity), so per-state criteria are claimable by\n * `uidexCovers` and visible to every acceptance gate.\n */\n acceptance?: AcceptanceCriterion[]\n description?: string\n}\n\n/**\n * A normalized acceptance criterion. Authored either as a bare string (sugar:\n * `id` is a deterministic kebab slug of the text, `rev` is 1) or as an object\n * `{ id, rev?, text }`; parse-time normalization means everything downstream —\n * audit, scaffold, the devtools — always sees this object shape. `rev` is the\n * pin flows cover against (`uidexCovers(\"entity\", \"id@rev\")`): bumping it when\n * the criterion's meaning changes is what makes outdated-coverage detectable.\n */\nexport interface AcceptanceCriterion {\n id: string\n rev: number\n text: string\n}\n\nexport interface Metadata {\n name?: string\n description?: string\n acceptance?: AcceptanceCriterion[]\n notes?: string\n composes?: EntityRef[]\n flows?: readonly string[]\n features?: string[]\n widgets?: string[]\n /** Page ids a feature declares it must be mounted on (feature kind only). */\n surfaces?: string[]\n /** Declared render states (see StateDecl); the capture-completeness gate. */\n states?: StateDecl[]\n /**\n * The ONE way to say \"don't complain about this gap\": scope → typed reason.\n *\n * - scope `\"*\"` covers the whole entity (a redirect page that can never be\n * captured, a component whose states are not gated here);\n * - a core-kind scope covers that one cell of this page's route matrix.\n *\n * `type: \"impossible\"` is a permanent design statement and needs a `reason`;\n * `type: \"backlog\"` is debt and does not. Keeping both as values of one field\n * is what makes mislabeling debt as impossible a visible, reviewable edit.\n * `captured-elsewhere` is computed by the workspace and never authored here.\n */\n acknowledge?: Partial<Record<AcknowledgeScope, MetaAcknowledgment>>\n}\n\n/** Scope of an acknowledgment: one core kind, or the whole entity. */\nexport type AcknowledgeScope = CoreStateKind | \"*\"\n\nexport interface MetaAcknowledgment {\n type: \"impossible\" | \"backlog\"\n reason?: 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 FlowStep {\n entityId: string\n action?: string\n}\n\n/**\n * A per-criterion coverage claim a flow makes via\n * `uidexCovers(\"<entityId>\", \"<criterionId>@<rev>\")`. The rev is REQUIRED at\n * the claim site — a rev-less claim could never go stale, which would defeat\n * the outdated-detection the pin exists for.\n */\nexport interface FlowCover {\n entity: string\n criterion: string\n rev: number\n}\n\nexport interface Flow {\n kind: \"flow\"\n id: string\n loc: Location\n touches: string[]\n steps: FlowStep[]\n /** Acceptance-criterion coverage claims made inside this flow's describe. */\n covers?: FlowCover[]\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 ReportRecord {\n id: string\n entity?: string\n reporter?: { id?: string; email?: string; name?: string }\n title?: string\n body: string\n type: string\n severity: string\n status: string\n labels?: string[]\n url: string\n route?: string\n pageTitle?: string\n screenshot?: string\n createdAt: string\n}\n\nexport interface Registry {\n add(entity: Entity): void\n get<K extends EntityKind>(kind: K, id: string): EntityByKind<K> | undefined\n matchPattern<K extends EntityKind>(\n kind: K,\n id: string\n ): 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 setReports(\n kind: EntityKind,\n id: string,\n reports: readonly ReportRecord[]\n ): void\n getReports(kind: EntityKind, id: string): readonly ReportRecord[]\n listReportKeys(): readonly string[]\n closeReport?: (reportId: string, status?: string) => void | Promise<void>\n onReportsChange(cb: () => void): () => void\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 const patternCache = new Map<\n EntityKind,\n Array<{ segments: string[]; staticLength: number; entity: Entity }>\n >()\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 patternCache.delete(entity.kind)\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 interface PatternEntry<K extends EntityKind> {\n /** static parts of the key around `*` wildcards, e.g. \"a-*-b\" → [\"a-\", \"-b\"] */\n segments: string[]\n staticLength: number\n entity: EntityByKind<K>\n }\n\n const getPatternsForKind = <K extends EntityKind>(\n kind: K\n ): Array<PatternEntry<K>> => {\n const cached = patternCache.get(kind)\n if (cached !== undefined) return cached as Array<PatternEntry<K>>\n const patterns: Array<PatternEntry<K>> = []\n for (const [key, entity] of store[kind]) {\n if (key.includes(\"*\")) {\n const segments = key.split(\"*\")\n patterns.push({\n segments,\n staticLength: segments.reduce((n, s) => n + s.length, 0),\n entity: entity as EntityByKind<K>,\n })\n }\n }\n patternCache.set(\n kind,\n patterns as Array<{\n segments: string[]\n staticLength: number\n entity: Entity\n }>\n )\n return patterns\n }\n\n // First segment anchored at the start, last at the end, middles matched\n // left-to-right; each `*` matches any run of characters (including none).\n const matchesSegments = (segments: string[], id: string): boolean => {\n const first = segments[0]\n const last = segments[segments.length - 1]\n if (!id.startsWith(first)) return false\n let pos = first.length\n for (let i = 1; i < segments.length - 1; i++) {\n const idx = id.indexOf(segments[i], pos)\n if (idx === -1) return false\n pos = idx + segments[i].length\n }\n return id.endsWith(last) && id.length - last.length >= pos\n }\n\n const matchPattern = <K extends EntityKind>(\n kind: K,\n id: string\n ): EntityByKind<K> | undefined => {\n assertEntityKind(kind)\n const patterns = getPatternsForKind(kind)\n if (patterns.length === 0) return undefined\n let best: PatternEntry<K> | undefined\n for (const entry of patterns) {\n if (\n matchesSegments(entry.segments, id) &&\n (best === undefined || entry.staticLength > best.staticLength)\n ) {\n best = entry\n }\n }\n if (best === undefined) return undefined\n return freezeEntity(best.entity, 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 const reports = new Map<string, readonly ReportRecord[]>()\n const reportsCbs = new Set<() => void>()\n\n const setReports = (\n kind: EntityKind,\n id: string,\n records: readonly ReportRecord[]\n ): void => {\n reports.set(`${kind}:${id}`, records)\n for (const cb of reportsCbs) cb()\n }\n\n const getReports = (kind: EntityKind, id: string): readonly ReportRecord[] =>\n reports.get(`${kind}:${id}`) ?? []\n\n const listReportKeys = (): readonly string[] => Array.from(reports.keys())\n\n const onReportsChange = (cb: () => void): (() => void) => {\n reportsCbs.add(cb)\n return () => reportsCbs.delete(cb)\n }\n\n return {\n add,\n get,\n matchPattern,\n list,\n query,\n byScope,\n touchedBy,\n setReports,\n getReports,\n listReportKeys,\n onReportsChange,\n }\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-400\",\n chip: \"bg-blue-50 text-blue-700 inset-ring inset-ring-blue-700/10 group-data-hover:bg-blue-100 dark:bg-blue-400/10 dark:text-blue-400 dark:inset-ring-blue-400/30 dark:group-data-hover:bg-blue-400/20\",\n color: \"#60a5fa\",\n label: \"Route\",\n },\n page: {\n icon: FileText,\n tone: \"text-emerald-700 dark:text-emerald-400\",\n chip: \"bg-emerald-50 text-emerald-700 inset-ring inset-ring-emerald-600/20 group-data-hover:bg-emerald-100 dark:bg-emerald-400/10 dark:text-emerald-400 dark:inset-ring-emerald-500/20 dark:group-data-hover:bg-emerald-400/20\",\n color: \"#34d399\",\n label: \"Page\",\n },\n feature: {\n icon: Sparkles,\n tone: \"text-amber-700 dark:text-amber-500\",\n chip: \"bg-amber-50 text-amber-800 inset-ring inset-ring-amber-600/20 group-data-hover:bg-amber-100 dark:bg-amber-400/10 dark:text-amber-500 dark:inset-ring-amber-400/20 dark:group-data-hover:bg-amber-400/20\",\n color: \"#fbbf24\",\n label: \"Feature\",\n },\n widget: {\n icon: LayoutGrid,\n tone: \"text-violet-700 dark:text-violet-400\",\n chip: \"bg-violet-50 text-violet-700 inset-ring inset-ring-violet-700/10 group-data-hover:bg-violet-100 dark:bg-violet-400/10 dark:text-violet-400 dark:inset-ring-violet-400/30 dark:group-data-hover:bg-violet-400/20\",\n color: \"#a78bfa\",\n label: \"Widget\",\n },\n region: {\n icon: LayoutPanelTop,\n tone: \"text-cyan-700 dark:text-cyan-400\",\n chip: \"bg-cyan-50 text-cyan-700 inset-ring inset-ring-cyan-700/10 group-data-hover:bg-cyan-100 dark:bg-cyan-400/10 dark:text-cyan-400 dark:inset-ring-cyan-400/30 dark:group-data-hover:bg-cyan-400/20\",\n color: \"#22d3ee\",\n label: \"Region\",\n },\n element: {\n icon: MousePointerClick,\n tone: \"text-rose-700 dark:text-rose-400\",\n chip: \"bg-rose-50 text-rose-700 inset-ring inset-ring-rose-600/10 group-data-hover:bg-rose-100 dark:bg-rose-400/10 dark:text-rose-400 dark:inset-ring-rose-400/20 dark:group-data-hover:bg-rose-400/20\",\n color: \"#fb7185\",\n label: \"Element\",\n },\n primitive: {\n icon: Circle,\n tone: \"text-slate-600 dark:text-slate-400\",\n chip: \"bg-slate-50 text-slate-600 inset-ring inset-ring-slate-500/10 group-data-hover:bg-slate-100 dark:bg-slate-400/10 dark:text-slate-400 dark:inset-ring-slate-400/20 dark:group-data-hover:bg-slate-400/20\",\n color: \"#94a3b8\",\n label: \"Primitive\",\n },\n flow: {\n icon: Workflow,\n tone: \"text-fuchsia-700 dark:text-fuchsia-400\",\n chip: \"bg-fuchsia-50 text-fuchsia-700 inset-ring inset-ring-fuchsia-700/10 group-data-hover:bg-fuchsia-100 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:inset-ring-fuchsia-400/20 dark:group-data-hover:bg-fuchsia-400/20\",\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 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 { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport { type EntityRef } from \"../../shared/entities\"\nimport { createModeStore, type ModeStore } from \"./mode\"\nimport { createNavigationStore, type NavigationStore } from \"./navigation\"\nimport type {\n ResolvedTheme,\n SessionSnapshot,\n SessionState,\n ThemePreference,\n ViewStackEntry,\n} from \"./types\"\n\nexport interface HighlightContext {\n ref: EntityRef | null\n element: HTMLElement | null\n pinnedRef: EntityRef | null\n color: string | null\n}\n\nexport interface HighlightActions {\n hover(\n ref: EntityRef,\n element?: HTMLElement | null,\n color?: string | null\n ): void\n unhover(): void\n pin(ref?: EntityRef): void\n unpin(): void\n}\n\nexport type SessionStore = StoreApi<SessionState> & {\n readonly nav: NavigationStore\n readonly mode: ModeStore\n readonly highlight: HighlightActions\n setTheme(theme: ThemePreference, resolved?: ResolvedTheme): void\n}\n\nexport interface CreateSessionOptions extends Partial<SessionSnapshot> {\n detectTheme?: () => ResolvedTheme\n onMountInspector?: () => void\n onDestroyInspector?: () => void\n onShowOverlay?: (context: HighlightContext) => void\n onHideOverlay?: () => void\n onUpdateOverlay?: (context: HighlightContext) => void\n /** When true, start the session in inspector mode. */\n inspectorActive?: boolean\n}\n\nconst defaultSnapshot: SessionSnapshot = {\n stack: [],\n pinnedHighlight: null,\n mode: \"idle\",\n theme: \"auto\",\n resolvedTheme: \"light\",\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 HighlightMode = \"none\" | \"transient\" | \"pinned\"\n\nexport function createSession(\n options: CreateSessionOptions = {}\n): SessionStore {\n const {\n detectTheme,\n onMountInspector,\n onDestroyInspector,\n onShowOverlay,\n onHideOverlay,\n onUpdateOverlay,\n ...overrides\n } = 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 nav = createNavigationStore()\n const modeStore = createModeStore({\n nav,\n bindings: {\n mountInspector: onMountInspector,\n destroyInspector: onDestroyInspector,\n },\n })\n\n // --- Mutable highlight state ---\n let highlightMode: HighlightMode = \"none\"\n const hlCtx: HighlightContext = {\n ref: null,\n element: null,\n pinnedRef: null,\n color: null,\n }\n\n const highlightActions: HighlightActions = {\n hover(ref, element, color) {\n hlCtx.ref = ref\n hlCtx.element = element ?? null\n hlCtx.color = color ?? null\n if (highlightMode === \"none\") {\n highlightMode = \"transient\"\n onShowOverlay?.(hlCtx)\n } else if (highlightMode === \"transient\") {\n onUpdateOverlay?.(hlCtx)\n }\n },\n\n unhover() {\n if (highlightMode === \"transient\") {\n highlightMode = \"none\"\n hlCtx.ref = null\n hlCtx.element = null\n hlCtx.color = null\n onHideOverlay?.()\n }\n },\n\n pin(ref) {\n const pinRef = ref ?? hlCtx.ref\n hlCtx.pinnedRef = pinRef\n if (highlightMode === \"none\") {\n hlCtx.ref = pinRef\n }\n if (highlightMode !== \"pinned\") {\n highlightMode = \"pinned\"\n onShowOverlay?.(hlCtx)\n }\n store.setState({ pinnedHighlight: hlCtx.pinnedRef })\n },\n\n unpin() {\n if (highlightMode === \"pinned\") {\n highlightMode = \"none\"\n hlCtx.ref = null\n hlCtx.element = null\n hlCtx.pinnedRef = null\n hlCtx.color = null\n onHideOverlay?.()\n }\n store.setState({ pinnedHighlight: null })\n },\n }\n\n // --- Create Zustand store ---\n const store = createStore<SessionState>(() => ({\n ...defaultSnapshot,\n stack: [],\n pinnedHighlight: null,\n mode: \"idle\",\n theme: initialPref,\n resolvedTheme: initialResolved,\n }))\n\n // --- Auto-sync sub-stores → session store ---\n nav.subscribe(() => {\n const { stack } = nav.getState()\n if (store.getState().stack !== stack) {\n store.setState({ stack })\n }\n })\n\n modeStore.subscribe(() => {\n const { mode } = modeStore.getState()\n if (store.getState().mode !== mode) {\n store.setState({ mode })\n }\n })\n\n // --- Build session object ---\n const session = store as SessionStore\n ;(session as { nav: NavigationStore }).nav = nav\n ;(session as { mode: ModeStore }).mode = modeStore\n ;(session as { highlight: HighlightActions }).highlight = highlightActions\n\n session.setTheme = (theme, resolved) => {\n const state = store.getState()\n const nextResolved = resolved ?? resolveTheme(theme, detectTheme)\n if (state.theme === theme && state.resolvedTheme === nextResolved) return\n store.setState({ theme, resolvedTheme: nextResolved })\n }\n\n // --- Hydrate initial state ---\n if (initialStack.length > 0) {\n modeStore.transition.openPalette()\n for (let i = 1; i < initialStack.length; i++) {\n modeStore.transition.pushView(initialStack[i])\n }\n } else if (overrides.inspectorActive) {\n modeStore.transition.openInspector()\n }\n if (overrides.pinnedHighlight) {\n highlightActions.pin(overrides.pinnedHighlight)\n }\n\n return session\n}\n","import { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport type { NavigationStore } from \"./navigation\"\nimport type { ViewStackEntry } from \"./types\"\n\nexport type SurfaceMode = \"idle\" | \"inspecting\" | \"palette\" | \"viewing\"\n\nexport interface ModeSnapshot {\n mode: SurfaceMode\n}\n\nexport interface ModeBindings {\n mountInspector?: () => void\n destroyInspector?: () => void\n}\n\nexport interface ModeTransitions {\n openPalette(): void\n openInspector(): void\n closeInspector(): void\n toggleInspector(): void\n enterViewing(initialStack: ViewStackEntry[]): void\n dismiss(): void\n popOrTransition(): void\n pushView(entry: ViewStackEntry): void\n}\n\nexport type ModeStore = StoreApi<ModeSnapshot> & {\n transition: ModeTransitions\n}\n\nexport interface CreateModeStoreOptions {\n nav: NavigationStore\n bindings?: ModeBindings\n}\n\nconst COMMAND_PALETTE_ENTRY: ViewStackEntry = {\n id: \"command-palette\",\n ref: null,\n}\n\nexport function createModeStore(options: CreateModeStoreOptions): ModeStore {\n const { nav, bindings } = options\n\n const store = createStore<ModeSnapshot>(() => ({\n mode: \"idle\",\n }))\n\n const transition: ModeTransitions = {\n openPalette() {\n const prev = store.getState()\n if (prev.mode === \"inspecting\") {\n bindings?.destroyInspector?.()\n }\n nav.nav.reset([COMMAND_PALETTE_ENTRY])\n store.setState({ mode: \"palette\" })\n },\n\n openInspector() {\n bindings?.mountInspector?.()\n nav.nav.clear()\n store.setState({ mode: \"inspecting\" })\n },\n\n closeInspector() {\n bindings?.destroyInspector?.()\n nav.nav.clear()\n store.setState({ mode: \"idle\" })\n },\n\n toggleInspector() {\n if (store.getState().mode === \"inspecting\") {\n transition.closeInspector()\n } else {\n transition.openInspector()\n }\n },\n\n enterViewing(initialStack) {\n const prev = store.getState()\n if (prev.mode === \"inspecting\") {\n bindings?.destroyInspector?.()\n }\n nav.nav.reset(initialStack)\n store.setState({ mode: \"viewing\" })\n },\n\n dismiss() {\n const prev = store.getState()\n if (prev.mode === \"inspecting\") {\n bindings?.destroyInspector?.()\n }\n nav.nav.clear()\n store.setState({ mode: \"idle\" })\n },\n\n popOrTransition() {\n const { stack } = nav.getState()\n if (stack.length > 2) {\n nav.nav.pop()\n } else if (stack.length === 2 && stack[0]?.id === \"command-palette\") {\n nav.nav.reset([COMMAND_PALETTE_ENTRY])\n store.setState({ mode: \"palette\" })\n } else if (stack.length === 2) {\n nav.nav.pop()\n } else {\n nav.nav.clear()\n store.setState({ mode: \"idle\" })\n }\n },\n\n pushView(entry) {\n const { mode } = store.getState()\n const { stack } = nav.getState()\n\n if (entry.id === \"command-palette\" && stack.length === 0) {\n transition.openPalette()\n return\n }\n\n switch (mode) {\n case \"idle\":\n transition.enterViewing([entry])\n break\n case \"inspecting\":\n bindings?.destroyInspector?.()\n nav.nav.reset([entry])\n store.setState({ mode: \"viewing\" })\n break\n case \"palette\":\n case \"viewing\":\n nav.nav.push(entry)\n if (mode === \"palette\") {\n store.setState({ mode: \"viewing\" })\n }\n break\n }\n },\n }\n\n const modeStore = store as ModeStore\n modeStore.transition = transition\n return modeStore\n}\n","import { createStore, type StoreApi } from \"zustand/vanilla\"\n\nimport type { ViewStackEntry } from \"./types\"\n\nexport interface NavigationState {\n stack: ViewStackEntry[]\n}\n\nexport interface NavigationActions {\n push(entry: ViewStackEntry): void\n pop(): void\n clear(): void\n reset(stack: ViewStackEntry[]): void\n}\n\nexport type NavigationStore = StoreApi<NavigationState> & {\n nav: NavigationActions\n}\n\nexport function createNavigationStore(): NavigationStore {\n const store = createStore<NavigationState>(() => ({\n stack: [],\n }))\n\n const nav: NavigationActions = {\n push(entry) {\n store.setState({ stack: [...store.getState().stack, entry] })\n },\n pop() {\n const s = store.getState().stack\n if (s.length <= 1) {\n store.setState({ stack: [] })\n } else {\n store.setState({ stack: s.slice(0, -1) })\n }\n },\n clear() {\n store.setState({ stack: [] })\n },\n reset(stack) {\n store.setState({ stack })\n },\n }\n\n const navStore = store as NavigationStore\n navStore.nav = nav\n return navStore\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-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\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-600: oklch(66.6% 0.179 58.318);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-amber-800: oklch(47.3% 0.137 46.201);\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\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-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-cyan-50: oklch(98.4% 0.019 200.873);\n --color-cyan-100: oklch(95.6% 0.045 203.388);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\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-50: oklch(96.9% 0.016 293.756);\n --color-violet-100: oklch(94.3% 0.029 294.588);\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-50: oklch(97.7% 0.017 320.058);\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\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-tight: -0.025em;\n --tracking-widest: 0.1em;\n --leading-relaxed: 1.625;\n --radius-lg: var(--radius);\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 .\\!visible {\n visibility: visible !important;\n }\n .collapse {\n visibility: collapse;\n }\n .invisible {\n visibility: hidden;\n }\n .visible {\n visibility: visible;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\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 .z-1 {\n z-index: 1;\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 .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-flex {\n display: inline-flex;\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-full {\n height: 100%;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-8 {\n min-height: calc(var(--spacing) * 8);\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-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\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 {\n flex-shrink: 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-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 .flex-col {\n flex-direction: column;\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 .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 .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-full {\n border-radius: calc(infinity * 1px);\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-xl {\n border-radius: calc(var(--radius) * 1.4);\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-amber-500\\/40 {\n border-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 40%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-amber-500) 40%, transparent);\n }\n }\n .border-border {\n border-color: var(--border);\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-info\\/40 {\n border-color: var(--info);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--info) 40%, transparent);\n }\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-50 {\n background-color: var(--color-amber-50);\n }\n .bg-amber-500\\/15 {\n background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-500) 15%, 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-50 {\n background-color: var(--color-blue-50);\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-cyan-50 {\n background-color: var(--color-cyan-50);\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-50 {\n background-color: var(--color-emerald-50);\n }\n .bg-fuchsia-50 {\n background-color: var(--color-fuchsia-50);\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-info\\/15 {\n background-color: var(--info);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--info) 15%, 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-50 {\n background-color: var(--color-rose-50);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-slate-50 {\n background-color: var(--color-slate-50);\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-50 {\n background-color: var(--color-violet-50);\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 .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-1\\.5 {\n padding: calc(var(--spacing) * 1.5);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\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 .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-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 .pt-2 {\n padding-top: calc(var(--spacing) * 2);\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-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 .text-\\[11px\\] {\n font-size: 11px;\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-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\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-600 {\n color: var(--color-amber-600);\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-amber-800 {\n color: var(--color-amber-800);\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-600 {\n color: var(--color-slate-600);\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 .ordinal {\n --tw-ordinal: ordinal;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .line-through {\n text-decoration-line: line-through;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .accent-accent {\n accent-color: var(--accent);\n }\n .opacity-50 {\n opacity: 50%;\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-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 .inset-ring {\n --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-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 .inset-ring-amber-600\\/20 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(66.6% 0.179 58.318) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-600) 20%, transparent);\n }\n }\n .inset-ring-blue-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(48.8% 0.243 264.376) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-700) 10%, transparent);\n }\n }\n .inset-ring-cyan-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(52% 0.105 223.128) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-700) 10%, transparent);\n }\n }\n .inset-ring-emerald-600\\/20 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(59.6% 0.145 163.225) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-600) 20%, transparent);\n }\n }\n .inset-ring-fuchsia-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(51.8% 0.253 323.949) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-700) 10%, transparent);\n }\n }\n .inset-ring-rose-600\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(58.6% 0.253 17.585) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-600) 10%, transparent);\n }\n }\n .inset-ring-slate-500\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(55.4% 0.046 257.417) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-500) 10%, transparent);\n }\n }\n .inset-ring-violet-700\\/10 {\n --tw-inset-ring-color: color-mix(in srgb, oklch(49.1% 0.27 292.581) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-700) 10%, transparent);\n }\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\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 *, :host(.dark) *)) {\n background-clip: padding-box;\n }\n }\n .group-data-hover\\:bg-amber-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-amber-100);\n }\n }\n .group-data-hover\\:bg-blue-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-blue-100);\n }\n }\n .group-data-hover\\:bg-cyan-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-cyan-100);\n }\n }\n .group-data-hover\\:bg-emerald-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-emerald-100);\n }\n }\n .group-data-hover\\:bg-fuchsia-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-fuchsia-100);\n }\n }\n .group-data-hover\\:bg-rose-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-rose-100);\n }\n }\n .group-data-hover\\:bg-slate-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-slate-100);\n }\n }\n .group-data-hover\\:bg-violet-100 {\n &:is(:where(.group)[data-hover] *) {\n background-color: var(--color-violet-100);\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-\\[calc\\(var\\(--radius-lg\\)-1px\\)\\] {\n &::before {\n content: var(--tw-content);\n border-radius: calc(var(--radius-lg) - 1px);\n }\n }\n .before\\:rounded-\\[calc\\(var\\(--radius-xl\\)-1px\\)\\] {\n &::before {\n content: var(--tw-content);\n border-radius: calc(var(--radius-xl) - 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 .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-amber-500\\/20 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-500) 20%, transparent);\n }\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-info\\/20 {\n &:hover {\n @media (hover: hover) {\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 }\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\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\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-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\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\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .disabled\\:opacity-60 {\n &:disabled {\n opacity: 60%;\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\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 .dark\\:bg-amber-400\\/10 {\n &:is(.dark *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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 *, :host(.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-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-amber-400);\n }\n }\n .dark\\:text-amber-500 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-amber-500);\n }\n }\n .dark\\:text-blue-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-blue-400);\n }\n }\n .dark\\:text-cyan-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-cyan-400);\n }\n }\n .dark\\:text-emerald-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-emerald-400);\n }\n }\n .dark\\:text-fuchsia-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-fuchsia-400);\n }\n }\n .dark\\:text-rose-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-rose-400);\n }\n }\n .dark\\:text-slate-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-slate-400);\n }\n }\n .dark\\:text-violet-400 {\n &:is(.dark *, :host(.dark) *) {\n color: var(--color-violet-400);\n }\n }\n .dark\\:inset-ring-amber-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-blue-400\\/30 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(70.7% 0.165 254.624) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-blue-400) 30%, transparent);\n }\n }\n }\n .dark\\:inset-ring-cyan-400\\/30 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-cyan-400) 30%, transparent);\n }\n }\n }\n .dark\\:inset-ring-emerald-500\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-fuchsia-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(74% 0.238 322.16) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-fuchsia-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-rose-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-slate-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-slate-400) 20%, transparent);\n }\n }\n }\n .dark\\:inset-ring-violet-400\\/30 {\n &:is(.dark *, :host(.dark) *) {\n --tw-inset-ring-color: color-mix(in srgb, oklch(70.2% 0.183 293.541) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-inset-ring-color: color-mix(in oklab, var(--color-violet-400) 30%, transparent);\n }\n }\n }\n .dark\\:group-data-hover\\:bg-amber-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-blue-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-cyan-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-emerald-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-fuchsia-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-rose-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-slate-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:group-data-hover\\:bg-violet-400\\/20 {\n &:is(.dark *, :host(.dark) *) {\n &:is(:where(.group)[data-hover] *) {\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 }\n }\n .dark\\:before\\:shadow-\\[0_-1px_--theme\\(--color-white\\/6\\%\\)\\] {\n &:is(.dark *, :host(.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 .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:bg-accent {\n [data-kbd-nav] & {\n &:focus-within {\n background-color: var(--accent);\n }\n }\n }\n .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus-within\\:text-accent-foreground {\n [data-kbd-nav] & {\n &:focus-within {\n color: var(--accent-foreground);\n }\n }\n }\n .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:bg-accent {\n [data-kbd-nav] & {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .\\[\\[data-kbd-nav\\]_\\&\\]\\:focus\\:text-accent-foreground {\n [data-kbd-nav] & {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n }\n}\n@layer base {\n *, ::after, ::before {\n border-color: var(--color-border, currentColor);\n }\n}\n@layer components {\n [data-highlighted] {\n background-color: var(--accent);\n color: var(--accent-foreground);\n transition: background-color 150ms ease-out;\n }\n [data-kbd-nav] [data-highlighted]:not([data-kbd-highlighted]) {\n background-color: transparent;\n color: inherit;\n }\n [data-kbd-highlighted] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in srgb, var(--accent) 200%, transparent);\n }\n color: var(--accent-foreground);\n }\n .uidex-item-interactive:hover {\n background-color: var(--accent);\n color: var(--accent-foreground);\n }\n [data-kbd-nav] .uidex-item-interactive:hover:not(:focus):not(:focus-within) {\n background-color: transparent;\n color: inherit;\n }\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@keyframes skeleton {\n to {\n background-position: -200% 0;\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-ordinal {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-slashed-zero {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-figure {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-spacing {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-fraction {\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-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: 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\"\n\nexport const Z_BASE = 2147483630\nexport const Z_OVERLAY = 2147483635\nexport const Z_CHROME = 2147483645\n\nexport const SURFACE_IGNORE_SELECTOR = `.${SURFACE_HOST_CLASS}`\n\nimport type { EntityKind } from \"../../shared/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\n/** Entity kinds whose presence is backed by a DOM attribute (resolvable to a live element). */\nexport const DOM_BACKED_KINDS: ReadonlySet<EntityKind> = new Set([\n \"element\",\n \"region\",\n \"widget\",\n \"primitive\",\n])\n","import type { ResolvedTheme } from \"../session\"\nimport builtinCss from \"../styles/tailwind.built.css\"\nimport { SURFACE_HOST_CLASS, Z_BASE, Z_CHROME } 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.position = \"relative\"\n chromeEl.style.zIndex = String(Z_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 \"../../shared/entities\"\nimport { Z_CHROME } from \"./constants\"\n\nconst DEFAULT_TOOLTIP_COLOR = \"#34d399\"\nconst TOOLTIP_OFFSET = 16\nconst ARROW_SIZE = 5\n\nexport type CursorTooltipContent =\n | {\n entity: Entity\n node?: Element | null\n layer?: { index: number; total: number }\n }\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}\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(\"#a1a1aa\")\n el.style.opacity = \"0.6\"\n body.append(document.createTextNode(currentContent))\n return\n }\n if (!currentContent) return\n el.style.opacity = \"1\"\n const { entity, node } = currentContent\n const style = KIND_STYLE[entity.kind]\n const demoted = entity.kind === \"primitive\"\n applyColor(style?.color ?? DEFAULT_TOOLTIP_COLOR)\n if (demoted) el.style.opacity = \"0.55\"\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 if (currentContent.layer) {\n const counter = document.createElement(\"span\")\n counter.setAttribute(\"data-uidex-cursor-tooltip-layer\", \"\")\n counter.style.fontFamily =\n \"ui-monospace, SFMono-Regular, Menlo, monospace\"\n counter.style.fontSize = \"10px\"\n counter.style.lineHeight = \"1\"\n counter.style.padding = \"2px 5px\"\n counter.style.borderRadius = \"4px\"\n counter.style.background = \"rgba(0,0,0,0.18)\"\n counter.textContent = `${currentContent.layer.index + 1}/${currentContent.layer.total}`\n body.append(counter)\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 \"../../shared/entities\"\nimport type { Registry } from \"../../shared/entities\"\nimport type { SessionStore } from \"../session\"\nimport { SURFACE_IGNORE_SELECTOR, UIDEX_ATTR_TO_KIND } from \"./constants\"\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 InspectorMatchStack {\n matches: InspectorMatch[]\n index: number\n current: InspectorMatch\n}\n\nexport interface InspectorOptions {\n session: SessionStore\n registry?: Registry\n resolveAll?: (target: Element) => InspectorMatch[]\n onHover?: (\n stack: InspectorMatchStack | null,\n cursor: { x: number; y: number } | null\n ) => void\n onSelect?: (match: InspectorMatch, cursor: { x: number; y: number }) => void\n onCycle?: (\n stack: InspectorMatchStack,\n cursor: { x: number; y: number }\n ) => void\n /** Fired when the cursor enters an iframe or otherwise leaves the inspectable document. */\n onObscured?: (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 =\n registry.get(ref.kind, ref.id) ??\n registry.matchPattern?.(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 {\n kind: \"flow\",\n id: ref.id,\n loc: { file: \"\" },\n touches: [],\n steps: [],\n }\n }\n return { kind: ref.kind, id: ref.id }\n}\n\nexport function defaultResolveAllMatches(\n target: Element,\n registry?: Registry\n): InspectorMatch[] {\n if (target.closest(SURFACE_IGNORE_SELECTOR)) return []\n const semantic: InspectorMatch[] = []\n const primitives: InspectorMatch[] = []\n const seen = new Set<string>()\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 key = `${kind}:${id}`\n if (!seen.has(key)) {\n seen.add(key)\n const ref: EntityRef = { kind, id }\n const entity = entityForRef(ref, registry)\n const match: InspectorMatch = {\n element: node,\n ref,\n entity,\n label: displayName(entity, node),\n }\n if (kind === \"primitive\") {\n primitives.push(match)\n } else {\n semantic.push(match)\n }\n }\n }\n }\n }\n node = node.parentElement\n }\n return semantic.concat(primitives)\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 function createInspector(options: InspectorOptions): Inspector {\n const {\n session,\n registry,\n resolveAll = (target) => defaultResolveAllMatches(target, registry),\n onHover,\n onSelect,\n onCycle,\n onObscured,\n } = options\n\n let mounted = false\n let currentEl: HTMLElement | null = null\n let cursorStyleEl: HTMLStyleElement | null = null\n let stack: InspectorMatch[] = []\n let layerIndex = 0\n let lastCursor: { x: number; y: number } = { x: 0, y: 0 }\n\n const makeStack = (): InspectorMatchStack | null =>\n stack.length > 0\n ? { matches: stack, index: layerIndex, current: stack[layerIndex] }\n : null\n\n const onDocumentLeave = (): void => {\n currentEl = null\n stack = []\n layerIndex = 0\n session.highlight.unhover()\n onObscured?.(lastCursor)\n }\n\n const onMouseMove = (e: MouseEvent): void => {\n if (!(e.target instanceof Element)) return\n const matches = resolveAll(e.target)\n const cursor = { x: e.clientX, y: e.clientY }\n lastCursor = cursor\n const topEl = matches.length > 0 ? matches[0].element : null\n if (topEl) {\n if (topEl !== currentEl) {\n currentEl = topEl\n stack = matches\n layerIndex = 0\n session.highlight.hover(stack[0].ref)\n }\n onHover?.(makeStack(), cursor)\n } else if (currentEl) {\n currentEl = null\n stack = []\n layerIndex = 0\n session.highlight.unhover()\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 if (stack.length === 0) return\n e.preventDefault()\n e.stopPropagation()\n const match = stack[layerIndex]\n onSelect?.(match, { x: e.clientX, y: e.clientY })\n }\n\n const onContextMenu = (e: MouseEvent): void => {\n if (stack.length <= 1) return\n e.preventDefault()\n e.stopPropagation()\n layerIndex = (layerIndex + 1) % stack.length\n const match = stack[layerIndex]\n session.highlight.hover(match.ref)\n onCycle?.(makeStack()!, lastCursor)\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(\"mouseleave\", onDocumentLeave)\n document.addEventListener(\"click\", onClick, true)\n document.addEventListener(\"contextmenu\", onContextMenu, true)\n },\n destroy() {\n if (!mounted) return\n mounted = false\n currentEl = null\n stack = []\n layerIndex = 0\n if (cursorStyleEl) {\n cursorStyleEl.remove()\n cursorStyleEl = null\n }\n document.removeEventListener(\"mousemove\", onMouseMove)\n document.removeEventListener(\"mouseleave\", onDocumentLeave)\n document.removeEventListener(\"click\", onClick, true)\n document.removeEventListener(\"contextmenu\", onContextMenu, true)\n session.highlight.unhover()\n onHover?.(null, null)\n },\n }\n}\n","import {\n Command,\n Highlighter,\n MousePointerClick,\n createElement as createLucideElement,\n} from \"lucide\"\nimport { cn } from \"../internal/cn\"\nimport { el } from \"../internal/el\"\nimport type { SessionStore } from \"../session\"\nimport { Z_CHROME } from \"./constants\"\nimport { INSPECT_SHORTCUT, formatShortcutLabel } from \"./keys\"\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\nconst ROOT_CLASS =\n \"inline-flex items-center gap-1.5 rounded-xl border border-border bg-popover p-1.5 font-sans text-xs text-popover-foreground shadow-lg/5 select-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:bg-muted/72 before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\"\n\nconst BUTTON_CLASS =\n \"relative z-1 inline-flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent 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 BUTTON_ACTIVE_CLASS =\n \"border-info/40 bg-info/15 text-info-foreground hover:bg-info/20\"\n\nconst TITLE_CLASS =\n \"relative z-1 whitespace-nowrap px-1.5 text-xs font-semibold tracking-tight text-foreground\"\n\nconst BUTTON_HIGHLIGHT_ACTIVE_CLASS =\n \"border-amber-500/40 bg-amber-500/15 text-amber-600 hover:bg-amber-500/20 dark:text-amber-400\"\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 = el(\"div\", {\n class: ROOT_CLASS,\n attrs: {\n \"data-uidex-menubar\": \"\",\n role: \"toolbar\",\n },\n style: {\n position: \"fixed\",\n zIndex: String(Z_CHROME),\n pointerEvents: \"auto\",\n cursor: \"grab\",\n },\n })\n\n let titleEl: HTMLElement | null = null\n if (appTitle) {\n titleEl = el(\"span\", {\n class: TITLE_CLASS,\n attrs: { \"data-uidex-menubar-title\": \"\" },\n text: appTitle,\n })\n root.appendChild(titleEl)\n }\n\n const highlightIcon = createLucideElement(Highlighter)\n highlightIcon.setAttribute(\"class\", \"size-3.5\")\n highlightIcon.setAttribute(\"aria-hidden\", \"true\")\n const highlightBtn = el(\n \"button\",\n {\n class: BUTTON_CLASS,\n attrs: {\n type: \"button\",\n \"data-uidex-menubar-highlight\": \"\",\n \"aria-label\": \"Dismiss highlight\",\n },\n },\n highlightIcon\n )\n highlightBtn.hidden = true\n highlightBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n session.highlight.unpin()\n })\n root.appendChild(highlightBtn)\n\n const inspectIcon = createLucideElement(MousePointerClick)\n inspectIcon.setAttribute(\"class\", \"size-3.5\")\n inspectIcon.setAttribute(\"aria-hidden\", \"true\")\n const inspectBtn = el(\n \"button\",\n {\n class: BUTTON_CLASS,\n attrs: {\n type: \"button\",\n \"data-uidex-menubar-inspect\": \"\",\n \"aria-label\": `Inspect (${formatShortcutLabel(INSPECT_SHORTCUT)})`,\n },\n },\n inspectIcon\n )\n inspectBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n session.mode.transition.toggleInspector()\n inspectBtn.blur()\n })\n root.appendChild(inspectBtn)\n\n const paletteIcon = createLucideElement(Command)\n paletteIcon.setAttribute(\"class\", \"size-3.5\")\n paletteIcon.setAttribute(\"aria-hidden\", \"true\")\n const paletteBtn = el(\n \"button\",\n {\n class: BUTTON_CLASS,\n attrs: {\n type: \"button\",\n \"data-uidex-menubar-palette\": \"\",\n \"aria-label\": \"Command palette\",\n },\n },\n paletteIcon\n )\n paletteBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n if (session.getState().stack.length > 0) {\n session.mode.transition.dismiss()\n } else {\n session.mode.transition.openPalette()\n }\n paletteBtn.blur()\n })\n root.appendChild(paletteBtn)\n container.appendChild(root)\n\n const syncButtonStates = (): void => {\n const state = session.getState()\n\n const inspectActive = state.mode === \"inspecting\"\n inspectBtn.setAttribute(\n \"data-uidex-menubar-inspect-active\",\n inspectActive ? \"true\" : \"false\"\n )\n inspectBtn.className = cn(\n BUTTON_CLASS,\n inspectActive && BUTTON_ACTIVE_CLASS\n )\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 paletteBtn.className = cn(BUTTON_CLASS, paletteOpen && BUTTON_ACTIVE_CLASS)\n\n const highlightActive = state.pinnedHighlight !== null\n highlightBtn.setAttribute(\n \"data-uidex-menubar-highlight-active\",\n highlightActive ? \"true\" : \"false\"\n )\n highlightBtn.className = cn(\n BUTTON_CLASS,\n highlightActive && BUTTON_HIGHLIGHT_ACTIVE_CLASS\n )\n highlightBtn.hidden = !highlightActive\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 { 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 { SessionStore } from \"../session\"\nimport type { ActionsPopupHandle } from \"../views/core/actions-popup\"\n\nexport interface PaletteShortcut {\n /** The key value (e.g. \"k\", \"j\", \";\"). Matched case-insensitively. */\n key: string\n /** Require Cmd (Mac) / Ctrl (Win/Linux). Default: true. */\n mod?: boolean\n /** Require Shift. Default: false. */\n shift?: boolean\n}\n\nconst DEFAULT_SHORTCUT: PaletteShortcut = { key: \"k\" }\n\nexport const ACTIONS_SHORTCUT: PaletteShortcut = { key: \"j\" }\n\nexport const INSPECT_SHORTCUT: PaletteShortcut = { key: \"i\" }\n\nexport function formatShortcutLabel(shortcut: PaletteShortcut): string {\n const parts: string[] = []\n if (shortcut.mod !== false) parts.push(\"⌘\")\n if (shortcut.shift) parts.push(\"⇧\")\n parts.push(shortcut.key.toUpperCase())\n return parts.join(\"\")\n}\n\nfunction matchesShortcut(e: KeyboardEvent, shortcut: PaletteShortcut): boolean {\n const wantMod = shortcut.mod !== false\n const wantShift = shortcut.shift === true\n const hasMod = e.metaKey || e.ctrlKey\n return (\n hasMod === wantMod &&\n e.shiftKey === wantShift &&\n !e.altKey &&\n e.key.toLowerCase() === shortcut.key.toLowerCase()\n )\n}\n\nexport interface KeyBindingHandle {\n destroy(): void\n}\n\nexport interface BindShadowKeysOptions {\n shadowRoot: ShadowRoot\n session: SessionStore\n getActionsPopup: () => ActionsPopupHandle | null\n shortcut?: PaletteShortcut\n}\n\nexport function bindShadowKeys(\n options: BindShadowKeysOptions\n): KeyBindingHandle {\n const { shadowRoot, session, getActionsPopup } = options\n const shortcut = options.shortcut ?? DEFAULT_SHORTCUT\n\n const onKeydown = (e: KeyboardEvent): void => {\n const isMod = e.metaKey || e.ctrlKey\n const isCmdK = matchesShortcut(e, shortcut)\n const isCmdDot = matchesShortcut(e, ACTIONS_SHORTCUT)\n const isCmdI = matchesShortcut(e, INSPECT_SHORTCUT)\n const isCmdBracket = isMod && !e.altKey && !e.shiftKey && e.key === \"[\"\n const isEsc = e.key === \"Escape\"\n const isPopKey = isEsc || isCmdBracket\n if (!isCmdK && !isCmdDot && !isCmdI && !isPopKey) return\n\n const popup = getActionsPopup()\n if (popup?.isOpen()) {\n if (isPopKey || isCmdK || isCmdDot) {\n popup.close()\n e.preventDefault()\n e.stopPropagation()\n }\n return\n }\n\n if (isCmdDot) {\n if (popup) {\n e.preventDefault()\n e.stopPropagation()\n popup.open()\n }\n return\n }\n\n if (isCmdI) {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.toggleInspector()\n return\n }\n\n if (isCmdK) {\n e.preventDefault()\n e.stopPropagation()\n const { mode } = session.mode.getState()\n if (session.nav.getState().stack.length === 0) {\n session.mode.transition.openPalette()\n } else if (mode === \"palette\") {\n if (popup) {\n popup.open()\n } else {\n session.mode.transition.dismiss()\n }\n }\n return\n }\n\n const { mode } = session.mode.getState()\n if (mode === \"viewing\") {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.popOrTransition()\n } else if (mode === \"inspecting\") {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.closeInspector()\n } else if (mode === \"palette\") {\n e.preventDefault()\n e.stopPropagation()\n session.mode.transition.dismiss()\n } else if (session.getState().pinnedHighlight !== null) {\n e.preventDefault()\n e.stopPropagation()\n session.highlight.unpin()\n }\n }\n\n const doc = shadowRoot.ownerDocument\n doc.addEventListener(\"keydown\", onKeydown, { capture: true })\n shadowRoot.addEventListener(\"keydown\", onKeydown as EventListener, {\n capture: true,\n })\n\n return {\n destroy() {\n doc.removeEventListener(\"keydown\", onKeydown, { capture: true })\n shadowRoot.removeEventListener(\n \"keydown\",\n onKeydown as EventListener,\n {\n capture: true,\n } as EventListenerOptions\n )\n },\n }\n}\n","export interface Repositioner {\n /** Coalesce a reflow into the next animation frame (idempotent until it fires). */\n schedule(): void\n /** Cancel a pending reflow frame, if any. */\n cancel(): void\n /** Start listening for capturing `scroll` and `resize` events on `window`. */\n attach(): void\n /** Stop listening and cancel any pending reflow frame. */\n detach(): void\n}\n\n/**\n * Shared scroll/resize repositioner. Listens for capturing `scroll` and\n * `resize` events on `window` and coalesces reflows into a single\n * `requestAnimationFrame` (falling back to `setTimeout(…, 0)` where rAF is\n * unavailable). `attach`/`detach` are idempotent; `detach` cancels any pending\n * frame.\n */\nexport function createRepositioner(onReflow: () => void): Repositioner {\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 onReflow()\n })\n : (setTimeout(() => {\n rafId = null\n onReflow()\n }, 0) as unknown as number)\n }\n\n const cancel = (): 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 cancel()\n }\n\n return { schedule, cancel, attach, detach }\n}\n","import { createRepositioner } from \"../internal/repositioner\"\nimport { 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 backdrop?: boolean\n}\n\nexport interface Overlay {\n show(target: Element, options?: OverlayShowOptions): void\n hide(): void\n destroy(): void\n onDismiss: (() => void) | null\n readonly isVisible: boolean\n}\n\ninterface OverlayDeps {\n container: Element | ShadowRoot\n}\n\nconst DEFAULT_COLOR = \"#34d399\"\nconst DEFAULT_BORDER_WIDTH = 2\nconst DEFAULT_FILL_OPACITY = 0.08\nconst BACKDROP_OPACITY = 0.45\n\nexport function createOverlay(deps: OverlayDeps): Overlay {\n const { container } = deps\n\n const backdrop = document.createElement(\"div\")\n backdrop.setAttribute(\"data-uidex-overlay-backdrop\", \"\")\n backdrop.style.position = \"fixed\"\n backdrop.style.inset = \"0\"\n backdrop.style.zIndex = String(Z_OVERLAY)\n backdrop.style.backgroundColor = `rgba(0, 0, 0, ${BACKDROP_OPACITY})`\n backdrop.style.opacity = \"0\"\n backdrop.style.visibility = \"hidden\"\n backdrop.style.transition = \"opacity 150ms ease-out\"\n backdrop.style.pointerEvents = \"auto\"\n backdrop.style.cursor = \"default\"\n backdrop.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n overlay.onDismiss?.()\n })\n container.appendChild(backdrop)\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 + 1)\n box.style.boxSizing = \"border-box\"\n box.style.opacity = \"0\"\n box.style.transition = \"opacity 150ms ease-out\"\n box.style.visibility = \"hidden\"\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.addEventListener(\"transitionend\", () => {\n if (box.style.opacity === \"0\") {\n box.style.visibility = \"hidden\"\n }\n })\n backdrop.addEventListener(\"transitionend\", () => {\n if (backdrop.style.opacity === \"0\") {\n backdrop.style.visibility = \"hidden\"\n backdrop.style.clipPath = \"\"\n }\n })\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 backdrop: false,\n }\n\n const repositioner = createRepositioner(() => updatePosition())\n\n function updatePosition(): void {\n if (!target) return\n const rect = target.getBoundingClientRect()\n const pad = opts.padding\n const top = rect.top - pad\n const left = rect.left - pad\n const w = rect.width + pad * 2\n const h = rect.height + pad * 2\n box.style.top = `${top}px`\n box.style.left = `${left}px`\n box.style.width = `${w}px`\n box.style.height = `${h}px`\n\n if (opts.backdrop) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n backdrop.style.clipPath = cutoutPath(vw, vh, left, top, w, h)\n }\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 box.style.borderRadius = \"6px\"\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 if (opts.backdrop) {\n backdrop.style.visibility = \"visible\"\n backdrop.style.opacity = \"1\"\n } else {\n backdrop.style.opacity = \"0\"\n backdrop.style.visibility = \"hidden\"\n backdrop.style.clipPath = \"\"\n }\n }\n\n const overlay: Overlay = {\n onDismiss: null,\n show(nextTarget, showOpts) {\n const wasVisible = target !== null\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 backdrop: showOpts?.backdrop ?? false,\n }\n applyStyles()\n updatePosition()\n if (!wasVisible) {\n box.style.opacity = \"0\"\n box.style.visibility = \"visible\"\n box.offsetHeight // eslint-disable-line @typescript-eslint/no-unused-expressions\n }\n box.style.opacity = \"1\"\n repositioner.attach()\n },\n hide() {\n target = null\n box.style.opacity = \"0\"\n backdrop.style.opacity = \"0\"\n repositioner.detach()\n },\n destroy() {\n repositioner.detach()\n box.remove()\n backdrop.remove()\n target = null\n },\n get isVisible() {\n return target !== null\n },\n }\n\n return overlay\n}\n\n/**\n * Build a `path(evenodd, ...)` that covers the full viewport with a\n * rectangular cutout. Two separate subpaths (each with their own M/Z)\n * avoid the bridging-line artifacts that `polygon()` creates.\n */\nfunction cutoutPath(\n vw: number,\n vh: number,\n x: number,\n y: number,\n w: number,\n h: number\n): string {\n const outer = `M0 0H${vw}V${vh}H0Z`\n const inner = `M${x} ${y}V${y + h}H${x + w}V${y}Z`\n return `path(evenodd,\"${outer}${inner}\")`\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.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 \"../../shared/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 InspectorMatch,\n type InspectorMatchStack,\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?: (\n match: InspectorMatch | null,\n cursor: { x: number; y: number } | null\n ) => void\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.shadowRoot })\n cleanup.add(overlay)\n\n const tooltip = createCursorTooltip({\n container: host.chromeEl,\n })\n cleanup.add(tooltip)\n\n const afterHover = options.inspector?.onAfterHover\n\n const showStack = (\n stack: InspectorMatchStack | null,\n cursor: { x: number; y: number } | null\n ): void => {\n if (!stack) {\n overlay.hide()\n tooltip.update(null, cursor)\n return\n }\n const { current } = stack\n const demoted = current.ref.kind === \"primitive\"\n overlay.show(current.element, {\n color: KIND_STYLE[current.ref.kind].color,\n ...(demoted && { borderStyle: \"dashed\", fillOpacity: 0.04 }),\n })\n tooltip.update(\n {\n entity: current.entity,\n node: current.element,\n layer:\n stack.matches.length > 1\n ? { index: stack.index, total: stack.matches.length }\n : undefined,\n },\n cursor\n )\n }\n\n const inspector = createInspector({\n session: options.session,\n registry: options.registry,\n onSelect: options.inspector?.onSelect,\n onHover: (stack, cursor) => {\n showStack(stack, cursor)\n afterHover?.(stack?.current ?? null, cursor)\n },\n onCycle: (stack, cursor) => {\n showStack(stack, cursor)\n },\n onObscured: (cursor) => {\n overlay.hide()\n tooltip.update(\"iframe\", 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 { EntityKind, EntityRef, Registry } from \"../../../shared/entities\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport type { OverlayShowOptions } from \"../../surface/overlay\"\nimport type { Router } from \"./router\"\nimport type { ViewSurface } from \"./surface\"\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 subtitle?: string | (() => string)\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 views: Router\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 /** 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 icon?: () => Node\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 /** Required unless `render` is provided. */\n surface?: (ctx: ViewContext) => ViewSurface\n /** Direct render for integration adapters (React, etc.). Takes precedence over `surface` when both are present. */\n render?: (ctx: ViewContext, root: HTMLElement) => Cleanup | void\n parent?: (ref: EntityRef | null) => ViewStackEntry | null\n}\n\nexport class ViewValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ViewValidationError\"\n }\n}\n","import { sameRef, type EntityRef } from \"../../../shared/entities\"\nimport type { SessionStore } from \"../../session\"\nimport type { ViewStackEntry } from \"../../session/types\"\nimport { ViewValidationError, type View } from \"./types\"\n\nexport interface RouteMatch {\n view: View\n priority: number\n}\n\nexport interface Router {\n resolve(ref: EntityRef): RouteMatch | null\n add(view: View, priority?: number): void\n remove(id: string): void\n get(id: string): View | undefined\n list(): readonly View[]\n buildStack(entry: ViewStackEntry): ViewStackEntry[]\n navigate(ref: EntityRef): void\n recents(): readonly EntityRef[]\n favorites(): readonly EntityRef[]\n toggleFavorite(ref: EntityRef): void\n isFavorite(ref: EntityRef): boolean\n}\n\nexport interface CreateRouterOptions {\n session: SessionStore\n}\n\nexport function createRouter(options: CreateRouterOptions): Router {\n const FAVORITES_KEY = \"uidex:favorites\"\n const MAX_RECENTS = 8\n const entries: Array<{ view: View; priority: number }> = []\n const recentRefs: EntityRef[] = []\n const favoriteRefs: EntityRef[] = []\n\n try {\n const stored = localStorage.getItem(FAVORITES_KEY)\n if (stored) {\n const parsed = JSON.parse(stored) as EntityRef[]\n favoriteRefs.push(...parsed)\n }\n } catch {\n /* ignore — localStorage unavailable or corrupt */\n }\n\n function persistFavorites(): void {\n try {\n localStorage.setItem(FAVORITES_KEY, JSON.stringify(favoriteRefs))\n } catch {\n /* ignore */\n }\n }\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 const hasSurface = typeof view.surface === \"function\"\n const hasRender = typeof view.render === \"function\"\n if (!hasSurface && !hasRender) {\n throw new ViewValidationError(\n `View ${view.id}: a 'surface' function (or a 'render' override) is required`\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 resolve(ref: EntityRef): RouteMatch | null {\n let best: RouteMatch | null = null\n for (const e of entries) {\n if (!e.view.matches?.(ref)) continue\n if (!best || e.priority > best.priority) {\n best = { view: e.view, priority: e.priority }\n }\n }\n return best\n }\n\n function add(view: View, priority = 0): void {\n validate(view)\n const idx = entries.findIndex((e) => e.view.id === view.id)\n if (idx >= 0) entries.splice(idx, 1)\n entries.push({ view, priority })\n }\n\n function remove(id: string): void {\n const idx = entries.findIndex((e) => e.view.id === id)\n if (idx >= 0) entries.splice(idx, 1)\n const { stack } = options.session.nav.getState()\n const top = stack[stack.length - 1] ?? null\n if (top?.id === id) options.session.mode.transition.dismiss()\n }\n\n function get(id: string): View | undefined {\n return entries.find((e) => e.view.id === id)?.view\n }\n\n function list(): readonly View[] {\n return entries.map((e) => e.view)\n }\n\n function buildStack(entry: ViewStackEntry): ViewStackEntry[] {\n const stack: ViewStackEntry[] = [entry]\n let current = entry\n for (let depth = 0; depth < 10; depth++) {\n const view = get(current.id)\n if (!view?.parent) break\n const parentEntry = view.parent(current.ref)\n if (!parentEntry) break\n stack.unshift(parentEntry)\n current = parentEntry\n }\n return stack\n }\n\n function navigate(ref: EntityRef): void {\n const match = resolve(ref)\n if (!match) return\n const idx = recentRefs.findIndex((r) => sameRef(r, ref))\n if (idx >= 0) recentRefs.splice(idx, 1)\n recentRefs.unshift(ref)\n if (recentRefs.length > MAX_RECENTS) recentRefs.length = MAX_RECENTS\n const entry: ViewStackEntry = { id: match.view.id, ref }\n const { mode } = options.session.mode.getState()\n if (mode === \"idle\" || mode === \"inspecting\") {\n options.session.mode.transition.enterViewing(buildStack(entry))\n } else {\n options.session.mode.transition.pushView(entry)\n }\n }\n\n function recents(): readonly EntityRef[] {\n return recentRefs\n }\n\n function favorites(): readonly EntityRef[] {\n return favoriteRefs\n }\n\n function toggleFavorite(ref: EntityRef): void {\n const idx = favoriteRefs.findIndex((r) => sameRef(r, ref))\n if (idx >= 0) {\n favoriteRefs.splice(idx, 1)\n } else {\n favoriteRefs.unshift(ref)\n }\n persistFavorites()\n }\n\n function isFavorite(ref: EntityRef): boolean {\n return favoriteRefs.some((r) => sameRef(r, ref))\n }\n\n return {\n resolve,\n add,\n remove,\n get,\n list,\n buildStack,\n navigate,\n recents,\n favorites,\n toggleFavorite,\n isFavorite,\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","export { html, svg, render, nothing, type TemplateResult } from \"lit-html\"\nexport { ref, createRef, type Ref } from \"lit-html/directives/ref.js\"\nexport { icon } from \"./lit-icon.js\"\n","import { noChange } from \"lit-html\"\nimport {\n Directive,\n directive,\n type PartInfo,\n PartType,\n} from \"lit-html/directive.js\"\nimport { createElement, type IconNode } from \"lucide\"\n\nclass LucideIconDirective extends Directive {\n private _icon: IconNode | undefined\n private _class: string | undefined\n private _el: SVGSVGElement | undefined\n\n constructor(partInfo: PartInfo) {\n super(partInfo)\n if (partInfo.type !== PartType.CHILD) {\n throw new Error(\"icon() can only be used in a child position\")\n }\n }\n\n override update(_part: unknown, [iconNode, className]: [IconNode, string?]) {\n if (iconNode === this._icon && className === this._class) return noChange\n this._icon = iconNode\n this._class = className\n this._el = createElement(iconNode) as unknown as SVGSVGElement\n this._el.setAttribute(\"aria-hidden\", \"true\")\n if (className) this._el.setAttribute(\"class\", className)\n return this._el\n }\n\n render(iconNode: IconNode, className?: string) {\n const el = createElement(iconNode) as unknown as SVGSVGElement\n el.setAttribute(\"aria-hidden\", \"true\")\n if (className) el.setAttribute(\"class\", className)\n return el\n }\n}\n\nexport const icon = directive(LucideIconDirective)\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../../internal/el\"\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","import { createElement as createLucideElement } from \"lucide\"\nimport { KIND_STYLE, type EntityKind } from \"../../../shared/entities\"\nimport { cn } from \"../../internal/cn\"\nimport { html, type TemplateResult } from \"../../internal/lit\"\nimport { icon } from \"../../internal/lit-icon\"\nimport { createBadge, badgeVariants } from \"../../ui/badge\"\nimport { createIconTile, iconTileTpl } from \"./icon-tile\"\n\n// ── Imperative (legacy) — returns HTMLElement / SVGElement ─────────\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 iconEl = createLucideElement(style.icon)\n iconEl.setAttribute(\"aria-hidden\", \"true\")\n return createBadge(\n {\n class: style.chip,\n attrs: { \"data-uidex-kind-badge\": kind },\n },\n [iconEl, style.label]\n )\n}\n\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nexport function kindIconTpl(kind: EntityKind): TemplateResult {\n const style = KIND_STYLE[kind]\n return html`${icon(style.icon, cn(\"h-4 w-4 shrink-0\", style.tone))}`\n}\n\nexport function kindIconTileTpl(kind: EntityKind): TemplateResult {\n const style = KIND_STYLE[kind]\n return iconTileTpl(\n html`${icon(style.icon, cn(\"size-3.5 opacity-80\", style.tone))}`,\n { toneClass: style.chip }\n )\n}\n\nexport function kindBadgeTpl(kind: EntityKind): TemplateResult {\n const style = KIND_STYLE[kind]\n return html`\n <span\n class=${cn(badgeVariants({}), style.chip)}\n data-slot=\"badge\"\n data-uidex-kind-badge=${kind}\n >${icon(style.icon)} ${style.label}</span\n >\n `\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 { html, type TemplateResult } from \"../internal/lit\"\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\n// ── Imperative (legacy) — returns HTMLSpanElement ──────────────────\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nexport function badgeTpl(\n content: TemplateResult | string,\n options: { variant?: BadgeVariant; size?: BadgeSize; class?: ClassValue } = {}\n): TemplateResult {\n const { variant, size, class: extra } = options\n return html`\n <span class=${cn(badgeVariants({ variant, size }), extra)} data-slot=\"badge\"\n >${content}</span\n >\n `\n}\n","import type { ClassValue } from \"clsx\"\nimport type { DirectiveResult } from \"lit-html/directive.js\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport { html, type TemplateResult } from \"../../internal/lit\"\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\n// ── Imperative (legacy) — returns HTMLElement ─────────────────────\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\n/**\n * Template version of the icon tile. Callers pass a properly-sized\n * `TemplateResult` (e.g. from the `icon` directive) — no SVG class\n * stripping needed.\n */\nexport function iconTileTpl(\n inner: TemplateResult | DirectiveResult,\n options: Pick<\n IconTileOptions,\n \"extraClass\" | \"toneClass\" | \"tint\" | \"tintAlpha\"\n > = {}\n): TemplateResult {\n const tintStyle =\n options.tint && !options.toneClass\n ? `background-color: color-mix(in srgb, ${options.tint} ${options.tintAlpha ?? 15}%, transparent)`\n : \"\"\n return html`\n <span\n class=${cn(TILE_CLASS, options.toneClass, options.extraClass)}\n data-slot=\"icon-tile\"\n aria-hidden=\"true\"\n style=${tintStyle}\n >${inner}</span\n >\n `\n}\n","import { displayName, KIND_STYLE, type Entity } from \"../../../shared/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\n// ── Imperative (legacy) — returns HTMLElement ─────────────────────\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 { createNormalizer, type PropTypes } from \"@zag-js/types\"\n\nexport type DomProps = PropTypes<Record<string, unknown>>\n\nexport const normalizeProps = createNormalizer<DomProps>((v) => v)\n","import type { Cleanup } from \"./cleanup\"\n\ntype Props = Record<string, unknown>\n\nexport function applyProps(node: Element, props: Props): Cleanup {\n const removers: Array<() => void> = []\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 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 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(\n (node as HTMLElement).style,\n rawValue as Record<string, string>\n )\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 as HTMLElement).tabIndex = Number(rawValue)\n continue\n }\n node.setAttribute(key, String(rawValue))\n }\n return () => removers.forEach((fn) => fn())\n}\n","import { applyProps } from \"../../internal/apply-props\"\nimport type { Cleanup } from \"../../internal/cleanup\"\n\nexport function spreadProps(\n node: HTMLElement,\n props: Record<string, unknown>\n): Cleanup {\n return applyProps(node, props)\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, applyProps(node, props))\n },\n cleanupAll() {\n for (const clean of map.values()) clean()\n map.clear()\n },\n }\n}\n","import type { Cleanup } from \"./cleanup\"\n\nconst NAV_KEYS = new Set([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"])\n\nexport interface ArrowNavOptions {\n container: HTMLElement\n getItems(): HTMLElement[]\n /** Element to focus when ArrowUp is pressed at the top of the list. */\n escapeTarget?: HTMLElement\n /** Wrap from last→first and first→last. Default: false. */\n wrap?: boolean\n /** Additional elements that should forward arrow keys into the list. */\n extraSources?: HTMLElement[]\n onEnterKbd?: () => void\n}\n\nexport function bindArrowNav(options: ArrowNavOptions): Cleanup {\n const { container, getItems, escapeTarget, onEnterKbd } = options\n const wrap = options.wrap ?? false\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!NAV_KEYS.has(e.key)) return\n onEnterKbd?.()\n const items = getItems()\n if (items.length === 0) return\n\n const active =\n container.getRootNode() instanceof ShadowRoot\n ? (container.getRootNode() as ShadowRoot).activeElement\n : document.activeElement\n if (!(active instanceof HTMLElement)) return\n\n const isEscape = escapeTarget && active === escapeTarget\n if (isEscape) {\n e.preventDefault()\n const idx = e.key === \"ArrowUp\" || e.key === \"End\" ? items.length - 1 : 0\n focusItem(items, idx)\n return\n }\n\n const idx = items.indexOf(active)\n if (idx === -1) {\n if (container.contains(active)) {\n e.preventDefault()\n const entry =\n e.key === \"ArrowUp\" || e.key === \"End\" ? items.length - 1 : 0\n focusItem(items, entry)\n }\n return\n }\n\n e.preventDefault()\n switch (e.key) {\n case \"ArrowUp\":\n if (idx === 0) {\n if (escapeTarget) escapeTarget.focus()\n else if (wrap) focusItem(items, items.length - 1)\n } else {\n focusItem(items, idx - 1)\n }\n break\n case \"ArrowDown\":\n if (idx === items.length - 1) {\n if (wrap) focusItem(items, 0)\n } else {\n focusItem(items, idx + 1)\n }\n break\n case \"Home\":\n focusItem(items, 0)\n break\n case \"End\":\n focusItem(items, items.length - 1)\n break\n }\n }\n\n container.addEventListener(\"keydown\", onKeyDown)\n const extraCleanups: Cleanup[] = []\n for (const src of options.extraSources ?? []) {\n src.addEventListener(\"keydown\", onKeyDown)\n extraCleanups.push(() => src.removeEventListener(\"keydown\", onKeyDown))\n }\n\n return () => {\n container.removeEventListener(\"keydown\", onKeyDown)\n for (const c of extraCleanups) c()\n }\n}\n\nfunction focusItem(items: HTMLElement[], idx: number): void {\n for (let i = 0; i < items.length; i++) {\n items[i].tabIndex = i === idx ? 0 : -1\n }\n items[idx].focus()\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 steps: \"Steps\",\n routes: \"Routes\",\n} as const\n\nexport const PALETTE_GROUPS = {\n commands: \"Commands\",\n currentPage: \"Current Page\",\n favorites: \"Favorites\",\n recents: \"Recents\",\n} as const\n","export const LIST_ITEM_CLASS =\n \"flex min-h-8 cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-base outline-none sm:min-h-7 sm:text-sm data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground\"\n\nexport const LIST_ITEM_STATE_CLASS =\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-64\"\n\nexport const LIST_ITEM_INTERACTIVE_CLASS =\n \"uidex-item-interactive [[data-kbd-nav]_&]:focus:bg-accent [[data-kbd-nav]_&]:focus:text-accent-foreground [[data-kbd-nav]_&]:focus-within:bg-accent [[data-kbd-nav]_&]: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 { html, nothing, type TemplateResult } from \"../../internal/lit\"\nimport { LIST_GROUP_LABEL_CLASS } from \"../../ui/list-item\"\n\nconst MUTED_CLASS = \"text-sm text-muted-foreground\"\nconst HEADING_CLASS = LIST_GROUP_LABEL_CLASS\n\nexport function mutedTextTpl(\n text: string,\n className?: ClassValue\n): TemplateResult {\n return html`<p class=${cn(MUTED_CLASS, className)}>${text}</p>`\n}\n\nexport function headingTpl(\n text: string | undefined,\n className?: ClassValue\n): TemplateResult {\n if (!text) return nothing as unknown as TemplateResult\n return html`<h3 class=${cn(HEADING_CLASS, className)}>${text}</h3>`\n}\n","import {\n ArchiveX,\n Camera,\n ChevronDown,\n Copy,\n Highlighter,\n Inbox,\n MessageCircleWarning,\n StickyNote,\n TicketPlus,\n View,\n createElement as createLucideElement,\n type IconNode,\n} from \"lucide\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport type {\n DetailAction,\n DetailActionIcon,\n DetailActionRunContext,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport {\n LIST_GROUP_LABEL_CLASS,\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\n\nconst ICON_MAP: Record<DetailActionIcon, IconNode> = {\n \"archive-x\": ArchiveX,\n copy: Copy,\n camera: Camera,\n inbox: Inbox,\n \"message-circle-warning\": MessageCircleWarning,\n \"chevron-down\": ChevronDown,\n highlighter: Highlighter,\n \"sticky-note\": StickyNote,\n \"ticket-plus\": TicketPlus,\n view: View,\n}\n\nfunction iconFor(icon: DetailActionIcon | undefined): IconNode | null {\n return icon ? ICON_MAP[icon] : null\n}\n\n// ── Actions (imperative) ─────────────────────────────────────────────\n// Action buttons need mutable label elements (setLabel + revert timer),\n// so they stay imperative.\n\nexport interface RenderedActions {\n node: HTMLElement\n buttons: readonly HTMLButtonElement[]\n cleanup: Cleanup\n}\n\nexport function 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 = el(\"button\", {\n class: cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer text-left font-normal\"\n ),\n attrs: {\n type: \"button\",\n \"data-slot\": \"list-item-button\",\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\n let leading: Node | undefined\n const iconNode = iconFor(action.icon)\n if (iconNode) {\n const svg = createLucideElement(iconNode)\n svg.setAttribute(\"aria-hidden\", \"true\")\n svg.setAttribute(\"class\", \"h-4 w-4 shrink-0\")\n const tile = el(\n \"span\",\n {\n class:\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground\",\n attrs: { \"data-slot\": \"icon-tile\", \"aria-hidden\": \"true\" },\n },\n [svg]\n )\n leading = tile\n }\n\n // Label span needs to be mutable for setLabel()\n const labelSpan = el(\"span\", {\n class: \"min-w-0 flex-1 truncate\",\n text: action.label,\n })\n if (leading) btn.append(leading)\n btn.append(labelSpan)\n if (action.hint) {\n const kbd = el(\"kbd\", {\n class:\n \"text-muted-foreground/70 ms-auto font-sans text-xs font-medium tracking-widest\",\n attrs: { \"data-slot\": \"command-shortcut\" },\n text: action.hint,\n })\n btn.append(kbd)\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 labelSpan.textContent = next\n if (durationMs && durationMs > 0) {\n revertTimer = setTimeout(() => {\n labelSpan.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.views.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","import {\n displayName,\n entityKey,\n type Entity,\n type EntityRef,\n} from \"../../../shared/entities\"\nimport { cn } from \"../../internal/cn\"\nimport { html, render, nothing, type TemplateResult } from \"../../internal/lit\"\nimport {\n html as staticHtml,\n literal,\n type StaticValue,\n} from \"lit-html/static.js\"\nimport { filterEntities, filterIds, normalizeQuery } from \"../builder/filter\"\nimport type {\n DetailSection,\n MetadataEntry,\n ResolvedFlowStep,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\nimport { badgeVariants } from \"../../ui/badge\"\nimport { entityLinkTpl } from \"../primitives/entity-link\"\nimport { kindIconTileTpl } from \"../primitives/kind-icon\"\nimport { rowTpl } from \"../primitives/row\"\nimport { headingTpl, mutedTextTpl } from \"../primitives/text\"\nimport {\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\n\n// ── Section templates ────────────────────────────────────────────────\n\nfunction entityListItems(\n ctx: ViewContext,\n entities: readonly Entity[]\n): TemplateResult {\n return html`${entities.map((entity) => {\n const eRef: EntityRef = { kind: entity.kind, id: entityKey(entity) }\n return html`<li>\n ${entityLinkTpl({\n ctx,\n target: eRef,\n label: displayName(entity),\n leading: kindIconTileTpl(entity.kind),\n })}\n </li>`\n })}`\n}\n\n// lit-html can't bind an attribute *name*, so the distinct\n// `data-uidex-detail-*` markers are spliced in as static values.\nconst DETAIL_SECTION_ATTRS = {\n composes: literal`data-uidex-detail-composes`,\n \"used-by\": literal`data-uidex-detail-used-by`,\n flows: literal`data-uidex-detail-flows`,\n touches: literal`data-uidex-detail-touches`,\n} satisfies Record<string, StaticValue>\n\ntype EntitySectionAttr = keyof typeof DETAIL_SECTION_ATTRS\n\n/**\n * Shared \"heading + <ul> of entityLink rows\" section used by composes,\n * used-by, flows, and touches. When `emptyText` is omitted an empty list\n * renders nothing (returns null); when provided it renders a muted\n * placeholder instead.\n */\nfunction entitySectionTpl(\n ctx: ViewContext,\n opts: {\n label: string\n entities: readonly Entity[]\n dataAttr: EntitySectionAttr\n emptyText?: string\n }\n): TemplateResult | null {\n const { label, entities, dataAttr, emptyText } = opts\n const attr = DETAIL_SECTION_ATTRS[dataAttr]\n if (entities.length === 0) {\n if (emptyText === undefined) return null\n return staticHtml`\n <section class=\"flex flex-col gap-2\" ${attr}>\n ${headingTpl(label)}\n ${mutedTextTpl(emptyText)}\n </section>\n `\n }\n return staticHtml`\n <section class=\"flex flex-col\" ${attr}>\n ${headingTpl(label)}\n <ul class=\"flex flex-col\">\n ${entityListItems(ctx, entities)}\n </ul>\n </section>\n `\n}\n\nfunction filterStepsBy<T>(\n items: readonly T[],\n query: string,\n fields: (item: T) => readonly (string | undefined)[]\n): readonly T[] {\n const q = normalizeQuery(query)\n if (!q) return items\n return items.filter((item) =>\n fields(item).some((field) => field?.toLowerCase().includes(q))\n )\n}\n\nconst resolvedStepFields = (step: ResolvedFlowStep) => [\n displayName(step.entity),\n entityKey(step.entity),\n step.entity.kind,\n step.action,\n]\n\nconst STEP_ROW_CLASS = \"flex items-center gap-2 px-2\"\n\nconst STEP_ORDINAL_CLASS =\n \"relative z-10 inline-flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground text-xs font-medium tabular-nums\"\n\nfunction stepsTpl(\n ctx: ViewContext,\n steps: readonly ResolvedFlowStep[],\n query: string\n): TemplateResult {\n if (steps.length === 0) {\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-steps>\n ${headingTpl(SECTION_LABELS.steps)}\n ${mutedTextTpl(query ? \"No matches\" : \"No steps recorded\")}\n </section>\n `\n }\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-steps>\n ${headingTpl(SECTION_LABELS.steps)}\n <ol class=\"flex flex-col gap-1.5\">\n ${steps.map(\n (step) => html`\n <li class=${STEP_ROW_CLASS} data-uidex-step=${String(step.ordinal)}>\n <span\n class=${STEP_ORDINAL_CLASS}\n data-uidex-step-ordinal\n aria-hidden=\"true\"\n >${String(step.ordinal)}</span\n >\n ${entityLinkTpl({\n ctx,\n target: { kind: step.entity.kind, id: entityKey(step.entity) },\n label: displayName(step.entity),\n leading: kindIconTileTpl(step.entity.kind),\n class: \"min-w-0 flex-1\",\n })}\n ${step.action\n ? html`<span\n class=${cn(\n badgeVariants({ variant: \"secondary\", size: \"sm\" }),\n \"font-mono\"\n )}\n data-slot=\"badge\"\n data-uidex-step-action=${step.action}\n >${step.action}</span\n >`\n : nothing}\n </li>\n `\n )}\n </ol>\n </section>\n `\n}\n\nfunction routePathsTpl(paths: readonly string[]): TemplateResult | null {\n if (paths.length === 0) return null\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-routes>\n ${headingTpl(SECTION_LABELS.routes)}\n <ul class=\"flex flex-col\">\n ${paths.map(\n (p) => html`\n <li\n class=${cn(LIST_ITEM_CLASS, LIST_ITEM_INTERACTIVE_CLASS)}\n data-uidex-detail-row=\"route\"\n tabindex=\"-1\"\n >\n ${rowTpl({\n leading: kindIconTileTpl(\"route\"),\n label: p,\n })}\n </li>\n `\n )}\n </ul>\n </section>\n `\n}\n\nfunction acceptanceChecklistTpl(items: readonly string[]): TemplateResult {\n return html`\n <section class=\"flex flex-col\" data-uidex-detail-acceptance>\n ${headingTpl(SECTION_LABELS.acceptance)}\n <ul class=\"flex flex-col\">\n ${items.map((text, idx) => {\n const id = `uidex-acceptance-${idx}`\n const syncChecked = (e: Event): void => {\n const checkbox = e.currentTarget as HTMLInputElement\n const label = checkbox\n .closest(\"label\")\n ?.querySelector(\n \"[data-uidex-acceptance-label]\"\n ) as HTMLElement | null\n if (label) {\n label.classList.toggle(\"line-through\", checkbox.checked)\n label.classList.toggle(\"text-muted-foreground\", checkbox.checked)\n }\n }\n const onKeydown = (e: KeyboardEvent): void => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n const checkbox = e.currentTarget as HTMLInputElement\n checkbox.checked = !checkbox.checked\n syncChecked(e)\n }\n }\n return html`\n <li>\n <label\n class=${cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer items-start\"\n )}\n for=${id}\n >\n <input\n type=\"checkbox\"\n id=${id}\n data-uidex-acceptance-item=${String(idx)}\n class=\"accent-accent mt-1 h-3.5 w-3.5 shrink-0 cursor-pointer focus:outline-none\"\n @change=${syncChecked}\n @keydown=${onKeydown}\n />\n <span\n class=\"min-w-0 flex-1 whitespace-normal break-words\"\n data-uidex-acceptance-label\n >${text}</span\n >\n </label>\n </li>\n `\n })}\n </ul>\n </section>\n `\n}\n\nfunction screenshotTpl(url: string): TemplateResult {\n return html`\n <section class=\"px-2\">\n ${headingTpl(\"Screenshot\")}\n <img\n src=${url}\n alt=\"Screenshot\"\n class=\"border-border mt-1 w-full rounded-md border\"\n />\n </section>\n `\n}\n\n/**\n * Lazily fetched screenshot (cloud pins travel without one). Hidden until\n * the fetch resolves with a data URL; a missing screenshot or a failed\n * fetch leaves no empty section behind.\n */\nfunction lazyScreenshotEl(load: () => Promise<string | null>): HTMLElement {\n const holder = document.createElement(\"div\")\n holder.hidden = true\n void load().then(\n (url) => {\n if (!url) return\n render(screenshotTpl(url), holder)\n holder.hidden = false\n },\n () => {\n // fetch failed — the detail view is still useful without the image\n }\n )\n return holder\n}\n\nfunction metadataListTpl(entries: readonly MetadataEntry[]): TemplateResult {\n return html`\n <div\n class=\"text-muted-foreground border-border mx-2 border-t pt-2 text-[11px] leading-relaxed\"\n >\n ${entries.map(\n (e) =>\n html`<div class=\"flex gap-1.5 truncate\">\n <span class=\"shrink-0\">${e.label}</span>\n <span class=\"truncate font-mono\">${e.value}</span>\n </div>`\n )}\n </div>\n `\n}\n\nexport function sectionTpl(\n section: DetailSection,\n ctx: ViewContext,\n query: string\n): TemplateResult | null {\n switch (section.id) {\n case \"description\": {\n if (!section.text) return null\n return html`<p\n class=${cn(\"text-foreground text-sm leading-relaxed\", \"px-2\")}\n data-uidex-detail-description\n >\n ${section.text}\n </p>`\n }\n case \"acceptance\": {\n if (section.items.length === 0) return null\n return acceptanceChecklistTpl(section.items)\n }\n case \"composes\":\n return entitySectionTpl(ctx, {\n label: section.label,\n entities: section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n dataAttr: \"composes\",\n })\n case \"used-by\":\n return entitySectionTpl(ctx, {\n label: section.label,\n entities: section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n dataAttr: \"used-by\",\n })\n case \"flows\":\n return entitySectionTpl(ctx, {\n label: SECTION_LABELS.flows,\n entities: section.filterable\n ? filterEntities(section.flows, query)\n : section.flows,\n dataAttr: \"flows\",\n })\n case \"touches\":\n return entitySectionTpl(ctx, {\n label: SECTION_LABELS.touches,\n entities: section.filterable\n ? filterEntities(section.entities, query)\n : section.entities,\n dataAttr: \"touches\",\n emptyText: query ? \"No matches\" : \"No entities touched\",\n })\n case \"steps\":\n return stepsTpl(\n ctx,\n section.filterable\n ? filterStepsBy(section.steps, query, resolvedStepFields)\n : section.steps,\n query\n )\n case \"routes\":\n return routePathsTpl(\n section.filterable ? filterIds(section.paths, query) : section.paths\n )\n case \"screenshot\":\n if (section.url) return screenshotTpl(section.url)\n if (section.load) return html`${lazyScreenshotEl(section.load)}`\n return null\n case \"metadata\":\n return section.entries.length > 0\n ? metadataListTpl(section.entries)\n : null\n }\n}\n","import { displayName, entityKey, type Entity } from \"../../../shared/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","import type { EntityRef, Registry } from \"../../../shared/entities\"\nimport { DOM_BACKED_KINDS } from \"../../surface/constants\"\nimport { resolveEntityElement } from \"../../surface/inspector\"\n\nconst TOUCH_RESOLVE_KINDS = [\n \"element\",\n \"widget\",\n \"region\",\n \"primitive\",\n] as const\n\nexport function isAbsentFromPage(ref: EntityRef, registry?: Registry): boolean {\n if (DOM_BACKED_KINDS.has(ref.kind)) {\n return !resolveEntityElement(ref)\n }\n if (ref.kind === \"flow\" && registry) {\n const flow = registry.get(\"flow\", ref.id)\n if (!flow) return true\n for (const touchId of flow.touches) {\n for (const kind of TOUCH_RESOLVE_KINDS) {\n const entity = registry.get(kind, touchId)\n if (entity && resolveEntityElement({ kind, id: touchId })) return false\n }\n }\n return true\n }\n return false\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../internal/cn\"\nimport { el, type Child, type ElementOptions } from \"../internal/el\"\nimport { html, type TemplateResult } from \"../internal/lit\"\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 COMMAND_SHORTCUT_CLASS =\n \"text-muted-foreground/70 ms-auto font-sans text-xs font-medium tracking-widest\"\n\n// ── Imperative (legacy) — returns HTMLElement ─────────────────────\n\nexport interface CreateKbdOptions extends Omit<ElementOptions, \"class\"> {\n class?: ClassValue\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nexport function kbdTpl(text: string, className?: ClassValue): TemplateResult {\n return html`<kbd class=${cn(KBD_CLASS, className)} data-slot=\"kbd\"\n >${text}</kbd\n >`\n}\n\nexport function commandShortcutTpl(\n text: string,\n className?: ClassValue\n): TemplateResult {\n return html`<kbd\n class=${cn(COMMAND_SHORTCUT_CLASS, className)}\n data-slot=\"command-shortcut\"\n >${text}</kbd\n >`\n}\n","import { el } from \"../../internal/el\"\nimport { html, nothing, type TemplateResult } from \"../../internal/lit\"\nimport { createCommandShortcut, commandShortcutTpl } 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\n/** Template-friendly row content — allows TemplateResult for slots. */\nexport interface RowTplContent {\n leading?: TemplateResult | null\n label: string\n subtitle?: string\n trailing?: TemplateResult | string | null\n}\n\nconst LABEL_CLASS = \"min-w-0 flex-1 truncate\"\nconst SUBTITLE_CLASS = \"truncate text-xs text-muted-foreground\"\n\n// ── Imperative (legacy) — mutates host element ────────────────────\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\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\n/**\n * Renders the row CONTENTS (leading / label / subtitle / trailing) without a\n * wrapping element, so the caller can place them inside any container.\n */\nexport function rowTpl(content: RowTplContent): TemplateResult {\n return html`\n ${content.leading ?? nothing}\n <span class=${LABEL_CLASS}>${content.label}</span>\n ${content.subtitle\n ? html`<span class=${SUBTITLE_CLASS} data-uidex-row-subtitle\n >${content.subtitle}</span\n >`\n : nothing}\n ${content.trailing != null\n ? typeof content.trailing === \"string\"\n ? commandShortcutTpl(content.trailing)\n : content.trailing\n : nothing}\n `\n}\n","import type { ClassValue } from \"clsx\"\nimport { cn } from \"../../internal/cn\"\nimport { KIND_STYLE, type EntityRef } from \"../../../shared/entities\"\nimport { html, type TemplateResult } from \"../../internal/lit\"\nimport {\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n} from \"../../ui/list-item\"\nimport type { ViewContext } from \"../core/types\"\nimport { isAbsentFromPage } from \"./entity-presence\"\nimport { rowTpl } from \"./row\"\n\nexport interface EntityLinkTplOptions {\n ctx: ViewContext\n target: EntityRef\n label?: string\n leading?: TemplateResult | null\n class?: ClassValue\n}\n\n// ── Declarative (lit-html) — returns TemplateResult ───────────────\n\nconst ACTION_CLASS = cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_INTERACTIVE_CLASS,\n \"w-full cursor-pointer text-left font-normal\"\n)\n\n/**\n * Lit-html template for an entity link button. Event handlers use lit-html's\n * `@event` syntax so cleanup is handled automatically on disconnection.\n */\nexport function entityLinkTpl(options: EntityLinkTplOptions): TemplateResult {\n const { ctx, target, label, leading, class: extraClass } = options\n const absent = isAbsentFromPage(target)\n const resolvedLabel = label ?? `${target.kind}: ${target.id}`\n\n const onClick = () => ctx.views.navigate(target)\n const preview = () => {\n ctx.highlight.show(target, { color: KIND_STYLE[target.kind].color })\n }\n const restoreParent = () => {\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\n return html`\n <button\n type=\"button\"\n class=${cn(ACTION_CLASS, \"w-full\", absent && \"opacity-50\", extraClass)}\n data-slot=\"list-item-button\"\n data-uidex-entity-link\n data-uidex-ref-kind=${target.kind}\n data-uidex-ref-id=${target.id}\n title=${absent ? \"Not on this page\" : \"\"}\n @click=${onClick}\n @mouseenter=${preview}\n @mouseleave=${restoreParent}\n @focus=${preview}\n @blur=${restoreParent}\n >\n ${rowTpl({\n leading,\n label: resolvedLabel,\n })}\n </button>\n `\n}\n","import { type EntityRef } from \"../../../shared/entities\"\nimport { bindArrowNav } from \"../../internal/arrow-nav\"\nimport { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { el } from \"../../internal/el\"\nimport {\n html,\n render,\n nothing,\n createRef,\n ref,\n type TemplateResult,\n} from \"../../internal/lit\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n} from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\nimport { badgeTpl } from \"../../ui/badge\"\nimport { kindBadgeTpl } from \"../primitives/kind-icon\"\nimport { mutedTextTpl } from \"../primitives/text\"\nimport type { MountedSurface, SubmitIntent, SubmitIntentSource } from \"./index\"\nimport { renderActions } from \"./detail-actions\"\nimport { sectionTpl } from \"./detail-sections\"\n\nfunction subtitleTpl(subtitle: DetailSubtitle): TemplateResult {\n const text = subtitle.extra\n ? `${subtitle.rawId} · ${subtitle.extra}`\n : subtitle.rawId\n return html`<p\n class=${cn(\"text-muted-foreground font-mono text-xs\", \"px-2\")}\n data-uidex-detail-subtitle\n >\n ${text}\n </p>`\n}\n\nfunction notFoundTpl(ref: EntityRef): TemplateResult {\n return html`<p\n class=${cn(\"text-muted-foreground text-sm\", \"p-4\")}\n data-uidex-detail-missing\n >\n ${ref.kind}: ${ref.id} not found in registry\n </p>`\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 render(notFoundTpl(surface.notFound), root)\n return { cleanup: () => root.replaceChildren() }\n }\n\n const bodyRef = createRef<HTMLDivElement>()\n const sectionsRef = createRef<HTMLDivElement>()\n\n const cleanups: Cleanup[] = []\n\n // ── Build actions (imperative — mutable labels) ──────────────────\n let actionsNode: HTMLElement | null = null\n if (surface.actions && surface.actions.length > 0) {\n const groups = new Map<string, DetailAction[]>()\n for (const action of surface.actions) {\n const key = action.group ?? \"\"\n const list = groups.get(key) ?? []\n list.push(action)\n groups.set(key, list)\n }\n\n if (groups.size <= 1) {\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 } else {\n const wrapper = el(\"div\", {\n class: \"flex flex-col gap-1\",\n attrs: { \"data-uidex-detail-action-groups\": \"\" },\n })\n for (const [heading, groupActions] of groups) {\n const rendered = renderActions(\n groupActions,\n ctx,\n root,\n heading || SECTION_LABELS.actions\n )\n cleanups.push(rendered.cleanup)\n wrapper.append(rendered.node)\n }\n actionsNode = wrapper\n }\n }\n\n const sections = surface.sections ?? []\n const filterable = hasFilterableSections(sections)\n\n // ── Render body template ──────────────────────────────────────────\n render(\n html`\n <div\n ${ref(bodyRef)}\n class=\"flex flex-col gap-3 px-2 py-4\"\n data-uidex-detail-body\n data-uidex-detail-kind=${surface.entityKind}\n >\n <div class=\"flex items-center gap-2 px-2\">\n ${surface.title\n ? html`<h2\n class=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\"\n data-uidex-detail-title\n >\n ${surface.title}\n </h2>`\n : nothing}\n <span class=\"ml-auto flex items-center gap-1\">\n ${surface.unregistered\n ? badgeTpl(\"Unregistered\", { variant: \"warning\", size: \"sm\" })\n : nothing}\n ${kindBadgeTpl(surface.entityKind)}\n </span>\n </div>\n ${surface.subtitle ? subtitleTpl(surface.subtitle) : nothing}\n <div\n ${ref(sectionsRef)}\n class=\"flex flex-col gap-3\"\n data-uidex-detail-sections\n ></div>\n </div>\n `,\n root\n )\n\n const body = bodyRef.value!\n const listsContainer = sectionsRef.value!\n\n // ── Focus management ──────────────────────────────────────────────\n let focusables: HTMLElement[] = []\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 enterKbdMode = (): void => body.setAttribute(\"data-kbd-nav\", \"\")\n const exitKbdMode = (): void => body.removeAttribute(\"data-kbd-nav\")\n body.addEventListener(\"pointermove\", exitKbdMode)\n\n const detachArrowNav = bindArrowNav({\n container: body,\n getItems: () => focusables,\n escapeTarget: ctx.searchInput,\n extraSources: [ctx.searchInput],\n onEnterKbd: enterKbdMode,\n })\n\n // ── Render sections into the ref'd container ──────────────────────\n\n function renderSections(query: string): void {\n let hasFilterableSection = false\n let renderedFilterable = 0\n let actionsPlaced = false\n\n const parts: Array<TemplateResult | HTMLElement> = []\n const placeActions = (): void => {\n if (actionsNode && !actionsPlaced) {\n parts.push(actionsNode)\n actionsPlaced = true\n }\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 = sectionTpl(section, ctx, sectionQuery)\n if (!out) continue\n if (isFilterable) renderedFilterable++\n parts.push(out)\n if (section.id === \"description\") placeActions()\n }\n if (!actionsPlaced && actionsNode) {\n parts.unshift(actionsNode)\n }\n if (query && hasFilterableSection && renderedFilterable === 0) {\n parts.push(mutedTextTpl(\"No matches\"))\n }\n render(html`${parts}`, listsContainer)\n refreshFocusSequence()\n }\n\n renderSections(\"\")\n\n const cleanup = composeCleanups([\n ...cleanups,\n detachArrowNav,\n () => body.removeEventListener(\"pointermove\", exitKbdMode),\n () => root.replaceChildren(),\n ])\n\n const actionLabelById = new Map<string, string>()\n if (surface.actions) {\n for (const action of surface.actions) {\n if (\"copy\" in action) actionLabelById.set(action.id, \"Copy\")\n else if (\"push\" in action) actionLabelById.set(action.id, \"Open\")\n else if (\"navigate\" in action) actionLabelById.set(action.id, \"Open\")\n else if (\"highlight\" in action)\n actionLabelById.set(action.id, \"Highlight\")\n else if (\"scrollTo\" in action) actionLabelById.set(action.id, \"Go to\")\n else actionLabelById.set(action.id, \"Run\")\n }\n }\n\n const getActiveInBody = (): HTMLElement | null => {\n const rootNode = body.getRootNode()\n const active =\n rootNode instanceof ShadowRoot\n ? rootNode.activeElement\n : document.activeElement\n if (active instanceof HTMLElement && body.contains(active)) return active\n return null\n }\n\n let cachedIntent: SubmitIntent | null = null\n\n const resolveIntent = (): SubmitIntent | null => {\n const active = getActiveInBody()\n if (!active) return null\n if (active instanceof HTMLInputElement && active.type === \"checkbox\") {\n return {\n label: active.checked ? \"Uncheck\" : \"Check\",\n perform: () => active.click(),\n }\n }\n const actionId = active.getAttribute(\"data-uidex-detail-action\")\n if (actionId) {\n return {\n label: actionLabelById.get(actionId) ?? \"Run\",\n perform: () => active.click(),\n }\n }\n if (active.hasAttribute(\"data-uidex-entity-link\")) {\n return { label: \"Open\", perform: () => active.click() }\n }\n return { label: \"Open\", perform: () => active.click() }\n }\n\n const submitIntent: SubmitIntentSource = {\n get: () => cachedIntent,\n subscribe(cb) {\n const update = () => {\n cachedIntent = resolveIntent()\n cb()\n }\n body.addEventListener(\"focusin\", update)\n body.addEventListener(\"change\", update)\n ctx.searchInput.addEventListener(\"focus\", update)\n update()\n return () => {\n body.removeEventListener(\"focusin\", update)\n body.removeEventListener(\"change\", update)\n ctx.searchInput.removeEventListener(\"focus\", update)\n }\n },\n }\n\n const mounted: MountedSurface = { cleanup, submitIntent }\n if (filterable) {\n mounted.onSearch = renderSections\n }\n return mounted\n}\n","import { KIND_STYLE } from \"../../../shared/entities\"\nimport { createScrollArea } from \"../../machines/scroll-area\"\nimport { composeCleanups } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport {\n html,\n render,\n nothing,\n createRef,\n ref,\n type TemplateResult,\n} from \"../../internal/lit\"\nimport { icon } from \"../../internal/lit-icon\"\nimport { matchesQuery } from \"../builder/filter\"\nimport { createPersistentSpreads } from \"../builder/spread-props\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { ShellAction, ViewContext } from \"../core/types\"\nimport { Circle } from \"lucide\"\nimport { isAbsentFromPage } from \"../primitives/entity-presence\"\nimport { iconTileTpl } from \"../primitives/icon-tile\"\nimport { kindIconTileTpl } from \"../primitives/kind-icon\"\nimport { rowTpl } from \"../primitives/row\"\nimport { mutedTextTpl } from \"../primitives/text\"\nimport {\n LIST_GROUP_LABEL_CLASS,\n LIST_ITEM_CLASS,\n LIST_ITEM_STATE_CLASS,\n} from \"../../ui/list-item\"\nimport { createListController, type ListController } from \"./list-controller\"\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\nfunction resolveLeadingTpl(item: ListItem): TemplateResult {\n if (item.entityChip) return kindIconTileTpl(item.entityChip.entity.kind)\n if (item.leading) {\n const node = item.leading()\n if (node instanceof SVGElement) {\n const existing = node.getAttribute(\"class\") ?? \"\"\n const stripped = existing\n .replace(/\\b(h-\\d+|w-\\d+|size-\\d+)\\b/g, \"\")\n .trim()\n node.setAttribute(\"class\", cn(stripped, \"size-3.5 opacity-80\"))\n }\n return html`<span\n class=\"bg-muted text-muted-foreground inline-flex size-6 shrink-0 items-center justify-center rounded-md\"\n data-slot=\"icon-tile\"\n aria-hidden=\"true\"\n >${node}</span\n >`\n }\n return iconTileTpl(icon(Circle, \"size-3.5 opacity-80\"))\n}\n\ninterface ListShell {\n section: HTMLElement\n scrollRoot: HTMLDivElement\n viewport: HTMLDivElement\n content: HTMLDivElement\n}\n\nfunction renderShell(surface: ListSurface, root: HTMLElement): ListShell {\n const scrollRootRef = createRef<HTMLDivElement>()\n const viewportRef = createRef<HTMLDivElement>()\n const contentRef = createRef<HTMLDivElement>()\n const sectionRef = createRef<HTMLElement>()\n\n render(\n html`\n <section\n ${ref(sectionRef)}\n class=\"flex h-full flex-col overflow-hidden\"\n data-uidex-list-surface=${surface.id}\n >\n <div\n ${ref(scrollRootRef)}\n class=\"min-h-0 flex-1\"\n data-uidex-list-scroll-root\n >\n <div ${ref(viewportRef)} class=\"uidex-scrollbar h-full w-full\">\n <div\n ${ref(contentRef)}\n class=\"scroll-py-2 p-2\"\n data-uidex-list-content\n ></div>\n </div>\n </div>\n </section>\n `,\n root\n )\n\n return {\n section: sectionRef.value!,\n scrollRoot: scrollRootRef.value!,\n viewport: viewportRef.value!,\n content: contentRef.value!,\n }\n}\n\ninterface ItemMaps {\n itemNodes: Map<string, HTMLElement>\n itemForValue: Map<string, ListItem>\n groupNodes: Map<string, HTMLElement>\n}\n\nfunction buildItemsDom(\n surface: ListSurface,\n ctx: ViewContext,\n filteredItems: readonly ListItem[],\n allByValue: Map<string, ListItem>,\n content: HTMLElement\n): ItemMaps {\n const itemNodes = new Map<string, HTMLElement>()\n const itemForValue = new Map<string, ListItem>()\n const groupNodes = new Map<string, HTMLElement>()\n content.replaceChildren()\n\n if (filteredItems.length === 0) {\n const frag = document.createDocumentFragment()\n render(\n mutedTextTpl(surface.emptyLabel ?? \"No matches\", \"p-4 text-center\"),\n frag\n )\n content.append(frag)\n return { itemNodes, itemForValue, groupNodes }\n }\n\n const byGroup = new Map<string, ListItem[]>()\n for (const item of filteredItems) {\n const key = item.group ?? \"\"\n const bucket = byGroup.get(key) ?? []\n bucket.push(item)\n byGroup.set(key, bucket)\n }\n\n const frag = document.createDocumentFragment()\n render(\n html`\n <ul class=\"flex flex-col gap-1\" data-uidex-list-groups>\n ${Array.from(byGroup.entries()).map(\n ([group, items]) => html`\n <li\n class=\"flex flex-col gap-1 py-1\"\n data-uidex-list-group\n data-uidex-list-group-name=${group}\n >\n ${group\n ? html`<h3 class=${LIST_GROUP_LABEL_CLASS}>${group}</h3>`\n : nothing}\n <ul\n class=\"flex flex-col\"\n data-uidex-group-list=${group || \"ungrouped\"}\n >\n ${items.map((item) => {\n const absent = item.preview\n ? isAbsentFromPage(item.preview, ctx.registry)\n : false\n return html`\n <li\n class=${cn(\n LIST_ITEM_CLASS,\n LIST_ITEM_STATE_CLASS,\n absent && \"opacity-50\"\n )}\n data-uidex-list-item=${rowTag(item)}\n title=${absent ? \"Not on this page\" : \"\"}\n data-uidex-item-value=${item.value}\n >\n ${rowTpl({\n leading: resolveLeadingTpl(item),\n label: item.label,\n subtitle: item.subtitle,\n trailing: item.trailing ?? item.shortcut,\n })}\n </li>\n `\n })}\n </ul>\n </li>\n `\n )}\n </ul>\n `,\n frag\n )\n\n content.append(frag)\n\n for (const el of content.querySelectorAll<HTMLElement>(\n \"[data-uidex-group-list]\"\n )) {\n const id = el.getAttribute(\"data-uidex-group-list\") ?? \"ungrouped\"\n groupNodes.set(id, el)\n }\n for (const el of content.querySelectorAll<HTMLElement>(\n \"[data-uidex-item-value]\"\n )) {\n const value = el.getAttribute(\"data-uidex-item-value\")!\n itemNodes.set(value, el)\n const item = allByValue.get(value)\n if (item) itemForValue.set(value, item)\n }\n\n return { itemNodes, itemForValue, groupNodes }\n}\n\n// ── Public entry point ──────────────────────────────────────────────\n\nexport function renderListSurface(\n surface: ListSurface,\n ctx: ViewContext,\n root: HTMLElement\n): MountedSurface {\n const all = surface.items\n const searchable = surface.searchable !== false\n const filterFn = searchable ? (surface.filter ?? defaultFilter) : undefined\n let filteredItems: readonly ListItem[] = all\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 hasDefault =\n surface.defaultHighlight !== undefined &&\n allByValue.has(surface.defaultHighlight)\n\n const { scrollRoot, viewport, content } = renderShell(surface, root)\n\n let maps = buildItemsDom(surface, ctx, filteredItems, allByValue, content)\n\n const controller: ListController = createListController({\n surfaceId: surface.id,\n contentEl: content,\n items: filteredItems,\n itemNodes: maps.itemNodes,\n defaultHighlight: hasDefault ? surface.defaultHighlight : undefined,\n onSelect: (value) => {\n const item = allByValue.get(value)\n if (item && surface.onSelect) surface.onSelect(item)\n },\n onHighlightChange: (value) => {\n const item = value ? allByValue.get(value) : 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 searchInput: searchable ? ctx.searchInput : undefined,\n })\n\n // ── Scroll area ──────────────────────────────────────────────────\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 // ── Focus the content element for non-searchable lists ───────────\n if (!searchable) {\n requestAnimationFrame(() => content.focus({ preventScroll: true }))\n }\n\n // ── Track visibility so stacked controllers don't fight ──────────\n const visibilityObserver = new MutationObserver(() => {\n controller.setActive(!root.hidden)\n })\n visibilityObserver.observe(root, {\n attributes: true,\n attributeFilter: [\"hidden\"],\n })\n\n // ── Cleanup ──────────────────────────────────────────────────────\n const cleanup = composeCleanups([\n () => controller.destroy(),\n () => ctx.highlight.hide(),\n () => visibilityObserver.disconnect(),\n unsubScroll,\n () => scrollSpreads.cleanupAll(),\n scrollArea.destroy,\n () => {\n maps.itemNodes.clear()\n maps.itemForValue.clear()\n maps.groupNodes.clear()\n root.replaceChildren()\n },\n ])\n\n // ── Search ───────────────────────────────────────────────────────\n let lastItemKey = filteredItems.map((i) => i.value).join(\"\\x00\")\n\n const onSearch = filterFn\n ? (query: string): void => {\n const next = all.filter((item) => filterFn(item, query))\n const nextKey = next.map((i) => i.value).join(\"\\x00\")\n if (nextKey === lastItemKey) return\n lastItemKey = nextKey\n maps = buildItemsDom(surface, ctx, next, allByValue, content)\n filteredItems = next\n controller.setItems(filteredItems, maps.itemNodes)\n }\n : undefined\n\n // ── Submit intent + highlight actions ────────────────────────────\n const submitIntent = {\n get() {\n const value = controller.getHighlightedValue()\n if (!value) return null\n const item = allByValue.get(value)\n if (!item || !surface.onSelect) return null\n return { label: \"Select\", perform: () => surface.onSelect!(item) }\n },\n subscribe(cb: () => void) {\n return controller.subscribe(cb)\n },\n }\n\n const highlightActions = {\n get(): readonly ShellAction[] {\n const value = controller.getHighlightedValue()\n if (!value) return []\n return allByValue.get(value)?.actions ?? []\n },\n subscribe(cb: () => void) {\n return controller.subscribe(cb)\n },\n }\n\n return { cleanup, onSearch, submitIntent, highlightActions }\n}\n","import type { Cleanup } from \"../../internal/cleanup\"\n\nexport interface ListControllerOptions {\n surfaceId: string\n contentEl: HTMLElement\n items: readonly { value: string }[]\n itemNodes: Map<string, HTMLElement>\n defaultHighlight?: string\n onSelect: (value: string) => void\n onHighlightChange?: (value: string | null) => void\n searchInput?: HTMLInputElement\n}\n\nexport interface ListController {\n getHighlightedValue(): string | null\n highlightValue(value: string | null): void\n setActive(active: boolean): void\n setItems(\n items: readonly { value: string }[],\n itemNodes: Map<string, HTMLElement>\n ): void\n subscribe(cb: () => void): Cleanup\n destroy(): void\n}\n\nexport function createListController(\n opts: ListControllerOptions\n): ListController {\n let items = opts.items\n let itemNodes = opts.itemNodes\n let highlighted: string | null = null\n let kbdMode = false\n const subs = new Set<() => void>()\n\n const { contentEl, onSelect, onHighlightChange } = opts\n\n contentEl.setAttribute(\"role\", \"listbox\")\n contentEl.tabIndex = 0\n contentEl.style.outline = \"none\"\n applyItemAria()\n\n if (opts.defaultHighlight && itemNodes.has(opts.defaultHighlight)) {\n setHighlight(opts.defaultHighlight, false)\n }\n\n function values(): string[] {\n return items.map((i) => i.value)\n }\n\n function notify(): void {\n for (const cb of subs) cb()\n }\n\n function applyItemAria(): void {\n for (const [value, el] of itemNodes) {\n el.setAttribute(\"role\", \"option\")\n el.id = `${opts.surfaceId}-item-${value}`\n }\n }\n\n function setHighlight(value: string | null, scroll = true): void {\n if (value === highlighted) return\n if (highlighted) {\n const prev = itemNodes.get(highlighted)\n if (prev) {\n prev.removeAttribute(\"data-highlighted\")\n prev.removeAttribute(\"data-kbd-highlighted\")\n prev.removeAttribute(\"aria-selected\")\n }\n }\n highlighted = value\n if (value) {\n const el = itemNodes.get(value)\n if (el) {\n el.setAttribute(\"data-highlighted\", \"\")\n el.setAttribute(\"aria-selected\", \"true\")\n if (kbdMode) el.setAttribute(\"data-kbd-highlighted\", \"\")\n contentEl.setAttribute(\"aria-activedescendant\", el.id)\n if (scroll) el.scrollIntoView({ block: \"nearest\" })\n }\n } else {\n contentEl.removeAttribute(\"aria-activedescendant\")\n }\n onHighlightChange?.(value)\n notify()\n }\n\n function enterKbd(): void {\n if (kbdMode) return\n kbdMode = true\n contentEl.setAttribute(\"data-kbd-nav\", \"\")\n }\n\n function exitKbd(): void {\n if (!kbdMode) return\n kbdMode = false\n contentEl.removeAttribute(\"data-kbd-nav\")\n if (highlighted) {\n itemNodes.get(highlighted)?.removeAttribute(\"data-kbd-highlighted\")\n }\n }\n\n function move(delta: number): void {\n const vals = values()\n if (vals.length === 0) return\n enterKbd()\n if (highlighted === null) {\n setHighlight(delta > 0 ? vals[0] : vals[vals.length - 1])\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n return\n }\n const idx = vals.indexOf(highlighted)\n const next = (idx + delta + vals.length) % vals.length\n setHighlight(vals[next])\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n }\n\n let active = true\n\n function handleKeydown(e: KeyboardEvent): void {\n if (!active) return\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault()\n move(1)\n break\n case \"ArrowUp\":\n e.preventDefault()\n move(-1)\n break\n case \"Home\": {\n e.preventDefault()\n enterKbd()\n const first = values()[0]\n if (first != null) {\n setHighlight(first)\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n }\n break\n }\n case \"End\": {\n e.preventDefault()\n enterKbd()\n const vals = values()\n const last = vals[vals.length - 1]\n if (last != null) {\n setHighlight(last)\n if (highlighted)\n itemNodes.get(highlighted)?.setAttribute(\"data-kbd-highlighted\", \"\")\n }\n break\n }\n case \"Enter\":\n if (highlighted) {\n e.preventDefault()\n onSelect(highlighted)\n }\n break\n }\n }\n\n function handlePointermove(e: PointerEvent): void {\n const target = (e.target as HTMLElement).closest?.(\n \"[data-uidex-item-value]\"\n )\n if (!target) return\n const value = target.getAttribute(\"data-uidex-item-value\")\n if (!value || value === highlighted) return\n exitKbd()\n setHighlight(value, false)\n }\n\n function handleClick(e: MouseEvent): void {\n const target = (e.target as HTMLElement).closest?.(\n \"[data-uidex-item-value]\"\n )\n if (!target) return\n const value = target.getAttribute(\"data-uidex-item-value\")\n if (!value) return\n onSelect(value)\n }\n\n contentEl.addEventListener(\"keydown\", handleKeydown)\n contentEl.addEventListener(\"pointermove\", handlePointermove)\n contentEl.addEventListener(\"click\", handleClick)\n opts.searchInput?.addEventListener(\"keydown\", handleKeydown)\n\n return {\n getHighlightedValue: () => highlighted,\n highlightValue: (v) => setHighlight(v),\n setActive(v) {\n active = v\n },\n setItems(nextItems, nextNodes) {\n items = nextItems\n itemNodes = nextNodes\n applyItemAria()\n if (nextItems.length > 0) {\n setHighlight(nextItems[0].value)\n } else {\n setHighlight(null)\n }\n },\n subscribe(cb) {\n subs.add(cb)\n return () => subs.delete(cb)\n },\n destroy() {\n contentEl.removeEventListener(\"keydown\", handleKeydown)\n contentEl.removeEventListener(\"pointermove\", handlePointermove)\n contentEl.removeEventListener(\"click\", handleClick)\n opts.searchInput?.removeEventListener(\"keydown\", handleKeydown)\n subs.clear()\n },\n }\n}\n","import type { Cleanup, ShellAction, ViewContext } from \"../core/types\"\nimport type { ViewSurface } from \"../core/surface\"\nimport { renderDetailSurface } from \"./detail\"\nimport { renderListSurface } from \"./list\"\n\nexport interface SubmitIntent {\n label: string\n disabled?: boolean\n perform: () => void\n}\n\nexport interface SubmitIntentSource {\n get(): SubmitIntent | null\n subscribe(cb: () => void): Cleanup\n}\n\nexport interface HighlightActionsSource {\n get(): readonly ShellAction[]\n subscribe(cb: () => void): Cleanup\n}\n\nexport interface MountedSurface {\n cleanup: Cleanup\n onSearch?: (query: string) => void\n submitIntent?: SubmitIntentSource\n highlightActions?: HighlightActionsSource\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 }\n}\n","import type { EntityRef, Registry } from \"../../../shared/entities\"\nimport type { Cleanup } from \"../../internal/cleanup\"\nimport { html, render, createRef, ref } from \"../../internal/lit\"\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 { Router } from \"./router\"\nimport type { HighlightController, View, ViewContext } 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: Router\n session: SessionStore\n registry: Registry\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 scrollRootRef = createRef<HTMLDivElement>()\n const hostRef = createRef<HTMLDivElement>()\n\n // Render scroll-root + host into the container\n const fragment = document.createDocumentFragment()\n render(\n html`\n <div\n ${ref(scrollRootRef)}\n data-uidex-view-scroll-root\n class=${SCROLL_ROOT_CLASS}\n >\n <div\n ${ref(hostRef)}\n data-uidex-view-slot\n data-uidex-view-id=${view.id}\n class=${HOST_CLASS}\n ></div>\n </div>\n `,\n fragment\n )\n\n const scrollRoot = scrollRootRef.value!\n const host = hostRef.value!\n deps.container.appendChild(fragment)\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 views: deps.views,\n push: (target) => {\n if (!deps.views.get(target.id)) return\n deps.session.mode.transition.pushView({\n id: target.id,\n ref: target.ref ?? null,\n })\n },\n pop: () => deps.session.mode.transition.popOrTransition(),\n close: () => deps.session.mode.transition.dismiss(),\n pinHighlight: (r: EntityRef) => deps.session.highlight.pin(r),\n searchInput: deps.searchInput,\n highlight: deps.highlight,\n getStack: () => deps.session.getState().stack,\n }\n\n let surfaceResult: MountedSurface\n try {\n if (view.render) {\n const result = view.render(ctx, host)\n const cleanup = typeof result === \"function\" ? result : () => {}\n surfaceResult = {\n cleanup: () => {\n try {\n cleanup()\n } finally {\n host.replaceChildren()\n }\n },\n }\n } else {\n // validate() guarantees `surface` exists when `render` is absent.\n const surface = view.surface!(ctx)\n surfaceResult = renderSurface(surface, ctx, host)\n }\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 } from \"lucide\"\nimport { Z_CHROME } from \"../../surface/constants\"\nimport type { PaletteShortcut } from \"../../surface/keys\"\nimport { html, render, svg, createRef, ref } from \"../../internal/lit\"\nimport { icon } from \"../../internal/lit-icon\"\nimport { createActionsPopup, type ActionsPopupHandle } from \"./actions-popup\"\nimport { kbdTpl } 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-3 py-1.5 text-xs\"\n\nconst FOOTER_SIDE_CLASS = \"flex min-w-0 items-center\"\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 shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-2.5 py-1.5 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 disabled:pointer-events-none disabled:opacity-50\"\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 _opts?: { shortcut?: PaletteShortcut }\n): StackShell {\n const backdropRef = createRef<HTMLDivElement>()\n const viewportRef = createRef<HTMLDivElement>()\n const frameRef = createRef<HTMLDivElement>()\n const headerRef = createRef<HTMLElement>()\n const backBtnRef = createRef<HTMLButtonElement>()\n const searchIconRef = createRef<HTMLSpanElement>()\n const searchInputRef = createRef<HTMLInputElement>()\n const headerTitleRef = createRef<HTMLDivElement>()\n const hostContainerRef = createRef<HTMLDivElement>()\n const footerLeftRef = createRef<HTMLDivElement>()\n const footerRightRef = createRef<HTMLDivElement>()\n const actionsPopupSlotRef = createRef<HTMLDivElement>()\n\n const actionsPopup = createActionsPopup({\n onOpenChange: (open) => {\n if (hostContainerRef.value)\n hostContainerRef.value.style.pointerEvents = open ? \"none\" : \"\"\n if (!open)\n requestAnimationFrame(() =>\n searchInputRef.value?.focus({ preventScroll: true })\n )\n },\n })\n\n const logo = createUidexLogo()\n logo.setAttribute(\"data-uidex-view-stack-footer-logo\", \"\")\n\n const onBackClick = () => callbacks.onBack()\n const onSearchInput = () => {\n if (searchInputRef.value)\n callbacks.onSearchInput(searchInputRef.value.value)\n }\n const onViewportClick = (e: MouseEvent) => {\n if (e.target === viewportRef.value) callbacks.onBackdropClick()\n }\n\n render(\n html`\n <div\n ${ref(backdropRef)}\n data-uidex-view-backdrop\n class=${BACKDROP_CLASS}\n style=\"z-index: ${Z_CHROME}\"\n ></div>\n <div\n ${ref(viewportRef)}\n data-uidex-view-viewport\n class=${VIEWPORT_CLASS}\n style=\"z-index: ${Z_CHROME}\"\n @click=${onViewportClick}\n >\n <div ${ref(frameRef)} data-uidex-view-stack-frame class=${FRAME_CLASS}>\n <header\n ${ref(headerRef)}\n data-uidex-view-stack-header\n class=${HEADER_CLASS}\n >\n <div data-uidex-view-stack-search class=${SEARCH_WRAPPER_CLASS}>\n <button\n ${ref(backBtnRef)}\n type=\"button\"\n data-uidex-view-stack-back\n aria-label=\"Back\"\n class=${BACK_BUTTON_CLASS}\n hidden\n @click=${onBackClick}\n >\n ${icon(ArrowLeft, BACK_ICON_CLASS)}\n </button>\n <span\n ${ref(searchIconRef)}\n data-uidex-view-stack-search-icon\n aria-hidden=\"true\"\n class=${SEARCH_ICON_WRAP_CLASS}\n >${icon(Search, SEARCH_ICON_CLASS)}</span\n >\n <input\n ${ref(searchInputRef)}\n type=\"text\"\n data-uidex-search-input\n placeholder=\"Search for command...\"\n class=${SEARCH_INPUT_CLASS}\n @input=${onSearchInput}\n />\n <div\n ${ref(headerTitleRef)}\n data-uidex-view-stack-title\n class=${HEADER_TITLE_CLASS}\n hidden\n ></div>\n </div>\n </header>\n <div\n ${ref(hostContainerRef)}\n data-uidex-view-stack-hosts\n class=${HOST_CONTAINER_CLASS}\n ></div>\n <footer data-uidex-view-stack-footer class=${FOOTER_CLASS}>\n <div\n ${ref(footerLeftRef)}\n data-uidex-view-stack-footer-left\n class=${FOOTER_SIDE_CLASS}\n ></div>\n <div\n ${ref(footerRightRef)}\n data-uidex-view-stack-footer-right\n class=${FOOTER_SIDE_CLASS}\n ></div>\n </footer>\n <div ${ref(actionsPopupSlotRef)}></div>\n </div>\n </div>\n `,\n container\n )\n\n // Append the actions popup element into its slot\n actionsPopupSlotRef.value!.replaceWith(actionsPopup.element)\n\n const backdrop = backdropRef.value!\n const frame = frameRef.value!\n const header = headerRef.value! as HTMLElement\n const backBtn = backBtnRef.value!\n const searchIcon = searchIconRef.value!\n const searchInput = searchInputRef.value!\n const headerTitle = headerTitleRef.value!\n const hostContainer = hostContainerRef.value!\n const footerLeft = footerLeftRef.value!\n const footerRight = footerRightRef.value!\n const viewport = viewportRef.value!\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 actionsPopup.destroy()\n viewport.remove()\n backdrop.remove()\n },\n }\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 render(\n html`\n <svg\n viewBox=\"0 0 30 36\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n class=${LOGO_ICON_CLASS}\n >\n ${svg`\n <rect x=\"1\" y=\"5\" width=\"22\" height=\"28\" rx=\"3\"\n fill=\"currentColor\" opacity=\"0.18\"\n transform=\"rotate(-6, 12, 19)\" />\n <rect x=\"7\" y=\"1\" width=\"22\" height=\"28\" rx=\"3\"\n fill=\"currentColor\" />\n `}\n </svg>\n `,\n wrap\n )\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 render(html`<span>${label}</span>${kbdTpl(key)}`, wrap)\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 interface FooterHintButton {\n element: HTMLButtonElement\n setLabel(label: string): void\n setDisabled(disabled: boolean): void\n}\n\nexport function createFooterHintButton(\n key: string,\n label: string,\n onClick: () => void\n): FooterHintButton {\n const btn = document.createElement(\"button\")\n btn.setAttribute(\"type\", \"button\")\n btn.setAttribute(\"aria-label\", label)\n btn.className = ACTIONS_TRIGGER_CLASS\n\n const textRef = createRef<HTMLSpanElement>()\n render(html`<span ${ref(textRef)}>${label}</span>${kbdTpl(key)}`, btn)\n btn.addEventListener(\"click\", onClick)\n\n return {\n element: btn,\n setLabel(next: string) {\n if (textRef.value) textRef.value.textContent = next\n btn.setAttribute(\"aria-label\", next)\n },\n setDisabled(disabled: boolean) {\n btn.disabled = disabled\n btn.setAttribute(\"aria-disabled\", String(disabled))\n },\n }\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","export const MENU_POPUP_CLASS =\n \"bg-popover shadow-lg/5 not-dark:bg-clip-padding relative flex min-w-32 rounded-lg border outline-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] focus:outline-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\"\n\nexport const MENU_LIST_CLASS = \"flex flex-col p-1\"\n\nexport interface MenuItemDescriptor {\n id: string\n label: string\n shortcut?: string\n disabled?: boolean\n leading?: Node | null\n trailing?: Node | null\n onSelect?: () => void\n}\n","import { composeCleanups, type Cleanup } from \"../../internal/cleanup\"\nimport { cn } from \"../../internal/cn\"\nimport { html, render, createRef, ref } from \"../../internal/lit\"\nimport {\n createMenu as createMenuMachine,\n type MenuApi,\n} from \"../../machines/menu\"\nimport { createPersistentSpreads } from \"../builder/spread-props\"\nimport {\n ACTIONS_SHORTCUT,\n formatShortcutLabel,\n type PaletteShortcut,\n} from \"../../surface/keys\"\nimport { kbdTpl } from \"../../ui/kbd\"\nimport { LIST_ITEM_CLASS, LIST_ITEM_STATE_CLASS } from \"../../ui/list-item\"\nimport {\n MENU_LIST_CLASS,\n MENU_POPUP_CLASS,\n type MenuItemDescriptor,\n} from \"../../ui/menu\"\nimport { createIconTile } from \"../primitives/icon-tile\"\nimport { fillRowWithHandle } from \"../primitives/row\"\nimport type { ShellAction } from \"./types\"\n\nconst TRIGGER_CLASS =\n \"inline-flex shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-2.5 py-1.5 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 ActionsPopupHandle {\n readonly trigger: HTMLButtonElement\n readonly element: HTMLElement\n setActions(actions: ShellAction[]): void\n open(): void\n close(): void\n isOpen(): 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 leading: action.icon?.() ?? null,\n trailing: null,\n }))\n}\n\nfunction itemsKey(items: readonly MenuItemDescriptor[]): string {\n return items.map((i) => i.id).join(\"\\x00\")\n}\n\nexport function createActionsPopup(opts?: {\n shortcut?: PaletteShortcut\n onOpenChange?: (open: boolean) => void\n}): ActionsPopupHandle {\n let items: MenuItemDescriptor[] = []\n let actionById = new Map<string, ShellAction>()\n const spreads = createPersistentSpreads()\n let lastKey = \"\"\n let rowByValue = new Map<string, HTMLElement>()\n let labelByValue = new Map<string, HTMLSpanElement>()\n const cleanups: Cleanup[] = []\n\n // Build trigger imperatively — it needs a ref for zag spreading\n const triggerRef = createRef<HTMLButtonElement>()\n const positionerRef = createRef<HTMLDivElement>()\n const popupRef = createRef<HTMLDivElement>()\n const listRef = createRef<HTMLUListElement>()\n\n // Render the entire structure into a document fragment\n const fragment = document.createDocumentFragment()\n render(\n html`\n <div ${ref(positionerRef)} data-slot=\"menu-positioner\">\n <button\n ${ref(triggerRef)}\n type=\"button\"\n data-uidex-actions-trigger\n class=${TRIGGER_CLASS}\n >\n <span>Actions</span>\n ${kbdTpl(formatShortcutLabel(opts?.shortcut ?? ACTIONS_SHORTCUT))}\n </button>\n <div\n ${ref(popupRef)}\n class=\"${MENU_POPUP_CLASS} w-56\"\n data-uidex-primitive=\"menu\"\n data-slot=\"menu-popup\"\n >\n <ul\n ${ref(listRef)}\n class=\"${MENU_LIST_CLASS} w-full\"\n role=\"menu\"\n aria-label=\"Actions\"\n data-slot=\"menu-list\"\n ></ul>\n </div>\n </div>\n `,\n fragment\n )\n\n const trigger = triggerRef.value!\n const positioner = positionerRef.value!\n const popup = popupRef.value!\n const list = listRef.value!\n\n const handle = createMenuMachine({\n getRootNode: () => {\n const rn = positioner.getRootNode()\n if (rn instanceof ShadowRoot || rn instanceof Document) return rn\n return positioner.ownerDocument ?? document\n },\n closeOnSelect: true,\n positioning: {\n placement: \"top-end\",\n gutter: 4,\n },\n onOpenChange: ({ open }: { open: boolean }) => opts?.onOpenChange?.(open),\n onSelect: (details: { value: string }) => {\n const action = actionById.get(details.value)\n if (!action) return\n const result = action.perform()\n if (result instanceof Promise) {\n const labelEl = labelByValue.get(action.id)\n if (labelEl) {\n const original = labelEl.textContent\n labelEl.textContent = \"Done!\"\n setTimeout(() => {\n labelEl.textContent = original\n }, 800)\n }\n }\n },\n })\n\n function rebuild(key: string): void {\n spreads.cleanupAll()\n rowByValue = new Map()\n labelByValue = new Map()\n\n render(\n html`${items.map(\n (item) =>\n html`<li\n class=${cn(LIST_ITEM_CLASS, LIST_ITEM_STATE_CLASS)}\n data-slot=\"menu-item\"\n data-uidex-menu-item=${item.id}\n ></li>`\n )}`,\n list\n )\n\n const rows = list.querySelectorAll<HTMLElement>(\"[data-uidex-menu-item]\")\n rows.forEach((row, i) => {\n const item = items[i]\n const leading = item.leading ? createIconTile(item.leading) : null\n const { label: labelEl } = fillRowWithHandle(row, {\n leading,\n label: item.label,\n trailing: item.shortcut ?? item.trailing ?? null,\n })\n rowByValue.set(item.id, row)\n labelByValue.set(item.id, labelEl)\n })\n\n lastKey = key\n }\n\n function applyProps(): void {\n const api: MenuApi = handle.api()\n spreads.apply(trigger, api.getTriggerProps() as Record<string, unknown>)\n spreads.apply(\n positioner,\n api.getPositionerProps() as Record<string, unknown>\n )\n spreads.apply(popup, 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 key = itemsKey(items)\n if (key !== lastKey) rebuild(key)\n applyProps()\n }\n\n rebuild(itemsKey(items))\n applyProps()\n\n const unsub = handle.runner.subscribe(tick)\n cleanups.push(unsub)\n\n return {\n trigger,\n element: positioner,\n setActions(actions) {\n items = toDescriptors(actions)\n actionById = new Map(actions.map((a) => [a.id, a]))\n const key = itemsKey(items)\n if (key === lastKey) return\n rebuild(key)\n applyProps()\n },\n open: () => handle.api().setOpen(true),\n close: () => handle.api().setOpen(false),\n isOpen: () => handle.api().open,\n destroy: () => {\n composeCleanups(cleanups)()\n spreads.cleanupAll()\n handle.destroy()\n positioner.remove()\n },\n }\n}\n","import { KIND_STYLE, type Registry } from \"../../../shared/entities\"\nimport { detectDev } from \"../../internal/dev\"\nimport { render as litRender, nothing } from \"../../internal/lit\"\nimport type { SessionStore } from \"../../session\"\nimport type { PaletteShortcut } from \"../../surface/keys\"\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 { Router } from \"./router\"\nimport {\n createFooterDivider,\n createFooterHintButton,\n createHint,\n createStackShell,\n type StackShell,\n} from \"./shell\"\nimport type {\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: Router\n session: SessionStore\n registry: Registry\n highlight: HighlightController\n shortcut?: PaletteShortcut\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 if (searchInput.hidden && !isFocusedWithin(entry.host)) {\n const fallback = entry.host.querySelector<HTMLElement>(\n \"[tabindex], button, input, select, textarea, a[href], [data-uidex-list-content]\"\n )\n fallback?.focus({ preventScroll: true })\n }\n }\n focus()\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(focus)\n }\n}\n\nfunction isFocusedWithin(host: HTMLElement): boolean {\n const rootNode = host.getRootNode()\n const active =\n rootNode instanceof ShadowRoot\n ? rootNode.activeElement\n : document.activeElement\n return active instanceof HTMLElement && host.contains(active)\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\n/**\n * Resolve a view prop that may be a static value or a `(ctx) => value`\n * function. Functions are invoked defensively: a throw or nullish return\n * yields `fallback`. Static values are returned as-is (also coalesced to\n * `fallback` when nullish), matching the prior per-prop helpers.\n */\nfunction resolveProp<T>(\n view: View,\n ctx: ViewContext,\n value: T | ((ctx: ViewContext) => T | undefined) | undefined,\n propName: string,\n fallback: T\n): T {\n if (typeof value === \"function\") {\n try {\n return (value as (ctx: ViewContext) => T | undefined)(ctx) ?? fallback\n } catch (err) {\n console.error(`[uidex] view \"${view.id}\" ${propName}() threw`, err)\n return fallback\n }\n }\n return value ?? fallback\n}\n\nexport function createViewStack(options: ViewStackOptions): ViewStack {\n const { container, views, session, registry, highlight } = options\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 let hintChangeSub: (() => void) | null = null\n let highlightActionsSub: (() => void) | null = null\n\n function ensureShell(): StackShell {\n if (shell) return shell\n shell = createStackShell(\n container,\n {\n onBack: () => {\n const { stack } = session.nav.getState()\n if (stack.length <= 1) {\n session.mode.transition.openPalette()\n } else {\n session.mode.transition.popOrTransition()\n }\n },\n onBackdropClick: () => session.mode.transition.dismiss(),\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.mode.transition.pushView({\n id: \"command-palette\",\n ref: null,\n })\n },\n },\n { shortcut: options.shortcut }\n )\n return shell\n }\n\n function destroyShell(): void {\n hintChangeSub?.()\n hintChangeSub = null\n highlightActionsSub?.()\n highlightActionsSub = null\n shell?.destroy()\n shell = null\n pendingFallbackQuery = null\n litRender(nothing, container)\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 /** Toggle the back button vs. the search icon based on stack position. */\n function updateNavButtons(shell: StackShell, top: MountedEntry): void {\n const atRoot = mounted.length <= 1 && top.view.id === \"command-palette\"\n shell.backBtn.hidden = atRoot\n shell.searchIcon.hidden = !atRoot\n }\n\n /** Show the search input for searchable views, otherwise the title text. */\n function updateTitle(shell: StackShell, top: MountedEntry): void {\n const searchable = top.view.searchable !== false\n shell.searchInput.hidden = !searchable\n const titleText = searchable\n ? \"\"\n : resolveProp<string>(top.view, top.ctx, top.view.title, \"title\", \"\")\n shell.headerTitle.textContent = titleText\n shell.headerTitle.hidden = searchable || !titleText\n }\n\n /** Render the footer-left chip for the active ref, or the logo fallback. */\n function updateFooterChip(shell: StackShell, top: MountedEntry): void {\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\n /**\n * Build the enter-hint button (or static hint) into `footerItems`. When the\n * view exposes a live submit-intent, subscribe so the button stays in sync.\n */\n function buildEnterHint(top: MountedEntry, footerItems: HTMLElement[]): void {\n const enterHint = resolveProp<ShellHint[]>(\n top.view,\n top.ctx,\n top.view.hints,\n \"hints\",\n []\n ).find((h) => h.key.includes(\"↵\"))\n const src = top.mounted.submitIntent\n if (src) {\n const key = enterHint?.key ?? \"↵\"\n const intent = src.get()\n const fallbackLabel = enterHint?.label ?? \"Open\"\n const hint = createFooterHintButton(\n key,\n intent?.label ?? fallbackLabel,\n () => src.get()?.perform()\n )\n footerItems.push(hint.element)\n hint.setDisabled(intent?.disabled ?? false)\n hintChangeSub = src.subscribe(() => {\n const next = src.get()\n hint.setLabel(next?.label ?? fallbackLabel)\n hint.setDisabled(next?.disabled ?? false)\n })\n } else if (enterHint) {\n footerItems.push(createHint(enterHint.key, enterHint.label))\n }\n }\n\n /**\n * Populate the actions popup (view + highlight actions), append the footer\n * items and trigger, and subscribe to live highlight-action changes.\n */\n function buildActions(\n shell: StackShell,\n top: MountedEntry,\n footerItems: HTMLElement[]\n ): void {\n const actionsDivider = createFooterDivider()\n const viewActions = resolveProp<ShellAction[]>(\n top.view,\n top.ctx,\n top.view.actions,\n \"actions\",\n []\n )\n const hlSrc = top.mounted.highlightActions\n\n const syncActions = (): void => {\n const hlActions = hlSrc?.get() ?? []\n const combined = [...hlActions, ...viewActions]\n shell.actionsPopup.setActions(combined)\n const visible = combined.length > 0\n shell.actionsPopup.trigger.hidden = !visible\n actionsDivider.hidden = !visible || footerItems.length === 0\n }\n\n if (hlSrc) {\n highlightActionsSub = hlSrc.subscribe(syncActions)\n }\n\n for (let i = 0; i < footerItems.length; i++) {\n if (i > 0) shell.footerRight.append(createFooterDivider())\n shell.footerRight.append(footerItems[i])\n }\n shell.footerRight.append(actionsDivider)\n shell.footerRight.append(shell.actionsPopup.trigger)\n syncActions()\n }\n\n function updateChrome(): void {\n if (!shell) return\n const top = mounted[mounted.length - 1]\n if (!top) return\n\n updateNavButtons(shell, top)\n updateTitle(shell, top)\n updateFooterChip(shell, top)\n\n // Rebuild the footer-right region (enter-hint + actions popup). Drop the\n // prior per-entry subscriptions before re-subscribing in the helpers.\n hintChangeSub?.()\n hintChangeSub = null\n highlightActionsSub?.()\n highlightActionsSub = null\n shell.footerRight.replaceChildren()\n const footerItems: HTMLElement[] = []\n buildEnterHint(top, footerItems)\n buildActions(shell, top, footerItems)\n }\n\n function render(): void {\n if (!container.isConnected) return\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 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 type { EntityKind, EntityRef } from \"../../../shared/entities\"\nimport type { ViewStackEntry } from \"../../session/types\"\n\nexport const BUILT_IN_VIEW_IDS = {\n commandPalette: \"command-palette\",\n elements: \"elements\",\n explorePage: \"explore-page\",\n features: \"features\",\n flows: \"flows\",\n glossary: \"glossary\",\n pages: \"pages\",\n primitives: \"primitives\",\n regions: \"regions\",\n widgets: \"widgets\",\n} as const\n\nexport const LIST_VIEW_FOR_KIND: Record<EntityKind, string> = {\n element: BUILT_IN_VIEW_IDS.elements,\n feature: BUILT_IN_VIEW_IDS.features,\n page: BUILT_IN_VIEW_IDS.pages,\n widget: BUILT_IN_VIEW_IDS.widgets,\n region: BUILT_IN_VIEW_IDS.regions,\n primitive: BUILT_IN_VIEW_IDS.primitives,\n flow: BUILT_IN_VIEW_IDS.flows,\n route: BUILT_IN_VIEW_IDS.pages,\n}\n\nexport const DETAIL_VIEW_FOR_KIND: Record<EntityKind, string> = {\n element: \"component-detail\",\n feature: \"feature-detail\",\n page: \"page-detail\",\n widget: \"widget-detail\",\n region: \"region-detail\",\n primitive: \"primitive-detail\",\n flow: \"flow-detail\",\n route: \"page-detail\",\n}\n\nexport const COMMAND_PALETTE_ENTRY: ViewStackEntry = {\n id: BUILT_IN_VIEW_IDS.commandPalette,\n ref: null,\n}\n\nexport function parentList(ref: EntityRef | null): ViewStackEntry | null {\n if (!ref) return COMMAND_PALETTE_ENTRY\n return { id: LIST_VIEW_FOR_KIND[ref.kind], ref: null }\n}\n\nexport function parentDetail(ref: EntityRef | null): ViewStackEntry | null {\n if (!ref) return COMMAND_PALETTE_ENTRY\n return { id: DETAIL_VIEW_FOR_KIND[ref.kind], ref }\n}\n","import {\n Compass,\n Copy,\n ExternalLink,\n Star,\n StarOff,\n createElement as createLucideElement,\n} from \"lucide\"\nimport {\n displayName,\n KIND_STYLE,\n type Entity,\n type EntityRef,\n type Page,\n} from \"../../../shared/entities\"\nimport { formatShortcutLabel, type PaletteShortcut } from \"../../surface/keys\"\nimport { matchesQuery } from \"../builder/filter\"\nimport { formatLocation } from \"../builder/format-location\"\nimport { buildPageRouteMap, collectPageContext } from \"../builder/page-context\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { ShellAction, 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\nfunction openAction(onSelect: () => void): ShellAction {\n return {\n id: \"open\",\n label: \"Open\",\n icon: () => createLucideElement(ExternalLink),\n perform: onSelect,\n }\n}\n\nfunction favoriteAction(ref: EntityRef, ctx: ViewContext): ShellAction {\n const isFav = ctx.views.isFavorite(ref)\n return {\n id: \"toggle-favorite\",\n label: isFav ? \"Remove from Favorites\" : \"Add to Favorites\",\n shortcut: \"⇧⌘F\",\n icon: () => createLucideElement(isFav ? StarOff : Star),\n perform: () => {\n ctx.views.toggleFavorite(ref)\n ctx.close()\n ctx.push({ id: BUILT_IN_VIEW_IDS.commandPalette, ref: null })\n },\n }\n}\n\nfunction entityActions(\n ref: EntityRef,\n entity: Entity | undefined,\n ctx: ViewContext,\n onSelect: () => void\n): ShellAction[] {\n const actions: ShellAction[] = [openAction(onSelect)]\n if (entity && \"loc\" in entity && entity.loc) {\n const path = formatLocation(entity.loc)\n if (path) {\n actions.push({\n id: \"copy-path\",\n label: \"Copy Source Path\",\n icon: () => createLucideElement(Copy),\n async perform() {\n try {\n await navigator.clipboard.writeText(path)\n } catch {\n // silent\n }\n },\n })\n }\n }\n actions.push(favoriteAction(ref, ctx))\n return actions\n}\n\nfunction viewActions(onSelect: () => void): ShellAction[] {\n return [openAction(onSelect)]\n}\n\nconst CURRENT_PAGE_GROUP = PALETTE_GROUPS.currentPage\n\nfunction pageDetailsRow(\n page: Page,\n pageRoutes: ReadonlyMap<string, string>,\n ctx: ViewContext\n): PaletteItem {\n const ref: EntityRef = { kind: \"page\", id: page.id }\n const onSelect = () => ctx.views.navigate(ref)\n const item: PaletteItem = {\n value: `entity:${ref.kind}:${ref.id}`,\n label: displayName(page),\n group: CURRENT_PAGE_GROUP,\n tag: `${ref.kind}:${ref.id}`,\n preview: ref,\n entityChip: { entity: page },\n actions: entityActions(ref, page, ctx, onSelect),\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, ctx: ViewContext): PaletteItem {\n const onSelect = () =>\n ctx.push({ id: BUILT_IN_VIEW_IDS.explorePage, ref: null })\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 actions: viewActions(onSelect),\n payload: { type: \"view\", id: BUILT_IN_VIEW_IDS.explorePage },\n }\n}\n\nconst PALETTE_EXCLUDED_VIEWS: Set<string> = new Set([\n BUILT_IN_VIEW_IDS.commandPalette,\n BUILT_IN_VIEW_IDS.explorePage,\n BUILT_IN_VIEW_IDS.flows,\n BUILT_IN_VIEW_IDS.elements,\n BUILT_IN_VIEW_IDS.widgets,\n BUILT_IN_VIEW_IDS.regions,\n BUILT_IN_VIEW_IDS.pages,\n BUILT_IN_VIEW_IDS.features,\n BUILT_IN_VIEW_IDS.primitives,\n])\n\nfunction collectNavigation(ctx: ViewContext): PaletteItem[] {\n const out: PaletteItem[] = []\n for (const view of ctx.views.list()) {\n if (PALETTE_EXCLUDED_VIEWS.has(view.id)) continue\n if (!view.palette) continue\n const onSelect = () => ctx.push({ id: view.id, ref: null })\n const subtitle =\n typeof view.palette.subtitle === \"function\"\n ? view.palette.subtitle()\n : view.palette.subtitle\n out.push({\n value: `view:${view.id}`,\n label: view.palette.label,\n subtitle,\n group: view.palette.group ?? PALETTE_GROUPS.commands,\n shortcut: view.palette.shortcut,\n tag: view.id,\n leading: view.palette.icon,\n actions: viewActions(onSelect),\n payload: { type: \"view\", id: view.id },\n })\n }\n return out\n}\n\nexport function createCommandPaletteView(shortcut?: PaletteShortcut): View {\n const shortcutLabel = formatShortcutLabel(shortcut ?? { key: \"k\" })\n return {\n id: BUILT_IN_VIEW_IDS.commandPalette,\n palette: { label: \"Command Palette\", shortcut: shortcutLabel },\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 const favSet = new Set(\n ctx.views.favorites().map((r) => `${r.kind}:${r.id}`)\n )\n\n for (const ref of ctx.views.favorites()) {\n if (ref.kind === \"route\") continue\n const entity = ctx.registry.get(ref.kind, ref.id)\n if (!entity) continue\n const style = KIND_STYLE[ref.kind]\n const onSelect = () => ctx.views.navigate(ref)\n items.push({\n value: `favorite:${ref.kind}:${ref.id}`,\n label: displayName(entity),\n tag: `${ref.kind}:${ref.id}`,\n group: PALETTE_GROUPS.favorites,\n preview: ref,\n entityChip: { entity },\n leading: () => createLucideElement(style.icon),\n actions: entityActions(ref, entity, ctx, onSelect),\n payload: { type: \"entity\", ref },\n })\n }\n\n if (pageCtx.pageEntity) {\n items.push(pageDetailsRow(pageCtx.pageEntity, pageRoutes, ctx))\n }\n\n const onPageCount = pageCtx.composed.length + pageCtx.dom.length\n if (onPageCount > 0) items.push(explorePageRow(onPageCount, ctx))\n\n items.push(...collectNavigation(ctx))\n\n for (const ref of ctx.views.recents()) {\n if (ref.kind === \"route\") continue\n if (favSet.has(`${ref.kind}:${ref.id}`)) continue\n const entity = ctx.registry.get(ref.kind, ref.id)\n if (!entity) continue\n const style = KIND_STYLE[ref.kind]\n const onSelect = () => ctx.views.navigate(ref)\n items.push({\n value: `recent:${ref.kind}:${ref.id}`,\n label: displayName(entity),\n tag: `${ref.kind}:${ref.id}`,\n group: PALETTE_GROUPS.recents,\n preview: ref,\n entityChip: { entity },\n leading: () => createLucideElement(style.icon),\n actions: entityActions(ref, entity, ctx, onSelect),\n payload: { type: \"entity\", ref },\n })\n }\n\n const groupOrder = new Map<string, number>()\n for (const item of items) {\n const g = item.group ?? \"\"\n if (!groupOrder.has(g)) groupOrder.set(g, groupOrder.size)\n }\n items.sort(\n (a, b) =>\n (groupOrder.get(a.group ?? \"\") ?? 0) -\n (groupOrder.get(b.group ?? \"\") ?? 0)\n )\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({\n id: palette.payload.id,\n ref: palette.payload.ref ?? null,\n })\n return\n }\n ctx.views.navigate(palette.payload.ref)\n },\n }\n },\n }\n}\n","import type { Location } from \"../../../shared/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 type { Entity, EntityRef, Page } from \"../../../shared/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/**\n * Find the best-matching route for the current pathname. Returns both the\n * route path pattern and the page id, or `null` when no route matches.\n */\nfunction findCurrentRoute(\n registry: ViewContext[\"registry\"]\n): { path: string; page: string } | null {\n if (typeof location === \"undefined\") return null\n const pathname = location.pathname || \"/\"\n const routes = 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\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 return findCurrentRoute(ctx.registry)?.page ?? null\n}\n\n/** Resolve the route pattern for the current URL (e.g. `/:orgSlug/projects/:slug`). */\nexport function findCurrentRoutePath(\n registry: ViewContext[\"registry\"]\n): string | null {\n return findCurrentRoute(registry)?.path ?? 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 { domToPng, domToWebp } from \"modern-screenshot\"\nimport { SURFACE_HOST_CLASS } from \"../surface/constants\"\n\n/**\n * WebP (lossy) instead of PNG: a full-page capture re-rasterizes every inlined\n * image (including screenshots already on the page), and PNG keeps that\n * lossless — easily tens of MB. WebP at this quality is typically 5-10× smaller\n * with no perceptual loss, which keeps the common case a single sub-`maxPayload`\n * WS frame. Oversized captures still stream in chunks (see cloud `submit`).\n */\nconst WEBP_QUALITY = 0.85\n\nexport interface CaptureScreenshotOptions {\n target?: HTMLElement\n maxWidth?: number\n /**\n * Output encoding. Defaults to \"webp\" (small — for report uploads). Use \"png\"\n * for clipboard writes: the async Clipboard API only reliably accepts\n * image/png, so a webp `ClipboardItem` throws on Chrome/Safari. (On engines\n * without canvas WebP encode — older Safari/WebViews — `domToWebp` already\n * falls back to a PNG data URL; downstream sniffs the real MIME, so that path\n * stays correct, just larger.)\n */\n format?: \"webp\" | \"png\"\n}\n\nfunction resolveBackgroundColor(el: HTMLElement): string {\n let node: HTMLElement | null = el\n while (node) {\n const bg = getComputedStyle(node).backgroundColor\n if (bg && bg !== \"transparent\" && bg !== \"rgba(0, 0, 0, 0)\") return bg\n node = node.parentElement\n }\n return \"#ffffff\"\n}\n\nfunction isUidexChrome(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n const el = node as Element\n if (el.shadowRoot !== null) return true\n return el.classList.contains(SURFACE_HOST_CLASS)\n}\n\nexport async function captureScreenshot(\n options: CaptureScreenshotOptions = {}\n): Promise<string> {\n if (typeof document === \"undefined\") {\n throw new Error(\"captureScreenshot: no document available\")\n }\n const target = options.target ?? document.body\n if (!target) throw new Error(\"captureScreenshot: no target\")\n\n const width = target.scrollWidth || target.clientWidth\n const scale =\n options.maxWidth && width > options.maxWidth ? options.maxWidth / width : 1\n\n const padding = 16\n const height = target.scrollHeight || target.clientHeight\n\n const encode = options.format === \"png\" ? domToPng : domToWebp\n return encode(target, {\n scale,\n quality: WEBP_QUALITY,\n width: width + padding * 2,\n height: height + padding * 2,\n backgroundColor: resolveBackgroundColor(target),\n style: { padding: `${padding}px` },\n filter: (node) => !isUidexChrome(node),\n })\n}\n","export interface ReportContext {\n url: string\n route?: string\n pageTitle?: string\n viewport: { w: number; h: number }\n userAgent: string\n timestamp: string\n}\n\nexport function captureReportContext(): ReportContext {\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 return {\n url: loc?.href ?? \"\",\n route: loc?.pathname,\n userAgent: nav?.userAgent ?? \"\",\n pageTitle: doc?.title,\n timestamp: new Date().toISOString(),\n viewport: {\n w: win?.innerWidth ?? 0,\n h: win?.innerHeight ?? 0,\n },\n }\n}\n","import {\n type Entity,\n type EntityRef,\n type Flow,\n} from \"../../../shared/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\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 EntityRef,\n type Location,\n type MetaEntityKind,\n} from \"../../../shared/entities\"\nimport { captureScreenshot } from \"../../internal/screenshot\"\nimport { DOM_BACKED_KINDS } from \"../../surface/constants\"\nimport { resolveEntityElement } from \"../../surface/inspector\"\nimport { captureReportContext } from \"../../report/capture\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSubtitle,\n DetailSurface,\n} from \"../core/surface\"\nimport { parentList } 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 DETAIL_HINTS: ShellHint[] = [{ key: \"↵\", label: \"Open\" }]\n\nexport function copyPathAction(ref: EntityRef, loc?: Location): DetailAction {\n const identifier = `${ref.kind}:${ref.id}`\n const path = formatLocation(loc) ?? identifier\n return {\n id: \"copy-path\",\n label: \"Copy Source Path\",\n ariaLabel: `Copy path ${path}`,\n icon: \"copy\",\n copy: path,\n intent: { kind: \"external\", describe: \"clipboard\" },\n }\n}\n\nexport function buildSnapshotMarkdown(ref: EntityRef, loc?: Location): string {\n const snapshot = captureReportContext()\n const sourcePath = formatLocation(loc)\n const lines: string[] = [\n `#### ${ref.kind}: ${ref.id}`,\n `- **Kind:** ${ref.kind}`,\n `- **ID:** \\`${ref.id}\\``,\n ...(sourcePath ? [`- **Source:** \\`${sourcePath}\\``] : []),\n `#### Context`,\n `- **URL:** ${snapshot.url}`,\n `- **Path:** ${snapshot.route ?? \"\"}`,\n ...(snapshot.pageTitle ? [`- **Page Title:** ${snapshot.pageTitle}`] : []),\n `- **Viewport:** ${snapshot.viewport.w}×${snapshot.viewport.h}`,\n `- **User Agent:** ${snapshot.userAgent}`,\n `- **Timestamp:** ${snapshot.timestamp}`,\n ]\n return lines.join(\"\\n\") + \"\\n\"\n}\n\nexport function copySnapshotAction(\n ref: EntityRef,\n loc?: Location\n): DetailAction {\n return {\n id: \"copy-snapshot\",\n label: \"Copy Markdown Snapshot\",\n icon: \"view\",\n copy: buildSnapshotMarkdown(ref, loc),\n intent: { kind: \"external\", describe: \"clipboard\" },\n }\n}\n\nexport function highlightElementAction(ref: EntityRef): DetailAction {\n return {\n id: \"highlight-element\",\n label: \"Highlight Element\",\n icon: \"highlighter\",\n highlight: ref,\n intent: { kind: \"external\", describe: \"highlight\" },\n }\n}\n\nexport function copyScreenshotAction(ref: EntityRef): DetailAction {\n return {\n id: \"copy-screenshot\",\n label: \"Copy Screenshot\",\n icon: \"camera\",\n intent: { kind: \"external\", describe: \"clipboard\" },\n run: async (ctx) => {\n try {\n ctx.setLabel(\"Capturing…\")\n const target = resolveEntityElement(ref) ?? undefined\n const dataUrl = await captureScreenshot({\n target,\n maxWidth: 1280,\n // Clipboard write requires PNG — the async Clipboard API rejects\n // image/webp (`ClipboardItem` throws on Chrome/Safari).\n format: \"png\",\n })\n const res = await fetch(dataUrl)\n const blob = await res.blob()\n await navigator.clipboard.write([\n new ClipboardItem({ [blob.type]: blob }),\n ])\n ctx.setLabel(\"Copied!\", 1200)\n } catch {\n ctx.setLabel(\"Copy failed\", 1500)\n }\n },\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 parent: parentList,\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 exactEntity = ctx.registry.get(kind, ctx.ref.id) as\n | EntityByKind<K>\n | undefined\n const patternEntity = exactEntity\n ? undefined\n : (ctx.registry.matchPattern?.(kind, ctx.ref.id) as\n | EntityByKind<K>\n | undefined)\n const entity = exactEntity ?? patternEntity\n const metaEntity: MetaEntity | null = entity\n ? (entity as MetaEntity)\n : null\n const meta = metaEntity?.meta\n\n const actions: DetailAction[] = []\n\n // Inspect group\n if (DOM_BACKED_KINDS.has(kind) && resolveEntityElement(ctx.ref)) {\n actions.push({ ...highlightElementAction(ctx.ref), group: \"Inspect\" })\n actions.push({ ...copyScreenshotAction(ctx.ref), group: \"Inspect\" })\n }\n if (metaEntity?.loc) {\n actions.push({\n ...copyPathAction(ctx.ref, metaEntity.loc),\n group: \"Inspect\",\n })\n actions.push({\n ...copySnapshotAction(ctx.ref, metaEntity.loc),\n group: \"Inspect\",\n })\n }\n\n const sections: DetailSection[] = []\n if (meta?.description) {\n sections.push({ id: \"description\", text: meta.description })\n }\n if (offerAcceptance && meta?.acceptance?.length) {\n // Criteria are normalized `{ id, rev, text }` objects; the checklist\n // renders the human text.\n sections.push({\n id: \"acceptance\",\n items: meta.acceptance.map((c) => c.text),\n })\n }\n if (entity) {\n for (const s of config.extraSections?.(ctx, entity) ?? []) {\n sections.push(s)\n }\n }\n if (!DOM_BACKED_KINDS.has(kind)) {\n sections.push({\n id: \"composes\",\n label: SECTION_LABELS.contains,\n entities: resolveRefs(ctx, meta?.composes),\n filterable: true,\n })\n }\n if (DOM_BACKED_KINDS.has(kind) && meta?.features?.length) {\n const featureEntities = meta.features\n .map((fId) => ctx.registry.get(\"feature\", fId))\n .filter((e): e is NonNullable<typeof e> => !!e)\n if (featureEntities.length > 0) {\n sections.push({\n id: \"composes\",\n label: \"Features\",\n entities: featureEntities,\n filterable: true,\n })\n }\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: patternEntity\n ? ctx.ref.id\n : metaEntity\n ? displayName(metaEntity)\n : ctx.ref.id,\n subtitle: exactEntity ? config.subtitle?.(ctx, exactEntity) : undefined,\n unregistered: !entity,\n actions,\n sections,\n }\n },\n }\n}\n","import type { Entity } from \"../../../shared/entities\"\nimport { createEntityDetailView } from \"../builder/detail-builder\"\nimport { collectFlowsTouching } from \"../builder/resolve\"\nimport type { DetailSection } from \"../core/surface\"\nimport type { ViewContext } from \"../core/types\"\nimport { SECTION_LABELS } from \"../labels\"\n\n// Features have no DOM presence (they are directories), so \"Used by\" comes\n// from the registry: pages that declare the feature in their `features` list.\nfunction collectFeatureConsumers(\n ctx: ViewContext,\n featureId: string\n): Entity[] {\n return ctx.registry\n .list(\"page\")\n .filter((page) => page.meta?.features?.includes(featureId))\n}\n\nfunction usedBySection(ctx: ViewContext, featureId: string): DetailSection {\n return {\n id: \"used-by\",\n label: SECTION_LABELS.usedBy,\n entities: collectFeatureConsumers(ctx, featureId),\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) => [touchedByFlowsSection(ctx, entity.id)],\n})\n\nexport const featureDetailView = createEntityDetailView({\n id: \"feature-detail\",\n kind: \"feature\",\n fallbackTitle: \"Feature\",\n extraSections: (ctx, entity) => [usedBySection(ctx, entity.id)],\n})\n\nexport const regionDetailView = createEntityDetailView({\n id: \"region-detail\",\n kind: \"region\",\n fallbackTitle: \"Region\",\n offerAcceptance: false,\n})\n\nexport const widgetDetailView = createEntityDetailView({\n id: \"widget-detail\",\n kind: \"widget\",\n fallbackTitle: \"Widget\",\n})\n\nexport const primitiveDetailView = createEntityDetailView({\n id: \"primitive-detail\",\n kind: \"primitive\",\n fallbackTitle: \"Primitive\",\n offerAcceptance: false,\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 {\n displayName,\n entityKey,\n KIND_STYLE,\n type Entity,\n type EntityKind,\n type EntityRef,\n} from \"../../../shared/entities\"\nimport { matchesQuery } from \"../builder/filter\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { BUILT_IN_VIEW_IDS, COMMAND_PALETTE_ENTRY } from \"./ids\"\n\ninterface EntityItem extends ListItem {\n ref: EntityRef\n}\n\nfunction toItem(entity: Entity): EntityItem {\n const ref: EntityRef = { kind: entity.kind, id: entityKey(entity) }\n return {\n value: `entity:${ref.kind}:${ref.id}`,\n label: displayName(entity),\n tag: `${ref.kind}:${ref.id}`,\n preview: ref,\n entityChip: { entity },\n ref,\n }\n}\n\nfunction createEntityKindListView(kind: EntityKind, viewId: string): View {\n const style = KIND_STYLE[kind]\n return {\n id: viewId,\n palette: { label: style.label + \"s\" },\n title: style.label + \"s\",\n parent: () => COMMAND_PALETTE_ENTRY,\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const entities = ctx.registry.list(kind)\n const items: EntityItem[] = (entities as Entity[])\n .map(toItem)\n .sort((a, b) => a.label.localeCompare(b.label))\n\n return {\n kind: \"list\",\n id: `uidex-${kind}s`,\n items,\n emptyLabel: `No ${style.label.toLowerCase()}s registered`,\n filter: (item, query) =>\n matchesQuery(\n `${item.label} ${(item as EntityItem).ref.id} ${item.group ?? \"\"}`,\n query\n ),\n onSelect: (item) => ctx.views.navigate((item as EntityItem).ref),\n }\n },\n }\n}\n\nexport const elementsView = createEntityKindListView(\n \"element\",\n BUILT_IN_VIEW_IDS.elements\n)\nexport const widgetsView = createEntityKindListView(\n \"widget\",\n BUILT_IN_VIEW_IDS.widgets\n)\nexport const regionsView = createEntityKindListView(\n \"region\",\n BUILT_IN_VIEW_IDS.regions\n)\nexport const pagesView = createEntityKindListView(\n \"page\",\n BUILT_IN_VIEW_IDS.pages\n)\nexport const featuresView = createEntityKindListView(\n \"feature\",\n BUILT_IN_VIEW_IDS.features\n)\nexport const primitivesView = createEntityKindListView(\n \"primitive\",\n BUILT_IN_VIEW_IDS.primitives\n)\n","import { Compass, createElement as createLucideElement } from \"lucide\"\nimport {\n displayName,\n ENTITY_KINDS,\n type Entity,\n type EntityRef,\n} from \"../../../shared/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, COMMAND_PALETTE_ENTRY } 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 parent: () => COMMAND_PALETTE_ENTRY,\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.views.navigate((item as ExplorePageItem).ref),\n }\n },\n}\n","import {\n displayName,\n isMetaEntity,\n type Entity,\n type Flow,\n type FlowStep,\n type MetaEntityKind,\n type Registry,\n} from \"../../../shared/entities\"\nimport { parentList } from \"./ids\"\nimport type {\n DetailAction,\n DetailSection,\n DetailSurface,\n ResolvedFlowStep,\n} from \"../core/surface\"\nimport type { View } from \"../core/types\"\nimport { copyPathAction, copySnapshotAction } from \"../builder/detail-builder\"\n\nconst STEP_KINDS: readonly MetaEntityKind[] = [\n \"element\",\n \"widget\",\n \"region\",\n \"page\",\n \"feature\",\n \"primitive\",\n]\n\nexport const flowDetailView: View = {\n id: \"flow-detail\",\n matches: (ref) => ref.kind === \"flow\",\n parent: parentList,\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 actions: DetailAction[] = [\n copyPathAction(ctx.ref, flow.loc),\n copySnapshotAction(ctx.ref, flow.loc),\n ]\n\n const sections: DetailSection[] = [\n flow.steps.length > 0\n ? buildStepsSection(flow.steps, ctx.registry)\n : buildTouchesSection(flow, ctx.registry),\n ]\n\n return {\n kind: \"detail\",\n entityKind: \"flow\",\n title: displayName(flow),\n actions,\n sections,\n }\n },\n}\n\nfunction buildStepsSection(\n flowSteps: readonly FlowStep[],\n registry: Registry\n): DetailSection {\n const steps: ResolvedFlowStep[] = []\n flowSteps.forEach((step, index) => {\n const entity = resolveStepEntity(registry, step.entityId)\n if (entity) {\n steps.push({ ordinal: index + 1, entity, action: step.action })\n }\n })\n return { id: \"steps\", steps, filterable: true }\n}\n\nfunction resolveStepEntity(\n registry: Registry,\n entityId: string\n): Entity | undefined {\n for (const kind of STEP_KINDS) {\n const entity = registry.get(kind, entityId)\n if (entity) return entity\n }\n return undefined\n}\n\nfunction buildTouchesSection(flow: Flow, registry: Registry): DetailSection {\n const touched: Entity[] = []\n const seen = new Set<string>()\n for (const touchedEntity of 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 return {\n id: \"touches\",\n entities: touched,\n filterable: true,\n }\n}\n","import {\n displayName,\n type EntityRef,\n type Flow,\n} from \"../../../shared/entities\"\nimport { matchesQuery } from \"../builder/filter\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { BUILT_IN_VIEW_IDS, COMMAND_PALETTE_ENTRY } from \"./ids\"\n\ninterface FlowItem extends ListItem {\n ref: EntityRef\n}\n\nfunction toItem(flow: Flow): FlowItem {\n const ref: EntityRef = { kind: \"flow\", id: flow.id }\n return {\n value: `entity:flow:${flow.id}`,\n label: displayName(flow),\n subtitle: flow.loc.file || undefined,\n tag: `flow:${flow.id}`,\n preview: ref,\n entityChip: { entity: flow },\n ref,\n }\n}\n\nexport const flowsView: View = {\n id: BUILT_IN_VIEW_IDS.flows,\n palette: { label: \"Flows\" },\n parent: () => COMMAND_PALETTE_ENTRY,\n title: \"Flows\",\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const flows = ctx.registry.list(\"flow\")\n const items: FlowItem[] = flows\n .map(toItem)\n .sort((a, b) => a.label.localeCompare(b.label))\n\n const filter = (item: ListItem, query: string): boolean => {\n const row = item as FlowItem\n return matchesQuery(\n `${item.label} ${row.ref.id} ${item.group ?? \"\"}`,\n query\n )\n }\n\n return {\n kind: \"list\",\n id: \"uidex-flows\",\n items,\n emptyLabel: \"No flows registered\",\n filter,\n onSelect: (item) => ctx.views.navigate((item as FlowItem).ref),\n }\n },\n}\n","import { BookOpen, createElement as createLucideElement } from \"lucide\"\nimport {\n KIND_STYLE,\n type Entity,\n type EntityKind,\n} from \"../../../shared/entities\"\nimport type { ListItem, ListSurface } from \"../core/surface\"\nimport type { View, ViewContext } from \"../core/types\"\nimport { PALETTE_GROUPS } from \"../labels\"\nimport { BUILT_IN_VIEW_IDS, COMMAND_PALETTE_ENTRY } from \"./ids\"\n\nconst KIND_TO_VIEW: Partial<Record<EntityKind, string>> = {\n element: BUILT_IN_VIEW_IDS.elements,\n widget: BUILT_IN_VIEW_IDS.widgets,\n region: BUILT_IN_VIEW_IDS.regions,\n page: BUILT_IN_VIEW_IDS.pages,\n feature: BUILT_IN_VIEW_IDS.features,\n primitive: BUILT_IN_VIEW_IDS.primitives,\n flow: BUILT_IN_VIEW_IDS.flows,\n}\n\nconst BROWSABLE_KINDS: EntityKind[] = [\n \"page\",\n \"feature\",\n \"widget\",\n \"region\",\n \"element\",\n \"primitive\",\n \"flow\",\n]\n\nfunction syntheticEntity(kind: EntityKind): Entity {\n if (kind === \"route\") return { kind: \"route\", path: kind, page: kind }\n if (kind === \"flow\")\n return {\n kind: \"flow\",\n id: kind,\n loc: { file: \"\" },\n touches: [],\n steps: [],\n }\n return { kind, id: kind }\n}\n\nexport const glossaryView: View = {\n id: BUILT_IN_VIEW_IDS.glossary,\n parent: () => COMMAND_PALETTE_ENTRY,\n palette: {\n label: \"Glossary\",\n group: PALETTE_GROUPS.commands,\n icon: () => createLucideElement(BookOpen),\n },\n title: \"Glossary\",\n hints: [{ key: \"↵\", label: \"Select\" }],\n focusTarget: () => null,\n surface: (ctx: ViewContext): ListSurface => {\n const items: ListItem[] = BROWSABLE_KINDS.map((kind) => {\n const count =\n kind === \"flow\"\n ? ctx.registry.list(\"flow\").length\n : ctx.registry.list(kind).length\n return {\n value: `glossary:${kind}`,\n label: KIND_STYLE[kind].label + \"s\",\n subtitle: String(count),\n tag: kind,\n entityChip: { entity: syntheticEntity(kind) },\n }\n })\n return {\n kind: \"list\",\n id: \"uidex-glossary\",\n items,\n onSelect: (item) => {\n const kind = item.tag as EntityKind\n const viewId = KIND_TO_VIEW[kind]\n if (viewId) ctx.push({ id: viewId, ref: null })\n },\n }\n },\n}\n","export { BUILT_IN_VIEW_IDS } from \"./ids\"\n\nimport type { PaletteShortcut } from \"../../surface/keys\"\nimport { createCommandPaletteView } from \"./command-palette\"\nimport {\n componentDetailView,\n featureDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n widgetDetailView,\n} from \"./entity-detail\"\nimport {\n elementsView,\n featuresView,\n pagesView,\n primitivesView,\n regionsView,\n widgetsView,\n} from \"./entity-kind-list\"\nimport { explorePageView } from \"./explore-page\"\nimport { flowDetailView } from \"./flow-detail\"\nimport { flowsView } from \"./flows\"\nimport { glossaryView } from \"./glossary\"\n\nexport { createCommandPaletteView } from \"./command-palette\"\nexport {\n componentDetailView,\n featureDetailView,\n pageDetailView,\n primitiveDetailView,\n regionDetailView,\n widgetDetailView,\n} from \"./entity-detail\"\nexport {\n elementsView,\n featuresView,\n pagesView,\n primitivesView,\n regionsView,\n widgetsView,\n} from \"./entity-kind-list\"\nexport { explorePageView } from \"./explore-page\"\nexport { flowDetailView } from \"./flow-detail\"\nexport { flowsView } from \"./flows\"\nexport { glossaryView } from \"./glossary\"\n\nimport type { View } from \"../core/types\"\n\nexport function buildDefaultViews(shortcut?: PaletteShortcut): View[] {\n return [\n createCommandPaletteView(shortcut),\n explorePageView,\n componentDetailView,\n pageDetailView,\n featureDetailView,\n widgetDetailView,\n flowDetailView,\n flowsView,\n elementsView,\n widgetsView,\n regionsView,\n pagesView,\n featuresView,\n primitivesView,\n primitiveDetailView,\n regionDetailView,\n glossaryView,\n ]\n}\n","import { createRegistry, KIND_STYLE, type Registry } from \"../shared/entities\"\nimport { createCleanupStack } from \"./internal/cleanup\"\nimport {\n createSession,\n type HighlightContext,\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 type PaletteShortcut,\n} from \"./surface\"\nimport {\n buildDefaultViews,\n createRouter,\n createViewStack,\n type HighlightController,\n type Router,\n type View,\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 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 /** Keyboard shortcut for the command palette. Defaults to Cmd+K / Ctrl+K. */\n shortcut?: PaletteShortcut\n}\n\nexport interface Uidex {\n mount(target?: Element): void\n unmount(): void\n readonly registry: Registry\n readonly session: SessionStore\n readonly views: Router\n readonly shadowRoot: ShadowRoot | null\n}\n\nexport function createUidex(options: CreateUidexOptions = {}): Uidex {\n const registry = createRegistry()\n\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 const pinned = ctx.pinnedRef !== null\n overlay.show(el, {\n color: ctx.color ?? KIND_STYLE[ref.kind].color,\n backdrop: pinned,\n })\n }\n\n const session = createSession({\n theme: options.theme,\n resolvedTheme: options.resolvedTheme,\n onMountInspector: () => inspectorRef.current?.mount(),\n onDestroyInspector: () => inspectorRef.current?.destroy(),\n onShowOverlay: applyOverlay,\n onHideOverlay: () => overlayRef.current?.hide(),\n onUpdateOverlay: applyOverlay,\n })\n const views = createRouter({ session })\n\n if (options.defaultViews !== false) {\n for (const view of buildDefaultViews(options.shortcut)) views.add(view)\n }\n if (options.views) {\n for (const view of options.views) views.add(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 route = views.resolve(match.ref)\n if (!route) return\n const entry = { id: route.view.id, ref: match.ref }\n session.mode.transition.enterViewing(views.buildStack(entry))\n },\n },\n })\n shadowRoot = shell.host.shadowRoot\n inspectorRef.current = shell.inspector\n overlayRef.current = shell.overlay\n shell.overlay.onDismiss = () => session.highlight.unpin()\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.highlight.unhover()\n return\n }\n session.highlight.hover(ref, el, opts?.color ?? null)\n },\n hide() {\n session.highlight.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 highlight,\n shortcut: options.shortcut,\n })\n mountCleanup.add(viewStack)\n\n if (shadowRoot) {\n const keyBindings = bindShadowKeys({\n shadowRoot,\n session,\n getActionsPopup: () => viewStack.getActionsPopup(),\n shortcut: options.shortcut,\n })\n mountCleanup.add(keyBindings)\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 get shadowRoot() {\n return shadowRoot\n },\n }\n}\n","import { useContext } from \"react\"\nimport type { Uidex } from \"../../browser/create-uidex\"\nimport { UidexContext } from \"./provider\"\n\nexport class UidexContextError extends Error {\n constructor(hookName: string) {\n super(\n `${hookName} must be called inside <UidexProvider>. Wrap your tree with <UidexProvider>.`\n )\n this.name = \"UidexContextError\"\n }\n}\n\nexport function useUidex(): Uidex {\n const ctx = useContext(UidexContext)\n if (!ctx) throw new UidexContextError(\"useUidex\")\n return ctx\n}\n","import { useEffect, useRef } from \"react\"\nimport { useUidex } from \"./hooks\"\n\nexport interface UidexMountProps {\n className?: string\n}\n\nexport function UidexMount({ className }: UidexMountProps) {\n const uidex = useUidex()\n const ref = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n const node = ref.current\n if (!node) return\n uidex.mount(node)\n return () => {\n uidex.unmount()\n }\n }, [uidex])\n\n return <div ref={ref} className={className} data-uidex-mount=\"\" />\n}\n","import { createElement, type ComponentType } from \"react\"\nimport { createRoot } from \"react-dom/client\"\nimport type { EntityRef } from \"../../shared/entities\"\nimport type { View, ViewContext, ViewPalette } from \"../../browser/views\"\nimport type { ViewSurface } from \"../../browser/views/core/surface\"\n\nexport interface ReactViewDef {\n id: string\n matches?: (ref: EntityRef) => boolean\n palette?: ViewPalette\n component: ComponentType<{ ctx: ViewContext }>\n}\n\nconst EMPTY_SURFACE: ViewSurface = {\n kind: \"detail\",\n entityKind: \"element\",\n}\n\nexport function createReactView(def: ReactViewDef): View {\n return {\n id: def.id,\n matches: def.matches,\n palette: def.palette,\n surface: () => EMPTY_SURFACE,\n render(ctx, root) {\n const reactRoot = createRoot(root)\n reactRoot.render(createElement(def.component, { ctx }))\n return () => reactRoot.unmount()\n },\n }\n}\n","\"use client\"\n\nimport { clsx } from \"clsx\"\nimport {\n Circle,\n FileText,\n LayoutGrid,\n LayoutPanelTop,\n MousePointerClick,\n Route as RouteIcon,\n Sparkles,\n Workflow,\n type LucideIcon,\n} from \"lucide-react\"\nimport type { ReactElement } from \"react\"\nimport { twMerge } from \"tailwind-merge\"\nimport { KIND_STYLE, type EntityKind } from \"../../shared/entities\"\n\nconst REACT_ICONS: Record<EntityKind, LucideIcon> = {\n route: RouteIcon,\n page: FileText,\n feature: Sparkles,\n widget: LayoutGrid,\n region: LayoutPanelTop,\n element: MousePointerClick,\n primitive: Circle,\n flow: Workflow,\n}\n\nexport interface KindChipProps {\n kind: EntityKind\n label?: string\n withKindName?: boolean\n className?: string\n}\n\nexport function KindChip({\n kind,\n label,\n withKindName,\n className,\n}: KindChipProps): ReactElement {\n const style = KIND_STYLE[kind]\n const Icon = REACT_ICONS[kind]\n const text = withKindName\n ? label\n ? `${style.label} · ${label}`\n : style.label\n : label\n return (\n <span\n data-uidex-kind-chip={kind}\n className={twMerge(\n clsx(\n \"text-muted-foreground inline-flex items-center gap-1.5 text-xs font-medium\",\n className\n )\n )}\n >\n <Icon\n aria-hidden=\"true\"\n className={twMerge(clsx(\"h-4 w-4 shrink-0\", style.tone))}\n />\n {text ? <span className=\"truncate\">{text}</span> : null}\n </span>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport {\n createUidex,\n type CreateUidexOptions,\n type Uidex,\n} from \"../../browser/create-uidex\"\nimport type { Registry } from \"../../shared/entities\"\nimport { UidexContext } from \"./provider\"\nimport { UidexMount } from \"./mount\"\n\nexport interface UidexDevtoolsProps {\n /**\n * Populates the entity registry (typically `loadRegistry` from `uidex.gen.ts`).\n * Must be idempotent: it is called once per created instance, and under React\n * StrictMode the effect runs setup→cleanup→setup, so it may be invoked against\n * a short-lived instance that is discarded before mount.\n */\n loadRegistry: (target: Registry) => Registry\n /**\n * Optional deferred hydration — populate the registry with data that need not\n * be present at mount (typically the thin element/region source locations from\n * `uidex.gen.locs.ts`, dynamic-imported so they land in a separate chunk). Run\n * on an idle callback after mount, so the initial devtools chunk stays small\n * and the copy-source-path metadata streams in shortly after. Idempotent, like\n * `loadRegistry`.\n */\n loadDeferred?: (target: Registry) => void | Promise<void>\n config?: CreateUidexOptions\n}\n\nexport function UidexDevtools({\n loadRegistry,\n loadDeferred,\n config,\n}: UidexDevtoolsProps) {\n const [instance, setInstance] = useState<Uidex | null>(null)\n\n // Mount-once: the devtools instance is built from the initial props and not\n // rebuilt on later `config`/`loadRegistry` changes. Depending on `config`\n // (a fresh object literal each render) would remount the surface on every\n // render, so the empty dep array is intentional, not an oversight.\n useEffect(() => {\n const inst = createUidex({ ...config })\n loadRegistry(inst.registry)\n setInstance(inst)\n let cancelled = false\n if (loadDeferred) {\n const run = () => {\n // Best-effort: the deferred data (element/region source locations) is\n // non-essential — the inspector degrades gracefully without it — so a\n // failed load must not surface as an unhandled promise rejection.\n if (!cancelled)\n Promise.resolve(loadDeferred(inst.registry)).catch(() => {})\n }\n // Defer to idle so the thin loc data lands after the surface is interactive.\n if (typeof requestIdleCallback === \"function\") requestIdleCallback(run)\n else setTimeout(run, 0)\n }\n return () => {\n cancelled = true\n inst.unmount()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n if (!instance) return null\n\n return (\n <UidexContext.Provider value={instance}>\n <UidexMount />\n </UidexContext.Provider>\n )\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["RouteIcon","import_vanilla","import_vanilla","ref","import_lucide","el","svg","createLucideElement","render","ref","el","import_lucide","mode","createLucideElement","ref","import_lit_html","import_lucide","el","import_lucide","svg","createLucideElement","ref","connect","machine","hasTagFn","import_types","idx","import_lucide","icon","svg","createLucideElement","ref","staticHtml","ref","import_lucide","el","frag","el","scrollArea","scrollArea","import_lucide","applyProps","sameRef","shell","viewActions","render","COMMAND_PALETTE_ENTRY","ref","import_lucide","ref","createLucideElement","ref","el","ref","ref","ref","COMMAND_PALETTE_ENTRY","import_lucide","toItem","ref","COMMAND_PALETTE_ENTRY","createLucideElement","ref","toItem","ref","COMMAND_PALETTE_ENTRY","import_lucide","COMMAND_PALETTE_ENTRY","createLucideElement","ref","el","import_react","import_react","import_jsx_runtime","ref","import_react","import_clsx","import_tailwind_merge","import_jsx_runtime","RouteIcon","import_react","import_jsx_runtime"]}