isotone 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/tooltips.ts","../src/react/IterationPanel.tsx","../src/react/appearance.ts","../src/react/motion.ts","../src/react/feedback-layout.ts","../src/react/pill-active.ts","../src/react/UpdateNotice.tsx","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toKebabCase.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toLucideIconData.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toCamelCase.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toPascalCase.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/mergeClasses.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/build/defaultAttributes.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/build/buildLucideIconNode.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/build/buildLucideIconForReact.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/hasA11yProp.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/context.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/Icon.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/arrow-up.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/check.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/chevron-down.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/crosshair.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/gem.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/message-square.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/rotate-ccw.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/sliders-horizontal.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/trash.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/x.ts","../src/react/icons.tsx","../src/react/styles.ts","../src/react/VariantsView.tsx","../src/react/useLayoutMotion.ts","../src/react/theme.ts","../src/react/NoteSummary.tsx","../src/react/useDockMotion.ts","../src/react/IterationMount.tsx"],"sourcesContent":["import type { PointerEvent } from 'react';\n\n/** Measure on hover so long lists need no observers or eager layout reads. */\nexport function showOverflowTitle(event: PointerEvent<HTMLElement>) {\n const label = event.currentTarget;\n if (label.scrollWidth > label.clientWidth) label.title = label.textContent?.trim() ?? '';\n else label.removeAttribute('title');\n}\n","import { showOverflowTitle } from './tooltips';\nimport { FEEDBACK_STORAGE_KEY, readBrowserStorage, removeBrowserStorage, writeBrowserStorage } from '../core/browser-storage';\nimport { MAX_FEEDBACK_LENGTH } from '../core/limits';\nimport { createNoteId } from '../core/id';\nimport { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n createIterationStore,\n describeIterationElement,\n elementAsNode,\n isRouteVisible,\n type IterationElement,\n type IterationNote,\n type IterationStoreConfig,\n type RouteGateOptions,\n type VariantReference,\n} from '../core/index';\nimport { type VariantAction, type VariantsSource, visibleAxes } from '../core/variants';\nimport { ensurePanelStyles } from './styles';\nimport { refreshSource, useVariantsSource, VariantsView } from './VariantsView';\nimport { detectTheme, observeTheme, type IterationTheme } from './theme';\nimport { NoteSummary } from './NoteSummary';\nimport { Icon } from './icons';\nimport { useLayoutMotion } from './useLayoutMotion';\nimport { useDockMotion } from './useDockMotion';\nimport { UpdateNotice } from './UpdateNotice';\n\nexport interface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\nexport interface IterationShortcut {\n /** Physical key code, stable across keyboard layouts. Default: Period. */\n code: string;\n mod?: boolean;\n shift?: boolean;\n alt?: boolean;\n}\nexport interface IterationPanelProps {\n /** Auto follows the page at the dock. System follows the OS preference. */\n theme?: IterationTheme;\n /** Local adapter endpoint for an optional, nonblocking update notice. */\n updateEndpoint?: string;\n route: string;\n store: IterationStoreConfig;\n rule?: RouteGateOptions;\n getPayload?: () => unknown;\n variants?: VariantsSource;\n /** Initial surface. Kept for compatibility; surfaces can now open together. */\n defaultTab?: 'variants' | 'notes';\n /** Default: Cmd/Ctrl+Shift+Period. false disables the shortcut. */\n shortcut?: IterationShortcut | false;\n}\nconst DEFAULT_SHORTCUT: IterationShortcut = {\n code: 'Period',\n mod: true,\n shift: true,\n};\n\nexport function IterationPanel({\n route,\n theme: themePreference = 'auto',\n updateEndpoint,\n store: storeCfg,\n rule,\n getPayload,\n variants,\n defaultTab = 'notes',\n shortcut = DEFAULT_SHORTCUT,\n}: IterationPanelProps) {\n const [store] = useState(() => createIterationStore(storeCfg));\n const nsKey = storeCfg.key ?? FEEDBACK_STORAGE_KEY;\n const [notesOpen, setNotesOpen] = useState(false);\n const [variantsOpen, setVariantsOpen] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [picking, setPicking] = useState(false);\n const [targets, setTargets] = useState<IterationElement[]>([]);\n const [variantTarget, setVariantTarget] = useState<VariantReference | null>(\n null,\n );\n const [hoverRect, setHoverRect] = useState<Rect | null>(null);\n const [rects, setRects] = useState<(Rect & { selector: string })[]>([]);\n const [text, setText] = useState('');\n const [notes, setNotes] = useState<IterationNote[]>([]);\n const noteRevision = useRef(0);\n const pendingWrites = useRef(0);\n const noteRequest = useRef(0);\n const [editing, setEditing] = useState<IterationNote | null>(null);\n const [unsynced, setUnsynced] = useState(false);\n const [notice, setNotice] = useState('');\n const [theme, setTheme] = useState(() => detectTheme(themePreference));\n const [instant, setInstant] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const focusFrame = useRef(0);\n useEffect(() => () => cancelAnimationFrame(focusFrame.current), []);\n const listRef = useRef<HTMLUListElement>(null);\n useLayoutMotion(listRef, notes, notesOpen);\n const fabRef = useRef<HTMLButtonElement>(null);\n const previousFocus = useRef<HTMLElement | null>(null);\n const draftRestored = useRef('');\n const restoringDraft = useRef(false);\n const id = useId();\n const notesAvailable = Boolean(storeCfg.endpoint);\n useVariantsSource(variants);\n const variantsAvailable = Boolean(\n variants &&\n visibleAxes(variants.getAxes(), variants.getSelections()).length,\n );\n const visible =\n isRouteVisible(route, rule) &&\n (notesAvailable || variantsAvailable || variantsOpen);\n const hasContext = Boolean(editing || variantTarget || targets.length || notice || unsynced);\n // Context changes the scroll-through inset; measure again when that changes\n // or a route restores the composer after its DOM was removed.\n // biome-ignore lint/correctness/useExhaustiveDependencies: hasContext changes the CSS inset used by scrollHeight.\n useLayoutEffect(() => {\n const field = textareaRef.current;\n if (!field || !notesOpen || !visible) return;\n const resize = () => {\n field.style.height = '0px';\n field.style.height = `${text ? Math.max(24, field.scrollHeight) : 24}px`;\n field.dataset.scrolled = String(field.scrollTop > 0);\n };\n resize();\n if (typeof ResizeObserver === 'undefined') return;\n let width = field.clientWidth;\n const observer = new ResizeObserver(() => {\n if (field.clientWidth !== width) { width = field.clientWidth; resize(); }\n });\n observer.observe(field);\n return () => observer.disconnect();\n }, [text, notesOpen, visible, hasContext]);\n useEffect(() => {\n if (!visible) {\n setHovered(false);\n setFocused(false);\n setExpanded(false);\n return;\n }\n const root = rootRef.current;\n if (!root) return;\n // Native enter/leave survive transitions from a host React tree into our shadow root.\n const enter = (event: PointerEvent) => {\n if ((event.pointerType === 'mouse' || event.pointerType === 'pen') && event.buttons === 0) {\n root.setAttribute('data-instant', 'false');\n setInstant(false);\n setHovered(true);\n }\n };\n const leave = () => { setHovered(false); setExpanded(false); };\n root.addEventListener('pointerenter', enter);\n root.addEventListener('pointerleave', leave);\n return () => {\n root.removeEventListener('pointerenter', enter);\n root.removeEventListener('pointerleave', leave);\n };\n }, [visible]);\n useDockMotion(rootRef, visible);\n const open = notesOpen || variantsOpen;\n const railOpen = expanded || hovered || (focused && instant) || open || picking;\n useEffect(() => {\n if (!railOpen || !instant) return;\n const active = (rootRef.current?.getRootNode() as Document | ShadowRoot)?.activeElement;\n if (active === fabRef.current) rootRef.current?.querySelector<HTMLButtonElement>('.isotone-rail-button')?.focus();\n }, [railOpen, instant]);\n const draftKey = `${nsKey}::draft::${route}`;\n const visibleNotes = useMemo(() => notes\n .filter((n) => !n.done)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt)), [notes]);\n const pendingActions = useMemo(() => notes.flatMap(n =>\n !n.done && n.route === route && n.variantAction ? [n.variantAction] : []), [notes, route]);\n const shortcutLabel = shortcut\n ? [\n shortcut.mod ? '⌘/Ctrl' : '',\n shortcut.alt ? 'Alt' : '',\n shortcut.shift ? 'Shift' : '',\n shortcut.code === 'Period' ? '.' : shortcut.code.replace(/^Key/, ''),\n ]\n .filter(Boolean)\n .join('+')\n : '';\n\n function loadNotes() {\n if (!notesAvailable) return;\n const request = ++noteRequest.current;\n const revision = noteRevision.current;\n void store\n .listNotes()\n .then((fresh) => {\n // An old refresh must not restore deleted notes or undo optimistic edits.\n if (request !== noteRequest.current || revision !== noteRevision.current || pendingWrites.current) return;\n setNotes(fresh);\n setUnsynced(store.hasUnsyncedNotes);\n })\n .catch(() => {});\n }\n function beginNoteWrite() {\n noteRevision.current++;\n pendingWrites.current++;\n return () => {\n noteRevision.current++;\n pendingWrites.current--;\n };\n }\n const focusComposer = useCallback(() => {\n cancelAnimationFrame(focusFrame.current);\n focusFrame.current = requestAnimationFrame(() =>\n textareaRef.current?.focus(),\n );\n }, []);\n function closeAll() {\n cancelAnimationFrame(focusFrame.current);\n setNotesOpen(false);\n setVariantsOpen(false);\n setPicking(false);\n setExpanded(false);\n setHovered(false);\n (previousFocus.current?.isConnected\n ? previousFocus.current\n : fabRef.current\n )?.focus();\n }\n function openInitial() {\n previousFocus.current = document.activeElement as HTMLElement | null;\n setExpanded(true);\n if ((defaultTab === 'variants' || !notesAvailable) && variantsAvailable)\n setVariantsOpen(true);\n else {\n setNotesOpen(true);\n focusComposer();\n }\n }\n function feedback(reference: VariantReference) {\n setVariantTarget(reference);\n setNotesOpen(true);\n setExpanded(true);\n focusComposer();\n }\n async function queueRemoval(action: VariantAction, reference: VariantReference) {\n const description = action.action === 'remove-option'\n ? `Remove “${reference.optionLabel}” from ${reference.label}.`\n : action.action === 'keep-default'\n ? `Keep only the default for ${reference.label}; remove its selector and alternatives.`\n : `Remove ${reference.label}, its selector and all alternatives.`;\n const feedback = `[${action.action}] ${description}`;\n const context = { variant: reference, variantAction: action };\n const finish = beginNoteWrite();\n try {\n const savedId = await store.saveNote(route, feedback, null, null, getPayload?.(),\n { w: innerWidth, h: innerHeight }, context);\n setNotes(prev => [...prev, { id: savedId, route, feedback, element: null,\n done: false, createdAt: new Date().toISOString(), ...context }]);\n setUnsynced(store.hasUnsyncedNotes);\n setNotesOpen(true);\n } finally {\n finish();\n }\n }\n function cancelEdit() {\n setEditing(null);\n setText('');\n setTargets([]);\n setVariantTarget(null);\n }\n\n async function send() {\n const value = text.trim();\n if (!value) return;\n if (value.length > MAX_FEEDBACK_LENGTH) {\n setNotice(`Feedback must be at most ${MAX_FEEDBACK_LENGTH} characters.`);\n return;\n }\n const context = { elements: targets, variant: variantTarget, ...(editing?.variantAction ? { variantAction: editing.variantAction } : {}) };\n const noteRoute = editing?.route ?? route;\n const element = targets[0] ?? null;\n const tempId = editing?.id ?? `pending-${createNoteId()}`;\n const entry: IterationNote = {\n ...(editing ?? {}),\n id: tempId,\n route: noteRoute,\n feedback: value,\n element,\n ...context,\n done: false,\n createdAt: editing?.createdAt ?? new Date().toISOString(),\n };\n const payload = editing ? undefined : getPayload?.();\n const previous = editing;\n const finish = beginNoteWrite();\n setNotes((prev) =>\n previous\n ? prev.map((n) => (n.id === tempId ? entry : n))\n : [...prev, entry],\n );\n cancelEdit();\n setNotice('');\n focusComposer();\n try {\n const savedId = await store.saveNote(\n noteRoute,\n value,\n element,\n previous?.id ?? null,\n payload,\n { w: innerWidth, h: innerHeight },\n context,\n );\n setNotes((prev) =>\n prev.map((n) => (n.id === tempId ? { ...n, id: savedId } : n)),\n );\n setUnsynced(store.hasUnsyncedNotes);\n } catch {\n setNotes((prev) =>\n previous\n ? prev.map((n) => (n.id === tempId ? previous : n))\n : prev.filter((n) => n.id !== tempId),\n );\n setText(value);\n setTargets(context.elements);\n setVariantTarget(context.variant);\n setEditing(previous);\n setNotice('Could not save. Your feedback is still here.');\n } finally {\n finish();\n }\n }\n function beginEdit(note: IterationNote) {\n setEditing(note);\n setText(note.feedback);\n setTargets(note.elements ?? (note.element ? [note.element] : []));\n setVariantTarget(note.variant ?? null);\n focusComposer();\n }\n async function removeNote(note: IterationNote) {\n const finish = beginNoteWrite();\n setNotes((prev) => prev.filter((n) => n.id !== note.id));\n if (editing?.id === note.id) cancelEdit();\n try {\n await store.deleteNote(note.id);\n } catch {\n setNotes((prev) => [...prev, note]);\n setNotice('Could not delete the note. Try again.');\n } finally {\n finish();\n }\n }\n\n // Reopen/revisit fetches fresh state without a background polling loop.\n // biome-ignore lint/correctness/useExhaustiveDependencies: open-time refresh; store is stable.\n useEffect(() => {\n loadNotes();\n }, [notesOpen, variantsOpen, route]);\n useEffect(() => {\n if (variants && notesOpen && !variantsOpen) refreshSource(variants);\n }, [notesOpen, variantsOpen, variants]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: a network-backed source starts empty.\n useEffect(() => {\n if (variants && !variantsAvailable) refreshSource(variants);\n }, [variants]);\n useEffect(() => {\n if (draftRestored.current === draftKey) return;\n draftRestored.current = draftKey;\n restoringDraft.current = true;\n setEditing(null);\n setText('');\n setTargets([]);\n setVariantTarget(null);\n try {\n const raw = readBrowserStorage(localStorage, draftKey);\n if (!raw) return;\n try {\n const draft = JSON.parse(raw);\n if (draft && typeof draft.text === 'string') {\n setText(draft.text);\n setTargets(Array.isArray(draft.elements) ? draft.elements : []);\n setVariantTarget(draft.variant ?? null);\n } else setText(raw);\n } catch {\n setText(raw);\n }\n } catch {}\n }, [draftKey]);\n useEffect(() => {\n // Restoration commits after this effect pass; never save the previous route's draft over it.\n if (restoringDraft.current) { restoringDraft.current = false; return; }\n if (editing || draftRestored.current !== draftKey) return;\n try {\n if (!text && targets.length === 0 && !variantTarget)\n removeBrowserStorage(localStorage, draftKey);\n else\n writeBrowserStorage(localStorage,\n draftKey,\n JSON.stringify({ text, elements: targets, variant: variantTarget }),\n );\n } catch {}\n }, [text, targets, variantTarget, editing, draftKey]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: scroll follows new notes.\n useEffect(() => {\n const el = listRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }, [notes, notesOpen]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-sample the surrounding page when opened.\n useLayoutEffect(() => {\n if (!visible) return;\n const root = rootRef.current?.getRootNode();\n if (root instanceof ShadowRoot || root instanceof Document)\n ensurePanelStyles(root);\n return observeTheme(setTheme, themePreference);\n }, [visible, open, route, themePreference]);\n\n // Capture phase still works while typing. Browser/OS-reserved chords never reach a page.\n useEffect(() => {\n if (!visible) return;\n const onKey = (e: KeyboardEvent) => {\n rootRef.current?.setAttribute('data-instant', 'true');\n setInstant(true);\n if (!shortcut || e.repeat || e.isComposing) return;\n if (\n e.code !== shortcut.code ||\n Boolean(e.metaKey || e.ctrlKey) !== Boolean(shortcut.mod) ||\n e.shiftKey !== Boolean(shortcut.shift) ||\n e.altKey !== Boolean(shortcut.alt)\n )\n return;\n e.preventDefault();\n e.stopImmediatePropagation();\n if (\n notesOpen &&\n textareaRef.current ===\n (rootRef.current?.getRootNode() as Document | ShadowRoot)\n ?.activeElement\n )\n closeAll();\n else if (notesAvailable) {\n if (!open)\n previousFocus.current = document.activeElement as HTMLElement;\n setNotesOpen(true);\n setExpanded(true);\n setPicking(false);\n focusComposer();\n } else setVariantsOpen((v) => !v);\n };\n const onPointer = () => {\n rootRef.current?.setAttribute('data-instant', 'false');\n setInstant(false);\n };\n window.addEventListener('keydown', onKey, true);\n window.addEventListener('pointerdown', onPointer, true);\n return () => {\n window.removeEventListener('keydown', onKey, true);\n window.removeEventListener('pointerdown', onPointer, true);\n };\n });\n\n useEffect(() => {\n if (!open || picking) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || e.defaultPrevented) return;\n if (editing) cancelEdit();\n else closeAll();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n });\n\n useEffect(() => {\n if (!picking) return;\n const cursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n let frame = 0;\n const elementAt = (e: MouseEvent) => {\n const el = e.detail === 0 && e.type === 'click'\n ? e.composedPath().find((node): node is Element => node instanceof Element)\n : document.elementFromPoint(e.clientX, e.clientY);\n return el && !el.closest('[data-isotone]') ? el : null;\n };\n const onMove = (e: MouseEvent) => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const el = elementAt(e);\n setHoverRect(el ? el.getBoundingClientRect() : null);\n });\n };\n const toggleTarget = (el: Element) => {\n const target = describeIterationElement(elementAsNode(el));\n setTargets((prev) =>\n prev.some((t) => t.selector === target.selector)\n ? prev.filter((t) => t.selector !== target.selector)\n : prev.length < 50\n ? [...prev, target]\n : prev,\n );\n };\n const onClick = (e: MouseEvent) => {\n const el = elementAt(e);\n if (!el) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n toggleTarget(el);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === ' ') {\n const el = e.composedPath().find((node): node is Element => node instanceof Element);\n if (!el || el === document.body || el.closest('[data-isotone], input, textarea, select, [contenteditable]')) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n if (!e.repeat) toggleTarget(el);\n return;\n }\n if (e.key !== 'Escape' && e.key !== 'Enter') return;\n // Enter in the composer sends; picking finishes only from the page.\n if (\n e.composedPath().includes(textareaRef.current as EventTarget) &&\n e.key === 'Enter'\n )\n return;\n e.preventDefault();\n e.stopImmediatePropagation();\n setPicking(false);\n setNotesOpen(true);\n focusComposer();\n };\n window.addEventListener('mousemove', onMove, true);\n window.addEventListener('click', onClick, true);\n window.addEventListener('keydown', onKey, true);\n return () => {\n document.body.style.cursor = cursor;\n cancelAnimationFrame(frame);\n setHoverRect(null);\n window.removeEventListener('mousemove', onMove, true);\n window.removeEventListener('click', onClick, true);\n window.removeEventListener('keydown', onKey, true);\n };\n }, [picking, focusComposer]);\n useEffect(() => {\n if (!picking) {\n setRects([]);\n return;\n }\n let frame: number | undefined;\n const update = () => {\n frame = undefined;\n setRects(\n targets.flatMap((t) => {\n try {\n const el = document.querySelector(t.selector);\n if (!el) return [];\n const r = el.getBoundingClientRect();\n return [\n {\n top: r.top,\n left: r.left,\n width: r.width,\n height: r.height,\n selector: t.selector,\n },\n ];\n } catch {\n return [];\n }\n }),\n );\n };\n const schedule = () => { frame ??= requestAnimationFrame(update); };\n update();\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n return () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n };\n }, [targets, picking]);\n\n const variantsPanel = variants && (\n <section\n id={`${id}-variants`}\n role=\"dialog\"\n aria-label=\"Iteration variants\"\n className=\"isotone-panel isotone-variants-panel\"\n data-open={variantsOpen}\n aria-hidden={!variantsOpen}\n ref={node => { node?.toggleAttribute('inert', !variantsOpen); }}\n >\n <VariantsView\n source={variants}\n active={variantsOpen}\n onClose={() => { setVariantsOpen(false); setExpanded(false); }}\n onFeedback={notesAvailable ? feedback : undefined}\n onSaved={loadNotes}\n onManage={notesAvailable ? queueRemoval : undefined}\n pendingActions={pendingActions}\n />\n </section>\n );\n const notesPanel = notesAvailable && (\n <section\n id={`${id}-notes`}\n role=\"dialog\"\n aria-label=\"Iteration feedback\"\n className=\"isotone-panel isotone-notes-panel\"\n data-open={notesOpen}\n aria-hidden={!notesOpen}\n ref={node => { node?.toggleAttribute('inert', !notesOpen); }}\n >\n <div className=\"isotone-panel-head\">\n <h2>\n Feedback{' '}\n <span className=\"isotone-count\">\n {visibleNotes.length || ''}\n </span>\n </h2>\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label=\"Close feedback\"\n title=\"Close feedback\"\n onClick={() => {\n setNotesOpen(false);\n setExpanded(false);\n setPicking(false);\n }}\n >\n <Icon name=\"close\" />\n </button>\n </div>\n <ul ref={listRef} className=\"isotone-list\">\n {visibleNotes.map((note) => (\n <li\n key={note.id}\n data-motion-key={note.id}\n className={`isotone-note${editing?.id === note.id ? ' isotone-note-editing' : ''}`}\n >\n <button\n type=\"button\"\n className=\"isotone-note-hit\"\n aria-current={editing?.id === note.id ? true : undefined}\n onClick={() => beginEdit(note)}\n >\n <NoteSummary note={note} />\n </button>\n <button\n type=\"button\"\n className=\"isotone-x isotone-icon\"\n aria-label={note.variantAction ? 'Cancel removal' : 'Delete note'}\n title={note.variantAction ? 'Cancel removal' : 'Delete note'}\n onClick={() => void removeNote(note)}\n >\n <Icon name=\"close\" size={12} />\n </button>\n </li>\n ))}\n </ul>\n <div className=\"isotone-compose\">\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: This extends the native textarea's pointer area; keyboard users focus the textarea directly. */}\n <fieldset\n className=\"isotone-input\"\n aria-label=\"Feedback composer\"\n onClick={(event) => {\n if (event.defaultPrevented || event.button !== 0) return;\n const target = event.target as Element;\n if (target.closest('button, textarea, input, select, a, [contenteditable=\"true\"]')) return;\n textareaRef.current?.focus({ preventScroll: true });\n }}\n >\n <div className=\"isotone-context\" aria-live=\"polite\">\n {editing && (\n <span className=\"isotone-chip\">\n Editing note\n <button\n type=\"button\"\n aria-label=\"Cancel edit\"\n title=\"Cancel edit\"\n onClick={cancelEdit}\n >\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n )}\n {variantTarget && (\n <span className=\"isotone-chip\">\n <Icon name=\"sliders\" size={12} />\n <span onPointerOver={showOverflowTitle}>\n {variantTarget.label}\n {variantTarget.optionLabel\n ? ` / ${variantTarget.optionLabel}`\n : ''}\n </span>\n {!editing?.variantAction && <button\n type=\"button\"\n aria-label=\"Remove variant reference\"\n title=\"Remove reference\"\n onClick={() => setVariantTarget(null)}\n >\n <Icon name=\"close\" size={12} />\n </button>}\n </span>\n )}\n {targets.map((target, index) => (\n <span\n key={target.selector}\n className=\"isotone-chip\"\n >\n <span onPointerOver={showOverflowTitle}>{target.text || target.tag}</span>\n <button\n type=\"button\"\n aria-label={`Remove pinned element ${index + 1}`}\n title=\"Unpin element\"\n onClick={() =>\n setTargets((prev) =>\n prev.filter((t) => t.selector !== target.selector),\n )\n }\n >\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n ))}\n {(notice || unsynced) && (\n <p role=\"status\" className=\"isotone-notice\">\n {notice ||\n 'Saved in this browser. It will sync when the dev server returns.'}\n </p>\n )}\n </div>\n <textarea\n ref={textareaRef}\n value={text}\n aria-label=\"Feedback for the agent\"\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setPicking(false)}\n onScroll={event => {\n event.currentTarget.dataset.scrolled = String(event.currentTarget.scrollTop > 0);\n }}\n onKeyDown={(e) => {\n if (\n e.key === 'Enter' &&\n !e.shiftKey &&\n !e.nativeEvent.isComposing\n ) {\n e.preventDefault();\n void send();\n }\n }}\n placeholder={\n targets.length || variantTarget\n ? 'Feedback on your selection…'\n : 'What would you change?'\n }\n rows={1}\n className=\"isotone-textarea\"\n />\n <div className=\"isotone-toolbar\">\n <button\n type=\"button\"\n title=\"Select elements\"\n aria-label=\"Select elements\"\n aria-pressed={picking}\n className=\"isotone-pick isotone-icon\"\n onClick={() => {\n cancelAnimationFrame(focusFrame.current);\n setPicking((v) => !v);\n }}\n >\n <Icon name=\"pin\" size={14} />\n </button>\n {picking && <span className=\"isotone-key-hint\">Click or Space to pin · Enter to finish</span>}\n <button\n type=\"button\"\n aria-label={editing ? 'Save edit' : 'Send note'}\n disabled={!text.trim()}\n className=\"isotone-send\"\n title={editing ? 'Save edit (Enter)' : 'Send note (Enter)'}\n onClick={() => void send()}\n >\n <Icon name=\"send\" size={14} />\n </button>\n </div>\n </fieldset>\n </div>\n </section>\n );\n if (!visible) return null;\n return (\n <div\n ref={rootRef}\n data-isotone\n data-theme={theme}\n data-expanded={railOpen}\n data-tools={Number(Boolean(variants)) + Number(notesAvailable)}\n data-instant={instant}\n data-notes-open={notesOpen}\n data-open={open}\n className=\"isotone-root\"\n >\n <div className=\"isotone-rail-track\" aria-hidden=\"true\" />\n {picking && (\n <div className=\"isotone-hint\" data-isotone>\n <span>{targets.length} selected · click to add or remove</span>\n <button\n type=\"button\"\n onClick={() => {\n setPicking(false);\n focusComposer();\n }}\n >\n Done <kbd>↵</kbd>\n </button>\n </div>\n )}\n {picking &&\n [\n ...rects,\n ...(hoverRect\n ? [\n {\n top: hoverRect.top,\n left: hoverRect.left,\n width: hoverRect.width,\n height: hoverRect.height,\n selector: '__hover',\n },\n ]\n : []),\n ].map((rect, i) => (\n <div\n key={rect.selector}\n data-isotone\n className={`isotone-hover${i < rects.length ? ' isotone-selected' : ''}`}\n style={{\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }}\n />\n ))}\n <UpdateNotice endpoint={updateEndpoint} active={open} />\n <fieldset\n aria-label=\"Isotone tools\"\n onKeyDown={event => {\n if (!(event.target as HTMLElement).classList.contains('isotone-rail-button')) return;\n if (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const buttons = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>('.isotone-rail-button'));\n const at = buttons.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home' ? 0 : event.key === 'End' ? buttons.length - 1 : (at + (['ArrowUp', 'ArrowLeft'].includes(event.key) ? -1 : 1) + buttons.length) % buttons.length;\n buttons[next]?.focus();\n }}\n className=\"isotone-rail\"\n data-expanded={railOpen}\n data-tools={Number(Boolean(variants)) + Number(notesAvailable)}\n onFocus={() => setFocused(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget)) setFocused(false);\n }}\n >\n <div\n className=\"isotone-rail-tools\"\n aria-hidden={!railOpen}\n ref={node => { node?.toggleAttribute('inert', !railOpen); }}\n >\n {variants && (\n <button\n type=\"button\"\n className=\"isotone-rail-button\"\n aria-label=\"Variants\"\n title=\"Variants\"\n aria-controls={`${id}-variants`}\n aria-expanded={variantsOpen}\n onClick={() => {\n setVariantsOpen((v) => !v);\n setExpanded(false);\n }}\n >\n <Icon name=\"sliders\" /><span className=\"isotone-tool-label\">Variants</span>\n </button>\n )}\n {variantsPanel}\n {notesPanel}\n {notesAvailable && (\n <button\n type=\"button\"\n className=\"isotone-rail-button\"\n aria-label=\"Feedback\"\n title=\"Feedback\"\n aria-controls={`${id}-notes`}\n aria-expanded={notesOpen}\n onClick={() => {\n setNotesOpen((v) => !v);\n setExpanded(false);\n if (!notesOpen) focusComposer();\n }}\n >\n <Icon name=\"message\" /><span className=\"isotone-tool-label\">Feedback <span className=\"isotone-count\">{visibleNotes.length || \"\"}</span></span>\n </button>\n )}\n </div>\n <button\n type=\"button\"\n ref={fabRef}\n className=\"isotone-fab\"\n aria-hidden={railOpen}\n tabIndex={railOpen ? -1 : 0}\n aria-label={notesAvailable ? 'Isotone' : 'Variants'}\n title={`Isotone${shortcutLabel ? ` · ${shortcutLabel}` : ''}`}\n aria-expanded={railOpen}\n onClick={() => {\n if (open) closeAll();\n else if (expanded) setExpanded(false);\n else openInitial();\n }}\n >\n <Icon name=\"iterate\" />\n {visibleNotes.length > 0 && (\n <span className=\"isotone-badge\">{visibleNotes.length}</span>\n )}\n </button>\n </fieldset>\n </div>\n );\n}\n","/**\n * Paint only. Layout, typography, hit targets and state selectors live in styles.ts.\n * Both themes implement the same palette contract and share one Instrument\n * material recipe. Layout and interaction never fork with the page theme.\n */\nconst darkPalette = {\n bg: 'var(--iso-zinc-900)', raised: 'var(--iso-zinc-800)', well: 'var(--iso-zinc-950)',\n line: 'var(--iso-zinc-800)', edge: 'var(--iso-zinc-700)',\n fg: 'var(--iso-zinc-200)', muted: 'var(--iso-zinc-400)',\n faint: 'color-mix(in oklch, var(--iso-zinc-400) 70%, var(--iso-zinc-500))',\n hover: 'var(--iso-zinc-800)',\n 'hover-shadow': 'none', 'icon-rest': 'var(--iso-muted)', 'launcher-ink': 'var(--iso-fg)',\n danger: '#f29188', focus: 'var(--iso-zinc-400)', 'selected-edge': 'var(--iso-zinc-400)',\n shadow: '0 12px 40px #0004, 0 2px 6px #0003, 0 0 0 1px var(--iso-line)',\n 'panel-shadow': '0 8px 24px #0003, 0 2px 4px #0002',\n 'shadow-near': '#0004', 'shadow-deep': '#0005', 'shadow-contact': '#0007',\n 'shade-soft': '#0003', 'shade-inset': '#0005',\n bevel: 'color-mix(in oklch, var(--iso-zinc-200) 18%, transparent)',\n 'surface-face': 'linear-gradient(color-mix(in oklch, var(--iso-bg), var(--iso-zinc-200) 3%), var(--iso-bg))',\n 'key-face': 'linear-gradient(color-mix(in oklch, var(--iso-raised), var(--iso-zinc-200) 7%), var(--iso-raised))',\n 'key-hover-face': 'linear-gradient(color-mix(in oklch, var(--iso-raised), var(--iso-zinc-200) 10%), color-mix(in oklch, var(--iso-raised), var(--iso-zinc-200) 3%))',\n 'key-shadow': 'inset 0 1px 0 color-mix(in oklch, var(--iso-zinc-200) 20%, transparent), inset 0 -1px 0 #0003, 0 0 0 1px var(--iso-edge), 0 2px 2px #0006',\n 'key-hover-shadow': 'var(--iso-key-shadow)',\n 'label-lift-shadow': '0 1px 2px var(--iso-shadow-deep)',\n 'contact-lift-shadow': '0 2px 2px var(--iso-shadow-contact)',\n 'surface-elevation': '0 3px 0 var(--iso-shadow-deep), 0 12px 24px var(--iso-shadow-deep)',\n 'well-shadow': 'inset 0 1px 3px #0005, 0 1px 0 var(--iso-line)',\n 'range-face': 'linear-gradient(var(--iso-zinc-300), var(--iso-zinc-400))',\n 'range-highlight': 'var(--iso-zinc-200)',\n 'pick-line': '#81aaff', 'pick-fill': '#78aaff1a', 'pick-selected-fill': '#78aaff0f',\n};\ntype Palette = Record<keyof typeof darkPalette, string>;\nexport const PALETTES = {\n dark: darkPalette,\n // Gray means recessed. White faces with a crisp border/contact shadow mean\n // raised, including persistent selections. Hover preserves each material.\n light: {\n bg: '#fff', raised: '#fff', well: 'var(--iso-zinc-100)',\n line: 'var(--iso-zinc-200)', edge: 'var(--iso-zinc-300)',\n fg: 'var(--iso-zinc-900)', muted: 'var(--iso-zinc-600)', faint: 'var(--iso-zinc-500)',\n hover: '#fff',\n 'hover-shadow': 'inset 0 0 0 1px var(--iso-line)', 'icon-rest': 'var(--iso-zinc-500)', 'launcher-ink': 'var(--iso-muted)',\n danger: '#b42332', focus: 'var(--iso-zinc-600)',\n 'selected-edge': 'color-mix(in oklch, var(--iso-zinc-300) 75%, var(--iso-zinc-400))',\n shadow: '0 0 0 1px var(--iso-line), 0 2px 0 var(--iso-line)',\n 'panel-shadow': '0 2px 0 var(--iso-line)',\n 'shadow-near': 'var(--iso-line)', 'shadow-deep': 'var(--iso-edge)', 'shadow-contact': 'var(--iso-edge)',\n 'shade-soft': '#00000006', 'shade-inset': '#00000008',\n bevel: '#fffffff2',\n 'surface-face': '#fff',\n 'key-face': 'var(--iso-raised)',\n 'key-hover-face': 'var(--iso-key-face)',\n 'key-shadow': '0 0 0 1px var(--iso-edge), 0 2px 0 var(--iso-edge)',\n 'key-hover-shadow': '0 0 0 1px var(--iso-selected-edge), 0 2px 0 var(--iso-selected-edge)',\n 'label-lift-shadow': '0 1px 0 var(--iso-edge)',\n 'contact-lift-shadow': '0 2px 0 var(--iso-shadow-contact)',\n 'surface-elevation': '0 2px 0 var(--iso-line)',\n 'well-shadow': 'inset 0 0 0 1px var(--iso-line)',\n 'range-face': 'var(--iso-key-face)', 'range-highlight': '#fff',\n 'pick-line': '#2563eb', 'pick-fill': '#2563eb14', 'pick-selected-fill': '#2563eb0d',\n },\n} satisfies Record<'dark' | 'light', Palette>;\n\n/** Instrument is the single material recipe; themes supply its lighting. */\nexport const INSTRUMENT_MATERIAL = {\n 'rail-base': 'var(--iso-well)', 'rail-base-shadow': 'var(--iso-well-shadow)',\n 'rail-face': 'var(--iso-key-face)', 'rail-face-shadow': 'var(--iso-key-shadow)',\n 'input-border': 'transparent', 'input-shadow': 'var(--iso-well-shadow)',\n 'segment-track-shadow': 'var(--iso-well-shadow)',\n 'control-face': 'var(--iso-key-face)', 'control-hover-face': 'var(--iso-key-hover-face)',\n 'control-shadow': 'var(--iso-key-shadow)', 'control-hover-shadow': 'var(--iso-key-hover-shadow)',\n // Persistent selection is raised, just like an action. Never route it to a well.\n 'selected-face': 'var(--iso-control-face)', 'selected-shadow': 'var(--iso-control-shadow)',\n 'popup-face': 'var(--iso-surface-face)',\n 'popup-shadow': 'inset 0 1px 0 var(--iso-bevel), inset 0 -1px 0 var(--iso-shade-inset), 0 0 0 1px var(--iso-line), var(--iso-surface-elevation)',\n 'thumb-shadow': 'var(--iso-well-shadow)',\n 'thumb-hover-shadow': 'inset 0 0 0 1px var(--iso-edge)',\n 'label-face': 'var(--iso-key-face)', 'label-shadow': 'inset 0 1px 0 var(--iso-bevel), 0 0 0 1px var(--iso-edge), var(--iso-label-lift-shadow)',\n 'range-thumb-face': 'var(--iso-range-face)', 'range-thumb-shadow': 'inset 0 1px 0 var(--iso-range-highlight), 0 0 0 1px var(--iso-edge), var(--iso-contact-lift-shadow)', 'range-radius': '4px',\n 'swatch-radius': '6px', 'swatch-shadow': 'inset 0 1px 0 #fff6, inset 0 -2px 0 var(--iso-shade-soft), 0 0 0 1px var(--iso-edge), 0 2px 0 var(--iso-shadow-contact)',\n // Preserve the represented colour inside the raised selection frame.\n 'swatch-selected-shadow': '0 0 0 2px var(--iso-raised), 0 0 0 3px var(--iso-edge), 0 2px 0 3px var(--iso-shadow-contact)',\n};\n\nexport const PALETTE_TOKEN_NAMES = new Set(\n Object.keys(darkPalette).map(name => `--iso-${name}`),\n);\nfunction tokens(values: Record<string, string>): string {\n return Object.entries(values).map(([name, value]) => `--iso-${name}: ${value};`).join('\\n');\n}\nexport const APPEARANCE_CSS = `\n.isotone-root { ${tokens(PALETTES.dark)} ${tokens(INSTRUMENT_MATERIAL)} }\n.isotone-root[data-theme='light'] { ${tokens(PALETTES.light)} color-scheme: light; }\n`;\n","/** Shared timing for CSS surfaces and transform-only layout motion. */\nexport const MOTION = {\n enter: 200,\n exit: 125,\n reflow: 180,\n easeOut: 'cubic-bezier(.23,1,.32,1)',\n};\n\n// Large review queues stay immediate instead of starting hundreds of animations.\nexport const MAX_ANIMATED_ITEMS = 40;\n","/** A single line per note, with compact references sharing its trailing space. */\nexport const FEEDBACK_LAYOUT_CSS = `\n.isotone-notes-panel {\n --iso-list-height: min(220px, 32dvh);\n --iso-note-padding-y: 6px;\n --iso-note-padding-x: calc(var(--iso-space) - 1px);\n --iso-note-outset: 1px;\n}\n.isotone-note-hit { display: flex; align-items: center; gap: 8px; }\n.isotone-note-hit > p, .isotone-note-hit > .isotone-request-heading { flex: 1; min-width: 0; }\n.isotone-note-hit > .isotone-meta { flex: 0 1 auto; max-width: 42%; margin-top: 0; }\n`;\n","/** Raised highlight with one edge and a crisp one-pixel contact shadow. */\nexport const PILL_ACTIVE_CSS = `\n.isotone-rail-button[aria-expanded='true']::before {\n background: color-mix(in oklch, var(--iso-raised), #fff 8%);\n box-shadow: 0 0 0 1px color-mix(in oklch, var(--iso-edge), var(--iso-fg) 12%), 0 1px 0 var(--iso-shadow-contact);\n}\n`;\n","import { showOverflowTitle } from './tooltips';\nimport { useEffect, useId, useRef, useState } from 'react';\nimport type { UpdateInfo } from '../core/update';\nimport { Icon } from './icons';\n\n/** Read the local adapter's cached result; the browser never contacts npm. */\nexport function UpdateNotice({ endpoint, active }: { endpoint?: string; active: boolean }) {\n const [info, setInfo] = useState<UpdateInfo | null>(null);\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const trigger = useRef<HTMLButtonElement>(null);\n const command = useRef<HTMLInputElement>(null);\n const closeButton = useRef<HTMLButtonElement>(null);\n const id = useId();\n useEffect(() => {\n setOpen(false);\n setInfo(null);\n if (!endpoint || !active) return;\n const controller = new AbortController();\n let retry: ReturnType<typeof setTimeout> | undefined;\n const deadline = setTimeout(() => controller.abort(), 12_000);\n async function read(retried = false) {\n try {\n const response = await fetch(endpoint as string, { signal: controller.signal });\n if (!response.ok) return;\n const next = await response.json() as UpdateInfo;\n if (controller.signal.aborted) return;\n if (next.status === 'checking' && !retried) retry = setTimeout(() => void read(true), 5500);\n if (next.status === 'available' && typeof next.latestVersion === 'string') setInfo(next);\n } catch { /* Updates never interrupt local review work. */ }\n }\n void read();\n return () => { controller.abort(); clearTimeout(retry); clearTimeout(deadline); };\n }, [endpoint, active]);\n useEffect(() => {\n if (open) { setCopied(false); (command.current ?? closeButton.current)?.focus(); }\n }, [open]);\n function close() { setOpen(false); trigger.current?.focus(); }\n async function copy() {\n if (!info?.upgrade) return;\n try { await navigator.clipboard.writeText(info.upgrade.command); setCopied(true); }\n catch { command.current?.focus(); command.current?.select(); }\n }\n if (!active || !info) return null;\n return <div className=\"isotone-update\">\n <button ref={trigger} type=\"button\" className=\"isotone-update-trigger\"\n aria-expanded={open} aria-controls={id} onClick={() => setOpen(value => !value)}>\n Update {info.latestVersion}\n </button>\n {open && <div id={id} role=\"dialog\" aria-label=\"Update Isotone\" className=\"isotone-update-dialog\"\n onKeyDown={event => { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); close(); } }}>\n <div className=\"isotone-menu-title\"><strong>Update available</strong>\n <button ref={closeButton} type=\"button\" className=\"isotone-icon\" aria-label=\"Close update instructions\" title=\"Close update instructions\" onClick={close}><Icon name=\"close\" /></button>\n </div>\n <p>{info.currentVersion} → {info.latestVersion}</p>\n {info.upgrade ? <>\n <p>Run in <span className=\"isotone-update-path\" onPointerOver={showOverflowTitle}>{info.upgrade.cwd}</span></p>\n <input ref={command} aria-label=\"Upgrade command\" readOnly value={info.upgrade.command} onFocus={event => event.currentTarget.select()} />\n <div className=\"isotone-update-actions\"><button type=\"button\" className=\"isotone-secondary\" onClick={() => void copy()}>{copied ? 'Copied' : 'Copy command'}</button><span role=\"status\">{copied ? 'Ready to paste in your terminal' : ''}</span></div>\n <p>Restart the dev server after upgrading.</p>\n </> : <p>{info.message ?? 'Run isotone check-update in the app directory for upgrade instructions.'}</p>}\n </div>}\n </div>;\n}\n\nexport const UPDATE_NOTICE_CSS = `\n.isotone-update { position: absolute; z-index: 5; bottom: 10px; right: calc(var(--iso-rail-length) + 10px); pointer-events: auto; }\n.isotone-root[data-tools='1'] .isotone-update { right: calc(var(--iso-rail-size) + 10px); }\n.isotone-update-trigger { white-space: nowrap; color: var(--iso-muted); font-size: 10px; padding: 4px 6px; border-radius: 5px; background: var(--iso-bg); box-shadow: 0 0 0 1px var(--iso-line); }\n.isotone-update-dialog { position: absolute; right: calc(0px - var(--iso-rail-length) - 10px); bottom: 40px; width: var(--iso-dock-width); max-height: calc(100dvh - 100px); overflow: auto; padding: var(--iso-space); display: grid; gap: 8px; border-radius: 8px; background: var(--iso-bg); box-shadow: var(--iso-popup-shadow); font-size: 11px; }\n.isotone-root[data-tools='1'] .isotone-update-dialog { right: calc(0px - var(--iso-rail-size) - 10px); }\n.isotone-update-dialog .isotone-menu-title { padding: 0; background: none; }\n.isotone-update-dialog > p { color: var(--iso-muted); }\n.isotone-update-path { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-root .isotone-update-dialog input { width: 100%; padding: 8px; border-radius: 5px; background: var(--iso-well); box-shadow: var(--iso-well-shadow); font-size: 11px; }\n.isotone-update-actions { display: flex; align-items: center; gap: 8px; }\n.isotone-update-actions [role='status'] { color: var(--iso-muted); font-size: 10px; }\n@media (hover: hover) and (pointer: fine) { .isotone-update-trigger:hover { color: var(--iso-fg); } }\n`;\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string?.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","import { toKebabCase } from './toKebabCase';\nimport type { LucideIconData, LucideIconNode } from '../build/types';\n\n/**\n * Converts legacy `(name, iconNode, aliases?)` icon arguments into icon data object format.\n */\nexport function toLucideIconData(\n iconName: string,\n iconNode: LucideIconNode[],\n aliases: string[] = [],\n): LucideIconData {\n if (iconNode == null) {\n throw new Error('[lucide]: iconNode is required when icon name is used');\n }\n\n return {\n name: toKebabCase(iconName),\n size: 24,\n node: iconNode,\n ...(aliases.length > 0 ? { aliases } : {}),\n };\n}\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) => {\n let out = '';\n let upperNext = false;\n\n for (const ch of string) {\n if (ch === '-' || ch === '_' || ch <= ' ') {\n upperNext = out.length > 0;\n continue;\n }\n\n if (out.length === 0) {\n out += ch.toLowerCase();\n } else {\n out += upperNext ? ch.toUpperCase() : ch;\n }\n\n upperNext = false;\n }\n\n return out as string;\n};\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","const defaultAttributes = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n} as const;\n\nexport default defaultAttributes;\n","import type { LucideBuildParams, LucideIconData, LucideIconNode, SVGProps } from './types';\nimport defaultAttributes from './defaultAttributes';\nimport { mergeClasses } from '../utils/mergeClasses';\n\nfunction isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Creates a Lucide icon node (an svgson-like format) from a Lucide icon object.\n *\n * @param icon The icon to build.\n * @param params Additional build parameters.\n */\nfunction buildLucideIconNode(icon: LucideIconData, params: LucideBuildParams = {}): LucideIconNode {\n const attributeNames = params.attributeNames ?? {};\n const getAttributeName = (attributeName: string) =>\n attributeNames[attributeName] ?? attributeName;\n\n const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes['width'];\n const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes['height'];\n const aliasClassNames =\n icon.aliases\n ?.filter((alias: string): alias is string => typeof alias === 'string' && alias.trim() !== '')\n .map((alias: string) => `lucide-${alias}`) ?? [];\n const iconClassNames = [...(icon.name ? [`lucide-${icon.name}`] : []), ...aliasClassNames];\n const classNamesFromClassName = params.className?.split(' ').filter(Boolean) ?? [];\n const className =\n params.includeDefaultClasses === false\n ? mergeClasses(...classNamesFromClassName)\n : mergeClasses('lucide', ...iconClassNames, ...classNamesFromClassName);\n\n const calculatedStrokeWidth = params.absoluteStrokeWidth\n ? (Number(params.strokeWidth ?? defaultAttributes['stroke-width']) *\n Number(icon.size ?? icon.width ?? defaultAttributes['width'])) /\n Number(params.size ?? params.width ?? defaultAttributes['width'])\n : (params.strokeWidth ?? defaultAttributes['stroke-width']);\n\n const attributes = {\n ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {\n attrs[getAttributeName(attrName)] = value;\n return attrs;\n }, {} as SVGProps),\n ...('color' in params &&\n params.color && {\n [getAttributeName('stroke')]: params.color,\n }),\n ...('size' in params &&\n isDefined(params.size) && {\n [getAttributeName('width')]: params.size,\n [getAttributeName('height')]: params.size,\n }),\n ...('width' in params &&\n isDefined(params.width) && {\n [getAttributeName('width')]: params.width,\n }),\n ...('height' in params &&\n isDefined(params.height) && {\n [getAttributeName('height')]: params.height,\n }),\n [getAttributeName('stroke-width')]: calculatedStrokeWidth,\n ...(className && {\n [getAttributeName('class')]: className,\n }),\n [getAttributeName('viewBox')]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,\n ...(params.hasA11yProp === false\n ? {\n [getAttributeName('aria-hidden')]: 'true',\n }\n : {}),\n ...('attributes' in params && params.attributes),\n };\n\n return [\n 'svg',\n attributes,\n icon.node.map((child): LucideIconNode => {\n const [name, attrs, children] = child;\n const nextAttrs = params.nonScalingStroke\n ? { [getAttributeName('vector-effect')]: 'non-scaling-stroke', ...attrs }\n : attrs;\n\n return children ? [name, nextAttrs, children] : [name, nextAttrs];\n }),\n ];\n}\n\nexport default buildLucideIconNode;\n","import buildLucideIconNode from './buildLucideIconNode';\nimport type { LucideBuildParams, LucideIconData, LucideIconNode } from './types';\n\n/**\n * Creates a React-compatible Lucide icon node (an svgson-like format) from a Lucide icon object.\n *\n * @param icon The icon to build.\n * @param params Additional build parameters.\n */\nfunction buildLucideIconForReact(\n icon: LucideIconData,\n params: LucideBuildParams = {},\n): LucideIconNode {\n return buildLucideIconNode(icon, {\n ...params,\n attributeNames: {\n ...params.attributeNames,\n class: 'className',\n 'stroke-width': 'strokeWidth',\n 'stroke-linecap': 'strokeLinecap',\n 'stroke-linejoin': 'strokeLinejoin',\n 'vector-effect': 'vectorEffect',\n },\n });\n}\n\nexport default buildLucideIconForReact;\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: object) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n /**\n * @deprecated Use `nonScalingStroke` instead.\n */\n absoluteStrokeWidth: boolean;\n nonScalingStroke: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport { buildLucideIconForReact, hasA11yProp, mergeClasses } from '@lucide/shared';\nimport { LucideIconData, LucideIconNode, LucideProps } from './types';\nimport { useLucideContext } from './context';\n\ntype IconComponentProps = LucideProps &\n (\n | {\n iconNode: LucideIconNode[];\n icon?: never;\n }\n | {\n icon: LucideIconData;\n iconNode?: never;\n }\n );\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {boolean} props.nonScalingStroke - Whether to use non scaling strokes\n * @param {string} props.className - The class name of the icon\n * @param {LucideIconNode[]} props.children - The children of the icon\n * @param {LucideIconNode[]} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color,\n size,\n width,\n height,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className = '',\n children,\n iconNode = [],\n icon = {\n node: iconNode,\n aliases: [],\n size: 24,\n },\n ...rest\n },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n nonScalingStroke: contextNonScalingStroke = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);\n\n const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {\n color: color ?? contextColor,\n width: width ?? size ?? contextSize,\n height: height ?? size ?? contextSize,\n strokeWidth: strokeWidth ?? contextStrokeWidth,\n absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,\n nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,\n className: mergeClasses(contextClass, className),\n hasA11yProp: hasAccessibleProp,\n attributes: rest,\n });\n\n return createElement(\n name,\n {\n ref,\n ...svgAttributes,\n },\n [\n ...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { toLucideIconData, toPascalCase } from '@lucide/shared';\nimport { LucideIcon, LucideIconData, LucideIconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Creates a Lucide icon component from icon data.\n *\n * @param icon Icon data object.\n * @returns Lucide icon component.\n */\nfunction createLucideIcon(icon: LucideIconData): LucideIcon;\n\n/**\n * Creates a Lucide icon component from the legacy icon arguments.\n *\n * @param iconName Icon name.\n * @param iconNode Icon node.\n * @param aliases Optional icon aliases.\n * @returns Lucide icon component.\n */\nfunction createLucideIcon(\n iconName: string,\n iconNode: LucideIconNode[],\n aliases?: string[],\n): LucideIcon;\n\nfunction createLucideIcon(\n iconDataOrName: LucideIconData | string,\n iconNode: LucideIconNode[] = [],\n aliases: string[] = [],\n): LucideIcon {\n const iconData =\n typeof iconDataOrName === 'string'\n ? toLucideIconData(iconDataOrName, iconNode, aliases)\n : iconDataOrName;\n\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n icon: iconData,\n className,\n ...props,\n }),\n );\n\n if (iconData.name) {\n Component.displayName = toPascalCase(iconData.name);\n }\n\n return Component;\n}\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-up',\n size: 24,\n node: [\n ['path', { d: 'm5 12 7-7 7 7', key: 'hav0vg' }],\n ['path', { d: 'M12 19V5', key: 'x0mq9r' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNSAxMiA3LTcgNyA3IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOVY1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowUp = createLucideIcon(__iconData);\n\nexport default ArrowUp;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'check',\n size: 24,\n node: [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon(__iconData);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'chevron-down',\n size: 24,\n node: [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'crosshair',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '22', x2: '18', y1: '12', y2: '12', key: 'l9bcsi' }],\n ['line', { x1: '6', x2: '2', y1: '12', y2: '12', key: '13hhkx' }],\n ['line', { x1: '12', x2: '12', y1: '6', y2: '2', key: '10w3f3' }],\n ['line', { x1: '12', x2: '12', y1: '22', y2: '18', key: '15g9kq' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Crosshair\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMjIiIHgyPSIxOCIgeTE9IjEyIiB5Mj0iMTIiIC8+CiAgPGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjYiIHkyPSIyIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMjIiIHkyPSIxOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/crosshair\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Crosshair = createLucideIcon(__iconData);\n\nexport default Crosshair;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'gem',\n size: 24,\n node: [\n ['path', { d: 'M10.5 3 8 9l4 13 4-13-2.5-6', key: 'b3dvk1' }],\n [\n 'path',\n {\n d: 'M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z',\n key: '7w4byz',\n },\n ],\n ['path', { d: 'M2 9h20', key: '16fsjt' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Gem\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNSAzIDggOWw0IDEzIDQtMTMtMi41LTYiIC8+CiAgPHBhdGggZD0iTTE3IDNhMiAyIDAgMCAxIDEuNi44bDMgNGEyIDIgMCAwIDEgLjAxMyAyLjM4MmwtNy45OSAxMC45ODZhMiAyIDAgMCAxLTMuMjQ3IDBsLTcuOTktMTAuOTg2QTIgMiAwIDAgMSAyLjQgNy44bDIuOTk4LTMuOTk3QTIgMiAwIDAgMSA3IDN6IiAvPgogIDxwYXRoIGQ9Ik0yIDloMjAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/gem\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Gem = createLucideIcon(__iconData);\n\nexport default Gem;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'message-square',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n key: '18887p',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name MessageSquare\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/message-square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MessageSquare = createLucideIcon(__iconData);\n\nexport default MessageSquare;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'rotate-ccw',\n size: 24,\n node: [\n ['path', { d: 'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8', key: '1357e3' }],\n ['path', { d: 'M3 3v5h5', key: '1xhq8a' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name RotateCcw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rotate-ccw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RotateCcw = createLucideIcon(__iconData);\n\nexport default RotateCcw;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'sliders-horizontal',\n size: 24,\n node: [\n ['path', { d: 'M10 5H3', key: '1qgfaw' }],\n ['path', { d: 'M12 19H3', key: 'yhmn1j' }],\n ['path', { d: 'M14 3v4', key: '1sua03' }],\n ['path', { d: 'M16 17v4', key: '1q0r14' }],\n ['path', { d: 'M21 12h-9', key: '1o4lsq' }],\n ['path', { d: 'M21 19h-5', key: '1rlt1p' }],\n ['path', { d: 'M21 5h-7', key: '1oszz2' }],\n ['path', { d: 'M8 10v4', key: 'tgpxqk' }],\n ['path', { d: 'M8 12H3', key: 'a7s4jb' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SlidersHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgNUgzIiAvPgogIDxwYXRoIGQ9Ik0xMiAxOUgzIiAvPgogIDxwYXRoIGQ9Ik0xNCAzdjQiIC8+CiAgPHBhdGggZD0iTTE2IDE3djQiIC8+CiAgPHBhdGggZD0iTTIxIDEyaC05IiAvPgogIDxwYXRoIGQ9Ik0yMSAxOWgtNSIgLz4KICA8cGF0aCBkPSJNMjEgNWgtNyIgLz4KICA8cGF0aCBkPSJNOCAxMHY0IiAvPgogIDxwYXRoIGQ9Ik04IDEySDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sliders-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SlidersHorizontal = createLucideIcon(__iconData);\n\nexport default SlidersHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'trash',\n size: 24,\n node: [\n ['path', { d: 'M10 11v6', key: 'nco0om' }],\n ['path', { d: 'M14 11v6', key: 'outv1u' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6', key: 'miytrc' }],\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2', key: 'e791ji' }],\n ],\n aliases: ['trash-2'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Trash\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTQgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Trash = createLucideIcon(__iconData);\n\nexport default Trash;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'x',\n size: 24,\n node: [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon(__iconData);\n\nexport default X;\n","import {\n ArrowUp, Check, ChevronDown, Crosshair, Gem, MessageSquare,\n RotateCcw, SlidersHorizontal, Trash2, X,\n} from 'lucide-react';\n\nconst icons = {\n close: X, chevron: ChevronDown, message: MessageSquare,\n sliders: SlidersHorizontal, pin: Crosshair, send: ArrowUp,\n reset: RotateCcw, trash: Trash2, check: Check, iterate: Gem,\n};\n\n/** One optical size and stroke across the dock, menus and composer. */\nexport function Icon({ name, size = 16 }: { name: keyof typeof icons; size?: number }) {\n const Component = icons[name];\n return <Component size={size} strokeWidth={1.75} aria-hidden=\"true\" />;\n}\n","import { APPEARANCE_CSS } from './appearance';\nimport { MOTION } from './motion';\nimport { FEEDBACK_LAYOUT_CSS } from './feedback-layout';\nimport { PILL_ACTIVE_CSS } from './pill-active';\nimport { UPDATE_NOTICE_CSS } from './UpdateNotice';\n\n/** One shared set of tokens and controls for the shadow-root and inline mounts. */\nconst MARKER = 'data-isotone-styles';\nexport const PANEL_CSS = `\n${APPEARANCE_CSS}\n.isotone-root, .isotone-root *, .isotone-root *::before, .isotone-root *::after { box-sizing: border-box; }\n/* Keep native scrolling and focus reveal without visible scrollbar chrome. */\n.isotone-root * { scrollbar-width: none; }\n.isotone-root *::-webkit-scrollbar { display: none; }\n.isotone-root :where(button, textarea, input, fieldset) { font: inherit; color: inherit; margin: 0; padding: 0; background: none; border: 0; }\n.isotone-root fieldset { min-inline-size: 0; }\n.isotone-root :where(button) { cursor: pointer; touch-action: manipulation; }\n.isotone-root :where(button:disabled) { cursor: default; opacity: .4; }\n.isotone-root :where(ul, li, p, h2, h3) { margin: 0; padding: 0; list-style: none; }\n.isotone-root {\n --iso-space: 12px; --iso-view-gap: 8px; --iso-control-radius: 6px;\n /* Shared geometry. Themes must not override these tokens. */\n --iso-rail-size: 44px; --iso-rail-padding: 4px; --iso-rail-gap: var(--iso-rail-padding);\n --iso-rail-key-size: calc(var(--iso-rail-size) - 4 * var(--iso-rail-padding));\n --iso-rail-step: calc(var(--iso-rail-key-size) + var(--iso-rail-gap));\n --iso-rail-end: calc(var(--iso-rail-padding) + var(--iso-rail-gap) / 2);\n --iso-rail-length: calc(2 * var(--iso-rail-step) + 2 * var(--iso-rail-end));\n --iso-rail-key-inset: calc((var(--iso-rail-size) - var(--iso-rail-key-size)) / 2);\n --iso-sans: var(--font-sans, ui-sans-serif, system-ui, -apple-system, sans-serif);\n --iso-zinc-50: oklch(98.5% 0 0); --iso-zinc-100: oklch(96.7% .001 286.375);\n --iso-zinc-200: oklch(92% .004 286.32); --iso-zinc-300: oklch(87.1% .006 286.286);\n --iso-zinc-400: oklch(70.5% .015 286.067); --iso-zinc-500: oklch(55.2% .016 285.938);\n --iso-zinc-600: oklch(44.2% .017 285.786); --iso-zinc-700: oklch(37% .013 285.805);\n --iso-zinc-800: oklch(27.4% .006 286.033); --iso-zinc-900: oklch(21% .006 285.885);\n --iso-zinc-950: oklch(14.1% .005 285.823);\n --iso-ease-out: ${MOTION.easeOut};\n --iso-fast: ${MOTION.exit}ms; --iso-enter: ${MOTION.enter}ms; --iso-exit: ${MOTION.exit}ms;\n --iso-dock-width: min(340px, calc(100vw - 32px));\n position: fixed; right: max(16px, env(safe-area-inset-right)); bottom: max(16px, env(safe-area-inset-bottom));\n z-index: 2147483000; width: 44px; display: flex; flex-direction: column; isolation: isolate; max-height: calc(100dvh - 32px); color: var(--iso-fg);\n font: 12px/1.5 var(--iso-sans); -webkit-font-smoothing: antialiased;\n text-align: left; letter-spacing: normal; color-scheme: dark;\n}\n.isotone-root :where(button, input, textarea):focus-visible { outline: 2px solid var(--iso-focus); outline-offset: 3px; }\n.isotone-root button { transition: transform var(--iso-fast) var(--iso-ease-out), opacity var(--iso-fast) var(--iso-ease-out); }\n.isotone-root button:not(:disabled):active > svg { transform: scale(.92); transition-duration: 100ms; }\n.isotone-root svg { display: block; flex-shrink: 0; pointer-events: none; transition: transform var(--iso-fast) var(--iso-ease-out); }\n/* Panels move independently; their content and corners retain their natural size. */\n.isotone-root[data-open='true'] { width: var(--iso-dock-width); }\n.isotone-root { pointer-events: none; }\n.isotone-root :is(.isotone-panel, .isotone-rail-button, .isotone-fab, .isotone-hint) { pointer-events: auto; }\n/* The horizontal pill stays anchored while its panels open above it. */\n.isotone-rail, .isotone-rail-tools { display: contents; border: 0; margin: 0; padding: 0; min-width: 0; }\n.isotone-root[data-expanded='true'] { min-height: 44px; }\n.isotone-root[data-expanded='true'][data-open='false'][data-tools='2'] { width: var(--iso-rail-length); }\n.isotone-root[data-open='true'] { padding-bottom: calc(var(--iso-rail-size) + var(--iso-view-gap)); gap: var(--iso-view-gap); }\n.isotone-rail-track { position: absolute; right: 0; bottom: 0; width: var(--iso-rail-size); height: var(--iso-rail-size); border-radius: 999px; background: var(--iso-rail-base); border: 0; box-shadow: var(--iso-rail-base-shadow); pointer-events: auto; transition: width var(--iso-enter) var(--iso-ease-out), height var(--iso-enter) var(--iso-ease-out); }\n.isotone-rail-track::before { content: ''; position: absolute; inset: var(--iso-rail-padding); border-radius: inherit; background: var(--iso-rail-face); box-shadow: var(--iso-rail-face-shadow); }\n.isotone-root[data-expanded='true'][data-tools='2'] .isotone-rail-track { width: var(--iso-rail-length); }\n.isotone-fab, .isotone-rail-button { display: flex; align-items: center; justify-content: center; flex: none; width: var(--iso-rail-size); height: var(--iso-rail-size); border-radius: 999px; }\n.isotone-fab { position: relative; isolation: isolate; color: var(--iso-launcher-ink); }\n.isotone-rail-button { position: absolute; bottom: 0; right: 0; display: none; color: var(--iso-icon-rest); isolation: isolate; z-index: 1; }\n.isotone-root[data-expanded='true'] .isotone-rail-button { display: flex; }\n.isotone-root[data-expanded='true'] .isotone-fab { display: none; }\n.isotone-rail-button::before { content: ''; position: absolute; inset: var(--iso-rail-key-inset); border-radius: 999px; z-index: -1; pointer-events: none; }\n.isotone-rail-button[aria-expanded='true'] { color: var(--iso-fg); }\n/* 28px key faces, with 4px between keys and around them, in every appearance. */\n.isotone-root[data-tools='2'] .isotone-rail-button { width: var(--iso-rail-step); right: var(--iso-rail-end); }\n.isotone-root[data-tools='2'] .isotone-rail-button[aria-label='Variants'] { right: calc(var(--iso-rail-end) + var(--iso-rail-step)); }\n.isotone-root[data-tools='2'] .isotone-rail-button::before { inset: var(--iso-rail-key-inset) calc(var(--iso-rail-gap) / 2); }\n.isotone-tool-label { display: none; }\n.isotone-badge { position: absolute; right: -3px; top: -3px; display: grid; place-items: center; min-width: 15px; height: 15px; padding: 0 3px; border-radius: 8px; background: var(--iso-label-face); box-shadow: var(--iso-label-shadow); color: var(--iso-launcher-ink); font-size: 9px; font-weight: 500; font-variant-numeric: tabular-nums; }\n/* Panels are sections inside the dock. Only long content scrolls. */\n.isotone-panel { order: 0; position: relative; display: none; flex-direction: column; min-height: 0; flex: 0 1 auto; width: 100%; }\n.isotone-panel[data-open='true'] { display: flex; }\n.isotone-variants-panel { flex-shrink: 1; max-height: calc(100dvh - 76px); }\n.isotone-notes-panel { flex-shrink: 0; max-height: calc(100dvh - 76px); padding: var(--iso-space); gap: var(--iso-space); }\n.isotone-root .isotone-panel { background: var(--iso-bg); border: 1px solid var(--iso-line); border-radius: 12px; box-shadow: var(--iso-panel-shadow); overflow: hidden; }\n.isotone-panel-head { flex: 0 0 42px; min-height: 42px; display: flex; align-items: center; justify-content: space-between; padding: 0 8px 0 14px; gap: 8px; border-bottom: 1px solid var(--iso-line); }\n.isotone-root .isotone-notes-panel > .isotone-panel-head { display: none; }\n.isotone-root .isotone-vars > .isotone-panel-head { order: 2; flex: 0 0 auto; min-height: 48px; padding: var(--iso-space); border: 0; }\n.isotone-root .isotone-vars > .isotone-panel-head:has(.isotone-save) { position: relative; z-index: 1; margin-top: calc(0px - var(--iso-space)); background: linear-gradient(to bottom, transparent, var(--iso-bg) var(--iso-space)); }\n.isotone-root .isotone-vars > .isotone-panel-head:not(:has(.isotone-save)) { display: none; }\n.isotone-root .isotone-vars > .isotone-panel-head :is(h2, .isotone-icon) { display: none; }\n.isotone-root .isotone-axis-menu { top: 6px; min-height: min(260px, calc(100% - 12px)); max-height: calc(100% - 12px); }\n.isotone-root .isotone-save-state { top: auto; bottom: 27px; }\n.isotone-panel-head h2 { font-size: 12px; font-weight: 600; letter-spacing: -.01em; }\n.isotone-head-actions { display: flex; align-items: center; gap: 6px; margin-right: auto; }\n.isotone-icon { width: 28px; height: 28px; display: inline-grid; place-items: center; flex: none; color: var(--iso-muted); border-radius: 6px; }\n.isotone-count { margin-left: 5px; color: var(--iso-muted); font-size: 10px; font-variant-numeric: tabular-nums; }\n.isotone-vars { flex: 1; display: flex; flex-direction: column; min-height: 0; position: relative; }\n.isotone-variants-panel:has(.isotone-axis-menu[data-open='true']) { flex-basis: min(360px, calc(100dvh - 76px)); }\n.isotone-vars-body { flex: 1; overflow-y: auto; min-height: 0; overscroll-behavior: contain; padding: var(--iso-space); display: flex; flex-direction: column; gap: var(--iso-space); }\n/* The footer overlaps only the scroller's bottom padding: content fades beneath\n it while scrolling, but the last control remains fully visible at the end. */\n.isotone-axis { flex: none; }\n.isotone-axis-head { display: flex; align-items: center; justify-content: space-between; min-height: 24px; gap: 8px; margin-bottom: 6px; }\n.isotone-axis-label { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; min-height: 24px; padding: 2px 7px; margin-left: -7px; border-radius: 6px; text-align: left; }\n.isotone-axis-label, .isotone-menu-title > strong { font: inherit; font-weight: 550; }\n.isotone-axis-label > span, .isotone-menu-title > strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-axis-label svg { color: var(--iso-muted); }\n.isotone-axis-value { min-width: 0; max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--iso-muted); font: 10px var(--iso-sans); font-variant-numeric: tabular-nums; }\n.isotone-segs { display: flex; flex-wrap: wrap; gap: 3px; padding: 3px; border-radius: 7px; background: var(--iso-well); box-shadow: var(--iso-segment-track-shadow); }\n.isotone-seg { flex: 1 1 64px; min-width: 0; padding: 5px 8px; line-height: 16px; border-radius: 5px; color: var(--iso-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-seg > span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-seg[aria-pressed='true'] { color: var(--iso-fg); }\n.isotone-grid { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 8px; }\n.isotone-thumb { position: relative; display: block; min-width: 0; border-radius: 5px; overflow: hidden; background: var(--iso-well); box-shadow: var(--iso-thumb-shadow); color: var(--iso-muted); }\n.isotone-thumb img { display: block; width: 100%; height: 72px; object-fit: cover; }\n.isotone-thumb > span { position: absolute; bottom: 5px; left: 5px; max-width: calc(100% - 10px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 2px 6px; border-radius: 5px; background: var(--iso-label-face); box-shadow: var(--iso-label-shadow); color: var(--iso-fg); text-align: left; font-size: 10px; font-weight: 500; }\n.isotone-thumb[aria-pressed='true'] { color: var(--iso-fg); }\n/* The 14px thumb has 5px of space above it inside its 24px hit area. */\n.isotone-axis-head:has(+ .isotone-range) { margin-bottom: 1px; }\n.isotone-range { display: block; appearance: none; -webkit-appearance: none; width: 100%; height: 24px; cursor: pointer; }\n.isotone-range::-webkit-slider-runnable-track { height: 3px; border-radius: 6px; background: var(--iso-edge); }\n.isotone-range::-webkit-slider-thumb { appearance: none; -webkit-appearance: none; width: 14px; height: 14px; margin-top: -5.5px; border-radius: var(--iso-range-radius); background: var(--iso-range-thumb-face); box-shadow: var(--iso-range-thumb-shadow); }\n.isotone-range::-moz-range-track { height: 3px; border-radius: 6px; background: var(--iso-edge); }\n.isotone-range::-moz-range-thumb { width: 14px; height: 14px; border: 0; box-shadow: var(--iso-range-thumb-shadow); border-radius: var(--iso-range-radius); background: var(--iso-range-thumb-face); }\n.isotone-swatches { display: flex; flex-wrap: wrap; gap: 10px; padding: 3px; }\n.isotone-swatch, .isotone-picker { width: 26px; height: 26px; border-radius: var(--iso-swatch-radius); box-shadow: var(--iso-swatch-shadow); flex: none; }\n.isotone-swatch[aria-pressed='true'] { box-shadow: var(--iso-swatch-selected-shadow); }\n.isotone-picker { display: block; position: relative; overflow: hidden; background: conic-gradient(#ef4444,#eab308,#22c55e,#3b82f6,#a855f7,#ef4444); }\n.isotone-picker input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }\n.isotone-picker:has(input:focus-visible) { outline: 2px solid var(--iso-focus); outline-offset: 3px; }\n/* Raised actions share one face, edge and hover treatment. */\n.isotone-save, .isotone-secondary, .isotone-send, .isotone-hint button { border-radius: var(--iso-control-radius); color: var(--iso-fg); background: var(--iso-control-face); box-shadow: var(--iso-control-shadow); }\n/* Persistent selections share the raised action material, never the recessed\n field/slot material. Keep the face and shadow together in this one rule. */\n.isotone-note-editing .isotone-note-hit,\n.isotone-seg[aria-pressed='true'],\n.isotone-thumb[aria-pressed='true'],\n.isotone-pick[aria-pressed='true'] { background: var(--iso-selected-face); box-shadow: var(--iso-selected-shadow); }\n${PILL_ACTIVE_CSS}\n.isotone-secondary { padding: 6px 9px; font-size: 11px; font-weight: 500; white-space: nowrap; }\n.isotone-save { min-height: 24px; padding: 2px 7px; font-size: 11px; white-space: nowrap; }\n.isotone-save-row { position: relative; }\n.isotone-save-state { position: absolute; right: 0; top: 27px; z-index: 3; background: var(--iso-bg); border-radius: 4px; white-space: nowrap; font-size: 9px; color: var(--iso-muted); pointer-events: none; }\n/* A local action sheet overlays controls, preserving every underlying position. */\n.isotone-axis-menu { position: absolute; inset: 48px 6px auto; z-index: 2; background: var(--iso-popup-face); border-radius: 6px; max-height: calc(100% - 54px); box-shadow: var(--iso-popup-shadow); display: flex; flex-direction: column; transform-origin: top left; opacity: 0; transform: translateY(-4px) scale(.97); visibility: hidden; transition: opacity var(--iso-exit) var(--iso-ease-out), transform var(--iso-exit) var(--iso-ease-out), visibility 0s var(--iso-exit); }\n.isotone-axis-menu[data-open='true'] { visibility: visible; opacity: 1; transform: none; transition-delay: 0s; }\n@starting-style { .isotone-axis-menu[data-open='true'] { opacity: 0; transform: translateY(-4px) scale(.97); } }\n.isotone-menu-title { position: relative; z-index: 1; flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 8px 6px 12px; }\n/* Fade the moving content into the popup's actual material. A mask preserves\n Instrument's surface gradient and works identically in light and dark mode.\n Matching negative margin/padding preserves the first action's resting position. */\n.isotone-menu-scroll { --iso-scroll-fade-bottom: 0px; scroll-padding-block: var(--iso-space) calc(var(--iso-scroll-fade-bottom) + 6px); overflow-y: auto; overscroll-behavior: contain; flex: 1; min-height: 0; margin-top: calc(0px - var(--iso-space)); padding: var(--iso-space) 6px 6px; mask-image: linear-gradient(to bottom, transparent, #000 var(--iso-space), #000 calc(100% - var(--iso-scroll-fade-bottom)), transparent); }\n.isotone-axis-menu:has(.isotone-menu-footer) .isotone-menu-scroll { --iso-scroll-fade-bottom: var(--iso-space); padding-bottom: calc(var(--iso-space) + 6px); }\n.isotone-menu-action { display: flex; align-items: center; gap: 9px; width: 100%; min-height: 34px; border-radius: 6px; text-align: left; padding: 7px; font-size: 11px; }\n.isotone-menu-options { padding: 7px 0; margin: 5px 0; border-top: 1px solid var(--iso-line); border-bottom: 1px solid var(--iso-line); }\n.isotone-option-row { display: flex; align-items: center; padding: 2px 4px 2px 7px; gap: 4px; }\n.isotone-option-row > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-option-row small { font-size: 9px; color: var(--iso-muted); margin-left: 6px; }\n.isotone-menu-footer { flex-shrink: 0; padding: 9px 12px; border-top: 1px solid var(--iso-line); font-size: 10px; color: var(--iso-muted); min-height: 0; }\n.isotone-confirm { display: flex; justify-content: flex-end; gap: 6px; margin-top: 7px; }\n.isotone-danger { color: var(--iso-danger); }\n/* Scroll through the panel's top inset and fade against its actual surface.\n Cancelling margin/padding keeps the first row in place at scroll start; the\n expanded height preserves the content allowance and composer position.\n The side gutters contain the corner action and keyboard focus outlines. */\n.isotone-list { display: flex; flex-direction: column; gap: 0; flex: 0 1 auto; max-height: calc(var(--iso-list-height) + 2 * var(--iso-space) - 8px); min-height: 0; overflow-y: auto; overscroll-behavior: contain; margin: calc(0px - var(--iso-space)) calc(-8px - var(--iso-note-outset)); padding: var(--iso-space) 8px; scroll-padding-block: var(--iso-space); mask-image: linear-gradient(to bottom, transparent, #000 var(--iso-space), #000 calc(100% - var(--iso-space)), transparent); }\n.isotone-empty { color: var(--iso-muted); font-size: 11px; line-height: 1.7; padding: 8px; }\n.isotone-note { position: relative; flex: none; }\n.isotone-request-heading { display: flex; align-items: center; gap: 8px; line-height: 14px; }\n.isotone-request-kind { font-size: 10px; font-weight: 550; color: var(--iso-muted); }\n.isotone-request-heading code, .isotone-request-fallback { font: 10px/16px ui-monospace, 'SF Mono', Menlo, monospace; }\n.isotone-request-heading code { color: var(--iso-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-request-more { flex: none; color: var(--iso-faint); font-size: 9px; }\n.isotone-request-fallback { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n\n.isotone-note-hit { text-align: left; display: block; width: 100%; border-radius: 8px; padding: var(--iso-note-padding-y) var(--iso-note-padding-x); line-height: 18px; }\n.isotone-note-hit p { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; }\n.isotone-meta { display: flex; align-items: center; gap: 4px; min-width: 0; margin-top: 4px; }\n.isotone-meta .isotone-chip { flex: 0 1 auto; min-width: 0; height: 18px; padding: 0 5px; font-size: 9px; }\n/* A lone reference gets all available space; multiple references share the row. */\n.isotone-meta .isotone-chip:not(:only-child) { max-width: 140px; }\n/* The corner action floats outside the text column; its 24px hit target\n surrounds a 16px face without reserving trailing space in every row. */\n.isotone-note > .isotone-x { position: absolute; right: -8px; top: -8px; width: 24px; height: 24px; isolation: isolate; opacity: .6; background: none; box-shadow: none; }\n.isotone-x::before { content: ''; position: absolute; inset: 4px; border-radius: 50%; z-index: -1; background: var(--iso-bg); box-shadow: 0 0 0 1px var(--iso-edge); }\n.isotone-list:empty { display: none; }\n${FEEDBACK_LAYOUT_CSS}\n.isotone-compose { flex: none; display: flex; flex-direction: column; }\n.isotone-input { --iso-input-padding: calc(var(--iso-space) - 2px); flex: none; min-width: 0; min-height: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; padding: var(--iso-input-padding); background: var(--iso-well); border: 1px solid var(--iso-input-border); box-shadow: var(--iso-input-shadow); border-radius: 8px; cursor: text; }\n.isotone-context:empty { display: none; }\n/* Content starts and ends at the shared inset, but scrolls through the full\n field width without a fade or a permanent blank strip at either edge. */\n.isotone-context { display: flex; flex: none; align-items: center; gap: 4px; flex-wrap: nowrap; height: 32px; overflow-x: auto; overflow-y: hidden; overscroll-behavior: contain; padding: 4px var(--iso-input-padding); margin: 0 calc(0px - var(--iso-input-padding)); scroll-padding-inline: var(--iso-input-padding); }\n.isotone-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; height: 24px; max-width: 100%; padding: 0 5px 0 7px; border: 1px solid var(--iso-edge); border-radius: var(--iso-control-radius); font-size: 10px; color: var(--iso-muted); background: var(--iso-label-face); box-shadow: var(--iso-label-lift-shadow); }\n.isotone-context > .isotone-chip:not(:only-child) { max-width: calc(100% - 32px); }\n.isotone-chip > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-chip button { display: grid; place-items: center; flex: none; width: 16px; height: 16px; border-radius: 3px; background: transparent; box-shadow: none; }\n.isotone-root .isotone-textarea { --iso-textarea-inset: 8px; display: block; width: 100%; flex: none; height: 24px; min-height: calc(24px + var(--iso-textarea-inset)); max-height: calc(120px + var(--iso-textarea-inset)); overflow-y: auto; resize: none; margin-top: calc(0px - var(--iso-textarea-inset)); padding: calc(var(--iso-textarea-inset) + 2px) 2px 2px; color: var(--iso-fg); background: transparent; border: 0; border-radius: 0; font-size: 12px; line-height: 20px; box-shadow: none; cursor: text; }\n/* Text scrolls through the gap below tags, or the field inset without tags. */\n.isotone-root .isotone-context:empty + .isotone-textarea { --iso-textarea-inset: var(--iso-input-padding); }\n.isotone-textarea::placeholder { color: var(--iso-faint); }\n.isotone-root .isotone-textarea:focus-visible { outline: none; }\n.isotone-textarea[data-scrolled='true'] { mask-image: linear-gradient(to bottom, transparent, #000 8px); }\n.isotone-toolbar { display: flex; flex: none; align-items: center; gap: 7px; height: 28px; }\n.isotone-key-hint { color: var(--iso-faint); font-size: 9px; }\n.isotone-pick[aria-pressed='true'] { color: var(--iso-fg); }\n.isotone-pick, .isotone-send { position: relative; width: 24px; height: 24px; }\n/* Keep a 28px hit area around the quieter composer faces. */\n.isotone-pick::after, .isotone-send::after { content: ''; position: absolute; inset: -2px; border-radius: inherit; }\n.isotone-send { display: grid; place-items: center; margin-left: auto; flex: none; }\n.isotone-notice { font-size: 10px; color: var(--iso-muted); }\n.isotone-hint { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); display: flex; align-items: center; gap: 12px; padding: 8px 10px 8px 14px; border-radius: 24px; background: var(--iso-bg); box-shadow: var(--iso-shadow); font-size: 11px; white-space: nowrap; }\n.isotone-hint button { display: flex; align-items: center; gap: 8px; border-radius: 14px; padding: 5px 9px; }\n.isotone-hint kbd { font: inherit; color: var(--iso-muted); }\n.isotone-hover { position: fixed; pointer-events: none; border: 1px solid var(--iso-pick-line); background: var(--iso-pick-fill); border-radius: 5px; z-index: 2147483001; }\n.isotone-selected { border: 2px solid var(--iso-pick-line); background: var(--iso-pick-selected-fill); }\n@media (hover: hover) and (pointer: fine) {\n .isotone-root :where(.isotone-icon:not(.isotone-x), .isotone-menu-action, .isotone-axis-label):not(:disabled):not([aria-pressed='true']):hover { background: var(--iso-hover); box-shadow: var(--iso-hover-shadow); color: var(--iso-fg); }\n .isotone-note:not(.isotone-note-editing):hover .isotone-note-hit:not(:disabled) { background: var(--iso-hover); box-shadow: var(--iso-hover-shadow); }\n .isotone-rail-button:not(:disabled):hover { color: var(--iso-fg); }\n .isotone-seg:not(:disabled):hover { color: var(--iso-fg); }\n .isotone-seg[aria-pressed='false']:not(:disabled):hover { box-shadow: var(--iso-hover-shadow); }\n .isotone-thumb[aria-pressed='false']:not(:disabled):hover { box-shadow: var(--iso-thumb-hover-shadow); }\n .isotone-root :where(.isotone-save, .isotone-secondary, .isotone-send, .isotone-hint button):not(:disabled):hover { background: var(--iso-control-hover-face); box-shadow: var(--iso-control-hover-shadow); }\n .isotone-chip button:hover { color: var(--iso-fg); background: var(--iso-hover); }\n .isotone-x:hover { color: var(--iso-fg); }\n .isotone-x:hover::before { background: var(--iso-control-hover-face); }\n .isotone-note .isotone-x { opacity: 0; }\n .isotone-note:hover .isotone-x, .isotone-note:focus-within .isotone-x, .isotone-note-editing .isotone-x { opacity: 1; }\n}\n@media (max-height: 580px) { .isotone-list { --iso-list-height: 72px; } .isotone-root .isotone-textarea { max-height: calc(64px + var(--iso-textarea-inset)); } }\n@media (prefers-reduced-motion: reduce) {\n .isotone-root .isotone-rail-track { transition: none; }\n .isotone-root .isotone-panel, .isotone-root .isotone-axis-menu, .isotone-root .isotone-rail-tools { transition-property: opacity, visibility; }\n .isotone-root button { transition: opacity 125ms ease; }\n .isotone-root button:not(:disabled):active > svg { transform: none; }\n}\n.isotone-root[data-instant='true'] *, .isotone-root[data-instant='true'] *::before, .isotone-root[data-instant='true'] *::after { transition-duration: 0s !important; transition-delay: 0s !important; animation: none !important; }\n${UPDATE_NOTICE_CSS}\n`;\n/**\n * Put the panel's styles in `target`, once. Idempotent: a second call with the\n * same root is a no-op, so several panels (or a remount) do not stack copies.\n *\n * `target` is whatever `getRootNode()` returns for the panel — a `ShadowRoot`\n * when mounted by `mountIteration`, the `Document` when a host embeds the\n * component directly.\n */\nexport function ensurePanelStyles(target: Document | ShadowRoot): void {\n const parent = target instanceof Document ? target.head : target;\n if (!parent || parent.querySelector(`[${MARKER}]`)) return;\n const style = (target instanceof Document ? target : target.ownerDocument)\n .createElement('style');\n style.setAttribute(MARKER, '');\n style.textContent = PANEL_CSS;\n // Prepend inside a shadow root so host-passed styles could still win, and\n // append in the document so the panel is not undercut by later app CSS.\n if (target instanceof Document) parent.appendChild(style);\n else parent.insertBefore(style, parent.firstChild);\n}\n","import { showOverflowTitle } from './tooltips';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { VariantReference } from '../core/index';\nimport {\n axisDefault,\n formatRangeValue,\n isDirty,\n type VariantAction,\n type VariantAxis,\n type VariantSelections,\n type VariantsSource,\n visibleAxes,\n} from '../core/variants';\nimport { Icon } from './icons';\nimport { useLayoutMotion } from './useLayoutMotion';\n\nexport function refreshSource(source: VariantsSource): void {\n const candidate = (source as { refresh?: unknown }).refresh;\n if (typeof candidate === 'function')\n void Promise.resolve(candidate.call(source)).catch(() => {});\n}\n\nexport function useVariantsSource(source: VariantsSource | undefined) {\n const [revision, setRevision] = useState(0);\n useEffect(() => source?.subscribe(() => setRevision(n => n + 1)), [source]);\n return revision;\n}\n\nconst NO_PENDING_ACTIONS: VariantAction[] = [];\n\nexport function VariantsView({\n source,\n showTitle = true,\n active = true,\n onFeedback,\n onClose,\n onSaved,\n onManage,\n pendingActions = NO_PENDING_ACTIONS,\n}: {\n source: VariantsSource;\n showTitle?: boolean;\n active?: boolean;\n onFeedback?: (reference: VariantReference) => void;\n onClose?: () => void;\n onSaved?: () => void;\n onManage?: (action: VariantAction, reference: VariantReference) => Promise<void>;\n pendingActions?: VariantAction[];\n}) {\n const revision = useVariantsSource(source);\n useEffect(() => {\n if (active) refreshSource(source);\n }, [active, source]);\n // The source notifies through its revision; typing in the composer does not\n // need another selector graph walk or another layout measurement.\n // biome-ignore lint/correctness/useExhaustiveDependencies: revision represents external source updates.\n const { selections, shown, sourceError } = useMemo(() => {\n const selections = source.getSelections();\n return {\n selections,\n shown: visibleAxes(source.getAxes(), selections),\n sourceError: source.getError?.(),\n };\n }, [source, revision]);\n const [menuId, setMenuId] = useState<string | null>(null);\n const menu = shown.find(axis => axis.id === menuId) ?? null;\n const [menuOpen, setMenuOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const menuRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n useLayoutMotion(bodyRef, shown, active);\n const trigger = useRef<HTMLButtonElement | null>(null);\n const value = (axis: VariantAxis) => selections[axis.id] ?? axisDefault(axis);\n const menuOptions =\n menu?.kind === 'color'\n ? menu.swatches.map((s) => ({\n ...s,\n isDefault: s.value.toLowerCase() === menu.defaultColor.toLowerCase(),\n }))\n : menu && menu.kind !== 'range'\n ? menu.options.map((o) => ({\n ...o,\n isDefault: o.id === menu.defaultOption,\n }))\n : [];\n const closeMenu = () => {\n setMenuOpen(false);\n setError('');\n requestAnimationFrame(() => {\n if (trigger.current?.isConnected) trigger.current.focus();\n else\n bodyRef.current?.parentElement\n ?.querySelector<HTMLButtonElement>('button')\n ?.focus();\n });\n };\n\n useEffect(() => {\n if (!menu) setMenuOpen(false);\n }, [menu]);\n\n useEffect(() => {\n if (menuOpen)\n menuRef.current?.querySelector<HTMLButtonElement>('button')?.focus();\n }, [menuOpen]);\n\n function feedback(axis: VariantAxis, optionId?: string) {\n const option =\n axis.kind === 'range'\n ? undefined\n : (axis.kind === 'color' ? axis.swatches : axis.options).find(\n (o) => o.id === optionId,\n );\n closeMenu();\n onFeedback?.({\n axisId: axis.id,\n label: axis.label,\n value: value(axis),\n ...(option ? { optionId: option.id, optionLabel: option.label } : {}),\n });\n }\n const requested = (action: VariantAction) => pendingActions.some(pending =>\n pending.axisId === action.axisId && pending.action === action.action && pending.optionId === action.optionId);\n async function manage(action: VariantAction) {\n if (!menu || busy || !onManage || requested(action)) return;\n setBusy(true);\n setError('');\n try {\n const option = menuOptions.find(o => o.id === action.optionId);\n await onManage(action, {\n axisId: menu.id, label: menu.label, value: value(menu),\n ...(option ? { optionId: option.id, optionLabel: option.label } : {}),\n });\n\n closeMenu();\n } catch (e) {\n setError(\n e instanceof Error ? e.message : 'Could not update this selector.',\n );\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <div className=\"isotone-vars\">\n <div className=\"isotone-panel-head\">\n {showTitle && <h2>{source.title ?? 'Variants'}</h2>}\n <div className=\"isotone-head-actions\">\n {source.saveDefaults && isDirty(shown, selections) && (\n <SaveDefaults source={source} onSaved={onSaved} />\n )}\n {onClose && (\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label=\"Close variants\"\n title=\"Close variants\"\n onClick={onClose}\n >\n <Icon name=\"close\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"isotone-vars-body\" ref={node => { bodyRef.current = node; node?.toggleAttribute('inert', menuOpen); }}>\n {sourceError && <p className=\"isotone-danger\" role=\"alert\">{sourceError}</p>}\n {shown.length === 0 && (\n <p className=\"isotone-empty\">No variant selectors on this page.</p>\n )}\n {shown.map((axis) => {\n const thumbnails = axis.kind !== 'range' && axis.kind !== 'color' && axis.options.length > 0 && axis.options.every(option => option.image);\n return (\n <div\n className=\"isotone-axis\"\n key={axis.id}\n data-motion-key={axis.id}\n >\n <div className=\"isotone-axis-head\">\n <button\n type=\"button\"\n className=\"isotone-axis-label\"\n aria-label={`${axis.label} actions`}\n aria-haspopup=\"dialog\"\n aria-expanded={menuOpen && menu?.id === axis.id}\n onClick={(e) => {\n trigger.current = e.currentTarget;\n setMenuId(axis.id);\n setError('');\n setMenuOpen(true);\n }}\n >\n <span onPointerOver={showOverflowTitle}>{axis.label}</span>\n <Icon name=\"chevron\" size={12} />\n </button>\n {(axis.kind === 'range' || axis.kind === 'color') && (\n <span className=\"isotone-axis-value\">\n {axis.kind === 'range'\n ? formatRangeValue(axis, value(axis))\n : value(axis).toUpperCase()}\n </span>\n )}\n </div>\n {axis.kind === 'range' ? (\n <input\n type=\"range\"\n className=\"isotone-range\"\n aria-label={axis.label}\n aria-valuetext={formatRangeValue(axis, value(axis))}\n min={axis.min}\n max={axis.max}\n step={axis.step}\n value={Number(value(axis))}\n onChange={(e) => source.setSelection(axis.id, e.target.value)}\n />\n ) : axis.kind === 'color' ? (\n <fieldset className=\"isotone-swatches\" aria-label={axis.label}>\n {axis.swatches.map((sw) => (\n <button\n key={sw.id}\n type=\"button\"\n title={sw.label}\n aria-label={sw.label}\n aria-pressed={\n value(axis).toLowerCase() === sw.value.toLowerCase()\n }\n className=\"isotone-swatch\"\n style={{ backgroundColor: sw.value }}\n onClick={() => source.setSelection(axis.id, sw.value)}\n />\n ))}\n <label className=\"isotone-picker\" title=\"Custom colour\">\n <input\n type=\"color\"\n aria-label={`${axis.label}: custom colour`}\n value={value(axis)}\n onChange={(e) =>\n source.setSelection(axis.id, e.target.value)\n }\n />\n </label>\n </fieldset>\n ) : (\n <fieldset\n aria-label={axis.label}\n className={\n thumbnails\n ? 'isotone-grid'\n : 'isotone-segs'\n }\n >\n {axis.options.map((o) => (\n <button\n key={o.id}\n type=\"button\"\n aria-label={o.label}\n aria-pressed={value(axis) === o.id}\n className={`${thumbnails ? 'isotone-thumb' : 'isotone-seg'}${value(axis) === o.id ? ' isotone-seg-on' : ''}`}\n onClick={() => source.setSelection(axis.id, o.id)}\n >\n {thumbnails && (\n <img src={o.image} alt=\"\" />\n )}\n <span onPointerOver={showOverflowTitle}>{o.label}</span>\n </button>\n ))}\n </fieldset>\n )}\n\n </div>\n );\n })}\n </div>\n {menu && (\n <div\n className=\"isotone-axis-menu\"\n ref={node => { menuRef.current = node; node?.toggleAttribute('inert', !menuOpen); }}\n role=\"dialog\"\n aria-label={`${menu.label} actions`}\n aria-hidden={!menuOpen}\n data-open={menuOpen}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n closeMenu();\n }\n }}\n >\n <div className=\"isotone-menu-title\">\n <strong>{menu.label}</strong>\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label=\"Close selector actions\"\n title=\"Close selector actions\"\n onClick={closeMenu}\n >\n <Icon name=\"close\" />\n </button>\n </div>\n <div className=\"isotone-menu-scroll\">\n {onFeedback && (\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n onClick={() => feedback(menu)}\n >\n <Icon name=\"message\" />\n Feedback on this selector\n </button>\n )}\n {menu.kind !== 'range' && (\n <div className=\"isotone-menu-options\">\n {menuOptions.map((option) => (\n <div className=\"isotone-option-row\" key={option.id}>\n <span>\n {option.label}\n {option.isDefault && <small>Default</small>}\n </span>\n {onFeedback && (\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label={`Feedback on ${option.label}`}\n title=\"Give feedback\"\n onClick={() => feedback(menu, option.id)}\n >\n <Icon name=\"message\" />\n </button>\n )}\n {onManage && (\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label={`Remove ${option.label}`}\n disabled={option.isDefault || busy || requested({ axisId: menu.id, action: 'remove-option', optionId: option.id })}\n title={\n option.isDefault\n ? 'Default option'\n : 'Request option removal'\n }\n onClick={() =>\n void manage({\n axisId: menu.id,\n action: 'remove-option',\n optionId: option.id,\n })\n }\n >\n <Icon name=\"trash\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n onClick={() => {\n source.setSelection(menu.id, axisDefault(menu));\n closeMenu();\n }}\n >\n <Icon name=\"reset\" />\n Reset to default\n </button>\n {onManage && (\n <>\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n disabled={busy || requested({ axisId: menu.id, action: 'keep-default' })}\n onClick={() =>\n void manage({ axisId: menu.id, action: 'keep-default' })\n }\n >\n <Icon name=\"check\" />\n {requested({ axisId: menu.id, action: 'keep-default' }) ? 'Default-only request saved' : 'Keep default only'}\n </button>\n <button\n type=\"button\"\n className=\"isotone-menu-action isotone-danger\"\n disabled={busy || requested({ axisId: menu.id, action: 'remove-axis' })}\n onClick={() =>\n void manage({ axisId: menu.id, action: 'remove-axis' })\n }\n >\n <Icon name=\"trash\" />\n {requested({ axisId: menu.id, action: 'remove-axis' }) ? 'Removal request saved' : 'Remove selector & options'}\n </button>\n </>\n )}\n </div>\n {error && (\n <div className=\"isotone-menu-footer\">\n <p className=\"isotone-danger\" role=\"alert\">{error}</p>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction SaveDefaults({\n source,\n onSaved,\n}: {\n source: VariantsSource;\n onSaved?: () => void;\n}) {\n const [state, setState] = useState('');\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n useEffect(() => () => clearTimeout(timer.current), []);\n async function save() {\n if (state === 'Saving…') return;\n setState('Saving…');\n const selections: VariantSelections = { ...source.getSelections() };\n try {\n await source.saveDefaults?.(selections);\n setState('Saved for the agent');\n onSaved?.();\n } catch {\n setState('Could not save. Try again.');\n }\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setState(''), 2500);\n }\n return (\n <div className=\"isotone-save-row\">\n <button\n type=\"button\"\n className=\"isotone-save\"\n disabled={state === 'Saving…'}\n onClick={() => void save()}\n >\n Save as defaults\n </button>\n <span className=\"isotone-save-state\" role=\"status\">\n {state}\n </span>\n </div>\n );\n}\n","import { useLayoutEffect, useRef, type RefObject } from 'react';\nimport { MAX_ANIMATED_ITEMS, MOTION } from './motion';\n\ntype Position = { top: number; animation?: Animation };\n\nfunction clearPositions(positions: Map<string, Position>) {\n for (const item of positions.values()) item.animation?.cancel();\n positions.clear();\n}\n\n/** Reflow small visible lists only when their contents change. Read before writing. */\nexport function useLayoutMotion(ref: RefObject<HTMLElement | null>, revision: unknown, active = true) {\n const previous = useRef(new Map<string, Position>());\n // biome-ignore lint/correctness/useExhaustiveDependencies: revision signals a content/layout change without measuring on unrelated renders.\n useLayoutEffect(() => {\n const container = ref.current;\n const clear = () => clearPositions(previous.current);\n if (!container || !active) { clear(); return; }\n const elements = container.querySelectorAll<HTMLElement>('[data-motion-key]');\n if (elements.length > MAX_ANIMATED_ITEMS) { clear(); return; }\n const instant = container.closest('[data-instant=\"true\"]') ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches);\n if (instant) { clear(); return; }\n const measurements = Array.from(elements, element => {\n const key = element.dataset.motionKey ?? '';\n const old = previous.current.get(key);\n const transform = old?.animation ? getComputedStyle(element).transform : 'none';\n const offset = transform !== 'none' && typeof DOMMatrix !== 'undefined' ? new DOMMatrix(transform).m42 : 0;\n return { element, key, old, top: element.offsetTop, offset };\n });\n const next = new Map<string, Position>();\n for (const { element, key, old, top, offset } of measurements) {\n old?.animation?.cancel();\n let animation: Animation | undefined;\n const delta = old ? old.top + offset - top : 0;\n if (typeof element.animate === 'function') {\n if (old && Math.abs(delta) > 0.5) {\n animation = element.animate(\n [{ transform: `translateY(${delta}px)` }, { transform: 'translateY(0)' }],\n { duration: MOTION.reflow, easing: MOTION.easeOut },\n );\n } else if (!old) {\n animation = element.animate(\n [{ opacity: 0, transform: 'translateY(4px)' }, { opacity: 1, transform: 'translateY(0)' }],\n { duration: MOTION.exit, easing: MOTION.easeOut },\n );\n }\n }\n next.set(key, { top, animation });\n }\n for (const [key, item] of previous.current) if (!next.has(key)) item.animation?.cancel();\n previous.current = next;\n }, [ref, revision, active]);\n useLayoutEffect(() => {\n const media = typeof matchMedia === 'function' ? matchMedia('(prefers-reduced-motion: reduce)') : null;\n const changed = () => { if (media?.matches) clearPositions(previous.current); };\n media?.addEventListener('change', changed);\n return () => {\n media?.removeEventListener('change', changed);\n clearPositions(previous.current);\n };\n }, []);\n}\n","/** Auto follows the page at the dock; system follows the OS preference. */\nexport type IterationTheme = 'auto' | 'light' | 'dark' | 'system';\ntype ResolvedTheme = 'light' | 'dark';\ntype Color = { r: number; g: number; b: number; a: number };\n\n/** Computed colors usually use rgb(); let the browser convert other color spaces. */\nfunction parseColor(value: string): Color | null {\n const rgb = value.match(/^rgba?\\(([^)]+)\\)$/);\n if (rgb) {\n const parts = rgb[1].split(/[,\\s/]+/).filter(Boolean);\n const values = parts.map((part, i) =>\n Number.parseFloat(part) * (part.endsWith('%') ? (i === 3 ? 0.01 : 2.55) : 1),\n );\n if (values.length >= 3 && values.every(Number.isFinite))\n return { r: values[0], g: values[1], b: values[2], a: values[3] ?? 1 };\n }\n if (value === 'transparent') return { r: 0, g: 0, b: 0, a: 0 };\n if (!value || !globalThis.CSS?.supports('color', value)) return null;\n try {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n return { r, g, b, a: a / 255 };\n } catch {\n return null;\n }\n}\n\nfunction isPanel(node: Node | null): boolean {\n if (!node) return false;\n const element = node instanceof Element ? node : node.parentElement;\n if (element?.closest('[data-isotone]')) return true;\n const root = node.getRootNode();\n return root instanceof ShadowRoot && isPanel(root.host);\n}\n\n/** Include open shadow roots without letting our own shadow host affect the sample. */\nfunction paintStack(shadows?: Set<ShadowRoot>): Element[] {\n const x = Math.max(0, window.innerWidth - 44);\n const y = Math.max(0, window.innerHeight - 44);\n const elements = new Set<Element>();\n const visit = (element: Element) => {\n if (elements.has(element) || isPanel(element)) return;\n const shadow = element.shadowRoot;\n if (shadow) {\n shadows?.add(shadow);\n for (const child of shadow.elementsFromPoint?.(x, y) ?? []) {\n // Some browsers include ancestors outside the shadow tree in this result.\n if (child.getRootNode() === shadow) visit(child);\n }\n }\n elements.add(element);\n };\n for (const element of document.elementsFromPoint?.(x, y) ?? []) {\n if (element !== document.body && element !== document.documentElement) visit(element);\n }\n // Body paint covers the viewport even when its layout box is shorter than it.\n if (document.body) visit(document.body);\n visit(document.documentElement);\n return [...elements];\n}\n\nfunction systemTheme(): ResolvedTheme {\n return typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n}\n\n/**\n * Resolve actual paint at the dock, compositing transparent backgrounds over the\n * browser canvas. Background images and closed shadow roots cannot be sampled;\n * hosts using those can set an explicit theme or choose system.\n */\nexport function detectTheme(\n preference: IterationTheme = 'auto',\n shadows?: Set<ShadowRoot>,\n): ResolvedTheme {\n if (preference === 'light' || preference === 'dark') return preference;\n if (preference === 'system') return systemTheme();\n if (typeof document === 'undefined') return 'light';\n try {\n let remaining = 1;\n let r = 0, g = 0, b = 0;\n for (const element of paintStack(shadows)) {\n const parsed = parseColor(getComputedStyle(element).backgroundColor);\n if (!parsed || parsed.a <= 0) continue;\n const weight = parsed.a * remaining;\n r += parsed.r * weight;\n g += parsed.g * weight;\n b += parsed.b * weight;\n remaining *= 1 - parsed.a;\n if (remaining < 0.001) break;\n }\n const schemes = getComputedStyle(document.documentElement).colorScheme.split(/\\s+/);\n const darkCanvas = schemes.includes('dark') &&\n (!schemes.includes('light') || systemTheme() === 'dark');\n const canvas = darkCanvas ? 0 : 255;\n const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b + canvas * remaining) / 255;\n return luminance > 0.55 ? 'light' : 'dark';\n } catch {\n return 'light';\n }\n}\n\n/** Observe only the signals needed by the chosen mode, coalescing page changes per frame. */\nexport function observeTheme(\n onTheme: (theme: ResolvedTheme) => void,\n preference: IterationTheme = 'auto',\n): () => void {\n let current: ResolvedTheme | undefined;\n let frame: number | undefined;\n let disposed = false;\n const shadows = new Set<ShadowRoot>();\n const observer = preference === 'auto' ? new MutationObserver(records => {\n if (records.some(record => !isPanel(record.target))) schedule();\n }) : undefined;\n const observe = () => {\n if (!observer) return;\n observer.disconnect();\n const options = { attributes: true, childList: true, characterData: true, subtree: true };\n observer.observe(document.documentElement, options);\n for (const shadow of shadows) observer.observe(shadow, options);\n };\n const sample = () => {\n frame = undefined;\n if (disposed) return;\n shadows.clear();\n const next = detectTheme(preference, shadows);\n observe();\n if (next !== current) {\n current = next;\n onTheme(next);\n }\n };\n const schedule = () => { frame ??= window.requestAnimationFrame(sample); };\n sample();\n if (preference === 'light' || preference === 'dark') return () => {};\n\n const media = window.matchMedia?.('(prefers-color-scheme: dark)');\n media?.addEventListener('change', schedule);\n const pageEvent = (event: Event) => {\n if (!isPanel(event.target instanceof Node ? event.target : null)) schedule();\n };\n if (preference === 'auto') {\n window.addEventListener('resize', schedule);\n document.addEventListener('scroll', pageEvent, { capture: true, passive: true });\n // Capture non-bubbling stylesheet loads and palette animation completion.\n document.addEventListener('load', pageEvent, true);\n document.addEventListener('transitionend', pageEvent, true);\n document.addEventListener('animationend', pageEvent, true);\n }\n return () => {\n disposed = true;\n observer?.disconnect();\n if (frame !== undefined) window.cancelAnimationFrame(frame);\n media?.removeEventListener('change', schedule);\n window.removeEventListener('resize', schedule);\n document.removeEventListener('scroll', pageEvent, true);\n document.removeEventListener('load', pageEvent, true);\n document.removeEventListener('transitionend', pageEvent, true);\n document.removeEventListener('animationend', pageEvent, true);\n };\n}\n","import { showOverflowTitle } from './tooltips';\nimport type { IterationNote } from '../core/index';\n\n/** Pinned references and saved defaults use the same compact tag. */\nfunction SummaryTag({ label }: { label: string }) {\n return <span className=\"isotone-chip\"><span onPointerOver={showOverflowTitle}>{label}</span></span>;\n}\n\n/** Keep machine-directed requests readable without changing the agent's original text. */\nexport function NoteSummary({ note }: { note: IterationNote }) {\n if (!note.feedback.startsWith('[set-defaults]')) {\n const elements = note.elements ?? (note.element ? [note.element] : []);\n const references = [\n ...(note.variant ? [{\n key: `variant:${note.variant.axisId}`,\n label: `${note.variant.label}${note.variant.optionLabel ? ` / ${note.variant.optionLabel}` : ''}`,\n }] : []),\n ...elements.map(element => ({ key: element.selector, label: element.text || element.tag })),\n ];\n return <>\n <p>{note.feedback}</p>\n {references.length > 0 && <span className=\"isotone-meta\">\n {references.map(reference => <SummaryTag key={reference.key} label={reference.label} />)}\n </span>}\n </>;\n }\n const payload = note.payload && typeof note.payload === 'object' ? note.payload as Record<string, unknown> : {};\n const playground = payload.playground;\n const tags: { name: string; value: string }[] = [];\n if (playground && typeof playground === 'object' && !Array.isArray(playground)) {\n for (const [name, value] of Object.entries(playground)) {\n if (typeof value === 'string' || typeof value === 'number') tags.push({ name, value: String(value) });\n }\n } else {\n if (typeof payload.variants === 'string') for (const value of payload.variants.split(',').map(s => s.trim()).filter(Boolean)) tags.push({ name: 'variant', value });\n if (typeof payload.knobs === 'string') for (const pair of payload.knobs.split(',')) {\n const at = pair.indexOf(':');\n if (at > 0) tags.push({ name: pair.slice(0, at).trim(), value: pair.slice(at + 1).trim() });\n }\n }\n return <>\n <span className=\"isotone-request-heading\"><span className=\"isotone-request-kind\">Defaults</span><code>{note.route}</code></span>\n <span className=\"isotone-meta\">\n {tags.length ? <>{tags.slice(0, 3).map(tag => <SummaryTag key={`${tag.name}-${tag.value}`} label={`${tag.name} ${tag.value}`} />)}{tags.length > 3 && <span className=\"isotone-request-more\">+{tags.length - 3}</span>}</> : <code className=\"isotone-request-fallback\">{note.feedback.replace(/^\\[set-defaults\\]\\s*/, '')}</code>}\n </span>\n </>;\n}\n","import { useLayoutEffect, type RefObject } from 'react';\nimport { MAX_ANIMATED_ITEMS, MOTION } from './motion';\n\ntype Position = { x: number; y: number; width: number; height: number; animation?: Animation };\n\n/** Move panels without scaling their text, hit targets or corner shapes. */\nexport function useDockMotion(ref: RefObject<HTMLElement | null>, visible: boolean) {\n useLayoutEffect(() => {\n const root = ref.current;\n if (!root || !visible) return;\n const previous = new Map<HTMLElement, Position>();\n const exits = new Map<HTMLElement, { ghost: HTMLElement; animation: Animation }>();\n const reduced = typeof matchMedia === 'function' ? matchMedia('(prefers-reduced-motion: reduce)') : null;\n const removeExit = (element: HTMLElement) => {\n const exit = exits.get(element);\n if (!exit) return;\n exit.animation.cancel();\n exit.ghost.remove();\n exits.delete(element);\n };\n const measure = () => {\n const instant = root.dataset.instant === 'true' || reduced?.matches;\n // Finish all reads before cancelling animations or adding exit snapshots.\n const panels = Array.from(root.querySelectorAll<HTMLElement>('.isotone-panel:not(.isotone-exit)'), element => {\n const open = element.dataset.open === 'true';\n const transform = open ? getComputedStyle(element).transform : 'none';\n const matrix = transform !== 'none' && typeof DOMMatrix !== 'undefined' ? new DOMMatrix(transform) : undefined;\n return { element, open, rect: open ? element.getBoundingClientRect() : null, dx: matrix?.m41 ?? 0, dy: matrix?.m42 ?? 0 };\n });\n const current = new Set(panels.map(({ element }) => element));\n for (const [element, item] of previous) {\n if (current.has(element)) continue;\n item.animation?.cancel();\n previous.delete(element);\n removeExit(element);\n }\n for (const { element, open, rect, dx, dy } of panels) {\n const old = previous.get(element);\n if (!open || !rect) {\n if (!old) continue;\n old.animation?.cancel();\n removeExit(element);\n if (!instant && typeof element.animate === 'function' && element.querySelectorAll('[data-motion-key]').length <= MAX_ANIMATED_ITEMS) {\n const ghost = element.cloneNode(true) as HTMLElement;\n ghost.classList.add('isotone-exit');\n ghost.dataset.open = 'true';\n ghost.inert = true;\n ghost.setAttribute('aria-hidden', 'true');\n ghost.removeAttribute('id');\n for (const node of ghost.querySelectorAll('[id]')) node.removeAttribute('id');\n Object.assign(ghost.style, { position: 'fixed', left: `${old.x}px`, top: `${old.y}px`, width: `${old.width}px`, height: `${old.height}px`, pointerEvents: 'none' });\n root.appendChild(ghost);\n const animation = ghost.animate(\n [{ opacity: 1, transform: 'translateY(0)' }, { opacity: 0, transform: 'translateY(4px)' }],\n { duration: MOTION.exit, easing: MOTION.easeOut, fill: 'forwards' },\n );\n exits.set(element, { ghost, animation });\n animation.onfinish = () => removeExit(element);\n }\n previous.delete(element);\n continue;\n }\n removeExit(element);\n const x = rect.x - dx;\n const y = rect.y - dy;\n if (old && old.x === x && old.y === y) {\n old.width = rect.width;\n old.height = rect.height;\n if (instant) old.animation?.cancel();\n continue;\n }\n old?.animation?.cancel();\n const animation = !instant && typeof element.animate === 'function' ? element.animate(\n [{ transform: `translate(${old ? old.x + dx - x : 0}px, ${old ? old.y + dy - y : 6}px)`, opacity: old ? 1 : 0 }, { transform: 'translate(0, 0)', opacity: 1 }],\n { duration: MOTION.enter, easing: MOTION.easeOut },\n ) : undefined;\n previous.set(element, { x, y, width: rect.width, height: rect.height, animation });\n }\n if (instant) for (const element of exits.keys()) removeExit(element);\n };\n measure();\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(measure) : undefined;\n observer?.observe(root);\n const mutations = new MutationObserver(records => {\n const changed = records.some(record => {\n if (record.type === 'attributes') return record.target === root ||\n (record.target instanceof Element && record.target.matches('.isotone-panel:not(.isotone-exit)'));\n return [...record.addedNodes, ...record.removedNodes].some(node =>\n node instanceof Element && node.matches('.isotone-panel:not(.isotone-exit)'));\n });\n if (changed) measure();\n });\n mutations.observe(root, { subtree: true, childList: true, attributes: true, attributeFilter: ['data-open', 'data-instant'] });\n reduced?.addEventListener('change', measure);\n window.addEventListener('resize', measure);\n return () => {\n observer?.disconnect();\n mutations.disconnect();\n reduced?.removeEventListener('change', measure);\n window.removeEventListener('resize', measure);\n for (const element of exits.keys()) removeExit(element);\n for (const item of previous.values()) item.animation?.cancel();\n };\n }, [ref, visible]);\n}\n","import { createRoot } from 'react-dom/client';\n\nimport { createIterationStore, type RouteGateOptions } from '../core/index';\nimport {\n createOverlayVariantsSource,\n knobDelta,\n OVERLAY_DEFAULT_OPTION,\n type VariantsSource,\n VARIANTS_ENDPOINT,\n} from '../core/variants';\nimport { IterationPanel, type IterationShortcut } from './IterationPanel';\nimport { ensurePanelStyles } from './styles';\nimport type { IterationTheme } from './theme';\n\nexport interface MountIterationOptions {\n /** Auto follows the page at the dock. System follows the OS preference. */\n theme?: IterationTheme;\n /** Local adapter endpoint for automatic update notices. */\n updateEndpoint?: string;\n /** Defaults to Cmd/Ctrl+Shift+Period. false disables keyboard access. */\n shortcut?: IterationShortcut | false;\n /** The notes endpoint the dev plugin serves (or a framework preset). Omit\n * it and the panel has no Notes tab: a production host that only wants\n * variants passes a source and nothing else. */\n endpoint?: string;\n /**\n * Variants for the panel. A `VariantsSource` is rendered as-is; `'overlay'`\n * builds the overlay adapter against the Vite plugin's same-origin\n * endpoint. With neither this nor `endpoint`, nothing mounts.\n */\n variants?: VariantsSource | 'overlay';\n /** Which tab a tabbed panel opens on until the reviewer picks one. */\n defaultTab?: 'variants' | 'notes';\n /** Optional localStorage namespace for multi-app origins. */\n key?: string;\n /** Route visibility rule; default hides auth/error pages. */\n rule?: RouteGateOptions;\n /** Override the auto-detected pathname (sub-apps). Default: pathname. */\n getRoute?: () => string;\n /** Host context attached to each new note as its opaque payload — see\n * IterationPanelProps.getPayload. */\n getPayload?: () => unknown;\n}\n\n/**\n * Run a `createRoot` call and undo what it leaves on `document`.\n *\n * react-dom dedupes its delegated listeners with a private marker property on\n * the container. A root on any non-document container (our shadow root) also\n * stamps that marker on the container's owner document, because the one\n * event that has to live on the document, `selectionchange`, is deduped\n * against it. The same check then short-circuits a root created *on* the\n * document: a host that runs `hydrateRoot(document, …)` after our root exists\n * (React Router 7's default entry.client, React 19's whole-document pattern)\n * finds the marker already set and attaches none of its click, key or pointer\n * listeners. Every React handler in the host is dead, and unmounting our root\n * cannot bring them back. Seen with react-dom 19.2; the code is unchanged\n * since 18.\n *\n * Whether our root wins that race depends on module load order, which we do\n * not control, so instead the document is put back exactly as we found it.\n * The marker's name carries a per-instance random suffix, hence a diff of the\n * document's own keys around the call rather than a hard-coded name. Our own\n * `selectionchange` listener stays attached to the document and serves a\n * later document-level host root too; a later element-level host attaches a\n * second one, which React's select plugin already dedupes by selection.\n */\nfunction withDocumentUntouched<T>(create: () => T): T {\n const before = new Set(Object.getOwnPropertyNames(document));\n const result = create();\n for (const key of Object.getOwnPropertyNames(document)) {\n if (!before.has(key)) Reflect.deleteProperty(document, key);\n }\n return result;\n}\n\n/**\n * Self-mount the Iteration panel into a shadow root on `document.body`,\n * outside any app tree, tracking `window.location.pathname` so it needs no\n * router integration.\n *\n * The shadow root is what makes this safe to drop into an app nobody vetted:\n * the host's resets, its `button` and `textarea` rules, its stacking and its\n * global handlers stop at the boundary, so the panel looks the same in every\n * app. Inherited properties and custom properties still cross, which is\n * deliberate — the panel reads `--font-sans` and `--foreground` from the host\n * so it matches the surrounding theme.\n *\n * The host element carries `data-isotone`, and that is load-bearing:\n * `document.elementFromPoint` retargets to the host for anything inside a\n * shadow root, so the element picker's self-exclusion matches on it.\n *\n * The host is created at runtime by `mountIteration` (never part of any HTML\n * React hydrates) and is watched by a MutationObserver: if a whole-document\n * render — a React Router hydration failure made worse by an extension, for\n * instance — replaces `<body>` and drops the host, it is re-appended to the\n * new body, shadow root and all, instead of a fresh mount losing panel state.\n */\nexport function mountIteration(opts: MountIterationOptions): () => void {\n const getRoute = opts.getRoute ?? (() => window.location.pathname);\n const variants =\n opts.variants === 'overlay'\n ? overlaySourceWithSave(getRoute, opts.endpoint, opts.key)\n : opts.variants;\n // Nothing to show: no notes to write and no variants to pick. A production\n // host that forgot its source gets no empty launcher in the corner.\n if (!opts.endpoint && !variants) return () => {};\n // A variants-only host whose source has no axes on this page and no way to\n // get some later (no `refresh`) would mount an empty shadow root on every\n // such page. A hosted preview site is exactly that on axis-less\n // experiments, so skip the mount rather than leave a hollow host div.\n if (\n !opts.endpoint &&\n variants &&\n variants.getAxes().length === 0 &&\n typeof (variants as { refresh?: unknown }).refresh !== 'function'\n ) {\n return () => {};\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-isotone', 'root');\n const attachHost = () => {\n if (!host.isConnected) document.body.appendChild(host);\n return host;\n };\n attachHost();\n const shadow = host.attachShadow({ mode: 'open' });\n // Eagerly, so the panel never paints one frame unstyled.\n ensurePanelStyles(shadow);\n const root = withDocumentUntouched(() => createRoot(shadow));\n\n // Re-attach the host if a full-document render evicts it from body. In a\n // whole-document React Router app an extension-triggered hydration failure\n // makes React replace `document.body` wholesale; our host (appended at\n // runtime, never part of what React rendered) falls away with the old body.\n // Re-appending the SAME element restores the panel with its shadow root and\n // state intact — no second render, no duplication. The observer is on\n // `<html>` so a bare `body.replaceChildren()` also counts as a change; body\n // alone catches appendChild-of-a-new-body but not replaceChildren.\n const guard = new MutationObserver(() => {\n if (disposed) return;\n if (!host.isConnected) attachHost();\n });\n guard.observe(document.documentElement, { childList: true, subtree: true });\n\n function render() {\n root.render(\n <IterationPanel\n route={getRoute()}\n store={{ endpoint: opts.endpoint, key: opts.key }}\n rule={opts.rule}\n getPayload={opts.getPayload}\n variants={variants}\n defaultTab={opts.defaultTab}\n shortcut={opts.shortcut}\n updateEndpoint={opts.updateEndpoint}\n theme={opts.theme}\n />,\n );\n }\n\n const listeners: (() => void)[] = [];\n // Called from popstate/history wrappers that a router may invoke from\n // inside its own commit (Next dev does this on navigation). Keep every\n // `root.render` off that path — a render scheduled mid-commit fires React\n // 19 dev's \"useInsertionEffect must not schedule updates\", so coalesze to\n // one pending frame and flush once the host has settled.\n let disposed = false;\n let pending = false;\n const notify = () => {\n if (pending || disposed) return;\n pending = true;\n setTimeout(() => {\n pending = false;\n if (!disposed) render();\n }, 0);\n };\n\n // Deferred, not synchronous — the host may call mountIteration from an\n // effect (a React host mounts it from one), and a synchronous secondary root\n // render fires React 19 dev's \"useInsertionEffect must not schedule\n // updates\" because it commits while the host's own commit is in flight.\n // One macrotask later the host has settled; the panel simply mounts a\n // frame later, which is invisible because the host element starts empty.\n setTimeout(() => {\n if (disposed) return;\n render();\n window.addEventListener('popstate', notify);\n listeners.push(() => window.removeEventListener('popstate', notify));\n for (const evt of ['pushState', 'replaceState'] as const) {\n const orig = window.history[evt].bind(window.history);\n window.history[evt] = ((...a: Parameters<History['pushState']>) => {\n const r = orig(...a);\n notify();\n return r;\n }) as typeof orig;\n listeners.push(() => {\n window.history[evt] = orig as never;\n });\n }\n }, 0);\n\n return () => {\n disposed = true;\n for (const off of listeners) off();\n guard.disconnect();\n // Deferred, not synchronous: a React host calls this from an effect\n // cleanup, and unmounting our root while the host's render is in flight\n // is a race React 19 rejects (\"Attempted to synchronously unmount a root\n // while React was already rendering\"). One macrotask later the host's\n // commit is done; nothing observable changes for a vanilla host.\n setTimeout(() => {\n root.unmount();\n host.remove();\n }, 0);\n };\n}\n\n/**\n * The overlay adapter's source, with \"Save as defaults\" wired to the notes\n * file. Landing an overlay variant means copying files over the real ones,\n * which is the agent's move (`variant promote`), so the button does what the\n * host with its own axes does: it files one `[set-defaults]` note naming the reviewer's picks\n * across every selector on the route, and the agent promotes those. The\n * other variants are untouched; only an explicit ask removes a variant.\n * Without a notes endpoint there is nobody to file to, and the row stays\n * hidden.\n */\nfunction overlaySourceWithSave(\n getRoute: () => string,\n endpoint: string | undefined,\n key: string | undefined,\n): VariantsSource {\n const source = createOverlayVariantsSource({ endpoint: VARIANTS_ENDPOINT, getRoute });\n if (!endpoint) return source;\n const notes = createIterationStore({ endpoint, key });\n source.saveDefaults = async (selections) => {\n // In axis order, so the note reads top to bottom like the panel did.\n const picked = source\n .getAxes()\n // Knobs are numbers, not alternatives; they ride in their own clause below.\n .filter((axis) => axis.kind === undefined || axis.kind === 'select')\n .flatMap((axis) => {\n const id = selections[axis.id];\n if (!id || id === OVERLAY_DEFAULT_OPTION) return [];\n const variant = source.list?.variants.find((v) => v.id === id);\n const label = variant?.label ?? id;\n // The group names the element and the variant names the alternative;\n // a lone variant whose group is named after it needs no prefix.\n const named = axis.label === label ? label : `${axis.label}: ${label}`;\n return [{ id, named, element: variant?.element ?? null }];\n });\n // Knobs the reviewer moved off their defaults ride in the same note, as\n // the value the panel showed, so the agent can write the number in.\n const moved = knobDelta(source.knobs.axes, source.knobs.values);\n // Only the decision, nothing about the other variants: they stay until\n // the reviewer says otherwise, in their own words.\n const parts: string[] = [];\n if (picked.length) {\n parts.push(`Make the default: ${picked.map((p) => `\"${p.named}\" (${p.id})`).join('; ')}.`);\n }\n if (moved.length) {\n parts.push(`Knobs: ${moved.map((m) => `${m.axis.label} ${m.shown} (${m.axis.id})`).join('; ')}.`);\n }\n const feedback = parts.length\n ? `[set-defaults] ${parts.join(' ')}`\n : '[set-defaults] The current defaults stay on this route.';\n await notes.saveNote(\n getRoute(),\n feedback,\n picked[0]?.element ?? null,\n null,\n {\n variants: picked.length ? picked.map((p) => p.id).join(', ') : OVERLAY_DEFAULT_OPTION,\n ...(moved.length\n ? { knobs: moved.map((m) => `${m.axis.id}:${m.value}`).join(', ') }\n : {}),\n },\n { w: window.innerWidth, h: window.innerHeight },\n );\n };\n return source;\n}\n"],"mappings":"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","names":["useEffect","useId","useLayoutEffect","useMemo","useRef","useState","createElement","forwardRef","createElement","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","Icon","jsx","Icon","useEffect","useMemo","useRef","useState","useRef","useRef","Fragment","jsx","jsxs","useState","useEffect","useMemo","selections","useRef","Icon","Fragment","jsx","jsxs","useLayoutEffect","useLayoutEffect","animation","jsx","jsxs","useState","useRef","useEffect","useId","useLayoutEffect","useMemo","feedback","Icon","jsx"]}
1
+ {"version":3,"sources":["../src/react/tooltips.ts","../src/react/IterationPanel.tsx","../src/react/appearance.ts","../src/react/motion.ts","../src/react/feedback-layout.ts","../src/react/pill-active.ts","../src/react/UpdateNotice.tsx","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toKebabCase.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toLucideIconData.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toCamelCase.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/toPascalCase.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/mergeClasses.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/build/defaultAttributes.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/build/buildLucideIconNode.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/build/buildLucideIconForReact.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/shared/src/utils/hasA11yProp.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/context.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/Icon.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/arrow-up.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/check.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/chevron-down.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/crosshair.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/gem.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/message-square.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/rotate-ccw.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/sliders-horizontal.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/trash.ts","../node_modules/.pnpm/lucide-react@1.55.0_@types+react@19.2.18_react@19.2.8/node_modules/lucide-react/src/icons/x.ts","../src/react/icons.tsx","../src/react/styles.ts","../src/react/VariantsView.tsx","../src/react/useLayoutMotion.ts","../src/react/theme.ts","../src/react/NoteSummary.tsx","../src/react/useDockMotion.ts","../src/react/IterationMount.tsx"],"sourcesContent":["import type { PointerEvent } from 'react';\n\n/** Measure on hover so long lists need no observers or eager layout reads. */\nexport function showOverflowTitle(event: PointerEvent<HTMLElement>) {\n const label = event.currentTarget;\n if (label.scrollWidth > label.clientWidth) label.title = label.textContent?.trim() ?? '';\n else label.removeAttribute('title');\n}\n","import { showOverflowTitle } from './tooltips';\nimport { FEEDBACK_STORAGE_KEY, readBrowserStorage, removeBrowserStorage, writeBrowserStorage } from '../core/browser-storage';\nimport { MAX_FEEDBACK_LENGTH } from '../core/limits';\nimport { createNoteId } from '../core/id';\nimport { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n createIterationStore,\n describeIterationElement,\n elementAsNode,\n isRouteVisible,\n type IterationElement,\n type IterationNote,\n type IterationStoreConfig,\n type RouteGateOptions,\n type VariantReference,\n} from '../core/index';\nimport { type VariantAction, type VariantsSource, visibleAxes } from '../core/variants';\nimport { ensurePanelStyles } from './styles';\nimport { refreshSource, useVariantsSource, VariantsView } from './VariantsView';\nimport { detectTheme, observeTheme, type IterationTheme } from './theme';\nimport { NoteSummary } from './NoteSummary';\nimport { Icon } from './icons';\nimport { useLayoutMotion } from './useLayoutMotion';\nimport { useDockMotion } from './useDockMotion';\nimport { UpdateNotice } from './UpdateNotice';\n\nexport interface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\nexport interface IterationShortcut {\n /** Physical key code, stable across keyboard layouts. Default: Period. */\n code: string;\n mod?: boolean;\n shift?: boolean;\n alt?: boolean;\n}\nexport interface IterationPanelProps {\n /** Auto follows the page at the dock. System follows the OS preference. */\n theme?: IterationTheme;\n /** Local adapter endpoint for an optional, nonblocking update notice. */\n updateEndpoint?: string;\n route: string;\n store: IterationStoreConfig;\n rule?: RouteGateOptions;\n getPayload?: () => unknown;\n variants?: VariantsSource;\n /** Initial surface. Kept for compatibility; surfaces can now open together. */\n defaultTab?: 'variants' | 'notes';\n /** Default: Cmd/Ctrl+Shift+Period. false disables the shortcut. */\n shortcut?: IterationShortcut | false;\n}\nconst DEFAULT_SHORTCUT: IterationShortcut = {\n code: 'Period',\n mod: true,\n shift: true,\n};\n\nexport function IterationPanel({\n route,\n theme: themePreference = 'auto',\n updateEndpoint,\n store: storeCfg,\n rule,\n getPayload,\n variants,\n defaultTab = 'notes',\n shortcut = DEFAULT_SHORTCUT,\n}: IterationPanelProps) {\n const [store] = useState(() => createIterationStore(storeCfg));\n const nsKey = storeCfg.key ?? FEEDBACK_STORAGE_KEY;\n const [notesOpen, setNotesOpen] = useState(false);\n const [variantsOpen, setVariantsOpen] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [picking, setPicking] = useState(false);\n const [targets, setTargets] = useState<IterationElement[]>([]);\n const [variantTarget, setVariantTarget] = useState<VariantReference | null>(\n null,\n );\n const [hoverRect, setHoverRect] = useState<Rect | null>(null);\n const [rects, setRects] = useState<(Rect & { selector: string })[]>([]);\n const [text, setText] = useState('');\n const [notes, setNotes] = useState<IterationNote[]>([]);\n const noteRevision = useRef(0);\n const pendingWrites = useRef(0);\n const noteRequest = useRef(0);\n const [editing, setEditing] = useState<IterationNote | null>(null);\n const [notice, setNotice] = useState('');\n const [theme, setTheme] = useState(() => detectTheme(themePreference));\n const [instant, setInstant] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const focusFrame = useRef(0);\n useEffect(() => () => cancelAnimationFrame(focusFrame.current), []);\n const listRef = useRef<HTMLUListElement>(null);\n useLayoutMotion(listRef, notes, notesOpen);\n const fabRef = useRef<HTMLButtonElement>(null);\n const previousFocus = useRef<HTMLElement | null>(null);\n const draftRestored = useRef('');\n const restoringDraft = useRef(false);\n const id = useId();\n const notesAvailable = Boolean(storeCfg.endpoint);\n useVariantsSource(variants);\n const variantsAvailable = Boolean(\n variants &&\n visibleAxes(variants.getAxes(), variants.getSelections()).length,\n );\n const visible =\n isRouteVisible(route, rule) &&\n (notesAvailable || variantsAvailable || variantsOpen);\n const hasContext = Boolean(editing || variantTarget || targets.length || notice);\n // Context changes the scroll-through inset; measure again when that changes\n // or a route restores the composer after its DOM was removed.\n // biome-ignore lint/correctness/useExhaustiveDependencies: hasContext changes the CSS inset used by scrollHeight.\n useLayoutEffect(() => {\n const field = textareaRef.current;\n if (!field || !notesOpen || !visible) return;\n const resize = () => {\n field.style.height = '0px';\n field.style.height = `${text ? Math.max(22, field.scrollHeight) : 22}px`;\n field.dataset.scrolled = String(field.scrollTop > 0);\n };\n resize();\n if (typeof ResizeObserver === 'undefined') return;\n let width = field.clientWidth;\n const observer = new ResizeObserver(() => {\n if (field.clientWidth !== width) { width = field.clientWidth; resize(); }\n });\n observer.observe(field);\n return () => observer.disconnect();\n }, [text, notesOpen, visible, hasContext]);\n useEffect(() => {\n if (!visible) {\n setHovered(false);\n setFocused(false);\n setExpanded(false);\n return;\n }\n const root = rootRef.current;\n if (!root) return;\n // Native enter/leave survive transitions from a host React tree into our shadow root.\n const enter = (event: PointerEvent) => {\n if ((event.pointerType === 'mouse' || event.pointerType === 'pen') && event.buttons === 0) {\n root.setAttribute('data-instant', 'false');\n setInstant(false);\n setHovered(true);\n }\n };\n const leave = () => { setHovered(false); setExpanded(false); };\n root.addEventListener('pointerenter', enter);\n root.addEventListener('pointerleave', leave);\n return () => {\n root.removeEventListener('pointerenter', enter);\n root.removeEventListener('pointerleave', leave);\n };\n }, [visible]);\n useDockMotion(rootRef, visible);\n const open = notesOpen || variantsOpen;\n const railOpen = expanded || hovered || (focused && instant) || open || picking;\n useEffect(() => {\n if (!railOpen || !instant) return;\n const active = (rootRef.current?.getRootNode() as Document | ShadowRoot)?.activeElement;\n if (active === fabRef.current) rootRef.current?.querySelector<HTMLButtonElement>('.isotone-rail-button')?.focus();\n }, [railOpen, instant]);\n const draftKey = `${nsKey}::draft::${route}`;\n const visibleNotes = useMemo(() => notes\n .filter((n) => !n.done)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt)), [notes]);\n const pendingActions = useMemo(() => notes.flatMap(n =>\n !n.done && n.route === route && n.variantAction ? [n.variantAction] : []), [notes, route]);\n const shortcutLabel = shortcut\n ? [\n shortcut.mod ? '⌘/Ctrl' : '',\n shortcut.alt ? 'Alt' : '',\n shortcut.shift ? 'Shift' : '',\n shortcut.code === 'Period' ? '.' : shortcut.code.replace(/^Key/, ''),\n ]\n .filter(Boolean)\n .join('+')\n : '';\n\n function loadNotes() {\n if (!notesAvailable) return;\n const request = ++noteRequest.current;\n const revision = noteRevision.current;\n void store\n .listNotes()\n .then((fresh) => {\n // An old refresh must not restore deleted notes or undo optimistic edits.\n if (request !== noteRequest.current || revision !== noteRevision.current || pendingWrites.current) return;\n setNotes(fresh);\n })\n .catch(() => {});\n }\n function beginNoteWrite() {\n noteRevision.current++;\n pendingWrites.current++;\n return () => {\n noteRevision.current++;\n pendingWrites.current--;\n };\n }\n // Focus the composer after a pin without leaving select mode.\n const keepPicking = useRef(false);\n const focusWhilePicking = useCallback(() => {\n cancelAnimationFrame(focusFrame.current);\n focusFrame.current = requestAnimationFrame(() => {\n keepPicking.current = true;\n textareaRef.current?.focus();\n keepPicking.current = false;\n });\n }, []);\n const focusComposer = useCallback(() => {\n cancelAnimationFrame(focusFrame.current);\n focusFrame.current = requestAnimationFrame(() =>\n textareaRef.current?.focus(),\n );\n }, []);\n function closeAll() {\n cancelAnimationFrame(focusFrame.current);\n setNotesOpen(false);\n setVariantsOpen(false);\n setPicking(false);\n setExpanded(false);\n setHovered(false);\n (previousFocus.current?.isConnected\n ? previousFocus.current\n : fabRef.current\n )?.focus();\n }\n function openInitial() {\n previousFocus.current = document.activeElement as HTMLElement | null;\n setExpanded(true);\n if ((defaultTab === 'variants' || !notesAvailable) && variantsAvailable)\n setVariantsOpen(true);\n else {\n setNotesOpen(true);\n focusComposer();\n }\n }\n function feedback(reference: VariantReference) {\n setVariantTarget(reference);\n setNotesOpen(true);\n setExpanded(true);\n focusComposer();\n }\n async function queueRemoval(action: VariantAction, reference: VariantReference) {\n const description = action.action === 'remove-option'\n ? `Remove “${reference.optionLabel}” from ${reference.label}.`\n : action.action === 'keep-default'\n ? `Keep only the default for ${reference.label}; remove its selector and alternatives.`\n : `Remove ${reference.label}, its selector and all alternatives.`;\n const feedback = `[${action.action}] ${description}`;\n const context = { variant: reference, variantAction: action };\n const finish = beginNoteWrite();\n try {\n const savedId = await store.saveNote(route, feedback, null, null, getPayload?.(),\n { w: innerWidth, h: innerHeight }, context);\n setNotes(prev => [...prev, { id: savedId, route, feedback, element: null,\n done: false, createdAt: new Date().toISOString(), ...context }]);\n setNotesOpen(true);\n } finally {\n finish();\n }\n }\n function cancelEdit() {\n setEditing(null);\n setText('');\n setTargets([]);\n setVariantTarget(null);\n }\n\n async function send() {\n const value = text.trim();\n if (!value) return;\n if (value.length > MAX_FEEDBACK_LENGTH) {\n setNotice(`Feedback must be at most ${MAX_FEEDBACK_LENGTH} characters.`);\n return;\n }\n const context = { elements: targets, variant: variantTarget, ...(editing?.variantAction ? { variantAction: editing.variantAction } : {}) };\n const noteRoute = editing?.route ?? route;\n const element = targets[0] ?? null;\n const tempId = editing?.id ?? `pending-${createNoteId()}`;\n const entry: IterationNote = {\n ...(editing ?? {}),\n id: tempId,\n route: noteRoute,\n feedback: value,\n element,\n ...context,\n done: false,\n createdAt: editing?.createdAt ?? new Date().toISOString(),\n };\n const payload = editing ? undefined : getPayload?.();\n const previous = editing;\n const finish = beginNoteWrite();\n setNotes((prev) =>\n previous\n ? prev.map((n) => (n.id === tempId ? entry : n))\n : [...prev, entry],\n );\n cancelEdit();\n setNotice('');\n focusComposer();\n try {\n const savedId = await store.saveNote(\n noteRoute,\n value,\n element,\n previous?.id ?? null,\n payload,\n { w: innerWidth, h: innerHeight },\n context,\n );\n setNotes((prev) =>\n prev.map((n) => (n.id === tempId ? { ...n, id: savedId } : n)),\n );\n } catch {\n setNotes((prev) =>\n previous\n ? prev.map((n) => (n.id === tempId ? previous : n))\n : prev.filter((n) => n.id !== tempId),\n );\n setText(value);\n setTargets(context.elements);\n setVariantTarget(context.variant);\n setEditing(previous);\n setNotice('Could not save. Your feedback is still here.');\n } finally {\n finish();\n }\n }\n function beginEdit(note: IterationNote) {\n setEditing(note);\n setText(note.feedback);\n setTargets(note.elements ?? (note.element ? [note.element] : []));\n setVariantTarget(note.variant ?? null);\n focusComposer();\n }\n async function removeNote(note: IterationNote) {\n const finish = beginNoteWrite();\n setNotes((prev) => prev.filter((n) => n.id !== note.id));\n if (editing?.id === note.id) cancelEdit();\n try {\n await store.deleteNote(note.id);\n } catch {\n setNotes((prev) => [...prev, note]);\n setNotice('Could not delete the note. Try again.');\n } finally {\n finish();\n }\n }\n\n // Reopen/revisit fetches fresh state without a background polling loop.\n // biome-ignore lint/correctness/useExhaustiveDependencies: open-time refresh; store is stable.\n useEffect(() => {\n loadNotes();\n }, [notesOpen, variantsOpen, route]);\n useEffect(() => {\n if (variants && notesOpen && !variantsOpen) refreshSource(variants);\n }, [notesOpen, variantsOpen, variants]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: a network-backed source starts empty.\n useEffect(() => {\n if (variants && !variantsAvailable) refreshSource(variants);\n }, [variants]);\n useEffect(() => {\n if (draftRestored.current === draftKey) return;\n draftRestored.current = draftKey;\n restoringDraft.current = true;\n setEditing(null);\n setText('');\n setTargets([]);\n setVariantTarget(null);\n try {\n const raw = readBrowserStorage(localStorage, draftKey);\n if (!raw) return;\n try {\n const draft = JSON.parse(raw);\n if (draft && typeof draft.text === 'string') {\n setText(draft.text);\n setTargets(Array.isArray(draft.elements) ? draft.elements : []);\n setVariantTarget(draft.variant ?? null);\n } else setText(raw);\n } catch {\n setText(raw);\n }\n } catch {}\n }, [draftKey]);\n useEffect(() => {\n // Restoration commits after this effect pass; never save the previous route's draft over it.\n if (restoringDraft.current) { restoringDraft.current = false; return; }\n if (editing || draftRestored.current !== draftKey) return;\n try {\n if (!text && targets.length === 0 && !variantTarget)\n removeBrowserStorage(localStorage, draftKey);\n else\n writeBrowserStorage(localStorage,\n draftKey,\n JSON.stringify({ text, elements: targets, variant: variantTarget }),\n );\n } catch {}\n }, [text, targets, variantTarget, editing, draftKey]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: scroll follows new notes.\n useEffect(() => {\n const el = listRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }, [notes, notesOpen]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-sample the surrounding page when opened.\n useLayoutEffect(() => {\n if (!visible) return;\n const root = rootRef.current?.getRootNode();\n if (root instanceof ShadowRoot || root instanceof Document)\n ensurePanelStyles(root);\n return observeTheme(setTheme, themePreference);\n }, [visible, open, route, themePreference]);\n\n // Capture phase still works while typing. Browser/OS-reserved chords never reach a page.\n useEffect(() => {\n if (!visible) return;\n const onKey = (e: KeyboardEvent) => {\n rootRef.current?.setAttribute('data-instant', 'true');\n setInstant(true);\n if (!shortcut || e.repeat || e.isComposing) return;\n if (\n e.code !== shortcut.code ||\n Boolean(e.metaKey || e.ctrlKey) !== Boolean(shortcut.mod) ||\n e.shiftKey !== Boolean(shortcut.shift) ||\n e.altKey !== Boolean(shortcut.alt)\n )\n return;\n e.preventDefault();\n e.stopImmediatePropagation();\n if (\n notesOpen &&\n textareaRef.current ===\n (rootRef.current?.getRootNode() as Document | ShadowRoot)\n ?.activeElement\n )\n closeAll();\n else if (notesAvailable) {\n if (!open)\n previousFocus.current = document.activeElement as HTMLElement;\n setNotesOpen(true);\n setExpanded(true);\n setPicking(false);\n focusComposer();\n } else setVariantsOpen((v) => !v);\n };\n const onPointer = () => {\n rootRef.current?.setAttribute('data-instant', 'false');\n setInstant(false);\n };\n window.addEventListener('keydown', onKey, true);\n window.addEventListener('pointerdown', onPointer, true);\n return () => {\n window.removeEventListener('keydown', onKey, true);\n window.removeEventListener('pointerdown', onPointer, true);\n };\n });\n\n useEffect(() => {\n if (!open || picking) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || e.defaultPrevented) return;\n if (editing) cancelEdit();\n else closeAll();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n });\n\n useEffect(() => {\n if (!picking) return;\n const cursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n let frame = 0;\n const elementAt = (e: MouseEvent) => {\n const el = e.detail === 0 && e.type === 'click'\n ? e.composedPath().find((node): node is Element => node instanceof Element)\n : document.elementFromPoint(e.clientX, e.clientY);\n return el && !el.closest('[data-isotone]') ? el : null;\n };\n const onMove = (e: MouseEvent) => {\n cancelAnimationFrame(frame);\n const deferred = e.shiftKey;\n frame = requestAnimationFrame(() => {\n const el = deferred ? null : elementAt(e);\n setHoverRect(el ? el.getBoundingClientRect() : null);\n });\n };\n const toggleTarget = (el: Element) => {\n const target = describeIterationElement(elementAsNode(el));\n setTargets((prev) =>\n prev.some((t) => t.selector === target.selector)\n ? prev.filter((t) => t.selector !== target.selector)\n : prev.length < 50\n ? [...prev, target]\n : prev,\n );\n };\n const onClick = (e: MouseEvent) => {\n // Shift passes the click through so the page can open menus and tabs first.\n if (e.shiftKey) return;\n const el = elementAt(e);\n if (!el) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n toggleTarget(el);\n focusWhilePicking();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === ' ') {\n const el = e.composedPath().find((node): node is Element => node instanceof Element);\n if (!el || el === document.body || el.closest('[data-isotone], input, textarea, select, [contenteditable]')) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n if (!e.repeat) toggleTarget(el);\n return;\n }\n if (e.key !== 'Escape' && e.key !== 'Enter') return;\n // Enter in the composer sends; picking finishes only from the page.\n if (\n e.composedPath().includes(textareaRef.current as EventTarget) &&\n e.key === 'Enter'\n )\n return;\n e.preventDefault();\n e.stopImmediatePropagation();\n setPicking(false);\n setNotesOpen(true);\n focusComposer();\n };\n window.addEventListener('mousemove', onMove, true);\n window.addEventListener('click', onClick, true);\n window.addEventListener('keydown', onKey, true);\n return () => {\n document.body.style.cursor = cursor;\n cancelAnimationFrame(frame);\n setHoverRect(null);\n window.removeEventListener('mousemove', onMove, true);\n window.removeEventListener('click', onClick, true);\n window.removeEventListener('keydown', onKey, true);\n };\n }, [picking, focusComposer, focusWhilePicking]);\n // Pointer events inside the dock stay inside it, so a host dropdown that closes\n // on an outside press is not dismissed by using the dock. React listens on the\n // shadow root too, and it registered first, so its handlers still run.\n useEffect(() => {\n const shadow = rootRef.current?.getRootNode();\n if (!(shadow instanceof ShadowRoot)) return;\n const stop = (e: Event) => e.stopPropagation();\n const types = ['pointerdown', 'pointerup', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click'];\n for (const type of types) shadow.addEventListener(type, stop);\n return () => { for (const type of types) shadow.removeEventListener(type, stop); };\n }, []);\n useEffect(() => {\n if (!picking) {\n setRects([]);\n return;\n }\n let frame: number | undefined;\n const update = () => {\n frame = undefined;\n setRects(\n targets.flatMap((t) => {\n try {\n const el = document.querySelector(t.selector);\n if (!el) return [];\n const r = el.getBoundingClientRect();\n return [\n {\n top: r.top,\n left: r.left,\n width: r.width,\n height: r.height,\n selector: t.selector,\n },\n ];\n } catch {\n return [];\n }\n }),\n );\n };\n const schedule = () => { frame ??= requestAnimationFrame(update); };\n update();\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n return () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n };\n }, [targets, picking]);\n\n const variantsPanel = variants && (\n <section\n id={`${id}-variants`}\n role=\"dialog\"\n aria-label=\"Iteration variants\"\n className=\"isotone-panel isotone-variants-panel\"\n data-open={variantsOpen}\n aria-hidden={!variantsOpen}\n ref={node => { node?.toggleAttribute('inert', !variantsOpen); }}\n >\n <VariantsView\n source={variants}\n active={variantsOpen}\n onClose={() => { setVariantsOpen(false); setExpanded(false); }}\n onFeedback={notesAvailable ? feedback : undefined}\n onSaved={loadNotes}\n onManage={notesAvailable ? queueRemoval : undefined}\n pendingActions={pendingActions}\n />\n </section>\n );\n const notesPanel = notesAvailable && (\n <section\n id={`${id}-notes`}\n role=\"dialog\"\n aria-label=\"Iteration feedback\"\n className=\"isotone-panel isotone-notes-panel\"\n data-open={notesOpen}\n aria-hidden={!notesOpen}\n ref={node => { node?.toggleAttribute('inert', !notesOpen); }}\n >\n <div className=\"isotone-panel-head\">\n <h2>\n Feedback{' '}\n <span className=\"isotone-count\">\n {visibleNotes.length || ''}\n </span>\n </h2>\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label=\"Close feedback\"\n title=\"Close feedback\"\n onClick={() => {\n setNotesOpen(false);\n setExpanded(false);\n setPicking(false);\n }}\n >\n <Icon name=\"close\" />\n </button>\n </div>\n <ul ref={listRef} className=\"isotone-list\">\n {visibleNotes.map((note) => (\n <li\n key={note.id}\n data-motion-key={note.id}\n className={`isotone-note${editing?.id === note.id ? ' isotone-note-editing' : ''}`}\n >\n <button\n type=\"button\"\n className=\"isotone-note-hit\"\n aria-current={editing?.id === note.id ? true : undefined}\n onClick={() => beginEdit(note)}\n >\n <NoteSummary note={note} />\n </button>\n <button\n type=\"button\"\n className=\"isotone-x isotone-icon\"\n aria-label={note.variantAction ? 'Cancel removal' : 'Delete note'}\n title={note.variantAction ? 'Cancel removal' : 'Delete note'}\n onClick={() => void removeNote(note)}\n >\n <Icon name=\"close\" size={12} />\n </button>\n </li>\n ))}\n </ul>\n <div className=\"isotone-compose\">\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: This extends the native textarea's pointer area; keyboard users focus the textarea directly. */}\n <fieldset\n className=\"isotone-input\"\n aria-label=\"Feedback composer\"\n onClick={(event) => {\n if (event.defaultPrevented || event.button !== 0) return;\n const target = event.target as Element;\n if (target.closest('button, textarea, input, select, a, [contenteditable=\"true\"]')) return;\n textareaRef.current?.focus({ preventScroll: true });\n }}\n >\n <div className=\"isotone-context\" aria-live=\"polite\">\n {editing && (\n <span className=\"isotone-chip\">\n Editing note\n <button\n type=\"button\"\n aria-label=\"Cancel edit\"\n title=\"Cancel edit\"\n onClick={cancelEdit}\n >\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n )}\n {variantTarget && (\n <span className=\"isotone-chip\">\n <Icon name=\"sliders\" size={12} />\n <span onPointerOver={showOverflowTitle}>\n {variantTarget.label}\n {variantTarget.optionLabel\n ? ` / ${variantTarget.optionLabel}`\n : ''}\n </span>\n {!editing?.variantAction && <button\n type=\"button\"\n aria-label=\"Remove variant reference\"\n title=\"Remove reference\"\n onClick={() => setVariantTarget(null)}\n >\n <Icon name=\"close\" size={12} />\n </button>}\n </span>\n )}\n {targets.map((target, index) => (\n <span\n key={target.selector}\n className=\"isotone-chip\"\n >\n <span onPointerOver={showOverflowTitle}>{target.text || target.tag}</span>\n <button\n type=\"button\"\n aria-label={`Remove pinned element ${index + 1}`}\n title=\"Unpin element\"\n onClick={() =>\n setTargets((prev) =>\n prev.filter((t) => t.selector !== target.selector),\n )\n }\n >\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n ))}\n {notice && (\n <p role=\"status\" className=\"isotone-notice\">\n {notice}\n </p>\n )}\n </div>\n <textarea\n ref={textareaRef}\n value={text}\n aria-label=\"Feedback for the agent\"\n onChange={(e) => setText(e.target.value)}\n onFocus={() => { if (!keepPicking.current) setPicking(false); }}\n onPointerDown={() => setPicking(false)}\n onScroll={event => {\n event.currentTarget.dataset.scrolled = String(event.currentTarget.scrollTop > 0);\n }}\n onKeyDown={(e) => {\n if (\n e.key === 'Enter' &&\n !e.shiftKey &&\n !e.nativeEvent.isComposing\n ) {\n e.preventDefault();\n void send();\n }\n }}\n placeholder={\n targets.length || variantTarget\n ? 'Feedback on your selection…'\n : 'What would you change?'\n }\n rows={1}\n className=\"isotone-textarea\"\n />\n <div className=\"isotone-toolbar\">\n <button\n type=\"button\"\n title=\"Select elements\"\n aria-label=\"Select elements\"\n aria-pressed={picking}\n className=\"isotone-pick isotone-icon\"\n // Keep focus where it is, so a focused composer stays focused.\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n cancelAnimationFrame(focusFrame.current);\n setPicking((v) => !v);\n }}\n >\n <Icon name=\"pin\" size={14} />\n </button>\n <button\n type=\"button\"\n aria-label={editing ? 'Save edit' : 'Send note'}\n disabled={!text.trim()}\n className=\"isotone-send\"\n title={editing ? 'Save edit (Enter)' : 'Send note (Enter)'}\n onClick={() => void send()}\n >\n <Icon name=\"send\" size={14} />\n </button>\n </div>\n </fieldset>\n </div>\n </section>\n );\n if (!visible) return null;\n return (\n <div\n ref={rootRef}\n data-isotone\n data-theme={theme}\n data-expanded={railOpen}\n data-tools={Number(Boolean(variants)) + Number(notesAvailable)}\n data-instant={instant}\n data-notes-open={notesOpen}\n data-open={open}\n className=\"isotone-root\"\n >\n <div className=\"isotone-rail-track\" aria-hidden=\"true\" />\n {picking && (\n <div className=\"isotone-hint\" data-isotone>\n <span>{targets.length} selected · click to add or remove · hold ⇧ to use the page</span>\n <button\n type=\"button\"\n onClick={() => {\n setPicking(false);\n focusComposer();\n }}\n >\n Done <kbd>↵</kbd>\n </button>\n </div>\n )}\n {picking &&\n [\n ...rects,\n ...(hoverRect\n ? [\n {\n top: hoverRect.top,\n left: hoverRect.left,\n width: hoverRect.width,\n height: hoverRect.height,\n selector: '__hover',\n },\n ]\n : []),\n ].map((rect, i) => (\n <div\n key={rect.selector}\n data-isotone\n className={`isotone-hover${i < rects.length ? ' isotone-selected' : ''}`}\n style={{\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }}\n />\n ))}\n <UpdateNotice endpoint={updateEndpoint} active={open} />\n <fieldset\n aria-label=\"Isotone tools\"\n onKeyDown={event => {\n if (!(event.target as HTMLElement).classList.contains('isotone-rail-button')) return;\n if (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const buttons = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>('.isotone-rail-button'));\n const at = buttons.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home' ? 0 : event.key === 'End' ? buttons.length - 1 : (at + (['ArrowUp', 'ArrowLeft'].includes(event.key) ? -1 : 1) + buttons.length) % buttons.length;\n buttons[next]?.focus();\n }}\n className=\"isotone-rail\"\n data-expanded={railOpen}\n data-tools={Number(Boolean(variants)) + Number(notesAvailable)}\n onFocus={() => setFocused(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget)) setFocused(false);\n }}\n >\n <div\n className=\"isotone-rail-tools\"\n aria-hidden={!railOpen}\n ref={node => { node?.toggleAttribute('inert', !railOpen); }}\n >\n {variants && (\n <button\n type=\"button\"\n className=\"isotone-rail-button\"\n aria-label=\"Variants\"\n title=\"Variants\"\n aria-controls={`${id}-variants`}\n aria-expanded={variantsOpen}\n onClick={() => {\n setVariantsOpen((v) => !v);\n setExpanded(false);\n }}\n >\n <Icon name=\"sliders\" /><span className=\"isotone-tool-label\">Variants</span>\n </button>\n )}\n {variantsPanel}\n {notesPanel}\n {notesAvailable && (\n <button\n type=\"button\"\n className=\"isotone-rail-button\"\n aria-label=\"Feedback\"\n title=\"Feedback\"\n aria-controls={`${id}-notes`}\n aria-expanded={notesOpen}\n onClick={() => {\n setNotesOpen((v) => !v);\n setExpanded(false);\n if (!notesOpen) focusComposer();\n }}\n >\n <Icon name=\"message\" /><span className=\"isotone-tool-label\">Feedback <span className=\"isotone-count\">{visibleNotes.length || \"\"}</span></span>\n </button>\n )}\n </div>\n <button\n type=\"button\"\n ref={fabRef}\n className=\"isotone-fab\"\n aria-hidden={railOpen}\n tabIndex={railOpen ? -1 : 0}\n aria-label={notesAvailable ? 'Isotone' : 'Variants'}\n title={`Isotone${shortcutLabel ? ` · ${shortcutLabel}` : ''}`}\n aria-expanded={railOpen}\n onClick={() => {\n if (open) closeAll();\n else if (expanded) setExpanded(false);\n else openInitial();\n }}\n >\n <Icon name=\"iterate\" />\n {visibleNotes.length > 0 && (\n <span className=\"isotone-badge\">{visibleNotes.length}</span>\n )}\n </button>\n </fieldset>\n </div>\n );\n}\n","/**\n * Paint only. Layout, typography, hit targets and state selectors live in styles.ts.\n * Both themes implement the same palette contract and share one Instrument\n * material recipe. Layout and interaction never fork with the page theme.\n */\nconst darkPalette = {\n bg: 'var(--iso-zinc-900)', raised: 'var(--iso-zinc-800)', well: 'var(--iso-zinc-950)',\n line: 'var(--iso-zinc-800)', edge: 'var(--iso-zinc-700)',\n fg: 'var(--iso-zinc-200)', muted: 'var(--iso-zinc-400)',\n faint: 'color-mix(in oklch, var(--iso-zinc-400) 70%, var(--iso-zinc-500))',\n hover: 'var(--iso-zinc-800)',\n 'hover-shadow': 'none', 'icon-rest': 'var(--iso-muted)', 'launcher-ink': 'var(--iso-fg)',\n danger: '#f29188', focus: 'var(--iso-zinc-400)', 'selected-edge': 'var(--iso-zinc-400)',\n shadow: '0 12px 40px #0004, 0 2px 6px #0003, 0 0 0 1px var(--iso-line)',\n 'panel-shadow': '0 8px 24px #0003, 0 2px 4px #0002',\n 'shadow-near': '#0004', 'shadow-deep': '#0005', 'shadow-contact': '#0007',\n 'shade-soft': '#0003', 'shade-inset': '#0005',\n bevel: 'color-mix(in oklch, var(--iso-zinc-200) 18%, transparent)',\n 'surface-face': 'linear-gradient(color-mix(in oklch, var(--iso-bg), var(--iso-zinc-200) 3%), var(--iso-bg))',\n 'key-face': 'linear-gradient(color-mix(in oklch, var(--iso-raised), var(--iso-zinc-200) 7%), var(--iso-raised))',\n 'key-hover-face': 'linear-gradient(color-mix(in oklch, var(--iso-raised), var(--iso-zinc-200) 10%), color-mix(in oklch, var(--iso-raised), var(--iso-zinc-200) 3%))',\n 'key-shadow': 'inset 0 1px 0 color-mix(in oklch, var(--iso-zinc-200) 20%, transparent), inset 0 -1px 0 #0003, 0 0 0 1px var(--iso-edge), 0 2px 2px #0006',\n 'key-hover-shadow': 'var(--iso-key-shadow)',\n 'label-lift-shadow': '0 1px 2px var(--iso-shadow-deep)',\n 'contact-lift-shadow': '0 2px 2px var(--iso-shadow-contact)',\n 'surface-elevation': '0 3px 0 var(--iso-shadow-deep), 0 12px 24px var(--iso-shadow-deep)',\n 'well-shadow': 'inset 0 1px 3px #0005, 0 1px 0 var(--iso-line)',\n 'range-face': 'linear-gradient(var(--iso-zinc-300), var(--iso-zinc-400))',\n 'range-highlight': 'var(--iso-zinc-200)',\n 'pick-line': '#81aaff', 'pick-fill': '#78aaff1a', 'pick-selected-fill': '#78aaff0f',\n};\ntype Palette = Record<keyof typeof darkPalette, string>;\nexport const PALETTES = {\n dark: darkPalette,\n // Gray means recessed. White faces with a crisp border/contact shadow mean\n // raised, including persistent selections. Hover preserves each material.\n light: {\n bg: '#fff', raised: '#fff', well: 'var(--iso-zinc-100)',\n line: 'var(--iso-zinc-200)', edge: 'var(--iso-zinc-300)',\n fg: 'var(--iso-zinc-900)', muted: 'var(--iso-zinc-600)', faint: 'var(--iso-zinc-500)',\n hover: '#fff',\n 'hover-shadow': 'inset 0 0 0 1px var(--iso-line)', 'icon-rest': 'var(--iso-zinc-500)', 'launcher-ink': 'var(--iso-muted)',\n danger: '#b42332', focus: 'var(--iso-zinc-600)',\n 'selected-edge': 'color-mix(in oklch, var(--iso-zinc-300) 75%, var(--iso-zinc-400))',\n shadow: '0 0 0 1px var(--iso-line), 0 2px 0 var(--iso-line)',\n 'panel-shadow': '0 2px 0 var(--iso-line)',\n 'shadow-near': 'var(--iso-line)', 'shadow-deep': 'var(--iso-edge)', 'shadow-contact': 'var(--iso-edge)',\n 'shade-soft': '#00000006', 'shade-inset': '#00000008',\n bevel: '#fffffff2',\n 'surface-face': '#fff',\n 'key-face': 'var(--iso-raised)',\n 'key-hover-face': 'var(--iso-key-face)',\n 'key-shadow': '0 0 0 1px var(--iso-edge), 0 2px 0 var(--iso-edge)',\n 'key-hover-shadow': '0 0 0 1px var(--iso-selected-edge), 0 2px 0 var(--iso-selected-edge)',\n 'label-lift-shadow': '0 1px 0 var(--iso-edge)',\n 'contact-lift-shadow': '0 2px 0 var(--iso-shadow-contact)',\n 'surface-elevation': '0 2px 0 var(--iso-line)',\n 'well-shadow': 'inset 0 0 0 1px var(--iso-line)',\n 'range-face': 'var(--iso-key-face)', 'range-highlight': '#fff',\n 'pick-line': '#2563eb', 'pick-fill': '#2563eb14', 'pick-selected-fill': '#2563eb0d',\n },\n} satisfies Record<'dark' | 'light', Palette>;\n\n/** Instrument is the single material recipe; themes supply its lighting. */\nexport const INSTRUMENT_MATERIAL = {\n 'rail-base': 'var(--iso-well)', 'rail-base-shadow': 'var(--iso-well-shadow)',\n 'rail-face': 'var(--iso-key-face)', 'rail-face-shadow': 'var(--iso-key-shadow)',\n 'input-border': 'transparent', 'input-shadow': 'var(--iso-well-shadow)',\n 'segment-track-shadow': 'var(--iso-well-shadow)',\n 'control-face': 'var(--iso-key-face)', 'control-hover-face': 'var(--iso-key-hover-face)',\n 'control-shadow': 'var(--iso-key-shadow)', 'control-hover-shadow': 'var(--iso-key-hover-shadow)',\n // Persistent selection is raised, just like an action. Never route it to a well.\n 'selected-face': 'var(--iso-control-face)', 'selected-shadow': 'var(--iso-control-shadow)',\n 'popup-face': 'var(--iso-surface-face)',\n 'popup-shadow': 'inset 0 1px 0 var(--iso-bevel), inset 0 -1px 0 var(--iso-shade-inset), 0 0 0 1px var(--iso-line), var(--iso-surface-elevation)',\n 'thumb-shadow': 'var(--iso-well-shadow)',\n 'thumb-hover-shadow': 'inset 0 0 0 1px var(--iso-edge)',\n 'label-face': 'var(--iso-key-face)', 'label-shadow': 'inset 0 1px 0 var(--iso-bevel), 0 0 0 1px var(--iso-edge), var(--iso-label-lift-shadow)',\n 'range-thumb-face': 'var(--iso-range-face)', 'range-thumb-shadow': 'inset 0 1px 0 var(--iso-range-highlight), 0 0 0 1px var(--iso-edge), var(--iso-contact-lift-shadow)', 'range-radius': '4px',\n 'swatch-radius': '6px', 'swatch-shadow': 'inset 0 1px 0 #fff6, inset 0 -2px 0 var(--iso-shade-soft), 0 0 0 1px var(--iso-edge), 0 2px 0 var(--iso-shadow-contact)',\n // Preserve the represented colour inside the raised selection frame.\n 'swatch-selected-shadow': '0 0 0 2px var(--iso-raised), 0 0 0 3px var(--iso-edge), 0 2px 0 3px var(--iso-shadow-contact)',\n};\n\nexport const PALETTE_TOKEN_NAMES = new Set(\n Object.keys(darkPalette).map(name => `--iso-${name}`),\n);\nfunction tokens(values: Record<string, string>): string {\n return Object.entries(values).map(([name, value]) => `--iso-${name}: ${value};`).join('\\n');\n}\nexport const APPEARANCE_CSS = `\n.isotone-root { ${tokens(PALETTES.dark)} ${tokens(INSTRUMENT_MATERIAL)} }\n.isotone-root[data-theme='light'] { ${tokens(PALETTES.light)} color-scheme: light; }\n`;\n","/** Shared timing for CSS surfaces and transform-only layout motion. */\nexport const MOTION = {\n enter: 200,\n exit: 125,\n reflow: 180,\n easeOut: 'cubic-bezier(.23,1,.32,1)',\n};\n\n// Large review queues stay immediate instead of starting hundreds of animations.\nexport const MAX_ANIMATED_ITEMS = 40;\n","/** A single line per note, with compact references sharing its trailing space. */\nexport const FEEDBACK_LAYOUT_CSS = `\n.isotone-notes-panel {\n --iso-list-height: min(220px, 32dvh);\n --iso-note-padding-y: 6px;\n --iso-note-padding-x: calc(var(--iso-space) - 1px);\n --iso-note-outset: 1px;\n}\n.isotone-note-hit { display: flex; align-items: center; gap: 8px; }\n.isotone-note-hit > p, .isotone-note-hit > .isotone-request-heading { flex: 1; min-width: 0; }\n.isotone-note-hit > .isotone-meta { flex: 0 1 auto; max-width: 42%; margin-top: 0; }\n`;\n","/** Raised highlight with one edge and a crisp one-pixel contact shadow. */\nexport const PILL_ACTIVE_CSS = `\n.isotone-rail-button[aria-expanded='true']::before {\n background: color-mix(in oklch, var(--iso-raised), #fff 8%);\n box-shadow: 0 0 0 1px color-mix(in oklch, var(--iso-edge), var(--iso-fg) 12%), 0 1px 0 var(--iso-shadow-contact);\n}\n`;\n","import { showOverflowTitle } from './tooltips';\nimport { useEffect, useId, useRef, useState } from 'react';\nimport type { UpdateInfo } from '../core/update';\nimport { Icon } from './icons';\n\n/** Read the local adapter's cached result; the browser never contacts npm. */\nexport function UpdateNotice({ endpoint, active }: { endpoint?: string; active: boolean }) {\n const [info, setInfo] = useState<UpdateInfo | null>(null);\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const trigger = useRef<HTMLButtonElement>(null);\n const command = useRef<HTMLInputElement>(null);\n const closeButton = useRef<HTMLButtonElement>(null);\n const id = useId();\n useEffect(() => {\n setOpen(false);\n setInfo(null);\n if (!endpoint || !active) return;\n const controller = new AbortController();\n let retry: ReturnType<typeof setTimeout> | undefined;\n const deadline = setTimeout(() => controller.abort(), 12_000);\n async function read(retried = false) {\n try {\n const response = await fetch(endpoint as string, { signal: controller.signal });\n if (!response.ok) return;\n const next = await response.json() as UpdateInfo;\n if (controller.signal.aborted) return;\n if (next.status === 'checking' && !retried) retry = setTimeout(() => void read(true), 5500);\n if (next.status === 'available' && typeof next.latestVersion === 'string') setInfo(next);\n } catch { /* Updates never interrupt local review work. */ }\n }\n void read();\n return () => { controller.abort(); clearTimeout(retry); clearTimeout(deadline); };\n }, [endpoint, active]);\n useEffect(() => {\n if (open) { setCopied(false); (command.current ?? closeButton.current)?.focus(); }\n }, [open]);\n function close() { setOpen(false); trigger.current?.focus(); }\n async function copy() {\n if (!info?.upgrade) return;\n try { await navigator.clipboard.writeText(info.upgrade.command); setCopied(true); }\n catch { command.current?.focus(); command.current?.select(); }\n }\n if (!active || !info) return null;\n return <div className=\"isotone-update\">\n <button ref={trigger} type=\"button\" className=\"isotone-update-trigger\"\n aria-expanded={open} aria-controls={id} onClick={() => setOpen(value => !value)}>\n Update {info.latestVersion}\n </button>\n {open && <div id={id} role=\"dialog\" aria-label=\"Update Isotone\" className=\"isotone-update-dialog\"\n onKeyDown={event => { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); close(); } }}>\n <div className=\"isotone-menu-title\"><strong>Update available</strong>\n <button ref={closeButton} type=\"button\" className=\"isotone-icon\" aria-label=\"Close update instructions\" title=\"Close update instructions\" onClick={close}><Icon name=\"close\" /></button>\n </div>\n <p>{info.currentVersion} → {info.latestVersion}</p>\n {info.upgrade ? <>\n <p>Run in <span className=\"isotone-update-path\" onPointerOver={showOverflowTitle}>{info.upgrade.cwd}</span></p>\n <input ref={command} aria-label=\"Upgrade command\" readOnly value={info.upgrade.command} onFocus={event => event.currentTarget.select()} />\n <div className=\"isotone-update-actions\"><button type=\"button\" className=\"isotone-secondary\" onClick={() => void copy()}>{copied ? 'Copied' : 'Copy command'}</button><span role=\"status\">{copied ? 'Ready to paste in your terminal' : ''}</span></div>\n <p>Restart the dev server after upgrading.</p>\n </> : <p>{info.message ?? 'Run isotone check-update in the app directory for upgrade instructions.'}</p>}\n </div>}\n </div>;\n}\n\nexport const UPDATE_NOTICE_CSS = `\n.isotone-update { position: absolute; z-index: 5; bottom: 10px; right: calc(var(--iso-rail-length) + 10px); pointer-events: auto; }\n.isotone-root[data-tools='1'] .isotone-update { right: calc(var(--iso-rail-size) + 10px); }\n.isotone-update-trigger { white-space: nowrap; color: var(--iso-muted); font-size: 10px; padding: 4px 6px; border-radius: 5px; background: var(--iso-bg); box-shadow: 0 0 0 1px var(--iso-line); }\n.isotone-update-dialog { position: absolute; right: calc(0px - var(--iso-rail-length) - 10px); bottom: 40px; width: var(--iso-dock-width); max-height: calc(100dvh - 100px); overflow: auto; padding: var(--iso-space); display: grid; gap: 8px; border-radius: 8px; background: var(--iso-bg); box-shadow: var(--iso-popup-shadow); font-size: 11px; }\n.isotone-root[data-tools='1'] .isotone-update-dialog { right: calc(0px - var(--iso-rail-size) - 10px); }\n.isotone-update-dialog .isotone-menu-title { padding: 0; background: none; }\n.isotone-update-dialog > p { color: var(--iso-muted); }\n.isotone-update-path { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-root .isotone-update-dialog input { width: 100%; padding: 8px; border-radius: 5px; background: var(--iso-well); box-shadow: var(--iso-well-shadow); font-size: 11px; }\n.isotone-update-actions { display: flex; align-items: center; gap: 8px; }\n.isotone-update-actions [role='status'] { color: var(--iso-muted); font-size: 10px; }\n@media (hover: hover) and (pointer: fine) { .isotone-update-trigger:hover { color: var(--iso-fg); } }\n`;\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string?.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","import { toKebabCase } from './toKebabCase';\nimport type { LucideIconData, LucideIconNode } from '../build/types';\n\n/**\n * Converts legacy `(name, iconNode, aliases?)` icon arguments into icon data object format.\n */\nexport function toLucideIconData(\n iconName: string,\n iconNode: LucideIconNode[],\n aliases: string[] = [],\n): LucideIconData {\n if (iconNode == null) {\n throw new Error('[lucide]: iconNode is required when icon name is used');\n }\n\n return {\n name: toKebabCase(iconName),\n size: 24,\n node: iconNode,\n ...(aliases.length > 0 ? { aliases } : {}),\n };\n}\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) => {\n let out = '';\n let upperNext = false;\n\n for (const ch of string) {\n if (ch === '-' || ch === '_' || ch <= ' ') {\n upperNext = out.length > 0;\n continue;\n }\n\n if (out.length === 0) {\n out += ch.toLowerCase();\n } else {\n out += upperNext ? ch.toUpperCase() : ch;\n }\n\n upperNext = false;\n }\n\n return out as string;\n};\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","const defaultAttributes = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n} as const;\n\nexport default defaultAttributes;\n","import type { LucideBuildParams, LucideIconData, LucideIconNode, SVGProps } from './types';\nimport defaultAttributes from './defaultAttributes';\nimport { mergeClasses } from '../utils/mergeClasses';\n\nfunction isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Creates a Lucide icon node (an svgson-like format) from a Lucide icon object.\n *\n * @param icon The icon to build.\n * @param params Additional build parameters.\n */\nfunction buildLucideIconNode(icon: LucideIconData, params: LucideBuildParams = {}): LucideIconNode {\n const attributeNames = params.attributeNames ?? {};\n const getAttributeName = (attributeName: string) =>\n attributeNames[attributeName] ?? attributeName;\n\n const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes['width'];\n const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes['height'];\n const aliasClassNames =\n icon.aliases\n ?.filter((alias: string): alias is string => typeof alias === 'string' && alias.trim() !== '')\n .map((alias: string) => `lucide-${alias}`) ?? [];\n const iconClassNames = [...(icon.name ? [`lucide-${icon.name}`] : []), ...aliasClassNames];\n const classNamesFromClassName = params.className?.split(' ').filter(Boolean) ?? [];\n const className =\n params.includeDefaultClasses === false\n ? mergeClasses(...classNamesFromClassName)\n : mergeClasses('lucide', ...iconClassNames, ...classNamesFromClassName);\n\n const calculatedStrokeWidth = params.absoluteStrokeWidth\n ? (Number(params.strokeWidth ?? defaultAttributes['stroke-width']) *\n Number(icon.size ?? icon.width ?? defaultAttributes['width'])) /\n Number(params.size ?? params.width ?? defaultAttributes['width'])\n : (params.strokeWidth ?? defaultAttributes['stroke-width']);\n\n const attributes = {\n ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {\n attrs[getAttributeName(attrName)] = value;\n return attrs;\n }, {} as SVGProps),\n ...('color' in params &&\n params.color && {\n [getAttributeName('stroke')]: params.color,\n }),\n ...('size' in params &&\n isDefined(params.size) && {\n [getAttributeName('width')]: params.size,\n [getAttributeName('height')]: params.size,\n }),\n ...('width' in params &&\n isDefined(params.width) && {\n [getAttributeName('width')]: params.width,\n }),\n ...('height' in params &&\n isDefined(params.height) && {\n [getAttributeName('height')]: params.height,\n }),\n [getAttributeName('stroke-width')]: calculatedStrokeWidth,\n ...(className && {\n [getAttributeName('class')]: className,\n }),\n [getAttributeName('viewBox')]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,\n ...(params.hasA11yProp === false\n ? {\n [getAttributeName('aria-hidden')]: 'true',\n }\n : {}),\n ...('attributes' in params && params.attributes),\n };\n\n return [\n 'svg',\n attributes,\n icon.node.map((child): LucideIconNode => {\n const [name, attrs, children] = child;\n const nextAttrs = params.nonScalingStroke\n ? { [getAttributeName('vector-effect')]: 'non-scaling-stroke', ...attrs }\n : attrs;\n\n return children ? [name, nextAttrs, children] : [name, nextAttrs];\n }),\n ];\n}\n\nexport default buildLucideIconNode;\n","import buildLucideIconNode from './buildLucideIconNode';\nimport type { LucideBuildParams, LucideIconData, LucideIconNode } from './types';\n\n/**\n * Creates a React-compatible Lucide icon node (an svgson-like format) from a Lucide icon object.\n *\n * @param icon The icon to build.\n * @param params Additional build parameters.\n */\nfunction buildLucideIconForReact(\n icon: LucideIconData,\n params: LucideBuildParams = {},\n): LucideIconNode {\n return buildLucideIconNode(icon, {\n ...params,\n attributeNames: {\n ...params.attributeNames,\n class: 'className',\n 'stroke-width': 'strokeWidth',\n 'stroke-linecap': 'strokeLinecap',\n 'stroke-linejoin': 'strokeLinejoin',\n 'vector-effect': 'vectorEffect',\n },\n });\n}\n\nexport default buildLucideIconForReact;\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: object) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n /**\n * @deprecated Use `nonScalingStroke` instead.\n */\n absoluteStrokeWidth: boolean;\n nonScalingStroke: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport { buildLucideIconForReact, hasA11yProp, mergeClasses } from '@lucide/shared';\nimport { LucideIconData, LucideIconNode, LucideProps } from './types';\nimport { useLucideContext } from './context';\n\ntype IconComponentProps = LucideProps &\n (\n | {\n iconNode: LucideIconNode[];\n icon?: never;\n }\n | {\n icon: LucideIconData;\n iconNode?: never;\n }\n );\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {boolean} props.nonScalingStroke - Whether to use non scaling strokes\n * @param {string} props.className - The class name of the icon\n * @param {LucideIconNode[]} props.children - The children of the icon\n * @param {LucideIconNode[]} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color,\n size,\n width,\n height,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className = '',\n children,\n iconNode = [],\n icon = {\n node: iconNode,\n aliases: [],\n size: 24,\n },\n ...rest\n },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n nonScalingStroke: contextNonScalingStroke = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);\n\n const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {\n color: color ?? contextColor,\n width: width ?? size ?? contextSize,\n height: height ?? size ?? contextSize,\n strokeWidth: strokeWidth ?? contextStrokeWidth,\n absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,\n nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,\n className: mergeClasses(contextClass, className),\n hasA11yProp: hasAccessibleProp,\n attributes: rest,\n });\n\n return createElement(\n name,\n {\n ref,\n ...svgAttributes,\n },\n [\n ...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { toLucideIconData, toPascalCase } from '@lucide/shared';\nimport { LucideIcon, LucideIconData, LucideIconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Creates a Lucide icon component from icon data.\n *\n * @param icon Icon data object.\n * @returns Lucide icon component.\n */\nfunction createLucideIcon(icon: LucideIconData): LucideIcon;\n\n/**\n * Creates a Lucide icon component from the legacy icon arguments.\n *\n * @param iconName Icon name.\n * @param iconNode Icon node.\n * @param aliases Optional icon aliases.\n * @returns Lucide icon component.\n */\nfunction createLucideIcon(\n iconName: string,\n iconNode: LucideIconNode[],\n aliases?: string[],\n): LucideIcon;\n\nfunction createLucideIcon(\n iconDataOrName: LucideIconData | string,\n iconNode: LucideIconNode[] = [],\n aliases: string[] = [],\n): LucideIcon {\n const iconData =\n typeof iconDataOrName === 'string'\n ? toLucideIconData(iconDataOrName, iconNode, aliases)\n : iconDataOrName;\n\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n icon: iconData,\n className,\n ...props,\n }),\n );\n\n if (iconData.name) {\n Component.displayName = toPascalCase(iconData.name);\n }\n\n return Component;\n}\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-up',\n size: 24,\n node: [\n ['path', { d: 'm5 12 7-7 7 7', key: 'hav0vg' }],\n ['path', { d: 'M12 19V5', key: 'x0mq9r' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNSAxMiA3LTcgNyA3IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOVY1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowUp = createLucideIcon(__iconData);\n\nexport default ArrowUp;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'check',\n size: 24,\n node: [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon(__iconData);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'chevron-down',\n size: 24,\n node: [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'crosshair',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '22', x2: '18', y1: '12', y2: '12', key: 'l9bcsi' }],\n ['line', { x1: '6', x2: '2', y1: '12', y2: '12', key: '13hhkx' }],\n ['line', { x1: '12', x2: '12', y1: '6', y2: '2', key: '10w3f3' }],\n ['line', { x1: '12', x2: '12', y1: '22', y2: '18', key: '15g9kq' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Crosshair\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMjIiIHgyPSIxOCIgeTE9IjEyIiB5Mj0iMTIiIC8+CiAgPGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjYiIHkyPSIyIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMjIiIHkyPSIxOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/crosshair\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Crosshair = createLucideIcon(__iconData);\n\nexport default Crosshair;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'gem',\n size: 24,\n node: [\n ['path', { d: 'M10.5 3 8 9l4 13 4-13-2.5-6', key: 'b3dvk1' }],\n [\n 'path',\n {\n d: 'M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z',\n key: '7w4byz',\n },\n ],\n ['path', { d: 'M2 9h20', key: '16fsjt' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Gem\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNSAzIDggOWw0IDEzIDQtMTMtMi41LTYiIC8+CiAgPHBhdGggZD0iTTE3IDNhMiAyIDAgMCAxIDEuNi44bDMgNGEyIDIgMCAwIDEgLjAxMyAyLjM4MmwtNy45OSAxMC45ODZhMiAyIDAgMCAxLTMuMjQ3IDBsLTcuOTktMTAuOTg2QTIgMiAwIDAgMSAyLjQgNy44bDIuOTk4LTMuOTk3QTIgMiAwIDAgMSA3IDN6IiAvPgogIDxwYXRoIGQ9Ik0yIDloMjAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/gem\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Gem = createLucideIcon(__iconData);\n\nexport default Gem;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'message-square',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n key: '18887p',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name MessageSquare\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/message-square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MessageSquare = createLucideIcon(__iconData);\n\nexport default MessageSquare;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'rotate-ccw',\n size: 24,\n node: [\n ['path', { d: 'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8', key: '1357e3' }],\n ['path', { d: 'M3 3v5h5', key: '1xhq8a' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name RotateCcw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rotate-ccw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RotateCcw = createLucideIcon(__iconData);\n\nexport default RotateCcw;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'sliders-horizontal',\n size: 24,\n node: [\n ['path', { d: 'M10 5H3', key: '1qgfaw' }],\n ['path', { d: 'M12 19H3', key: 'yhmn1j' }],\n ['path', { d: 'M14 3v4', key: '1sua03' }],\n ['path', { d: 'M16 17v4', key: '1q0r14' }],\n ['path', { d: 'M21 12h-9', key: '1o4lsq' }],\n ['path', { d: 'M21 19h-5', key: '1rlt1p' }],\n ['path', { d: 'M21 5h-7', key: '1oszz2' }],\n ['path', { d: 'M8 10v4', key: 'tgpxqk' }],\n ['path', { d: 'M8 12H3', key: 'a7s4jb' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SlidersHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgNUgzIiAvPgogIDxwYXRoIGQ9Ik0xMiAxOUgzIiAvPgogIDxwYXRoIGQ9Ik0xNCAzdjQiIC8+CiAgPHBhdGggZD0iTTE2IDE3djQiIC8+CiAgPHBhdGggZD0iTTIxIDEyaC05IiAvPgogIDxwYXRoIGQ9Ik0yMSAxOWgtNSIgLz4KICA8cGF0aCBkPSJNMjEgNWgtNyIgLz4KICA8cGF0aCBkPSJNOCAxMHY0IiAvPgogIDxwYXRoIGQ9Ik04IDEySDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sliders-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SlidersHorizontal = createLucideIcon(__iconData);\n\nexport default SlidersHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'trash',\n size: 24,\n node: [\n ['path', { d: 'M10 11v6', key: 'nco0om' }],\n ['path', { d: 'M14 11v6', key: 'outv1u' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6', key: 'miytrc' }],\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2', key: 'e791ji' }],\n ],\n aliases: ['trash-2'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Trash\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTQgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Trash = createLucideIcon(__iconData);\n\nexport default Trash;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'x',\n size: 24,\n node: [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon(__iconData);\n\nexport default X;\n","import {\n ArrowUp, Check, ChevronDown, Crosshair, Gem, MessageSquare,\n RotateCcw, SlidersHorizontal, Trash2, X,\n} from 'lucide-react';\n\nconst icons = {\n close: X, chevron: ChevronDown, message: MessageSquare,\n sliders: SlidersHorizontal, pin: Crosshair, send: ArrowUp,\n reset: RotateCcw, trash: Trash2, check: Check, iterate: Gem,\n};\n\n/** One optical size and stroke across the dock, menus and composer. */\nexport function Icon({ name, size = 16 }: { name: keyof typeof icons; size?: number }) {\n const Component = icons[name];\n return <Component size={size} strokeWidth={1.75} aria-hidden=\"true\" />;\n}\n","import { APPEARANCE_CSS } from './appearance';\nimport { MOTION } from './motion';\nimport { FEEDBACK_LAYOUT_CSS } from './feedback-layout';\nimport { PILL_ACTIVE_CSS } from './pill-active';\nimport { UPDATE_NOTICE_CSS } from './UpdateNotice';\n\n/** One shared set of tokens and controls for the shadow-root and inline mounts. */\nconst MARKER = 'data-isotone-styles';\nexport const PANEL_CSS = `\n${APPEARANCE_CSS}\n.isotone-root, .isotone-root *, .isotone-root *::before, .isotone-root *::after { box-sizing: border-box; }\n/* Keep native scrolling and focus reveal without visible scrollbar chrome. */\n.isotone-root * { scrollbar-width: none; }\n.isotone-root *::-webkit-scrollbar { display: none; }\n.isotone-root :where(button, textarea, input, fieldset) { font: inherit; color: inherit; margin: 0; padding: 0; background: none; border: 0; }\n.isotone-root fieldset { min-inline-size: 0; }\n.isotone-root :where(button) { cursor: pointer; touch-action: manipulation; }\n.isotone-root :where(button:disabled) { cursor: default; opacity: .4; }\n.isotone-root :where(ul, li, p, h2, h3) { margin: 0; padding: 0; list-style: none; }\n.isotone-root {\n --iso-space: 12px; --iso-view-gap: 8px; --iso-control-radius: 6px;\n /* Shared geometry. Themes must not override these tokens. */\n --iso-rail-size: 44px; --iso-rail-padding: 4px; --iso-rail-gap: var(--iso-rail-padding);\n --iso-rail-key-size: calc(var(--iso-rail-size) - 4 * var(--iso-rail-padding));\n --iso-rail-step: calc(var(--iso-rail-key-size) + var(--iso-rail-gap));\n --iso-rail-end: calc(var(--iso-rail-padding) + var(--iso-rail-gap) / 2);\n --iso-rail-length: calc(2 * var(--iso-rail-step) + 2 * var(--iso-rail-end));\n --iso-rail-key-inset: calc((var(--iso-rail-size) - var(--iso-rail-key-size)) / 2);\n --iso-sans: var(--font-sans, ui-sans-serif, system-ui, -apple-system, sans-serif);\n --iso-zinc-50: oklch(98.5% 0 0); --iso-zinc-100: oklch(96.7% .001 286.375);\n --iso-zinc-200: oklch(92% .004 286.32); --iso-zinc-300: oklch(87.1% .006 286.286);\n --iso-zinc-400: oklch(70.5% .015 286.067); --iso-zinc-500: oklch(55.2% .016 285.938);\n --iso-zinc-600: oklch(44.2% .017 285.786); --iso-zinc-700: oklch(37% .013 285.805);\n --iso-zinc-800: oklch(27.4% .006 286.033); --iso-zinc-900: oklch(21% .006 285.885);\n --iso-zinc-950: oklch(14.1% .005 285.823);\n --iso-ease-out: ${MOTION.easeOut};\n --iso-fast: ${MOTION.exit}ms; --iso-enter: ${MOTION.enter}ms; --iso-exit: ${MOTION.exit}ms;\n --iso-dock-width: min(340px, calc(100vw - 32px));\n position: fixed; right: max(16px, env(safe-area-inset-right)); bottom: max(16px, env(safe-area-inset-bottom));\n z-index: 2147483000; width: 44px; display: flex; flex-direction: column; isolation: isolate; max-height: calc(100dvh - 32px); color: var(--iso-fg);\n font: 12px/1.5 var(--iso-sans); -webkit-font-smoothing: antialiased;\n text-align: left; letter-spacing: normal; color-scheme: dark;\n}\n.isotone-root :where(button, input, textarea):focus-visible { outline: 2px solid var(--iso-focus); outline-offset: 3px; }\n.isotone-root button { transition: transform var(--iso-fast) var(--iso-ease-out), opacity var(--iso-fast) var(--iso-ease-out); }\n.isotone-root button:not(:disabled):active > svg { transform: scale(.92); transition-duration: 100ms; }\n.isotone-root svg { display: block; flex-shrink: 0; pointer-events: none; transition: transform var(--iso-fast) var(--iso-ease-out); }\n/* Panels move independently; their content and corners retain their natural size. */\n.isotone-root[data-open='true'] { width: var(--iso-dock-width); }\n.isotone-root { pointer-events: none; }\n.isotone-root :is(.isotone-panel, .isotone-rail-button, .isotone-fab, .isotone-hint) { pointer-events: auto; }\n/* The horizontal pill stays anchored while its panels open above it. */\n.isotone-rail, .isotone-rail-tools { display: contents; border: 0; margin: 0; padding: 0; min-width: 0; }\n.isotone-root[data-expanded='true'] { min-height: 44px; }\n.isotone-root[data-expanded='true'][data-open='false'][data-tools='2'] { width: var(--iso-rail-length); }\n.isotone-root[data-open='true'] { padding-bottom: calc(var(--iso-rail-size) + var(--iso-view-gap)); gap: var(--iso-view-gap); }\n.isotone-rail-track { position: absolute; right: 0; bottom: 0; width: var(--iso-rail-size); height: var(--iso-rail-size); border-radius: 999px; background: var(--iso-rail-base); border: 0; box-shadow: var(--iso-rail-base-shadow); pointer-events: auto; transition: width var(--iso-enter) var(--iso-ease-out), height var(--iso-enter) var(--iso-ease-out); }\n.isotone-rail-track::before { content: ''; position: absolute; inset: var(--iso-rail-padding); border-radius: inherit; background: var(--iso-rail-face); box-shadow: var(--iso-rail-face-shadow); }\n.isotone-root[data-expanded='true'][data-tools='2'] .isotone-rail-track { width: var(--iso-rail-length); }\n.isotone-fab, .isotone-rail-button { display: flex; align-items: center; justify-content: center; flex: none; width: var(--iso-rail-size); height: var(--iso-rail-size); border-radius: 999px; }\n.isotone-fab { position: relative; isolation: isolate; color: var(--iso-launcher-ink); }\n.isotone-rail-button { position: absolute; bottom: 0; right: 0; display: none; color: var(--iso-icon-rest); isolation: isolate; z-index: 1; }\n.isotone-root[data-expanded='true'] .isotone-rail-button { display: flex; }\n.isotone-root[data-expanded='true'] .isotone-fab { display: none; }\n.isotone-rail-button::before { content: ''; position: absolute; inset: var(--iso-rail-key-inset); border-radius: 999px; z-index: -1; pointer-events: none; }\n.isotone-rail-button[aria-expanded='true'] { color: var(--iso-fg); }\n/* 28px key faces, with 4px between keys and around them, in every appearance. */\n.isotone-root[data-tools='2'] .isotone-rail-button { width: var(--iso-rail-step); right: var(--iso-rail-end); }\n.isotone-root[data-tools='2'] .isotone-rail-button[aria-label='Variants'] { right: calc(var(--iso-rail-end) + var(--iso-rail-step)); }\n.isotone-root[data-tools='2'] .isotone-rail-button::before { inset: var(--iso-rail-key-inset) calc(var(--iso-rail-gap) / 2); }\n.isotone-tool-label { display: none; }\n.isotone-badge { position: absolute; right: -3px; top: -3px; display: grid; place-items: center; min-width: 15px; height: 15px; padding: 0 3px; border-radius: 8px; background: var(--iso-label-face); box-shadow: var(--iso-label-shadow); color: var(--iso-launcher-ink); font-size: 9px; font-weight: 500; font-variant-numeric: tabular-nums; }\n/* Panels are sections inside the dock. Only long content scrolls. */\n.isotone-panel { order: 0; position: relative; display: none; flex-direction: column; min-height: 0; flex: 0 1 auto; width: 100%; }\n.isotone-panel[data-open='true'] { display: flex; }\n.isotone-variants-panel { flex-shrink: 1; max-height: calc(100dvh - 76px); }\n.isotone-notes-panel { flex-shrink: 0; max-height: calc(100dvh - 76px); padding: var(--iso-space); gap: var(--iso-space); }\n.isotone-root .isotone-panel { background: var(--iso-bg); border: 1px solid var(--iso-line); border-radius: 12px; box-shadow: var(--iso-panel-shadow); overflow: hidden; }\n.isotone-panel-head { flex: 0 0 42px; min-height: 42px; display: flex; align-items: center; justify-content: space-between; padding: 0 8px 0 14px; gap: 8px; border-bottom: 1px solid var(--iso-line); }\n.isotone-root .isotone-notes-panel > .isotone-panel-head { display: none; }\n.isotone-root .isotone-vars > .isotone-panel-head { order: 2; flex: 0 0 auto; min-height: 48px; padding: var(--iso-space); border: 0; }\n.isotone-root .isotone-vars > .isotone-panel-head:has(.isotone-save) { position: relative; z-index: 1; margin-top: calc(0px - var(--iso-space)); background: linear-gradient(to bottom, transparent, var(--iso-bg) var(--iso-space)); }\n.isotone-root .isotone-vars > .isotone-panel-head:not(:has(.isotone-save)) { display: none; }\n.isotone-root .isotone-vars > .isotone-panel-head :is(h2, .isotone-icon) { display: none; }\n.isotone-root .isotone-axis-menu { top: var(--iso-menu-top, 6px); max-height: calc(100% - var(--iso-menu-top, 6px) - 6px); }\n.isotone-root .isotone-save-state { top: auto; bottom: 27px; }\n.isotone-panel-head h2 { font-size: 12px; font-weight: 600; letter-spacing: -.01em; }\n.isotone-head-actions { display: flex; align-items: center; gap: 6px; margin-right: auto; }\n.isotone-icon { width: 28px; height: 28px; display: inline-grid; place-items: center; flex: none; color: var(--iso-muted); border-radius: 6px; }\n.isotone-count { margin-left: 5px; color: var(--iso-muted); font-size: 10px; font-variant-numeric: tabular-nums; }\n.isotone-vars { flex: 1; display: flex; flex-direction: column; min-height: 0; position: relative; }\n.isotone-vars { min-height: min(var(--iso-menu-need, 0px), calc(100dvh - 76px)); }\n.isotone-vars-body { flex: 1; overflow-y: auto; min-height: 0; overscroll-behavior: contain; padding: var(--iso-space); display: flex; flex-direction: column; gap: var(--iso-space); }\n/* The footer overlaps only the scroller's bottom padding: content fades beneath\n it while scrolling, but the last control remains fully visible at the end. */\n.isotone-axis { flex: none; }\n.isotone-axis-head { display: flex; align-items: center; justify-content: space-between; min-height: 24px; gap: 8px; margin-bottom: 6px; }\n.isotone-axis-label { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; min-height: 24px; padding: 2px 7px; margin-left: -7px; border-radius: 6px; text-align: left; }\n.isotone-axis-label, .isotone-menu-title > strong { font: inherit; font-weight: 550; }\n.isotone-axis-label > span, .isotone-menu-title > strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-axis-label svg { color: var(--iso-muted); }\n.isotone-axis-value { min-width: 0; max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--iso-muted); font: 10px var(--iso-sans); font-variant-numeric: tabular-nums; }\n.isotone-segs { display: flex; flex-wrap: wrap; gap: 3px; padding: 3px; border-radius: 7px; background: var(--iso-well); box-shadow: var(--iso-segment-track-shadow); }\n.isotone-seg { flex: 1 1 64px; min-width: 0; padding: 5px 8px; line-height: 16px; border-radius: 5px; color: var(--iso-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-seg > span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-seg[aria-pressed='true'] { color: var(--iso-fg); }\n.isotone-grid { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 8px; }\n.isotone-thumb { position: relative; display: block; min-width: 0; border-radius: 5px; overflow: hidden; background: var(--iso-well); box-shadow: var(--iso-thumb-shadow); color: var(--iso-muted); }\n.isotone-thumb img { display: block; width: 100%; height: 72px; object-fit: cover; }\n.isotone-thumb > span { position: absolute; bottom: 5px; left: 5px; max-width: calc(100% - 10px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 2px 6px; border-radius: 5px; background: var(--iso-label-face); box-shadow: var(--iso-label-shadow); color: var(--iso-fg); text-align: left; font-size: 10px; font-weight: 500; }\n.isotone-thumb[aria-pressed='true'] { color: var(--iso-fg); }\n/* The 14px thumb has 5px of space above it inside its 24px hit area. */\n.isotone-axis-head:has(+ .isotone-range) { margin-bottom: 1px; }\n.isotone-range { display: block; appearance: none; -webkit-appearance: none; width: 100%; height: 24px; cursor: pointer; }\n.isotone-range::-webkit-slider-runnable-track { height: 3px; border-radius: 6px; background: var(--iso-edge); }\n.isotone-range::-webkit-slider-thumb { appearance: none; -webkit-appearance: none; width: 14px; height: 14px; margin-top: -5.5px; border-radius: var(--iso-range-radius); background: var(--iso-range-thumb-face); box-shadow: var(--iso-range-thumb-shadow); }\n.isotone-range::-moz-range-track { height: 3px; border-radius: 6px; background: var(--iso-edge); }\n.isotone-range::-moz-range-thumb { width: 14px; height: 14px; border: 0; box-shadow: var(--iso-range-thumb-shadow); border-radius: var(--iso-range-radius); background: var(--iso-range-thumb-face); }\n.isotone-swatches { display: flex; flex-wrap: wrap; gap: 10px; padding: 3px; }\n.isotone-swatch, .isotone-picker { width: 26px; height: 26px; border-radius: var(--iso-swatch-radius); box-shadow: var(--iso-swatch-shadow); flex: none; }\n.isotone-swatch[aria-pressed='true'] { box-shadow: var(--iso-swatch-selected-shadow); }\n.isotone-picker { display: block; position: relative; overflow: hidden; background: conic-gradient(#ef4444,#eab308,#22c55e,#3b82f6,#a855f7,#ef4444); }\n.isotone-picker input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }\n.isotone-picker:has(input:focus-visible) { outline: 2px solid var(--iso-focus); outline-offset: 3px; }\n/* Raised actions share one face, edge and hover treatment. */\n.isotone-save, .isotone-secondary, .isotone-send, .isotone-hint button { border-radius: var(--iso-control-radius); color: var(--iso-fg); background: var(--iso-control-face); box-shadow: var(--iso-control-shadow); }\n/* Persistent selections share the raised action material, never the recessed\n field/slot material. Keep the face and shadow together in this one rule. */\n.isotone-note-editing .isotone-note-hit,\n.isotone-seg[aria-pressed='true'],\n.isotone-thumb[aria-pressed='true'],\n.isotone-pick[aria-pressed='true'] { background: var(--iso-selected-face); box-shadow: var(--iso-selected-shadow); }\n${PILL_ACTIVE_CSS}\n.isotone-secondary { padding: 6px 9px; font-size: 11px; font-weight: 500; white-space: nowrap; }\n.isotone-save { min-height: 24px; padding: 2px 7px; font-size: 11px; white-space: nowrap; }\n.isotone-save-row { position: relative; }\n.isotone-save-state { position: absolute; right: 0; top: 27px; z-index: 3; background: var(--iso-bg); border-radius: 4px; white-space: nowrap; font-size: 9px; color: var(--iso-muted); pointer-events: none; }\n/* A local action sheet overlays controls, preserving every underlying position. */\n.isotone-axis-menu { position: absolute; inset: 48px 6px auto; z-index: 2; background: var(--iso-popup-face); border-radius: 6px; max-height: calc(100% - 54px); box-shadow: var(--iso-popup-shadow); display: flex; flex-direction: column; transform-origin: top left; opacity: 0; transform: translateY(-4px) scale(.97); visibility: hidden; transition: opacity var(--iso-exit) var(--iso-ease-out), transform var(--iso-exit) var(--iso-ease-out), visibility 0s var(--iso-exit); }\n.isotone-axis-menu[data-open='true'] { visibility: visible; opacity: 1; transform: none; transition-delay: 0s; }\n@starting-style { .isotone-axis-menu[data-open='true'] { opacity: 0; transform: translateY(-4px) scale(.97); } }\n.isotone-menu-title { position: relative; z-index: 1; flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 8px 6px 12px; }\n/* Fade the moving content into the popup's actual material. A mask preserves\n Instrument's surface gradient and works identically in light and dark mode.\n Matching negative margin/padding preserves the first action's resting position. */\n.isotone-menu-scroll { --iso-scroll-fade-bottom: 0px; scroll-padding-block: var(--iso-space) calc(var(--iso-scroll-fade-bottom) + 6px); overflow-y: auto; overscroll-behavior: contain; flex: 1; min-height: 0; margin-top: calc(0px - var(--iso-space)); padding: var(--iso-space) 6px 6px; mask-image: linear-gradient(to bottom, transparent, #000 var(--iso-space), #000 calc(100% - var(--iso-scroll-fade-bottom)), transparent); }\n.isotone-axis-menu:has(.isotone-menu-footer) .isotone-menu-scroll { --iso-scroll-fade-bottom: var(--iso-space); padding-bottom: calc(var(--iso-space) + 6px); }\n.isotone-menu-action { display: flex; align-items: center; gap: 9px; width: 100%; min-height: 34px; border-radius: 6px; text-align: left; padding: 7px; font-size: 11px; }\n.isotone-menu-options { padding: 7px 0; margin: 5px 0; border-top: 1px solid var(--iso-line); border-bottom: 1px solid var(--iso-line); }\n.isotone-option-row { display: flex; align-items: center; padding: 2px 4px 2px 7px; gap: 4px; }\n.isotone-option-row > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-option-row small { font-size: 9px; color: var(--iso-muted); margin-left: 6px; }\n.isotone-menu-footer { flex-shrink: 0; padding: 9px 12px; border-top: 1px solid var(--iso-line); font-size: 10px; color: var(--iso-muted); min-height: 0; }\n.isotone-confirm { display: flex; justify-content: flex-end; gap: 6px; margin-top: 7px; }\n.isotone-danger { color: var(--iso-danger); }\n/* Scroll through the panel's top inset and fade against its actual surface.\n Cancelling margin/padding keeps the first row in place at scroll start; the\n expanded height preserves the content allowance and composer position.\n The side gutters contain the corner action and keyboard focus outlines. */\n.isotone-list { display: flex; flex-direction: column; gap: 0; flex: 0 1 auto; max-height: calc(var(--iso-list-height) + 2 * var(--iso-space) - 8px); min-height: 0; overflow-y: auto; overscroll-behavior: contain; margin: calc(0px - var(--iso-space)) calc(-8px - var(--iso-note-outset)) calc(-2px - var(--iso-space)); padding: var(--iso-space) 8px; scroll-padding-block: var(--iso-space); mask-image: linear-gradient(to bottom, transparent, #000 var(--iso-space), #000 calc(100% - var(--iso-space)), transparent); }\n.isotone-empty { color: var(--iso-muted); font-size: 11px; line-height: 1.7; padding: 8px; }\n.isotone-note { position: relative; flex: none; }\n.isotone-request-heading { display: flex; align-items: center; gap: 8px; line-height: 14px; }\n.isotone-request-kind { font-size: 10px; font-weight: 550; color: var(--iso-muted); }\n.isotone-request-heading code, .isotone-request-fallback { font: 10px/16px ui-monospace, 'SF Mono', Menlo, monospace; }\n.isotone-request-heading code { color: var(--iso-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-request-more { flex: none; color: var(--iso-faint); font-size: 9px; }\n.isotone-request-fallback { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n\n.isotone-note-hit { text-align: left; display: block; width: 100%; border-radius: 8px; padding: var(--iso-note-padding-y) var(--iso-note-padding-x); line-height: 18px; }\n.isotone-note-hit p { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; }\n.isotone-meta { display: flex; align-items: center; gap: 4px; min-width: 0; margin-top: 4px; }\n.isotone-meta .isotone-chip { flex: 0 1 auto; min-width: 0; height: 18px; padding: 0 5px; font-size: 9px; }\n/* A lone reference gets all available space; multiple references share the row. */\n.isotone-meta .isotone-chip:not(:only-child) { max-width: 140px; }\n/* The corner action floats outside the text column; its 24px hit target\n surrounds a 16px face without reserving trailing space in every row. */\n.isotone-note > .isotone-x { position: absolute; right: -8px; top: -8px; width: 24px; height: 24px; isolation: isolate; opacity: .6; background: none; box-shadow: none; }\n.isotone-x::before { content: ''; position: absolute; inset: 4px; border-radius: 50%; z-index: -1; background: var(--iso-bg); box-shadow: 0 0 0 1px var(--iso-edge); }\n.isotone-list:empty { display: none; }\n${FEEDBACK_LAYOUT_CSS}\n.isotone-compose { flex: none; display: flex; flex-direction: column; }\n.isotone-input { --iso-input-padding: calc(var(--iso-space) - 2px); flex: none; min-width: 0; min-height: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; padding: var(--iso-input-padding); background: var(--iso-well); border: 1px solid var(--iso-input-border); box-shadow: var(--iso-input-shadow); border-radius: 8px; cursor: text; }\n.isotone-context:empty { display: none; }\n/* Content starts and ends at the shared inset, but scrolls through the full\n field width without a fade or a permanent blank strip at either edge. */\n.isotone-context { display: flex; flex: none; align-items: center; gap: 4px; flex-wrap: nowrap; height: 32px; overflow-x: auto; overflow-y: hidden; overscroll-behavior: contain; padding: 4px var(--iso-input-padding); margin: 0 calc(0px - var(--iso-input-padding)); scroll-padding-inline: var(--iso-input-padding); }\n.isotone-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; height: 24px; max-width: 100%; padding: 0 5px 0 7px; border: 1px solid var(--iso-edge); border-radius: var(--iso-control-radius); font-size: 10px; color: var(--iso-muted); background: var(--iso-label-face); box-shadow: var(--iso-label-lift-shadow); }\n.isotone-context > .isotone-chip:not(:only-child) { max-width: calc(100% - 32px); }\n.isotone-chip > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-chip button { display: grid; place-items: center; flex: none; width: 16px; height: 16px; border-radius: 3px; background: transparent; box-shadow: none; }\n.isotone-root .isotone-textarea { --iso-textarea-inset: 8px; display: block; width: 100%; flex: none; height: 22px; min-height: calc(22px + var(--iso-textarea-inset)); max-height: calc(120px + var(--iso-textarea-inset)); overflow-y: auto; resize: none; margin-top: calc(0px - var(--iso-textarea-inset)); padding: calc(var(--iso-textarea-inset) + 1px) 1px 1px; scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--iso-fg) 14%, transparent) transparent; color: var(--iso-fg); background: transparent; border: 0; border-radius: 0; font-size: 12px; line-height: 20px; box-shadow: none; cursor: text; }\n/* Text scrolls through the gap below tags, or the field inset without tags. */\n.isotone-root .isotone-context:empty + .isotone-textarea { --iso-textarea-inset: var(--iso-input-padding); }\n.isotone-textarea::placeholder { color: var(--iso-faint); }\n.isotone-root .isotone-textarea:focus-visible { outline: none; }\n.isotone-textarea[data-scrolled='true'] { mask-image: linear-gradient(to bottom, transparent, #000 8px); }\n.isotone-toolbar { display: flex; flex: none; align-items: center; gap: 7px; height: 28px; }\n.isotone-pick[aria-pressed='true'] { color: var(--iso-fg); }\n.isotone-pick, .isotone-send { position: relative; width: 24px; height: 24px; }\n/* Keep a 28px hit area around the quieter composer faces. */\n.isotone-pick::after, .isotone-send::after { content: ''; position: absolute; inset: -2px; border-radius: inherit; }\n.isotone-send { display: grid; place-items: center; margin-left: auto; flex: none; }\n.isotone-notice { font-size: 10px; color: var(--iso-muted); }\n.isotone-hint { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); display: flex; align-items: center; gap: 12px; padding: 8px 10px 8px 14px; border-radius: 24px; background: var(--iso-bg); box-shadow: var(--iso-shadow); font-size: 11px; white-space: nowrap; }\n.isotone-hint button { display: flex; align-items: center; gap: 8px; border-radius: 14px; padding: 5px 9px; }\n.isotone-hint kbd { font: inherit; color: var(--iso-muted); }\n.isotone-hover { position: fixed; pointer-events: none; border: 1px solid var(--iso-pick-line); background: var(--iso-pick-fill); border-radius: 5px; z-index: 2147483001; }\n.isotone-selected { border: 2px solid var(--iso-pick-line); background: var(--iso-pick-selected-fill); }\n@media (hover: hover) and (pointer: fine) {\n .isotone-root :where(.isotone-icon:not(.isotone-x), .isotone-menu-action, .isotone-axis-label):not(:disabled):not([aria-pressed='true']):hover { background: var(--iso-hover); box-shadow: var(--iso-hover-shadow); color: var(--iso-fg); }\n .isotone-note:not(.isotone-note-editing):hover .isotone-note-hit:not(:disabled) { background: var(--iso-hover); box-shadow: var(--iso-hover-shadow); }\n .isotone-rail-button:not(:disabled):hover { color: var(--iso-fg); }\n .isotone-seg:not(:disabled):hover { color: var(--iso-fg); }\n .isotone-seg[aria-pressed='false']:not(:disabled):hover { box-shadow: var(--iso-hover-shadow); }\n .isotone-thumb[aria-pressed='false']:not(:disabled):hover { box-shadow: var(--iso-thumb-hover-shadow); }\n .isotone-root :where(.isotone-save, .isotone-secondary, .isotone-send, .isotone-hint button):not(:disabled):hover { background: var(--iso-control-hover-face); box-shadow: var(--iso-control-hover-shadow); }\n .isotone-chip button:hover { color: var(--iso-fg); background: var(--iso-hover); }\n .isotone-x:hover { color: var(--iso-fg); }\n .isotone-x:hover::before { background: var(--iso-control-hover-face); }\n .isotone-note .isotone-x { opacity: 0; }\n .isotone-note:hover .isotone-x, .isotone-note:focus-within .isotone-x, .isotone-note-editing .isotone-x { opacity: 1; }\n}\n@media (max-height: 580px) { .isotone-list { --iso-list-height: 72px; } .isotone-root .isotone-textarea { max-height: calc(64px + var(--iso-textarea-inset)); } }\n@media (prefers-reduced-motion: reduce) {\n .isotone-root .isotone-rail-track { transition: none; }\n .isotone-root .isotone-panel, .isotone-root .isotone-axis-menu, .isotone-root .isotone-rail-tools { transition-property: opacity, visibility; }\n .isotone-root button { transition: opacity 125ms ease; }\n .isotone-root button:not(:disabled):active > svg { transform: none; }\n}\n.isotone-root[data-instant='true'] *, .isotone-root[data-instant='true'] *::before, .isotone-root[data-instant='true'] *::after { transition-duration: 0s !important; transition-delay: 0s !important; animation: none !important; }\n${UPDATE_NOTICE_CSS}\n`;\n/**\n * Put the panel's styles in `target`, once. Idempotent: a second call with the\n * same root is a no-op, so several panels (or a remount) do not stack copies.\n *\n * `target` is whatever `getRootNode()` returns for the panel — a `ShadowRoot`\n * when mounted by `mountIteration`, the `Document` when a host embeds the\n * component directly.\n */\nexport function ensurePanelStyles(target: Document | ShadowRoot): void {\n const parent = target instanceof Document ? target.head : target;\n if (!parent || parent.querySelector(`[${MARKER}]`)) return;\n const style = (target instanceof Document ? target : target.ownerDocument)\n .createElement('style');\n style.setAttribute(MARKER, '');\n style.textContent = PANEL_CSS;\n // Prepend inside a shadow root so host-passed styles could still win, and\n // append in the document so the panel is not undercut by later app CSS.\n if (target instanceof Document) parent.appendChild(style);\n else parent.insertBefore(style, parent.firstChild);\n}\n","import { showOverflowTitle } from './tooltips';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { VariantReference } from '../core/index';\nimport {\n axisDefault,\n formatRangeValue,\n isDirty,\n type VariantAction,\n type VariantAxis,\n type VariantSelections,\n type VariantsSource,\n visibleAxes,\n} from '../core/variants';\nimport { Icon } from './icons';\nimport { useLayoutMotion } from './useLayoutMotion';\n\nexport function refreshSource(source: VariantsSource): void {\n const candidate = (source as { refresh?: unknown }).refresh;\n if (typeof candidate === 'function')\n void Promise.resolve(candidate.call(source)).catch(() => {});\n}\n\nexport function useVariantsSource(source: VariantsSource | undefined) {\n const [revision, setRevision] = useState(0);\n useEffect(() => source?.subscribe(() => setRevision(n => n + 1)), [source]);\n return revision;\n}\n\nconst NO_PENDING_ACTIONS: VariantAction[] = [];\n\nexport function VariantsView({\n source,\n showTitle = true,\n active = true,\n onFeedback,\n onClose,\n onSaved,\n onManage,\n pendingActions = NO_PENDING_ACTIONS,\n}: {\n source: VariantsSource;\n showTitle?: boolean;\n active?: boolean;\n onFeedback?: (reference: VariantReference) => void;\n onClose?: () => void;\n onSaved?: () => void;\n onManage?: (action: VariantAction, reference: VariantReference) => Promise<void>;\n pendingActions?: VariantAction[];\n}) {\n const revision = useVariantsSource(source);\n useEffect(() => {\n if (active) refreshSource(source);\n }, [active, source]);\n // The source notifies through its revision; typing in the composer does not\n // need another selector graph walk or another layout measurement.\n // biome-ignore lint/correctness/useExhaustiveDependencies: revision represents external source updates.\n const { selections, shown, sourceError } = useMemo(() => {\n const selections = source.getSelections();\n return {\n selections,\n shown: visibleAxes(source.getAxes(), selections),\n sourceError: source.getError?.(),\n };\n }, [source, revision]);\n const [menuId, setMenuId] = useState<string | null>(null);\n const menu = shown.find(axis => axis.id === menuId) ?? null;\n const [menuOpen, setMenuOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const menuRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n useLayoutMotion(bodyRef, shown, active);\n const trigger = useRef<HTMLButtonElement | null>(null);\n const value = (axis: VariantAxis) => selections[axis.id] ?? axisDefault(axis);\n const menuOptions =\n menu?.kind === 'color'\n ? menu.swatches.map((s) => ({\n ...s,\n isDefault: s.value.toLowerCase() === menu.defaultColor.toLowerCase(),\n }))\n : menu && menu.kind !== 'range'\n ? menu.options.map((o) => ({\n ...o,\n isDefault: o.id === menu.defaultOption,\n }))\n : [];\n const closeMenu = () => {\n setMenuOpen(false);\n setError('');\n requestAnimationFrame(() => {\n if (trigger.current?.isConnected) trigger.current.focus();\n else\n bodyRef.current?.parentElement\n ?.querySelector<HTMLButtonElement>('button')\n ?.focus();\n });\n };\n\n useEffect(() => {\n if (!menu) setMenuOpen(false);\n }, [menu]);\n\n // The panel grows only when the dialog's own content cannot fit in it, and the\n // dialog sits directly above the clicked heading when there is room.\n // biome-ignore lint/correctness/useExhaustiveDependencies: the dialog's content changes with the selected selector and its options.\n useLayoutEffect(() => {\n const root = bodyRef.current?.parentElement;\n const dialog = menuRef.current;\n const scroll = dialog?.querySelector<HTMLElement>('.isotone-menu-scroll');\n if (!root) return;\n const clear = () => {\n root.style.removeProperty('--iso-menu-need');\n root.style.removeProperty('--iso-menu-top');\n };\n if (!menuOpen || !dialog || !scroll) { clear(); return; }\n const place = () => {\n const natural = dialog.offsetHeight + scroll.scrollHeight - scroll.clientHeight;\n root.style.setProperty('--iso-menu-need', `${natural + 12}px`);\n const heading = trigger.current?.isConnected ? trigger.current.getBoundingClientRect().top : 0;\n const top = heading - root.getBoundingClientRect().top - natural - 6;\n root.style.setProperty('--iso-menu-top', `${Number.isFinite(top) && top >= 6 ? top : 6}px`);\n };\n place();\n window.addEventListener('resize', place);\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(place);\n observer?.observe(scroll);\n return () => {\n window.removeEventListener('resize', place);\n observer?.disconnect();\n clear();\n };\n }, [menuOpen, menu, menuOptions.length, error]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: closeMenu only touches state setters and refs, so the listener follows menuOpen alone.\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (e: PointerEvent) => {\n const dialog = menuRef.current;\n if (dialog && !e.composedPath().includes(dialog)) closeMenu();\n };\n window.addEventListener('pointerdown', onPointerDown, true);\n return () => window.removeEventListener('pointerdown', onPointerDown, true);\n }, [menuOpen]);\n\n useEffect(() => {\n if (menuOpen)\n menuRef.current?.querySelector<HTMLButtonElement>('button')?.focus();\n }, [menuOpen]);\n\n function feedback(axis: VariantAxis, optionId?: string) {\n const option =\n axis.kind === 'range'\n ? undefined\n : (axis.kind === 'color' ? axis.swatches : axis.options).find(\n (o) => o.id === optionId,\n );\n closeMenu();\n onFeedback?.({\n axisId: axis.id,\n label: axis.label,\n value: value(axis),\n ...(option ? { optionId: option.id, optionLabel: option.label } : {}),\n });\n }\n const requested = (action: VariantAction) => pendingActions.some(pending =>\n pending.axisId === action.axisId && pending.action === action.action && pending.optionId === action.optionId);\n async function manage(action: VariantAction) {\n if (!menu || busy || !onManage || requested(action)) return;\n setBusy(true);\n setError('');\n try {\n const option = menuOptions.find(o => o.id === action.optionId);\n await onManage(action, {\n axisId: menu.id, label: menu.label, value: value(menu),\n ...(option ? { optionId: option.id, optionLabel: option.label } : {}),\n });\n\n closeMenu();\n } catch (e) {\n setError(\n e instanceof Error ? e.message : 'Could not update this selector.',\n );\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <div className=\"isotone-vars\">\n <div className=\"isotone-panel-head\">\n {showTitle && <h2>{source.title ?? 'Variants'}</h2>}\n <div className=\"isotone-head-actions\">\n {source.saveDefaults && isDirty(shown, selections) && (\n <SaveDefaults source={source} onSaved={onSaved} />\n )}\n {onClose && (\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label=\"Close variants\"\n title=\"Close variants\"\n onClick={onClose}\n >\n <Icon name=\"close\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"isotone-vars-body\" ref={node => { bodyRef.current = node; node?.toggleAttribute('inert', menuOpen); }}>\n {sourceError && <p className=\"isotone-danger\" role=\"alert\">{sourceError}</p>}\n {shown.length === 0 && (\n <p className=\"isotone-empty\">No variants on this page yet. Ask your agent to create variants of any design and they will appear here.</p>\n )}\n {shown.map((axis) => {\n const thumbnails = axis.kind !== 'range' && axis.kind !== 'color' && axis.options.length > 0 && axis.options.every(option => option.image);\n return (\n <div\n className=\"isotone-axis\"\n key={axis.id}\n data-motion-key={axis.id}\n >\n <div className=\"isotone-axis-head\">\n <button\n type=\"button\"\n className=\"isotone-axis-label\"\n aria-label={`${axis.label} actions`}\n aria-haspopup=\"dialog\"\n aria-expanded={menuOpen && menu?.id === axis.id}\n onClick={(e) => {\n trigger.current = e.currentTarget;\n setMenuId(axis.id);\n setError('');\n setMenuOpen(true);\n }}\n >\n <span onPointerOver={showOverflowTitle}>{axis.label}</span>\n <Icon name=\"chevron\" size={12} />\n </button>\n {(axis.kind === 'range' || axis.kind === 'color') && (\n <span className=\"isotone-axis-value\">\n {axis.kind === 'range'\n ? formatRangeValue(axis, value(axis))\n : value(axis).toUpperCase()}\n </span>\n )}\n </div>\n {axis.kind === 'range' ? (\n <input\n type=\"range\"\n className=\"isotone-range\"\n aria-label={axis.label}\n aria-valuetext={formatRangeValue(axis, value(axis))}\n min={axis.min}\n max={axis.max}\n step={axis.step}\n value={Number(value(axis))}\n onChange={(e) => source.setSelection(axis.id, e.target.value)}\n />\n ) : axis.kind === 'color' ? (\n <fieldset className=\"isotone-swatches\" aria-label={axis.label}>\n {axis.swatches.map((sw) => (\n <button\n key={sw.id}\n type=\"button\"\n title={sw.label}\n aria-label={sw.label}\n aria-pressed={\n value(axis).toLowerCase() === sw.value.toLowerCase()\n }\n className=\"isotone-swatch\"\n style={{ backgroundColor: sw.value }}\n onClick={() => source.setSelection(axis.id, sw.value)}\n />\n ))}\n <label className=\"isotone-picker\" title=\"Custom colour\">\n <input\n type=\"color\"\n aria-label={`${axis.label}: custom colour`}\n value={value(axis)}\n onChange={(e) =>\n source.setSelection(axis.id, e.target.value)\n }\n />\n </label>\n </fieldset>\n ) : (\n <fieldset\n aria-label={axis.label}\n className={\n thumbnails\n ? 'isotone-grid'\n : 'isotone-segs'\n }\n >\n {axis.options.map((o) => (\n <button\n key={o.id}\n type=\"button\"\n aria-label={o.label}\n aria-pressed={value(axis) === o.id}\n className={`${thumbnails ? 'isotone-thumb' : 'isotone-seg'}${value(axis) === o.id ? ' isotone-seg-on' : ''}`}\n onClick={() => source.setSelection(axis.id, o.id)}\n >\n {thumbnails && (\n <img src={o.image} alt=\"\" />\n )}\n <span onPointerOver={showOverflowTitle}>{o.label}</span>\n </button>\n ))}\n </fieldset>\n )}\n\n </div>\n );\n })}\n </div>\n {menu && (\n <div\n className=\"isotone-axis-menu\"\n ref={node => { menuRef.current = node; node?.toggleAttribute('inert', !menuOpen); }}\n role=\"dialog\"\n aria-label={`${menu.label} actions`}\n aria-hidden={!menuOpen}\n data-open={menuOpen}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n closeMenu();\n }\n }}\n >\n <div className=\"isotone-menu-title\">\n <strong>{menu.label}</strong>\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label=\"Close selector actions\"\n title=\"Close selector actions\"\n onClick={closeMenu}\n >\n <Icon name=\"close\" />\n </button>\n </div>\n <div className=\"isotone-menu-scroll\">\n {onFeedback && (\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n onClick={() => feedback(menu)}\n >\n <Icon name=\"message\" />\n Feedback on this selector\n </button>\n )}\n {menu.kind !== 'range' && (\n <div className=\"isotone-menu-options\">\n {menuOptions.map((option) => (\n <div className=\"isotone-option-row\" key={option.id}>\n <span>\n {option.label}\n {option.isDefault && <small>Default</small>}\n </span>\n {onFeedback && (\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label={`Feedback on ${option.label}`}\n title=\"Give feedback\"\n onClick={() => feedback(menu, option.id)}\n >\n <Icon name=\"message\" />\n </button>\n )}\n {onManage && (\n <button\n type=\"button\"\n className=\"isotone-icon\"\n aria-label={`Remove ${option.label}`}\n disabled={option.isDefault || busy || requested({ axisId: menu.id, action: 'remove-option', optionId: option.id })}\n title={\n option.isDefault\n ? 'Default option'\n : 'Request option removal'\n }\n onClick={() =>\n void manage({\n axisId: menu.id,\n action: 'remove-option',\n optionId: option.id,\n })\n }\n >\n <Icon name=\"trash\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n onClick={() => {\n source.setSelection(menu.id, axisDefault(menu));\n closeMenu();\n }}\n >\n <Icon name=\"reset\" />\n Reset to default\n </button>\n {onManage && (\n <>\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n disabled={busy || requested({ axisId: menu.id, action: 'keep-default' })}\n onClick={() =>\n void manage({ axisId: menu.id, action: 'keep-default' })\n }\n >\n <Icon name=\"check\" />\n {requested({ axisId: menu.id, action: 'keep-default' }) ? 'Default-only request saved' : 'Keep default only'}\n </button>\n <button\n type=\"button\"\n className=\"isotone-menu-action isotone-danger\"\n disabled={busy || requested({ axisId: menu.id, action: 'remove-axis' })}\n onClick={() =>\n void manage({ axisId: menu.id, action: 'remove-axis' })\n }\n >\n <Icon name=\"trash\" />\n {requested({ axisId: menu.id, action: 'remove-axis' }) ? 'Removal request saved' : 'Remove selector & options'}\n </button>\n </>\n )}\n </div>\n {error && (\n <div className=\"isotone-menu-footer\">\n <p className=\"isotone-danger\" role=\"alert\">{error}</p>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction SaveDefaults({\n source,\n onSaved,\n}: {\n source: VariantsSource;\n onSaved?: () => void;\n}) {\n const [state, setState] = useState('');\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n useEffect(() => () => clearTimeout(timer.current), []);\n async function save() {\n if (state === 'Saving…') return;\n setState('Saving…');\n const selections: VariantSelections = { ...source.getSelections() };\n try {\n await source.saveDefaults?.(selections);\n setState('Saved for the agent');\n onSaved?.();\n } catch {\n setState('Could not save. Try again.');\n }\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setState(''), 2500);\n }\n return (\n <div className=\"isotone-save-row\">\n <button\n type=\"button\"\n className=\"isotone-save\"\n disabled={state === 'Saving…'}\n onClick={() => void save()}\n >\n Save as defaults\n </button>\n <span className=\"isotone-save-state\" role=\"status\">\n {state}\n </span>\n </div>\n );\n}\n","import { useLayoutEffect, useRef, type RefObject } from 'react';\nimport { MAX_ANIMATED_ITEMS, MOTION } from './motion';\n\ntype Position = { top: number; animation?: Animation };\n\nfunction clearPositions(positions: Map<string, Position>) {\n for (const item of positions.values()) item.animation?.cancel();\n positions.clear();\n}\n\n/** Reflow small visible lists only when their contents change. Read before writing. */\nexport function useLayoutMotion(ref: RefObject<HTMLElement | null>, revision: unknown, active = true) {\n const previous = useRef(new Map<string, Position>());\n // biome-ignore lint/correctness/useExhaustiveDependencies: revision signals a content/layout change without measuring on unrelated renders.\n useLayoutEffect(() => {\n const container = ref.current;\n const clear = () => clearPositions(previous.current);\n if (!container || !active) { clear(); return; }\n const elements = container.querySelectorAll<HTMLElement>('[data-motion-key]');\n if (elements.length > MAX_ANIMATED_ITEMS) { clear(); return; }\n const instant = container.closest('[data-instant=\"true\"]') ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches);\n if (instant) { clear(); return; }\n const measurements = Array.from(elements, element => {\n const key = element.dataset.motionKey ?? '';\n const old = previous.current.get(key);\n const transform = old?.animation ? getComputedStyle(element).transform : 'none';\n const offset = transform !== 'none' && typeof DOMMatrix !== 'undefined' ? new DOMMatrix(transform).m42 : 0;\n return { element, key, old, top: element.offsetTop, offset };\n });\n const next = new Map<string, Position>();\n for (const { element, key, old, top, offset } of measurements) {\n old?.animation?.cancel();\n let animation: Animation | undefined;\n const delta = old ? old.top + offset - top : 0;\n if (typeof element.animate === 'function') {\n if (old && Math.abs(delta) > 0.5) {\n animation = element.animate(\n [{ transform: `translateY(${delta}px)` }, { transform: 'translateY(0)' }],\n { duration: MOTION.reflow, easing: MOTION.easeOut },\n );\n } else if (!old) {\n animation = element.animate(\n [{ opacity: 0, transform: 'translateY(4px)' }, { opacity: 1, transform: 'translateY(0)' }],\n { duration: MOTION.exit, easing: MOTION.easeOut },\n );\n }\n }\n next.set(key, { top, animation });\n }\n for (const [key, item] of previous.current) if (!next.has(key)) item.animation?.cancel();\n previous.current = next;\n }, [ref, revision, active]);\n useLayoutEffect(() => {\n const media = typeof matchMedia === 'function' ? matchMedia('(prefers-reduced-motion: reduce)') : null;\n const changed = () => { if (media?.matches) clearPositions(previous.current); };\n media?.addEventListener('change', changed);\n return () => {\n media?.removeEventListener('change', changed);\n clearPositions(previous.current);\n };\n }, []);\n}\n","/** Auto follows the page at the dock; system follows the OS preference. */\nexport type IterationTheme = 'auto' | 'light' | 'dark' | 'system';\ntype ResolvedTheme = 'light' | 'dark';\ntype Color = { r: number; g: number; b: number; a: number };\n\n/** Computed colors usually use rgb(); let the browser convert other color spaces. */\nfunction parseColor(value: string): Color | null {\n const rgb = value.match(/^rgba?\\(([^)]+)\\)$/);\n if (rgb) {\n const parts = rgb[1].split(/[,\\s/]+/).filter(Boolean);\n const values = parts.map((part, i) =>\n Number.parseFloat(part) * (part.endsWith('%') ? (i === 3 ? 0.01 : 2.55) : 1),\n );\n if (values.length >= 3 && values.every(Number.isFinite))\n return { r: values[0], g: values[1], b: values[2], a: values[3] ?? 1 };\n }\n if (value === 'transparent') return { r: 0, g: 0, b: 0, a: 0 };\n if (!value || !globalThis.CSS?.supports('color', value)) return null;\n try {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n return { r, g, b, a: a / 255 };\n } catch {\n return null;\n }\n}\n\nfunction isPanel(node: Node | null): boolean {\n if (!node) return false;\n const element = node instanceof Element ? node : node.parentElement;\n if (element?.closest('[data-isotone]')) return true;\n const root = node.getRootNode();\n return root instanceof ShadowRoot && isPanel(root.host);\n}\n\n/** Include open shadow roots without letting our own shadow host affect the sample. */\nfunction paintStack(shadows?: Set<ShadowRoot>): Element[] {\n const x = Math.max(0, window.innerWidth - 44);\n const y = Math.max(0, window.innerHeight - 44);\n const elements = new Set<Element>();\n const visit = (element: Element) => {\n if (elements.has(element) || isPanel(element)) return;\n const shadow = element.shadowRoot;\n if (shadow) {\n shadows?.add(shadow);\n for (const child of shadow.elementsFromPoint?.(x, y) ?? []) {\n // Some browsers include ancestors outside the shadow tree in this result.\n if (child.getRootNode() === shadow) visit(child);\n }\n }\n elements.add(element);\n };\n for (const element of document.elementsFromPoint?.(x, y) ?? []) {\n if (element !== document.body && element !== document.documentElement) visit(element);\n }\n // Body paint covers the viewport even when its layout box is shorter than it.\n if (document.body) visit(document.body);\n visit(document.documentElement);\n return [...elements];\n}\n\nfunction systemTheme(): ResolvedTheme {\n return typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n}\n\n/**\n * Resolve actual paint at the dock, compositing transparent backgrounds over the\n * browser canvas. Background images and closed shadow roots cannot be sampled;\n * hosts using those can set an explicit theme or choose system.\n */\nexport function detectTheme(\n preference: IterationTheme = 'auto',\n shadows?: Set<ShadowRoot>,\n): ResolvedTheme {\n if (preference === 'light' || preference === 'dark') return preference;\n if (preference === 'system') return systemTheme();\n if (typeof document === 'undefined') return 'light';\n try {\n let remaining = 1;\n let r = 0, g = 0, b = 0;\n for (const element of paintStack(shadows)) {\n const parsed = parseColor(getComputedStyle(element).backgroundColor);\n if (!parsed || parsed.a <= 0) continue;\n const weight = parsed.a * remaining;\n r += parsed.r * weight;\n g += parsed.g * weight;\n b += parsed.b * weight;\n remaining *= 1 - parsed.a;\n if (remaining < 0.001) break;\n }\n const schemes = getComputedStyle(document.documentElement).colorScheme.split(/\\s+/);\n const darkCanvas = schemes.includes('dark') &&\n (!schemes.includes('light') || systemTheme() === 'dark');\n const canvas = darkCanvas ? 0 : 255;\n const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b + canvas * remaining) / 255;\n return luminance > 0.55 ? 'light' : 'dark';\n } catch {\n return 'light';\n }\n}\n\n/** Observe only the signals needed by the chosen mode, coalescing page changes per frame. */\nexport function observeTheme(\n onTheme: (theme: ResolvedTheme) => void,\n preference: IterationTheme = 'auto',\n): () => void {\n let current: ResolvedTheme | undefined;\n let frame: number | undefined;\n let disposed = false;\n const shadows = new Set<ShadowRoot>();\n const observer = preference === 'auto' ? new MutationObserver(records => {\n if (records.some(record => !isPanel(record.target))) schedule();\n }) : undefined;\n const observe = () => {\n if (!observer) return;\n observer.disconnect();\n const options = { attributes: true, childList: true, characterData: true, subtree: true };\n observer.observe(document.documentElement, options);\n for (const shadow of shadows) observer.observe(shadow, options);\n };\n const sample = () => {\n frame = undefined;\n if (disposed) return;\n shadows.clear();\n const next = detectTheme(preference, shadows);\n observe();\n if (next !== current) {\n current = next;\n onTheme(next);\n }\n };\n const schedule = () => { frame ??= window.requestAnimationFrame(sample); };\n sample();\n if (preference === 'light' || preference === 'dark') return () => {};\n\n const media = window.matchMedia?.('(prefers-color-scheme: dark)');\n media?.addEventListener('change', schedule);\n const pageEvent = (event: Event) => {\n if (!isPanel(event.target instanceof Node ? event.target : null)) schedule();\n };\n if (preference === 'auto') {\n window.addEventListener('resize', schedule);\n document.addEventListener('scroll', pageEvent, { capture: true, passive: true });\n // Capture non-bubbling stylesheet loads and palette animation completion.\n document.addEventListener('load', pageEvent, true);\n document.addEventListener('transitionend', pageEvent, true);\n document.addEventListener('animationend', pageEvent, true);\n }\n return () => {\n disposed = true;\n observer?.disconnect();\n if (frame !== undefined) window.cancelAnimationFrame(frame);\n media?.removeEventListener('change', schedule);\n window.removeEventListener('resize', schedule);\n document.removeEventListener('scroll', pageEvent, true);\n document.removeEventListener('load', pageEvent, true);\n document.removeEventListener('transitionend', pageEvent, true);\n document.removeEventListener('animationend', pageEvent, true);\n };\n}\n","import { showOverflowTitle } from './tooltips';\nimport type { IterationNote } from '../core/index';\n\n/** Pinned references and saved defaults use the same compact tag. */\nfunction SummaryTag({ label }: { label: string }) {\n return <span className=\"isotone-chip\"><span onPointerOver={showOverflowTitle}>{label}</span></span>;\n}\n\n/** Keep machine-directed requests readable without changing the agent's original text. */\nexport function NoteSummary({ note }: { note: IterationNote }) {\n if (!note.feedback.startsWith('[set-defaults]')) {\n const elements = note.elements ?? (note.element ? [note.element] : []);\n const references = [\n ...(note.variant ? [{\n key: `variant:${note.variant.axisId}`,\n label: `${note.variant.label}${note.variant.optionLabel ? ` / ${note.variant.optionLabel}` : ''}`,\n }] : []),\n ...elements.map(element => ({ key: element.selector, label: element.text || element.tag })),\n ];\n return <>\n <p>{note.feedback}</p>\n {references.length > 0 && <span className=\"isotone-meta\">\n {references.map(reference => <SummaryTag key={reference.key} label={reference.label} />)}\n </span>}\n </>;\n }\n const payload = note.payload && typeof note.payload === 'object' ? note.payload as Record<string, unknown> : {};\n const playground = payload.playground;\n const tags: { name: string; value: string }[] = [];\n if (playground && typeof playground === 'object' && !Array.isArray(playground)) {\n for (const [name, value] of Object.entries(playground)) {\n if (typeof value === 'string' || typeof value === 'number') tags.push({ name, value: String(value) });\n }\n } else {\n if (typeof payload.variants === 'string') for (const value of payload.variants.split(',').map(s => s.trim()).filter(Boolean)) tags.push({ name: 'variant', value });\n if (typeof payload.knobs === 'string') for (const pair of payload.knobs.split(',')) {\n const at = pair.indexOf(':');\n if (at > 0) tags.push({ name: pair.slice(0, at).trim(), value: pair.slice(at + 1).trim() });\n }\n }\n return <>\n <span className=\"isotone-request-heading\"><span className=\"isotone-request-kind\">Defaults</span><code>{note.route}</code></span>\n <span className=\"isotone-meta\">\n {tags.length ? <>{tags.slice(0, 3).map(tag => <SummaryTag key={`${tag.name}-${tag.value}`} label={`${tag.name} ${tag.value}`} />)}{tags.length > 3 && <span className=\"isotone-request-more\">+{tags.length - 3}</span>}</> : <code className=\"isotone-request-fallback\">{note.feedback.replace(/^\\[set-defaults\\]\\s*/, '')}</code>}\n </span>\n </>;\n}\n","import { useLayoutEffect, type RefObject } from 'react';\nimport { MAX_ANIMATED_ITEMS, MOTION } from './motion';\n\ntype Position = { x: number; y: number; width: number; height: number; animation?: Animation };\n\n/** Move panels without scaling their text, hit targets or corner shapes. */\nexport function useDockMotion(ref: RefObject<HTMLElement | null>, visible: boolean) {\n useLayoutEffect(() => {\n const root = ref.current;\n if (!root || !visible) return;\n const previous = new Map<HTMLElement, Position>();\n const exits = new Map<HTMLElement, { ghost: HTMLElement; animation: Animation }>();\n const reduced = typeof matchMedia === 'function' ? matchMedia('(prefers-reduced-motion: reduce)') : null;\n const removeExit = (element: HTMLElement) => {\n const exit = exits.get(element);\n if (!exit) return;\n exit.animation.cancel();\n exit.ghost.remove();\n exits.delete(element);\n };\n const measure = () => {\n const instant = root.dataset.instant === 'true' || reduced?.matches;\n // Finish all reads before cancelling animations or adding exit snapshots.\n const panels = Array.from(root.querySelectorAll<HTMLElement>('.isotone-panel:not(.isotone-exit)'), element => {\n const open = element.dataset.open === 'true';\n const transform = open ? getComputedStyle(element).transform : 'none';\n const matrix = transform !== 'none' && typeof DOMMatrix !== 'undefined' ? new DOMMatrix(transform) : undefined;\n return { element, open, rect: open ? element.getBoundingClientRect() : null, dx: matrix?.m41 ?? 0, dy: matrix?.m42 ?? 0 };\n });\n const current = new Set(panels.map(({ element }) => element));\n for (const [element, item] of previous) {\n if (current.has(element)) continue;\n item.animation?.cancel();\n previous.delete(element);\n removeExit(element);\n }\n for (const { element, open, rect, dx, dy } of panels) {\n const old = previous.get(element);\n if (!open || !rect) {\n if (!old) continue;\n old.animation?.cancel();\n removeExit(element);\n if (!instant && typeof element.animate === 'function' && element.querySelectorAll('[data-motion-key]').length <= MAX_ANIMATED_ITEMS) {\n const ghost = element.cloneNode(true) as HTMLElement;\n ghost.classList.add('isotone-exit');\n ghost.dataset.open = 'true';\n ghost.inert = true;\n ghost.setAttribute('aria-hidden', 'true');\n ghost.removeAttribute('id');\n for (const node of ghost.querySelectorAll('[id]')) node.removeAttribute('id');\n Object.assign(ghost.style, { position: 'fixed', left: `${old.x}px`, top: `${old.y}px`, width: `${old.width}px`, height: `${old.height}px`, pointerEvents: 'none' });\n root.appendChild(ghost);\n const animation = ghost.animate(\n [{ opacity: 1, transform: 'translateY(0)' }, { opacity: 0, transform: 'translateY(4px)' }],\n { duration: MOTION.exit, easing: MOTION.easeOut, fill: 'forwards' },\n );\n exits.set(element, { ghost, animation });\n animation.onfinish = () => removeExit(element);\n }\n previous.delete(element);\n continue;\n }\n removeExit(element);\n const x = rect.x - dx;\n const y = rect.y - dy;\n if (old && old.x === x && old.y === y) {\n old.width = rect.width;\n old.height = rect.height;\n if (instant) old.animation?.cancel();\n continue;\n }\n old?.animation?.cancel();\n const animation = !instant && typeof element.animate === 'function' ? element.animate(\n [{ transform: `translate(${old ? old.x + dx - x : 0}px, ${old ? old.y + dy - y : 6}px)`, opacity: old ? 1 : 0 }, { transform: 'translate(0, 0)', opacity: 1 }],\n { duration: MOTION.enter, easing: MOTION.easeOut },\n ) : undefined;\n previous.set(element, { x, y, width: rect.width, height: rect.height, animation });\n }\n if (instant) for (const element of exits.keys()) removeExit(element);\n };\n measure();\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(measure) : undefined;\n observer?.observe(root);\n const mutations = new MutationObserver(records => {\n const changed = records.some(record => {\n if (record.type === 'attributes') return record.target === root ||\n (record.target instanceof Element && record.target.matches('.isotone-panel:not(.isotone-exit)'));\n return [...record.addedNodes, ...record.removedNodes].some(node =>\n node instanceof Element && node.matches('.isotone-panel:not(.isotone-exit)'));\n });\n if (changed) measure();\n });\n mutations.observe(root, { subtree: true, childList: true, attributes: true, attributeFilter: ['data-open', 'data-instant'] });\n reduced?.addEventListener('change', measure);\n window.addEventListener('resize', measure);\n return () => {\n observer?.disconnect();\n mutations.disconnect();\n reduced?.removeEventListener('change', measure);\n window.removeEventListener('resize', measure);\n for (const element of exits.keys()) removeExit(element);\n for (const item of previous.values()) item.animation?.cancel();\n };\n }, [ref, visible]);\n}\n","import { createRoot } from 'react-dom/client';\n\nimport { createIterationStore, type RouteGateOptions } from '../core/index';\nimport {\n createOverlayVariantsSource,\n knobDelta,\n OVERLAY_DEFAULT_OPTION,\n type VariantsSource,\n VARIANTS_ENDPOINT,\n} from '../core/variants';\nimport { IterationPanel, type IterationShortcut } from './IterationPanel';\nimport { ensurePanelStyles } from './styles';\nimport type { IterationTheme } from './theme';\n\nexport interface MountIterationOptions {\n /** Auto follows the page at the dock. System follows the OS preference. */\n theme?: IterationTheme;\n /** Local adapter endpoint for automatic update notices. */\n updateEndpoint?: string;\n /** Defaults to Cmd/Ctrl+Shift+Period. false disables keyboard access. */\n shortcut?: IterationShortcut | false;\n /** The notes endpoint the dev plugin serves (or a framework preset). Omit\n * it and the panel has no Notes tab: a production host that only wants\n * variants passes a source and nothing else. */\n endpoint?: string;\n /**\n * Variants for the panel. A `VariantsSource` is rendered as-is; `'overlay'`\n * builds the overlay adapter against the Vite plugin's same-origin\n * endpoint. With neither this nor `endpoint`, nothing mounts.\n */\n variants?: VariantsSource | 'overlay';\n /** Which tab a tabbed panel opens on until the reviewer picks one. */\n defaultTab?: 'variants' | 'notes';\n /** Optional localStorage namespace for multi-app origins. */\n key?: string;\n /** Route visibility rule; default hides auth/error pages. */\n rule?: RouteGateOptions;\n /** Override the auto-detected pathname (sub-apps). Default: pathname. */\n getRoute?: () => string;\n /** Host context attached to each new note as its opaque payload — see\n * IterationPanelProps.getPayload. */\n getPayload?: () => unknown;\n}\n\n/**\n * Run a `createRoot` call and undo what it leaves on `document`.\n *\n * react-dom dedupes its delegated listeners with a private marker property on\n * the container. A root on any non-document container (our shadow root) also\n * stamps that marker on the container's owner document, because the one\n * event that has to live on the document, `selectionchange`, is deduped\n * against it. The same check then short-circuits a root created *on* the\n * document: a host that runs `hydrateRoot(document, …)` after our root exists\n * (React Router 7's default entry.client, React 19's whole-document pattern)\n * finds the marker already set and attaches none of its click, key or pointer\n * listeners. Every React handler in the host is dead, and unmounting our root\n * cannot bring them back. Seen with react-dom 19.2; the code is unchanged\n * since 18.\n *\n * Whether our root wins that race depends on module load order, which we do\n * not control, so instead the document is put back exactly as we found it.\n * The marker's name carries a per-instance random suffix, hence a diff of the\n * document's own keys around the call rather than a hard-coded name. Our own\n * `selectionchange` listener stays attached to the document and serves a\n * later document-level host root too; a later element-level host attaches a\n * second one, which React's select plugin already dedupes by selection.\n */\nfunction withDocumentUntouched<T>(create: () => T): T {\n const before = new Set(Object.getOwnPropertyNames(document));\n const result = create();\n for (const key of Object.getOwnPropertyNames(document)) {\n if (!before.has(key)) Reflect.deleteProperty(document, key);\n }\n return result;\n}\n\n/**\n * Self-mount the Iteration panel into a shadow root on `document.body`,\n * outside any app tree, tracking `window.location.pathname` so it needs no\n * router integration.\n *\n * The shadow root is what makes this safe to drop into an app nobody vetted:\n * the host's resets, its `button` and `textarea` rules, its stacking and its\n * global handlers stop at the boundary, so the panel looks the same in every\n * app. Inherited properties and custom properties still cross, which is\n * deliberate — the panel reads `--font-sans` and `--foreground` from the host\n * so it matches the surrounding theme.\n *\n * The host element carries `data-isotone`, and that is load-bearing:\n * `document.elementFromPoint` retargets to the host for anything inside a\n * shadow root, so the element picker's self-exclusion matches on it.\n *\n * The host is created at runtime by `mountIteration` (never part of any HTML\n * React hydrates) and is watched by a MutationObserver: if a whole-document\n * render — a React Router hydration failure made worse by an extension, for\n * instance — replaces `<body>` and drops the host, it is re-appended to the\n * new body, shadow root and all, instead of a fresh mount losing panel state.\n */\nexport function mountIteration(opts: MountIterationOptions): () => void {\n const getRoute = opts.getRoute ?? (() => window.location.pathname);\n const variants =\n opts.variants === 'overlay'\n ? overlaySourceWithSave(getRoute, opts.endpoint, opts.key)\n : opts.variants;\n // Nothing to show: no notes to write and no variants to pick. A production\n // host that forgot its source gets no empty launcher in the corner.\n if (!opts.endpoint && !variants) return () => {};\n // A variants-only host whose source has no axes on this page and no way to\n // get some later (no `refresh`) would mount an empty shadow root on every\n // such page. A hosted preview site is exactly that on axis-less\n // experiments, so skip the mount rather than leave a hollow host div.\n if (\n !opts.endpoint &&\n variants &&\n variants.getAxes().length === 0 &&\n typeof (variants as { refresh?: unknown }).refresh !== 'function'\n ) {\n return () => {};\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-isotone', 'root');\n const attachHost = () => {\n if (!host.isConnected) document.body.appendChild(host);\n return host;\n };\n attachHost();\n const shadow = host.attachShadow({ mode: 'open' });\n // Eagerly, so the panel never paints one frame unstyled.\n ensurePanelStyles(shadow);\n const root = withDocumentUntouched(() => createRoot(shadow));\n\n // Re-attach the host if a full-document render evicts it from body. In a\n // whole-document React Router app an extension-triggered hydration failure\n // makes React replace `document.body` wholesale; our host (appended at\n // runtime, never part of what React rendered) falls away with the old body.\n // Re-appending the SAME element restores the panel with its shadow root and\n // state intact — no second render, no duplication. The observer is on\n // `<html>` so a bare `body.replaceChildren()` also counts as a change; body\n // alone catches appendChild-of-a-new-body but not replaceChildren.\n const guard = new MutationObserver(() => {\n if (disposed) return;\n if (!host.isConnected) attachHost();\n });\n guard.observe(document.documentElement, { childList: true, subtree: true });\n\n function render() {\n root.render(\n <IterationPanel\n route={getRoute()}\n store={{ endpoint: opts.endpoint, key: opts.key }}\n rule={opts.rule}\n getPayload={opts.getPayload}\n variants={variants}\n defaultTab={opts.defaultTab}\n shortcut={opts.shortcut}\n updateEndpoint={opts.updateEndpoint}\n theme={opts.theme}\n />,\n );\n }\n\n const listeners: (() => void)[] = [];\n // Called from popstate/history wrappers that a router may invoke from\n // inside its own commit (Next dev does this on navigation). Keep every\n // `root.render` off that path — a render scheduled mid-commit fires React\n // 19 dev's \"useInsertionEffect must not schedule updates\", so coalesze to\n // one pending frame and flush once the host has settled.\n let disposed = false;\n let pending = false;\n const notify = () => {\n if (pending || disposed) return;\n pending = true;\n setTimeout(() => {\n pending = false;\n if (!disposed) render();\n }, 0);\n };\n\n // Deferred, not synchronous — the host may call mountIteration from an\n // effect (a React host mounts it from one), and a synchronous secondary root\n // render fires React 19 dev's \"useInsertionEffect must not schedule\n // updates\" because it commits while the host's own commit is in flight.\n // One macrotask later the host has settled; the panel simply mounts a\n // frame later, which is invisible because the host element starts empty.\n setTimeout(() => {\n if (disposed) return;\n render();\n window.addEventListener('popstate', notify);\n listeners.push(() => window.removeEventListener('popstate', notify));\n for (const evt of ['pushState', 'replaceState'] as const) {\n const orig = window.history[evt].bind(window.history);\n window.history[evt] = ((...a: Parameters<History['pushState']>) => {\n const r = orig(...a);\n notify();\n return r;\n }) as typeof orig;\n listeners.push(() => {\n window.history[evt] = orig as never;\n });\n }\n }, 0);\n\n return () => {\n disposed = true;\n for (const off of listeners) off();\n guard.disconnect();\n // Deferred, not synchronous: a React host calls this from an effect\n // cleanup, and unmounting our root while the host's render is in flight\n // is a race React 19 rejects (\"Attempted to synchronously unmount a root\n // while React was already rendering\"). One macrotask later the host's\n // commit is done; nothing observable changes for a vanilla host.\n setTimeout(() => {\n root.unmount();\n host.remove();\n }, 0);\n };\n}\n\n/**\n * The overlay adapter's source, with \"Save as defaults\" wired to the notes\n * file. Landing an overlay variant means copying files over the real ones,\n * which is the agent's move (`variant promote`), so the button does what the\n * host with its own axes does: it files one `[set-defaults]` note naming the reviewer's picks\n * across every selector on the route, and the agent promotes those. The\n * other variants are untouched; only an explicit ask removes a variant.\n * Without a notes endpoint there is nobody to file to, and the row stays\n * hidden.\n */\nfunction overlaySourceWithSave(\n getRoute: () => string,\n endpoint: string | undefined,\n key: string | undefined,\n): VariantsSource {\n const source = createOverlayVariantsSource({ endpoint: VARIANTS_ENDPOINT, getRoute });\n if (!endpoint) return source;\n const notes = createIterationStore({ endpoint, key });\n source.saveDefaults = async (selections) => {\n // In axis order, so the note reads top to bottom like the panel did.\n const picked = source\n .getAxes()\n // Knobs are numbers, not alternatives; they ride in their own clause below.\n .filter((axis) => axis.kind === undefined || axis.kind === 'select')\n .flatMap((axis) => {\n const id = selections[axis.id];\n if (!id || id === OVERLAY_DEFAULT_OPTION) return [];\n const variant = source.list?.variants.find((v) => v.id === id);\n const label = variant?.label ?? id;\n // The group names the element and the variant names the alternative;\n // a lone variant whose group is named after it needs no prefix.\n const named = axis.label === label ? label : `${axis.label}: ${label}`;\n return [{ id, named, element: variant?.element ?? null }];\n });\n // Knobs the reviewer moved off their defaults ride in the same note, as\n // the value the panel showed, so the agent can write the number in.\n const moved = knobDelta(source.knobs.axes, source.knobs.values);\n // Only the decision, nothing about the other variants: they stay until\n // the reviewer says otherwise, in their own words.\n const parts: string[] = [];\n if (picked.length) {\n parts.push(`Make the default: ${picked.map((p) => `\"${p.named}\" (${p.id})`).join('; ')}.`);\n }\n if (moved.length) {\n parts.push(`Knobs: ${moved.map((m) => `${m.axis.label} ${m.shown} (${m.axis.id})`).join('; ')}.`);\n }\n const feedback = parts.length\n ? `[set-defaults] ${parts.join(' ')}`\n : '[set-defaults] The current defaults stay on this route.';\n await notes.saveNote(\n getRoute(),\n feedback,\n picked[0]?.element ?? null,\n null,\n {\n variants: picked.length ? picked.map((p) => p.id).join(', ') : OVERLAY_DEFAULT_OPTION,\n ...(moved.length\n ? { knobs: moved.map((m) => `${m.axis.id}:${m.value}`).join(', ') }\n : {}),\n },\n { w: window.innerWidth, h: window.innerHeight },\n );\n };\n return source;\n}\n"],"mappings":"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","names":["useEffect","useId","useLayoutEffect","useMemo","useRef","useState","createElement","forwardRef","createElement","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","Icon","jsx","Icon","useEffect","useLayoutEffect","useMemo","useRef","useState","useRef","useRef","Fragment","jsx","jsxs","useState","useEffect","useMemo","selections","useRef","useLayoutEffect","Icon","Fragment","jsx","jsxs","useLayoutEffect","useLayoutEffect","animation","jsx","jsxs","useState","useRef","useEffect","useId","useLayoutEffect","useMemo","feedback","Icon","jsx"]}