isotone 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +84 -6
- package/CHANGELOG.md +46 -0
- package/README.md +64 -14
- package/dist/{IterationPanel-phJRYtUO.d.ts → IterationPanel-Bq77d5NT.d.ts} +3 -1
- package/dist/{chunk-FKEKBZ3E.js → chunk-2FY2JNPG.js} +95 -9
- package/dist/chunk-2FY2JNPG.js.map +1 -0
- package/dist/chunk-BDTB3DFR.js +100 -0
- package/dist/chunk-BDTB3DFR.js.map +1 -0
- package/dist/{chunk-PUXQGUMQ.js → chunk-BTJHQXF7.js} +104 -5
- package/dist/chunk-BTJHQXF7.js.map +1 -0
- package/dist/chunk-JCTWHR7U.js +13 -0
- package/dist/chunk-JCTWHR7U.js.map +1 -0
- package/dist/{chunk-I7CZUPDO.js → chunk-KRS57POF.js} +17 -33
- package/dist/chunk-KRS57POF.js.map +1 -0
- package/dist/chunk-L6O4HYGP.js +1150 -0
- package/dist/chunk-L6O4HYGP.js.map +1 -0
- package/dist/chunk-MX4RQJFV.js +9 -0
- package/dist/chunk-MX4RQJFV.js.map +1 -0
- package/dist/chunk-YPDV3PX4.js +142 -0
- package/dist/chunk-YPDV3PX4.js.map +1 -0
- package/dist/cli.js +1079 -148
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +135 -10
- package/dist/core.js +12 -3
- package/dist/index.d.ts +13 -28
- package/dist/index.js +618 -281
- package/dist/index.js.map +1 -1
- package/dist/isotone.global.js +98 -42
- package/dist/serve.d.ts +5 -3
- package/dist/serve.js +60 -23
- package/dist/serve.js.map +1 -1
- package/dist/server.d.ts +7 -0
- package/dist/server.js +24 -11
- package/dist/server.js.map +1 -1
- package/dist/vite-plugin.d.ts +4 -3
- package/dist/vite-plugin.js +48 -128
- package/dist/vite-plugin.js.map +1 -1
- package/docs/blast.md +164 -0
- package/docs/integrations.md +75 -15
- package/docs/migration.md +19 -0
- package/docs/updates.md +110 -4
- package/docs/variants.md +102 -9
- package/package.json +2 -1
- package/dist/chunk-A4DX2V4C.js +0 -7
- package/dist/chunk-A4DX2V4C.js.map +0 -1
- package/dist/chunk-FKEKBZ3E.js.map +0 -1
- package/dist/chunk-I7CZUPDO.js.map +0 -1
- package/dist/chunk-PUXQGUMQ.js.map +0 -1
- package/dist/chunk-RQ2YI5KS.js +0 -24
- package/dist/chunk-RQ2YI5KS.js.map +0 -1
- package/dist/chunk-TGAU3WTF.js +0 -549
- package/dist/chunk-TGAU3WTF.js.map +0 -1
- package/dist/chunk-X6V2AKJL.js +0 -375
- package/dist/chunk-X6V2AKJL.js.map +0 -1
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';\nimport { MOTION } from './motion';\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 PULSE_MS = 2000;\n\n/**\n * Where the composer floats while writing about pinned elements: the point\n * that was clicked, kept relative to its element so it follows scrolling.\n * x and y are the last known viewport point, for when the element is gone.\n */\ninterface Anchor {\n selector: string;\n dx: number;\n dy: number;\n x: number;\n y: number;\n}\n/** Space between the clicked point and the floating composer, and its viewport margin. */\nconst FLOAT_GAP = 12;\nconst FLOAT_MARGIN = 8;\n\n/**\n * Pulse a node on the document's own clock. Every pulse starts at the timeline's\n * origin, so the launcher ring and every note dot beat together whenever they\n * appear, instead of each starting from its own mount time.\n */\nfunction syncPulse(spread: number) {\n return (node: HTMLElement | null) => {\n if (!node || typeof node.animate !== 'function') return;\n if (node.closest('[data-instant=\"true\"]') ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches)) return;\n const tint = 'color-mix(in srgb, var(--iso-focus) 55%, transparent)';\n const pulse = node.animate([\n { boxShadow: `0 0 0 0 ${tint}`, offset: 0 },\n { boxShadow: `0 0 0 ${spread}px transparent`, offset: 0.7 },\n { boxShadow: `0 0 0 ${spread}px transparent`, offset: 1 },\n ], { duration: PULSE_MS, iterations: Infinity, easing: 'ease-out' });\n pulse.startTime = 0;\n };\n}\n/** Keyboard use and reduced motion make the panel immediate. */\nfunction stillMotion(node: Element) {\n return Boolean(node.closest('[data-instant=\"true\"]')) ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches);\n}\n/**\n * Fade an element in once, when it mounts. A CSS animation would replay\n * whenever the panel switches between keyboard and pointer use, since that\n * toggles animations off and on again; an animation started here cannot.\n * `data-still` on the element skips it.\n */\nfunction fadeIn(node: HTMLElement | null) {\n if (!node || typeof node.animate !== 'function' || node.dataset.still === 'true' || stillMotion(node)) return;\n node.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 140, easing: 'ease-out' });\n}\n/** The same, for a control whose surface stays put while its content arrives. */\nfunction fadeInContent(node: HTMLElement | null) {\n if (!node || stillMotion(node)) return;\n for (const child of node.children)\n if (typeof child.animate === 'function')\n child.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 140, easing: 'ease-out' });\n}\nconst dotPulse = syncPulse(6);\nconst ringPulse = syncPulse(8);\n\n/** How often an open page asks whether the notes changed. */\nconst POLL_MS = 2500;\n/** The slowest retry while the server cannot be reached. */\nconst POLL_MAX_MS = 30_000;\n\n/** Whether a poll changed anything the panel draws, without a deep diff. */\nfunction sameNotes(a: IterationNote[], b: IterationNote[]): boolean {\n if (a.length !== b.length) return false;\n const byId = new Map(a.map((note) => [note.id, note]));\n return b.every((note) => {\n const old = byId.get(note.id);\n return old !== undefined && JSON.stringify(old) === JSON.stringify(note);\n });\n}\n\n/** How long \"an agent is working on this\" is believed without a sign of life. */\nconst WORKING_FRESH_MS = 20 * 60 * 1000;\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 // Selecting that starts with the panel shows its cover at once, so the field\n // underneath never shows through while the panel fades in.\n const [pickingWithPanel, setPickingWithPanel] = useState(false);\n const [targets, setTargets] = useState<IterationElement[]>([]);\n const targetsRef = useRef(targets);\n targetsRef.current = targets;\n // Set once an element is pinned: the composer leaves the dock and floats next to it.\n const [anchor, setAnchor] = useState<Anchor | null>(null);\n const anchorRef = useRef(anchor);\n anchorRef.current = anchor;\n const floating = anchor !== null;\n const floatRef = useRef<HTMLDivElement>(null);\n // The dock keeps the composer's height while it floats, so the panel stays put.\n const slotHeight = useRef(0);\n // Where the floating composer last was, so moving to a new pin glides there.\n const lastFloat = useRef<{ left: number; top: number } | null>(null);\n const floatNode = useRef<HTMLDivElement | null>(null);\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 // Which pages' notes the list shows. Unset means this page only.\n const [scope, setScope] = useState<string[] | null>(null);\n const [clock, setClock] = useState(() => Math.floor(Date.now() / 60_000) * 60_000);\n const pollRev = useRef<string | null>(null);\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, floating]);\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 openNotes = useMemo(() => notes.filter((n) => !n.done), [notes]);\n // Pages that have open notes, this one first, so the row of page chips reads\n // the same on every page.\n const pages = useMemo(() => {\n const counts = new Map<string, number>();\n for (const n of openNotes) counts.set(n.route, (counts.get(n.route) ?? 0) + 1);\n const others = [...counts.keys()].filter((r) => r !== route).sort();\n return { counts, others };\n }, [openNotes, route]);\n const selectedPages = useMemo(() => {\n const chosen = (scope ?? [route]).filter((r) => r === route || pages.counts.has(r));\n return new Set(chosen.length ? chosen : [route]);\n }, [scope, route, pages]);\n const visibleNotes = useMemo(() => openNotes\n .filter((n) => selectedPages.has(n.route))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt)), [openNotes, selectedPages]);\n // An agent's claim goes stale: a crashed or abandoned run should not pulse forever.\n const working = useMemo(() => new Set(visibleNotes\n .filter((n) => n.workingAt && clock - Date.parse(n.workingAt) < WORKING_FRESH_MS)\n .map((n) => n.id)), [visibleNotes, clock]);\n function togglePage(page: string) {\n const next = new Set(selectedPages);\n if (next.has(page)) next.delete(page); else next.add(page);\n setScope(next.size ? [...next] : [route]);\n }\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 .pollNotes(null)\n .then((result) => ({ rev: result.rev, notes: result.notes ?? [] }))\n // Server away: show what this browser kept, if anything.\n .catch(() => store.pendingNotes().then((fresh) => ({ rev: null, notes: fresh })))\n .then(({ rev, notes: 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 pollRev.current = rev;\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({ preventScroll: true });\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 setAnchor(null);\n setExpanded(false);\n setHovered(false);\n (previousFocus.current?.isConnected\n ? previousFocus.current\n : fabRef.current\n )?.focus();\n }\n /** The pointer and the shortcut start selecting; Enter or Space on a focused button goes to the field. */\n function startFeedback(select: boolean) {\n setNotesOpen(true);\n if (select) {\n cancelAnimationFrame(focusFrame.current);\n setPickingWithPanel(!notesOpen);\n setPicking(true);\n } else focusComposer();\n }\n function openInitial(select: boolean) {\n previousFocus.current = document.activeElement as HTMLElement | null;\n setExpanded(true);\n if ((defaultTab === 'variants' || !notesAvailable) && variantsAvailable)\n setVariantsOpen(true);\n else startFeedback(select);\n }\n /** Put the composer back in the dock, keeping what was written and pinned. */\n function dockComposer() {\n setAnchor(null);\n setPicking(false);\n focusComposer();\n }\n function feedback(reference: VariantReference) {\n setAnchor(null);\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 setPicking(false);\n setAnchor(null);\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 setAnchor(null);\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 // Opening a surface or changing route loads at once; the poll below keeps it current.\n // biome-ignore lint/correctness/useExhaustiveDependencies: open-time refresh; store is stable.\n useEffect(() => {\n loadNotes();\n }, [notesOpen, variantsOpen, route]);\n // Keep the list current while the page is in front: an agent closing a note\n // shows up here without a reload. Only the notes request is repeated, so\n // nothing on the page, the composer or an edit in progress is touched. An\n // idle poll costs the server one stat; a hidden tab does not poll at all;\n // an unreachable server is retried less and less often.\n useEffect(() => {\n if (!notesAvailable || !visible) return;\n let stopped = false;\n let running = false;\n let failures = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const schedule = () => {\n clearTimeout(timer);\n if (stopped || document.hidden) return;\n timer = setTimeout(() => void tick(), Math.min(POLL_MS * 2 ** failures, POLL_MAX_MS));\n };\n const tick = async () => {\n if (stopped || running || document.hidden) return;\n running = true;\n const request = noteRequest.current;\n const revision = noteRevision.current;\n try {\n const result = await store.pollNotes(pollRev.current);\n failures = 0;\n // A local save, delete or reload while the request was out wins over it.\n if (stopped || request !== noteRequest.current || revision !== noteRevision.current || pendingWrites.current) return;\n pollRev.current = result.rev;\n const fresh = result.notes;\n if (fresh) setNotes((prev) => (sameNotes(prev, fresh) ? prev : fresh));\n // Coarse on purpose: the value only ages out stale claims, and an\n // unchanged minute lets React skip the render.\n setClock(Math.floor(Date.now() / 60_000) * 60_000);\n } catch {\n failures = Math.min(failures + 1, 8);\n } finally {\n running = false;\n schedule();\n }\n };\n const wake = () => {\n if (document.hidden) { clearTimeout(timer); return; }\n failures = 0;\n void tick();\n };\n schedule();\n document.addEventListener('visibilitychange', wake);\n window.addEventListener('focus', wake);\n return () => {\n stopped = true;\n clearTimeout(timer);\n document.removeEventListener('visibilitychange', wake);\n window.removeEventListener('focus', wake);\n };\n }, [notesAvailable, visible, store]);\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 setAnchor(null);\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 (!notesAvailable) setVariantsOpen((v) => !v);\n else if (picking) {\n setPicking(false);\n focusComposer();\n } else {\n if (!open)\n previousFocus.current = document.activeElement as HTMLElement;\n setExpanded(true);\n startFeedback(true);\n }\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 (anchor) dockComposer();\n else 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 const added = !targetsRef.current.some((t) => t.selector === target.selector);\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 return added ? target : null;\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 const added = toggleTarget(el);\n // The composer comes to the element that was just pinned, ready for typing.\n if (added) {\n const r = el.getBoundingClientRect();\n const pointed = e.detail > 0 || e.clientX !== 0 || e.clientY !== 0;\n const x = pointed ? e.clientX : r.left;\n const y = pointed ? e.clientY : r.bottom;\n if (!anchorRef.current)\n slotHeight.current = rootRef.current?.querySelector<HTMLElement>('.isotone-notes-panel .isotone-input')?.offsetHeight ?? 0;\n setAnchor({ selector: added.selector, dx: x - r.left, dy: y - r.top, x, y });\n setNotesOpen(true);\n focusWhilePicking();\n }\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 // The composer is covered while selecting. Typing a character finishes\n // selecting and lands in the composer, unless the page has an input focused.\n const typing = e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey && !e.isComposing;\n if (typing) {\n const el = e.composedPath().find((node): node is Element => node instanceof Element);\n if (el && !el.closest('[data-isotone]') && el.closest('input, textarea, select, [contenteditable]')) return;\n setPicking(false);\n setNotesOpen(true);\n textareaRef.current?.focus();\n return;\n }\n if (e.key !== 'Escape' && e.key !== 'Enter') return;\n // The floating composer is not covered, so Enter there sends what is written.\n const field = textareaRef.current;\n if (\n e.key === 'Enter' && anchorRef.current && field && !e.shiftKey &&\n field.value.trim() && e.composedPath().includes(field)\n )\n return;\n e.preventDefault();\n e.stopImmediatePropagation();\n // Enter keeps what was pinned. Escape cancels the selection: the pins go,\n // what was written stays, and the composer returns to the dock.\n if (e.key === 'Escape') {\n setTargets([]);\n setAnchor(null);\n }\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 // Presses and clicks only. Releases (pointerup, mouseup, touchend) still\n // reach the page, so a host drag that ends over the dock still ends.\n const types = ['pointerdown', 'mousedown', 'touchstart', '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 (!notesOpen) setAnchor(null);\n }, [notesOpen]);\n // Place the floating composer beside its anchor, inside the viewport. It opens\n // below the point when it fits and above otherwise, and keeps that side while\n // it grows, so typing never makes it jump.\n useLayoutEffect(() => {\n const float = floatRef.current;\n if (!anchor || !float) {\n lastFloat.current = null;\n return;\n }\n floatNode.current = float;\n const from = lastFloat.current;\n let frame: number | undefined;\n let side: 'below' | 'above' | null = null;\n const place = () => {\n frame = undefined;\n let { x, y } = anchor;\n try {\n const el = document.querySelector(anchor.selector);\n if (el) {\n const r = el.getBoundingClientRect();\n x = r.left + anchor.dx;\n y = r.top + anchor.dy;\n }\n } catch {}\n const vw = document.documentElement.clientWidth || innerWidth;\n const vh = innerHeight;\n const w = float.offsetWidth;\n const h = float.offsetHeight;\n let left = x + FLOAT_GAP;\n if (left + w > vw - FLOAT_MARGIN) left = x - FLOAT_GAP - w;\n left = Math.max(FLOAT_MARGIN, Math.min(left, vw - w - FLOAT_MARGIN));\n const fitsBelow = y + FLOAT_GAP + h <= vh - FLOAT_MARGIN;\n const fitsAbove = y - FLOAT_GAP - h >= FLOAT_MARGIN;\n if (side === null || (side === 'below' ? !fitsBelow && fitsAbove : !fitsAbove && fitsBelow))\n side = fitsBelow || !fitsAbove ? 'below' : 'above';\n float.style.left = `${left}px`;\n if (side === 'below') {\n const top = Math.max(FLOAT_MARGIN, Math.min(y + FLOAT_GAP, vh - h - FLOAT_MARGIN));\n float.style.top = `${top}px`;\n float.style.bottom = 'auto';\n float.style.transformOrigin = `${x - left}px ${y - top}px`;\n } else {\n const bottom = Math.max(FLOAT_MARGIN, Math.min(vh - y + FLOAT_GAP, vh - h - FLOAT_MARGIN));\n float.style.bottom = `${bottom}px`;\n float.style.top = 'auto';\n float.style.transformOrigin = `${x - left}px ${y - (vh - bottom - h)}px`;\n }\n lastFloat.current = { left, top: side === 'below' ? Number.parseFloat(float.style.top) : vh - Number.parseFloat(float.style.bottom) - h };\n };\n const schedule = () => { frame ??= requestAnimationFrame(place); };\n place();\n // The composer grows out of the clicked point once, when it opens. A later\n // pin moves it, and it glides there rather than jumping.\n const to = lastFloat.current;\n const still = stillMotion(float) || typeof float.animate !== 'function';\n let glide: Animation | undefined;\n if (still) {\n // Immediate: no movement.\n } else if (!from)\n glide = float.animate([{ opacity: 0, transform: 'scale(.96)' }, { opacity: 1, transform: 'none' }],\n { duration: MOTION.enter, easing: MOTION.easeOut });\n else if (to && (from.left !== to.left || from.top !== to.top))\n glide = float.animate(\n [{ translate: `${from.left - to.left}px ${from.top - to.top}px` }, { translate: '0 0' }],\n { duration: MOTION.enter, easing: MOTION.easeOut },\n );\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(schedule) : undefined;\n observer?.observe(float);\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n return () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n glide?.cancel();\n observer?.disconnect();\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n };\n }, [anchor]);\n // Leaving the page, the floating composer fades where it was instead of\n // vanishing in one frame. Keyboard actions and reduced motion stay immediate.\n useLayoutEffect(() => {\n const last = floatNode.current;\n const root = rootRef.current;\n if (floating || !last || !root) return;\n floatNode.current = null;\n if (typeof last.animate !== 'function' || stillMotion(root)) return;\n const ghost = last.cloneNode(true) as HTMLElement;\n const field = last.querySelector('textarea');\n const copy = ghost.querySelector('textarea');\n if (field && copy) copy.value = field.value;\n ghost.classList.add('isotone-exit');\n ghost.inert = true;\n ghost.setAttribute('aria-hidden', 'true');\n ghost.removeAttribute('role');\n root.appendChild(ghost);\n const fade = ghost.animate([{ opacity: 1 }, { opacity: 0, transform: 'scale(.98)' }], {\n duration: MOTION.exit, easing: MOTION.easeOut, fill: 'forwards',\n });\n fade.onfinish = () => ghost.remove();\n return () => { fade.cancel(); ghost.remove(); };\n }, [floating]);\n // Pinned elements stay outlined while their note is written next to them.\n useEffect(() => {\n if (!picking && !floating) {\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, floating]);\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 <PanelClose label=\"Close variants\" onClose={() => { setVariantsOpen(false); setExpanded(false); }} />\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 // The dock names the element the floating composer sits next to.\n const anchored = targets.find((t) => t.selector === anchor?.selector) ?? targets[0];\n const awayLabel = anchored\n ? `Next to ${anchored.text || anchored.tag}${targets.length > 1 ? ` and ${targets.length - 1} more` : ''}`\n : 'Next to where you clicked';\n // One composer, in the dock or floating beside the element being written about.\n const composer = (\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 <div className=\"isotone-entry\">\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${shortcutLabel ? ` · ${shortcutLabel}` : ''}`}\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 setPickingWithPanel(false);\n setPicking((v) => !v);\n }}\n >\n <Icon name=\"pin\" size={14} />\n </button>\n {floating && picking && (\n <span ref={fadeIn} className=\"isotone-float-hint\">Click to pin more · hold ⇧ to use the page</span>\n )}\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 {picking && !floating && (\n <div ref={fadeIn} className=\"isotone-picking\" data-still={pickingWithPanel}>\n <Icon name=\"pin\" size={14} />\n <p>\n <span>{targets.length ? `${targets.length} selected` : 'Click elements on the page'}</span>\n <small>Hold ⇧ to use the page normally</small>\n </p>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setPicking(false);\n focusComposer();\n }}\n >\n Done <kbd>↵</kbd>\n </button>\n </div>\n )}\n </div>\n </fieldset>\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 <PanelClose\n label=\"Close feedback\"\n onClose={() => {\n setNotesOpen(false);\n setExpanded(false);\n setPicking(false);\n }}\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 {pages.counts.size > 1 && (\n <fieldset className=\"isotone-pages\" aria-label=\"Pages\">\n {[route, ...pages.others].map((page) => (\n <button\n key={page}\n type=\"button\"\n className=\"isotone-page\"\n aria-pressed={selectedPages.has(page)}\n title={page === route ? `This page · ${page}` : page}\n onClick={() => togglePage(page)}\n >\n <span onPointerOver={showOverflowTitle}>{page === route ? 'This page' : page}</span>\n <small>{pages.counts.get(page) ?? 0}</small>\n </button>\n ))}\n </fieldset>\n )}\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 {working.has(note.id) && <span className=\"isotone-working\" ref={dotPulse} role=\"img\" aria-label=\"An agent is working on this\" title=\"An agent is working on this\" />}\n <NoteSummary note={note} page={note.route !== route ? note.route : undefined} />\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 {floating ? (\n <button\n type=\"button\"\n ref={fadeInContent}\n className=\"isotone-away\"\n title=\"Write here instead\"\n style={{ minHeight: slotHeight.current || undefined }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={dockComposer}\n >\n <Icon name=\"pin\" size={14} />\n <span className=\"isotone-away-text\">\n <span>Writing on the page</span>\n <small>{awayLabel}</small>\n </span>\n <span className=\"isotone-away-action\">Move here</span>\n </button>\n ) : composer}\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-working={working.size > 0}\n data-open={open}\n className=\"isotone-root\"\n >\n <div className=\"isotone-rail-track\" aria-hidden=\"true\" />\n {(picking || floating) &&\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 {floating && notesOpen && (\n <div\n ref={floatRef}\n className=\"isotone-float\"\n role=\"dialog\"\n aria-label=\"Feedback on the selection\"\n >\n {composer}\n </div>\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={(event) => {\n setExpanded(false);\n if (notesOpen) {\n setNotesOpen(false);\n setPicking(false);\n } else startFeedback(event.detail > 0);\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${working.size ? ` · ${working.size} in progress` : ''}${shortcutLabel ? ` · ${shortcutLabel}` : ''}`}\n aria-expanded={railOpen}\n onClick={(event) => {\n if (open) closeAll();\n else if (expanded) setExpanded(false);\n else openInitial(event.detail > 0);\n }}\n >\n {working.size > 0 && <span className=\"isotone-ring\" ref={ringPulse} />}\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/** A quiet close control in the panel's top-left corner. */\nfunction PanelClose({ label, onClose }: { label: string; onClose: () => void }) {\n return (\n <button type=\"button\" className=\"isotone-panel-close\" aria-label={label} title={label} onClick={onClose}>\n <Icon name=\"close\" size={12} />\n </button>\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 { 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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-float) { 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; pointer-events: none; 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); }\n/* The close control sits on the panel's top-left corner, half outside it, with\n the same face as a note's delete button, a touch larger. It fades in while the\n pointer is over the panel; keyboard focus and touch screens always show it. */\n.isotone-panel-close { position: absolute; left: -9px; top: -9px; z-index: 3; width: 26px; height: 26px; display: grid; place-items: center; padding: 0; border: 0; isolation: isolate; color: var(--iso-muted); background: none; opacity: 0; }\n.isotone-panel-close::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); transition: background-color 120ms ease; }\n.isotone-root .isotone-panel > .isotone-panel-close { transition: opacity 220ms ease, color 120ms ease; }\n.isotone-root .isotone-panel:hover > .isotone-panel-close, .isotone-panel-close:focus-visible { opacity: 1; }\n.isotone-root .isotone-panel > .isotone-panel-close:hover { color: var(--iso-fg); }\n.isotone-panel-close:hover::before { background: var(--iso-control-hover-face); }\n@media (hover: none) { .isotone-panel-close { opacity: 1; } }\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-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/* The panel no longer clips, so its corner close can overhang; the variants body clips itself. */\n.isotone-root .isotone-panel > .isotone-vars { overflow: hidden; border-radius: 11px; }\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-picking button, .isotone-away-action { 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; overflow: hidden; }\n.isotone-save-row { position: relative; }\n.isotone-save-state { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n.isotone-save-label { display: block; }\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-more { flex: none; color: var(--iso-faint); font-size: 9px; }\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/* One chip per page that has open notes, this page first. */\n.isotone-pages { display: flex; flex: none; min-width: 0; border-top: 0; border-bottom: 0; border-inline: 0; gap: 4px; overflow-x: auto; overscroll-behavior: contain; margin: 0 calc(0px - var(--iso-space)); padding: 0 var(--iso-space); }\n.isotone-page { flex: 0 1 auto; display: inline-flex; align-items: center; gap: 6px; min-width: 0; max-width: 160px; height: 22px; padding: 0 7px; border-radius: var(--iso-control-radius); border: 1px solid var(--iso-edge); background: transparent; color: var(--iso-muted); font-size: 10px; }\n.isotone-page > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-page small { color: var(--iso-faint); font-size: 9px; font-variant-numeric: tabular-nums; }\n.isotone-page[aria-pressed='true'] { color: var(--iso-fg); background: var(--iso-label-face); box-shadow: var(--iso-label-lift-shadow); }\n/* An agent has said it is working on a note: a soft pulse on the note, and a ring on the launcher.\n Both are driven by one shared clock (see syncPulse), so they beat together. */\n.isotone-note-hit { position: relative; }\n.isotone-working { position: absolute; left: 3px; top: 5px; width: 6px; height: 6px; border-radius: 50%; background: var(--iso-focus); }\n.isotone-ring { position: absolute; inset: 0; border-radius: 999px; pointer-events: none; }\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-entry .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-entry { position: relative; display: flex; flex-direction: column; gap: 8px; }\n/* Select mode covers the field and says how to finish, next to the elements the user is picking. */\n.isotone-picking { position: absolute; inset: -4px; z-index: 1; display: flex; align-items: center; gap: 10px; padding: 0 4px 0 8px; border-radius: 6px; background: var(--iso-well); cursor: default; }\n.isotone-picking > svg { flex: none; color: var(--iso-fg); }\n.isotone-picking p { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; margin: 0; }\n.isotone-picking span { font-size: 12px; line-height: 16px; color: var(--iso-fg); font-variant-numeric: tabular-nums; }\n.isotone-picking small { font-size: 10px; line-height: 14px; color: var(--iso-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-picking button { flex: none; display: flex; align-items: center; gap: 8px; height: 28px; padding: 0 9px; }\n.isotone-picking kbd { font: inherit; color: var(--iso-muted); }\n/* After a pin, the composer floats beside the element on a panel surface, placed by\n IterationPanel inside the viewport. It grows out of the point that was clicked. */\n.isotone-float { position: fixed; z-index: 2147483002; width: min(300px, calc(100vw - 16px)); padding: 4px; background: var(--iso-bg); border: 1px solid var(--iso-line); border-radius: 12px; box-shadow: var(--iso-panel-shadow); }\n.isotone-float-hint { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10px; color: var(--iso-muted); }\n/* Meanwhile the dock keeps the composer's slot and says where the writing went. */\n.isotone-away { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 50px; padding: 8px 8px 8px 10px; text-align: left; color: var(--iso-fg); background: var(--iso-well); border: 1px solid var(--iso-input-border); box-shadow: var(--iso-input-shadow); border-radius: 8px; }\n.isotone-away > svg { flex: none; }\n.isotone-root .isotone-float.isotone-exit { pointer-events: none; }\n.isotone-away-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n.isotone-away-text > * { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-away-text > span { font-size: 12px; line-height: 16px; }\n.isotone-away-text > small { font-size: 10px; line-height: 14px; color: var(--iso-muted); }\n.isotone-away-action { flex: none; display: flex; align-items: center; height: 28px; padding: 0 9px; font-size: 11px; }\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-picking button):not(:disabled):hover, .isotone-away:hover .isotone-away-action { 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-ring { box-shadow: 0 0 0 2px color-mix(in srgb, var(--iso-focus) 50%, transparent); }\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/* Instant mode follows any key press, but the corner close only ever appears under the pointer, so it keeps its fade. */\n.isotone-root[data-instant='true'] .isotone-panel > .isotone-panel-close { transition-duration: 220ms, 120ms !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 { MOTION } from './motion';\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(''), 3000);\n }\n // The button itself carries the result for a few seconds: its label crossfades\n // and its width eases between the two label widths.\n const label = state && state !== 'Saving…' ? state : 'Save as defaults';\n const button = useRef<HTMLButtonElement>(null);\n const text = useRef<HTMLSpanElement>(null);\n const width = useRef(0);\n // biome-ignore lint/correctness/useExhaustiveDependencies: only a label change needs a measurement.\n useLayoutEffect(() => {\n const node = button.current;\n if (!node) return;\n node.style.width = '';\n const next = node.offsetWidth;\n const previous = width.current;\n width.current = next;\n const instant = node.closest('[data-instant=\"true\"]') ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches);\n if (!previous || instant || typeof node.animate !== 'function') return;\n text.current?.animate(\n [{ opacity: 0, transform: 'translateY(3px)' }, { opacity: 1, transform: 'translateY(0)' }],\n { duration: MOTION.enter, easing: MOTION.easeOut },\n );\n if (Math.abs(previous - next) < 0.5) return;\n node.animate(\n [{ width: `${previous}px` }, { width: `${next}px` }],\n { duration: MOTION.reflow, easing: MOTION.easeOut },\n );\n }, [label]);\n return (\n <div className=\"isotone-save-row\">\n <button\n ref={button}\n type=\"button\"\n className=\"isotone-save\"\n disabled={state === 'Saving…'}\n aria-busy={state === 'Saving…'}\n onClick={() => void save()}\n >\n <span className=\"isotone-save-label\" ref={text}>{label}</span>\n </button>\n <span className=\"isotone-save-state\" role=\"status\">{state}</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, page }: { note: IterationNote; page?: string }) {\n if (!note.feedback.startsWith('[set-defaults]')) {\n const elements = note.elements ?? (note.element ? [note.element] : []);\n const references = [\n ...(page ? [{ key: `page:${page}`, label: page }] : []),\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 const addAll = (values: unknown) => {\n if (!values || typeof values !== 'object' || Array.isArray(values)) return;\n for (const [name, value] of Object.entries(values)) {\n if (typeof value === 'string' || typeof value === 'number') tags.push({ name, value: String(value) });\n }\n };\n addAll(playground);\n if (!tags.length) {\n // Hosts file picks as an object, or as the comma lists the overlay writes.\n addAll(payload.variants);\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 // Same row as every other note: the text, then compact tags for the picks.\n return <>\n <p>{note.feedback}</p>\n {(page || tags.length > 0) && <span className=\"isotone-meta\">\n {page && <SummaryTag label={page} />}\n {tags.slice(0, 3).map(tag => <SummaryTag key={`${tag.name}-${tag.value}`} label={`${tag.name} ${tag.value}`} />)}\n {tags.length > 3 && <span className=\"isotone-request-more\">+{tags.length - 3}</span>}\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,kBAAkB,OAAkC;AAClE,QAAM,QAAQ,MAAM;AACpB,MAAI,MAAM,cAAc,MAAM,YAAa,OAAM,QAAQ,MAAM,aAAa,KAAK,KAAK;AAAA,MACjF,OAAM,gBAAgB,OAAO;AACpC;;;ACHA,SAAS,aAAa,aAAAA,YAAW,SAAAC,QAAO,mBAAAC,kBAAiB,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACC1F,IAAM,cAAc;AAAA,EAClB,IAAI;AAAA,EAAuB,QAAQ;AAAA,EAAuB,MAAM;AAAA,EAChE,MAAM;AAAA,EAAuB,MAAM;AAAA,EACnC,IAAI;AAAA,EAAuB,OAAO;AAAA,EAClC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA,EAAQ,aAAa;AAAA,EAAoB,gBAAgB;AAAA,EACzE,QAAQ;AAAA,EAAW,OAAO;AAAA,EAAuB,iBAAiB;AAAA,EAClE,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,eAAe;AAAA,EAAS,eAAe;AAAA,EAAS,kBAAkB;AAAA,EAClE,cAAc;AAAA,EAAS,eAAe;AAAA,EACtC,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,aAAa;AAAA,EAAW,aAAa;AAAA,EAAa,sBAAsB;AAC1E;AAEO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA;AAAA;AAAA,EAGN,OAAO;AAAA,IACL,IAAI;AAAA,IAAQ,QAAQ;AAAA,IAAQ,MAAM;AAAA,IAClC,MAAM;AAAA,IAAuB,MAAM;AAAA,IACnC,IAAI;AAAA,IAAuB,OAAO;AAAA,IAAuB,OAAO;AAAA,IAChE,OAAO;AAAA,IACP,gBAAgB;AAAA,IAAmC,aAAa;AAAA,IAAuB,gBAAgB;AAAA,IACvG,QAAQ;AAAA,IAAW,OAAO;AAAA,IAC1B,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,eAAe;AAAA,IAAmB,eAAe;AAAA,IAAmB,kBAAkB;AAAA,IACtF,cAAc;AAAA,IAAa,eAAe;AAAA,IAC1C,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,cAAc;AAAA,IAAuB,mBAAmB;AAAA,IACxD,aAAa;AAAA,IAAW,aAAa;AAAA,IAAa,sBAAsB;AAAA,EAC1E;AACF;AAGO,IAAM,sBAAsB;AAAA,EACjC,aAAa;AAAA,EAAmB,oBAAoB;AAAA,EACpD,aAAa;AAAA,EAAuB,oBAAoB;AAAA,EACxD,gBAAgB;AAAA,EAAe,gBAAgB;AAAA,EAC/C,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAAuB,sBAAsB;AAAA,EAC7D,kBAAkB;AAAA,EAAyB,wBAAwB;AAAA;AAAA,EAEnE,iBAAiB;AAAA,EAA2B,mBAAmB;AAAA,EAC/D,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EAAuB,gBAAgB;AAAA,EACrD,oBAAoB;AAAA,EAAyB,sBAAsB;AAAA,EAAuG,gBAAgB;AAAA,EAC1L,iBAAiB;AAAA,EAAO,iBAAiB;AAAA;AAAA,EAEzC,0BAA0B;AAC5B;AAEO,IAAM,sBAAsB,IAAI;AAAA,EACrC,OAAO,KAAK,WAAW,EAAE,IAAI,UAAQ,SAAS,IAAI,EAAE;AACtD;AACA,SAAS,OAAO,QAAwC;AACtD,SAAO,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,KAAK,IAAI;AAC5F;AACO,IAAM,iBAAiB;AAAA,kBACZ,OAAO,SAAS,IAAI,CAAC,IAAI,OAAO,mBAAmB,CAAC;AAAA,sCAChC,OAAO,SAAS,KAAK,CAAC;AAAA;;;AC3FrD,IAAM,SAAS;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AACX;AAGO,IAAM,qBAAqB;;;ACR3B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA5B,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA/B,SAAS,WAAW,OAAO,QAAQ,gBAAgB;A;;;;;ACK5C,IAAM,cAAc,CAAC,WAC1B,QAAQ,QAAQ,sBAAsB,OAAO,EAAE,YAAA;;;ACD1C,SAAS,iBACd,UACA,UACA,UAAoB,CAAA,GACJ;AAChB,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,uDAAuD;EACzE;AAEA,SAAO;IACL,MAAM,YAAY,QAAQ;IAC1B,MAAM;IACN,MAAM;IACN,GAAI,QAAQ,SAAS,IAAI,EAAE,QAAA,IAAY,CAAA;EAAC;AAE5C;;;ACfO,IAAM,cAAc,CAAmB,WAAc;AAC1D,MAAI,MAAM;AACV,MAAI,YAAY;AAEhB,aAAW,MAAM,QAAQ;AACvB,QAAI,OAAO,OAAO,OAAO,OAAO,MAAM,KAAK;AACzC,kBAAY,IAAI,SAAS;AACzB;IACF;AAEA,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,GAAG,YAAA;IACZ,OAAO;AACL,aAAO,YAAY,GAAG,YAAA,IAAgB;IACxC;AAEA,gBAAY;EACd;AAEA,SAAO;AACT;;;ACjBO,IAAM,eAAe,CAAmB,WAAgC;AAC7E,QAAM,YAAY,YAAY,MAAM;AAEpC,SAAQ,UAAU,OAAO,CAAC,EAAE,YAAA,IAAgB,UAAU,MAAM,CAAC;AAC/D;A;;;;;ACPO,IAAM,eAAe,IAA2C,YACrE,QACG,OAAO,CAAC,WAAW,OAAO,UAAU;AACnC,SACE,QAAQ,SAAS,KAChB,UAAqB,KAAA,MAAW,MACjC,MAAM,QAAQ,SAAS,MAAM;AAEjC,CAAC,EACA,KAAK,GAAG,EACR,KAAA;;;AChBL,IAAM,oBAAoB;EACxB,OAAO;EACP,OAAO;EACP,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ;EACR,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;AACrB;;;ACNA,SAAS,UAAa,OAAyC;AAC7D,SAAO,UAAU,QAAQ,UAAU;AACrC;AAQA,SAAS,oBAAoB,MAAsB,SAA4B,CAAA,GAAoB;AACjG,QAAM,iBAAiB,OAAO,kBAAkB,CAAA;AAChD,QAAM,mBAAmB,CAAC,kBACxB,eAAe,aAAa,KAAK;AAEnC,QAAM,eAAe,KAAK,QAAQ,KAAK,SAAS,kBAAkB,OAAO;AACzE,QAAM,gBAAgB,KAAK,QAAQ,KAAK,UAAU,kBAAkB,QAAQ;AAC5E,QAAM,kBACJ,KAAK,SACD,OAAO,CAAC,UAAmC,OAAO,UAAU,YAAY,MAAM,KAAA,MAAW,EAAE,EAC5F,IAAI,CAAC,UAAkB,UAAU,KAAK,EAAE,KAAK,CAAA;AAClD,QAAM,iBAAiB,CAAC,GAAI,KAAK,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,IAAI,CAAA,GAAK,GAAG,eAAe;AACzF,QAAM,0BAA0B,OAAO,WAAW,MAAM,GAAG,EAAE,OAAO,OAAO,KAAK,CAAA;AAChF,QAAM,YACJ,OAAO,0BAA0B,QAC7B,aAAa,GAAG,uBAAuB,IACvC,aAAa,UAAU,GAAG,gBAAgB,GAAG,uBAAuB;AAE1E,QAAM,wBAAwB,OAAO,sBAChC,OAAO,OAAO,eAAe,kBAAkB,cAAc,CAAC,IAC7D,OAAO,KAAK,QAAQ,KAAK,SAAS,kBAAkB,OAAO,CAAC,IAC9D,OAAO,OAAO,QAAQ,OAAO,SAAS,kBAAkB,OAAO,CAAC,IAC/D,OAAO,eAAe,kBAAkB,cAAc;AAE3D,QAAM,aAAa;IACjB,GAAG,OAAO,QAAQ,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM;AACxE,YAAM,iBAAiB,QAAQ,CAAC,IAAI;AACpC,aAAO;IACT,GAAG,CAAA,CAAc;IACjB,GAAI,WAAW,UACb,OAAO,SAAS;MACd,CAAC,iBAAiB,QAAQ,CAAC,GAAG,OAAO;IAAA;IAEzC,GAAI,UAAU,UACZ,UAAU,OAAO,IAAI,KAAK;MACxB,CAAC,iBAAiB,OAAO,CAAC,GAAG,OAAO;MACpC,CAAC,iBAAiB,QAAQ,CAAC,GAAG,OAAO;IAAA;IAEzC,GAAI,WAAW,UACb,UAAU,OAAO,KAAK,KAAK;MACzB,CAAC,iBAAiB,OAAO,CAAC,GAAG,OAAO;IAAA;IAExC,GAAI,YAAY,UACd,UAAU,OAAO,MAAM,KAAK;MAC1B,CAAC,iBAAiB,QAAQ,CAAC,GAAG,OAAO;IAAA;IAEzC,CAAC,iBAAiB,cAAc,CAAC,GAAG;IACpC,GAAI,aAAa;MACf,CAAC,iBAAiB,OAAO,CAAC,GAAG;IAAA;IAE/B,CAAC,iBAAiB,SAAS,CAAC,GAAG,OAAO,YAAY,IAAI,aAAa;IACnE,GAAI,OAAO,gBAAgB,QACvB;MACE,CAAC,iBAAiB,aAAa,CAAC,GAAG;IAAA,IAErC,CAAA;IACJ,GAAI,gBAAgB,UAAU,OAAO;EAAA;AAGvC,SAAO;IACL;IACA;IACA,KAAK,KAAK,IAAI,CAAC,UAA0B;AACvC,YAAM,CAAC,MAAM,OAAO,QAAQ,IAAI;AAChC,YAAM,YAAY,OAAO,mBACrB,EAAE,CAAC,iBAAiB,eAAe,CAAC,GAAG,sBAAsB,GAAG,MAAA,IAChE;AAEJ,aAAO,WAAW,CAAC,MAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,SAAS;IAClE,CAAC;EAAA;AAEL;;;AC5EA,SAAS,wBACP,MACA,SAA4B,CAAA,GACZ;AAChB,SAAO,oBAAoB,MAAM;IAC/B,GAAG;IACH,gBAAgB;MACd,GAAG,OAAO;MACV,OAAO;MACP,gBAAgB;MAChB,kBAAkB;MAClB,mBAAmB;MACnB,iBAAiB;IAAA;EACnB,CACD;AACH;;;AClBO,IAAM,cAAc,CAAC,UAAkB;AAC5C,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,OAAO,KAAK,SAAS,UAAU,SAAS,SAAS;AACnE,aAAO;IACT;EACF;AAEA,SAAO;AACT;;;;ACGA,IAAA,gBAAA,cAAA,CAAA,CAAA;AA8BO,IAAA,mBAAA,MAAA,WAAA,aAAA;;;ACZP,IAAA,OAAA;EAAa,CAAA;IAET;IACE;IACA;IACA;IACA;IACA;IACA;IACA,YAAA;IACY;IACZ,WAAA,CAAA;IACY,OAAA;MACL,MAAA;MACC,SAAA,CAAA;MACI,MAAA;IACJ;IACR,GAAA;EACG,GAAA,QAAA;AAIL,UAAA;MAAM,MAAA,cAAA;MACgB,aAAA,qBAAA;MACc,qBAAA,6BAAA;MACgB,kBAAA,0BAAA;MACN,OAAA,eAAA;MACtB,WAAA,eAAA;IACI,IAAA,iBAAA,KAAA,CAAA;AAG5B,UAAA,oBAAA,QAAA,QAAA,KAAA,YAAA,IAAA;AAEA,UAAA,CAAA,MAAA,eAAA,gBAAA,CAAA,CAAA,IAAA,wBAAA,MAAA;MAAgF,OAAA,SAAA;MAC9D,OAAA,SAAA,QAAA;MACQ,QAAA,UAAA,QAAA;MACE,aAAA,eAAA;MACE,qBAAA,uBAAA;MACgB,kBAAA,oBAAA;MACN,WAAA,aAAA,cAAA,SAAA;MACS,aAAA;MAClC,YAAA;IACD,CAAA;AAGd,WAAAC;MAAO;MACL;QACA;QACE,GAAA;MACG;MACL;QACA,GAAA,cAAA,IAAA,CAAA,CAAA,KAAA,KAAA,MAAAA,eAAA,KAAA,KAAA,CAAA;QACkE,GAAA,MAAA,QAAA,QAAA,IAAA,WAAA,CAAA,QAAA;MACd;IACpD;EACF;AAEJ;;;ACjEA,SAAS,iBACP,gBACA,WAA6B,CAAA,GAC7B,UAAoB,CAAA,GACR;AACZ,QAAM,WACJ,OAAO,mBAAmB,WACtB,iBAAiB,gBAAgB,UAAU,OAAO,IAClD;AAEN,QAAM,YAAYC;IAAuC,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QACjFC,eAAc,MAAM;MAClB;MACA,MAAM;MACN;MACA,GAAG;IAAA,CACJ;EAAA;AAGH,MAAI,SAAS,MAAM;AACjB,cAAU,cAAc,aAAa,SAAS,IAAI;EACpD;AAEA,SAAO;AACT;;;AChDO,IAAM,aAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,QAAQ,EAAE,GAAG,iBAAiB,KAAK,SAAA,CAAU;IAC9C,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;EAAA;AAE7C;AAK4C,WAAW;AAavD,IAAM,UAAU,iBAAiB,UAAU;;;ACzBpC,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,mBAAmB,KAAK,SAAA,CAAU,CAAC;AAC1D;AAK4CA,YAAW;AAavD,IAAM,QAAQ,iBAAiBA,WAAU;;;ACtBlC,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,gBAAgB,KAAK,SAAA,CAAU,CAAC;AACvD;AAK4CA,YAAW;AAavD,IAAM,cAAc,iBAAiBA,WAAU;;;ACtBxC,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,MAAM,KAAK,SAAA,CAAU;IACzD,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAA,CAAU;IAClE,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,KAAK,SAAA,CAAU;IAChE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;IAChE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAA,CAAU;EAAA;AAEtE;AAK4CA,YAAW;AAavD,IAAM,YAAY,iBAAiBA,WAAU;;;AC5BtC,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,QAAQ,EAAE,GAAG,+BAA+B,KAAK,SAAA,CAAU;IAC5D;MACE;MACA;QACE,GAAG;QACH,KAAK;MAAA;IACP;IAEF,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;EAAA;AAE5C;AAK4CA,YAAW;AAavD,IAAM,MAAM,iBAAiBA,WAAU;;;AChChC,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ;MACE;MACA;QACE,GAAG;QACH,KAAK;MAAA;IACP;EACF;AAEJ;AAK4CA,YAAW;AAavD,IAAM,gBAAgB,iBAAiBA,WAAU;;;AC9B1C,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,QAAQ,EAAE,GAAG,qDAAqD,KAAK,SAAA,CAAU;IAClF,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;EAAA;AAE7C;AAK4CA,YAAW;AAavD,IAAM,YAAY,iBAAiBA,WAAU;;;ACzBtC,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;IACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;IACzC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;IACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;IACzC,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;IAC1C,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;IAC1C,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;IACzC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;IACxC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;EAAA;AAE5C;AAK4CA,YAAW;AAavD,IAAM,oBAAoB,iBAAiBA,WAAU;;;AChC9C,IAAMC,cAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;IACzC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;IACzC,CAAC,QAAQ,EAAE,GAAG,4CAA4C,KAAK,SAAA,CAAU;IACzE,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;IACxC,CAAC,QAAQ,EAAE,GAAG,0CAA0C,KAAK,SAAA,CAAU;EAAA;EAEzE,SAAS,CAAC,SAAS;AACrB;AAK4CA,YAAW;AAavD,IAAM,QAAQ,iBAAiBA,WAAU;;;AC7BlC,IAAMC,eAA6B;EACxC,MAAM;EACN,MAAM;EACN,MAAM;IACJ,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;IAC3C,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;EAAA;AAE/C;AAK4CA,aAAW;AAavD,IAAM,IAAI,iBAAiBA,YAAU;;;ACd5B;AATT,IAAM,QAAQ;AAAA,EACZ,OAAO;AAAA,EAAG,SAAS;AAAA,EAAa,SAAS;AAAA,EACzC,SAAS;AAAA,EAAmB,KAAK;AAAA,EAAW,MAAM;AAAA,EAClD,OAAO;AAAA,EAAW,OAAO;AAAA,EAAQ,OAAO;AAAA,EAAO,SAAS;AAC1D;AAGO,SAASC,MAAK,EAAE,MAAM,OAAO,GAAG,GAAgD;AACrF,QAAM,YAAY,MAAM,IAAI;AAC5B,SAAO,oBAAC,aAAU,MAAY,aAAa,MAAM,eAAY,QAAO;AACtE;;;AvB8BI,SAUkB,UAJoB,OAAAC,MANtC;AAvCG,SAAS,aAAa,EAAE,UAAU,OAAO,GAA2C;AACzF,QAAM,CAAC,MAAM,OAAO,IAAI,SAA4B,IAAI;AACxD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,UAAU,OAA0B,IAAI;AAC9C,QAAM,UAAU,OAAyB,IAAI;AAC7C,QAAM,cAAc,OAA0B,IAAI;AAClD,QAAM,KAAK,MAAM;AACjB,YAAU,MAAM;AACd,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,QAAI,CAAC,YAAY,CAAC,OAAQ;AAC1B,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI;AACJ,UAAM,WAAW,WAAW,MAAM,WAAW,MAAM,GAAG,IAAM;AAC5D,mBAAe,KAAK,UAAU,OAAO;AACnC,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,UAAoB,EAAE,QAAQ,WAAW,OAAO,CAAC;AAC9E,YAAI,CAAC,SAAS,GAAI;AAClB,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAI,WAAW,OAAO,QAAS;AAC/B,YAAI,KAAK,WAAW,cAAc,CAAC,QAAS,SAAQ,WAAW,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI;AAC1F,YAAI,KAAK,WAAW,eAAe,OAAO,KAAK,kBAAkB,SAAU,SAAQ,IAAI;AAAA,MACzF,QAAQ;AAAA,MAAmD;AAAA,IAC7D;AACA,SAAK,KAAK;AACV,WAAO,MAAM;AAAE,iBAAW,MAAM;AAAG,mBAAa,KAAK;AAAG,mBAAa,QAAQ;AAAA,IAAG;AAAA,EAClF,GAAG,CAAC,UAAU,MAAM,CAAC;AACrB,YAAU,MAAM;AACd,QAAI,MAAM;AAAE,gBAAU,KAAK;AAAG,OAAC,QAAQ,WAAW,YAAY,UAAU,MAAM;AAAA,IAAG;AAAA,EACnF,GAAG,CAAC,IAAI,CAAC;AACT,WAAS,QAAQ;AAAE,YAAQ,KAAK;AAAG,YAAQ,SAAS,MAAM;AAAA,EAAG;AAC7D,iBAAe,OAAO;AACpB,QAAI,CAAC,MAAM,QAAS;AACpB,QAAI;AAAE,YAAM,UAAU,UAAU,UAAU,KAAK,QAAQ,OAAO;AAAG,gBAAU,IAAI;AAAA,IAAG,QAC5E;AAAE,cAAQ,SAAS,MAAM;AAAG,cAAQ,SAAS,OAAO;AAAA,IAAG;AAAA,EAC/D;AACA,MAAI,CAAC,UAAU,CAAC,KAAM,QAAO;AAC7B,SAAO,qBAAC,SAAI,WAAU,kBACpB;AAAA;AAAA,MAAC;AAAA;AAAA,QAAO,KAAK;AAAA,QAAS,MAAK;AAAA,QAAS,WAAU;AAAA,QAC5C,iBAAe;AAAA,QAAM,iBAAe;AAAA,QAAI,SAAS,MAAM,QAAQ,WAAS,CAAC,KAAK;AAAA,QAAG;AAAA;AAAA,UACzE,KAAK;AAAA;AAAA;AAAA,IACf;AAAA,IACC,QAAQ;AAAA,MAAC;AAAA;AAAA,QAAI;AAAA,QAAQ,MAAK;AAAA,QAAS,cAAW;AAAA,QAAiB,WAAU;AAAA,QACxE,WAAW,WAAS;AAAE,cAAI,MAAM,QAAQ,UAAU;AAAE,kBAAM,eAAe;AAAG,kBAAM,gBAAgB;AAAG,kBAAM;AAAA,UAAG;AAAA,QAAE;AAAA,QAChH;AAAA,+BAAC,SAAI,WAAU,sBAAqB;AAAA,4BAAAA,KAAC,YAAO,8BAAgB;AAAA,YAC1D,gBAAAA,KAAC,YAAO,KAAK,aAAa,MAAK,UAAS,WAAU,gBAAe,cAAW,6BAA4B,OAAM,6BAA4B,SAAS,OAAO,0BAAAA,KAACC,OAAA,EAAK,MAAK,SAAQ,GAAE;AAAA,aACjL;AAAA,UACA,qBAAC,OAAG;AAAA,iBAAK;AAAA,YAAe;AAAA,YAAI,KAAK;AAAA,aAAc;AAAA,UAC9C,KAAK,UAAU,iCACd;AAAA,iCAAC,OAAE;AAAA;AAAA,cAAO,gBAAAD,KAAC,UAAK,WAAU,uBAAsB,eAAe,mBAAoB,eAAK,QAAQ,KAAI;AAAA,eAAO;AAAA,YAC3G,gBAAAA,KAAC,WAAM,KAAK,SAAS,cAAW,mBAAkB,UAAQ,MAAC,OAAO,KAAK,QAAQ,SAAS,SAAS,WAAS,MAAM,cAAc,OAAO,GAAG;AAAA,YACxI,qBAAC,SAAI,WAAU,0BAAyB;AAAA,8BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,qBAAoB,SAAS,MAAM,KAAK,KAAK,GAAI,mBAAS,WAAW,gBAAe;AAAA,cAAS,gBAAAA,KAAC,UAAK,MAAK,UAAU,mBAAS,oCAAoC,IAAG;AAAA,eAAO;AAAA,YACjP,gBAAAA,KAAC,OAAE,qDAAuC;AAAA,aAC5C,IAAM,gBAAAA,KAAC,OAAG,eAAK,WAAW,2EAA0E;AAAA;AAAA;AAAA,IACtG;AAAA,KACF;AACF;AAEO,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AwB1DjC,IAAM,SAAS;AACR,IAAM,YAAY;AAAA,EACvB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBA0BI,OAAO,OAAO;AAAA,gBAClB,OAAO,IAAI,oBAAoB,OAAO,KAAK,mBAAmB,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2GvF,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuDf,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyEnB,iBAAiB;AAAA;AAUZ,SAAS,kBAAkB,QAAqC;AACrE,QAAM,SAAS,kBAAkB,WAAW,OAAO,OAAO;AAC1D,MAAI,CAAC,UAAU,OAAO,cAAc,IAAI,MAAM,GAAG,EAAG;AACpD,QAAM,SAAS,kBAAkB,WAAW,SAAS,OAAO,eACzD,cAAc,OAAO;AACxB,QAAM,aAAa,QAAQ,EAAE;AAC7B,QAAM,cAAc;AAGpB,MAAI,kBAAkB,SAAU,QAAO,YAAY,KAAK;AAAA,MACnD,QAAO,aAAa,OAAO,OAAO,UAAU;AACnD;;;ACnSA,SAAS,aAAAE,YAAW,mBAAAC,kBAAiB,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACDtE,SAAS,iBAAiB,UAAAC,eAA8B;AAKxD,SAAS,eAAe,WAAkC;AACxD,aAAW,QAAQ,UAAU,OAAO,EAAG,MAAK,WAAW,OAAO;AAC9D,YAAU,MAAM;AAClB;AAGO,SAAS,gBAAgB,KAAoC,UAAmB,SAAS,MAAM;AACpG,QAAM,WAAWC,QAAO,oBAAI,IAAsB,CAAC;AAEnD,kBAAgB,MAAM;AACpB,UAAM,YAAY,IAAI;AACtB,UAAM,QAAQ,MAAM,eAAe,SAAS,OAAO;AACnD,QAAI,CAAC,aAAa,CAAC,QAAQ;AAAE,YAAM;AAAG;AAAA,IAAQ;AAC9C,UAAM,WAAW,UAAU,iBAA8B,mBAAmB;AAC5E,QAAI,SAAS,SAAS,oBAAoB;AAAE,YAAM;AAAG;AAAA,IAAQ;AAC7D,UAAM,UAAU,UAAU,QAAQ,uBAAuB,KACtD,OAAO,eAAe,cAAc,WAAW,kCAAkC,EAAE;AACtF,QAAI,SAAS;AAAE,YAAM;AAAG;AAAA,IAAQ;AAChC,UAAM,eAAe,MAAM,KAAK,UAAU,aAAW;AACnD,YAAM,MAAM,QAAQ,QAAQ,aAAa;AACzC,YAAM,MAAM,SAAS,QAAQ,IAAI,GAAG;AACpC,YAAM,YAAY,KAAK,YAAY,iBAAiB,OAAO,EAAE,YAAY;AACzE,YAAM,SAAS,cAAc,UAAU,OAAO,cAAc,cAAc,IAAI,UAAU,SAAS,EAAE,MAAM;AACzG,aAAO,EAAE,SAAS,KAAK,KAAK,KAAK,QAAQ,WAAW,OAAO;AAAA,IAC7D,CAAC;AACD,UAAM,OAAO,oBAAI,IAAsB;AACvC,eAAW,EAAE,SAAS,KAAK,KAAK,KAAK,OAAO,KAAK,cAAc;AAC7D,WAAK,WAAW,OAAO;AACvB,UAAI;AACJ,YAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,MAAM;AAC7C,UAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,YAAI,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK;AAChC,sBAAY,QAAQ;AAAA,YAClB,CAAC,EAAE,WAAW,cAAc,KAAK,MAAM,GAAG,EAAE,WAAW,gBAAgB,CAAC;AAAA,YACxE,EAAE,UAAU,OAAO,QAAQ,QAAQ,OAAO,QAAQ;AAAA,UACpD;AAAA,QACF,WAAW,CAAC,KAAK;AACf,sBAAY,QAAQ;AAAA,YAClB,CAAC,EAAE,SAAS,GAAG,WAAW,kBAAkB,GAAG,EAAE,SAAS,GAAG,WAAW,gBAAgB,CAAC;AAAA,YACzF,EAAE,UAAU,OAAO,MAAM,QAAQ,OAAO,QAAQ;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AACA,WAAK,IAAI,KAAK,EAAE,KAAK,UAAU,CAAC;AAAA,IAClC;AACA,eAAW,CAAC,KAAK,IAAI,KAAK,SAAS,QAAS,KAAI,CAAC,KAAK,IAAI,GAAG,EAAG,MAAK,WAAW,OAAO;AACvF,aAAS,UAAU;AAAA,EACrB,GAAG,CAAC,KAAK,UAAU,MAAM,CAAC;AAC1B,kBAAgB,MAAM;AACpB,UAAM,QAAQ,OAAO,eAAe,aAAa,WAAW,kCAAkC,IAAI;AAClG,UAAM,UAAU,MAAM;AAAE,UAAI,OAAO,QAAS,gBAAe,SAAS,OAAO;AAAA,IAAG;AAC9E,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,OAAO;AAC5C,qBAAe,SAAS,OAAO;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AACP;;;ADiIsB,SA8NR,YAAAC,WA9NQ,OAAAC,MACd,QAAAC,aADc;AA9Kf,SAAS,cAAc,QAA8B;AAC1D,QAAM,YAAa,OAAiC;AACpD,MAAI,OAAO,cAAc;AACvB,SAAK,QAAQ,QAAQ,UAAU,KAAK,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC/D;AAEO,SAAS,kBAAkB,QAAoC;AACpE,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,CAAC;AAC1C,EAAAC,WAAU,MAAM,QAAQ,UAAU,MAAM,YAAY,OAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1E,SAAO;AACT;AAEA,IAAM,qBAAsC,CAAC;AAEtC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,YAAY;AAAA,EACZ,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GASG;AACD,QAAM,WAAW,kBAAkB,MAAM;AACzC,EAAAA,WAAU,MAAM;AACd,QAAI,OAAQ,eAAc,MAAM;AAAA,EAClC,GAAG,CAAC,QAAQ,MAAM,CAAC;AAInB,QAAM,EAAE,YAAY,OAAO,YAAY,IAAIC,SAAQ,MAAM;AACvD,UAAMC,cAAa,OAAO,cAAc;AACxC,WAAO;AAAA,MACL,YAAAA;AAAA,MACA,OAAO,YAAY,OAAO,QAAQ,GAAGA,WAAU;AAAA,MAC/C,aAAa,OAAO,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,QAAM,CAAC,QAAQ,SAAS,IAAIH,UAAwB,IAAI;AACxD,QAAM,OAAO,MAAM,KAAK,UAAQ,KAAK,OAAO,MAAM,KAAK;AACvD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,UAAUI,QAAuB,IAAI;AAC3C,QAAM,UAAUA,QAAuB,IAAI;AAC3C,kBAAgB,SAAS,OAAO,MAAM;AACtC,QAAM,UAAUA,QAAiC,IAAI;AACrD,QAAM,QAAQ,CAAC,SAAsB,WAAW,KAAK,EAAE,KAAK,YAAY,IAAI;AAC5E,QAAM,cACJ,MAAM,SAAS,UACX,KAAK,SAAS,IAAI,CAAC,OAAO;AAAA,IACxB,GAAG;AAAA,IACH,WAAW,EAAE,MAAM,YAAY,MAAM,KAAK,aAAa,YAAY;AAAA,EACrE,EAAE,IACF,QAAQ,KAAK,SAAS,UACpB,KAAK,QAAQ,IAAI,CAAC,OAAO;AAAA,IACvB,GAAG;AAAA,IACH,WAAW,EAAE,OAAO,KAAK;AAAA,EAC3B,EAAE,IACF,CAAC;AACT,QAAM,YAAY,MAAM;AACtB,gBAAY,KAAK;AACjB,aAAS,EAAE;AACX,0BAAsB,MAAM;AAC1B,UAAI,QAAQ,SAAS,YAAa,SAAQ,QAAQ,MAAM;AAAA;AAEtD,gBAAQ,SAAS,eACb,cAAiC,QAAQ,GACzC,MAAM;AAAA,IACd,CAAC;AAAA,EACH;AAEA,EAAAH,WAAU,MAAM;AACd,QAAI,CAAC,KAAM,aAAY,KAAK;AAAA,EAC9B,GAAG,CAAC,IAAI,CAAC;AAKT,EAAAI,iBAAgB,MAAM;AACpB,UAAM,OAAO,QAAQ,SAAS;AAC9B,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,QAAQ,cAA2B,sBAAsB;AACxE,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,MAAM;AAClB,WAAK,MAAM,eAAe,iBAAiB;AAC3C,WAAK,MAAM,eAAe,gBAAgB;AAAA,IAC5C;AACA,QAAI,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ;AAAE,YAAM;AAAG;AAAA,IAAQ;AACxD,UAAM,QAAQ,MAAM;AAClB,YAAM,UAAU,OAAO,eAAe,OAAO,eAAe,OAAO;AACnE,WAAK,MAAM,YAAY,mBAAmB,GAAG,UAAU,EAAE,IAAI;AAC7D,YAAM,UAAU,QAAQ,SAAS,cAAc,QAAQ,QAAQ,sBAAsB,EAAE,MAAM;AAC7F,YAAM,MAAM,UAAU,KAAK,sBAAsB,EAAE,MAAM,UAAU;AACnE,WAAK,MAAM,YAAY,kBAAkB,GAAG,OAAO,SAAS,GAAG,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI;AAAA,IAC5F;AACA,UAAM;AACN,WAAO,iBAAiB,UAAU,KAAK;AACvC,UAAM,WAAW,OAAO,mBAAmB,cAAc,OAAO,IAAI,eAAe,KAAK;AACxF,cAAU,QAAQ,MAAM;AACxB,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,KAAK;AAC1C,gBAAU,WAAW;AACrB,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,YAAY,QAAQ,KAAK,CAAC;AAG9C,EAAAJ,WAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,UAAM,gBAAgB,CAAC,MAAoB;AACzC,YAAM,SAAS,QAAQ;AACvB,UAAI,UAAU,CAAC,EAAE,aAAa,EAAE,SAAS,MAAM,EAAG,WAAU;AAAA,IAC9D;AACA,WAAO,iBAAiB,eAAe,eAAe,IAAI;AAC1D,WAAO,MAAM,OAAO,oBAAoB,eAAe,eAAe,IAAI;AAAA,EAC5E,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAAA,WAAU,MAAM;AACd,QAAI;AACF,cAAQ,SAAS,cAAiC,QAAQ,GAAG,MAAM;AAAA,EACvE,GAAG,CAAC,QAAQ,CAAC;AAEb,WAAS,SAAS,MAAmB,UAAmB;AACtD,UAAM,SACJ,KAAK,SAAS,UACV,UACC,KAAK,SAAS,UAAU,KAAK,WAAW,KAAK,SAAS;AAAA,MACrD,CAAC,MAAM,EAAE,OAAO;AAAA,IAClB;AACN,cAAU;AACV,iBAAa;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,OAAO,MAAM,IAAI;AAAA,MACjB,GAAI,SAAS,EAAE,UAAU,OAAO,IAAI,aAAa,OAAO,MAAM,IAAI,CAAC;AAAA,IACrE,CAAC;AAAA,EACH;AACA,QAAM,YAAY,CAAC,WAA0B,eAAe,KAAK,aAC/D,QAAQ,WAAW,OAAO,UAAU,QAAQ,WAAW,OAAO,UAAU,QAAQ,aAAa,OAAO,QAAQ;AAC9G,iBAAe,OAAO,QAAuB;AAC3C,QAAI,CAAC,QAAQ,QAAQ,CAAC,YAAY,UAAU,MAAM,EAAG;AACrD,YAAQ,IAAI;AACZ,aAAS,EAAE;AACX,QAAI;AACF,YAAM,SAAS,YAAY,KAAK,OAAK,EAAE,OAAO,OAAO,QAAQ;AAC7D,YAAM,SAAS,QAAQ;AAAA,QACrB,QAAQ,KAAK;AAAA,QAAI,OAAO,KAAK;AAAA,QAAO,OAAO,MAAM,IAAI;AAAA,QACrD,GAAI,SAAS,EAAE,UAAU,OAAO,IAAI,aAAa,OAAO,MAAM,IAAI,CAAC;AAAA,MACrE,CAAC;AAED,gBAAU;AAAA,IACZ,SAAS,GAAG;AACV;AAAA,QACE,aAAa,QAAQ,EAAE,UAAU;AAAA,MACnC;AAAA,IACF,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,gBACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,sBACZ;AAAA,mBAAa,gBAAAD,KAAC,QAAI,iBAAO,SAAS,YAAW;AAAA,MAC9C,gBAAAC,MAAC,SAAI,WAAU,wBACZ;AAAA,eAAO,gBAAgB,QAAQ,OAAO,UAAU,KAC/C,gBAAAD,KAAC,gBAAa,QAAgB,SAAkB;AAAA,QAEjD,WACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,OAAM;AAAA,YACN,SAAS;AAAA,YAET,0BAAAA,KAACQ,OAAA,EAAK,MAAK,SAAQ;AAAA;AAAA,QACrB;AAAA,SAEJ;AAAA,OACF;AAAA,IACA,gBAAAP,MAAC,SAAI,WAAU,qBAAoB,KAAK,UAAQ;AAAE,cAAQ,UAAU;AAAM,YAAM,gBAAgB,SAAS,QAAQ;AAAA,IAAG,GACjH;AAAA,qBAAe,gBAAAD,KAAC,OAAE,WAAU,kBAAiB,MAAK,SAAS,uBAAY;AAAA,MACvE,MAAM,WAAW,KAChB,gBAAAA,KAAC,OAAE,WAAU,iBAAgB,sHAAwG;AAAA,MAEtI,MAAM,IAAI,CAAC,SAAS;AACnB,cAAM,aAAa,KAAK,SAAS,WAAW,KAAK,SAAS,WAAW,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,MAAM,YAAU,OAAO,KAAK;AACzI,eACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YAEV,mBAAiB,KAAK;AAAA,YAEtB;AAAA,8BAAAA,MAAC,SAAI,WAAU,qBACb;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,cAAY,GAAG,KAAK,KAAK;AAAA,oBACzB,iBAAc;AAAA,oBACd,iBAAe,YAAY,MAAM,OAAO,KAAK;AAAA,oBAC7C,SAAS,CAAC,MAAM;AACd,8BAAQ,UAAU,EAAE;AACpB,gCAAU,KAAK,EAAE;AACjB,+BAAS,EAAE;AACX,kCAAY,IAAI;AAAA,oBAClB;AAAA,oBAEA;AAAA,sCAAAD,KAAC,UAAK,eAAe,mBAAoB,eAAK,OAAM;AAAA,sBACpD,gBAAAA,KAACQ,OAAA,EAAK,MAAK,WAAU,MAAM,IAAI;AAAA;AAAA;AAAA,gBACjC;AAAA,iBACE,KAAK,SAAS,WAAW,KAAK,SAAS,YACvC,gBAAAR,KAAC,UAAK,WAAU,sBACb,eAAK,SAAS,UACX,iBAAiB,MAAM,MAAM,IAAI,CAAC,IAClC,MAAM,IAAI,EAAE,YAAY,GAC9B;AAAA,iBAEJ;AAAA,cACC,KAAK,SAAS,UACb,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,KAAK;AAAA,kBACjB,kBAAgB,iBAAiB,MAAM,MAAM,IAAI,CAAC;AAAA,kBAClD,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK;AAAA,kBACV,MAAM,KAAK;AAAA,kBACX,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,kBACzB,UAAU,CAAC,MAAM,OAAO,aAAa,KAAK,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,cAC9D,IACE,KAAK,SAAS,UAChB,gBAAAC,MAAC,cAAS,WAAU,oBAAmB,cAAY,KAAK,OACrD;AAAA,qBAAK,SAAS,IAAI,CAAC,OAClB,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAO,GAAG;AAAA,oBACV,cAAY,GAAG;AAAA,oBACf,gBACE,MAAM,IAAI,EAAE,YAAY,MAAM,GAAG,MAAM,YAAY;AAAA,oBAErD,WAAU;AAAA,oBACV,OAAO,EAAE,iBAAiB,GAAG,MAAM;AAAA,oBACnC,SAAS,MAAM,OAAO,aAAa,KAAK,IAAI,GAAG,KAAK;AAAA;AAAA,kBAT/C,GAAG;AAAA,gBAUV,CACD;AAAA,gBACD,gBAAAA,KAAC,WAAM,WAAU,kBAAiB,OAAM,iBACtC,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,cAAY,GAAG,KAAK,KAAK;AAAA,oBACzB,OAAO,MAAM,IAAI;AAAA,oBACjB,UAAU,CAAC,MACT,OAAO,aAAa,KAAK,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,gBAE/C,GACF;AAAA,iBACF,IAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAY,KAAK;AAAA,kBACjB,WACE,aACI,iBACA;AAAA,kBAGL,eAAK,QAAQ,IAAI,CAAC,MACjB,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,cAAY,EAAE;AAAA,sBACd,gBAAc,MAAM,IAAI,MAAM,EAAE;AAAA,sBAChC,WAAW,GAAG,aAAa,kBAAkB,aAAa,GAAG,MAAM,IAAI,MAAM,EAAE,KAAK,oBAAoB,EAAE;AAAA,sBAC1G,SAAS,MAAM,OAAO,aAAa,KAAK,IAAI,EAAE,EAAE;AAAA,sBAE/C;AAAA,sCACC,gBAAAD,KAAC,SAAI,KAAK,EAAE,OAAO,KAAI,IAAG;AAAA,wBAE5B,gBAAAA,KAAC,UAAK,eAAe,mBAAoB,YAAE,OAAM;AAAA;AAAA;AAAA,oBAV5C,EAAE;AAAA,kBAWT,CACD;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,UA3FG,KAAK;AAAA,QA8FZ;AAAA,MAEF,CAAC;AAAA,OACH;AAAA,IACC,QACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK,UAAQ;AAAE,kBAAQ,UAAU;AAAM,gBAAM,gBAAgB,SAAS,CAAC,QAAQ;AAAA,QAAG;AAAA,QAClF,MAAK;AAAA,QACL,cAAY,GAAG,KAAK,KAAK;AAAA,QACzB,eAAa,CAAC;AAAA,QACd,aAAW;AAAA,QACX,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,UAAU;AACtB,cAAE,eAAe;AACjB,cAAE,gBAAgB;AAClB,sBAAU;AAAA,UACZ;AAAA,QACF;AAAA,QAEA;AAAA,0BAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,4BAAAD,KAAC,YAAQ,eAAK,OAAM;AAAA,YACpB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,OAAM;AAAA,gBACN,SAAS;AAAA,gBAET,0BAAAA,KAACQ,OAAA,EAAK,MAAK,SAAQ;AAAA;AAAA,YACrB;AAAA,aACF;AAAA,UACA,gBAAAP,MAAC,SAAI,WAAU,uBACZ;AAAA,0BACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM,SAAS,IAAI;AAAA,gBAE5B;AAAA,kCAAAD,KAACQ,OAAA,EAAK,MAAK,WAAU;AAAA,kBAAE;AAAA;AAAA;AAAA,YAEzB;AAAA,YAED,KAAK,SAAS,WACb,gBAAAR,KAAC,SAAI,WAAU,wBACZ,sBAAY,IAAI,CAAC,WAChB,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,8BAAAA,MAAC,UACE;AAAA,uBAAO;AAAA,gBACP,OAAO,aAAa,gBAAAD,KAAC,WAAM,qBAAO;AAAA,iBACrC;AAAA,cACC,cACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,eAAe,OAAO,KAAK;AAAA,kBACvC,OAAM;AAAA,kBACN,SAAS,MAAM,SAAS,MAAM,OAAO,EAAE;AAAA,kBAEvC,0BAAAA,KAACQ,OAAA,EAAK,MAAK,WAAU;AAAA;AAAA,cACvB;AAAA,cAED,YACC,gBAAAR;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,UAAU,OAAO,KAAK;AAAA,kBAClC,UAAU,OAAO,aAAa,QAAQ,UAAU,EAAE,QAAQ,KAAK,IAAI,QAAQ,iBAAiB,UAAU,OAAO,GAAG,CAAC;AAAA,kBACjH,OACE,OAAO,YACH,mBACA;AAAA,kBAEN,SAAS,MACP,KAAK,OAAO;AAAA,oBACV,QAAQ,KAAK;AAAA,oBACb,QAAQ;AAAA,oBACR,UAAU,OAAO;AAAA,kBACnB,CAAC;AAAA,kBAGH,0BAAAA,KAACQ,OAAA,EAAK,MAAK,SAAQ;AAAA;AAAA,cACrB;AAAA,iBApCqC,OAAO,EAsChD,CACD,GACH;AAAA,YAEF,gBAAAP;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM;AACb,yBAAO,aAAa,KAAK,IAAI,YAAY,IAAI,CAAC;AAC9C,4BAAU;AAAA,gBACZ;AAAA,gBAEA;AAAA,kCAAAD,KAACQ,OAAA,EAAK,MAAK,SAAQ;AAAA,kBAAE;AAAA;AAAA;AAAA,YAEvB;AAAA,YACC,YACC,gBAAAP,MAAAF,WAAA,EACE;AAAA,8BAAAE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU,QAAQ,UAAU,EAAE,QAAQ,KAAK,IAAI,QAAQ,eAAe,CAAC;AAAA,kBACvE,SAAS,MACP,KAAK,OAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,eAAe,CAAC;AAAA,kBAGzD;AAAA,oCAAAD,KAACQ,OAAA,EAAK,MAAK,SAAQ;AAAA,oBAClB,UAAU,EAAE,QAAQ,KAAK,IAAI,QAAQ,eAAe,CAAC,IAAI,+BAA+B;AAAA;AAAA;AAAA,cAC3F;AAAA,cACA,gBAAAP;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU,QAAQ,UAAU,EAAE,QAAQ,KAAK,IAAI,QAAQ,cAAc,CAAC;AAAA,kBACtE,SAAS,MACP,KAAK,OAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,cAAc,CAAC;AAAA,kBAGxD;AAAA,oCAAAD,KAACQ,OAAA,EAAK,MAAK,SAAQ;AAAA,oBAClB,UAAU,EAAE,QAAQ,KAAK,IAAI,QAAQ,cAAc,CAAC,IAAI,0BAA0B;AAAA;AAAA;AAAA,cACrF;AAAA,eACF;AAAA,aAEJ;AAAA,UACC,SACC,gBAAAR,KAAC,SAAI,WAAU,uBACb,0BAAAA,KAAC,OAAE,WAAU,kBAAiB,MAAK,SAAS,iBAAM,GACpD;AAAA;AAAA;AAAA,IAEJ;AAAA,KAEJ;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAS,EAAE;AACrC,QAAM,QAAQI,QAAkD,MAAS;AACzE,EAAAH,WAAU,MAAM,MAAM,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AACrD,iBAAe,OAAO;AACpB,QAAI,UAAU,eAAW;AACzB,aAAS,cAAS;AAClB,UAAM,aAAgC,EAAE,GAAG,OAAO,cAAc,EAAE;AAClE,QAAI;AACF,YAAM,OAAO,eAAe,UAAU;AACtC,eAAS,qBAAqB;AAC9B,gBAAU;AAAA,IACZ,QAAQ;AACN,eAAS,4BAA4B;AAAA,IACvC;AACA,iBAAa,MAAM,OAAO;AAC1B,UAAM,UAAU,WAAW,MAAM,SAAS,EAAE,GAAG,GAAI;AAAA,EACrD;AAGA,QAAM,QAAQ,SAAS,UAAU,iBAAY,QAAQ;AACrD,QAAM,SAASG,QAA0B,IAAI;AAC7C,QAAM,OAAOA,QAAwB,IAAI;AACzC,QAAM,QAAQA,QAAO,CAAC;AAEtB,EAAAC,iBAAgB,MAAM;AACpB,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,KAAM;AACX,SAAK,MAAM,QAAQ;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,MAAM;AACvB,UAAM,UAAU;AAChB,UAAM,UAAU,KAAK,QAAQ,uBAAuB,KACjD,OAAO,eAAe,cAAc,WAAW,kCAAkC,EAAE;AACtF,QAAI,CAAC,YAAY,WAAW,OAAO,KAAK,YAAY,WAAY;AAChE,SAAK,SAAS;AAAA,MACZ,CAAC,EAAE,SAAS,GAAG,WAAW,kBAAkB,GAAG,EAAE,SAAS,GAAG,WAAW,gBAAgB,CAAC;AAAA,MACzF,EAAE,UAAU,OAAO,OAAO,QAAQ,OAAO,QAAQ;AAAA,IACnD;AACA,QAAI,KAAK,IAAI,WAAW,IAAI,IAAI,IAAK;AACrC,SAAK;AAAA,MACH,CAAC,EAAE,OAAO,GAAG,QAAQ,KAAK,GAAG,EAAE,OAAO,GAAG,IAAI,KAAK,CAAC;AAAA,MACnD,EAAE,UAAU,OAAO,QAAQ,QAAQ,OAAO,QAAQ;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AACV,SACE,gBAAAN,MAAC,SAAI,WAAU,oBACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAU,UAAU;AAAA,QACpB,aAAW,UAAU;AAAA,QACrB,SAAS,MAAM,KAAK,KAAK;AAAA,QAEzB,0BAAAA,KAAC,UAAK,WAAU,sBAAqB,KAAK,MAAO,iBAAM;AAAA;AAAA,IACzD;AAAA,IACA,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,MAAK,UAAU,iBAAM;AAAA,KAC5D;AAEJ;;;AE9fA,SAAS,WAAW,OAA6B;AAC/C,QAAM,MAAM,MAAM,MAAM,oBAAoB;AAC5C,MAAI,KAAK;AACP,UAAM,QAAQ,IAAI,CAAC,EAAE,MAAM,SAAS,EAAE,OAAO,OAAO;AACpD,UAAM,SAAS,MAAM;AAAA,MAAI,CAAC,MAAM,MAC9B,OAAO,WAAW,IAAI,KAAK,KAAK,SAAS,GAAG,IAAK,MAAM,IAAI,OAAO,OAAQ;AAAA,IAC5E;AACA,QAAI,OAAO,UAAU,KAAK,OAAO,MAAM,OAAO,QAAQ;AACpD,aAAO,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE;AAAA,EACzE;AACA,MAAI,UAAU,cAAe,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC7D,MAAI,CAAC,SAAS,CAAC,WAAW,KAAK,SAAS,SAAS,KAAK,EAAG,QAAO;AAChE,MAAI;AACF,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,OAAO,SAAS;AAC/B,UAAM,MAAM,OAAO,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;AAChE,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,GAAG,CAAC;AACvB,UAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,aAAa,GAAG,GAAG,GAAG,CAAC,EAAE;AAClD,WAAO,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,MAA4B;AAC3C,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,gBAAgB,UAAU,OAAO,KAAK;AACtD,MAAI,SAAS,QAAQ,gBAAgB,EAAG,QAAO;AAC/C,QAAM,OAAO,KAAK,YAAY;AAC9B,SAAO,gBAAgB,cAAc,QAAQ,KAAK,IAAI;AACxD;AAGA,SAAS,WAAW,SAAsC;AACxD,QAAM,IAAI,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE;AAC5C,QAAM,IAAI,KAAK,IAAI,GAAG,OAAO,cAAc,EAAE;AAC7C,QAAM,WAAW,oBAAI,IAAa;AAClC,QAAM,QAAQ,CAAC,YAAqB;AAClC,QAAI,SAAS,IAAI,OAAO,KAAK,QAAQ,OAAO,EAAG;AAC/C,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ;AACV,eAAS,IAAI,MAAM;AACnB,iBAAW,SAAS,OAAO,oBAAoB,GAAG,CAAC,KAAK,CAAC,GAAG;AAE1D,YAAI,MAAM,YAAY,MAAM,OAAQ,OAAM,KAAK;AAAA,MACjD;AAAA,IACF;AACA,aAAS,IAAI,OAAO;AAAA,EACtB;AACA,aAAW,WAAW,SAAS,oBAAoB,GAAG,CAAC,KAAK,CAAC,GAAG;AAC9D,QAAI,YAAY,SAAS,QAAQ,YAAY,SAAS,gBAAiB,OAAM,OAAO;AAAA,EACtF;AAEA,MAAI,SAAS,KAAM,OAAM,SAAS,IAAI;AACtC,QAAM,SAAS,eAAe;AAC9B,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,SAAS,cAA6B;AACpC,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa,8BAA8B,EAAE,UACxF,SACA;AACN;AAOO,SAAS,YACd,aAA6B,QAC7B,SACe;AACf,MAAI,eAAe,WAAW,eAAe,OAAQ,QAAO;AAC5D,MAAI,eAAe,SAAU,QAAO,YAAY;AAChD,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,MAAI;AACF,QAAI,YAAY;AAChB,QAAI,IAAI,GAAG,IAAI,GAAG,IAAI;AACtB,eAAW,WAAW,WAAW,OAAO,GAAG;AACzC,YAAM,SAAS,WAAW,iBAAiB,OAAO,EAAE,eAAe;AACnE,UAAI,CAAC,UAAU,OAAO,KAAK,EAAG;AAC9B,YAAM,SAAS,OAAO,IAAI;AAC1B,WAAK,OAAO,IAAI;AAChB,WAAK,OAAO,IAAI;AAChB,WAAK,OAAO,IAAI;AAChB,mBAAa,IAAI,OAAO;AACxB,UAAI,YAAY,KAAO;AAAA,IACzB;AACA,UAAM,UAAU,iBAAiB,SAAS,eAAe,EAAE,YAAY,MAAM,KAAK;AAClF,UAAM,aAAa,QAAQ,SAAS,MAAM,MACvC,CAAC,QAAQ,SAAS,OAAO,KAAK,YAAY,MAAM;AACnD,UAAM,SAAS,aAAa,IAAI;AAChC,UAAM,aAAa,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,aAAa;AAChF,WAAO,YAAY,OAAO,UAAU;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,aACd,SACA,aAA6B,QACjB;AACZ,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW;AACf,QAAM,UAAU,oBAAI,IAAgB;AACpC,QAAM,WAAW,eAAe,SAAS,IAAI,iBAAiB,aAAW;AACvE,QAAI,QAAQ,KAAK,YAAU,CAAC,QAAQ,OAAO,MAAM,CAAC,EAAG,UAAS;AAAA,EAChE,CAAC,IAAI;AACL,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AACf,aAAS,WAAW;AACpB,UAAM,UAAU,EAAE,YAAY,MAAM,WAAW,MAAM,eAAe,MAAM,SAAS,KAAK;AACxF,aAAS,QAAQ,SAAS,iBAAiB,OAAO;AAClD,eAAW,UAAU,QAAS,UAAS,QAAQ,QAAQ,OAAO;AAAA,EAChE;AACA,QAAM,SAAS,MAAM;AACnB,YAAQ;AACR,QAAI,SAAU;AACd,YAAQ,MAAM;AACd,UAAM,OAAO,YAAY,YAAY,OAAO;AAC5C,YAAQ;AACR,QAAI,SAAS,SAAS;AACpB,gBAAU;AACV,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AACA,QAAM,WAAW,MAAM;AAAE,cAAU,OAAO,sBAAsB,MAAM;AAAA,EAAG;AACzE,SAAO;AACP,MAAI,eAAe,WAAW,eAAe,OAAQ,QAAO,MAAM;AAAA,EAAC;AAEnE,QAAM,QAAQ,OAAO,aAAa,8BAA8B;AAChE,SAAO,iBAAiB,UAAU,QAAQ;AAC1C,QAAM,YAAY,CAAC,UAAiB;AAClC,QAAI,CAAC,QAAQ,MAAM,kBAAkB,OAAO,MAAM,SAAS,IAAI,EAAG,UAAS;AAAA,EAC7E;AACA,MAAI,eAAe,QAAQ;AACzB,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,aAAS,iBAAiB,UAAU,WAAW,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAE/E,aAAS,iBAAiB,QAAQ,WAAW,IAAI;AACjD,aAAS,iBAAiB,iBAAiB,WAAW,IAAI;AAC1D,aAAS,iBAAiB,gBAAgB,WAAW,IAAI;AAAA,EAC3D;AACA,SAAO,MAAM;AACX,eAAW;AACX,cAAU,WAAW;AACrB,QAAI,UAAU,OAAW,QAAO,qBAAqB,KAAK;AAC1D,WAAO,oBAAoB,UAAU,QAAQ;AAC7C,WAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAS,oBAAoB,UAAU,WAAW,IAAI;AACtD,aAAS,oBAAoB,QAAQ,WAAW,IAAI;AACpD,aAAS,oBAAoB,iBAAiB,WAAW,IAAI;AAC7D,aAAS,oBAAoB,gBAAgB,WAAW,IAAI;AAAA,EAC9D;AACF;;;ACjKwC,SAe7B,YAAAS,WAf6B,OAAAC,MAe7B,QAAAC,aAf6B;AADxC,SAAS,WAAW,EAAE,MAAM,GAAsB;AAChD,SAAO,gBAAAD,KAAC,UAAK,WAAU,gBAAe,0BAAAA,KAAC,UAAK,eAAe,mBAAoB,iBAAM,GAAO;AAC9F;AAGO,SAAS,YAAY,EAAE,MAAM,KAAK,GAA2C;AAClF,MAAI,CAAC,KAAK,SAAS,WAAW,gBAAgB,GAAG;AAC/C,UAAM,WAAW,KAAK,aAAa,KAAK,UAAU,CAAC,KAAK,OAAO,IAAI,CAAC;AACpE,UAAM,aAAa;AAAA,MACjB,GAAI,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,MACrD,GAAI,KAAK,UAAU,CAAC;AAAA,QAClB,KAAK,WAAW,KAAK,QAAQ,MAAM;AAAA,QACnC,OAAO,GAAG,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,cAAc,MAAM,KAAK,QAAQ,WAAW,KAAK,EAAE;AAAA,MACjG,CAAC,IAAI,CAAC;AAAA,MACN,GAAG,SAAS,IAAI,cAAY,EAAE,KAAK,QAAQ,UAAU,OAAO,QAAQ,QAAQ,QAAQ,IAAI,EAAE;AAAA,IAC5F;AACA,WAAO,gBAAAC,MAAAF,WAAA,EACL;AAAA,sBAAAC,KAAC,OAAG,eAAK,UAAS;AAAA,MACjB,WAAW,SAAS,KAAK,gBAAAA,KAAC,UAAK,WAAU,gBACvC,qBAAW,IAAI,eAAa,gBAAAA,KAAC,cAA+B,OAAO,UAAU,SAAhC,UAAU,GAA6B,CAAE,GACzF;AAAA,OACF;AAAA,EACF;AACA,QAAM,UAAU,KAAK,WAAW,OAAO,KAAK,YAAY,WAAW,KAAK,UAAqC,CAAC;AAC9G,QAAM,aAAa,QAAQ;AAC3B,QAAM,OAA0C,CAAC;AACjD,QAAM,SAAS,CAAC,WAAoB;AAClC,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG;AACpE,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,UAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,MAAK,KAAK,EAAE,MAAM,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,IACtG;AAAA,EACF;AACA,SAAO,UAAU;AACjB,MAAI,CAAC,KAAK,QAAQ;AAEhB,WAAO,QAAQ,QAAQ;AACvB,QAAI,OAAO,QAAQ,aAAa,SAAU,YAAW,SAAS,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAG,MAAK,KAAK,EAAE,MAAM,WAAW,MAAM,CAAC;AAClK,QAAI,OAAO,QAAQ,UAAU,SAAU,YAAW,QAAQ,QAAQ,MAAM,MAAM,GAAG,GAAG;AAClF,YAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,UAAI,KAAK,EAAG,MAAK,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,OAAO,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAC5F;AAAA,EACF;AAEA,SAAO,gBAAAC,MAAAF,WAAA,EACL;AAAA,oBAAAC,KAAC,OAAG,eAAK,UAAS;AAAA,KAChB,QAAQ,KAAK,SAAS,MAAM,gBAAAC,MAAC,UAAK,WAAU,gBAC3C;AAAA,cAAQ,gBAAAD,KAAC,cAAW,OAAO,MAAM;AAAA,MACjC,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,SAAO,gBAAAA,KAAC,cAA4C,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,MAA3D,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,EAAuC,CAAE;AAAA,MAC9G,KAAK,SAAS,KAAK,gBAAAC,MAAC,UAAK,WAAU,wBAAuB;AAAA;AAAA,QAAE,KAAK,SAAS;AAAA,SAAE;AAAA,OAC/E;AAAA,KACF;AACF;;;ACvDA,SAAS,mBAAAC,wBAAuC;AAMzC,SAAS,cAAc,KAAoC,SAAkB;AAClF,EAAAC,iBAAgB,MAAM;AACpB,UAAM,OAAO,IAAI;AACjB,QAAI,CAAC,QAAQ,CAAC,QAAS;AACvB,UAAM,WAAW,oBAAI,IAA2B;AAChD,UAAM,QAAQ,oBAAI,IAA+D;AACjF,UAAM,UAAU,OAAO,eAAe,aAAa,WAAW,kCAAkC,IAAI;AACpG,UAAM,aAAa,CAAC,YAAyB;AAC3C,YAAM,OAAO,MAAM,IAAI,OAAO;AAC9B,UAAI,CAAC,KAAM;AACX,WAAK,UAAU,OAAO;AACtB,WAAK,MAAM,OAAO;AAClB,YAAM,OAAO,OAAO;AAAA,IACtB;AACA,UAAM,UAAU,MAAM;AACpB,YAAM,UAAU,KAAK,QAAQ,YAAY,UAAU,SAAS;AAE5D,YAAM,SAAS,MAAM,KAAK,KAAK,iBAA8B,mCAAmC,GAAG,aAAW;AAC5G,cAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,cAAM,YAAY,OAAO,iBAAiB,OAAO,EAAE,YAAY;AAC/D,cAAM,SAAS,cAAc,UAAU,OAAO,cAAc,cAAc,IAAI,UAAU,SAAS,IAAI;AACrG,eAAO,EAAE,SAAS,MAAM,MAAM,OAAO,QAAQ,sBAAsB,IAAI,MAAM,IAAI,QAAQ,OAAO,GAAG,IAAI,QAAQ,OAAO,EAAE;AAAA,MAC1H,CAAC;AACD,YAAM,UAAU,IAAI,IAAI,OAAO,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO,CAAC;AAC5D,iBAAW,CAAC,SAAS,IAAI,KAAK,UAAU;AACtC,YAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,aAAK,WAAW,OAAO;AACvB,iBAAS,OAAO,OAAO;AACvB,mBAAW,OAAO;AAAA,MACpB;AACA,iBAAW,EAAE,SAAS,MAAM,MAAM,IAAI,GAAG,KAAK,QAAQ;AACpD,cAAM,MAAM,SAAS,IAAI,OAAO;AAChC,YAAI,CAAC,QAAQ,CAAC,MAAM;AAClB,cAAI,CAAC,IAAK;AACV,cAAI,WAAW,OAAO;AACtB,qBAAW,OAAO;AAClB,cAAI,CAAC,WAAW,OAAO,QAAQ,YAAY,cAAc,QAAQ,iBAAiB,mBAAmB,EAAE,UAAU,oBAAoB;AACnI,kBAAM,QAAQ,QAAQ,UAAU,IAAI;AACpC,kBAAM,UAAU,IAAI,cAAc;AAClC,kBAAM,QAAQ,OAAO;AACrB,kBAAM,QAAQ;AACd,kBAAM,aAAa,eAAe,MAAM;AACxC,kBAAM,gBAAgB,IAAI;AAC1B,uBAAW,QAAQ,MAAM,iBAAiB,MAAM,EAAG,MAAK,gBAAgB,IAAI;AAC5E,mBAAO,OAAO,MAAM,OAAO,EAAE,UAAU,SAAS,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI,MAAM,MAAM,eAAe,OAAO,CAAC;AAClK,iBAAK,YAAY,KAAK;AACtB,kBAAMC,aAAY,MAAM;AAAA,cACtB,CAAC,EAAE,SAAS,GAAG,WAAW,gBAAgB,GAAG,EAAE,SAAS,GAAG,WAAW,kBAAkB,CAAC;AAAA,cACzF,EAAE,UAAU,OAAO,MAAM,QAAQ,OAAO,SAAS,MAAM,WAAW;AAAA,YACpE;AACA,kBAAM,IAAI,SAAS,EAAE,OAAO,WAAAA,WAAU,CAAC;AACvC,YAAAA,WAAU,WAAW,MAAM,WAAW,OAAO;AAAA,UAC/C;AACA,mBAAS,OAAO,OAAO;AACvB;AAAA,QACF;AACA,mBAAW,OAAO;AAClB,cAAM,IAAI,KAAK,IAAI;AACnB,cAAM,IAAI,KAAK,IAAI;AACnB,YAAI,OAAO,IAAI,MAAM,KAAK,IAAI,MAAM,GAAG;AACrC,cAAI,QAAQ,KAAK;AACjB,cAAI,SAAS,KAAK;AAClB,cAAI,QAAS,KAAI,WAAW,OAAO;AACnC;AAAA,QACF;AACA,aAAK,WAAW,OAAO;AACvB,cAAM,YAAY,CAAC,WAAW,OAAO,QAAQ,YAAY,aAAa,QAAQ;AAAA,UAC5E,CAAC,EAAE,WAAW,aAAa,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,SAAS,MAAM,IAAI,EAAE,GAAG,EAAE,WAAW,mBAAmB,SAAS,EAAE,CAAC;AAAA,UAC7J,EAAE,UAAU,OAAO,OAAO,QAAQ,OAAO,QAAQ;AAAA,QACnD,IAAI;AACJ,iBAAS,IAAI,SAAS,EAAE,GAAG,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,UAAU,CAAC;AAAA,MACnF;AACA,UAAI,QAAS,YAAW,WAAW,MAAM,KAAK,EAAG,YAAW,OAAO;AAAA,IACrE;AACA,YAAQ;AACR,UAAM,WAAW,OAAO,mBAAmB,cAAc,IAAI,eAAe,OAAO,IAAI;AACvF,cAAU,QAAQ,IAAI;AACtB,UAAM,YAAY,IAAI,iBAAiB,aAAW;AAChD,YAAM,UAAU,QAAQ,KAAK,YAAU;AACrC,YAAI,OAAO,SAAS,aAAc,QAAO,OAAO,WAAW,QACxD,OAAO,kBAAkB,WAAW,OAAO,OAAO,QAAQ,mCAAmC;AAChG,eAAO,CAAC,GAAG,OAAO,YAAY,GAAG,OAAO,YAAY,EAAE,KAAK,UACzD,gBAAgB,WAAW,KAAK,QAAQ,mCAAmC,CAAC;AAAA,MAChF,CAAC;AACD,UAAI,QAAS,SAAQ;AAAA,IACvB,CAAC;AACD,cAAU,QAAQ,MAAM,EAAE,SAAS,MAAM,WAAW,MAAM,YAAY,MAAM,iBAAiB,CAAC,aAAa,cAAc,EAAE,CAAC;AAC5H,aAAS,iBAAiB,UAAU,OAAO;AAC3C,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,MAAM;AACX,gBAAU,WAAW;AACrB,gBAAU,WAAW;AACrB,eAAS,oBAAoB,UAAU,OAAO;AAC9C,aAAO,oBAAoB,UAAU,OAAO;AAC5C,iBAAW,WAAW,MAAM,KAAK,EAAG,YAAW,OAAO;AACtD,iBAAW,QAAQ,SAAS,OAAO,EAAG,MAAK,WAAW,OAAO;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,KAAK,OAAO,CAAC;AACnB;;;AlC6zBQ,SASE,OAAAC,MATF,QAAAC,aAAA;AA92BR,IAAM,WAAW;AAejB,IAAM,YAAY;AAClB,IAAM,eAAe;AAOrB,SAAS,UAAU,QAAgB;AACjC,SAAO,CAAC,SAA6B;AACnC,QAAI,CAAC,QAAQ,OAAO,KAAK,YAAY,WAAY;AACjD,QAAI,KAAK,QAAQ,uBAAuB,KACrC,OAAO,eAAe,cAAc,WAAW,kCAAkC,EAAE,QAAU;AAChG,UAAM,OAAO;AACb,UAAM,QAAQ,KAAK,QAAQ;AAAA,MACzB,EAAE,WAAW,WAAW,IAAI,IAAI,QAAQ,EAAE;AAAA,MAC1C,EAAE,WAAW,SAAS,MAAM,kBAAkB,QAAQ,IAAI;AAAA,MAC1D,EAAE,WAAW,SAAS,MAAM,kBAAkB,QAAQ,EAAE;AAAA,IAC1D,GAAG,EAAE,UAAU,UAAU,YAAY,UAAU,QAAQ,WAAW,CAAC;AACnE,UAAM,YAAY;AAAA,EACpB;AACF;AAEA,SAAS,YAAY,MAAe;AAClC,SAAO,QAAQ,KAAK,QAAQ,uBAAuB,CAAC,KACjD,OAAO,eAAe,cAAc,WAAW,kCAAkC,EAAE;AACxF;AAOA,SAAS,OAAO,MAA0B;AACxC,MAAI,CAAC,QAAQ,OAAO,KAAK,YAAY,cAAc,KAAK,QAAQ,UAAU,UAAU,YAAY,IAAI,EAAG;AACvG,OAAK,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,QAAQ,WAAW,CAAC;AACtF;AAEA,SAAS,cAAc,MAA0B;AAC/C,MAAI,CAAC,QAAQ,YAAY,IAAI,EAAG;AAChC,aAAW,SAAS,KAAK;AACvB,QAAI,OAAO,MAAM,YAAY;AAC3B,YAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,QAAQ,WAAW,CAAC;AAC3F;AACA,IAAM,WAAW,UAAU,CAAC;AAC5B,IAAM,YAAY,UAAU,CAAC;AAG7B,IAAM,UAAU;AAEhB,IAAM,cAAc;AAGpB,SAAS,UAAU,GAAoB,GAA6B;AAClE,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,QAAM,OAAO,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACrD,SAAO,EAAE,MAAM,CAAC,SAAS;AACvB,UAAM,MAAM,KAAK,IAAI,KAAK,EAAE;AAC5B,WAAO,QAAQ,UAAa,KAAK,UAAU,GAAG,MAAM,KAAK,UAAU,IAAI;AAAA,EACzE,CAAC;AACH;AAGA,IAAM,mBAAmB,KAAK,KAAK;AAEnC,IAAM,mBAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,OAAO,kBAAkB;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,WAAW;AACb,GAAwB;AACtB,QAAM,CAAC,KAAK,IAAIC,UAAS,MAAM,qBAAqB,QAAQ,CAAC;AAC7D,QAAM,QAAQ,SAAS,OAAO;AAC9B,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAG5C,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA6B,CAAC,CAAC;AAC7D,QAAM,aAAaC,QAAO,OAAO;AACjC,aAAW,UAAU;AAErB,QAAM,CAAC,QAAQ,SAAS,IAAID,UAAwB,IAAI;AACxD,QAAM,YAAYC,QAAO,MAAM;AAC/B,YAAU,UAAU;AACpB,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAWA,QAAuB,IAAI;AAE5C,QAAM,aAAaA,QAAO,CAAC;AAE3B,QAAM,YAAYA,QAA6C,IAAI;AACnE,QAAM,YAAYA,QAA8B,IAAI;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAID;AAAA,IACxC;AAAA,EACF;AACA,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAsB,IAAI;AAC5D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA0C,CAAC,CAAC;AACtE,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA0B,CAAC,CAAC;AAEtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA0B,IAAI;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAM,IAAI,GAAM;AACjF,QAAM,UAAUC,QAAsB,IAAI;AAC1C,QAAM,eAAeA,QAAO,CAAC;AAC7B,QAAM,gBAAgBA,QAAO,CAAC;AAC9B,QAAM,cAAcA,QAAO,CAAC;AAC5B,QAAM,CAAC,SAAS,UAAU,IAAID,UAA+B,IAAI;AACjE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,EAAE;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,MAAM,YAAY,eAAe,CAAC;AACrE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,cAAcA,QAA4B,IAAI;AACpD,QAAM,aAAaA,QAAO,CAAC;AAC3B,EAAAC,WAAU,MAAM,MAAM,qBAAqB,WAAW,OAAO,GAAG,CAAC,CAAC;AAClE,QAAM,UAAUD,QAAyB,IAAI;AAC7C,kBAAgB,SAAS,OAAO,SAAS;AACzC,QAAM,SAASA,QAA0B,IAAI;AAC7C,QAAM,gBAAgBA,QAA2B,IAAI;AACrD,QAAM,gBAAgBA,QAAO,EAAE;AAC/B,QAAM,iBAAiBA,QAAO,KAAK;AACnC,QAAM,KAAKE,OAAM;AACjB,QAAM,iBAAiB,QAAQ,SAAS,QAAQ;AAChD,oBAAkB,QAAQ;AAC1B,QAAM,oBAAoB;AAAA,IACxB,YACE,YAAY,SAAS,QAAQ,GAAG,SAAS,cAAc,CAAC,EAAE;AAAA,EAC9D;AACA,QAAM,UACJ,eAAe,OAAO,IAAI,MACzB,kBAAkB,qBAAqB;AAC1C,QAAM,aAAa,QAAQ,WAAW,iBAAiB,QAAQ,UAAU,MAAM;AAI/E,EAAAC,iBAAgB,MAAM;AACpB,UAAM,QAAQ,YAAY;AAC1B,QAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAS;AACtC,UAAM,SAAS,MAAM;AACnB,YAAM,MAAM,SAAS;AACrB,YAAM,MAAM,SAAS,GAAG,OAAO,KAAK,IAAI,IAAI,MAAM,YAAY,IAAI,EAAE;AACpE,YAAM,QAAQ,WAAW,OAAO,MAAM,YAAY,CAAC;AAAA,IACrD;AACA,WAAO;AACP,QAAI,OAAO,mBAAmB,YAAa;AAC3C,QAAI,QAAQ,MAAM;AAClB,UAAM,WAAW,IAAI,eAAe,MAAM;AACxC,UAAI,MAAM,gBAAgB,OAAO;AAAE,gBAAQ,MAAM;AAAa,eAAO;AAAA,MAAG;AAAA,IAC1E,CAAC;AACD,aAAS,QAAQ,KAAK;AACtB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,MAAM,WAAW,SAAS,YAAY,QAAQ,CAAC;AACnD,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,iBAAW,KAAK;AAChB,iBAAW,KAAK;AAChB,kBAAY,KAAK;AACjB;AAAA,IACF;AACA,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AAEX,UAAM,QAAQ,CAAC,UAAwB;AACrC,WAAK,MAAM,gBAAgB,WAAW,MAAM,gBAAgB,UAAU,MAAM,YAAY,GAAG;AACzF,aAAK,aAAa,gBAAgB,OAAO;AACzC,mBAAW,KAAK;AAChB,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM;AAAE,iBAAW,KAAK;AAAG,kBAAY,KAAK;AAAA,IAAG;AAC7D,SAAK,iBAAiB,gBAAgB,KAAK;AAC3C,SAAK,iBAAiB,gBAAgB,KAAK;AAC3C,WAAO,MAAM;AACX,WAAK,oBAAoB,gBAAgB,KAAK;AAC9C,WAAK,oBAAoB,gBAAgB,KAAK;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AACZ,gBAAc,SAAS,OAAO;AAC9B,QAAM,OAAO,aAAa;AAC1B,QAAM,WAAW,YAAY,WAAY,WAAW,WAAY,QAAQ;AACxE,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,YAAY,CAAC,QAAS;AAC3B,UAAM,SAAU,QAAQ,SAAS,YAAY,GAA6B;AAC1E,QAAI,WAAW,OAAO,QAAS,SAAQ,SAAS,cAAiC,sBAAsB,GAAG,MAAM;AAAA,EAClH,GAAG,CAAC,UAAU,OAAO,CAAC;AACtB,QAAM,WAAW,GAAG,KAAK,YAAY,KAAK;AAC1C,QAAM,YAAYG,SAAQ,MAAM,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC;AAGrE,QAAM,QAAQA,SAAQ,MAAM;AAC1B,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,KAAK,UAAW,QAAO,IAAI,EAAE,QAAQ,OAAO,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAC7E,UAAM,SAAS,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,KAAK,EAAE,KAAK;AAClE,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B,GAAG,CAAC,WAAW,KAAK,CAAC;AACrB,QAAM,gBAAgBA,SAAQ,MAAM;AAClC,UAAM,UAAU,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,MAAM,SAAS,MAAM,OAAO,IAAI,CAAC,CAAC;AAClF,WAAO,IAAI,IAAI,OAAO,SAAS,SAAS,CAAC,KAAK,CAAC;AAAA,EACjD,GAAG,CAAC,OAAO,OAAO,KAAK,CAAC;AACxB,QAAM,eAAeA,SAAQ,MAAM,UAChC,OAAO,CAAC,MAAM,cAAc,IAAI,EAAE,KAAK,CAAC,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,WAAW,aAAa,CAAC;AAErF,QAAM,UAAUA,SAAQ,MAAM,IAAI,IAAI,aACnC,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,KAAK,MAAM,EAAE,SAAS,IAAI,gBAAgB,EAC/E,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC;AAC3C,WAAS,WAAW,MAAc;AAChC,UAAM,OAAO,IAAI,IAAI,aAAa;AAClC,QAAI,KAAK,IAAI,IAAI,EAAG,MAAK,OAAO,IAAI;AAAA,QAAQ,MAAK,IAAI,IAAI;AACzD,aAAS,KAAK,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAAA,EAC1C;AACA,QAAM,iBAAiBA,SAAQ,MAAM,MAAM,QAAQ,OACjD,CAAC,EAAE,QAAQ,EAAE,UAAU,SAAS,EAAE,gBAAgB,CAAC,EAAE,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC;AAC3F,QAAM,gBAAgB,WAClB;AAAA,IACE,SAAS,MAAM,gBAAW;AAAA,IAC1B,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,QAAQ,UAAU;AAAA,IAC3B,SAAS,SAAS,WAAW,MAAM,SAAS,KAAK,QAAQ,QAAQ,EAAE;AAAA,EACrE,EACG,OAAO,OAAO,EACd,KAAK,GAAG,IACX;AAEJ,WAAS,YAAY;AACnB,QAAI,CAAC,eAAgB;AACrB,UAAM,UAAU,EAAE,YAAY;AAC9B,UAAM,WAAW,aAAa;AAC9B,SAAK,MACF,UAAU,IAAI,EACd,KAAK,CAAC,YAAY,EAAE,KAAK,OAAO,KAAK,OAAO,OAAO,SAAS,CAAC,EAAE,EAAE,EAEjE,MAAM,MAAM,MAAM,aAAa,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,OAAO,MAAM,EAAE,CAAC,EAC/E,KAAK,CAAC,EAAE,KAAK,OAAO,MAAM,MAAM;AAE/B,UAAI,YAAY,YAAY,WAAW,aAAa,aAAa,WAAW,cAAc,QAAS;AACnG,cAAQ,UAAU;AAClB,eAAS,KAAK;AAAA,IAChB,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnB;AACA,WAAS,iBAAiB;AACxB,iBAAa;AACb,kBAAc;AACd,WAAO,MAAM;AACX,mBAAa;AACb,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,cAAcJ,QAAO,KAAK;AAChC,QAAM,oBAAoB,YAAY,MAAM;AAC1C,yBAAqB,WAAW,OAAO;AACvC,eAAW,UAAU,sBAAsB,MAAM;AAC/C,kBAAY,UAAU;AACtB,kBAAY,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAClD,kBAAY,UAAU;AAAA,IACxB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AACL,QAAM,gBAAgB,YAAY,MAAM;AACtC,yBAAqB,WAAW,OAAO;AACvC,eAAW,UAAU;AAAA,MAAsB,MACzC,YAAY,SAAS,MAAM;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,CAAC;AACL,WAAS,WAAW;AAClB,yBAAqB,WAAW,OAAO;AACvC,iBAAa,KAAK;AAClB,oBAAgB,KAAK;AACrB,eAAW,KAAK;AAChB,cAAU,IAAI;AACd,gBAAY,KAAK;AACjB,eAAW,KAAK;AAChB,KAAC,cAAc,SAAS,cACpB,cAAc,UACd,OAAO,UACR,MAAM;AAAA,EACX;AAEA,WAAS,cAAc,QAAiB;AACtC,iBAAa,IAAI;AACjB,QAAI,QAAQ;AACV,2BAAqB,WAAW,OAAO;AACvC,0BAAoB,CAAC,SAAS;AAC9B,iBAAW,IAAI;AAAA,IACjB,MAAO,eAAc;AAAA,EACvB;AACA,WAAS,YAAY,QAAiB;AACpC,kBAAc,UAAU,SAAS;AACjC,gBAAY,IAAI;AAChB,SAAK,eAAe,cAAc,CAAC,mBAAmB;AACpD,sBAAgB,IAAI;AAAA,QACjB,eAAc,MAAM;AAAA,EAC3B;AAEA,WAAS,eAAe;AACtB,cAAU,IAAI;AACd,eAAW,KAAK;AAChB,kBAAc;AAAA,EAChB;AACA,WAAS,SAAS,WAA6B;AAC7C,cAAU,IAAI;AACd,qBAAiB,SAAS;AAC1B,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,kBAAc;AAAA,EAChB;AACA,iBAAe,aAAa,QAAuB,WAA6B;AAC9E,UAAM,cAAc,OAAO,WAAW,kBAClC,gBAAW,UAAU,WAAW,eAAU,UAAU,KAAK,MACzD,OAAO,WAAW,iBAChB,6BAA6B,UAAU,KAAK,4CAC5C,UAAU,UAAU,KAAK;AAC/B,UAAMK,YAAW,IAAI,OAAO,MAAM,KAAK,WAAW;AAClD,UAAM,UAAU,EAAE,SAAS,WAAW,eAAe,OAAO;AAC5D,UAAM,SAAS,eAAe;AAC9B,QAAI;AACF,YAAM,UAAU,MAAM,MAAM;AAAA,QAAS;AAAA,QAAOA;AAAA,QAAU;AAAA,QAAM;AAAA,QAAM,aAAa;AAAA,QAC7E,EAAE,GAAG,YAAY,GAAG,YAAY;AAAA,QAAG;AAAA,MAAO;AAC5C,eAAS,UAAQ,CAAC,GAAG,MAAM;AAAA,QAAE,IAAI;AAAA,QAAS;AAAA,QAAO,UAAAA;AAAA,QAAU,SAAS;AAAA,QAClE,MAAM;AAAA,QAAO,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAAG,GAAG;AAAA,MAAQ,CAAC,CAAC;AACjE,mBAAa,IAAI;AAAA,IACnB,UAAE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,WAAS,aAAa;AACpB,eAAW,IAAI;AACf,YAAQ,EAAE;AACV,eAAW,CAAC,CAAC;AACb,qBAAiB,IAAI;AAAA,EACvB;AAEA,iBAAe,OAAO;AACpB,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,SAAS,qBAAqB;AACtC,gBAAU,4BAA4B,mBAAmB,cAAc;AACvE;AAAA,IACF;AACA,UAAM,UAAU,EAAE,UAAU,SAAS,SAAS,eAAe,GAAI,SAAS,gBAAgB,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC,EAAG;AACzI,UAAM,YAAY,SAAS,SAAS;AACpC,UAAM,UAAU,QAAQ,CAAC,KAAK;AAC9B,UAAM,SAAS,SAAS,MAAM,WAAW,aAAa,CAAC;AACvD,UAAM,QAAuB;AAAA,MAC3B,GAAI,WAAW,CAAC;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV;AAAA,MACA,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC1D;AACA,UAAM,UAAU,UAAU,SAAY,aAAa;AACnD,UAAM,WAAW;AACjB,UAAM,SAAS,eAAe;AAC9B;AAAA,MAAS,CAAC,SACR,WACI,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,QAAQ,CAAE,IAC7C,CAAC,GAAG,MAAM,KAAK;AAAA,IACrB;AACA,eAAW;AACX,cAAU,EAAE;AACZ,eAAW,KAAK;AAChB,cAAU,IAAI;AACd,kBAAc;AACd,QAAI;AACF,YAAM,UAAU,MAAM,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,MAAM;AAAA,QAChB;AAAA,QACA,EAAE,GAAG,YAAY,GAAG,YAAY;AAAA,QAChC;AAAA,MACF;AACA;AAAA,QAAS,CAAC,SACR,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,IAAI,QAAQ,IAAI,CAAE;AAAA,MAC/D;AAAA,IACF,QAAQ;AACN;AAAA,QAAS,CAAC,SACR,WACI,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,WAAW,CAAE,IAChD,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,MACxC;AACA,cAAQ,KAAK;AACb,iBAAW,QAAQ,QAAQ;AAC3B,uBAAiB,QAAQ,OAAO;AAChC,iBAAW,QAAQ;AACnB,gBAAU,8CAA8C;AAAA,IAC1D,UAAE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,WAAS,UAAU,MAAqB;AACtC,cAAU,IAAI;AACd,eAAW,IAAI;AACf,YAAQ,KAAK,QAAQ;AACrB,eAAW,KAAK,aAAa,KAAK,UAAU,CAAC,KAAK,OAAO,IAAI,CAAC,EAAE;AAChE,qBAAiB,KAAK,WAAW,IAAI;AACrC,kBAAc;AAAA,EAChB;AACA,iBAAe,WAAW,MAAqB;AAC7C,UAAM,SAAS,eAAe;AAC9B,aAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC;AACvD,QAAI,SAAS,OAAO,KAAK,GAAI,YAAW;AACxC,QAAI;AACF,YAAM,MAAM,WAAW,KAAK,EAAE;AAAA,IAChC,QAAQ;AACN,eAAS,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAClC,gBAAU,uCAAuC;AAAA,IACnD,UAAE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAIA,EAAAJ,WAAU,MAAM;AACd,cAAU;AAAA,EACZ,GAAG,CAAC,WAAW,cAAc,KAAK,CAAC;AAMnC,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,kBAAkB,CAAC,QAAS;AACjC,QAAI,UAAU;AACd,QAAI,UAAU;AACd,QAAI,WAAW;AACf,QAAI;AACJ,UAAM,WAAW,MAAM;AACrB,mBAAa,KAAK;AAClB,UAAI,WAAW,SAAS,OAAQ;AAChC,cAAQ,WAAW,MAAM,KAAK,KAAK,GAAG,KAAK,IAAI,UAAU,KAAK,UAAU,WAAW,CAAC;AAAA,IACtF;AACA,UAAM,OAAO,YAAY;AACvB,UAAI,WAAW,WAAW,SAAS,OAAQ;AAC3C,gBAAU;AACV,YAAM,UAAU,YAAY;AAC5B,YAAM,WAAW,aAAa;AAC9B,UAAI;AACF,cAAM,SAAS,MAAM,MAAM,UAAU,QAAQ,OAAO;AACpD,mBAAW;AAEX,YAAI,WAAW,YAAY,YAAY,WAAW,aAAa,aAAa,WAAW,cAAc,QAAS;AAC9G,gBAAQ,UAAU,OAAO;AACzB,cAAM,QAAQ,OAAO;AACrB,YAAI,MAAO,UAAS,CAAC,SAAU,UAAU,MAAM,KAAK,IAAI,OAAO,KAAM;AAGrE,iBAAS,KAAK,MAAM,KAAK,IAAI,IAAI,GAAM,IAAI,GAAM;AAAA,MACnD,QAAQ;AACN,mBAAW,KAAK,IAAI,WAAW,GAAG,CAAC;AAAA,MACrC,UAAE;AACA,kBAAU;AACV,iBAAS;AAAA,MACX;AAAA,IACF;AACA,UAAM,OAAO,MAAM;AACjB,UAAI,SAAS,QAAQ;AAAE,qBAAa,KAAK;AAAG;AAAA,MAAQ;AACpD,iBAAW;AACX,WAAK,KAAK;AAAA,IACZ;AACA,aAAS;AACT,aAAS,iBAAiB,oBAAoB,IAAI;AAClD,WAAO,iBAAiB,SAAS,IAAI;AACrC,WAAO,MAAM;AACX,gBAAU;AACV,mBAAa,KAAK;AAClB,eAAS,oBAAoB,oBAAoB,IAAI;AACrD,aAAO,oBAAoB,SAAS,IAAI;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,gBAAgB,SAAS,KAAK,CAAC;AACnC,EAAAA,WAAU,MAAM;AACd,QAAI,YAAY,aAAa,CAAC,aAAc,eAAc,QAAQ;AAAA,EACpE,GAAG,CAAC,WAAW,cAAc,QAAQ,CAAC;AAEtC,EAAAA,WAAU,MAAM;AACd,QAAI,YAAY,CAAC,kBAAmB,eAAc,QAAQ;AAAA,EAC5D,GAAG,CAAC,QAAQ,CAAC;AACb,EAAAA,WAAU,MAAM;AACd,QAAI,cAAc,YAAY,SAAU;AACxC,kBAAc,UAAU;AACxB,mBAAe,UAAU;AACzB,cAAU,IAAI;AACd,eAAW,IAAI;AACf,YAAQ,EAAE;AACV,eAAW,CAAC,CAAC;AACb,qBAAiB,IAAI;AACrB,QAAI;AACF,YAAM,MAAM,mBAAmB,cAAc,QAAQ;AACrD,UAAI,CAAC,IAAK;AACV,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,YAAI,SAAS,OAAO,MAAM,SAAS,UAAU;AAC3C,kBAAQ,MAAM,IAAI;AAClB,qBAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC,CAAC;AAC9D,2BAAiB,MAAM,WAAW,IAAI;AAAA,QACxC,MAAO,SAAQ,GAAG;AAAA,MACpB,QAAQ;AACN,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX,GAAG,CAAC,QAAQ,CAAC;AACb,EAAAA,WAAU,MAAM;AAEd,QAAI,eAAe,SAAS;AAAE,qBAAe,UAAU;AAAO;AAAA,IAAQ;AACtE,QAAI,WAAW,cAAc,YAAY,SAAU;AACnD,QAAI;AACF,UAAI,CAAC,QAAQ,QAAQ,WAAW,KAAK,CAAC;AACpC,6BAAqB,cAAc,QAAQ;AAAA;AAE3C;AAAA,UAAoB;AAAA,UAClB;AAAA,UACA,KAAK,UAAU,EAAE,MAAM,UAAU,SAAS,SAAS,cAAc,CAAC;AAAA,QACpE;AAAA,IACJ,QAAQ;AAAA,IAAC;AAAA,EACX,GAAG,CAAC,MAAM,SAAS,eAAe,SAAS,QAAQ,CAAC;AAEpD,EAAAA,WAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,GAAI,IAAG,YAAY,GAAG;AAAA,EAC5B,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,EAAAE,iBAAgB,MAAM;AACpB,QAAI,CAAC,QAAS;AACd,UAAM,OAAO,QAAQ,SAAS,YAAY;AAC1C,QAAI,gBAAgB,cAAc,gBAAgB;AAChD,wBAAkB,IAAI;AACxB,WAAO,aAAa,UAAU,eAAe;AAAA,EAC/C,GAAG,CAAC,SAAS,MAAM,OAAO,eAAe,CAAC;AAG1C,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,cAAQ,SAAS,aAAa,gBAAgB,MAAM;AACpD,iBAAW,IAAI;AACf,UAAI,CAAC,YAAY,EAAE,UAAU,EAAE,YAAa;AAC5C,UACE,EAAE,SAAS,SAAS,QACpB,QAAQ,EAAE,WAAW,EAAE,OAAO,MAAM,QAAQ,SAAS,GAAG,KACxD,EAAE,aAAa,QAAQ,SAAS,KAAK,KACrC,EAAE,WAAW,QAAQ,SAAS,GAAG;AAEjC;AACF,QAAE,eAAe;AACjB,QAAE,yBAAyB;AAC3B,UAAI,CAAC,eAAgB,iBAAgB,CAAC,MAAM,CAAC,CAAC;AAAA,eACrC,SAAS;AAChB,mBAAW,KAAK;AAChB,sBAAc;AAAA,MAChB,OAAO;AACL,YAAI,CAAC;AACH,wBAAc,UAAU,SAAS;AACnC,oBAAY,IAAI;AAChB,sBAAc,IAAI;AAAA,MACpB;AAAA,IACF;AACA,UAAM,YAAY,MAAM;AACtB,cAAQ,SAAS,aAAa,gBAAgB,OAAO;AACrD,iBAAW,KAAK;AAAA,IAClB;AACA,WAAO,iBAAiB,WAAW,OAAO,IAAI;AAC9C,WAAO,iBAAiB,eAAe,WAAW,IAAI;AACtD,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,OAAO,IAAI;AACjD,aAAO,oBAAoB,eAAe,WAAW,IAAI;AAAA,IAC3D;AAAA,EACF,CAAC;AAED,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ,QAAS;AACtB,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,YAAY,EAAE,iBAAkB;AAC9C,UAAI,OAAQ,cAAa;AAAA,eAChB,QAAS,YAAW;AAAA,UACxB,UAAS;AAAA,IAChB;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,CAAC;AAED,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,SAAS,SAAS,KAAK,MAAM;AACnC,aAAS,KAAK,MAAM,SAAS;AAC7B,QAAI,QAAQ;AACZ,UAAM,YAAY,CAAC,MAAkB;AACnC,YAAM,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,UACpC,EAAE,aAAa,EAAE,KAAK,CAAC,SAA0B,gBAAgB,OAAO,IACxE,SAAS,iBAAiB,EAAE,SAAS,EAAE,OAAO;AAClD,aAAO,MAAM,CAAC,GAAG,QAAQ,gBAAgB,IAAI,KAAK;AAAA,IACpD;AACA,UAAM,SAAS,CAAC,MAAkB;AAChC,2BAAqB,KAAK;AAC1B,YAAM,WAAW,EAAE;AACnB,cAAQ,sBAAsB,MAAM;AAClC,cAAM,KAAK,WAAW,OAAO,UAAU,CAAC;AACxC,qBAAa,KAAK,GAAG,sBAAsB,IAAI,IAAI;AAAA,MACrD,CAAC;AAAA,IACH;AACA,UAAM,eAAe,CAAC,OAAgB;AACpC,YAAM,SAAS,yBAAyB,cAAc,EAAE,CAAC;AACzD,YAAM,QAAQ,CAAC,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ;AAC5E;AAAA,QAAW,CAAC,SACV,KAAK,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ,IAC3C,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ,IACjD,KAAK,SAAS,KACZ,CAAC,GAAG,MAAM,MAAM,IAChB;AAAA,MACR;AACA,aAAO,QAAQ,SAAS;AAAA,IAC1B;AACA,UAAM,UAAU,CAAC,MAAkB;AAEjC,UAAI,EAAE,SAAU;AAChB,YAAM,KAAK,UAAU,CAAC;AACtB,UAAI,CAAC,GAAI;AACT,QAAE,eAAe;AACjB,QAAE,yBAAyB;AAC3B,YAAM,QAAQ,aAAa,EAAE;AAE7B,UAAI,OAAO;AACT,cAAM,IAAI,GAAG,sBAAsB;AACnC,cAAM,UAAU,EAAE,SAAS,KAAK,EAAE,YAAY,KAAK,EAAE,YAAY;AACjE,cAAM,IAAI,UAAU,EAAE,UAAU,EAAE;AAClC,cAAM,IAAI,UAAU,EAAE,UAAU,EAAE;AAClC,YAAI,CAAC,UAAU;AACb,qBAAW,UAAU,QAAQ,SAAS,cAA2B,qCAAqC,GAAG,gBAAgB;AAC3H,kBAAU,EAAE,UAAU,MAAM,UAAU,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;AAC3E,qBAAa,IAAI;AACjB,0BAAkB;AAAA,MACpB;AAAA,IACF;AACA,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,KAAK;AACjB,cAAM,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,SAA0B,gBAAgB,OAAO;AACnF,YAAI,CAAC,MAAM,OAAO,SAAS,QAAQ,GAAG,QAAQ,4DAA4D,EAAG;AAC7G,UAAE,eAAe;AACjB,UAAE,yBAAyB;AAC3B,YAAI,CAAC,EAAE,OAAQ,cAAa,EAAE;AAC9B;AAAA,MACF;AAGA,YAAM,SAAS,EAAE,IAAI,WAAW,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE;AACjF,UAAI,QAAQ;AACV,cAAM,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,SAA0B,gBAAgB,OAAO;AACnF,YAAI,MAAM,CAAC,GAAG,QAAQ,gBAAgB,KAAK,GAAG,QAAQ,4CAA4C,EAAG;AACrG,mBAAW,KAAK;AAChB,qBAAa,IAAI;AACjB,oBAAY,SAAS,MAAM;AAC3B;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,QAAS;AAE7C,YAAM,QAAQ,YAAY;AAC1B,UACE,EAAE,QAAQ,WAAW,UAAU,WAAW,SAAS,CAAC,EAAE,YACtD,MAAM,MAAM,KAAK,KAAK,EAAE,aAAa,EAAE,SAAS,KAAK;AAErD;AACF,QAAE,eAAe;AACjB,QAAE,yBAAyB;AAG3B,UAAI,EAAE,QAAQ,UAAU;AACtB,mBAAW,CAAC,CAAC;AACb,kBAAU,IAAI;AAAA,MAChB;AACA,iBAAW,KAAK;AAChB,mBAAa,IAAI;AACjB,oBAAc;AAAA,IAChB;AACA,WAAO,iBAAiB,aAAa,QAAQ,IAAI;AACjD,WAAO,iBAAiB,SAAS,SAAS,IAAI;AAC9C,WAAO,iBAAiB,WAAW,OAAO,IAAI;AAC9C,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,SAAS;AAC7B,2BAAqB,KAAK;AAC1B,mBAAa,IAAI;AACjB,aAAO,oBAAoB,aAAa,QAAQ,IAAI;AACpD,aAAO,oBAAoB,SAAS,SAAS,IAAI;AACjD,aAAO,oBAAoB,WAAW,OAAO,IAAI;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,iBAAiB,CAAC;AAI9C,EAAAA,WAAU,MAAM;AACd,UAAM,SAAS,QAAQ,SAAS,YAAY;AAC5C,QAAI,EAAE,kBAAkB,YAAa;AACrC,UAAM,OAAO,CAAC,MAAa,EAAE,gBAAgB;AAG7C,UAAM,QAAQ,CAAC,eAAe,aAAa,cAAc,OAAO;AAChE,eAAW,QAAQ,MAAO,QAAO,iBAAiB,MAAM,IAAI;AAC5D,WAAO,MAAM;AAAE,iBAAW,QAAQ,MAAO,QAAO,oBAAoB,MAAM,IAAI;AAAA,IAAG;AAAA,EACnF,GAAG,CAAC,CAAC;AACL,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAW,WAAU,IAAI;AAAA,EAChC,GAAG,CAAC,SAAS,CAAC;AAId,EAAAE,iBAAgB,MAAM;AACpB,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,UAAU,CAAC,OAAO;AACrB,gBAAU,UAAU;AACpB;AAAA,IACF;AACA,cAAU,UAAU;AACpB,UAAM,OAAO,UAAU;AACvB,QAAI;AACJ,QAAI,OAAiC;AACrC,UAAM,QAAQ,MAAM;AAClB,cAAQ;AACR,UAAI,EAAE,GAAG,EAAE,IAAI;AACf,UAAI;AACF,cAAM,KAAK,SAAS,cAAc,OAAO,QAAQ;AACjD,YAAI,IAAI;AACN,gBAAM,IAAI,GAAG,sBAAsB;AACnC,cAAI,EAAE,OAAO,OAAO;AACpB,cAAI,EAAE,MAAM,OAAO;AAAA,QACrB;AAAA,MACF,QAAQ;AAAA,MAAC;AACT,YAAM,KAAK,SAAS,gBAAgB,eAAe;AACnD,YAAM,KAAK;AACX,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAChB,UAAI,OAAO,IAAI;AACf,UAAI,OAAO,IAAI,KAAK,aAAc,QAAO,IAAI,YAAY;AACzD,aAAO,KAAK,IAAI,cAAc,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY,CAAC;AACnE,YAAM,YAAY,IAAI,YAAY,KAAK,KAAK;AAC5C,YAAM,YAAY,IAAI,YAAY,KAAK;AACvC,UAAI,SAAS,SAAS,SAAS,UAAU,CAAC,aAAa,YAAY,CAAC,aAAa;AAC/E,eAAO,aAAa,CAAC,YAAY,UAAU;AAC7C,YAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,UAAI,SAAS,SAAS;AACpB,cAAM,MAAM,KAAK,IAAI,cAAc,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC;AACjF,cAAM,MAAM,MAAM,GAAG,GAAG;AACxB,cAAM,MAAM,SAAS;AACrB,cAAM,MAAM,kBAAkB,GAAG,IAAI,IAAI,MAAM,IAAI,GAAG;AAAA,MACxD,OAAO;AACL,cAAM,SAAS,KAAK,IAAI,cAAc,KAAK,IAAI,KAAK,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC;AACzF,cAAM,MAAM,SAAS,GAAG,MAAM;AAC9B,cAAM,MAAM,MAAM;AAClB,cAAM,MAAM,kBAAkB,GAAG,IAAI,IAAI,MAAM,KAAK,KAAK,SAAS,EAAE;AAAA,MACtE;AACA,gBAAU,UAAU,EAAE,MAAM,KAAK,SAAS,UAAU,OAAO,WAAW,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,WAAW,MAAM,MAAM,MAAM,IAAI,EAAE;AAAA,IAC1I;AACA,UAAM,WAAW,MAAM;AAAE,gBAAU,sBAAsB,KAAK;AAAA,IAAG;AACjE,UAAM;AAGN,UAAM,KAAK,UAAU;AACrB,UAAM,QAAQ,YAAY,KAAK,KAAK,OAAO,MAAM,YAAY;AAC7D,QAAI;AACJ,QAAI,OAAO;AAAA,IAEX,WAAW,CAAC;AACV,cAAQ,MAAM;AAAA,QAAQ,CAAC,EAAE,SAAS,GAAG,WAAW,aAAa,GAAG,EAAE,SAAS,GAAG,WAAW,OAAO,CAAC;AAAA,QAC/F,EAAE,UAAU,OAAO,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAAC;AAAA,aAC7C,OAAO,KAAK,SAAS,GAAG,QAAQ,KAAK,QAAQ,GAAG;AACvD,cAAQ,MAAM;AAAA,QACZ,CAAC,EAAE,WAAW,GAAG,KAAK,OAAO,GAAG,IAAI,MAAM,KAAK,MAAM,GAAG,GAAG,KAAK,GAAG,EAAE,WAAW,MAAM,CAAC;AAAA,QACvF,EAAE,UAAU,OAAO,OAAO,QAAQ,OAAO,QAAQ;AAAA,MACnD;AACF,UAAM,WAAW,OAAO,mBAAmB,cAAc,IAAI,eAAe,QAAQ,IAAI;AACxF,cAAU,QAAQ,KAAK;AACvB,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAC5E,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,MAAM;AACX,UAAI,UAAU,OAAW,sBAAqB,KAAK;AACnD,aAAO,OAAO;AACd,gBAAU,WAAW;AACrB,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,EAAAA,iBAAgB,MAAM;AACpB,UAAM,OAAO,UAAU;AACvB,UAAM,OAAO,QAAQ;AACrB,QAAI,YAAY,CAAC,QAAQ,CAAC,KAAM;AAChC,cAAU,UAAU;AACpB,QAAI,OAAO,KAAK,YAAY,cAAc,YAAY,IAAI,EAAG;AAC7D,UAAM,QAAQ,KAAK,UAAU,IAAI;AACjC,UAAM,QAAQ,KAAK,cAAc,UAAU;AAC3C,UAAM,OAAO,MAAM,cAAc,UAAU;AAC3C,QAAI,SAAS,KAAM,MAAK,QAAQ,MAAM;AACtC,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,QAAQ;AACd,UAAM,aAAa,eAAe,MAAM;AACxC,UAAM,gBAAgB,MAAM;AAC5B,SAAK,YAAY,KAAK;AACtB,UAAM,OAAO,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,WAAW,aAAa,CAAC,GAAG;AAAA,MACpF,UAAU,OAAO;AAAA,MAAM,QAAQ,OAAO;AAAA,MAAS,MAAM;AAAA,IACvD,CAAC;AACD,SAAK,WAAW,MAAM,MAAM,OAAO;AACnC,WAAO,MAAM;AAAE,WAAK,OAAO;AAAG,YAAM,OAAO;AAAA,IAAG;AAAA,EAChD,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,UAAU;AACzB,eAAS,CAAC,CAAC;AACX;AAAA,IACF;AACA,QAAI;AACJ,UAAM,SAAS,MAAM;AACnB,cAAQ;AACR;AAAA,QACE,QAAQ,QAAQ,CAAC,MAAM;AACrB,cAAI;AACF,kBAAM,KAAK,SAAS,cAAc,EAAE,QAAQ;AAC5C,gBAAI,CAAC,GAAI,QAAO,CAAC;AACjB,kBAAM,IAAI,GAAG,sBAAsB;AACnC,mBAAO;AAAA,cACL;AAAA,gBACE,KAAK,EAAE;AAAA,gBACP,MAAM,EAAE;AAAA,gBACR,OAAO,EAAE;AAAA,gBACT,QAAQ,EAAE;AAAA,gBACV,UAAU,EAAE;AAAA,cACd;AAAA,YACF;AAAA,UACF,QAAQ;AACN,mBAAO,CAAC;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,WAAW,MAAM;AAAE,gBAAU,sBAAsB,MAAM;AAAA,IAAG;AAClE,WAAO;AACP,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAC5E,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,MAAM;AACX,UAAI,UAAU,OAAW,sBAAqB,KAAK;AACnD,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,QAAQ,CAAC;AAE/B,QAAM,gBAAgB,YAChB,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,GAAG,EAAE;AAAA,MACT,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAU;AAAA,MACV,aAAW;AAAA,MACX,eAAa,CAAC;AAAA,MACd,KAAK,UAAQ;AAAE,cAAM,gBAAgB,SAAS,CAAC,YAAY;AAAA,MAAG;AAAA,MAE9D;AAAA,wBAAAD,KAAC,cAAW,OAAM,kBAAiB,SAAS,MAAM;AAAE,0BAAgB,KAAK;AAAG,sBAAY,KAAK;AAAA,QAAG,GAAG;AAAA,QACnG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,SAAS,MAAM;AAAE,8BAAgB,KAAK;AAAG,0BAAY,KAAK;AAAA,YAAG;AAAA,YAC7D,YAAY,iBAAiB,WAAW;AAAA,YACxC,SAAS;AAAA,YACT,UAAU,iBAAiB,eAAe;AAAA,YAC1C;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAGN,QAAM,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AAClF,QAAM,YAAY,WACd,WAAW,SAAS,QAAQ,SAAS,GAAG,GAAG,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS,CAAC,UAAU,EAAE,KACtG;AAEJ,QAAM;AAAA;AAAA,IAEJ,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,cAAW;AAAA,QACX,SAAS,CAAC,UAAU;AAClB,cAAI,MAAM,oBAAoB,MAAM,WAAW,EAAG;AAClD,gBAAM,SAAS,MAAM;AACrB,cAAI,OAAO,QAAQ,8DAA8D,EAAG;AACpF,sBAAY,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,QACpD;AAAA,QAEF;AAAA,0BAAAA,MAAC,SAAI,WAAU,mBAAkB,aAAU,UACxC;AAAA,uBACC,gBAAAA,MAAC,UAAK,WAAU,gBAAe;AAAA;AAAA,cAE7B,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,OAAM;AAAA,kBACN,SAAS;AAAA,kBAET,0BAAAA,KAACS,OAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA;AAAA,cAC/B;AAAA,eACF;AAAA,YAED,iBACC,gBAAAR,MAAC,UAAK,WAAU,gBACd;AAAA,8BAAAD,KAACS,OAAA,EAAK,MAAK,WAAU,MAAM,IAAI;AAAA,cAC/B,gBAAAR,MAAC,UAAK,eAAe,mBAClB;AAAA,8BAAc;AAAA,gBACd,cAAc,cACX,MAAM,cAAc,WAAW,KAC/B;AAAA,iBACN;AAAA,cACC,CAAC,SAAS,iBAAiB,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBAC3B,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,OAAM;AAAA,kBACN,SAAS,MAAM,iBAAiB,IAAI;AAAA,kBAEpC,0BAAAA,KAACS,OAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA;AAAA,cAC/B;AAAA,eACF;AAAA,YAED,QAAQ,IAAI,CAAC,QAAQ,UACpB,gBAAAR;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBAEV;AAAA,kCAAAD,KAAC,UAAK,eAAe,mBAAoB,iBAAO,QAAQ,OAAO,KAAI;AAAA,kBACnE,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,cAAY,yBAAyB,QAAQ,CAAC;AAAA,sBAC9C,OAAM;AAAA,sBACN,SAAS,MACP;AAAA,wBAAW,CAAC,SACV,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ;AAAA,sBACnD;AAAA,sBAGF,0BAAAA,KAACS,OAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA;AAAA,kBAC/B;AAAA;AAAA;AAAA,cAfK,OAAO;AAAA,YAgBd,CACD;AAAA,YACA,UACC,gBAAAT,KAAC,OAAE,MAAK,UAAS,WAAU,kBACxB,kBACH;AAAA,aAEJ;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,iBACf;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,cAAW;AAAA,gBACX,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,gBACvC,SAAS,MAAM;AAAE,sBAAI,CAAC,YAAY,QAAS,YAAW,KAAK;AAAA,gBAAG;AAAA,gBAC9D,eAAe,MAAM,WAAW,KAAK;AAAA,gBACrC,UAAU,WAAS;AACjB,wBAAM,cAAc,QAAQ,WAAW,OAAO,MAAM,cAAc,YAAY,CAAC;AAAA,gBACjF;AAAA,gBACA,WAAW,CAAC,MAAM;AAChB,sBACE,EAAE,QAAQ,WACV,CAAC,EAAE,YACH,CAAC,EAAE,YAAY,aACf;AACA,sBAAE,eAAe;AACjB,yBAAK,KAAK;AAAA,kBACZ;AAAA,gBACF;AAAA,gBACA,aACE,QAAQ,UAAU,gBACd,qCACA;AAAA,gBAEN,MAAM;AAAA,gBACN,WAAU;AAAA;AAAA,YACZ;AAAA,YACA,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO,kBAAkB,gBAAgB,SAAM,aAAa,KAAK,EAAE;AAAA,kBACnE,cAAW;AAAA,kBACX,gBAAc;AAAA,kBACd,WAAU;AAAA,kBAEV,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,kBACrC,SAAS,MAAM;AACb,yCAAqB,WAAW,OAAO;AACvC,wCAAoB,KAAK;AACzB,+BAAW,CAAC,MAAM,CAAC,CAAC;AAAA,kBACtB;AAAA,kBAEA,0BAAAA,KAACS,OAAA,EAAK,MAAK,OAAM,MAAM,IAAI;AAAA;AAAA,cAC7B;AAAA,cACC,YAAY,WACX,gBAAAT,KAAC,UAAK,KAAK,QAAQ,WAAU,sBAAqB,gEAA0C;AAAA,cAE9F,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAY,UAAU,cAAc;AAAA,kBACpC,UAAU,CAAC,KAAK,KAAK;AAAA,kBACrB,WAAU;AAAA,kBACV,OAAO,UAAU,sBAAsB;AAAA,kBACvC,SAAS,MAAM,KAAK,KAAK;AAAA,kBAEzB,0BAAAA,KAACS,OAAA,EAAK,MAAK,QAAO,MAAM,IAAI;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA,YACC,WAAW,CAAC,YACX,gBAAAR,MAAC,SAAI,KAAK,QAAQ,WAAU,mBAAkB,cAAY,kBACxD;AAAA,8BAAAD,KAACS,OAAA,EAAK,MAAK,OAAM,MAAM,IAAI;AAAA,cAC3B,gBAAAR,MAAC,OACC;AAAA,gCAAAD,KAAC,UAAM,kBAAQ,SAAS,GAAG,QAAQ,MAAM,cAAc,8BAA6B;AAAA,gBACpF,gBAAAA,KAAC,WAAM,kDAA+B;AAAA,iBACxC;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,kBACrC,SAAS,MAAM;AACb,+BAAW,KAAK;AAChB,kCAAc;AAAA,kBAChB;AAAA,kBACD;AAAA;AAAA,oBACM,gBAAAD,KAAC,SAAI,oBAAC;AAAA;AAAA;AAAA,cACb;AAAA,eACF;AAAA,aAEF;AAAA;AAAA;AAAA,IACA;AAAA;AAEF,QAAM,aAAa,kBACb,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,GAAG,EAAE;AAAA,MACT,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAU;AAAA,MACV,aAAW;AAAA,MACX,eAAa,CAAC;AAAA,MACd,KAAK,UAAQ;AAAE,cAAM,gBAAgB,SAAS,CAAC,SAAS;AAAA,MAAG;AAAA,MAE3D;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAS,MAAM;AACb,2BAAa,KAAK;AAClB,0BAAY,KAAK;AACjB,yBAAW,KAAK;AAAA,YAClB;AAAA;AAAA,QACF;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,0BAAAA,MAAC,QAAG;AAAA;AAAA,YACO;AAAA,YACT,gBAAAD,KAAC,UAAK,WAAU,iBACb,uBAAa,UAAU,IAC1B;AAAA,aACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAW;AAAA,cACT,OAAM;AAAA,cACR,SAAS,MAAM;AACb,6BAAa,KAAK;AAClB,4BAAY,KAAK;AACjB,2BAAW,KAAK;AAAA,cAClB;AAAA,cAEA,0BAAAA,KAACS,OAAA,EAAK,MAAK,SAAQ;AAAA;AAAA,UACrB;AAAA,WACF;AAAA,QACC,MAAM,OAAO,OAAO,KACnB,gBAAAT,KAAC,cAAS,WAAU,iBAAgB,cAAW,SAC5C,WAAC,OAAO,GAAG,MAAM,MAAM,EAAE,IAAI,CAAC,SAC7B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,gBAAc,cAAc,IAAI,IAAI;AAAA,YACpC,OAAO,SAAS,QAAQ,kBAAe,IAAI,KAAK;AAAA,YAChD,SAAS,MAAM,WAAW,IAAI;AAAA,YAE9B;AAAA,8BAAAD,KAAC,UAAK,eAAe,mBAAoB,mBAAS,QAAQ,cAAc,MAAK;AAAA,cAC7E,gBAAAA,KAAC,WAAO,gBAAM,OAAO,IAAI,IAAI,KAAK,GAAE;AAAA;AAAA;AAAA,UAR/B;AAAA,QASP,CACD,GACH;AAAA,QAEF,gBAAAA,KAAC,QAAG,KAAK,SAAS,WAAU,gBACzB,uBAAa,IAAI,CAAC,SACjB,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,mBAAiB,KAAK;AAAA,YACtB,WAAW,eAAe,SAAS,OAAO,KAAK,KAAK,0BAA0B,EAAE;AAAA,YAEhF;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,gBAAc,SAAS,OAAO,KAAK,KAAK,OAAO;AAAA,kBAC/C,SAAS,MAAM,UAAU,IAAI;AAAA,kBAE5B;AAAA,4BAAQ,IAAI,KAAK,EAAE,KAAK,gBAAAD,KAAC,UAAK,WAAU,mBAAkB,KAAK,UAAU,MAAK,OAAM,cAAW,+BAA8B,OAAM,+BAA8B;AAAA,oBAClK,gBAAAA,KAAC,eAAY,MAAY,MAAM,KAAK,UAAU,QAAQ,KAAK,QAAQ,QAAW;AAAA;AAAA;AAAA,cAChF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,KAAK,gBAAgB,mBAAmB;AAAA,kBACpD,OAAO,KAAK,gBAAgB,mBAAmB;AAAA,kBAC/C,SAAS,MAAM,KAAK,WAAW,IAAI;AAAA,kBAEnC,0BAAAA,KAACS,OAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA;AAAA,cAC/B;AAAA;AAAA;AAAA,UArBK,KAAK;AAAA,QAsBZ,CACD,GACH;AAAA,QACA,gBAAAT,KAAC,SAAI,WAAU,mBACZ,qBACC,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAM;AAAA,YACN,OAAO,EAAE,WAAW,WAAW,WAAW,OAAU;AAAA,YACpD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS;AAAA,YAET;AAAA,8BAAAD,KAACS,OAAA,EAAK,MAAK,OAAM,MAAM,IAAI;AAAA,cAC3B,gBAAAR,MAAC,UAAK,WAAU,qBACd;AAAA,gCAAAD,KAAC,UAAK,iCAAmB;AAAA,gBACzB,gBAAAA,KAAC,WAAO,qBAAU;AAAA,iBACpB;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAU,uBAAsB,uBAAS;AAAA;AAAA;AAAA,QACjD,IACE,UACN;AAAA;AAAA;AAAA,EACF;AAEN,MAAI,CAAC,QAAS,QAAO;AACrB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,gBAAY;AAAA,MACZ,cAAY;AAAA,MACZ,iBAAe;AAAA,MACf,cAAY,OAAO,QAAQ,QAAQ,CAAC,IAAI,OAAO,cAAc;AAAA,MAC7D,gBAAc;AAAA,MACd,mBAAiB;AAAA,MACjB,gBAAc,QAAQ,OAAO;AAAA,MAC7B,aAAW;AAAA,MACX,WAAU;AAAA,MAEV;AAAA,wBAAAD,KAAC,SAAI,WAAU,sBAAqB,eAAY,QAAO;AAAA,SACrD,WAAW,aACX;AAAA,UACE,GAAG;AAAA,UACH,GAAI,YACA;AAAA,YACE;AAAA,cACE,KAAK,UAAU;AAAA,cACf,MAAM,UAAU;AAAA,cAChB,OAAO,UAAU;AAAA,cACjB,QAAQ,UAAU;AAAA,cAClB,UAAU;AAAA,YACZ;AAAA,UACF,IACA,CAAC;AAAA,QACP,EAAE,IAAI,CAAC,MAAM,MACX,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,gBAAY;AAAA,YACZ,WAAW,gBAAgB,IAAI,MAAM,SAAS,sBAAsB,EAAE;AAAA,YACtE,OAAO;AAAA,cACL,KAAK,KAAK;AAAA,cACV,MAAM,KAAK;AAAA,cACX,OAAO,KAAK;AAAA,cACZ,QAAQ,KAAK;AAAA,YACf;AAAA;AAAA,UARK,KAAK;AAAA,QASZ,CACD;AAAA,QACF,YAAY,aACX,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAW;AAAA,YAEV;AAAA;AAAA,QACH;AAAA,QAEF,gBAAAA,KAAC,gBAAa,UAAU,gBAAgB,QAAQ,MAAM;AAAA,QACtD,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAW,WAAS;AAClB,kBAAI,CAAE,MAAM,OAAuB,UAAU,SAAS,qBAAqB,EAAG;AAC9E,kBAAI,CAAC,CAAC,WAAW,aAAa,aAAa,cAAc,QAAQ,KAAK,EAAE,SAAS,MAAM,GAAG,EAAG;AAC7F,oBAAM,eAAe;AACrB,oBAAM,UAAU,MAAM,KAAK,MAAM,cAAc,iBAAoC,sBAAsB,CAAC;AAC1G,oBAAM,KAAK,QAAQ,QAAQ,MAAM,MAA2B;AAC5D,oBAAM,OAAO,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,QAAQ,QAAQ,SAAS,KAAK,MAAM,CAAC,WAAW,WAAW,EAAE,SAAS,MAAM,GAAG,IAAI,KAAK,KAAK,QAAQ,UAAU,QAAQ;AAC7K,sBAAQ,IAAI,GAAG,MAAM;AAAA,YACvB;AAAA,YACA,WAAU;AAAA,YACV,iBAAe;AAAA,YACf,cAAY,OAAO,QAAQ,QAAQ,CAAC,IAAI,OAAO,cAAc;AAAA,YAC7D,SAAS,MAAM,WAAW,IAAI;AAAA,YAC9B,QAAQ,CAAC,MAAM;AACb,kBAAI,CAAC,EAAE,cAAc,SAAS,EAAE,aAAa,EAAG,YAAW,KAAK;AAAA,YAClE;AAAA,YAEA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAa,CAAC;AAAA,kBACd,KAAK,UAAQ;AAAE,0BAAM,gBAAgB,SAAS,CAAC,QAAQ;AAAA,kBAAG;AAAA,kBAEzD;AAAA,gCACC,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAU;AAAA,wBACV,cAAW;AAAA,wBACX,OAAM;AAAA,wBACN,iBAAe,GAAG,EAAE;AAAA,wBACpB,iBAAe;AAAA,wBACf,SAAS,MAAM;AACb,0CAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,sCAAY,KAAK;AAAA,wBACnB;AAAA,wBAEA;AAAA,0CAAAD,KAACS,OAAA,EAAK,MAAK,WAAU;AAAA,0BAAE,gBAAAT,KAAC,UAAK,WAAU,sBAAqB,sBAAQ;AAAA;AAAA;AAAA,oBACtE;AAAA,oBAED;AAAA,oBACA;AAAA,oBACA,kBACC,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAU;AAAA,wBACV,cAAW;AAAA,wBACX,OAAM;AAAA,wBACN,iBAAe,GAAG,EAAE;AAAA,wBACpB,iBAAe;AAAA,wBACf,SAAS,CAAC,UAAU;AAClB,sCAAY,KAAK;AACjB,8BAAI,WAAW;AACb,yCAAa,KAAK;AAClB,uCAAW,KAAK;AAAA,0BAClB,MAAO,eAAc,MAAM,SAAS,CAAC;AAAA,wBACvC;AAAA,wBAEA;AAAA,0CAAAD,KAACS,OAAA,EAAK,MAAK,WAAU;AAAA,0BAAE,gBAAAR,MAAC,UAAK,WAAU,sBAAqB;AAAA;AAAA,4BAAS,gBAAAD,KAAC,UAAK,WAAU,iBAAiB,uBAAa,UAAU,IAAG;AAAA,6BAAO;AAAA;AAAA;AAAA,oBACzI;AAAA;AAAA;AAAA,cAEJ;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,KAAK;AAAA,kBACL,WAAU;AAAA,kBACV,eAAa;AAAA,kBACb,UAAU,WAAW,KAAK;AAAA,kBAC1B,cAAY,iBAAiB,YAAY;AAAA,kBACzC,OAAO,UAAU,QAAQ,OAAO,SAAM,QAAQ,IAAI,iBAAiB,EAAE,GAAG,gBAAgB,SAAM,aAAa,KAAK,EAAE;AAAA,kBAClH,iBAAe;AAAA,kBACf,SAAS,CAAC,UAAU;AAClB,wBAAI,KAAM,UAAS;AAAA,6BACV,SAAU,aAAY,KAAK;AAAA,wBAC/B,aAAY,MAAM,SAAS,CAAC;AAAA,kBACnC;AAAA,kBAEC;AAAA,4BAAQ,OAAO,KAAK,gBAAAD,KAAC,UAAK,WAAU,gBAAe,KAAK,WAAW;AAAA,oBACpE,gBAAAA,KAACS,OAAA,EAAK,MAAK,WAAU;AAAA,oBACpB,aAAa,SAAS,KACrB,gBAAAT,KAAC,UAAK,WAAU,iBAAiB,uBAAa,QAAO;AAAA;AAAA;AAAA,cAEzD;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,SAAS,WAAW,EAAE,OAAO,QAAQ,GAA2C;AAC9E,SACE,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,uBAAsB,cAAY,OAAO,OAAO,OAAO,SAAS,SAC9F,0BAAAA,KAACS,OAAA,EAAK,MAAK,SAAQ,MAAM,IAAI,GAC/B;AAEJ;;;AmCv1CA,SAAS,kBAAkB;AAoJrB,gBAAAC,YAAA;AAjFN,SAAS,sBAAyB,QAAoB;AACpD,QAAM,SAAS,IAAI,IAAI,OAAO,oBAAoB,QAAQ,CAAC;AAC3D,QAAM,SAAS,OAAO;AACtB,aAAW,OAAO,OAAO,oBAAoB,QAAQ,GAAG;AACtD,QAAI,CAAC,OAAO,IAAI,GAAG,EAAG,SAAQ,eAAe,UAAU,GAAG;AAAA,EAC5D;AACA,SAAO;AACT;AAwBO,SAAS,eAAe,MAAyC;AACtE,QAAM,WAAW,KAAK,aAAa,MAAM,OAAO,SAAS;AACzD,QAAM,WACJ,KAAK,aAAa,YACd,sBAAsB,UAAU,KAAK,UAAU,KAAK,GAAG,IACvD,KAAK;AAGX,MAAI,CAAC,KAAK,YAAY,CAAC,SAAU,QAAO,MAAM;AAAA,EAAC;AAK/C,MACE,CAAC,KAAK,YACN,YACA,SAAS,QAAQ,EAAE,WAAW,KAC9B,OAAQ,SAAmC,YAAY,YACvD;AACA,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,aAAa,gBAAgB,MAAM;AACxC,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,KAAK,YAAa,UAAS,KAAK,YAAY,IAAI;AACrD,WAAO;AAAA,EACT;AACA,aAAW;AACX,QAAM,SAAS,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAEjD,oBAAkB,MAAM;AACxB,QAAM,OAAO,sBAAsB,MAAM,WAAW,MAAM,CAAC;AAU3D,QAAM,QAAQ,IAAI,iBAAiB,MAAM;AACvC,QAAI,SAAU;AACd,QAAI,CAAC,KAAK,YAAa,YAAW;AAAA,EACpC,CAAC;AACD,QAAM,QAAQ,SAAS,iBAAiB,EAAE,WAAW,MAAM,SAAS,KAAK,CAAC;AAE1E,WAAS,SAAS;AAChB,SAAK;AAAA,MACH,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,OAAO,EAAE,UAAU,KAAK,UAAU,KAAK,KAAK,IAAI;AAAA,UAChD,MAAM,KAAK;AAAA,UACX,YAAY,KAAK;AAAA,UACjB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,UAAU,KAAK;AAAA,UACf,gBAAgB,KAAK;AAAA,UACrB,OAAO,KAAK;AAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAA4B,CAAC;AAMnC,MAAI,WAAW;AACf,MAAI,UAAU;AACd,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW,SAAU;AACzB,cAAU;AACV,eAAW,MAAM;AACf,gBAAU;AACV,UAAI,CAAC,SAAU,QAAO;AAAA,IACxB,GAAG,CAAC;AAAA,EACN;AAQA,aAAW,MAAM;AACf,QAAI,SAAU;AACd,WAAO;AACP,WAAO,iBAAiB,YAAY,MAAM;AAC1C,cAAU,KAAK,MAAM,OAAO,oBAAoB,YAAY,MAAM,CAAC;AACnE,eAAW,OAAO,CAAC,aAAa,cAAc,GAAY;AACxD,YAAM,OAAO,OAAO,QAAQ,GAAG,EAAE,KAAK,OAAO,OAAO;AACpD,aAAO,QAAQ,GAAG,KAAK,IAAI,MAAwC;AACjE,cAAM,IAAI,KAAK,GAAG,CAAC;AACnB,eAAO;AACP,eAAO;AAAA,MACT;AACA,gBAAU,KAAK,MAAM;AACnB,eAAO,QAAQ,GAAG,IAAI;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC;AAEJ,SAAO,MAAM;AACX,eAAW;AACX,eAAW,OAAO,UAAW,KAAI;AACjC,UAAM,WAAW;AAMjB,eAAW,MAAM;AACf,WAAK,QAAQ;AACb,WAAK,OAAO;AAAA,IACd,GAAG,CAAC;AAAA,EACN;AACF;AAYA,SAAS,sBACP,UACA,UACA,KACgB;AAChB,QAAM,SAAS,4BAA4B,EAAE,UAAU,mBAAmB,SAAS,CAAC;AACpF,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,QAAQ,qBAAqB,EAAE,UAAU,IAAI,CAAC;AACpD,SAAO,eAAe,OAAO,eAAe;AAE1C,UAAM,SAAS,OACZ,QAAQ,EAER,OAAO,CAAC,SAAS,KAAK,SAAS,UAAa,KAAK,SAAS,QAAQ,EAClE,QAAQ,CAAC,SAAS;AACjB,YAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,UAAI,CAAC,MAAM,OAAO,uBAAwB,QAAO,CAAC;AAClD,YAAM,UAAU,OAAO,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC7D,YAAM,QAAQ,SAAS,SAAS;AAGhC,YAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ,GAAG,KAAK,KAAK,KAAK,KAAK;AACpE,aAAO,CAAC,EAAE,IAAI,OAAO,SAAS,SAAS,WAAW,KAAK,CAAC;AAAA,IAC1D,CAAC;AAGH,UAAM,QAAQ,UAAU,OAAO,MAAM,MAAM,OAAO,MAAM,MAAM;AAG9D,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,QAAQ;AACjB,YAAM,KAAK,qBAAqB,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IAC3F;AACA,QAAI,MAAM,QAAQ;AAChB,YAAM,KAAK,UAAU,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IAClG;AACA,UAAM,WAAW,MAAM,SACnB,kBAAkB,MAAM,KAAK,GAAG,CAAC,KACjC;AACJ,UAAM,MAAM;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,OAAO,CAAC,GAAG,WAAW;AAAA,MACtB;AAAA,MACA;AAAA,QACE,UAAU,OAAO,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,QAC/D,GAAI,MAAM,SACN,EAAE,OAAO,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE,IAChE,CAAC;AAAA,MACP;AAAA,MACA,EAAE,GAAG,OAAO,YAAY,GAAG,OAAO,YAAY;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;","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"]}
|
|
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/hints.ts","../src/react/viewport.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';\nimport { MOTION } from './motion';\nimport { HINTS } from './hints';\nimport { isCompactViewport, prefersTouch, useKeyboardInset, visibleBand } from './viewport';\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 /** What the Variants list says on a page without selectors. */\n variantsEmptyText?: string;\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 PULSE_MS = 2000;\n\n/**\n * Where the composer floats while writing about pinned elements: the point\n * that was clicked, kept relative to its element so it follows scrolling.\n * x and y are the last known viewport point, for when the element is gone.\n */\ninterface Anchor {\n selector: string;\n dx: number;\n dy: number;\n x: number;\n y: number;\n /** Pinned by touch: open beside the element, since a finger hides the point. */\n beside?: boolean;\n}\n/** Space between the clicked point and the floating composer, and its viewport margin. */\nconst FLOAT_GAP = 12;\nconst FLOAT_MARGIN = 8;\n\n/**\n * Pulse a node on the document's own clock. Every pulse starts at the timeline's\n * origin, so the launcher ring and every note dot beat together whenever they\n * appear, instead of each starting from its own mount time.\n */\nfunction syncPulse(spread: number) {\n return (node: HTMLElement | null) => {\n if (!node || typeof node.animate !== 'function') return;\n if (node.closest('[data-instant=\"true\"]') ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches)) return;\n const tint = 'color-mix(in srgb, var(--iso-focus) 55%, transparent)';\n const pulse = node.animate([\n { boxShadow: `0 0 0 0 ${tint}`, offset: 0 },\n { boxShadow: `0 0 0 ${spread}px transparent`, offset: 0.7 },\n { boxShadow: `0 0 0 ${spread}px transparent`, offset: 1 },\n ], { duration: PULSE_MS, iterations: Infinity, easing: 'ease-out' });\n pulse.startTime = 0;\n };\n}\n/** Keyboard use and reduced motion make the panel immediate. */\nfunction stillMotion(node: Element) {\n return Boolean(node.closest('[data-instant=\"true\"]')) ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches);\n}\n/**\n * Fade an element in once, when it mounts. A CSS animation would replay\n * whenever the panel switches between keyboard and pointer use, since that\n * toggles animations off and on again; an animation started here cannot.\n * `data-still` on the element skips it.\n */\nfunction fadeIn(node: HTMLElement | null) {\n if (!node || typeof node.animate !== 'function' || node.dataset.still === 'true' || stillMotion(node)) return;\n node.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 140, easing: 'ease-out' });\n}\n/** The same, for a control whose surface stays put while its content arrives. */\nfunction fadeInContent(node: HTMLElement | null) {\n if (!node || stillMotion(node)) return;\n for (const child of node.children)\n if (typeof child.animate === 'function')\n child.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 140, easing: 'ease-out' });\n}\nconst dotPulse = syncPulse(6);\nconst ringPulse = syncPulse(8);\n\n/** How often an open page asks whether the notes changed. */\nconst POLL_MS = 2500;\n/** The slowest retry while the server cannot be reached. */\nconst POLL_MAX_MS = 30_000;\n\n/** Whether a poll changed anything the panel draws, without a deep diff. */\nfunction sameNotes(a: IterationNote[], b: IterationNote[]): boolean {\n if (a.length !== b.length) return false;\n const byId = new Map(a.map((note) => [note.id, note]));\n return b.every((note) => {\n const old = byId.get(note.id);\n return old !== undefined && JSON.stringify(old) === JSON.stringify(note);\n });\n}\n\n/** How long \"an agent is working on this\" is believed without a sign of life. */\nconst WORKING_FRESH_MS = 20 * 60 * 1000;\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 variantsEmptyText,\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 // Selecting that starts with the panel shows its cover at once, so the field\n // underneath never shows through while the panel fades in.\n const [pickingWithPanel, setPickingWithPanel] = useState(false);\n const [targets, setTargets] = useState<IterationElement[]>([]);\n const targetsRef = useRef(targets);\n targetsRef.current = targets;\n // Set once an element is pinned: the composer leaves the dock and floats next to it.\n const [anchor, setAnchor] = useState<Anchor | null>(null);\n const anchorRef = useRef(anchor);\n anchorRef.current = anchor;\n const floating = anchor !== null;\n const floatRef = useRef<HTMLDivElement>(null);\n // The dock keeps the composer's height while it floats, so the panel stays put.\n const slotHeight = useRef(0);\n // Where the floating composer last was, so moving to a new pin glides there.\n const lastFloat = useRef<{ left: number; top: number } | null>(null);\n const floatNode = useRef<HTMLDivElement | null>(null);\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 // The elements clicked, by selector. A re-render can shift a path onto a\n // different element, and the highlight has to stay on the one that was picked.\n const pinnedElements = useRef(new Map<string, Element>());\n const locate = useCallback((selector: string): Element | null => {\n const pinned = pinnedElements.current.get(selector);\n if (pinned?.isConnected) return pinned;\n try { return document.querySelector(selector); } catch { return null; }\n }, []);\n const [text, setText] = useState('');\n const [notes, setNotes] = useState<IterationNote[]>([]);\n // Which pages' notes the list shows. Unset means this page only.\n const [scope, setScope] = useState<string[] | null>(null);\n const [clock, setClock] = useState(() => Math.floor(Date.now() / 60_000) * 60_000);\n const pollRev = useRef<string | null>(null);\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 // Hints follow the last pointer used, so a hybrid device gets the right words.\n const [touch, setTouch] = useState(prefersTouch);\n const touchRef = useRef(touch);\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, floating]);\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 useKeyboardInset(rootRef, visible);\n // A small screen has room for one panel: the one just opened stays.\n const wasOpen = useRef({ notes: notesOpen, variants: variantsOpen });\n useLayoutEffect(() => {\n const was = wasOpen.current;\n wasOpen.current = { notes: notesOpen, variants: variantsOpen };\n if (!notesOpen || !variantsOpen || !isCompactViewport()) return;\n if (was.variants) setVariantsOpen(false);\n else {\n setNotesOpen(false);\n setPicking(false);\n }\n }, [notesOpen, variantsOpen]);\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 openNotes = useMemo(() => notes.filter((n) => !n.done), [notes]);\n // Pages that have open notes, this one first, so the row of page chips reads\n // the same on every page.\n const pages = useMemo(() => {\n const counts = new Map<string, number>();\n // The update note belongs to the project, not a page: it shows everywhere.\n for (const n of openNotes) if (!n.update) counts.set(n.route, (counts.get(n.route) ?? 0) + 1);\n const others = [...counts.keys()].filter((r) => r !== route).sort();\n return { counts, others };\n }, [openNotes, route]);\n const selectedPages = useMemo(() => {\n const chosen = (scope ?? [route]).filter((r) => r === route || pages.counts.has(r));\n return new Set(chosen.length ? chosen : [route]);\n }, [scope, route, pages]);\n const updateRequested = useMemo(() => openNotes.some((n) => n.update), [openNotes]);\n const visibleNotes = useMemo(() => openNotes\n .filter((n) => n.update || selectedPages.has(n.route))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt)), [openNotes, selectedPages]);\n // An agent's claim goes stale: a crashed or abandoned run should not pulse forever.\n const working = useMemo(() => new Set(visibleNotes\n .filter((n) => n.workingAt && clock - Date.parse(n.workingAt) < WORKING_FRESH_MS)\n .map((n) => n.id)), [visibleNotes, clock]);\n function togglePage(page: string) {\n const next = new Set(selectedPages);\n if (next.has(page)) next.delete(page); else next.add(page);\n setScope(next.size ? [...next] : [route]);\n }\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 .pollNotes(null)\n .then((result) => ({ rev: result.rev, notes: result.notes ?? [] }))\n // Server away: show what this browser kept, if anything.\n .catch(() => store.pendingNotes().then((fresh) => ({ rev: null, notes: fresh })))\n .then(({ rev, notes: 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 pollRev.current = rev;\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({ preventScroll: true });\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 setAnchor(null);\n setExpanded(false);\n setHovered(false);\n (previousFocus.current?.isConnected\n ? previousFocus.current\n : fabRef.current\n )?.focus();\n }\n /** The pointer and the shortcut start selecting; Enter or Space on a focused button goes to the field. */\n function startFeedback(select: boolean) {\n setNotesOpen(true);\n if (select) {\n cancelAnimationFrame(focusFrame.current);\n setPickingWithPanel(!notesOpen);\n setPicking(true);\n } else focusComposer();\n }\n function openInitial(select: boolean) {\n previousFocus.current = document.activeElement as HTMLElement | null;\n setExpanded(true);\n if ((defaultTab === 'variants' || !notesAvailable) && variantsAvailable)\n setVariantsOpen(true);\n else startFeedback(select);\n }\n /** Put the composer back in the dock, keeping what was written and pinned. */\n function dockComposer() {\n setAnchor(null);\n setPicking(false);\n focusComposer();\n }\n function feedback(reference: VariantReference) {\n setAnchor(null);\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 setPicking(false);\n setAnchor(null);\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 setAnchor(null);\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 // Opening a surface or changing route loads at once; the poll below keeps it current.\n // biome-ignore lint/correctness/useExhaustiveDependencies: open-time refresh; store is stable.\n useEffect(() => {\n loadNotes();\n }, [notesOpen, variantsOpen, route]);\n // Keep the list current while the page is in front: an agent closing a note\n // shows up here without a reload. Only the notes request is repeated, so\n // nothing on the page, the composer or an edit in progress is touched. An\n // idle poll costs the server one stat; a hidden tab does not poll at all;\n // an unreachable server is retried less and less often.\n useEffect(() => {\n if (!notesAvailable || !visible) return;\n let stopped = false;\n let running = false;\n let failures = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const schedule = () => {\n clearTimeout(timer);\n if (stopped || document.hidden) return;\n timer = setTimeout(() => void tick(), Math.min(POLL_MS * 2 ** failures, POLL_MAX_MS));\n };\n const tick = async () => {\n if (stopped || running || document.hidden) return;\n running = true;\n const request = noteRequest.current;\n const revision = noteRevision.current;\n try {\n const result = await store.pollNotes(pollRev.current);\n failures = 0;\n // A local save, delete or reload while the request was out wins over it.\n if (stopped || request !== noteRequest.current || revision !== noteRevision.current || pendingWrites.current) return;\n pollRev.current = result.rev;\n const fresh = result.notes;\n if (fresh) setNotes((prev) => (sameNotes(prev, fresh) ? prev : fresh));\n // Coarse on purpose: the value only ages out stale claims, and an\n // unchanged minute lets React skip the render.\n setClock(Math.floor(Date.now() / 60_000) * 60_000);\n } catch {\n failures = Math.min(failures + 1, 8);\n } finally {\n running = false;\n schedule();\n }\n };\n const wake = () => {\n if (document.hidden) { clearTimeout(timer); return; }\n failures = 0;\n void tick();\n };\n schedule();\n document.addEventListener('visibilitychange', wake);\n window.addEventListener('focus', wake);\n return () => {\n stopped = true;\n clearTimeout(timer);\n document.removeEventListener('visibilitychange', wake);\n window.removeEventListener('focus', wake);\n };\n }, [notesAvailable, visible, store]);\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 setAnchor(null);\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 (!notesAvailable) setVariantsOpen((v) => !v);\n else if (picking) {\n setPicking(false);\n focusComposer();\n } else {\n if (!open)\n previousFocus.current = document.activeElement as HTMLElement;\n setExpanded(true);\n startFeedback(true);\n }\n };\n const onPointer = (e: PointerEvent) => {\n rootRef.current?.setAttribute('data-instant', 'false');\n setInstant(false);\n if (e.pointerType) {\n touchRef.current = e.pointerType === 'touch';\n setTouch(touchRef.current);\n }\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 (anchor) dockComposer();\n else 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 // Only a hovering pointer previews; a finger has nothing to preview before it taps.\n const onMove = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return;\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 pinnedElements.current.set(target.selector, el);\n const added = !targetsRef.current.some((t) => t.selector === target.selector);\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 return added ? target : null;\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 const added = toggleTarget(el);\n // The composer comes to the element that was just pinned, ready for typing.\n if (added) {\n const r = el.getBoundingClientRect();\n const pointed = e.detail > 0 || e.clientX !== 0 || e.clientY !== 0;\n const x = pointed ? e.clientX : r.left;\n const y = pointed ? e.clientY : r.bottom;\n if (!anchorRef.current)\n slotHeight.current = rootRef.current?.querySelector<HTMLElement>('.isotone-notes-panel .isotone-input')?.offsetHeight ?? 0;\n setAnchor({ selector: added.selector, dx: x - r.left, dy: y - r.top, x, y, beside: touchRef.current && pointed });\n setNotesOpen(true);\n focusWhilePicking();\n }\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 // The composer is covered while selecting. Typing a character finishes\n // selecting and lands in the composer, unless the page has an input focused.\n const typing = e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey && !e.isComposing;\n if (typing) {\n const el = e.composedPath().find((node): node is Element => node instanceof Element);\n if (el && !el.closest('[data-isotone]') && el.closest('input, textarea, select, [contenteditable]')) return;\n setPicking(false);\n setNotesOpen(true);\n textareaRef.current?.focus();\n return;\n }\n if (e.key !== 'Escape' && e.key !== 'Enter') return;\n // The floating composer is not covered, so Enter there sends what is written.\n const field = textareaRef.current;\n if (\n e.key === 'Enter' && anchorRef.current && field && !e.shiftKey &&\n field.value.trim() && e.composedPath().includes(field)\n )\n return;\n e.preventDefault();\n e.stopImmediatePropagation();\n // Enter keeps what was pinned. Escape cancels the selection: the pins go,\n // what was written stays, and the composer returns to the dock.\n if (e.key === 'Escape') {\n setTargets([]);\n setAnchor(null);\n }\n setPicking(false);\n setNotesOpen(true);\n focusComposer();\n };\n window.addEventListener('pointermove', 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('pointermove', 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 // Presses and clicks only. Releases (pointerup, mouseup, touchend) still\n // reach the page, so a host drag that ends over the dock still ends.\n const types = ['pointerdown', 'mousedown', 'touchstart', '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 (!notesOpen) setAnchor(null);\n }, [notesOpen]);\n // Place the floating composer beside its anchor, inside the viewport. It opens\n // below the point when it fits and above otherwise, and keeps that side while\n // it grows, so typing never makes it jump.\n useLayoutEffect(() => {\n const float = floatRef.current;\n if (!anchor || !float) {\n lastFloat.current = null;\n return;\n }\n floatNode.current = float;\n const from = lastFloat.current;\n let frame: number | undefined;\n let side: 'below' | 'above' | null = null;\n const place = () => {\n frame = undefined;\n let { x, y } = anchor;\n const el = locate(anchor.selector);\n const r = el?.getBoundingClientRect();\n if (r) {\n x = r.left + anchor.dx;\n y = r.top + anchor.dy;\n }\n const vw = document.documentElement.clientWidth || innerWidth;\n const vh = innerHeight;\n // Above an on-screen keyboard, when one is open.\n const band = visibleBand();\n const minY = band.top + FLOAT_MARGIN;\n const maxY = band.bottom - FLOAT_MARGIN;\n const w = float.offsetWidth;\n const h = float.offsetHeight;\n const fits = (below: number, above: number) =>\n [below + FLOAT_GAP + h <= maxY, above - FLOAT_GAP - h >= minY] as const;\n // A touch pin opens under or over the whole element, centred on the tap,\n // unless the element is too tall for either; a pointer pin opens at the point.\n let belowY = y;\n let aboveY = y;\n let left = x + FLOAT_GAP;\n if (anchor.beside && r && fits(r.bottom, r.top).some(Boolean)) {\n belowY = r.bottom;\n aboveY = r.top;\n left = x - w / 2;\n } else if (left + w > vw - FLOAT_MARGIN) left = x - FLOAT_GAP - w;\n left = Math.max(FLOAT_MARGIN, Math.min(left, vw - w - FLOAT_MARGIN));\n const [fitsBelow, fitsAbove] = fits(belowY, aboveY);\n if (side === null || (side === 'below' ? !fitsBelow && fitsAbove : !fitsAbove && fitsBelow))\n side = fitsBelow || !fitsAbove ? 'below' : 'above';\n float.style.left = `${left}px`;\n let top: number;\n if (side === 'below') {\n top = Math.max(minY, Math.min(belowY + FLOAT_GAP, maxY - h));\n float.style.top = `${top}px`;\n float.style.bottom = 'auto';\n } else {\n const bottom = Math.max(vh - maxY, Math.min(vh - aboveY + FLOAT_GAP, vh - h - minY));\n float.style.bottom = `${bottom}px`;\n float.style.top = 'auto';\n top = vh - bottom - h;\n }\n float.style.transformOrigin = `${x - left}px ${y - top}px`;\n lastFloat.current = { left, top };\n };\n const schedule = () => { frame ??= requestAnimationFrame(place); };\n place();\n // The composer grows out of the clicked point once, when it opens. A later\n // pin moves it, and it glides there rather than jumping.\n const to = lastFloat.current;\n const still = stillMotion(float) || typeof float.animate !== 'function';\n let glide: Animation | undefined;\n if (still) {\n // Immediate: no movement.\n } else if (!from)\n glide = float.animate([{ opacity: 0, transform: 'scale(.96)' }, { opacity: 1, transform: 'none' }],\n { duration: MOTION.enter, easing: MOTION.easeOut });\n else if (to && (from.left !== to.left || from.top !== to.top))\n glide = float.animate(\n [{ translate: `${from.left - to.left}px ${from.top - to.top}px` }, { translate: '0 0' }],\n { duration: MOTION.enter, easing: MOTION.easeOut },\n );\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(schedule) : undefined;\n observer?.observe(float);\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n // An on-screen keyboard opening or closing changes the visible area.\n const viewport = window.visualViewport;\n viewport?.addEventListener('resize', schedule);\n viewport?.addEventListener('scroll', schedule);\n return () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n glide?.cancel();\n observer?.disconnect();\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n viewport?.removeEventListener('resize', schedule);\n viewport?.removeEventListener('scroll', schedule);\n };\n }, [anchor, locate]);\n // Leaving the page, the floating composer fades where it was instead of\n // vanishing in one frame. Keyboard actions and reduced motion stay immediate.\n useLayoutEffect(() => {\n const last = floatNode.current;\n const root = rootRef.current;\n if (floating || !last || !root) return;\n floatNode.current = null;\n if (typeof last.animate !== 'function' || stillMotion(root)) return;\n const ghost = last.cloneNode(true) as HTMLElement;\n const field = last.querySelector('textarea');\n const copy = ghost.querySelector('textarea');\n if (field && copy) copy.value = field.value;\n ghost.classList.add('isotone-exit');\n ghost.inert = true;\n ghost.setAttribute('aria-hidden', 'true');\n ghost.removeAttribute('role');\n root.appendChild(ghost);\n const fade = ghost.animate([{ opacity: 1 }, { opacity: 0, transform: 'scale(.98)' }], {\n duration: MOTION.exit, easing: MOTION.easeOut, fill: 'forwards',\n });\n fade.onfinish = () => ghost.remove();\n return () => { fade.cancel(); ghost.remove(); };\n }, [floating]);\n useEffect(() => {\n const kept = new Set(targets.map((t) => t.selector));\n for (const selector of pinnedElements.current.keys()) if (!kept.has(selector)) pinnedElements.current.delete(selector);\n }, [targets]);\n // Pinned elements stay outlined while their note is written next to them.\n useEffect(() => {\n if (!picking && !floating) {\n setRects([]);\n return;\n }\n let frame: number | undefined;\n const update = () => {\n frame = undefined;\n setRects(\n targets.flatMap((t) => {\n const el = locate(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 }),\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, floating, locate]);\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 <PanelClose label=\"Close variants\" onClose={() => { setVariantsOpen(false); setExpanded(false); }} />\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 emptyText={variantsEmptyText}\n />\n </section>\n );\n // The dock names the element the floating composer sits next to.\n const anchored = targets.find((t) => t.selector === anchor?.selector) ?? targets[0];\n const awayLabel = anchored\n ? `Next to ${anchored.text || anchored.tag}${targets.length > 1 ? ` and ${targets.length - 1} more` : ''}`\n : 'Next to where you clicked';\n // One composer, in the dock or floating beside the element being written about.\n const composer = (\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 {/* The agent's question, in full, while the reviewer edits the note to answer it. */}\n {editing?.reply?.text && !editing.reply.answered && <p className=\"isotone-editing-reply\"><span>Agent asks</span> {editing.reply.text}</p>}\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 <div className=\"isotone-entry\">\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${shortcutLabel ? ` · ${shortcutLabel}` : ''}`}\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 setPickingWithPanel(false);\n setPicking((v) => !v);\n }}\n >\n <Icon name=\"pin\" size={14} />\n </button>\n {floating && picking && (\n <span ref={fadeIn} className=\"isotone-float-hint\">\n {HINTS.floating[touch ? 'touch' : 'pointer']}\n </span>\n )}\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 {picking && !floating && (\n <div ref={fadeIn} className=\"isotone-picking\" data-still={pickingWithPanel}>\n <Icon name=\"pin\" size={14} />\n <p>\n <span>{targets.length ? `${targets.length} selected` : HINTS.picking[touch ? 'touch' : 'pointer'].title}</span>\n {/* Touch has no Shift: Done leaves select mode with the pins kept, and the crosshair resumes it. */}\n <small>{HINTS.picking[touch ? 'touch' : 'pointer'].pause}</small>\n </p>\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setPicking(false);\n focusComposer();\n }}\n >\n Done{!touch && <kbd>↵</kbd>}\n </button>\n </div>\n )}\n </div>\n </fieldset>\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 <PanelClose\n label=\"Close feedback\"\n onClose={() => {\n setNotesOpen(false);\n setExpanded(false);\n setPicking(false);\n }}\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 {pages.counts.size > 1 && (\n <fieldset className=\"isotone-pages\" aria-label=\"Pages\">\n {[route, ...pages.others].map((page) => (\n <button\n key={page}\n type=\"button\"\n className=\"isotone-page\"\n aria-pressed={selectedPages.has(page)}\n title={page === route ? `This page · ${page}` : page}\n onClick={() => togglePage(page)}\n >\n <span onPointerOver={showOverflowTitle}>{page === route ? 'This page' : page}</span>\n <small>{pages.counts.get(page) ?? 0}</small>\n </button>\n ))}\n </fieldset>\n )}\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 {note.update ? (\n // Isotone writes an update note's text from its request, so\n // there is nothing to edit; its corner action cancels it.\n <div className=\"isotone-note-hit\" data-static=\"\">\n {working.has(note.id) && <span className=\"isotone-working\" ref={dotPulse} role=\"img\" aria-label=\"An agent is working on this\" title=\"An agent is working on this\" />}\n <NoteSummary note={note} />\n </div>\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 {working.has(note.id) && <span className=\"isotone-working\" ref={dotPulse} role=\"img\" aria-label=\"An agent is working on this\" title=\"An agent is working on this\" />}\n <NoteSummary note={note} page={note.route !== route ? note.route : undefined} />\n </button>\n )}\n <button\n type=\"button\"\n className=\"isotone-x isotone-icon\"\n aria-label={note.variantAction ? 'Cancel removal' : note.update ? 'Cancel update request' : 'Delete note'}\n title={note.variantAction ? 'Cancel removal' : note.update ? 'Cancel update request' : '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 {floating ? (\n <button\n type=\"button\"\n ref={fadeInContent}\n className=\"isotone-away\"\n title=\"Write here instead\"\n style={{ minHeight: slotHeight.current || undefined }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={dockComposer}\n >\n <Icon name=\"pin\" size={14} />\n <span className=\"isotone-away-text\">\n <span>Writing on the page</span>\n <small>{awayLabel}</small>\n </span>\n <span className=\"isotone-away-action\">Move here</span>\n </button>\n ) : composer}\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-selecting={picking || floating}\n data-working={working.size > 0}\n data-open={open}\n className=\"isotone-root\"\n >\n <div className=\"isotone-rail-track\" aria-hidden=\"true\" />\n {(picking || floating) &&\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 {floating && notesOpen && (\n <div\n ref={floatRef}\n className=\"isotone-float\"\n role=\"dialog\"\n aria-label=\"Feedback on the selection\"\n >\n {composer}\n </div>\n )}\n <div className=\"isotone-notices\">\n <UpdateNotice endpoint={updateEndpoint} active={open} route={route}\n requested={updateRequested} onRequested={notesAvailable ? loadNotes : undefined} />\n </div>\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={(event) => {\n setExpanded(false);\n if (notesOpen) {\n setNotesOpen(false);\n setPicking(false);\n } else startFeedback(event.detail > 0);\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${working.size ? ` · ${working.size} in progress` : ''}${shortcutLabel ? ` · ${shortcutLabel}` : ''}`}\n aria-expanded={railOpen}\n onClick={(event) => {\n if (open) closeAll();\n else if (expanded) setExpanded(false);\n else openInitial(event.detail > 0);\n }}\n >\n {working.size > 0 && <span className=\"isotone-ring\" ref={ringPulse} />}\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/** A quiet close control in the panel's top-left corner. */\nfunction PanelClose({ label, onClose }: { label: string; onClose: () => void }) {\n return (\n <button type=\"button\" className=\"isotone-panel-close\" aria-label={label} title={label} onClick={onClose}>\n <Icon name=\"close\" size={12} />\n </button>\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 { 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, updatePrompt } from '../core/update';\nimport { Icon } from './icons';\n\nexport interface UpdateNoticeProps {\n /** The local adapter's update endpoint; the browser never contacts npm. */\n endpoint?: string;\n active: boolean;\n /** The page, kept on the update note as context. */\n route?: string;\n /** An open update note already exists. */\n requested?: boolean;\n /** Offered only where notes are kept: called once the server filed the note. */\n onRequested?: () => void;\n}\n\n/** A quiet line, and a small dialog that hands the upgrade to the user's agent. */\nexport function UpdateNotice({ endpoint, active, route = '/', requested = false, onRequested }: UpdateNoticeProps) {\n const [info, setInfo] = useState<UpdateInfo | null>(null);\n const [open, setOpen] = useState(false);\n const [showCommand, setShowCommand] = useState(false);\n const [status, setStatus] = useState('');\n const [busy, setBusy] = useState(false);\n // Shown until the note reaches the panel's list; deleting it brings the button back.\n const [asked, setAsked] = useState(false);\n const trigger = useRef<HTMLButtonElement>(null);\n const primary = useRef<HTMLButtonElement>(null);\n const done = useRef<HTMLParagraphElement>(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(() => { if (requested) setAsked(false); }, [requested]);\n useEffect(() => {\n if (!open) return;\n setStatus('');\n setShowCommand(false);\n (primary.current ?? closeButton.current)?.focus();\n }, [open]);\n useEffect(() => { if (showCommand) command.current?.focus(); }, [showCommand]);\n function close() { setOpen(false); trigger.current?.focus(); }\n async function ask() {\n if (!endpoint || busy) return;\n setBusy(true);\n setStatus('');\n try {\n // Only the page goes along: the server writes the versions and command.\n const response = await fetch(endpoint, {\n method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ route }),\n });\n if (!response.ok) throw new Error(String(response.status));\n setAsked(true);\n onRequested?.();\n requestAnimationFrame(() => done.current?.focus());\n } catch { setStatus('Could not ask. Copy the prompt instead.'); }\n finally { setBusy(false); }\n }\n async function copyPrompt() {\n if (!info?.upgrade || !info.latestVersion) return;\n const text = updatePrompt({ from: info.currentVersion, to: info.latestVersion, ...info.upgrade });\n try { await navigator.clipboard.writeText(text); setStatus('Prompt copied'); }\n catch {\n setShowCommand(true);\n setStatus('Could not copy. The command is below.');\n }\n }\n if (!active || !info) return null;\n const pending = requested || asked;\n const canAsk = Boolean(onRequested && info.upgrade);\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(!open)}>\n {pending ? 'Update requested' : `Isotone ${info.latestVersion} is available`}\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\">\n <strong className=\"isotone-update-versions\">{info.currentVersion} → {info.latestVersion}</strong>\n <button ref={closeButton} type=\"button\" className=\"isotone-icon\" aria-label=\"Close update\" title=\"Close update\" onClick={close}><Icon name=\"close\" /></button>\n </div>\n {info.upgrade ? <>\n {canAsk && (pending\n ? <p ref={done} tabIndex={-1} className=\"isotone-update-requested\">Update requested · in Feedback</p>\n : <button ref={primary} type=\"button\" className=\"isotone-save isotone-update-ask\" disabled={busy} onClick={() => void ask()}>Ask agent to update</button>)}\n <div className=\"isotone-update-actions\">\n <button ref={canAsk ? undefined : primary} type=\"button\" className=\"isotone-update-quiet\" onClick={() => void copyPrompt()}>Copy prompt</button>\n <button type=\"button\" className=\"isotone-update-quiet\" aria-expanded={showCommand} onClick={() => setShowCommand(value => !value)}>Command</button>\n <span role=\"status\">{status}</span>\n </div>\n {showCommand && <div className=\"isotone-update-command\">\n <input ref={command} aria-label=\"Upgrade command\" readOnly value={info.upgrade.command} onFocus={event => event.currentTarget.select()} />\n <span className=\"isotone-update-path\" onPointerOver={showOverflowTitle}>in {info.upgrade.cwd}</span>\n </div>}\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-notices { position: absolute; z-index: 5; bottom: 10px; right: calc(var(--iso-rail-length) + 10px); display: flex; flex-direction: row-reverse; flex-wrap: wrap-reverse; align-items: center; justify-content: flex-start; gap: 6px; width: max-content; max-width: calc(100vw - var(--iso-rail-length) - 36px); pointer-events: none; }\n.isotone-root[data-tools='1'] .isotone-notices { right: calc(var(--iso-rail-size) + 10px); max-width: calc(100vw - var(--iso-rail-size) - 36px); }\n.isotone-notices > * { pointer-events: auto; }\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: min(var(--iso-dock-width), 260px); max-width: calc(100vw - 32px); max-height: calc(100dvh - 100px); overflow: auto; padding: 10px var(--iso-space) 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-versions { font-variant-numeric: tabular-nums; }\n.isotone-update-dialog > p { color: var(--iso-muted); }\n.isotone-root .isotone-update-ask { min-height: 28px; padding: 4px 10px; font-weight: 500; }\n.isotone-update-requested { min-height: 28px; display: flex; align-items: center; outline-offset: 2px; }\n.isotone-update-actions { display: flex; align-items: center; gap: 2px; margin: -4px 0 -4px -6px; }\n.isotone-root .isotone-update-quiet { padding: 4px 6px; border-radius: 5px; color: var(--iso-muted); font-size: 11px; background: none; box-shadow: none; }\n.isotone-update-quiet[aria-expanded='true'] { color: var(--iso-fg); }\n.isotone-update-actions [role='status'] { min-width: 0; margin-left: auto; color: var(--iso-muted); font-size: 10px; text-align: right; }\n.isotone-update-command { display: grid; gap: 4px; min-width: 0; }\n.isotone-update-path { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--iso-muted); font-size: 10px; }\n.isotone-root .isotone-update-dialog input { width: 100%; padding: 6px 8px; border-radius: 5px; background: var(--iso-well); box-shadow: var(--iso-well-shadow); font-size: 11px; }\n@media (pointer: coarse) { .isotone-root .isotone-update-quiet { padding: 9px 6px; } .isotone-update-actions { margin: -9px 0 -9px -6px; } }\n@media (hover: hover) and (pointer: fine) { .isotone-update-trigger:hover, .isotone-root .isotone-update-quiet: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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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 /* The height the dock may fill: what is visible (above an on-screen keyboard,\n see viewport.ts) less the safe areas it keeps clear of. */\n --iso-view-height: calc(var(--iso-viewport, 100dvh) - env(safe-area-inset-top, 0px) - max(0px, env(safe-area-inset-bottom, 0px) - 16px));\n position: fixed; right: max(16px, env(safe-area-inset-right)); bottom: max(calc(16px + var(--iso-keyboard, 0px)), env(safe-area-inset-bottom));\n z-index: 2147483000; width: 44px; display: flex; flex-direction: column; isolation: isolate; max-height: calc(var(--iso-view-height) - 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-float) { 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; pointer-events: none; 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(var(--iso-view-height) - 76px); }\n.isotone-notes-panel { flex-shrink: 0; max-height: calc(var(--iso-view-height) - 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); }\n/* The close control sits on the panel's top-left corner, half outside it, with\n the same face as a note's delete button, a touch larger. It fades in while the\n pointer is over the panel; keyboard focus and touch screens always show it. */\n.isotone-panel-close { position: absolute; left: -9px; top: -9px; z-index: 3; width: 26px; height: 26px; display: grid; place-items: center; padding: 0; border: 0; isolation: isolate; color: var(--iso-muted); background: none; opacity: 0; }\n.isotone-panel-close::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); transition: background-color 120ms ease; }\n.isotone-root .isotone-panel > .isotone-panel-close { transition: opacity 220ms ease, color 120ms ease; }\n.isotone-root .isotone-panel:hover > .isotone-panel-close, .isotone-panel-close:focus-visible { opacity: 1; }\n.isotone-root .isotone-panel > .isotone-panel-close:hover { color: var(--iso-fg); }\n.isotone-panel-close:hover::before { background: var(--iso-control-hover-face); }\n@media (hover: none) { .isotone-panel-close { opacity: 1; } }\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-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(var(--iso-view-height) - 76px)); }\n/* The panel no longer clips, so its corner close can overhang; the variants body clips itself. */\n.isotone-root .isotone-panel > .isotone-vars { overflow: hidden; border-radius: 11px; }\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/* Sections name the part of the page their selectors change. The header sticks to\n the top of the scroll area while its own selectors pass beneath and fade into the\n surface; the next section's header pushes it out. At rest its padding occupies\n the inset or gap above it, so sticking does not move the text. */\n.isotone-section, .isotone-section-body { flex: none; display: flex; flex-direction: column; gap: var(--iso-space); }\n.isotone-section-body[hidden] { display: none; }\n.isotone-vars-body > * + .isotone-section { padding-top: 8px; }\n/* Sticky offsets start inside the scroller's padding; the negative top reaches its edge. */\n.isotone-section-head { position: sticky; top: calc(0px - var(--iso-space)); z-index: 1; margin: calc(0px - var(--iso-space)) calc(0px - var(--iso-space)) -4px; padding: var(--iso-space) var(--iso-space) 0; background: var(--iso-bg); font: inherit; }\n.isotone-section-head::after { content: ''; position: absolute; left: 0; right: 0; top: 100%; height: 8px; background: linear-gradient(var(--iso-bg), transparent); pointer-events: none; }\n.isotone-section-toggle { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: calc(100% + 7px); min-height: 24px; padding: 2px 7px; margin-left: -7px; border-radius: 6px; text-align: left; color: var(--iso-muted); font-size: 11px; font-weight: 600; }\n.isotone-section-toggle > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-section-toggle > svg, .isotone-section-toggle > small { flex: none; }\n.isotone-section-toggle > small { color: var(--iso-faint); font-size: 10px; font-weight: 500; font-variant-numeric: tabular-nums; }\n.isotone-section[data-collapsed='true'] .isotone-section-toggle > svg { transform: rotate(-90deg); }\n/* Keyboard focus reveal keeps a focused control clear of the sticky header. */\n.isotone-vars-body:has(> .isotone-section) { scroll-padding-top: 44px; }\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-picking button, .isotone-away-action { 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; overflow: hidden; }\n.isotone-save-row { position: relative; }\n.isotone-save-state { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n.isotone-save-label { display: block; }\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-name { flex: 1; min-width: 0; display: flex; align-items: baseline; gap: 6px; }\n.isotone-option-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n/* Tags never shrink, so a long label truncates before them instead of hiding them. */\n.isotone-option-tags { flex: none; display: flex; gap: 6px; white-space: nowrap; }\n.isotone-option-tags small { font-size: 9px; color: var(--iso-muted); }\n/* A pending removal stays listed and readable; only its text quietens. */\n.isotone-option-row[data-requested] .isotone-option-label { color: var(--iso-muted); }\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-more { flex: none; color: var(--iso-faint); font-size: 9px; }\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/* The agent's question takes a second line under the note, muted, clipped like it. */\n.isotone-note-hit:has(> .isotone-reply) { flex-wrap: wrap; row-gap: 1px; }\n.isotone-note-hit > p.isotone-reply { order: 3; flex: 1 0 100%; color: var(--iso-muted); font-size: 11px; }\n.isotone-reply > span, .isotone-editing-reply > span { color: var(--iso-fg); font-weight: 500; }\n.isotone-editing-reply { flex: none; max-height: 58px; overflow-y: auto; padding: 8px var(--iso-input-padding) 0; color: var(--iso-muted); font-size: 11px; line-height: 16px; overflow-wrap: anywhere; }\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/* One chip per page that has open notes, this page first. */\n.isotone-pages { display: flex; flex: none; min-width: 0; border-top: 0; border-bottom: 0; border-inline: 0; gap: 4px; overflow-x: auto; overscroll-behavior: contain; margin: 0 calc(0px - var(--iso-space)); padding: 0 var(--iso-space); }\n.isotone-page { flex: 0 1 auto; display: inline-flex; align-items: center; gap: 6px; min-width: 0; max-width: 160px; height: 22px; padding: 0 7px; border-radius: var(--iso-control-radius); border: 1px solid var(--iso-edge); background: transparent; color: var(--iso-muted); font-size: 10px; }\n.isotone-page > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-page small { color: var(--iso-faint); font-size: 9px; font-variant-numeric: tabular-nums; }\n.isotone-page[aria-pressed='true'] { color: var(--iso-fg); background: var(--iso-label-face); box-shadow: var(--iso-label-lift-shadow); }\n/* An agent has said it is working on a note: a soft pulse on the note, and a ring on the launcher.\n Both are driven by one shared clock (see syncPulse), so they beat together. */\n.isotone-note-hit { position: relative; }\n.isotone-working { position: absolute; left: 3px; top: 5px; width: 6px; height: 6px; border-radius: 50%; background: var(--iso-focus); }\n.isotone-ring { position: absolute; inset: 0; border-radius: 999px; pointer-events: none; }\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-entry .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-entry { position: relative; display: flex; flex-direction: column; gap: 8px; }\n/* Select mode covers the field and says how to finish, next to the elements the user is picking. */\n.isotone-picking { position: absolute; inset: -4px; z-index: 1; display: flex; align-items: center; gap: 10px; padding: 0 4px 0 8px; border-radius: 6px; background: var(--iso-well); cursor: default; }\n.isotone-picking > svg { flex: none; color: var(--iso-fg); }\n.isotone-picking p { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; margin: 0; }\n/* Hints are never truncated (design.md, \"Hints and instructions\"): one line, copy short enough to fit. */\n.isotone-picking span { font-size: 12px; line-height: 16px; color: var(--iso-fg); font-variant-numeric: tabular-nums; white-space: nowrap; }\n.isotone-picking small { font-size: 10px; line-height: 14px; color: var(--iso-muted); white-space: nowrap; }\n.isotone-picking button { flex: none; display: flex; align-items: center; gap: 8px; height: 28px; padding: 0 9px; }\n.isotone-picking kbd { font: inherit; color: var(--iso-muted); }\n/* After a pin, the composer floats beside the element on a panel surface, placed by\n IterationPanel inside the viewport. It grows out of the point that was clicked. */\n.isotone-float { position: fixed; z-index: 2147483002; width: min(300px, calc(100vw - 16px)); padding: 4px; background: var(--iso-bg); border: 1px solid var(--iso-line); border-radius: 12px; box-shadow: var(--iso-panel-shadow); }\n.isotone-float-hint { flex: 1 0 auto; white-space: nowrap; font-size: 10px; color: var(--iso-muted); }\n/* Meanwhile the dock keeps the composer's slot and says where the writing went. */\n.isotone-away { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 50px; padding: 8px 8px 8px 10px; text-align: left; color: var(--iso-fg); background: var(--iso-well); border: 1px solid var(--iso-input-border); box-shadow: var(--iso-input-shadow); border-radius: 8px; }\n.isotone-away > svg { flex: none; }\n.isotone-root .isotone-float.isotone-exit { pointer-events: none; }\n.isotone-away-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n.isotone-away-text > * { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.isotone-away-text > span { font-size: 12px; line-height: 16px; }\n.isotone-away-text > small { font-size: 10px; line-height: 14px; color: var(--iso-muted); }\n.isotone-away-action { flex: none; display: flex; align-items: center; height: 28px; padding: 0 9px; font-size: 11px; }\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, .isotone-section-toggle):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):not([data-static]) { 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-picking button):not(:disabled):hover, .isotone-away:hover .isotone-away-action { 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/* Phones. Panels take turns (see viewport.ts). Variants stop at about half the\n screen, so the page they change stays in view; action dialogs keep their\n 360px. While selecting, the dock shrinks to the composer so the page can be\n reached, and the saved notes return afterwards. */\n@media (max-width: 640px) {\n .isotone-variants-panel { max-height: min(calc(var(--iso-view-height) - 76px), max(50dvh, 360px)); }\n}\n@media (max-width: 640px), (max-height: 500px) {\n .isotone-root[data-selecting='true'] .isotone-notes-panel > :is(.isotone-list, .isotone-pages) { display: none; }\n}\n/* A finger needs more than the drawn faces. Hit areas grow without moving\n anything; the faces keep Instrument's geometry. */\n@media (pointer: coarse) {\n .isotone-pick::after, .isotone-send::after { inset: -8px -10px; }\n .isotone-chip button { position: relative; }\n .isotone-chip button::after, .isotone-note > .isotone-x::after, .isotone-panel-close::after { content: ''; position: absolute; inset: -6px; border-radius: 50%; }\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-ring { box-shadow: 0 0 0 2px color-mix(in srgb, var(--iso-focus) 50%, transparent); }\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/* Instant mode follows any key press, but the corner close only ever appears under the pointer, so it keeps its fade. */\n.isotone-root[data-instant='true'] .isotone-panel > .isotone-panel-close { transition-duration: 220ms, 120ms !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 { type ReactNode, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { VariantReference } from '../core/index';\nimport {\n axisDefault,\n axisSection,\n formatRangeValue,\n isDirty,\n type VariantAction,\n type VariantAxis,\n type VariantSection,\n type VariantSelections,\n type VariantsSource,\n sectionAxes,\n visibleAxes,\n} from '../core/variants';\nimport { Icon } from './icons';\nimport { MOTION } from './motion';\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\nconst DEFAULT_EMPTY_TEXT = 'No variants on this page yet. Ask your agent to create variants of any design and they will appear here.';\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 emptyText = DEFAULT_EMPTY_TEXT,\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 /** What the list says when this page has no selectors. */\n emptyText?: string;\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, sections, names, sourceError } = useMemo(() => {\n const selections = source.getSelections();\n const shown = visibleAxes(source.getAxes(), selections);\n const sections = sectionAxes(shown);\n return {\n selections,\n shown,\n sections,\n names: new Map(sections.flatMap(section => section.axes).map(entry => [entry.axis.id, entry])),\n sourceError: source.getError?.(),\n };\n }, [source, revision]);\n // Collapsed sections, by case-insensitive name; kept while the panel closes.\n const [collapsed, setCollapsed] = useState<ReadonlySet<string>>(() => new Set());\n const [menuId, setMenuId] = useState<string | null>(null);\n const menu = shown.find(axis => axis.id === menuId) ?? null;\n const nameOf = (axis: VariantAxis) => names.get(axis.id) ?? axisSection(axis);\n const menuName = menu ? nameOf(menu) : 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 pendingFocus = useRef<{ optionId: string; retry: boolean } | null>(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 // Composing feedback moves focus to the composer instead of the selector.\n const closeMenu = (restoreFocus = true) => {\n setMenuOpen(false);\n setError('');\n pendingFocus.current = null;\n if (!restoreFocus) return;\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 // A removal request keeps the dialog open. Its trash button is disabled while\n // the request saves and stays disabled once it is pending, so focus moves on\n // to the next option that can still be removed, then back up the list, then\n // to Reset to default. A failed request returns focus to the same button.\n // biome-ignore lint/correctness/useExhaustiveDependencies: runs after the request settles and the pending state has rendered.\n useEffect(() => {\n const target = pendingFocus.current;\n const dialog = menuRef.current;\n if (busy || !target || !dialog || !menuOpen) return;\n pendingFocus.current = null;\n const rows = Array.from(dialog.querySelectorAll<HTMLElement>('.isotone-option-row'));\n const at = rows.findIndex(row => row.dataset.optionId === target.optionId);\n const removable = (row: HTMLElement | undefined) =>\n row?.querySelector<HTMLButtonElement>('button[data-remove]:not(:disabled)') ?? null;\n const next = target.retry\n ? removable(rows[at])\n : [...rows.slice(at + 1), ...rows.slice(0, Math.max(at, 0)).reverse()].map(removable).find(Boolean);\n (next ?? dialog.querySelector<HTMLButtonElement>('[data-reset]'))?.focus();\n }, [busy, pendingActions, menuOpen]);\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(false);\n onFeedback?.({\n axisId: axis.id,\n label: nameOf(axis).fullLabel,\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 // Removing one option keeps the dialog open, so several can be requested in a\n // row. Keep default only and Remove selector decide the whole selector and close it.\n async function manage(action: VariantAction) {\n if (!menu || busy || !onManage || requested(action)) return;\n const option = action.action === 'remove-option' ? action.optionId : undefined;\n setBusy(true);\n setError('');\n try {\n const chosen = menuOptions.find(o => o.id === action.optionId);\n await onManage(action, {\n axisId: menu.id, label: menuName?.fullLabel ?? menu.label, value: value(menu),\n ...(chosen ? { optionId: chosen.id, optionLabel: chosen.label } : {}),\n });\n if (option !== undefined) pendingFocus.current = { optionId: option, retry: false };\n else closeMenu();\n } catch (e) {\n if (option !== undefined) pendingFocus.current = { optionId: option, retry: true };\n setError(\n e instanceof Error ? e.message : 'Could not update this selector.',\n );\n } finally {\n setBusy(false);\n }\n }\n\n function renderAxis({ axis, label, fullLabel }: VariantSection['axes'][number]) {\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={`${fullLabel} 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}>{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={fullLabel}\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={fullLabel}>\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={`${fullLabel}: 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={fullLabel}\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\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\">{emptyText}</p>\n )}\n {sections.map(section => section.name === null\n ? section.axes.map(renderAxis)\n : <SectionBlock\n key={`section:${section.key}`}\n name={section.name}\n sectionKey={section.key}\n count={section.axes.length}\n collapsed={collapsed.has(section.key)}\n onToggle={() => setCollapsed(previous => {\n const next = new Set(previous);\n if (!next.delete(section.key)) next.add(section.key);\n return next;\n })}\n >\n {section.axes.map(renderAxis)}\n </SectionBlock>)}\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={`${menuName?.fullLabel ?? 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>{menuName?.label ?? 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 const pending = requested({ axisId: menu.id, action: 'remove-option', optionId: option.id });\n return (\n <div className=\"isotone-option-row\" key={option.id} data-option-id={option.id} data-requested={pending || undefined}>\n {/* Only the label truncates; its tags sit beside it and always show in full. */}\n <span className=\"isotone-option-name\">\n <span className=\"isotone-option-label\">{option.label}</span>\n {(option.isDefault || pending) && (\n <span className=\"isotone-option-tags\">\n {option.isDefault && <small>Default</small>}\n {pending && <small>Removal requested</small>}\n </span>\n )}\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 data-remove=\"\"\n aria-label={`Remove ${option.label}`}\n disabled={option.isDefault || busy || pending}\n title={\n option.isDefault\n ? 'Default option'\n : pending\n ? 'Removal requested'\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 })}\n </div>\n )}\n <button\n type=\"button\"\n className=\"isotone-menu-action\"\n data-reset=\"\"\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\n/**\n * A section of selectors: a sticky header that names the part of the page and\n * can fold the section away, then its selectors. The header stays at the top of\n * the scroll area while its own selectors pass beneath it, and the next\n * section's header pushes it out.\n */\nfunction SectionBlock({\n name,\n sectionKey,\n count,\n collapsed,\n onToggle,\n children,\n}: {\n name: string;\n sectionKey: string;\n count: number;\n collapsed: boolean;\n onToggle: () => void;\n children: ReactNode;\n}) {\n const id = useId();\n return (\n // The heading carries the structure (heading navigation, a disclosure button);\n // a region or group per section would only add landmarks to a long list.\n <div className=\"isotone-section\" data-collapsed={collapsed}>\n <h3 className=\"isotone-section-head\" data-motion-key={`section:${sectionKey}`}>\n <button\n type=\"button\"\n className=\"isotone-section-toggle\"\n aria-label={`${name}, ${count} ${count === 1 ? 'selector' : 'selectors'}`}\n aria-expanded={!collapsed}\n aria-controls={`${id}-body`}\n onClick={onToggle}\n >\n <Icon name=\"chevron\" size={12} />\n <span onPointerOver={showOverflowTitle}>{name}</span>\n <small>{count}</small>\n </button>\n </h3>\n <div className=\"isotone-section-body\" id={`${id}-body`} hidden={collapsed}>\n {collapsed ? null : children}\n </div>\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(''), 3000);\n }\n // The button itself carries the result for a few seconds: its label crossfades\n // and its width eases between the two label widths.\n const label = state && state !== 'Saving…' ? state : 'Save as defaults';\n const button = useRef<HTMLButtonElement>(null);\n const text = useRef<HTMLSpanElement>(null);\n const width = useRef(0);\n // biome-ignore lint/correctness/useExhaustiveDependencies: only a label change needs a measurement.\n useLayoutEffect(() => {\n const node = button.current;\n if (!node) return;\n node.style.width = '';\n const next = node.offsetWidth;\n const previous = width.current;\n width.current = next;\n const instant = node.closest('[data-instant=\"true\"]') ||\n (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches);\n if (!previous || instant || typeof node.animate !== 'function') return;\n text.current?.animate(\n [{ opacity: 0, transform: 'translateY(3px)' }, { opacity: 1, transform: 'translateY(0)' }],\n { duration: MOTION.enter, easing: MOTION.easeOut },\n );\n if (Math.abs(previous - next) < 0.5) return;\n node.animate(\n [{ width: `${previous}px` }, { width: `${next}px` }],\n { duration: MOTION.reflow, easing: MOTION.easeOut },\n );\n }, [label]);\n return (\n <div className=\"isotone-save-row\">\n <button\n ref={button}\n type=\"button\"\n className=\"isotone-save\"\n disabled={state === 'Saving…'}\n aria-busy={state === 'Saving…'}\n onClick={() => void save()}\n >\n <span className=\"isotone-save-label\" ref={text}>{label}</span>\n </button>\n <span className=\"isotone-save-state\" role=\"status\">{state}</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';\nimport { updateNoteText } from '../core/update';\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/** The agent's question about a note, from `isotone --reply`; edit the note to answer.\n * Once answered it is no longer a question, so it is not shown. */\nfunction Reply({ note }: { note: IterationNote }) {\n if (!note.reply?.text || note.reply.answered) return null;\n return <p className=\"isotone-reply\" onPointerOver={showOverflowTitle}><span>Agent asks</span> {note.reply.text}</p>;\n}\n\n/** Keep machine-directed requests readable without changing the agent's original text. */\nexport function NoteSummary({ note, page }: { note: IterationNote; page?: string }) {\n // The update request names no element: one compact tag says what it is.\n if (note.update) return <>\n <p>{updateNoteText(note.update)}</p>\n <Reply note={note} />\n <span className=\"isotone-meta\"><SummaryTag label=\"Update\" /></span>\n </>;\n if (!note.feedback.startsWith('[set-defaults]')) {\n const elements = note.elements ?? (note.element ? [note.element] : []);\n const references = [\n ...(page ? [{ key: `page:${page}`, label: page }] : []),\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 <Reply note={note} />\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 const addAll = (values: unknown) => {\n if (!values || typeof values !== 'object' || Array.isArray(values)) return;\n for (const [name, value] of Object.entries(values)) {\n if (typeof value === 'string' || typeof value === 'number') tags.push({ name, value: String(value) });\n }\n };\n addAll(playground);\n if (!tags.length) {\n // Hosts file picks as an object, or as the comma lists the overlay writes.\n addAll(payload.variants);\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 // Same row as every other note: the text, then compact tags for the picks.\n return <>\n <p>{note.feedback}</p>\n <Reply note={note} />\n {(page || tags.length > 0) && <span className=\"isotone-meta\">\n {page && <SummaryTag label={page} />}\n {tags.slice(0, 3).map(tag => <SummaryTag key={`${tag.name}-${tag.value}`} label={`${tag.name} ${tag.value}`} />)}\n {tags.length > 3 && <span className=\"isotone-request-more\">+{tags.length - 3}</span>}\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 // An on-screen keyboard lifts the dock through the root's own style (viewport.ts).\n const lifted = new MutationObserver(measure);\n lifted.observe(root, { attributes: true, attributeFilter: ['style'] });\n reduced?.addEventListener('change', measure);\n window.addEventListener('resize', measure);\n return () => {\n observer?.disconnect();\n mutations.disconnect();\n lifted.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","/**\n * Instructional copy shown in the panel while selecting, for a hovering pointer\n * and for touch. Hints are never truncated: each one fits on a single line at\n * a 375px-wide viewport, so keep new copy within the same length.\n * `tests/react-hints.test.ts` holds the budget.\n */\nexport const HINTS = {\n /** The select-mode cover over the docked composer: what to do, then how to pause. */\n picking: {\n pointer: { title: 'Click elements on the page', pause: 'Hold ⇧ to use the page' },\n touch: { title: 'Tap elements on the page', pause: 'Tap Done to use the page' },\n },\n /** The floating composer beside a pinned element, while still selecting. */\n floating: {\n pointer: 'Click to pin more · ⇧ uses the page',\n touch: 'Tap to pin more · crosshair pauses',\n },\n} as const;\n","import { useEffect, type RefObject } from 'react';\n\n/**\n * Small screens and touch. A phone shows one panel at a time, and an on-screen\n * keyboard covers the bottom of the layout viewport without resizing it, so\n * the dock and the floating composer measure what is actually visible.\n */\nconst COMPACT_QUERY = '(max-width: 640px), (max-height: 500px)';\nconst TOUCH_QUERY = '(hover: none) and (pointer: coarse)';\n/** Less than this is browser chrome settling, not a keyboard. */\nconst KEYBOARD_MIN = 80;\n\nfunction media(query: string): boolean {\n return typeof matchMedia === 'function' && Boolean(matchMedia(query)?.matches);\n}\n/** Too small for the variants and feedback panels to be open together. */\nexport function isCompactViewport(): boolean {\n return media(COMPACT_QUERY);\n}\n/** A first guess before any press; the panel then follows the last pointer used. */\nexport function prefersTouch(): boolean {\n return media(TOUCH_QUERY);\n}\n\nexport interface VisibleBand {\n top: number;\n bottom: number;\n}\n/**\n * The rows of the layout viewport that can be seen, in client coordinates:\n * everything, or the part above an on-screen keyboard. Pinch zoom is left\n * alone; fixed elements are not meant to follow it.\n */\nexport function visibleBand(): VisibleBand {\n const viewport = typeof window !== 'undefined' ? window.visualViewport : null;\n if (!viewport || Math.abs(viewport.scale - 1) > 0.01 || innerHeight - viewport.height < KEYBOARD_MIN)\n return { top: 0, bottom: innerHeight };\n return { top: viewport.offsetTop, bottom: viewport.offsetTop + viewport.height };\n}\n\n/**\n * Keep the dock above an on-screen keyboard: `--iso-keyboard` lifts it and\n * `--iso-viewport` bounds its height while one is open.\n */\nexport function useKeyboardInset(ref: RefObject<HTMLElement | null>, active: boolean) {\n useEffect(() => {\n const node = ref.current;\n const viewport = typeof window !== 'undefined' ? window.visualViewport : null;\n if (!active || !node || !viewport) return;\n let frame = 0;\n const apply = () => {\n frame = 0;\n const band = visibleBand();\n if (band.top === 0 && band.bottom === innerHeight) {\n node.style.removeProperty('--iso-keyboard');\n node.style.removeProperty('--iso-viewport');\n return;\n }\n node.style.setProperty('--iso-keyboard', `${Math.max(0, Math.round(innerHeight - band.bottom))}px`);\n node.style.setProperty('--iso-viewport', `${Math.round(band.bottom - band.top)}px`);\n };\n const schedule = () => { frame ||= requestAnimationFrame(apply); };\n apply();\n viewport.addEventListener('resize', schedule);\n viewport.addEventListener('scroll', schedule);\n return () => {\n cancelAnimationFrame(frame);\n viewport.removeEventListener('resize', schedule);\n viewport.removeEventListener('scroll', schedule);\n node.style.removeProperty('--iso-keyboard');\n node.style.removeProperty('--iso-viewport');\n };\n }, [ref, active]);\n}\n","import { createRoot } from 'react-dom/client';\n\nimport { createIterationStore, type RouteGateOptions } from '../core/index';\nimport {\n createOverlayVariantsSource,\n axisSection,\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. `'knobs'` is the same adapter for a server that has knobs but no\n * file variants (`isotone serve`), and its empty list says so. With neither\n * this nor `endpoint`, nothing mounts.\n */\n variants?: VariantsSource | 'overlay' | 'knobs';\n /** Where `'overlay'` reads variants and knobs. Defaults to the Vite plugin's\n * same-origin endpoint; `isotone serve` passes its own absolute URL. */\n variantsEndpoint?: string;\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 */\n/** `isotone serve` cannot swap files, so its empty list asks for knobs. */\nconst KNOBS_EMPTY_TEXT = 'No knobs on this page yet. Ask your agent to add knobs for this page to .isotone/knobs.json and they will appear here.';\n\nexport function mountIteration(opts: MountIterationOptions): () => void {\n const getRoute = opts.getRoute ?? (() => window.location.pathname);\n const variants =\n opts.variants === 'overlay' || opts.variants === 'knobs'\n ? overlaySourceWithSave(getRoute, opts.endpoint, opts.key, opts.variantsEndpoint)\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 variantsEmptyText={opts.variants === 'knobs' ? KNOBS_EMPTY_TEXT : undefined}\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 variantsEndpoint = VARIANTS_ENDPOINT,\n): VariantsSource {\n const source = createOverlayVariantsSource({ endpoint: variantsEndpoint, 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 ride in their own clause below, whatever their kind.\n .filter((axis) => (axis.kind === undefined || axis.kind === 'select') && !source.knobs.axes.includes(axis))\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 // A section the selector sits in leads the name, as the panel groups it.\n const selector = axisSection(axis).fullLabel;\n const named = selector === label || axis.label === label ? label : `${selector}: ${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) => `${axisSection(m.axis).fullLabel} ${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","useId","useLayoutEffect","useMemo","useRef","useState","useRef","useRef","media","Fragment","jsx","jsxs","useState","useEffect","useMemo","selections","shown","sections","useRef","useLayoutEffect","Icon","useId","media","Fragment","jsx","jsxs","useLayoutEffect","useLayoutEffect","animation","useEffect","jsx","jsxs","useState","useRef","useEffect","useId","useLayoutEffect","useMemo","feedback","Icon","jsx"]}
|