@zovaris/sephiro 0.8.0 → 0.9.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/dist/components.css +209 -25
- package/dist/index.css +209 -25
- package/dist/index.d.ts +34 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +65 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["clamp","decimalsOf","readableLabel","resolveActive","SonnerToaster","isEmpty"],"sources":["../src/lib/node.ts","../src/lib/overlay.ts","../src/lib/presence.ts","../src/atoms/AnimatedNumber/index.tsx","../src/atoms/Avatar/index.tsx","../src/atoms/Badge/index.tsx","../src/atoms/Spinner/index.tsx","../src/atoms/Button/index.tsx","../src/atoms/Checkbox/index.tsx","../src/atoms/IconButton/index.tsx","../src/atoms/Input/index.tsx","../src/atoms/Kbd/index.tsx","../src/atoms/Progress/index.tsx","../src/atoms/ScrollArea/index.tsx","../src/atoms/Separator/index.tsx","../src/atoms/Skeleton/index.tsx","../src/atoms/Slider/index.tsx","../src/atoms/Surface/index.tsx","../src/atoms/Textarea/index.tsx","../src/atoms/Toggle/index.tsx","../src/molecules/Accordion/index.tsx","../src/molecules/Alert/index.tsx","../src/molecules/Attachment/index.tsx","../src/molecules/AvatarGroup/index.tsx","../src/molecules/Breadcrumb/index.tsx","../src/molecules/Calendar/index.tsx","../src/molecules/Card/index.tsx","../src/molecules/Collapsible/index.tsx","../src/lib/filter.ts","../src/lib/highlight.tsx","../src/molecules/Combobox/index.tsx","../src/molecules/Menu/MenuContent.tsx","../src/molecules/ContextMenu/index.tsx","../src/lib/focus.ts","../src/molecules/Dialog/index.tsx","../src/molecules/Drawer/index.tsx","../src/molecules/FieldMessage/index.tsx","../src/molecules/Field/index.tsx","../src/molecules/Popover/focusFlow.ts","../src/molecules/Popover/trigger.ts","../src/molecules/HoverCard/index.tsx","../src/molecules/Menu/index.tsx","../src/molecules/OTPInput/index.tsx","../src/molecules/Pagination/index.tsx","../src/molecules/Popover/index.tsx","../src/molecules/QuestionCard/index.tsx","../src/molecules/RadioGroup/index.tsx","../src/molecules/Reveal/index.tsx","../src/molecules/Select/index.tsx","../src/molecules/Stat/index.tsx","../src/molecules/Tabs/index.tsx","../src/molecules/TaskList/index.tsx","../src/molecules/Timeline/index.tsx","../src/molecules/Toast/index.tsx","../src/molecules/Toolbar/index.tsx","../src/molecules/Tooltip/controller.ts","../src/molecules/Tooltip/index.tsx","../src/organisms/Chart/scale.ts","../src/organisms/Chart/index.tsx","../src/organisms/CommandPalette/index.tsx","../src/organisms/EmptyState/index.tsx","../src/organisms/MagneticDropzone/index.tsx","../src/organisms/Menubar/index.tsx","../src/organisms/ReasoningSteps/index.tsx","../src/organisms/Resizable/index.tsx","../src/organisms/Sidebar/index.tsx","../src/organisms/StreamingText/index.tsx","../src/organisms/Table/rows.ts","../src/organisms/Table/index.tsx","../src/atoms/StatusMark/index.tsx","../src/atoms/Timestamp/index.tsx","../src/atoms/NumberInput/index.tsx","../src/atoms/HoldButton/index.tsx","../src/molecules/SegmentedControl/index.tsx","../src/molecules/Stepper/index.tsx","../src/molecules/MetadataList/index.tsx","../src/molecules/OverflowList/index.tsx","../src/molecules/Citation/index.tsx","../src/molecules/ToolCalls/index.tsx","../src/molecules/PlanCard/index.tsx","../src/organisms/ChatScroller/index.tsx"],"sourcesContent":["export type RenderableElement = {\n type: any;\n props: any;\n key?: any;\n};\n\nexport type Renderable =\n | string\n | number\n | boolean\n | null\n | undefined\n | Iterable<Renderable>\n | RenderableElement;\n\nexport const node = (value: unknown): any => value;\n","import type { RefObject } from \"react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nexport type OverlaySide = \"top\" | \"bottom\" | \"left\" | \"right\";\nexport type OverlayAlign = \"start\" | \"center\" | \"end\";\n\nexport type OverlayRect = {\n left: number;\n top: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n};\n\nexport type OverlayPosition = {\n left: number;\n top: number;\n side: OverlaySide;\n};\n\nexport type OverlayPlacement = {\n /** Preferred side of the trigger the overlay sits on. Default: bottom. */\n side?: OverlaySide;\n /** Cross-axis alignment for top/bottom placements. Default: start. */\n align?: OverlayAlign;\n /** Gap between trigger and overlay. */\n offset?: number;\n /** Distance kept from every viewport edge while clamping. */\n padding?: number;\n /** Match the trigger's width (listboxes that mirror their field). */\n matchWidth?: boolean;\n};\n\ntype ResolvedPlacement = {\n side: OverlaySide;\n align: OverlayAlign;\n offset: number;\n padding: number;\n};\n\n/**\n * Layout effects are skipped on the server so static rendering of an open\n * overlay never warns.\n */\nexport const useIsoLayoutEffect =\n typeof document === \"undefined\" ? useEffect : useLayoutEffect;\n\nfunction clamp(value: number, min: number, max: number): number {\n const low = Math.min(min, max);\n const high = Math.max(min, max);\n return Math.min(Math.max(value, low), high);\n}\n\n/**\n * Pure placement math: flip to the side with room, align, then clamp inside\n * the viewport so nothing escapes a window, dock, or small screen.\n */\nexport function resolvePlacement(\n trigger: OverlayRect,\n content: { width: number; height: number },\n viewport: { width: number; height: number },\n placement: ResolvedPlacement,\n): OverlayPosition {\n const { side: wanted, align, offset, padding } = placement;\n let side = wanted;\n\n if (side === \"left\" || side === \"right\") {\n const need = content.width + offset + padding;\n const roomLeft = trigger.left - padding;\n const roomRight = viewport.width - trigger.right - padding;\n if (side === \"left\" && roomLeft < need && roomRight > roomLeft)\n side = \"right\";\n else if (side === \"right\" && roomRight < need && roomLeft > roomRight)\n side = \"left\";\n } else {\n const need = content.height + offset + padding;\n const roomBelow = viewport.height - trigger.bottom - padding;\n const roomAbove = trigger.top - padding;\n if (side === \"bottom\" && roomBelow < need && roomAbove > roomBelow)\n side = \"top\";\n else if (side === \"top\" && roomAbove < need && roomBelow > roomAbove)\n side = \"bottom\";\n }\n\n let left: number;\n let top: number;\n\n if (side === \"bottom\" || side === \"top\") {\n top =\n side === \"bottom\"\n ? trigger.bottom + offset\n : trigger.top - content.height - offset;\n left =\n align === \"start\"\n ? trigger.left\n : align === \"end\"\n ? trigger.right - content.width\n : trigger.left + (trigger.width - content.width) / 2;\n } else {\n left =\n side === \"right\"\n ? trigger.right + offset\n : trigger.left - content.width - offset;\n top = trigger.top + (trigger.height - content.height) / 2;\n }\n\n left = clamp(left, padding, viewport.width - content.width - padding);\n top = clamp(top, padding, viewport.height - content.height - padding);\n\n return { left: Math.round(left), top: Math.round(top), side };\n}\n\n/** Where the entrance should grow from: the corner touching the trigger. */\nexport function overlayOrigin(side: OverlaySide, align: OverlayAlign): string {\n if (side === \"left\") return \"right center\";\n if (side === \"right\") return \"left center\";\n const edge = side === \"bottom\" ? \"top\" : \"bottom\";\n if (align === \"center\") return `${edge} center`;\n return `${edge} ${align === \"start\" ? \"left\" : \"right\"}`;\n}\n\nconst SCOPE_ATTRIBUTES = [\n \"data-sephiro-motion\",\n \"data-sephiro-theme\",\n \"data-theme\",\n \"dir\",\n] as const;\n\nexport type OverlayScopeAttribute = (typeof SCOPE_ATTRIBUTES)[number];\n\nexport type OverlayScope = {\n attributes: Partial<Record<OverlayScopeAttribute, string>>;\n tokens: Record<string, string>;\n};\n\nconst TOKEN_PREFIX = \"--sph-\";\nconst MOTION_OFF_TOKENS = new Set([\n \"--sph-motion-fast\",\n \"--sph-motion-normal\",\n \"--sph-motion-slow\",\n \"--sph-motion-stagger\",\n]);\nconst copiedTokens = new WeakMap<object, string[]>();\n\nfunction readTokens(\n element: Element,\n tokens: OverlayScope[\"tokens\"],\n motionOff: boolean,\n): void {\n const { style } = element as Partial<ElementCSSInlineStyle>;\n if (!style) return;\n for (let index = 0; index < style.length; index += 1) {\n const name = style.item(index);\n if (!name.startsWith(TOKEN_PREFIX) || name in tokens) continue;\n if (motionOff && MOTION_OFF_TOKENS.has(name)) continue;\n const value = style.getPropertyValue(name).trim();\n if (value) tokens[name] = value;\n }\n}\n\nexport function resolveScope(source: Element | null): OverlayScope {\n const attributes: OverlayScope[\"attributes\"] = {};\n const tokens: OverlayScope[\"tokens\"] = {};\n if (!source) return { attributes, tokens };\n\n for (const name of SCOPE_ATTRIBUTES) {\n const value = source.closest(`[${name}]`)?.getAttribute(name);\n if (value) attributes[name] = value;\n }\n\n let motionOff = false;\n for (\n let element: Element | null = source;\n element;\n element = element.parentElement\n ) {\n readTokens(element, tokens, motionOff);\n if (element.hasAttribute(\"data-sephiro-theme\")) break;\n if (element.getAttribute(\"data-sephiro-motion\") === \"off\") motionOff = true;\n }\n\n return { attributes, tokens };\n}\n\nexport function inheritScope(\n source: Element | null,\n target: HTMLElement | null,\n): void {\n if (!target) return;\n const { attributes, tokens } = resolveScope(source);\n\n for (const name of SCOPE_ATTRIBUTES) {\n const value = attributes[name];\n if (value) target.setAttribute(name, value);\n else target.removeAttribute(name);\n }\n\n for (const name of copiedTokens.get(target) ?? []) {\n if (!(name in tokens)) target.style.removeProperty(name);\n }\n for (const [name, value] of Object.entries(tokens)) {\n target.style.setProperty(name, value);\n }\n copiedTokens.set(target, Object.keys(tokens));\n}\n\nexport const inheritMotionScope = inheritScope;\n\n/**\n * True once the tree may render into `document.body`. Server renders and the\n * first client render keep markup identical (the overlay simply mounts later),\n * then the portal switches on in a layout effect, before the browser paints.\n */\nexport function usePortaled(): boolean {\n const [portaled, setPortaled] = useState(false);\n useIsoLayoutEffect(() => {\n setPortaled(true);\n }, []);\n return portaled;\n}\n\n/**\n * Measures trigger and content, then pins the overlay to fixed coordinates.\n * Flips, clamps, and re-measures on scroll (capture, so inner scrollers\n * count) and resize while active.\n */\nexport function useOverlayPosition<E extends HTMLElement>(\n triggerRef: RefObject<HTMLElement | null>,\n contentRef: RefObject<E | null>,\n active: boolean,\n placement: OverlayPlacement = {},\n): void {\n const {\n side = \"bottom\",\n align = \"start\",\n offset = 4,\n padding = 8,\n matchWidth = false,\n } = placement;\n const frameRef = useRef<number | null>(null);\n\n useIsoLayoutEffect(() => {\n if (!active) return;\n\n const update = () => {\n frameRef.current = null;\n const trigger = triggerRef.current;\n const content = contentRef.current;\n if (!trigger || !content) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n if (matchWidth)\n content.style.width = `${Math.round(triggerRect.width)}px`;\n\n content.style.position = \"fixed\";\n const contentSize = {\n width: content.offsetWidth,\n height: content.offsetHeight,\n };\n\n const resolved = resolvePlacement(\n triggerRect,\n contentSize,\n { width: window.innerWidth, height: window.innerHeight },\n { side, align, offset, padding },\n );\n\n const style = content.style;\n style.left = `${resolved.left}px`;\n style.top = `${resolved.top}px`;\n style.right = \"auto\";\n style.bottom = \"auto\";\n style.translate = \"none\";\n style.transformOrigin = overlayOrigin(resolved.side, align);\n content.dataset.side = resolved.side;\n };\n\n const schedule = () => {\n if (frameRef.current === null)\n frameRef.current = requestAnimationFrame(update);\n };\n\n inheritMotionScope(triggerRef.current, contentRef.current);\n update();\n window.addEventListener(\"resize\", schedule);\n document.addEventListener(\"scroll\", schedule, {\n capture: true,\n passive: true,\n });\n return () => {\n window.removeEventListener(\"resize\", schedule);\n document.removeEventListener(\"scroll\", schedule, { capture: true });\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n };\n }, [\n active,\n align,\n matchWidth,\n offset,\n padding,\n side,\n contentRef,\n triggerRef,\n ]);\n}\n","import type { RefObject } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport type MotionSpeed = \"fast\" | \"normal\" | \"slow\";\n\nconst SPEED_TOKEN: Record<MotionSpeed, string> = {\n fast: \"--sph-motion-fast\",\n normal: \"--sph-motion-normal\",\n slow: \"--sph-motion-slow\",\n};\n\n/** Extra time granted to an exit animation so React never cuts it short. */\nconst EXIT_FRAME_BUDGET = 40;\n\n/** Parses a CSS time string (\"180ms\", \"0.18s\", \"0ms\") into milliseconds. */\nexport function parseDurationMs(value: string): number {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)(ms|s)?$/);\n if (!match) return 0;\n const amount = Number.parseFloat(match[1]);\n if (!Number.isFinite(amount) || amount <= 0) return 0;\n return match[2] === \"s\" ? amount * 1000 : amount;\n}\n\n/**\n * Reads the motion token in effect for an element, honouring theme\n * overrides, `prefers-reduced-motion`, and `data-sephiro-motion=\"off\"`.\n * Returns 0 when there is nothing to wait for.\n */\nexport function motionDurationMs(\n element: HTMLElement | null,\n speed: MotionSpeed,\n): number {\n if (typeof window === \"undefined\" || typeof getComputedStyle !== \"function\")\n return 0;\n const source = element ?? document.documentElement;\n const raw = getComputedStyle(source).getPropertyValue(SPEED_TOKEN[speed]);\n return Math.min(parseDurationMs(raw || \"0ms\"), 1200);\n}\n\nexport type Presence<E extends HTMLElement = HTMLElement> = {\n /** Keep rendering the overlay while its exit animation plays. */\n present: boolean;\n /** True once the overlay has begun leaving; drive exit styles with it. */\n leaving: boolean;\n /** `open` while settled, `closed` once leaving. */\n state: \"open\" | \"closed\";\n /** Attach to the overlay element so its exit duration can be measured. */\n ref: RefObject<E | null>;\n};\n\n/**\n * Holds an overlay mounted for exactly as long as its exit animation runs.\n *\n * Enter animations replay on mount, so the component only needs to render\n * while `present` and style itself with `state`:\n *\n * ```tsx\n * const { present, state, ref } = usePresence(open, \"fast\");\n * return present ? <div ref={ref} data-state={state} /> : null;\n * ```\n */\nexport function usePresence<E extends HTMLElement = HTMLElement>(\n open: boolean,\n speed: MotionSpeed = \"normal\",\n): Presence<E> {\n const ref = useRef<E | null>(null);\n const [present, setPresent] = useState(open);\n const [leaving, setLeaving] = useState(false);\n\n useEffect(() => {\n if (open) {\n setLeaving(false);\n setPresent(true);\n return;\n }\n if (!present) return;\n const duration = motionDurationMs(ref.current, speed);\n if (duration <= 0) {\n setPresent(false);\n return;\n }\n setLeaving(true);\n const timer = setTimeout(() => {\n setPresent(false);\n setLeaving(false);\n }, duration + EXIT_FRAME_BUDGET);\n return () => clearTimeout(timer);\n }, [open, present, speed]);\n\n return {\n present,\n leaving,\n state: leaving ? \"closed\" : \"open\",\n ref,\n };\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\nimport { motionDurationMs } from \"@/lib/presence.js\";\n\nexport type AnimatedNumberProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\"\n> & {\n value: number;\n from?: number;\n duration?: number;\n format?: (value: number) => string;\n};\n\nconst decimalsOf = (value: number) => {\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.min(fraction.length, 3);\n};\n\nexport function AnimatedNumber({\n value,\n from,\n duration = 700,\n format,\n className,\n ...props\n}: AnimatedNumberProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const shownRef = useRef<number>(from ?? value);\n const [display, setDisplay] = useState(value);\n const precision = decimalsOf(value);\n\n useIsoLayoutEffect(() => {\n const target = value;\n const start = shownRef.current;\n if (start === target) return;\n shownRef.current = target;\n if (duration <= 0 || motionDurationMs(ref.current, \"normal\") <= 0) {\n setDisplay(target);\n return;\n }\n const begun = performance.now();\n let frame = 0;\n const tick = (now: number) => {\n const progress = Math.min(1, (now - begun) / duration);\n const eased = 1 - (1 - progress) ** 3;\n const current = start + (target - start) * eased;\n shownRef.current = progress < 1 ? current : target;\n setDisplay(shownRef.current);\n if (progress < 1) frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [value, duration]);\n\n return (\n <span\n {...node(props)}\n ref={ref}\n className={cn(\"sph-animated-number\", className)}\n >\n {format\n ? format(display)\n : precision > 0\n ? display.toFixed(precision)\n : String(Math.round(display))}\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\n\nexport type AvatarProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n /** Image URL. Falls back to `name` initials when it fails to load. */\n src?: string;\n name?: string;\n size?: ControlSize;\n status?: AvatarStatus;\n};\n\nfunction initialsOf(name: string | undefined): string {\n if (!name) return \"?\";\n const words = name.trim().split(/\\s+/).slice(0, 2);\n return words.map((word) => word[0]?.toUpperCase() ?? \"\").join(\"\") || \"?\";\n}\n\nexport function Avatar({\n src,\n name,\n size = \"md\",\n status,\n className,\n ...props\n}: AvatarProps) {\n const [failed, setFailed] = useState(false);\n const showImage = Boolean(src) && !failed;\n\n return (\n <span\n {...node(props)}\n className={cn(\"sph-avatar\", className)}\n data-size={size}\n title={name}\n >\n {showImage ? (\n <img\n className=\"sph-avatar__image\"\n src={src}\n alt={name ?? \"\"}\n onError={() => setFailed(true)}\n />\n ) : (\n <span className=\"sph-avatar__initials\" aria-hidden=\"true\">\n {initialsOf(name)}\n </span>\n )}\n {status !== undefined && (\n <span\n className=\"sph-avatar__status\"\n data-status={status}\n aria-hidden=\"true\"\n />\n )}\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type BadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n variant?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n size?: ControlSize;\n children?: Renderable;\n};\n\nexport function Badge({\n variant = \"neutral\",\n size = \"sm\",\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-badge\", className)}\n data-variant={variant}\n data-size={size}\n >\n {node(children)}\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SpinnerProps = HTMLAttributes<HTMLSpanElement> & {\n size?: ControlSize;\n label?: string;\n};\n\nexport function Spinner({\n size = \"md\",\n label,\n className,\n ...props\n}: SpinnerProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-spinner\", `sph-spinner--${size}`, className)}\n role={label ? \"status\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes, MouseEvent } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type ButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n variant?: \"primary\" | \"secondary\" | \"quiet\";\n size?: ControlSize;\n loading?: boolean;\n children?: Renderable;\n};\n\nexport function Button({\n variant = \"secondary\",\n size = \"md\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n children,\n onClick,\n \"aria-busy\": ariaBusy,\n \"aria-disabled\": ariaDisabled,\n ...props\n}: ButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n return (\n <button\n type={type}\n className={cn(\"sph-button\", className)}\n data-variant={variant}\n data-size={size}\n data-loading={loading || undefined}\n disabled={disabled}\n {...node(props)}\n aria-busy={ariaBusy ?? (loading || undefined)}\n aria-disabled={loading ? true : ariaDisabled}\n onClick={handleClick}\n >\n <span className=\"sph-button__label\">{node(children)}</span>\n {loading && (\n <span className=\"sph-button__spinner\">\n <Spinner size=\"sm\" />\n </span>\n )}\n </button>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type CheckboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> & {\n label?: Renderable;\n size?: ControlSize;\n invalid?: boolean;\n};\n\nexport function Checkbox({\n label,\n size = \"md\",\n invalid = false,\n className,\n ...props\n}: CheckboxProps) {\n const control = (\n <input\n {...node(props)}\n type=\"checkbox\"\n className=\"sph-checkbox__input\"\n data-size={size}\n aria-invalid={invalid ? true : props[\"aria-invalid\"]}\n />\n );\n\n return (\n <label className={cn(\"sph-checkbox\", className)} data-size={size}>\n {control}\n <span className=\"sph-checkbox__box\" aria-hidden=\"true\">\n <CheckIcon className=\"sph-checkbox__check\" />\n </span>\n {label !== undefined && (\n <span className=\"sph-checkbox__label\">{node(label)}</span>\n )}\n </label>\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes, MouseEvent } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n icon: Renderable;\n label: string;\n size?: ControlSize;\n variant?: \"ghost\" | \"solid\" | \"outline\";\n loading?: boolean;\n};\n\nexport function IconButton({\n icon,\n label,\n size = \"md\",\n variant = \"ghost\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n onClick,\n ...props\n}: IconButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n return (\n <button\n {...node(props)}\n type={type}\n className={cn(\"sph-icon-button\", className)}\n data-size={size}\n data-variant={variant}\n data-loading={loading || undefined}\n aria-label={label}\n aria-busy={loading ? true : props[\"aria-busy\"]}\n aria-disabled={loading ? true : props[\"aria-disabled\"]}\n disabled={disabled}\n onClick={handleClick}\n >\n <span className=\"sph-icon-button__icon\">{node(icon)}</span>\n {loading && (\n <span className=\"sph-icon-button__spinner\">\n <Spinner size={size === \"lg\" ? \"md\" : \"sm\"} />\n </span>\n )}\n </button>\n );\n}\n","import { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Input({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: InputProps) {\n return (\n <input\n {...node(props)}\n className={cn(\"sph-input\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type KbdProps = {\n /**\n * Key caps to render. An array draws one cap per entry (`[\"⌘\", \"K\"]`);\n * a single value draws one cap (`\"Esc\"`).\n */\n keys: Renderable;\n className?: string;\n};\n\nexport function Kbd({ keys, className }: KbdProps) {\n const caps = Array.isArray(keys) ? keys : [keys];\n return (\n <kbd className={cn(\"sph-kbd\", className)}>\n {caps.map((cap, index) => (\n <kbd key={index} className=\"sph-kbd__key\">\n {node(cap)}\n </kbd>\n ))}\n </kbd>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ProgressProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** Completion from 0 to 100. Omit it for the indeterminate sweep. */\n value?: number;\n label?: string;\n size?: ControlSize;\n};\n\nexport function Progress({\n value,\n label,\n size = \"md\",\n className,\n ...props\n}: ProgressProps) {\n const determinate = typeof value === \"number\" && Number.isFinite(value);\n const clamped = determinate\n ? Math.min(Math.max(value as number, 0), 100)\n : undefined;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-progress\", className)}\n data-size={size}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={determinate ? 0 : undefined}\n aria-valuemax={determinate ? 100 : undefined}\n aria-valuenow={clamped}\n aria-valuetext={\n clamped !== undefined ? `${Math.round(clamped)}%` : undefined\n }\n >\n <span className=\"sph-progress__track\">\n <span\n className=\"sph-progress__bar\"\n data-indeterminate={determinate ? undefined : \"true\"}\n style={\n determinate\n ? ({ \"--sph-progress-value\": `${clamped}%` } as CSSProperties &\n Record<string, string | number>)\n : undefined\n }\n />\n </span>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type ScrollAreaProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n children?: Renderable;\n};\n\nexport function ScrollArea({\n orientation = \"vertical\",\n className,\n children,\n ...props\n}: ScrollAreaProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-scroll-area\", className)}\n data-orientation={orientation}\n >\n {node(children)}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SeparatorProps = Omit<HTMLAttributes<HTMLHRElement>, \"children\"> & {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n};\n\nexport function Separator({\n orientation = \"horizontal\",\n decorative = true,\n className,\n ...props\n}: SeparatorProps) {\n return (\n <hr\n {...node(props)}\n className={cn(\"sph-separator\", className)}\n data-orientation={orientation}\n role={decorative ? \"presentation\" : \"separator\"}\n aria-orientation={decorative ? undefined : orientation}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLSpanElement> & {\n width?: string | number;\n height?: string | number;\n};\n\nexport function Skeleton({\n width,\n height,\n className,\n style,\n \"aria-label\": ariaLabel,\n ...props\n}: SkeletonProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-skeleton\", className)}\n style={{ ...style, width, height }}\n role={ariaLabel ? \"img\" : undefined}\n aria-label={ariaLabel}\n aria-hidden={ariaLabel ? undefined : true}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, InputHTMLAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SliderProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"size\"\n | \"type\"\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"children\"\n | \"min\"\n | \"max\"\n | \"step\"\n> & {\n value: number;\n onValueChange: (value: number) => void;\n label: Renderable;\n min?: number;\n max?: number;\n step?: number;\n size?: ControlSize;\n valueLabel?: Renderable;\n invalid?: boolean;\n};\n\nexport function Slider({\n value,\n onValueChange,\n label,\n min = 0,\n max = 100,\n step = 1,\n size = \"md\",\n valueLabel,\n invalid = false,\n className,\n disabled,\n style,\n id,\n \"aria-label\": ariaLabel,\n \"aria-valuetext\": ariaValueText,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: SliderProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const range = max - min || 1;\n const progress = Math.min(100, Math.max(0, ((value - min) / range) * 100));\n const trackStyle = {\n ...style,\n \"--sph-slider-progress\": `${progress}%`,\n } as CSSProperties;\n\n return (\n <div\n className={cn(\"sph-slider\", className)}\n data-size={size}\n data-disabled={disabled || undefined}\n data-invalid={invalid || undefined}\n >\n <div className=\"sph-slider__head\">\n <label className=\"sph-slider__label\" htmlFor={inputId}>\n {node(label)}\n </label>\n {valueLabel !== undefined && (\n <output\n className=\"sph-slider__value\"\n htmlFor={inputId}\n aria-hidden=\"true\"\n >\n {node(valueLabel)}\n </output>\n )}\n </div>\n <input\n {...node(props)}\n id={inputId}\n type=\"range\"\n className=\"sph-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-valuetext={\n ariaValueText ??\n (typeof valueLabel === \"string\" ? valueLabel : undefined)\n }\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n style={trackStyle}\n onInput={(event) => onValueChange(Number(event.currentTarget.value))}\n />\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SurfaceProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children?: Renderable;\n tone?: \"base\" | \"elevated\" | \"raised\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n};\n\nexport function Surface({\n tone = \"base\",\n padding = \"md\",\n className,\n children,\n ...props\n}: SurfaceProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-surface\", className)}\n data-tone={tone}\n data-padding={padding}\n >\n {node(children)}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type TextareaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Textarea({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: TextareaProps) {\n return (\n <textarea\n {...node(props)}\n className={cn(\"sph-textarea\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToggleProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onChange\" | \"onClick\"\n> & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n label: string;\n size?: ControlSize;\n onClick?: (event: { preventDefault(): void }) => void;\n};\n\nexport function Toggle({\n checked,\n onCheckedChange,\n label,\n className,\n disabled,\n onClick,\n size = \"md\",\n \"aria-checked\": ariaChecked,\n \"aria-label\": ariaLabel = label,\n ...props\n}: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={ariaChecked ?? checked}\n aria-label={ariaLabel ?? label}\n disabled={disabled}\n className={cn(\"sph-toggle\", className)}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-size={size}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) onCheckedChange(!checked);\n }}\n {...node(props)}\n >\n {\" \"}\n <span className=\"sph-toggle__track\">\n <span className=\"sph-toggle__thumb\" />\n </span>\n </button>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type AccordionItem = {\n /** Identifies the panel across `value` and `defaultValue`. */\n value: string;\n trigger: Renderable;\n children?: Renderable;\n disabled?: boolean;\n};\n\nexport type AccordionProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"value\" | \"defaultValue\"\n> & {\n items: AccordionItem[];\n /** `single` (default) keeps one panel open; `multiple` allows many. */\n type?: \"single\" | \"multiple\";\n /** Controlled set of open panels. */\n value?: string[];\n /** Panels open on first render. */\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport function Accordion({\n items,\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n className,\n ...props\n}: AccordionProps) {\n const [uncontrolled, setUncontrolled] = useState<string[]>(\n defaultValue ?? [],\n );\n const open = value ?? uncontrolled;\n const baseId = useId();\n\n const toggle = (itemValue: string) => {\n const isOpen = open.includes(itemValue);\n const next = isOpen\n ? open.filter((v) => v !== itemValue)\n : type === \"single\"\n ? [itemValue]\n : [...open, itemValue];\n if (value === undefined) setUncontrolled(next);\n onValueChange?.(next);\n };\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-accordion\", className)}\n data-type={type}\n >\n {items.map((item, index) => {\n const isOpen = open.includes(item.value);\n const panelId = `${baseId}-panel-${index}`;\n return (\n <div\n key={item.value}\n className=\"sph-accordion__item\"\n data-state={isOpen ? \"open\" : \"closed\"}\n >\n <button\n type=\"button\"\n className=\"sph-accordion__trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.value)}\n >\n <span className=\"sph-accordion__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={13} weight=\"bold\" />\n </span>\n {node(item.trigger)}\n </button>\n <div className=\"sph-accordion__body\" id={panelId}>\n <div className=\"sph-accordion__inner\">{node(item.children)}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { motionDurationMs } from \"@/lib/presence.js\";\n\nexport type AlertProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"title\"\n> & {\n variant?: \"info\" | \"success\" | \"warning\" | \"danger\";\n title?: Renderable;\n children?: Renderable;\n dismissible?: boolean;\n onDismiss?: () => void;\n};\n\nconst alertIcons = {\n info: <InfoIcon size={16} />,\n success: <CheckIcon size={16} />,\n warning: <WarningIcon size={16} />,\n danger: <XIcon size={16} />,\n};\n\nexport function Alert({\n variant = \"info\",\n title,\n children,\n dismissible = false,\n onDismiss,\n className,\n role,\n ...props\n}: AlertProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [dismissing, setDismissing] = useState(false);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n const requestDismiss = () => {\n if (onDismiss === undefined || dismissing) return;\n const duration = motionDurationMs(rootRef.current, \"normal\");\n if (duration <= 0) {\n onDismiss();\n return;\n }\n setDismissing(true);\n timerRef.current = setTimeout(() => {\n setDismissing(false);\n onDismiss();\n }, duration + 40);\n };\n\n if (title === undefined && children === undefined) return null;\n\n return (\n <div\n ref={rootRef}\n {...node(props)}\n className={cn(\"sph-alert\", className)}\n data-variant={variant}\n data-state={dismissing ? \"closed\" : \"open\"}\n role={role ?? (variant === \"danger\" ? \"alert\" : \"status\")}\n aria-live={\n role ? undefined : variant === \"danger\" ? \"assertive\" : \"polite\"\n }\n >\n <span className=\"sph-alert__icon\" aria-hidden=\"true\">\n {alertIcons[variant]}\n </span>\n <div className=\"sph-alert__body\">\n {title !== undefined && (\n <p className=\"sph-alert__title\">{node(title)}</p>\n )}\n {children !== undefined && (\n <div className=\"sph-alert__content\">{node(children)}</div>\n )}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n className=\"sph-alert__dismiss\"\n aria-label=\"Dismiss notification\"\n onClick={requestDismiss}\n >\n <XIcon size={12} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n\nexport const Notice = Alert;\nexport type NoticeProps = AlertProps;\n","import {\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n ImageIcon,\n MusicNotesIcon,\n VideoIcon,\n XIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { motionDurationMs } from \"@/lib/presence.js\";\n\nexport type AttachmentStatus = \"uploading\" | \"done\" | \"error\";\n\nexport type AttachmentFile = {\n id: string;\n name: string;\n size: string;\n status?: AttachmentStatus;\n progress?: number;\n hint?: string;\n href?: string;\n};\n\nexport type AttachmentProps = {\n files: AttachmentFile[];\n onRemove?: (id: string) => void;\n ariaLabel?: string;\n className?: string;\n};\n\nconst IMAGE_EXT = [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"heic\"];\nconst VIDEO_EXT = [\"mp4\", \"mov\", \"webm\", \"mkv\"];\nconst AUDIO_EXT = [\"mp3\", \"wav\", \"ogg\", \"m4a\", \"flac\"];\nconst CODE_EXT = [\n \"js\",\n \"ts\",\n \"tsx\",\n \"jsx\",\n \"json\",\n \"html\",\n \"css\",\n \"yml\",\n \"yaml\",\n];\nconst DOC_EXT = [\"pdf\", \"doc\", \"docx\", \"txt\", \"rtf\", \"csv\"];\n\n/** Maps a filename extension to its phosphor icon component. */\nexport function iconForFile(name: string) {\n const parts = name.split(\".\");\n const ext = parts.length > 1 ? (parts.at(-1)?.toLowerCase() ?? \"\") : \"\";\n if (IMAGE_EXT.includes(ext)) return ImageIcon;\n if (VIDEO_EXT.includes(ext)) return VideoIcon;\n if (AUDIO_EXT.includes(ext)) return MusicNotesIcon;\n if (CODE_EXT.includes(ext)) return FileCodeIcon;\n if (DOC_EXT.includes(ext)) return FileTextIcon;\n return FileIcon;\n}\n\n/** Exit delay that lets the leave transition run before the row unmounts. */\n\nexport function Attachment({\n files,\n onRemove,\n ariaLabel = \"Attachments\",\n className,\n}: AttachmentProps) {\n const [leaving, setLeaving] = useState<string | null>(null);\n const timer = useRef<number | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n [],\n );\n\n const requestRemove = (id: string) => {\n if (!onRemove) return;\n if (timer.current !== null) window.clearTimeout(timer.current);\n const duration = motionDurationMs(listRef.current, \"normal\");\n if (duration <= 0) {\n setLeaving(null);\n onRemove(id);\n return;\n }\n setLeaving(id);\n timer.current = window.setTimeout(() => {\n onRemove(id);\n setLeaving(null);\n }, duration + 40);\n };\n\n return (\n <ul\n ref={listRef}\n className={cn(\"sph-attachment\", className)}\n aria-label={ariaLabel}\n >\n {files.map((file, index) => {\n const Icon = iconForFile(file.name);\n const uploading = file.status === \"uploading\";\n return (\n <li\n key={file.id}\n className=\"sph-attachment__row\"\n data-status={file.status ?? \"done\"}\n data-leaving={leaving === file.id || undefined}\n style={\n { \"--sph-motion-index\": index } as CSSProperties &\n Record<string, string | number>\n }\n >\n <span className=\"sph-attachment__icon\" aria-hidden=\"true\">\n <Icon size={16} />\n </span>\n\n <span className=\"sph-attachment__body\">\n {file.href ? (\n <a className=\"sph-attachment__name\" href={file.href} download>\n {file.name}\n </a>\n ) : (\n <span className=\"sph-attachment__name\">{file.name}</span>\n )}\n <span className=\"sph-attachment__size\">{file.size}</span>\n </span>\n\n {file.hint ? (\n <span className=\"sph-attachment__hint\">{file.hint}</span>\n ) : null}\n\n {uploading ? (\n <span\n className=\"sph-attachment__progress\"\n role=\"progressbar\"\n aria-label={`${file.name} upload`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={file.progress ?? 0}\n >\n <span\n style={\n {\n \"--sph-progress-value\": `${file.progress ?? 0}%`,\n } as CSSProperties & Record<string, string | number>\n }\n />\n </span>\n ) : null}\n {uploading ? (\n <span className=\"sph-attachment__pct\">{file.progress ?? 0}%</span>\n ) : null}\n\n {onRemove ? (\n <button\n type=\"button\"\n className=\"sph-attachment__remove\"\n aria-label={`Remove ${file.name}`}\n onClick={() => requestRemove(file.id)}\n >\n <XIcon size={13} />\n </button>\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { Avatar, type AvatarProps } from \"@/atoms/Avatar\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type AvatarGroupItem = Pick<AvatarProps, \"src\" | \"name\" | \"status\">;\n\nexport type AvatarGroupProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\"\n> & {\n avatars: AvatarGroupItem[];\n /** Avatars shown before collapsing the rest into a `+N` chip. */\n max?: number;\n size?: ControlSize;\n};\n\nexport function AvatarGroup({\n avatars,\n max = 4,\n size = \"md\",\n className,\n ...props\n}: AvatarGroupProps) {\n const shown = avatars.slice(0, Math.max(max, 1));\n const overflow = avatars.length - shown.length;\n\n return (\n <span {...node(props)} className={cn(\"sph-avatar-group\", className)}>\n {shown.map((avatar, index) => (\n <Avatar\n key={`${avatar.src ?? avatar.name ?? \"avatar\"}-${index}`}\n src={avatar.src}\n name={avatar.name}\n status={avatar.status}\n size={size}\n />\n ))}\n {overflow > 0 && (\n <span className=\"sph-avatar sph-avatar--overflow\" data-size={size}>\n +{overflow}\n </span>\n )}\n </span>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type BreadcrumbItem = {\n label: Renderable;\n /** Renders the crumb as a link. Wins over `onClick`. */\n href?: string;\n /** Renders the crumb as a button when there is no `href`. */\n onClick?: () => void;\n /** Leading icon shown before the label. */\n icon?: Renderable;\n};\n\nexport type BreadcrumbProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n items: BreadcrumbItem[];\n /** Separator drawn between crumbs. Defaults to a caret. */\n separator?: Renderable;\n /** Accessible name for the navigation landmark. */\n label?: string;\n};\n\nexport function Breadcrumb({\n items,\n separator,\n label = \"Breadcrumb\",\n className,\n ...props\n}: BreadcrumbProps) {\n return (\n <nav\n {...node(props)}\n className={cn(\"sph-breadcrumb\", className)}\n aria-label={label}\n >\n <ol className=\"sph-breadcrumb__list\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const content = (\n <>\n {item.icon !== undefined && (\n <span className=\"sph-breadcrumb__icon\" aria-hidden=\"true\">\n {node(item.icon)}\n </span>\n )}\n <span className=\"sph-breadcrumb__text\">{node(item.label)}</span>\n </>\n );\n\n return (\n <li key={`crumb-${index}`} className=\"sph-breadcrumb__item\">\n {isLast ? (\n <span className=\"sph-breadcrumb__current\" aria-current=\"page\">\n {content}\n </span>\n ) : item.href !== undefined ? (\n <a className=\"sph-breadcrumb__crumb\" href={item.href}>\n {content}\n </a>\n ) : item.onClick !== undefined ? (\n <button\n type=\"button\"\n className=\"sph-breadcrumb__crumb\"\n onClick={item.onClick}\n >\n {content}\n </button>\n ) : (\n <span className=\"sph-breadcrumb__crumb sph-breadcrumb__crumb--static\">\n {content}\n </span>\n )}\n {!isLast && (\n <span className=\"sph-breadcrumb__sep\" aria-hidden=\"true\">\n {separator !== undefined ? (\n node(separator)\n ) : (\n <CaretRightIcon size={11} weight=\"bold\" />\n )}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { CaretLeftIcon, CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\n\nexport type CalendarRange = { start: string | null; end: string | null };\n\nexport type CalendarProps = {\n /** Selected day as `YYYY-MM-DD`. */\n value?: string;\n onValueChange?: (value: string) => void;\n /** Displayed month as `YYYY-MM`. Uncontrolled pages keep their own state. */\n month?: string;\n onMonthChange?: (month: string) => void;\n /** Earliest / latest selectable day (inclusive), as `YYYY-MM-DD`. */\n min?: string;\n max?: string;\n /** First weekday: 0 = Sunday, 1 = Monday. Defaults to Monday. */\n weekStartsOn?: 0 | 1;\n mode?: \"single\" | \"range\";\n range?: CalendarRange;\n defaultRange?: CalendarRange;\n onRangeChange?: (range: CalendarRange) => void;\n months?: 1 | 2;\n ariaLabel?: string;\n className?: string;\n};\n\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst WEEKDAY_FULL = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconst pad = (value: number) => String(value).padStart(2, \"0\");\n\nexport function isLeapYear(year: number) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nexport function daysInMonth(month: string) {\n const [year, mon] = month.split(\"-\").map(Number);\n return mon === 2 && isLeapYear(year) ? 29 : DAYS_IN_MONTH[mon - 1];\n}\n\n/** Shifts a `YYYY-MM` month by a number of months, rolling the year over. */\nexport function shiftMonth(month: string, delta: number) {\n const [year, mon] = month.split(\"-\").map(Number);\n const index = mon - 1 + delta;\n const nextYear = year + Math.floor(index / 12);\n const nextMonth = ((index % 12) + 12) % 12;\n return `${nextYear}-${pad(nextMonth + 1)}`;\n}\n\n/** Shifts a `YYYY-MM-DD` day by a number of days (UTC math, timezone safe). */\nexport function shiftDay(day: string, delta: number) {\n const [year, mon, date] = day.split(\"-\").map(Number);\n const next = new Date(Date.UTC(year, mon - 1, date + delta));\n return `${next.getUTCFullYear()}-${pad(next.getUTCMonth() + 1)}-${pad(next.getUTCDate())}`;\n}\n\n/**\n * Grid cells for a month: leading blanks for the offset, then one\n * `YYYY-MM-DD` per day. Trailing cells are left to the CSS grid.\n */\nexport function monthGrid(month: string, weekStartsOn: 0 | 1) {\n const [year, mon] = month.split(\"-\").map(Number);\n const firstWeekday = new Date(Date.UTC(year, mon - 1, 1)).getUTCDay();\n const offset = (firstWeekday - weekStartsOn + 7) % 7;\n const cells: Array<string | null> = Array.from(\n { length: offset },\n () => null,\n );\n for (let day = 1; day <= daysInMonth(month); day++) {\n cells.push(`${month}-${pad(day)}`);\n }\n return cells;\n}\n\nexport function shiftMonthDay(day: string, delta: number) {\n const month = shiftMonth(day.slice(0, 7), delta);\n const date = Math.min(Number(day.slice(8, 10)), daysInMonth(month));\n return `${month}-${pad(date)}`;\n}\n\nfunction weekday(day: string) {\n const [year, mon, date] = day.split(\"-\").map(Number);\n return new Date(Date.UTC(year, mon - 1, date)).getUTCDay();\n}\n\nexport function weekEdge(\n day: string,\n weekStartsOn: 0 | 1,\n edge: \"start\" | \"end\",\n) {\n const offset = (weekday(day) - weekStartsOn + 7) % 7;\n return shiftDay(day, edge === \"start\" ? -offset : 6 - offset);\n}\n\nexport function selectRange(range: CalendarRange, day: string): CalendarRange {\n if (!range.start || range.end) return { start: day, end: null };\n return day < range.start\n ? { start: day, end: range.start }\n : { start: range.start, end: day };\n}\n\nexport function rangeSpan(\n range: CalendarRange,\n hover: string | null = null,\n): [string, string] | null {\n const { start, end } = range;\n if (!start) return null;\n const other = end ?? hover ?? start;\n return other < start ? [other, start] : [start, other];\n}\n\nfunction localToday() {\n const now = new Date();\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n}\n\nconst EMPTY_RANGE: CalendarRange = { start: null, end: null };\n\nexport function Calendar({\n value,\n onValueChange,\n month,\n onMonthChange,\n min,\n max,\n weekStartsOn = 1,\n mode = \"single\",\n range,\n defaultRange,\n onRangeChange,\n months = 1,\n ariaLabel = \"Calendar\",\n className,\n}: CalendarProps) {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const labelId = useId();\n const [paged, setPaged] = useState<string | null>(null);\n const [pendingFocus, setPendingFocus] = useState<string | null>(null);\n const [active, setActive] = useState<string | null>(null);\n const [hover, setHover] = useState<string | null>(null);\n const [innerRange, setInnerRange] = useState<CalendarRange>(\n defaultRange ?? EMPTY_RANGE,\n );\n\n const isRange = mode === \"range\";\n const currentRange = range ?? innerRange;\n const anchor = isRange ? currentRange.start : value;\n const viewMonth =\n month ?? paged ?? anchor?.slice(0, 7) ?? localToday().slice(0, 7);\n const today = localToday();\n const count = months === 2 ? 2 : 1;\n const visibleMonths = Array.from({ length: count }, (_, index) =>\n shiftMonth(viewMonth, index),\n );\n const lastMonth = visibleMonths[count - 1];\n const visible = (day: string) =>\n day.slice(0, 7) >= viewMonth && day.slice(0, 7) <= lastMonth;\n const blocked = (day: string) =>\n (min !== undefined && day < min) || (max !== undefined && day > max);\n\n const showMonth = (next: string) => {\n if (month === undefined) setPaged(next);\n onMonthChange?.(next);\n };\n\n const page = (delta: number) => showMonth(shiftMonth(viewMonth, delta));\n\n useEffect(() => {\n if (!pendingFocus) return;\n rootRef.current\n ?.querySelector<HTMLButtonElement>(`[data-date=\"${pendingFocus}\"]`)\n ?.focus();\n setPendingFocus(null);\n }, [pendingFocus, viewMonth]);\n\n const pending = isRange && !!currentRange.start && !currentRange.end;\n\n const focusDay = (target: string) => {\n let day = target;\n if (min !== undefined && day < min) day = min;\n if (max !== undefined && day > max) day = max;\n setActive(day);\n if (pending) setHover(day);\n if (!visible(day)) {\n showMonth(\n day.slice(0, 7) < viewMonth\n ? day.slice(0, 7)\n : shiftMonth(day.slice(0, 7), 1 - count),\n );\n }\n setPendingFocus(day);\n };\n\n const choose = (day: string) => {\n if (month === undefined && paged === null) setPaged(viewMonth);\n setActive(day);\n if (!isRange) {\n onValueChange?.(day);\n return;\n }\n const next = selectRange(currentRange, day);\n if (range === undefined) setInnerRange(next);\n onRangeChange?.(next);\n };\n\n const firstOpen = () => {\n for (const panel of visibleMonths) {\n for (const day of monthGrid(panel, weekStartsOn)) {\n if (day && !blocked(day)) return day;\n }\n }\n return null;\n };\n const tabbable =\n [active, anchor, isRange ? currentRange.end : null, today].find(\n (day): day is string => !!day && visible(day) && !blocked(day),\n ) ?? firstOpen();\n\n const span = isRange ? rangeSpan(currentRange, pending ? hover : null) : null;\n const committed = isRange && !pending ? rangeSpan(currentRange) : null;\n\n const weekdayLabels = Array.from(\n { length: 7 },\n (_, index) => WEEKDAY_LABELS[(weekStartsOn + index) % 7],\n );\n\n const renderDay = (day: string) => {\n const [dayYear, dayMon, dayDate] = day.split(\"-\").map(Number);\n const inSpan = !!span && day >= span[0] && day <= span[1];\n const isStart = inSpan && day === span?.[0];\n const isEnd = inSpan && day === span?.[1];\n const selected = isRange\n ? committed\n ? day >= committed[0] && day <= committed[1]\n : day === currentRange.start\n : value === day;\n const edges = [\n committed?.[0] === day || (pending && day === currentRange.start)\n ? \"range start\"\n : null,\n committed?.[1] === day ? \"range end\" : null,\n ].filter(Boolean);\n return (\n <button\n type=\"button\"\n role=\"gridcell\"\n key={day}\n data-date={day}\n data-today={day === today || undefined}\n data-in-range={inSpan || undefined}\n data-range-start={isStart || undefined}\n data-range-end={isEnd || undefined}\n data-preview={(inSpan && pending) || undefined}\n aria-selected={selected || undefined}\n aria-current={day === today ? \"date\" : undefined}\n tabIndex={day === tabbable ? 0 : -1}\n disabled={blocked(day)}\n onClick={() => choose(day)}\n onFocus={() => {\n setActive(day);\n if (pending) setHover(day);\n }}\n onMouseEnter={() => {\n if (pending) setHover(day);\n }}\n onKeyDown={(event) => {\n const step =\n event.key === \"ArrowLeft\"\n ? shiftDay(day, -1)\n : event.key === \"ArrowRight\"\n ? shiftDay(day, 1)\n : event.key === \"ArrowUp\"\n ? shiftDay(day, -7)\n : event.key === \"ArrowDown\"\n ? shiftDay(day, 7)\n : event.key === \"Home\"\n ? weekEdge(day, weekStartsOn, \"start\")\n : event.key === \"End\"\n ? weekEdge(day, weekStartsOn, \"end\")\n : event.key === \"PageUp\"\n ? shiftMonthDay(day, event.shiftKey ? -12 : -1)\n : event.key === \"PageDown\"\n ? shiftMonthDay(day, event.shiftKey ? 12 : 1)\n : null;\n if (!step) return;\n event.preventDefault();\n focusDay(step);\n }}\n >\n <span aria-hidden=\"true\">{dayDate}</span>\n <span className=\"sph-visually-hidden\">\n {`${WEEKDAY_FULL[weekday(day)]}, ${MONTH_LABELS[dayMon - 1]} ${dayDate}, ${dayYear}`}\n {edges.length ? `, ${edges.join(\" and \")}` : \"\"}\n </span>\n </button>\n );\n };\n\n const spacer = (\n <span className=\"sph-calendar__nav-spacer\" aria-hidden=\"true\" />\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-calendar\", className)}\n role=\"group\"\n aria-label={ariaLabel}\n data-mode={mode}\n data-months={count}\n >\n <div className=\"sph-calendar__months\" onMouseLeave={() => setHover(null)}>\n {visibleMonths.map((panelMonth, panelIndex) => {\n const [year, mon] = panelMonth.split(\"-\").map(Number);\n const cells = monthGrid(panelMonth, weekStartsOn);\n const rows: Array<Array<string | null>> = [];\n for (let index = 0; index < cells.length; index += 7) {\n rows.push(cells.slice(index, index + 7));\n }\n return (\n <div className=\"sph-calendar__month\" key={panelIndex}>\n <div className=\"sph-calendar__head\">\n {panelIndex === 0 ? (\n <button\n type=\"button\"\n className=\"sph-calendar__nav\"\n aria-label=\"Previous month\"\n onClick={() => page(-1)}\n >\n <CaretLeftIcon size={14} weight=\"bold\" />\n </button>\n ) : (\n spacer\n )}\n <span\n className=\"sph-calendar__label\"\n id={`${labelId}-${panelIndex}`}\n aria-live=\"polite\"\n >\n {MONTH_LABELS[mon - 1]} {year}\n </span>\n {panelIndex === count - 1 ? (\n <button\n type=\"button\"\n className=\"sph-calendar__nav\"\n aria-label=\"Next month\"\n onClick={() => page(1)}\n >\n <CaretRightIcon size={14} weight=\"bold\" />\n </button>\n ) : (\n spacer\n )}\n </div>\n\n <div className=\"sph-calendar__weekdays\" aria-hidden=\"true\">\n {weekdayLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n\n <div\n className=\"sph-calendar__grid\"\n role=\"grid\"\n key={panelMonth}\n aria-labelledby={`${labelId}-${panelIndex}`}\n aria-multiselectable={isRange || undefined}\n >\n {rows.map((row, rowIndex) => (\n <div className=\"sph-calendar__row\" role=\"row\" key={rowIndex}>\n {row.map((day, dayIndex) =>\n day === null ? (\n <span\n className=\"sph-calendar__blank\"\n role=\"gridcell\"\n key={`blank-${dayIndex}`}\n />\n ) : (\n renderDay(day)\n ),\n )}\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type CardProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title?: Renderable;\n description?: Renderable;\n header?: Renderable;\n footer?: Renderable;\n children?: Renderable;\n interactive?: boolean;\n selected?: boolean;\n};\n\nexport function Card({\n title,\n description,\n header,\n footer,\n children,\n interactive = false,\n selected = false,\n className,\n ...props\n}: CardProps) {\n const hasHeader =\n header !== undefined || title !== undefined || description !== undefined;\n\n return (\n <article\n {...node(props)}\n className={cn(\"sph-card\", className)}\n data-interactive={interactive || undefined}\n data-selected={selected || undefined}\n >\n {hasHeader && (\n <header className=\"sph-card__header\">\n {node(header)}\n {title !== undefined && (\n <h3 className=\"sph-card__title\">{node(title)}</h3>\n )}\n {description !== undefined && (\n <p className=\"sph-card__description\">{node(description)}</p>\n )}\n </header>\n )}\n {children !== undefined && (\n <div className=\"sph-card__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-card__footer\">{node(footer)}</footer>\n )}\n </article>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type CollapsibleProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n trigger: Renderable;\n children?: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n};\n\nexport function Collapsible({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n className,\n ...props\n}: CollapsibleProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const isOpen = open ?? uncontrolled;\n const contentId = `${useId()}-content`;\n\n const toggle = () => {\n if (disabled) return;\n const next = !isOpen;\n setUncontrolled(next);\n onOpenChange?.(next);\n };\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-collapsible\", className)}\n data-state={isOpen ? \"open\" : \"closed\"}\n >\n <button\n type=\"button\"\n className=\"sph-collapsible__trigger\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n disabled={disabled}\n onClick={toggle}\n >\n <span className=\"sph-collapsible__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={13} weight=\"bold\" />\n </span>\n {node(trigger)}\n </button>\n <div className=\"sph-collapsible__body\" id={contentId}>\n <div className=\"sph-collapsible__inner\">{node(children)}</div>\n </div>\n </div>\n );\n}\n","/**\n * Tiny subsequence matcher for command palettes — no dependencies.\n *\n * Characters of `query` must appear in `text` in order; matches that are\n * consecutive or sit on a word boundary score higher, so \"tmo\" ranks\n * \"Theme\" above \"Mute interface sounds\". Indexes are returned so callers\n * can highlight the matched characters.\n */\nexport type TextMatch = {\n score: number;\n /** Positions inside `text` that matched, in order. */\n indexes: number[];\n};\n\nexport function matchText(text: string, query: string): TextMatch | null {\n const needle = query.trim().toLowerCase();\n if (needle.length === 0) return { score: 0, indexes: [] };\n const haystack = text.toLowerCase();\n\n const indexes: number[] = [];\n let score = 0;\n let cursor = 0;\n\n for (const char of needle) {\n if (char === \" \") continue;\n const found = haystack.indexOf(char, cursor);\n if (found < 0) return null;\n indexes.push(found);\n\n if (found === 0) score += 6;\n const previous = found > 0 ? haystack[found - 1] : \"\";\n const previousIsBoundary = previous === \"\" || !/[a-z0-9]/.test(previous);\n if (previousIsBoundary) score += 4;\n if (found === cursor && indexes.length > 1) score += 2;\n score += 1;\n cursor = found + 1;\n }\n\n score -= Math.min(haystack.length - needle.length, 10) * 0.1;\n return { score, indexes };\n}\n\nexport type Filtered<T> = {\n item: T;\n /** Match positions within the item's own label, for highlighting. */\n indexes: number[];\n};\n\n/**\n * Filters `items` with `query`, preserving their original order.\n * `label` is matched first (its indexes drive highlighting); `keywords`\n * are a fallback that keeps an item visible without highlightable ranges.\n */\nexport function filterItems<T>(\n items: T[],\n query: string,\n read: (item: T) => { label: string; keywords?: string },\n): Filtered<T>[] {\n const trimmed = query.trim();\n if (trimmed.length === 0) return items.map((item) => ({ item, indexes: [] }));\n\n const results: Filtered<T>[] = [];\n for (const item of items) {\n const { label, keywords } = read(item);\n const onLabel = matchText(label, trimmed);\n if (onLabel) {\n results.push({ item, indexes: onLabel.indexes });\n continue;\n }\n if (keywords && matchText(keywords, trimmed)) {\n results.push({ item, indexes: [] });\n }\n }\n return results;\n}\n","import { node, type Renderable } from \"@/lib/node.js\";\n\n/**\n * Renders `text` with the given character positions wrapped in a `<mark>`.\n * Returns through `node()` so both React and Preact accept the result as a\n * component value despite their incompatible element types.\n */\nexport function Highlight({\n text,\n indexes,\n}: {\n text: string;\n indexes: number[];\n}) {\n if (indexes.length === 0) return node(text);\n const parts: Renderable[] = [];\n let cursor = 0;\n for (const position of indexes) {\n if (position > cursor) parts.push(text.slice(cursor, position));\n parts.push(\n <mark key={position} className=\"sph-match\">\n {text.slice(position, position + 1)}\n </mark>,\n );\n cursor = position + 1;\n }\n if (cursor < text.length) parts.push(text.slice(cursor));\n return node(parts);\n}\n","import {\n CaretDownIcon,\n CheckIcon,\n MagnifyingGlassIcon,\n XIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { filterItems } from \"@/lib/filter.js\";\nimport { Highlight } from \"@/lib/highlight.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ComboboxOption = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n /** Groups options under a heading; ungrouped options come first. */\n group?: string;\n /** Extra terms matched by the filter but never highlighted. */\n keywords?: string;\n};\n\nexport type ComboboxProps = {\n options: ComboboxOption[];\n /** Single-select value. Omit it and pass `values` for multi-select. */\n value?: string;\n /** Multi-select values; selecting keeps the popup open. */\n values?: string[];\n onValueChange?: (value: string) => void;\n onValuesChange?: (values: string[]) => void;\n placeholder?: Renderable;\n searchPlaceholder?: string;\n emptyMessage?: Renderable;\n disabled?: boolean;\n size?: ControlSize;\n id?: string;\n ariaLabel?: string;\n className?: string;\n};\n\ntype FlatOption = {\n option: ComboboxOption;\n indexes: number[];\n activeId: string;\n index: number;\n};\n\nfunction readableLabel(option: ComboboxOption): string {\n return typeof option.label === \"string\" ? option.label : \"\";\n}\n\nfunction resolveActive(options: FlatOption[], wanted: number): number {\n if (options.length === 0) return -1;\n const start = Math.min(Math.max(wanted, 0), options.length - 1);\n const enabled = (index: number) => !options[index]?.option.disabled;\n if (enabled(start)) return start;\n for (let index = start + 1; index < options.length; index += 1)\n if (enabled(index)) return index;\n for (let index = 0; index < start; index += 1)\n if (enabled(index)) return index;\n return start;\n}\n\nexport function Combobox({\n options,\n value,\n values,\n onValueChange,\n onValuesChange,\n placeholder = \"Select…\",\n searchPlaceholder = \"Search…\",\n emptyMessage = \"No matches.\",\n disabled = false,\n size = \"md\",\n id,\n ariaLabel,\n className,\n}: ComboboxProps) {\n const generatedId = useId();\n const controlId = id ?? `sph-combobox-${generatedId}`;\n const listId = `${controlId}-list`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeState, setActive] = useState(0);\n const multiple = values !== undefined;\n const selectedValues = multiple ? (values ?? []) : value ? [value] : [];\n const {\n present,\n state,\n ref: presenceRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n const visible = present && portaled;\n useOverlayPosition(triggerRef, presenceRef, visible, {\n side: \"bottom\",\n align: \"start\",\n offset: 4,\n matchWidth: true,\n });\n\n const sections = useMemo(() => {\n const read = (option: ComboboxOption) => ({\n label: readableLabel(option),\n keywords: option.keywords,\n });\n const filtered = filterItems(options, query, read);\n const ungrouped = filtered.filter(\n (entry) => entry.item.group === undefined,\n );\n const groupNames = [\n ...new Set(\n filtered\n .map((entry) => entry.item.group)\n .filter((name): name is string => name !== undefined),\n ),\n ];\n const raw = [\n ...(ungrouped.length > 0\n ? [{ heading: undefined, entries: ungrouped }]\n : []),\n ...groupNames.map((name) => ({\n heading: name,\n entries: filtered.filter((entry) => entry.item.group === name),\n })),\n ];\n let order = 0;\n const built = raw.map((section) => ({\n heading: section.heading,\n entries: section.entries.map((entry) => ({\n option: entry.item,\n indexes: entry.indexes,\n activeId: `${listId}-option-${order}`,\n index: order++,\n })),\n }));\n return built;\n }, [listId, options, query]);\n\n const flat = sections.flatMap((section) => section.entries);\n const active = resolveActive(flat, activeState);\n\n const close = () => {\n setOpen(false);\n setQuery(\"\");\n };\n\n const toggleValue = (option: ComboboxOption) => {\n if (option.disabled) return;\n if (multiple) {\n const next = selectedValues.includes(option.value)\n ? selectedValues.filter((entry) => entry !== option.value)\n : [...selectedValues, option.value];\n onValuesChange?.(next);\n setQuery(\"\");\n setActive(0);\n return;\n }\n onValueChange?.(option.value);\n close();\n };\n\n const removeValue = (entry: string) => {\n onValuesChange?.(selectedValues.filter((item) => item !== entry));\n };\n\n const activate = (index: number) => {\n const option = flat[index]?.option;\n if (!option) return;\n toggleValue(option);\n };\n\n const move = (direction: 1 | -1) => {\n if (flat.length === 0) return;\n let index = active < 0 ? 0 : active;\n for (let step = 0; step < flat.length; step += 1) {\n index = (index + direction + flat.length) % flat.length;\n if (!flat[index]?.option.disabled) {\n setActive(index);\n return;\n }\n }\n };\n\n useEffect(() => {\n if (!open) setQuery(\"\");\n }, [open]);\n\n useEffect(() => {\n setActive(0);\n }, [query]);\n\n useEffect(() => {\n if (!visible) return;\n inputRef.current?.setAttribute(\"spellcheck\", \"false\");\n requestAnimationFrame(() => inputRef.current?.focus());\n }, [visible]);\n\n useEffect(() => {\n if (!visible) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n }\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !presenceRef.current?.contains(target)\n )\n close();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n });\n\n useEffect(() => {\n if (!visible || active < 0) return;\n listRef.current\n ?.querySelector<HTMLElement>('[data-active=\"true\"]')\n ?.scrollIntoView({ block: \"nearest\" });\n }, [active, visible]);\n\n const handleInputKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n move(1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n move(-1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setActive(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setActive(flat.length - 1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n if (active >= 0) activate(active);\n }\n };\n\n const handleTriggerKeyDown = (event: KeyboardActionEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n if (!disabled) setOpen(true);\n }\n };\n\n const labelOf = (entry: string) =>\n readableLabel(\n options.find((option) => option.value === entry) ?? {\n value: entry,\n label: entry,\n },\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-combobox\", className)}\n data-size={size}\n data-open={open || undefined}\n >\n {multiple ? (\n <div\n className=\"sph-combobox__control\"\n onClick={() => {\n if (!disabled) setOpen((current) => !current);\n }}\n >\n <div className=\"sph-combobox__chips\">\n {selectedValues.map((entry) => (\n <span key={entry} className=\"sph-combobox__chip\">\n <span className=\"sph-combobox__chip-label\">\n {labelOf(entry)}\n </span>\n <button\n type=\"button\"\n className=\"sph-combobox__chip-remove\"\n aria-label={`Remove ${labelOf(entry)}`}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n removeValue(entry);\n }}\n >\n <XIcon size={10} aria-hidden=\"true\" />\n </button>\n </span>\n ))}\n {selectedValues.length === 0 && (\n <span className=\"sph-combobox__placeholder\">\n {node(placeholder)}\n </span>\n )}\n </div>\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-combobox__toggle\"\n aria-label={ariaLabel ?? \"Open suggestions\"}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n if (!disabled) setOpen((current) => !current);\n }}\n onKeyDown={handleTriggerKeyDown}\n >\n <CaretDownIcon\n className=\"sph-combobox__caret\"\n size={13}\n aria-hidden=\"true\"\n />\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-combobox__control sph-combobox__control--button\"\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (!disabled) setOpen((current) => !current);\n }}\n onKeyDown={handleTriggerKeyDown}\n >\n <span\n className={\n selectedValues.length > 0\n ? \"sph-combobox__value\"\n : \"sph-combobox__placeholder\"\n }\n >\n {selectedValues.length > 0\n ? node(\n options.find((option) => option.value === value)?.label ??\n value,\n )\n : node(placeholder)}\n </span>\n <CaretDownIcon\n className=\"sph-combobox__caret\"\n size={13}\n aria-hidden=\"true\"\n />\n </button>\n )}\n\n {visible &&\n createPortal(\n <div\n ref={presenceRef}\n className=\"sph-combobox__panel\"\n data-state={state}\n >\n <div className=\"sph-combobox__search\">\n <MagnifyingGlassIcon\n className=\"sph-combobox__search-icon\"\n size={14}\n aria-hidden=\"true\"\n />\n <input\n ref={inputRef}\n className=\"sph-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded\n aria-controls={listId}\n aria-activedescendant={\n active >= 0 ? flat[active]?.activeId : undefined\n }\n aria-autocomplete=\"list\"\n aria-label={searchPlaceholder}\n placeholder={searchPlaceholder}\n value={query}\n autoComplete=\"off\"\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={handleInputKeyDown}\n />\n </div>\n <div\n ref={listRef}\n className=\"sph-combobox__list\"\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel ?? searchPlaceholder}\n aria-multiselectable={multiple || undefined}\n >\n {flat.length === 0 && (\n <div className=\"sph-combobox__empty\" role=\"status\">\n {node(emptyMessage)}\n </div>\n )}\n {sections.map((section) => (\n <div\n key={section.heading ?? \"section-root\"}\n className=\"sph-combobox__group\"\n role=\"group\"\n aria-labelledby={\n section.heading !== undefined\n ? `${listId}-group-${section.heading}`\n : undefined\n }\n >\n {section.heading !== undefined && (\n <div\n className=\"sph-combobox__heading\"\n id={`${listId}-group-${section.heading}`}\n >\n {section.heading}\n </div>\n )}\n {section.entries.map((entry) => {\n const option = entry.option;\n const isSelected = selectedValues.includes(option.value);\n return (\n <div\n key={option.value}\n id={entry.activeId}\n className=\"sph-combobox__option\"\n role=\"option\"\n data-index={entry.index}\n data-active={\n entry.index === active ? \"true\" : undefined\n }\n data-disabled={option.disabled || undefined}\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n onPointerEnter={() => {\n if (!option.disabled) setActive(entry.index);\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => activate(entry.index)}\n >\n <span\n className=\"sph-combobox__check\"\n data-checked={isSelected || undefined}\n aria-hidden=\"true\"\n >\n {isSelected && <CheckIcon size={13} weight=\"bold\" />}\n </span>\n <span className=\"sph-combobox__label\">\n {typeof option.label === \"string\" ? (\n <Highlight\n text={option.label}\n indexes={entry.indexes}\n />\n ) : (\n node(option.label)\n )}\n </span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type MenuItem = {\n value?: string;\n label?: Renderable;\n icon?: Renderable;\n shortcut?: Renderable;\n disabled?: boolean;\n danger?: boolean;\n separator?: boolean;\n};\n\nexport type MenuContentProps = {\n /** Prefix for the ids handed out to each enabled item. */\n menuId: string;\n items: MenuItem[];\n onChoose: (item: MenuItem) => void;\n /** Called on Escape from inside the list. */\n onEscape?: () => void;\n};\n\n/**\n * The menu list itself: item markup plus arrow/Home/End/Enter/Space/Escape\n * handling. The wrapper that positions it (anchor or pointer coordinates)\n * stays with the caller.\n */\nexport function MenuContent({\n menuId,\n items,\n onChoose,\n onEscape,\n}: MenuContentProps) {\n const enabledIndexes = items.flatMap((item, index) =>\n !item.separator && !item.disabled ? [index] : [],\n );\n const focusItem = (index: number) =>\n document.getElementById(`${menuId}-${index}`)?.focus();\n\n const handleKeyDown = (event: KeyboardActionEvent, index: number) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onEscape?.();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onChoose(items[index]);\n return;\n }\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n event.preventDefault();\n const current = enabledIndexes.indexOf(index);\n const nextPosition =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? enabledIndexes.length - 1\n : (current +\n (event.key === \"ArrowDown\" ? 1 : -1) +\n enabledIndexes.length) %\n enabledIndexes.length;\n const nextIndex = enabledIndexes[nextPosition];\n if (nextIndex !== undefined) focusItem(nextIndex);\n };\n\n return (\n <>\n {items.map((item, index) =>\n item.separator ? (\n <div\n key={`separator-${index}`}\n className=\"sph-menu__separator\"\n role=\"separator\"\n />\n ) : (\n <button\n key={item.value ?? `item-${index}`}\n id={`${menuId}-${index}`}\n type=\"button\"\n role=\"menuitem\"\n className=\"sph-menu__item\"\n data-danger={item.danger || undefined}\n disabled={item.disabled}\n onClick={() => onChoose(item)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n <span className=\"sph-menu__item-label\">\n {node(item.icon)}\n <span>{node(item.label)}</span>\n </span>\n {item.shortcut !== undefined && (\n <span className=\"sph-menu__shortcut\">{node(item.shortcut)}</span>\n )}\n </button>\n ),\n )}\n </>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n inheritScope,\n useIsoLayoutEffect,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport { MenuContent, type MenuItem } from \"../Menu/MenuContent\";\n\nexport type ContextMenuProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"onContextMenu\" | \"onSelect\"\n> & {\n children: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n disabled?: boolean;\n label?: string;\n};\n\n/**\n * A menu that opens under the pointer: right-click (or the ContextMenu key)\n * on the surface, the popup clamps itself to the viewport and hands focus to\n * its first item. Escape and selection return focus to the surface.\n */\nexport function ContextMenu({\n children,\n items,\n onSelect,\n disabled = false,\n label = \"Context menu\",\n className,\n ...props\n}: ContextMenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ x: 0, y: 0 });\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n\n const close = () => setOpen(false);\n const returnFocus = () => rootRef.current?.focus();\n\n const choose = (item: MenuItem) => {\n if (item.disabled || item.separator || item.value === undefined) return;\n onSelect?.(item.value);\n close();\n returnFocus();\n };\n\n const handleEscape = () => {\n close();\n returnFocus();\n };\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n ) {\n close();\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const frame = requestAnimationFrame(() => {\n contentRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-menu__item:not(:disabled)\")\n ?.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [open]);\n\n useIsoLayoutEffect(() => {\n const el = contentRef.current;\n if (!present || !portaled || !el) return;\n inheritScope(rootRef.current, el);\n const rect = el.getBoundingClientRect();\n const margin = 8;\n const flipX = rect.right > window.innerWidth - margin;\n const flipY = rect.bottom > window.innerHeight - margin;\n if (flipX) {\n el.style.left = `${Math.max(margin, coords.x - rect.width)}px`;\n }\n if (flipY) {\n el.style.top = `${Math.max(margin, coords.y - rect.height)}px`;\n }\n el.style.transformOrigin = `${flipX ? \"right\" : \"left\"} ${flipY ? \"bottom\" : \"top\"}`;\n el.dataset.side = flipY ? \"top\" : \"bottom\";\n }, [present, coords]);\n\n return (\n <div\n {...node(props)}\n ref={rootRef}\n tabIndex={-1}\n className={cn(\"sph-context-menu\", className)}\n onContextMenu={(event) => {\n if (disabled) return;\n event.preventDefault();\n\n const rect = rootRef.current?.getBoundingClientRect();\n setCoords({\n x: event.clientX || (rect ? rect.left + 8 : 8),\n y: event.clientY || (rect ? rect.top + 8 : 8),\n });\n setOpen(true);\n }}\n >\n {node(children)}\n {present &&\n portaled &&\n createPortal(\n <div\n id={`${menuId}-menu`}\n ref={contentRef}\n className=\"sph-menu__content sph-context-menu__content\"\n data-state={state}\n role=\"menu\"\n aria-label={label}\n style={{ left: coords.x, top: coords.y }}\n >\n <MenuContent\n menuId={menuId}\n items={items}\n onChoose={choose}\n onEscape={handleEscape}\n />\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n \"button, [href], input:not([type='hidden']), select, textarea, [tabindex]:not([tabindex='-1'])\";\n\nconst LIVE_REGION_SELECTOR =\n \"[aria-live]:not([aria-live='off']), [role='alert'], [role='status'], [role='log']\";\n\ntype FocusTarget = {\n focus: (options?: FocusOptions) => void;\n isConnected?: boolean;\n hasAttribute?: (name: string) => boolean;\n closest?: (selector: string) => unknown;\n};\n\ntype TreeNode = {\n readonly children: ArrayLike<TreeNode>;\n readonly parentElement: TreeNode | null;\n hasAttribute: (name: string) => boolean;\n};\n\nfunction focusable(container: HTMLElement | null): HTMLElement[] {\n return Array.from(\n container?.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR) ?? [],\n ).filter(\n (element) =>\n !element.hasAttribute(\"disabled\") &&\n element.tabIndex >= 0 &&\n !element.closest(\"[inert]\") &&\n (typeof element.getClientRects !== \"function\" ||\n element.getClientRects().length > 0),\n );\n}\n\nexport function tabTrapTarget<T>(\n elements: readonly T[],\n current: T | null,\n backward: boolean,\n container?: T,\n): { prevent: boolean; target: T | null } {\n if (elements.length === 0) return { prevent: true, target: null };\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (current === null || (container !== undefined && current === container))\n return { prevent: true, target: backward ? last : first };\n if (backward && current === first) return { prevent: true, target: last };\n if (!backward && current === last) return { prevent: true, target: first };\n return { prevent: false, target: null };\n}\n\ntype Layer = { element: HTMLElement | null };\n\nfunction createLayerStack() {\n const layers: Layer[] = [];\n return {\n push(layer: Layer): () => void {\n const element = layer.element;\n const below = element\n ? layers.findIndex(\n (other) =>\n other.element !== null &&\n other.element !== element &&\n element.contains(other.element),\n )\n : -1;\n if (below === -1) layers.push(layer);\n else layers.splice(below, 0, layer);\n return () => {\n const index = layers.indexOf(layer);\n if (index !== -1) layers.splice(index, 1);\n };\n },\n top(): Layer | undefined {\n return layers[layers.length - 1];\n },\n };\n}\n\nconst traps = createLayerStack();\nconst modals = createLayerStack();\n\nexport type FocusTrapOptions = {\n fallbackToContainer?: boolean;\n};\n\n/**\n * Keeps keyboard focus inside `ref` while `active`:\n *\n * - on activation, focus lands on `initial` (a ref or a resolver), or the\n * first focusable node, unless focus already sits inside the container,\n * - Tab and Shift+Tab cycle within the container afterwards,\n * - only the most recently activated trap reacts, so nested traps compose.\n *\n * Escape stays the component's job — layered overlays need to unwire\n * themselves (clear a query, pop a level) before closing.\n */\nexport function useFocusTrap<E extends HTMLElement>(\n ref: RefObject<E | null>,\n active: boolean,\n initial?: RefObject<HTMLElement | null> | (() => HTMLElement | null),\n options: FocusTrapOptions = {},\n): void {\n const { fallbackToContainer = false } = options;\n const initialRef = useRef(initial);\n\n useEffect(() => {\n initialRef.current = initial;\n });\n\n useEffect(() => {\n if (!active) return;\n const layer: Layer = { element: ref.current };\n const release = traps.push(layer);\n const frame = requestAnimationFrame(() => {\n const container = ref.current;\n if (!container) return;\n const resolve = initialRef.current;\n const explicit =\n typeof resolve === \"function\" ? resolve() : resolve?.current;\n if (!explicit && container.contains(document.activeElement)) return;\n const target =\n explicit ??\n focusable(container)[0] ??\n (fallbackToContainer ? container : undefined);\n target?.focus();\n });\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Tab\" || traps.top() !== layer) return;\n const container = ref.current;\n const focused = document.activeElement as HTMLElement | null;\n const lost = !focused || focused === document.body;\n const { prevent, target } = tabTrapTarget<HTMLElement>(\n focusable(container),\n lost ? null : focused,\n event.shiftKey,\n container ?? undefined,\n );\n if (!prevent) return;\n event.preventDefault();\n (target ?? (fallbackToContainer ? container : null))?.focus();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n release();\n cancelAnimationFrame(frame);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [active, fallbackToContainer, ref]);\n}\n\nexport function canReceiveFocus(\n element: FocusTarget | null | undefined,\n): element is FocusTarget {\n if (!element || typeof element.focus !== \"function\") return false;\n if (element.isConnected === false) return false;\n if (element.hasAttribute?.(\"disabled\")) return false;\n if (element.closest?.(\"[inert]\")) return false;\n return true;\n}\n\nexport function restoreFocus(\n target: FocusTarget | null | undefined,\n doc: Pick<Document, \"activeElement\" | \"body\"> = document,\n): unknown {\n if (canReceiveFocus(target)) {\n target.focus({ preventScroll: true });\n if ((doc.activeElement as unknown) === target) return target;\n }\n const current = doc.activeElement as (Element & { blur?: () => void }) | null;\n if (current && current !== doc.body && current.isConnected === false)\n current.blur?.();\n return doc.activeElement ?? doc.body;\n}\n\nexport type ReturnFocusOptions = {\n ref?: RefObject<HTMLElement | null>;\n returnFocus?: boolean | (() => HTMLElement | null);\n};\n\nexport function useReturnFocus(\n active: boolean,\n options: ReturnFocusOptions = {},\n): void {\n const { ref, returnFocus = true } = options;\n const previous = useRef<Element | null>(null);\n const returnRef = useRef(returnFocus);\n\n if (!active) previous.current = null;\n else if (previous.current === null && typeof document !== \"undefined\")\n previous.current = document.activeElement;\n\n useEffect(() => {\n returnRef.current = returnFocus;\n });\n\n useEffect(() => {\n if (!active) return;\n const container = ref?.current ?? null;\n const remembered = previous.current as HTMLElement | null;\n return () => {\n const setting = returnRef.current;\n if (setting === false) return;\n const focused = document.activeElement;\n const lost =\n !focused ||\n focused === document.body ||\n !focused.isConnected ||\n (container?.contains(focused) ?? false);\n if (!lost) return;\n const chosen = typeof setting === \"function\" ? setting() : null;\n restoreFocus(chosen ?? remembered);\n };\n }, [active, ref]);\n}\n\ntype ScrollDocument = {\n body: { style: { overflow: string; paddingRight: string } };\n documentElement: { clientWidth: number };\n defaultView?: {\n innerWidth: number;\n getComputedStyle?: (element: never) => { paddingRight: string };\n } | null;\n};\n\nlet scrollLocks = 0;\nlet savedScroll: { overflow: string; paddingRight: string } | null = null;\n\nexport function lockScroll(\n doc: ScrollDocument = document as unknown as ScrollDocument,\n): () => void {\n const style = doc.body.style;\n if (scrollLocks === 0) {\n savedScroll = {\n overflow: style.overflow,\n paddingRight: style.paddingRight,\n };\n const view = doc.defaultView;\n const gap = view ? view.innerWidth - doc.documentElement.clientWidth : 0;\n if (gap > 0) {\n const computed = view?.getComputedStyle?.(doc.body as never);\n const padding = Number.parseFloat(computed?.paddingRight ?? \"\") || 0;\n style.paddingRight = `${padding + gap}px`;\n }\n style.overflow = \"hidden\";\n }\n scrollLocks += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n scrollLocks -= 1;\n if (scrollLocks > 0 || !savedScroll) return;\n style.overflow = savedScroll.overflow;\n style.paddingRight = savedScroll.paddingRight;\n savedScroll = null;\n };\n}\n\nexport function useScrollLock(active: boolean): void {\n useEffect(() => {\n if (!active) return;\n return lockScroll();\n }, [active]);\n}\n\nexport function inertTargets<N extends TreeNode>(\n keep: readonly N[],\n root: N,\n owned: ReadonlySet<TreeNode> = new Set(),\n): N[] {\n const kept = new Set<TreeNode>(keep);\n const path = new Set<TreeNode>();\n for (const element of keep) {\n const chain: TreeNode[] = [];\n let node: TreeNode | null = element.parentElement;\n while (node && node !== root) {\n chain.push(node);\n node = node.parentElement;\n }\n if (node === root) for (const link of chain) path.add(link);\n }\n const targets: N[] = [];\n const visit = (parent: TreeNode) => {\n for (const child of Array.from(parent.children)) {\n if (kept.has(child)) continue;\n if (path.has(child)) visit(child);\n else if (!child.hasAttribute(\"inert\") || owned.has(child))\n targets.push(child as N);\n }\n };\n if (path.size > 0 || keep.some((element) => element.parentElement === root))\n visit(root);\n return targets;\n}\n\nconst inerted = new Set<Element>();\n\nfunction syncInert(): void {\n const top = modals.top()?.element;\n const next = new Set<Element>();\n if (top && document.body.contains(top)) {\n const regions = Array.from(\n document.body.querySelectorAll(LIVE_REGION_SELECTOR),\n ).filter((region) => !region.contains(top) && !top.contains(region));\n for (const element of inertTargets<Element>(\n [top, ...regions],\n document.body,\n inerted,\n ))\n next.add(element);\n }\n for (const element of inerted)\n if (!next.has(element)) {\n element.removeAttribute(\"inert\");\n inerted.delete(element);\n }\n for (const element of next)\n if (!inerted.has(element)) {\n element.setAttribute(\"inert\", \"\");\n inerted.add(element);\n }\n}\n\nexport type ModalLayer = {\n isTopmost: () => boolean;\n};\n\nexport function useModalLayer<E extends HTMLElement>(\n ref: RefObject<E | null>,\n active: boolean,\n): ModalLayer {\n const layerRef = useRef<Layer | null>(null);\n const handle = useRef<ModalLayer | null>(null);\n handle.current ??= {\n isTopmost: () =>\n layerRef.current !== null && modals.top() === layerRef.current,\n };\n\n useEffect(() => {\n if (!active) return;\n const layer: Layer = { element: ref.current };\n layerRef.current = layer;\n const release = modals.push(layer);\n syncInert();\n return () => {\n release();\n if (layerRef.current === layer) layerRef.current = null;\n syncInert();\n };\n }, [active, ref]);\n\n return handle.current;\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId } from \"react\";\nimport {\n useFocusTrap,\n useModalLayer,\n useReturnFocus,\n useScrollLock,\n} from \"@/lib/focus.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { usePresence } from \"@/lib/presence.js\";\n\nexport type DialogProps = {\n open: boolean;\n onClose: () => void;\n title: Renderable;\n description?: Renderable;\n children?: Renderable;\n footer?: Renderable;\n closeLabel?: string;\n closeOnOverlayClick?: boolean;\n closeOnEscape?: boolean;\n initialFocus?: () => HTMLElement | null;\n returnFocus?: boolean | (() => HTMLElement | null);\n className?: string;\n};\n\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n closeLabel = \"Close dialog\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n initialFocus,\n returnFocus = true,\n className,\n}: DialogProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId =\n description !== undefined ? `${id}-description` : undefined;\n const { present, state, ref: dialogRef } = usePresence<HTMLElement>(open);\n\n const active = open && present;\n const layer = useModalLayer(dialogRef, active);\n useFocusTrap(dialogRef, active, initialFocus, { fallbackToContainer: true });\n useReturnFocus(present, { ref: dialogRef, returnFocus });\n useScrollLock(present);\n\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n if (!layer.isTopmost()) return;\n event.preventDefault();\n onClose();\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [closeOnEscape, layer, onClose, open]);\n\n if (!present) return null;\n\n return (\n <div\n className=\"sph-dialog__backdrop\"\n data-state={state}\n role=\"presentation\"\n onMouseDown={(event) => {\n if (closeOnOverlayClick && event.target === event.currentTarget)\n onClose();\n }}\n >\n <section\n ref={dialogRef}\n className={cn(\"sph-dialog\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <header className=\"sph-dialog__header\">\n <div className=\"sph-dialog__heading\">\n <h2 id={titleId} className=\"sph-dialog__title\">\n {node(title)}\n </h2>\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-dialog__description\">\n {node(description)}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"sph-dialog__close\"\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n </header>\n {children !== undefined && (\n <div className=\"sph-dialog__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-dialog__footer\">{node(footer)}</footer>\n )}\n </section>\n </div>\n );\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId } from \"react\";\nimport {\n useFocusTrap,\n useModalLayer,\n useReturnFocus,\n useScrollLock,\n} from \"@/lib/focus.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { usePresence } from \"@/lib/presence.js\";\n\nexport type DrawerSide = \"left\" | \"right\" | \"bottom\";\n\nexport type DrawerProps = {\n open: boolean;\n onClose: () => void;\n title: Renderable;\n description?: Renderable;\n children?: Renderable;\n footer?: Renderable;\n side?: DrawerSide;\n size?: \"sm\" | \"md\" | \"lg\";\n closeLabel?: string;\n closeOnOverlayClick?: boolean;\n closeOnEscape?: boolean;\n initialFocus?: () => HTMLElement | null;\n returnFocus?: boolean | (() => HTMLElement | null);\n className?: string;\n};\n\nexport function Drawer({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n side = \"right\",\n size = \"md\",\n closeLabel = \"Close panel\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n initialFocus,\n returnFocus = true,\n className,\n}: DrawerProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId =\n description !== undefined ? `${id}-description` : undefined;\n const { present, state, ref: drawerRef } = usePresence<HTMLElement>(open);\n\n const active = open && present;\n const layer = useModalLayer(drawerRef, active);\n useFocusTrap(drawerRef, active, initialFocus, { fallbackToContainer: true });\n useReturnFocus(present, { ref: drawerRef, returnFocus });\n useScrollLock(present);\n\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n if (!layer.isTopmost()) return;\n event.preventDefault();\n onClose();\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [closeOnEscape, layer, onClose, open]);\n\n if (!present) return null;\n\n return (\n <div\n className=\"sph-drawer__backdrop\"\n data-state={state}\n data-side={side}\n role=\"presentation\"\n onMouseDown={(event) => {\n if (closeOnOverlayClick && event.target === event.currentTarget)\n onClose();\n }}\n >\n <section\n ref={drawerRef}\n className={cn(\"sph-drawer\", className)}\n data-side={side}\n data-size={size}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <header className=\"sph-drawer__header\">\n <div className=\"sph-drawer__heading\">\n <h2 id={titleId} className=\"sph-drawer__title\">\n {node(title)}\n </h2>\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-drawer__description\">\n {node(description)}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"sph-drawer__close\"\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n </header>\n {children !== undefined && (\n <div className=\"sph-drawer__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-drawer__footer\">{node(footer)}</footer>\n )}\n </section>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type FieldMessageProps = Omit<\n HTMLAttributes<HTMLParagraphElement>,\n \"children\"\n> & {\n variant?: \"hint\" | \"error\" | \"success\";\n children?: Renderable;\n};\n\nexport function FieldMessage({\n variant = \"hint\",\n className,\n children,\n ...props\n}: FieldMessageProps) {\n if (children === undefined || children === null) return null;\n\n return (\n <p\n {...node(props)}\n className={cn(\"sph-field-message\", className)}\n data-variant={variant}\n role={variant === \"error\" ? \"alert\" : undefined}\n >\n {node(children)}\n </p>\n );\n}\n","import { cn } from \"cn\";\nimport { cloneElement, isValidElement, useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { FieldMessage, type FieldMessageProps } from \"../FieldMessage\";\n\nexport type FieldProps = {\n label?: Renderable;\n htmlFor?: string;\n description?: Renderable;\n message?: Renderable;\n messageType?: FieldMessageProps[\"variant\"];\n required?: boolean;\n className?: string;\n children?: Renderable;\n};\n\ntype ControlAria = {\n \"aria-describedby\"?: string;\n \"aria-required\"?: boolean | \"true\" | \"false\";\n \"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\n};\n\nexport function Field({\n label,\n htmlFor,\n description,\n message,\n messageType = \"hint\",\n required = false,\n className,\n children,\n}: FieldProps) {\n const generatedId = useId();\n const descriptionId = description ? `${generatedId}-description` : undefined;\n const messageId = message ? `${generatedId}-message` : undefined;\n const describedBy = [descriptionId, messageId].filter(Boolean).join(\" \");\n\n const control = isValidElement<ControlAria>(children)\n ? cloneElement(children, {\n \"aria-describedby\":\n [children.props[\"aria-describedby\"], describedBy]\n .filter(Boolean)\n .join(\" \") || undefined,\n \"aria-required\":\n children.props[\"aria-required\"] ?? (required || undefined),\n \"aria-invalid\":\n children.props[\"aria-invalid\"] ??\n (messageType === \"error\" && messageId ? true : undefined),\n })\n : node(children);\n\n return (\n <div className={cn(\"sph-field\", className)}>\n {label !== undefined && (\n <label className=\"sph-field__label\" htmlFor={htmlFor}>\n <span>{node(label)}</span>\n {required && <span className=\"sph-field__required\">Required</span>}\n </label>\n )}\n {description !== undefined && description !== null && (\n <p id={descriptionId} className=\"sph-field__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-field__control\">{control}</div>\n {message !== undefined && message !== null && (\n <FieldMessage id={messageId} variant={messageType}>\n {node(message)}\n </FieldMessage>\n )}\n </div>\n );\n}\n","const TABBABLE_SELECTOR = [\n \"a[href]\",\n \"area[href]\",\n \"button\",\n 'input:not([type=\"hidden\"])',\n \"select\",\n \"textarea\",\n \"iframe\",\n \"summary\",\n \"[tabindex]\",\n '[contenteditable]:not([contenteditable=\"false\"])',\n].join(\", \");\n\nexport type TabExit = \"trigger\" | \"after-trigger\" | null;\n\nexport function panelTabExit(\n shiftKey: boolean,\n index: number,\n count: number,\n): TabExit {\n if (shiftKey) return index <= 0 ? \"trigger\" : null;\n if (count === 0 || index === count - 1) return \"after-trigger\";\n return null;\n}\n\nexport function tabbables(root: ParentNode | null | undefined): HTMLElement[] {\n if (!root) return [];\n return Array.from(\n root.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR),\n ).filter(\n (element) =>\n element.tabIndex >= 0 &&\n !element.hasAttribute(\"disabled\") &&\n !element.closest(\"[inert], [aria-hidden='true']\") &&\n element.getClientRects().length > 0,\n );\n}\n\nexport function focusElement(element: HTMLElement | null | undefined): void {\n element?.focus({ preventScroll: true });\n}\n\nexport function focusInto(panel: HTMLElement | null | undefined): void {\n if (!panel) return;\n focusElement(tabbables(panel)[0] ?? panel);\n}\n\nexport function nextTabStop(\n trigger: HTMLElement | null | undefined,\n skip: Array<HTMLElement | null | undefined>,\n): HTMLElement | undefined {\n if (!trigger) return undefined;\n return tabbables(trigger.ownerDocument).find(\n (element) =>\n (trigger.compareDocumentPosition(element) &\n Node.DOCUMENT_POSITION_FOLLOWING) !==\n 0 &&\n !trigger.contains(element) &&\n !skip.some((scope) => scope?.contains(element)),\n );\n}\n\nexport type PanelTabEvent = {\n key: string;\n shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport function handlePanelTab(\n event: PanelTabEvent,\n panel: HTMLElement | null | undefined,\n trigger: HTMLElement | null | undefined,\n scope: HTMLElement | null | undefined,\n onExit: (exit: Exclude<TabExit, null>) => void,\n): void {\n if (event.key !== \"Tab\" || !panel) return;\n const elements = tabbables(panel);\n const active = panel.ownerDocument.activeElement as HTMLElement | null;\n if (active && active !== panel && !panel.contains(active)) return;\n const exit = panelTabExit(\n event.shiftKey,\n active ? elements.indexOf(active) : -1,\n elements.length,\n );\n if (!exit) return;\n if (exit === \"trigger\") {\n event.preventDefault();\n focusElement(trigger);\n } else {\n const next = nextTabStop(trigger, [scope, panel]);\n if (next) {\n event.preventDefault();\n focusElement(next);\n }\n }\n onExit(exit);\n}\n","import { cn } from \"cn\";\nimport {\n cloneElement,\n Fragment,\n isValidElement,\n type ReactElement,\n} from \"react\";\nimport { Button } from \"@/atoms/Button\";\nimport { IconButton } from \"@/atoms/IconButton\";\n\ntype Props = Record<string, unknown>;\ntype Handler = (event: { defaultPrevented?: boolean }) => void;\n\nconst SLOTTED_COMPONENTS: unknown[] = [Button, IconButton];\n\nexport function canSlotTrigger(\n trigger: unknown,\n asChild: boolean | undefined,\n nativeTypes: readonly string[] = [\"button\"],\n): trigger is ReactElement<Props> {\n if (!isValidElement(trigger) || trigger.type === Fragment) return false;\n if (asChild !== undefined) return asChild;\n return typeof trigger.type === \"string\"\n ? nativeTypes.includes(trigger.type)\n : SLOTTED_COMPONENTS.includes(trigger.type);\n}\n\nfunction chain(own: unknown, ours: unknown): unknown {\n if (typeof own !== \"function\") return ours;\n if (typeof ours !== \"function\") return own;\n return (event: { defaultPrevented?: boolean }) => {\n (own as Handler)(event);\n if (!event?.defaultPrevented) (ours as Handler)(event);\n };\n}\n\nexport function slotTrigger(\n element: ReactElement<Props>,\n props: Props,\n): ReactElement<Props> {\n const own = element.props;\n const merged: Props = { \"data-as-child\": \"\" };\n for (const [key, value] of Object.entries(props)) {\n if (/^on[A-Z]/.test(key)) merged[key] = chain(own[key], value);\n else if (value !== undefined) merged[key] = value;\n }\n merged.className = cn(\n own.className as string | undefined,\n props.className as string | undefined,\n );\n merged.disabled = Boolean(own.disabled || props.disabled) || undefined;\n if (element.type === \"button\" && own.type === undefined)\n merged.type = \"button\";\n return cloneElement(element, merged);\n}\n\nexport function hasAccessibleText(value: unknown): boolean {\n if (typeof value === \"string\") return value.trim().length > 0;\n if (typeof value === \"number\" || typeof value === \"bigint\") return true;\n if (value === null || value === undefined || typeof value === \"boolean\")\n return false;\n if (isValidElement(value)) {\n const props = value.props as Props;\n const hidden = props[\"aria-hidden\"];\n if (hidden === true || hidden === \"true\") return false;\n for (const name of [\"aria-label\", \"aria-labelledby\", \"title\"]) {\n const text = props[name];\n if (typeof text === \"string\" && text.trim()) return true;\n }\n if (typeof value.type !== \"string\") {\n const label = props.label;\n if (typeof label === \"string\" && label.trim()) return true;\n }\n return hasAccessibleText(props.children);\n }\n if (typeof value === \"object\" && Symbol.iterator in value)\n return Array.from(value as Iterable<unknown>).some(hasAccessibleText);\n return false;\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n type OverlaySide,\n useIsoLayoutEffect,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n focusElement,\n handlePanelTab,\n type PanelTabEvent,\n tabbables,\n} from \"../Popover/focusFlow\";\nimport { canSlotTrigger, slotTrigger } from \"../Popover/trigger\";\n\nexport type HoverCardProps = {\n trigger: Renderable;\n children: Renderable;\n /** Grace before opening, so passing the trigger never flickers. */\n openDelay?: number;\n /** Grace before closing, so the pointer can travel into the card. */\n closeDelay?: number;\n placement?: OverlaySide;\n ariaLabel?: string;\n asChild?: boolean;\n className?: string;\n};\n\nconst SLOTTED_NATIVE = [\"button\", \"a\"] as const;\n\nexport function HoverCard({\n trigger,\n children,\n openDelay = 180,\n closeDelay = 140,\n placement = \"bottom\",\n ariaLabel = \"Hover card\",\n asChild,\n className,\n}: HoverCardProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const timers = useRef<{ open?: number; close?: number }>({});\n const skipFocusOpen = useRef(false);\n const [open, setOpen] = useState(false);\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useIsoLayoutEffect(() => {\n triggerRef.current =\n rootRef.current?.querySelector<HTMLElement>(\".sph-hover-card__trigger\") ??\n null;\n });\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: placement,\n align: \"start\",\n offset: 6,\n });\n const clearTimers = () => {\n if (timers.current.open !== undefined)\n window.clearTimeout(timers.current.open);\n if (timers.current.close !== undefined)\n window.clearTimeout(timers.current.close);\n timers.current = {};\n };\n\n const requestOpen = () => {\n clearTimers();\n timers.current.open = window.setTimeout(() => setOpen(true), openDelay);\n };\n\n const requestClose = () => {\n clearTimers();\n timers.current.close = window.setTimeout(() => setOpen(false), closeDelay);\n };\n\n const closeNow = () => {\n clearTimers();\n setOpen(false);\n };\n\n const focusTriggerQuietly = () => {\n skipFocusOpen.current = true;\n focusElement(triggerRef.current);\n skipFocusOpen.current = false;\n };\n\n useEffect(() => clearTimers, []);\n\n useEffect(() => {\n if (!present || !portaled) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n const active = document.activeElement;\n const inside = Boolean(active && contentRef.current?.contains(active));\n closeNow();\n if (inside) focusTriggerQuietly();\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n )\n closeNow();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [contentRef, present, portaled]);\n\n const handleBlur = (event: { relatedTarget: EventTarget | null }) => {\n const next = event.relatedTarget as Node | null;\n if (\n next &&\n (rootRef.current?.contains(next) || contentRef.current?.contains(next))\n )\n return;\n closeNow();\n };\n\n const handleTriggerFocus = () => {\n if (!skipFocusOpen.current) requestOpen();\n };\n\n const handleTriggerKeyDown = (event: PanelTabEvent) => {\n if (event.key === \"Escape\") {\n closeNow();\n return;\n }\n if (event.key !== \"Tab\" || event.shiftKey || !open) return;\n const first = tabbables(contentRef.current)[0];\n if (!first) return;\n event.preventDefault();\n clearTimers();\n focusElement(first);\n };\n\n const handleCardKeyDown = (event: PanelTabEvent) =>\n handlePanelTab(\n event,\n contentRef.current,\n triggerRef.current,\n rootRef.current,\n clearTimers,\n );\n\n const handleCardPointerLeave = () => {\n const active = document.activeElement;\n if (active && contentRef.current?.contains(active)) return;\n requestClose();\n };\n\n const triggerProps = {\n className: \"sph-hover-card__trigger\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? id : undefined,\n onFocus: handleTriggerFocus,\n onKeyDown: handleTriggerKeyDown,\n } as const;\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-hover-card\", className)}\n data-open={open || undefined}\n onPointerEnter={requestOpen}\n onPointerLeave={requestClose}\n onBlur={handleBlur}\n >\n {canSlotTrigger(trigger, asChild, SLOTTED_NATIVE) ? (\n slotTrigger(trigger, triggerProps)\n ) : (\n <button type=\"button\" {...triggerProps}>\n {node(trigger)}\n </button>\n )}\n {present &&\n portaled &&\n createPortal(\n <div\n id={id}\n ref={contentRef}\n className=\"sph-hover-card__content\"\n data-state={state}\n role=\"dialog\"\n aria-label={ariaLabel}\n onPointerEnter={clearTimers}\n onPointerLeave={handleCardPointerLeave}\n onBlur={handleBlur}\n onKeyDown={handleCardKeyDown}\n >\n {node(children)}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n useIsoLayoutEffect,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n canSlotTrigger,\n hasAccessibleText,\n slotTrigger,\n} from \"../Popover/trigger\";\nimport { focusElement, nextTabStop } from \"../Popover/focusFlow\";\nimport { MenuContent, type MenuItem } from \"./MenuContent\";\n\nexport type { MenuItem } from \"./MenuContent\";\n\nexport type MenuProps = {\n trigger: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n /** Controlled open state. */\n open?: boolean;\n /** Fires whenever the menu asks to open or close. */\n onOpenChange?: (open: boolean) => void;\n label?: string;\n align?: \"start\" | \"end\";\n disabled?: boolean;\n asChild?: boolean;\n className?: string;\n};\n\nconst ICON_TRIGGER_LABEL = \"Open menu\";\n\nexport function Menu({\n trigger,\n items,\n onSelect,\n label,\n align = \"start\",\n open: openProp,\n onOpenChange,\n disabled = false,\n asChild,\n className,\n}: MenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const menuId = useId();\n const [uncontrolled, setUncontrolled] = useState(false);\n const open = openProp ?? uncontrolled;\n const setOpen = (next: boolean) => {\n if (openProp === undefined) setUncontrolled(next);\n onOpenChange?.(next);\n };\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useIsoLayoutEffect(() => {\n triggerRef.current =\n rootRef.current?.querySelector<HTMLElement>(\".sph-menu__trigger\") ?? null;\n });\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: \"bottom\",\n align,\n offset: 4,\n });\n const enabledIndexes = items.flatMap((item, index) =>\n !item.separator && !item.disabled ? [index] : [],\n );\n const close = () => setOpen(false);\n const focusItem = (index: number) =>\n document.getElementById(`${menuId}-${index}`)?.focus();\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n )\n close();\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n const choose = (item: MenuItem) => {\n if (item.disabled || item.separator || item.value === undefined) return;\n onSelect?.(item.value);\n close();\n };\n\n const handleKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setOpen(true);\n const index =\n enabledIndexes[\n event.key === \"ArrowDown\" ? 0 : enabledIndexes.length - 1\n ];\n if (index !== undefined) requestAnimationFrame(() => focusItem(index));\n }\n };\n\n const handleItemEscape = () => {\n close();\n triggerRef.current?.focus();\n };\n\n const handleContentKeyDown = (event: {\n key: string;\n shiftKey: boolean;\n preventDefault(): void;\n }) => {\n if (event.key !== \"Tab\") return;\n event.preventDefault();\n close();\n const trigger = triggerRef.current;\n focusElement(\n event.shiftKey\n ? trigger\n : (nextTabStop(trigger, [rootRef.current, contentRef.current]) ??\n trigger),\n );\n };\n\n const triggerProps = {\n className: \"sph-menu__trigger\",\n \"aria-label\":\n label ?? (hasAccessibleText(trigger) ? undefined : ICON_TRIGGER_LABEL),\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? `${menuId}-menu` : undefined,\n disabled: disabled || undefined,\n onClick: () => setOpen(!open),\n onKeyDown: handleKeyDown,\n } as const;\n\n return (\n <div id={menuId} ref={rootRef} className={cn(\"sph-menu\", className)}>\n {canSlotTrigger(trigger, asChild) ? (\n slotTrigger(trigger, triggerProps)\n ) : (\n <button type=\"button\" {...triggerProps}>\n {node(trigger)}\n </button>\n )}\n {present &&\n portaled &&\n createPortal(\n <div\n id={`${menuId}-menu`}\n ref={contentRef}\n className=\"sph-menu__content\"\n data-align={align}\n data-state={state}\n role=\"menu\"\n onKeyDown={handleContentKeyDown}\n >\n <MenuContent\n menuId={menuId}\n items={items}\n onChoose={choose}\n onEscape={handleItemEscape}\n />\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { motionDurationMs } from \"../../lib/presence\";\n\nexport type OTPPattern = \"numeric\" | \"alphanumeric\" | RegExp;\n\nexport type OTPState = \"idle\" | \"verifying\" | \"success\" | \"error\";\n\nexport type OTPInputProps = {\n /** The full code, owned by the parent. */\n value: string;\n onChange?: (value: string) => void;\n /** Fires once when the last cell fills. */\n onComplete?: (value: string) => void;\n /** Number of cells. Defaults to 6. */\n length?: number;\n groups?: number[];\n pattern?: OTPPattern;\n state?: OTPState;\n placeholder?: string;\n clearOnError?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n autoFocus?: boolean;\n ariaLabel?: string;\n id?: string;\n name?: string;\n \"aria-describedby\"?: string;\n className?: string;\n};\n\nconst DIGIT = /^[0-9]$/;\nconst ALPHANUMERIC = /^[A-Z0-9]$/;\n\nfunction accepts(pattern: OTPPattern) {\n if (pattern === \"numeric\") return (char: string) => DIGIT.test(char);\n if (pattern === \"alphanumeric\")\n return (char: string) => ALPHANUMERIC.test(char);\n const single = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, \"\"));\n return (char: string) => single.test(char);\n}\n\nexport function otpFill(\n source: string,\n length: number,\n pattern: OTPPattern = \"numeric\",\n) {\n const test = accepts(pattern);\n const text = pattern === \"alphanumeric\" ? source.toUpperCase() : source;\n let code = \"\";\n for (const char of text) {\n if (code.length >= length) break;\n if (test(char)) code += char;\n }\n return code;\n}\n\nexport function otpWrite(\n value: string,\n index: number,\n digit: string,\n length: number,\n) {\n const cells = Array.from({ length }, (_, position) => value[position] ?? \"\");\n cells[index] = digit;\n return cells.join(\"\");\n}\n\nexport function otpErase(value: string, index: number) {\n return index < value.length ? value.slice(0, index) : value.slice(0, -1);\n}\n\nexport function otpPaste(\n value: string,\n pasted: string,\n start: number,\n end: number,\n length: number,\n pattern: OTPPattern = \"numeric\",\n) {\n const clean = otpFill(pasted, length, pattern);\n if (!clean) return value;\n if (clean.length >= length) return clean;\n const head = value.slice(0, Math.min(start, value.length));\n return otpFill(head + clean + value.slice(end), length, pattern);\n}\n\nexport function otpSelection(\n position: number,\n filled: number,\n length: number,\n): [number, number] {\n const start = Math.max(0, Math.min(position, filled, length - 1));\n return start < filled ? [start, start + 1] : [start, start];\n}\n\nexport function otpBoundaries(groups: number[] | undefined, length: number) {\n const boundaries = new Set<number>();\n if (!groups) return boundaries;\n let total = 0;\n for (const size of groups) {\n total += Math.max(0, Math.floor(size));\n if (total > 0 && total < length) boundaries.add(total);\n }\n return boundaries;\n}\n\nfunction slotGlyph(\n placeholder: string | undefined,\n index: number,\n length: number,\n) {\n if (!placeholder) return \"\";\n const glyphs = Array.from(placeholder);\n return glyphs.length >= length ? glyphs[index] : placeholder;\n}\n\nexport function OTPInput({\n value,\n onChange,\n onComplete,\n length = 6,\n groups,\n pattern = \"numeric\",\n state = \"idle\",\n placeholder,\n clearOnError = false,\n disabled,\n invalid,\n autoFocus,\n ariaLabel = \"One-time code\",\n id,\n name,\n \"aria-describedby\": describedBy,\n className,\n}: OTPInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const slotsRef = useRef<HTMLDivElement | null>(null);\n const [focused, setFocused] = useState(false);\n const [selection, setSelection] = useState<[number, number]>([0, 0]);\n const code = value.slice(0, length);\n const busy = state === \"verifying\";\n const errored = invalid || state === \"error\";\n\n const select = (start: number, end: number) => {\n const input = inputRef.current;\n if (!input) return;\n if (input.selectionStart !== start || input.selectionEnd !== end) {\n input.setSelectionRange(start, end);\n }\n setSelection((current) =>\n current[0] === start && current[1] === end ? current : [start, end],\n );\n };\n\n const place = (\n position: number,\n filled = inputRef.current?.value.length ?? code.length,\n ) => {\n const [start, end] = otpSelection(position, filled, length);\n select(start, end);\n };\n\n const sync = () => {\n const input = inputRef.current;\n if (!input || document.activeElement !== input) return;\n const start = input.selectionStart ?? code.length;\n const end = input.selectionEnd ?? start;\n if (end - start > 1) select(start, end);\n else place(start);\n };\n\n const update = (next: string, caret: number) => {\n const input = inputRef.current;\n if (input && input.value !== next) input.value = next;\n place(caret, next.length);\n if (next === code) return;\n onChange?.(next);\n if (next.length === length) onComplete?.(next);\n };\n\n useEffect(() => {\n const input = inputRef.current;\n if (input && input.value !== code) input.value = code;\n });\n\n useEffect(() => {\n if (focused) place(selection[0]);\n }, [code]);\n\n useEffect(() => {\n if (state !== \"error\" || !clearOnError) return;\n const wait = motionDurationMs(slotsRef.current, \"slow\");\n const timer = setTimeout(() => {\n if (inputRef.current) inputRef.current.value = \"\";\n if (code) onChange?.(\"\");\n if (document.activeElement === inputRef.current) place(0, 0);\n }, wait);\n return () => clearTimeout(timer);\n }, [state, clearOnError]);\n\n const boundaries = otpBoundaries(groups, length);\n const active = focused && !disabled ? Math.min(selection[0], length - 1) : -1;\n const ranged = selection[1] - selection[0] > 1;\n\n return (\n <div\n className={cn(\"sph-otp\", className)}\n data-state={state}\n data-invalid={errored || undefined}\n data-disabled={disabled || undefined}\n data-focused={(focused && !disabled) || undefined}\n >\n <div className=\"sph-otp__slots\" ref={slotsRef} aria-hidden=\"true\">\n {Array.from({ length }).flatMap((_, index) => {\n const char = code[index];\n const isActive = active === index;\n const selected =\n focused && ranged && index >= selection[0] && index < selection[1];\n const slot = (\n <span\n key={index}\n className=\"sph-otp__slot\"\n data-slot={index}\n data-filled={char ? true : undefined}\n data-active={isActive || undefined}\n data-selected={selected || undefined}\n style={\n { \"--sph-otp-index\": index } as CSSProperties &\n Record<string, string | number>\n }\n >\n {char ? (\n <span key={`${index}-${char}`} className=\"sph-otp__char\">\n {char}\n </span>\n ) : (\n <span className=\"sph-otp__placeholder\">\n {slotGlyph(placeholder, index, length)}\n </span>\n )}\n {isActive && !char && !ranged ? (\n <span className=\"sph-otp__caret\" />\n ) : null}\n </span>\n );\n return boundaries.has(index)\n ? [\n <span\n key={`separator-${index}`}\n className=\"sph-otp__separator\"\n />,\n slot,\n ]\n : [slot];\n })}\n </div>\n <input\n ref={inputRef}\n id={id}\n name={name}\n className=\"sph-otp__input\"\n defaultValue={code}\n type=\"text\"\n inputMode={pattern === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete=\"one-time-code\"\n autoCapitalize={pattern === \"alphanumeric\" ? \"characters\" : \"off\"}\n autoCorrect=\"off\"\n maxLength={length}\n disabled={disabled}\n readOnly={busy}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={errored || undefined}\n aria-busy={busy || undefined}\n onFocus={() => {\n setFocused(true);\n place(code.length);\n }}\n onBlur={() => setFocused(false)}\n onClick={(event) => {\n const slots =\n slotsRef.current?.querySelectorAll<HTMLElement>(\"[data-slot]\");\n if (!slots) return;\n const x = event.clientX;\n const filled = event.currentTarget.value.length;\n let target = filled;\n slots.forEach((slot, index) => {\n const rect = slot.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right) target = index;\n });\n place(Math.min(target, filled));\n }}\n onKeyUp={sync}\n onSelect={sync}\n onInput={(event) => {\n const input = event.currentTarget;\n const raw = input.value;\n const caret = input.selectionStart ?? raw.length;\n const next = otpFill(raw, length, pattern);\n if (next.length < code.length && raw.length >= code.length) {\n update(code, Math.min(caret, code.length));\n return;\n }\n update(next, otpFill(raw.slice(0, caret), length, pattern).length);\n }}\n onKeyDown={(event) => {\n const input = event.currentTarget;\n const start = input.selectionStart ?? code.length;\n const end = input.selectionEnd ?? start;\n if (event.key === \"Backspace\") {\n event.preventDefault();\n if (busy || !code) return;\n const next = otpErase(code, Math.min(start, end));\n update(next, next.length);\n } else if (event.key === \"ArrowLeft\" && !event.shiftKey) {\n event.preventDefault();\n place(start - 1);\n } else if (event.key === \"ArrowRight\" && !event.shiftKey) {\n event.preventDefault();\n place(end - start > 1 ? end : start + 1);\n } else if (event.key === \"Home\" && !event.shiftKey) {\n event.preventDefault();\n place(0);\n } else if (event.key === \"End\" && !event.shiftKey) {\n event.preventDefault();\n place(code.length);\n } else if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n !otpFill(event.key, 1, pattern)\n ) {\n event.preventDefault();\n }\n }}\n onPaste={(event) => {\n const text = event.clipboardData?.getData(\"text\") ?? \"\";\n if (!text) return;\n event.preventDefault();\n if (busy) return;\n const input = event.currentTarget;\n const start = input.selectionStart ?? code.length;\n const end = input.selectionEnd ?? start;\n const next = otpPaste(code, text, start, end, length, pattern);\n const inserted = otpFill(text, length, pattern).length;\n update(\n next,\n next.length === length\n ? length\n : Math.min(start + inserted, next.length),\n );\n }}\n />\n </div>\n );\n}\n","import { CaretLeftIcon, CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type PaginationProps = Omit<HTMLAttributes<HTMLElement>, \"onChange\"> & {\n /** Current page, 1-based. */\n page: number;\n pageCount: number;\n onPageChange?: (page: number) => void;\n /** Numbers shown either side of the current page. Default 1. */\n siblings?: number;\n /** Readout drawn on the right: \"1–20 of 340\". */\n status?: Renderable;\n /** Accessible name for the nav landmark. */\n label?: string;\n};\n\n/** The run of entries to draw: numbers with `\"gap\"` holes between them. */\nfunction pageWindow(\n page: number,\n pageCount: number,\n siblings: number,\n): (number | \"gap\")[] {\n const around = Array.from({ length: siblings * 2 + 1 }, (_, offset) => {\n const candidate = page - siblings + offset;\n return candidate >= 1 && candidate <= pageCount ? candidate : null;\n }).filter((n): n is number => n !== null);\n const pages = [...new Set([1, pageCount, ...around])].sort((a, b) => a - b);\n const entries: (number | \"gap\")[] = [];\n let previous = 0;\n for (const value of pages) {\n if (value - previous > 1) entries.push(\"gap\");\n entries.push(value);\n previous = value;\n }\n return entries;\n}\n\nexport function Pagination({\n page,\n pageCount,\n onPageChange,\n siblings = 1,\n status,\n label = \"Pagination\",\n className,\n ...props\n}: PaginationProps) {\n if (pageCount < 1) return null;\n const entries = pageWindow(page, pageCount, Math.max(0, siblings));\n\n return (\n <nav\n {...node(props)}\n className={cn(\"sph-pagination\", className)}\n aria-label={label}\n >\n <ul className=\"sph-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"sph-pagination__nav\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => onPageChange?.(page - 1)}\n >\n <CaretLeftIcon size={13} weight=\"bold\" />\n </button>\n </li>\n {entries.map((entry, index) =>\n entry === \"gap\" ? (\n <li\n key={`gap-${index}`}\n className=\"sph-pagination__gap\"\n aria-hidden=\"true\"\n >\n …\n </li>\n ) : (\n <li key={`page-${entry}`}>\n {entry === page ? (\n <span\n className=\"sph-pagination__page sph-pagination__page--current\"\n aria-current=\"page\"\n >\n {entry}\n </span>\n ) : (\n <button\n type=\"button\"\n className=\"sph-pagination__page\"\n aria-label={`Page ${entry}`}\n onClick={() => onPageChange?.(entry)}\n >\n {entry}\n </button>\n )}\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n className=\"sph-pagination__nav\"\n aria-label=\"Next page\"\n disabled={page >= pageCount}\n onClick={() => onPageChange?.(page + 1)}\n >\n <CaretRightIcon size={13} weight=\"bold\" />\n </button>\n </li>\n </ul>\n {status !== undefined && (\n <span className=\"sph-pagination__status\">{node(status)}</span>\n )}\n </nav>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n useIsoLayoutEffect,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n focusElement,\n focusInto,\n handlePanelTab,\n type PanelTabEvent,\n} from \"./focusFlow\";\nimport { canSlotTrigger, slotTrigger } from \"./trigger\";\n\nexport type PopoverProps = {\n trigger: Renderable;\n children: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n ariaLabel?: string;\n placement?: \"start\" | \"end\";\n disabled?: boolean;\n asChild?: boolean;\n className?: string;\n};\n\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n ariaLabel = \"Popover\",\n placement = \"start\",\n disabled = false,\n asChild,\n className,\n}: PopoverProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const focusOnOpen = useRef(false);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const openRef = useRef(isOpen);\n openRef.current = isOpen;\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(isOpen, \"fast\");\n const portaled = usePortaled();\n useIsoLayoutEffect(() => {\n triggerRef.current =\n rootRef.current?.querySelector<HTMLElement>(\".sph-popover__trigger\") ??\n null;\n });\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: \"bottom\",\n align: placement,\n offset: 6,\n });\n const setOpen = (next: boolean) => {\n if (next === openRef.current) return;\n openRef.current = next;\n focusOnOpen.current = next;\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!isOpen || !present || !portaled || !focusOnOpen.current) return;\n focusOnOpen.current = false;\n const frame = requestAnimationFrame(() => focusInto(contentRef.current));\n return () => cancelAnimationFrame(frame);\n }, [isOpen, present, portaled]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n )\n setOpen(false);\n };\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n const active = document.activeElement;\n const inside = Boolean(active && contentRef.current?.contains(active));\n setOpen(false);\n if (inside) focusElement(triggerRef.current);\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen]);\n\n const handleTriggerKeyDown = (event: PanelTabEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n setOpen(true);\n return;\n }\n if (\n event.key === \"Tab\" &&\n !event.shiftKey &&\n isOpen &&\n contentRef.current\n ) {\n event.preventDefault();\n focusInto(contentRef.current);\n }\n };\n\n const handlePanelKeyDown = (event: PanelTabEvent) =>\n handlePanelTab(\n event,\n contentRef.current,\n triggerRef.current,\n rootRef.current,\n () => setOpen(false),\n );\n\n const triggerProps = {\n className: \"sph-popover__trigger\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? id : undefined,\n disabled: disabled || undefined,\n onClick: () => setOpen(!isOpen),\n onKeyDown: handleTriggerKeyDown,\n } as const;\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-popover\", className)}\n data-open={isOpen || undefined}\n >\n {canSlotTrigger(trigger, asChild) ? (\n slotTrigger(trigger, triggerProps)\n ) : (\n <button type=\"button\" {...triggerProps}>\n {node(trigger)}\n </button>\n )}\n {present &&\n portaled &&\n createPortal(\n <div\n id={id}\n ref={contentRef}\n className=\"sph-popover__content\"\n data-placement={placement}\n data-state={state}\n role=\"dialog\"\n aria-label={ariaLabel}\n tabIndex={-1}\n onKeyDown={handlePanelKeyDown}\n >\n {node(children)}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { CheckIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type QuestionOption = {\n value: string;\n label: Renderable;\n /** Secondary line under the label. */\n hint?: Renderable;\n disabled?: boolean;\n};\n\nexport type QuestionCardProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"value\" | \"defaultValue\"\n> & {\n question: Renderable;\n /** Helper line under the question. */\n description?: Renderable;\n options: QuestionOption[];\n /** Controlled selected option. */\n value?: string;\n /** Selected option on first render. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Correct option. Setting it locks the card and shows the verdict. */\n answer?: string;\n /** Row under the options: submit buttons, hints, score. */\n footer?: Renderable;\n disabled?: boolean;\n};\n\nexport function QuestionCard({\n question,\n description,\n options,\n value,\n defaultValue,\n onValueChange,\n answer,\n footer,\n disabled = false,\n className,\n ...props\n}: QuestionCardProps) {\n const [uncontrolled, setUncontrolled] = useState<string | undefined>(\n defaultValue,\n );\n const selected = value ?? uncontrolled;\n const questionId = `${useId()}-question`;\n const locked = answer !== undefined;\n const verdict = locked\n ? selected === answer\n ? \"correct\"\n : \"wrong\"\n : undefined;\n\n const pick = (optionValue: string) => {\n if (locked || disabled) return;\n if (value === undefined) setUncontrolled(optionValue);\n onValueChange?.(optionValue);\n };\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-question-card\", className)}\n data-verdict={verdict}\n >\n <span className=\"sph-question-card__question\" id={questionId}>\n {node(question)}\n </span>\n {description !== undefined && (\n <span className=\"sph-question-card__description\">\n {node(description)}\n </span>\n )}\n <div\n className=\"sph-question-card__options\"\n role=\"group\"\n aria-labelledby={questionId}\n >\n {options.map((option) => {\n const optionSelected = selected === option.value;\n const isAnswer = locked && option.value === answer;\n const optionVerdict = !locked\n ? undefined\n : isAnswer\n ? optionSelected\n ? \"correct\"\n : \"revealed\"\n : optionSelected\n ? \"wrong\"\n : undefined;\n return (\n <button\n key={option.value}\n type=\"button\"\n className=\"sph-question-card__option\"\n aria-pressed={optionSelected}\n data-verdict={optionVerdict}\n disabled={disabled || option.disabled || locked}\n onClick={() => pick(option.value)}\n >\n <span className=\"sph-question-card__marker\" aria-hidden=\"true\">\n <CheckIcon\n size={11}\n weight=\"bold\"\n className=\"sph-question-card__tick\"\n />\n <XIcon\n size={11}\n weight=\"bold\"\n className=\"sph-question-card__cross\"\n />\n <span className=\"sph-question-card__dot\" />\n </span>\n <span className=\"sph-question-card__option-text\">\n <span className=\"sph-question-card__option-label\">\n {node(option.label)}\n </span>\n {option.hint !== undefined && (\n <span className=\"sph-question-card__option-hint\">\n {node(option.hint)}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n {footer !== undefined && (\n <div className=\"sph-question-card__footer\">{node(footer)}</div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type RadioOption = {\n value: string;\n label: Renderable;\n description?: Renderable;\n disabled?: boolean;\n};\n\nexport type RadioGroupProps = {\n value: string;\n options: RadioOption[];\n onValueChange: (value: string) => void;\n name: string;\n label?: Renderable;\n description?: Renderable;\n size?: ControlSize;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function RadioGroup({\n value,\n options,\n onValueChange,\n name,\n label,\n description,\n size = \"md\",\n orientation = \"vertical\",\n disabled = false,\n className,\n}: RadioGroupProps) {\n const groupId = useId();\n const descriptionId = description ? `${groupId}-description` : undefined;\n\n return (\n <fieldset\n className={cn(\"sph-radio-group\", className)}\n data-size={size}\n data-orientation={orientation}\n disabled={disabled}\n aria-describedby={descriptionId}\n >\n {label !== undefined && (\n <legend className=\"sph-radio-group__legend\">{node(label)}</legend>\n )}\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-radio-group__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-radio-group__options\">\n {options.map((option, index) => {\n const optionId = `${groupId}-${index}`;\n const optionDescriptionId = option.description\n ? `${optionId}-description`\n : undefined;\n\n return (\n <label\n key={option.value}\n className=\"sph-radio-group__option\"\n data-disabled={option.disabled || undefined}\n >\n <input\n id={optionId}\n type=\"radio\"\n name={name}\n value={option.value}\n checked={value === option.value}\n disabled={disabled || option.disabled}\n aria-describedby={optionDescriptionId}\n onChange={() => onValueChange(option.value)}\n />\n <span className=\"sph-radio-group__control\" aria-hidden=\"true\" />\n <span className=\"sph-radio-group__content\">\n <span className=\"sph-radio-group__label\">\n {node(option.label)}\n </span>\n {option.description !== undefined && (\n <span\n id={optionDescriptionId}\n className=\"sph-radio-group__option-description\"\n >\n {node(option.description)}\n </span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\nimport { motionDurationMs, type MotionSpeed } from \"@/lib/presence.js\";\n\nexport type RevealProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children: Renderable;\n trigger?: \"mount\" | \"scroll\";\n direction?: \"up\" | \"down\" | \"left\" | \"right\" | \"none\";\n distance?: number;\n delay?: number;\n speed?: MotionSpeed;\n once?: boolean;\n};\n\nexport function Reveal({\n children,\n trigger = \"mount\",\n direction = \"up\",\n distance = 8,\n delay = 0,\n speed = \"normal\",\n once = true,\n className,\n style,\n ...props\n}: RevealProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [phase, setPhase] = useState<\"idle\" | \"hidden\" | \"shown\">(\"idle\");\n\n useIsoLayoutEffect(() => {\n const element = ref.current;\n let timer: ReturnType<typeof setTimeout> | undefined;\n setPhase(\"hidden\");\n const show = () => {\n if (delay > 0 && element && motionDurationMs(element, speed) > 0) {\n timer = setTimeout(() => setPhase(\"shown\"), delay);\n return;\n }\n setPhase(\"shown\");\n };\n if (\n trigger === \"mount\" ||\n !element ||\n typeof IntersectionObserver !== \"function\"\n ) {\n show();\n return () => clearTimeout(timer);\n }\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) show();\n else if (!once) setPhase(\"hidden\");\n }\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n clearTimeout(timer);\n };\n }, [trigger, once, delay, speed]);\n\n const offset =\n direction === \"none\"\n ? { x: \"0px\", y: \"0px\" }\n : direction === \"up\"\n ? { x: \"0px\", y: `${distance}px` }\n : direction === \"down\"\n ? { x: \"0px\", y: `-${distance}px` }\n : direction === \"left\"\n ? { x: `${distance}px`, y: \"0px\" }\n : { x: `-${distance}px`, y: \"0px\" };\n\n return (\n <div\n {...node(props)}\n ref={ref}\n className={cn(\"sph-reveal\", className)}\n data-speed={speed}\n data-state={phase === \"idle\" ? undefined : phase}\n style={\n {\n ...style,\n \"--sph-reveal-x\": offset.x,\n \"--sph-reveal-y\": offset.y,\n } as CSSProperties & Record<string, string>\n }\n >\n {node(children)}\n </div>\n );\n}\n","import { CaretDownIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SelectOption = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n};\n\nexport type SelectProps = {\n value: string;\n options: SelectOption[];\n onValueChange: (value: string) => void;\n id?: string;\n className?: string;\n placeholder?: Renderable;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n disabled?: boolean;\n size?: ControlSize;\n};\n\nfunction nextEnabled(\n options: SelectOption[],\n start: number,\n direction: 1 | -1,\n) {\n if (options.length === 0) return -1;\n for (let step = 1; step <= options.length; step += 1) {\n const index = (start + step * direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n}\n\nexport function Select({\n value,\n options,\n onValueChange,\n id,\n className,\n placeholder = \"Select an option\",\n ariaLabel,\n ariaLabelledBy,\n disabled = false,\n size = \"md\",\n}: SelectProps) {\n const generatedId = useId();\n const triggerId = id ?? `sph-select-${generatedId}`;\n const listboxId = `${triggerId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const selectedIndex = options.findIndex((option) => option.value === value);\n const firstEnabled = options.findIndex((option) => !option.disabled);\n const [open, setOpen] = useState(false);\n const {\n present,\n state,\n ref: listboxRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, listboxRef, present && portaled, {\n side: \"bottom\",\n align: \"start\",\n offset: 4,\n matchWidth: true,\n });\n const [activeIndex, setActiveIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : firstEnabled,\n );\n\n useEffect(() => {\n if (!open) return;\n const close = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !listboxRef.current?.contains(target)\n )\n setOpen(false);\n };\n document.addEventListener(\"pointerdown\", close);\n return () => document.removeEventListener(\"pointerdown\", close);\n }, [open]);\n\n useEffect(() => {\n if (!open)\n setActiveIndex(selectedIndex >= 0 ? selectedIndex : firstEnabled);\n }, [firstEnabled, open, selectedIndex]);\n\n function choose(index: number) {\n const option = options[index];\n if (!option || option.disabled) return;\n onValueChange(option.value);\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardActionEvent) {\n if (event.key === \"Escape\") {\n if (!open) return;\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const next = nextEnabled(\n options,\n activeIndex,\n event.key === \"ArrowDown\" ? 1 : -1,\n );\n setOpen(true);\n if (next >= 0) setActiveIndex(next);\n return;\n }\n if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const edge =\n event.key === \"Home\" ? firstEnabled : nextEnabled(options, 0, -1);\n setOpen(true);\n if (edge >= 0) setActiveIndex(edge);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) choose(activeIndex);\n else setOpen(true);\n }\n }\n\n const selected = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n return (\n <div ref={rootRef} className={cn(\"sph-select\", className)} data-size={size}>\n <button\n id={triggerId}\n type=\"button\"\n ref={triggerRef}\n className=\"sph-select__trigger\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={\n open && activeIndex >= 0 ? `${listboxId}-${activeIndex}` : undefined\n }\n disabled={disabled || firstEnabled < 0}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n <span className=\"sph-select__value\">\n {node(selected?.label ?? placeholder)}\n </span>\n <CaretDownIcon className=\"sph-select__caret\" aria-hidden=\"true\" />\n </button>\n\n {present &&\n portaled &&\n createPortal(\n <div\n id={listboxId}\n ref={listboxRef}\n role=\"listbox\"\n className=\"sph-select__listbox\"\n data-state={state}\n >\n {options.map((option, index) => (\n <button\n key={option.value}\n id={`${listboxId}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={index === selectedIndex}\n disabled={option.disabled}\n className=\"sph-select__option\"\n data-active={index === activeIndex || undefined}\n onPointerMove={() => !option.disabled && setActiveIndex(index)}\n onClick={() => choose(index)}\n >\n <span>{node(option.label)}</span>\n {index === selectedIndex && (\n <CheckIcon className=\"sph-select__check\" aria-hidden=\"true\" />\n )}\n </button>\n ))}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import {\n CaretDownIcon,\n CaretRightIcon,\n CaretUpIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { AnimatedNumber } from \"@/atoms/AnimatedNumber\";\n\nexport type StatProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n label: Renderable;\n value: Renderable;\n hint?: Renderable;\n};\n\nexport function Stat({ label, value, hint, className, ...props }: StatProps) {\n return (\n <div {...node(props)} className={cn(\"sph-stat\", className)}>\n <span className=\"sph-stat__label\">{node(label)}</span>\n <span className=\"sph-stat__value\">{node(value)}</span>\n {hint !== undefined && (\n <span className=\"sph-stat__hint\">{node(hint)}</span>\n )}\n </div>\n );\n}\n\nexport type StatGroupProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n children: Renderable;\n columns?: number;\n};\n\nexport function StatGroup({\n children,\n columns = 3,\n className,\n style,\n ...props\n}: StatGroupProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-stat-group\", className)}\n style={\n {\n ...style,\n \"--sph-stat-columns\": String(columns),\n } as CSSProperties & Record<string, string>\n }\n >\n {node(children)}\n </div>\n );\n}\n\nexport type DeltaProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\" | \"title\"\n> & {\n value: number;\n format?: (value: number) => string;\n};\n\nconst signed = (value: number) => {\n const magnitude = Math.abs(value);\n const text = Number.isInteger(magnitude)\n ? String(magnitude)\n : String(Math.round(magnitude * 10) / 10);\n return `${value > 0 ? \"+\" : value < 0 ? \"-\" : \"\"}${text}`;\n};\n\nexport function Delta({\n value,\n format = signed,\n className,\n ...props\n}: DeltaProps) {\n const direction = value > 0 ? \"up\" : value < 0 ? \"down\" : \"flat\";\n const Icon =\n direction === \"up\"\n ? CaretUpIcon\n : direction === \"down\"\n ? CaretDownIcon\n : CaretRightIcon;\n return (\n <span\n {...node(props)}\n className={cn(\"sph-delta\", className)}\n data-direction={direction}\n >\n <Icon size={11} aria-hidden=\"true\" />\n <AnimatedNumber value={value} format={format} />\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport { useId, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TabItem = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n content?: Renderable;\n};\n\nexport type TabsProps = {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n children?: Renderable;\n ariaLabel?: string;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n};\n\nfunction firstEnabled(items: TabItem[]) {\n return items.find((item) => !item.disabled)?.value;\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onValueChange,\n children,\n ariaLabel = \"Tabs\",\n orientation = \"horizontal\",\n className,\n}: TabsProps) {\n const generatedId = useId();\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? firstEnabled(items) ?? \"\",\n );\n const activeValue = value ?? uncontrolledValue;\n const activeIndex = Math.max(\n 0,\n items.findIndex((item) => item.value === activeValue),\n );\n const activeItem = items[activeIndex];\n const setValue = (nextValue: string) => {\n setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n };\n const move = (event: KeyboardActionEvent, index: number) => {\n const direction =\n orientation === \"vertical\"\n ? event.key === \"ArrowDown\"\n ? 1\n : -1\n : event.key === \"ArrowRight\"\n ? 1\n : -1;\n if (\n ![\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)\n )\n return;\n event.preventDefault();\n for (let step = 1; step <= items.length; step += 1) {\n const next = (index + step * direction + items.length) % items.length;\n if (!items[next]?.disabled) {\n setValue(items[next].value);\n document.getElementById(`${generatedId}-${next}`)?.focus();\n return;\n }\n }\n };\n const panelId = `${generatedId}-panel`;\n\n return (\n <div className={cn(\"sph-tabs\", className)} data-orientation={orientation}>\n <div\n className=\"sph-tabs__list\"\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n >\n {items.map((item, index) => {\n const selected = item.value === activeValue;\n return (\n <button\n key={item.value}\n id={`${generatedId}-${index}`}\n type=\"button\"\n role=\"tab\"\n className=\"sph-tabs__tab\"\n aria-selected={selected}\n aria-controls={selected ? panelId : undefined}\n tabIndex={selected ? 0 : -1}\n disabled={item.disabled}\n data-selected={selected || undefined}\n onClick={() => !item.disabled && setValue(item.value)}\n onKeyDown={(event) => move(event, index)}\n >\n {node(item.label)}\n </button>\n );\n })}\n </div>\n {activeItem &&\n (activeItem.content !== undefined || children !== undefined) && (\n <div\n id={panelId}\n key={activeItem.content !== undefined ? activeValue : \"static\"}\n className=\"sph-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${generatedId}-${activeIndex}`}\n >\n {node(activeItem.content ?? children)}\n </div>\n )}\n </div>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TaskState = \"todo\" | \"doing\" | \"done\";\n\nexport type TaskListItem = {\n /** Stable id reported back through `onStateChange`. */\n id: string;\n label: Renderable;\n state?: TaskState;\n /** Trailing meta: due date, assignee, counters. */\n meta?: Renderable;\n disabled?: boolean;\n};\n\nexport type TaskListProps = Omit<\n HTMLAttributes<HTMLUListElement>,\n \"children\" | \"onChange\"\n> & {\n items: TaskListItem[];\n /**\n * Fires with the next state when a row's check is pressed:\n * todo → doing → done → todo.\n */\n onStateChange?: (id: string, state: TaskState) => void;\n /** Accessible name for the list. */\n label?: string;\n};\n\nconst CYCLE: Record<TaskState, TaskState> = {\n todo: \"doing\",\n doing: \"done\",\n done: \"todo\",\n};\n\nexport function TaskList({\n items,\n onStateChange,\n label = \"Tasks\",\n className,\n ...props\n}: TaskListProps) {\n const baseId = useId();\n\n return (\n <ul\n {...node(props)}\n className={cn(\"sph-task-list\", className)}\n aria-label={label}\n >\n {items.map((item, index) => {\n const state = item.state ?? \"todo\";\n const labelId = `${baseId}-label-${index}`;\n return (\n <li\n key={item.id}\n className=\"sph-task-list__item\"\n data-state={state}\n data-disabled={item.disabled || undefined}\n >\n <button\n type=\"button\"\n role=\"checkbox\"\n className=\"sph-task-list__check\"\n aria-checked={\n state === \"done\" ? true : state === \"doing\" ? \"mixed\" : false\n }\n aria-labelledby={labelId}\n disabled={item.disabled}\n onClick={() => onStateChange?.(item.id, CYCLE[state])}\n >\n <span className=\"sph-task-list__mark\" aria-hidden=\"true\">\n <CheckIcon\n size={11}\n weight=\"bold\"\n className=\"sph-task-list__tick\"\n />\n <span className=\"sph-task-list__dot\" />\n </span>\n </button>\n <span className=\"sph-task-list__label\" id={labelId}>\n {node(item.label)}\n </span>\n {item.meta !== undefined && (\n <span className=\"sph-task-list__meta\">{node(item.meta)}</span>\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TimelineItem = {\n /** Event title. */\n title: Renderable;\n /** Body rendered under the head. */\n children?: Renderable;\n /** Right-aligned time or meta. */\n timestamp?: Renderable;\n /** Leading icon in place of the default dot. */\n icon?: Renderable;\n tone?: \"default\" | \"accent\" | \"success\" | \"danger\";\n /** Marks the latest event: its marker keeps breathing. */\n current?: boolean;\n};\n\nexport type TimelineProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n items: TimelineItem[];\n /** Accessible name for the list. */\n label?: string;\n};\n\nexport function Timeline({\n items,\n label = \"Timeline\",\n className,\n ...props\n}: TimelineProps) {\n return (\n <ol\n {...node(props)}\n className={cn(\"sph-timeline\", className)}\n aria-label={label}\n >\n {items.map((item, index) => {\n const tone =\n item.tone !== undefined && item.tone !== \"default\"\n ? item.tone\n : undefined;\n return (\n <li\n key={`event-${index}`}\n className=\"sph-timeline__item\"\n data-tone={tone}\n data-current={item.current || undefined}\n >\n <span className=\"sph-timeline__marker\" aria-hidden=\"true\">\n {item.icon !== undefined ? (\n node(item.icon)\n ) : (\n <span className=\"sph-timeline__dot\" />\n )}\n </span>\n <div className=\"sph-timeline__content\">\n <div className=\"sph-timeline__head\">\n <span className=\"sph-timeline__title\">{node(item.title)}</span>\n {item.timestamp !== undefined && (\n <span className=\"sph-timeline__timestamp\">\n {node(item.timestamp)}\n </span>\n )}\n </div>\n {item.children !== undefined && (\n <div className=\"sph-timeline__body\">{node(item.children)}</div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect } from \"react\";\nimport {\n type ExternalToast,\n Toaster as SonnerToaster,\n type ToasterProps as SonnerToasterProps,\n toast,\n} from \"sonner\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type { ExternalToast } from \"sonner\";\nexport { toast };\n\nconst toastIcons = {\n success: (\n <span className=\"sph-toast__status-icon\">\n <CheckIcon size={20} />\n </span>\n ),\n info: (\n <span className=\"sph-toast__status-icon\">\n <InfoIcon size={20} />\n </span>\n ),\n warning: (\n <span className=\"sph-toast__status-icon\">\n <WarningIcon size={20} />\n </span>\n ),\n error: (\n <span className=\"sph-toast__status-icon\">\n <XIcon size={20} />\n </span>\n ),\n};\n\nexport type ToastProps = {\n open?: boolean;\n id?: string | number;\n title: Renderable;\n description?: Renderable;\n variant?: \"neutral\" | \"success\" | \"warning\" | \"danger\";\n action?: ExternalToast[\"action\"];\n duration?: number;\n closeButton?: boolean;\n className?: string;\n};\n\nexport function Toast({\n open = true,\n id,\n title,\n description,\n variant = \"neutral\",\n action,\n duration,\n closeButton = true,\n className,\n}: ToastProps) {\n useEffect(() => {\n if (!open) return;\n const options: ExternalToast = {\n id,\n action,\n closeButton,\n description: node(description),\n duration,\n className: cn(\"sph-toast\", className),\n unstyled: true,\n };\n const toastId =\n variant === \"success\"\n ? toast.success(node(title), options)\n : variant === \"warning\"\n ? toast.warning(node(title), options)\n : variant === \"danger\"\n ? toast.error(node(title), options)\n : toast(node(title), options);\n\n return () => {\n toast.dismiss(toastId);\n };\n }, [open, id, action, closeButton, duration, title, description, variant]);\n\n return null;\n}\n\nexport type ToastViewportProps = Omit<\n SonnerToasterProps,\n \"className\" | \"containerAriaLabel\" | \"icons\" | \"toastOptions\"\n> & {\n label?: string;\n className?: string;\n toastOptions?: SonnerToasterProps[\"toastOptions\"];\n};\n\nexport function ToastViewport({\n label = \"Notifications\",\n className,\n toastOptions,\n theme = \"system\",\n position = \"top-right\",\n closeButton = true,\n expand = false,\n ...props\n}: ToastViewportProps) {\n return (\n <SonnerToaster\n {...node(props)}\n theme={theme}\n position={position}\n closeButton={closeButton}\n icons={toastIcons}\n containerAriaLabel={label}\n expand={expand}\n className={cn(\"sph-toast-viewport\", className)}\n toastOptions={{\n ...toastOptions,\n closeButton: toastOptions?.closeButton ?? closeButton,\n closeButtonAriaLabel:\n toastOptions?.closeButtonAriaLabel ?? \"Dismiss notification\",\n className: cn(\"sph-toast\", toastOptions?.className),\n unstyled: true,\n }}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToolbarProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n label?: string;\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n start?: Renderable;\n end?: Renderable;\n children?: Renderable;\n};\n\nexport function Toolbar({\n label = \"Toolbar\",\n orientation = \"horizontal\",\n size = \"sm\",\n start,\n end,\n children,\n className,\n ...props\n}: ToolbarProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-toolbar\", className)}\n data-orientation={orientation}\n data-size={size}\n role=\"toolbar\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {start !== undefined && (\n <div className=\"sph-toolbar__start\">{node(start)}</div>\n )}\n {children !== undefined && (\n <div className=\"sph-toolbar__content\">{node(children)}</div>\n )}\n {end !== undefined && <div className=\"sph-toolbar__end\">{node(end)}</div>}\n </div>\n );\n}\n","export type TooltipClock = {\n now(): number;\n set(callback: () => void, ms: number): unknown;\n clear(handle: unknown): void;\n};\n\nexport const systemClock: TooltipClock = {\n now: () => Date.now(),\n set: (callback, ms) => setTimeout(callback, ms),\n clear: (handle) => clearTimeout(handle as ReturnType<typeof setTimeout>),\n};\n\nexport const TOOLTIP_DELAY = 400;\nexport const TOOLTIP_SKIP_DELAY = 300;\nexport const TOOLTIP_HOVER_GRACE = 120;\n\nexport type TooltipMember = { dismiss(): void };\n\nexport type TooltipGroupStore = {\n delay: number;\n skipDelay: number;\n isWarm(): boolean;\n opened(member: TooltipMember): void;\n closed(member: TooltipMember): void;\n};\n\nexport function createTooltipGroup(\n delay = TOOLTIP_DELAY,\n skipDelay = TOOLTIP_SKIP_DELAY,\n clock: TooltipClock = systemClock,\n): TooltipGroupStore {\n let active: TooltipMember | null = null;\n let closedAt = Number.NEGATIVE_INFINITY;\n const store: TooltipGroupStore = {\n delay,\n skipDelay,\n isWarm: () => active !== null || clock.now() - closedAt < store.skipDelay,\n opened(member) {\n const previous = active;\n active = member;\n if (previous && previous !== member) previous.dismiss();\n },\n closed(member) {\n if (active === member) active = null;\n closedAt = clock.now();\n },\n };\n return store;\n}\n\nexport type TooltipSettings = {\n delay: number;\n disabled: boolean;\n group: TooltipGroupStore | null;\n};\n\nexport type TooltipController = {\n readonly visible: boolean;\n enter(): void;\n leave(): void;\n hold(): void;\n dismiss(): void;\n keyDown(key: string): boolean;\n destroy(): void;\n};\n\nexport function createTooltipController({\n settings,\n onChange,\n clock = systemClock,\n grace = TOOLTIP_HOVER_GRACE,\n}: {\n settings: () => TooltipSettings;\n onChange: (visible: boolean, warm: boolean) => void;\n clock?: TooltipClock;\n grace?: number;\n}): TooltipController {\n let visible = false;\n let openTimer: unknown;\n let closeTimer: unknown;\n let group: TooltipGroupStore | null = null;\n\n const cancelOpen = () => {\n if (openTimer !== undefined) clock.clear(openTimer);\n openTimer = undefined;\n };\n const cancelClose = () => {\n if (closeTimer !== undefined) clock.clear(closeTimer);\n closeTimer = undefined;\n };\n const member: TooltipMember = { dismiss: () => hide() };\n\n function show(warm: boolean) {\n cancelOpen();\n cancelClose();\n if (visible) return;\n visible = true;\n group = settings().group;\n onChange(true, warm);\n group?.opened(member);\n }\n\n function hide() {\n cancelOpen();\n cancelClose();\n if (!visible) return;\n visible = false;\n onChange(false, false);\n group?.closed(member);\n group = null;\n }\n\n return {\n get visible() {\n return visible;\n },\n enter() {\n const { delay, disabled, group: current } = settings();\n if (disabled) return;\n cancelClose();\n if (visible || openTimer !== undefined) return;\n const warm = current?.isWarm() ?? false;\n const wait = warm ? 0 : delay;\n if (wait <= 0) {\n show(warm);\n return;\n }\n openTimer = clock.set(() => {\n openTimer = undefined;\n show(false);\n }, wait);\n },\n leave() {\n cancelOpen();\n if (!visible || closeTimer !== undefined) return;\n closeTimer = clock.set(() => {\n closeTimer = undefined;\n hide();\n }, grace);\n },\n hold() {\n cancelClose();\n },\n dismiss: hide,\n keyDown(key) {\n if (key !== \"Escape\" || (!visible && openTimer === undefined))\n return false;\n hide();\n return true;\n },\n destroy() {\n cancelOpen();\n cancelClose();\n if (!visible) return;\n visible = false;\n group?.closed(member);\n group = null;\n },\n };\n}\n\nexport function mergeDescribedBy(\n existing: string | undefined,\n id: string | undefined,\n): string | undefined {\n return [existing, id].filter(Boolean).join(\" \") || undefined;\n}\n","import { cn } from \"cn\";\nimport {\n cloneElement,\n createContext,\n Fragment,\n isValidElement,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n createTooltipController,\n createTooltipGroup,\n mergeDescribedBy,\n TOOLTIP_DELAY,\n TOOLTIP_SKIP_DELAY,\n type TooltipGroupStore,\n type TooltipSettings,\n} from \"./controller\";\n\nexport type TooltipProps = {\n content: Renderable;\n children: Renderable;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n delay?: number;\n disabled?: boolean;\n className?: string;\n};\n\nexport type TooltipGroupProps = {\n delay?: number;\n skipDelay?: number;\n children?: Renderable;\n};\n\nconst TooltipGroupContext = createContext<TooltipGroupStore | null>(null);\n\nexport function TooltipGroup({\n delay = TOOLTIP_DELAY,\n skipDelay = TOOLTIP_SKIP_DELAY,\n children,\n}: TooltipGroupProps) {\n const [store] = useState(() => createTooltipGroup(delay, skipDelay));\n store.delay = delay;\n store.skipDelay = skipDelay;\n return (\n <TooltipGroupContext.Provider value={store}>\n {node(children)}\n </TooltipGroupContext.Provider>\n );\n}\n\ntype Describable = { \"aria-describedby\"?: string };\n\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n delay,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const group = useContext(TooltipGroupContext);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const settings = useRef<TooltipSettings>({\n delay: TOOLTIP_DELAY,\n disabled,\n group,\n });\n settings.current = {\n delay: delay ?? group?.delay ?? TOOLTIP_DELAY,\n disabled,\n group,\n };\n const [shown, setShown] = useState({ visible: false, warm: false });\n const [controller] = useState(() =>\n createTooltipController({\n settings: () => settings.current,\n onChange: (visible, warm) => setShown({ visible, warm }),\n }),\n );\n const { visible, warm } = shown;\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLSpanElement>(visible, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side,\n align: \"center\",\n offset: 6,\n });\n\n useEffect(() => () => controller.destroy(), [controller]);\n\n useEffect(() => {\n if (disabled) controller.dismiss();\n }, [disabled, controller]);\n\n useEffect(() => {\n if (!visible) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n controller.keyDown(event.key);\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [visible, controller]);\n\n const describedBy = visible ? id : undefined;\n const cloneable =\n isValidElement<Describable>(children) && children.type !== Fragment;\n const trigger = cloneable\n ? cloneElement(children, {\n \"aria-describedby\": mergeDescribedBy(\n children.props[\"aria-describedby\"],\n describedBy,\n ),\n })\n : node(children);\n\n return (\n <span\n className={cn(\"sph-tooltip\", className)}\n onMouseEnter={controller.enter}\n onMouseLeave={controller.leave}\n onFocus={controller.enter}\n onBlur={controller.dismiss}\n onKeyDown={(event) => controller.keyDown(event.key)}\n >\n <span\n ref={triggerRef}\n className=\"sph-tooltip__trigger\"\n aria-describedby={cloneable ? undefined : describedBy}\n >\n {trigger}\n </span>\n {present &&\n portaled &&\n createPortal(\n <span\n id={id}\n ref={contentRef}\n className=\"sph-tooltip__content\"\n data-side={side}\n data-state={state}\n data-warm={warm || undefined}\n role=\"tooltip\"\n onMouseEnter={controller.hold}\n onMouseLeave={controller.leave}\n >\n {node(content)}\n </span>,\n document.body,\n )}\n </span>\n );\n}\n","/**\n * Nice tick values covering `[min, max]` using 1 / 2 / 2.5 / 5 / 10 steps.\n * Returns a single tick when the range is degenerate.\n */\nexport function niceTicks(min: number, max: number, count = 4): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) {\n return [min];\n }\n const rawStep = (max - min) / Math.max(1, count);\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const normalized = rawStep / magnitude;\n const step =\n (normalized <= 1\n ? 1\n : normalized <= 2\n ? 2\n : normalized <= 2.5\n ? 2.5\n : normalized <= 5\n ? 5\n : 10) * magnitude;\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n for (let value = start; value <= max + step / 1000; value += step) {\n ticks.push(Math.round(value * 1e10) / 1e10);\n }\n return ticks;\n}\n\n/** Linear map from a data domain into an output range (defaults to 0–100). */\nexport function linearScale(\n domainMin: number,\n domainMax: number,\n rangeMin = 0,\n rangeMax = 100,\n): (value: number) => number {\n const span = domainMax - domainMin || 1;\n return (value) =>\n rangeMin + ((value - domainMin) / span) * (rangeMax - rangeMin);\n}\n\n/** Contiguous non-null runs: a `null` breaks a line into segments. */\nexport function runs(\n values: (number | null)[],\n): { start: number; values: number[] }[] {\n const segments: { start: number; values: number[] }[] = [];\n let current: { start: number; values: number[] } | null = null;\n values.forEach((value, index) => {\n if (value === null || value === undefined) {\n current = null;\n return;\n }\n if (!current) {\n current = { start: index, values: [] };\n segments.push(current);\n }\n current.values.push(value);\n });\n return segments;\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100;\n\n/** Polyline through points; optionally curved with a Catmull-Rom spline. */\nexport function linePath(points: [number, number][], smooth = false): string {\n if (points.length === 0) return \"\";\n const first = points[0];\n if (points.length === 1) return `M${round(first[0])},${round(first[1])}`;\n if (!smooth) {\n return points\n .map(\n ([x, y], index) => `${index === 0 ? \"M\" : \"L\"}${round(x)},${round(y)}`,\n )\n .join(\" \");\n }\n\n let path = `M${round(first[0])},${round(first[1])}`;\n for (let index = 0; index < points.length - 1; index += 1) {\n const p0 = points[index - 1] ?? points[index];\n const p1 = points[index];\n const p2 = points[index + 1];\n const p3 = points[index + 2] ?? p2;\n const c1x = p1[0] + (p2[0] - p0[0]) / 6;\n const c1y = p1[1] + (p2[1] - p0[1]) / 6;\n const c2x = p2[0] - (p3[0] - p1[0]) / 6;\n const c2y = p2[1] - (p3[1] - p1[1]) / 6;\n path += ` C${round(c1x)},${round(c1y)} ${round(c2x)},${round(c2y)} ${round(p2[0])},${round(p2[1])}`;\n }\n return path;\n}\n\n/** Line path closed down to a baseline y for area fills. */\nexport function areaPath(\n points: [number, number][],\n baselineY: number,\n smooth = false,\n): string {\n if (points.length === 0) return \"\";\n const line = linePath(points, smooth);\n const start = points[0];\n const end = points[points.length - 1];\n return `${line} L${round(end[0])},${round(baselineY)} L${round(start[0])},${round(baselineY)} Z`;\n}\n\n/** Left edge and width (in %) of one bar inside a grouped band. */\nexport function barRect(\n bandIndex: number,\n seriesIndex: number,\n bands: number,\n seriesCount: number,\n): { left: number; width: number } {\n const band = 100 / Math.max(1, bands);\n const gap = band * 0.3;\n const inner = band - gap;\n const slot = inner / Math.max(1, seriesCount);\n const width = slot * 0.7;\n const left =\n band * bandIndex + gap / 2 + slot * seriesIndex + (slot - width) / 2;\n return { left: round(left), width: round(width) };\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport {\n areaPath,\n barRect,\n linearScale,\n linePath,\n niceTicks,\n runs,\n} from \"./scale\";\n\nexport type ChartSeries = {\n name: string;\n /** One entry per category; `null` breaks the line into segments. */\n values: (number | null)[];\n tone?: \"accent\" | \"success\" | \"danger\" | \"muted\";\n};\n\nexport type ChartProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n /** Labels along the x-axis. */\n categories: string[];\n series: ChartSeries[];\n /** Marks drawn on the plot. Default \"line\". */\n variant?: \"line\" | \"bar\" | \"area\";\n /** Plot height in pixels. Default 160. */\n height?: number;\n /** Curve the line (Catmull-Rom). Default false. */\n smooth?: boolean;\n /** Target y-axis ticks; nice numbers win. Default 4. */\n ticks?: number;\n /** Formats axis and tooltip values. Trims decimals by default. */\n format?: (value: number) => string;\n /** Show the legend. Defaults to shown for more than one series. */\n legend?: boolean;\n /** Accessible summary for the plot. */\n label?: string;\n};\n\n/** Fallback palette for series without an explicit tone, by series index. */\nconst PALETTE = [\"accent\", \"success\", \"muted\", \"danger\"] as const;\n\nconst TONE_VAR: Record<NonNullable<ChartSeries[\"tone\"]>, string> = {\n accent: \"var(--sph-accent)\",\n success: \"var(--sph-success)\",\n danger: \"var(--sph-danger)\",\n muted: \"var(--sph-text-muted)\",\n};\n\nconst defaultFormat = (value: number) =>\n Number.isInteger(value) ? String(value) : String(Math.round(value * 10) / 10);\n\nexport function Chart({\n categories,\n series,\n variant = \"line\",\n height = 160,\n smooth = false,\n ticks = 4,\n format = defaultFormat,\n legend,\n label,\n className,\n ...props\n}: ChartProps) {\n const gradientId = useId();\n const anchorName = `--sph-chart-anchor-${gradientId.replace(/\\W/g, \"\")}`;\n const [hidden, setHidden] = useState<ReadonlySet<number>>(new Set());\n const [hover, setHover] = useState<number | null>(null);\n\n const count = Math.max(1, categories.length);\n const bandPct = 100 / count;\n const xPct = (index: number) => (index + 0.5) * bandPct;\n const baselineZero = variant !== \"line\";\n const showLegend = legend ?? series.length > 1;\n\n const resolved = series.map((entry, index) => ({\n ...entry,\n index,\n tone: entry.tone ?? PALETTE[index % PALETTE.length],\n }));\n const shown = resolved.filter((_, index) => !hidden.has(index));\n\n const values = shown.flatMap((entry) =>\n entry.values.filter((value): value is number => value != null),\n );\n const dataMax = values.length > 0 ? Math.max(...values) : 0;\n const dataMin = baselineZero\n ? 0\n : values.length > 0\n ? Math.min(...values)\n : 0;\n\n const tickList = niceTicks(dataMin, dataMax, ticks);\n const lastTick = tickList[tickList.length - 1] ?? dataMax;\n const firstTick = tickList[0] ?? dataMin;\n const domainMin = Math.min(dataMin, firstTick);\n let domainMax = Math.max(dataMax, lastTick);\n if (domainMax <= domainMin) domainMax = domainMin + 1;\n const scale = linearScale(domainMin, domainMax, 0, 100);\n const topPct = (value: number) => 100 - scale(value);\n\n const pointsFor = (entry: (typeof resolved)[number]): [number, number][][] =>\n runs(entry.values).map((segment) =>\n segment.values.map((value, offset) => [\n xPct(segment.start + offset),\n topPct(value),\n ]),\n );\n\n const toggle = (index: number) => {\n setHidden((current) => {\n const next = new Set(current);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n };\n\n const summary =\n label ??\n `${variant.charAt(0).toUpperCase()}${variant.slice(1)} chart: ` +\n (series.length > 0\n ? `${series.map((entry) => entry.name).join(\", \")} across ${categories.length} categories.`\n : \"no series.\");\n\n const anchor =\n hover === null\n ? undefined\n : (shown.find((entry) => entry.values[hover] != null) ?? shown[0]);\n const anchorValue = hover !== null && anchor ? anchor.values[hover] : null;\n const anchorTop = anchorValue != null ? topPct(anchorValue) : 50;\n const pointerX = hover === null ? 50 : xPct(hover);\n\n const longestTick = Math.max(\n 3,\n ...tickList.map((tick) => format(tick).length),\n );\n\n return (\n <figure\n {...node(props)}\n className={cn(\"sph-chart\", className)}\n data-variant={variant}\n >\n {showLegend && (\n <figcaption className=\"sph-chart__legend\" aria-label=\"Series\">\n {series.map((entry, index) => {\n const isHidden = hidden.has(index);\n return (\n <button\n key={`legend-${entry.name}-${index}`}\n type=\"button\"\n className=\"sph-chart__legend-item\"\n aria-pressed={!isHidden}\n data-hidden={isHidden || undefined}\n onClick={() => toggle(index)}\n >\n <span\n className=\"sph-chart__legend-dot\"\n style={{ background: TONE_VAR[resolved[index].tone] }}\n aria-hidden=\"true\"\n />\n {entry.name}\n </button>\n );\n })}\n </figcaption>\n )}\n <div\n className=\"sph-chart__plot\"\n role=\"img\"\n aria-label={summary}\n style={{ gridTemplateRows: `${height}px auto` }}\n >\n <div\n className=\"sph-chart__yaxis\"\n style={{ width: `calc(${longestTick}ch + 8px)`, fontSize: \"10px\" }}\n >\n {tickList.map((tick) => (\n <span key={`y-${tick}`} style={{ bottom: `${scale(tick)}%` }}>\n {format(tick)}\n </span>\n ))}\n </div>\n <div\n className=\"sph-chart__area\"\n style={\n {\n \"--sph-chart-anchor\": anchorName,\n \"--sph-chart-x\": `${pointerX}%`,\n \"--sph-chart-y\": `${anchorTop}%`,\n } as CSSProperties & Record<string, string>\n }\n onPointerMove={(event) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const ratio =\n rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0;\n setHover(\n Math.min(count - 1, Math.max(0, Math.floor(ratio * count))),\n );\n }}\n onPointerLeave={() => setHover(null)}\n >\n <div className=\"sph-chart__grid\" aria-hidden=\"true\">\n {tickList.map((tick) => (\n <i key={`g-${tick}`} style={{ bottom: `${scale(tick)}%` }} />\n ))}\n </div>\n\n {variant === \"bar\" ? (\n <div className=\"sph-chart__bands\">\n {categories.map((_, band) => (\n <div\n key={`band-${band}`}\n className=\"sph-chart__band\"\n style={{ width: `${bandPct}%` }}\n >\n {shown.map((entry, position) => {\n const value = entry.values[band];\n if (value == null) return null;\n const rect = barRect(0, position, 1, shown.length);\n return (\n <div\n key={`bar-${entry.name}-${entry.tone}`}\n className=\"sph-chart__bar\"\n style={{\n left: `${rect.left}%`,\n width: `${rect.width}%`,\n height: `${scale(value)}%`,\n background: TONE_VAR[entry.tone],\n }}\n />\n );\n })}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"sph-chart__series-layer\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n {variant === \"area\" && (\n <defs>\n {shown.map((entry) => (\n <linearGradient\n key={`grad-${entry.index}`}\n id={`${gradientId}-s${entry.index}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop\n offset=\"0%\"\n style={{\n stopColor: TONE_VAR[entry.tone],\n stopOpacity: 0.32,\n }}\n />\n <stop\n offset=\"100%\"\n style={{\n stopColor: TONE_VAR[entry.tone],\n stopOpacity: 0,\n }}\n />\n </linearGradient>\n ))}\n </defs>\n )}\n {variant === \"area\" &&\n shown.map((entry) =>\n pointsFor(entry).map((points, segmentIndex) => (\n <path\n key={`fill-${entry.index}-${segmentIndex}`}\n d={areaPath(points, 100, smooth)}\n fill={`url(#${gradientId}-s${entry.index})`}\n />\n )),\n )}\n {shown.map((entry) =>\n pointsFor(entry).map((points, segmentIndex) => (\n <path\n key={`line-${entry.index}-${segmentIndex}`}\n className=\"sph-chart__line\"\n d={linePath(points, smooth)}\n fill=\"none\"\n stroke={TONE_VAR[entry.tone]}\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n )),\n )}\n </svg>\n </div>\n )}\n\n <span className=\"sph-chart__anchor\" aria-hidden=\"true\" />\n\n {hover !== null && (\n <>\n {variant === \"bar\" ? (\n <div\n key={`tint-${hover}`}\n className=\"sph-chart__band-tint\"\n style={{\n left: `${hover * bandPct}%`,\n width: `${bandPct}%`,\n }}\n aria-hidden=\"true\"\n />\n ) : (\n <div\n key={`guide-${hover}`}\n className=\"sph-chart__guide\"\n style={{ left: `${xPct(hover)}%` }}\n aria-hidden=\"true\"\n />\n )}\n {variant !== \"bar\" &&\n shown.map((entry) => {\n const value = entry.values[hover];\n if (value == null) return null;\n return (\n <span\n key={`dot-${hover}-${entry.name}-${entry.tone}`}\n className=\"sph-chart__dot\"\n style={{\n left: `${xPct(hover)}%`,\n top: `${topPct(value)}%`,\n background: TONE_VAR[entry.tone],\n }}\n aria-hidden=\"true\"\n />\n );\n })}\n {anchor !== undefined && (\n <div key={`tip-${hover}`} className=\"sph-chart__tooltip\">\n <div className=\"sph-chart__tooltip-card\">\n <span className=\"sph-chart__tooltip-label\">\n {categories[hover]}\n </span>\n {shown.map((entry) => {\n const value = entry.values[hover];\n return (\n <span\n key={`tip-row-${entry.name}-${entry.tone}`}\n className=\"sph-chart__tooltip-row\"\n >\n <i\n style={{ background: TONE_VAR[entry.tone] }}\n aria-hidden=\"true\"\n />\n <span>{entry.name}</span>\n <b>{value == null ? \"–\" : format(value)}</b>\n </span>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n <div className=\"sph-chart__xaxis\">\n {categories.map((category, index) => (\n <span\n key={`x-${category}-${index}`}\n style={{ flex: `0 0 ${bandPct}%` }}\n >\n {category}\n </span>\n ))}\n </div>\n </div>\n </figure>\n );\n}\n","import { CaretRightIcon, MagnifyingGlassIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Kbd } from \"@/atoms/Kbd\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { filterItems } from \"@/lib/filter.js\";\nimport { useFocusTrap } from \"@/lib/focus.js\";\nimport { Highlight } from \"@/lib/highlight.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n inheritScope,\n useIsoLayoutEffect,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { motionDurationMs, usePresence } from \"@/lib/presence.js\";\n\nexport type CommandItem = {\n id?: string;\n label: Renderable;\n /** Value reported to `onSelect` when omitted (falls back to the label). */\n value?: string;\n icon?: Renderable;\n /** Groups options under a heading; ungrouped options always come first. */\n group?: string;\n /** Muted text trailing the option (chevrons are drawn for parents). */\n hint?: Renderable;\n badge?: Renderable;\n shortcut?: string[];\n /** Extra terms matched by the filter but never highlighted. */\n keywords?: string;\n disabled?: boolean;\n /** Sub-options: activating this option drills into a new level. */\n children?: CommandItem[];\n};\n\nexport type CommandPaletteProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: CommandItem[];\n onSelect?: (item: CommandItem) => void;\n placeholder?: string;\n emptyMessage?: Renderable;\n /** Label of the breadcrumb that returns to the root level. */\n homeLabel?: string;\n ariaLabel?: string;\n /** Bind Cmd/Ctrl+K to toggle the palette. Default: false. */\n hotkey?: boolean;\n className?: string;\n};\n\ntype FlatOption = {\n item: CommandItem;\n /** Match positions inside a string label, for highlighting. */\n indexes: number[];\n activeId: string;\n /** Position in display order (sections reorder the raw matches). */\n index: number;\n};\n\ntype Section = {\n heading: string | undefined;\n entries: FlatOption[];\n};\n\n/** Re-runs a CSS animation by detaching, reflowing, and re-attaching it. */\nfunction replay(element: HTMLElement | null, className: string) {\n if (!element) return;\n element.classList.remove(className);\n void element.offsetWidth;\n element.classList.add(className);\n}\n\nfunction readableLabel(item: CommandItem): string {\n return typeof item.label === \"string\" ? item.label : \"\";\n}\n\nfunction crumbLabel(item: CommandItem, fallback: string): string {\n const label = readableLabel(item);\n if (label) return label;\n if (typeof item.value === \"string\" && item.value) return item.value;\n return fallback;\n}\n\nfunction resolveActive(options: FlatOption[], wanted: number): number {\n if (options.length === 0) return -1;\n const start = Math.min(Math.max(wanted, 0), options.length - 1);\n const enabled = (index: number) => !options[index]?.item.disabled;\n if (enabled(start)) return start;\n for (let index = start + 1; index < options.length; index += 1)\n if (enabled(index)) return index;\n for (let index = 0; index < start; index += 1)\n if (enabled(index)) return index;\n return start;\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n items,\n onSelect,\n placeholder = \"Type a command or search…\",\n emptyMessage = \"No results.\",\n homeLabel = \"Home\",\n ariaLabel = \"Command palette\",\n hotkey = false,\n className,\n}: CommandPaletteProps) {\n const listId = useId();\n const rootRef = useRef<HTMLElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const indicatorRef = useRef<HTMLSpanElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const previousPathLength = useRef<number | null>(null);\n const heightCleanup = useRef<(() => void) | null>(null);\n const [path, setPath] = useState<CommandItem[]>([]);\n const [query, setQuery] = useState(\"\");\n const [activeState, setActive] = useState(0);\n const {\n present,\n state,\n ref: backdropRef,\n } = usePresence<HTMLDivElement>(open, \"normal\");\n const portaled = usePortaled();\n const visible = present && portaled;\n\n useFocusTrap(rootRef, visible, inputRef);\n\n const levelItems =\n path.length > 0 ? (path[path.length - 1]?.children ?? []) : items;\n\n const { sections, options } = useMemo(() => {\n const read = (item: CommandItem) => ({\n label: readableLabel(item),\n keywords: [\n item.keywords ?? \"\",\n ...(item.children ?? []).map((child) => readableLabel(child)),\n ]\n .filter(Boolean)\n .join(\" \"),\n });\n const filtered = filterItems(levelItems, query, read);\n const ungrouped = filtered.filter(\n (entry) => entry.item.group === undefined,\n );\n const groupNames = [\n ...new Set(\n filtered\n .map((entry) => entry.item.group)\n .filter((name): name is string => name !== undefined),\n ),\n ];\n const grouped = groupNames.map((name) => ({\n heading: name,\n entries: filtered.filter((entry) => entry.item.group === name),\n }));\n const raw = [\n ...(ungrouped.length > 0\n ? [{ heading: undefined, entries: ungrouped }]\n : []),\n ...grouped,\n ];\n let order = 0;\n const built: Section[] = raw.map((section) => ({\n heading: section.heading,\n entries: section.entries.map((entry) => ({\n item: entry.item,\n indexes: entry.indexes,\n activeId: `${listId}-option-${order}`,\n index: order++,\n })),\n }));\n return { sections: built, options: built.flatMap((s) => s.entries) };\n }, [levelItems, listId, query]);\n\n const active = resolveActive(options, activeState);\n\n const close = () => onOpenChange(false);\n\n const activate = (index: number) => {\n const item = options[index]?.item;\n if (!item || item.disabled) return;\n if (item.children && item.children.length > 0) {\n setPath([...path, item]);\n setQuery(\"\");\n return;\n }\n onSelect?.(item);\n close();\n };\n\n const move = (direction: 1 | -1) => {\n if (options.length === 0) return;\n let index = active < 0 ? 0 : active;\n for (let step = 0; step < options.length; step += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.item.disabled) {\n setActive(index);\n return;\n }\n }\n };\n\n const goToLevel = (length: number) => {\n setPath(path.slice(0, length));\n setQuery(\"\");\n };\n\n const handleInputKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n move(1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n move(-1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setActive(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setActive(options.length - 1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n if (active >= 0) activate(active);\n }\n };\n\n useEffect(() => {\n if (!open) {\n setPath([]);\n setQuery(\"\");\n setActive(0);\n }\n }, [open]);\n\n useEffect(() => {\n inputRef.current?.setAttribute(\"spellcheck\", \"false\");\n }, [visible]);\n\n useEffect(() => {\n setActive(0);\n }, [path, query]);\n\n useEffect(() => {\n if (!hotkey) return;\n const handleHotkey = (event: globalThis.KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n event.preventDefault();\n onOpenChange(!open);\n }\n };\n document.addEventListener(\"keydown\", handleHotkey);\n return () => document.removeEventListener(\"keydown\", handleHotkey);\n }, [hotkey, onOpenChange, open]);\n\n useEffect(() => {\n if (!visible) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n if (query) setQuery(\"\");\n else if (path.length > 0) setPath(path.slice(0, -1));\n else close();\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (!rootRef.current?.contains(target)) close();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [onOpenChange, path, query, visible]);\n\n useEffect(() => {\n if (!visible || active < 0) return;\n const option = trackRef.current?.querySelector<HTMLElement>(\n '[data-active=\"true\"]',\n );\n option?.scrollIntoView({ block: \"nearest\" });\n }, [active, visible]);\n\n useIsoLayoutEffect(() => {\n const indicator = indicatorRef.current;\n const track = trackRef.current;\n if (!visible || !indicator || !track || active < 0) return;\n const option = track.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n if (!option) return;\n const trackRect = track.getBoundingClientRect();\n const optionRect = option.getBoundingClientRect();\n const first = !indicator.style.width;\n if (first) indicator.style.transition = \"none\";\n indicator.style.opacity = \"1\";\n indicator.style.width = `${optionRect.width}px`;\n indicator.style.height = `${optionRect.height}px`;\n indicator.style.transform = `translate(${optionRect.left - trackRect.left}px, ${optionRect.top - trackRect.top}px)`;\n if (first)\n requestAnimationFrame(() => {\n indicator.style.transition = \"\";\n });\n }, [active, options, present, portaled]);\n\n useIsoLayoutEffect(() => {\n inheritScope(document.activeElement, backdropRef.current);\n const body = bodyRef.current;\n const inner = innerRef.current;\n if (!visible || !body || !inner) return;\n heightCleanup.current?.();\n heightCleanup.current = null;\n\n const duration = motionDurationMs(body, \"normal\");\n if (duration <= 0) {\n body.style.height = \"\";\n return;\n }\n\n const current = body.style.height\n ? Number.parseFloat(body.style.height)\n : body.getBoundingClientRect().height;\n if (!body.style.height) {\n body.style.height = `${current}px`;\n return;\n }\n const target = inner.getBoundingClientRect().height;\n if (Math.abs(current - target) < 1) {\n body.style.height = `${target}px`;\n return;\n }\n\n body.style.transition = \"none\";\n body.style.height = `${current}px`;\n void body.offsetHeight;\n body.style.transition = `height ${duration}ms var(--sph-ease-emphasis)`;\n body.style.height = `${target}px`;\n const settle = () => {\n body.style.transition = \"\";\n heightCleanup.current = null;\n };\n body.addEventListener(\"transitionend\", settle, { once: true });\n heightCleanup.current = () =>\n body.removeEventListener(\"transitionend\", settle);\n }, [path, present, portaled, query, visible]);\n\n useIsoLayoutEffect(() => {\n if (!visible) {\n previousPathLength.current = null;\n return;\n }\n const previous = previousPathLength.current;\n previousPathLength.current = path.length;\n if (previous === null || previous === path.length) return;\n replay(panelRef.current, \"sph-level-pulse\");\n replay(trackRef.current, \"sph-level-fade\");\n }, [path, visible]);\n\n if (!visible) return null;\n\n return createPortal(\n <div\n ref={backdropRef}\n className=\"sph-palette__backdrop\"\n data-state={state}\n role=\"presentation\"\n >\n <section\n ref={rootRef}\n className={cn(\"sph-palette\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n >\n <div ref={panelRef} className=\"sph-palette__panel\">\n <nav className=\"sph-palette__crumbs\" aria-label=\"Breadcrumb\">\n {\" \"}\n <button\n type=\"button\"\n className=\"sph-palette__crumb sph-motion-in sph-motion-in--blur\"\n data-current={path.length === 0 || undefined}\n onClick={() => goToLevel(0)}\n >\n {homeLabel}\n </button>\n {path.flatMap((entry, index) => [\n <span\n key={`sep-${index}`}\n className=\"sph-palette__crumb-sep\"\n aria-hidden=\"true\"\n >\n <CaretRightIcon size={11} weight=\"bold\" />\n </span>,\n <button\n key={`crumb-${index}`}\n type=\"button\"\n className=\"sph-palette__crumb sph-motion-in sph-motion-in--blur\"\n data-current={index === path.length - 1 || undefined}\n onClick={() => goToLevel(index + 1)}\n >\n {crumbLabel(entry, homeLabel)}\n </button>,\n ])}\n </nav>\n\n <div className=\"sph-palette__search\">\n <MagnifyingGlassIcon\n className=\"sph-palette__search-icon\"\n size={15}\n aria-hidden=\"true\"\n />\n <input\n ref={inputRef}\n className=\"sph-palette__input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded\n aria-controls={listId}\n aria-activedescendant={\n active >= 0 ? options[active]?.activeId : undefined\n }\n aria-autocomplete=\"list\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={query}\n autoComplete=\"off\"\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={handleInputKeyDown}\n />\n <button\n type=\"button\"\n className=\"sph-kbd sph-palette__escape\"\n aria-label=\"Close command palette\"\n onClick={close}\n >\n <span className=\"sph-kbd__key\">Esc</span>\n </button>\n </div>\n\n <div className=\"sph-palette__body\" ref={bodyRef}>\n <div\n className=\"sph-palette__list\"\n ref={innerRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel}\n >\n <div className=\"sph-palette__track\" ref={trackRef}>\n <span\n className=\"sph-palette__indicator\"\n ref={indicatorRef}\n role=\"presentation\"\n />\n {options.length === 0 && (\n <div className=\"sph-palette__empty\" role=\"status\">\n {node(emptyMessage)}\n </div>\n )}\n {sections.map((section) => (\n <div\n key={section.heading ?? \"section-root\"}\n className=\"sph-palette__group\"\n role=\"group\"\n aria-labelledby={\n section.heading !== undefined\n ? `${listId}-group-${section.heading}`\n : undefined\n }\n >\n {section.heading !== undefined && (\n <div\n className=\"sph-palette__heading\"\n id={`${listId}-group-${section.heading}`}\n >\n {section.heading}\n </div>\n )}\n {section.entries.map((option) => {\n const item = option.item;\n const index = option.index;\n return (\n <div\n key={item.id ?? `${readableLabel(item)}-${index}`}\n id={option.activeId}\n className=\"sph-palette__option\"\n role=\"option\"\n data-index={index}\n data-active={index === active ? \"true\" : undefined}\n data-disabled={item.disabled || undefined}\n aria-selected={index === active}\n aria-disabled={item.disabled || undefined}\n onPointerEnter={() => {\n if (!item.disabled) setActive(index);\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => activate(index)}\n >\n {item.icon !== undefined && (\n <span\n className=\"sph-palette__icon\"\n aria-hidden=\"true\"\n >\n {node(item.icon)}\n </span>\n )}\n <span className=\"sph-palette__label\">\n {typeof item.label === \"string\" ? (\n <Highlight\n text={item.label}\n indexes={option.indexes}\n />\n ) : (\n node(item.label)\n )}\n </span>\n {item.badge !== undefined && (\n <span className=\"sph-palette__badge\">\n {node(item.badge)}\n </span>\n )}\n {item.children && item.children.length > 0 ? (\n <span\n className=\"sph-palette__more\"\n aria-hidden=\"true\"\n >\n <CaretRightIcon size={13} weight=\"bold\" />\n </span>\n ) : item.hint !== undefined ? (\n <span className=\"sph-palette__hint\">\n {node(item.hint)}\n </span>\n ) : (\n item.shortcut !== undefined && (\n <Kbd keys={item.shortcut} />\n )\n )}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n <footer className=\"sph-palette__footer\" aria-hidden=\"true\">\n <span className=\"sph-palette__hintrow\">\n <Kbd keys=\"↑\" />\n <Kbd keys=\"↓\" />\n navigate\n </span>\n <span className=\"sph-palette__hintrow\">\n <Kbd keys=\"↵\" />\n select\n </span>\n <span className=\"sph-palette__hintrow\">\n <Kbd keys=\"esc\" />\n {path.length > 0 || query ? \"back\" : \"close\"}\n </span>\n </footer>\n </div>\n </section>\n </div>,\n document.body,\n );\n}\n","import { TrayIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type EmptyStateProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title: Renderable;\n description?: Renderable;\n icon?: Renderable;\n action?: Renderable;\n compact?: boolean;\n};\n\nconst emptyStateDefaultIcon = <TrayIcon size={20} />;\n\nexport function EmptyState({\n title,\n description,\n icon = emptyStateDefaultIcon,\n action,\n compact = false,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <section\n {...node(props)}\n className={cn(\"sph-empty-state\", className)}\n data-compact={compact || undefined}\n >\n <div className=\"sph-empty-state__icon\" aria-hidden=\"true\">\n {node(icon)}\n </div>\n <h2 className=\"sph-empty-state__title\">{node(title)}</h2>\n {description !== undefined && (\n <p className=\"sph-empty-state__description\">{node(description)}</p>\n )}\n {action !== undefined && (\n <div className=\"sph-empty-state__action\">{node(action)}</div>\n )}\n </section>\n );\n}\n","import { cn } from \"cn\";\nimport type { DragEvent, MouseEvent } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type DropzoneRejectReason = \"type\" | \"size\" | \"count\";\n\nexport type DropzoneFileLike = { name: string; type: string; size: number };\n\nexport type DropzoneValidation = {\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n};\n\nexport type DropzoneValidationResult<T extends DropzoneFileLike> = {\n accepted: T[];\n rejected: { reason: DropzoneRejectReason; files: T[] }[];\n};\n\nexport type MagneticDropzoneProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onDrop\" | \"onDragOver\" | \"children\"\n> & {\n /** Idle content: an icon, instructions, a choose-file button. */\n children?: Renderable;\n /** Replaces `children` while files hover over the zone. */\n activeContent?: Renderable;\n onFiles?: (files: File[]) => void;\n onReject?: (files: File[], reason: DropzoneRejectReason) => void;\n /** Forwarded to the hidden file input, e.g. \"image/*,.pdf\". */\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n label?: string;\n trigger?: \"zone\" | \"children\";\n className?: string;\n};\n\ntype ZoneKeyEvent = {\n key: string;\n repeat: boolean;\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n preventDefault(): void;\n};\n\ntype ZonePasteEvent = {\n clipboardData: DataTransfer | null;\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nconst FOCUSABLE =\n \"a[href], button, input, select, textarea, [contenteditable], [tabindex]:not([tabindex='-1'])\";\n\nfunction matchesAccept(file: DropzoneFileLike, accept: string): boolean {\n const tokens = accept\n .split(\",\")\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith(\".\")) return name.endsWith(token);\n if (token.endsWith(\"/*\")) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n}\n\nexport function validateDropzoneFiles<T extends DropzoneFileLike>(\n files: readonly T[],\n { accept, multiple = true, maxFiles, maxSize }: DropzoneValidation = {},\n): DropzoneValidationResult<T> {\n const byType: T[] = [];\n const bySize: T[] = [];\n const valid: T[] = [];\n for (const file of files) {\n if (accept && !matchesAccept(file, accept)) byType.push(file);\n else if (maxSize !== undefined && file.size > maxSize) bySize.push(file);\n else valid.push(file);\n }\n const limit = multiple ? (maxFiles ?? Number.POSITIVE_INFINITY) : 1;\n const accepted = valid.slice(0, Math.max(0, limit));\n const byCount = valid.slice(accepted.length);\n const rejected: DropzoneValidationResult<T>[\"rejected\"] = [];\n if (byType.length > 0) rejected.push({ reason: \"type\", files: byType });\n if (bySize.length > 0) rejected.push({ reason: \"size\", files: bySize });\n if (byCount.length > 0) rejected.push({ reason: \"count\", files: byCount });\n return { accepted, rejected };\n}\n\nconst plural = (count: number) => (count === 1 ? \"1 file\" : `${count} files`);\n\nconst reasonText: Record<DropzoneRejectReason, string> = {\n type: \"type not accepted\",\n size: \"too large\",\n count: \"too many files\",\n};\n\nexport function describeDropzoneResult(\n result: DropzoneValidationResult<DropzoneFileLike>,\n): string {\n const parts: string[] = [];\n if (result.accepted.length > 0) {\n parts.push(`${plural(result.accepted.length)} added.`);\n }\n for (const { reason, files } of result.rejected) {\n parts.push(`${plural(files.length)} rejected: ${reasonText[reason]}.`);\n }\n return parts.join(\" \");\n}\n\n/**\n * A drop zone whose content leans toward the pointer while files hover —\n * the pull is a CSS variable updated on dragover, so the attraction stays\n * cheap and collapses with the motion tokens.\n */\nexport function MagneticDropzone({\n children,\n activeContent,\n onFiles,\n onReject,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n disabled = false,\n label = \"Choose files\",\n trigger,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n onPaste,\n ...props\n}: MagneticDropzoneProps) {\n const zoneRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const contentRef = useRef<HTMLSpanElement>(null);\n const contentId = useId();\n const [dragging, setDragging] = useState(false);\n const [nested, setNested] = useState(false);\n const [status, setStatus] = useState({ text: \"\", count: 0 });\n\n useEffect(() => {\n const found = Boolean(contentRef.current?.querySelector(FOCUSABLE));\n if (found !== nested) setNested(found);\n });\n\n const mode = trigger ?? (nested ? \"children\" : \"zone\");\n const zone = mode === \"zone\";\n\n const pull = (event: { clientX: number; clientY: number }) => {\n const element = zoneRef.current;\n if (!element) return;\n const rect = element.getBoundingClientRect();\n const x = ((event.clientX - rect.left) / rect.width - 0.5) * 2;\n const y = ((event.clientY - rect.top) / rect.height - 0.5) * 2;\n element.style.setProperty(\"--sph-pull-x\", `${(x * 10).toFixed(1)}px`);\n element.style.setProperty(\"--sph-pull-y\", `${(y * 8).toFixed(1)}px`);\n };\n\n const reset = () => {\n const element = zoneRef.current;\n if (!element) return;\n element.style.setProperty(\"--sph-pull-x\", \"0px\");\n element.style.setProperty(\"--sph-pull-y\", \"0px\");\n };\n\n const receive = (files: File[]) => {\n if (files.length === 0) return;\n const result = validateDropzoneFiles(files, {\n accept,\n multiple,\n maxFiles,\n maxSize,\n });\n if (result.accepted.length > 0) onFiles?.(result.accepted);\n for (const { reason, files: rejected } of result.rejected) {\n onReject?.(rejected, reason);\n }\n const text = describeDropzoneResult(result);\n setStatus((previous) => ({ text, count: previous.count + 1 }));\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) {\n if (event.dataTransfer) event.dataTransfer.dropEffect = \"none\";\n return;\n }\n if (!dragging) setDragging(true);\n pull(event);\n };\n\n const handleDragLeave = (event: DragEvent<HTMLDivElement>) => {\n const next = event.relatedTarget as Node | null;\n if (next && zoneRef.current?.contains(next)) return;\n setDragging(false);\n reset();\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) return;\n setDragging(false);\n reset();\n receive(Array.from(event.dataTransfer?.files ?? []));\n };\n\n const handlePaste = (event: ZonePasteEvent) => {\n onPaste?.(node(event));\n if (disabled || event.defaultPrevented) return;\n const files = Array.from(event.clipboardData?.files ?? []);\n if (files.length === 0) return;\n event.preventDefault();\n receive(files);\n };\n\n const openPicker = () => {\n if (!disabled) inputRef.current?.click();\n };\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === inputRef.current) return;\n openPicker();\n };\n\n const handleKeyDown = (event: ZoneKeyEvent) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \" \") event.preventDefault();\n if (event.key === \"Enter\" && !event.repeat) {\n event.preventDefault();\n openPicker();\n }\n };\n\n const handleKeyUp = (event: ZoneKeyEvent) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \" \") {\n event.preventDefault();\n openPicker();\n }\n };\n\n const describedBy = [contentId, ariaDescribedBy].filter(Boolean).join(\" \");\n\n return (\n <div\n {...node(props)}\n ref={zoneRef}\n className={cn(\"sph-dropzone\", className)}\n data-active={dragging || undefined}\n data-disabled={disabled || undefined}\n data-trigger={mode}\n aria-label={zone ? undefined : ariaLabel}\n aria-describedby={zone ? undefined : ariaDescribedBy}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onPaste={handlePaste}\n onClick={handleClick}\n >\n <div\n className=\"sph-dropzone__content\"\n role={zone ? \"button\" : undefined}\n tabIndex={zone ? 0 : undefined}\n aria-label={zone ? (ariaLabel ?? label) : undefined}\n aria-describedby={zone ? describedBy : undefined}\n aria-disabled={zone && disabled ? true : undefined}\n onKeyDown={zone ? handleKeyDown : undefined}\n onKeyUp={zone ? handleKeyUp : undefined}\n >\n <span\n ref={contentRef}\n id={contentId}\n className=\"sph-dropzone__description\"\n >\n {node(\n dragging && activeContent !== undefined ? activeContent : children,\n )}\n </span>\n </div>\n <input\n ref={inputRef}\n className=\"sph-dropzone__input\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n aria-label={ariaLabel ?? label}\n tabIndex={-1}\n disabled={disabled}\n onChange={(event) => {\n receive(Array.from(event.currentTarget.files ?? []));\n event.currentTarget.value = \"\";\n }}\n />\n <span className=\"sph-dropzone__status\" role=\"status\">\n {status.text}\n {status.text && status.count % 2 === 1 ? \" \" : \"\"}\n </span>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { Menu, type MenuItem } from \"@/molecules/Menu\";\n\nexport type MenubarMenu = {\n /** Accessible name for the menu and its trigger. */\n label: string;\n /** Rich trigger content; falls back to the label. */\n trigger?: Renderable;\n items: MenuItem[];\n disabled?: boolean;\n};\n\nexport type MenubarProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"onSelect\"\n> & {\n menus: MenubarMenu[];\n onSelect?: (value: string) => void;\n /** Accessible name for the bar itself. */\n label?: string;\n};\n\n/** How long a pointer must rest on a closed bar before its menu opens. */\nconst HOVER_INTENT_MS = 160;\n\n/**\n * The classic application menu bar. Menus run controlled off a single\n * `openIndex`: hovering a closed bar opens after a short intent delay, an\n * already-open bar slides straight across, and the arrow keys walk the\n * triggers with wrap-around.\n */\nexport function Menubar({\n menus,\n onSelect,\n label = \"Main\",\n className,\n ...props\n}: MenubarProps) {\n const barRef = useRef<HTMLDivElement>(null);\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearHover = () => {\n if (hoverTimer.current !== null) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n };\n\n useEffect(() => clearHover, []);\n\n const listTriggers = () =>\n Array.from(\n barRef.current?.querySelectorAll<HTMLButtonElement>(\n \".sph-menu__trigger\",\n ) ?? [],\n );\n\n const handleBarKeyDown = (event: KeyboardActionEvent) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(event.key)) return;\n const list = listTriggers();\n const pos = list.indexOf(document.activeElement as HTMLButtonElement);\n if (pos === -1) return;\n event.preventDefault();\n const last = list.length - 1;\n const nextPos =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? last\n : event.key === \"ArrowRight\"\n ? (pos + 1) % list.length\n : (pos - 1 + list.length) % list.length;\n list[nextPos]?.focus();\n\n if (openIndex !== null) setOpenIndex(nextPos);\n };\n\n const handleTriggerEnter = (index: number) => {\n if (menus[index]?.disabled) return;\n if (openIndex === index) return;\n clearHover();\n if (openIndex !== null) {\n setOpenIndex(index);\n return;\n }\n hoverTimer.current = setTimeout(() => setOpenIndex(index), HOVER_INTENT_MS);\n };\n\n const handleTriggerLeave = () => {\n if (openIndex === null) clearHover();\n };\n\n return (\n <div\n {...node(props)}\n ref={barRef}\n role=\"menubar\"\n aria-label={label}\n className={cn(\"sph-menubar\", className)}\n onKeyDown={handleBarKeyDown}\n onPointerLeave={handleTriggerLeave}\n >\n {menus.map((menu, index) => (\n <div\n key={`menubar-menu-${index}`}\n className=\"sph-menubar__slot-wrap\"\n onPointerEnter={() => handleTriggerEnter(index)}\n onPointerLeave={handleTriggerLeave}\n >\n <Menu\n className=\"sph-menubar__slot\"\n trigger={menu.trigger ?? menu.label}\n label={menu.label}\n items={menu.items}\n disabled={menu.disabled}\n align={index === menus.length - 1 ? \"end\" : \"start\"}\n open={openIndex === index}\n onOpenChange={(next) => setOpenIndex(next ? index : null)}\n onSelect={onSelect}\n />\n </div>\n ))}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { Collapsible } from \"@/molecules/Collapsible\";\n\nexport type ReasoningStep = {\n id?: string;\n title: Renderable;\n detail?: Renderable;\n status?: \"pending\" | \"active\" | \"done\";\n};\n\nexport type ReasoningStepsProps = {\n steps: ReasoningStep[];\n label?: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n};\n\nexport function ReasoningSteps({\n steps,\n label = \"Reasoning\",\n open,\n defaultOpen = true,\n onOpenChange,\n className,\n}: ReasoningStepsProps) {\n const activeCount = steps.filter((step) => step.status === \"active\").length;\n\n return (\n <div className={cn(\"sph-reasoning\", className)}>\n <Collapsible\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n trigger={\n <span className=\"sph-reasoning__trigger\">\n <span className=\"sph-reasoning__label\">{node(label)}</span>\n <span className=\"sph-reasoning__meta\">\n {activeCount > 0 && (\n <span className=\"sph-typing\" aria-hidden=\"true\">\n <i />\n <i />\n <i />\n </span>\n )}\n <span className=\"sph-reasoning__count\">\n {steps.length} {steps.length === 1 ? \"step\" : \"steps\"}\n </span>\n </span>\n </span>\n }\n >\n <ol className=\"sph-reasoning__list\">\n {steps.map((step, index) => (\n <li\n key={step.id ?? index}\n className=\"sph-reasoning__step\"\n data-status={step.status ?? \"done\"}\n style={\n { \"--sph-motion-index\": index } as CSSProperties &\n Record<string, string | number>\n }\n >\n <span className=\"sph-reasoning__marker\" aria-hidden=\"true\">\n <span className=\"sph-reasoning__dot\" />\n </span>\n <span className=\"sph-reasoning__body\">\n <span className=\"sph-reasoning__title\">{node(step.title)}</span>\n {step.detail !== undefined && (\n <span className=\"sph-reasoning__detail\">\n {node(step.detail)}\n </span>\n )}\n </span>\n <span className=\"sph-reasoning__status\">\n {step.status === \"active\"\n ? \"thinking\"\n : step.status === \"pending\"\n ? \"queued\"\n : \"done\"}\n </span>\n </li>\n ))}\n </ol>\n </Collapsible>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useMemo, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type ResizableProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n /** The panes, in visual order. A handle is rendered between each pair. */\n panes: Renderable[];\n direction?: \"horizontal\" | \"vertical\";\n /** Controlled pane sizes in percent; they should sum to 100. */\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n /** Smallest share a pane may keep, in percent. Default: 10. */\n min?: number;\n handleLabel?: string;\n};\n\n/**\n * Structural event shapes: React's and Preact's pointer/keyboard events do\n * not share types, but everything this component reads is common ground.\n */\ntype PointerLike = {\n clientX: number;\n clientY: number;\n pointerId: number;\n button: number;\n currentTarget: EventTarget & {\n setPointerCapture(id: number): void;\n releasePointerCapture(id: number): void;\n };\n preventDefault(): void;\n};\n\ntype KeyboardLike = KeyboardActionEvent & { shiftKey: boolean };\n\nfunction clamp(value: number, low: number, high: number): number {\n return Math.min(Math.max(value, low), high);\n}\n\nexport function Resizable({\n panes,\n direction = \"horizontal\",\n sizes,\n defaultSizes,\n onSizesChange,\n min = 10,\n handleLabel = \"Resize panels\",\n className,\n ...props\n}: ResizableProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [uncontrolled, setUncontrolled] = useState<number[]>(\n () => defaultSizes ?? [],\n );\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n const drag = useRef<{\n index: number;\n pointer: { x: number; y: number };\n sizes: number[];\n extent: number;\n } | null>(null);\n\n const even = useMemo(\n () => panes.map(() => 100 / Math.max(panes.length, 1)),\n [panes.length],\n );\n const candidate = sizes ?? uncontrolled;\n const active =\n candidate.length === panes.length && panes.length > 0 ? candidate : even;\n\n const commit = (next: number[]) => {\n setUncontrolled(next);\n onSizesChange?.(next);\n };\n\n const startDrag = (event: PointerLike, index: number) => {\n if (event.button !== 0) return;\n const rect = rootRef.current?.getBoundingClientRect();\n if (!rect) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n drag.current = {\n index,\n pointer: { x: event.clientX, y: event.clientY },\n sizes: [...active],\n extent: direction === \"horizontal\" ? rect.width : rect.height,\n };\n setDragIndex(index);\n };\n\n const moveDrag = (event: PointerLike) => {\n const state = drag.current;\n if (!state || state.extent <= 0) return;\n const position = direction === \"horizontal\" ? event.clientX : event.clientY;\n const origin =\n direction === \"horizontal\" ? state.pointer.x : state.pointer.y;\n const delta = ((position - origin) / state.extent) * 100;\n\n const next = [...state.sizes];\n const before = next[state.index] ?? 0;\n const after = next[state.index + 1] ?? 0;\n const span = before + after;\n const moved = clamp(before + delta, min, span - min);\n next[state.index] = moved;\n next[state.index + 1] = span - moved;\n commit(next);\n };\n\n const endDrag = (event: PointerLike) => {\n if (drag.current === null) return;\n drag.current = null;\n setDragIndex(null);\n if (event.pointerId !== undefined) {\n try {\n event.currentTarget.releasePointerCapture(event.pointerId);\n } catch {}\n }\n };\n\n const handleKeyDown = (event: KeyboardLike, index: number) => {\n const step =\n (event.shiftKey ? 10 : 2) *\n (direction === \"horizontal\"\n ? event.key === \"ArrowLeft\"\n ? -1\n : event.key === \"ArrowRight\"\n ? 1\n : 0\n : event.key === \"ArrowUp\"\n ? -1\n : event.key === \"ArrowDown\"\n ? 1\n : 0);\n if (step === 0) return;\n event.preventDefault();\n const next = [...active];\n const before = next[index] ?? 0;\n const after = next[index + 1] ?? 0;\n const span = before + after;\n const moved = clamp(before + step, min, span - min);\n next[index] = moved;\n next[index + 1] = span - moved;\n commit(next);\n };\n\n return (\n <div\n {...node(props)}\n ref={rootRef}\n className={cn(\"sph-resizable\", className)}\n data-direction={direction}\n >\n {panes.flatMap((pane, index) => {\n const items = [\n <div\n key={`pane-${index}`}\n className=\"sph-resizable__pane\"\n style={{\n flexGrow: active[index] ?? even[index] ?? 1,\n flexBasis: 0,\n minWidth: 0,\n minHeight: 0,\n }}\n >\n {node(pane)}\n </div>,\n ];\n if (index < panes.length - 1) {\n items.push(\n <div\n key={`handle-${index}`}\n role=\"separator\"\n tabIndex={0}\n aria-orientation={\n direction === \"horizontal\" ? \"vertical\" : \"horizontal\"\n }\n aria-valuenow={Math.round(active[index] ?? 0)}\n aria-label={handleLabel}\n className=\"sph-resizable__handle\"\n data-dragging={dragIndex === index || undefined}\n onPointerDown={(event) => startDrag(event, index)}\n onPointerMove={moveDrag}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={(event) => handleKeyDown(event, index)}\n />,\n );\n }\n return items;\n })}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SidebarItem = {\n value: string;\n label: Renderable;\n icon?: Renderable;\n badge?: Renderable;\n disabled?: boolean;\n};\n\nexport type SidebarSection = {\n title?: string;\n items: SidebarItem[];\n};\n\nexport type SidebarProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"onSelect\"\n> & {\n sections: SidebarSection[];\n /** Controlled active item. */\n value?: string;\n defaultValue?: string;\n onSelect?: (value: string) => void;\n header?: Renderable;\n footer?: Renderable;\n /** Show the collapse toggle. Default: false. */\n collapsible?: boolean;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n ariaLabel?: string;\n};\n\nexport function Sidebar({\n sections,\n value,\n defaultValue,\n onSelect,\n header,\n footer,\n collapsible = false,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n ariaLabel = \"Primary\",\n className,\n ...props\n}: SidebarProps) {\n const listId = useId();\n const [uncontrolled, setUncontrolled] = useState(defaultCollapsed);\n const isCollapsed = collapsed ?? uncontrolled;\n const active = value ?? defaultValue;\n\n const toggleCollapsed = () => {\n const next = !isCollapsed;\n setUncontrolled(next);\n onCollapsedChange?.(next);\n };\n\n return (\n <aside\n {...node(props)}\n className={cn(\"sph-sidebar\", className)}\n data-collapsed={isCollapsed || undefined}\n >\n {header !== undefined && (\n <div className=\"sph-sidebar__header\">{node(header)}</div>\n )}\n <nav className=\"sph-sidebar__nav\" aria-label={ariaLabel}>\n {sections.map((section, sectionIndex) => (\n <div\n key={section.title ?? `section-${sectionIndex}`}\n className=\"sph-sidebar__section\"\n >\n {section.title !== undefined && (\n <div className=\"sph-sidebar__section-title\" aria-hidden=\"true\">\n {section.title}\n </div>\n )}\n {section.items.map((item) => {\n const isActive = item.value === active;\n return (\n <button\n key={item.value}\n type=\"button\"\n className=\"sph-sidebar__item\"\n data-active={isActive || undefined}\n aria-current={isActive ? \"page\" : undefined}\n disabled={item.disabled}\n title={\n isCollapsed && typeof item.label === \"string\"\n ? item.label\n : undefined\n }\n onClick={() => onSelect?.(item.value)}\n >\n {item.icon !== undefined && (\n <span className=\"sph-sidebar__icon\" aria-hidden=\"true\">\n {node(item.icon)}\n </span>\n )}\n <span className=\"sph-sidebar__label\">{node(item.label)}</span>\n {item.badge !== undefined && (\n <span className=\"sph-sidebar__badge\">\n {node(item.badge)}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ))}\n <span id={`${listId}-hint`} className=\"sph-visually-hidden\">\n {isCollapsed ? \"Sidebar collapsed\" : \"Sidebar expanded\"}\n </span>\n </nav>\n {(footer !== undefined || collapsible) && (\n <div className=\"sph-sidebar__footer\">\n {footer !== undefined && (\n <div className=\"sph-sidebar__footer-content\">{node(footer)}</div>\n )}\n {collapsible && (\n <button\n type=\"button\"\n className=\"sph-sidebar__toggle\"\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n onClick={toggleCollapsed}\n >\n <span aria-hidden=\"true\">{isCollapsed ? \"»\" : \"«\"}</span>\n </button>\n )}\n </div>\n )}\n </aside>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type StreamingTextProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n text: string;\n /** Delay between word entrances, in ms. Default: 30. */\n speed?: number;\n /** Reveal words progressively. Default: true. */\n animated?: boolean;\n};\n\n/**\n * Words arrive one at a time — and because each word animates only when it\n * mounts, appending to `text` streams naturally without any JS timing: the\n * new words cascade in while finished ones stay put.\n */\nexport function StreamingText({\n text,\n speed = 30,\n animated = true,\n className,\n ...props\n}: StreamingTextProps) {\n const tokens = text.split(/(\\s+)/);\n let wordIndex = -1;\n\n return (\n <div {...node(props)} className={cn(\"sph-stream\", className)}>\n {tokens.map((token, index) => {\n if (token.trim().length === 0) return token;\n wordIndex += 1;\n const delay = animated ? wordIndex * speed : 0;\n return (\n <span\n key={index}\n className=\"sph-stream__word\"\n data-animated={animated || undefined}\n style={{ animationDelay: `${delay}ms` }}\n >\n {token}\n </span>\n );\n })}\n </div>\n );\n}\n","export type TableSortDirection = \"asc\" | \"desc\";\n\nexport type TableSort = { key: string; direction: TableSortDirection };\n\nexport type SortableColumn<Row> = {\n key: string;\n sortValue?: (row: Row) => unknown;\n compare?: (a: Row, b: Row) => number;\n};\n\nconst collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: \"base\",\n});\n\nfunction comparable(value: unknown) {\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"boolean\") return Number(value);\n return value;\n}\n\nfunction isEmpty(value: unknown) {\n return (\n value === null ||\n value === undefined ||\n value === \"\" ||\n (typeof value === \"number\" && Number.isNaN(value))\n );\n}\n\nexport function compareValues(a: unknown, b: unknown) {\n const left = comparable(a);\n const right = comparable(b);\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n return collator.compare(String(left), String(right));\n}\n\nexport function sortRows<Row>(\n rows: Row[],\n sort: TableSort[],\n columns: SortableColumn<Row>[],\n) {\n const entries = rows.map((row, index) => ({ row, index }));\n const rules = sort.flatMap(({ key, direction }) => {\n const column = columns.find((candidate) => candidate.key === key);\n if (!column) return [];\n const sign = direction === \"desc\" ? -1 : 1;\n const read =\n column.sortValue ??\n ((row: Row) => (row as Record<string, unknown>)[column.key]);\n return [{ column, sign, read }];\n });\n if (rules.length === 0) return entries;\n\n return entries.sort((a, b) => {\n for (const { column, sign, read } of rules) {\n let result: number;\n if (column.compare) {\n result = sign * column.compare(a.row, b.row);\n } else {\n const left = read(a.row);\n const right = read(b.row);\n const leftEmpty = isEmpty(left);\n const rightEmpty = isEmpty(right);\n if (leftEmpty || rightEmpty) {\n result = leftEmpty === rightEmpty ? 0 : leftEmpty ? 1 : -1;\n } else {\n result = sign * compareValues(left, right);\n }\n }\n if (result !== 0) return result;\n }\n return a.index - b.index;\n });\n}\n\nfunction cycle(direction?: TableSortDirection) {\n if (direction === undefined) return \"asc\";\n return direction === \"asc\" ? \"desc\" : undefined;\n}\n\nexport function nextSort(\n current: TableSort[],\n key: string,\n additive: boolean,\n): TableSort[] {\n const existing = current.find((entry) => entry.key === key);\n if (!additive) {\n const own = current.length === 1 ? existing : undefined;\n const direction = cycle(own?.direction);\n return direction ? [{ key, direction }] : [];\n }\n if (!existing) return [...current, { key, direction: \"asc\" }];\n const direction = cycle(existing.direction);\n return direction\n ? current.map((entry) => (entry.key === key ? { key, direction } : entry))\n : current.filter((entry) => entry.key !== key);\n}\n\nexport function toggleSelection(\n selected: ReadonlySet<string>,\n order: string[],\n id: string,\n anchor: string | null,\n range: boolean,\n) {\n const next = new Set(selected);\n const select = !selected.has(id);\n const from = range && anchor !== null ? order.indexOf(anchor) : -1;\n const to = order.indexOf(id);\n const ids =\n from >= 0 && to >= 0\n ? order.slice(Math.min(from, to), Math.max(from, to) + 1)\n : [id];\n for (const entry of ids) {\n if (select) next.add(entry);\n else next.delete(entry);\n }\n return next;\n}\n\nexport function toggleAll(\n selected: ReadonlySet<string>,\n order: string[],\n select: boolean,\n) {\n const next = new Set(selected);\n for (const id of order) {\n if (select) next.add(id);\n else next.delete(id);\n }\n return next;\n}\n","import { CaretUpIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { TableHTMLAttributes } from \"react\";\nimport { Checkbox } from \"@/atoms/Checkbox\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n nextSort,\n sortRows,\n toggleAll,\n toggleSelection,\n type TableSort,\n} from \"./rows\";\n\nexport type { TableSort, TableSortDirection } from \"./rows\";\n\nexport type TableColumn<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = {\n key: string;\n label: Renderable;\n align?: \"start\" | \"center\" | \"end\";\n width?: string;\n render?: (row: Row, index: number) => Renderable;\n sortable?: boolean;\n sortValue?: (row: Row) => unknown;\n compare?: (a: Row, b: Row) => number;\n};\n\nexport type TableProps<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<\n TableHTMLAttributes<HTMLTableElement>,\n \"children\" | \"rows\" | \"className\" | \"cellPadding\" | \"cellSpacing\"\n> & {\n columns: TableColumn<Row>[];\n rows: Row[];\n caption?: Renderable;\n emptyMessage?: Renderable;\n rowKey?: keyof Row & string;\n getRowId?: (row: Row, index: number) => string;\n density?: \"compact\" | \"comfortable\";\n striped?: boolean;\n stickyHeader?: boolean;\n stickyFirstColumn?: boolean;\n sort?: TableSort[];\n defaultSort?: TableSort[];\n onSortChange?: (sort: TableSort[]) => void;\n multiSort?: boolean;\n manualSort?: boolean;\n selectable?: boolean;\n selected?: ReadonlySet<string> | readonly string[];\n defaultSelected?: ReadonlySet<string> | readonly string[];\n onSelectedChange?: (selected: string[]) => void;\n rowLabel?: (row: Row, index: number) => string;\n selectAllLabel?: string;\n className?: string;\n};\n\ntype ModifierEvent = { shiftKey: boolean };\n\nconst ariaSort = {\n asc: \"ascending\",\n desc: \"descending\",\n} as const;\n\nfunction scrollTimelines() {\n return (\n typeof CSS !== \"undefined\" &&\n typeof CSS.supports === \"function\" &&\n CSS.supports(\"animation-timeline: scroll()\")\n );\n}\n\nexport function Table<\n Row extends Record<string, unknown> = Record<string, unknown>,\n>({\n columns,\n rows,\n caption,\n emptyMessage = \"No results\",\n rowKey,\n getRowId,\n density = \"comfortable\",\n striped = false,\n stickyHeader = false,\n stickyFirstColumn = false,\n sort,\n defaultSort,\n onSortChange,\n multiSort = false,\n manualSort = false,\n selectable = false,\n selected,\n defaultSelected,\n onSelectedChange,\n rowLabel,\n selectAllLabel = \"Select all rows\",\n className,\n ...props\n}: TableProps<Row>) {\n const [internalSort, setInternalSort] = useState<TableSort[]>(\n defaultSort ?? [],\n );\n const [internalSelected, setInternalSelected] = useState<string[]>(() => [\n ...(defaultSelected ?? []),\n ]);\n const selectAllRef = useRef<HTMLTableCellElement>(null);\n const anchor = useRef<string | null>(null);\n const shift = useRef(false);\n\n const activeSort = sort ?? internalSort;\n const selectedIds = useMemo(\n () => new Set(selected ?? internalSelected),\n [selected, internalSelected],\n );\n\n const idOf = (row: Row, index: number) =>\n getRowId\n ? getRowId(row, index)\n : rowKey\n ? String(row[rowKey])\n : String(index);\n const entries = (\n manualSort\n ? rows.map((row, index) => ({ row, index }))\n : sortRows(rows, activeSort, columns)\n ).map((entry) => ({ ...entry, id: idOf(entry.row, entry.index) }));\n const order = entries.map((entry) => entry.id);\n const selectedCount = order.filter((id) => selectedIds.has(id)).length;\n const allSelected = order.length > 0 && selectedCount === order.length;\n const someSelected = selectedCount > 0 && !allSelected;\n\n useEffect(() => {\n const input = selectAllRef.current?.querySelector(\"input\");\n if (input) input.indeterminate = someSelected;\n });\n\n const changeSort = (key: string, event: ModifierEvent) => {\n const next = nextSort(activeSort, key, multiSort && event.shiftKey);\n setInternalSort(next);\n onSortChange?.(next);\n };\n const commitSelection = (next: Set<string>) => {\n const ids = [...next];\n setInternalSelected(ids);\n onSelectedChange?.(ids);\n };\n const changeRow = (id: string) => {\n commitSelection(\n toggleSelection(selectedIds, order, id, anchor.current, shift.current),\n );\n anchor.current = id;\n shift.current = false;\n };\n const changeAll = () => {\n anchor.current = null;\n commitSelection(toggleAll(selectedIds, order, !allSelected));\n };\n const trackShift = (event: ModifierEvent) => {\n shift.current = event.shiftKey;\n };\n const holdSelection = (event: ModifierEvent & { preventDefault(): void }) => {\n shift.current = event.shiftKey;\n if (event.shiftKey) event.preventDefault();\n };\n const sortKey = (key: string, event: KeyboardActionEvent & ModifierEvent) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n changeSort(key, event);\n };\n const markScroll = (event: { currentTarget: HTMLDivElement }) => {\n if (!(stickyHeader || stickyFirstColumn) || scrollTimelines()) return;\n const wrap = event.currentTarget;\n wrap.dataset.scrolledBlock = String(wrap.scrollTop > 0);\n wrap.dataset.scrolledInline = String(Math.abs(wrap.scrollLeft) > 0);\n };\n\n const pinned = (columnIndex: number) =>\n stickyFirstColumn && columnIndex === 0\n ? { \"data-pinned\": true, \"data-edge\": true }\n : {};\n const selectPin = stickyFirstColumn ? { \"data-pinned\": true } : {};\n const colSpan = columns.length + (selectable ? 1 : 0);\n\n return (\n <div\n className={cn(\"sph-table-wrap\", className)}\n onScroll={stickyHeader || stickyFirstColumn ? markScroll : undefined}\n >\n <table\n {...node(props)}\n className=\"sph-table\"\n data-density={density}\n data-striped={striped || undefined}\n data-sticky-header={stickyHeader || undefined}\n data-sticky-column={stickyFirstColumn || undefined}\n data-selectable={selectable || undefined}\n >\n {caption !== undefined && <caption>{node(caption)}</caption>}\n <thead>\n <tr>\n {selectable && (\n <th\n ref={selectAllRef}\n scope=\"col\"\n className=\"sph-table__select\"\n {...selectPin}\n >\n <Checkbox\n size=\"sm\"\n aria-label={selectAllLabel}\n checked={allSelected}\n disabled={order.length === 0}\n data-indeterminate={someSelected || undefined}\n onChange={changeAll}\n />\n </th>\n )}\n {columns.map((column, columnIndex) => {\n const align = column.align ?? \"start\";\n const rank = activeSort.findIndex(\n (entry) => entry.key === column.key,\n );\n const direction =\n rank >= 0 ? activeSort[rank].direction : undefined;\n return (\n <th\n key={column.key}\n scope=\"col\"\n data-align={align}\n aria-sort={\n column.sortable\n ? direction\n ? ariaSort[direction]\n : \"none\"\n : undefined\n }\n style={{ width: column.width }}\n {...pinned(columnIndex)}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className=\"sph-table__sort\"\n data-align={align}\n data-direction={direction}\n onClick={(event) => changeSort(column.key, event)}\n onKeyDown={(event) => sortKey(column.key, event)}\n >\n <span className=\"sph-table__sort-label\">\n {node(column.label)}\n </span>\n <span className=\"sph-table__caret\" aria-hidden=\"true\">\n <CaretUpIcon weight=\"bold\" />\n </span>\n {direction && activeSort.length > 1 && (\n <span className=\"sph-table__rank\" aria-hidden=\"true\">\n {rank + 1}\n </span>\n )}\n </button>\n ) : (\n node(column.label)\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {entries.length === 0 ? (\n <tr>\n <td className=\"sph-table__empty\" colSpan={colSpan}>\n {node(emptyMessage)}\n </td>\n </tr>\n ) : (\n entries.map(({ row, id }, rowIndex) => {\n const isSelected = selectable && selectedIds.has(id);\n return (\n <tr\n key={id}\n aria-selected={selectable ? isSelected : undefined}\n data-selected={isSelected || undefined}\n >\n {selectable && (\n <td\n className=\"sph-table__select\"\n onMouseDown={holdSelection}\n onKeyDown={trackShift}\n {...selectPin}\n >\n <Checkbox\n size=\"sm\"\n aria-label={\n rowLabel\n ? rowLabel(row, rowIndex)\n : `Select row ${rowIndex + 1}`\n }\n checked={isSelected}\n onChange={() => changeRow(id)}\n />\n </td>\n )}\n {columns.map((column, columnIndex) => (\n <td\n key={column.key}\n data-align={column.align ?? \"start\"}\n {...pinned(columnIndex)}\n >\n {node(\n column.render\n ? column.render(row, rowIndex)\n : row[column.key],\n )}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type StatusMarkState =\n | \"idle\"\n | \"running\"\n | \"progress\"\n | \"success\"\n | \"error\";\n\nexport type StatusMarkProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\" | \"role\" | \"aria-label\"\n> & {\n state?: StatusMarkState;\n value?: number;\n label: string;\n size?: ControlSize;\n className?: string;\n};\n\nconst clampValue = (value: number | undefined) =>\n typeof value === \"number\" && Number.isFinite(value)\n ? Math.min(Math.max(value, 0), 100)\n : 0;\n\nexport function StatusMark({\n state = \"idle\",\n value,\n label,\n size = \"md\",\n className,\n style,\n ...props\n}: StatusMarkProps) {\n const progress = state === \"progress\" ? clampValue(value) : undefined;\n\n return (\n <span\n {...node(props)}\n className={cn(\"sph-status-mark\", className)}\n data-state={state}\n data-size={size}\n role=\"img\"\n aria-label={label}\n style={\n progress === undefined\n ? style\n : ({\n ...style,\n \"--sph-status-mark-value\": progress,\n } as CSSProperties & Record<string, string | number>)\n }\n >\n <svg\n className=\"sph-status-mark__glyph\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle className=\"sph-status-mark__track\" cx=\"8\" cy=\"8\" r=\"6\" />\n <circle className=\"sph-status-mark__fill\" cx=\"8\" cy=\"8\" r=\"6.75\" />\n <circle className=\"sph-status-mark__arc\" cx=\"8\" cy=\"8\" r=\"6\" />\n <path\n className=\"sph-status-mark__check\"\n d=\"M5.25 8.25 7.1 10l3.65-3.75\"\n />\n <path className=\"sph-status-mark__cross\" d=\"M5.75 5.75l4.5 4.5\" />\n <path className=\"sph-status-mark__cross\" d=\"M10.25 5.75l-4.5 4.5\" />\n </svg>\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { TimeHTMLAttributes } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type TimestampFormat = \"relative\" | \"absolute\" | \"auto\";\n\nexport type TimestampProps = Omit<\n TimeHTMLAttributes<HTMLTimeElement>,\n \"children\" | \"dateTime\"\n> & {\n date: Date | string | number;\n format?: TimestampFormat;\n locale?: string | string[];\n absoluteOptions?: Intl.DateTimeFormatOptions;\n live?: boolean;\n now?: Date | number;\n};\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30.44 * DAY;\nconst YEAR = 365.25 * DAY;\n\nconst RELATIVE_UNITS: [Intl.RelativeTimeFormatUnit, number, number][] = [\n [\"minute\", MINUTE, HOUR],\n [\"hour\", HOUR, DAY],\n [\"day\", DAY, WEEK],\n [\"week\", WEEK, MONTH],\n [\"month\", MONTH, YEAR],\n];\n\nconst DEFAULT_ABSOLUTE: Intl.DateTimeFormatOptions = {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n};\n\nexport function formatRelativeTime(\n time: number,\n now: number,\n locale?: string | string[],\n): string {\n const formatter = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n const diff = time - now;\n const distance = Math.abs(diff);\n if (distance < 45 * SECOND) return formatter.format(0, \"second\");\n const [unit, size] =\n RELATIVE_UNITS.find(([, , limit]) => distance < limit) ??\n ([\"year\", YEAR] as const);\n const amount = Math.max(1, Math.round(distance / size));\n return formatter.format(diff < 0 ? -amount : amount, unit);\n}\n\ntype Subscriber = { every: number; notify: () => void };\n\nconst subscribers = new Set<Subscriber>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet scheduledEvery = Number.POSITIVE_INFINITY;\n\nfunction schedule() {\n let every = Number.POSITIVE_INFINITY;\n for (const subscriber of subscribers) {\n every = Math.min(every, subscriber.every);\n }\n if (timer !== undefined && every === scheduledEvery) return;\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n scheduledEvery = Number.POSITIVE_INFINITY;\n if (!Number.isFinite(every)) return;\n scheduledEvery = every;\n timer = setTimeout(() => {\n timer = undefined;\n scheduledEvery = Number.POSITIVE_INFINITY;\n for (const subscriber of Array.from(subscribers)) subscriber.notify();\n schedule();\n }, every);\n}\n\nexport const timestampClock = {\n subscribe(every: number, notify: () => void): () => void {\n const subscriber: Subscriber = { every, notify };\n subscribers.add(subscriber);\n schedule();\n return () => {\n subscribers.delete(subscriber);\n schedule();\n };\n },\n get size() {\n return subscribers.size;\n },\n get interval() {\n return timer === undefined ? undefined : scheduledEvery;\n },\n};\n\nconst toTime = (value: Date | string | number) =>\n value instanceof Date ? value.getTime() : new Date(value).getTime();\n\nconst refreshEvery = (distance: number) =>\n distance < HOUR ? 30 * SECOND : distance < DAY ? 5 * MINUTE : HOUR;\n\nexport function Timestamp({\n date,\n format = \"auto\",\n locale,\n absoluteOptions,\n live = false,\n now,\n className,\n ...props\n}: TimestampProps) {\n const [, setTick] = useState(0);\n const time = toTime(date);\n const valid = Number.isFinite(time);\n const reference = now === undefined ? Date.now() : toTime(now);\n const distance = Math.abs(time - reference);\n const relative =\n format === \"relative\" || (format === \"auto\" && distance < WEEK);\n const every = refreshEvery(distance);\n const ticking = live && valid && now === undefined && format !== \"absolute\";\n\n useEffect(() => {\n if (!ticking) return;\n return timestampClock.subscribe(every, () => setTick((count) => count + 1));\n }, [ticking, every]);\n\n if (!valid) {\n return (\n <time\n {...node(props)}\n className={cn(\"sph-timestamp\", className)}\n data-invalid=\"true\"\n >\n {String(date)}\n </time>\n );\n }\n\n const instant = new Date(time);\n const full = new Intl.DateTimeFormat(locale, {\n dateStyle: \"full\",\n timeStyle: \"long\",\n timeZone: absoluteOptions?.timeZone,\n }).format(instant);\n const text = relative\n ? formatRelativeTime(time, reference, locale)\n : new Intl.DateTimeFormat(\n locale,\n absoluteOptions ?? DEFAULT_ABSOLUTE,\n ).format(instant);\n\n return (\n <time\n title={full}\n {...node(props)}\n className={cn(\"sph-timestamp\", className)}\n dateTime={instant.toISOString()}\n data-format={relative ? \"relative\" : \"absolute\"}\n data-live={ticking || undefined}\n >\n {text}\n </time>\n );\n}\n","import {\n ArrowsHorizontalIcon,\n MinusIcon,\n PlusIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { IconButton } from \"../IconButton\";\n\nexport type NumberInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"size\"\n | \"type\"\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"min\"\n | \"max\"\n | \"step\"\n | \"children\"\n> & {\n value?: number | null;\n defaultValue?: number | null;\n onValueChange?: (value: number | null) => void;\n min?: number;\n max?: number;\n step?: number;\n largeStep?: number;\n precision?: number;\n format?: Intl.NumberFormatOptions;\n locale?: string;\n size?: ControlSize;\n invalid?: boolean;\n scrub?: boolean;\n label?: string;\n decrementLabel?: string;\n incrementLabel?: string;\n};\n\ntype PressEvent = {\n button: number;\n pointerId: number;\n currentTarget: Element;\n preventDefault(): void;\n};\n\ntype DragEvent = PressEvent & {\n type: string;\n clientX: number;\n shiftKey: boolean;\n};\n\ntype StepKeyEvent = {\n key: string;\n shiftKey: boolean;\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nconst REPEAT_DELAY = 400;\nconst REPEAT_INTERVAL = 60;\nconst SCRUB_PIXELS = 4;\nconst SCRUB_THRESHOLD = 3;\nconst ICON_SIZE: Record<ControlSize, number> = { sm: 12, md: 14, lg: 16 };\n\nexport function decimalsOf(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const text = String(value);\n const exponent = text.match(/e-(\\d+)$/);\n if (exponent) return Number(exponent[1]);\n const dot = text.indexOf(\".\");\n return dot < 0 ? 0 : text.length - dot - 1;\n}\n\nexport function clampNumber(value: number, min?: number, max?: number): number {\n let next = value;\n if (max !== undefined) next = Math.min(next, max);\n if (min !== undefined) next = Math.max(next, min);\n return next;\n}\n\nfunction roundTo(value: number, digits: number): number {\n return Number(value.toFixed(Math.min(Math.max(digits, 0), 100)));\n}\n\nexport function createFormatter(\n locale: string | undefined,\n format: Intl.NumberFormatOptions | undefined,\n precision: number | undefined,\n step: number,\n): Intl.NumberFormat {\n const options: Intl.NumberFormatOptions =\n precision !== undefined\n ? {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n ...format,\n }\n : { maximumFractionDigits: Math.max(3, decimalsOf(step)), ...format };\n const low = options.minimumFractionDigits;\n const high = options.maximumFractionDigits;\n if (low !== undefined && high !== undefined && low > high)\n options.maximumFractionDigits = low;\n try {\n return new Intl.NumberFormat(locale, options);\n } catch {\n return new Intl.NumberFormat(locale);\n }\n}\n\nexport function parseNumber(\n text: string,\n locale?: string,\n format?: Intl.NumberFormatOptions,\n): number | null | undefined {\n const trimmed = text.trim();\n if (trimmed === \"\") return null;\n const parts = new Intl.NumberFormat(locale).formatToParts(-12345.6);\n const decimal = parts.find((part) => part.type === \"decimal\")?.value ?? \".\";\n const group = parts.find((part) => part.type === \"group\")?.value ?? \",\";\n let normalized = trimmed.replace(/[−‒–﹣-]/g, \"-\");\n normalized = normalized.replace(/[\\s ]/g, \"\");\n if (group.trim() !== \"\")\n normalized = normalized.split(group.replace(/\\s/g, \"\")).join(\"\");\n if (decimal !== \".\") normalized = normalized.split(decimal).join(\".\");\n normalized = normalized.replace(/[^\\d.+-]/g, \"\");\n if (!/^[-+]?(\\d+\\.?\\d*|\\.\\d+)$/.test(normalized)) return undefined;\n const parsed = Number(normalized);\n if (!Number.isFinite(parsed)) return undefined;\n return format?.style === \"percent\" ? parsed / 100 : parsed;\n}\n\nexport function NumberInput({\n value,\n defaultValue = null,\n onValueChange,\n min,\n max,\n step = 1,\n largeStep,\n precision,\n format,\n locale,\n size = \"md\",\n invalid = false,\n disabled = false,\n readOnly = false,\n scrub = false,\n label,\n decrementLabel = \"Decrease\",\n incrementLabel = \"Increase\",\n className,\n style,\n name,\n onKeyDown,\n onBlur,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: NumberInputProps) {\n const [uncontrolled, setUncontrolled] = useState<number | null>(defaultValue);\n const [draft, setDraft] = useState<string | null>(null);\n const [scrubbing, setScrubbing] = useState(false);\n const current = value !== undefined ? value : uncontrolled;\n const latest = useRef(current);\n latest.current = current;\n const inputRef = useRef<HTMLInputElement | null>(null);\n const repeat = useRef<ReturnType<typeof setTimeout> | null>(null);\n const drag = useRef<{\n id: number;\n x: number;\n start: number | null;\n moved: boolean;\n } | null>(null);\n\n const bigStep = largeStep ?? step * 10;\n const digits =\n precision ?? Math.max(decimalsOf(step), decimalsOf(bigStep), 0);\n const formatter = createFormatter(locale, format, precision, step);\n const formatted = current === null ? \"\" : formatter.format(current);\n const locked = disabled || readOnly;\n const atMin = current !== null && min !== undefined && current <= min;\n const atMax = current !== null && max !== undefined && current >= max;\n const iconSize = ICON_SIZE[size];\n\n const normalize = (next: number) => {\n const clamped = clampNumber(next, min, max);\n return precision !== undefined ? roundTo(clamped, precision) : clamped;\n };\n\n const commit = (next: number | null) => {\n const settled = next === null ? null : normalize(next);\n setDraft(null);\n if (settled === latest.current) return;\n latest.current = settled;\n setUncontrolled(settled);\n onValueChange?.(settled);\n };\n\n const resolveDraft = (): number | null => {\n if (draft === null) return latest.current;\n const parsed = parseNumber(draft, locale, format);\n if (parsed === undefined) {\n setDraft(null);\n return latest.current;\n }\n return parsed === null ? null : normalize(parsed);\n };\n\n const commitDraft = () => {\n if (draft === null) return;\n commit(resolveDraft());\n };\n\n const nudge = (delta: number, base: number | null = latest.current) => {\n if (base === null) {\n commit(clampNumber(0, min, max));\n return;\n }\n commit(roundTo(base + delta, Math.max(digits, decimalsOf(base))));\n };\n\n const stopRepeat = () => {\n if (repeat.current !== null) clearTimeout(repeat.current);\n repeat.current = null;\n };\n\n useEffect(() => stopRepeat, []);\n\n const startRepeat = (event: PressEvent, direction: 1 | -1) => {\n if (event.button !== 0 || locked) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture?.(event.pointerId);\n const first = resolveDraft();\n const run = (delay: number, base?: number | null) => {\n const before = base === undefined ? latest.current : base;\n nudge(direction * step, before);\n const reachedBound =\n latest.current === before ||\n (direction > 0 && max !== undefined && (latest.current ?? 0) >= max) ||\n (direction < 0 && min !== undefined && (latest.current ?? 0) <= min);\n if (reachedBound) {\n stopRepeat();\n return;\n }\n repeat.current = setTimeout(() => run(REPEAT_INTERVAL), delay);\n };\n stopRepeat();\n run(REPEAT_DELAY, first);\n };\n\n const stepperClick = (event: { detail: number }, direction: 1 | -1) => {\n if (event.detail !== 0 || locked) return;\n nudge(direction * step, resolveDraft());\n };\n\n const handleKeyDown = (event: StepKeyEvent) => {\n onKeyDown?.(node(event));\n if (event.defaultPrevented || disabled) return;\n const amount = event.shiftKey ? bigStep : step;\n const move = (delta: number) => {\n event.preventDefault();\n if (!readOnly) nudge(delta, resolveDraft());\n };\n switch (event.key) {\n case \"ArrowUp\":\n move(amount);\n break;\n case \"ArrowDown\":\n move(-amount);\n break;\n case \"PageUp\":\n move(bigStep);\n break;\n case \"PageDown\":\n move(-bigStep);\n break;\n case \"Home\":\n if (min === undefined) return;\n event.preventDefault();\n if (!readOnly) commit(min);\n break;\n case \"End\":\n if (max === undefined) return;\n event.preventDefault();\n if (!readOnly) commit(max);\n break;\n case \"Enter\":\n commitDraft();\n break;\n case \"Escape\":\n if (draft === null) return;\n event.preventDefault();\n setDraft(null);\n break;\n }\n };\n\n const scrubStart = (event: DragEvent) => {\n if (event.button !== 0 || disabled) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture?.(event.pointerId);\n drag.current = {\n id: event.pointerId,\n x: event.clientX,\n start: resolveDraft(),\n moved: false,\n };\n };\n\n const scrubMove = (event: DragEvent) => {\n const state = drag.current;\n if (!state || state.id !== event.pointerId) return;\n const dx = event.clientX - state.x;\n if (!state.moved && Math.abs(dx) < SCRUB_THRESHOLD) return;\n if (!state.moved) {\n state.moved = true;\n setScrubbing(true);\n }\n if (readOnly) return;\n const amount = event.shiftKey ? bigStep : step;\n const steps = Math.trunc(dx / SCRUB_PIXELS);\n const base = state.start ?? clampNumber(0, min, max);\n commit(roundTo(base + steps * amount, Math.max(digits, decimalsOf(base))));\n };\n\n const scrubEnd = (event: DragEvent) => {\n const state = drag.current;\n if (!state || state.id !== event.pointerId) return;\n drag.current = null;\n setScrubbing(false);\n if (!state.moved && event.type === \"pointerup\") {\n inputRef.current?.focus();\n inputRef.current?.select();\n }\n };\n\n return (\n <div\n className={cn(\"sph-number-input\", className)}\n style={node(style)}\n data-size={size}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-scrub={scrub || undefined}\n data-scrubbing={scrubbing || undefined}\n >\n {scrub && (\n <span\n className=\"sph-number-input__scrub\"\n aria-hidden=\"true\"\n onPointerDown={scrubStart}\n onPointerMove={scrubMove}\n onPointerUp={scrubEnd}\n onPointerCancel={scrubEnd}\n >\n {label || <ArrowsHorizontalIcon size={iconSize} weight=\"bold\" />}\n </span>\n )}\n <IconButton\n className=\"sph-number-input__step\"\n data-direction=\"decrement\"\n size={size}\n label={decrementLabel}\n icon={<MinusIcon size={iconSize} weight=\"bold\" />}\n tabIndex={-1}\n disabled={locked || atMin}\n onPointerDown={(event) => startRepeat(event, -1)}\n onPointerUp={stopRepeat}\n onPointerCancel={stopRepeat}\n onLostPointerCapture={stopRepeat}\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => stepperClick(event, -1)}\n />\n <input\n {...node(props)}\n ref={inputRef}\n type=\"text\"\n role=\"spinbutton\"\n inputMode=\"decimal\"\n autoComplete=\"off\"\n className=\"sph-number-input__input\"\n value={draft ?? formatted}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={\n ariaLabel ?? (ariaLabelledBy ? undefined : label || undefined)\n }\n aria-labelledby={ariaLabelledBy}\n aria-valuenow={current ?? undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={formatted || undefined}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n onBlur={(event) => {\n commitDraft();\n onBlur?.(node(event));\n }}\n />\n <IconButton\n className=\"sph-number-input__step\"\n data-direction=\"increment\"\n size={size}\n label={incrementLabel}\n icon={<PlusIcon size={iconSize} weight=\"bold\" />}\n tabIndex={-1}\n disabled={locked || atMax}\n onPointerDown={(event) => startRepeat(event, 1)}\n onPointerUp={stopRepeat}\n onPointerCancel={stopRepeat}\n onLostPointerCapture={stopRepeat}\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => stepperClick(event, 1)}\n />\n {name !== undefined && (\n <input\n type=\"hidden\"\n name={name}\n value={current === null ? \"\" : String(current)}\n disabled={disabled}\n />\n )}\n </div>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { ButtonHTMLAttributes, CSSProperties } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type HoldButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"type\"\n> & {\n onConfirm: () => void;\n children?: Renderable;\n holdLabel?: Renderable;\n confirmedLabel?: Renderable;\n hint?: string;\n duration?: number;\n variant?: \"danger\" | \"primary\" | \"secondary\";\n size?: ControlSize;\n};\n\nexport type HoldPhase = \"idle\" | \"holding\" | \"releasing\" | \"confirmed\";\n\nconst REWIND_RATE = 3;\nconst CONFIRMED_FOR = 1100;\nconst DEFAULT_DURATION = 1200;\n\nexport function advanceHold(\n progress: number,\n elapsed: number,\n duration: number,\n holding: boolean,\n): number {\n const span = Math.max(duration, 1);\n const delta = holding ? elapsed / span : (-elapsed * REWIND_RATE) / span;\n return Math.min(1, Math.max(0, progress + delta));\n}\n\nfunction textOf(value: Renderable, fallback: string): string {\n return typeof value === \"string\" || typeof value === \"number\"\n ? String(value)\n : fallback;\n}\n\nexport function HoldButton({\n onConfirm,\n children,\n holdLabel,\n confirmedLabel = \"Confirmed\",\n hint = \"Press and hold to confirm\",\n duration = DEFAULT_DURATION,\n variant = \"danger\",\n size = \"md\",\n disabled = false,\n className,\n style,\n onPointerDown,\n onPointerUp,\n onPointerCancel,\n onPointerMove,\n onKeyDown,\n onKeyUp,\n onBlur,\n onContextMenu,\n onClick,\n \"aria-describedby\": ariaDescribedBy,\n ...props\n}: HoldButtonProps) {\n const hintId = `${useId()}-hint`;\n const [phase, setPhase] = useState<HoldPhase>(\"idle\");\n const [status, setStatus] = useState(\"\");\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const progress = useRef(0);\n const holding = useRef(false);\n const source = useRef<\"pointer\" | \"key\" | null>(null);\n const frame = useRef<number | null>(null);\n const stamp = useRef(0);\n const reset = useRef<ReturnType<typeof setTimeout> | null>(null);\n const confirmRef = useRef(onConfirm);\n confirmRef.current = onConfirm;\n const durationRef = useRef(duration);\n durationRef.current = duration;\n const confirmed = phase === \"confirmed\";\n\n const paint = (value: number) => {\n progress.current = value;\n buttonRef.current?.style.setProperty(\"--sph-hold-progress\", String(value));\n };\n\n const cancelFrame = () => {\n if (frame.current !== null) cancelAnimationFrame(frame.current);\n frame.current = null;\n };\n\n const tick = (now: number) => {\n const elapsed = now - stamp.current;\n stamp.current = now;\n const next = advanceHold(\n progress.current,\n elapsed,\n durationRef.current,\n holding.current,\n );\n paint(next);\n if (holding.current && next >= 1) {\n holding.current = false;\n frame.current = null;\n setPhase(\"confirmed\");\n setStatus(textOf(confirmedLabel, \"Confirmed\"));\n confirmRef.current();\n reset.current = setTimeout(() => {\n reset.current = null;\n setPhase(\"releasing\");\n run();\n }, CONFIRMED_FOR);\n return;\n }\n if (!holding.current && next <= 0) {\n frame.current = null;\n setPhase(\"idle\");\n return;\n }\n frame.current = requestAnimationFrame(tick);\n };\n\n const run = () => {\n if (frame.current !== null) return;\n stamp.current = performance.now();\n frame.current = requestAnimationFrame(tick);\n };\n\n const start = (from: \"pointer\" | \"key\") => {\n if (disabled || confirmed || holding.current) return;\n holding.current = true;\n source.current = from;\n setPhase(\"holding\");\n setStatus(textOf(holdLabel, \"Keep holding to confirm\"));\n run();\n };\n\n const release = (from: \"pointer\" | \"key\") => {\n if (source.current !== from) return;\n source.current = null;\n if (!holding.current) return;\n holding.current = false;\n setPhase(\"releasing\");\n setStatus(\"\");\n run();\n };\n\n useEffect(\n () => () => {\n cancelFrame();\n if (reset.current !== null) clearTimeout(reset.current);\n },\n [],\n );\n\n useEffect(() => {\n if (!disabled || !holding.current) return;\n holding.current = false;\n source.current = null;\n setPhase(\"releasing\");\n setStatus(\"\");\n run();\n }, [disabled]);\n\n const describedBy = [ariaDescribedBy, hintId].filter(Boolean).join(\" \");\n const buttonStyle = {\n ...style,\n \"--sph-hold-progress\": String(progress.current),\n } as CSSProperties;\n const holdText = holdLabel ?? children;\n\n return (\n <>\n <button\n {...node(props)}\n ref={buttonRef}\n type=\"button\"\n className={cn(\"sph-hold-button\", className)}\n style={node(buttonStyle)}\n data-variant={variant}\n data-size={size}\n data-state={phase}\n disabled={disabled}\n aria-describedby={describedBy}\n onPointerDown={(event) => {\n onPointerDown?.(node(event));\n if (event.defaultPrevented || event.button !== 0) return;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n start(\"pointer\");\n }}\n onPointerUp={(event) => {\n onPointerUp?.(node(event));\n release(\"pointer\");\n }}\n onPointerCancel={(event) => {\n onPointerCancel?.(node(event));\n release(\"pointer\");\n }}\n onPointerMove={(event) => {\n onPointerMove?.(node(event));\n if (source.current !== \"pointer\" || !holding.current) return;\n const rect = event.currentTarget.getBoundingClientRect();\n const outside =\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom;\n if (outside) release(\"pointer\");\n }}\n onKeyDown={(event) => {\n onKeyDown?.(node(event));\n if (event.defaultPrevented) return;\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n event.preventDefault();\n if (!event.repeat) start(\"key\");\n }}\n onKeyUp={(event) => {\n onKeyUp?.(node(event));\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n event.preventDefault();\n release(\"key\");\n }}\n onBlur={(event) => {\n onBlur?.(node(event));\n release(\"key\");\n release(\"pointer\");\n }}\n onContextMenu={(event) => {\n onContextMenu?.(node(event));\n if (holding.current) event.preventDefault();\n }}\n onClick={(event) => {\n onClick?.(node(event));\n event.preventDefault();\n }}\n >\n <span className=\"sph-hold-button__fill\" aria-hidden=\"true\" />\n <span className=\"sph-hold-button__labels\">\n <span className=\"sph-hold-button__label\" data-label=\"rest\">\n {node(children)}\n </span>\n <span\n className=\"sph-hold-button__label\"\n data-label=\"hold\"\n aria-hidden=\"true\"\n >\n {node(holdText)}\n </span>\n <span\n className=\"sph-hold-button__label\"\n data-label=\"confirmed\"\n aria-hidden=\"true\"\n >\n <CheckIcon size={size === \"lg\" ? 16 : 14} weight=\"bold\" />\n {node(confirmedLabel)}\n </span>\n </span>\n </button>\n <span id={hintId} className=\"sph-visually-hidden\">\n {hint}\n </span>\n <span className=\"sph-visually-hidden\" role=\"status\" aria-live=\"polite\">\n {status}\n </span>\n </>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { useId, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SegmentedOption = {\n value: string;\n label: Renderable;\n icon?: Renderable;\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps = {\n options: SegmentedOption[];\n ariaLabel: string;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n size?: ControlSize;\n fullWidth?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\nconst forward = [\"ArrowRight\", \"ArrowDown\"];\nconst backward = [\"ArrowLeft\", \"ArrowUp\"];\n\nexport function segmentTarget(\n options: SegmentedOption[],\n index: number,\n key: string,\n): number {\n const count = options.length;\n const enabled = (candidate: number) => !options[candidate]?.disabled;\n if (key === \"Home\" || key === \"End\") {\n const order = options.map((_, position) => position);\n if (key === \"End\") order.reverse();\n return order.find(enabled) ?? -1;\n }\n const direction = forward.includes(key) ? 1 : backward.includes(key) ? -1 : 0;\n if (direction === 0 || count === 0) return -1;\n for (let step = 1; step <= count; step += 1) {\n const next = (((index + step * direction) % count) + count) % count;\n if (enabled(next)) return next;\n }\n return -1;\n}\n\nexport function SegmentedControl({\n options,\n ariaLabel,\n value,\n defaultValue,\n onValueChange,\n size = \"md\",\n fullWidth = false,\n disabled = false,\n className,\n}: SegmentedControlProps) {\n const generatedId = useId();\n const [uncontrolledValue, setUncontrolledValue] = useState(\n () =>\n defaultValue ?? options.find((option) => !option.disabled)?.value ?? \"\",\n );\n const activeValue = value ?? uncontrolledValue;\n const checkedIndex = options.findIndex(\n (option) => option.value === activeValue,\n );\n const tabbableIndex =\n checkedIndex >= 0 && !options[checkedIndex].disabled\n ? checkedIndex\n : options.findIndex((option) => !option.disabled);\n\n const select = (index: number) => {\n const option = options[index];\n if (!option || option.disabled || disabled) return;\n if (value === undefined) setUncontrolledValue(option.value);\n if (option.value !== activeValue) onValueChange?.(option.value);\n };\n\n const handleKeyDown = (event: KeyboardActionEvent, index: number) => {\n const next = segmentTarget(options, index, event.key);\n if (next === -1) return;\n event.preventDefault();\n select(next);\n document.getElementById(`${generatedId}-${next}`)?.focus();\n };\n\n const style = {\n \"--sph-segmented-count\": Math.max(options.length, 1),\n \"--sph-segmented-index\": Math.max(checkedIndex, 0),\n } as CSSProperties & Record<string, string | number>;\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n className={cn(\"sph-segmented-control\", className)}\n data-size={size}\n data-full-width={fullWidth || undefined}\n data-disabled={disabled || undefined}\n style={style}\n >\n <span\n className=\"sph-segmented-control__thumb\"\n data-hidden={checkedIndex === -1 || undefined}\n aria-hidden=\"true\"\n />\n {options.map((option, index) => {\n const checked = index === checkedIndex;\n return (\n <button\n key={option.value}\n id={`${generatedId}-${index}`}\n type=\"button\"\n role=\"radio\"\n className=\"sph-segmented-control__option\"\n aria-checked={checked}\n tabIndex={index === tabbableIndex ? 0 : -1}\n disabled={disabled || option.disabled}\n data-state={checked ? \"checked\" : \"unchecked\"}\n onClick={() => select(index)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {option.icon !== undefined && (\n <span className=\"sph-segmented-control__icon\" aria-hidden=\"true\">\n {node(option.icon)}\n </span>\n )}\n <span className=\"sph-segmented-control__label\">\n {node(option.label)}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type StepperStep = {\n id?: string;\n label: Renderable;\n description?: Renderable;\n};\n\nexport type StepperStepState = \"done\" | \"current\" | \"upcoming\";\n\nexport type StepperProps = {\n steps: StepperStep[];\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n onStepSelect?: (index: number) => void;\n ariaLabel?: string;\n completedLabel?: string;\n className?: string;\n};\n\nconst checkSize: Record<ControlSize, number> = { sm: 11, md: 13, lg: 15 };\n\nexport function stepState(index: number, current: number): StepperStepState {\n if (index < current) return \"done\";\n return index === current ? \"current\" : \"upcoming\";\n}\n\nexport function Stepper({\n steps,\n current,\n orientation = \"horizontal\",\n size = \"md\",\n onStepSelect,\n ariaLabel = \"Progress\",\n completedLabel = \"Completed\",\n className,\n}: StepperProps) {\n return (\n <ol\n className={cn(\"sph-stepper\", className)}\n aria-label={ariaLabel}\n data-orientation={orientation}\n data-size={size}\n >\n {steps.map((step, index) => {\n const state = stepState(index, current);\n const selectable = state === \"done\" && onStepSelect !== undefined;\n const content = (\n <>\n <span className=\"sph-stepper__marker\" aria-hidden=\"true\">\n <span className=\"sph-stepper__number\">{index + 1}</span>\n <span className=\"sph-stepper__check\">\n <CheckIcon size={checkSize[size]} weight=\"bold\" />\n </span>\n </span>\n <span className=\"sph-stepper__text\">\n <span className=\"sph-stepper__label\">\n {node(step.label)}\n {state === \"done\" && (\n <span className=\"sph-stepper__status\">\n {`, ${completedLabel}`}\n </span>\n )}\n </span>\n {step.description !== undefined && (\n <span className=\"sph-stepper__description\">\n {node(step.description)}\n </span>\n )}\n </span>\n </>\n );\n return (\n <li\n key={step.id ?? index}\n className=\"sph-stepper__step\"\n data-state={state}\n aria-current={state === \"current\" ? \"step\" : undefined}\n >\n {selectable ? (\n <button\n type=\"button\"\n className=\"sph-stepper__trigger\"\n onClick={() => onStepSelect(index)}\n >\n {content}\n </button>\n ) : (\n <div className=\"sph-stepper__trigger\">{content}</div>\n )}\n {index < steps.length - 1 && (\n <span className=\"sph-stepper__connector\" aria-hidden=\"true\">\n <span className=\"sph-stepper__fill\" />\n </span>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type MetadataEntry = {\n label: Renderable;\n value: Renderable;\n hint?: Renderable;\n id?: string;\n};\n\nexport type MetadataListLayout = \"columns\" | \"stacked\" | \"inline\";\n\nexport type MetadataListProps = Omit<\n HTMLAttributes<HTMLDListElement>,\n \"children\"\n> & {\n items: MetadataEntry[];\n layout?: MetadataListLayout;\n size?: ControlSize;\n dividers?: boolean;\n};\n\nconst isEmpty = (value: Renderable) =>\n value === null ||\n value === undefined ||\n value === false ||\n (typeof value === \"string\" && value.trim() === \"\");\n\nexport function MetadataList({\n items,\n layout = \"columns\",\n size = \"md\",\n dividers = false,\n className,\n ...props\n}: MetadataListProps) {\n return (\n <dl\n {...node(props)}\n className={cn(\"sph-metadata-list\", className)}\n data-layout={layout}\n data-size={size}\n data-dividers={dividers || undefined}\n >\n {items.map((item, index) => (\n <div\n key={item.id ?? index}\n className=\"sph-metadata-list__item\"\n data-empty={isEmpty(item.value) || undefined}\n >\n <dt className=\"sph-metadata-list__label\">{node(item.label)}</dt>\n <dd className=\"sph-metadata-list__value\">\n {isEmpty(item.value) ? (\n <>\n <span className=\"sph-metadata-list__empty\" aria-hidden=\"true\">\n —\n </span>\n <span className=\"sph-metadata-list__sr\">Not set</span>\n </>\n ) : (\n node(item.value)\n )}\n {item.hint !== undefined && item.hint !== null && (\n <span className=\"sph-metadata-list__hint\">{node(item.hint)}</span>\n )}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Popover } from \"@/molecules/Popover\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { useFocusTrap } from \"@/lib/focus.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\n\nexport type OverflowCollapse = \"end\" | \"start\";\n\nexport type OverflowListProps<T = unknown> = Omit<\n HTMLAttributes<HTMLUListElement>,\n \"children\"\n> & {\n items: T[];\n renderItem: (item: T, index: number) => Renderable;\n renderOverflow?: (hidden: T[]) => Renderable;\n renderOverflowItem?: (item: T, index: number) => Renderable;\n getKey?: (item: T, index: number) => string | number;\n minVisible?: number;\n collapseFrom?: OverflowCollapse;\n overflowLabel?: (count: number) => string;\n};\n\nexport type OverflowFit = {\n widths: number[];\n available: number;\n gap: number;\n reserve: number;\n minVisible?: number;\n};\n\nexport function fitOverflowCount({\n widths,\n available,\n gap,\n reserve,\n minVisible = 0,\n}: OverflowFit): number {\n const total = widths.length;\n if (total === 0) return 0;\n const full =\n widths.reduce((sum, width) => sum + width, 0) + gap * (total - 1);\n if (full <= available) return total;\n let used = reserve;\n let count = 0;\n while (count < total && used + widths[count] + gap <= available) {\n used += widths[count] + gap;\n count += 1;\n }\n const floor = Math.min(Math.max(Math.floor(minVisible), 0), total);\n const visible = Math.max(count, floor);\n return visible >= total ? total : visible;\n}\n\nconst defaultLabel = (count: number) => `${count} more`;\n\nfunction OverflowPanel<T>({\n hidden,\n offset,\n render,\n getKey,\n onEscape,\n}: {\n hidden: T[];\n offset: number;\n render: (item: T, index: number) => Renderable;\n getKey: (item: T, index: number) => string | number;\n onEscape: () => void;\n}) {\n const panelRef = useRef<HTMLUListElement>(null);\n useFocusTrap(panelRef, true);\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current;\n if (panel && !panel.contains(document.activeElement)) panel.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, []);\n\n const handleKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"Escape\") onEscape();\n };\n\n return (\n <ul\n ref={panelRef}\n className=\"sph-overflow-list__panel\"\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n {hidden.map((item, position) => (\n <li\n key={getKey(item, offset + position)}\n className=\"sph-overflow-list__panel-item\"\n >\n {node(render(item, offset + position))}\n </li>\n ))}\n </ul>\n );\n}\n\nexport function OverflowList<T>({\n items,\n renderItem,\n renderOverflow,\n renderOverflowItem,\n getKey = (_item, index) => index,\n minVisible = 0,\n collapseFrom = \"end\",\n overflowLabel = defaultLabel,\n className,\n ...props\n}: OverflowListProps<T>) {\n const rootRef = useRef<HTMLUListElement>(null);\n const measureRef = useRef<HTMLLIElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const chipRef = useRef<HTMLSpanElement>(null);\n const frameRef = useRef<number | null>(null);\n const [ready, setReady] = useState(false);\n const [visible, setVisible] = useState<number | null>(null);\n const [open, setOpen] = useState(false);\n const settings = useRef({ minVisible, collapseFrom });\n settings.current = { minVisible, collapseFrom };\n\n const measure = useCallback(() => {\n frameRef.current = null;\n const root = rootRef.current;\n const track = trackRef.current;\n if (!root || !track) return;\n const style = getComputedStyle(root);\n const available =\n root.clientWidth -\n (Number.parseFloat(style.paddingLeft) || 0) -\n (Number.parseFloat(style.paddingRight) || 0);\n const gap = Number.parseFloat(style.columnGap) || 0;\n const cells = Array.from(track.children);\n const sample = cells.pop();\n const widths = cells.map((cell) => cell.getBoundingClientRect().width);\n const { minVisible: floor, collapseFrom: from } = settings.current;\n setVisible(\n fitOverflowCount({\n widths: from === \"start\" ? widths.reverse() : widths,\n available,\n gap,\n reserve: sample?.getBoundingClientRect().width ?? 0,\n minVisible: floor,\n }),\n );\n }, []);\n\n useIsoLayoutEffect(() => {\n setReady(true);\n }, []);\n\n useIsoLayoutEffect(() => {\n if (ready) measure();\n }, [ready, items, minVisible, collapseFrom, measure]);\n\n useIsoLayoutEffect(() => {\n if (!ready) return;\n measureRef.current?.setAttribute(\"inert\", \"\");\n const schedule = () => {\n if (frameRef.current === null)\n frameRef.current = requestAnimationFrame(measure);\n };\n const cancel = () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n };\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", schedule);\n return () => {\n window.removeEventListener(\"resize\", schedule);\n cancel();\n };\n }\n const observer = new ResizeObserver(schedule);\n if (rootRef.current) observer.observe(rootRef.current);\n if (trackRef.current) observer.observe(trackRef.current);\n return () => {\n observer.disconnect();\n cancel();\n };\n }, [ready, measure]);\n\n const total = items.length;\n const shown = Math.min(visible ?? total, total);\n const hiddenCount = total - shown;\n const offset = collapseFrom === \"start\" ? 0 : shown;\n const hidden = items.slice(offset, offset + hiddenCount);\n const start = collapseFrom === \"start\" ? hiddenCount : 0;\n const label = overflowLabel(hiddenCount);\n\n useEffect(() => {\n if (hiddenCount === 0 && open) setOpen(false);\n }, [hiddenCount, open]);\n\n const focusTrigger = () => {\n chipRef.current?.closest(\"button\")?.focus();\n };\n\n const chipContent = (count: number, ref?: typeof chipRef) => (\n <span ref={ref} className=\"sph-overflow-list__chip\">\n <span className=\"sph-overflow-list__count\" aria-hidden=\"true\">\n +{count}\n </span>\n <span className=\"sph-overflow-list__label\">{overflowLabel(count)}</span>\n </span>\n );\n\n const more =\n hiddenCount > 0 ? (\n <li className=\"sph-overflow-list__more\">\n {renderOverflow ? (\n node(renderOverflow(hidden))\n ) : (\n <Popover\n className=\"sph-overflow-list__popover\"\n trigger={chipContent(hiddenCount, chipRef)}\n ariaLabel={label}\n placement={collapseFrom === \"start\" ? \"start\" : \"end\"}\n open={open}\n onOpenChange={setOpen}\n >\n <OverflowPanel\n hidden={hidden}\n offset={offset}\n render={renderOverflowItem ?? renderItem}\n getKey={getKey}\n onEscape={focusTrigger}\n />\n </Popover>\n )}\n </li>\n ) : null;\n\n return (\n <ul\n {...node(props)}\n ref={rootRef}\n className={cn(\"sph-overflow-list\", className)}\n data-collapse-from={collapseFrom}\n data-overflowing={hiddenCount > 0 || undefined}\n >\n {collapseFrom === \"start\" && more}\n {items.slice(start, start + shown).map((item, position) => (\n <li\n key={getKey(item, start + position)}\n className=\"sph-overflow-list__item\"\n >\n {node(renderItem(item, start + position))}\n </li>\n ))}\n {collapseFrom === \"end\" && more}\n {ready && (\n <li\n ref={measureRef}\n className=\"sph-overflow-list__measure\"\n aria-hidden=\"true\"\n >\n <div ref={trackRef} className=\"sph-overflow-list__track\">\n {items.map((item, index) => (\n <div\n key={getKey(item, index)}\n className=\"sph-overflow-list__item\"\n >\n {node(renderItem(item, index))}\n </div>\n ))}\n <div className=\"sph-overflow-list__item\">\n {renderOverflow\n ? node(renderOverflow(items))\n : chipContent(total)}\n </div>\n </div>\n </li>\n )}\n </ul>\n );\n}\n","import {\n ArrowUpRightIcon,\n CaretLeftIcon,\n CaretRightIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n type OverlaySide,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\n\nexport type CitationSource = {\n title: string;\n url?: string;\n site?: string;\n snippet?: string;\n favicon?: string;\n};\n\nexport type CitationProps = {\n sources: CitationSource[];\n index?: number;\n max?: number;\n placement?: OverlaySide;\n openDelay?: number;\n closeDelay?: number;\n className?: string;\n};\n\nexport function sourceSite(source: CitationSource): string | undefined {\n if (source.site) return source.site;\n if (!source.url) return undefined;\n try {\n return new URL(source.url).hostname.replace(/^www\\./, \"\");\n } catch {\n return undefined;\n }\n}\n\nexport function citationLabel(\n sources: CitationSource[],\n index: number,\n): string {\n const [first] = sources;\n if (!first) return \"\";\n const base = `Source ${index}: ${first.title}`;\n const rest = sources.length - 1;\n if (rest <= 0) return base;\n return `${base}, plus ${rest} more ${rest === 1 ? \"source\" : \"sources\"}`;\n}\n\ntype PointerLike = { pointerType?: string };\n\nexport function Citation({\n sources,\n index = 1,\n max = 1,\n placement = \"top\",\n openDelay = 160,\n closeDelay = 140,\n className,\n}: CitationProps) {\n const id = useId();\n const rootRef = useRef<HTMLSpanElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const timers = useRef<{ open?: number; close?: number }>({});\n const pinnedRef = useRef(false);\n const focusOnOpen = useRef(false);\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(0);\n const [focusTick, setFocusTick] = useState(0);\n const {\n present,\n state,\n ref: cardRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, cardRef, present && portaled, {\n side: placement,\n align: \"start\",\n offset: 6,\n });\n\n const total = sources.length;\n const shown = Math.min(total, Math.max(1, Math.floor(max)));\n const hidden = total - shown;\n const current = sources[Math.min(active, total - 1)];\n\n const clearTimers = () => {\n if (timers.current.open !== undefined)\n window.clearTimeout(timers.current.open);\n if (timers.current.close !== undefined)\n window.clearTimeout(timers.current.close);\n timers.current = {};\n };\n\n const show = () => {\n clearTimers();\n if (!open) setActive(0);\n setOpen(true);\n };\n\n const hide = () => {\n clearTimers();\n pinnedRef.current = false;\n setOpen(false);\n };\n\n const requestOpen = () => {\n clearTimers();\n timers.current.open = window.setTimeout(show, openDelay);\n };\n\n const requestClose = () => {\n if (pinnedRef.current) return;\n clearTimers();\n timers.current.close = window.setTimeout(hide, closeDelay);\n };\n\n useEffect(() => clearTimers, []);\n\n useEffect(() => {\n if (!present || !portaled) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n const inside = cardRef.current?.contains(document.activeElement);\n hide();\n if (inside) triggerRef.current?.focus();\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !cardRef.current?.contains(target)\n )\n hide();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [cardRef, present, portaled]);\n\n useEffect(() => {\n if (!open || !present || !portaled || !focusOnOpen.current) return;\n focusOnOpen.current = false;\n cardRef.current\n ?.querySelector<HTMLElement>(\"a[href], button:not(:disabled)\")\n ?.focus();\n }, [cardRef, focusTick, open, present, portaled]);\n\n if (total === 0 || !current) return null;\n\n const handleBlur = (event: { relatedTarget: EventTarget | null }) => {\n const next = event.relatedTarget as Node | null;\n if (\n next &&\n (rootRef.current?.contains(next) || cardRef.current?.contains(next))\n )\n return;\n hide();\n };\n\n const handleClick = (event: { detail: number }) => {\n if (open && pinnedRef.current) {\n hide();\n return;\n }\n pinnedRef.current = true;\n if (event.detail === 0) {\n focusOnOpen.current = true;\n setFocusTick((value) => value + 1);\n }\n show();\n };\n\n const step = (delta: number) => {\n setActive((value) => (value + delta + total) % total);\n };\n\n const handleCardKeyDown = (event: {\n key: string;\n preventDefault(): void;\n }) => {\n if (total < 2) return;\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n step(1);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n step(-1);\n }\n };\n\n const site = sourceSite(current);\n const position = Math.min(active, total - 1);\n\n return (\n <span\n ref={rootRef}\n className={cn(\"sph-citation\", className)}\n data-open={open || undefined}\n onPointerEnter={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") requestOpen();\n }}\n onPointerLeave={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") requestClose();\n }}\n onBlur={handleBlur}\n >\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-citation__marker\"\n aria-label={citationLabel(sources, index)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? id : undefined}\n data-group={total > 1 || undefined}\n onFocus={requestOpen}\n onClick={handleClick}\n >\n {sources.slice(0, shown).map((source, offset) => (\n <span\n key={`${offset}-${source.title}`}\n className=\"sph-citation__number\"\n >\n {index + offset}\n </span>\n ))}\n {hidden > 0 && <span className=\"sph-citation__more\">+{hidden}</span>}\n </button>\n {present &&\n portaled &&\n createPortal(\n <div\n id={id}\n ref={cardRef}\n className=\"sph-citation__card\"\n data-state={state}\n role=\"dialog\"\n tabIndex={-1}\n aria-label={\n total > 1\n ? `Sources ${index} to ${index + total - 1}`\n : `Source ${index}`\n }\n onPointerEnter={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") clearTimers();\n }}\n onPointerLeave={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") requestClose();\n }}\n onBlur={handleBlur}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"sph-citation__meta\">\n <span className=\"sph-citation__favicon\" aria-hidden=\"true\">\n {current.favicon ? (\n <img src={current.favicon} alt=\"\" width={14} height={14} />\n ) : (\n (site ?? current.title).charAt(0).toUpperCase()\n )}\n </span>\n <span className=\"sph-citation__site\">\n {site ?? `Source ${index + position}`}\n </span>\n <span className=\"sph-citation__index\">{index + position}</span>\n </div>\n {current.url ? (\n <a\n className=\"sph-citation__title\"\n href={current.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {current.title}\n <ArrowUpRightIcon\n className=\"sph-citation__external\"\n size={12}\n weight=\"bold\"\n aria-hidden=\"true\"\n />\n <span className=\"sph-citation__sr\">(opens in a new tab)</span>\n </a>\n ) : (\n <span className=\"sph-citation__title\">{current.title}</span>\n )}\n {current.snippet && (\n <p className=\"sph-citation__snippet\">{current.snippet}</p>\n )}\n {total > 1 && (\n <div className=\"sph-citation__pager\">\n <button\n type=\"button\"\n className=\"sph-citation__step\"\n aria-label=\"Previous source\"\n onClick={() => step(-1)}\n >\n <CaretLeftIcon size={12} weight=\"bold\" aria-hidden=\"true\" />\n </button>\n <span className=\"sph-citation__position\" aria-live=\"polite\">\n {position + 1} of {total}\n </span>\n <button\n type=\"button\"\n className=\"sph-citation__step\"\n aria-label=\"Next source\"\n onClick={() => step(1)}\n >\n <CaretRightIcon size={12} weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n </div>,\n document.body,\n )}\n </span>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { StatusMark, type StatusMarkState } from \"../../atoms/StatusMark\";\n\nexport type ToolCall = {\n id: string;\n name: string;\n title?: Renderable;\n state: StatusMarkState;\n input?: Renderable;\n output?: Renderable;\n duration?: number;\n};\n\nexport type ToolCallsProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n calls: ToolCall[];\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n label?: Renderable;\n};\n\nconst STATE_WORD: Record<StatusMarkState, string> = {\n idle: \"Queued\",\n running: \"Running\",\n progress: \"Running\",\n success: \"Done\",\n error: \"Failed\",\n};\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.max(0, Math.round(ms))}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n}\n\nconst isActive = (state: StatusMarkState) =>\n state === \"running\" || state === \"progress\";\n\nconst isSettled = (state: StatusMarkState) =>\n state === \"success\" || state === \"error\";\n\nfunction summarizeCalls(calls: ToolCall[]): StatusMarkState {\n if (calls.length === 0) return \"idle\";\n if (calls.some((call) => isActive(call.state))) return \"running\";\n if (calls.every((call) => isSettled(call.state))) {\n return calls.some((call) => call.state === \"error\") ? \"error\" : \"success\";\n }\n return calls.some((call) => isSettled(call.state)) ? \"running\" : \"idle\";\n}\n\nfunction announce(calls: ToolCall[]): string {\n const failed = calls.filter((call) => call.state === \"error\").length;\n if (calls.length === 1) {\n return `${calls[0].name} ${failed > 0 ? \"failed\" : \"finished\"}`;\n }\n const noun = `${calls.length} tools`;\n return failed > 0 ? `${failed} of ${noun} failed` : `Ran ${noun}`;\n}\n\nfunction totalDuration(calls: ToolCall[]): number | undefined {\n const timed = calls.filter((call) => call.duration !== undefined);\n if (timed.length === 0) return undefined;\n return timed.reduce((sum, call) => sum + (call.duration ?? 0), 0);\n}\n\nfunction latestCall(calls: ToolCall[]): ToolCall | undefined {\n for (let index = calls.length - 1; index >= 0; index -= 1) {\n if (isActive(calls[index].state)) return calls[index];\n }\n for (let index = calls.length - 1; index >= 0; index -= 1) {\n if (calls[index].state !== \"idle\") return calls[index];\n }\n return calls[calls.length - 1];\n}\n\nfunction ToolCallRow({ call, tag }: { call: ToolCall; tag: \"li\" | \"div\" }) {\n const [open, setOpen] = useState(false);\n const detailsId = `${useId()}-details`;\n const expandable = call.input !== undefined || call.output !== undefined;\n const Tag = tag as \"div\";\n\n const content = (\n <>\n <StatusMark state={call.state} label={STATE_WORD[call.state]} size=\"sm\" />\n <span className=\"sph-tool-calls__title\">\n {node(call.title ?? call.name)}\n </span>\n {call.title !== undefined && (\n <code className=\"sph-tool-calls__name\">{call.name}</code>\n )}\n {call.duration !== undefined && (\n <span className=\"sph-tool-calls__duration\">\n {formatDuration(call.duration)}\n </span>\n )}\n </>\n );\n\n return (\n <Tag\n className=\"sph-tool-calls__call\"\n data-state={call.state}\n data-open={expandable ? (open ? \"true\" : \"false\") : undefined}\n >\n {expandable ? (\n <button\n type=\"button\"\n className=\"sph-tool-calls__row\"\n aria-expanded={open}\n aria-controls={detailsId}\n onClick={() => setOpen(!open)}\n >\n {content}\n <span className=\"sph-tool-calls__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={11} weight=\"bold\" />\n </span>\n </button>\n ) : (\n <div className=\"sph-tool-calls__row\">{content}</div>\n )}\n {expandable && (\n <div className=\"sph-tool-calls__details\" id={detailsId}>\n <div className=\"sph-tool-calls__details-inner\">\n {call.input !== undefined && (\n <div className=\"sph-tool-calls__block\" data-kind=\"input\">\n <span className=\"sph-tool-calls__block-label\">Input</span>\n <pre className=\"sph-tool-calls__code\">{node(call.input)}</pre>\n </div>\n )}\n {call.output !== undefined && (\n <div className=\"sph-tool-calls__block\" data-kind=\"output\">\n <span className=\"sph-tool-calls__block-label\">Output</span>\n <pre className=\"sph-tool-calls__code\">{node(call.output)}</pre>\n </div>\n )}\n </div>\n </div>\n )}\n </Tag>\n );\n}\n\nexport function ToolCalls({\n calls,\n open,\n defaultOpen = false,\n onOpenChange,\n label,\n className,\n ...props\n}: ToolCallsProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const isOpen = open ?? uncontrolled;\n const listId = `${useId()}-list`;\n const state = summarizeCalls(calls);\n const settled = state === \"success\" || state === \"error\";\n const [announcement, setAnnouncement] = useState(\"\");\n const wasSettled = useRef(settled);\n const message = settled ? announce(calls) : \"\";\n\n useEffect(() => {\n if (settled && !wasSettled.current) setAnnouncement(message);\n if (!settled) setAnnouncement(\"\");\n wasSettled.current = settled;\n }, [settled, message]);\n\n const toggle = () => {\n const next = !isOpen;\n setUncontrolled(next);\n onOpenChange?.(next);\n };\n\n const status = (\n <span className=\"sph-tool-calls__status\" role=\"status\">\n {announcement}\n </span>\n );\n\n if (calls.length <= 1) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-tool-calls\", className)}\n data-layout=\"single\"\n data-status={state}\n >\n {calls[0] && <ToolCallRow call={calls[0]} tag=\"div\" />}\n {status}\n </div>\n );\n }\n\n const failed = calls.filter((call) => call.state === \"error\").length;\n const finished = calls.filter((call) => isSettled(call.state)).length;\n const total = totalDuration(calls);\n const latest = latestCall(calls);\n const summary =\n label !== undefined\n ? label\n : state === \"running\" && latest\n ? (latest.title ?? latest.name)\n : `Ran ${calls.length} tools`;\n const meta = settled\n ? [\n failed > 0 ? `${failed} failed` : undefined,\n total !== undefined ? formatDuration(total) : undefined,\n ].filter(Boolean)\n : [`${finished} of ${calls.length}`];\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-tool-calls\", className)}\n data-layout=\"group\"\n data-state={isOpen ? \"open\" : \"closed\"}\n data-status={state}\n >\n <button\n type=\"button\"\n className=\"sph-tool-calls__summary\"\n aria-expanded={isOpen}\n aria-controls={listId}\n onClick={toggle}\n >\n <StatusMark state={state} label={STATE_WORD[state]} size=\"sm\" />\n <span\n key={state === \"running\" && latest ? latest.id : \"summary\"}\n className=\"sph-tool-calls__summary-text\"\n >\n {node(summary)}\n </span>\n {meta.map((part) => (\n <span key={part} className=\"sph-tool-calls__meta\">\n {part}\n </span>\n ))}\n <span className=\"sph-tool-calls__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={11} weight=\"bold\" />\n </span>\n </button>\n <div className=\"sph-tool-calls__body\" id={listId}>\n <div className=\"sph-tool-calls__inner\">\n <ul className=\"sph-tool-calls__list\">\n {calls.map((call) => (\n <ToolCallRow key={call.id} call={call} tag=\"li\" />\n ))}\n </ul>\n </div>\n </div>\n {status}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { Button } from \"@/atoms/Button\";\nimport { Checkbox } from \"@/atoms/Checkbox\";\nimport { Kbd } from \"@/atoms/Kbd\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { StatusMark, type StatusMarkState } from \"../../atoms/StatusMark\";\n\nexport type PlanStep = {\n id: string;\n label: Renderable;\n detail?: Renderable;\n state?: StatusMarkState;\n};\n\nexport type PlanCardState = \"pending\" | \"approved\" | \"rejected\" | \"running\";\n\nexport type PlanCardProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"title\"\n> & {\n title: Renderable;\n description?: Renderable;\n steps: PlanStep[];\n editable?: boolean;\n onApprove: (steps: PlanStep[]) => void;\n onReject?: () => void;\n approveLabel?: Renderable;\n rejectLabel?: Renderable;\n state?: PlanCardState;\n hotkey?: boolean;\n autoFocus?: boolean;\n};\n\nconst STATE_LABEL: Record<PlanCardState, string> = {\n pending: \"\",\n approved: \"Approved\",\n running: \"Running\",\n rejected: \"Cancelled\",\n};\n\nconst STEP_WORD: Record<StatusMarkState, string> = {\n idle: \"Queued\",\n running: \"Running\",\n progress: \"Running\",\n success: \"Done\",\n error: \"Failed\",\n};\n\nconst TEXT_INPUT_EXEMPT = new Set([\n \"checkbox\",\n \"radio\",\n \"button\",\n \"submit\",\n \"reset\",\n \"range\",\n \"color\",\n \"file\",\n \"image\",\n]);\n\nfunction typingInto(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n if (target instanceof HTMLTextAreaElement) return true;\n if (target instanceof HTMLInputElement)\n return !TEXT_INPUT_EXEMPT.has(target.type);\n return false;\n}\n\nexport function PlanCard({\n title,\n description,\n steps,\n editable = false,\n onApprove,\n onReject,\n approveLabel = \"Run plan\",\n rejectLabel = \"Cancel\",\n state = \"pending\",\n hotkey = true,\n autoFocus = false,\n className,\n ...props\n}: PlanCardProps) {\n const baseId = useId();\n const titleId = `${baseId}-title`;\n const descriptionId = `${baseId}-description`;\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [excluded, setExcluded] = useState<string[]>([]);\n const [mac, setMac] = useState(false);\n const pending = state === \"pending\";\n const included = steps.filter((step) => !excluded.includes(step.id));\n const canApprove = pending && included.length > 0;\n\n const approve = () => {\n if (canApprove) onApprove(included);\n };\n const approveRef = useRef(approve);\n approveRef.current = approve;\n\n useEffect(() => {\n setMac(/Mac|iPhone|iPad/.test(navigator.userAgent));\n }, []);\n\n useEffect(() => {\n if (!autoFocus) return;\n rootRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-plan-card__approve\")\n ?.focus();\n }, [autoFocus]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root || !hotkey || !pending) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Enter\" || !(event.metaKey || event.ctrlKey)) return;\n if (typingInto(event.target)) return;\n event.preventDefault();\n approveRef.current();\n };\n root.addEventListener(\"keydown\", handleKeyDown);\n return () => root.removeEventListener(\"keydown\", handleKeyDown);\n }, [hotkey, pending]);\n\n const wasPending = useRef(pending);\n useEffect(() => {\n const root = rootRef.current;\n if (wasPending.current && !pending && root) {\n const active = document.activeElement;\n if (!active || active === document.body || root.contains(active)) {\n root.focus();\n }\n }\n wasPending.current = pending;\n }, [pending]);\n\n const toggle = (id: string) => {\n setExcluded((current) =>\n current.includes(id)\n ? current.filter((entry) => entry !== id)\n : [...current, id],\n );\n };\n\n const visible = pending ? steps : included;\n const done = included.filter((step) => step.state === \"success\").length;\n\n return (\n <div\n {...node(props)}\n ref={rootRef}\n role=\"group\"\n tabIndex={pending ? undefined : -1}\n aria-labelledby={titleId}\n aria-describedby={description !== undefined ? descriptionId : undefined}\n className={cn(\"sph-plan-card\", className)}\n data-state={state}\n data-editable={editable && pending ? \"true\" : undefined}\n >\n <div className=\"sph-plan-card__header\">\n <div className=\"sph-plan-card__heading\">\n <span className=\"sph-plan-card__title\" id={titleId}>\n {node(title)}\n </span>\n {description !== undefined && (\n <span className=\"sph-plan-card__description\" id={descriptionId}>\n {node(description)}\n </span>\n )}\n </div>\n <span className=\"sph-plan-card__status\" role=\"status\">\n {!pending && (\n <span className=\"sph-plan-card__badge\">{STATE_LABEL[state]}</span>\n )}\n </span>\n {state === \"running\" && (\n <span className=\"sph-plan-card__progress\">\n {done} of {included.length}\n </span>\n )}\n </div>\n\n {state !== \"rejected\" && (\n <ol className=\"sph-plan-card__steps\">\n {visible.map((step, index) => {\n const inputId = `${baseId}-step-${index}`;\n const detailId = `${inputId}-detail`;\n const isIncluded = !excluded.includes(step.id);\n const stepState = step.state ?? \"idle\";\n return (\n <li\n key={step.id}\n className=\"sph-plan-card__step\"\n data-included={isIncluded ? \"true\" : \"false\"}\n data-step-state={state === \"running\" ? stepState : undefined}\n >\n <span className=\"sph-plan-card__marker\">\n {editable && pending ? (\n <Checkbox\n id={inputId}\n size=\"sm\"\n checked={isIncluded}\n onChange={() => toggle(step.id)}\n aria-describedby={\n step.detail !== undefined ? detailId : undefined\n }\n />\n ) : state === \"running\" ? (\n <StatusMark\n state={stepState}\n label={STEP_WORD[stepState]}\n size=\"sm\"\n />\n ) : (\n <span className=\"sph-plan-card__number\" aria-hidden=\"true\">\n {index + 1}\n </span>\n )}\n </span>\n <span className=\"sph-plan-card__body\">\n {editable && pending ? (\n <label className=\"sph-plan-card__label\" htmlFor={inputId}>\n {node(step.label)}\n </label>\n ) : (\n <span className=\"sph-plan-card__label\">\n {node(step.label)}\n </span>\n )}\n {step.detail !== undefined && pending && (\n <span className=\"sph-plan-card__detail\" id={detailId}>\n {node(step.detail)}\n </span>\n )}\n </span>\n </li>\n );\n })}\n </ol>\n )}\n\n {pending && (\n <div className=\"sph-plan-card__footer\">\n {editable && (\n <span className=\"sph-plan-card__count\">\n {included.length} of {steps.length} steps\n </span>\n )}\n {onReject && (\n <Button variant=\"quiet\" size=\"sm\" onClick={onReject}>\n {node(rejectLabel)}\n </Button>\n )}\n <span className=\"sph-plan-card__action\">\n {hotkey && (\n <span className=\"sph-plan-card__shortcut\" aria-hidden=\"true\">\n <Kbd keys={[mac ? \"⌘\" : \"Ctrl\", \"↵\"]} />\n </span>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n className=\"sph-plan-card__approve\"\n disabled={!canApprove}\n aria-keyshortcuts={\n hotkey ? (mac ? \"Meta+Enter\" : \"Control+Enter\") : undefined\n }\n onClick={approve}\n >\n {node(approveLabel)}\n </Button>\n </span>\n </div>\n )}\n </div>\n );\n}\n","import { ArrowDownIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\nimport { motionDurationMs, usePresence } from \"@/lib/presence.js\";\n\nexport type ChatScrollerProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n children?: Renderable;\n itemCount?: number;\n newCount?: number;\n threshold?: number;\n ariaLabel?: string;\n jumpLabel?: string;\n contentClassName?: string;\n onPinnedChange?: (pinned: boolean) => void;\n};\n\nexport type ScrollMetrics = {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n};\n\nexport function distanceFromBottom(metrics: ScrollMetrics): number {\n return Math.max(\n 0,\n metrics.scrollHeight - metrics.scrollTop - metrics.clientHeight,\n );\n}\n\nexport function isNearBottom(\n metrics: ScrollMetrics,\n threshold: number,\n): boolean {\n return distanceFromBottom(metrics) <= Math.max(0, threshold);\n}\n\nexport function newMessagesText(count: number): string {\n if (count <= 0) return \"\";\n return `${count} new ${count === 1 ? \"message\" : \"messages\"}`;\n}\n\ntype TouchPoint = { touches: ArrayLike<{ clientY: number }> };\n\nconst UPWARD_KEYS = new Set([\"ArrowUp\", \"PageUp\", \"Home\"]);\n\nexport function ChatScroller({\n children,\n itemCount,\n newCount,\n threshold = 48,\n ariaLabel = \"Conversation\",\n jumpLabel = \"Jump to latest\",\n contentClassName,\n onPinnedChange,\n className,\n ...props\n}: ChatScrollerProps) {\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const pinnedRef = useRef(true);\n const jumpingRef = useRef(false);\n const thresholdRef = useRef(threshold);\n const onPinnedChangeRef = useRef(onPinnedChange);\n const lastItemCount = useRef(itemCount);\n const reportedPinned = useRef(true);\n const lastTop = useRef(0);\n const touchY = useRef<number | null>(null);\n const [pinned, setPinnedState] = useState(true);\n const [unread, setUnread] = useState(0);\n\n thresholdRef.current = threshold;\n onPinnedChangeRef.current = onPinnedChange;\n\n const count = pinned ? 0 : Math.max(0, newCount ?? unread);\n const {\n present,\n state,\n ref: jumpRef,\n } = usePresence<HTMLButtonElement>(!pinned, \"fast\");\n\n const setPinned = (next: boolean) => {\n pinnedRef.current = next;\n setPinnedState(next);\n if (next) setUnread(0);\n };\n\n const stickToBottom = () => {\n const viewport = viewportRef.current;\n if (!viewport || !pinnedRef.current) return;\n viewport.scrollTop = viewport.scrollHeight;\n };\n\n useIsoLayoutEffect(() => {\n stickToBottom();\n }, []);\n\n useEffect(() => {\n const viewport = viewportRef.current;\n const content = contentRef.current;\n if (!viewport || !content || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => {\n if (pinnedRef.current) jumpingRef.current = false;\n stickToBottom();\n });\n observer.observe(content);\n observer.observe(viewport);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n const previous = lastItemCount.current;\n lastItemCount.current = itemCount;\n if (itemCount === undefined || previous === undefined) return;\n if (!pinnedRef.current && itemCount > previous)\n setUnread((current) => current + itemCount - previous);\n }, [itemCount]);\n\n useEffect(() => {\n if (reportedPinned.current === pinned) return;\n reportedPinned.current = pinned;\n onPinnedChangeRef.current?.(pinned);\n }, [pinned]);\n\n const handleScroll = () => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const top = viewport.scrollTop;\n const movingDown = top > lastTop.current;\n lastTop.current = top;\n const atBottom = isNearBottom(viewport, thresholdRef.current);\n if (jumpingRef.current) {\n if (atBottom) jumpingRef.current = false;\n return;\n }\n if (pinnedRef.current) {\n if (!atBottom) setPinned(false);\n return;\n }\n if (atBottom && (movingDown || distanceFromBottom(viewport) <= 1))\n setPinned(true);\n };\n\n const release = () => {\n jumpingRef.current = false;\n const viewport = viewportRef.current;\n if (\n pinnedRef.current &&\n viewport &&\n viewport.scrollTop > 0 &&\n viewport.scrollHeight > viewport.clientHeight\n )\n setPinned(false);\n };\n\n const handleWheel = (event: { deltaY: number }) => {\n jumpingRef.current = false;\n if (event.deltaY < 0) release();\n };\n\n const handleTouchStart = (event: TouchPoint) => {\n jumpingRef.current = false;\n touchY.current = event.touches[0]?.clientY ?? null;\n };\n\n const handleTouchMove = (event: TouchPoint) => {\n const y = event.touches[0]?.clientY;\n if (touchY.current === null || y === undefined) return;\n if (y - touchY.current > 4) release();\n };\n\n const handleKeyDown = (event: {\n key: string;\n target: EventTarget | null;\n }) => {\n jumpingRef.current = false;\n if (event.target !== viewportRef.current) return;\n if (UPWARD_KEYS.has(event.key)) release();\n };\n\n const jumpToLatest = () => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const hadFocus = jumpRef.current === document.activeElement;\n const smooth = motionDurationMs(viewport, \"normal\") > 0;\n jumpingRef.current = distanceFromBottom(viewport) > 0;\n setPinned(true);\n if (typeof viewport.scrollTo === \"function\")\n viewport.scrollTo({\n top: viewport.scrollHeight,\n behavior: smooth ? \"smooth\" : \"auto\",\n });\n else viewport.scrollTop = viewport.scrollHeight;\n if (hadFocus) viewport.focus({ preventScroll: true });\n };\n\n const expanded = count > 0;\n const buttonName = expanded\n ? `${jumpLabel}, ${newMessagesText(count)}`\n : jumpLabel;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-chat-scroller\", className)}\n data-pinned={pinned || undefined}\n >\n <div\n ref={viewportRef}\n className=\"sph-chat-scroller__viewport\"\n role=\"log\"\n aria-label={ariaLabel}\n aria-live=\"off\"\n tabIndex={0}\n onScroll={handleScroll}\n onWheel={handleWheel}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onPointerDown={() => {\n jumpingRef.current = false;\n }}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={contentRef}\n className={cn(\"sph-chat-scroller__content\", contentClassName)}\n >\n {node(children)}\n </div>\n </div>\n {present && (\n <button\n type=\"button\"\n ref={jumpRef}\n className=\"sph-chat-scroller__jump\"\n data-state={state}\n data-expanded={expanded || undefined}\n aria-label={buttonName}\n onClick={jumpToLatest}\n >\n <ArrowDownIcon\n className=\"sph-chat-scroller__jump-icon\"\n size={14}\n weight=\"bold\"\n aria-hidden=\"true\"\n />\n <span className=\"sph-chat-scroller__jump-count\" aria-hidden=\"true\">\n <span className=\"sph-chat-scroller__jump-text\">\n {expanded ? `${count} new` : \"\"}\n </span>\n </span>\n </button>\n )}\n <span\n className=\"sph-chat-scroller__status\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {newMessagesText(count)}\n </span>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAa,QAAQ,UAAwB;;;;;;;AC8B7C,MAAa,qBACX,OAAO,aAAa,cAAc,YAAY;AAEhD,SAASA,QAAM,OAAe,KAAa,KAAqB;CAG9D,OAAO,KAAK,IAAI,KAAK,IAAI,OAFb,KAAK,IAAI,KAAK,GAEQ,CAAC,GADtB,KAAK,IAAI,KAAK,GACc,CAAC;AAC5C;;;;;AAMA,SAAgB,iBACd,SACA,SACA,UACA,WACiB;CACjB,MAAM,EAAE,MAAM,QAAQ,OAAO,QAAQ,YAAY;CACjD,IAAI,OAAO;CAEX,IAAI,SAAS,UAAU,SAAS,SAAS;EACvC,MAAM,OAAO,QAAQ,QAAQ,SAAS;EACtC,MAAM,WAAW,QAAQ,OAAO;EAChC,MAAM,YAAY,SAAS,QAAQ,QAAQ,QAAQ;EACnD,IAAI,SAAS,UAAU,WAAW,QAAQ,YAAY,UACpD,OAAO;OACJ,IAAI,SAAS,WAAW,YAAY,QAAQ,WAAW,WAC1D,OAAO;CACX,OAAO;EACL,MAAM,OAAO,QAAQ,SAAS,SAAS;EACvC,MAAM,YAAY,SAAS,SAAS,QAAQ,SAAS;EACrD,MAAM,YAAY,QAAQ,MAAM;EAChC,IAAI,SAAS,YAAY,YAAY,QAAQ,YAAY,WACvD,OAAO;OACJ,IAAI,SAAS,SAAS,YAAY,QAAQ,YAAY,WACzD,OAAO;CACX;CAEA,IAAI;CACJ,IAAI;CAEJ,IAAI,SAAS,YAAY,SAAS,OAAO;EACvC,MACE,SAAS,WACL,QAAQ,SAAS,SACjB,QAAQ,MAAM,QAAQ,SAAS;EACrC,OACE,UAAU,UACN,QAAQ,OACR,UAAU,QACR,QAAQ,QAAQ,QAAQ,QACxB,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;CAC3D,OAAO;EACL,OACE,SAAS,UACL,QAAQ,QAAQ,SAChB,QAAQ,OAAO,QAAQ,QAAQ;EACrC,MAAM,QAAQ,OAAO,QAAQ,SAAS,QAAQ,UAAU;CAC1D;CAEA,OAAOA,QAAM,MAAM,SAAS,SAAS,QAAQ,QAAQ,QAAQ,OAAO;CACpE,MAAMA,QAAM,KAAK,SAAS,SAAS,SAAS,QAAQ,SAAS,OAAO;CAEpE,OAAO;EAAE,MAAM,KAAK,MAAM,IAAI;EAAG,KAAK,KAAK,MAAM,GAAG;EAAG;CAAK;AAC9D;;AAGA,SAAgB,cAAc,MAAmB,OAA6B;CAC5E,IAAI,SAAS,QAAQ,OAAO;CAC5B,IAAI,SAAS,SAAS,OAAO;CAC7B,MAAM,OAAO,SAAS,WAAW,QAAQ;CACzC,IAAI,UAAU,UAAU,OAAO,GAAG,KAAK;CACvC,OAAO,GAAG,KAAK,GAAG,UAAU,UAAU,SAAS;AACjD;AAEA,MAAM,mBAAmB;CACvB;CACA;CACA;CACA;AACF;AASA,MAAM,eAAe;AACrB,MAAM,oCAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;AACF,CAAC;AACD,MAAM,+BAAe,IAAI,QAA0B;AAEnD,SAAS,WACP,SACA,QACA,WACM;CACN,MAAM,EAAE,UAAU;CAClB,IAAI,CAAC,OAAO;CACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM,KAAK,KAAK;EAC7B,IAAI,CAAC,KAAK,WAAW,YAAY,KAAK,QAAQ,QAAQ;EACtD,IAAI,aAAa,kBAAkB,IAAI,IAAI,GAAG;EAC9C,MAAM,QAAQ,MAAM,iBAAiB,IAAI,CAAC,CAAC,KAAK;EAChD,IAAI,OAAO,OAAO,QAAQ;CAC5B;AACF;AAEA,SAAgB,aAAa,QAAsC;CACjE,MAAM,aAAyC,CAAC;CAChD,MAAM,SAAiC,CAAC;CACxC,IAAI,CAAC,QAAQ,OAAO;EAAE;EAAY;CAAO;CAEzC,KAAK,MAAM,QAAQ,kBAAkB;EACnC,MAAM,QAAQ,OAAO,QAAQ,IAAI,KAAK,EAAE,CAAC,EAAE,aAAa,IAAI;EAC5D,IAAI,OAAO,WAAW,QAAQ;CAChC;CAEA,IAAI,YAAY;CAChB,KACE,IAAI,UAA0B,QAC9B,SACA,UAAU,QAAQ,eAClB;EACA,WAAW,SAAS,QAAQ,SAAS;EACrC,IAAI,QAAQ,aAAa,oBAAoB,GAAG;EAChD,IAAI,QAAQ,aAAa,qBAAqB,MAAM,OAAO,YAAY;CACzE;CAEA,OAAO;EAAE;EAAY;CAAO;AAC9B;AAEA,SAAgB,aACd,QACA,QACM;CACN,IAAI,CAAC,QAAQ;CACb,MAAM,EAAE,YAAY,WAAW,aAAa,MAAM;CAElD,KAAK,MAAM,QAAQ,kBAAkB;EACnC,MAAM,QAAQ,WAAW;EACzB,IAAI,OAAO,OAAO,aAAa,MAAM,KAAK;OACrC,OAAO,gBAAgB,IAAI;CAClC;CAEA,KAAK,MAAM,QAAQ,aAAa,IAAI,MAAM,KAAK,CAAC,GAC9C,IAAI,EAAE,QAAQ,SAAS,OAAO,MAAM,eAAe,IAAI;CAEzD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,GAC/C,OAAO,MAAM,YAAY,MAAM,KAAK;CAEtC,aAAa,IAAI,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC9C;AAEA,MAAa,qBAAqB;;;;;;AAOlC,SAAgB,cAAuB;CACrC,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,yBAAyB;EACvB,YAAY,IAAI;CAClB,GAAG,CAAC,CAAC;CACL,OAAO;AACT;;;;;;AAOA,SAAgB,mBACd,YACA,YACA,QACA,YAA8B,CAAC,GACzB;CACN,MAAM,EACJ,OAAO,UACP,QAAQ,SACR,SAAS,GACT,UAAU,GACV,aAAa,UACX;CACJ,MAAM,WAAW,OAAsB,IAAI;CAE3C,yBAAyB;EACvB,IAAI,CAAC,QAAQ;EAEb,MAAM,eAAe;GACnB,SAAS,UAAU;GACnB,MAAM,UAAU,WAAW;GAC3B,MAAM,UAAU,WAAW;GAC3B,IAAI,CAAC,WAAW,CAAC,SAAS;GAE1B,MAAM,cAAc,QAAQ,sBAAsB;GAClD,IAAI,YACF,QAAQ,MAAM,QAAQ,GAAG,KAAK,MAAM,YAAY,KAAK,EAAE;GAEzD,QAAQ,MAAM,WAAW;GAMzB,MAAM,WAAW,iBACf,aACA;IANA,OAAO,QAAQ;IACf,QAAQ,QAAQ;GAKN,GACV;IAAE,OAAO,OAAO;IAAY,QAAQ,OAAO;GAAY,GACvD;IAAE;IAAM;IAAO;IAAQ;GAAQ,CACjC;GAEA,MAAM,QAAQ,QAAQ;GACtB,MAAM,OAAO,GAAG,SAAS,KAAK;GAC9B,MAAM,MAAM,GAAG,SAAS,IAAI;GAC5B,MAAM,QAAQ;GACd,MAAM,SAAS;GACf,MAAM,YAAY;GAClB,MAAM,kBAAkB,cAAc,SAAS,MAAM,KAAK;GAC1D,QAAQ,QAAQ,OAAO,SAAS;EAClC;EAEA,MAAM,iBAAiB;GACrB,IAAI,SAAS,YAAY,MACvB,SAAS,UAAU,sBAAsB,MAAM;EACnD;EAEA,mBAAmB,WAAW,SAAS,WAAW,OAAO;EACzD,OAAO;EACP,OAAO,iBAAiB,UAAU,QAAQ;EAC1C,SAAS,iBAAiB,UAAU,UAAU;GAC5C,SAAS;GACT,SAAS;EACX,CAAC;EACD,aAAa;GACX,OAAO,oBAAoB,UAAU,QAAQ;GAC7C,SAAS,oBAAoB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;GAClE,IAAI,SAAS,YAAY,MAAM,qBAAqB,SAAS,OAAO;EACtE;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH;;;AC5SA,MAAM,cAA2C;CAC/C,MAAM;CACN,QAAQ;CACR,MAAM;AACR;;AAGA,MAAM,oBAAoB;;AAG1B,SAAgB,gBAAgB,OAAuB;CACrD,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,0BAA0B;CAC3D,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,SAAS,OAAO,WAAW,MAAM,EAAE;CACzC,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG,OAAO;CACpD,OAAO,MAAM,OAAO,MAAM,SAAS,MAAO;AAC5C;;;;;;AAOA,SAAgB,iBACd,SACA,OACQ;CACR,IAAI,OAAO,WAAW,eAAe,OAAO,qBAAqB,YAC/D,OAAO;CACT,MAAM,SAAS,WAAW,SAAS;CACnC,MAAM,MAAM,iBAAiB,MAAM,CAAC,CAAC,iBAAiB,YAAY,MAAM;CACxE,OAAO,KAAK,IAAI,gBAAgB,OAAO,KAAK,GAAG,IAAI;AACrD;;;;;;;;;;;;AAwBA,SAAgB,YACd,MACA,QAAqB,UACR;CACb,MAAM,MAAM,OAAiB,IAAI;CACjC,MAAM,CAAC,SAAS,cAAc,SAAS,IAAI;CAC3C,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAE5C,gBAAgB;EACd,IAAI,MAAM;GACR,WAAW,KAAK;GAChB,WAAW,IAAI;GACf;EACF;EACA,IAAI,CAAC,SAAS;EACd,MAAM,WAAW,iBAAiB,IAAI,SAAS,KAAK;EACpD,IAAI,YAAY,GAAG;GACjB,WAAW,KAAK;GAChB;EACF;EACA,WAAW,IAAI;EACf,MAAM,QAAQ,iBAAiB;GAC7B,WAAW,KAAK;GAChB,WAAW,KAAK;EAClB,GAAG,WAAW,iBAAiB;EAC/B,aAAa,aAAa,KAAK;CACjC,GAAG;EAAC;EAAM;EAAS;CAAK,CAAC;CAEzB,OAAO;EACL;EACA;EACA,OAAO,UAAU,WAAW;EAC5B;CACF;AACF;;;AC9EA,MAAMC,gBAAc,UAAkB;CACpC,MAAM,GAAG,WAAW,MAAM,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG;CACjD,OAAO,KAAK,IAAI,SAAS,QAAQ,CAAC;AACpC;AAEA,SAAgB,eAAe,EAC7B,OACA,MACA,WAAW,KACX,QACA,WACA,GAAG,SACmB;CACtB,MAAM,MAAM,OAAwB,IAAI;CACxC,MAAM,WAAW,OAAe,QAAQ,KAAK;CAC7C,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,YAAYA,aAAW,KAAK;CAElC,yBAAyB;EACvB,MAAM,SAAS;EACf,MAAM,QAAQ,SAAS;EACvB,IAAI,UAAU,QAAQ;EACtB,SAAS,UAAU;EACnB,IAAI,YAAY,KAAK,iBAAiB,IAAI,SAAS,QAAQ,KAAK,GAAG;GACjE,WAAW,MAAM;GACjB;EACF;EACA,MAAM,QAAQ,YAAY,IAAI;EAC9B,IAAI,QAAQ;EACZ,MAAM,QAAQ,QAAgB;GAC5B,MAAM,WAAW,KAAK,IAAI,IAAI,MAAM,SAAS,QAAQ;GACrD,MAAM,QAAQ,KAAK,IAAI,aAAa;GACpC,MAAM,UAAU,SAAS,SAAS,SAAS;GAC3C,SAAS,UAAU,WAAW,IAAI,UAAU;GAC5C,WAAW,SAAS,OAAO;GAC3B,IAAI,WAAW,GAAG,QAAQ,sBAAsB,IAAI;EACtD;EACA,QAAQ,sBAAsB,IAAI;EAClC,aAAa,qBAAqB,KAAK;CACzC,GAAG,CAAC,OAAO,QAAQ,CAAC;CAEpB,OACE,oBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACT;EACL,WAAW,GAAG,uBAAuB,SAAS;EAE7C,UAAA,SACG,OAAO,OAAO,IACd,YAAY,IACV,QAAQ,QAAQ,SAAS,IACzB,OAAO,KAAK,MAAM,OAAO,CAAC;CAC5B,CAAA;AAEV;;;ACvDA,SAAS,WAAW,MAAkC;CACpD,IAAI,CAAC,MAAM,OAAO;CAElB,OADc,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,CACrC,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE,EAAE,YAAY,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK;AACvE;AAEA,SAAgB,OAAO,EACrB,KACA,MACA,OAAO,MACP,QACA,WACA,GAAG,SACW;CACd,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,YAAY,QAAQ,GAAG,KAAK,CAAC;CAEnC,OACE,qBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,cAAc,SAAS;EACrC,aAAW;EACX,OAAO;EAJT,UAAA,CAMG,YACC,oBAAC,OAAD;GACE,WAAU;GACL;GACL,KAAK,QAAQ;GACb,eAAe,UAAU,IAAI;EAC9B,CAAA,IAED,oBAAC,QAAD;GAAM,WAAU;GAAuB,eAAY;GAChD,UAAA,WAAW,IAAI;EACZ,CAAA,GAEP,WAAW,KAAA,KACV,oBAAC,QAAD;GACE,WAAU;GACV,eAAa;GACb,eAAY;EACb,CAAA,CAEC;;AAEV;;;AClDA,SAAgB,MAAM,EACpB,UAAU,WACV,OAAO,MACP,WACA,UACA,GAAG,SACU;CACb,OACE,oBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,aAAa,SAAS;EACpC,gBAAc;EACd,aAAW;EAEV,UAAA,KAAK,QAAQ;CACV,CAAA;AAEV;;;AClBA,SAAgB,QAAQ,EACtB,OAAO,MACP,OACA,WACA,GAAG,SACY;CACf,OACE,oBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,eAAe,gBAAgB,QAAQ,SAAS;EAC9D,MAAM,QAAQ,WAAW,KAAA;EACzB,cAAY;EACZ,eAAa,QAAQ,KAAA,IAAY;CAClC,CAAA;AAEL;;;ACTA,SAAgB,OAAO,EACrB,UAAU,aACV,OAAO,MACP,UAAU,OACV,UACA,WACA,OAAO,UACP,UACA,SACA,aAAa,UACb,iBAAiB,cACjB,GAAG,SACW;CACd,MAAM,eAAe,UAAyC;EAC5D,IAAI,SAAS;GACX,MAAM,eAAe;GACrB;EACF;EACA,UAAU,KAAK;CACjB;CAEA,OACE,qBAAC,UAAD;EACQ;EACN,WAAW,GAAG,cAAc,SAAS;EACrC,gBAAc;EACd,aAAW;EACX,gBAAc,WAAW,KAAA;EACf;EACV,GAAI,KAAK,KAAK;EACd,aAAW,aAAa,WAAW,KAAA;EACnC,iBAAe,UAAU,OAAO;EAChC,SAAS;EAVX,UAAA,CAYE,oBAAC,QAAD;GAAM,WAAU;GAAqB,UAAA,KAAK,QAAQ;EAAQ,CAAA,GACzD,WACC,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAAC,SAAD,EAAS,MAAK,KAAM,CAAA;EAChB,CAAA,CAEF;;AAEZ;;;AC3CA,SAAgB,SAAS,EACvB,OACA,OAAO,MACP,UAAU,OACV,WACA,GAAG,SACa;CAChB,MAAM,UACJ,oBAAC,SAAD;EACE,GAAI,KAAK,KAAK;EACd,MAAK;EACL,WAAU;EACV,aAAW;EACX,gBAAc,UAAU,OAAO,MAAM;CACtC,CAAA;CAGH,OACE,qBAAC,SAAD;EAAO,WAAW,GAAG,gBAAgB,SAAS;EAAG,aAAW;EAA5D,UAAA;GACG;GACD,oBAAC,QAAD;IAAM,WAAU;IAAoB,eAAY;IAC9C,UAAA,oBAAC,WAAD,EAAW,WAAU,sBAAuB,CAAA;GACxC,CAAA;GACL,UAAU,KAAA,KACT,oBAAC,QAAD;IAAM,WAAU;IAAuB,UAAA,KAAK,KAAK;GAAQ,CAAA;EAEtD;;AAEX;;;AC1BA,SAAgB,WAAW,EACzB,MACA,OACA,OAAO,MACP,UAAU,SACV,UAAU,OACV,UACA,WACA,OAAO,UACP,SACA,GAAG,SACe;CAClB,MAAM,eAAe,UAAyC;EAC5D,IAAI,SAAS;GACX,MAAM,eAAe;GACrB;EACF;EACA,UAAU,KAAK;CACjB;CAEA,OACE,qBAAC,UAAD;EACE,GAAI,KAAK,KAAK;EACR;EACN,WAAW,GAAG,mBAAmB,SAAS;EAC1C,aAAW;EACX,gBAAc;EACd,gBAAc,WAAW,KAAA;EACzB,cAAY;EACZ,aAAW,UAAU,OAAO,MAAM;EAClC,iBAAe,UAAU,OAAO,MAAM;EAC5B;EACV,SAAS;EAXX,UAAA,CAaE,oBAAC,QAAD;GAAM,WAAU;GAAyB,UAAA,KAAK,IAAI;EAAQ,CAAA,GACzD,WACC,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAAC,SAAD,EAAS,MAAM,SAAS,OAAO,OAAO,KAAO,CAAA;EACzC,CAAA,CAEF;;AAEZ;;;ACjDA,SAAgB,MAAM,EACpB,UAAU,OACV,OAAO,MACP,WACA,gBAAgB,aAChB,GAAG,SACU;CACb,OACE,oBAAC,SAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,aAAa,SAAS;EACpC,aAAW;EACX,gBAAc,gBAAgB,WAAW,KAAA;CAC1C,CAAA;AAEL;;;ACbA,SAAgB,IAAI,EAAE,MAAM,aAAuB;CACjD,MAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;CAC/C,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,WAAW,SAAS;EACpC,UAAA,KAAK,KAAK,KAAK,UACd,oBAAC,OAAD;GAAiB,WAAU;GACxB,UAAA,KAAK,GAAG;EACN,GAFK,KAEL,CACN;CACE,CAAA;AAET;;;ACXA,SAAgB,SAAS,EACvB,OACA,OACA,OAAO,MACP,WACA,GAAG,SACa;CAChB,MAAM,cAAc,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;CACtE,MAAM,UAAU,cACZ,KAAK,IAAI,KAAK,IAAI,OAAiB,CAAC,GAAG,GAAG,IAC1C,KAAA;CAEJ,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,gBAAgB,SAAS;EACvC,aAAW;EACX,MAAK;EACL,cAAY;EACZ,iBAAe,cAAc,IAAI,KAAA;EACjC,iBAAe,cAAc,MAAM,KAAA;EACnC,iBAAe;EACf,kBACE,YAAY,KAAA,IAAY,GAAG,KAAK,MAAM,OAAO,EAAE,KAAK,KAAA;EAGtD,UAAA,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAAC,QAAD;IACE,WAAU;IACV,sBAAoB,cAAc,KAAA,IAAY;IAC9C,OACE,cACK,EAAE,wBAAwB,GAAG,QAAQ,GAAG,IAEzC,KAAA;GAEP,CAAA;EACG,CAAA;CACH,CAAA;AAET;;;ACxCA,SAAgB,WAAW,EACzB,cAAc,YACd,WACA,UACA,GAAG,SACe;CAClB,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,mBAAmB,SAAS;EAC1C,oBAAkB;EAEjB,UAAA,KAAK,QAAQ;CACX,CAAA;AAET;;;AClBA,SAAgB,UAAU,EACxB,cAAc,cACd,aAAa,MACb,WACA,GAAG,SACc;CACjB,OACE,oBAAC,MAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,iBAAiB,SAAS;EACxC,oBAAkB;EAClB,MAAM,aAAa,iBAAiB;EACpC,oBAAkB,aAAa,KAAA,IAAY;CAC5C,CAAA;AAEL;;;ACfA,SAAgB,SAAS,EACvB,OACA,QACA,WACA,OACA,cAAc,WACd,GAAG,SACa;CAChB,OACE,oBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,gBAAgB,SAAS;EACvC,OAAO;GAAE,GAAG;GAAO;GAAO;EAAO;EACjC,MAAM,YAAY,QAAQ,KAAA;EAC1B,cAAY;EACZ,eAAa,YAAY,KAAA,IAAY;CACtC,CAAA;AAEL;;;ACEA,SAAgB,OAAO,EACrB,OACA,eACA,OACA,MAAM,GACN,MAAM,KACN,OAAO,GACP,OAAO,MACP,YACA,UAAU,OACV,WACA,UACA,OACA,IACA,cAAc,WACd,kBAAkB,eAClB,gBAAgB,aAChB,GAAG,SACW;CACd,MAAM,cAAc,MAAM;CAC1B,MAAM,UAAU,MAAM;CACtB,MAAM,QAAQ,MAAM,OAAO;CAC3B,MAAM,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,IAAK,QAAQ,OAAO,QAAS,GAAG,CAAC;CACzE,MAAM,aAAa;EACjB,GAAG;EACH,yBAAyB,GAAG,SAAS;CACvC;CAEA,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,cAAc,SAAS;EACrC,aAAW;EACX,iBAAe,YAAY,KAAA;EAC3B,gBAAc,WAAW,KAAA;EAJ3B,UAAA,CAME,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,SAAD;IAAO,WAAU;IAAoB,SAAS;IAC3C,UAAA,KAAK,KAAK;GACN,CAAA,GACN,eAAe,KAAA,KACd,oBAAC,UAAD;IACE,WAAU;IACV,SAAS;IACT,eAAY;IAEX,UAAA,KAAK,UAAU;GACV,CAAA,CAEP;EACL,CAAA,GAAA,oBAAC,SAAD;GACE,GAAI,KAAK,KAAK;GACd,IAAI;GACJ,MAAK;GACL,WAAU;GACL;GACA;GACC;GACC;GACG;GACV,cAAY;GACZ,kBACE,kBACC,OAAO,eAAe,WAAW,aAAa,KAAA;GAEjD,gBAAc,gBAAgB,WAAW,KAAA;GACzC,OAAO;GACP,UAAU,UAAU,cAAc,OAAO,MAAM,cAAc,KAAK,CAAC;EACpE,CAAA,CACE;;AAET;;;ACzFA,SAAgB,QAAQ,EACtB,OAAO,QACP,UAAU,MACV,WACA,UACA,GAAG,SACY;CACf,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,eAAe,SAAS;EACtC,aAAW;EACX,gBAAc;EAEb,UAAA,KAAK,QAAQ;CACX,CAAA;AAET;;;ACjBA,SAAgB,SAAS,EACvB,UAAU,OACV,OAAO,MACP,WACA,gBAAgB,aAChB,GAAG,SACa;CAChB,OACE,oBAAC,YAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,gBAAgB,SAAS;EACvC,aAAW;EACX,gBAAc,gBAAgB,WAAW,KAAA;CAC1C,CAAA;AAEL;;;ACTA,SAAgB,OAAO,EACrB,SACA,iBACA,OACA,WACA,UACA,SACA,OAAO,MACP,gBAAgB,aAChB,cAAc,YAAY,OAC1B,GAAG,SACW;CACd,OACE,qBAAC,UAAD;EACE,MAAK;EACL,MAAK;EACL,gBAAc,eAAe;EAC7B,cAAY,aAAa;EACf;EACV,WAAW,GAAG,cAAc,SAAS;EACrC,cAAY,UAAU,YAAY;EAClC,aAAW;EACX,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,kBAAkB,gBAAgB,CAAC,OAAO;EACvD;EACA,GAAI,KAAK,KAAK;EAbhB,UAAA,CAeG,KACD,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAAC,QAAD,EAAM,WAAU,oBAAqB,CAAA;EACjC,CAAA,CACA;;AAEZ;;;ACtBA,SAAgB,UAAU,EACxB,OACA,OAAO,UACP,OACA,cACA,eACA,WACA,GAAG,SACc;CACjB,MAAM,CAAC,cAAc,mBAAmB,SACtC,gBAAgB,CAAC,CACnB;CACA,MAAM,OAAO,SAAS;CACtB,MAAM,SAAS,MAAM;CAErB,MAAM,UAAU,cAAsB;EAEpC,MAAM,OADS,KAAK,SAAS,SACX,IACd,KAAK,QAAQ,MAAM,MAAM,SAAS,IAClC,SAAS,WACP,CAAC,SAAS,IACV,CAAC,GAAG,MAAM,SAAS;EACzB,IAAI,UAAU,KAAA,GAAW,gBAAgB,IAAI;EAC7C,gBAAgB,IAAI;CACtB;CAEA,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,iBAAiB,SAAS;EACxC,aAAW;EAEV,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,SAAS,KAAK,SAAS,KAAK,KAAK;GACvC,MAAM,UAAU,GAAG,OAAO,SAAS;GACnC,OACE,qBAAC,OAAD;IAEE,WAAU;IACV,cAAY,SAAS,SAAS;IAHhC,UAAA,CAKE,qBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,iBAAe;KACf,iBAAe;KACf,UAAU,KAAK;KACf,eAAe,OAAO,KAAK,KAAK;KANlC,UAAA,CAQE,oBAAC,QAAD;MAAM,WAAU;MAAyB,eAAY;MACnD,UAAA,oBAAC,gBAAD;OAAgB,MAAM;OAAI,QAAO;MAAQ,CAAA;KACrC,CAAA,GACL,KAAK,KAAK,OAAO,CACZ;IACR,CAAA,GAAA,oBAAC,OAAD;KAAK,WAAU;KAAsB,IAAI;KACvC,UAAA,oBAAC,OAAD;MAAK,WAAU;MAAwB,UAAA,KAAK,KAAK,QAAQ;KAAO,CAAA;IAC7D,CAAA,CACF;GApBE,GAAA,KAAK,KAoBP;EAET,CAAC;CACE,CAAA;AAET;;;ACxEA,MAAM,aAAa;CACjB,MAAM,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;CAC3B,SAAS,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;CAC/B,SAAS,oBAAC,aAAD,EAAa,MAAM,GAAK,CAAA;CACjC,QAAQ,oBAAC,OAAD,EAAO,MAAM,GAAK,CAAA;AAC5B;AAEA,SAAgB,MAAM,EACpB,UAAU,QACV,OACA,UACA,cAAc,OACd,WACA,WACA,MACA,GAAG,SACU;CACb,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,WAAW,OAAkD,KAAA,CAAS;CAC5E,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAElD,sBACc;EACV,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;CACrD,GACA,CAAC,CACH;CAEA,MAAM,uBAAuB;EAC3B,IAAI,cAAc,KAAA,KAAa,YAAY;EAC3C,MAAM,WAAW,iBAAiB,QAAQ,SAAS,QAAQ;EAC3D,IAAI,YAAY,GAAG;GACjB,UAAU;GACV;EACF;EACA,cAAc,IAAI;EAClB,SAAS,UAAU,iBAAiB;GAClC,cAAc,KAAK;GACnB,UAAU;EACZ,GAAG,WAAW,EAAE;CAClB;CAEA,IAAI,UAAU,KAAA,KAAa,aAAa,KAAA,GAAW,OAAO;CAE1D,OACE,qBAAC,OAAD;EACE,KAAK;EACL,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,aAAa,SAAS;EACpC,gBAAc;EACd,cAAY,aAAa,WAAW;EACpC,MAAM,SAAS,YAAY,WAAW,UAAU;EAChD,aACE,OAAO,KAAA,IAAY,YAAY,WAAW,cAAc;EAR5D,UAAA;GAWE,oBAAC,QAAD;IAAM,WAAU;IAAkB,eAAY;IAC3C,UAAA,WAAW;GACR,CAAA;GACN,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,UAAU,KAAA,KACT,oBAAC,KAAD;KAAG,WAAU;KAAoB,UAAA,KAAK,KAAK;IAAK,CAAA,GAEjD,aAAa,KAAA,KACZ,oBAAC,OAAD;KAAK,WAAU;KAAsB,UAAA,KAAK,QAAQ;IAAO,CAAA,CAExD;;GACJ,eACC,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,cAAW;IACX,SAAS;IAET,UAAA,oBAAC,OAAD;KAAO,MAAM;KAAI,eAAY;IAAQ,CAAA;GAC/B,CAAA;EAEP;;AAET;AAEA,MAAa,SAAS;;;AClEtB,MAAM,YAAY;CAAC;CAAO;CAAO;CAAQ;CAAO;CAAQ;CAAO;CAAQ;AAAM;AAC7E,MAAM,YAAY;CAAC;CAAO;CAAO;CAAQ;AAAK;AAC9C,MAAM,YAAY;CAAC;CAAO;CAAO;CAAO;CAAO;AAAM;AACrD,MAAM,WAAW;CACf;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,UAAU;CAAC;CAAO;CAAO;CAAQ;CAAO;CAAO;AAAK;;AAG1D,SAAgB,YAAY,MAAc;CACxC,MAAM,QAAQ,KAAK,MAAM,GAAG;CAC5B,MAAM,MAAM,MAAM,SAAS,IAAK,MAAM,GAAG,EAAE,CAAC,EAAE,YAAY,KAAK,KAAM;CACrE,IAAI,UAAU,SAAS,GAAG,GAAG,OAAO;CACpC,IAAI,UAAU,SAAS,GAAG,GAAG,OAAO;CACpC,IAAI,UAAU,SAAS,GAAG,GAAG,OAAO;CACpC,IAAI,SAAS,SAAS,GAAG,GAAG,OAAO;CACnC,IAAI,QAAQ,SAAS,GAAG,GAAG,OAAO;CAClC,OAAO;AACT;;AAIA,SAAgB,WAAW,EACzB,OACA,UACA,YAAY,eACZ,aACkB;CAClB,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAC1D,MAAM,QAAQ,OAAsB,IAAI;CACxC,MAAM,UAAU,OAAyB,IAAI;CAE7C,sBACc;EACV,IAAI,MAAM,YAAY,MAAM,OAAO,aAAa,MAAM,OAAO;CAC/D,GACA,CAAC,CACH;CAEA,MAAM,iBAAiB,OAAe;EACpC,IAAI,CAAC,UAAU;EACf,IAAI,MAAM,YAAY,MAAM,OAAO,aAAa,MAAM,OAAO;EAC7D,MAAM,WAAW,iBAAiB,QAAQ,SAAS,QAAQ;EAC3D,IAAI,YAAY,GAAG;GACjB,WAAW,IAAI;GACf,SAAS,EAAE;GACX;EACF;EACA,WAAW,EAAE;EACb,MAAM,UAAU,OAAO,iBAAiB;GACtC,SAAS,EAAE;GACX,WAAW,IAAI;EACjB,GAAG,WAAW,EAAE;CAClB;CAEA,OACE,oBAAC,MAAD;EACE,KAAK;EACL,WAAW,GAAG,kBAAkB,SAAS;EACzC,cAAY;EAEX,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,OAAO,YAAY,KAAK,IAAI;GAClC,MAAM,YAAY,KAAK,WAAW;GAClC,OACE,qBAAC,MAAD;IAEE,WAAU;IACV,eAAa,KAAK,UAAU;IAC5B,gBAAc,YAAY,KAAK,MAAM,KAAA;IACrC,OACE,EAAE,sBAAsB,MAAM;IANlC,UAAA;KAUE,oBAAC,QAAD;MAAM,WAAU;MAAuB,eAAY;MACjD,UAAA,oBAAC,MAAD,EAAM,MAAM,GAAK,CAAA;KACb,CAAA;KAEN,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACG,KAAK,OACJ,oBAAC,KAAD;OAAG,WAAU;OAAuB,MAAM,KAAK;OAAM,UAAA;OAClD,UAAA,KAAK;MACL,CAAA,IAEH,oBAAC,QAAD;OAAM,WAAU;OAAwB,UAAA,KAAK;MAAW,CAAA,GAE1D,oBAAC,QAAD;OAAM,WAAU;OAAwB,UAAA,KAAK;MAAW,CAAA,CACpD;;KAEL,KAAK,OACJ,oBAAC,QAAD;MAAM,WAAU;MAAwB,UAAA,KAAK;KAAW,CAAA,IACtD;KAEH,YACC,oBAAC,QAAD;MACE,WAAU;MACV,MAAK;MACL,cAAY,GAAG,KAAK,KAAK;MACzB,iBAAe;MACf,iBAAe;MACf,iBAAe,KAAK,YAAY;MAEhC,UAAA,oBAAC,QAAD,EACE,OACE,EACE,wBAAwB,GAAG,KAAK,YAAY,EAAE,GAChD,EAEH,CAAA;KACG,CAAA,IACJ;KACH,YACC,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CAAuC,KAAK,YAAY,GAAE,GAAO;KAC/D,CAAA,IAAA;KAEH,WACC,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,cAAY,UAAU,KAAK;MAC3B,eAAe,cAAc,KAAK,EAAE;MAEpC,UAAA,oBAAC,OAAD,EAAO,MAAM,GAAK,CAAA;KACZ,CAAA,IACN;IACF;GA5DG,GAAA,KAAK,EA4DR;EAER,CAAC;CACC,CAAA;AAER;;;AC1JA,SAAgB,YAAY,EAC1B,SACA,MAAM,GACN,OAAO,MACP,WACA,GAAG,SACgB;CACnB,MAAM,QAAQ,QAAQ,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;CAC/C,MAAM,WAAW,QAAQ,SAAS,MAAM;CAExC,OACE,qBAAC,QAAD;EAAM,GAAI,KAAK,KAAK;EAAG,WAAW,GAAG,oBAAoB,SAAS;EAAlE,UAAA,CACG,MAAM,KAAK,QAAQ,UAClB,oBAAC,QAAD;GAEE,KAAK,OAAO;GACZ,MAAM,OAAO;GACb,QAAQ,OAAO;GACT;EACP,GALM,GAAG,OAAO,OAAO,OAAO,QAAQ,SAAS,GAAG,OAKlD,CACF,GACA,WAAW,KACV,qBAAC,QAAD;GAAM,WAAU;GAAkC,aAAW;GAA7D,UAAA,CAAmE,KAC/D,QACE;EAEJ,CAAA,CAAA;;AAEV;;;ACvBA,SAAgB,WAAW,EACzB,OACA,WACA,QAAQ,cACR,WACA,GAAG,SACe;CAClB,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,kBAAkB,SAAS;EACzC,cAAY;EAEZ,UAAA,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,MAAM,UAAU;IAC1B,MAAM,SAAS,UAAU,MAAM,SAAS;IACxC,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA,CACG,KAAK,SAAS,KAAA,KACb,oBAAC,QAAD;KAAM,WAAU;KAAuB,eAAY;KAChD,UAAA,KAAK,KAAK,IAAI;IACX,CAAA,GAER,oBAAC,QAAD;KAAM,WAAU;KAAwB,UAAA,KAAK,KAAK,KAAK;IAAQ,CAAA,CAC/D,EAAA,CAAA;IAGJ,OACE,qBAAC,MAAD;KAA2B,WAAU;KAArC,UAAA,CACG,SACC,oBAAC,QAAD;MAAM,WAAU;MAA0B,gBAAa;MACpD,UAAA;KACG,CAAA,IACJ,KAAK,SAAS,KAAA,IAChB,oBAAC,KAAD;MAAG,WAAU;MAAwB,MAAM,KAAK;MAC7C,UAAA;KACA,CAAA,IACD,KAAK,YAAY,KAAA,IACnB,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,SAAS,KAAK;MAEb,UAAA;KACK,CAAA,IAER,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA;KACG,CAAA,GAEP,CAAC,UACA,oBAAC,QAAD;MAAM,WAAU;MAAsB,eAAY;MAC/C,UAAA,cAAc,KAAA,IACb,KAAK,SAAS,IAEd,oBAAC,gBAAD;OAAgB,MAAM;OAAI,QAAO;MAAQ,CAAA;KAEvC,CAAA,CAEN;IA/BK,GAAA,SAAS,OA+Bd;GAER,CAAC;EACC,CAAA;CACD,CAAA;AAET;;;AC7DA,MAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,iBAAiB;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;AAAK;AACvE,MAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,gBAAgB;CAAC;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AAAE;AAErE,MAAM,OAAO,UAAkB,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG;AAE5D,SAAgB,WAAW,MAAc;CACvC,OAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;AAChE;AAEA,SAAgB,YAAY,OAAe;CACzC,MAAM,CAAC,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAC/C,OAAO,QAAQ,KAAK,WAAW,IAAI,IAAI,KAAK,cAAc,MAAM;AAClE;;AAGA,SAAgB,WAAW,OAAe,OAAe;CACvD,MAAM,CAAC,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAC/C,MAAM,QAAQ,MAAM,IAAI;CACxB,MAAM,WAAW,OAAO,KAAK,MAAM,QAAQ,EAAE;CAC7C,MAAM,aAAc,QAAQ,KAAM,MAAM;CACxC,OAAO,GAAG,SAAS,GAAG,IAAI,YAAY,CAAC;AACzC;;AAGA,SAAgB,SAAS,KAAa,OAAe;CACnD,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CACnD,MAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC;CAC3D,OAAO,GAAG,KAAK,eAAe,EAAE,GAAG,IAAI,KAAK,YAAY,IAAI,CAAC,EAAE,GAAG,IAAI,KAAK,WAAW,CAAC;AACzF;;;;;AAMA,SAAgB,UAAU,OAAe,cAAqB;CAC5D,MAAM,CAAC,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAE/C,MAAM,UADe,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAC/B,IAAI,eAAe,KAAK;CACnD,MAAM,QAA8B,MAAM,KACxC,EAAE,QAAQ,OAAO,SACX,IACR;CACA,KAAK,IAAI,MAAM,GAAG,OAAO,YAAY,KAAK,GAAG,OAC3C,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG;CAEnC,OAAO;AACT;AAEA,SAAgB,cAAc,KAAa,OAAe;CACxD,MAAM,QAAQ,WAAW,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK;CAC/C,MAAM,OAAO,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC;CAClE,OAAO,GAAG,MAAM,GAAG,IAAI,IAAI;AAC7B;AAEA,SAAS,QAAQ,KAAa;CAC5B,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CACnD,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU;AAC3D;AAEA,SAAgB,SACd,KACA,cACA,MACA;CACA,MAAM,UAAU,QAAQ,GAAG,IAAI,eAAe,KAAK;CACnD,OAAO,SAAS,KAAK,SAAS,UAAU,CAAC,SAAS,IAAI,MAAM;AAC9D;AAEA,SAAgB,YAAY,OAAsB,KAA4B;CAC5E,IAAI,CAAC,MAAM,SAAS,MAAM,KAAK,OAAO;EAAE,OAAO;EAAK,KAAK;CAAK;CAC9D,OAAO,MAAM,MAAM,QACf;EAAE,OAAO;EAAK,KAAK,MAAM;CAAM,IAC/B;EAAE,OAAO,MAAM;EAAO,KAAK;CAAI;AACrC;AAEA,SAAgB,UACd,OACA,QAAuB,MACE;CACzB,MAAM,EAAE,OAAO,QAAQ;CACvB,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,QAAQ,OAAO,SAAS;CAC9B,OAAO,QAAQ,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,KAAK;AACvD;AAEA,SAAS,aAAa;CACpB,MAAM,sBAAM,IAAI,KAAK;CACrB,OAAO,GAAG,IAAI,YAAY,EAAE,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,QAAQ,CAAC;AAC7E;AAEA,MAAM,cAA6B;CAAE,OAAO;CAAM,KAAK;AAAK;AAE5D,SAAgB,SAAS,EACvB,OACA,eACA,OACA,eACA,KACA,KACA,eAAe,GACf,OAAO,UACP,OACA,cACA,eACA,SAAS,GACT,YAAY,YACZ,aACgB;CAChB,MAAM,UAAU,OAA8B,IAAI;CAClD,MAAM,UAAU,MAAM;CACtB,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CACtD,MAAM,CAAC,cAAc,mBAAmB,SAAwB,IAAI;CACpE,MAAM,CAAC,QAAQ,aAAa,SAAwB,IAAI;CACxD,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CACtD,MAAM,CAAC,YAAY,iBAAiB,SAClC,gBAAgB,WAClB;CAEA,MAAM,UAAU,SAAS;CACzB,MAAM,eAAe,SAAS;CAC9B,MAAM,SAAS,UAAU,aAAa,QAAQ;CAC9C,MAAM,YACJ,SAAS,SAAS,QAAQ,MAAM,GAAG,CAAC,KAAK,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;CAClE,MAAM,QAAQ,WAAW;CACzB,MAAM,QAAQ,WAAW,IAAI,IAAI;CACjC,MAAM,gBAAgB,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,UACtD,WAAW,WAAW,KAAK,CAC7B;CACA,MAAM,YAAY,cAAc,QAAQ;CACxC,MAAM,WAAW,QACf,IAAI,MAAM,GAAG,CAAC,KAAK,aAAa,IAAI,MAAM,GAAG,CAAC,KAAK;CACrD,MAAM,WAAW,QACd,QAAQ,KAAA,KAAa,MAAM,OAAS,QAAQ,KAAA,KAAa,MAAM;CAElE,MAAM,aAAa,SAAiB;EAClC,IAAI,UAAU,KAAA,GAAW,SAAS,IAAI;EACtC,gBAAgB,IAAI;CACtB;CAEA,MAAM,QAAQ,UAAkB,UAAU,WAAW,WAAW,KAAK,CAAC;CAEtE,gBAAgB;EACd,IAAI,CAAC,cAAc;EACnB,QAAQ,SACJ,cAAiC,eAAe,aAAa,GAAG,CAAC,EACjE,MAAM;EACV,gBAAgB,IAAI;CACtB,GAAG,CAAC,cAAc,SAAS,CAAC;CAE5B,MAAM,UAAU,WAAW,CAAC,CAAC,aAAa,SAAS,CAAC,aAAa;CAEjE,MAAM,YAAY,WAAmB;EACnC,IAAI,MAAM;EACV,IAAI,QAAQ,KAAA,KAAa,MAAM,KAAK,MAAM;EAC1C,IAAI,QAAQ,KAAA,KAAa,MAAM,KAAK,MAAM;EAC1C,UAAU,GAAG;EACb,IAAI,SAAS,SAAS,GAAG;EACzB,IAAI,CAAC,QAAQ,GAAG,GACd,UACE,IAAI,MAAM,GAAG,CAAC,IAAI,YACd,IAAI,MAAM,GAAG,CAAC,IACd,WAAW,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,KAAK,CAC3C;EAEF,gBAAgB,GAAG;CACrB;CAEA,MAAM,UAAU,QAAgB;EAC9B,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,SAAS,SAAS;EAC7D,UAAU,GAAG;EACb,IAAI,CAAC,SAAS;GACZ,gBAAgB,GAAG;GACnB;EACF;EACA,MAAM,OAAO,YAAY,cAAc,GAAG;EAC1C,IAAI,UAAU,KAAA,GAAW,cAAc,IAAI;EAC3C,gBAAgB,IAAI;CACtB;CAEA,MAAM,kBAAkB;EACtB,KAAK,MAAM,SAAS,eAClB,KAAK,MAAM,OAAO,UAAU,OAAO,YAAY,GAC7C,IAAI,OAAO,CAAC,QAAQ,GAAG,GAAG,OAAO;EAGrC,OAAO;CACT;CACA,MAAM,WACJ;EAAC;EAAQ;EAAQ,UAAU,aAAa,MAAM;EAAM;CAAK,CAAC,CAAC,MACxD,QAAuB,CAAC,CAAC,OAAO,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,CAC/D,KAAK,UAAU;CAEjB,MAAM,OAAO,UAAU,UAAU,cAAc,UAAU,QAAQ,IAAI,IAAI;CACzE,MAAM,YAAY,WAAW,CAAC,UAAU,UAAU,YAAY,IAAI;CAElE,MAAM,gBAAgB,MAAM,KAC1B,EAAE,QAAQ,EAAE,IACX,GAAG,UAAU,gBAAgB,eAAe,SAAS,EACxD;CAEA,MAAM,aAAa,QAAgB;EACjC,MAAM,CAAC,SAAS,QAAQ,WAAW,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;EAC5D,MAAM,SAAS,CAAC,CAAC,QAAQ,OAAO,KAAK,MAAM,OAAO,KAAK;EACvD,MAAM,UAAU,UAAU,QAAQ,OAAO;EACzC,MAAM,QAAQ,UAAU,QAAQ,OAAO;EACvC,MAAM,WAAW,UACb,YACE,OAAO,UAAU,MAAM,OAAO,UAAU,KACxC,QAAQ,aAAa,QACvB,UAAU;EACd,MAAM,QAAQ,CACZ,YAAY,OAAO,OAAQ,WAAW,QAAQ,aAAa,QACvD,gBACA,MACJ,YAAY,OAAO,MAAM,cAAc,IACzC,CAAC,CAAC,OAAO,OAAO;EAChB,OACE,qBAAC,UAAD;GACE,MAAK;GACL,MAAK;GAEL,aAAW;GACX,cAAY,QAAQ,SAAS,KAAA;GAC7B,iBAAe,UAAU,KAAA;GACzB,oBAAkB,WAAW,KAAA;GAC7B,kBAAgB,SAAS,KAAA;GACzB,gBAAe,UAAU,WAAY,KAAA;GACrC,iBAAe,YAAY,KAAA;GAC3B,gBAAc,QAAQ,QAAQ,SAAS,KAAA;GACvC,UAAU,QAAQ,WAAW,IAAI;GACjC,UAAU,QAAQ,GAAG;GACrB,eAAe,OAAO,GAAG;GACzB,eAAe;IACb,UAAU,GAAG;IACb,IAAI,SAAS,SAAS,GAAG;GAC3B;GACA,oBAAoB;IAClB,IAAI,SAAS,SAAS,GAAG;GAC3B;GACA,YAAY,UAAU;IACpB,MAAM,OACJ,MAAM,QAAQ,cACV,SAAS,KAAK,EAAE,IAChB,MAAM,QAAQ,eACZ,SAAS,KAAK,CAAC,IACf,MAAM,QAAQ,YACZ,SAAS,KAAK,EAAE,IAChB,MAAM,QAAQ,cACZ,SAAS,KAAK,CAAC,IACf,MAAM,QAAQ,SACZ,SAAS,KAAK,cAAc,OAAO,IACnC,MAAM,QAAQ,QACZ,SAAS,KAAK,cAAc,KAAK,IACjC,MAAM,QAAQ,WACZ,cAAc,KAAK,MAAM,WAAW,MAAM,EAAE,IAC5C,MAAM,QAAQ,aACZ,cAAc,KAAK,MAAM,WAAW,KAAK,CAAC,IAC1C;IACpB,IAAI,CAAC,MAAM;IACX,MAAM,eAAe;IACrB,SAAS,IAAI;GACf;GA5CF,UAAA,CA8CE,oBAAC,QAAD;IAAM,eAAY;IAAQ,UAAA;GAAc,CAAA,GACxC,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACG,GAAG,aAAa,QAAQ,GAAG,GAAG,IAAI,aAAa,SAAS,GAAG,GAAG,QAAQ,IAAI,WAC1E,MAAM,SAAS,KAAK,MAAM,KAAK,OAAO,MAAM,EACzC;GACA,CAAA,CAAA;EAhDD,GAAA,GAgDC;CAEZ;CAEA,MAAM,SACJ,oBAAC,QAAD;EAAM,WAAU;EAA2B,eAAY;CAAQ,CAAA;CAGjE,OACE,oBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAG,gBAAgB,SAAS;EACvC,MAAK;EACL,cAAY;EACZ,aAAW;EACX,eAAa;EAEb,UAAA,oBAAC,OAAD;GAAK,WAAU;GAAuB,oBAAoB,SAAS,IAAI;GACpE,UAAA,cAAc,KAAK,YAAY,eAAe;IAC7C,MAAM,CAAC,MAAM,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;IACpD,MAAM,QAAQ,UAAU,YAAY,YAAY;IAChD,MAAM,OAAoC,CAAC;IAC3C,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GACjD,KAAK,KAAK,MAAM,MAAM,OAAO,QAAQ,CAAC,CAAC;IAEzC,OACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,eAAe,IACd,oBAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,cAAW;SACX,eAAe,KAAK,EAAE;SAEtB,UAAA,oBAAC,eAAD;UAAe,MAAM;UAAI,QAAO;SAAQ,CAAA;QAClC,CAAA,IAER;QAEF,qBAAC,QAAD;SACE,WAAU;SACV,IAAI,GAAG,QAAQ,GAAG;SAClB,aAAU;SAHZ,UAAA;UAKG,aAAa,MAAM;UAAG;UAAE;SACrB;;QACL,eAAe,QAAQ,IACtB,oBAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,cAAW;SACX,eAAe,KAAK,CAAC;SAErB,UAAA,oBAAC,gBAAD;UAAgB,MAAM;UAAI,QAAO;SAAQ,CAAA;QACnC,CAAA,IAER;OAEC;;MAEL,oBAAC,OAAD;OAAK,WAAU;OAAyB,eAAY;OACjD,UAAA,cAAc,KAAK,UAClB,oBAAC,QAAD,EAAA,UAAmB,MAAY,GAApB,KAAoB,CAChC;MACE,CAAA;MAEL,oBAAC,OAAD;OACE,WAAU;OACV,MAAK;OAEL,mBAAiB,GAAG,QAAQ,GAAG;OAC/B,wBAAsB,WAAW,KAAA;OAEhC,UAAA,KAAK,KAAK,KAAK,aACd,oBAAC,OAAD;QAAK,WAAU;QAAoB,MAAK;QACrC,UAAA,IAAI,KAAK,KAAK,aACb,QAAQ,OACN,oBAAC,QAAD;SACE,WAAU;SACV,MAAK;QAEN,GADM,SAAS,UACf,IAED,UAAU,GAAG,CAEjB;OACG,GAZ8C,QAY9C,CACN;MACE,GAnBE,UAmBF;KACF;IAhEqC,GAAA,UAgErC;GAET,CAAC;EACE,CAAA;CACF,CAAA;AAET;;;AC/YA,SAAgB,KAAK,EACnB,OACA,aACA,QACA,QACA,UACA,cAAc,OACd,WAAW,OACX,WACA,GAAG,SACS;CACZ,MAAM,YACJ,WAAW,KAAA,KAAa,UAAU,KAAA,KAAa,gBAAgB,KAAA;CAEjE,OACE,qBAAC,WAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,YAAY,SAAS;EACnC,oBAAkB,eAAe,KAAA;EACjC,iBAAe,YAAY,KAAA;EAJ7B,UAAA;GAMG,aACC,qBAAC,UAAD;IAAQ,WAAU;IAAlB,UAAA;KACG,KAAK,MAAM;KACX,UAAU,KAAA,KACT,oBAAC,MAAD;MAAI,WAAU;MAAmB,UAAA,KAAK,KAAK;KAAM,CAAA;KAElD,gBAAgB,KAAA,KACf,oBAAC,KAAD;MAAG,WAAU;MAAyB,UAAA,KAAK,WAAW;KAAK,CAAA;IAEvD;;GAET,aAAa,KAAA,KACZ,oBAAC,OAAD;IAAK,WAAU;IAAqB,UAAA,KAAK,QAAQ;GAAO,CAAA;GAEzD,WAAW,KAAA,KACV,oBAAC,UAAD;IAAQ,WAAU;IAAoB,UAAA,KAAK,MAAM;GAAU,CAAA;EAEtD;;AAEb;;;ACvCA,SAAgB,YAAY,EAC1B,SACA,UACA,MACA,cAAc,OACd,cACA,WAAW,OACX,WACA,GAAG,SACgB;CACnB,MAAM,CAAC,cAAc,mBAAmB,SAAS,WAAW;CAC5D,MAAM,SAAS,QAAQ;CACvB,MAAM,YAAY,GAAG,MAAM,EAAE;CAE7B,MAAM,eAAe;EACnB,IAAI,UAAU;EACd,MAAM,OAAO,CAAC;EACd,gBAAgB,IAAI;EACpB,eAAe,IAAI;CACrB;CAEA,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,mBAAmB,SAAS;EAC1C,cAAY,SAAS,SAAS;EAHhC,UAAA,CAKE,qBAAC,UAAD;GACE,MAAK;GACL,WAAU;GACV,iBAAe;GACf,iBAAe;GACL;GACV,SAAS;GANX,UAAA,CAQE,oBAAC,QAAD;IAAM,WAAU;IAA2B,eAAY;IACrD,UAAA,oBAAC,gBAAD;KAAgB,MAAM;KAAI,QAAO;IAAQ,CAAA;GACrC,CAAA,GACL,KAAK,OAAO,CACP;EACR,CAAA,GAAA,oBAAC,OAAD;GAAK,WAAU;GAAwB,IAAI;GACzC,UAAA,oBAAC,OAAD;IAAK,WAAU;IAA0B,UAAA,KAAK,QAAQ;GAAO,CAAA;EAC1D,CAAA,CACF;;AAET;;;ACjDA,SAAgB,UAAU,MAAc,OAAiC;CACvE,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,YAAY;CACxC,IAAI,OAAO,WAAW,GAAG,OAAO;EAAE,OAAO;EAAG,SAAS,CAAC;CAAE;CACxD,MAAM,WAAW,KAAK,YAAY;CAElC,MAAM,UAAoB,CAAC;CAC3B,IAAI,QAAQ;CACZ,IAAI,SAAS;CAEb,KAAK,MAAM,QAAQ,QAAQ;EACzB,IAAI,SAAS,KAAK;EAClB,MAAM,QAAQ,SAAS,QAAQ,MAAM,MAAM;EAC3C,IAAI,QAAQ,GAAG,OAAO;EACtB,QAAQ,KAAK,KAAK;EAElB,IAAI,UAAU,GAAG,SAAS;EAC1B,MAAM,WAAW,QAAQ,IAAI,SAAS,QAAQ,KAAK;EAEnD,IAD2B,aAAa,MAAM,CAAC,WAAW,KAAK,QAAQ,GAC/C,SAAS;EACjC,IAAI,UAAU,UAAU,QAAQ,SAAS,GAAG,SAAS;EACrD,SAAS;EACT,SAAS,QAAQ;CACnB;CAEA,SAAS,KAAK,IAAI,SAAS,SAAS,OAAO,QAAQ,EAAE,IAAI;CACzD,OAAO;EAAE;EAAO;CAAQ;AAC1B;;;;;;AAaA,SAAgB,YACd,OACA,OACA,MACe;CACf,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,QAAQ,WAAW,GAAG,OAAO,MAAM,KAAK,UAAU;EAAE;EAAM,SAAS,CAAC;CAAE,EAAE;CAE5E,MAAM,UAAyB,CAAC;CAChC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,EAAE,OAAO,aAAa,KAAK,IAAI;EACrC,MAAM,UAAU,UAAU,OAAO,OAAO;EACxC,IAAI,SAAS;GACX,QAAQ,KAAK;IAAE;IAAM,SAAS,QAAQ;GAAQ,CAAC;GAC/C;EACF;EACA,IAAI,YAAY,UAAU,UAAU,OAAO,GACzC,QAAQ,KAAK;GAAE;GAAM,SAAS,CAAC;EAAE,CAAC;CAEtC;CACA,OAAO;AACT;;;;;;;;ACnEA,SAAgB,UAAU,EACxB,MACA,WAIC;CACD,IAAI,QAAQ,WAAW,GAAG,OAAO,KAAK,IAAI;CAC1C,MAAM,QAAsB,CAAC;CAC7B,IAAI,SAAS;CACb,KAAK,MAAM,YAAY,SAAS;EAC9B,IAAI,WAAW,QAAQ,MAAM,KAAK,KAAK,MAAM,QAAQ,QAAQ,CAAC;EAC9D,MAAM,KACJ,oBAAC,QAAD;GAAqB,WAAU;GAC5B,UAAA,KAAK,MAAM,UAAU,WAAW,CAAC;EAC9B,GAFK,QAEL,CACR;EACA,SAAS,WAAW;CACtB;CACA,IAAI,SAAS,KAAK,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;CACvD,OAAO,KAAK,KAAK;AACnB;;;ACwBA,SAASC,gBAAc,QAAgC;CACrD,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAC3D;AAEA,SAASC,gBAAc,SAAuB,QAAwB;CACpE,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,QAAQ,SAAS,CAAC;CAC9D,MAAM,WAAW,UAAkB,CAAC,QAAQ,MAAM,EAAE,OAAO;CAC3D,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC3B,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAC3D,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC7B,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAC1C,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC7B,OAAO;AACT;AAEA,SAAgB,SAAS,EACvB,SACA,OACA,QACA,eACA,gBACA,cAAc,WACd,oBAAoB,WACpB,eAAe,eACf,WAAW,OACX,OAAO,MACP,IACA,WACA,aACgB;CAChB,MAAM,cAAc,MAAM;CAE1B,MAAM,SAAS,GADG,MAAM,gBAAgB,cACZ;CAC5B,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,aAAa,aAAa,SAAS,CAAC;CAC3C,MAAM,WAAW,WAAW,KAAA;CAC5B,MAAM,iBAAiB,WAAY,UAAU,CAAC,IAAK,QAAQ,CAAC,KAAK,IAAI,CAAC;CACtE,MAAM,EACJ,SACA,OACA,KAAK,gBACH,YAA4B,MAAM,MAAM;CAC5C,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,WAAW;CAC3B,mBAAmB,YAAY,aAAa,SAAS;EACnD,MAAM;EACN,OAAO;EACP,QAAQ;EACR,YAAY;CACd,CAAC;CAED,MAAM,WAAW,cAAc;EAC7B,MAAM,QAAQ,YAA4B;GACxC,OAAOD,gBAAc,MAAM;GAC3B,UAAU,OAAO;EACnB;EACA,MAAM,WAAW,YAAY,SAAS,OAAO,IAAI;EACjD,MAAM,YAAY,SAAS,QACxB,UAAU,MAAM,KAAK,UAAU,KAAA,CAClC;EACA,MAAM,aAAa,CACjB,GAAG,IAAI,IACL,SACG,KAAK,UAAU,MAAM,KAAK,KAAK,CAAC,CAChC,QAAQ,SAAyB,SAAS,KAAA,CAAS,CACxD,CACF;EACA,MAAM,MAAM,CACV,GAAI,UAAU,SAAS,IACnB,CAAC;GAAE,SAAS,KAAA;GAAW,SAAS;EAAU,CAAC,IAC3C,CAAC,GACL,GAAG,WAAW,KAAK,UAAU;GAC3B,SAAS;GACT,SAAS,SAAS,QAAQ,UAAU,MAAM,KAAK,UAAU,IAAI;EAC/D,EAAE,CACJ;EACA,IAAI,QAAQ;EAUZ,OATc,IAAI,KAAK,aAAa;GAClC,SAAS,QAAQ;GACjB,SAAS,QAAQ,QAAQ,KAAK,WAAW;IACvC,QAAQ,MAAM;IACd,SAAS,MAAM;IACf,UAAU,GAAG,OAAO,UAAU;IAC9B,OAAO;GACT,EAAE;EACJ,EACW;CACb,GAAG;EAAC;EAAQ;EAAS;CAAK,CAAC;CAE3B,MAAM,OAAO,SAAS,SAAS,YAAY,QAAQ,OAAO;CAC1D,MAAM,SAASC,gBAAc,MAAM,WAAW;CAE9C,MAAM,cAAc;EAClB,QAAQ,KAAK;EACb,SAAS,EAAE;CACb;CAEA,MAAM,eAAe,WAA2B;EAC9C,IAAI,OAAO,UAAU;EACrB,IAAI,UAAU;GACZ,MAAM,OAAO,eAAe,SAAS,OAAO,KAAK,IAC7C,eAAe,QAAQ,UAAU,UAAU,OAAO,KAAK,IACvD,CAAC,GAAG,gBAAgB,OAAO,KAAK;GACpC,iBAAiB,IAAI;GACrB,SAAS,EAAE;GACX,UAAU,CAAC;GACX;EACF;EACA,gBAAgB,OAAO,KAAK;EAC5B,MAAM;CACR;CAEA,MAAM,eAAe,UAAkB;EACrC,iBAAiB,eAAe,QAAQ,SAAS,SAAS,KAAK,CAAC;CAClE;CAEA,MAAM,YAAY,UAAkB;EAClC,MAAM,SAAS,KAAK,MAAM,EAAE;EAC5B,IAAI,CAAC,QAAQ;EACb,YAAY,MAAM;CACpB;CAEA,MAAM,QAAQ,cAAsB;EAClC,IAAI,KAAK,WAAW,GAAG;EACvB,IAAI,QAAQ,SAAS,IAAI,IAAI;EAC7B,KAAK,IAAI,OAAO,GAAG,OAAO,KAAK,QAAQ,QAAQ,GAAG;GAChD,SAAS,QAAQ,YAAY,KAAK,UAAU,KAAK;GACjD,IAAI,CAAC,KAAK,MAAM,EAAE,OAAO,UAAU;IACjC,UAAU,KAAK;IACf;GACF;EACF;CACF;CAEA,gBAAgB;EACd,IAAI,CAAC,MAAM,SAAS,EAAE;CACxB,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,UAAU,CAAC;CACb,GAAG,CAAC,KAAK,CAAC;CAEV,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,SAAS,SAAS,aAAa,cAAc,OAAO;EACpD,4BAA4B,SAAS,SAAS,MAAM,CAAC;CACvD,GAAG,CAAC,OAAO,CAAC;CAEZ,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,UAAU;IAC1B,MAAM,eAAe;IACrB,MAAM;GACR;EACF;EACA,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,YAAY,SAAS,SAAS,MAAM,GAErC,MAAM;EACV;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,aAAa;GACX,SAAS,oBAAoB,WAAW,aAAa;GACrD,SAAS,oBAAoB,eAAe,iBAAiB;EAC/D;CACF,CAAC;CAED,gBAAgB;EACd,IAAI,CAAC,WAAW,SAAS,GAAG;EAC5B,QAAQ,SACJ,cAA2B,wBAAsB,CAAC,EAClD,eAAe,EAAE,OAAO,UAAU,CAAC;CACzC,GAAG,CAAC,QAAQ,OAAO,CAAC;CAEpB,MAAM,sBAAsB,UAA+B;EACzD,IAAI,MAAM,QAAQ,aAAa;GAC7B,MAAM,eAAe;GACrB,KAAK,CAAC;EACR,OAAO,IAAI,MAAM,QAAQ,WAAW;GAClC,MAAM,eAAe;GACrB,KAAK,EAAE;EACT,OAAO,IAAI,MAAM,QAAQ,QAAQ;GAC/B,MAAM,eAAe;GACrB,UAAU,CAAC;EACb,OAAO,IAAI,MAAM,QAAQ,OAAO;GAC9B,MAAM,eAAe;GACrB,UAAU,KAAK,SAAS,CAAC;EAC3B,OAAO,IAAI,MAAM,QAAQ,SAAS;GAChC,MAAM,eAAe;GACrB,IAAI,UAAU,GAAG,SAAS,MAAM;EAClC;CACF;CAEA,MAAM,wBAAwB,UAA+B;EAC3D,IACE,MAAM,QAAQ,eACd,MAAM,QAAQ,WACd,MAAM,QAAQ,KACd;GACA,MAAM,eAAe;GACrB,IAAI,CAAC,UAAU,QAAQ,IAAI;EAC7B;CACF;CAEA,MAAM,WAAW,UACfD,gBACE,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK,KAAK;EAClD,OAAO;EACP,OAAO;CACT,CACF;CAEF,OACE,qBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAG,gBAAgB,SAAS;EACvC,aAAW;EACX,aAAW,QAAQ,KAAA;EAJrB,UAAA,CAMG,WACC,qBAAC,OAAD;GACE,WAAU;GACV,eAAe;IACb,IAAI,CAAC,UAAU,SAAS,YAAY,CAAC,OAAO;GAC9C;GAJF,UAAA,CAME,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,eAAe,KAAK,UACnB,qBAAC,QAAD;KAAkB,WAAU;KAA5B,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,QAAQ,KAAK;KACV,CAAA,GACN,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,cAAY,UAAU,QAAQ,KAAK;MACzB;MACV,UAAU,UAAU;OAClB,MAAM,gBAAgB;OACtB,YAAY,KAAK;MACnB;MAEA,UAAA,oBAAC,OAAD;OAAO,MAAM;OAAI,eAAY;MAAQ,CAAA;KAC/B,CAAA,CACJ;IAhBK,GAAA,KAgBL,CACP,GACA,eAAe,WAAW,KACzB,oBAAC,QAAD;KAAM,WAAU;KACb,UAAA,KAAK,WAAW;IACb,CAAA,CAEL;GACL,CAAA,GAAA,oBAAC,UAAD;IACE,MAAK;IACL,KAAK;IACL,WAAU;IACV,cAAY,aAAa;IACzB,iBAAc;IACd,iBAAe;IACf,iBAAe,OAAO,SAAS,KAAA;IACrB;IACV,UAAU,UAAU;KAClB,MAAM,gBAAgB;KACtB,IAAI,CAAC,UAAU,SAAS,YAAY,CAAC,OAAO;IAC9C;IACA,WAAW;IAEX,UAAA,oBAAC,eAAD;KACE,WAAU;KACV,MAAM;KACN,eAAY;IACb,CAAA;GACK,CAAA,CACL;EAEL,CAAA,IAAA,qBAAC,UAAD;GACE,MAAK;GACL,KAAK;GACL,WAAU;GACV,cAAY;GACZ,iBAAc;GACd,iBAAe;GACf,iBAAe,OAAO,SAAS,KAAA;GACrB;GACV,eAAe;IACb,IAAI,CAAC,UAAU,SAAS,YAAY,CAAC,OAAO;GAC9C;GACA,WAAW;GAZb,UAAA,CAcE,oBAAC,QAAD;IACE,WACE,eAAe,SAAS,IACpB,wBACA;IAGL,UAAA,eAAe,SAAS,IACrB,KACE,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK,CAAC,EAAE,SAChD,KACJ,IACA,KAAK,WAAW;GAChB,CAAA,GACN,oBAAC,eAAD;IACE,WAAU;IACV,MAAM;IACN,eAAY;GACb,CAAA,CACK;EAGT,CAAA,GAAA,WACC,aACE,qBAAC,OAAD;GACE,KAAK;GACL,WAAU;GACV,cAAY;GAHd,UAAA,CAKE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,qBAAD;KACE,WAAU;KACV,MAAM;KACN,eAAY;IACb,CAAA,GACD,oBAAC,SAAD;KACE,KAAK;KACL,WAAU;KACV,MAAK;KACL,MAAK;KACL,iBAAA;KACA,iBAAe;KACf,yBACE,UAAU,IAAI,KAAK,OAAO,EAAE,WAAW,KAAA;KAEzC,qBAAkB;KAClB,cAAY;KACZ,aAAa;KACb,OAAO;KACP,cAAa;KACb,WAAW,UAAU,SAAS,MAAM,cAAc,KAAK;KACvD,WAAW;IACZ,CAAA,CACE;GACL,CAAA,GAAA,qBAAC,OAAD;IACE,KAAK;IACL,WAAU;IACV,IAAI;IACJ,MAAK;IACL,cAAY,aAAa;IACzB,wBAAsB,YAAY,KAAA;IANpC,UAAA,CAQG,KAAK,WAAW,KACf,oBAAC,OAAD;KAAK,WAAU;KAAsB,MAAK;KACvC,UAAA,KAAK,YAAY;IACf,CAAA,GAEN,SAAS,KAAK,YACb,qBAAC,OAAD;KAEE,WAAU;KACV,MAAK;KACL,mBACE,QAAQ,YAAY,KAAA,IAChB,GAAG,OAAO,SAAS,QAAQ,YAC3B,KAAA;KAPR,UAAA,CAUG,QAAQ,YAAY,KAAA,KACnB,oBAAC,OAAD;MACE,WAAU;MACV,IAAI,GAAG,OAAO,SAAS,QAAQ;MAE9B,UAAA,QAAQ;KACN,CAAA,GAEN,QAAQ,QAAQ,KAAK,UAAU;MAC9B,MAAM,SAAS,MAAM;MACrB,MAAM,aAAa,eAAe,SAAS,OAAO,KAAK;MACvD,OACE,qBAAC,OAAD;OAEE,IAAI,MAAM;OACV,WAAU;OACV,MAAK;OACL,cAAY,MAAM;OAClB,eACE,MAAM,UAAU,SAAS,SAAS,KAAA;OAEpC,iBAAe,OAAO,YAAY,KAAA;OAClC,iBAAe;OACf,iBAAe,OAAO,YAAY,KAAA;OAClC,sBAAsB;QACpB,IAAI,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK;OAC7C;OACA,gBAAgB,UAAU,MAAM,eAAe;OAC/C,eAAe,SAAS,MAAM,KAAK;OAhBrC,UAAA,CAkBE,oBAAC,QAAD;QACE,WAAU;QACV,gBAAc,cAAc,KAAA;QAC5B,eAAY;QAEX,UAAA,cAAc,oBAAC,WAAD;SAAW,MAAM;SAAI,QAAO;QAAQ,CAAA;OAC/C,CAAA,GACN,oBAAC,QAAD;QAAM,WAAU;QACb,UAAA,OAAO,OAAO,UAAU,WACvB,oBAAC,WAAD;SACE,MAAM,OAAO;SACb,SAAS,MAAM;QAChB,CAAA,IAED,KAAK,OAAO,KAAK;OAEf,CAAA,CACH;MAlCE,GAAA,OAAO,KAkCT;KAET,CAAC,CACE;IA3DE,GAAA,QAAQ,WAAW,cA2DrB,CACN,CACE;GACF,CAAA,CAAA;EACL,CAAA,GAAA,SAAS,IACX,CACC;;AAET;;;;;;;;AC7cA,SAAgB,YAAY,EAC1B,QACA,OACA,UACA,YACmB;CACnB,MAAM,iBAAiB,MAAM,SAAS,MAAM,UAC1C,CAAC,KAAK,aAAa,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI,CAAC,CACjD;CACA,MAAM,aAAa,UACjB,SAAS,eAAe,GAAG,OAAO,GAAG,OAAO,CAAC,EAAE,MAAM;CAEvD,MAAM,iBAAiB,OAA4B,UAAkB;EACnE,IAAI,MAAM,QAAQ,UAAU;GAC1B,MAAM,eAAe;GACrB,WAAW;GACX;EACF;EACA,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;GAC9C,MAAM,eAAe;GACrB,SAAS,MAAM,MAAM;GACrB;EACF;EACA,IAAI,CAAC;GAAC;GAAa;GAAW;GAAQ;EAAK,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG;EAClE,MAAM,eAAe;EACrB,MAAM,UAAU,eAAe,QAAQ,KAAK;EAC5C,MAAM,eACJ,MAAM,QAAQ,SACV,IACA,MAAM,QAAQ,QACZ,eAAe,SAAS,KACvB,WACE,MAAM,QAAQ,cAAc,IAAI,MACjC,eAAe,UACjB,eAAe;EACvB,MAAM,YAAY,eAAe;EACjC,IAAI,cAAc,KAAA,GAAW,UAAU,SAAS;CAClD;CAEA,OACE,oBAAA,YAAA,EAAA,UACG,MAAM,KAAK,MAAM,UAChB,KAAK,YACH,oBAAC,OAAD;EAEE,WAAU;EACV,MAAK;CACN,GAHM,aAAa,OAGnB,IAED,qBAAC,UAAD;EAEE,IAAI,GAAG,OAAO,GAAG;EACjB,MAAK;EACL,MAAK;EACL,WAAU;EACV,eAAa,KAAK,UAAU,KAAA;EAC5B,UAAU,KAAK;EACf,eAAe,SAAS,IAAI;EAC5B,YAAY,UAAU,cAAc,OAAO,KAAK;EATlD,UAAA,CAWE,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACG,KAAK,KAAK,IAAI,GACf,oBAAC,QAAD,EAAA,UAAO,KAAK,KAAK,KAAK,EAAQ,CAAA,CAC1B;EACL,CAAA,GAAA,KAAK,aAAa,KAAA,KACjB,oBAAC,QAAD;GAAM,WAAU;GAAsB,UAAA,KAAK,KAAK,QAAQ;EAAQ,CAAA,CAE5D;CAjBD,GAAA,KAAK,SAAS,QAAQ,OAiBrB,CAEZ,EACA,CAAA;AAEN;;;;;;;;ACtEA,SAAgB,YAAY,EAC1B,UACA,OACA,UACA,WAAW,OACX,QAAQ,gBACR,WACA,GAAG,SACgB;CACnB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,QAAQ,aAAa,SAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CACnD,MAAM,EACJ,SACA,OACA,KAAK,eACH,YAA4B,MAAM,MAAM;CAC5C,MAAM,WAAW,YAAY;CAE7B,MAAM,cAAc,QAAQ,KAAK;CACjC,MAAM,oBAAoB,QAAQ,SAAS,MAAM;CAEjD,MAAM,UAAU,SAAmB;EACjC,IAAI,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU,KAAA,GAAW;EACjE,WAAW,KAAK,KAAK;EACrB,MAAM;EACN,YAAY;CACd;CAEA,MAAM,qBAAqB;EACzB,MAAM;EACN,YAAY;CACd;CAEA,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,WAAW,SAAS,SAAS,MAAM,GAEpC,MAAM;EAEV;EACA,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,aAAa,SAAS,oBAAoB,eAAe,iBAAiB;CAC5E,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,QAAQ,4BAA4B;GACxC,WAAW,SACP,cAAiC,gCAAgC,CAAC,EAClE,MAAM;EACZ,CAAC;EACD,aAAa,qBAAqB,KAAK;CACzC,GAAG,CAAC,IAAI,CAAC;CAET,yBAAyB;EACvB,MAAM,KAAK,WAAW;EACtB,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI;EAClC,aAAa,QAAQ,SAAS,EAAE;EAChC,MAAM,OAAO,GAAG,sBAAsB;EACtC,MAAM,SAAS;EACf,MAAM,QAAQ,KAAK,QAAQ,OAAO,aAAa;EAC/C,MAAM,QAAQ,KAAK,SAAS,OAAO,cAAc;EACjD,IAAI,OACF,GAAG,MAAM,OAAO,GAAG,KAAK,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,EAAE;EAE7D,IAAI,OACF,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,QAAQ,OAAO,IAAI,KAAK,MAAM,EAAE;EAE7D,GAAG,MAAM,kBAAkB,GAAG,QAAQ,UAAU,OAAO,GAAG,QAAQ,WAAW;EAC7E,GAAG,QAAQ,OAAO,QAAQ,QAAQ;CACpC,GAAG,CAAC,SAAS,MAAM,CAAC;CAEpB,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,KAAK;EACL,UAAU;EACV,WAAW,GAAG,oBAAoB,SAAS;EAC3C,gBAAgB,UAAU;GACxB,IAAI,UAAU;GACd,MAAM,eAAe;GAErB,MAAM,OAAO,QAAQ,SAAS,sBAAsB;GACpD,UAAU;IACR,GAAG,MAAM,YAAY,OAAO,KAAK,OAAO,IAAI;IAC5C,GAAG,MAAM,YAAY,OAAO,KAAK,MAAM,IAAI;GAC7C,CAAC;GACD,QAAQ,IAAI;EACd;EAfF,UAAA,CAiBG,KAAK,QAAQ,GACb,WACC,YACA,aACE,oBAAC,OAAD;GACE,IAAI,GAAG,OAAO;GACd,KAAK;GACL,WAAU;GACV,cAAY;GACZ,MAAK;GACL,cAAY;GACZ,OAAO;IAAE,MAAM,OAAO;IAAG,KAAK,OAAO;GAAE;GAEvC,UAAA,oBAAC,aAAD;IACU;IACD;IACP,UAAU;IACV,UAAU;GACX,CAAA;EACE,CAAA,GACL,SAAS,IACX,CACC;;AAET;;;AClJA,MAAM,qBACJ;AAEF,MAAM,uBACJ;AAeF,SAAS,UAAU,WAA8C;CAC/D,OAAO,MAAM,KACX,WAAW,iBAA8B,kBAAkB,KAAK,CAAC,CACnE,CAAC,CAAC,QACC,YACC,CAAC,QAAQ,aAAa,UAAU,KAChC,QAAQ,YAAY,KACpB,CAAC,QAAQ,QAAQ,SAAS,MACzB,OAAO,QAAQ,mBAAmB,cACjC,QAAQ,eAAe,CAAC,CAAC,SAAS,EACxC;AACF;AAEA,SAAgB,cACd,UACA,SACA,UACA,WACwC;CACxC,IAAI,SAAS,WAAW,GAAG,OAAO;EAAE,SAAS;EAAM,QAAQ;CAAK;CAChE,MAAM,QAAQ,SAAS;CACvB,MAAM,OAAO,SAAS,SAAS,SAAS;CACxC,IAAI,YAAY,QAAS,cAAc,KAAA,KAAa,YAAY,WAC9D,OAAO;EAAE,SAAS;EAAM,QAAQ,WAAW,OAAO;CAAM;CAC1D,IAAI,YAAY,YAAY,OAAO,OAAO;EAAE,SAAS;EAAM,QAAQ;CAAK;CACxE,IAAI,CAAC,YAAY,YAAY,MAAM,OAAO;EAAE,SAAS;EAAM,QAAQ;CAAM;CACzE,OAAO;EAAE,SAAS;EAAO,QAAQ;CAAK;AACxC;AAIA,SAAS,mBAAmB;CAC1B,MAAM,SAAkB,CAAC;CACzB,OAAO;EACL,KAAK,OAA0B;GAC7B,MAAM,UAAU,MAAM;GACtB,MAAM,QAAQ,UACV,OAAO,WACJ,UACC,MAAM,YAAY,QAClB,MAAM,YAAY,WAClB,QAAQ,SAAS,MAAM,OAAO,CAClC,IACA;GACJ,IAAI,UAAU,IAAI,OAAO,KAAK,KAAK;QAC9B,OAAO,OAAO,OAAO,GAAG,KAAK;GAClC,aAAa;IACX,MAAM,QAAQ,OAAO,QAAQ,KAAK;IAClC,IAAI,UAAU,IAAI,OAAO,OAAO,OAAO,CAAC;GAC1C;EACF;EACA,MAAyB;GACvB,OAAO,OAAO,OAAO,SAAS;EAChC;CACF;AACF;AAEA,MAAM,QAAQ,iBAAiB;AAC/B,MAAM,SAAS,iBAAiB;;;;;;;;;;;;AAiBhC,SAAgB,aACd,KACA,QACA,SACA,UAA4B,CAAC,GACvB;CACN,MAAM,EAAE,sBAAsB,UAAU;CACxC,MAAM,aAAa,OAAO,OAAO;CAEjC,gBAAgB;EACd,WAAW,UAAU;CACvB,CAAC;CAED,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,QAAe,EAAE,SAAS,IAAI,QAAQ;EAC5C,MAAM,UAAU,MAAM,KAAK,KAAK;EAChC,MAAM,QAAQ,4BAA4B;GACxC,MAAM,YAAY,IAAI;GACtB,IAAI,CAAC,WAAW;GAChB,MAAM,UAAU,WAAW;GAC3B,MAAM,WACJ,OAAO,YAAY,aAAa,QAAQ,IAAI,SAAS;GACvD,IAAI,CAAC,YAAY,UAAU,SAAS,SAAS,aAAa,GAAG;GAK7D,CAHE,YACA,UAAU,SAAS,CAAC,CAAC,OACpB,sBAAsB,YAAY,KAAA,GAAA,EAC7B,MAAM;EAChB,CAAC;EACD,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,SAAS,MAAM,IAAI,MAAM,OAAO;GAClD,MAAM,YAAY,IAAI;GACtB,MAAM,UAAU,SAAS;GACzB,MAAM,OAAO,CAAC,WAAW,YAAY,SAAS;GAC9C,MAAM,EAAE,SAAS,WAAW,cAC1B,UAAU,SAAS,GACnB,OAAO,OAAO,SACd,MAAM,UACN,aAAa,KAAA,CACf;GACA,IAAI,CAAC,SAAS;GACd,MAAM,eAAe;GACrB,CAAC,WAAW,sBAAsB,YAAY,MAAA,EAAQ,MAAM;EAC9D;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,aAAa;GACX,QAAQ;GACR,qBAAqB,KAAK;GAC1B,SAAS,oBAAoB,WAAW,aAAa;EACvD;CACF,GAAG;EAAC;EAAQ;EAAqB;CAAG,CAAC;AACvC;AAEA,SAAgB,gBACd,SACwB;CACxB,IAAI,CAAC,WAAW,OAAO,QAAQ,UAAU,YAAY,OAAO;CAC5D,IAAI,QAAQ,gBAAgB,OAAO,OAAO;CAC1C,IAAI,QAAQ,eAAe,UAAU,GAAG,OAAO;CAC/C,IAAI,QAAQ,UAAU,SAAS,GAAG,OAAO;CACzC,OAAO;AACT;AAEA,SAAgB,aACd,QACA,MAAgD,UACvC;CACT,IAAI,gBAAgB,MAAM,GAAG;EAC3B,OAAO,MAAM,EAAE,eAAe,KAAK,CAAC;EACpC,IAAK,IAAI,kBAA8B,QAAQ,OAAO;CACxD;CACA,MAAM,UAAU,IAAI;CACpB,IAAI,WAAW,YAAY,IAAI,QAAQ,QAAQ,gBAAgB,OAC7D,QAAQ,OAAO;CACjB,OAAO,IAAI,iBAAiB,IAAI;AAClC;AAOA,SAAgB,eACd,QACA,UAA8B,CAAC,GACzB;CACN,MAAM,EAAE,KAAK,cAAc,SAAS;CACpC,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,YAAY,OAAO,WAAW;CAEpC,IAAI,CAAC,QAAQ,SAAS,UAAU;MAC3B,IAAI,SAAS,YAAY,QAAQ,OAAO,aAAa,aACxD,SAAS,UAAU,SAAS;CAE9B,gBAAgB;EACd,UAAU,UAAU;CACtB,CAAC;CAED,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,YAAY,KAAK,WAAW;EAClC,MAAM,aAAa,SAAS;EAC5B,aAAa;GACX,MAAM,UAAU,UAAU;GAC1B,IAAI,YAAY,OAAO;GACvB,MAAM,UAAU,SAAS;GAMzB,IAAI,EAJF,CAAC,WACD,YAAY,SAAS,QACrB,CAAC,QAAQ,gBACR,WAAW,SAAS,OAAO,KAAK,SACxB;GAEX,cADe,OAAO,YAAY,aAAa,QAAQ,IAAI,SACpC,UAAU;EACnC;CACF,GAAG,CAAC,QAAQ,GAAG,CAAC;AAClB;AAWA,IAAI,cAAc;AAClB,IAAI,cAAiE;AAErE,SAAgB,WACd,MAAsB,UACV;CACZ,MAAM,QAAQ,IAAI,KAAK;CACvB,IAAI,gBAAgB,GAAG;EACrB,cAAc;GACZ,UAAU,MAAM;GAChB,cAAc,MAAM;EACtB;EACA,MAAM,OAAO,IAAI;EACjB,MAAM,MAAM,OAAO,KAAK,aAAa,IAAI,gBAAgB,cAAc;EACvE,IAAI,MAAM,GAAG;GACX,MAAM,WAAW,MAAM,mBAAmB,IAAI,IAAa;GAE3D,MAAM,eAAe,IADL,OAAO,WAAW,UAAU,gBAAgB,EAAE,KAAK,KACjC,IAAI;EACxC;EACA,MAAM,WAAW;CACnB;CACA,eAAe;CACf,IAAI,WAAW;CACf,aAAa;EACX,IAAI,UAAU;EACd,WAAW;EACX,eAAe;EACf,IAAI,cAAc,KAAK,CAAC,aAAa;EACrC,MAAM,WAAW,YAAY;EAC7B,MAAM,eAAe,YAAY;EACjC,cAAc;CAChB;AACF;AAEA,SAAgB,cAAc,QAAuB;CACnD,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,OAAO,WAAW;CACpB,GAAG,CAAC,MAAM,CAAC;AACb;AAEA,SAAgB,aACd,MACA,MACA,wBAA+B,IAAI,IAAI,GAClC;CACL,MAAM,OAAO,IAAI,IAAc,IAAI;CACnC,MAAM,uBAAO,IAAI,IAAc;CAC/B,KAAK,MAAM,WAAW,MAAM;EAC1B,MAAM,QAAoB,CAAC;EAC3B,IAAI,OAAwB,QAAQ;EACpC,OAAO,QAAQ,SAAS,MAAM;GAC5B,MAAM,KAAK,IAAI;GACf,OAAO,KAAK;EACd;EACA,IAAI,SAAS,MAAM,KAAK,MAAM,QAAQ,OAAO,KAAK,IAAI,IAAI;CAC5D;CACA,MAAM,UAAe,CAAC;CACtB,MAAM,SAAS,WAAqB;EAClC,KAAK,MAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,GAAG;GAC/C,IAAI,KAAK,IAAI,KAAK,GAAG;GACrB,IAAI,KAAK,IAAI,KAAK,GAAG,MAAM,KAAK;QAC3B,IAAI,CAAC,MAAM,aAAa,OAAO,KAAK,MAAM,IAAI,KAAK,GACtD,QAAQ,KAAK,KAAU;EAC3B;CACF;CACA,IAAI,KAAK,OAAO,KAAK,KAAK,MAAM,YAAY,QAAQ,kBAAkB,IAAI,GACxE,MAAM,IAAI;CACZ,OAAO;AACT;AAEA,MAAM,0BAAU,IAAI,IAAa;AAEjC,SAAS,YAAkB;CACzB,MAAM,MAAM,OAAO,IAAI,CAAC,EAAE;CAC1B,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,OAAO,SAAS,KAAK,SAAS,GAAG,GAAG;EACtC,MAAM,UAAU,MAAM,KACpB,SAAS,KAAK,iBAAiB,oBAAoB,CACrD,CAAC,CAAC,QAAQ,WAAW,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC;EACnE,KAAK,MAAM,WAAW,aACpB,CAAC,KAAK,GAAG,OAAO,GAChB,SAAS,MACT,OACF,GACE,KAAK,IAAI,OAAO;CACpB;CACA,KAAK,MAAM,WAAW,SACpB,IAAI,CAAC,KAAK,IAAI,OAAO,GAAG;EACtB,QAAQ,gBAAgB,OAAO;EAC/B,QAAQ,OAAO,OAAO;CACxB;CACF,KAAK,MAAM,WAAW,MACpB,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;EACzB,QAAQ,aAAa,SAAS,EAAE;EAChC,QAAQ,IAAI,OAAO;CACrB;AACJ;AAMA,SAAgB,cACd,KACA,QACY;CACZ,MAAM,WAAW,OAAqB,IAAI;CAC1C,MAAM,SAAS,OAA0B,IAAI;CAC7C,OAAO,YAAY,EACjB,iBACE,SAAS,YAAY,QAAQ,OAAO,IAAI,MAAM,SAAS,QAC3D;CAEA,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,QAAe,EAAE,SAAS,IAAI,QAAQ;EAC5C,SAAS,UAAU;EACnB,MAAM,UAAU,OAAO,KAAK,KAAK;EACjC,UAAU;EACV,aAAa;GACX,QAAQ;GACR,IAAI,SAAS,YAAY,OAAO,SAAS,UAAU;GACnD,UAAU;EACZ;CACF,GAAG,CAAC,QAAQ,GAAG,CAAC;CAEhB,OAAO,OAAO;AAChB;;;ACtUA,SAAgB,OAAO,EACrB,MACA,SACA,OACA,aACA,UACA,QACA,aAAa,gBACb,sBAAsB,MACtB,gBAAgB,MAChB,cACA,cAAc,MACd,aACc;CACd,MAAM,KAAK,MAAM;CACjB,MAAM,UAAU,GAAG,GAAG;CACtB,MAAM,gBACJ,gBAAgB,KAAA,IAAY,GAAG,GAAG,gBAAgB,KAAA;CACpD,MAAM,EAAE,SAAS,OAAO,KAAK,cAAc,YAAyB,IAAI;CAExE,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,cAAc,WAAW,MAAM;CAC7C,aAAa,WAAW,QAAQ,cAAc,EAAE,qBAAqB,KAAK,CAAC;CAC3E,eAAe,SAAS;EAAE,KAAK;EAAW;CAAY,CAAC;CACvD,cAAc,OAAO;CAErB,gBAAgB;EACd,IAAI,CAAC,QAAQ,CAAC,eAAe;EAC7B,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,YAAY,MAAM,kBAAkB;GACtD,IAAI,CAAC,MAAM,UAAU,GAAG;GACxB,MAAM,eAAe;GACrB,QAAQ;EACV;EACA,OAAO,iBAAiB,WAAW,aAAa;EAChD,aAAa,OAAO,oBAAoB,WAAW,aAAa;CAClE,GAAG;EAAC;EAAe;EAAO;EAAS;CAAI,CAAC;CAExC,IAAI,CAAC,SAAS,OAAO;CAErB,OACE,oBAAC,OAAD;EACE,WAAU;EACV,cAAY;EACZ,MAAK;EACL,cAAc,UAAU;GACtB,IAAI,uBAAuB,MAAM,WAAW,MAAM,eAChD,QAAQ;EACZ;EAEA,UAAA,qBAAC,WAAD;GACE,KAAK;GACL,WAAW,GAAG,cAAc,SAAS;GACrC,MAAK;GACL,cAAW;GACX,UAAU;GACV,mBAAiB;GACjB,oBAAkB;GAPpB,UAAA;IASE,qBAAC,UAAD;KAAQ,WAAU;KAAlB,UAAA,CACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,MAAD;OAAI,IAAI;OAAS,WAAU;OACxB,UAAA,KAAK,KAAK;MACT,CAAA,GACH,gBAAgB,KAAA,KACf,oBAAC,KAAD;OAAG,IAAI;OAAe,WAAU;OAC7B,UAAA,KAAK,WAAW;MAChB,CAAA,CAEF;KACL,CAAA,GAAA,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,cAAY;MACZ,SAAS;MAET,UAAA,oBAAC,OAAD;OAAO,MAAM;OAAI,eAAY;MAAQ,CAAA;KAC/B,CAAA,CACF;;IACP,aAAa,KAAA,KACZ,oBAAC,OAAD;KAAK,WAAU;KAAuB,UAAA,KAAK,QAAQ;IAAO,CAAA;IAE3D,WAAW,KAAA,KACV,oBAAC,UAAD;KAAQ,WAAU;KAAsB,UAAA,KAAK,MAAM;IAAU,CAAA;GAExD;;CACN,CAAA;AAET;;;ACpFA,SAAgB,OAAO,EACrB,MACA,SACA,OACA,aACA,UACA,QACA,OAAO,SACP,OAAO,MACP,aAAa,eACb,sBAAsB,MACtB,gBAAgB,MAChB,cACA,cAAc,MACd,aACc;CACd,MAAM,KAAK,MAAM;CACjB,MAAM,UAAU,GAAG,GAAG;CACtB,MAAM,gBACJ,gBAAgB,KAAA,IAAY,GAAG,GAAG,gBAAgB,KAAA;CACpD,MAAM,EAAE,SAAS,OAAO,KAAK,cAAc,YAAyB,IAAI;CAExE,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,cAAc,WAAW,MAAM;CAC7C,aAAa,WAAW,QAAQ,cAAc,EAAE,qBAAqB,KAAK,CAAC;CAC3E,eAAe,SAAS;EAAE,KAAK;EAAW;CAAY,CAAC;CACvD,cAAc,OAAO;CAErB,gBAAgB;EACd,IAAI,CAAC,QAAQ,CAAC,eAAe;EAC7B,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,YAAY,MAAM,kBAAkB;GACtD,IAAI,CAAC,MAAM,UAAU,GAAG;GACxB,MAAM,eAAe;GACrB,QAAQ;EACV;EACA,OAAO,iBAAiB,WAAW,aAAa;EAChD,aAAa,OAAO,oBAAoB,WAAW,aAAa;CAClE,GAAG;EAAC;EAAe;EAAO;EAAS;CAAI,CAAC;CAExC,IAAI,CAAC,SAAS,OAAO;CAErB,OACE,oBAAC,OAAD;EACE,WAAU;EACV,cAAY;EACZ,aAAW;EACX,MAAK;EACL,cAAc,UAAU;GACtB,IAAI,uBAAuB,MAAM,WAAW,MAAM,eAChD,QAAQ;EACZ;EAEA,UAAA,qBAAC,WAAD;GACE,KAAK;GACL,WAAW,GAAG,cAAc,SAAS;GACrC,aAAW;GACX,aAAW;GACX,MAAK;GACL,cAAW;GACX,UAAU;GACV,mBAAiB;GACjB,oBAAkB;GATpB,UAAA;IAWE,qBAAC,UAAD;KAAQ,WAAU;KAAlB,UAAA,CACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,MAAD;OAAI,IAAI;OAAS,WAAU;OACxB,UAAA,KAAK,KAAK;MACT,CAAA,GACH,gBAAgB,KAAA,KACf,oBAAC,KAAD;OAAG,IAAI;OAAe,WAAU;OAC7B,UAAA,KAAK,WAAW;MAChB,CAAA,CAEF;KACL,CAAA,GAAA,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,cAAY;MACZ,SAAS;MAET,UAAA,oBAAC,OAAD;OAAO,MAAM;OAAI,eAAY;MAAQ,CAAA;KAC/B,CAAA,CACF;;IACP,aAAa,KAAA,KACZ,oBAAC,OAAD;KAAK,WAAU;KAAuB,UAAA,KAAK,QAAQ;IAAO,CAAA;IAE3D,WAAW,KAAA,KACV,oBAAC,UAAD;KAAQ,WAAU;KAAsB,UAAA,KAAK,MAAM;IAAU,CAAA;GAExD;;CACN,CAAA;AAET;;;AChHA,SAAgB,aAAa,EAC3B,UAAU,QACV,WACA,UACA,GAAG,SACiB;CACpB,IAAI,aAAa,KAAA,KAAa,aAAa,MAAM,OAAO;CAExD,OACE,oBAAC,KAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,qBAAqB,SAAS;EAC5C,gBAAc;EACd,MAAM,YAAY,UAAU,UAAU,KAAA;EAErC,UAAA,KAAK,QAAQ;CACb,CAAA;AAEP;;;ACRA,SAAgB,MAAM,EACpB,OACA,SACA,aACA,SACA,cAAc,QACd,WAAW,OACX,WACA,YACa;CACb,MAAM,cAAc,MAAM;CAC1B,MAAM,gBAAgB,cAAc,GAAG,YAAY,gBAAgB,KAAA;CACnE,MAAM,YAAY,UAAU,GAAG,YAAY,YAAY,KAAA;CACvD,MAAM,cAAc,CAAC,eAAe,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEvE,MAAM,UAAU,eAA4B,QAAQ,IAChD,aAAa,UAAU;EACrB,oBACE,CAAC,SAAS,MAAM,qBAAqB,WAAW,CAAC,CAC9C,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,KAAK,KAAA;EAClB,iBACE,SAAS,MAAM,qBAAqB,YAAY,KAAA;EAClD,gBACE,SAAS,MAAM,oBACd,gBAAgB,WAAW,YAAY,OAAO,KAAA;CACnD,CAAC,IACD,KAAK,QAAQ;CAEjB,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,aAAa,SAAS;EAAzC,UAAA;GACG,UAAU,KAAA,KACT,qBAAC,SAAD;IAAO,WAAU;IAA4B;IAA7C,UAAA,CACE,oBAAC,QAAD,EAAA,UAAO,KAAK,KAAK,EAAQ,CAAA,GACxB,YAAY,oBAAC,QAAD;KAAM,WAAU;KAAsB,UAAA;IAAc,CAAA,CAC5D;;GAER,gBAAgB,KAAA,KAAa,gBAAgB,QAC5C,oBAAC,KAAD;IAAG,IAAI;IAAe,WAAU;IAC7B,UAAA,KAAK,WAAW;GAChB,CAAA;GAEL,oBAAC,OAAD;IAAK,WAAU;IAAsB,UAAA;GAAa,CAAA;GACjD,YAAY,KAAA,KAAa,YAAY,QACpC,oBAAC,cAAD;IAAc,IAAI;IAAW,SAAS;IACnC,UAAA,KAAK,OAAO;GACD,CAAA;EAEb;;AAET;;;ACxEA,MAAM,oBAAoB;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,IAAI;AAIX,SAAgB,aACd,UACA,OACA,OACS;CACT,IAAI,UAAU,OAAO,SAAS,IAAI,YAAY;CAC9C,IAAI,UAAU,KAAK,UAAU,QAAQ,GAAG,OAAO;CAC/C,OAAO;AACT;AAEA,SAAgB,UAAU,MAAoD;CAC5E,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,OAAO,MAAM,KACX,KAAK,iBAA8B,iBAAiB,CACtD,CAAC,CAAC,QACC,YACC,QAAQ,YAAY,KACpB,CAAC,QAAQ,aAAa,UAAU,KAChC,CAAC,QAAQ,QAAQ,+BAA+B,KAChD,QAAQ,eAAe,CAAC,CAAC,SAAS,CACtC;AACF;AAEA,SAAgB,aAAa,SAA+C;CAC1E,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AACxC;AAEA,SAAgB,UAAU,OAA6C;CACrE,IAAI,CAAC,OAAO;CACZ,aAAa,UAAU,KAAK,CAAC,CAAC,MAAM,KAAK;AAC3C;AAEA,SAAgB,YACd,SACA,MACyB;CACzB,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,OAAO,UAAU,QAAQ,aAAa,CAAC,CAAC,MACrC,aACE,QAAQ,wBAAwB,OAAO,IACtC,KAAK,iCACL,KACF,CAAC,QAAQ,SAAS,OAAO,KACzB,CAAC,KAAK,MAAM,UAAU,OAAO,SAAS,OAAO,CAAC,CAClD;AACF;AAQA,SAAgB,eACd,OACA,OACA,SACA,OACA,QACM;CACN,IAAI,MAAM,QAAQ,SAAS,CAAC,OAAO;CACnC,MAAM,WAAW,UAAU,KAAK;CAChC,MAAM,SAAS,MAAM,cAAc;CACnC,IAAI,UAAU,WAAW,SAAS,CAAC,MAAM,SAAS,MAAM,GAAG;CAC3D,MAAM,OAAO,aACX,MAAM,UACN,SAAS,SAAS,QAAQ,MAAM,IAAI,IACpC,SAAS,MACX;CACA,IAAI,CAAC,MAAM;CACX,IAAI,SAAS,WAAW;EACtB,MAAM,eAAe;EACrB,aAAa,OAAO;CACtB,OAAO;EACL,MAAM,OAAO,YAAY,SAAS,CAAC,OAAO,KAAK,CAAC;EAChD,IAAI,MAAM;GACR,MAAM,eAAe;GACrB,aAAa,IAAI;EACnB;CACF;CACA,OAAO,IAAI;AACb;;;ACnFA,MAAM,qBAAgC,CAAC,QAAQ,UAAU;AAEzD,SAAgB,eACd,SACA,SACA,cAAiC,CAAC,QAAQ,GACV;CAChC,IAAI,CAAC,eAAe,OAAO,KAAK,QAAQ,SAAS,UAAU,OAAO;CAClE,IAAI,YAAY,KAAA,GAAW,OAAO;CAClC,OAAO,OAAO,QAAQ,SAAS,WAC3B,YAAY,SAAS,QAAQ,IAAI,IACjC,mBAAmB,SAAS,QAAQ,IAAI;AAC9C;AAEA,SAAS,MAAM,KAAc,MAAwB;CACnD,IAAI,OAAO,QAAQ,YAAY,OAAO;CACtC,IAAI,OAAO,SAAS,YAAY,OAAO;CACvC,QAAQ,UAA0C;EAChD,IAAiB,KAAK;EACtB,IAAI,CAAC,OAAO,kBAAkB,KAAkB,KAAK;CACvD;AACF;AAEA,SAAgB,YACd,SACA,OACqB;CACrB,MAAM,MAAM,QAAQ;CACpB,MAAM,SAAgB,EAAE,iBAAiB,GAAG;CAC5C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAC7C,IAAI,WAAW,KAAK,GAAG,GAAG,OAAO,OAAO,MAAM,IAAI,MAAM,KAAK;MACxD,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO;CAE9C,OAAO,YAAY,GACjB,IAAI,WACJ,MAAM,SACR;CACA,OAAO,WAAW,QAAQ,IAAI,YAAY,MAAM,QAAQ,KAAK,KAAA;CAC7D,IAAI,QAAQ,SAAS,YAAY,IAAI,SAAS,KAAA,GAC5C,OAAO,OAAO;CAChB,OAAO,aAAa,SAAS,MAAM;AACrC;AAEA,SAAgB,kBAAkB,OAAyB;CACzD,IAAI,OAAO,UAAU,UAAU,OAAO,MAAM,KAAK,CAAC,CAAC,SAAS;CAC5D,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,OAAO;CACnE,IAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,OAAO,UAAU,WAC5D,OAAO;CACT,IAAI,eAAe,KAAK,GAAG;EACzB,MAAM,QAAQ,MAAM;EACpB,MAAM,SAAS,MAAM;EACrB,IAAI,WAAW,QAAQ,WAAW,QAAQ,OAAO;EACjD,KAAK,MAAM,QAAQ;GAAC;GAAc;GAAmB;EAAO,GAAG;GAC7D,MAAM,OAAO,MAAM;GACnB,IAAI,OAAO,SAAS,YAAY,KAAK,KAAK,GAAG,OAAO;EACtD;EACA,IAAI,OAAO,MAAM,SAAS,UAAU;GAClC,MAAM,QAAQ,MAAM;GACpB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG,OAAO;EACxD;EACA,OAAO,kBAAkB,MAAM,QAAQ;CACzC;CACA,IAAI,OAAO,UAAU,YAAY,OAAO,YAAY,OAClD,OAAO,MAAM,KAAK,KAA0B,CAAC,CAAC,KAAK,iBAAiB;CACtE,OAAO;AACT;;;AC9CA,MAAM,iBAAiB,CAAC,UAAU,GAAG;AAErC,SAAgB,UAAU,EACxB,SACA,UACA,YAAY,KACZ,aAAa,KACb,YAAY,UACZ,YAAY,cACZ,SACA,aACiB;CACjB,MAAM,KAAK,MAAM;CACjB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAAoB,IAAI;CAC3C,MAAM,SAAS,OAA0C,CAAC,CAAC;CAC3D,MAAM,gBAAgB,OAAO,KAAK;CAClC,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,EACJ,SACA,OACA,KAAK,eACH,YAA4B,MAAM,MAAM;CAC5C,MAAM,WAAW,YAAY;CAC7B,yBAAyB;EACvB,WAAW,UACT,QAAQ,SAAS,cAA2B,0BAA0B,KACtE;CACJ,CAAC;CACD,mBAAmB,YAAY,YAAY,WAAW,UAAU;EAC9D,MAAM;EACN,OAAO;EACP,QAAQ;CACV,CAAC;CACD,MAAM,oBAAoB;EACxB,IAAI,OAAO,QAAQ,SAAS,KAAA,GAC1B,OAAO,aAAa,OAAO,QAAQ,IAAI;EACzC,IAAI,OAAO,QAAQ,UAAU,KAAA,GAC3B,OAAO,aAAa,OAAO,QAAQ,KAAK;EAC1C,OAAO,UAAU,CAAC;CACpB;CAEA,MAAM,oBAAoB;EACxB,YAAY;EACZ,OAAO,QAAQ,OAAO,OAAO,iBAAiB,QAAQ,IAAI,GAAG,SAAS;CACxE;CAEA,MAAM,qBAAqB;EACzB,YAAY;EACZ,OAAO,QAAQ,QAAQ,OAAO,iBAAiB,QAAQ,KAAK,GAAG,UAAU;CAC3E;CAEA,MAAM,iBAAiB;EACrB,YAAY;EACZ,QAAQ,KAAK;CACf;CAEA,MAAM,4BAA4B;EAChC,cAAc,UAAU;EACxB,aAAa,WAAW,OAAO;EAC/B,cAAc,UAAU;CAC1B;CAEA,gBAAgB,aAAa,CAAC,CAAC;CAE/B,gBAAgB;EACd,IAAI,CAAC,WAAW,CAAC,UAAU;EAC3B,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,UAAU;GAC5B,MAAM,SAAS,SAAS;GACxB,MAAM,SAAS,QAAQ,UAAU,WAAW,SAAS,SAAS,MAAM,CAAC;GACrE,SAAS;GACT,IAAI,QAAQ,oBAAoB;EAClC;EACA,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,WAAW,SAAS,SAAS,MAAM,GAEpC,SAAS;EACb;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,aAAa;GACX,SAAS,oBAAoB,WAAW,aAAa;GACrD,SAAS,oBAAoB,eAAe,iBAAiB;EAC/D;CACF,GAAG;EAAC;EAAY;EAAS;CAAQ,CAAC;CAElC,MAAM,cAAc,UAAiD;EACnE,MAAM,OAAO,MAAM;EACnB,IACE,SACC,QAAQ,SAAS,SAAS,IAAI,KAAK,WAAW,SAAS,SAAS,IAAI,IAErE;EACF,SAAS;CACX;CAEA,MAAM,2BAA2B;EAC/B,IAAI,CAAC,cAAc,SAAS,YAAY;CAC1C;CAEA,MAAM,wBAAwB,UAAyB;EACrD,IAAI,MAAM,QAAQ,UAAU;GAC1B,SAAS;GACT;EACF;EACA,IAAI,MAAM,QAAQ,SAAS,MAAM,YAAY,CAAC,MAAM;EACpD,MAAM,QAAQ,UAAU,WAAW,OAAO,CAAC,CAAC;EAC5C,IAAI,CAAC,OAAO;EACZ,MAAM,eAAe;EACrB,YAAY;EACZ,aAAa,KAAK;CACpB;CAEA,MAAM,qBAAqB,UACzB,eACE,OACA,WAAW,SACX,WAAW,SACX,QAAQ,SACR,WACF;CAEF,MAAM,+BAA+B;EACnC,MAAM,SAAS,SAAS;EACxB,IAAI,UAAU,WAAW,SAAS,SAAS,MAAM,GAAG;EACpD,aAAa;CACf;CAEA,MAAM,eAAe;EACnB,WAAW;EACX,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB,OAAO,KAAK,KAAA;EAC7B,SAAS;EACT,WAAW;CACb;CAEA,OACE,qBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAG,kBAAkB,SAAS;EACzC,aAAW,QAAQ,KAAA;EACnB,gBAAgB;EAChB,gBAAgB;EAChB,QAAQ;EANV,UAAA,CAQG,eAAe,SAAS,SAAS,cAAc,IAC9C,YAAY,SAAS,YAAY,IAEjC,oBAAC,UAAD;GAAQ,MAAK;GAAS,GAAI;GACvB,UAAA,KAAK,OAAO;EACP,CAAA,GAET,WACC,YACA,aACE,oBAAC,OAAD;GACM;GACJ,KAAK;GACL,WAAU;GACV,cAAY;GACZ,MAAK;GACL,cAAY;GACZ,gBAAgB;GAChB,gBAAgB;GAChB,QAAQ;GACR,WAAW;GAEV,UAAA,KAAK,QAAQ;EACX,CAAA,GACL,SAAS,IACX,CACC;;AAET;;;AC9KA,MAAM,qBAAqB;AAE3B,SAAgB,KAAK,EACnB,SACA,OACA,UACA,OACA,QAAQ,SACR,MAAM,UACN,cACA,WAAW,OACX,SACA,aACY;CACZ,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAAoB,IAAI;CAC3C,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CACtD,MAAM,OAAO,YAAY;CACzB,MAAM,WAAW,SAAkB;EACjC,IAAI,aAAa,KAAA,GAAW,gBAAgB,IAAI;EAChD,eAAe,IAAI;CACrB;CACA,MAAM,EACJ,SACA,OACA,KAAK,eACH,YAA4B,MAAM,MAAM;CAC5C,MAAM,WAAW,YAAY;CAC7B,yBAAyB;EACvB,WAAW,UACT,QAAQ,SAAS,cAA2B,oBAAoB,KAAK;CACzE,CAAC;CACD,mBAAmB,YAAY,YAAY,WAAW,UAAU;EAC9D,MAAM;EACN;EACA,QAAQ;CACV,CAAC;CACD,MAAM,iBAAiB,MAAM,SAAS,MAAM,UAC1C,CAAC,KAAK,aAAa,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI,CAAC,CACjD;CACA,MAAM,cAAc,QAAQ,KAAK;CACjC,MAAM,aAAa,UACjB,SAAS,eAAe,GAAG,OAAO,GAAG,OAAO,CAAC,EAAE,MAAM;CAEvD,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,WAAW,SAAS,SAAS,MAAM,GAEpC,MAAM;EACV;EACA,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,aAAa,SAAS,oBAAoB,eAAe,iBAAiB;CAC5E,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,UAAU,SAAmB;EACjC,IAAI,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU,KAAA,GAAW;EACjE,WAAW,KAAK,KAAK;EACrB,MAAM;CACR;CAEA,MAAM,iBAAiB,UAA+B;EACpD,IAAI,MAAM,QAAQ,UAAU;GAC1B,MAAM,eAAe;GACrB,MAAM;GACN;EACF;EACA,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GACxD,MAAM,eAAe;GACrB,QAAQ,IAAI;GACZ,MAAM,QACJ,eACE,MAAM,QAAQ,cAAc,IAAI,eAAe,SAAS;GAE5D,IAAI,UAAU,KAAA,GAAW,4BAA4B,UAAU,KAAK,CAAC;EACvE;CACF;CAEA,MAAM,yBAAyB;EAC7B,MAAM;EACN,WAAW,SAAS,MAAM;CAC5B;CAEA,MAAM,wBAAwB,UAIxB;EACJ,IAAI,MAAM,QAAQ,OAAO;EACzB,MAAM,eAAe;EACrB,MAAM;EACN,MAAM,UAAU,WAAW;EAC3B,aACE,MAAM,WACF,UACC,YAAY,SAAS,CAAC,QAAQ,SAAS,WAAW,OAAO,CAAC,KACzD,OACR;CACF;CAEA,MAAM,eAAe;EACnB,WAAW;EACX,cACE,UAAU,kBAAkB,OAAO,IAAI,KAAA,IAAY;EACrD,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB,OAAO,GAAG,OAAO,SAAS,KAAA;EAC3C,UAAU,YAAY,KAAA;EACtB,eAAe,QAAQ,CAAC,IAAI;EAC5B,WAAW;CACb;CAEA,OACE,qBAAC,OAAD;EAAK,IAAI;EAAQ,KAAK;EAAS,WAAW,GAAG,YAAY,SAAS;EAAlE,UAAA,CACG,eAAe,SAAS,OAAO,IAC9B,YAAY,SAAS,YAAY,IAEjC,oBAAC,UAAD;GAAQ,MAAK;GAAS,GAAI;GACvB,UAAA,KAAK,OAAO;EACP,CAAA,GAET,WACC,YACA,aACE,oBAAC,OAAD;GACE,IAAI,GAAG,OAAO;GACd,KAAK;GACL,WAAU;GACV,cAAY;GACZ,cAAY;GACZ,MAAK;GACL,WAAW;GAEX,UAAA,oBAAC,aAAD;IACU;IACD;IACP,UAAU;IACV,UAAU;GACX,CAAA;EACE,CAAA,GACL,SAAS,IACX,CACC;;AAET;;;ACxJA,MAAM,QAAQ;AACd,MAAM,eAAe;AAErB,SAAS,QAAQ,SAAqB;CACpC,IAAI,YAAY,WAAW,QAAQ,SAAiB,MAAM,KAAK,IAAI;CACnE,IAAI,YAAY,gBACd,QAAQ,SAAiB,aAAa,KAAK,IAAI;CACjD,MAAM,SAAS,IAAI,OAAO,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,EAAE,CAAC;CAC5E,QAAQ,SAAiB,OAAO,KAAK,IAAI;AAC3C;AAEA,SAAgB,QACd,QACA,QACA,UAAsB,WACtB;CACA,MAAM,OAAO,QAAQ,OAAO;CAC5B,MAAM,OAAO,YAAY,iBAAiB,OAAO,YAAY,IAAI;CACjE,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,MAAM;EACvB,IAAI,KAAK,UAAU,QAAQ;EAC3B,IAAI,KAAK,IAAI,GAAG,QAAQ;CAC1B;CACA,OAAO;AACT;AAaA,SAAgB,SAAS,OAAe,OAAe;CACrD,OAAO,QAAQ,MAAM,SAAS,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE;AACzE;AAEA,SAAgB,SACd,OACA,QACA,OACA,KACA,QACA,UAAsB,WACtB;CACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;CAC7C,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,MAAM,UAAU,QAAQ,OAAO;CAEnC,OAAO,QADM,MAAM,MAAM,GAAG,KAAK,IAAI,OAAO,MAAM,MAAM,CACtC,IAAI,QAAQ,MAAM,MAAM,GAAG,GAAG,QAAQ,OAAO;AACjE;AAEA,SAAgB,aACd,UACA,QACA,QACkB;CAClB,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,QAAQ,SAAS,CAAC,CAAC;CAChE,OAAO,QAAQ,SAAS,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK;AAC5D;AAEA,SAAgB,cAAc,QAA8B,QAAgB;CAC1E,MAAM,6BAAa,IAAI,IAAY;CACnC,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,QAAQ;EACzB,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC;EACrC,IAAI,QAAQ,KAAK,QAAQ,QAAQ,WAAW,IAAI,KAAK;CACvD;CACA,OAAO;AACT;AAEA,SAAS,UACP,aACA,OACA,QACA;CACA,IAAI,CAAC,aAAa,OAAO;CACzB,MAAM,SAAS,MAAM,KAAK,WAAW;CACrC,OAAO,OAAO,UAAU,SAAS,OAAO,SAAS;AACnD;AAEA,SAAgB,SAAS,EACvB,OACA,UACA,YACA,SAAS,GACT,QACA,UAAU,WACV,QAAQ,QACR,aACA,eAAe,OACf,UACA,SACA,WACA,YAAY,iBACZ,IACA,MACA,oBAAoB,aACpB,aACgB;CAChB,MAAM,WAAW,OAAgC,IAAI;CACrD,MAAM,WAAW,OAA8B,IAAI;CACnD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,WAAW,gBAAgB,SAA2B,CAAC,GAAG,CAAC,CAAC;CACnE,MAAM,OAAO,MAAM,MAAM,GAAG,MAAM;CAClC,MAAM,OAAO,UAAU;CACvB,MAAM,UAAU,WAAW,UAAU;CAErC,MAAM,UAAU,OAAe,QAAgB;EAC7C,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,OAAO;EACZ,IAAI,MAAM,mBAAmB,SAAS,MAAM,iBAAiB,KAC3D,MAAM,kBAAkB,OAAO,GAAG;EAEpC,cAAc,YACZ,QAAQ,OAAO,SAAS,QAAQ,OAAO,MAAM,UAAU,CAAC,OAAO,GAAG,CACpE;CACF;CAEA,MAAM,SACJ,UACA,SAAS,SAAS,SAAS,MAAM,UAAU,KAAK,WAC7C;EACH,MAAM,CAAC,OAAO,OAAO,aAAa,UAAU,QAAQ,MAAM;EAC1D,OAAO,OAAO,GAAG;CACnB;CAEA,MAAM,aAAa;EACjB,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,SAAS,SAAS,kBAAkB,OAAO;EAChD,MAAM,QAAQ,MAAM,kBAAkB,KAAK;EAC3C,MAAM,MAAM,MAAM,gBAAgB;EAClC,IAAI,MAAM,QAAQ,GAAG,OAAO,OAAO,GAAG;OACjC,MAAM,KAAK;CAClB;CAEA,MAAM,UAAU,MAAc,UAAkB;EAC9C,MAAM,QAAQ,SAAS;EACvB,IAAI,SAAS,MAAM,UAAU,MAAM,MAAM,QAAQ;EACjD,MAAM,OAAO,KAAK,MAAM;EACxB,IAAI,SAAS,MAAM;EACnB,WAAW,IAAI;EACf,IAAI,KAAK,WAAW,QAAQ,aAAa,IAAI;CAC/C;CAEA,gBAAgB;EACd,MAAM,QAAQ,SAAS;EACvB,IAAI,SAAS,MAAM,UAAU,MAAM,MAAM,QAAQ;CACnD,CAAC;CAED,gBAAgB;EACd,IAAI,SAAS,MAAM,UAAU,EAAE;CACjC,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,IAAI,UAAU,WAAW,CAAC,cAAc;EACxC,MAAM,OAAO,iBAAiB,SAAS,SAAS,MAAM;EACtD,MAAM,QAAQ,iBAAiB;GAC7B,IAAI,SAAS,SAAS,SAAS,QAAQ,QAAQ;GAC/C,IAAI,MAAM,WAAW,EAAE;GACvB,IAAI,SAAS,kBAAkB,SAAS,SAAS,MAAM,GAAG,CAAC;EAC7D,GAAG,IAAI;EACP,aAAa,aAAa,KAAK;CACjC,GAAG,CAAC,OAAO,YAAY,CAAC;CAExB,MAAM,aAAa,cAAc,QAAQ,MAAM;CAC/C,MAAM,SAAS,WAAW,CAAC,WAAW,KAAK,IAAI,UAAU,IAAI,SAAS,CAAC,IAAI;CAC3E,MAAM,SAAS,UAAU,KAAK,UAAU,KAAK;CAE7C,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,WAAW,SAAS;EAClC,cAAY;EACZ,gBAAc,WAAW,KAAA;EACzB,iBAAe,YAAY,KAAA;EAC3B,gBAAe,WAAW,CAAC,YAAa,KAAA;EAL1C,UAAA,CAOE,oBAAC,OAAD;GAAK,WAAU;GAAiB,KAAK;GAAU,eAAY;GACxD,UAAA,MAAM,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU;IAC5C,MAAM,OAAO,KAAK;IAClB,MAAM,WAAW,WAAW;IAC5B,MAAM,WACJ,WAAW,UAAU,SAAS,UAAU,MAAM,QAAQ,UAAU;IAClE,MAAM,OACJ,qBAAC,QAAD;KAEE,WAAU;KACV,aAAW;KACX,eAAa,OAAO,OAAO,KAAA;KAC3B,eAAa,YAAY,KAAA;KACzB,iBAAe,YAAY,KAAA;KAC3B,OACE,EAAE,mBAAmB,MAAM;KAR/B,UAAA,CAYG,OACC,oBAAC,QAAD;MAA+B,WAAU;MACtC,UAAA;KACG,GAFK,GAAG,MAAM,GAAG,MAEjB,IAEN,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,UAAU,aAAa,OAAO,MAAM;KACjC,CAAA,GAEP,YAAY,CAAC,QAAQ,CAAC,SACrB,oBAAC,QAAD,EAAM,WAAU,iBAAkB,CAAA,IAChC,IACA;IAvBC,GAAA,KAuBD;IAER,OAAO,WAAW,IAAI,KAAK,IACvB,CACE,oBAAC,QAAD,EAEE,WAAU,qBACX,GAFM,aAAa,OAEnB,GACD,IACF,IACA,CAAC,IAAI;GACX,CAAC;EACE,CAAA,GACL,oBAAC,SAAD;GACE,KAAK;GACD;GACE;GACN,WAAU;GACV,cAAc;GACd,MAAK;GACL,WAAW,YAAY,YAAY,YAAY;GAC/C,cAAa;GACb,gBAAgB,YAAY,iBAAiB,eAAe;GAC5D,aAAY;GACZ,WAAW;GACD;GACV,UAAU;GACC;GACX,cAAY;GACZ,oBAAkB;GAClB,gBAAc,WAAW,KAAA;GACzB,aAAW,QAAQ,KAAA;GACnB,eAAe;IACb,WAAW,IAAI;IACf,MAAM,KAAK,MAAM;GACnB;GACA,cAAc,WAAW,KAAK;GAC9B,UAAU,UAAU;IAClB,MAAM,QACJ,SAAS,SAAS,iBAA8B,aAAa;IAC/D,IAAI,CAAC,OAAO;IACZ,MAAM,IAAI,MAAM;IAChB,MAAM,SAAS,MAAM,cAAc,MAAM;IACzC,IAAI,SAAS;IACb,MAAM,SAAS,MAAM,UAAU;KAC7B,MAAM,OAAO,KAAK,sBAAsB;KACxC,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,SAAS;IAClD,CAAC;IACD,MAAM,KAAK,IAAI,QAAQ,MAAM,CAAC;GAChC;GACA,SAAS;GACT,UAAU;GACV,UAAU,UAAU;IAClB,MAAM,QAAQ,MAAM;IACpB,MAAM,MAAM,MAAM;IAClB,MAAM,QAAQ,MAAM,kBAAkB,IAAI;IAC1C,MAAM,OAAO,QAAQ,KAAK,QAAQ,OAAO;IACzC,IAAI,KAAK,SAAS,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ;KAC1D,OAAO,MAAM,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;KACzC;IACF;IACA,OAAO,MAAM,QAAQ,IAAI,MAAM,GAAG,KAAK,GAAG,QAAQ,OAAO,CAAC,CAAC,MAAM;GACnE;GACA,YAAY,UAAU;IACpB,MAAM,QAAQ,MAAM;IACpB,MAAM,QAAQ,MAAM,kBAAkB,KAAK;IAC3C,MAAM,MAAM,MAAM,gBAAgB;IAClC,IAAI,MAAM,QAAQ,aAAa;KAC7B,MAAM,eAAe;KACrB,IAAI,QAAQ,CAAC,MAAM;KACnB,MAAM,OAAO,SAAS,MAAM,KAAK,IAAI,OAAO,GAAG,CAAC;KAChD,OAAO,MAAM,KAAK,MAAM;IAC1B,OAAO,IAAI,MAAM,QAAQ,eAAe,CAAC,MAAM,UAAU;KACvD,MAAM,eAAe;KACrB,MAAM,QAAQ,CAAC;IACjB,OAAO,IAAI,MAAM,QAAQ,gBAAgB,CAAC,MAAM,UAAU;KACxD,MAAM,eAAe;KACrB,MAAM,MAAM,QAAQ,IAAI,MAAM,QAAQ,CAAC;IACzC,OAAO,IAAI,MAAM,QAAQ,UAAU,CAAC,MAAM,UAAU;KAClD,MAAM,eAAe;KACrB,MAAM,CAAC;IACT,OAAO,IAAI,MAAM,QAAQ,SAAS,CAAC,MAAM,UAAU;KACjD,MAAM,eAAe;KACrB,MAAM,KAAK,MAAM;IACnB,OAAO,IACL,MAAM,IAAI,WAAW,KACrB,CAAC,MAAM,WACP,CAAC,MAAM,WACP,CAAC,MAAM,UACP,CAAC,QAAQ,MAAM,KAAK,GAAG,OAAO,GAE9B,MAAM,eAAe;GAEzB;GACA,UAAU,UAAU;IAClB,MAAM,OAAO,MAAM,eAAe,QAAQ,MAAM,KAAK;IACrD,IAAI,CAAC,MAAM;IACX,MAAM,eAAe;IACrB,IAAI,MAAM;IACV,MAAM,QAAQ,MAAM;IACpB,MAAM,QAAQ,MAAM,kBAAkB,KAAK;IAC3C,MAAM,MAAM,MAAM,gBAAgB;IAClC,MAAM,OAAO,SAAS,MAAM,MAAM,OAAO,KAAK,QAAQ,OAAO;IAC7D,MAAM,WAAW,QAAQ,MAAM,QAAQ,OAAO,CAAC,CAAC;IAChD,OACE,MACA,KAAK,WAAW,SACZ,SACA,KAAK,IAAI,QAAQ,UAAU,KAAK,MAAM,CAC5C;GACF;EACD,CAAA,CACE;;AAET;;;;ACpVA,SAAS,WACP,MACA,WACA,UACoB;CACpB,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,WAAW,IAAI,EAAE,IAAI,GAAG,WAAW;EACrE,MAAM,YAAY,OAAO,WAAW;EACpC,OAAO,aAAa,KAAK,aAAa,YAAY,YAAY;CAChE,CAAC,CAAC,CAAC,QAAQ,MAAmB,MAAM,IAAI;CACxC,MAAM,QAAQ,CAAC,mBAAG,IAAI,IAAI;EAAC;EAAG;EAAW,GAAG;CAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CAC1E,MAAM,UAA8B,CAAC;CACrC,IAAI,WAAW;CACf,KAAK,MAAM,SAAS,OAAO;EACzB,IAAI,QAAQ,WAAW,GAAG,QAAQ,KAAK,KAAK;EAC5C,QAAQ,KAAK,KAAK;EAClB,WAAW;CACb;CACA,OAAO;AACT;AAEA,SAAgB,WAAW,EACzB,MACA,WACA,cACA,WAAW,GACX,QACA,QAAQ,cACR,WACA,GAAG,SACe;CAClB,IAAI,YAAY,GAAG,OAAO;CAC1B,MAAM,UAAU,WAAW,MAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,CAAC;CAEjE,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,kBAAkB,SAAS;EACzC,cAAY;EAHd,UAAA,CAKE,qBAAC,MAAD;GAAI,WAAU;GAAd,UAAA;IACE,oBAAC,MAAD,EAAA,UACE,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,cAAW;KACX,UAAU,QAAQ;KAClB,eAAe,eAAe,OAAO,CAAC;KAEtC,UAAA,oBAAC,eAAD;MAAe,MAAM;MAAI,QAAO;KAAQ,CAAA;IAClC,CAAA,EACN,CAAA;IACH,QAAQ,KAAK,OAAO,UACnB,UAAU,QACR,oBAAC,MAAD;KAEE,WAAU;KACV,eAAY;KACb,UAAA;IAEG,GALG,OAAO,OAKV,IAEJ,oBAAC,MAAD,EAAA,UACG,UAAU,OACT,oBAAC,QAAD;KACE,WAAU;KACV,gBAAa;KAEZ,UAAA;IACG,CAAA,IAEN,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,cAAY,QAAQ;KACpB,eAAe,eAAe,KAAK;KAElC,UAAA;IACK,CAAA,EAER,GAlBK,QAAQ,OAkBb,CAER;IACA,oBAAC,MAAD,EAAA,UACE,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,cAAW;KACX,UAAU,QAAQ;KAClB,eAAe,eAAe,OAAO,CAAC;KAEtC,UAAA,oBAAC,gBAAD;MAAgB,MAAM;MAAI,QAAO;KAAQ,CAAA;IACnC,CAAA,EACN,CAAA;GACF;EACH,CAAA,GAAA,WAAW,KAAA,KACV,oBAAC,QAAD;GAAM,WAAU;GAA0B,UAAA,KAAK,MAAM;EAAQ,CAAA,CAE5D;;AAET;;;ACvFA,SAAgB,QAAQ,EACtB,SACA,UACA,MACA,cAAc,OACd,cACA,YAAY,WACZ,YAAY,SACZ,WAAW,OACX,SACA,aACe;CACf,MAAM,KAAK,MAAM;CACjB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAAoB,IAAI;CAC3C,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,WAAW;CACpE,MAAM,SAAS,QAAQ;CACvB,MAAM,UAAU,OAAO,MAAM;CAC7B,QAAQ,UAAU;CAClB,MAAM,EACJ,SACA,OACA,KAAK,eACH,YAA4B,QAAQ,MAAM;CAC9C,MAAM,WAAW,YAAY;CAC7B,yBAAyB;EACvB,WAAW,UACT,QAAQ,SAAS,cAA2B,uBAAuB,KACnE;CACJ,CAAC;CACD,mBAAmB,YAAY,YAAY,WAAW,UAAU;EAC9D,MAAM;EACN,OAAO;EACP,QAAQ;CACV,CAAC;CACD,MAAM,WAAW,SAAkB;EACjC,IAAI,SAAS,QAAQ,SAAS;EAC9B,QAAQ,UAAU;EAClB,YAAY,UAAU;EACtB,oBAAoB,IAAI;EACxB,eAAe,IAAI;CACrB;CAEA,gBAAgB;EACd,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY,SAAS;EAC9D,YAAY,UAAU;EACtB,MAAM,QAAQ,4BAA4B,UAAU,WAAW,OAAO,CAAC;EACvE,aAAa,qBAAqB,KAAK;CACzC,GAAG;EAAC;EAAQ;EAAS;CAAQ,CAAC;CAE9B,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,WAAW,SAAS,SAAS,MAAM,GAEpC,QAAQ,KAAK;EACjB;EACA,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,YAAY,MAAM,kBAAkB;GACtD,MAAM,SAAS,SAAS;GACxB,MAAM,SAAS,QAAQ,UAAU,WAAW,SAAS,SAAS,MAAM,CAAC;GACrE,QAAQ,KAAK;GACb,IAAI,QAAQ,aAAa,WAAW,OAAO;EAC7C;EACA,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,SAAS,iBAAiB,WAAW,aAAa;EAClD,aAAa;GACX,SAAS,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,WAAW,aAAa;EACvD;CACF,GAAG,CAAC,MAAM,CAAC;CAEX,MAAM,wBAAwB,UAAyB;EACrD,IACE,MAAM,QAAQ,eACd,MAAM,QAAQ,WACd,MAAM,QAAQ,KACd;GACA,MAAM,eAAe;GACrB,QAAQ,IAAI;GACZ;EACF;EACA,IACE,MAAM,QAAQ,SACd,CAAC,MAAM,YACP,UACA,WAAW,SACX;GACA,MAAM,eAAe;GACrB,UAAU,WAAW,OAAO;EAC9B;CACF;CAEA,MAAM,sBAAsB,UAC1B,eACE,OACA,WAAW,SACX,WAAW,SACX,QAAQ,eACF,QAAQ,KAAK,CACrB;CAEF,MAAM,eAAe;EACnB,WAAW;EACX,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB,SAAS,KAAK,KAAA;EAC/B,UAAU,YAAY,KAAA;EACtB,eAAe,QAAQ,CAAC,MAAM;EAC9B,WAAW;CACb;CAEA,OACE,qBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAG,eAAe,SAAS;EACtC,aAAW,UAAU,KAAA;EAHvB,UAAA,CAKG,eAAe,SAAS,OAAO,IAC9B,YAAY,SAAS,YAAY,IAEjC,oBAAC,UAAD;GAAQ,MAAK;GAAS,GAAI;GACvB,UAAA,KAAK,OAAO;EACP,CAAA,GAET,WACC,YACA,aACE,oBAAC,OAAD;GACM;GACJ,KAAK;GACL,WAAU;GACV,kBAAgB;GAChB,cAAY;GACZ,MAAK;GACL,cAAY;GACZ,UAAU;GACV,WAAW;GAEV,UAAA,KAAK,QAAQ;EACX,CAAA,GACL,SAAS,IACX,CACC;;AAET;;;AClJA,SAAgB,aAAa,EAC3B,UACA,aACA,SACA,OACA,cACA,eACA,QACA,QACA,WAAW,OACX,WACA,GAAG,SACiB;CACpB,MAAM,CAAC,cAAc,mBAAmB,SACtC,YACF;CACA,MAAM,WAAW,SAAS;CAC1B,MAAM,aAAa,GAAG,MAAM,EAAE;CAC9B,MAAM,SAAS,WAAW,KAAA;CAC1B,MAAM,UAAU,SACZ,aAAa,SACX,YACA,UACF,KAAA;CAEJ,MAAM,QAAQ,gBAAwB;EACpC,IAAI,UAAU,UAAU;EACxB,IAAI,UAAU,KAAA,GAAW,gBAAgB,WAAW;EACpD,gBAAgB,WAAW;CAC7B;CAEA,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,qBAAqB,SAAS;EAC5C,gBAAc;EAHhB,UAAA;GAKE,oBAAC,QAAD;IAAM,WAAU;IAA8B,IAAI;IAC/C,UAAA,KAAK,QAAQ;GACV,CAAA;GACL,gBAAgB,KAAA,KACf,oBAAC,QAAD;IAAM,WAAU;IACb,UAAA,KAAK,WAAW;GACb,CAAA;GAER,oBAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,mBAAiB;IAEhB,UAAA,QAAQ,KAAK,WAAW;KACvB,MAAM,iBAAiB,aAAa,OAAO;KAC3C,MAAM,WAAW,UAAU,OAAO,UAAU;KAU5C,OACE,qBAAC,UAAD;MAEE,MAAK;MACL,WAAU;MACV,gBAAc;MACd,gBAfkB,CAAC,SACnB,KAAA,IACA,WACE,iBACE,YACA,aACF,iBACE,UACA,KAAA;MAQJ,UAAU,YAAY,OAAO,YAAY;MACzC,eAAe,KAAK,OAAO,KAAK;MAPlC,UAAA,CASE,qBAAC,QAAD;OAAM,WAAU;OAA4B,eAAY;OAAxD,UAAA;QACE,oBAAC,WAAD;SACE,MAAM;SACN,QAAO;SACP,WAAU;QACX,CAAA;QACD,oBAAC,OAAD;SACE,MAAM;SACN,QAAO;SACP,WAAU;QACX,CAAA;QACD,oBAAC,QAAD,EAAM,WAAU,yBAA0B,CAAA;OACtC;MACN,CAAA,GAAA,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACE,oBAAC,QAAD;QAAM,WAAU;QACb,UAAA,KAAK,OAAO,KAAK;OACd,CAAA,GACL,OAAO,SAAS,KAAA,KACf,oBAAC,QAAD;QAAM,WAAU;QACb,UAAA,KAAK,OAAO,IAAI;OACb,CAAA,CAEJ;MACA,CAAA,CAAA;KA/BD,GAAA,OAAO,KA+BN;IAEZ,CAAC;GACE,CAAA;GACJ,WAAW,KAAA,KACV,oBAAC,OAAD;IAAK,WAAU;IAA6B,UAAA,KAAK,MAAM;GAAO,CAAA;EAE7D;;AAET;;;ACjHA,SAAgB,WAAW,EACzB,OACA,SACA,eACA,MACA,OACA,aACA,OAAO,MACP,cAAc,YACd,WAAW,OACX,aACkB;CAClB,MAAM,UAAU,MAAM;CACtB,MAAM,gBAAgB,cAAc,GAAG,QAAQ,gBAAgB,KAAA;CAE/D,OACE,qBAAC,YAAD;EACE,WAAW,GAAG,mBAAmB,SAAS;EAC1C,aAAW;EACX,oBAAkB;EACR;EACV,oBAAkB;EALpB,UAAA;GAOG,UAAU,KAAA,KACT,oBAAC,UAAD;IAAQ,WAAU;IAA2B,UAAA,KAAK,KAAK;GAAU,CAAA;GAElE,gBAAgB,KAAA,KACf,oBAAC,KAAD;IAAG,IAAI;IAAe,WAAU;IAC7B,UAAA,KAAK,WAAW;GAChB,CAAA;GAEL,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,QAAQ,KAAK,QAAQ,UAAU;KAC9B,MAAM,WAAW,GAAG,QAAQ,GAAG;KAC/B,MAAM,sBAAsB,OAAO,cAC/B,GAAG,SAAS,gBACZ,KAAA;KAEJ,OACE,qBAAC,SAAD;MAEE,WAAU;MACV,iBAAe,OAAO,YAAY,KAAA;MAHpC,UAAA;OAKE,oBAAC,SAAD;QACE,IAAI;QACJ,MAAK;QACC;QACN,OAAO,OAAO;QACd,SAAS,UAAU,OAAO;QAC1B,UAAU,YAAY,OAAO;QAC7B,oBAAkB;QAClB,gBAAgB,cAAc,OAAO,KAAK;OAC3C,CAAA;OACD,oBAAC,QAAD;QAAM,WAAU;QAA2B,eAAY;OAAQ,CAAA;OAC/D,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CACE,oBAAC,QAAD;SAAM,WAAU;SACb,UAAA,KAAK,OAAO,KAAK;QACd,CAAA,GACL,OAAO,gBAAgB,KAAA,KACtB,oBAAC,QAAD;SACE,IAAI;SACJ,WAAU;SAET,UAAA,KAAK,OAAO,WAAW;QACpB,CAAA,CAEJ;;MACD;KA5BA,GAAA,OAAO,KA4BP;IAEX,CAAC;GACE,CAAA;EACG;;AAEd;;;AClFA,SAAgB,OAAO,EACrB,UACA,UAAU,SACV,YAAY,MACZ,WAAW,GACX,QAAQ,GACR,QAAQ,UACR,OAAO,MACP,WACA,OACA,GAAG,SACW;CACd,MAAM,MAAM,OAAuB,IAAI;CACvC,MAAM,CAAC,OAAO,YAAY,SAAsC,MAAM;CAEtE,yBAAyB;EACvB,MAAM,UAAU,IAAI;EACpB,IAAI;EACJ,SAAS,QAAQ;EACjB,MAAM,aAAa;GACjB,IAAI,QAAQ,KAAK,WAAW,iBAAiB,SAAS,KAAK,IAAI,GAAG;IAChE,QAAQ,iBAAiB,SAAS,OAAO,GAAG,KAAK;IACjD;GACF;GACA,SAAS,OAAO;EAClB;EACA,IACE,YAAY,WACZ,CAAC,WACD,OAAO,yBAAyB,YAChC;GACA,KAAK;GACL,aAAa,aAAa,KAAK;EACjC;EACA,MAAM,WAAW,IAAI,sBAAsB,YAAY;GACrD,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,gBAAgB,KAAK;QAC1B,IAAI,CAAC,MAAM,SAAS,QAAQ;EAErC,CAAC;EACD,SAAS,QAAQ,OAAO;EACxB,aAAa;GACX,SAAS,WAAW;GACpB,aAAa,KAAK;EACpB;CACF,GAAG;EAAC;EAAS;EAAM;EAAO;CAAK,CAAC;CAEhC,MAAM,SACJ,cAAc,SACV;EAAE,GAAG;EAAO,GAAG;CAAM,IACrB,cAAc,OACZ;EAAE,GAAG;EAAO,GAAG,GAAG,SAAS;CAAI,IAC/B,cAAc,SACZ;EAAE,GAAG;EAAO,GAAG,IAAI,SAAS;CAAI,IAChC,cAAc,SACZ;EAAE,GAAG,GAAG,SAAS;EAAK,GAAG;CAAM,IAC/B;EAAE,GAAG,IAAI,SAAS;EAAK,GAAG;CAAM;CAE5C,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACT;EACL,WAAW,GAAG,cAAc,SAAS;EACrC,cAAY;EACZ,cAAY,UAAU,SAAS,KAAA,IAAY;EAC3C,OACE;GACE,GAAG;GACH,kBAAkB,OAAO;GACzB,kBAAkB,OAAO;EAC3B;EAGD,UAAA,KAAK,QAAQ;CACX,CAAA;AAET;;;AChEA,SAAS,YACP,SACA,OACA,WACA;CACA,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,KAAK,IAAI,OAAO,GAAG,QAAQ,QAAQ,QAAQ,QAAQ,GAAG;EACpD,MAAM,SAAS,QAAQ,OAAO,YAAY,QAAQ,UAAU,QAAQ;EACpE,IAAI,CAAC,QAAQ,MAAM,EAAE,UAAU,OAAO;CACxC;CACA,OAAO;AACT;AAEA,SAAgB,OAAO,EACrB,OACA,SACA,eACA,IACA,WACA,cAAc,oBACd,WACA,gBACA,WAAW,OACX,OAAO,QACO;CACd,MAAM,cAAc,MAAM;CAC1B,MAAM,YAAY,MAAM,cAAc;CACtC,MAAM,YAAY,GAAG,UAAU;CAC/B,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,gBAAgB,QAAQ,WAAW,WAAW,OAAO,UAAU,KAAK;CAC1E,MAAM,eAAe,QAAQ,WAAW,WAAW,CAAC,OAAO,QAAQ;CACnE,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,EACJ,SACA,OACA,KAAK,eACH,YAA4B,MAAM,MAAM;CAC5C,MAAM,WAAW,YAAY;CAC7B,mBAAmB,YAAY,YAAY,WAAW,UAAU;EAC9D,MAAM;EACN,OAAO;EACP,QAAQ;EACR,YAAY;CACd,CAAC;CACD,MAAM,CAAC,aAAa,kBAAkB,SACpC,iBAAiB,IAAI,gBAAgB,YACvC;CAEA,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,SAAS,UAAwB;GACrC,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,WAAW,SAAS,SAAS,MAAM,GAEpC,QAAQ,KAAK;EACjB;EACA,SAAS,iBAAiB,eAAe,KAAK;EAC9C,aAAa,SAAS,oBAAoB,eAAe,KAAK;CAChE,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,IAAI,CAAC,MACH,eAAe,iBAAiB,IAAI,gBAAgB,YAAY;CACpE,GAAG;EAAC;EAAc;EAAM;CAAa,CAAC;CAEtC,SAAS,OAAO,OAAe;EAC7B,MAAM,SAAS,QAAQ;EACvB,IAAI,CAAC,UAAU,OAAO,UAAU;EAChC,cAAc,OAAO,KAAK;EAC1B,QAAQ,KAAK;CACf;CAEA,SAAS,cAAc,OAA4B;EACjD,IAAI,MAAM,QAAQ,UAAU;GAC1B,IAAI,CAAC,MAAM;GACX,MAAM,eAAe;GACrB,QAAQ,KAAK;GACb;EACF;EACA,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GACxD,MAAM,eAAe;GACrB,MAAM,OAAO,YACX,SACA,aACA,MAAM,QAAQ,cAAc,IAAI,EAClC;GACA,QAAQ,IAAI;GACZ,IAAI,QAAQ,GAAG,eAAe,IAAI;GAClC;EACF;EACA,IAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,OAAO;GAC/C,MAAM,eAAe;GACrB,MAAM,OACJ,MAAM,QAAQ,SAAS,eAAe,YAAY,SAAS,GAAG,EAAE;GAClE,QAAQ,IAAI;GACZ,IAAI,QAAQ,GAAG,eAAe,IAAI;GAClC;EACF;EACA,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;GAC9C,MAAM,eAAe;GACrB,IAAI,MAAM,OAAO,WAAW;QACvB,QAAQ,IAAI;EACnB;CACF;CAEA,MAAM,WAAW,iBAAiB,IAAI,QAAQ,iBAAiB,KAAA;CAE/D,OACE,qBAAC,OAAD;EAAK,KAAK;EAAS,WAAW,GAAG,cAAc,SAAS;EAAG,aAAW;EAAtE,UAAA,CACE,qBAAC,UAAD;GACE,IAAI;GACJ,MAAK;GACL,KAAK;GACL,WAAU;GACV,cAAY;GACZ,mBAAiB;GACjB,iBAAc;GACd,iBAAe;GACf,iBAAe,OAAO,YAAY,KAAA;GAClC,yBACE,QAAQ,eAAe,IAAI,GAAG,UAAU,GAAG,gBAAgB,KAAA;GAE7D,UAAU,YAAY,eAAe;GACrC,eAAe,SAAS,YAAY,CAAC,OAAO;GAC5C,WAAW;GAfb,UAAA,CAiBE,oBAAC,QAAD;IAAM,WAAU;IACb,UAAA,KAAK,UAAU,SAAS,WAAW;GAChC,CAAA,GACN,oBAAC,eAAD;IAAe,WAAU;IAAoB,eAAY;GAAQ,CAAA,CAC3D;EAEP,CAAA,GAAA,WACC,YACA,aACE,oBAAC,OAAD;GACE,IAAI;GACJ,KAAK;GACL,MAAK;GACL,WAAU;GACV,cAAY;GAEX,UAAA,QAAQ,KAAK,QAAQ,UACpB,qBAAC,UAAD;IAEE,IAAI,GAAG,UAAU,GAAG;IACpB,MAAK;IACL,MAAK;IACL,iBAAe,UAAU;IACzB,UAAU,OAAO;IACjB,WAAU;IACV,eAAa,UAAU,eAAe,KAAA;IACtC,qBAAqB,CAAC,OAAO,YAAY,eAAe,KAAK;IAC7D,eAAe,OAAO,KAAK;IAV7B,UAAA,CAYE,oBAAC,QAAD,EAAA,UAAO,KAAK,OAAO,KAAK,EAAQ,CAAA,GAC/B,UAAU,iBACT,oBAAC,WAAD;KAAW,WAAU;KAAoB,eAAY;IAAQ,CAAA,CAEzD;GAfD,GAAA,OAAO,KAeN,CACT;EACE,CAAA,GACL,SAAS,IACX,CACC;;AAET;;;ACtLA,SAAgB,KAAK,EAAE,OAAO,OAAO,MAAM,WAAW,GAAG,SAAoB;CAC3E,OACE,qBAAC,OAAD;EAAK,GAAI,KAAK,KAAK;EAAG,WAAW,GAAG,YAAY,SAAS;EAAzD,UAAA;GACE,oBAAC,QAAD;IAAM,WAAU;IAAmB,UAAA,KAAK,KAAK;GAAQ,CAAA;GACrD,oBAAC,QAAD;IAAM,WAAU;IAAmB,UAAA,KAAK,KAAK;GAAQ,CAAA;GACpD,SAAS,KAAA,KACR,oBAAC,QAAD;IAAM,WAAU;IAAkB,UAAA,KAAK,IAAI;GAAQ,CAAA;EAElD;;AAET;AAUA,SAAgB,UAAU,EACxB,UACA,UAAU,GACV,WACA,OACA,GAAG,SACc;CACjB,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,kBAAkB,SAAS;EACzC,OACE;GACE,GAAG;GACH,sBAAsB,OAAO,OAAO;EACtC;EAGD,UAAA,KAAK,QAAQ;CACX,CAAA;AAET;AAUA,MAAM,UAAU,UAAkB;CAChC,MAAM,YAAY,KAAK,IAAI,KAAK;CAChC,MAAM,OAAO,OAAO,UAAU,SAAS,IACnC,OAAO,SAAS,IAChB,OAAO,KAAK,MAAM,YAAY,EAAE,IAAI,EAAE;CAC1C,OAAO,GAAG,QAAQ,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK;AACrD;AAEA,SAAgB,MAAM,EACpB,OACA,SAAS,QACT,WACA,GAAG,SACU;CACb,MAAM,YAAY,QAAQ,IAAI,OAAO,QAAQ,IAAI,SAAS;CAC1D,MAAM,OACJ,cAAc,OACV,cACA,cAAc,SACZ,gBACA;CACR,OACE,qBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,aAAa,SAAS;EACpC,kBAAgB;EAHlB,UAAA,CAKE,oBAAC,MAAD;GAAM,MAAM;GAAI,eAAY;EAAQ,CAAA,GACpC,oBAAC,gBAAD;GAAuB;GAAe;EAAS,CAAA,CAC3C;;AAEV;;;AC3EA,SAAS,aAAa,OAAkB;CACtC,OAAO,MAAM,MAAM,SAAS,CAAC,KAAK,QAAQ,CAAC,EAAE;AAC/C;AAEA,SAAgB,KAAK,EACnB,OACA,OACA,cACA,eACA,UACA,YAAY,QACZ,cAAc,cACd,aACY;CACZ,MAAM,cAAc,MAAM;CAC1B,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,gBAAgB,aAAa,KAAK,KAAK,EACzC;CACA,MAAM,cAAc,SAAS;CAC7B,MAAM,cAAc,KAAK,IACvB,GACA,MAAM,WAAW,SAAS,KAAK,UAAU,WAAW,CACtD;CACA,MAAM,aAAa,MAAM;CACzB,MAAM,YAAY,cAAsB;EACtC,qBAAqB,SAAS;EAC9B,gBAAgB,SAAS;CAC3B;CACA,MAAM,QAAQ,OAA4B,UAAkB;EAC1D,MAAM,YACJ,gBAAgB,aACZ,MAAM,QAAQ,cACZ,IACA,KACF,MAAM,QAAQ,eACZ,IACA;EACR,IACE,CAAC;GAAC;GAAa;GAAc;GAAW;EAAW,CAAC,CAAC,SAAS,MAAM,GAAG,GAEvE;EACF,MAAM,eAAe;EACrB,KAAK,IAAI,OAAO,GAAG,QAAQ,MAAM,QAAQ,QAAQ,GAAG;GAClD,MAAM,QAAQ,QAAQ,OAAO,YAAY,MAAM,UAAU,MAAM;GAC/D,IAAI,CAAC,MAAM,KAAK,EAAE,UAAU;IAC1B,SAAS,MAAM,KAAK,CAAC,KAAK;IAC1B,SAAS,eAAe,GAAG,YAAY,GAAG,MAAM,CAAC,EAAE,MAAM;IACzD;GACF;EACF;CACF;CACA,MAAM,UAAU,GAAG,YAAY;CAE/B,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,YAAY,SAAS;EAAG,oBAAkB;EAA7D,UAAA,CACE,oBAAC,OAAD;GACE,WAAU;GACV,MAAK;GACL,cAAY;GACZ,oBAAkB;GAEjB,UAAA,MAAM,KAAK,MAAM,UAAU;IAC1B,MAAM,WAAW,KAAK,UAAU;IAChC,OACE,oBAAC,UAAD;KAEE,IAAI,GAAG,YAAY,GAAG;KACtB,MAAK;KACL,MAAK;KACL,WAAU;KACV,iBAAe;KACf,iBAAe,WAAW,UAAU,KAAA;KACpC,UAAU,WAAW,IAAI;KACzB,UAAU,KAAK;KACf,iBAAe,YAAY,KAAA;KAC3B,eAAe,CAAC,KAAK,YAAY,SAAS,KAAK,KAAK;KACpD,YAAY,UAAU,KAAK,OAAO,KAAK;KAEtC,UAAA,KAAK,KAAK,KAAK;IACV,GAdD,KAAK,KAcJ;GAEZ,CAAC;EACE,CAAA,GACJ,eACE,WAAW,YAAY,KAAA,KAAa,aAAa,KAAA,MAChD,oBAAC,OAAD;GACE,IAAI;GAEJ,WAAU;GACV,MAAK;GACL,mBAAiB,GAAG,YAAY,GAAG;GAElC,UAAA,KAAK,WAAW,WAAW,QAAQ;EACjC,GANE,WAAW,YAAY,KAAA,IAAY,cAAc,QAMnD,CAEN;;AAET;;;ACxFA,MAAM,QAAsC;CAC1C,MAAM;CACN,OAAO;CACP,MAAM;AACR;AAEA,SAAgB,SAAS,EACvB,OACA,eACA,QAAQ,SACR,WACA,GAAG,SACa;CAChB,MAAM,SAAS,MAAM;CAErB,OACE,oBAAC,MAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,iBAAiB,SAAS;EACxC,cAAY;EAEX,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,QAAQ,KAAK,SAAS;GAC5B,MAAM,UAAU,GAAG,OAAO,SAAS;GACnC,OACE,qBAAC,MAAD;IAEE,WAAU;IACV,cAAY;IACZ,iBAAe,KAAK,YAAY,KAAA;IAJlC,UAAA;KAME,oBAAC,UAAD;MACE,MAAK;MACL,MAAK;MACL,WAAU;MACV,gBACE,UAAU,SAAS,OAAO,UAAU,UAAU,UAAU;MAE1D,mBAAiB;MACjB,UAAU,KAAK;MACf,eAAe,gBAAgB,KAAK,IAAI,MAAM,MAAM;MAEpD,UAAA,qBAAC,QAAD;OAAM,WAAU;OAAsB,eAAY;OAAlD,UAAA,CACE,oBAAC,WAAD;QACE,MAAM;QACN,QAAO;QACP,WAAU;OACX,CAAA,GACD,oBAAC,QAAD,EAAM,WAAU,qBAAsB,CAAA,CAClC;;KACA,CAAA;KACR,oBAAC,QAAD;MAAM,WAAU;MAAuB,IAAI;MACxC,UAAA,KAAK,KAAK,KAAK;KACZ,CAAA;KACL,KAAK,SAAS,KAAA,KACb,oBAAC,QAAD;MAAM,WAAU;MAAuB,UAAA,KAAK,KAAK,IAAI;KAAQ,CAAA;IAE7D;GA/BG,GAAA,KAAK,EA+BR;EAER,CAAC;CACC,CAAA;AAER;;;ACtEA,SAAgB,SAAS,EACvB,OACA,QAAQ,YACR,WACA,GAAG,SACa;CAChB,OACE,oBAAC,MAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,gBAAgB,SAAS;EACvC,cAAY;EAEX,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,OACJ,KAAK,SAAS,KAAA,KAAa,KAAK,SAAS,YACrC,KAAK,OACL,KAAA;GACN,OACE,qBAAC,MAAD;IAEE,WAAU;IACV,aAAW;IACX,gBAAc,KAAK,WAAW,KAAA;IAJhC,UAAA,CAME,oBAAC,QAAD;KAAM,WAAU;KAAuB,eAAY;KAChD,UAAA,KAAK,SAAS,KAAA,IACb,KAAK,KAAK,IAAI,IAEd,oBAAC,QAAD,EAAM,WAAU,oBAAqB,CAAA;IAEnC,CAAA,GACN,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAM,WAAU;OAAuB,UAAA,KAAK,KAAK,KAAK;MAAQ,CAAA,GAC7D,KAAK,cAAc,KAAA,KAClB,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,KAAK,KAAK,SAAS;MAChB,CAAA,CAEL;KACJ,CAAA,GAAA,KAAK,aAAa,KAAA,KACjB,oBAAC,OAAD;MAAK,WAAU;MAAsB,UAAA,KAAK,KAAK,QAAQ;KAAO,CAAA,CAE7D;IACH,CAAA,CAAA;GAzBG,GAAA,SAAS,OAyBZ;EAER,CAAC;CACC,CAAA;AAER;;;AC3DA,MAAM,aAAa;CACjB,SACE,oBAAC,QAAD;EAAM,WAAU;EACd,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;CAClB,CAAA;CAER,MACE,oBAAC,QAAD;EAAM,WAAU;EACd,UAAA,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;CACjB,CAAA;CAER,SACE,oBAAC,QAAD;EAAM,WAAU;EACd,UAAA,oBAAC,aAAD,EAAa,MAAM,GAAK,CAAA;CACpB,CAAA;CAER,OACE,oBAAC,QAAD;EAAM,WAAU;EACd,UAAA,oBAAC,OAAD,EAAO,MAAM,GAAK,CAAA;CACd,CAAA;AAEV;AAcA,SAAgB,MAAM,EACpB,OAAO,MACP,IACA,OACA,aACA,UAAU,WACV,QACA,UACA,cAAc,MACd,aACa;CACb,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,UAAyB;GAC7B;GACA;GACA;GACA,aAAa,KAAK,WAAW;GAC7B;GACA,WAAW,GAAG,aAAa,SAAS;GACpC,UAAU;EACZ;EACA,MAAM,UACJ,YAAY,YACR,MAAM,QAAQ,KAAK,KAAK,GAAG,OAAO,IAClC,YAAY,YACV,MAAM,QAAQ,KAAK,KAAK,GAAG,OAAO,IAClC,YAAY,WACV,MAAM,MAAM,KAAK,KAAK,GAAG,OAAO,IAChC,MAAM,KAAK,KAAK,GAAG,OAAO;EAEpC,aAAa;GACX,MAAM,QAAQ,OAAO;EACvB;CACF,GAAG;EAAC;EAAM;EAAI;EAAQ;EAAa;EAAU;EAAO;EAAa;CAAO,CAAC;CAEzE,OAAO;AACT;AAWA,SAAgB,cAAc,EAC5B,QAAQ,iBACR,WACA,cACA,QAAQ,UACR,WAAW,aACX,cAAc,MACd,SAAS,OACT,GAAG,SACkB;CACrB,OACE,oBAACE,SAAD;EACE,GAAI,KAAK,KAAK;EACP;EACG;EACG;EACb,OAAO;EACP,oBAAoB;EACZ;EACR,WAAW,GAAG,sBAAsB,SAAS;EAC7C,cAAc;GACZ,GAAG;GACH,aAAa,cAAc,eAAe;GAC1C,sBACE,cAAc,wBAAwB;GACxC,WAAW,GAAG,aAAa,cAAc,SAAS;GAClD,UAAU;EACZ;CACD,CAAA;AAEL;;;ACjHA,SAAgB,QAAQ,EACtB,QAAQ,WACR,cAAc,cACd,OAAO,MACP,OACA,KACA,UACA,WACA,GAAG,SACY;CACf,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,eAAe,SAAS;EACtC,oBAAkB;EAClB,aAAW;EACX,MAAK;EACL,cAAY;EACZ,oBAAkB;EAPpB,UAAA;GASG,UAAU,KAAA,KACT,oBAAC,OAAD;IAAK,WAAU;IAAsB,UAAA,KAAK,KAAK;GAAO,CAAA;GAEvD,aAAa,KAAA,KACZ,oBAAC,OAAD;IAAK,WAAU;IAAwB,UAAA,KAAK,QAAQ;GAAO,CAAA;GAE5D,QAAQ,KAAA,KAAa,oBAAC,OAAD;IAAK,WAAU;IAAoB,UAAA,KAAK,GAAG;GAAO,CAAA;EACrE;;AAET;;;ACrCA,MAAa,cAA4B;CACvC,WAAW,KAAK,IAAI;CACpB,MAAM,UAAU,OAAO,WAAW,UAAU,EAAE;CAC9C,QAAQ,WAAW,aAAa,MAAuC;AACzE;AAgBA,SAAgB,mBACd,QAAA,KACA,YAAA,KACA,QAAsB,aACH;CACnB,IAAI,SAA+B;CACnC,IAAI,WAAW,OAAO;CACtB,MAAM,QAA2B;EAC/B;EACA;EACA,cAAc,WAAW,QAAQ,MAAM,IAAI,IAAI,WAAW,MAAM;EAChE,OAAO,QAAQ;GACb,MAAM,WAAW;GACjB,SAAS;GACT,IAAI,YAAY,aAAa,QAAQ,SAAS,QAAQ;EACxD;EACA,OAAO,QAAQ;GACb,IAAI,WAAW,QAAQ,SAAS;GAChC,WAAW,MAAM,IAAI;EACvB;CACF;CACA,OAAO;AACT;AAkBA,SAAgB,wBAAwB,EACtC,UACA,UACA,QAAQ,aACR,QAAA,OAMoB;CACpB,IAAI,UAAU;CACd,IAAI;CACJ,IAAI;CACJ,IAAI,QAAkC;CAEtC,MAAM,mBAAmB;EACvB,IAAI,cAAc,KAAA,GAAW,MAAM,MAAM,SAAS;EAClD,YAAY,KAAA;CACd;CACA,MAAM,oBAAoB;EACxB,IAAI,eAAe,KAAA,GAAW,MAAM,MAAM,UAAU;EACpD,aAAa,KAAA;CACf;CACA,MAAM,SAAwB,EAAE,eAAe,KAAK,EAAE;CAEtD,SAAS,KAAK,MAAe;EAC3B,WAAW;EACX,YAAY;EACZ,IAAI,SAAS;EACb,UAAU;EACV,QAAQ,SAAS,CAAC,CAAC;EACnB,SAAS,MAAM,IAAI;EACnB,OAAO,OAAO,MAAM;CACtB;CAEA,SAAS,OAAO;EACd,WAAW;EACX,YAAY;EACZ,IAAI,CAAC,SAAS;EACd,UAAU;EACV,SAAS,OAAO,KAAK;EACrB,OAAO,OAAO,MAAM;EACpB,QAAQ;CACV;CAEA,OAAO;EACL,IAAI,UAAU;GACZ,OAAO;EACT;EACA,QAAQ;GACN,MAAM,EAAE,OAAO,UAAU,OAAO,YAAY,SAAS;GACrD,IAAI,UAAU;GACd,YAAY;GACZ,IAAI,WAAW,cAAc,KAAA,GAAW;GACxC,MAAM,OAAO,SAAS,OAAO,KAAK;GAClC,MAAM,OAAO,OAAO,IAAI;GACxB,IAAI,QAAQ,GAAG;IACb,KAAK,IAAI;IACT;GACF;GACA,YAAY,MAAM,UAAU;IAC1B,YAAY,KAAA;IACZ,KAAK,KAAK;GACZ,GAAG,IAAI;EACT;EACA,QAAQ;GACN,WAAW;GACX,IAAI,CAAC,WAAW,eAAe,KAAA,GAAW;GAC1C,aAAa,MAAM,UAAU;IAC3B,aAAa,KAAA;IACb,KAAK;GACP,GAAG,KAAK;EACV;EACA,OAAO;GACL,YAAY;EACd;EACA,SAAS;EACT,QAAQ,KAAK;GACX,IAAI,QAAQ,YAAa,CAAC,WAAW,cAAc,KAAA,GACjD,OAAO;GACT,KAAK;GACL,OAAO;EACT;EACA,UAAU;GACR,WAAW;GACX,YAAY;GACZ,IAAI,CAAC,SAAS;GACd,UAAU;GACV,OAAO,OAAO,MAAM;GACpB,QAAQ;EACV;CACF;AACF;AAEA,SAAgB,iBACd,UACA,IACoB;CACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;AACrD;;;AC7HA,MAAM,sBAAsB,cAAwC,IAAI;AAExE,SAAgB,aAAa,EAC3B,QAAA,KACA,YAAA,KACA,YACoB;CACpB,MAAM,CAAC,SAAS,eAAe,mBAAmB,OAAO,SAAS,CAAC;CACnE,MAAM,QAAQ;CACd,MAAM,YAAY;CAClB,OACE,oBAAC,oBAAoB,UAArB;EAA8B,OAAO;EAClC,UAAA,KAAK,QAAQ;CACc,CAAA;AAElC;AAIA,SAAgB,QAAQ,EACtB,SACA,UACA,OAAO,OACP,OACA,WAAW,OACX,aACe;CACf,MAAM,KAAK,MAAM;CACjB,MAAM,QAAQ,WAAW,mBAAmB;CAC5C,MAAM,aAAa,OAAwB,IAAI;CAC/C,MAAM,WAAW,OAAwB;EACvC,OAAA;EACA;EACA;CACF,CAAC;CACD,SAAS,UAAU;EACjB,OAAO,SAAS,OAAO,SAAA;EACvB;EACA;CACF;CACA,MAAM,CAAC,OAAO,YAAY,SAAS;EAAE,SAAS;EAAO,MAAM;CAAM,CAAC;CAClE,MAAM,CAAC,cAAc,eACnB,wBAAwB;EACtB,gBAAgB,SAAS;EACzB,WAAW,SAAS,SAAS,SAAS;GAAE;GAAS;EAAK,CAAC;CACzD,CAAC,CACH;CACA,MAAM,EAAE,SAAS,SAAS;CAC1B,MAAM,EACJ,SACA,OACA,KAAK,eACH,YAA6B,SAAS,MAAM;CAChD,MAAM,WAAW,YAAY;CAC7B,mBAAmB,YAAY,YAAY,WAAW,UAAU;EAC9D;EACA,OAAO;EACP,QAAQ;CACV,CAAC;CAED,sBAAsB,WAAW,QAAQ,GAAG,CAAC,UAAU,CAAC;CAExD,gBAAgB;EACd,IAAI,UAAU,WAAW,QAAQ;CACnC,GAAG,CAAC,UAAU,UAAU,CAAC;CAEzB,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,iBAAiB,UAAoC;GACzD,WAAW,QAAQ,MAAM,GAAG;EAC9B;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,aAAa,SAAS,oBAAoB,WAAW,aAAa;CACpE,GAAG,CAAC,SAAS,UAAU,CAAC;CAExB,MAAM,cAAc,UAAU,KAAK,KAAA;CACnC,MAAM,YACJ,eAA4B,QAAQ,KAAK,SAAS,SAAS;CAC7D,MAAM,UAAU,YACZ,aAAa,UAAU,EACrB,oBAAoB,iBAClB,SAAS,MAAM,qBACf,WACF,EACF,CAAC,IACD,KAAK,QAAQ;CAEjB,OACE,qBAAC,QAAD;EACE,WAAW,GAAG,eAAe,SAAS;EACtC,cAAc,WAAW;EACzB,cAAc,WAAW;EACzB,SAAS,WAAW;EACpB,QAAQ,WAAW;EACnB,YAAY,UAAU,WAAW,QAAQ,MAAM,GAAG;EANpD,UAAA,CAQE,oBAAC,QAAD;GACE,KAAK;GACL,WAAU;GACV,oBAAkB,YAAY,KAAA,IAAY;GAEzC,UAAA;EACG,CAAA,GACL,WACC,YACA,aACE,oBAAC,QAAD;GACM;GACJ,KAAK;GACL,WAAU;GACV,aAAW;GACX,cAAY;GACZ,aAAW,QAAQ,KAAA;GACnB,MAAK;GACL,cAAc,WAAW;GACzB,cAAc,WAAW;GAExB,UAAA,KAAK,OAAO;EACT,CAAA,GACN,SAAS,IACX,CACE;;AAEV;;;;;;;AChKA,SAAgB,UAAU,KAAa,KAAa,QAAQ,GAAa;CACvE,IAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,KAC3D,OAAO,CAAC,GAAG;CAEb,MAAM,WAAW,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK;CAC/C,MAAM,YAAY,MAAM,KAAK,MAAM,KAAK,MAAM,OAAO,CAAC;CACtD,MAAM,aAAa,UAAU;CAC7B,MAAM,QACH,cAAc,IACX,IACA,cAAc,IACZ,IACA,cAAc,MACZ,MACA,cAAc,IACZ,IACA,MAAM;CAClB,MAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,IAAI;CACtC,MAAM,QAAkB,CAAC;CACzB,KAAK,IAAI,QAAQ,OAAO,SAAS,MAAM,OAAO,KAAM,SAAS,MAC3D,MAAM,KAAK,KAAK,MAAM,QAAQ,IAAI,IAAI,IAAI;CAE5C,OAAO;AACT;;AAGA,SAAgB,YACd,WACA,WACA,WAAW,GACX,WAAW,KACgB;CAC3B,MAAM,OAAO,YAAY,aAAa;CACtC,QAAQ,UACN,YAAa,QAAQ,aAAa,QAAS,WAAW;AAC1D;;AAGA,SAAgB,KACd,QACuC;CACvC,MAAM,WAAkD,CAAC;CACzD,IAAI,UAAsD;CAC1D,OAAO,SAAS,OAAO,UAAU;EAC/B,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW;GACzC,UAAU;GACV;EACF;EACA,IAAI,CAAC,SAAS;GACZ,UAAU;IAAE,OAAO;IAAO,QAAQ,CAAC;GAAE;GACrC,SAAS,KAAK,OAAO;EACvB;EACA,QAAQ,OAAO,KAAK,KAAK;CAC3B,CAAC;CACD,OAAO;AACT;AAEA,MAAM,SAAS,MAAc,KAAK,MAAM,IAAI,GAAG,IAAI;;AAGnD,SAAgB,SAAS,QAA4B,SAAS,OAAe;CAC3E,IAAI,OAAO,WAAW,GAAG,OAAO;CAChC,MAAM,QAAQ,OAAO;CACrB,IAAI,OAAO,WAAW,GAAG,OAAO,IAAI,MAAM,MAAM,EAAE,EAAE,GAAG,MAAM,MAAM,EAAE;CACrE,IAAI,CAAC,QACH,OAAO,OACJ,KACE,CAAC,GAAG,IAAI,UAAU,GAAG,UAAU,IAAI,MAAM,MAAM,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GACrE,CAAC,CACA,KAAK,GAAG;CAGb,IAAI,OAAO,IAAI,MAAM,MAAM,EAAE,EAAE,GAAG,MAAM,MAAM,EAAE;CAChD,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG;EACzD,MAAM,KAAK,OAAO,QAAQ,MAAM,OAAO;EACvC,MAAM,KAAK,OAAO;EAClB,MAAM,KAAK,OAAO,QAAQ;EAC1B,MAAM,KAAK,OAAO,QAAQ,MAAM;EAChC,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM;EACtC,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM;EACtC,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM;EACtC,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM;EACtC,QAAQ,KAAK,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE,GAAG,MAAM,GAAG,EAAE;CAClG;CACA,OAAO;AACT;;AAGA,SAAgB,SACd,QACA,WACA,SAAS,OACD;CACR,IAAI,OAAO,WAAW,GAAG,OAAO;CAChC,MAAM,OAAO,SAAS,QAAQ,MAAM;CACpC,MAAM,QAAQ,OAAO;CACrB,MAAM,MAAM,OAAO,OAAO,SAAS;CACnC,OAAO,GAAG,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,MAAM,SAAS,EAAE,IAAI,MAAM,MAAM,EAAE,EAAE,GAAG,MAAM,SAAS,EAAE;AAC/F;;AAGA,SAAgB,QACd,WACA,aACA,OACA,aACiC;CACjC,MAAM,OAAO,MAAM,KAAK,IAAI,GAAG,KAAK;CACpC,MAAM,MAAM,OAAO;CAEnB,MAAM,QADQ,OAAO,OACA,KAAK,IAAI,GAAG,WAAW;CAC5C,MAAM,QAAQ,OAAO;CACrB,MAAM,OACJ,OAAO,YAAY,MAAM,IAAI,OAAO,eAAe,OAAO,SAAS;CACrE,OAAO;EAAE,MAAM,MAAM,IAAI;EAAG,OAAO,MAAM,KAAK;CAAE;AAClD;;;;AC9EA,MAAM,UAAU;CAAC;CAAU;CAAW;CAAS;AAAQ;AAEvD,MAAM,WAA6D;CACjE,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,OAAO;AACT;AAEA,MAAM,iBAAiB,UACrB,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,EAAE;AAE9E,SAAgB,MAAM,EACpB,YACA,QACA,UAAU,QACV,SAAS,KACT,SAAS,OACT,QAAQ,GACR,SAAS,eACT,QACA,OACA,WACA,GAAG,SACU;CACb,MAAM,aAAa,MAAM;CACzB,MAAM,aAAa,sBAAsB,WAAW,QAAQ,OAAO,EAAE;CACrE,MAAM,CAAC,QAAQ,aAAa,yBAA8B,IAAI,IAAI,CAAC;CACnE,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CAEtD,MAAM,QAAQ,KAAK,IAAI,GAAG,WAAW,MAAM;CAC3C,MAAM,UAAU,MAAM;CACtB,MAAM,QAAQ,WAAmB,QAAQ,MAAO;CAChD,MAAM,eAAe,YAAY;CACjC,MAAM,aAAa,UAAU,OAAO,SAAS;CAE7C,MAAM,WAAW,OAAO,KAAK,OAAO,WAAW;EAC7C,GAAG;EACH;EACA,MAAM,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;CAC9C,EAAE;CACF,MAAM,QAAQ,SAAS,QAAQ,GAAG,UAAU,CAAC,OAAO,IAAI,KAAK,CAAC;CAE9D,MAAM,SAAS,MAAM,SAAS,UAC5B,MAAM,OAAO,QAAQ,UAA2B,SAAS,IAAI,CAC/D;CACA,MAAM,UAAU,OAAO,SAAS,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;CAC1D,MAAM,UAAU,eACZ,IACA,OAAO,SAAS,IACd,KAAK,IAAI,GAAG,MAAM,IAClB;CAEN,MAAM,WAAW,UAAU,SAAS,SAAS,KAAK;CAClD,MAAM,WAAW,SAAS,SAAS,SAAS,MAAM;CAClD,MAAM,YAAY,SAAS,MAAM;CACjC,MAAM,YAAY,KAAK,IAAI,SAAS,SAAS;CAC7C,IAAI,YAAY,KAAK,IAAI,SAAS,QAAQ;CAC1C,IAAI,aAAa,WAAW,YAAY,YAAY;CACpD,MAAM,QAAQ,YAAY,WAAW,WAAW,GAAG,GAAG;CACtD,MAAM,UAAU,UAAkB,MAAM,MAAM,KAAK;CAEnD,MAAM,aAAa,UACjB,KAAK,MAAM,MAAM,CAAC,CAAC,KAAK,YACtB,QAAQ,OAAO,KAAK,OAAO,WAAW,CACpC,KAAK,QAAQ,QAAQ,MAAM,GAC3B,OAAO,KAAK,CACd,CAAC,CACH;CAEF,MAAM,UAAU,UAAkB;EAChC,WAAW,YAAY;GACrB,MAAM,OAAO,IAAI,IAAI,OAAO;GAC5B,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,OAAO,KAAK;QACjC,KAAK,IAAI,KAAK;GACnB,OAAO;EACT,CAAC;CACH;CAEA,MAAM,UACJ,SACA,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,QAAQ,MAAM,CAAC,EAAE,aACnD,OAAO,SAAS,IACb,GAAG,OAAO,KAAK,UAAU,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,UAAU,WAAW,OAAO,gBAC5E;CAER,MAAM,SACJ,UAAU,OACN,KAAA,IACC,MAAM,MAAM,UAAU,MAAM,OAAO,UAAU,IAAI,KAAK,MAAM;CACnE,MAAM,cAAc,UAAU,QAAQ,SAAS,OAAO,OAAO,SAAS;CACtE,MAAM,YAAY,eAAe,OAAO,OAAO,WAAW,IAAI;CAC9D,MAAM,WAAW,UAAU,OAAO,KAAK,KAAK,KAAK;CAEjD,MAAM,cAAc,KAAK,IACvB,GACA,GAAG,SAAS,KAAK,SAAS,OAAO,IAAI,CAAC,CAAC,MAAM,CAC/C;CAEA,OACE,qBAAC,UAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,aAAa,SAAS;EACpC,gBAAc;EAHhB,UAAA,CAKG,cACC,oBAAC,cAAD;GAAY,WAAU;GAAoB,cAAW;GAClD,UAAA,OAAO,KAAK,OAAO,UAAU;IAC5B,MAAM,WAAW,OAAO,IAAI,KAAK;IACjC,OACE,qBAAC,UAAD;KAEE,MAAK;KACL,WAAU;KACV,gBAAc,CAAC;KACf,eAAa,YAAY,KAAA;KACzB,eAAe,OAAO,KAAK;KAN7B,UAAA,CAQE,oBAAC,QAAD;MACE,WAAU;MACV,OAAO,EAAE,YAAY,SAAS,SAAS,MAAM,CAAC,MAAM;MACpD,eAAY;KACb,CAAA,GACA,MAAM,IACD;IAbD,GAAA,UAAU,MAAM,KAAK,GAAG,OAavB;GAEZ,CAAC;EACS,CAAA,GAEd,qBAAC,OAAD;GACE,WAAU;GACV,MAAK;GACL,cAAY;GACZ,OAAO,EAAE,kBAAkB,GAAG,OAAO,SAAS;GAJhD,UAAA;IAME,oBAAC,OAAD;KACE,WAAU;KACV,OAAO;MAAE,OAAO,QAAQ,YAAY;MAAY,UAAU;KAAO;KAEhE,UAAA,SAAS,KAAK,SACb,oBAAC,QAAD;MAAwB,OAAO,EAAE,QAAQ,GAAG,MAAM,IAAI,EAAE,GAAG;MACxD,UAAA,OAAO,IAAI;KACR,GAFK,KAAK,MAEV,CACP;IACE,CAAA;IACL,qBAAC,OAAD;KACE,WAAU;KACV,OACE;MACE,sBAAsB;MACtB,iBAAiB,GAAG,SAAS;MAC7B,iBAAiB,GAAG,UAAU;KAChC;KAEF,gBAAgB,UAAU;MACxB,MAAM,OAAO,MAAM,cAAc,sBAAsB;MACvD,MAAM,QACJ,KAAK,QAAQ,KAAK,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAQ;MAC9D,SACE,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,CAC5D;KACF;KACA,sBAAsB,SAAS,IAAI;KAjBrC,UAAA;MAmBE,oBAAC,OAAD;OAAK,WAAU;OAAkB,eAAY;OAC1C,UAAA,SAAS,KAAK,SACb,oBAAC,KAAD,EAAqB,OAAO,EAAE,QAAQ,GAAG,MAAM,IAAI,EAAE,GAAG,EAAI,GAApD,KAAK,MAA+C,CAC7D;MACE,CAAA;MAEJ,YAAY,QACX,oBAAC,OAAD;OAAK,WAAU;OACZ,UAAA,WAAW,KAAK,GAAG,SAClB,oBAAC,OAAD;QAEE,WAAU;QACV,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG;QAE7B,UAAA,MAAM,KAAK,OAAO,aAAa;SAC9B,MAAM,QAAQ,MAAM,OAAO;SAC3B,IAAI,SAAS,MAAM,OAAO;SAC1B,MAAM,OAAO,QAAQ,GAAG,UAAU,GAAG,MAAM,MAAM;SACjD,OACE,oBAAC,OAAD;UAEE,WAAU;UACV,OAAO;WACL,MAAM,GAAG,KAAK,KAAK;WACnB,OAAO,GAAG,KAAK,MAAM;WACrB,QAAQ,GAAG,MAAM,KAAK,EAAE;WACxB,YAAY,SAAS,MAAM;UAC7B;SACD,GARM,OAAO,MAAM,KAAK,GAAG,MAAM,MAQjC;QAEL,CAAC;OACE,GArBE,QAAQ,MAqBV,CACN;MACE,CAAA,IAEL,oBAAC,OAAD;OAAK,WAAU;OACb,UAAA,qBAAC,OAAD;QAAK,SAAQ;QAAc,qBAAoB;QAA/C,UAAA;SACG,YAAY,UACX,oBAAC,QAAD,EAAA,UACG,MAAM,KAAK,UACV,qBAAC,kBAAD;UAEE,IAAI,GAAG,WAAW,IAAI,MAAM;UAC5B,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UANL,UAAA,CAQE,oBAAC,QAAD;WACE,QAAO;WACP,OAAO;YACL,WAAW,SAAS,MAAM;YAC1B,aAAa;WACf;UACD,CAAA,GACD,oBAAC,QAAD;WACE,QAAO;WACP,OAAO;YACL,WAAW,SAAS,MAAM;YAC1B,aAAa;WACf;UACD,CAAA,CACa;SArBT,GAAA,QAAQ,MAAM,OAqBL,CACjB,EACG,CAAA;SAEP,YAAY,UACX,MAAM,KAAK,UACT,UAAU,KAAK,CAAC,CAAC,KAAK,QAAQ,iBAC5B,oBAAC,QAAD;UAEE,GAAG,SAAS,QAAQ,KAAK,MAAM;UAC/B,MAAM,QAAQ,WAAW,IAAI,MAAM,MAAM;SAC1C,GAHM,QAAQ,MAAM,MAAM,GAAG,cAG7B,CACF,CACH;SACD,MAAM,KAAK,UACV,UAAU,KAAK,CAAC,CAAC,KAAK,QAAQ,iBAC5B,oBAAC,QAAD;UAEE,WAAU;UACV,GAAG,SAAS,QAAQ,MAAM;UAC1B,MAAK;UACL,QAAQ,SAAS,MAAM;UACvB,aAAa;UACb,eAAc;UACd,gBAAe;UACf,cAAa;SACd,GATM,QAAQ,MAAM,MAAM,GAAG,cAS7B,CACF,CACH;QACG;;MACF,CAAA;MAGP,oBAAC,QAAD;OAAM,WAAU;OAAoB,eAAY;MAAQ,CAAA;MAEvD,UAAU,QACT,qBAAA,YAAA,EAAA,UAAA;OACG,YAAY,QACX,oBAAC,OAAD;QAEE,WAAU;QACV,OAAO;SACL,MAAM,GAAG,QAAQ,QAAQ;SACzB,OAAO,GAAG,QAAQ;QACpB;QACA,eAAY;OACb,GAPM,QAAQ,OAOd,IAED,oBAAC,OAAD;QAEE,WAAU;QACV,OAAO,EAAE,MAAM,GAAG,KAAK,KAAK,EAAE,GAAG;QACjC,eAAY;OACb,GAJM,SAAS,OAIf;OAEF,YAAY,SACX,MAAM,KAAK,UAAU;QACnB,MAAM,QAAQ,MAAM,OAAO;QAC3B,IAAI,SAAS,MAAM,OAAO;QAC1B,OACE,oBAAC,QAAD;SAEE,WAAU;SACV,OAAO;UACL,MAAM,GAAG,KAAK,KAAK,EAAE;UACrB,KAAK,GAAG,OAAO,KAAK,EAAE;UACtB,YAAY,SAAS,MAAM;SAC7B;SACA,eAAY;QACb,GARM,OAAO,MAAM,GAAG,MAAM,KAAK,GAAG,MAAM,MAQ1C;OAEL,CAAC;OACF,WAAW,KAAA,KACV,oBAAC,OAAD;QAA0B,WAAU;QAClC,UAAA,qBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,oBAAC,QAAD;UAAM,WAAU;UACb,UAAA,WAAW;SACR,CAAA,GACL,MAAM,KAAK,UAAU;UACpB,MAAM,QAAQ,MAAM,OAAO;UAC3B,OACE,qBAAC,QAAD;WAEE,WAAU;WAFZ,UAAA;YAIE,oBAAC,KAAD;aACE,OAAO,EAAE,YAAY,SAAS,MAAM,MAAM;aAC1C,eAAY;YACb,CAAA;YACD,oBAAC,QAAD,EAAA,UAAO,MAAM,KAAW,CAAA;YACxB,oBAAC,KAAD,EAAA,UAAI,SAAS,OAAO,MAAM,OAAO,KAAK,EAAK,CAAA;WACvC;UATC,GAAA,WAAW,MAAM,KAAK,GAAG,MAAM,MAShC;SAEV,CAAC,CACE;;OACF,GAtBK,OAAO,OAsBZ;MAEP,EAAA,CAAA;KAED;;IACL,oBAAC,OAAD;KAAK,WAAU;KACZ,UAAA,WAAW,KAAK,UAAU,UACzB,oBAAC,QAAD;MAEE,OAAO,EAAE,MAAM,OAAO,QAAQ,GAAG;MAEhC,UAAA;KACG,GAJC,KAAK,SAAS,GAAG,OAIlB,CACP;IACE,CAAA;GACF;EACC,CAAA,CAAA;;AAEZ;;;;AC1TA,SAAS,OAAO,SAA6B,WAAmB;CAC9D,IAAI,CAAC,SAAS;CACd,QAAQ,UAAU,OAAO,SAAS;CAClC,QAAa;CACb,QAAQ,UAAU,IAAI,SAAS;AACjC;AAEA,SAAS,cAAc,MAA2B;CAChD,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AACvD;AAEA,SAAS,WAAW,MAAmB,UAA0B;CAC/D,MAAM,QAAQ,cAAc,IAAI;CAChC,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,KAAK,UAAU,YAAY,KAAK,OAAO,OAAO,KAAK;CAC9D,OAAO;AACT;AAEA,SAAS,cAAc,SAAuB,QAAwB;CACpE,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,QAAQ,SAAS,CAAC;CAC9D,MAAM,WAAW,UAAkB,CAAC,QAAQ,MAAM,EAAE,KAAK;CACzD,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC3B,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAC3D,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC7B,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAC1C,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC7B,OAAO;AACT;AAEA,SAAgB,eAAe,EAC7B,MACA,cACA,OACA,UACA,cAAc,6BACd,eAAe,eACf,YAAY,QACZ,YAAY,mBACZ,SAAS,OACT,aACsB;CACtB,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,OAAoB,IAAI;CACxC,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,eAAe,OAAwB,IAAI;CACjD,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,qBAAqB,OAAsB,IAAI;CACrD,MAAM,gBAAgB,OAA4B,IAAI;CACtD,MAAM,CAAC,MAAM,WAAW,SAAwB,CAAC,CAAC;CAClD,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,aAAa,aAAa,SAAS,CAAC;CAC3C,MAAM,EACJ,SACA,OACA,KAAK,gBACH,YAA4B,MAAM,QAAQ;CAC9C,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,WAAW;CAE3B,aAAa,SAAS,SAAS,QAAQ;CAEvC,MAAM,aACJ,KAAK,SAAS,IAAK,KAAK,KAAK,SAAS,EAAE,EAAE,YAAY,CAAC,IAAK;CAE9D,MAAM,EAAE,UAAU,YAAY,cAAc;EAC1C,MAAM,QAAQ,UAAuB;GACnC,OAAO,cAAc,IAAI;GACzB,UAAU,CACR,KAAK,YAAY,IACjB,IAAI,KAAK,YAAY,CAAC,EAAA,CAAG,KAAK,UAAU,cAAc,KAAK,CAAC,CAC9D,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EACb;EACA,MAAM,WAAW,YAAY,YAAY,OAAO,IAAI;EACpD,MAAM,YAAY,SAAS,QACxB,UAAU,MAAM,KAAK,UAAU,KAAA,CAClC;EAQA,MAAM,UAAU,CANd,GAAG,IAAI,IACL,SACG,KAAK,UAAU,MAAM,KAAK,KAAK,CAAC,CAChC,QAAQ,SAAyB,SAAS,KAAA,CAAS,CACxD,CAEuB,CAAC,CAAC,KAAK,UAAU;GACxC,SAAS;GACT,SAAS,SAAS,QAAQ,UAAU,MAAM,KAAK,UAAU,IAAI;EAC/D,EAAE;EACF,MAAM,MAAM,CACV,GAAI,UAAU,SAAS,IACnB,CAAC;GAAE,SAAS,KAAA;GAAW,SAAS;EAAU,CAAC,IAC3C,CAAC,GACL,GAAG,OACL;EACA,IAAI,QAAQ;EACZ,MAAM,QAAmB,IAAI,KAAK,aAAa;GAC7C,SAAS,QAAQ;GACjB,SAAS,QAAQ,QAAQ,KAAK,WAAW;IACvC,MAAM,MAAM;IACZ,SAAS,MAAM;IACf,UAAU,GAAG,OAAO,UAAU;IAC9B,OAAO;GACT,EAAE;EACJ,EAAE;EACF,OAAO;GAAE,UAAU;GAAO,SAAS,MAAM,SAAS,MAAM,EAAE,OAAO;EAAE;CACrE,GAAG;EAAC;EAAY;EAAQ;CAAK,CAAC;CAE9B,MAAM,SAAS,cAAc,SAAS,WAAW;CAEjD,MAAM,cAAc,aAAa,KAAK;CAEtC,MAAM,YAAY,UAAkB;EAClC,MAAM,OAAO,QAAQ,MAAM,EAAE;EAC7B,IAAI,CAAC,QAAQ,KAAK,UAAU;EAC5B,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;GAC7C,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC;GACvB,SAAS,EAAE;GACX;EACF;EACA,WAAW,IAAI;EACf,MAAM;CACR;CAEA,MAAM,QAAQ,cAAsB;EAClC,IAAI,QAAQ,WAAW,GAAG;EAC1B,IAAI,QAAQ,SAAS,IAAI,IAAI;EAC7B,KAAK,IAAI,OAAO,GAAG,OAAO,QAAQ,QAAQ,QAAQ,GAAG;GACnD,SAAS,QAAQ,YAAY,QAAQ,UAAU,QAAQ;GACvD,IAAI,CAAC,QAAQ,MAAM,EAAE,KAAK,UAAU;IAClC,UAAU,KAAK;IACf;GACF;EACF;CACF;CAEA,MAAM,aAAa,WAAmB;EACpC,QAAQ,KAAK,MAAM,GAAG,MAAM,CAAC;EAC7B,SAAS,EAAE;CACb;CAEA,MAAM,sBAAsB,UAA+B;EACzD,IAAI,MAAM,QAAQ,aAAa;GAC7B,MAAM,eAAe;GACrB,KAAK,CAAC;EACR,OAAO,IAAI,MAAM,QAAQ,WAAW;GAClC,MAAM,eAAe;GACrB,KAAK,EAAE;EACT,OAAO,IAAI,MAAM,QAAQ,QAAQ;GAC/B,MAAM,eAAe;GACrB,UAAU,CAAC;EACb,OAAO,IAAI,MAAM,QAAQ,OAAO;GAC9B,MAAM,eAAe;GACrB,UAAU,QAAQ,SAAS,CAAC;EAC9B,OAAO,IAAI,MAAM,QAAQ,SAAS;GAChC,MAAM,eAAe;GACrB,IAAI,UAAU,GAAG,SAAS,MAAM;EAClC;CACF;CAEA,gBAAgB;EACd,IAAI,CAAC,MAAM;GACT,QAAQ,CAAC,CAAC;GACV,SAAS,EAAE;GACX,UAAU,CAAC;EACb;CACF,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,SAAS,SAAS,aAAa,cAAc,OAAO;CACtD,GAAG,CAAC,OAAO,CAAC;CAEZ,gBAAgB;EACd,UAAU,CAAC;CACb,GAAG,CAAC,MAAM,KAAK,CAAC;CAEhB,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,gBAAgB,UAAoC;GACxD,KAAK,MAAM,WAAW,MAAM,YAAY,MAAM,IAAI,YAAY,MAAM,KAAK;IACvE,MAAM,eAAe;IACrB,aAAa,CAAC,IAAI;GACpB;EACF;EACA,SAAS,iBAAiB,WAAW,YAAY;EACjD,aAAa,SAAS,oBAAoB,WAAW,YAAY;CACnE,GAAG;EAAC;EAAQ;EAAc;CAAI,CAAC;CAE/B,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,UAAU;GAC5B,MAAM,eAAe;GACrB,IAAI,OAAO,SAAS,EAAE;QACjB,IAAI,KAAK,SAAS,GAAG,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;QAC9C,MAAM;EACb;EACA,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,GAAG,MAAM;EAChD;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,aAAa;GACX,SAAS,oBAAoB,WAAW,aAAa;GACrD,SAAS,oBAAoB,eAAe,iBAAiB;EAC/D;CACF,GAAG;EAAC;EAAc;EAAM;EAAO;CAAO,CAAC;CAEvC,gBAAgB;EACd,IAAI,CAAC,WAAW,SAAS,GAAG;EAI5B,CAHe,SAAS,SAAS,cAC/B,wBACF,EAAA,EACQ,eAAe,EAAE,OAAO,UAAU,CAAC;CAC7C,GAAG,CAAC,QAAQ,OAAO,CAAC;CAEpB,yBAAyB;EACvB,MAAM,YAAY,aAAa;EAC/B,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,SAAS,GAAG;EACpD,MAAM,SAAS,MAAM,cAA2B,gBAAgB,OAAO,GAAG;EAC1E,IAAI,CAAC,QAAQ;EACb,MAAM,YAAY,MAAM,sBAAsB;EAC9C,MAAM,aAAa,OAAO,sBAAsB;EAChD,MAAM,QAAQ,CAAC,UAAU,MAAM;EAC/B,IAAI,OAAO,UAAU,MAAM,aAAa;EACxC,UAAU,MAAM,UAAU;EAC1B,UAAU,MAAM,QAAQ,GAAG,WAAW,MAAM;EAC5C,UAAU,MAAM,SAAS,GAAG,WAAW,OAAO;EAC9C,UAAU,MAAM,YAAY,aAAa,WAAW,OAAO,UAAU,KAAK,MAAM,WAAW,MAAM,UAAU,IAAI;EAC/G,IAAI,OACF,4BAA4B;GAC1B,UAAU,MAAM,aAAa;EAC/B,CAAC;CACL,GAAG;EAAC;EAAQ;EAAS;EAAS;CAAQ,CAAC;CAEvC,yBAAyB;EACvB,aAAa,SAAS,eAAe,YAAY,OAAO;EACxD,MAAM,OAAO,QAAQ;EACrB,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO;EACjC,cAAc,UAAU;EACxB,cAAc,UAAU;EAExB,MAAM,WAAW,iBAAiB,MAAM,QAAQ;EAChD,IAAI,YAAY,GAAG;GACjB,KAAK,MAAM,SAAS;GACpB;EACF;EAEA,MAAM,UAAU,KAAK,MAAM,SACvB,OAAO,WAAW,KAAK,MAAM,MAAM,IACnC,KAAK,sBAAsB,CAAC,CAAC;EACjC,IAAI,CAAC,KAAK,MAAM,QAAQ;GACtB,KAAK,MAAM,SAAS,GAAG,QAAQ;GAC/B;EACF;EACA,MAAM,SAAS,MAAM,sBAAsB,CAAC,CAAC;EAC7C,IAAI,KAAK,IAAI,UAAU,MAAM,IAAI,GAAG;GAClC,KAAK,MAAM,SAAS,GAAG,OAAO;GAC9B;EACF;EAEA,KAAK,MAAM,aAAa;EACxB,KAAK,MAAM,SAAS,GAAG,QAAQ;EAC/B,KAAU;EACV,KAAK,MAAM,aAAa,UAAU,SAAS;EAC3C,KAAK,MAAM,SAAS,GAAG,OAAO;EAC9B,MAAM,eAAe;GACnB,KAAK,MAAM,aAAa;GACxB,cAAc,UAAU;EAC1B;EACA,KAAK,iBAAiB,iBAAiB,QAAQ,EAAE,MAAM,KAAK,CAAC;EAC7D,cAAc,gBACZ,KAAK,oBAAoB,iBAAiB,MAAM;CACpD,GAAG;EAAC;EAAM;EAAS;EAAU;EAAO;CAAO,CAAC;CAE5C,yBAAyB;EACvB,IAAI,CAAC,SAAS;GACZ,mBAAmB,UAAU;GAC7B;EACF;EACA,MAAM,WAAW,mBAAmB;EACpC,mBAAmB,UAAU,KAAK;EAClC,IAAI,aAAa,QAAQ,aAAa,KAAK,QAAQ;EACnD,OAAO,SAAS,SAAS,iBAAiB;EAC1C,OAAO,SAAS,SAAS,gBAAgB;CAC3C,GAAG,CAAC,MAAM,OAAO,CAAC;CAElB,IAAI,CAAC,SAAS,OAAO;CAErB,OAAO,aACL,oBAAC,OAAD;EACE,KAAK;EACL,WAAU;EACV,cAAY;EACZ,MAAK;EAEL,UAAA,oBAAC,WAAD;GACE,KAAK;GACL,WAAW,GAAG,eAAe,SAAS;GACtC,MAAK;GACL,cAAW;GACX,cAAY;GAEZ,UAAA,qBAAC,OAAD;IAAK,KAAK;IAAU,WAAU;IAA9B,UAAA;KACE,qBAAC,OAAD;MAAK,WAAU;MAAsB,cAAW;MAAhD,UAAA;OACG;OACD,oBAAC,UAAD;QACE,MAAK;QACL,WAAU;QACV,gBAAc,KAAK,WAAW,KAAK,KAAA;QACnC,eAAe,UAAU,CAAC;QAEzB,UAAA;OACK,CAAA;OACP,KAAK,SAAS,OAAO,UAAU,CAC9B,oBAAC,QAAD;QAEE,WAAU;QACV,eAAY;QAEZ,UAAA,oBAAC,gBAAD;SAAgB,MAAM;SAAI,QAAO;QAAQ,CAAA;OACrC,GALC,OAAO,OAKR,GACN,oBAAC,UAAD;QAEE,MAAK;QACL,WAAU;QACV,gBAAc,UAAU,KAAK,SAAS,KAAK,KAAA;QAC3C,eAAe,UAAU,QAAQ,CAAC;QAEjC,UAAA,WAAW,OAAO,SAAS;OACtB,GAPD,SAAS,OAOR,CACV,CAAC;MACE;;KAEL,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,oBAAC,qBAAD;QACE,WAAU;QACV,MAAM;QACN,eAAY;OACb,CAAA;OACD,oBAAC,SAAD;QACE,KAAK;QACL,WAAU;QACV,MAAK;QACL,MAAK;QACL,iBAAA;QACA,iBAAe;QACf,yBACE,UAAU,IAAI,QAAQ,OAAO,EAAE,WAAW,KAAA;QAE5C,qBAAkB;QAClB,cAAY;QACC;QACb,OAAO;QACP,cAAa;QACb,WAAW,UAAU,SAAS,MAAM,cAAc,KAAK;QACvD,WAAW;OACZ,CAAA;OACD,oBAAC,UAAD;QACE,MAAK;QACL,WAAU;QACV,cAAW;QACX,SAAS;QAET,UAAA,oBAAC,QAAD;SAAM,WAAU;SAAe,UAAA;QAAS,CAAA;OAClC,CAAA;MACL;;KAEL,oBAAC,OAAD;MAAK,WAAU;MAAoB,KAAK;MACtC,UAAA,oBAAC,OAAD;OACE,WAAU;OACV,KAAK;OACL,IAAI;OACJ,MAAK;OACL,cAAY;OAEZ,UAAA,qBAAC,OAAD;QAAK,WAAU;QAAqB,KAAK;QAAzC,UAAA;SACE,oBAAC,QAAD;UACE,WAAU;UACV,KAAK;UACL,MAAK;SACN,CAAA;SACA,QAAQ,WAAW,KAClB,oBAAC,OAAD;UAAK,WAAU;UAAqB,MAAK;UACtC,UAAA,KAAK,YAAY;SACf,CAAA;SAEN,SAAS,KAAK,YACb,qBAAC,OAAD;UAEE,WAAU;UACV,MAAK;UACL,mBACE,QAAQ,YAAY,KAAA,IAChB,GAAG,OAAO,SAAS,QAAQ,YAC3B,KAAA;UAPR,UAAA,CAUG,QAAQ,YAAY,KAAA,KACnB,oBAAC,OAAD;WACE,WAAU;WACV,IAAI,GAAG,OAAO,SAAS,QAAQ;WAE9B,UAAA,QAAQ;UACN,CAAA,GAEN,QAAQ,QAAQ,KAAK,WAAW;WAC/B,MAAM,OAAO,OAAO;WACpB,MAAM,QAAQ,OAAO;WACrB,OACE,qBAAC,OAAD;YAEE,IAAI,OAAO;YACX,WAAU;YACV,MAAK;YACL,cAAY;YACZ,eAAa,UAAU,SAAS,SAAS,KAAA;YACzC,iBAAe,KAAK,YAAY,KAAA;YAChC,iBAAe,UAAU;YACzB,iBAAe,KAAK,YAAY,KAAA;YAChC,sBAAsB;aACpB,IAAI,CAAC,KAAK,UAAU,UAAU,KAAK;YACrC;YACA,gBAAgB,UAAU,MAAM,eAAe;YAC/C,eAAe,SAAS,KAAK;YAd/B,UAAA;aAgBG,KAAK,SAAS,KAAA,KACb,oBAAC,QAAD;cACE,WAAU;cACV,eAAY;cAEX,UAAA,KAAK,KAAK,IAAI;aACX,CAAA;aAER,oBAAC,QAAD;cAAM,WAAU;cACb,UAAA,OAAO,KAAK,UAAU,WACrB,oBAAC,WAAD;eACE,MAAM,KAAK;eACX,SAAS,OAAO;cACjB,CAAA,IAED,KAAK,KAAK,KAAK;aAEb,CAAA;aACL,KAAK,UAAU,KAAA,KACd,oBAAC,QAAD;cAAM,WAAU;cACb,UAAA,KAAK,KAAK,KAAK;aACZ,CAAA;aAEP,KAAK,YAAY,KAAK,SAAS,SAAS,IACvC,oBAAC,QAAD;cACE,WAAU;cACV,eAAY;cAEZ,UAAA,oBAAC,gBAAD;eAAgB,MAAM;eAAI,QAAO;cAAQ,CAAA;aACrC,CAAA,IACJ,KAAK,SAAS,KAAA,IAChB,oBAAC,QAAD;cAAM,WAAU;cACb,UAAA,KAAK,KAAK,IAAI;aACX,CAAA,IAEN,KAAK,aAAa,KAAA,KAChB,oBAAC,KAAD,EAAK,MAAM,KAAK,SAAW,CAAA;YAG5B;WAtDE,GAAA,KAAK,MAAM,GAAG,cAAc,IAAI,EAAE,GAAG,OAsDvC;UAET,CAAC,CACE;SA/EE,GAAA,QAAQ,WAAW,cA+ErB,CACN;QACE;;MACF,CAAA;KACF,CAAA;KAEL,qBAAC,UAAD;MAAQ,WAAU;MAAsB,eAAY;MAApD,UAAA;OACE,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA;SACE,oBAAC,KAAD,EAAK,MAAK,IAAK,CAAA;SACf,oBAAC,KAAD,EAAK,MAAK,IAAK,CAAA;SAAC;QAEZ;;OACN,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CACE,oBAAC,KAAD,EAAK,MAAK,IAAK,CAAA,GAAC,QAEZ;;OACN,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CACE,oBAAC,KAAD,EAAK,MAAK,MAAO,CAAA,GAChB,KAAK,SAAS,KAAK,QAAQ,SAAS,OACjC;;MACA;;IACL;;EACE,CAAA;CACN,CAAA,GACL,SAAS,IACX;AACF;;;ACviBA,MAAM,wBAAwB,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;AAEnD,SAAgB,WAAW,EACzB,OACA,aACA,OAAO,uBACP,QACA,UAAU,OACV,WACA,GAAG,SACe;CAClB,OACE,qBAAC,WAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,mBAAmB,SAAS;EAC1C,gBAAc,WAAW,KAAA;EAH3B,UAAA;GAKE,oBAAC,OAAD;IAAK,WAAU;IAAwB,eAAY;IAChD,UAAA,KAAK,IAAI;GACP,CAAA;GACL,oBAAC,MAAD;IAAI,WAAU;IAA0B,UAAA,KAAK,KAAK;GAAM,CAAA;GACvD,gBAAgB,KAAA,KACf,oBAAC,KAAD;IAAG,WAAU;IAAgC,UAAA,KAAK,WAAW;GAAK,CAAA;GAEnE,WAAW,KAAA,KACV,oBAAC,OAAD;IAAK,WAAU;IAA2B,UAAA,KAAK,MAAM;GAAO,CAAA;EAEvD;;AAEb;;;ACWA,MAAM,YACJ;AAEF,SAAS,cAAc,MAAwB,QAAyB;CACtE,MAAM,SAAS,OACZ,MAAM,GAAG,CAAC,CACV,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAC1C,OAAO,OAAO;CACjB,IAAI,OAAO,WAAW,GAAG,OAAO;CAChC,MAAM,OAAO,KAAK,KAAK,YAAY;CACnC,MAAM,OAAO,KAAK,KAAK,YAAY;CACnC,OAAO,OAAO,MAAM,UAAU;EAC5B,IAAI,MAAM,WAAW,GAAG,GAAG,OAAO,KAAK,SAAS,KAAK;EACrD,IAAI,MAAM,SAAS,IAAI,GAAG,OAAO,KAAK,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC;EACnE,OAAO,SAAS;CAClB,CAAC;AACH;AAEA,SAAgB,sBACd,OACA,EAAE,QAAQ,WAAW,MAAM,UAAU,YAAgC,CAAC,GACzC;CAC7B,MAAM,SAAc,CAAC;CACrB,MAAM,SAAc,CAAC;CACrB,MAAM,QAAa,CAAC;CACpB,KAAK,MAAM,QAAQ,OACjB,IAAI,UAAU,CAAC,cAAc,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI;MACvD,IAAI,YAAY,KAAA,KAAa,KAAK,OAAO,SAAS,OAAO,KAAK,IAAI;MAClE,MAAM,KAAK,IAAI;CAEtB,MAAM,QAAQ,WAAY,YAAY,OAAO,oBAAqB;CAClE,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;CAClD,MAAM,UAAU,MAAM,MAAM,SAAS,MAAM;CAC3C,MAAM,WAAoD,CAAC;CAC3D,IAAI,OAAO,SAAS,GAAG,SAAS,KAAK;EAAE,QAAQ;EAAQ,OAAO;CAAO,CAAC;CACtE,IAAI,OAAO,SAAS,GAAG,SAAS,KAAK;EAAE,QAAQ;EAAQ,OAAO;CAAO,CAAC;CACtE,IAAI,QAAQ,SAAS,GAAG,SAAS,KAAK;EAAE,QAAQ;EAAS,OAAO;CAAQ,CAAC;CACzE,OAAO;EAAE;EAAU;CAAS;AAC9B;AAEA,MAAM,UAAU,UAAmB,UAAU,IAAI,WAAW,GAAG,MAAM;AAErE,MAAM,aAAmD;CACvD,MAAM;CACN,MAAM;CACN,OAAO;AACT;AAEA,SAAgB,uBACd,QACQ;CACR,MAAM,QAAkB,CAAC;CACzB,IAAI,OAAO,SAAS,SAAS,GAC3B,MAAM,KAAK,GAAG,OAAO,OAAO,SAAS,MAAM,EAAE,QAAQ;CAEvD,KAAK,MAAM,EAAE,QAAQ,WAAW,OAAO,UACrC,MAAM,KAAK,GAAG,OAAO,MAAM,MAAM,EAAE,aAAa,WAAW,QAAQ,EAAE;CAEvE,OAAO,MAAM,KAAK,GAAG;AACvB;;;;;;AAOA,SAAgB,iBAAiB,EAC/B,UACA,eACA,SACA,UACA,QACA,WAAW,MACX,UACA,SACA,WAAW,OACX,QAAQ,gBACR,SACA,WACA,cAAc,WACd,oBAAoB,iBACpB,SACA,GAAG,SACqB;CACxB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,aAAa,OAAwB,IAAI;CAC/C,MAAM,YAAY,MAAM;CACxB,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,CAAC,QAAQ,aAAa,SAAS;EAAE,MAAM;EAAI,OAAO;CAAE,CAAC;CAE3D,gBAAgB;EACd,MAAM,QAAQ,QAAQ,WAAW,SAAS,cAAc,SAAS,CAAC;EAClE,IAAI,UAAU,QAAQ,UAAU,KAAK;CACvC,CAAC;CAED,MAAM,OAAO,YAAY,SAAS,aAAa;CAC/C,MAAM,OAAO,SAAS;CAEtB,MAAM,QAAQ,UAAgD;EAC5D,MAAM,UAAU,QAAQ;EACxB,IAAI,CAAC,SAAS;EACd,MAAM,OAAO,QAAQ,sBAAsB;EAC3C,MAAM,MAAM,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAQ,MAAO;EAC7D,MAAM,MAAM,MAAM,UAAU,KAAK,OAAO,KAAK,SAAS,MAAO;EAC7D,QAAQ,MAAM,YAAY,gBAAgB,IAAI,IAAI,GAAA,CAAI,QAAQ,CAAC,EAAE,GAAG;EACpE,QAAQ,MAAM,YAAY,gBAAgB,IAAI,IAAI,EAAA,CAAG,QAAQ,CAAC,EAAE,GAAG;CACrE;CAEA,MAAM,cAAc;EAClB,MAAM,UAAU,QAAQ;EACxB,IAAI,CAAC,SAAS;EACd,QAAQ,MAAM,YAAY,gBAAgB,KAAK;EAC/C,QAAQ,MAAM,YAAY,gBAAgB,KAAK;CACjD;CAEA,MAAM,WAAW,UAAkB;EACjC,IAAI,MAAM,WAAW,GAAG;EACxB,MAAM,SAAS,sBAAsB,OAAO;GAC1C;GACA;GACA;GACA;EACF,CAAC;EACD,IAAI,OAAO,SAAS,SAAS,GAAG,UAAU,OAAO,QAAQ;EACzD,KAAK,MAAM,EAAE,QAAQ,OAAO,cAAc,OAAO,UAC/C,WAAW,UAAU,MAAM;EAE7B,MAAM,OAAO,uBAAuB,MAAM;EAC1C,WAAW,cAAc;GAAE;GAAM,OAAO,SAAS,QAAQ;EAAE,EAAE;CAC/D;CAEA,MAAM,kBAAkB,UAAqC;EAC3D,MAAM,eAAe;EACrB,IAAI,UAAU;GACZ,IAAI,MAAM,cAAc,MAAM,aAAa,aAAa;GACxD;EACF;EACA,IAAI,CAAC,UAAU,YAAY,IAAI;EAC/B,KAAK,KAAK;CACZ;CAEA,MAAM,mBAAmB,UAAqC;EAC5D,MAAM,OAAO,MAAM;EACnB,IAAI,QAAQ,QAAQ,SAAS,SAAS,IAAI,GAAG;EAC7C,YAAY,KAAK;EACjB,MAAM;CACR;CAEA,MAAM,cAAc,UAAqC;EACvD,MAAM,eAAe;EACrB,IAAI,UAAU;EACd,YAAY,KAAK;EACjB,MAAM;EACN,QAAQ,MAAM,KAAK,MAAM,cAAc,SAAS,CAAC,CAAC,CAAC;CACrD;CAEA,MAAM,eAAe,UAA0B;EAC7C,UAAU,KAAK,KAAK,CAAC;EACrB,IAAI,YAAY,MAAM,kBAAkB;EACxC,MAAM,QAAQ,MAAM,KAAK,MAAM,eAAe,SAAS,CAAC,CAAC;EACzD,IAAI,MAAM,WAAW,GAAG;EACxB,MAAM,eAAe;EACrB,QAAQ,KAAK;CACf;CAEA,MAAM,mBAAmB;EACvB,IAAI,CAAC,UAAU,SAAS,SAAS,MAAM;CACzC;CAEA,MAAM,eAAe,UAAsC;EACzD,IAAI,MAAM,WAAW,SAAS,SAAS;EACvC,WAAW;CACb;CAEA,MAAM,iBAAiB,UAAwB;EAC7C,IAAI,MAAM,WAAW,MAAM,eAAe;EAC1C,IAAI,MAAM,QAAQ,KAAK,MAAM,eAAe;EAC5C,IAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,QAAQ;GAC1C,MAAM,eAAe;GACrB,WAAW;EACb;CACF;CAEA,MAAM,eAAe,UAAwB;EAC3C,IAAI,MAAM,WAAW,MAAM,eAAe;EAC1C,IAAI,MAAM,QAAQ,KAAK;GACrB,MAAM,eAAe;GACrB,WAAW;EACb;CACF;CAEA,MAAM,cAAc,CAAC,WAAW,eAAe,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEzE,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,KAAK;EACL,WAAW,GAAG,gBAAgB,SAAS;EACvC,eAAa,YAAY,KAAA;EACzB,iBAAe,YAAY,KAAA;EAC3B,gBAAc;EACd,cAAY,OAAO,KAAA,IAAY;EAC/B,oBAAkB,OAAO,KAAA,IAAY;EACrC,YAAY;EACZ,aAAa;EACb,QAAQ;EACR,SAAS;EACT,SAAS;EAbX,UAAA;GAeE,oBAAC,OAAD;IACE,WAAU;IACV,MAAM,OAAO,WAAW,KAAA;IACxB,UAAU,OAAO,IAAI,KAAA;IACrB,cAAY,OAAQ,aAAa,QAAS,KAAA;IAC1C,oBAAkB,OAAO,cAAc,KAAA;IACvC,iBAAe,QAAQ,WAAW,OAAO,KAAA;IACzC,WAAW,OAAO,gBAAgB,KAAA;IAClC,SAAS,OAAO,cAAc,KAAA;IAE9B,UAAA,oBAAC,QAAD;KACE,KAAK;KACL,IAAI;KACJ,WAAU;KAET,UAAA,KACC,YAAY,kBAAkB,KAAA,IAAY,gBAAgB,QAC5D;IACI,CAAA;GACH,CAAA;GACL,oBAAC,SAAD;IACE,KAAK;IACL,WAAU;IACV,MAAK;IACG;IACE;IACV,cAAY,aAAa;IACzB,UAAU;IACA;IACV,WAAW,UAAU;KACnB,QAAQ,MAAM,KAAK,MAAM,cAAc,SAAS,CAAC,CAAC,CAAC;KACnD,MAAM,cAAc,QAAQ;IAC9B;GACD,CAAA;GACD,qBAAC,QAAD;IAAM,WAAU;IAAuB,MAAK;IAA5C,UAAA,CACG,OAAO,MACP,OAAO,QAAQ,OAAO,QAAQ,MAAM,IAAI,SAAM,EAC3C;;EACH;;AAET;;;;ACxRA,MAAM,kBAAkB;;;;;;;AAQxB,SAAgB,QAAQ,EACtB,OACA,UACA,QAAQ,QACR,WACA,GAAG,SACY;CACf,MAAM,SAAS,OAAuB,IAAI;CAC1C,MAAM,CAAC,WAAW,gBAAgB,SAAwB,IAAI;CAC9D,MAAM,aAAa,OAA6C,IAAI;CAEpE,MAAM,mBAAmB;EACvB,IAAI,WAAW,YAAY,MAAM;GAC/B,aAAa,WAAW,OAAO;GAC/B,WAAW,UAAU;EACvB;CACF;CAEA,gBAAgB,YAAY,CAAC,CAAC;CAE9B,MAAM,qBACJ,MAAM,KACJ,OAAO,SAAS,iBACd,oBACF,KAAK,CAAC,CACR;CAEF,MAAM,oBAAoB,UAA+B;EACvD,IAAI,CAAC;GAAC;GAAa;GAAc;GAAQ;EAAK,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG;EACrE,MAAM,OAAO,aAAa;EAC1B,MAAM,MAAM,KAAK,QAAQ,SAAS,aAAkC;EACpE,IAAI,QAAQ,IAAI;EAChB,MAAM,eAAe;EACrB,MAAM,OAAO,KAAK,SAAS;EAC3B,MAAM,UACJ,MAAM,QAAQ,SACV,IACA,MAAM,QAAQ,QACZ,OACA,MAAM,QAAQ,gBACX,MAAM,KAAK,KAAK,UAChB,MAAM,IAAI,KAAK,UAAU,KAAK;EACzC,KAAK,QAAQ,EAAE,MAAM;EAErB,IAAI,cAAc,MAAM,aAAa,OAAO;CAC9C;CAEA,MAAM,sBAAsB,UAAkB;EAC5C,IAAI,MAAM,MAAM,EAAE,UAAU;EAC5B,IAAI,cAAc,OAAO;EACzB,WAAW;EACX,IAAI,cAAc,MAAM;GACtB,aAAa,KAAK;GAClB;EACF;EACA,WAAW,UAAU,iBAAiB,aAAa,KAAK,GAAG,eAAe;CAC5E;CAEA,MAAM,2BAA2B;EAC/B,IAAI,cAAc,MAAM,WAAW;CACrC;CAEA,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,KAAK;EACL,MAAK;EACL,cAAY;EACZ,WAAW,GAAG,eAAe,SAAS;EACtC,WAAW;EACX,gBAAgB;EAEf,UAAA,MAAM,KAAK,MAAM,UAChB,oBAAC,OAAD;GAEE,WAAU;GACV,sBAAsB,mBAAmB,KAAK;GAC9C,gBAAgB;GAEhB,UAAA,oBAAC,MAAD;IACE,WAAU;IACV,SAAS,KAAK,WAAW,KAAK;IAC9B,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,UAAU,KAAK;IACf,OAAO,UAAU,MAAM,SAAS,IAAI,QAAQ;IAC5C,MAAM,cAAc;IACpB,eAAe,SAAS,aAAa,OAAO,QAAQ,IAAI;IAC9C;GACX,CAAA;EACE,GAhBE,gBAAgB,OAgBlB,CACN;CACE,CAAA;AAET;;;AC5GA,SAAgB,eAAe,EAC7B,OACA,QAAQ,aACR,MACA,cAAc,MACd,cACA,aACsB;CACtB,MAAM,cAAc,MAAM,QAAQ,SAAS,KAAK,WAAW,QAAQ,CAAC,CAAC;CAErE,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,iBAAiB,SAAS;EAC3C,UAAA,oBAAC,aAAD;GACQ;GACO;GACC;GACd,SACE,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAAwB,UAAA,KAAK,KAAK;IAAQ,CAAA,GAC1D,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACG,cAAc,KACb,qBAAC,QAAD;MAAM,WAAU;MAAa,eAAY;MAAzC,UAAA;OACE,oBAAC,KAAD,CAAI,CAAA;OACJ,oBAAC,KAAD,CAAI,CAAA;OACJ,oBAAC,KAAD,CAAI,CAAA;MACA;KAER,CAAA,GAAA,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACG,MAAM;OAAO;OAAE,MAAM,WAAW,IAAI,SAAS;MAC1C;KACF,CAAA,CAAA;IACF,CAAA,CAAA;;GAGR,UAAA,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,MAAM,KAAK,MAAM,UAChB,qBAAC,MAAD;KAEE,WAAU;KACV,eAAa,KAAK,UAAU;KAC5B,OACE,EAAE,sBAAsB,MAAM;KALlC,UAAA;MASE,oBAAC,QAAD;OAAM,WAAU;OAAwB,eAAY;OAClD,UAAA,oBAAC,QAAD,EAAM,WAAU,qBAAsB,CAAA;MAClC,CAAA;MACN,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACE,oBAAC,QAAD;QAAM,WAAU;QAAwB,UAAA,KAAK,KAAK,KAAK;OAAQ,CAAA,GAC9D,KAAK,WAAW,KAAA,KACf,oBAAC,QAAD;QAAM,WAAU;QACb,UAAA,KAAK,KAAK,MAAM;OACb,CAAA,CAEJ;;MACN,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,KAAK,WAAW,WACb,aACA,KAAK,WAAW,YACd,WACA;MACF,CAAA;KACJ;IA1BG,GAAA,KAAK,MAAM,KA0Bd,CACL;GACC,CAAA;EACO,CAAA;CACV,CAAA;AAET;;;AClDA,SAAS,MAAM,OAAe,KAAa,MAAsB;CAC/D,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,IAAI;AAC5C;AAEA,SAAgB,UAAU,EACxB,OACA,YAAY,cACZ,OACA,cACA,eACA,MAAM,IACN,cAAc,iBACd,WACA,GAAG,SACc;CACjB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,cAAc,mBAAmB,eAChC,gBAAgB,CAAC,CACzB;CACA,MAAM,CAAC,WAAW,gBAAgB,SAAwB,IAAI;CAC9D,MAAM,OAAO,OAKH,IAAI;CAEd,MAAM,OAAO,cACL,MAAM,UAAU,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC,GACrD,CAAC,MAAM,MAAM,CACf;CACA,MAAM,YAAY,SAAS;CAC3B,MAAM,SACJ,UAAU,WAAW,MAAM,UAAU,MAAM,SAAS,IAAI,YAAY;CAEtE,MAAM,UAAU,SAAmB;EACjC,gBAAgB,IAAI;EACpB,gBAAgB,IAAI;CACtB;CAEA,MAAM,aAAa,OAAoB,UAAkB;EACvD,IAAI,MAAM,WAAW,GAAG;EACxB,MAAM,OAAO,QAAQ,SAAS,sBAAsB;EACpD,IAAI,CAAC,MAAM;EACX,MAAM,cAAc,kBAAkB,MAAM,SAAS;EACrD,KAAK,UAAU;GACb;GACA,SAAS;IAAE,GAAG,MAAM;IAAS,GAAG,MAAM;GAAQ;GAC9C,OAAO,CAAC,GAAG,MAAM;GACjB,QAAQ,cAAc,eAAe,KAAK,QAAQ,KAAK;EACzD;EACA,aAAa,KAAK;CACpB;CAEA,MAAM,YAAY,UAAuB;EACvC,MAAM,QAAQ,KAAK;EACnB,IAAI,CAAC,SAAS,MAAM,UAAU,GAAG;EAIjC,MAAM,UAHW,cAAc,eAAe,MAAM,UAAU,MAAM,YAElE,cAAc,eAAe,MAAM,QAAQ,IAAI,MAAM,QAAQ,MAC1B,MAAM,SAAU;EAErD,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK;EAC5B,MAAM,SAAS,KAAK,MAAM,UAAU;EAEpC,MAAM,OAAO,UADC,KAAK,MAAM,QAAQ,MAAM;EAEvC,MAAM,QAAQ,MAAM,SAAS,OAAO,KAAK,OAAO,GAAG;EACnD,KAAK,MAAM,SAAS;EACpB,KAAK,MAAM,QAAQ,KAAK,OAAO;EAC/B,OAAO,IAAI;CACb;CAEA,MAAM,WAAW,UAAuB;EACtC,IAAI,KAAK,YAAY,MAAM;EAC3B,KAAK,UAAU;EACf,aAAa,IAAI;EACjB,IAAI,MAAM,cAAc,KAAA,GACtB,IAAI;GACF,MAAM,cAAc,sBAAsB,MAAM,SAAS;EAC3D,QAAQ,CAAC;CAEb;CAEA,MAAM,iBAAiB,OAAqB,UAAkB;EAC5D,MAAM,QACH,MAAM,WAAW,KAAK,MACtB,cAAc,eACX,MAAM,QAAQ,cACZ,KACA,MAAM,QAAQ,eACZ,IACA,IACJ,MAAM,QAAQ,YACZ,KACA,MAAM,QAAQ,cACZ,IACA;EACV,IAAI,SAAS,GAAG;EAChB,MAAM,eAAe;EACrB,MAAM,OAAO,CAAC,GAAG,MAAM;EACvB,MAAM,SAAS,KAAK,UAAU;EAE9B,MAAM,OAAO,UADC,KAAK,QAAQ,MAAM;EAEjC,MAAM,QAAQ,MAAM,SAAS,MAAM,KAAK,OAAO,GAAG;EAClD,KAAK,SAAS;EACd,KAAK,QAAQ,KAAK,OAAO;EACzB,OAAO,IAAI;CACb;CAEA,OACE,oBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,KAAK;EACL,WAAW,GAAG,iBAAiB,SAAS;EACxC,kBAAgB;EAEf,UAAA,MAAM,SAAS,MAAM,UAAU;GAC9B,MAAM,QAAQ,CACZ,oBAAC,OAAD;IAEE,WAAU;IACV,OAAO;KACL,UAAU,OAAO,UAAU,KAAK,UAAU;KAC1C,WAAW;KACX,UAAU;KACV,WAAW;IACb;IAEC,UAAA,KAAK,IAAI;GACP,GAVE,QAAQ,OAUV,CACP;GACA,IAAI,QAAQ,MAAM,SAAS,GACzB,MAAM,KACJ,oBAAC,OAAD;IAEE,MAAK;IACL,UAAU;IACV,oBACE,cAAc,eAAe,aAAa;IAE5C,iBAAe,KAAK,MAAM,OAAO,UAAU,CAAC;IAC5C,cAAY;IACZ,WAAU;IACV,iBAAe,cAAc,SAAS,KAAA;IACtC,gBAAgB,UAAU,UAAU,OAAO,KAAK;IAChD,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,YAAY,UAAU,cAAc,OAAO,KAAK;GACjD,GAfM,UAAU,OAehB,CACH;GAEF,OAAO;EACT,CAAC;CACE,CAAA;AAET;;;AC/JA,SAAgB,QAAQ,EACtB,UACA,OACA,cACA,UACA,QACA,QACA,cAAc,OACd,WACA,mBAAmB,OACnB,mBACA,YAAY,WACZ,WACA,GAAG,SACY;CACf,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,cAAc,mBAAmB,SAAS,gBAAgB;CACjE,MAAM,cAAc,aAAa;CACjC,MAAM,SAAS,SAAS;CAExB,MAAM,wBAAwB;EAC5B,MAAM,OAAO,CAAC;EACd,gBAAgB,IAAI;EACpB,oBAAoB,IAAI;CAC1B;CAEA,OACE,qBAAC,SAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,eAAe,SAAS;EACtC,kBAAgB,eAAe,KAAA;EAHjC,UAAA;GAKG,WAAW,KAAA,KACV,oBAAC,OAAD;IAAK,WAAU;IAAuB,UAAA,KAAK,MAAM;GAAO,CAAA;GAE1D,qBAAC,OAAD;IAAK,WAAU;IAAmB,cAAY;IAA9C,UAAA,CACG,SAAS,KAAK,SAAS,iBACtB,qBAAC,OAAD;KAEE,WAAU;KAFZ,UAAA,CAIG,QAAQ,UAAU,KAAA,KACjB,oBAAC,OAAD;MAAK,WAAU;MAA6B,eAAY;MACrD,UAAA,QAAQ;KACN,CAAA,GAEN,QAAQ,MAAM,KAAK,SAAS;MAC3B,MAAM,WAAW,KAAK,UAAU;MAChC,OACE,qBAAC,UAAD;OAEE,MAAK;OACL,WAAU;OACV,eAAa,YAAY,KAAA;OACzB,gBAAc,WAAW,SAAS,KAAA;OAClC,UAAU,KAAK;OACf,OACE,eAAe,OAAO,KAAK,UAAU,WACjC,KAAK,QACL,KAAA;OAEN,eAAe,WAAW,KAAK,KAAK;OAZtC,UAAA;QAcG,KAAK,SAAS,KAAA,KACb,oBAAC,QAAD;SAAM,WAAU;SAAoB,eAAY;SAC7C,UAAA,KAAK,KAAK,IAAI;QACX,CAAA;QAER,oBAAC,QAAD;SAAM,WAAU;SAAsB,UAAA,KAAK,KAAK,KAAK;QAAQ,CAAA;QAC5D,KAAK,UAAU,KAAA,KACd,oBAAC,QAAD;SAAM,WAAU;SACb,UAAA,KAAK,KAAK,KAAK;QACZ,CAAA;OAEF;MAxBD,GAAA,KAAK,KAwBJ;KAEZ,CAAC,CACE;IAvCE,GAAA,QAAQ,SAAS,WAAW,cAuC9B,CACN,GACD,oBAAC,QAAD;KAAM,IAAI,GAAG,OAAO;KAAQ,WAAU;KACnC,UAAA,cAAc,sBAAsB;IACjC,CAAA,CACH;;IACH,WAAW,KAAA,KAAa,gBACxB,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,WAAW,KAAA,KACV,oBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA,KAAK,MAAM;IAAO,CAAA,GAEjE,eACC,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,iBAAe,CAAC;KAChB,cAAY,cAAc,mBAAmB;KAC7C,SAAS;KAET,UAAA,oBAAC,QAAD;MAAM,eAAY;MAAQ,UAAA,cAAc,MAAM;KAAU,CAAA;IAClD,CAAA,CAEP;;EAEF;;AAEX;;;;;;;;ACxHA,SAAgB,cAAc,EAC5B,MACA,QAAQ,IACR,WAAW,MACX,WACA,GAAG,SACkB;CACrB,MAAM,SAAS,KAAK,MAAM,OAAO;CACjC,IAAI,YAAY;CAEhB,OACE,oBAAC,OAAD;EAAK,GAAI,KAAK,KAAK;EAAG,WAAW,GAAG,cAAc,SAAS;EACxD,UAAA,OAAO,KAAK,OAAO,UAAU;GAC5B,IAAI,MAAM,KAAK,CAAC,CAAC,WAAW,GAAG,OAAO;GACtC,aAAa;GACb,MAAM,QAAQ,WAAW,YAAY,QAAQ;GAC7C,OACE,oBAAC,QAAD;IAEE,WAAU;IACV,iBAAe,YAAY,KAAA;IAC3B,OAAO,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAErC,UAAA;GACG,GANC,KAMD;EAEV,CAAC;CACE,CAAA;AAET;;;ACvCA,MAAM,WAAW,IAAI,KAAK,SAAS,KAAA,GAAW;CAC5C,SAAS;CACT,aAAa;AACf,CAAC;AAED,SAAS,WAAW,OAAgB;CAClC,IAAI,iBAAiB,MAAM,OAAO,MAAM,QAAQ;CAChD,IAAI,OAAO,UAAU,WAAW,OAAO,OAAO,KAAK;CACnD,OAAO;AACT;AAEA,SAASC,UAAQ,OAAgB;CAC/B,OACE,UAAU,QACV,UAAU,KAAA,KACV,UAAU,MACT,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK;AAEpD;AAEA,SAAgB,cAAc,GAAY,GAAY;CACpD,MAAM,OAAO,WAAW,CAAC;CACzB,MAAM,QAAQ,WAAW,CAAC;CAC1B,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C,OAAO,OAAO;CAEhB,OAAO,SAAS,QAAQ,OAAO,IAAI,GAAG,OAAO,KAAK,CAAC;AACrD;AAEA,SAAgB,SACd,MACA,MACA,SACA;CACA,MAAM,UAAU,KAAK,KAAK,KAAK,WAAW;EAAE;EAAK;CAAM,EAAE;CACzD,MAAM,QAAQ,KAAK,SAAS,EAAE,KAAK,gBAAgB;EACjD,MAAM,SAAS,QAAQ,MAAM,cAAc,UAAU,QAAQ,GAAG;EAChE,IAAI,CAAC,QAAQ,OAAO,CAAC;EAKrB,OAAO,CAAC;GAAE;GAAQ,MAJL,cAAc,SAAS,KAAK;GAIjB,MAFtB,OAAO,eACL,QAAc,IAAgC,OAAO;EAC5B,CAAC;CAChC,CAAC;CACD,IAAI,MAAM,WAAW,GAAG,OAAO;CAE/B,OAAO,QAAQ,MAAM,GAAG,MAAM;EAC5B,KAAK,MAAM,EAAE,QAAQ,MAAM,UAAU,OAAO;GAC1C,IAAI;GACJ,IAAI,OAAO,SACT,SAAS,OAAO,OAAO,QAAQ,EAAE,KAAK,EAAE,GAAG;QACtC;IACL,MAAM,OAAO,KAAK,EAAE,GAAG;IACvB,MAAM,QAAQ,KAAK,EAAE,GAAG;IACxB,MAAM,YAAYA,UAAQ,IAAI;IAC9B,MAAM,aAAaA,UAAQ,KAAK;IAChC,IAAI,aAAa,YACf,SAAS,cAAc,aAAa,IAAI,YAAY,IAAI;SAExD,SAAS,OAAO,cAAc,MAAM,KAAK;GAE7C;GACA,IAAI,WAAW,GAAG,OAAO;EAC3B;EACA,OAAO,EAAE,QAAQ,EAAE;CACrB,CAAC;AACH;AAEA,SAAS,MAAM,WAAgC;CAC7C,IAAI,cAAc,KAAA,GAAW,OAAO;CACpC,OAAO,cAAc,QAAQ,SAAS,KAAA;AACxC;AAEA,SAAgB,SACd,SACA,KACA,UACa;CACb,MAAM,WAAW,QAAQ,MAAM,UAAU,MAAM,QAAQ,GAAG;CAC1D,IAAI,CAAC,UAAU;EAEb,MAAM,YAAY,OADN,QAAQ,WAAW,IAAI,WAAW,KAAA,EAAA,EACjB,SAAS;EACtC,OAAO,YAAY,CAAC;GAAE;GAAK;EAAU,CAAC,IAAI,CAAC;CAC7C;CACA,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,SAAS;EAAE;EAAK,WAAW;CAAM,CAAC;CAC5D,MAAM,YAAY,MAAM,SAAS,SAAS;CAC1C,OAAO,YACH,QAAQ,KAAK,UAAW,MAAM,QAAQ,MAAM;EAAE;EAAK;CAAU,IAAI,KAAM,IACvE,QAAQ,QAAQ,UAAU,MAAM,QAAQ,GAAG;AACjD;AAEA,SAAgB,gBACd,UACA,OACA,IACA,QACA,OACA;CACA,MAAM,OAAO,IAAI,IAAI,QAAQ;CAC7B,MAAM,SAAS,CAAC,SAAS,IAAI,EAAE;CAC/B,MAAM,OAAO,SAAS,WAAW,OAAO,MAAM,QAAQ,MAAM,IAAI;CAChE,MAAM,KAAK,MAAM,QAAQ,EAAE;CAC3B,MAAM,MACJ,QAAQ,KAAK,MAAM,IACf,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,IAAI,CAAC,IACtD,CAAC,EAAE;CACT,KAAK,MAAM,SAAS,KAClB,IAAI,QAAQ,KAAK,IAAI,KAAK;MACrB,KAAK,OAAO,KAAK;CAExB,OAAO;AACT;AAEA,SAAgB,UACd,UACA,OACA,QACA;CACA,MAAM,OAAO,IAAI,IAAI,QAAQ;CAC7B,KAAK,MAAM,MAAM,OACf,IAAI,QAAQ,KAAK,IAAI,EAAE;MAClB,KAAK,OAAO,EAAE;CAErB,OAAO;AACT;;;ACxEA,MAAM,WAAW;CACf,KAAK;CACL,MAAM;AACR;AAEA,SAAS,kBAAkB;CACzB,OACE,OAAO,QAAQ,eACf,OAAO,IAAI,aAAa,cACxB,IAAI,SAAS,8BAA8B;AAE/C;AAEA,SAAgB,MAEd,EACA,SACA,MACA,SACA,eAAe,cACf,QACA,UACA,UAAU,eACV,UAAU,OACV,eAAe,OACf,oBAAoB,OACpB,MACA,aACA,cACA,YAAY,OACZ,aAAa,OACb,aAAa,OACb,UACA,iBACA,kBACA,UACA,iBAAiB,mBACjB,WACA,GAAG,SACe;CAClB,MAAM,CAAC,cAAc,mBAAmB,SACtC,eAAe,CAAC,CAClB;CACA,MAAM,CAAC,kBAAkB,uBAAuB,eAAyB,CACvE,GAAI,mBAAmB,CAAC,CAC1B,CAAC;CACD,MAAM,eAAe,OAA6B,IAAI;CACtD,MAAM,SAAS,OAAsB,IAAI;CACzC,MAAM,QAAQ,OAAO,KAAK;CAE1B,MAAM,aAAa,QAAQ;CAC3B,MAAM,cAAc,cACZ,IAAI,IAAI,YAAY,gBAAgB,GAC1C,CAAC,UAAU,gBAAgB,CAC7B;CAEA,MAAM,QAAQ,KAAU,UACtB,WACI,SAAS,KAAK,KAAK,IACnB,SACE,OAAO,IAAI,OAAO,IAClB,OAAO,KAAK;CACpB,MAAM,WACJ,aACI,KAAK,KAAK,KAAK,WAAW;EAAE;EAAK;CAAM,EAAE,IACzC,SAAS,MAAM,YAAY,OAAO,EAAA,CACtC,KAAK,WAAW;EAAE,GAAG;EAAO,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK;CAAE,EAAE;CACjE,MAAM,QAAQ,QAAQ,KAAK,UAAU,MAAM,EAAE;CAC7C,MAAM,gBAAgB,MAAM,QAAQ,OAAO,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;CAChE,MAAM,cAAc,MAAM,SAAS,KAAK,kBAAkB,MAAM;CAChE,MAAM,eAAe,gBAAgB,KAAK,CAAC;CAE3C,gBAAgB;EACd,MAAM,QAAQ,aAAa,SAAS,cAAc,OAAO;EACzD,IAAI,OAAO,MAAM,gBAAgB;CACnC,CAAC;CAED,MAAM,cAAc,KAAa,UAAyB;EACxD,MAAM,OAAO,SAAS,YAAY,KAAK,aAAa,MAAM,QAAQ;EAClE,gBAAgB,IAAI;EACpB,eAAe,IAAI;CACrB;CACA,MAAM,mBAAmB,SAAsB;EAC7C,MAAM,MAAM,CAAC,GAAG,IAAI;EACpB,oBAAoB,GAAG;EACvB,mBAAmB,GAAG;CACxB;CACA,MAAM,aAAa,OAAe;EAChC,gBACE,gBAAgB,aAAa,OAAO,IAAI,OAAO,SAAS,MAAM,OAAO,CACvE;EACA,OAAO,UAAU;EACjB,MAAM,UAAU;CAClB;CACA,MAAM,kBAAkB;EACtB,OAAO,UAAU;EACjB,gBAAgB,UAAU,aAAa,OAAO,CAAC,WAAW,CAAC;CAC7D;CACA,MAAM,cAAc,UAAyB;EAC3C,MAAM,UAAU,MAAM;CACxB;CACA,MAAM,iBAAiB,UAAsD;EAC3E,MAAM,UAAU,MAAM;EACtB,IAAI,MAAM,UAAU,MAAM,eAAe;CAC3C;CACA,MAAM,WAAW,KAAa,UAA+C;EAC3E,IAAI,MAAM,QAAQ,SAAS;EAC3B,MAAM,eAAe;EACrB,WAAW,KAAK,KAAK;CACvB;CACA,MAAM,cAAc,UAA6C;EAC/D,IAAI,EAAE,gBAAgB,sBAAsB,gBAAgB,GAAG;EAC/D,MAAM,OAAO,MAAM;EACnB,KAAK,QAAQ,gBAAgB,OAAO,KAAK,YAAY,CAAC;EACtD,KAAK,QAAQ,iBAAiB,OAAO,KAAK,IAAI,KAAK,UAAU,IAAI,CAAC;CACpE;CAEA,MAAM,UAAU,gBACd,qBAAqB,gBAAgB,IACjC;EAAE,eAAe;EAAM,aAAa;CAAK,IACzC,CAAC;CACP,MAAM,YAAY,oBAAoB,EAAE,eAAe,KAAK,IAAI,CAAC;CACjE,MAAM,UAAU,QAAQ,UAAU,aAAa,IAAI;CAEnD,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,kBAAkB,SAAS;EACzC,UAAU,gBAAgB,oBAAoB,aAAa,KAAA;EAE3D,UAAA,qBAAC,SAAD;GACE,GAAI,KAAK,KAAK;GACd,WAAU;GACV,gBAAc;GACd,gBAAc,WAAW,KAAA;GACzB,sBAAoB,gBAAgB,KAAA;GACpC,sBAAoB,qBAAqB,KAAA;GACzC,mBAAiB,cAAc,KAAA;GAPjC,UAAA;IASG,YAAY,KAAA,KAAa,oBAAC,WAAD,EAAA,UAAU,KAAK,OAAO,EAAW,CAAA;IAC3D,oBAAC,SAAD,EAAA,UACE,qBAAC,MAAD,EAAA,UAAA,CACG,cACC,oBAAC,MAAD;KACE,KAAK;KACL,OAAM;KACN,WAAU;KACV,GAAI;KAEJ,UAAA,oBAAC,UAAD;MACE,MAAK;MACL,cAAY;MACZ,SAAS;MACT,UAAU,MAAM,WAAW;MAC3B,sBAAoB,gBAAgB,KAAA;MACpC,UAAU;KACX,CAAA;IACC,CAAA,GAEL,QAAQ,KAAK,QAAQ,gBAAgB;KACpC,MAAM,QAAQ,OAAO,SAAS;KAC9B,MAAM,OAAO,WAAW,WACrB,UAAU,MAAM,QAAQ,OAAO,GAClC;KACA,MAAM,YACJ,QAAQ,IAAI,WAAW,KAAK,CAAC,YAAY,KAAA;KAC3C,OACE,oBAAC,MAAD;MAEE,OAAM;MACN,cAAY;MACZ,aACE,OAAO,WACH,YACE,SAAS,aACT,SACF,KAAA;MAEN,OAAO,EAAE,OAAO,OAAO,MAAM;MAC7B,GAAI,OAAO,WAAW;MAErB,UAAA,OAAO,WACN,qBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,cAAY;OACZ,kBAAgB;OAChB,UAAU,UAAU,WAAW,OAAO,KAAK,KAAK;OAChD,YAAY,UAAU,QAAQ,OAAO,KAAK,KAAK;OANjD,UAAA;QAQE,oBAAC,QAAD;SAAM,WAAU;SACb,UAAA,KAAK,OAAO,KAAK;QACd,CAAA;QACN,oBAAC,QAAD;SAAM,WAAU;SAAmB,eAAY;SAC7C,UAAA,oBAAC,aAAD,EAAa,QAAO,OAAQ,CAAA;QACxB,CAAA;QACL,aAAa,WAAW,SAAS,KAChC,oBAAC,QAAD;SAAM,WAAU;SAAkB,eAAY;SAC3C,UAAA,OAAO;QACJ,CAAA;OAEF;MAER,CAAA,IAAA,KAAK,OAAO,KAAK;KAEjB,GArCG,OAAO,GAqCV;IAER,CAAC,CACC,EAAA,CAAA,EACC,CAAA;IACP,oBAAC,SAAD,EAAA,UACG,QAAQ,WAAW,IAClB,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;KAAI,WAAU;KAA4B;KACvC,UAAA,KAAK,YAAY;IAChB,CAAA,EACF,CAAA,IAEJ,QAAQ,KAAK,EAAE,KAAK,MAAM,aAAa;KACrC,MAAM,aAAa,cAAc,YAAY,IAAI,EAAE;KACnD,OACE,qBAAC,MAAD;MAEE,iBAAe,aAAa,aAAa,KAAA;MACzC,iBAAe,cAAc,KAAA;MAH/B,UAAA,CAKG,cACC,oBAAC,MAAD;OACE,WAAU;OACV,aAAa;OACb,WAAW;OACX,GAAI;OAEJ,UAAA,oBAAC,UAAD;QACE,MAAK;QACL,cACE,WACI,SAAS,KAAK,QAAQ,IACtB,cAAc,WAAW;QAE/B,SAAS;QACT,gBAAgB,UAAU,EAAE;OAC7B,CAAA;MACC,CAAA,GAEL,QAAQ,KAAK,QAAQ,gBACpB,oBAAC,MAAD;OAEE,cAAY,OAAO,SAAS;OAC5B,GAAI,OAAO,WAAW;OAErB,UAAA,KACC,OAAO,SACH,OAAO,OAAO,KAAK,QAAQ,IAC3B,IAAI,OAAO,IACjB;MACE,GATG,OAAO,GASV,CACL,CACC;KApCG,GAAA,EAoCH;IAER,CAAC,EAEE,CAAA;GACF;;CACJ,CAAA;AAET;;;AChTA,MAAM,cAAc,UAClB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAC9C,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,IAChC;AAEN,SAAgB,WAAW,EACzB,QAAQ,QACR,OACA,OACA,OAAO,MACP,WACA,OACA,GAAG,SACe;CAClB,MAAM,WAAW,UAAU,aAAa,WAAW,KAAK,IAAI,KAAA;CAE5D,OACE,oBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,mBAAmB,SAAS;EAC1C,cAAY;EACZ,aAAW;EACX,MAAK;EACL,cAAY;EACZ,OACE,aAAa,KAAA,IACT,QACC;GACC,GAAG;GACH,2BAA2B;EAC7B;EAGN,UAAA,qBAAC,OAAD;GACE,WAAU;GACV,SAAQ;GACR,eAAY;GACZ,WAAU;GAJZ,UAAA;IAME,oBAAC,UAAD;KAAQ,WAAU;KAAyB,IAAG;KAAI,IAAG;KAAI,GAAE;IAAK,CAAA;IAChE,oBAAC,UAAD;KAAQ,WAAU;KAAwB,IAAG;KAAI,IAAG;KAAI,GAAE;IAAQ,CAAA;IAClE,oBAAC,UAAD;KAAQ,WAAU;KAAuB,IAAG;KAAI,IAAG;KAAI,GAAE;IAAK,CAAA;IAC9D,oBAAC,QAAD;KACE,WAAU;KACV,GAAE;IACH,CAAA;IACD,oBAAC,QAAD;KAAM,WAAU;KAAyB,GAAE;IAAsB,CAAA;IACjE,oBAAC,QAAD;KAAM,WAAU;KAAyB,GAAE;IAAwB,CAAA;GAChE;;CACD,CAAA;AAEV;;;ACvDA,MAAM,SAAS;AACf,MAAM,SAAS,KAAK;AACpB,MAAM,OAAO,KAAK;AAClB,MAAM,MAAM,KAAK;AACjB,MAAM,OAAO,IAAI;AACjB,MAAM,QAAQ,QAAQ;AACtB,MAAM,OAAO,SAAS;AAEtB,MAAM,iBAAkE;CACtE;EAAC;EAAU;EAAQ;CAAI;CACvB;EAAC;EAAQ;EAAM;CAAG;CAClB;EAAC;EAAO;EAAK;CAAI;CACjB;EAAC;EAAQ;EAAM;CAAK;CACpB;EAAC;EAAS;EAAO;CAAI;AACvB;AAEA,MAAM,mBAA+C;CACnD,WAAW;CACX,WAAW;AACb;AAEA,SAAgB,mBACd,MACA,KACA,QACQ;CACR,MAAM,YAAY,IAAI,KAAK,mBAAmB,QAAQ,EAAE,SAAS,OAAO,CAAC;CACzE,MAAM,OAAO,OAAO;CACpB,MAAM,WAAW,KAAK,IAAI,IAAI;CAC9B,IAAI,WAAW,KAAK,QAAQ,OAAO,UAAU,OAAO,GAAG,QAAQ;CAC/D,MAAM,CAAC,MAAM,QACX,eAAe,MAAM,KAAK,WAAW,WAAW,KAAK,KACpD,CAAC,QAAQ,IAAI;CAChB,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,IAAI,CAAC;CACtD,OAAO,UAAU,OAAO,OAAO,IAAI,CAAC,SAAS,QAAQ,IAAI;AAC3D;AAIA,MAAM,8BAAc,IAAI,IAAgB;AACxC,IAAI;AACJ,IAAI,iBAAiB,OAAO;AAE5B,SAAS,WAAW;CAClB,IAAI,QAAQ,OAAO;CACnB,KAAK,MAAM,cAAc,aACvB,QAAQ,KAAK,IAAI,OAAO,WAAW,KAAK;CAE1C,IAAI,UAAU,KAAA,KAAa,UAAU,gBAAgB;CACrD,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;CAC3C,QAAQ,KAAA;CACR,iBAAiB,OAAO;CACxB,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG;CAC7B,iBAAiB;CACjB,QAAQ,iBAAiB;EACvB,QAAQ,KAAA;EACR,iBAAiB,OAAO;EACxB,KAAK,MAAM,cAAc,MAAM,KAAK,WAAW,GAAG,WAAW,OAAO;EACpE,SAAS;CACX,GAAG,KAAK;AACV;AAEA,MAAa,iBAAiB;CAC5B,UAAU,OAAe,QAAgC;EACvD,MAAM,aAAyB;GAAE;GAAO;EAAO;EAC/C,YAAY,IAAI,UAAU;EAC1B,SAAS;EACT,aAAa;GACX,YAAY,OAAO,UAAU;GAC7B,SAAS;EACX;CACF;CACA,IAAI,OAAO;EACT,OAAO,YAAY;CACrB;CACA,IAAI,WAAW;EACb,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY;CAC3C;AACF;AAEA,MAAM,UAAU,UACd,iBAAiB,OAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,QAAQ;AAEpE,MAAM,gBAAgB,aACpB,WAAW,OAAO,KAAK,SAAS,WAAW,MAAM,IAAI,SAAS;AAEhE,SAAgB,UAAU,EACxB,MACA,SAAS,QACT,QACA,iBACA,OAAO,OACP,KACA,WACA,GAAG,SACc;CACjB,MAAM,GAAG,WAAW,SAAS,CAAC;CAC9B,MAAM,OAAO,OAAO,IAAI;CACxB,MAAM,QAAQ,OAAO,SAAS,IAAI;CAClC,MAAM,YAAY,QAAQ,KAAA,IAAY,KAAK,IAAI,IAAI,OAAO,GAAG;CAC7D,MAAM,WAAW,KAAK,IAAI,OAAO,SAAS;CAC1C,MAAM,WACJ,WAAW,cAAe,WAAW,UAAU,WAAW;CAC5D,MAAM,QAAQ,aAAa,QAAQ;CACnC,MAAM,UAAU,QAAQ,SAAS,QAAQ,KAAA,KAAa,WAAW;CAEjE,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,OAAO,eAAe,UAAU,aAAa,SAAS,UAAU,QAAQ,CAAC,CAAC;CAC5E,GAAG,CAAC,SAAS,KAAK,CAAC;CAEnB,IAAI,CAAC,OACH,OACE,oBAAC,QAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,iBAAiB,SAAS;EACxC,gBAAa;EAEZ,UAAA,OAAO,IAAI;CACR,CAAA;CAIV,MAAM,UAAU,IAAI,KAAK,IAAI;CAC7B,MAAM,OAAO,IAAI,KAAK,eAAe,QAAQ;EAC3C,WAAW;EACX,WAAW;EACX,UAAU,iBAAiB;CAC7B,CAAC,CAAC,CAAC,OAAO,OAAO;CACjB,MAAM,OAAO,WACT,mBAAmB,MAAM,WAAW,MAAM,IAC1C,IAAI,KAAK,eACP,QACA,mBAAmB,gBACrB,CAAC,CAAC,OAAO,OAAO;CAEpB,OACE,oBAAC,QAAD;EACE,OAAO;EACP,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,iBAAiB,SAAS;EACxC,UAAU,QAAQ,YAAY;EAC9B,eAAa,WAAW,aAAa;EACrC,aAAW,WAAW,KAAA;EAErB,UAAA;CACG,CAAA;AAEV;;;ACzGA,MAAM,eAAe;AACrB,MAAM,kBAAkB;AACxB,MAAM,eAAe;AACrB,MAAM,kBAAkB;AACxB,MAAM,YAAyC;CAAE,IAAI;CAAI,IAAI;CAAI,IAAI;AAAG;AAExE,SAAgB,WAAW,OAAuB;CAChD,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO;CACpC,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,WAAW,KAAK,MAAM,UAAU;CACtC,IAAI,UAAU,OAAO,OAAO,SAAS,EAAE;CACvC,MAAM,MAAM,KAAK,QAAQ,GAAG;CAC5B,OAAO,MAAM,IAAI,IAAI,KAAK,SAAS,MAAM;AAC3C;AAEA,SAAgB,YAAY,OAAe,KAAc,KAAsB;CAC7E,IAAI,OAAO;CACX,IAAI,QAAQ,KAAA,GAAW,OAAO,KAAK,IAAI,MAAM,GAAG;CAChD,IAAI,QAAQ,KAAA,GAAW,OAAO,KAAK,IAAI,MAAM,GAAG;CAChD,OAAO;AACT;AAEA,SAAS,QAAQ,OAAe,QAAwB;CACtD,OAAO,OAAO,MAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;AACjE;AAEA,SAAgB,gBACd,QACA,QACA,WACA,MACmB;CACnB,MAAM,UACJ,cAAc,KAAA,IACV;EACE,uBAAuB;EACvB,uBAAuB;EACvB,GAAG;CACL,IACA;EAAE,uBAAuB,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC;EAAG,GAAG;CAAO;CACxE,MAAM,MAAM,QAAQ;CACpB,MAAM,OAAO,QAAQ;CACrB,IAAI,QAAQ,KAAA,KAAa,SAAS,KAAA,KAAa,MAAM,MACnD,QAAQ,wBAAwB;CAClC,IAAI;EACF,OAAO,IAAI,KAAK,aAAa,QAAQ,OAAO;CAC9C,QAAQ;EACN,OAAO,IAAI,KAAK,aAAa,MAAM;CACrC;AACF;AAEA,SAAgB,YACd,MACA,QACA,QAC2B;CAC3B,MAAM,UAAU,KAAK,KAAK;CAC1B,IAAI,YAAY,IAAI,OAAO;CAC3B,MAAM,QAAQ,IAAI,KAAK,aAAa,MAAM,CAAC,CAAC,cAAc,QAAQ;CAClE,MAAM,UAAU,MAAM,MAAM,SAAS,KAAK,SAAS,SAAS,CAAC,EAAE,SAAS;CACxE,MAAM,QAAQ,MAAM,MAAM,SAAS,KAAK,SAAS,OAAO,CAAC,EAAE,SAAS;CACpE,IAAI,aAAa,QAAQ,QAAQ,YAAY,GAAG;CAChD,aAAa,WAAW,QAAQ,WAAW,EAAE;CAC7C,IAAI,MAAM,KAAK,MAAM,IACnB,aAAa,WAAW,MAAM,MAAM,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;CACjE,IAAI,YAAY,KAAK,aAAa,WAAW,MAAM,OAAO,CAAC,CAAC,KAAK,GAAG;CACpE,aAAa,WAAW,QAAQ,aAAa,EAAE;CAC/C,IAAI,CAAC,2BAA2B,KAAK,UAAU,GAAG,OAAO,KAAA;CACzD,MAAM,SAAS,OAAO,UAAU;CAChC,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG,OAAO,KAAA;CACrC,OAAO,QAAQ,UAAU,YAAY,SAAS,MAAM;AACtD;AAEA,SAAgB,YAAY,EAC1B,OACA,eAAe,MACf,eACA,KACA,KACA,OAAO,GACP,WACA,WACA,QACA,QACA,OAAO,MACP,UAAU,OACV,WAAW,OACX,WAAW,OACX,QAAQ,OACR,OACA,iBAAiB,YACjB,iBAAiB,YACjB,WACA,OACA,MACA,WACA,QACA,cAAc,WACd,mBAAmB,gBACnB,gBAAgB,aAChB,GAAG,SACgB;CACnB,MAAM,CAAC,cAAc,mBAAmB,SAAwB,YAAY;CAC5E,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CACtD,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,UAAU,UAAU,KAAA,IAAY,QAAQ;CAC9C,MAAM,SAAS,OAAO,OAAO;CAC7B,OAAO,UAAU;CACjB,MAAM,WAAW,OAAgC,IAAI;CACrD,MAAM,SAAS,OAA6C,IAAI;CAChE,MAAM,OAAO,OAKH,IAAI;CAEd,MAAM,UAAU,aAAa,OAAO;CACpC,MAAM,SACJ,aAAa,KAAK,IAAI,WAAW,IAAI,GAAG,WAAW,OAAO,GAAG,CAAC;CAChE,MAAM,YAAY,gBAAgB,QAAQ,QAAQ,WAAW,IAAI;CACjE,MAAM,YAAY,YAAY,OAAO,KAAK,UAAU,OAAO,OAAO;CAClE,MAAM,SAAS,YAAY;CAC3B,MAAM,QAAQ,YAAY,QAAQ,QAAQ,KAAA,KAAa,WAAW;CAClE,MAAM,QAAQ,YAAY,QAAQ,QAAQ,KAAA,KAAa,WAAW;CAClE,MAAM,WAAW,UAAU;CAE3B,MAAM,aAAa,SAAiB;EAClC,MAAM,UAAU,YAAY,MAAM,KAAK,GAAG;EAC1C,OAAO,cAAc,KAAA,IAAY,QAAQ,SAAS,SAAS,IAAI;CACjE;CAEA,MAAM,UAAU,SAAwB;EACtC,MAAM,UAAU,SAAS,OAAO,OAAO,UAAU,IAAI;EACrD,SAAS,IAAI;EACb,IAAI,YAAY,OAAO,SAAS;EAChC,OAAO,UAAU;EACjB,gBAAgB,OAAO;EACvB,gBAAgB,OAAO;CACzB;CAEA,MAAM,qBAAoC;EACxC,IAAI,UAAU,MAAM,OAAO,OAAO;EAClC,MAAM,SAAS,YAAY,OAAO,QAAQ,MAAM;EAChD,IAAI,WAAW,KAAA,GAAW;GACxB,SAAS,IAAI;GACb,OAAO,OAAO;EAChB;EACA,OAAO,WAAW,OAAO,OAAO,UAAU,MAAM;CAClD;CAEA,MAAM,oBAAoB;EACxB,IAAI,UAAU,MAAM;EACpB,OAAO,aAAa,CAAC;CACvB;CAEA,MAAM,SAAS,OAAe,OAAsB,OAAO,YAAY;EACrE,IAAI,SAAS,MAAM;GACjB,OAAO,YAAY,GAAG,KAAK,GAAG,CAAC;GAC/B;EACF;EACA,OAAO,QAAQ,OAAO,OAAO,KAAK,IAAI,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC;CAClE;CAEA,MAAM,mBAAmB;EACvB,IAAI,OAAO,YAAY,MAAM,aAAa,OAAO,OAAO;EACxD,OAAO,UAAU;CACnB;CAEA,gBAAgB,YAAY,CAAC,CAAC;CAE9B,MAAM,eAAe,OAAmB,cAAsB;EAC5D,IAAI,MAAM,WAAW,KAAK,QAAQ;EAClC,MAAM,eAAe;EACrB,MAAM,cAAc,oBAAoB,MAAM,SAAS;EACvD,MAAM,QAAQ,aAAa;EAC3B,MAAM,OAAO,OAAe,SAAyB;GACnD,MAAM,SAAS,SAAS,KAAA,IAAY,OAAO,UAAU;GACrD,MAAM,YAAY,MAAM,MAAM;GAK9B,IAHE,OAAO,YAAY,UAClB,YAAY,KAAK,QAAQ,KAAA,MAAc,OAAO,WAAW,MAAM,OAC/D,YAAY,KAAK,QAAQ,KAAA,MAAc,OAAO,WAAW,MAAM,KAChD;IAChB,WAAW;IACX;GACF;GACA,OAAO,UAAU,iBAAiB,IAAI,eAAe,GAAG,KAAK;EAC/D;EACA,WAAW;EACX,IAAI,cAAc,KAAK;CACzB;CAEA,MAAM,gBAAgB,OAA2B,cAAsB;EACrE,IAAI,MAAM,WAAW,KAAK,QAAQ;EAClC,MAAM,YAAY,MAAM,aAAa,CAAC;CACxC;CAEA,MAAM,iBAAiB,UAAwB;EAC7C,YAAY,KAAK,KAAK,CAAC;EACvB,IAAI,MAAM,oBAAoB,UAAU;EACxC,MAAM,SAAS,MAAM,WAAW,UAAU;EAC1C,MAAM,QAAQ,UAAkB;GAC9B,MAAM,eAAe;GACrB,IAAI,CAAC,UAAU,MAAM,OAAO,aAAa,CAAC;EAC5C;EACA,QAAQ,MAAM,KAAd;GACE,KAAK;IACH,KAAK,MAAM;IACX;GACF,KAAK;IACH,KAAK,CAAC,MAAM;IACZ;GACF,KAAK;IACH,KAAK,OAAO;IACZ;GACF,KAAK;IACH,KAAK,CAAC,OAAO;IACb;GACF,KAAK;IACH,IAAI,QAAQ,KAAA,GAAW;IACvB,MAAM,eAAe;IACrB,IAAI,CAAC,UAAU,OAAO,GAAG;IACzB;GACF,KAAK;IACH,IAAI,QAAQ,KAAA,GAAW;IACvB,MAAM,eAAe;IACrB,IAAI,CAAC,UAAU,OAAO,GAAG;IACzB;GACF,KAAK;IACH,YAAY;IACZ;GACF,KAAK;IACH,IAAI,UAAU,MAAM;IACpB,MAAM,eAAe;IACrB,SAAS,IAAI;EAEjB;CACF;CAEA,MAAM,cAAc,UAAqB;EACvC,IAAI,MAAM,WAAW,KAAK,UAAU;EACpC,MAAM,eAAe;EACrB,MAAM,cAAc,oBAAoB,MAAM,SAAS;EACvD,KAAK,UAAU;GACb,IAAI,MAAM;GACV,GAAG,MAAM;GACT,OAAO,aAAa;GACpB,OAAO;EACT;CACF;CAEA,MAAM,aAAa,UAAqB;EACtC,MAAM,QAAQ,KAAK;EACnB,IAAI,CAAC,SAAS,MAAM,OAAO,MAAM,WAAW;EAC5C,MAAM,KAAK,MAAM,UAAU,MAAM;EACjC,IAAI,CAAC,MAAM,SAAS,KAAK,IAAI,EAAE,IAAI,iBAAiB;EACpD,IAAI,CAAC,MAAM,OAAO;GAChB,MAAM,QAAQ;GACd,aAAa,IAAI;EACnB;EACA,IAAI,UAAU;EACd,MAAM,SAAS,MAAM,WAAW,UAAU;EAC1C,MAAM,QAAQ,KAAK,MAAM,KAAK,YAAY;EAC1C,MAAM,OAAO,MAAM,SAAS,YAAY,GAAG,KAAK,GAAG;EACnD,OAAO,QAAQ,OAAO,QAAQ,QAAQ,KAAK,IAAI,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC;CAC3E;CAEA,MAAM,YAAY,UAAqB;EACrC,MAAM,QAAQ,KAAK;EACnB,IAAI,CAAC,SAAS,MAAM,OAAO,MAAM,WAAW;EAC5C,KAAK,UAAU;EACf,aAAa,KAAK;EAClB,IAAI,CAAC,MAAM,SAAS,MAAM,SAAS,aAAa;GAC9C,SAAS,SAAS,MAAM;GACxB,SAAS,SAAS,OAAO;EAC3B;CACF;CAEA,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,oBAAoB,SAAS;EAC3C,OAAO,KAAK,KAAK;EACjB,aAAW;EACX,gBAAc,WAAW,KAAA;EACzB,iBAAe,YAAY,KAAA;EAC3B,iBAAe,YAAY,KAAA;EAC3B,cAAY,SAAS,KAAA;EACrB,kBAAgB,aAAa,KAAA;EAR/B,UAAA;GAUG,SACC,oBAAC,QAAD;IACE,WAAU;IACV,eAAY;IACZ,eAAe;IACf,eAAe;IACf,aAAa;IACb,iBAAiB;IAEhB,UAAA,SAAS,oBAAC,sBAAD;KAAsB,MAAM;KAAU,QAAO;IAAQ,CAAA;GAC3D,CAAA;GAER,oBAAC,YAAD;IACE,WAAU;IACV,kBAAe;IACT;IACN,OAAO;IACP,MAAM,oBAAC,WAAD;KAAW,MAAM;KAAU,QAAO;IAAQ,CAAA;IAChD,UAAU;IACV,UAAU,UAAU;IACpB,gBAAgB,UAAU,YAAY,OAAO,EAAE;IAC/C,aAAa;IACb,iBAAiB;IACjB,sBAAsB;IACtB,cAAc,UAAU,MAAM,eAAe;IAC7C,UAAU,UAAU,aAAa,OAAO,EAAE;GAC3C,CAAA;GACD,oBAAC,SAAD;IACE,GAAI,KAAK,KAAK;IACd,KAAK;IACL,MAAK;IACL,MAAK;IACL,WAAU;IACV,cAAa;IACb,WAAU;IACV,OAAO,SAAS;IACN;IACA;IACV,cACE,cAAc,iBAAiB,KAAA,IAAY,SAAS,KAAA;IAEtD,mBAAiB;IACjB,iBAAe,WAAW,KAAA;IAC1B,iBAAe;IACf,iBAAe;IACf,kBAAgB,aAAa,KAAA;IAC7B,gBAAc,gBAAgB,WAAW,KAAA;IACzC,WAAW,UAAU,SAAS,MAAM,cAAc,KAAK;IACvD,WAAW;IACX,SAAS,UAAU;KACjB,YAAY;KACZ,SAAS,KAAK,KAAK,CAAC;IACtB;GACD,CAAA;GACD,oBAAC,YAAD;IACE,WAAU;IACV,kBAAe;IACT;IACN,OAAO;IACP,MAAM,oBAAC,UAAD;KAAU,MAAM;KAAU,QAAO;IAAQ,CAAA;IAC/C,UAAU;IACV,UAAU,UAAU;IACpB,gBAAgB,UAAU,YAAY,OAAO,CAAC;IAC9C,aAAa;IACb,iBAAiB;IACjB,sBAAsB;IACtB,cAAc,UAAU,MAAM,eAAe;IAC7C,UAAU,UAAU,aAAa,OAAO,CAAC;GAC1C,CAAA;GACA,SAAS,KAAA,KACR,oBAAC,SAAD;IACE,MAAK;IACC;IACN,OAAO,YAAY,OAAO,KAAK,OAAO,OAAO;IACnC;GACX,CAAA;EAEA;;AAET;;;ACxZA,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAEzB,SAAgB,YACd,UACA,SACA,UACA,SACQ;CACR,MAAM,OAAO,KAAK,IAAI,UAAU,CAAC;CACjC,MAAM,QAAQ,UAAU,UAAU,OAAQ,CAAC,UAAU,cAAe;CACpE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AAClD;AAEA,SAAS,OAAO,OAAmB,UAA0B;CAC3D,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WACjD,OAAO,KAAK,IACZ;AACN;AAEA,SAAgB,WAAW,EACzB,WACA,UACA,WACA,iBAAiB,aACjB,OAAO,6BACP,WAAW,kBACX,UAAU,UACV,OAAO,MACP,WAAW,OACX,WACA,OACA,eACA,aACA,iBACA,eACA,WACA,SACA,QACA,eACA,SACA,oBAAoB,iBACpB,GAAG,SACe;CAClB,MAAM,SAAS,GAAG,MAAM,EAAE;CAC1B,MAAM,CAAC,OAAO,YAAY,SAAoB,MAAM;CACpD,MAAM,CAAC,QAAQ,aAAa,SAAS,EAAE;CACvC,MAAM,YAAY,OAAiC,IAAI;CACvD,MAAM,WAAW,OAAO,CAAC;CACzB,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,SAAS,OAAiC,IAAI;CACpD,MAAM,QAAQ,OAAsB,IAAI;CACxC,MAAM,QAAQ,OAAO,CAAC;CACtB,MAAM,QAAQ,OAA6C,IAAI;CAC/D,MAAM,aAAa,OAAO,SAAS;CACnC,WAAW,UAAU;CACrB,MAAM,cAAc,OAAO,QAAQ;CACnC,YAAY,UAAU;CACtB,MAAM,YAAY,UAAU;CAE5B,MAAM,SAAS,UAAkB;EAC/B,SAAS,UAAU;EACnB,UAAU,SAAS,MAAM,YAAY,uBAAuB,OAAO,KAAK,CAAC;CAC3E;CAEA,MAAM,oBAAoB;EACxB,IAAI,MAAM,YAAY,MAAM,qBAAqB,MAAM,OAAO;EAC9D,MAAM,UAAU;CAClB;CAEA,MAAM,QAAQ,QAAgB;EAC5B,MAAM,UAAU,MAAM,MAAM;EAC5B,MAAM,UAAU;EAChB,MAAM,OAAO,YACX,SAAS,SACT,SACA,YAAY,SACZ,QAAQ,OACV;EACA,MAAM,IAAI;EACV,IAAI,QAAQ,WAAW,QAAQ,GAAG;GAChC,QAAQ,UAAU;GAClB,MAAM,UAAU;GAChB,SAAS,WAAW;GACpB,UAAU,OAAO,gBAAgB,WAAW,CAAC;GAC7C,WAAW,QAAQ;GACnB,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU;IAChB,SAAS,WAAW;IACpB,IAAI;GACN,GAAG,aAAa;GAChB;EACF;EACA,IAAI,CAAC,QAAQ,WAAW,QAAQ,GAAG;GACjC,MAAM,UAAU;GAChB,SAAS,MAAM;GACf;EACF;EACA,MAAM,UAAU,sBAAsB,IAAI;CAC5C;CAEA,MAAM,YAAY;EAChB,IAAI,MAAM,YAAY,MAAM;EAC5B,MAAM,UAAU,YAAY,IAAI;EAChC,MAAM,UAAU,sBAAsB,IAAI;CAC5C;CAEA,MAAM,SAAS,SAA4B;EACzC,IAAI,YAAY,aAAa,QAAQ,SAAS;EAC9C,QAAQ,UAAU;EAClB,OAAO,UAAU;EACjB,SAAS,SAAS;EAClB,UAAU,OAAO,WAAW,yBAAyB,CAAC;EACtD,IAAI;CACN;CAEA,MAAM,WAAW,SAA4B;EAC3C,IAAI,OAAO,YAAY,MAAM;EAC7B,OAAO,UAAU;EACjB,IAAI,CAAC,QAAQ,SAAS;EACtB,QAAQ,UAAU;EAClB,SAAS,WAAW;EACpB,UAAU,EAAE;EACZ,IAAI;CACN;CAEA,sBACc;EACV,YAAY;EACZ,IAAI,MAAM,YAAY,MAAM,aAAa,MAAM,OAAO;CACxD,GACA,CAAC,CACH;CAEA,gBAAgB;EACd,IAAI,CAAC,YAAY,CAAC,QAAQ,SAAS;EACnC,QAAQ,UAAU;EAClB,OAAO,UAAU;EACjB,SAAS,WAAW;EACpB,UAAU,EAAE;EACZ,IAAI;CACN,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,cAAc,CAAC,iBAAiB,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CACtE,MAAM,cAAc;EAClB,GAAG;EACH,uBAAuB,OAAO,SAAS,OAAO;CAChD;CACA,MAAM,WAAW,aAAa;CAE9B,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,UAAD;GACE,GAAI,KAAK,KAAK;GACd,KAAK;GACL,MAAK;GACL,WAAW,GAAG,mBAAmB,SAAS;GAC1C,OAAO,KAAK,WAAW;GACvB,gBAAc;GACd,aAAW;GACX,cAAY;GACF;GACV,oBAAkB;GAClB,gBAAgB,UAAU;IACxB,gBAAgB,KAAK,KAAK,CAAC;IAC3B,IAAI,MAAM,oBAAoB,MAAM,WAAW,GAAG;IAClD,MAAM,cAAc,oBAAoB,MAAM,SAAS;IACvD,MAAM,SAAS;GACjB;GACA,cAAc,UAAU;IACtB,cAAc,KAAK,KAAK,CAAC;IACzB,QAAQ,SAAS;GACnB;GACA,kBAAkB,UAAU;IAC1B,kBAAkB,KAAK,KAAK,CAAC;IAC7B,QAAQ,SAAS;GACnB;GACA,gBAAgB,UAAU;IACxB,gBAAgB,KAAK,KAAK,CAAC;IAC3B,IAAI,OAAO,YAAY,aAAa,CAAC,QAAQ,SAAS;IACtD,MAAM,OAAO,MAAM,cAAc,sBAAsB;IAMvD,IAJE,MAAM,UAAU,KAAK,QACrB,MAAM,UAAU,KAAK,SACrB,MAAM,UAAU,KAAK,OACrB,MAAM,UAAU,KAAK,QACV,QAAQ,SAAS;GAChC;GACA,YAAY,UAAU;IACpB,YAAY,KAAK,KAAK,CAAC;IACvB,IAAI,MAAM,kBAAkB;IAC5B,IAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS;IAChD,MAAM,eAAe;IACrB,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK;GAChC;GACA,UAAU,UAAU;IAClB,UAAU,KAAK,KAAK,CAAC;IACrB,IAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS;IAChD,MAAM,eAAe;IACrB,QAAQ,KAAK;GACf;GACA,SAAS,UAAU;IACjB,SAAS,KAAK,KAAK,CAAC;IACpB,QAAQ,KAAK;IACb,QAAQ,SAAS;GACnB;GACA,gBAAgB,UAAU;IACxB,gBAAgB,KAAK,KAAK,CAAC;IAC3B,IAAI,QAAQ,SAAS,MAAM,eAAe;GAC5C;GACA,UAAU,UAAU;IAClB,UAAU,KAAK,KAAK,CAAC;IACrB,MAAM,eAAe;GACvB;GA7DF,UAAA,CA+DE,oBAAC,QAAD;IAAM,WAAU;IAAwB,eAAY;GAAQ,CAAA,GAC5D,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KACE,oBAAC,QAAD;MAAM,WAAU;MAAyB,cAAW;MACjD,UAAA,KAAK,QAAQ;KACV,CAAA;KACN,oBAAC,QAAD;MACE,WAAU;MACV,cAAW;MACX,eAAY;MAEX,UAAA,KAAK,QAAQ;KACV,CAAA;KACN,qBAAC,QAAD;MACE,WAAU;MACV,cAAW;MACX,eAAY;MAHd,UAAA,CAKE,oBAAC,WAAD;OAAW,MAAM,SAAS,OAAO,KAAK;OAAI,QAAO;MAAQ,CAAA,GACxD,KAAK,cAAc,CAChB;;IACF;GACA,CAAA,CAAA;;EACR,oBAAC,QAAD;GAAM,IAAI;GAAQ,WAAU;GACzB,UAAA;EACG,CAAA;EACN,oBAAC,QAAD;GAAM,WAAU;GAAsB,MAAK;GAAS,aAAU;GAC3D,UAAA;EACG,CAAA;CACN,EAAA,CAAA;AAEN;;;ACnPA,MAAM,UAAU,CAAC,cAAc,WAAW;AAC1C,MAAM,WAAW,CAAC,aAAa,SAAS;AAExC,SAAgB,cACd,SACA,OACA,KACQ;CACR,MAAM,QAAQ,QAAQ;CACtB,MAAM,WAAW,cAAsB,CAAC,QAAQ,UAAU,EAAE;CAC5D,IAAI,QAAQ,UAAU,QAAQ,OAAO;EACnC,MAAM,QAAQ,QAAQ,KAAK,GAAG,aAAa,QAAQ;EACnD,IAAI,QAAQ,OAAO,MAAM,QAAQ;EACjC,OAAO,MAAM,KAAK,OAAO,KAAK;CAChC;CACA,MAAM,YAAY,QAAQ,SAAS,GAAG,IAAI,IAAI,SAAS,SAAS,GAAG,IAAI,KAAK;CAC5E,IAAI,cAAc,KAAK,UAAU,GAAG,OAAO;CAC3C,KAAK,IAAI,OAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG;EAC3C,MAAM,SAAU,QAAQ,OAAO,aAAa,QAAS,SAAS;EAC9D,IAAI,QAAQ,IAAI,GAAG,OAAO;CAC5B;CACA,OAAO;AACT;AAEA,SAAgB,iBAAiB,EAC/B,SACA,WACA,OACA,cACA,eACA,OAAO,MACP,YAAY,OACZ,WAAW,OACX,aACwB;CACxB,MAAM,cAAc,MAAM;CAC1B,MAAM,CAAC,mBAAmB,wBAAwB,eAE9C,gBAAgB,QAAQ,MAAM,WAAW,CAAC,OAAO,QAAQ,CAAC,EAAE,SAAS,EACzE;CACA,MAAM,cAAc,SAAS;CAC7B,MAAM,eAAe,QAAQ,WAC1B,WAAW,OAAO,UAAU,WAC/B;CACA,MAAM,gBACJ,gBAAgB,KAAK,CAAC,QAAQ,aAAa,CAAC,WACxC,eACA,QAAQ,WAAW,WAAW,CAAC,OAAO,QAAQ;CAEpD,MAAM,UAAU,UAAkB;EAChC,MAAM,SAAS,QAAQ;EACvB,IAAI,CAAC,UAAU,OAAO,YAAY,UAAU;EAC5C,IAAI,UAAU,KAAA,GAAW,qBAAqB,OAAO,KAAK;EAC1D,IAAI,OAAO,UAAU,aAAa,gBAAgB,OAAO,KAAK;CAChE;CAEA,MAAM,iBAAiB,OAA4B,UAAkB;EACnE,MAAM,OAAO,cAAc,SAAS,OAAO,MAAM,GAAG;EACpD,IAAI,SAAS,IAAI;EACjB,MAAM,eAAe;EACrB,OAAO,IAAI;EACX,SAAS,eAAe,GAAG,YAAY,GAAG,MAAM,CAAC,EAAE,MAAM;CAC3D;CAEA,MAAM,QAAQ;EACZ,yBAAyB,KAAK,IAAI,QAAQ,QAAQ,CAAC;EACnD,yBAAyB,KAAK,IAAI,cAAc,CAAC;CACnD;CAEA,OACE,qBAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,iBAAe,YAAY,KAAA;EAC3B,WAAW,GAAG,yBAAyB,SAAS;EAChD,aAAW;EACX,mBAAiB,aAAa,KAAA;EAC9B,iBAAe,YAAY,KAAA;EACpB;EART,UAAA,CAUE,oBAAC,QAAD;GACE,WAAU;GACV,eAAa,iBAAiB,MAAM,KAAA;GACpC,eAAY;EACb,CAAA,GACA,QAAQ,KAAK,QAAQ,UAAU;GAC9B,MAAM,UAAU,UAAU;GAC1B,OACE,qBAAC,UAAD;IAEE,IAAI,GAAG,YAAY,GAAG;IACtB,MAAK;IACL,MAAK;IACL,WAAU;IACV,gBAAc;IACd,UAAU,UAAU,gBAAgB,IAAI;IACxC,UAAU,YAAY,OAAO;IAC7B,cAAY,UAAU,YAAY;IAClC,eAAe,OAAO,KAAK;IAC3B,YAAY,UAAU,cAAc,OAAO,KAAK;IAXlD,UAAA,CAaG,OAAO,SAAS,KAAA,KACf,oBAAC,QAAD;KAAM,WAAU;KAA8B,eAAY;KACvD,UAAA,KAAK,OAAO,IAAI;IACb,CAAA,GAER,oBAAC,QAAD;KAAM,WAAU;KACb,UAAA,KAAK,OAAO,KAAK;IACd,CAAA,CACA;GApBD,GAAA,OAAO,KAoBN;EAEZ,CAAC,CACE;;AAET;;;ACpHA,MAAM,YAAyC;CAAE,IAAI;CAAI,IAAI;CAAI,IAAI;AAAG;AAExE,SAAgB,UAAU,OAAe,SAAmC;CAC1E,IAAI,QAAQ,SAAS,OAAO;CAC5B,OAAO,UAAU,UAAU,YAAY;AACzC;AAEA,SAAgB,QAAQ,EACtB,OACA,SACA,cAAc,cACd,OAAO,MACP,cACA,YAAY,YACZ,iBAAiB,aACjB,aACe;CACf,OACE,oBAAC,MAAD;EACE,WAAW,GAAG,eAAe,SAAS;EACtC,cAAY;EACZ,oBAAkB;EAClB,aAAW;EAEV,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,QAAQ,UAAU,OAAO,OAAO;GACtC,MAAM,aAAa,UAAU,UAAU,iBAAiB,KAAA;GACxD,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA,CACE,qBAAC,QAAD;IAAM,WAAU;IAAsB,eAAY;IAAlD,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAAuB,UAAA,QAAQ;IAAQ,CAAA,GACvD,oBAAC,QAAD;KAAM,WAAU;KACd,UAAA,oBAAC,WAAD;MAAW,MAAM,UAAU;MAAO,QAAO;KAAQ,CAAA;IAC7C,CAAA,CACF;GACN,CAAA,GAAA,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACG,KAAK,KAAK,KAAK,GACf,UAAU,UACT,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,KAAK;KACF,CAAA,CAEJ;IACL,CAAA,GAAA,KAAK,gBAAgB,KAAA,KACpB,oBAAC,QAAD;KAAM,WAAU;KACb,UAAA,KAAK,KAAK,WAAW;IAClB,CAAA,CAEJ;GACN,CAAA,CAAA,EAAA,CAAA;GAEJ,OACE,qBAAC,MAAD;IAEE,WAAU;IACV,cAAY;IACZ,gBAAc,UAAU,YAAY,SAAS,KAAA;IAJ/C,UAAA,CAMG,aACC,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,aAAa,KAAK;KAEhC,UAAA;IACK,CAAA,IAER,oBAAC,OAAD;KAAK,WAAU;KAAwB,UAAA;IAAa,CAAA,GAErD,QAAQ,MAAM,SAAS,KACtB,oBAAC,QAAD;KAAM,WAAU;KAAyB,eAAY;KACnD,UAAA,oBAAC,QAAD,EAAM,WAAU,oBAAqB,CAAA;IACjC,CAAA,CAEN;GArBG,GAAA,KAAK,MAAM,KAqBd;EAER,CAAC;CACC,CAAA;AAER;;;AChFA,MAAM,WAAW,UACf,UAAU,QACV,UAAU,KAAA,KACV,UAAU,SACT,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM;AAEjD,SAAgB,aAAa,EAC3B,OACA,SAAS,WACT,OAAO,MACP,WAAW,OACX,WACA,GAAG,SACiB;CACpB,OACE,oBAAC,MAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,qBAAqB,SAAS;EAC5C,eAAa;EACb,aAAW;EACX,iBAAe,YAAY,KAAA;EAE1B,UAAA,MAAM,KAAK,MAAM,UAChB,qBAAC,OAAD;GAEE,WAAU;GACV,cAAY,QAAQ,KAAK,KAAK,KAAK,KAAA;GAHrC,UAAA,CAKE,oBAAC,MAAD;IAAI,WAAU;IAA4B,UAAA,KAAK,KAAK,KAAK;GAAM,CAAA,GAC/D,qBAAC,MAAD;IAAI,WAAU;IAAd,UAAA,CACG,QAAQ,KAAK,KAAK,IACjB,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAA2B,eAAY;KAAO,UAAA;IAExD,CAAA,GACN,oBAAC,QAAD;KAAM,WAAU;KAAwB,UAAA;IAAa,CAAA,CACrD,EAAA,CAAA,IAEF,KAAK,KAAK,KAAK,GAEhB,KAAK,SAAS,KAAA,KAAa,KAAK,SAAS,QACxC,oBAAC,QAAD;KAAM,WAAU;KAA2B,UAAA,KAAK,KAAK,IAAI;IAAQ,CAAA,CAEjE;GACD,CAAA,CAAA;EApBE,GAAA,KAAK,MAAM,KAoBb,CACN;CACC,CAAA;AAER;;;ACvCA,SAAgB,iBAAiB,EAC/B,QACA,WACA,KACA,SACA,aAAa,KACS;CACtB,MAAM,QAAQ,OAAO;CACrB,IAAI,UAAU,GAAG,OAAO;CAGxB,IADE,OAAO,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO,QAAQ,MACrD,WAAW,OAAO;CAC9B,IAAI,OAAO;CACX,IAAI,QAAQ;CACZ,OAAO,QAAQ,SAAS,OAAO,OAAO,SAAS,OAAO,WAAW;EAC/D,QAAQ,OAAO,SAAS;EACxB,SAAS;CACX;CAEA,MAAM,UAAU,KAAK,IAAI,OADX,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC,GAAG,KACxB,CAAC;CACrC,OAAO,WAAW,QAAQ,QAAQ;AACpC;AAEA,MAAM,gBAAgB,UAAkB,GAAG,MAAM;AAEjD,SAAS,cAAiB,EACxB,QACA,QACA,QACA,QACA,YAOC;CACD,MAAM,WAAW,OAAyB,IAAI;CAC9C,aAAa,UAAU,IAAI;CAC3B,gBAAgB;EACd,MAAM,QAAQ,4BAA4B;GACxC,MAAM,QAAQ,SAAS;GACvB,IAAI,SAAS,CAAC,MAAM,SAAS,SAAS,aAAa,GAAG,MAAM,MAAM;EACpE,CAAC;EACD,aAAa,qBAAqB,KAAK;CACzC,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,UAA+B;EACpD,IAAI,MAAM,QAAQ,UAAU,SAAS;CACvC;CAEA,OACE,oBAAC,MAAD;EACE,KAAK;EACL,WAAU;EACV,UAAU;EACV,WAAW;EAEV,UAAA,OAAO,KAAK,MAAM,aACjB,oBAAC,MAAD;GAEE,WAAU;GAET,UAAA,KAAK,OAAO,MAAM,SAAS,QAAQ,CAAC;EACnC,GAJG,OAAO,MAAM,SAAS,QAAQ,CAIjC,CACL;CACC,CAAA;AAER;AAEA,SAAgB,aAAgB,EAC9B,OACA,YACA,gBACA,oBACA,UAAU,OAAO,UAAU,OAC3B,aAAa,GACb,eAAe,OACf,gBAAgB,cAChB,WACA,GAAG,SACoB;CACvB,MAAM,UAAU,OAAyB,IAAI;CAC7C,MAAM,aAAa,OAAsB,IAAI;CAC7C,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,UAAU,OAAwB,IAAI;CAC5C,MAAM,WAAW,OAAsB,IAAI;CAC3C,MAAM,CAAC,OAAO,YAAY,SAAS,KAAK;CACxC,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAC1D,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,WAAW,OAAO;EAAE;EAAY;CAAa,CAAC;CACpD,SAAS,UAAU;EAAE;EAAY;CAAa;CAE9C,MAAM,UAAU,kBAAkB;EAChC,SAAS,UAAU;EACnB,MAAM,OAAO,QAAQ;EACrB,MAAM,QAAQ,SAAS;EACvB,IAAI,CAAC,QAAQ,CAAC,OAAO;EACrB,MAAM,QAAQ,iBAAiB,IAAI;EACnC,MAAM,YACJ,KAAK,eACJ,OAAO,WAAW,MAAM,WAAW,KAAK,MACxC,OAAO,WAAW,MAAM,YAAY,KAAK;EAC5C,MAAM,MAAM,OAAO,WAAW,MAAM,SAAS,KAAK;EAClD,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ;EACvC,MAAM,SAAS,MAAM,IAAI;EACzB,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK,sBAAsB,CAAC,CAAC,KAAK;EACrE,MAAM,EAAE,YAAY,OAAO,cAAc,SAAS,SAAS;EAC3D,WACE,iBAAiB;GACf,QAAQ,SAAS,UAAU,OAAO,QAAQ,IAAI;GAC9C;GACA;GACA,SAAS,QAAQ,sBAAsB,CAAC,CAAC,SAAS;GAClD,YAAY;EACd,CAAC,CACH;CACF,GAAG,CAAC,CAAC;CAEL,yBAAyB;EACvB,SAAS,IAAI;CACf,GAAG,CAAC,CAAC;CAEL,yBAAyB;EACvB,IAAI,OAAO,QAAQ;CACrB,GAAG;EAAC;EAAO;EAAO;EAAY;EAAc;CAAO,CAAC;CAEpD,yBAAyB;EACvB,IAAI,CAAC,OAAO;EACZ,WAAW,SAAS,aAAa,SAAS,EAAE;EAC5C,MAAM,iBAAiB;GACrB,IAAI,SAAS,YAAY,MACvB,SAAS,UAAU,sBAAsB,OAAO;EACpD;EACA,MAAM,eAAe;GACnB,IAAI,SAAS,YAAY,MAAM,qBAAqB,SAAS,OAAO;GACpE,SAAS,UAAU;EACrB;EACA,IAAI,OAAO,mBAAmB,aAAa;GACzC,OAAO,iBAAiB,UAAU,QAAQ;GAC1C,aAAa;IACX,OAAO,oBAAoB,UAAU,QAAQ;IAC7C,OAAO;GACT;EACF;EACA,MAAM,WAAW,IAAI,eAAe,QAAQ;EAC5C,IAAI,QAAQ,SAAS,SAAS,QAAQ,QAAQ,OAAO;EACrD,IAAI,SAAS,SAAS,SAAS,QAAQ,SAAS,OAAO;EACvD,aAAa;GACX,SAAS,WAAW;GACpB,OAAO;EACT;CACF,GAAG,CAAC,OAAO,OAAO,CAAC;CAEnB,MAAM,QAAQ,MAAM;CACpB,MAAM,QAAQ,KAAK,IAAI,WAAW,OAAO,KAAK;CAC9C,MAAM,cAAc,QAAQ;CAC5B,MAAM,SAAS,iBAAiB,UAAU,IAAI;CAC9C,MAAM,SAAS,MAAM,MAAM,QAAQ,SAAS,WAAW;CACvD,MAAM,QAAQ,iBAAiB,UAAU,cAAc;CACvD,MAAM,QAAQ,cAAc,WAAW;CAEvC,gBAAgB;EACd,IAAI,gBAAgB,KAAK,MAAM,QAAQ,KAAK;CAC9C,GAAG,CAAC,aAAa,IAAI,CAAC;CAEtB,MAAM,qBAAqB;EACzB,QAAQ,SAAS,QAAQ,QAAQ,CAAC,EAAE,MAAM;CAC5C;CAEA,MAAM,eAAe,OAAe,QAClC,qBAAC,QAAD;EAAW;EAAK,WAAU;EAA1B,UAAA,CACE,qBAAC,QAAD;GAAM,WAAU;GAA2B,eAAY;GAAvD,UAAA,CAA8D,KAC1D,KACE;EACN,CAAA,GAAA,oBAAC,QAAD;GAAM,WAAU;GAA4B,UAAA,cAAc,KAAK;EAAQ,CAAA,CACnE;;CAGR,MAAM,OACJ,cAAc,IACZ,oBAAC,MAAD;EAAI,WAAU;EACX,UAAA,iBACC,KAAK,eAAe,MAAM,CAAC,IAE3B,oBAAC,SAAD;GACE,WAAU;GACV,SAAS,YAAY,aAAa,OAAO;GACzC,WAAW;GACX,WAAW,iBAAiB,UAAU,UAAU;GAC1C;GACN,cAAc;GAEd,UAAA,oBAAC,eAAD;IACU;IACA;IACR,QAAQ,sBAAsB;IACtB;IACR,UAAU;GACX,CAAA;EACM,CAAA;CAET,CAAA,IACF;CAEN,OACE,qBAAC,MAAD;EACE,GAAI,KAAK,KAAK;EACd,KAAK;EACL,WAAW,GAAG,qBAAqB,SAAS;EAC5C,sBAAoB;EACpB,oBAAkB,cAAc,KAAK,KAAA;EALvC,UAAA;GAOG,iBAAiB,WAAW;GAC5B,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,aAC5C,oBAAC,MAAD;IAEE,WAAU;IAET,UAAA,KAAK,WAAW,MAAM,QAAQ,QAAQ,CAAC;GACtC,GAJG,OAAO,MAAM,QAAQ,QAAQ,CAIhC,CACL;GACA,iBAAiB,SAAS;GAC1B,SACC,oBAAC,MAAD;IACE,KAAK;IACL,WAAU;IACV,eAAY;IAEZ,UAAA,qBAAC,OAAD;KAAK,KAAK;KAAU,WAAU;KAA9B,UAAA,CACG,MAAM,KAAK,MAAM,UAChB,oBAAC,OAAD;MAEE,WAAU;MAET,UAAA,KAAK,WAAW,MAAM,KAAK,CAAC;KAC1B,GAJE,OAAO,MAAM,KAAK,CAIpB,CACN,GACD,oBAAC,OAAD;MAAK,WAAU;MACZ,UAAA,iBACG,KAAK,eAAe,KAAK,CAAC,IAC1B,YAAY,KAAK;KAClB,CAAA,CACF;;GACH,CAAA;EAEJ;;AAER;;;ACzPA,SAAgB,WAAW,QAA4C;CACrE,IAAI,OAAO,MAAM,OAAO,OAAO;CAC/B,IAAI,CAAC,OAAO,KAAK,OAAO,KAAA;CACxB,IAAI;EACF,OAAO,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,SAAS,QAAQ,UAAU,EAAE;CAC1D,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,cACd,SACA,OACQ;CACR,MAAM,CAAC,SAAS;CAChB,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,OAAO,UAAU,MAAM,IAAI,MAAM;CACvC,MAAM,OAAO,QAAQ,SAAS;CAC9B,IAAI,QAAQ,GAAG,OAAO;CACtB,OAAO,GAAG,KAAK,SAAS,KAAK,QAAQ,SAAS,IAAI,WAAW;AAC/D;AAIA,SAAgB,SAAS,EACvB,SACA,QAAQ,GACR,MAAM,GACN,YAAY,OACZ,YAAY,KACZ,aAAa,KACb,aACgB;CAChB,MAAM,KAAK,MAAM;CACjB,MAAM,UAAU,OAAwB,IAAI;CAC5C,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,SAAS,OAA0C,CAAC,CAAC;CAC3D,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,QAAQ,aAAa,SAAS,CAAC;CACtC,MAAM,CAAC,WAAW,gBAAgB,SAAS,CAAC;CAC5C,MAAM,EACJ,SACA,OACA,KAAK,YACH,YAA4B,MAAM,MAAM;CAC5C,MAAM,WAAW,YAAY;CAC7B,mBAAmB,YAAY,SAAS,WAAW,UAAU;EAC3D,MAAM;EACN,OAAO;EACP,QAAQ;CACV,CAAC;CAED,MAAM,QAAQ,QAAQ;CACtB,MAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC;CAC1D,MAAM,SAAS,QAAQ;CACvB,MAAM,UAAU,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;CAElD,MAAM,oBAAoB;EACxB,IAAI,OAAO,QAAQ,SAAS,KAAA,GAC1B,OAAO,aAAa,OAAO,QAAQ,IAAI;EACzC,IAAI,OAAO,QAAQ,UAAU,KAAA,GAC3B,OAAO,aAAa,OAAO,QAAQ,KAAK;EAC1C,OAAO,UAAU,CAAC;CACpB;CAEA,MAAM,aAAa;EACjB,YAAY;EACZ,IAAI,CAAC,MAAM,UAAU,CAAC;EACtB,QAAQ,IAAI;CACd;CAEA,MAAM,aAAa;EACjB,YAAY;EACZ,UAAU,UAAU;EACpB,QAAQ,KAAK;CACf;CAEA,MAAM,oBAAoB;EACxB,YAAY;EACZ,OAAO,QAAQ,OAAO,OAAO,WAAW,MAAM,SAAS;CACzD;CAEA,MAAM,qBAAqB;EACzB,IAAI,UAAU,SAAS;EACvB,YAAY;EACZ,OAAO,QAAQ,QAAQ,OAAO,WAAW,MAAM,UAAU;CAC3D;CAEA,gBAAgB,aAAa,CAAC,CAAC;CAE/B,gBAAgB;EACd,IAAI,CAAC,WAAW,CAAC,UAAU;EAC3B,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,UAAU;GAC5B,MAAM,SAAS,QAAQ,SAAS,SAAS,SAAS,aAAa;GAC/D,KAAK;GACL,IAAI,QAAQ,WAAW,SAAS,MAAM;EACxC;EACA,MAAM,qBAAqB,UAAwB;GACjD,MAAM,SAAS,MAAM;GACrB,IACE,CAAC,QAAQ,SAAS,SAAS,MAAM,KACjC,CAAC,QAAQ,SAAS,SAAS,MAAM,GAEjC,KAAK;EACT;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,aAAa;GACX,SAAS,oBAAoB,WAAW,aAAa;GACrD,SAAS,oBAAoB,eAAe,iBAAiB;EAC/D;CACF,GAAG;EAAC;EAAS;EAAS;CAAQ,CAAC;CAE/B,gBAAgB;EACd,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY,SAAS;EAC5D,YAAY,UAAU;EACtB,QAAQ,SACJ,cAA2B,gCAAgC,CAAC,EAC5D,MAAM;CACZ,GAAG;EAAC;EAAS;EAAW;EAAM;EAAS;CAAQ,CAAC;CAEhD,IAAI,UAAU,KAAK,CAAC,SAAS,OAAO;CAEpC,MAAM,cAAc,UAAiD;EACnE,MAAM,OAAO,MAAM;EACnB,IACE,SACC,QAAQ,SAAS,SAAS,IAAI,KAAK,QAAQ,SAAS,SAAS,IAAI,IAElE;EACF,KAAK;CACP;CAEA,MAAM,eAAe,UAA8B;EACjD,IAAI,QAAQ,UAAU,SAAS;GAC7B,KAAK;GACL;EACF;EACA,UAAU,UAAU;EACpB,IAAI,MAAM,WAAW,GAAG;GACtB,YAAY,UAAU;GACtB,cAAc,UAAU,QAAQ,CAAC;EACnC;EACA,KAAK;CACP;CAEA,MAAM,QAAQ,UAAkB;EAC9B,WAAW,WAAW,QAAQ,QAAQ,SAAS,KAAK;CACtD;CAEA,MAAM,qBAAqB,UAGrB;EACJ,IAAI,QAAQ,GAAG;EACf,IAAI,MAAM,QAAQ,cAAc;GAC9B,MAAM,eAAe;GACrB,KAAK,CAAC;EACR,OAAO,IAAI,MAAM,QAAQ,aAAa;GACpC,MAAM,eAAe;GACrB,KAAK,EAAE;EACT;CACF;CAEA,MAAM,OAAO,WAAW,OAAO;CAC/B,MAAM,WAAW,KAAK,IAAI,QAAQ,QAAQ,CAAC;CAE3C,OACE,qBAAC,QAAD;EACE,KAAK;EACL,WAAW,GAAG,gBAAgB,SAAS;EACvC,aAAW,QAAQ,KAAA;EACnB,iBAAiB,UAAuB;GACtC,IAAI,MAAM,gBAAgB,SAAS,YAAY;EACjD;EACA,iBAAiB,UAAuB;GACtC,IAAI,MAAM,gBAAgB,SAAS,aAAa;EAClD;EACA,QAAQ;EAVV,UAAA,CAYE,qBAAC,UAAD;GACE,MAAK;GACL,KAAK;GACL,WAAU;GACV,cAAY,cAAc,SAAS,KAAK;GACxC,iBAAc;GACd,iBAAe;GACf,iBAAe,OAAO,KAAK,KAAA;GAC3B,cAAY,QAAQ,KAAK,KAAA;GACzB,SAAS;GACT,SAAS;GAVX,UAAA,CAYG,QAAQ,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,QAAQ,WACpC,oBAAC,QAAD;IAEE,WAAU;IAET,UAAA,QAAQ;GACL,GAJC,GAAG,OAAO,GAAG,OAAO,OAIrB,CACP,GACA,SAAS,KAAK,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAAqC,KAAE,MAAa;GAC7D,CAAA,CAAA;EACP,CAAA,GAAA,WACC,YACA,aACE,qBAAC,OAAD;GACM;GACJ,KAAK;GACL,WAAU;GACV,cAAY;GACZ,MAAK;GACL,UAAU;GACV,cACE,QAAQ,IACJ,WAAW,MAAM,MAAM,QAAQ,QAAQ,MACvC,UAAU;GAEhB,iBAAiB,UAAuB;IACtC,IAAI,MAAM,gBAAgB,SAAS,YAAY;GACjD;GACA,iBAAiB,UAAuB;IACtC,IAAI,MAAM,gBAAgB,SAAS,aAAa;GAClD;GACA,QAAQ;GACR,WAAW;GAnBb,UAAA;IAqBE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,oBAAC,QAAD;OAAM,WAAU;OAAwB,eAAY;OACjD,UAAA,QAAQ,UACP,oBAAC,OAAD;QAAK,KAAK,QAAQ;QAAS,KAAI;QAAG,OAAO;QAAI,QAAQ;OAAK,CAAA,KAEzD,QAAQ,QAAQ,MAAA,CAAO,OAAO,CAAC,CAAC,CAAC,YAAY;MAE5C,CAAA;MACN,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,QAAQ,UAAU,QAAQ;MACvB,CAAA;MACN,oBAAC,QAAD;OAAM,WAAU;OAAuB,UAAA,QAAQ;MAAe,CAAA;KAC3D;;IACJ,QAAQ,MACP,qBAAC,KAAD;KACE,WAAU;KACV,MAAM,QAAQ;KACd,QAAO;KACP,KAAI;KAJN,UAAA;MAMG,QAAQ;MACT,oBAAC,kBAAD;OACE,WAAU;OACV,MAAM;OACN,QAAO;OACP,eAAY;MACb,CAAA;MACD,oBAAC,QAAD;OAAM,WAAU;OAAmB,UAAA;MAA0B,CAAA;KAC5D;IAEH,CAAA,IAAA,oBAAC,QAAD;KAAM,WAAU;KAAuB,UAAA,QAAQ;IAAY,CAAA;IAE5D,QAAQ,WACP,oBAAC,KAAD;KAAG,WAAU;KAAyB,UAAA,QAAQ;IAAW,CAAA;IAE1D,QAAQ,KACP,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,oBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,cAAW;OACX,eAAe,KAAK,EAAE;OAEtB,UAAA,oBAAC,eAAD;QAAe,MAAM;QAAI,QAAO;QAAO,eAAY;OAAQ,CAAA;MACrD,CAAA;MACR,qBAAC,QAAD;OAAM,WAAU;OAAyB,aAAU;OAAnD,UAAA;QACG,WAAW;QAAE;QAAK;OACf;;MACN,oBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,cAAW;OACX,eAAe,KAAK,CAAC;OAErB,UAAA,oBAAC,gBAAD;QAAgB,MAAM;QAAI,QAAO;QAAO,eAAY;OAAQ,CAAA;MACtD,CAAA;KACL;;GAEJ;EACL,CAAA,GAAA,SAAS,IACX,CACE;;AAEV;;;ACzSA,MAAM,aAA8C;CAClD,MAAM;CACN,SAAS;CACT,UAAU;CACV,SAAS;CACT,OAAO;AACT;AAEA,SAAS,eAAe,IAAoB;CAC1C,IAAI,KAAK,KAAM,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC,EAAE;CACrD,IAAI,KAAK,KAAO,OAAO,IAAI,KAAK,IAAA,CAAM,QAAQ,CAAC,EAAE;CACjD,MAAM,UAAU,KAAK,MAAM,KAAK,GAAK;CACrC,MAAM,UAAU,KAAK,MAAO,KAAK,MAAS,GAAI;CAC9C,OAAO,UAAU,IAAI,GAAG,QAAQ,IAAI,QAAQ,KAAK,GAAG,QAAQ;AAC9D;AAEA,MAAM,YAAY,UAChB,UAAU,aAAa,UAAU;AAEnC,MAAM,aAAa,UACjB,UAAU,aAAa,UAAU;AAEnC,SAAS,eAAe,OAAoC;CAC1D,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,IAAI,MAAM,MAAM,SAAS,SAAS,KAAK,KAAK,CAAC,GAAG,OAAO;CACvD,IAAI,MAAM,OAAO,SAAS,UAAU,KAAK,KAAK,CAAC,GAC7C,OAAO,MAAM,MAAM,SAAS,KAAK,UAAU,OAAO,IAAI,UAAU;CAElE,OAAO,MAAM,MAAM,SAAS,UAAU,KAAK,KAAK,CAAC,IAAI,YAAY;AACnE;AAEA,SAAS,SAAS,OAA2B;CAC3C,MAAM,SAAS,MAAM,QAAQ,SAAS,KAAK,UAAU,OAAO,CAAC,CAAC;CAC9D,IAAI,MAAM,WAAW,GACnB,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,GAAG,SAAS,IAAI,WAAW;CAErD,MAAM,OAAO,GAAG,MAAM,OAAO;CAC7B,OAAO,SAAS,IAAI,GAAG,OAAO,MAAM,KAAK,WAAW,OAAO;AAC7D;AAEA,SAAS,cAAc,OAAuC;CAC5D,MAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK,aAAa,KAAA,CAAS;CAChE,IAAI,MAAM,WAAW,GAAG,OAAO,KAAA;CAC/B,OAAO,MAAM,QAAQ,KAAK,SAAS,OAAO,KAAK,YAAY,IAAI,CAAC;AAClE;AAEA,SAAS,WAAW,OAAyC;CAC3D,KAAK,IAAI,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GACtD,IAAI,SAAS,MAAM,MAAM,CAAC,KAAK,GAAG,OAAO,MAAM;CAEjD,KAAK,IAAI,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GACtD,IAAI,MAAM,MAAM,CAAC,UAAU,QAAQ,OAAO,MAAM;CAElD,OAAO,MAAM,MAAM,SAAS;AAC9B;AAEA,SAAS,YAAY,EAAE,MAAM,OAA8C;CACzE,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,YAAY,GAAG,MAAM,EAAE;CAC7B,MAAM,aAAa,KAAK,UAAU,KAAA,KAAa,KAAK,WAAW,KAAA;CAC/D,MAAM,MAAM;CAEZ,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA;EACE,oBAAC,YAAD;GAAY,OAAO,KAAK;GAAO,OAAO,WAAW,KAAK;GAAQ,MAAK;EAAM,CAAA;EACzE,oBAAC,QAAD;GAAM,WAAU;GACb,UAAA,KAAK,KAAK,SAAS,KAAK,IAAI;EACzB,CAAA;EACL,KAAK,UAAU,KAAA,KACd,oBAAC,QAAD;GAAM,WAAU;GAAwB,UAAA,KAAK;EAAW,CAAA;EAEzD,KAAK,aAAa,KAAA,KACjB,oBAAC,QAAD;GAAM,WAAU;GACb,UAAA,eAAe,KAAK,QAAQ;EACzB,CAAA;CAER,EAAA,CAAA;CAGJ,OACE,qBAAC,KAAD;EACE,WAAU;EACV,cAAY,KAAK;EACjB,aAAW,aAAc,OAAO,SAAS,UAAW,KAAA;EAHtD,UAAA,CAKG,aACC,qBAAC,UAAD;GACE,MAAK;GACL,WAAU;GACV,iBAAe;GACf,iBAAe;GACf,eAAe,QAAQ,CAAC,IAAI;GAL9B,UAAA,CAOG,SACD,oBAAC,QAAD;IAAM,WAAU;IAA0B,eAAY;IACpD,UAAA,oBAAC,gBAAD;KAAgB,MAAM;KAAI,QAAO;IAAQ,CAAA;GACrC,CAAA,CACA;EAER,CAAA,IAAA,oBAAC,OAAD;GAAK,WAAU;GAAuB,UAAA;EAAa,CAAA,GAEpD,cACC,oBAAC,OAAD;GAAK,WAAU;GAA0B,IAAI;GAC3C,UAAA,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,KAAK,UAAU,KAAA,KACd,qBAAC,OAAD;KAAK,WAAU;KAAwB,aAAU;KAAjD,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MAA8B,UAAA;KAAW,CAAA,GACzD,oBAAC,OAAD;MAAK,WAAU;MAAwB,UAAA,KAAK,KAAK,KAAK;KAAO,CAAA,CAC1D;IAEN,CAAA,GAAA,KAAK,WAAW,KAAA,KACf,qBAAC,OAAD;KAAK,WAAU;KAAwB,aAAU;KAAjD,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MAA8B,UAAA;KAAY,CAAA,GAC1D,oBAAC,OAAD;MAAK,WAAU;MAAwB,UAAA,KAAK,KAAK,MAAM;KAAO,CAAA,CAC3D;IAEJ,CAAA,CAAA;;EACF,CAAA,CAEJ;;AAET;AAEA,SAAgB,UAAU,EACxB,OACA,MACA,cAAc,OACd,cACA,OACA,WACA,GAAG,SACc;CACjB,MAAM,CAAC,cAAc,mBAAmB,SAAS,WAAW;CAC5D,MAAM,SAAS,QAAQ;CACvB,MAAM,SAAS,GAAG,MAAM,EAAE;CAC1B,MAAM,QAAQ,eAAe,KAAK;CAClC,MAAM,UAAU,UAAU,aAAa,UAAU;CACjD,MAAM,CAAC,cAAc,mBAAmB,SAAS,EAAE;CACnD,MAAM,aAAa,OAAO,OAAO;CACjC,MAAM,UAAU,UAAU,SAAS,KAAK,IAAI;CAE5C,gBAAgB;EACd,IAAI,WAAW,CAAC,WAAW,SAAS,gBAAgB,OAAO;EAC3D,IAAI,CAAC,SAAS,gBAAgB,EAAE;EAChC,WAAW,UAAU;CACvB,GAAG,CAAC,SAAS,OAAO,CAAC;CAErB,MAAM,eAAe;EACnB,MAAM,OAAO,CAAC;EACd,gBAAgB,IAAI;EACpB,eAAe,IAAI;CACrB;CAEA,MAAM,SACJ,oBAAC,QAAD;EAAM,WAAU;EAAyB,MAAK;EAC3C,UAAA;CACG,CAAA;CAGR,IAAI,MAAM,UAAU,GAClB,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,kBAAkB,SAAS;EACzC,eAAY;EACZ,eAAa;EAJf,UAAA,CAMG,MAAM,MAAM,oBAAC,aAAD;GAAa,MAAM,MAAM;GAAI,KAAI;EAAO,CAAA,GACpD,MACE;;CAIT,MAAM,SAAS,MAAM,QAAQ,SAAS,KAAK,UAAU,OAAO,CAAC,CAAC;CAC9D,MAAM,WAAW,MAAM,QAAQ,SAAS,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC;CAC/D,MAAM,QAAQ,cAAc,KAAK;CACjC,MAAM,SAAS,WAAW,KAAK;CAC/B,MAAM,UACJ,UAAU,KAAA,IACN,QACA,UAAU,aAAa,SACpB,OAAO,SAAS,OAAO,OACxB,OAAO,MAAM,OAAO;CAC5B,MAAM,OAAO,UACT,CACE,SAAS,IAAI,GAAG,OAAO,WAAW,KAAA,GAClC,UAAU,KAAA,IAAY,eAAe,KAAK,IAAI,KAAA,CAChD,CAAC,CAAC,OAAO,OAAO,IAChB,CAAC,GAAG,SAAS,MAAM,MAAM,QAAQ;CAErC,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,kBAAkB,SAAS;EACzC,eAAY;EACZ,cAAY,SAAS,SAAS;EAC9B,eAAa;EALf,UAAA;GAOE,qBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,iBAAe;IACf,iBAAe;IACf,SAAS;IALX,UAAA;KAOE,oBAAC,YAAD;MAAmB;MAAO,OAAO,WAAW;MAAQ,MAAK;KAAM,CAAA;KAC/D,oBAAC,QAAD;MAEE,WAAU;MAET,UAAA,KAAK,OAAO;KACT,GAJC,UAAU,aAAa,SAAS,OAAO,KAAK,SAI7C;KACL,KAAK,KAAK,SACT,oBAAC,QAAD;MAAiB,WAAU;MACxB,UAAA;KACG,GAFK,IAEL,CACP;KACD,oBAAC,QAAD;MAAM,WAAU;MAA0B,eAAY;MACpD,UAAA,oBAAC,gBAAD;OAAgB,MAAM;OAAI,QAAO;MAAQ,CAAA;KACrC,CAAA;IACA;;GACR,oBAAC,OAAD;IAAK,WAAU;IAAuB,IAAI;IACxC,UAAA,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA,MAAM,KAAK,SACV,oBAAC,aAAD;OAAiC;OAAM,KAAI;MAAM,GAA/B,KAAK,EAA0B,CAClD;KACC,CAAA;IACD,CAAA;GACF,CAAA;GACJ;EACE;;AAET;;;AClOA,MAAM,cAA6C;CACjD,SAAS;CACT,UAAU;CACV,SAAS;CACT,UAAU;AACZ;AAEA,MAAM,YAA6C;CACjD,MAAM;CACN,SAAS;CACT,UAAU;CACV,SAAS;CACT,OAAO;AACT;AAEA,MAAM,oCAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,WAAW,QAAqC;CACvD,IAAI,EAAE,kBAAkB,cAAc,OAAO;CAC7C,IAAI,OAAO,mBAAmB,OAAO;CACrC,IAAI,kBAAkB,qBAAqB,OAAO;CAClD,IAAI,kBAAkB,kBACpB,OAAO,CAAC,kBAAkB,IAAI,OAAO,IAAI;CAC3C,OAAO;AACT;AAEA,SAAgB,SAAS,EACvB,OACA,aACA,OACA,WAAW,OACX,WACA,UACA,eAAe,YACf,cAAc,UACd,QAAQ,WACR,SAAS,MACT,YAAY,OACZ,WACA,GAAG,SACa;CAChB,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,GAAG,OAAO;CAC1B,MAAM,gBAAgB,GAAG,OAAO;CAChC,MAAM,UAAU,OAA8B,IAAI;CAClD,MAAM,CAAC,UAAU,eAAe,SAAmB,CAAC,CAAC;CACrD,MAAM,CAAC,KAAK,UAAU,SAAS,KAAK;CACpC,MAAM,UAAU,UAAU;CAC1B,MAAM,WAAW,MAAM,QAAQ,SAAS,CAAC,SAAS,SAAS,KAAK,EAAE,CAAC;CACnE,MAAM,aAAa,WAAW,SAAS,SAAS;CAEhD,MAAM,gBAAgB;EACpB,IAAI,YAAY,UAAU,QAAQ;CACpC;CACA,MAAM,aAAa,OAAO,OAAO;CACjC,WAAW,UAAU;CAErB,gBAAgB;EACd,OAAO,kBAAkB,KAAK,UAAU,SAAS,CAAC;CACpD,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,IAAI,CAAC,WAAW;EAChB,QAAQ,SACJ,cAAiC,yBAAyB,CAAC,EAC3D,MAAM;CACZ,GAAG,CAAC,SAAS,CAAC;CAEd,gBAAgB;EACd,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS;EAClC,MAAM,iBAAiB,UAAoC;GACzD,IAAI,MAAM,QAAQ,WAAW,EAAE,MAAM,WAAW,MAAM,UAAU;GAChE,IAAI,WAAW,MAAM,MAAM,GAAG;GAC9B,MAAM,eAAe;GACrB,WAAW,QAAQ;EACrB;EACA,KAAK,iBAAiB,WAAW,aAAa;EAC9C,aAAa,KAAK,oBAAoB,WAAW,aAAa;CAChE,GAAG,CAAC,QAAQ,OAAO,CAAC;CAEpB,MAAM,aAAa,OAAO,OAAO;CACjC,gBAAgB;EACd,MAAM,OAAO,QAAQ;EACrB,IAAI,WAAW,WAAW,CAAC,WAAW,MAAM;GAC1C,MAAM,SAAS,SAAS;GACxB,IAAI,CAAC,UAAU,WAAW,SAAS,QAAQ,KAAK,SAAS,MAAM,GAC7D,KAAK,MAAM;EAEf;EACA,WAAW,UAAU;CACvB,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,UAAU,OAAe;EAC7B,aAAa,YACX,QAAQ,SAAS,EAAE,IACf,QAAQ,QAAQ,UAAU,UAAU,EAAE,IACtC,CAAC,GAAG,SAAS,EAAE,CACrB;CACF;CAEA,MAAM,UAAU,UAAU,QAAQ;CAClC,MAAM,OAAO,SAAS,QAAQ,SAAS,KAAK,UAAU,SAAS,CAAC,CAAC;CAEjE,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,KAAK;EACL,MAAK;EACL,UAAU,UAAU,KAAA,IAAY;EAChC,mBAAiB;EACjB,oBAAkB,gBAAgB,KAAA,IAAY,gBAAgB,KAAA;EAC9D,WAAW,GAAG,iBAAiB,SAAS;EACxC,cAAY;EACZ,iBAAe,YAAY,UAAU,SAAS,KAAA;EAThD,UAAA;GAWE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAM,WAAU;OAAuB,IAAI;OACxC,UAAA,KAAK,KAAK;MACP,CAAA,GACL,gBAAgB,KAAA,KACf,oBAAC,QAAD;OAAM,WAAU;OAA6B,IAAI;OAC9C,UAAA,KAAK,WAAW;MACb,CAAA,CAEL;;KACL,oBAAC,QAAD;MAAM,WAAU;MAAwB,MAAK;MAC1C,UAAA,CAAC,WACA,oBAAC,QAAD;OAAM,WAAU;OAAwB,UAAA,YAAY;MAAa,CAAA;KAE/D,CAAA;KACL,UAAU,aACT,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACG;OAAK;OAAK,SAAS;MAChB;;IAEL;;GAEJ,UAAU,cACT,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,QAAQ,KAAK,MAAM,UAAU;KAC5B,MAAM,UAAU,GAAG,OAAO,QAAQ;KAClC,MAAM,WAAW,GAAG,QAAQ;KAC5B,MAAM,aAAa,CAAC,SAAS,SAAS,KAAK,EAAE;KAC7C,MAAM,YAAY,KAAK,SAAS;KAChC,OACE,qBAAC,MAAD;MAEE,WAAU;MACV,iBAAe,aAAa,SAAS;MACrC,mBAAiB,UAAU,YAAY,YAAY,KAAA;MAJrD,UAAA,CAME,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,YAAY,UACX,oBAAC,UAAD;QACE,IAAI;QACJ,MAAK;QACL,SAAS;QACT,gBAAgB,OAAO,KAAK,EAAE;QAC9B,oBACE,KAAK,WAAW,KAAA,IAAY,WAAW,KAAA;OAE1C,CAAA,IACC,UAAU,YACZ,oBAAC,YAAD;QACE,OAAO;QACP,OAAO,UAAU;QACjB,MAAK;OACN,CAAA,IAED,oBAAC,QAAD;QAAM,WAAU;QAAwB,eAAY;QACjD,UAAA,QAAQ;OACL,CAAA;MAEJ,CAAA,GACN,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACG,YAAY,UACX,oBAAC,SAAD;QAAO,WAAU;QAAuB,SAAS;QAC9C,UAAA,KAAK,KAAK,KAAK;OACX,CAAA,IAEP,oBAAC,QAAD;QAAM,WAAU;QACb,UAAA,KAAK,KAAK,KAAK;OACZ,CAAA,GAEP,KAAK,WAAW,KAAA,KAAa,WAC5B,oBAAC,QAAD;QAAM,WAAU;QAAwB,IAAI;QACzC,UAAA,KAAK,KAAK,MAAM;OACb,CAAA,CAEJ;MACJ,CAAA,CAAA;KA5CG,GAAA,KAAK,EA4CR;IAER,CAAC;GACC,CAAA;GAGL,WACC,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,YACC,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACG,SAAS;OAAO;OAAK,MAAM;OAAO;MAC/B;;KAEP,YACC,oBAAC,QAAD;MAAQ,SAAQ;MAAQ,MAAK;MAAK,SAAS;MACxC,UAAA,KAAK,WAAW;KACX,CAAA;KAEV,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACG,UACC,oBAAC,QAAD;OAAM,WAAU;OAA0B,eAAY;OACpD,UAAA,oBAAC,KAAD,EAAK,MAAM,CAAC,MAAM,MAAM,QAAQ,GAAG,EAAI,CAAA;MACnC,CAAA,GAER,oBAAC,QAAD;OACE,SAAQ;OACR,MAAK;OACL,WAAU;OACV,UAAU,CAAC;OACX,qBACE,SAAU,MAAM,eAAe,kBAAmB,KAAA;OAEpD,SAAS;OAER,UAAA,KAAK,YAAY;MACZ,CAAA,CACJ;;IACH;;EAEJ;;AAET;;;AC1PA,SAAgB,mBAAmB,SAAgC;CACjE,OAAO,KAAK,IACV,GACA,QAAQ,eAAe,QAAQ,YAAY,QAAQ,YACrD;AACF;AAEA,SAAgB,aACd,SACA,WACS;CACT,OAAO,mBAAmB,OAAO,KAAK,KAAK,IAAI,GAAG,SAAS;AAC7D;AAEA,SAAgB,gBAAgB,OAAuB;CACrD,IAAI,SAAS,GAAG,OAAO;CACvB,OAAO,GAAG,MAAM,OAAO,UAAU,IAAI,YAAY;AACnD;AAIA,MAAM,8BAAc,IAAI,IAAI;CAAC;CAAW;CAAU;AAAM,CAAC;AAEzD,SAAgB,aAAa,EAC3B,UACA,WACA,UACA,YAAY,IACZ,YAAY,gBACZ,YAAY,kBACZ,kBACA,gBACA,WACA,GAAG,SACiB;CACpB,MAAM,cAAc,OAAuB,IAAI;CAC/C,MAAM,aAAa,OAAuB,IAAI;CAC9C,MAAM,YAAY,OAAO,IAAI;CAC7B,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,eAAe,OAAO,SAAS;CACrC,MAAM,oBAAoB,OAAO,cAAc;CAC/C,MAAM,gBAAgB,OAAO,SAAS;CACtC,MAAM,iBAAiB,OAAO,IAAI;CAClC,MAAM,UAAU,OAAO,CAAC;CACxB,MAAM,SAAS,OAAsB,IAAI;CACzC,MAAM,CAAC,QAAQ,kBAAkB,SAAS,IAAI;CAC9C,MAAM,CAAC,QAAQ,aAAa,SAAS,CAAC;CAEtC,aAAa,UAAU;CACvB,kBAAkB,UAAU;CAE5B,MAAM,QAAQ,SAAS,IAAI,KAAK,IAAI,GAAG,YAAY,MAAM;CACzD,MAAM,EACJ,SACA,OACA,KAAK,YACH,YAA+B,CAAC,QAAQ,MAAM;CAElD,MAAM,aAAa,SAAkB;EACnC,UAAU,UAAU;EACpB,eAAe,IAAI;EACnB,IAAI,MAAM,UAAU,CAAC;CACvB;CAEA,MAAM,sBAAsB;EAC1B,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,YAAY,CAAC,UAAU,SAAS;EACrC,SAAS,YAAY,SAAS;CAChC;CAEA,yBAAyB;EACvB,cAAc;CAChB,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,MAAM,WAAW,YAAY;EAC7B,MAAM,UAAU,WAAW;EAC3B,IAAI,CAAC,YAAY,CAAC,WAAW,OAAO,mBAAmB,aAAa;EACpE,MAAM,WAAW,IAAI,qBAAqB;GACxC,IAAI,UAAU,SAAS,WAAW,UAAU;GAC5C,cAAc;EAChB,CAAC;EACD,SAAS,QAAQ,OAAO;EACxB,SAAS,QAAQ,QAAQ;EACzB,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,MAAM,WAAW,cAAc;EAC/B,cAAc,UAAU;EACxB,IAAI,cAAc,KAAA,KAAa,aAAa,KAAA,GAAW;EACvD,IAAI,CAAC,UAAU,WAAW,YAAY,UACpC,WAAW,YAAY,UAAU,YAAY,QAAQ;CACzD,GAAG,CAAC,SAAS,CAAC;CAEd,gBAAgB;EACd,IAAI,eAAe,YAAY,QAAQ;EACvC,eAAe,UAAU;EACzB,kBAAkB,UAAU,MAAM;CACpC,GAAG,CAAC,MAAM,CAAC;CAEX,MAAM,qBAAqB;EACzB,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,UAAU;EACf,MAAM,MAAM,SAAS;EACrB,MAAM,aAAa,MAAM,QAAQ;EACjC,QAAQ,UAAU;EAClB,MAAM,WAAW,aAAa,UAAU,aAAa,OAAO;EAC5D,IAAI,WAAW,SAAS;GACtB,IAAI,UAAU,WAAW,UAAU;GACnC;EACF;EACA,IAAI,UAAU,SAAS;GACrB,IAAI,CAAC,UAAU,UAAU,KAAK;GAC9B;EACF;EACA,IAAI,aAAa,cAAc,mBAAmB,QAAQ,KAAK,IAC7D,UAAU,IAAI;CAClB;CAEA,MAAM,gBAAgB;EACpB,WAAW,UAAU;EACrB,MAAM,WAAW,YAAY;EAC7B,IACE,UAAU,WACV,YACA,SAAS,YAAY,KACrB,SAAS,eAAe,SAAS,cAEjC,UAAU,KAAK;CACnB;CAEA,MAAM,eAAe,UAA8B;EACjD,WAAW,UAAU;EACrB,IAAI,MAAM,SAAS,GAAG,QAAQ;CAChC;CAEA,MAAM,oBAAoB,UAAsB;EAC9C,WAAW,UAAU;EACrB,OAAO,UAAU,MAAM,QAAQ,EAAE,EAAE,WAAW;CAChD;CAEA,MAAM,mBAAmB,UAAsB;EAC7C,MAAM,IAAI,MAAM,QAAQ,EAAE,EAAE;EAC5B,IAAI,OAAO,YAAY,QAAQ,MAAM,KAAA,GAAW;EAChD,IAAI,IAAI,OAAO,UAAU,GAAG,QAAQ;CACtC;CAEA,MAAM,iBAAiB,UAGjB;EACJ,WAAW,UAAU;EACrB,IAAI,MAAM,WAAW,YAAY,SAAS;EAC1C,IAAI,YAAY,IAAI,MAAM,GAAG,GAAG,QAAQ;CAC1C;CAEA,MAAM,qBAAqB;EACzB,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,UAAU;EACf,MAAM,WAAW,QAAQ,YAAY,SAAS;EAC9C,MAAM,SAAS,iBAAiB,UAAU,QAAQ,IAAI;EACtD,WAAW,UAAU,mBAAmB,QAAQ,IAAI;EACpD,UAAU,IAAI;EACd,IAAI,OAAO,SAAS,aAAa,YAC/B,SAAS,SAAS;GAChB,KAAK,SAAS;GACd,UAAU,SAAS,WAAW;EAChC,CAAC;OACE,SAAS,YAAY,SAAS;EACnC,IAAI,UAAU,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;CACtD;CAEA,MAAM,WAAW,QAAQ;CACzB,MAAM,aAAa,WACf,GAAG,UAAU,IAAI,gBAAgB,KAAK,MACtC;CAEJ,OACE,qBAAC,OAAD;EACE,GAAI,KAAK,KAAK;EACd,WAAW,GAAG,qBAAqB,SAAS;EAC5C,eAAa,UAAU,KAAA;EAHzB,UAAA;GAKE,oBAAC,OAAD;IACE,KAAK;IACL,WAAU;IACV,MAAK;IACL,cAAY;IACZ,aAAU;IACV,UAAU;IACV,UAAU;IACV,SAAS;IACT,cAAc;IACd,aAAa;IACb,qBAAqB;KACnB,WAAW,UAAU;IACvB;IACA,WAAW;IAEX,UAAA,oBAAC,OAAD;KACE,KAAK;KACL,WAAW,GAAG,8BAA8B,gBAAgB;KAE3D,UAAA,KAAK,QAAQ;IACX,CAAA;GACF,CAAA;GACJ,WACC,qBAAC,UAAD;IACE,MAAK;IACL,KAAK;IACL,WAAU;IACV,cAAY;IACZ,iBAAe,YAAY,KAAA;IAC3B,cAAY;IACZ,SAAS;IAPX,UAAA,CASE,oBAAC,eAAD;KACE,WAAU;KACV,MAAM;KACN,QAAO;KACP,eAAY;IACb,CAAA,GACD,oBAAC,QAAD;KAAM,WAAU;KAAgC,eAAY;KAC1D,UAAA,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,WAAW,GAAG,MAAM,QAAQ;KACzB,CAAA;IACF,CAAA,CACA;;GAEV,oBAAC,QAAD;IACE,WAAU;IACV,MAAK;IACL,aAAU;IAET,UAAA,gBAAgB,KAAK;GAClB,CAAA;EACH;;AAET"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["clamp","decimalsOf","readableLabel","resolveActive","SonnerToaster","isEmpty"],"sources":["../src/lib/node.ts","../src/lib/overlay.ts","../src/lib/presence.ts","../src/atoms/AnimatedNumber/index.tsx","../src/atoms/Avatar/index.tsx","../src/atoms/Badge/index.tsx","../src/atoms/Spinner/index.tsx","../src/atoms/Button/index.tsx","../src/atoms/Checkbox/index.tsx","../src/atoms/IconButton/index.tsx","../src/atoms/Input/index.tsx","../src/atoms/Kbd/index.tsx","../src/atoms/Progress/index.tsx","../src/atoms/ScrollArea/index.tsx","../src/atoms/Separator/index.tsx","../src/atoms/Skeleton/index.tsx","../src/atoms/Slider/index.tsx","../src/atoms/Surface/index.tsx","../src/atoms/Textarea/index.tsx","../src/atoms/Toggle/index.tsx","../src/molecules/Accordion/index.tsx","../src/molecules/Alert/index.tsx","../src/molecules/Attachment/index.tsx","../src/molecules/AvatarGroup/index.tsx","../src/molecules/Breadcrumb/index.tsx","../src/molecules/Calendar/index.tsx","../src/molecules/Card/index.tsx","../src/molecules/Collapsible/index.tsx","../src/lib/filter.ts","../src/lib/highlight.tsx","../src/molecules/Combobox/index.tsx","../src/molecules/Menu/MenuContent.tsx","../src/molecules/ContextMenu/index.tsx","../src/lib/focus.ts","../src/molecules/Dialog/index.tsx","../src/molecules/Drawer/index.tsx","../src/molecules/FieldMessage/index.tsx","../src/molecules/Field/index.tsx","../src/molecules/Popover/focusFlow.ts","../src/molecules/Popover/trigger.ts","../src/molecules/HoverCard/index.tsx","../src/molecules/Menu/index.tsx","../src/molecules/OTPInput/index.tsx","../src/molecules/Pagination/index.tsx","../src/molecules/Popover/index.tsx","../src/molecules/QuestionCard/index.tsx","../src/molecules/RadioGroup/index.tsx","../src/molecules/Reveal/index.tsx","../src/molecules/Select/index.tsx","../src/molecules/Stat/index.tsx","../src/molecules/Tabs/index.tsx","../src/molecules/TaskList/index.tsx","../src/molecules/Timeline/index.tsx","../src/molecules/Toast/index.tsx","../src/molecules/Toolbar/index.tsx","../src/molecules/Tooltip/controller.ts","../src/molecules/Tooltip/index.tsx","../src/organisms/Chart/scale.ts","../src/organisms/Chart/index.tsx","../src/organisms/CommandPalette/index.tsx","../src/organisms/EmptyState/index.tsx","../src/organisms/MagneticDropzone/index.tsx","../src/organisms/Menubar/index.tsx","../src/organisms/ReasoningSteps/index.tsx","../src/organisms/Resizable/index.tsx","../src/organisms/SidePanel/index.tsx","../src/organisms/Sidebar/index.tsx","../src/organisms/StreamingText/index.tsx","../src/organisms/Table/rows.ts","../src/organisms/Table/index.tsx","../src/atoms/StatusMark/index.tsx","../src/atoms/Timestamp/index.tsx","../src/atoms/NumberInput/index.tsx","../src/atoms/HoldButton/index.tsx","../src/molecules/SegmentedControl/index.tsx","../src/molecules/Stepper/index.tsx","../src/molecules/MetadataList/index.tsx","../src/molecules/OverflowList/index.tsx","../src/molecules/Citation/index.tsx","../src/molecules/ToolCalls/index.tsx","../src/molecules/PlanCard/index.tsx","../src/organisms/ChatScroller/index.tsx"],"sourcesContent":["export type RenderableElement = {\n type: any;\n props: any;\n key?: any;\n};\n\nexport type Renderable =\n | string\n | number\n | boolean\n | null\n | undefined\n | Iterable<Renderable>\n | RenderableElement;\n\nexport const node = (value: unknown): any => value;\n","import type { RefObject } from \"react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nexport type OverlaySide = \"top\" | \"bottom\" | \"left\" | \"right\";\nexport type OverlayAlign = \"start\" | \"center\" | \"end\";\n\nexport type OverlayRect = {\n left: number;\n top: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n};\n\nexport type OverlayPosition = {\n left: number;\n top: number;\n side: OverlaySide;\n};\n\nexport type OverlayPlacement = {\n /** Preferred side of the trigger the overlay sits on. Default: bottom. */\n side?: OverlaySide;\n /** Cross-axis alignment for top/bottom placements. Default: start. */\n align?: OverlayAlign;\n /** Gap between trigger and overlay. */\n offset?: number;\n /** Distance kept from every viewport edge while clamping. */\n padding?: number;\n /** Match the trigger's width (listboxes that mirror their field). */\n matchWidth?: boolean;\n};\n\ntype ResolvedPlacement = {\n side: OverlaySide;\n align: OverlayAlign;\n offset: number;\n padding: number;\n};\n\n/**\n * Layout effects are skipped on the server so static rendering of an open\n * overlay never warns.\n */\nexport const useIsoLayoutEffect =\n typeof document === \"undefined\" ? useEffect : useLayoutEffect;\n\nfunction clamp(value: number, min: number, max: number): number {\n const low = Math.min(min, max);\n const high = Math.max(min, max);\n return Math.min(Math.max(value, low), high);\n}\n\n/**\n * Pure placement math: flip to the side with room, align, then clamp inside\n * the viewport so nothing escapes a window, dock, or small screen.\n */\nexport function resolvePlacement(\n trigger: OverlayRect,\n content: { width: number; height: number },\n viewport: { width: number; height: number },\n placement: ResolvedPlacement,\n): OverlayPosition {\n const { side: wanted, align, offset, padding } = placement;\n let side = wanted;\n\n if (side === \"left\" || side === \"right\") {\n const need = content.width + offset + padding;\n const roomLeft = trigger.left - padding;\n const roomRight = viewport.width - trigger.right - padding;\n if (side === \"left\" && roomLeft < need && roomRight > roomLeft)\n side = \"right\";\n else if (side === \"right\" && roomRight < need && roomLeft > roomRight)\n side = \"left\";\n } else {\n const need = content.height + offset + padding;\n const roomBelow = viewport.height - trigger.bottom - padding;\n const roomAbove = trigger.top - padding;\n if (side === \"bottom\" && roomBelow < need && roomAbove > roomBelow)\n side = \"top\";\n else if (side === \"top\" && roomAbove < need && roomBelow > roomAbove)\n side = \"bottom\";\n }\n\n let left: number;\n let top: number;\n\n if (side === \"bottom\" || side === \"top\") {\n top =\n side === \"bottom\"\n ? trigger.bottom + offset\n : trigger.top - content.height - offset;\n left =\n align === \"start\"\n ? trigger.left\n : align === \"end\"\n ? trigger.right - content.width\n : trigger.left + (trigger.width - content.width) / 2;\n } else {\n left =\n side === \"right\"\n ? trigger.right + offset\n : trigger.left - content.width - offset;\n top = trigger.top + (trigger.height - content.height) / 2;\n }\n\n left = clamp(left, padding, viewport.width - content.width - padding);\n top = clamp(top, padding, viewport.height - content.height - padding);\n\n return { left: Math.round(left), top: Math.round(top), side };\n}\n\n/** Where the entrance should grow from: the corner touching the trigger. */\nexport function overlayOrigin(side: OverlaySide, align: OverlayAlign): string {\n if (side === \"left\") return \"right center\";\n if (side === \"right\") return \"left center\";\n const edge = side === \"bottom\" ? \"top\" : \"bottom\";\n if (align === \"center\") return `${edge} center`;\n return `${edge} ${align === \"start\" ? \"left\" : \"right\"}`;\n}\n\nconst SCOPE_ATTRIBUTES = [\n \"data-sephiro-motion\",\n \"data-sephiro-theme\",\n \"data-theme\",\n \"dir\",\n] as const;\n\nexport type OverlayScopeAttribute = (typeof SCOPE_ATTRIBUTES)[number];\n\nexport type OverlayScope = {\n attributes: Partial<Record<OverlayScopeAttribute, string>>;\n tokens: Record<string, string>;\n};\n\nconst TOKEN_PREFIX = \"--sph-\";\nconst MOTION_OFF_TOKENS = new Set([\n \"--sph-motion-fast\",\n \"--sph-motion-normal\",\n \"--sph-motion-slow\",\n \"--sph-motion-stagger\",\n]);\nconst copiedTokens = new WeakMap<object, string[]>();\n\nfunction readTokens(\n element: Element,\n tokens: OverlayScope[\"tokens\"],\n motionOff: boolean,\n): void {\n const { style } = element as Partial<ElementCSSInlineStyle>;\n if (!style) return;\n for (let index = 0; index < style.length; index += 1) {\n const name = style.item(index);\n if (!name.startsWith(TOKEN_PREFIX) || name in tokens) continue;\n if (motionOff && MOTION_OFF_TOKENS.has(name)) continue;\n const value = style.getPropertyValue(name).trim();\n if (value) tokens[name] = value;\n }\n}\n\nexport function resolveScope(source: Element | null): OverlayScope {\n const attributes: OverlayScope[\"attributes\"] = {};\n const tokens: OverlayScope[\"tokens\"] = {};\n if (!source) return { attributes, tokens };\n\n for (const name of SCOPE_ATTRIBUTES) {\n const value = source.closest(`[${name}]`)?.getAttribute(name);\n if (value) attributes[name] = value;\n }\n\n let motionOff = false;\n for (\n let element: Element | null = source;\n element;\n element = element.parentElement\n ) {\n readTokens(element, tokens, motionOff);\n if (element.hasAttribute(\"data-sephiro-theme\")) break;\n if (element.getAttribute(\"data-sephiro-motion\") === \"off\") motionOff = true;\n }\n\n return { attributes, tokens };\n}\n\nexport function inheritScope(\n source: Element | null,\n target: HTMLElement | null,\n): void {\n if (!target) return;\n const { attributes, tokens } = resolveScope(source);\n\n for (const name of SCOPE_ATTRIBUTES) {\n const value = attributes[name];\n if (value) target.setAttribute(name, value);\n else target.removeAttribute(name);\n }\n\n for (const name of copiedTokens.get(target) ?? []) {\n if (!(name in tokens)) target.style.removeProperty(name);\n }\n for (const [name, value] of Object.entries(tokens)) {\n target.style.setProperty(name, value);\n }\n copiedTokens.set(target, Object.keys(tokens));\n}\n\nexport const inheritMotionScope = inheritScope;\n\n/**\n * True once the tree may render into `document.body`. Server renders and the\n * first client render keep markup identical (the overlay simply mounts later),\n * then the portal switches on in a layout effect, before the browser paints.\n */\nexport function usePortaled(): boolean {\n const [portaled, setPortaled] = useState(false);\n useIsoLayoutEffect(() => {\n setPortaled(true);\n }, []);\n return portaled;\n}\n\n/**\n * Measures trigger and content, then pins the overlay to fixed coordinates.\n * Flips, clamps, and re-measures on scroll (capture, so inner scrollers\n * count) and resize while active.\n */\nexport function useOverlayPosition<E extends HTMLElement>(\n triggerRef: RefObject<HTMLElement | null>,\n contentRef: RefObject<E | null>,\n active: boolean,\n placement: OverlayPlacement = {},\n): void {\n const {\n side = \"bottom\",\n align = \"start\",\n offset = 4,\n padding = 8,\n matchWidth = false,\n } = placement;\n const frameRef = useRef<number | null>(null);\n\n useIsoLayoutEffect(() => {\n if (!active) return;\n\n const update = () => {\n frameRef.current = null;\n const trigger = triggerRef.current;\n const content = contentRef.current;\n if (!trigger || !content) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n if (matchWidth)\n content.style.width = `${Math.round(triggerRect.width)}px`;\n\n content.style.position = \"fixed\";\n const contentSize = {\n width: content.offsetWidth,\n height: content.offsetHeight,\n };\n\n const resolved = resolvePlacement(\n triggerRect,\n contentSize,\n { width: window.innerWidth, height: window.innerHeight },\n { side, align, offset, padding },\n );\n\n const style = content.style;\n style.left = `${resolved.left}px`;\n style.top = `${resolved.top}px`;\n style.right = \"auto\";\n style.bottom = \"auto\";\n style.translate = \"none\";\n style.transformOrigin = overlayOrigin(resolved.side, align);\n content.dataset.side = resolved.side;\n };\n\n const schedule = () => {\n if (frameRef.current === null)\n frameRef.current = requestAnimationFrame(update);\n };\n\n inheritMotionScope(triggerRef.current, contentRef.current);\n update();\n window.addEventListener(\"resize\", schedule);\n document.addEventListener(\"scroll\", schedule, {\n capture: true,\n passive: true,\n });\n return () => {\n window.removeEventListener(\"resize\", schedule);\n document.removeEventListener(\"scroll\", schedule, { capture: true });\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n };\n }, [\n active,\n align,\n matchWidth,\n offset,\n padding,\n side,\n contentRef,\n triggerRef,\n ]);\n}\n","import type { RefObject } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport type MotionSpeed = \"fast\" | \"normal\" | \"slow\";\n\nconst SPEED_TOKEN: Record<MotionSpeed, string> = {\n fast: \"--sph-motion-fast\",\n normal: \"--sph-motion-normal\",\n slow: \"--sph-motion-slow\",\n};\n\n/** Extra time granted to an exit animation so React never cuts it short. */\nconst EXIT_FRAME_BUDGET = 40;\n\n/** Parses a CSS time string (\"180ms\", \"0.18s\", \"0ms\") into milliseconds. */\nexport function parseDurationMs(value: string): number {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)(ms|s)?$/);\n if (!match) return 0;\n const amount = Number.parseFloat(match[1]);\n if (!Number.isFinite(amount) || amount <= 0) return 0;\n return match[2] === \"s\" ? amount * 1000 : amount;\n}\n\n/**\n * Reads the motion token in effect for an element, honouring theme\n * overrides, `prefers-reduced-motion`, and `data-sephiro-motion=\"off\"`.\n * Returns 0 when there is nothing to wait for.\n */\nexport function motionDurationMs(\n element: HTMLElement | null,\n speed: MotionSpeed,\n): number {\n if (typeof window === \"undefined\" || typeof getComputedStyle !== \"function\")\n return 0;\n const source = element ?? document.documentElement;\n const raw = getComputedStyle(source).getPropertyValue(SPEED_TOKEN[speed]);\n return Math.min(parseDurationMs(raw || \"0ms\"), 1200);\n}\n\nexport type Presence<E extends HTMLElement = HTMLElement> = {\n /** Keep rendering the overlay while its exit animation plays. */\n present: boolean;\n /** True once the overlay has begun leaving; drive exit styles with it. */\n leaving: boolean;\n /** `open` while settled, `closed` once leaving. */\n state: \"open\" | \"closed\";\n /** Attach to the overlay element so its exit duration can be measured. */\n ref: RefObject<E | null>;\n};\n\n/**\n * Holds an overlay mounted for exactly as long as its exit animation runs.\n *\n * Enter animations replay on mount, so the component only needs to render\n * while `present` and style itself with `state`:\n *\n * ```tsx\n * const { present, state, ref } = usePresence(open, \"fast\");\n * return present ? <div ref={ref} data-state={state} /> : null;\n * ```\n */\nexport function usePresence<E extends HTMLElement = HTMLElement>(\n open: boolean,\n speed: MotionSpeed = \"normal\",\n): Presence<E> {\n const ref = useRef<E | null>(null);\n const [present, setPresent] = useState(open);\n const [leaving, setLeaving] = useState(false);\n\n useEffect(() => {\n if (open) {\n setLeaving(false);\n setPresent(true);\n return;\n }\n if (!present) return;\n const duration = motionDurationMs(ref.current, speed);\n if (duration <= 0) {\n setPresent(false);\n return;\n }\n setLeaving(true);\n const timer = setTimeout(() => {\n setPresent(false);\n setLeaving(false);\n }, duration + EXIT_FRAME_BUDGET);\n return () => clearTimeout(timer);\n }, [open, present, speed]);\n\n return {\n present,\n leaving,\n state: leaving ? \"closed\" : \"open\",\n ref,\n };\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\nimport { motionDurationMs } from \"@/lib/presence.js\";\n\nexport type AnimatedNumberProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\"\n> & {\n value: number;\n from?: number;\n duration?: number;\n format?: (value: number) => string;\n};\n\nconst decimalsOf = (value: number) => {\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.min(fraction.length, 3);\n};\n\nexport function AnimatedNumber({\n value,\n from,\n duration = 700,\n format,\n className,\n ...props\n}: AnimatedNumberProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const shownRef = useRef<number>(from ?? value);\n const [display, setDisplay] = useState(value);\n const precision = decimalsOf(value);\n\n useIsoLayoutEffect(() => {\n const target = value;\n const start = shownRef.current;\n if (start === target) return;\n shownRef.current = target;\n if (duration <= 0 || motionDurationMs(ref.current, \"normal\") <= 0) {\n setDisplay(target);\n return;\n }\n const begun = performance.now();\n let frame = 0;\n const tick = (now: number) => {\n const progress = Math.min(1, (now - begun) / duration);\n const eased = 1 - (1 - progress) ** 3;\n const current = start + (target - start) * eased;\n shownRef.current = progress < 1 ? current : target;\n setDisplay(shownRef.current);\n if (progress < 1) frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [value, duration]);\n\n return (\n <span\n {...node(props)}\n ref={ref}\n className={cn(\"sph-animated-number\", className)}\n >\n {format\n ? format(display)\n : precision > 0\n ? display.toFixed(precision)\n : String(Math.round(display))}\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\n\nexport type AvatarProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n /** Image URL. Falls back to `name` initials when it fails to load. */\n src?: string;\n name?: string;\n size?: ControlSize;\n status?: AvatarStatus;\n};\n\nfunction initialsOf(name: string | undefined): string {\n if (!name) return \"?\";\n const words = name.trim().split(/\\s+/).slice(0, 2);\n return words.map((word) => word[0]?.toUpperCase() ?? \"\").join(\"\") || \"?\";\n}\n\nexport function Avatar({\n src,\n name,\n size = \"md\",\n status,\n className,\n ...props\n}: AvatarProps) {\n const [failed, setFailed] = useState(false);\n const showImage = Boolean(src) && !failed;\n\n return (\n <span\n {...node(props)}\n className={cn(\"sph-avatar\", className)}\n data-size={size}\n title={name}\n >\n {showImage ? (\n <img\n className=\"sph-avatar__image\"\n src={src}\n alt={name ?? \"\"}\n onError={() => setFailed(true)}\n />\n ) : (\n <span className=\"sph-avatar__initials\" aria-hidden=\"true\">\n {initialsOf(name)}\n </span>\n )}\n {status !== undefined && (\n <span\n className=\"sph-avatar__status\"\n data-status={status}\n aria-hidden=\"true\"\n />\n )}\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type BadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n variant?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n size?: ControlSize;\n children?: Renderable;\n};\n\nexport function Badge({\n variant = \"neutral\",\n size = \"sm\",\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-badge\", className)}\n data-variant={variant}\n data-size={size}\n >\n {node(children)}\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SpinnerProps = HTMLAttributes<HTMLSpanElement> & {\n size?: ControlSize;\n label?: string;\n};\n\nexport function Spinner({\n size = \"md\",\n label,\n className,\n ...props\n}: SpinnerProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-spinner\", `sph-spinner--${size}`, className)}\n role={label ? \"status\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes, MouseEvent } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlDensity, ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type ButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n variant?: \"primary\" | \"secondary\" | \"quiet\";\n size?: ControlSize;\n density?: ControlDensity;\n motion?: \"lift\" | \"none\";\n loading?: boolean;\n children?: Renderable;\n};\n\nexport function Button({\n variant = \"secondary\",\n size = \"md\",\n density = \"default\",\n motion = \"lift\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n children,\n onClick,\n \"aria-busy\": ariaBusy,\n \"aria-disabled\": ariaDisabled,\n ...props\n}: ButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n return (\n <button\n type={type}\n className={cn(\"sph-button\", className)}\n data-variant={variant}\n data-size={size}\n data-density={density}\n data-motion={motion}\n data-loading={loading || undefined}\n disabled={disabled}\n {...node(props)}\n aria-busy={ariaBusy ?? (loading || undefined)}\n aria-disabled={loading ? true : ariaDisabled}\n onClick={handleClick}\n >\n <span className=\"sph-button__label\">{node(children)}</span>\n {loading && (\n <span className=\"sph-button__spinner\">\n <Spinner size=\"sm\" />\n </span>\n )}\n </button>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type CheckboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> & {\n label?: Renderable;\n size?: ControlSize;\n invalid?: boolean;\n};\n\nexport function Checkbox({\n label,\n size = \"md\",\n invalid = false,\n className,\n ...props\n}: CheckboxProps) {\n const control = (\n <input\n {...node(props)}\n type=\"checkbox\"\n className=\"sph-checkbox__input\"\n data-size={size}\n aria-invalid={invalid ? true : props[\"aria-invalid\"]}\n />\n );\n\n return (\n <label className={cn(\"sph-checkbox\", className)} data-size={size}>\n {control}\n <span className=\"sph-checkbox__box\" aria-hidden=\"true\">\n <CheckIcon className=\"sph-checkbox__check\" />\n </span>\n {label !== undefined && (\n <span className=\"sph-checkbox__label\">{node(label)}</span>\n )}\n </label>\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes, MouseEvent } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlDensity, ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n icon: Renderable;\n label: string;\n size?: ControlSize;\n density?: ControlDensity;\n variant?: \"ghost\" | \"solid\" | \"outline\";\n loading?: boolean;\n};\n\nexport function IconButton({\n icon,\n label,\n size = \"md\",\n density = \"default\",\n variant = \"ghost\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n onClick,\n ...props\n}: IconButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n return (\n <button\n {...node(props)}\n type={type}\n className={cn(\"sph-icon-button\", className)}\n data-size={size}\n data-density={density}\n data-variant={variant}\n data-loading={loading || undefined}\n aria-label={props[\"aria-label\"] ?? label}\n aria-busy={loading ? true : props[\"aria-busy\"]}\n aria-disabled={loading ? true : props[\"aria-disabled\"]}\n disabled={disabled}\n onClick={handleClick}\n >\n <span className=\"sph-icon-button__icon\">{node(icon)}</span>\n {loading && (\n <span className=\"sph-icon-button__spinner\">\n <Spinner size={size === \"lg\" ? \"md\" : \"sm\"} />\n </span>\n )}\n </button>\n );\n}\n","import { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Input({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: InputProps) {\n return (\n <input\n {...node(props)}\n className={cn(\"sph-input\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type KbdProps = {\n /**\n * Key caps to render. An array draws one cap per entry (`[\"⌘\", \"K\"]`);\n * a single value draws one cap (`\"Esc\"`).\n */\n keys: Renderable;\n className?: string;\n};\n\nexport function Kbd({ keys, className }: KbdProps) {\n const caps = Array.isArray(keys) ? keys : [keys];\n return (\n <kbd className={cn(\"sph-kbd\", className)}>\n {caps.map((cap, index) => (\n <kbd key={index} className=\"sph-kbd__key\">\n {node(cap)}\n </kbd>\n ))}\n </kbd>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ProgressProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** Completion from 0 to 100. Omit it for the indeterminate sweep. */\n value?: number;\n label?: string;\n size?: ControlSize;\n};\n\nexport function Progress({\n value,\n label,\n size = \"md\",\n className,\n ...props\n}: ProgressProps) {\n const determinate = typeof value === \"number\" && Number.isFinite(value);\n const clamped = determinate\n ? Math.min(Math.max(value as number, 0), 100)\n : undefined;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-progress\", className)}\n data-size={size}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={determinate ? 0 : undefined}\n aria-valuemax={determinate ? 100 : undefined}\n aria-valuenow={clamped}\n aria-valuetext={\n clamped !== undefined ? `${Math.round(clamped)}%` : undefined\n }\n >\n <span className=\"sph-progress__track\">\n <span\n className=\"sph-progress__bar\"\n data-indeterminate={determinate ? undefined : \"true\"}\n style={\n determinate\n ? ({ \"--sph-progress-value\": `${clamped}%` } as CSSProperties &\n Record<string, string | number>)\n : undefined\n }\n />\n </span>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type ScrollAreaProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n children?: Renderable;\n};\n\nexport function ScrollArea({\n orientation = \"vertical\",\n className,\n children,\n ...props\n}: ScrollAreaProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-scroll-area\", className)}\n data-orientation={orientation}\n >\n {node(children)}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SeparatorProps = Omit<HTMLAttributes<HTMLHRElement>, \"children\"> & {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n};\n\nexport function Separator({\n orientation = \"horizontal\",\n decorative = true,\n className,\n ...props\n}: SeparatorProps) {\n return (\n <hr\n {...node(props)}\n className={cn(\"sph-separator\", className)}\n data-orientation={orientation}\n role={decorative ? \"presentation\" : \"separator\"}\n aria-orientation={decorative ? undefined : orientation}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLSpanElement> & {\n width?: string | number;\n height?: string | number;\n};\n\nexport function Skeleton({\n width,\n height,\n className,\n style,\n \"aria-label\": ariaLabel,\n ...props\n}: SkeletonProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-skeleton\", className)}\n style={{ ...style, width, height }}\n role={ariaLabel ? \"img\" : undefined}\n aria-label={ariaLabel}\n aria-hidden={ariaLabel ? undefined : true}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, InputHTMLAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SliderProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"size\"\n | \"type\"\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"children\"\n | \"min\"\n | \"max\"\n | \"step\"\n> & {\n value: number;\n onValueChange: (value: number) => void;\n label: Renderable;\n min?: number;\n max?: number;\n step?: number;\n size?: ControlSize;\n valueLabel?: Renderable;\n invalid?: boolean;\n};\n\nexport function Slider({\n value,\n onValueChange,\n label,\n min = 0,\n max = 100,\n step = 1,\n size = \"md\",\n valueLabel,\n invalid = false,\n className,\n disabled,\n style,\n id,\n \"aria-label\": ariaLabel,\n \"aria-valuetext\": ariaValueText,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: SliderProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const range = max - min || 1;\n const progress = Math.min(100, Math.max(0, ((value - min) / range) * 100));\n const trackStyle = {\n ...style,\n \"--sph-slider-progress\": `${progress}%`,\n } as CSSProperties;\n\n return (\n <div\n className={cn(\"sph-slider\", className)}\n data-size={size}\n data-disabled={disabled || undefined}\n data-invalid={invalid || undefined}\n >\n <div className=\"sph-slider__head\">\n <label className=\"sph-slider__label\" htmlFor={inputId}>\n {node(label)}\n </label>\n {valueLabel !== undefined && (\n <output\n className=\"sph-slider__value\"\n htmlFor={inputId}\n aria-hidden=\"true\"\n >\n {node(valueLabel)}\n </output>\n )}\n </div>\n <input\n {...node(props)}\n id={inputId}\n type=\"range\"\n className=\"sph-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-valuetext={\n ariaValueText ??\n (typeof valueLabel === \"string\" ? valueLabel : undefined)\n }\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n style={trackStyle}\n onInput={(event) => onValueChange(Number(event.currentTarget.value))}\n />\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SurfaceProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children?: Renderable;\n tone?: \"base\" | \"elevated\" | \"raised\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n};\n\nexport function Surface({\n tone = \"base\",\n padding = \"md\",\n className,\n children,\n ...props\n}: SurfaceProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-surface\", className)}\n data-tone={tone}\n data-padding={padding}\n >\n {node(children)}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type TextareaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Textarea({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: TextareaProps) {\n return (\n <textarea\n {...node(props)}\n className={cn(\"sph-textarea\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToggleProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onChange\" | \"onClick\"\n> & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n label: string;\n size?: ControlSize;\n onClick?: (event: { preventDefault(): void }) => void;\n};\n\nexport function Toggle({\n checked,\n onCheckedChange,\n label,\n className,\n disabled,\n onClick,\n size = \"md\",\n \"aria-checked\": ariaChecked,\n \"aria-label\": ariaLabel = label,\n ...props\n}: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={ariaChecked ?? checked}\n aria-label={ariaLabel ?? label}\n disabled={disabled}\n className={cn(\"sph-toggle\", className)}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-size={size}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) onCheckedChange(!checked);\n }}\n {...node(props)}\n >\n {\" \"}\n <span className=\"sph-toggle__track\">\n <span className=\"sph-toggle__thumb\" />\n </span>\n </button>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type AccordionItem = {\n /** Identifies the panel across `value` and `defaultValue`. */\n value: string;\n trigger: Renderable;\n children?: Renderable;\n disabled?: boolean;\n};\n\nexport type AccordionProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"value\" | \"defaultValue\"\n> & {\n items: AccordionItem[];\n /** `single` (default) keeps one panel open; `multiple` allows many. */\n type?: \"single\" | \"multiple\";\n /** Controlled set of open panels. */\n value?: string[];\n /** Panels open on first render. */\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport function Accordion({\n items,\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n className,\n ...props\n}: AccordionProps) {\n const [uncontrolled, setUncontrolled] = useState<string[]>(\n defaultValue ?? [],\n );\n const open = value ?? uncontrolled;\n const baseId = useId();\n\n const toggle = (itemValue: string) => {\n const isOpen = open.includes(itemValue);\n const next = isOpen\n ? open.filter((v) => v !== itemValue)\n : type === \"single\"\n ? [itemValue]\n : [...open, itemValue];\n if (value === undefined) setUncontrolled(next);\n onValueChange?.(next);\n };\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-accordion\", className)}\n data-type={type}\n >\n {items.map((item, index) => {\n const isOpen = open.includes(item.value);\n const panelId = `${baseId}-panel-${index}`;\n return (\n <div\n key={item.value}\n className=\"sph-accordion__item\"\n data-state={isOpen ? \"open\" : \"closed\"}\n >\n <button\n type=\"button\"\n className=\"sph-accordion__trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.value)}\n >\n <span className=\"sph-accordion__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={13} weight=\"bold\" />\n </span>\n {node(item.trigger)}\n </button>\n <div className=\"sph-accordion__body\" id={panelId}>\n <div className=\"sph-accordion__inner\">{node(item.children)}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { motionDurationMs } from \"@/lib/presence.js\";\n\nexport type AlertProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"title\"\n> & {\n variant?: \"info\" | \"success\" | \"warning\" | \"danger\";\n title?: Renderable;\n children?: Renderable;\n dismissible?: boolean;\n onDismiss?: () => void;\n};\n\nconst alertIcons = {\n info: <InfoIcon size={16} />,\n success: <CheckIcon size={16} />,\n warning: <WarningIcon size={16} />,\n danger: <XIcon size={16} />,\n};\n\nexport function Alert({\n variant = \"info\",\n title,\n children,\n dismissible = false,\n onDismiss,\n className,\n role,\n ...props\n}: AlertProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [dismissing, setDismissing] = useState(false);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n const requestDismiss = () => {\n if (onDismiss === undefined || dismissing) return;\n const duration = motionDurationMs(rootRef.current, \"normal\");\n if (duration <= 0) {\n onDismiss();\n return;\n }\n setDismissing(true);\n timerRef.current = setTimeout(() => {\n setDismissing(false);\n onDismiss();\n }, duration + 40);\n };\n\n if (title === undefined && children === undefined) return null;\n\n return (\n <div\n ref={rootRef}\n {...node(props)}\n className={cn(\"sph-alert\", className)}\n data-variant={variant}\n data-state={dismissing ? \"closed\" : \"open\"}\n role={role ?? (variant === \"danger\" ? \"alert\" : \"status\")}\n aria-live={\n role ? undefined : variant === \"danger\" ? \"assertive\" : \"polite\"\n }\n >\n <span className=\"sph-alert__icon\" aria-hidden=\"true\">\n {alertIcons[variant]}\n </span>\n <div className=\"sph-alert__body\">\n {title !== undefined && (\n <p className=\"sph-alert__title\">{node(title)}</p>\n )}\n {children !== undefined && (\n <div className=\"sph-alert__content\">{node(children)}</div>\n )}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n className=\"sph-alert__dismiss\"\n aria-label=\"Dismiss notification\"\n onClick={requestDismiss}\n >\n <XIcon size={12} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n\nexport const Notice = Alert;\nexport type NoticeProps = AlertProps;\n","import {\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n ImageIcon,\n MusicNotesIcon,\n VideoIcon,\n XIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { motionDurationMs } from \"@/lib/presence.js\";\n\nexport type AttachmentStatus = \"uploading\" | \"done\" | \"error\";\n\nexport type AttachmentFile = {\n id: string;\n name: string;\n size: string;\n status?: AttachmentStatus;\n progress?: number;\n hint?: string;\n href?: string;\n};\n\nexport type AttachmentProps = {\n files: AttachmentFile[];\n onRemove?: (id: string) => void;\n ariaLabel?: string;\n className?: string;\n};\n\nconst IMAGE_EXT = [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"heic\"];\nconst VIDEO_EXT = [\"mp4\", \"mov\", \"webm\", \"mkv\"];\nconst AUDIO_EXT = [\"mp3\", \"wav\", \"ogg\", \"m4a\", \"flac\"];\nconst CODE_EXT = [\n \"js\",\n \"ts\",\n \"tsx\",\n \"jsx\",\n \"json\",\n \"html\",\n \"css\",\n \"yml\",\n \"yaml\",\n];\nconst DOC_EXT = [\"pdf\", \"doc\", \"docx\", \"txt\", \"rtf\", \"csv\"];\n\n/** Maps a filename extension to its phosphor icon component. */\nexport function iconForFile(name: string) {\n const parts = name.split(\".\");\n const ext = parts.length > 1 ? (parts.at(-1)?.toLowerCase() ?? \"\") : \"\";\n if (IMAGE_EXT.includes(ext)) return ImageIcon;\n if (VIDEO_EXT.includes(ext)) return VideoIcon;\n if (AUDIO_EXT.includes(ext)) return MusicNotesIcon;\n if (CODE_EXT.includes(ext)) return FileCodeIcon;\n if (DOC_EXT.includes(ext)) return FileTextIcon;\n return FileIcon;\n}\n\n/** Exit delay that lets the leave transition run before the row unmounts. */\n\nexport function Attachment({\n files,\n onRemove,\n ariaLabel = \"Attachments\",\n className,\n}: AttachmentProps) {\n const [leaving, setLeaving] = useState<string | null>(null);\n const timer = useRef<number | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n [],\n );\n\n const requestRemove = (id: string) => {\n if (!onRemove) return;\n if (timer.current !== null) window.clearTimeout(timer.current);\n const duration = motionDurationMs(listRef.current, \"normal\");\n if (duration <= 0) {\n setLeaving(null);\n onRemove(id);\n return;\n }\n setLeaving(id);\n timer.current = window.setTimeout(() => {\n onRemove(id);\n setLeaving(null);\n }, duration + 40);\n };\n\n return (\n <ul\n ref={listRef}\n className={cn(\"sph-attachment\", className)}\n aria-label={ariaLabel}\n >\n {files.map((file, index) => {\n const Icon = iconForFile(file.name);\n const uploading = file.status === \"uploading\";\n return (\n <li\n key={file.id}\n className=\"sph-attachment__row\"\n data-status={file.status ?? \"done\"}\n data-leaving={leaving === file.id || undefined}\n style={\n { \"--sph-motion-index\": index } as CSSProperties &\n Record<string, string | number>\n }\n >\n <span className=\"sph-attachment__icon\" aria-hidden=\"true\">\n <Icon size={16} />\n </span>\n\n <span className=\"sph-attachment__body\">\n {file.href ? (\n <a className=\"sph-attachment__name\" href={file.href} download>\n {file.name}\n </a>\n ) : (\n <span className=\"sph-attachment__name\">{file.name}</span>\n )}\n <span className=\"sph-attachment__size\">{file.size}</span>\n </span>\n\n {file.hint ? (\n <span className=\"sph-attachment__hint\">{file.hint}</span>\n ) : null}\n\n {uploading ? (\n <span\n className=\"sph-attachment__progress\"\n role=\"progressbar\"\n aria-label={`${file.name} upload`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={file.progress ?? 0}\n >\n <span\n style={\n {\n \"--sph-progress-value\": `${file.progress ?? 0}%`,\n } as CSSProperties & Record<string, string | number>\n }\n />\n </span>\n ) : null}\n {uploading ? (\n <span className=\"sph-attachment__pct\">{file.progress ?? 0}%</span>\n ) : null}\n\n {onRemove ? (\n <button\n type=\"button\"\n className=\"sph-attachment__remove\"\n aria-label={`Remove ${file.name}`}\n onClick={() => requestRemove(file.id)}\n >\n <XIcon size={13} />\n </button>\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { Avatar, type AvatarProps } from \"@/atoms/Avatar\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type AvatarGroupItem = Pick<AvatarProps, \"src\" | \"name\" | \"status\">;\n\nexport type AvatarGroupProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\"\n> & {\n avatars: AvatarGroupItem[];\n /** Avatars shown before collapsing the rest into a `+N` chip. */\n max?: number;\n size?: ControlSize;\n};\n\nexport function AvatarGroup({\n avatars,\n max = 4,\n size = \"md\",\n className,\n ...props\n}: AvatarGroupProps) {\n const shown = avatars.slice(0, Math.max(max, 1));\n const overflow = avatars.length - shown.length;\n\n return (\n <span {...node(props)} className={cn(\"sph-avatar-group\", className)}>\n {shown.map((avatar, index) => (\n <Avatar\n key={`${avatar.src ?? avatar.name ?? \"avatar\"}-${index}`}\n src={avatar.src}\n name={avatar.name}\n status={avatar.status}\n size={size}\n />\n ))}\n {overflow > 0 && (\n <span className=\"sph-avatar sph-avatar--overflow\" data-size={size}>\n +{overflow}\n </span>\n )}\n </span>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type BreadcrumbItem = {\n label: Renderable;\n /** Renders the crumb as a link. Wins over `onClick`. */\n href?: string;\n /** Renders the crumb as a button when there is no `href`. */\n onClick?: () => void;\n /** Leading icon shown before the label. */\n icon?: Renderable;\n};\n\nexport type BreadcrumbProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n items: BreadcrumbItem[];\n /** Separator drawn between crumbs. Defaults to a caret. */\n separator?: Renderable;\n /** Accessible name for the navigation landmark. */\n label?: string;\n};\n\nexport function Breadcrumb({\n items,\n separator,\n label = \"Breadcrumb\",\n className,\n ...props\n}: BreadcrumbProps) {\n return (\n <nav\n {...node(props)}\n className={cn(\"sph-breadcrumb\", className)}\n aria-label={label}\n >\n <ol className=\"sph-breadcrumb__list\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const content = (\n <>\n {item.icon !== undefined && (\n <span className=\"sph-breadcrumb__icon\" aria-hidden=\"true\">\n {node(item.icon)}\n </span>\n )}\n <span className=\"sph-breadcrumb__text\">{node(item.label)}</span>\n </>\n );\n\n return (\n <li key={`crumb-${index}`} className=\"sph-breadcrumb__item\">\n {isLast ? (\n <span className=\"sph-breadcrumb__current\" aria-current=\"page\">\n {content}\n </span>\n ) : item.href !== undefined ? (\n <a className=\"sph-breadcrumb__crumb\" href={item.href}>\n {content}\n </a>\n ) : item.onClick !== undefined ? (\n <button\n type=\"button\"\n className=\"sph-breadcrumb__crumb\"\n onClick={item.onClick}\n >\n {content}\n </button>\n ) : (\n <span className=\"sph-breadcrumb__crumb sph-breadcrumb__crumb--static\">\n {content}\n </span>\n )}\n {!isLast && (\n <span className=\"sph-breadcrumb__sep\" aria-hidden=\"true\">\n {separator !== undefined ? (\n node(separator)\n ) : (\n <CaretRightIcon size={11} weight=\"bold\" />\n )}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { CaretLeftIcon, CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\n\nexport type CalendarRange = { start: string | null; end: string | null };\n\nexport type CalendarProps = {\n /** Selected day as `YYYY-MM-DD`. */\n value?: string;\n onValueChange?: (value: string) => void;\n /** Displayed month as `YYYY-MM`. Uncontrolled pages keep their own state. */\n month?: string;\n onMonthChange?: (month: string) => void;\n /** Earliest / latest selectable day (inclusive), as `YYYY-MM-DD`. */\n min?: string;\n max?: string;\n /** First weekday: 0 = Sunday, 1 = Monday. Defaults to Monday. */\n weekStartsOn?: 0 | 1;\n mode?: \"single\" | \"range\";\n range?: CalendarRange;\n defaultRange?: CalendarRange;\n onRangeChange?: (range: CalendarRange) => void;\n months?: 1 | 2;\n ariaLabel?: string;\n className?: string;\n};\n\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst WEEKDAY_FULL = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconst pad = (value: number) => String(value).padStart(2, \"0\");\n\nexport function isLeapYear(year: number) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nexport function daysInMonth(month: string) {\n const [year, mon] = month.split(\"-\").map(Number);\n return mon === 2 && isLeapYear(year) ? 29 : DAYS_IN_MONTH[mon - 1];\n}\n\n/** Shifts a `YYYY-MM` month by a number of months, rolling the year over. */\nexport function shiftMonth(month: string, delta: number) {\n const [year, mon] = month.split(\"-\").map(Number);\n const index = mon - 1 + delta;\n const nextYear = year + Math.floor(index / 12);\n const nextMonth = ((index % 12) + 12) % 12;\n return `${nextYear}-${pad(nextMonth + 1)}`;\n}\n\n/** Shifts a `YYYY-MM-DD` day by a number of days (UTC math, timezone safe). */\nexport function shiftDay(day: string, delta: number) {\n const [year, mon, date] = day.split(\"-\").map(Number);\n const next = new Date(Date.UTC(year, mon - 1, date + delta));\n return `${next.getUTCFullYear()}-${pad(next.getUTCMonth() + 1)}-${pad(next.getUTCDate())}`;\n}\n\n/**\n * Grid cells for a month: leading blanks for the offset, then one\n * `YYYY-MM-DD` per day. Trailing cells are left to the CSS grid.\n */\nexport function monthGrid(month: string, weekStartsOn: 0 | 1) {\n const [year, mon] = month.split(\"-\").map(Number);\n const firstWeekday = new Date(Date.UTC(year, mon - 1, 1)).getUTCDay();\n const offset = (firstWeekday - weekStartsOn + 7) % 7;\n const cells: Array<string | null> = Array.from(\n { length: offset },\n () => null,\n );\n for (let day = 1; day <= daysInMonth(month); day++) {\n cells.push(`${month}-${pad(day)}`);\n }\n return cells;\n}\n\nexport function shiftMonthDay(day: string, delta: number) {\n const month = shiftMonth(day.slice(0, 7), delta);\n const date = Math.min(Number(day.slice(8, 10)), daysInMonth(month));\n return `${month}-${pad(date)}`;\n}\n\nfunction weekday(day: string) {\n const [year, mon, date] = day.split(\"-\").map(Number);\n return new Date(Date.UTC(year, mon - 1, date)).getUTCDay();\n}\n\nexport function weekEdge(\n day: string,\n weekStartsOn: 0 | 1,\n edge: \"start\" | \"end\",\n) {\n const offset = (weekday(day) - weekStartsOn + 7) % 7;\n return shiftDay(day, edge === \"start\" ? -offset : 6 - offset);\n}\n\nexport function selectRange(range: CalendarRange, day: string): CalendarRange {\n if (!range.start || range.end) return { start: day, end: null };\n return day < range.start\n ? { start: day, end: range.start }\n : { start: range.start, end: day };\n}\n\nexport function rangeSpan(\n range: CalendarRange,\n hover: string | null = null,\n): [string, string] | null {\n const { start, end } = range;\n if (!start) return null;\n const other = end ?? hover ?? start;\n return other < start ? [other, start] : [start, other];\n}\n\nfunction localToday() {\n const now = new Date();\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n}\n\nconst EMPTY_RANGE: CalendarRange = { start: null, end: null };\n\nexport function Calendar({\n value,\n onValueChange,\n month,\n onMonthChange,\n min,\n max,\n weekStartsOn = 1,\n mode = \"single\",\n range,\n defaultRange,\n onRangeChange,\n months = 1,\n ariaLabel = \"Calendar\",\n className,\n}: CalendarProps) {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const labelId = useId();\n const [paged, setPaged] = useState<string | null>(null);\n const [pendingFocus, setPendingFocus] = useState<string | null>(null);\n const [active, setActive] = useState<string | null>(null);\n const [hover, setHover] = useState<string | null>(null);\n const [innerRange, setInnerRange] = useState<CalendarRange>(\n defaultRange ?? EMPTY_RANGE,\n );\n\n const isRange = mode === \"range\";\n const currentRange = range ?? innerRange;\n const anchor = isRange ? currentRange.start : value;\n const viewMonth =\n month ?? paged ?? anchor?.slice(0, 7) ?? localToday().slice(0, 7);\n const today = localToday();\n const count = months === 2 ? 2 : 1;\n const visibleMonths = Array.from({ length: count }, (_, index) =>\n shiftMonth(viewMonth, index),\n );\n const lastMonth = visibleMonths[count - 1];\n const visible = (day: string) =>\n day.slice(0, 7) >= viewMonth && day.slice(0, 7) <= lastMonth;\n const blocked = (day: string) =>\n (min !== undefined && day < min) || (max !== undefined && day > max);\n\n const showMonth = (next: string) => {\n if (month === undefined) setPaged(next);\n onMonthChange?.(next);\n };\n\n const page = (delta: number) => showMonth(shiftMonth(viewMonth, delta));\n\n useEffect(() => {\n if (!pendingFocus) return;\n rootRef.current\n ?.querySelector<HTMLButtonElement>(`[data-date=\"${pendingFocus}\"]`)\n ?.focus();\n setPendingFocus(null);\n }, [pendingFocus, viewMonth]);\n\n const pending = isRange && !!currentRange.start && !currentRange.end;\n\n const focusDay = (target: string) => {\n let day = target;\n if (min !== undefined && day < min) day = min;\n if (max !== undefined && day > max) day = max;\n setActive(day);\n if (pending) setHover(day);\n if (!visible(day)) {\n showMonth(\n day.slice(0, 7) < viewMonth\n ? day.slice(0, 7)\n : shiftMonth(day.slice(0, 7), 1 - count),\n );\n }\n setPendingFocus(day);\n };\n\n const choose = (day: string) => {\n if (month === undefined && paged === null) setPaged(viewMonth);\n setActive(day);\n if (!isRange) {\n onValueChange?.(day);\n return;\n }\n const next = selectRange(currentRange, day);\n if (range === undefined) setInnerRange(next);\n onRangeChange?.(next);\n };\n\n const firstOpen = () => {\n for (const panel of visibleMonths) {\n for (const day of monthGrid(panel, weekStartsOn)) {\n if (day && !blocked(day)) return day;\n }\n }\n return null;\n };\n const tabbable =\n [active, anchor, isRange ? currentRange.end : null, today].find(\n (day): day is string => !!day && visible(day) && !blocked(day),\n ) ?? firstOpen();\n\n const span = isRange ? rangeSpan(currentRange, pending ? hover : null) : null;\n const committed = isRange && !pending ? rangeSpan(currentRange) : null;\n\n const weekdayLabels = Array.from(\n { length: 7 },\n (_, index) => WEEKDAY_LABELS[(weekStartsOn + index) % 7],\n );\n\n const renderDay = (day: string) => {\n const [dayYear, dayMon, dayDate] = day.split(\"-\").map(Number);\n const inSpan = !!span && day >= span[0] && day <= span[1];\n const isStart = inSpan && day === span?.[0];\n const isEnd = inSpan && day === span?.[1];\n const selected = isRange\n ? committed\n ? day >= committed[0] && day <= committed[1]\n : day === currentRange.start\n : value === day;\n const edges = [\n committed?.[0] === day || (pending && day === currentRange.start)\n ? \"range start\"\n : null,\n committed?.[1] === day ? \"range end\" : null,\n ].filter(Boolean);\n return (\n <button\n type=\"button\"\n role=\"gridcell\"\n key={day}\n data-date={day}\n data-today={day === today || undefined}\n data-in-range={inSpan || undefined}\n data-range-start={isStart || undefined}\n data-range-end={isEnd || undefined}\n data-preview={(inSpan && pending) || undefined}\n aria-selected={selected || undefined}\n aria-current={day === today ? \"date\" : undefined}\n tabIndex={day === tabbable ? 0 : -1}\n disabled={blocked(day)}\n onClick={() => choose(day)}\n onFocus={() => {\n setActive(day);\n if (pending) setHover(day);\n }}\n onMouseEnter={() => {\n if (pending) setHover(day);\n }}\n onKeyDown={(event) => {\n const step =\n event.key === \"ArrowLeft\"\n ? shiftDay(day, -1)\n : event.key === \"ArrowRight\"\n ? shiftDay(day, 1)\n : event.key === \"ArrowUp\"\n ? shiftDay(day, -7)\n : event.key === \"ArrowDown\"\n ? shiftDay(day, 7)\n : event.key === \"Home\"\n ? weekEdge(day, weekStartsOn, \"start\")\n : event.key === \"End\"\n ? weekEdge(day, weekStartsOn, \"end\")\n : event.key === \"PageUp\"\n ? shiftMonthDay(day, event.shiftKey ? -12 : -1)\n : event.key === \"PageDown\"\n ? shiftMonthDay(day, event.shiftKey ? 12 : 1)\n : null;\n if (!step) return;\n event.preventDefault();\n focusDay(step);\n }}\n >\n <span aria-hidden=\"true\">{dayDate}</span>\n <span className=\"sph-visually-hidden\">\n {`${WEEKDAY_FULL[weekday(day)]}, ${MONTH_LABELS[dayMon - 1]} ${dayDate}, ${dayYear}`}\n {edges.length ? `, ${edges.join(\" and \")}` : \"\"}\n </span>\n </button>\n );\n };\n\n const spacer = (\n <span className=\"sph-calendar__nav-spacer\" aria-hidden=\"true\" />\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-calendar\", className)}\n role=\"group\"\n aria-label={ariaLabel}\n data-mode={mode}\n data-months={count}\n >\n <div className=\"sph-calendar__months\" onMouseLeave={() => setHover(null)}>\n {visibleMonths.map((panelMonth, panelIndex) => {\n const [year, mon] = panelMonth.split(\"-\").map(Number);\n const cells = monthGrid(panelMonth, weekStartsOn);\n const rows: Array<Array<string | null>> = [];\n for (let index = 0; index < cells.length; index += 7) {\n rows.push(cells.slice(index, index + 7));\n }\n return (\n <div className=\"sph-calendar__month\" key={panelIndex}>\n <div className=\"sph-calendar__head\">\n {panelIndex === 0 ? (\n <button\n type=\"button\"\n className=\"sph-calendar__nav\"\n aria-label=\"Previous month\"\n onClick={() => page(-1)}\n >\n <CaretLeftIcon size={14} weight=\"bold\" />\n </button>\n ) : (\n spacer\n )}\n <span\n className=\"sph-calendar__label\"\n id={`${labelId}-${panelIndex}`}\n aria-live=\"polite\"\n >\n {MONTH_LABELS[mon - 1]} {year}\n </span>\n {panelIndex === count - 1 ? (\n <button\n type=\"button\"\n className=\"sph-calendar__nav\"\n aria-label=\"Next month\"\n onClick={() => page(1)}\n >\n <CaretRightIcon size={14} weight=\"bold\" />\n </button>\n ) : (\n spacer\n )}\n </div>\n\n <div className=\"sph-calendar__weekdays\" aria-hidden=\"true\">\n {weekdayLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n\n <div\n className=\"sph-calendar__grid\"\n role=\"grid\"\n key={panelMonth}\n aria-labelledby={`${labelId}-${panelIndex}`}\n aria-multiselectable={isRange || undefined}\n >\n {rows.map((row, rowIndex) => (\n <div className=\"sph-calendar__row\" role=\"row\" key={rowIndex}>\n {row.map((day, dayIndex) =>\n day === null ? (\n <span\n className=\"sph-calendar__blank\"\n role=\"gridcell\"\n key={`blank-${dayIndex}`}\n />\n ) : (\n renderDay(day)\n ),\n )}\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type CardProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title?: Renderable;\n description?: Renderable;\n header?: Renderable;\n footer?: Renderable;\n children?: Renderable;\n interactive?: boolean;\n selected?: boolean;\n};\n\nexport function Card({\n title,\n description,\n header,\n footer,\n children,\n interactive = false,\n selected = false,\n className,\n ...props\n}: CardProps) {\n const hasHeader =\n header !== undefined || title !== undefined || description !== undefined;\n\n return (\n <article\n {...node(props)}\n className={cn(\"sph-card\", className)}\n data-interactive={interactive || undefined}\n data-selected={selected || undefined}\n >\n {hasHeader && (\n <header className=\"sph-card__header\">\n {node(header)}\n {title !== undefined && (\n <h3 className=\"sph-card__title\">{node(title)}</h3>\n )}\n {description !== undefined && (\n <p className=\"sph-card__description\">{node(description)}</p>\n )}\n </header>\n )}\n {children !== undefined && (\n <div className=\"sph-card__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-card__footer\">{node(footer)}</footer>\n )}\n </article>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type CollapsibleProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n trigger: Renderable;\n children?: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n};\n\nexport function Collapsible({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n className,\n ...props\n}: CollapsibleProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const isOpen = open ?? uncontrolled;\n const contentId = `${useId()}-content`;\n\n const toggle = () => {\n if (disabled) return;\n const next = !isOpen;\n setUncontrolled(next);\n onOpenChange?.(next);\n };\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-collapsible\", className)}\n data-state={isOpen ? \"open\" : \"closed\"}\n >\n <button\n type=\"button\"\n className=\"sph-collapsible__trigger\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n disabled={disabled}\n onClick={toggle}\n >\n <span className=\"sph-collapsible__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={13} weight=\"bold\" />\n </span>\n {node(trigger)}\n </button>\n <div className=\"sph-collapsible__body\" id={contentId}>\n <div className=\"sph-collapsible__inner\">{node(children)}</div>\n </div>\n </div>\n );\n}\n","export type TextMatch = {\n score: number;\n indexes: number[];\n};\n\nexport function matchText(text: string, query: string): TextMatch | null {\n const needle = query.trim().toLowerCase();\n if (needle.length === 0) return { score: 0, indexes: [] };\n const haystack = text.toLowerCase();\n\n const indexes: number[] = [];\n let score = 0;\n let cursor = 0;\n\n for (const char of needle) {\n if (char === \" \") continue;\n const found = haystack.indexOf(char, cursor);\n if (found < 0) return null;\n indexes.push(found);\n\n if (found === 0) score += 6;\n const previous = found > 0 ? haystack[found - 1] : \"\";\n const previousIsBoundary = previous === \"\" || !/[a-z0-9]/.test(previous);\n if (previousIsBoundary) score += 4;\n if (found === cursor && indexes.length > 1) score += 2;\n score += 1;\n cursor = found + 1;\n }\n\n score -= Math.min(haystack.length - needle.length, 10) * 0.1;\n return { score, indexes };\n}\n\nexport type Filtered<T> = {\n item: T;\n indexes: number[];\n};\n\nexport function filterItems<T>(\n items: T[],\n query: string,\n read: (item: T) => { label: string; keywords?: string },\n): Filtered<T>[] {\n const trimmed = query.trim();\n if (trimmed.length === 0) return items.map((item) => ({ item, indexes: [] }));\n\n const results: Filtered<T>[] = [];\n for (const item of items) {\n const { label, keywords } = read(item);\n const onLabel = matchText(label, trimmed);\n if (onLabel) {\n results.push({ item, indexes: onLabel.indexes });\n continue;\n }\n if (keywords && matchText(keywords, trimmed)) {\n results.push({ item, indexes: [] });\n }\n }\n return results;\n}\n\nexport function filterItemsWith<T>(\n items: T[],\n query: string,\n read: (item: T) => { label: string; keywords?: string },\n filter?: (item: T, query: string) => boolean,\n): Filtered<T>[] {\n if (!filter) return filterItems(items, query, read);\n return items\n .filter((item) => filter(item, query))\n .map((item) => ({\n item,\n indexes: matchText(read(item).label, query)?.indexes ?? [],\n }));\n}\n","import { node, type Renderable } from \"@/lib/node.js\";\n\n/**\n * Renders `text` with the given character positions wrapped in a `<mark>`.\n * Returns through `node()` so both React and Preact accept the result as a\n * component value despite their incompatible element types.\n */\nexport function Highlight({\n text,\n indexes,\n}: {\n text: string;\n indexes: number[];\n}) {\n if (indexes.length === 0) return node(text);\n const parts: Renderable[] = [];\n let cursor = 0;\n for (const position of indexes) {\n if (position > cursor) parts.push(text.slice(cursor, position));\n parts.push(\n <mark key={position} className=\"sph-match\">\n {text.slice(position, position + 1)}\n </mark>,\n );\n cursor = position + 1;\n }\n if (cursor < text.length) parts.push(text.slice(cursor));\n return node(parts);\n}\n","import {\n CaretDownIcon,\n CheckIcon,\n MagnifyingGlassIcon,\n XIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { filterItems } from \"@/lib/filter.js\";\nimport { Highlight } from \"@/lib/highlight.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ComboboxOption = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n /** Groups options under a heading; ungrouped options come first. */\n group?: string;\n /** Extra terms matched by the filter but never highlighted. */\n keywords?: string;\n};\n\nexport type ComboboxProps = {\n options: ComboboxOption[];\n /** Single-select value. Omit it and pass `values` for multi-select. */\n value?: string;\n /** Multi-select values; selecting keeps the popup open. */\n values?: string[];\n onValueChange?: (value: string) => void;\n onValuesChange?: (values: string[]) => void;\n placeholder?: Renderable;\n searchPlaceholder?: string;\n emptyMessage?: Renderable;\n disabled?: boolean;\n size?: ControlSize;\n id?: string;\n ariaLabel?: string;\n className?: string;\n};\n\ntype FlatOption = {\n option: ComboboxOption;\n indexes: number[];\n activeId: string;\n index: number;\n};\n\nfunction readableLabel(option: ComboboxOption): string {\n return typeof option.label === \"string\" ? option.label : \"\";\n}\n\nfunction resolveActive(options: FlatOption[], wanted: number): number {\n if (options.length === 0) return -1;\n const start = Math.min(Math.max(wanted, 0), options.length - 1);\n const enabled = (index: number) => !options[index]?.option.disabled;\n if (enabled(start)) return start;\n for (let index = start + 1; index < options.length; index += 1)\n if (enabled(index)) return index;\n for (let index = 0; index < start; index += 1)\n if (enabled(index)) return index;\n return start;\n}\n\nexport function Combobox({\n options,\n value,\n values,\n onValueChange,\n onValuesChange,\n placeholder = \"Select…\",\n searchPlaceholder = \"Search…\",\n emptyMessage = \"No matches.\",\n disabled = false,\n size = \"md\",\n id,\n ariaLabel,\n className,\n}: ComboboxProps) {\n const generatedId = useId();\n const controlId = id ?? `sph-combobox-${generatedId}`;\n const listId = `${controlId}-list`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeState, setActive] = useState(0);\n const multiple = values !== undefined;\n const selectedValues = multiple ? (values ?? []) : value ? [value] : [];\n const {\n present,\n state,\n ref: presenceRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n const visible = present && portaled;\n useOverlayPosition(triggerRef, presenceRef, visible, {\n side: \"bottom\",\n align: \"start\",\n offset: 4,\n matchWidth: true,\n });\n\n const sections = useMemo(() => {\n const read = (option: ComboboxOption) => ({\n label: readableLabel(option),\n keywords: option.keywords,\n });\n const filtered = filterItems(options, query, read);\n const ungrouped = filtered.filter(\n (entry) => entry.item.group === undefined,\n );\n const groupNames = [\n ...new Set(\n filtered\n .map((entry) => entry.item.group)\n .filter((name): name is string => name !== undefined),\n ),\n ];\n const raw = [\n ...(ungrouped.length > 0\n ? [{ heading: undefined, entries: ungrouped }]\n : []),\n ...groupNames.map((name) => ({\n heading: name,\n entries: filtered.filter((entry) => entry.item.group === name),\n })),\n ];\n let order = 0;\n const built = raw.map((section) => ({\n heading: section.heading,\n entries: section.entries.map((entry) => ({\n option: entry.item,\n indexes: entry.indexes,\n activeId: `${listId}-option-${order}`,\n index: order++,\n })),\n }));\n return built;\n }, [listId, options, query]);\n\n const flat = sections.flatMap((section) => section.entries);\n const active = resolveActive(flat, activeState);\n\n const close = () => {\n setOpen(false);\n setQuery(\"\");\n };\n\n const toggleValue = (option: ComboboxOption) => {\n if (option.disabled) return;\n if (multiple) {\n const next = selectedValues.includes(option.value)\n ? selectedValues.filter((entry) => entry !== option.value)\n : [...selectedValues, option.value];\n onValuesChange?.(next);\n setQuery(\"\");\n setActive(0);\n return;\n }\n onValueChange?.(option.value);\n close();\n };\n\n const removeValue = (entry: string) => {\n onValuesChange?.(selectedValues.filter((item) => item !== entry));\n };\n\n const activate = (index: number) => {\n const option = flat[index]?.option;\n if (!option) return;\n toggleValue(option);\n };\n\n const move = (direction: 1 | -1) => {\n if (flat.length === 0) return;\n let index = active < 0 ? 0 : active;\n for (let step = 0; step < flat.length; step += 1) {\n index = (index + direction + flat.length) % flat.length;\n if (!flat[index]?.option.disabled) {\n setActive(index);\n return;\n }\n }\n };\n\n useEffect(() => {\n if (!open) setQuery(\"\");\n }, [open]);\n\n useEffect(() => {\n setActive(0);\n }, [query]);\n\n useEffect(() => {\n if (!visible) return;\n inputRef.current?.setAttribute(\"spellcheck\", \"false\");\n requestAnimationFrame(() => inputRef.current?.focus());\n }, [visible]);\n\n useEffect(() => {\n if (!visible) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n }\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !presenceRef.current?.contains(target)\n )\n close();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n });\n\n useEffect(() => {\n if (!visible || active < 0) return;\n listRef.current\n ?.querySelector<HTMLElement>('[data-active=\"true\"]')\n ?.scrollIntoView({ block: \"nearest\" });\n }, [active, visible]);\n\n const handleInputKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n move(1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n move(-1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setActive(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setActive(flat.length - 1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n if (active >= 0) activate(active);\n }\n };\n\n const handleTriggerKeyDown = (event: KeyboardActionEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n if (!disabled) setOpen(true);\n }\n };\n\n const labelOf = (entry: string) =>\n readableLabel(\n options.find((option) => option.value === entry) ?? {\n value: entry,\n label: entry,\n },\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-combobox\", className)}\n data-size={size}\n data-open={open || undefined}\n >\n {multiple ? (\n <div\n className=\"sph-combobox__control\"\n onClick={() => {\n if (!disabled) setOpen((current) => !current);\n }}\n >\n <div className=\"sph-combobox__chips\">\n {selectedValues.map((entry) => (\n <span key={entry} className=\"sph-combobox__chip\">\n <span className=\"sph-combobox__chip-label\">\n {labelOf(entry)}\n </span>\n <button\n type=\"button\"\n className=\"sph-combobox__chip-remove\"\n aria-label={`Remove ${labelOf(entry)}`}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n removeValue(entry);\n }}\n >\n <XIcon size={10} aria-hidden=\"true\" />\n </button>\n </span>\n ))}\n {selectedValues.length === 0 && (\n <span className=\"sph-combobox__placeholder\">\n {node(placeholder)}\n </span>\n )}\n </div>\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-combobox__toggle\"\n aria-label={ariaLabel ?? \"Open suggestions\"}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n if (!disabled) setOpen((current) => !current);\n }}\n onKeyDown={handleTriggerKeyDown}\n >\n <CaretDownIcon\n className=\"sph-combobox__caret\"\n size={13}\n aria-hidden=\"true\"\n />\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-combobox__control sph-combobox__control--button\"\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (!disabled) setOpen((current) => !current);\n }}\n onKeyDown={handleTriggerKeyDown}\n >\n <span\n className={\n selectedValues.length > 0\n ? \"sph-combobox__value\"\n : \"sph-combobox__placeholder\"\n }\n >\n {selectedValues.length > 0\n ? node(\n options.find((option) => option.value === value)?.label ??\n value,\n )\n : node(placeholder)}\n </span>\n <CaretDownIcon\n className=\"sph-combobox__caret\"\n size={13}\n aria-hidden=\"true\"\n />\n </button>\n )}\n\n {visible &&\n createPortal(\n <div\n ref={presenceRef}\n className=\"sph-combobox__panel\"\n data-state={state}\n >\n <div className=\"sph-combobox__search\">\n <MagnifyingGlassIcon\n className=\"sph-combobox__search-icon\"\n size={14}\n aria-hidden=\"true\"\n />\n <input\n ref={inputRef}\n className=\"sph-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded\n aria-controls={listId}\n aria-activedescendant={\n active >= 0 ? flat[active]?.activeId : undefined\n }\n aria-autocomplete=\"list\"\n aria-label={searchPlaceholder}\n placeholder={searchPlaceholder}\n value={query}\n autoComplete=\"off\"\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={handleInputKeyDown}\n />\n </div>\n <div\n ref={listRef}\n className=\"sph-combobox__list\"\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel ?? searchPlaceholder}\n aria-multiselectable={multiple || undefined}\n >\n {flat.length === 0 && (\n <div className=\"sph-combobox__empty\" role=\"status\">\n {node(emptyMessage)}\n </div>\n )}\n {sections.map((section) => (\n <div\n key={section.heading ?? \"section-root\"}\n className=\"sph-combobox__group\"\n role=\"group\"\n aria-labelledby={\n section.heading !== undefined\n ? `${listId}-group-${section.heading}`\n : undefined\n }\n >\n {section.heading !== undefined && (\n <div\n className=\"sph-combobox__heading\"\n id={`${listId}-group-${section.heading}`}\n >\n {section.heading}\n </div>\n )}\n {section.entries.map((entry) => {\n const option = entry.option;\n const isSelected = selectedValues.includes(option.value);\n return (\n <div\n key={option.value}\n id={entry.activeId}\n className=\"sph-combobox__option\"\n role=\"option\"\n data-index={entry.index}\n data-active={\n entry.index === active ? \"true\" : undefined\n }\n data-disabled={option.disabled || undefined}\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n onPointerEnter={() => {\n if (!option.disabled) setActive(entry.index);\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => activate(entry.index)}\n >\n <span\n className=\"sph-combobox__check\"\n data-checked={isSelected || undefined}\n aria-hidden=\"true\"\n >\n {isSelected && <CheckIcon size={13} weight=\"bold\" />}\n </span>\n <span className=\"sph-combobox__label\">\n {typeof option.label === \"string\" ? (\n <Highlight\n text={option.label}\n indexes={entry.indexes}\n />\n ) : (\n node(option.label)\n )}\n </span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type MenuItem = {\n value?: string;\n label?: Renderable;\n icon?: Renderable;\n shortcut?: Renderable;\n disabled?: boolean;\n danger?: boolean;\n separator?: boolean;\n};\n\nexport type MenuContentProps = {\n /** Prefix for the ids handed out to each enabled item. */\n menuId: string;\n items: MenuItem[];\n onChoose: (item: MenuItem) => void;\n /** Called on Escape from inside the list. */\n onEscape?: () => void;\n};\n\n/**\n * The menu list itself: item markup plus arrow/Home/End/Enter/Space/Escape\n * handling. The wrapper that positions it (anchor or pointer coordinates)\n * stays with the caller.\n */\nexport function MenuContent({\n menuId,\n items,\n onChoose,\n onEscape,\n}: MenuContentProps) {\n const enabledIndexes = items.flatMap((item, index) =>\n !item.separator && !item.disabled ? [index] : [],\n );\n const focusItem = (index: number) =>\n document.getElementById(`${menuId}-${index}`)?.focus();\n\n const handleKeyDown = (event: KeyboardActionEvent, index: number) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onEscape?.();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onChoose(items[index]);\n return;\n }\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n event.preventDefault();\n const current = enabledIndexes.indexOf(index);\n const nextPosition =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? enabledIndexes.length - 1\n : (current +\n (event.key === \"ArrowDown\" ? 1 : -1) +\n enabledIndexes.length) %\n enabledIndexes.length;\n const nextIndex = enabledIndexes[nextPosition];\n if (nextIndex !== undefined) focusItem(nextIndex);\n };\n\n return (\n <>\n {items.map((item, index) =>\n item.separator ? (\n <div\n key={`separator-${index}`}\n className=\"sph-menu__separator\"\n role=\"separator\"\n />\n ) : (\n <button\n key={item.value ?? `item-${index}`}\n id={`${menuId}-${index}`}\n type=\"button\"\n role=\"menuitem\"\n className=\"sph-menu__item\"\n data-danger={item.danger || undefined}\n disabled={item.disabled}\n onClick={() => onChoose(item)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n <span className=\"sph-menu__item-label\">\n {node(item.icon)}\n <span>{node(item.label)}</span>\n </span>\n {item.shortcut !== undefined && (\n <span className=\"sph-menu__shortcut\">{node(item.shortcut)}</span>\n )}\n </button>\n ),\n )}\n </>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n inheritScope,\n useIsoLayoutEffect,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport { MenuContent, type MenuItem } from \"../Menu/MenuContent\";\n\nexport type ContextMenuProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"onContextMenu\" | \"onSelect\"\n> & {\n children: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n disabled?: boolean;\n label?: string;\n};\n\n/**\n * A menu that opens under the pointer: right-click (or the ContextMenu key)\n * on the surface, the popup clamps itself to the viewport and hands focus to\n * its first item. Escape and selection return focus to the surface.\n */\nexport function ContextMenu({\n children,\n items,\n onSelect,\n disabled = false,\n label = \"Context menu\",\n className,\n ...props\n}: ContextMenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ x: 0, y: 0 });\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n\n const close = () => setOpen(false);\n const returnFocus = () => rootRef.current?.focus();\n\n const choose = (item: MenuItem) => {\n if (item.disabled || item.separator || item.value === undefined) return;\n onSelect?.(item.value);\n close();\n returnFocus();\n };\n\n const handleEscape = () => {\n close();\n returnFocus();\n };\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n ) {\n close();\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const frame = requestAnimationFrame(() => {\n contentRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-menu__item:not(:disabled)\")\n ?.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [open]);\n\n useIsoLayoutEffect(() => {\n const el = contentRef.current;\n if (!present || !portaled || !el) return;\n inheritScope(rootRef.current, el);\n const rect = el.getBoundingClientRect();\n const margin = 8;\n const flipX = rect.right > window.innerWidth - margin;\n const flipY = rect.bottom > window.innerHeight - margin;\n if (flipX) {\n el.style.left = `${Math.max(margin, coords.x - rect.width)}px`;\n }\n if (flipY) {\n el.style.top = `${Math.max(margin, coords.y - rect.height)}px`;\n }\n el.style.transformOrigin = `${flipX ? \"right\" : \"left\"} ${flipY ? \"bottom\" : \"top\"}`;\n el.dataset.side = flipY ? \"top\" : \"bottom\";\n }, [present, coords]);\n\n return (\n <div\n {...node(props)}\n ref={rootRef}\n tabIndex={-1}\n className={cn(\"sph-context-menu\", className)}\n onContextMenu={(event) => {\n if (disabled) return;\n event.preventDefault();\n\n const rect = rootRef.current?.getBoundingClientRect();\n setCoords({\n x: event.clientX || (rect ? rect.left + 8 : 8),\n y: event.clientY || (rect ? rect.top + 8 : 8),\n });\n setOpen(true);\n }}\n >\n {node(children)}\n {present &&\n portaled &&\n createPortal(\n <div\n id={`${menuId}-menu`}\n ref={contentRef}\n className=\"sph-menu__content sph-context-menu__content\"\n data-state={state}\n role=\"menu\"\n aria-label={label}\n style={{ left: coords.x, top: coords.y }}\n >\n <MenuContent\n menuId={menuId}\n items={items}\n onChoose={choose}\n onEscape={handleEscape}\n />\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n \"button, [href], input:not([type='hidden']), select, textarea, [tabindex]:not([tabindex='-1'])\";\n\nconst LIVE_REGION_SELECTOR =\n \"[aria-live]:not([aria-live='off']), [role='alert'], [role='status'], [role='log']\";\n\ntype FocusTarget = {\n focus: (options?: FocusOptions) => void;\n isConnected?: boolean;\n hasAttribute?: (name: string) => boolean;\n closest?: (selector: string) => unknown;\n};\n\ntype TreeNode = {\n readonly children: ArrayLike<TreeNode>;\n readonly parentElement: TreeNode | null;\n hasAttribute: (name: string) => boolean;\n};\n\nfunction focusable(container: HTMLElement | null): HTMLElement[] {\n return Array.from(\n container?.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR) ?? [],\n ).filter(\n (element) =>\n !element.hasAttribute(\"disabled\") &&\n element.tabIndex >= 0 &&\n !element.closest(\"[inert]\") &&\n (typeof element.getClientRects !== \"function\" ||\n element.getClientRects().length > 0),\n );\n}\n\nexport function tabTrapTarget<T>(\n elements: readonly T[],\n current: T | null,\n backward: boolean,\n container?: T,\n): { prevent: boolean; target: T | null } {\n if (elements.length === 0) return { prevent: true, target: null };\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (current === null || (container !== undefined && current === container))\n return { prevent: true, target: backward ? last : first };\n if (backward && current === first) return { prevent: true, target: last };\n if (!backward && current === last) return { prevent: true, target: first };\n return { prevent: false, target: null };\n}\n\ntype Layer = { element: HTMLElement | null };\n\nfunction createLayerStack() {\n const layers: Layer[] = [];\n return {\n push(layer: Layer): () => void {\n const element = layer.element;\n const below = element\n ? layers.findIndex(\n (other) =>\n other.element !== null &&\n other.element !== element &&\n element.contains(other.element),\n )\n : -1;\n if (below === -1) layers.push(layer);\n else layers.splice(below, 0, layer);\n return () => {\n const index = layers.indexOf(layer);\n if (index !== -1) layers.splice(index, 1);\n };\n },\n top(): Layer | undefined {\n return layers[layers.length - 1];\n },\n };\n}\n\nconst traps = createLayerStack();\nconst modals = createLayerStack();\n\nexport type FocusTrapOptions = {\n fallbackToContainer?: boolean;\n};\n\n/**\n * Keeps keyboard focus inside `ref` while `active`:\n *\n * - on activation, focus lands on `initial` (a ref or a resolver), or the\n * first focusable node, unless focus already sits inside the container,\n * - Tab and Shift+Tab cycle within the container afterwards,\n * - only the most recently activated trap reacts, so nested traps compose.\n *\n * Escape stays the component's job — layered overlays need to unwire\n * themselves (clear a query, pop a level) before closing.\n */\nexport function useFocusTrap<E extends HTMLElement>(\n ref: RefObject<E | null>,\n active: boolean,\n initial?: RefObject<HTMLElement | null> | (() => HTMLElement | null),\n options: FocusTrapOptions = {},\n): void {\n const { fallbackToContainer = false } = options;\n const initialRef = useRef(initial);\n\n useEffect(() => {\n initialRef.current = initial;\n });\n\n useEffect(() => {\n if (!active) return;\n const layer: Layer = { element: ref.current };\n const release = traps.push(layer);\n const frame = requestAnimationFrame(() => {\n const container = ref.current;\n if (!container) return;\n const resolve = initialRef.current;\n const explicit =\n typeof resolve === \"function\" ? resolve() : resolve?.current;\n if (!explicit && container.contains(document.activeElement)) return;\n const target =\n explicit ??\n focusable(container)[0] ??\n (fallbackToContainer ? container : undefined);\n target?.focus();\n });\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Tab\" || traps.top() !== layer) return;\n const container = ref.current;\n const focused = document.activeElement as HTMLElement | null;\n const lost = !focused || focused === document.body;\n const { prevent, target } = tabTrapTarget<HTMLElement>(\n focusable(container),\n lost ? null : focused,\n event.shiftKey,\n container ?? undefined,\n );\n if (!prevent) return;\n event.preventDefault();\n (target ?? (fallbackToContainer ? container : null))?.focus();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n release();\n cancelAnimationFrame(frame);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [active, fallbackToContainer, ref]);\n}\n\nexport function canReceiveFocus(\n element: FocusTarget | null | undefined,\n): element is FocusTarget {\n if (!element || typeof element.focus !== \"function\") return false;\n if (element.isConnected === false) return false;\n if (element.hasAttribute?.(\"disabled\")) return false;\n if (element.closest?.(\"[inert]\")) return false;\n return true;\n}\n\nexport function restoreFocus(\n target: FocusTarget | null | undefined,\n doc: Pick<Document, \"activeElement\" | \"body\"> = document,\n): unknown {\n if (canReceiveFocus(target)) {\n target.focus({ preventScroll: true });\n if ((doc.activeElement as unknown) === target) return target;\n }\n const current = doc.activeElement as (Element & { blur?: () => void }) | null;\n if (current && current !== doc.body && current.isConnected === false)\n current.blur?.();\n return doc.activeElement ?? doc.body;\n}\n\nexport type ReturnFocusOptions = {\n ref?: RefObject<HTMLElement | null>;\n returnFocus?: boolean | (() => HTMLElement | null);\n};\n\nexport function useReturnFocus(\n active: boolean,\n options: ReturnFocusOptions = {},\n): void {\n const { ref, returnFocus = true } = options;\n const previous = useRef<Element | null>(null);\n const returnRef = useRef(returnFocus);\n\n if (!active) previous.current = null;\n else if (previous.current === null && typeof document !== \"undefined\")\n previous.current = document.activeElement;\n\n useEffect(() => {\n returnRef.current = returnFocus;\n });\n\n useEffect(() => {\n if (!active) return;\n const container = ref?.current ?? null;\n const remembered = previous.current as HTMLElement | null;\n return () => {\n const setting = returnRef.current;\n if (setting === false) return;\n const focused = document.activeElement;\n const lost =\n !focused ||\n focused === document.body ||\n !focused.isConnected ||\n (container?.contains(focused) ?? false);\n if (!lost) return;\n const chosen = typeof setting === \"function\" ? setting() : null;\n restoreFocus(chosen ?? remembered);\n };\n }, [active, ref]);\n}\n\ntype ScrollDocument = {\n body: { style: { overflow: string; paddingRight: string } };\n documentElement: { clientWidth: number };\n defaultView?: {\n innerWidth: number;\n getComputedStyle?: (element: never) => { paddingRight: string };\n } | null;\n};\n\nlet scrollLocks = 0;\nlet savedScroll: { overflow: string; paddingRight: string } | null = null;\n\nexport function lockScroll(\n doc: ScrollDocument = document as unknown as ScrollDocument,\n): () => void {\n const style = doc.body.style;\n if (scrollLocks === 0) {\n savedScroll = {\n overflow: style.overflow,\n paddingRight: style.paddingRight,\n };\n const view = doc.defaultView;\n const gap = view ? view.innerWidth - doc.documentElement.clientWidth : 0;\n if (gap > 0) {\n const computed = view?.getComputedStyle?.(doc.body as never);\n const padding = Number.parseFloat(computed?.paddingRight ?? \"\") || 0;\n style.paddingRight = `${padding + gap}px`;\n }\n style.overflow = \"hidden\";\n }\n scrollLocks += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n scrollLocks -= 1;\n if (scrollLocks > 0 || !savedScroll) return;\n style.overflow = savedScroll.overflow;\n style.paddingRight = savedScroll.paddingRight;\n savedScroll = null;\n };\n}\n\nexport function useScrollLock(active: boolean): void {\n useEffect(() => {\n if (!active) return;\n return lockScroll();\n }, [active]);\n}\n\nexport function inertTargets<N extends TreeNode>(\n keep: readonly N[],\n root: N,\n owned: ReadonlySet<TreeNode> = new Set(),\n): N[] {\n const kept = new Set<TreeNode>(keep);\n const path = new Set<TreeNode>();\n for (const element of keep) {\n const chain: TreeNode[] = [];\n let node: TreeNode | null = element.parentElement;\n while (node && node !== root) {\n chain.push(node);\n node = node.parentElement;\n }\n if (node === root) for (const link of chain) path.add(link);\n }\n const targets: N[] = [];\n const visit = (parent: TreeNode) => {\n for (const child of Array.from(parent.children)) {\n if (kept.has(child)) continue;\n if (path.has(child)) visit(child);\n else if (!child.hasAttribute(\"inert\") || owned.has(child))\n targets.push(child as N);\n }\n };\n if (path.size > 0 || keep.some((element) => element.parentElement === root))\n visit(root);\n return targets;\n}\n\nconst inerted = new Set<Element>();\n\nfunction syncInert(): void {\n const top = modals.top()?.element;\n const next = new Set<Element>();\n if (top && document.body.contains(top)) {\n const regions = Array.from(\n document.body.querySelectorAll(LIVE_REGION_SELECTOR),\n ).filter((region) => !region.contains(top) && !top.contains(region));\n for (const element of inertTargets<Element>(\n [top, ...regions],\n document.body,\n inerted,\n ))\n next.add(element);\n }\n for (const element of inerted)\n if (!next.has(element)) {\n element.removeAttribute(\"inert\");\n inerted.delete(element);\n }\n for (const element of next)\n if (!inerted.has(element)) {\n element.setAttribute(\"inert\", \"\");\n inerted.add(element);\n }\n}\n\nexport type ModalLayer = {\n isTopmost: () => boolean;\n};\n\nexport function useModalLayer<E extends HTMLElement>(\n ref: RefObject<E | null>,\n active: boolean,\n): ModalLayer {\n const layerRef = useRef<Layer | null>(null);\n const handle = useRef<ModalLayer | null>(null);\n handle.current ??= {\n isTopmost: () =>\n layerRef.current !== null && modals.top() === layerRef.current,\n };\n\n useEffect(() => {\n if (!active) return;\n const layer: Layer = { element: ref.current };\n layerRef.current = layer;\n const release = modals.push(layer);\n syncInert();\n return () => {\n release();\n if (layerRef.current === layer) layerRef.current = null;\n syncInert();\n };\n }, [active, ref]);\n\n return handle.current;\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId } from \"react\";\nimport {\n useFocusTrap,\n useModalLayer,\n useReturnFocus,\n useScrollLock,\n} from \"@/lib/focus.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { usePresence } from \"@/lib/presence.js\";\n\nexport type DialogProps = {\n open: boolean;\n onClose: () => void;\n title: Renderable;\n description?: Renderable;\n children?: Renderable;\n footer?: Renderable;\n closeLabel?: string;\n closeOnOverlayClick?: boolean;\n closeOnEscape?: boolean;\n initialFocus?: () => HTMLElement | null;\n returnFocus?: boolean | (() => HTMLElement | null);\n className?: string;\n};\n\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n closeLabel = \"Close dialog\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n initialFocus,\n returnFocus = true,\n className,\n}: DialogProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId =\n description !== undefined ? `${id}-description` : undefined;\n const { present, state, ref: dialogRef } = usePresence<HTMLElement>(open);\n\n const active = open && present;\n const layer = useModalLayer(dialogRef, active);\n useFocusTrap(dialogRef, active, initialFocus, { fallbackToContainer: true });\n useReturnFocus(present, { ref: dialogRef, returnFocus });\n useScrollLock(present);\n\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n if (!layer.isTopmost()) return;\n event.preventDefault();\n onClose();\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [closeOnEscape, layer, onClose, open]);\n\n if (!present) return null;\n\n return (\n <div\n className=\"sph-dialog__backdrop\"\n data-state={state}\n role=\"presentation\"\n onMouseDown={(event) => {\n if (closeOnOverlayClick && event.target === event.currentTarget)\n onClose();\n }}\n >\n <section\n ref={dialogRef}\n className={cn(\"sph-dialog\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <header className=\"sph-dialog__header\">\n <div className=\"sph-dialog__heading\">\n <h2 id={titleId} className=\"sph-dialog__title\">\n {node(title)}\n </h2>\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-dialog__description\">\n {node(description)}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"sph-dialog__close\"\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n </header>\n {children !== undefined && (\n <div className=\"sph-dialog__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-dialog__footer\">{node(footer)}</footer>\n )}\n </section>\n </div>\n );\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId } from \"react\";\nimport {\n useFocusTrap,\n useModalLayer,\n useReturnFocus,\n useScrollLock,\n} from \"@/lib/focus.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { usePresence } from \"@/lib/presence.js\";\n\nexport type DrawerSide = \"left\" | \"right\" | \"bottom\";\n\nexport type DrawerProps = {\n open: boolean;\n onClose: () => void;\n title: Renderable;\n description?: Renderable;\n children?: Renderable;\n footer?: Renderable;\n side?: DrawerSide;\n size?: \"sm\" | \"md\" | \"lg\";\n closeLabel?: string;\n closeOnOverlayClick?: boolean;\n closeOnEscape?: boolean;\n initialFocus?: () => HTMLElement | null;\n returnFocus?: boolean | (() => HTMLElement | null);\n className?: string;\n};\n\nexport function Drawer({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n side = \"right\",\n size = \"md\",\n closeLabel = \"Close panel\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n initialFocus,\n returnFocus = true,\n className,\n}: DrawerProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId =\n description !== undefined ? `${id}-description` : undefined;\n const { present, state, ref: drawerRef } = usePresence<HTMLElement>(open);\n\n const active = open && present;\n const layer = useModalLayer(drawerRef, active);\n useFocusTrap(drawerRef, active, initialFocus, { fallbackToContainer: true });\n useReturnFocus(present, { ref: drawerRef, returnFocus });\n useScrollLock(present);\n\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n if (!layer.isTopmost()) return;\n event.preventDefault();\n onClose();\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [closeOnEscape, layer, onClose, open]);\n\n if (!present) return null;\n\n return (\n <div\n className=\"sph-drawer__backdrop\"\n data-state={state}\n data-side={side}\n role=\"presentation\"\n onMouseDown={(event) => {\n if (closeOnOverlayClick && event.target === event.currentTarget)\n onClose();\n }}\n >\n <section\n ref={drawerRef}\n className={cn(\"sph-drawer\", className)}\n data-side={side}\n data-size={size}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <header className=\"sph-drawer__header\">\n <div className=\"sph-drawer__heading\">\n <h2 id={titleId} className=\"sph-drawer__title\">\n {node(title)}\n </h2>\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-drawer__description\">\n {node(description)}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"sph-drawer__close\"\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n </header>\n {children !== undefined && (\n <div className=\"sph-drawer__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-drawer__footer\">{node(footer)}</footer>\n )}\n </section>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type FieldMessageProps = Omit<\n HTMLAttributes<HTMLParagraphElement>,\n \"children\"\n> & {\n variant?: \"hint\" | \"error\" | \"success\";\n children?: Renderable;\n};\n\nexport function FieldMessage({\n variant = \"hint\",\n className,\n children,\n ...props\n}: FieldMessageProps) {\n if (children === undefined || children === null) return null;\n\n return (\n <p\n {...node(props)}\n className={cn(\"sph-field-message\", className)}\n data-variant={variant}\n role={variant === \"error\" ? \"alert\" : undefined}\n >\n {node(children)}\n </p>\n );\n}\n","import { cn } from \"cn\";\nimport { cloneElement, isValidElement, useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { FieldMessage, type FieldMessageProps } from \"../FieldMessage\";\n\nexport type FieldProps = {\n label?: Renderable;\n htmlFor?: string;\n description?: Renderable;\n message?: Renderable;\n messageType?: FieldMessageProps[\"variant\"];\n required?: boolean;\n className?: string;\n children?: Renderable;\n};\n\ntype ControlAria = {\n id?: string;\n \"aria-describedby\"?: string;\n \"aria-required\"?: boolean | \"true\" | \"false\";\n \"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\n};\n\nexport function Field({\n label,\n htmlFor,\n description,\n message,\n messageType = \"hint\",\n required = false,\n className,\n children,\n}: FieldProps) {\n const generatedId = useId();\n const descriptionId = description ? `${generatedId}-description` : undefined;\n const messageId = message ? `${generatedId}-message` : undefined;\n const describedBy = [descriptionId, messageId].filter(Boolean).join(\" \");\n\n const isControl = isValidElement<ControlAria>(children);\n const controlId =\n (isControl ? children.props.id : undefined) ??\n htmlFor ??\n (isControl ? `${generatedId}-control` : undefined);\n\n const control = isControl\n ? cloneElement(children, {\n id: controlId,\n \"aria-describedby\":\n [children.props[\"aria-describedby\"], describedBy]\n .filter(Boolean)\n .join(\" \") || undefined,\n \"aria-required\":\n children.props[\"aria-required\"] ?? (required || undefined),\n \"aria-invalid\":\n children.props[\"aria-invalid\"] ??\n (messageType === \"error\" && messageId ? true : undefined),\n })\n : node(children);\n\n return (\n <div className={cn(\"sph-field\", className)}>\n {label !== undefined && (\n <label className=\"sph-field__label\" htmlFor={htmlFor ?? controlId}>\n <span>{node(label)}</span>\n {required && <span className=\"sph-field__required\">Required</span>}\n </label>\n )}\n {description !== undefined && description !== null && (\n <p id={descriptionId} className=\"sph-field__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-field__control\">{control}</div>\n {message !== undefined && message !== null && (\n <FieldMessage id={messageId} variant={messageType}>\n {node(message)}\n </FieldMessage>\n )}\n </div>\n );\n}\n","const TABBABLE_SELECTOR = [\n \"a[href]\",\n \"area[href]\",\n \"button\",\n 'input:not([type=\"hidden\"])',\n \"select\",\n \"textarea\",\n \"iframe\",\n \"summary\",\n \"[tabindex]\",\n '[contenteditable]:not([contenteditable=\"false\"])',\n].join(\", \");\n\nexport type TabExit = \"trigger\" | \"after-trigger\" | null;\n\nexport function panelTabExit(\n shiftKey: boolean,\n index: number,\n count: number,\n): TabExit {\n if (shiftKey) return index <= 0 ? \"trigger\" : null;\n if (count === 0 || index === count - 1) return \"after-trigger\";\n return null;\n}\n\nexport function tabbables(root: ParentNode | null | undefined): HTMLElement[] {\n if (!root) return [];\n return Array.from(\n root.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR),\n ).filter(\n (element) =>\n element.tabIndex >= 0 &&\n !element.hasAttribute(\"disabled\") &&\n !element.closest(\"[inert], [aria-hidden='true']\") &&\n element.getClientRects().length > 0,\n );\n}\n\nexport function focusElement(element: HTMLElement | null | undefined): void {\n element?.focus({ preventScroll: true });\n}\n\nexport function focusInto(panel: HTMLElement | null | undefined): void {\n if (!panel) return;\n focusElement(tabbables(panel)[0] ?? panel);\n}\n\nexport function nextTabStop(\n trigger: HTMLElement | null | undefined,\n skip: Array<HTMLElement | null | undefined>,\n): HTMLElement | undefined {\n if (!trigger) return undefined;\n return tabbables(trigger.ownerDocument).find(\n (element) =>\n (trigger.compareDocumentPosition(element) &\n Node.DOCUMENT_POSITION_FOLLOWING) !==\n 0 &&\n !trigger.contains(element) &&\n !skip.some((scope) => scope?.contains(element)),\n );\n}\n\nexport type PanelTabEvent = {\n key: string;\n shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport function handlePanelTab(\n event: PanelTabEvent,\n panel: HTMLElement | null | undefined,\n trigger: HTMLElement | null | undefined,\n scope: HTMLElement | null | undefined,\n onExit: (exit: Exclude<TabExit, null>) => void,\n): void {\n if (event.key !== \"Tab\" || !panel) return;\n const elements = tabbables(panel);\n const active = panel.ownerDocument.activeElement as HTMLElement | null;\n if (active && active !== panel && !panel.contains(active)) return;\n const exit = panelTabExit(\n event.shiftKey,\n active ? elements.indexOf(active) : -1,\n elements.length,\n );\n if (!exit) return;\n if (exit === \"trigger\") {\n event.preventDefault();\n focusElement(trigger);\n } else {\n const next = nextTabStop(trigger, [scope, panel]);\n if (next) {\n event.preventDefault();\n focusElement(next);\n }\n }\n onExit(exit);\n}\n","import { cn } from \"cn\";\nimport {\n cloneElement,\n Fragment,\n isValidElement,\n type ReactElement,\n} from \"react\";\nimport { Button } from \"@/atoms/Button\";\nimport { IconButton } from \"@/atoms/IconButton\";\n\ntype Props = Record<string, unknown>;\ntype Handler = (event: { defaultPrevented?: boolean }) => void;\n\nconst SLOTTED_COMPONENTS: unknown[] = [Button, IconButton];\n\nexport function canSlotTrigger(\n trigger: unknown,\n asChild: boolean | undefined,\n nativeTypes: readonly string[] = [\"button\"],\n): trigger is ReactElement<Props> {\n if (!isValidElement(trigger) || trigger.type === Fragment) return false;\n if (asChild !== undefined) return asChild;\n return typeof trigger.type === \"string\"\n ? nativeTypes.includes(trigger.type)\n : SLOTTED_COMPONENTS.includes(trigger.type);\n}\n\nfunction chain(own: unknown, ours: unknown): unknown {\n if (typeof own !== \"function\") return ours;\n if (typeof ours !== \"function\") return own;\n return (event: { defaultPrevented?: boolean }) => {\n (own as Handler)(event);\n if (!event?.defaultPrevented) (ours as Handler)(event);\n };\n}\n\nexport function slotTrigger(\n element: ReactElement<Props>,\n props: Props,\n): ReactElement<Props> {\n const own = element.props;\n const merged: Props = { \"data-as-child\": \"\" };\n for (const [key, value] of Object.entries(props)) {\n if (/^on[A-Z]/.test(key)) merged[key] = chain(own[key], value);\n else if (value !== undefined) merged[key] = value;\n }\n merged.className = cn(\n own.className as string | undefined,\n props.className as string | undefined,\n );\n merged.disabled = Boolean(own.disabled || props.disabled) || undefined;\n if (element.type === \"button\" && own.type === undefined)\n merged.type = \"button\";\n return cloneElement(element, merged);\n}\n\nexport function hasAccessibleText(value: unknown): boolean {\n if (typeof value === \"string\") return value.trim().length > 0;\n if (typeof value === \"number\" || typeof value === \"bigint\") return true;\n if (value === null || value === undefined || typeof value === \"boolean\")\n return false;\n if (isValidElement(value)) {\n const props = value.props as Props;\n const hidden = props[\"aria-hidden\"];\n if (hidden === true || hidden === \"true\") return false;\n for (const name of [\"aria-label\", \"aria-labelledby\", \"title\"]) {\n const text = props[name];\n if (typeof text === \"string\" && text.trim()) return true;\n }\n if (typeof value.type !== \"string\") {\n const label = props.label;\n if (typeof label === \"string\" && label.trim()) return true;\n }\n return hasAccessibleText(props.children);\n }\n if (typeof value === \"object\" && Symbol.iterator in value)\n return Array.from(value as Iterable<unknown>).some(hasAccessibleText);\n return false;\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n type OverlaySide,\n useIsoLayoutEffect,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n focusElement,\n handlePanelTab,\n type PanelTabEvent,\n tabbables,\n} from \"../Popover/focusFlow\";\nimport { canSlotTrigger, slotTrigger } from \"../Popover/trigger\";\n\nexport type HoverCardProps = {\n trigger: Renderable;\n children: Renderable;\n /** Grace before opening, so passing the trigger never flickers. */\n openDelay?: number;\n /** Grace before closing, so the pointer can travel into the card. */\n closeDelay?: number;\n placement?: OverlaySide;\n ariaLabel?: string;\n asChild?: boolean;\n className?: string;\n};\n\nconst SLOTTED_NATIVE = [\"button\", \"a\"] as const;\n\nexport function HoverCard({\n trigger,\n children,\n openDelay = 180,\n closeDelay = 140,\n placement = \"bottom\",\n ariaLabel = \"Hover card\",\n asChild,\n className,\n}: HoverCardProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const timers = useRef<{ open?: number; close?: number }>({});\n const skipFocusOpen = useRef(false);\n const [open, setOpen] = useState(false);\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useIsoLayoutEffect(() => {\n triggerRef.current =\n rootRef.current?.querySelector<HTMLElement>(\".sph-hover-card__trigger\") ??\n null;\n });\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: placement,\n align: \"start\",\n offset: 6,\n });\n const clearTimers = () => {\n if (timers.current.open !== undefined)\n window.clearTimeout(timers.current.open);\n if (timers.current.close !== undefined)\n window.clearTimeout(timers.current.close);\n timers.current = {};\n };\n\n const requestOpen = () => {\n clearTimers();\n timers.current.open = window.setTimeout(() => setOpen(true), openDelay);\n };\n\n const requestClose = () => {\n clearTimers();\n timers.current.close = window.setTimeout(() => setOpen(false), closeDelay);\n };\n\n const closeNow = () => {\n clearTimers();\n setOpen(false);\n };\n\n const focusTriggerQuietly = () => {\n skipFocusOpen.current = true;\n focusElement(triggerRef.current);\n skipFocusOpen.current = false;\n };\n\n useEffect(() => clearTimers, []);\n\n useEffect(() => {\n if (!present || !portaled) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n const active = document.activeElement;\n const inside = Boolean(active && contentRef.current?.contains(active));\n closeNow();\n if (inside) focusTriggerQuietly();\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n )\n closeNow();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [contentRef, present, portaled]);\n\n const handleBlur = (event: { relatedTarget: EventTarget | null }) => {\n const next = event.relatedTarget as Node | null;\n if (\n next &&\n (rootRef.current?.contains(next) || contentRef.current?.contains(next))\n )\n return;\n closeNow();\n };\n\n const handleTriggerFocus = () => {\n if (!skipFocusOpen.current) requestOpen();\n };\n\n const handleTriggerKeyDown = (event: PanelTabEvent) => {\n if (event.key === \"Escape\") {\n closeNow();\n return;\n }\n if (event.key !== \"Tab\" || event.shiftKey || !open) return;\n const first = tabbables(contentRef.current)[0];\n if (!first) return;\n event.preventDefault();\n clearTimers();\n focusElement(first);\n };\n\n const handleCardKeyDown = (event: PanelTabEvent) =>\n handlePanelTab(\n event,\n contentRef.current,\n triggerRef.current,\n rootRef.current,\n clearTimers,\n );\n\n const handleCardPointerLeave = () => {\n const active = document.activeElement;\n if (active && contentRef.current?.contains(active)) return;\n requestClose();\n };\n\n const triggerProps = {\n className: \"sph-hover-card__trigger\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? id : undefined,\n onFocus: handleTriggerFocus,\n onKeyDown: handleTriggerKeyDown,\n } as const;\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-hover-card\", className)}\n data-open={open || undefined}\n onPointerEnter={requestOpen}\n onPointerLeave={requestClose}\n onBlur={handleBlur}\n >\n {canSlotTrigger(trigger, asChild, SLOTTED_NATIVE) ? (\n slotTrigger(trigger, triggerProps)\n ) : (\n <button type=\"button\" {...triggerProps}>\n {node(trigger)}\n </button>\n )}\n {present &&\n portaled &&\n createPortal(\n <div\n id={id}\n ref={contentRef}\n className=\"sph-hover-card__content\"\n data-state={state}\n role=\"dialog\"\n aria-label={ariaLabel}\n onPointerEnter={clearTimers}\n onPointerLeave={handleCardPointerLeave}\n onBlur={handleBlur}\n onKeyDown={handleCardKeyDown}\n >\n {node(children)}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n useIsoLayoutEffect,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n canSlotTrigger,\n hasAccessibleText,\n slotTrigger,\n} from \"../Popover/trigger\";\nimport { focusElement, nextTabStop } from \"../Popover/focusFlow\";\nimport { MenuContent, type MenuItem } from \"./MenuContent\";\n\nexport type { MenuItem } from \"./MenuContent\";\n\nexport type MenuProps = {\n trigger: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n /** Controlled open state. */\n open?: boolean;\n /** Fires whenever the menu asks to open or close. */\n onOpenChange?: (open: boolean) => void;\n label?: string;\n align?: \"start\" | \"end\";\n disabled?: boolean;\n asChild?: boolean;\n className?: string;\n};\n\nconst ICON_TRIGGER_LABEL = \"Open menu\";\n\nexport function Menu({\n trigger,\n items,\n onSelect,\n label,\n align = \"start\",\n open: openProp,\n onOpenChange,\n disabled = false,\n asChild,\n className,\n}: MenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const menuId = useId();\n const [uncontrolled, setUncontrolled] = useState(false);\n const open = openProp ?? uncontrolled;\n const setOpen = (next: boolean) => {\n if (openProp === undefined) setUncontrolled(next);\n onOpenChange?.(next);\n };\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useIsoLayoutEffect(() => {\n triggerRef.current =\n rootRef.current?.querySelector<HTMLElement>(\".sph-menu__trigger\") ?? null;\n });\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: \"bottom\",\n align,\n offset: 4,\n });\n const enabledIndexes = items.flatMap((item, index) =>\n !item.separator && !item.disabled ? [index] : [],\n );\n const close = () => setOpen(false);\n const focusItem = (index: number) =>\n document.getElementById(`${menuId}-${index}`)?.focus();\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n )\n close();\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n const choose = (item: MenuItem) => {\n if (item.disabled || item.separator || item.value === undefined) return;\n onSelect?.(item.value);\n close();\n };\n\n const handleKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setOpen(true);\n const index =\n enabledIndexes[\n event.key === \"ArrowDown\" ? 0 : enabledIndexes.length - 1\n ];\n if (index !== undefined) requestAnimationFrame(() => focusItem(index));\n }\n };\n\n const handleItemEscape = () => {\n close();\n triggerRef.current?.focus();\n };\n\n const handleContentKeyDown = (event: {\n key: string;\n shiftKey: boolean;\n preventDefault(): void;\n }) => {\n if (event.key !== \"Tab\") return;\n event.preventDefault();\n close();\n const trigger = triggerRef.current;\n focusElement(\n event.shiftKey\n ? trigger\n : (nextTabStop(trigger, [rootRef.current, contentRef.current]) ??\n trigger),\n );\n };\n\n const triggerProps = {\n className: \"sph-menu__trigger\",\n \"aria-label\":\n label ?? (hasAccessibleText(trigger) ? undefined : ICON_TRIGGER_LABEL),\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? `${menuId}-menu` : undefined,\n disabled: disabled || undefined,\n onClick: () => setOpen(!open),\n onKeyDown: handleKeyDown,\n } as const;\n\n return (\n <div id={menuId} ref={rootRef} className={cn(\"sph-menu\", className)}>\n {canSlotTrigger(trigger, asChild) ? (\n slotTrigger(trigger, triggerProps)\n ) : (\n <button type=\"button\" {...triggerProps}>\n {node(trigger)}\n </button>\n )}\n {present &&\n portaled &&\n createPortal(\n <div\n id={`${menuId}-menu`}\n ref={contentRef}\n className=\"sph-menu__content\"\n data-align={align}\n data-state={state}\n role=\"menu\"\n onKeyDown={handleContentKeyDown}\n >\n <MenuContent\n menuId={menuId}\n items={items}\n onChoose={choose}\n onEscape={handleItemEscape}\n />\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { motionDurationMs } from \"../../lib/presence\";\n\nexport type OTPPattern = \"numeric\" | \"alphanumeric\" | RegExp;\n\nexport type OTPState = \"idle\" | \"verifying\" | \"success\" | \"error\";\n\nexport type OTPInputProps = {\n /** The full code, owned by the parent. */\n value: string;\n onChange?: (value: string) => void;\n /** Fires once when the last cell fills. */\n onComplete?: (value: string) => void;\n /** Number of cells. Defaults to 6. */\n length?: number;\n groups?: number[];\n pattern?: OTPPattern;\n state?: OTPState;\n placeholder?: string;\n clearOnError?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n autoFocus?: boolean;\n ariaLabel?: string;\n id?: string;\n name?: string;\n \"aria-describedby\"?: string;\n className?: string;\n};\n\nconst DIGIT = /^[0-9]$/;\nconst ALPHANUMERIC = /^[A-Z0-9]$/;\n\nfunction accepts(pattern: OTPPattern) {\n if (pattern === \"numeric\") return (char: string) => DIGIT.test(char);\n if (pattern === \"alphanumeric\")\n return (char: string) => ALPHANUMERIC.test(char);\n const single = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, \"\"));\n return (char: string) => single.test(char);\n}\n\nexport function otpFill(\n source: string,\n length: number,\n pattern: OTPPattern = \"numeric\",\n) {\n const test = accepts(pattern);\n const text = pattern === \"alphanumeric\" ? source.toUpperCase() : source;\n let code = \"\";\n for (const char of text) {\n if (code.length >= length) break;\n if (test(char)) code += char;\n }\n return code;\n}\n\nexport function otpWrite(\n value: string,\n index: number,\n digit: string,\n length: number,\n) {\n const cells = Array.from({ length }, (_, position) => value[position] ?? \"\");\n cells[index] = digit;\n return cells.join(\"\");\n}\n\nexport function otpErase(value: string, index: number) {\n return index < value.length ? value.slice(0, index) : value.slice(0, -1);\n}\n\nexport function otpPaste(\n value: string,\n pasted: string,\n start: number,\n end: number,\n length: number,\n pattern: OTPPattern = \"numeric\",\n) {\n const clean = otpFill(pasted, length, pattern);\n if (!clean) return value;\n if (clean.length >= length) return clean;\n const head = value.slice(0, Math.min(start, value.length));\n return otpFill(head + clean + value.slice(end), length, pattern);\n}\n\nexport function otpSelection(\n position: number,\n filled: number,\n length: number,\n): [number, number] {\n const start = Math.max(0, Math.min(position, filled, length - 1));\n return start < filled ? [start, start + 1] : [start, start];\n}\n\nexport function otpBoundaries(groups: number[] | undefined, length: number) {\n const boundaries = new Set<number>();\n if (!groups) return boundaries;\n let total = 0;\n for (const size of groups) {\n total += Math.max(0, Math.floor(size));\n if (total > 0 && total < length) boundaries.add(total);\n }\n return boundaries;\n}\n\nfunction slotGlyph(\n placeholder: string | undefined,\n index: number,\n length: number,\n) {\n if (!placeholder) return \"\";\n const glyphs = Array.from(placeholder);\n return glyphs.length >= length ? glyphs[index] : placeholder;\n}\n\nexport function OTPInput({\n value,\n onChange,\n onComplete,\n length = 6,\n groups,\n pattern = \"numeric\",\n state = \"idle\",\n placeholder,\n clearOnError = false,\n disabled,\n invalid,\n autoFocus,\n ariaLabel = \"One-time code\",\n id,\n name,\n \"aria-describedby\": describedBy,\n className,\n}: OTPInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const slotsRef = useRef<HTMLDivElement | null>(null);\n const [focused, setFocused] = useState(false);\n const [selection, setSelection] = useState<[number, number]>([0, 0]);\n const code = value.slice(0, length);\n const busy = state === \"verifying\";\n const errored = invalid || state === \"error\";\n\n const select = (start: number, end: number) => {\n const input = inputRef.current;\n if (!input) return;\n if (input.selectionStart !== start || input.selectionEnd !== end) {\n input.setSelectionRange(start, end);\n }\n setSelection((current) =>\n current[0] === start && current[1] === end ? current : [start, end],\n );\n };\n\n const place = (\n position: number,\n filled = inputRef.current?.value.length ?? code.length,\n ) => {\n const [start, end] = otpSelection(position, filled, length);\n select(start, end);\n };\n\n const sync = () => {\n const input = inputRef.current;\n if (!input || document.activeElement !== input) return;\n const start = input.selectionStart ?? code.length;\n const end = input.selectionEnd ?? start;\n if (end - start > 1) select(start, end);\n else place(start);\n };\n\n const update = (next: string, caret: number) => {\n const input = inputRef.current;\n if (input && input.value !== next) input.value = next;\n place(caret, next.length);\n if (next === code) return;\n onChange?.(next);\n if (next.length === length) onComplete?.(next);\n };\n\n useEffect(() => {\n const input = inputRef.current;\n if (input && input.value !== code) input.value = code;\n });\n\n useEffect(() => {\n if (focused) place(selection[0]);\n }, [code]);\n\n useEffect(() => {\n if (state !== \"error\" || !clearOnError) return;\n const wait = motionDurationMs(slotsRef.current, \"slow\");\n const timer = setTimeout(() => {\n if (inputRef.current) inputRef.current.value = \"\";\n if (code) onChange?.(\"\");\n if (document.activeElement === inputRef.current) place(0, 0);\n }, wait);\n return () => clearTimeout(timer);\n }, [state, clearOnError]);\n\n const boundaries = otpBoundaries(groups, length);\n const active = focused && !disabled ? Math.min(selection[0], length - 1) : -1;\n const ranged = selection[1] - selection[0] > 1;\n\n return (\n <div\n className={cn(\"sph-otp\", className)}\n data-state={state}\n data-invalid={errored || undefined}\n data-disabled={disabled || undefined}\n data-focused={(focused && !disabled) || undefined}\n >\n <div className=\"sph-otp__slots\" ref={slotsRef} aria-hidden=\"true\">\n {Array.from({ length }).flatMap((_, index) => {\n const char = code[index];\n const isActive = active === index;\n const selected =\n focused && ranged && index >= selection[0] && index < selection[1];\n const slot = (\n <span\n key={index}\n className=\"sph-otp__slot\"\n data-slot={index}\n data-filled={char ? true : undefined}\n data-active={isActive || undefined}\n data-selected={selected || undefined}\n style={\n { \"--sph-otp-index\": index } as CSSProperties &\n Record<string, string | number>\n }\n >\n {char ? (\n <span key={`${index}-${char}`} className=\"sph-otp__char\">\n {char}\n </span>\n ) : (\n <span className=\"sph-otp__placeholder\">\n {slotGlyph(placeholder, index, length)}\n </span>\n )}\n {isActive && !char && !ranged ? (\n <span className=\"sph-otp__caret\" />\n ) : null}\n </span>\n );\n return boundaries.has(index)\n ? [\n <span\n key={`separator-${index}`}\n className=\"sph-otp__separator\"\n />,\n slot,\n ]\n : [slot];\n })}\n </div>\n <input\n ref={inputRef}\n id={id}\n name={name}\n className=\"sph-otp__input\"\n defaultValue={code}\n type=\"text\"\n inputMode={pattern === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete=\"one-time-code\"\n autoCapitalize={pattern === \"alphanumeric\" ? \"characters\" : \"off\"}\n autoCorrect=\"off\"\n maxLength={length}\n disabled={disabled}\n readOnly={busy}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={errored || undefined}\n aria-busy={busy || undefined}\n onFocus={() => {\n setFocused(true);\n place(code.length);\n }}\n onBlur={() => setFocused(false)}\n onClick={(event) => {\n const slots =\n slotsRef.current?.querySelectorAll<HTMLElement>(\"[data-slot]\");\n if (!slots) return;\n const x = event.clientX;\n const filled = event.currentTarget.value.length;\n let target = filled;\n slots.forEach((slot, index) => {\n const rect = slot.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right) target = index;\n });\n place(Math.min(target, filled));\n }}\n onKeyUp={sync}\n onSelect={sync}\n onInput={(event) => {\n const input = event.currentTarget;\n const raw = input.value;\n const caret = input.selectionStart ?? raw.length;\n const next = otpFill(raw, length, pattern);\n if (next.length < code.length && raw.length >= code.length) {\n update(code, Math.min(caret, code.length));\n return;\n }\n update(next, otpFill(raw.slice(0, caret), length, pattern).length);\n }}\n onKeyDown={(event) => {\n const input = event.currentTarget;\n const start = input.selectionStart ?? code.length;\n const end = input.selectionEnd ?? start;\n if (event.key === \"Backspace\") {\n event.preventDefault();\n if (busy || !code) return;\n const next = otpErase(code, Math.min(start, end));\n update(next, next.length);\n } else if (event.key === \"ArrowLeft\" && !event.shiftKey) {\n event.preventDefault();\n place(start - 1);\n } else if (event.key === \"ArrowRight\" && !event.shiftKey) {\n event.preventDefault();\n place(end - start > 1 ? end : start + 1);\n } else if (event.key === \"Home\" && !event.shiftKey) {\n event.preventDefault();\n place(0);\n } else if (event.key === \"End\" && !event.shiftKey) {\n event.preventDefault();\n place(code.length);\n } else if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n !otpFill(event.key, 1, pattern)\n ) {\n event.preventDefault();\n }\n }}\n onPaste={(event) => {\n const text = event.clipboardData?.getData(\"text\") ?? \"\";\n if (!text) return;\n event.preventDefault();\n if (busy) return;\n const input = event.currentTarget;\n const start = input.selectionStart ?? code.length;\n const end = input.selectionEnd ?? start;\n const next = otpPaste(code, text, start, end, length, pattern);\n const inserted = otpFill(text, length, pattern).length;\n update(\n next,\n next.length === length\n ? length\n : Math.min(start + inserted, next.length),\n );\n }}\n />\n </div>\n );\n}\n","import { CaretLeftIcon, CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type PaginationProps = Omit<HTMLAttributes<HTMLElement>, \"onChange\"> & {\n /** Current page, 1-based. */\n page: number;\n pageCount: number;\n onPageChange?: (page: number) => void;\n /** Numbers shown either side of the current page. Default 1. */\n siblings?: number;\n /** Readout drawn on the right: \"1–20 of 340\". */\n status?: Renderable;\n /** Accessible name for the nav landmark. */\n label?: string;\n};\n\n/** The run of entries to draw: numbers with `\"gap\"` holes between them. */\nfunction pageWindow(\n page: number,\n pageCount: number,\n siblings: number,\n): (number | \"gap\")[] {\n const around = Array.from({ length: siblings * 2 + 1 }, (_, offset) => {\n const candidate = page - siblings + offset;\n return candidate >= 1 && candidate <= pageCount ? candidate : null;\n }).filter((n): n is number => n !== null);\n const pages = [...new Set([1, pageCount, ...around])].sort((a, b) => a - b);\n const entries: (number | \"gap\")[] = [];\n let previous = 0;\n for (const value of pages) {\n if (value - previous > 1) entries.push(\"gap\");\n entries.push(value);\n previous = value;\n }\n return entries;\n}\n\nexport function Pagination({\n page,\n pageCount,\n onPageChange,\n siblings = 1,\n status,\n label = \"Pagination\",\n className,\n ...props\n}: PaginationProps) {\n if (pageCount < 1) return null;\n const entries = pageWindow(page, pageCount, Math.max(0, siblings));\n\n return (\n <nav\n {...node(props)}\n className={cn(\"sph-pagination\", className)}\n aria-label={label}\n >\n <ul className=\"sph-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"sph-pagination__nav\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => onPageChange?.(page - 1)}\n >\n <CaretLeftIcon size={13} weight=\"bold\" />\n </button>\n </li>\n {entries.map((entry, index) =>\n entry === \"gap\" ? (\n <li\n key={`gap-${index}`}\n className=\"sph-pagination__gap\"\n aria-hidden=\"true\"\n >\n …\n </li>\n ) : (\n <li key={`page-${entry}`}>\n {entry === page ? (\n <span\n className=\"sph-pagination__page sph-pagination__page--current\"\n aria-current=\"page\"\n >\n {entry}\n </span>\n ) : (\n <button\n type=\"button\"\n className=\"sph-pagination__page\"\n aria-label={`Page ${entry}`}\n onClick={() => onPageChange?.(entry)}\n >\n {entry}\n </button>\n )}\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n className=\"sph-pagination__nav\"\n aria-label=\"Next page\"\n disabled={page >= pageCount}\n onClick={() => onPageChange?.(page + 1)}\n >\n <CaretRightIcon size={13} weight=\"bold\" />\n </button>\n </li>\n </ul>\n {status !== undefined && (\n <span className=\"sph-pagination__status\">{node(status)}</span>\n )}\n </nav>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n useIsoLayoutEffect,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n focusElement,\n focusInto,\n handlePanelTab,\n type PanelTabEvent,\n} from \"./focusFlow\";\nimport { canSlotTrigger, slotTrigger } from \"./trigger\";\n\nexport type PopoverProps = {\n trigger: Renderable;\n children: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n ariaLabel?: string;\n placement?: \"start\" | \"end\";\n disabled?: boolean;\n asChild?: boolean;\n className?: string;\n};\n\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n ariaLabel = \"Popover\",\n placement = \"start\",\n disabled = false,\n asChild,\n className,\n}: PopoverProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const focusOnOpen = useRef(false);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const openRef = useRef(isOpen);\n openRef.current = isOpen;\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(isOpen, \"fast\");\n const portaled = usePortaled();\n useIsoLayoutEffect(() => {\n triggerRef.current =\n rootRef.current?.querySelector<HTMLElement>(\".sph-popover__trigger\") ??\n null;\n });\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: \"bottom\",\n align: placement,\n offset: 6,\n });\n const setOpen = (next: boolean) => {\n if (next === openRef.current) return;\n openRef.current = next;\n focusOnOpen.current = next;\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!isOpen || !present || !portaled || !focusOnOpen.current) return;\n focusOnOpen.current = false;\n const frame = requestAnimationFrame(() => focusInto(contentRef.current));\n return () => cancelAnimationFrame(frame);\n }, [isOpen, present, portaled]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !contentRef.current?.contains(target)\n )\n setOpen(false);\n };\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n const active = document.activeElement;\n const inside = Boolean(active && contentRef.current?.contains(active));\n setOpen(false);\n if (inside) focusElement(triggerRef.current);\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen]);\n\n const handleTriggerKeyDown = (event: PanelTabEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n setOpen(true);\n return;\n }\n if (\n event.key === \"Tab\" &&\n !event.shiftKey &&\n isOpen &&\n contentRef.current\n ) {\n event.preventDefault();\n focusInto(contentRef.current);\n }\n };\n\n const handlePanelKeyDown = (event: PanelTabEvent) =>\n handlePanelTab(\n event,\n contentRef.current,\n triggerRef.current,\n rootRef.current,\n () => setOpen(false),\n );\n\n const triggerProps = {\n className: \"sph-popover__trigger\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? id : undefined,\n disabled: disabled || undefined,\n onClick: () => setOpen(!isOpen),\n onKeyDown: handleTriggerKeyDown,\n } as const;\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-popover\", className)}\n data-open={isOpen || undefined}\n >\n {canSlotTrigger(trigger, asChild) ? (\n slotTrigger(trigger, triggerProps)\n ) : (\n <button type=\"button\" {...triggerProps}>\n {node(trigger)}\n </button>\n )}\n {present &&\n portaled &&\n createPortal(\n <div\n id={id}\n ref={contentRef}\n className=\"sph-popover__content\"\n data-placement={placement}\n data-state={state}\n role=\"dialog\"\n aria-label={ariaLabel}\n tabIndex={-1}\n onKeyDown={handlePanelKeyDown}\n >\n {node(children)}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import { CheckIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type QuestionOption = {\n value: string;\n label: Renderable;\n /** Secondary line under the label. */\n hint?: Renderable;\n disabled?: boolean;\n};\n\nexport type QuestionCardProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"value\" | \"defaultValue\"\n> & {\n question: Renderable;\n /** Helper line under the question. */\n description?: Renderable;\n options: QuestionOption[];\n /** Controlled selected option. */\n value?: string;\n /** Selected option on first render. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Correct option. Setting it locks the card and shows the verdict. */\n answer?: string;\n /** Row under the options: submit buttons, hints, score. */\n footer?: Renderable;\n disabled?: boolean;\n};\n\nexport function QuestionCard({\n question,\n description,\n options,\n value,\n defaultValue,\n onValueChange,\n answer,\n footer,\n disabled = false,\n className,\n ...props\n}: QuestionCardProps) {\n const [uncontrolled, setUncontrolled] = useState<string | undefined>(\n defaultValue,\n );\n const selected = value ?? uncontrolled;\n const questionId = `${useId()}-question`;\n const locked = answer !== undefined;\n const verdict = locked\n ? selected === answer\n ? \"correct\"\n : \"wrong\"\n : undefined;\n\n const pick = (optionValue: string) => {\n if (locked || disabled) return;\n if (value === undefined) setUncontrolled(optionValue);\n onValueChange?.(optionValue);\n };\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-question-card\", className)}\n data-verdict={verdict}\n >\n <span className=\"sph-question-card__question\" id={questionId}>\n {node(question)}\n </span>\n {description !== undefined && (\n <span className=\"sph-question-card__description\">\n {node(description)}\n </span>\n )}\n <div\n className=\"sph-question-card__options\"\n role=\"group\"\n aria-labelledby={questionId}\n >\n {options.map((option) => {\n const optionSelected = selected === option.value;\n const isAnswer = locked && option.value === answer;\n const optionVerdict = !locked\n ? undefined\n : isAnswer\n ? optionSelected\n ? \"correct\"\n : \"revealed\"\n : optionSelected\n ? \"wrong\"\n : undefined;\n return (\n <button\n key={option.value}\n type=\"button\"\n className=\"sph-question-card__option\"\n aria-pressed={optionSelected}\n data-verdict={optionVerdict}\n disabled={disabled || option.disabled || locked}\n onClick={() => pick(option.value)}\n >\n <span className=\"sph-question-card__marker\" aria-hidden=\"true\">\n <CheckIcon\n size={11}\n weight=\"bold\"\n className=\"sph-question-card__tick\"\n />\n <XIcon\n size={11}\n weight=\"bold\"\n className=\"sph-question-card__cross\"\n />\n <span className=\"sph-question-card__dot\" />\n </span>\n <span className=\"sph-question-card__option-text\">\n <span className=\"sph-question-card__option-label\">\n {node(option.label)}\n </span>\n {option.hint !== undefined && (\n <span className=\"sph-question-card__option-hint\">\n {node(option.hint)}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n {footer !== undefined && (\n <div className=\"sph-question-card__footer\">{node(footer)}</div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type RadioOption = {\n value: string;\n label: Renderable;\n description?: Renderable;\n disabled?: boolean;\n};\n\nexport type RadioGroupProps = {\n value: string;\n options: RadioOption[];\n onValueChange: (value: string) => void;\n name: string;\n label?: Renderable;\n description?: Renderable;\n size?: ControlSize;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function RadioGroup({\n value,\n options,\n onValueChange,\n name,\n label,\n description,\n size = \"md\",\n orientation = \"vertical\",\n disabled = false,\n className,\n}: RadioGroupProps) {\n const groupId = useId();\n const descriptionId = description ? `${groupId}-description` : undefined;\n\n return (\n <fieldset\n className={cn(\"sph-radio-group\", className)}\n data-size={size}\n data-orientation={orientation}\n disabled={disabled}\n aria-describedby={descriptionId}\n >\n {label !== undefined && (\n <legend className=\"sph-radio-group__legend\">{node(label)}</legend>\n )}\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-radio-group__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-radio-group__options\">\n {options.map((option, index) => {\n const optionId = `${groupId}-${index}`;\n const optionDescriptionId = option.description\n ? `${optionId}-description`\n : undefined;\n\n return (\n <label\n key={option.value}\n className=\"sph-radio-group__option\"\n data-disabled={option.disabled || undefined}\n >\n <input\n id={optionId}\n type=\"radio\"\n name={name}\n value={option.value}\n checked={value === option.value}\n disabled={disabled || option.disabled}\n aria-describedby={optionDescriptionId}\n onChange={() => onValueChange(option.value)}\n />\n <span className=\"sph-radio-group__control\" aria-hidden=\"true\" />\n <span className=\"sph-radio-group__content\">\n <span className=\"sph-radio-group__label\">\n {node(option.label)}\n </span>\n {option.description !== undefined && (\n <span\n id={optionDescriptionId}\n className=\"sph-radio-group__option-description\"\n >\n {node(option.description)}\n </span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\nimport { motionDurationMs, type MotionSpeed } from \"@/lib/presence.js\";\n\nexport type RevealProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children: Renderable;\n trigger?: \"mount\" | \"scroll\";\n direction?: \"up\" | \"down\" | \"left\" | \"right\" | \"none\";\n distance?: number;\n delay?: number;\n speed?: MotionSpeed;\n once?: boolean;\n};\n\nexport function Reveal({\n children,\n trigger = \"mount\",\n direction = \"up\",\n distance = 8,\n delay = 0,\n speed = \"normal\",\n once = true,\n className,\n style,\n ...props\n}: RevealProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [phase, setPhase] = useState<\"idle\" | \"hidden\" | \"shown\">(\"idle\");\n\n useIsoLayoutEffect(() => {\n const element = ref.current;\n let timer: ReturnType<typeof setTimeout> | undefined;\n setPhase(\"hidden\");\n const show = () => {\n if (delay > 0 && element && motionDurationMs(element, speed) > 0) {\n timer = setTimeout(() => setPhase(\"shown\"), delay);\n return;\n }\n setPhase(\"shown\");\n };\n if (\n trigger === \"mount\" ||\n !element ||\n typeof IntersectionObserver !== \"function\"\n ) {\n show();\n return () => clearTimeout(timer);\n }\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) show();\n else if (!once) setPhase(\"hidden\");\n }\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n clearTimeout(timer);\n };\n }, [trigger, once, delay, speed]);\n\n const offset =\n direction === \"none\"\n ? { x: \"0px\", y: \"0px\" }\n : direction === \"up\"\n ? { x: \"0px\", y: `${distance}px` }\n : direction === \"down\"\n ? { x: \"0px\", y: `-${distance}px` }\n : direction === \"left\"\n ? { x: `${distance}px`, y: \"0px\" }\n : { x: `-${distance}px`, y: \"0px\" };\n\n return (\n <div\n {...node(props)}\n ref={ref}\n className={cn(\"sph-reveal\", className)}\n data-speed={speed}\n data-state={phase === \"idle\" ? undefined : phase}\n style={\n {\n ...style,\n \"--sph-reveal-x\": offset.x,\n \"--sph-reveal-y\": offset.y,\n } as CSSProperties & Record<string, string>\n }\n >\n {node(children)}\n </div>\n );\n}\n","import { CaretDownIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SelectOption = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n};\n\nexport type SelectProps = {\n value: string;\n options: SelectOption[];\n onValueChange: (value: string) => void;\n id?: string;\n className?: string;\n placeholder?: Renderable;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n disabled?: boolean;\n size?: ControlSize;\n};\n\nfunction nextEnabled(\n options: SelectOption[],\n start: number,\n direction: 1 | -1,\n) {\n if (options.length === 0) return -1;\n for (let step = 1; step <= options.length; step += 1) {\n const index = (start + step * direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n}\n\nexport function Select({\n value,\n options,\n onValueChange,\n id,\n className,\n placeholder = \"Select an option\",\n ariaLabel,\n ariaLabelledBy,\n disabled = false,\n size = \"md\",\n}: SelectProps) {\n const generatedId = useId();\n const triggerId = id ?? `sph-select-${generatedId}`;\n const listboxId = `${triggerId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const selectedIndex = options.findIndex((option) => option.value === value);\n const firstEnabled = options.findIndex((option) => !option.disabled);\n const [open, setOpen] = useState(false);\n const {\n present,\n state,\n ref: listboxRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, listboxRef, present && portaled, {\n side: \"bottom\",\n align: \"start\",\n offset: 4,\n matchWidth: true,\n });\n const [activeIndex, setActiveIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : firstEnabled,\n );\n\n useEffect(() => {\n if (!open) return;\n const close = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !listboxRef.current?.contains(target)\n )\n setOpen(false);\n };\n document.addEventListener(\"pointerdown\", close);\n return () => document.removeEventListener(\"pointerdown\", close);\n }, [open]);\n\n useEffect(() => {\n if (!open)\n setActiveIndex(selectedIndex >= 0 ? selectedIndex : firstEnabled);\n }, [firstEnabled, open, selectedIndex]);\n\n function choose(index: number) {\n const option = options[index];\n if (!option || option.disabled) return;\n onValueChange(option.value);\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardActionEvent) {\n if (event.key === \"Escape\") {\n if (!open) return;\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const next = nextEnabled(\n options,\n activeIndex,\n event.key === \"ArrowDown\" ? 1 : -1,\n );\n setOpen(true);\n if (next >= 0) setActiveIndex(next);\n return;\n }\n if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const edge =\n event.key === \"Home\" ? firstEnabled : nextEnabled(options, 0, -1);\n setOpen(true);\n if (edge >= 0) setActiveIndex(edge);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) choose(activeIndex);\n else setOpen(true);\n }\n }\n\n const selected = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n return (\n <div ref={rootRef} className={cn(\"sph-select\", className)} data-size={size}>\n <button\n id={triggerId}\n type=\"button\"\n ref={triggerRef}\n className=\"sph-select__trigger\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={\n open && activeIndex >= 0 ? `${listboxId}-${activeIndex}` : undefined\n }\n disabled={disabled || firstEnabled < 0}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n <span className=\"sph-select__value\">\n {node(selected?.label ?? placeholder)}\n </span>\n <CaretDownIcon className=\"sph-select__caret\" aria-hidden=\"true\" />\n </button>\n\n {present &&\n portaled &&\n createPortal(\n <div\n id={listboxId}\n ref={listboxRef}\n role=\"listbox\"\n className=\"sph-select__listbox\"\n data-state={state}\n >\n {options.map((option, index) => (\n <button\n key={option.value}\n id={`${listboxId}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={index === selectedIndex}\n disabled={option.disabled}\n className=\"sph-select__option\"\n data-active={index === activeIndex || undefined}\n onPointerMove={() => !option.disabled && setActiveIndex(index)}\n onClick={() => choose(index)}\n >\n <span>{node(option.label)}</span>\n {index === selectedIndex && (\n <CheckIcon className=\"sph-select__check\" aria-hidden=\"true\" />\n )}\n </button>\n ))}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import {\n CaretDownIcon,\n CaretRightIcon,\n CaretUpIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { AnimatedNumber } from \"@/atoms/AnimatedNumber\";\n\nexport type StatProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n label: Renderable;\n value: Renderable;\n hint?: Renderable;\n};\n\nexport function Stat({ label, value, hint, className, ...props }: StatProps) {\n return (\n <div {...node(props)} className={cn(\"sph-stat\", className)}>\n <span className=\"sph-stat__label\">{node(label)}</span>\n <span className=\"sph-stat__value\">{node(value)}</span>\n {hint !== undefined && (\n <span className=\"sph-stat__hint\">{node(hint)}</span>\n )}\n </div>\n );\n}\n\nexport type StatGroupProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n children: Renderable;\n columns?: number;\n};\n\nexport function StatGroup({\n children,\n columns = 3,\n className,\n style,\n ...props\n}: StatGroupProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-stat-group\", className)}\n style={\n {\n ...style,\n \"--sph-stat-columns\": String(columns),\n } as CSSProperties & Record<string, string>\n }\n >\n {node(children)}\n </div>\n );\n}\n\nexport type DeltaProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\" | \"title\"\n> & {\n value: number;\n format?: (value: number) => string;\n};\n\nconst signed = (value: number) => {\n const magnitude = Math.abs(value);\n const text = Number.isInteger(magnitude)\n ? String(magnitude)\n : String(Math.round(magnitude * 10) / 10);\n return `${value > 0 ? \"+\" : value < 0 ? \"-\" : \"\"}${text}`;\n};\n\nexport function Delta({\n value,\n format = signed,\n className,\n ...props\n}: DeltaProps) {\n const direction = value > 0 ? \"up\" : value < 0 ? \"down\" : \"flat\";\n const Icon =\n direction === \"up\"\n ? CaretUpIcon\n : direction === \"down\"\n ? CaretDownIcon\n : CaretRightIcon;\n return (\n <span\n {...node(props)}\n className={cn(\"sph-delta\", className)}\n data-direction={direction}\n >\n <Icon size={11} aria-hidden=\"true\" />\n <AnimatedNumber value={value} format={format} />\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport { useId, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TabItem = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n content?: Renderable;\n};\n\nexport type TabsProps = {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n children?: Renderable;\n ariaLabel?: string;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n};\n\nfunction firstEnabled(items: TabItem[]) {\n return items.find((item) => !item.disabled)?.value;\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onValueChange,\n children,\n ariaLabel = \"Tabs\",\n orientation = \"horizontal\",\n className,\n}: TabsProps) {\n const generatedId = useId();\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? firstEnabled(items) ?? \"\",\n );\n const activeValue = value ?? uncontrolledValue;\n const activeIndex = Math.max(\n 0,\n items.findIndex((item) => item.value === activeValue),\n );\n const activeItem = items[activeIndex];\n const setValue = (nextValue: string) => {\n setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n };\n const move = (event: KeyboardActionEvent, index: number) => {\n const direction =\n orientation === \"vertical\"\n ? event.key === \"ArrowDown\"\n ? 1\n : -1\n : event.key === \"ArrowRight\"\n ? 1\n : -1;\n if (\n ![\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)\n )\n return;\n event.preventDefault();\n for (let step = 1; step <= items.length; step += 1) {\n const next = (index + step * direction + items.length) % items.length;\n if (!items[next]?.disabled) {\n setValue(items[next].value);\n document.getElementById(`${generatedId}-${next}`)?.focus();\n return;\n }\n }\n };\n const panelId = `${generatedId}-panel`;\n\n return (\n <div className={cn(\"sph-tabs\", className)} data-orientation={orientation}>\n <div\n className=\"sph-tabs__list\"\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n >\n {items.map((item, index) => {\n const selected = item.value === activeValue;\n return (\n <button\n key={item.value}\n id={`${generatedId}-${index}`}\n type=\"button\"\n role=\"tab\"\n className=\"sph-tabs__tab\"\n aria-selected={selected}\n aria-controls={selected ? panelId : undefined}\n tabIndex={selected ? 0 : -1}\n disabled={item.disabled}\n data-selected={selected || undefined}\n onClick={() => !item.disabled && setValue(item.value)}\n onKeyDown={(event) => move(event, index)}\n >\n {node(item.label)}\n </button>\n );\n })}\n </div>\n {activeItem &&\n (activeItem.content !== undefined || children !== undefined) && (\n <div\n id={panelId}\n key={activeItem.content !== undefined ? activeValue : \"static\"}\n className=\"sph-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${generatedId}-${activeIndex}`}\n >\n {node(activeItem.content ?? children)}\n </div>\n )}\n </div>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TaskState = \"todo\" | \"doing\" | \"done\";\n\nexport type TaskListItem = {\n /** Stable id reported back through `onStateChange`. */\n id: string;\n label: Renderable;\n state?: TaskState;\n /** Trailing meta: due date, assignee, counters. */\n meta?: Renderable;\n disabled?: boolean;\n};\n\nexport type TaskListProps = Omit<\n HTMLAttributes<HTMLUListElement>,\n \"children\" | \"onChange\"\n> & {\n items: TaskListItem[];\n /**\n * Fires with the next state when a row's check is pressed:\n * todo → doing → done → todo.\n */\n onStateChange?: (id: string, state: TaskState) => void;\n /** Accessible name for the list. */\n label?: string;\n};\n\nconst CYCLE: Record<TaskState, TaskState> = {\n todo: \"doing\",\n doing: \"done\",\n done: \"todo\",\n};\n\nexport function TaskList({\n items,\n onStateChange,\n label = \"Tasks\",\n className,\n ...props\n}: TaskListProps) {\n const baseId = useId();\n\n return (\n <ul\n {...node(props)}\n className={cn(\"sph-task-list\", className)}\n aria-label={label}\n >\n {items.map((item, index) => {\n const state = item.state ?? \"todo\";\n const labelId = `${baseId}-label-${index}`;\n return (\n <li\n key={item.id}\n className=\"sph-task-list__item\"\n data-state={state}\n data-disabled={item.disabled || undefined}\n >\n <button\n type=\"button\"\n role=\"checkbox\"\n className=\"sph-task-list__check\"\n aria-checked={\n state === \"done\" ? true : state === \"doing\" ? \"mixed\" : false\n }\n aria-labelledby={labelId}\n disabled={item.disabled}\n onClick={() => onStateChange?.(item.id, CYCLE[state])}\n >\n <span className=\"sph-task-list__mark\" aria-hidden=\"true\">\n <CheckIcon\n size={11}\n weight=\"bold\"\n className=\"sph-task-list__tick\"\n />\n <span className=\"sph-task-list__dot\" />\n </span>\n </button>\n <span className=\"sph-task-list__label\" id={labelId}>\n {node(item.label)}\n </span>\n {item.meta !== undefined && (\n <span className=\"sph-task-list__meta\">{node(item.meta)}</span>\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TimelineItem = {\n /** Event title. */\n title: Renderable;\n /** Body rendered under the head. */\n children?: Renderable;\n /** Right-aligned time or meta. */\n timestamp?: Renderable;\n /** Leading icon in place of the default dot. */\n icon?: Renderable;\n tone?: \"default\" | \"accent\" | \"success\" | \"danger\";\n /** Marks the latest event: its marker keeps breathing. */\n current?: boolean;\n};\n\nexport type TimelineProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n items: TimelineItem[];\n /** Accessible name for the list. */\n label?: string;\n};\n\nexport function Timeline({\n items,\n label = \"Timeline\",\n className,\n ...props\n}: TimelineProps) {\n return (\n <ol\n {...node(props)}\n className={cn(\"sph-timeline\", className)}\n aria-label={label}\n >\n {items.map((item, index) => {\n const tone =\n item.tone !== undefined && item.tone !== \"default\"\n ? item.tone\n : undefined;\n return (\n <li\n key={`event-${index}`}\n className=\"sph-timeline__item\"\n data-tone={tone}\n data-current={item.current || undefined}\n >\n <span className=\"sph-timeline__marker\" aria-hidden=\"true\">\n {item.icon !== undefined ? (\n node(item.icon)\n ) : (\n <span className=\"sph-timeline__dot\" />\n )}\n </span>\n <div className=\"sph-timeline__content\">\n <div className=\"sph-timeline__head\">\n <span className=\"sph-timeline__title\">{node(item.title)}</span>\n {item.timestamp !== undefined && (\n <span className=\"sph-timeline__timestamp\">\n {node(item.timestamp)}\n </span>\n )}\n </div>\n {item.children !== undefined && (\n <div className=\"sph-timeline__body\">{node(item.children)}</div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect } from \"react\";\nimport {\n type ExternalToast,\n Toaster as SonnerToaster,\n type ToasterProps as SonnerToasterProps,\n toast,\n} from \"sonner\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type { ExternalToast } from \"sonner\";\nexport { toast };\n\nconst toastIcons = {\n success: (\n <span className=\"sph-toast__status-icon\">\n <CheckIcon size={20} />\n </span>\n ),\n info: (\n <span className=\"sph-toast__status-icon\">\n <InfoIcon size={20} />\n </span>\n ),\n warning: (\n <span className=\"sph-toast__status-icon\">\n <WarningIcon size={20} />\n </span>\n ),\n error: (\n <span className=\"sph-toast__status-icon\">\n <XIcon size={20} />\n </span>\n ),\n};\n\nexport type ToastProps = {\n open?: boolean;\n id?: string | number;\n title: Renderable;\n description?: Renderable;\n variant?: \"neutral\" | \"success\" | \"warning\" | \"danger\";\n action?: ExternalToast[\"action\"];\n duration?: number;\n closeButton?: boolean;\n className?: string;\n};\n\nexport function Toast({\n open = true,\n id,\n title,\n description,\n variant = \"neutral\",\n action,\n duration,\n closeButton = true,\n className,\n}: ToastProps) {\n useEffect(() => {\n if (!open) return;\n const options: ExternalToast = {\n id,\n action,\n closeButton,\n description: node(description),\n duration,\n className: cn(\"sph-toast\", className),\n unstyled: true,\n };\n const toastId =\n variant === \"success\"\n ? toast.success(node(title), options)\n : variant === \"warning\"\n ? toast.warning(node(title), options)\n : variant === \"danger\"\n ? toast.error(node(title), options)\n : toast(node(title), options);\n\n return () => {\n toast.dismiss(toastId);\n };\n }, [open, id, action, closeButton, duration, title, description, variant]);\n\n return null;\n}\n\nexport type ToastViewportProps = Omit<\n SonnerToasterProps,\n \"className\" | \"containerAriaLabel\" | \"icons\" | \"toastOptions\"\n> & {\n label?: string;\n className?: string;\n toastOptions?: SonnerToasterProps[\"toastOptions\"];\n};\n\nexport function ToastViewport({\n label = \"Notifications\",\n className,\n toastOptions,\n theme = \"system\",\n position = \"top-right\",\n closeButton = true,\n expand = false,\n ...props\n}: ToastViewportProps) {\n return (\n <SonnerToaster\n {...node(props)}\n theme={theme}\n position={position}\n closeButton={closeButton}\n icons={toastIcons}\n containerAriaLabel={label}\n expand={expand}\n className={cn(\"sph-toast-viewport\", className)}\n toastOptions={{\n ...toastOptions,\n closeButton: toastOptions?.closeButton ?? closeButton,\n closeButtonAriaLabel:\n toastOptions?.closeButtonAriaLabel ?? \"Dismiss notification\",\n className: cn(\"sph-toast\", toastOptions?.className),\n unstyled: true,\n }}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToolbarProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n label?: string;\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n start?: Renderable;\n end?: Renderable;\n children?: Renderable;\n};\n\nexport function Toolbar({\n label = \"Toolbar\",\n orientation = \"horizontal\",\n size = \"sm\",\n start,\n end,\n children,\n className,\n ...props\n}: ToolbarProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-toolbar\", className)}\n data-orientation={orientation}\n data-size={size}\n role=\"toolbar\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {start !== undefined && (\n <div className=\"sph-toolbar__start\">{node(start)}</div>\n )}\n {children !== undefined && (\n <div className=\"sph-toolbar__content\">{node(children)}</div>\n )}\n {end !== undefined && <div className=\"sph-toolbar__end\">{node(end)}</div>}\n </div>\n );\n}\n","export type TooltipClock = {\n now(): number;\n set(callback: () => void, ms: number): unknown;\n clear(handle: unknown): void;\n};\n\nexport const systemClock: TooltipClock = {\n now: () => Date.now(),\n set: (callback, ms) => setTimeout(callback, ms),\n clear: (handle) => clearTimeout(handle as ReturnType<typeof setTimeout>),\n};\n\nexport const TOOLTIP_DELAY = 400;\nexport const TOOLTIP_SKIP_DELAY = 300;\nexport const TOOLTIP_HOVER_GRACE = 120;\n\nexport type TooltipMember = { dismiss(): void };\n\nexport type TooltipGroupStore = {\n delay: number;\n skipDelay: number;\n isWarm(): boolean;\n opened(member: TooltipMember): void;\n closed(member: TooltipMember): void;\n};\n\nexport function createTooltipGroup(\n delay = TOOLTIP_DELAY,\n skipDelay = TOOLTIP_SKIP_DELAY,\n clock: TooltipClock = systemClock,\n): TooltipGroupStore {\n let active: TooltipMember | null = null;\n let closedAt = Number.NEGATIVE_INFINITY;\n const store: TooltipGroupStore = {\n delay,\n skipDelay,\n isWarm: () => active !== null || clock.now() - closedAt < store.skipDelay,\n opened(member) {\n const previous = active;\n active = member;\n if (previous && previous !== member) previous.dismiss();\n },\n closed(member) {\n if (active === member) active = null;\n closedAt = clock.now();\n },\n };\n return store;\n}\n\nexport type TooltipSettings = {\n delay: number;\n disabled: boolean;\n group: TooltipGroupStore | null;\n};\n\nexport type TooltipController = {\n readonly visible: boolean;\n enter(): void;\n leave(): void;\n hold(): void;\n dismiss(): void;\n keyDown(key: string): boolean;\n destroy(): void;\n};\n\nexport function createTooltipController({\n settings,\n onChange,\n clock = systemClock,\n grace = TOOLTIP_HOVER_GRACE,\n}: {\n settings: () => TooltipSettings;\n onChange: (visible: boolean, warm: boolean) => void;\n clock?: TooltipClock;\n grace?: number;\n}): TooltipController {\n let visible = false;\n let openTimer: unknown;\n let closeTimer: unknown;\n let group: TooltipGroupStore | null = null;\n\n const cancelOpen = () => {\n if (openTimer !== undefined) clock.clear(openTimer);\n openTimer = undefined;\n };\n const cancelClose = () => {\n if (closeTimer !== undefined) clock.clear(closeTimer);\n closeTimer = undefined;\n };\n const member: TooltipMember = { dismiss: () => hide() };\n\n function show(warm: boolean) {\n cancelOpen();\n cancelClose();\n if (visible) return;\n visible = true;\n group = settings().group;\n onChange(true, warm);\n group?.opened(member);\n }\n\n function hide() {\n cancelOpen();\n cancelClose();\n if (!visible) return;\n visible = false;\n onChange(false, false);\n group?.closed(member);\n group = null;\n }\n\n return {\n get visible() {\n return visible;\n },\n enter() {\n const { delay, disabled, group: current } = settings();\n if (disabled) return;\n cancelClose();\n if (visible || openTimer !== undefined) return;\n const warm = current?.isWarm() ?? false;\n const wait = warm ? 0 : delay;\n if (wait <= 0) {\n show(warm);\n return;\n }\n openTimer = clock.set(() => {\n openTimer = undefined;\n show(false);\n }, wait);\n },\n leave() {\n cancelOpen();\n if (!visible || closeTimer !== undefined) return;\n closeTimer = clock.set(() => {\n closeTimer = undefined;\n hide();\n }, grace);\n },\n hold() {\n cancelClose();\n },\n dismiss: hide,\n keyDown(key) {\n if (key !== \"Escape\" || (!visible && openTimer === undefined))\n return false;\n hide();\n return true;\n },\n destroy() {\n cancelOpen();\n cancelClose();\n if (!visible) return;\n visible = false;\n group?.closed(member);\n group = null;\n },\n };\n}\n\nexport function mergeDescribedBy(\n existing: string | undefined,\n id: string | undefined,\n): string | undefined {\n return [existing, id].filter(Boolean).join(\" \") || undefined;\n}\n","import { cn } from \"cn\";\nimport {\n cloneElement,\n createContext,\n Fragment,\n isValidElement,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\nimport {\n createTooltipController,\n createTooltipGroup,\n mergeDescribedBy,\n TOOLTIP_DELAY,\n TOOLTIP_SKIP_DELAY,\n type TooltipGroupStore,\n type TooltipSettings,\n} from \"./controller\";\n\nexport type TooltipProps = {\n content: Renderable;\n children: Renderable;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n delay?: number;\n disabled?: boolean;\n className?: string;\n};\n\nexport type TooltipGroupProps = {\n delay?: number;\n skipDelay?: number;\n children?: Renderable;\n};\n\nconst TooltipGroupContext = createContext<TooltipGroupStore | null>(null);\n\nexport function TooltipGroup({\n delay = TOOLTIP_DELAY,\n skipDelay = TOOLTIP_SKIP_DELAY,\n children,\n}: TooltipGroupProps) {\n const [store] = useState(() => createTooltipGroup(delay, skipDelay));\n store.delay = delay;\n store.skipDelay = skipDelay;\n return (\n <TooltipGroupContext.Provider value={store}>\n {node(children)}\n </TooltipGroupContext.Provider>\n );\n}\n\ntype Describable = { \"aria-describedby\"?: string };\n\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n delay,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const group = useContext(TooltipGroupContext);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const settings = useRef<TooltipSettings>({\n delay: TOOLTIP_DELAY,\n disabled,\n group,\n });\n settings.current = {\n delay: delay ?? group?.delay ?? TOOLTIP_DELAY,\n disabled,\n group,\n };\n const [shown, setShown] = useState({ visible: false, warm: false });\n const [controller] = useState(() =>\n createTooltipController({\n settings: () => settings.current,\n onChange: (visible, warm) => setShown({ visible, warm }),\n }),\n );\n const { visible, warm } = shown;\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLSpanElement>(visible, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side,\n align: \"center\",\n offset: 6,\n });\n\n useEffect(() => () => controller.destroy(), [controller]);\n\n useEffect(() => {\n if (disabled) controller.dismiss();\n }, [disabled, controller]);\n\n useEffect(() => {\n if (!visible) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n controller.keyDown(event.key);\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [visible, controller]);\n\n const describedBy = visible ? id : undefined;\n const cloneable =\n isValidElement<Describable>(children) && children.type !== Fragment;\n const trigger = cloneable\n ? cloneElement(children, {\n \"aria-describedby\": mergeDescribedBy(\n children.props[\"aria-describedby\"],\n describedBy,\n ),\n })\n : node(children);\n\n return (\n <span\n className={cn(\"sph-tooltip\", className)}\n onMouseEnter={controller.enter}\n onMouseLeave={controller.leave}\n onFocus={controller.enter}\n onBlur={controller.dismiss}\n onKeyDown={(event) => controller.keyDown(event.key)}\n >\n <span\n ref={triggerRef}\n className=\"sph-tooltip__trigger\"\n aria-describedby={cloneable ? undefined : describedBy}\n >\n {trigger}\n </span>\n {present &&\n portaled &&\n createPortal(\n <span\n id={id}\n ref={contentRef}\n className=\"sph-tooltip__content\"\n data-side={side}\n data-state={state}\n data-warm={warm || undefined}\n role=\"tooltip\"\n onMouseEnter={controller.hold}\n onMouseLeave={controller.leave}\n >\n {node(content)}\n </span>,\n document.body,\n )}\n </span>\n );\n}\n","/**\n * Nice tick values covering `[min, max]` using 1 / 2 / 2.5 / 5 / 10 steps.\n * Returns a single tick when the range is degenerate.\n */\nexport function niceTicks(min: number, max: number, count = 4): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) {\n return [min];\n }\n const rawStep = (max - min) / Math.max(1, count);\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const normalized = rawStep / magnitude;\n const step =\n (normalized <= 1\n ? 1\n : normalized <= 2\n ? 2\n : normalized <= 2.5\n ? 2.5\n : normalized <= 5\n ? 5\n : 10) * magnitude;\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n for (let value = start; value <= max + step / 1000; value += step) {\n ticks.push(Math.round(value * 1e10) / 1e10);\n }\n return ticks;\n}\n\n/** Linear map from a data domain into an output range (defaults to 0–100). */\nexport function linearScale(\n domainMin: number,\n domainMax: number,\n rangeMin = 0,\n rangeMax = 100,\n): (value: number) => number {\n const span = domainMax - domainMin || 1;\n return (value) =>\n rangeMin + ((value - domainMin) / span) * (rangeMax - rangeMin);\n}\n\n/** Contiguous non-null runs: a `null` breaks a line into segments. */\nexport function runs(\n values: (number | null)[],\n): { start: number; values: number[] }[] {\n const segments: { start: number; values: number[] }[] = [];\n let current: { start: number; values: number[] } | null = null;\n values.forEach((value, index) => {\n if (value === null || value === undefined) {\n current = null;\n return;\n }\n if (!current) {\n current = { start: index, values: [] };\n segments.push(current);\n }\n current.values.push(value);\n });\n return segments;\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100;\n\n/** Polyline through points; optionally curved with a Catmull-Rom spline. */\nexport function linePath(points: [number, number][], smooth = false): string {\n if (points.length === 0) return \"\";\n const first = points[0];\n if (points.length === 1) return `M${round(first[0])},${round(first[1])}`;\n if (!smooth) {\n return points\n .map(\n ([x, y], index) => `${index === 0 ? \"M\" : \"L\"}${round(x)},${round(y)}`,\n )\n .join(\" \");\n }\n\n let path = `M${round(first[0])},${round(first[1])}`;\n for (let index = 0; index < points.length - 1; index += 1) {\n const p0 = points[index - 1] ?? points[index];\n const p1 = points[index];\n const p2 = points[index + 1];\n const p3 = points[index + 2] ?? p2;\n const c1x = p1[0] + (p2[0] - p0[0]) / 6;\n const c1y = p1[1] + (p2[1] - p0[1]) / 6;\n const c2x = p2[0] - (p3[0] - p1[0]) / 6;\n const c2y = p2[1] - (p3[1] - p1[1]) / 6;\n path += ` C${round(c1x)},${round(c1y)} ${round(c2x)},${round(c2y)} ${round(p2[0])},${round(p2[1])}`;\n }\n return path;\n}\n\n/** Line path closed down to a baseline y for area fills. */\nexport function areaPath(\n points: [number, number][],\n baselineY: number,\n smooth = false,\n): string {\n if (points.length === 0) return \"\";\n const line = linePath(points, smooth);\n const start = points[0];\n const end = points[points.length - 1];\n return `${line} L${round(end[0])},${round(baselineY)} L${round(start[0])},${round(baselineY)} Z`;\n}\n\n/** Left edge and width (in %) of one bar inside a grouped band. */\nexport function barRect(\n bandIndex: number,\n seriesIndex: number,\n bands: number,\n seriesCount: number,\n): { left: number; width: number } {\n const band = 100 / Math.max(1, bands);\n const gap = band * 0.3;\n const inner = band - gap;\n const slot = inner / Math.max(1, seriesCount);\n const width = slot * 0.7;\n const left =\n band * bandIndex + gap / 2 + slot * seriesIndex + (slot - width) / 2;\n return { left: round(left), width: round(width) };\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport {\n areaPath,\n barRect,\n linearScale,\n linePath,\n niceTicks,\n runs,\n} from \"./scale\";\n\nexport type ChartSeries = {\n name: string;\n /** One entry per category; `null` breaks the line into segments. */\n values: (number | null)[];\n tone?: \"accent\" | \"success\" | \"danger\" | \"muted\";\n};\n\nexport type ChartProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n /** Labels along the x-axis. */\n categories: string[];\n series: ChartSeries[];\n /** Marks drawn on the plot. Default \"line\". */\n variant?: \"line\" | \"bar\" | \"area\";\n /** Plot height in pixels. Default 160. */\n height?: number;\n /** Curve the line (Catmull-Rom). Default false. */\n smooth?: boolean;\n /** Target y-axis ticks; nice numbers win. Default 4. */\n ticks?: number;\n /** Formats axis and tooltip values. Trims decimals by default. */\n format?: (value: number) => string;\n /** Show the legend. Defaults to shown for more than one series. */\n legend?: boolean;\n /** Accessible summary for the plot. */\n label?: string;\n};\n\n/** Fallback palette for series without an explicit tone, by series index. */\nconst PALETTE = [\"accent\", \"success\", \"muted\", \"danger\"] as const;\n\nconst TONE_VAR: Record<NonNullable<ChartSeries[\"tone\"]>, string> = {\n accent: \"var(--sph-accent)\",\n success: \"var(--sph-success)\",\n danger: \"var(--sph-danger)\",\n muted: \"var(--sph-text-muted)\",\n};\n\nconst defaultFormat = (value: number) =>\n Number.isInteger(value) ? String(value) : String(Math.round(value * 10) / 10);\n\nexport function Chart({\n categories,\n series,\n variant = \"line\",\n height = 160,\n smooth = false,\n ticks = 4,\n format = defaultFormat,\n legend,\n label,\n className,\n ...props\n}: ChartProps) {\n const gradientId = useId();\n const anchorName = `--sph-chart-anchor-${gradientId.replace(/\\W/g, \"\")}`;\n const [hidden, setHidden] = useState<ReadonlySet<number>>(new Set());\n const [hover, setHover] = useState<number | null>(null);\n\n const count = Math.max(1, categories.length);\n const bandPct = 100 / count;\n const xPct = (index: number) => (index + 0.5) * bandPct;\n const baselineZero = variant !== \"line\";\n const showLegend = legend ?? series.length > 1;\n\n const resolved = series.map((entry, index) => ({\n ...entry,\n index,\n tone: entry.tone ?? PALETTE[index % PALETTE.length],\n }));\n const shown = resolved.filter((_, index) => !hidden.has(index));\n\n const values = shown.flatMap((entry) =>\n entry.values.filter((value): value is number => value != null),\n );\n const dataMax = values.length > 0 ? Math.max(...values) : 0;\n const dataMin = baselineZero\n ? 0\n : values.length > 0\n ? Math.min(...values)\n : 0;\n\n const tickList = niceTicks(dataMin, dataMax, ticks);\n const lastTick = tickList[tickList.length - 1] ?? dataMax;\n const firstTick = tickList[0] ?? dataMin;\n const domainMin = Math.min(dataMin, firstTick);\n let domainMax = Math.max(dataMax, lastTick);\n if (domainMax <= domainMin) domainMax = domainMin + 1;\n const scale = linearScale(domainMin, domainMax, 0, 100);\n const topPct = (value: number) => 100 - scale(value);\n\n const pointsFor = (entry: (typeof resolved)[number]): [number, number][][] =>\n runs(entry.values).map((segment) =>\n segment.values.map((value, offset) => [\n xPct(segment.start + offset),\n topPct(value),\n ]),\n );\n\n const toggle = (index: number) => {\n setHidden((current) => {\n const next = new Set(current);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n };\n\n const summary =\n label ??\n `${variant.charAt(0).toUpperCase()}${variant.slice(1)} chart: ` +\n (series.length > 0\n ? `${series.map((entry) => entry.name).join(\", \")} across ${categories.length} categories.`\n : \"no series.\");\n\n const anchor =\n hover === null\n ? undefined\n : (shown.find((entry) => entry.values[hover] != null) ?? shown[0]);\n const anchorValue = hover !== null && anchor ? anchor.values[hover] : null;\n const anchorTop = anchorValue != null ? topPct(anchorValue) : 50;\n const pointerX = hover === null ? 50 : xPct(hover);\n\n const longestTick = Math.max(\n 3,\n ...tickList.map((tick) => format(tick).length),\n );\n\n return (\n <figure\n {...node(props)}\n className={cn(\"sph-chart\", className)}\n data-variant={variant}\n >\n {showLegend && (\n <figcaption className=\"sph-chart__legend\" aria-label=\"Series\">\n {series.map((entry, index) => {\n const isHidden = hidden.has(index);\n return (\n <button\n key={`legend-${entry.name}-${index}`}\n type=\"button\"\n className=\"sph-chart__legend-item\"\n aria-pressed={!isHidden}\n data-hidden={isHidden || undefined}\n onClick={() => toggle(index)}\n >\n <span\n className=\"sph-chart__legend-dot\"\n style={{ background: TONE_VAR[resolved[index].tone] }}\n aria-hidden=\"true\"\n />\n {entry.name}\n </button>\n );\n })}\n </figcaption>\n )}\n <div\n className=\"sph-chart__plot\"\n role=\"img\"\n aria-label={summary}\n style={{ gridTemplateRows: `${height}px auto` }}\n >\n <div\n className=\"sph-chart__yaxis\"\n style={{ width: `calc(${longestTick}ch + 8px)`, fontSize: \"10px\" }}\n >\n {tickList.map((tick) => (\n <span key={`y-${tick}`} style={{ bottom: `${scale(tick)}%` }}>\n {format(tick)}\n </span>\n ))}\n </div>\n <div\n className=\"sph-chart__area\"\n style={\n {\n \"--sph-chart-anchor\": anchorName,\n \"--sph-chart-x\": `${pointerX}%`,\n \"--sph-chart-y\": `${anchorTop}%`,\n } as CSSProperties & Record<string, string>\n }\n onPointerMove={(event) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const ratio =\n rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0;\n setHover(\n Math.min(count - 1, Math.max(0, Math.floor(ratio * count))),\n );\n }}\n onPointerLeave={() => setHover(null)}\n >\n <div className=\"sph-chart__grid\" aria-hidden=\"true\">\n {tickList.map((tick) => (\n <i key={`g-${tick}`} style={{ bottom: `${scale(tick)}%` }} />\n ))}\n </div>\n\n {variant === \"bar\" ? (\n <div className=\"sph-chart__bands\">\n {categories.map((_, band) => (\n <div\n key={`band-${band}`}\n className=\"sph-chart__band\"\n style={{ width: `${bandPct}%` }}\n >\n {shown.map((entry, position) => {\n const value = entry.values[band];\n if (value == null) return null;\n const rect = barRect(0, position, 1, shown.length);\n return (\n <div\n key={`bar-${entry.name}-${entry.tone}`}\n className=\"sph-chart__bar\"\n style={{\n left: `${rect.left}%`,\n width: `${rect.width}%`,\n height: `${scale(value)}%`,\n background: TONE_VAR[entry.tone],\n }}\n />\n );\n })}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"sph-chart__series-layer\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n {variant === \"area\" && (\n <defs>\n {shown.map((entry) => (\n <linearGradient\n key={`grad-${entry.index}`}\n id={`${gradientId}-s${entry.index}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop\n offset=\"0%\"\n style={{\n stopColor: TONE_VAR[entry.tone],\n stopOpacity: 0.32,\n }}\n />\n <stop\n offset=\"100%\"\n style={{\n stopColor: TONE_VAR[entry.tone],\n stopOpacity: 0,\n }}\n />\n </linearGradient>\n ))}\n </defs>\n )}\n {variant === \"area\" &&\n shown.map((entry) =>\n pointsFor(entry).map((points, segmentIndex) => (\n <path\n key={`fill-${entry.index}-${segmentIndex}`}\n d={areaPath(points, 100, smooth)}\n fill={`url(#${gradientId}-s${entry.index})`}\n />\n )),\n )}\n {shown.map((entry) =>\n pointsFor(entry).map((points, segmentIndex) => (\n <path\n key={`line-${entry.index}-${segmentIndex}`}\n className=\"sph-chart__line\"\n d={linePath(points, smooth)}\n fill=\"none\"\n stroke={TONE_VAR[entry.tone]}\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n )),\n )}\n </svg>\n </div>\n )}\n\n <span className=\"sph-chart__anchor\" aria-hidden=\"true\" />\n\n {hover !== null && (\n <>\n {variant === \"bar\" ? (\n <div\n key={`tint-${hover}`}\n className=\"sph-chart__band-tint\"\n style={{\n left: `${hover * bandPct}%`,\n width: `${bandPct}%`,\n }}\n aria-hidden=\"true\"\n />\n ) : (\n <div\n key={`guide-${hover}`}\n className=\"sph-chart__guide\"\n style={{ left: `${xPct(hover)}%` }}\n aria-hidden=\"true\"\n />\n )}\n {variant !== \"bar\" &&\n shown.map((entry) => {\n const value = entry.values[hover];\n if (value == null) return null;\n return (\n <span\n key={`dot-${hover}-${entry.name}-${entry.tone}`}\n className=\"sph-chart__dot\"\n style={{\n left: `${xPct(hover)}%`,\n top: `${topPct(value)}%`,\n background: TONE_VAR[entry.tone],\n }}\n aria-hidden=\"true\"\n />\n );\n })}\n {anchor !== undefined && (\n <div key={`tip-${hover}`} className=\"sph-chart__tooltip\">\n <div className=\"sph-chart__tooltip-card\">\n <span className=\"sph-chart__tooltip-label\">\n {categories[hover]}\n </span>\n {shown.map((entry) => {\n const value = entry.values[hover];\n return (\n <span\n key={`tip-row-${entry.name}-${entry.tone}`}\n className=\"sph-chart__tooltip-row\"\n >\n <i\n style={{ background: TONE_VAR[entry.tone] }}\n aria-hidden=\"true\"\n />\n <span>{entry.name}</span>\n <b>{value == null ? \"–\" : format(value)}</b>\n </span>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n <div className=\"sph-chart__xaxis\">\n {categories.map((category, index) => (\n <span\n key={`x-${category}-${index}`}\n style={{ flex: `0 0 ${bandPct}%` }}\n >\n {category}\n </span>\n ))}\n </div>\n </div>\n </figure>\n );\n}\n","import { CaretRightIcon, MagnifyingGlassIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Kbd } from \"@/atoms/Kbd\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { filterItemsWith } from \"@/lib/filter.js\";\nimport { useFocusTrap } from \"@/lib/focus.js\";\nimport { Highlight } from \"@/lib/highlight.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n inheritScope,\n useIsoLayoutEffect,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { motionDurationMs, usePresence } from \"@/lib/presence.js\";\n\nexport type CommandItem = {\n id?: string;\n label: Renderable;\n value?: string;\n icon?: Renderable;\n group?: string;\n hint?: Renderable;\n badge?: Renderable;\n shortcut?: string[];\n keywords?: string;\n disabled?: boolean;\n children?: CommandItem[];\n};\n\nexport type CommandPaletteProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: CommandItem[];\n onSelect?: (item: CommandItem) => void;\n placeholder?: string;\n emptyMessage?: Renderable;\n homeLabel?: string;\n ariaLabel?: string;\n hotkey?: boolean;\n className?: string;\n filter?: (item: CommandItem, query: string) => boolean;\n};\n\ntype FlatOption = {\n item: CommandItem;\n indexes: number[];\n activeId: string;\n index: number;\n};\n\ntype Section = {\n heading: string | undefined;\n entries: FlatOption[];\n};\n\nfunction replay(element: HTMLElement | null, className: string) {\n if (!element) return;\n element.classList.remove(className);\n void element.offsetWidth;\n element.classList.add(className);\n}\n\nfunction readableLabel(item: CommandItem): string {\n return typeof item.label === \"string\" ? item.label : \"\";\n}\n\nfunction crumbLabel(item: CommandItem, fallback: string): string {\n const label = readableLabel(item);\n if (label) return label;\n if (typeof item.value === \"string\" && item.value) return item.value;\n return fallback;\n}\n\nfunction resolveActive(options: FlatOption[], wanted: number): number {\n if (options.length === 0) return -1;\n const start = Math.min(Math.max(wanted, 0), options.length - 1);\n const enabled = (index: number) => !options[index]?.item.disabled;\n if (enabled(start)) return start;\n for (let index = start + 1; index < options.length; index += 1)\n if (enabled(index)) return index;\n for (let index = 0; index < start; index += 1)\n if (enabled(index)) return index;\n return start;\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n items,\n onSelect,\n placeholder = \"Type a command or search…\",\n emptyMessage = \"No results.\",\n homeLabel = \"Home\",\n ariaLabel = \"Command palette\",\n hotkey = false,\n className,\n filter,\n}: CommandPaletteProps) {\n const listId = useId();\n const rootRef = useRef<HTMLElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const indicatorRef = useRef<HTMLSpanElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const previousPathLength = useRef<number | null>(null);\n const heightCleanup = useRef<(() => void) | null>(null);\n const [path, setPath] = useState<CommandItem[]>([]);\n const [query, setQuery] = useState(\"\");\n const [activeState, setActive] = useState(0);\n const {\n present,\n state,\n ref: backdropRef,\n } = usePresence<HTMLDivElement>(open, \"normal\");\n const portaled = usePortaled();\n const visible = present && portaled;\n\n useFocusTrap(rootRef, visible, inputRef);\n\n const levelItems =\n path.length > 0 ? (path[path.length - 1]?.children ?? []) : items;\n const hasNestedLevels = items.some(\n (item) => (item.children?.length ?? 0) > 0,\n );\n\n const { sections, options } = useMemo(() => {\n const read = (item: CommandItem) => ({\n label: readableLabel(item),\n keywords: [\n item.keywords ?? \"\",\n ...(item.children ?? []).map((child) => readableLabel(child)),\n ]\n .filter(Boolean)\n .join(\" \"),\n });\n const filtered = filterItemsWith(levelItems, query, read, filter);\n const ungrouped = filtered.filter(\n (entry) => entry.item.group === undefined,\n );\n const groupNames = [\n ...new Set(\n filtered\n .map((entry) => entry.item.group)\n .filter((name): name is string => name !== undefined),\n ),\n ];\n const grouped = groupNames.map((name) => ({\n heading: name,\n entries: filtered.filter((entry) => entry.item.group === name),\n }));\n const raw = [\n ...(ungrouped.length > 0\n ? [{ heading: undefined, entries: ungrouped }]\n : []),\n ...grouped,\n ];\n let order = 0;\n const built: Section[] = raw.map((section) => ({\n heading: section.heading,\n entries: section.entries.map((entry) => ({\n item: entry.item,\n indexes: entry.indexes,\n activeId: `${listId}-option-${order}`,\n index: order++,\n })),\n }));\n return { sections: built, options: built.flatMap((s) => s.entries) };\n }, [filter, levelItems, listId, query]);\n\n const active = resolveActive(options, activeState);\n\n const close = () => onOpenChange(false);\n\n const activate = (index: number) => {\n const item = options[index]?.item;\n if (!item || item.disabled) return;\n if (item.children && item.children.length > 0) {\n setPath([...path, item]);\n setQuery(\"\");\n return;\n }\n onSelect?.(item);\n close();\n };\n\n const move = (direction: 1 | -1) => {\n if (options.length === 0) return;\n let index = active < 0 ? 0 : active;\n for (let step = 0; step < options.length; step += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.item.disabled) {\n setActive(index);\n return;\n }\n }\n };\n\n const goToLevel = (length: number) => {\n setPath(path.slice(0, length));\n setQuery(\"\");\n };\n\n const handleInputKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n move(1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n move(-1);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setActive(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setActive(options.length - 1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n if (active >= 0) activate(active);\n }\n };\n\n useEffect(() => {\n if (!open) {\n setPath([]);\n setQuery(\"\");\n setActive(0);\n }\n }, [open]);\n\n useEffect(() => {\n inputRef.current?.setAttribute(\"spellcheck\", \"false\");\n }, [visible]);\n\n useEffect(() => {\n setActive(0);\n }, [path, query]);\n\n useEffect(() => {\n if (!hotkey) return;\n const handleHotkey = (event: globalThis.KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n event.preventDefault();\n onOpenChange(!open);\n }\n };\n document.addEventListener(\"keydown\", handleHotkey);\n return () => document.removeEventListener(\"keydown\", handleHotkey);\n }, [hotkey, onOpenChange, open]);\n\n useEffect(() => {\n if (!visible) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n if (query) setQuery(\"\");\n else if (path.length > 0) setPath(path.slice(0, -1));\n else close();\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (!rootRef.current?.contains(target)) close();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [onOpenChange, path, query, visible]);\n\n useEffect(() => {\n if (!visible || active < 0) return;\n const option = trackRef.current?.querySelector<HTMLElement>(\n '[data-active=\"true\"]',\n );\n option?.scrollIntoView({ block: \"nearest\" });\n }, [active, visible]);\n\n useIsoLayoutEffect(() => {\n const indicator = indicatorRef.current;\n const track = trackRef.current;\n if (!visible || !indicator || !track || active < 0) return;\n const option = track.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n if (!option) return;\n const trackRect = track.getBoundingClientRect();\n const optionRect = option.getBoundingClientRect();\n const first = !indicator.style.width;\n if (first) indicator.style.transition = \"none\";\n indicator.style.opacity = \"1\";\n indicator.style.width = `${optionRect.width}px`;\n indicator.style.height = `${optionRect.height}px`;\n indicator.style.transform = `translate(${optionRect.left - trackRect.left}px, ${optionRect.top - trackRect.top}px)`;\n if (first)\n requestAnimationFrame(() => {\n indicator.style.transition = \"\";\n });\n }, [active, options, present, portaled]);\n\n useIsoLayoutEffect(() => {\n inheritScope(document.activeElement, backdropRef.current);\n const body = bodyRef.current;\n const inner = innerRef.current;\n if (!visible || !body || !inner) return;\n heightCleanup.current?.();\n heightCleanup.current = null;\n\n const duration = motionDurationMs(body, \"normal\");\n if (duration <= 0) {\n body.style.height = \"\";\n return;\n }\n\n const current = body.style.height\n ? Number.parseFloat(body.style.height)\n : body.getBoundingClientRect().height;\n if (!body.style.height) {\n body.style.height = `${current}px`;\n return;\n }\n const target = inner.getBoundingClientRect().height;\n if (Math.abs(current - target) < 1) {\n body.style.height = `${target}px`;\n return;\n }\n\n body.style.transition = \"none\";\n body.style.height = `${current}px`;\n void body.offsetHeight;\n body.style.transition = `height ${duration}ms var(--sph-ease-emphasis)`;\n body.style.height = `${target}px`;\n const settle = () => {\n body.style.transition = \"\";\n heightCleanup.current = null;\n };\n body.addEventListener(\"transitionend\", settle, { once: true });\n heightCleanup.current = () =>\n body.removeEventListener(\"transitionend\", settle);\n }, [path, present, portaled, query, visible]);\n\n useIsoLayoutEffect(() => {\n if (!visible) {\n previousPathLength.current = null;\n return;\n }\n const previous = previousPathLength.current;\n previousPathLength.current = path.length;\n if (previous === null || previous === path.length) return;\n replay(panelRef.current, \"sph-level-pulse\");\n replay(trackRef.current, \"sph-level-fade\");\n }, [path, visible]);\n\n if (!visible) return null;\n\n return createPortal(\n <div\n ref={backdropRef}\n className=\"sph-palette__backdrop\"\n data-state={state}\n role=\"presentation\"\n >\n <section\n ref={rootRef}\n className={cn(\"sph-palette\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n >\n <div ref={panelRef} className=\"sph-palette__panel\">\n {hasNestedLevels && (\n <nav className=\"sph-palette__crumbs\" aria-label=\"Breadcrumb\">\n {\" \"}\n <button\n type=\"button\"\n className=\"sph-palette__crumb sph-motion-in sph-motion-in--blur\"\n data-current={path.length === 0 || undefined}\n onClick={() => goToLevel(0)}\n >\n {homeLabel}\n </button>\n {path.flatMap((entry, index) => [\n <span\n key={`sep-${index}`}\n className=\"sph-palette__crumb-sep\"\n aria-hidden=\"true\"\n >\n <CaretRightIcon size={11} weight=\"bold\" />\n </span>,\n <button\n key={`crumb-${index}`}\n type=\"button\"\n className=\"sph-palette__crumb sph-motion-in sph-motion-in--blur\"\n data-current={index === path.length - 1 || undefined}\n onClick={() => goToLevel(index + 1)}\n >\n {crumbLabel(entry, homeLabel)}\n </button>,\n ])}\n </nav>\n )}\n\n <div className=\"sph-palette__search\">\n <MagnifyingGlassIcon\n className=\"sph-palette__search-icon\"\n size={15}\n aria-hidden=\"true\"\n />\n <input\n ref={inputRef}\n className=\"sph-palette__input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded\n aria-controls={listId}\n aria-activedescendant={\n active >= 0 ? options[active]?.activeId : undefined\n }\n aria-autocomplete=\"list\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={query}\n autoComplete=\"off\"\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={handleInputKeyDown}\n />\n <button\n type=\"button\"\n className=\"sph-kbd sph-palette__escape\"\n aria-label=\"Close command palette\"\n onClick={close}\n >\n <span className=\"sph-kbd__key\">Esc</span>\n </button>\n </div>\n\n <div className=\"sph-palette__body\" ref={bodyRef}>\n <div\n className=\"sph-palette__list\"\n ref={innerRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel}\n >\n <div className=\"sph-palette__track\" ref={trackRef}>\n <span\n className=\"sph-palette__indicator\"\n ref={indicatorRef}\n role=\"presentation\"\n />\n {options.length === 0 && (\n <div className=\"sph-palette__empty\" role=\"status\">\n {node(emptyMessage)}\n </div>\n )}\n {sections.map((section) => (\n <div\n key={section.heading ?? \"section-root\"}\n className=\"sph-palette__group\"\n role=\"group\"\n aria-labelledby={\n section.heading !== undefined\n ? `${listId}-group-${section.heading}`\n : undefined\n }\n >\n {section.heading !== undefined && (\n <div\n className=\"sph-palette__heading\"\n id={`${listId}-group-${section.heading}`}\n >\n {section.heading}\n </div>\n )}\n {section.entries.map((option) => {\n const item = option.item;\n const index = option.index;\n return (\n <div\n key={item.id ?? `${readableLabel(item)}-${index}`}\n id={option.activeId}\n className=\"sph-palette__option\"\n role=\"option\"\n data-index={index}\n data-active={index === active ? \"true\" : undefined}\n data-disabled={item.disabled || undefined}\n aria-selected={index === active}\n aria-disabled={item.disabled || undefined}\n onPointerEnter={() => {\n if (!item.disabled) setActive(index);\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => activate(index)}\n >\n {item.icon !== undefined && (\n <span\n className=\"sph-palette__icon\"\n aria-hidden=\"true\"\n >\n {node(item.icon)}\n </span>\n )}\n <span className=\"sph-palette__label\">\n {typeof item.label === \"string\" ? (\n <Highlight\n text={item.label}\n indexes={option.indexes}\n />\n ) : (\n node(item.label)\n )}\n </span>\n {item.badge !== undefined && (\n <span className=\"sph-palette__badge\">\n {node(item.badge)}\n </span>\n )}\n {item.children && item.children.length > 0 ? (\n <span\n className=\"sph-palette__more\"\n aria-hidden=\"true\"\n >\n <CaretRightIcon size={13} weight=\"bold\" />\n </span>\n ) : item.hint !== undefined ? (\n <span className=\"sph-palette__hint\">\n {node(item.hint)}\n </span>\n ) : (\n item.shortcut !== undefined && (\n <Kbd keys={item.shortcut} />\n )\n )}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n <footer className=\"sph-palette__footer\" aria-hidden=\"true\">\n <span className=\"sph-palette__hintrow\">\n <Kbd keys=\"↑\" />\n <Kbd keys=\"↓\" />\n navigate\n </span>\n <span className=\"sph-palette__hintrow\">\n <Kbd keys=\"↵\" />\n select\n </span>\n <span className=\"sph-palette__hintrow\">\n <Kbd keys=\"esc\" />\n {path.length > 0 || query ? \"back\" : \"close\"}\n </span>\n </footer>\n </div>\n </section>\n </div>,\n document.body,\n );\n}\n","import { TrayIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type EmptyStateProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title: Renderable;\n description?: Renderable;\n icon?: Renderable;\n action?: Renderable;\n compact?: boolean;\n};\n\nconst emptyStateDefaultIcon = <TrayIcon size={20} />;\n\nexport function EmptyState({\n title,\n description,\n icon = emptyStateDefaultIcon,\n action,\n compact = false,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <section\n {...node(props)}\n className={cn(\"sph-empty-state\", className)}\n data-compact={compact || undefined}\n >\n <div className=\"sph-empty-state__icon\" aria-hidden=\"true\">\n {node(icon)}\n </div>\n <h2 className=\"sph-empty-state__title\">{node(title)}</h2>\n {description !== undefined && (\n <p className=\"sph-empty-state__description\">{node(description)}</p>\n )}\n {action !== undefined && (\n <div className=\"sph-empty-state__action\">{node(action)}</div>\n )}\n </section>\n );\n}\n","import { cn } from \"cn\";\nimport type { DragEvent, MouseEvent } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type DropzoneRejectReason = \"type\" | \"size\" | \"count\";\n\nexport type DropzoneFileLike = { name: string; type: string; size: number };\n\nexport type DropzoneValidation = {\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n};\n\nexport type DropzoneValidationResult<T extends DropzoneFileLike> = {\n accepted: T[];\n rejected: { reason: DropzoneRejectReason; files: T[] }[];\n};\n\nexport type MagneticDropzoneProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onDrop\" | \"onDragOver\" | \"children\"\n> & {\n /** Idle content: an icon, instructions, a choose-file button. */\n children?: Renderable;\n /** Replaces `children` while files hover over the zone. */\n activeContent?: Renderable;\n onFiles?: (files: File[]) => void;\n onReject?: (files: File[], reason: DropzoneRejectReason) => void;\n /** Forwarded to the hidden file input, e.g. \"image/*,.pdf\". */\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n label?: string;\n trigger?: \"zone\" | \"children\";\n className?: string;\n};\n\ntype ZoneKeyEvent = {\n key: string;\n repeat: boolean;\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n preventDefault(): void;\n};\n\ntype ZonePasteEvent = {\n clipboardData: DataTransfer | null;\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nconst FOCUSABLE =\n \"a[href], button, input, select, textarea, [contenteditable], [tabindex]:not([tabindex='-1'])\";\n\nfunction matchesAccept(file: DropzoneFileLike, accept: string): boolean {\n const tokens = accept\n .split(\",\")\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith(\".\")) return name.endsWith(token);\n if (token.endsWith(\"/*\")) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n}\n\nexport function validateDropzoneFiles<T extends DropzoneFileLike>(\n files: readonly T[],\n { accept, multiple = true, maxFiles, maxSize }: DropzoneValidation = {},\n): DropzoneValidationResult<T> {\n const byType: T[] = [];\n const bySize: T[] = [];\n const valid: T[] = [];\n for (const file of files) {\n if (accept && !matchesAccept(file, accept)) byType.push(file);\n else if (maxSize !== undefined && file.size > maxSize) bySize.push(file);\n else valid.push(file);\n }\n const limit = multiple ? (maxFiles ?? Number.POSITIVE_INFINITY) : 1;\n const accepted = valid.slice(0, Math.max(0, limit));\n const byCount = valid.slice(accepted.length);\n const rejected: DropzoneValidationResult<T>[\"rejected\"] = [];\n if (byType.length > 0) rejected.push({ reason: \"type\", files: byType });\n if (bySize.length > 0) rejected.push({ reason: \"size\", files: bySize });\n if (byCount.length > 0) rejected.push({ reason: \"count\", files: byCount });\n return { accepted, rejected };\n}\n\nconst plural = (count: number) => (count === 1 ? \"1 file\" : `${count} files`);\n\nconst reasonText: Record<DropzoneRejectReason, string> = {\n type: \"type not accepted\",\n size: \"too large\",\n count: \"too many files\",\n};\n\nexport function describeDropzoneResult(\n result: DropzoneValidationResult<DropzoneFileLike>,\n): string {\n const parts: string[] = [];\n if (result.accepted.length > 0) {\n parts.push(`${plural(result.accepted.length)} added.`);\n }\n for (const { reason, files } of result.rejected) {\n parts.push(`${plural(files.length)} rejected: ${reasonText[reason]}.`);\n }\n return parts.join(\" \");\n}\n\n/**\n * A drop zone whose content leans toward the pointer while files hover —\n * the pull is a CSS variable updated on dragover, so the attraction stays\n * cheap and collapses with the motion tokens.\n */\nexport function MagneticDropzone({\n children,\n activeContent,\n onFiles,\n onReject,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n disabled = false,\n label = \"Choose files\",\n trigger,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n onPaste,\n ...props\n}: MagneticDropzoneProps) {\n const zoneRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const contentRef = useRef<HTMLSpanElement>(null);\n const contentId = useId();\n const [dragging, setDragging] = useState(false);\n const [nested, setNested] = useState(false);\n const [status, setStatus] = useState({ text: \"\", count: 0 });\n\n useEffect(() => {\n const found = Boolean(contentRef.current?.querySelector(FOCUSABLE));\n if (found !== nested) setNested(found);\n });\n\n const mode = trigger ?? (nested ? \"children\" : \"zone\");\n const zone = mode === \"zone\";\n\n const pull = (event: { clientX: number; clientY: number }) => {\n const element = zoneRef.current;\n if (!element) return;\n const rect = element.getBoundingClientRect();\n const x = ((event.clientX - rect.left) / rect.width - 0.5) * 2;\n const y = ((event.clientY - rect.top) / rect.height - 0.5) * 2;\n element.style.setProperty(\"--sph-pull-x\", `${(x * 10).toFixed(1)}px`);\n element.style.setProperty(\"--sph-pull-y\", `${(y * 8).toFixed(1)}px`);\n };\n\n const reset = () => {\n const element = zoneRef.current;\n if (!element) return;\n element.style.setProperty(\"--sph-pull-x\", \"0px\");\n element.style.setProperty(\"--sph-pull-y\", \"0px\");\n };\n\n const receive = (files: File[]) => {\n if (files.length === 0) return;\n const result = validateDropzoneFiles(files, {\n accept,\n multiple,\n maxFiles,\n maxSize,\n });\n if (result.accepted.length > 0) onFiles?.(result.accepted);\n for (const { reason, files: rejected } of result.rejected) {\n onReject?.(rejected, reason);\n }\n const text = describeDropzoneResult(result);\n setStatus((previous) => ({ text, count: previous.count + 1 }));\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) {\n if (event.dataTransfer) event.dataTransfer.dropEffect = \"none\";\n return;\n }\n if (!dragging) setDragging(true);\n pull(event);\n };\n\n const handleDragLeave = (event: DragEvent<HTMLDivElement>) => {\n const next = event.relatedTarget as Node | null;\n if (next && zoneRef.current?.contains(next)) return;\n setDragging(false);\n reset();\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) return;\n setDragging(false);\n reset();\n receive(Array.from(event.dataTransfer?.files ?? []));\n };\n\n const handlePaste = (event: ZonePasteEvent) => {\n onPaste?.(node(event));\n if (disabled || event.defaultPrevented) return;\n const files = Array.from(event.clipboardData?.files ?? []);\n if (files.length === 0) return;\n event.preventDefault();\n receive(files);\n };\n\n const openPicker = () => {\n if (!disabled) inputRef.current?.click();\n };\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === inputRef.current) return;\n openPicker();\n };\n\n const handleKeyDown = (event: ZoneKeyEvent) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \" \") event.preventDefault();\n if (event.key === \"Enter\" && !event.repeat) {\n event.preventDefault();\n openPicker();\n }\n };\n\n const handleKeyUp = (event: ZoneKeyEvent) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \" \") {\n event.preventDefault();\n openPicker();\n }\n };\n\n const describedBy = [contentId, ariaDescribedBy].filter(Boolean).join(\" \");\n\n return (\n <div\n {...node(props)}\n ref={zoneRef}\n className={cn(\"sph-dropzone\", className)}\n data-active={dragging || undefined}\n data-disabled={disabled || undefined}\n data-trigger={mode}\n aria-label={zone ? undefined : ariaLabel}\n aria-describedby={zone ? undefined : ariaDescribedBy}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onPaste={handlePaste}\n onClick={handleClick}\n >\n <div\n className=\"sph-dropzone__content\"\n role={zone ? \"button\" : undefined}\n tabIndex={zone ? 0 : undefined}\n aria-label={zone ? (ariaLabel ?? label) : undefined}\n aria-describedby={zone ? describedBy : undefined}\n aria-disabled={zone && disabled ? true : undefined}\n onKeyDown={zone ? handleKeyDown : undefined}\n onKeyUp={zone ? handleKeyUp : undefined}\n >\n <span\n ref={contentRef}\n id={contentId}\n className=\"sph-dropzone__description\"\n >\n {node(\n dragging && activeContent !== undefined ? activeContent : children,\n )}\n </span>\n </div>\n <input\n ref={inputRef}\n className=\"sph-dropzone__input\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n aria-label={ariaLabel ?? label}\n tabIndex={-1}\n disabled={disabled}\n onChange={(event) => {\n receive(Array.from(event.currentTarget.files ?? []));\n event.currentTarget.value = \"\";\n }}\n />\n <span className=\"sph-dropzone__status\" role=\"status\">\n {status.text}\n {status.text && status.count % 2 === 1 ? \" \" : \"\"}\n </span>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { Menu, type MenuItem } from \"@/molecules/Menu\";\n\nexport type MenubarMenu = {\n /** Accessible name for the menu and its trigger. */\n label: string;\n /** Rich trigger content; falls back to the label. */\n trigger?: Renderable;\n items: MenuItem[];\n disabled?: boolean;\n};\n\nexport type MenubarProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"onSelect\"\n> & {\n menus: MenubarMenu[];\n onSelect?: (value: string) => void;\n /** Accessible name for the bar itself. */\n label?: string;\n};\n\n/** How long a pointer must rest on a closed bar before its menu opens. */\nconst HOVER_INTENT_MS = 160;\n\n/**\n * The classic application menu bar. Menus run controlled off a single\n * `openIndex`: hovering a closed bar opens after a short intent delay, an\n * already-open bar slides straight across, and the arrow keys walk the\n * triggers with wrap-around.\n */\nexport function Menubar({\n menus,\n onSelect,\n label = \"Main\",\n className,\n ...props\n}: MenubarProps) {\n const barRef = useRef<HTMLDivElement>(null);\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearHover = () => {\n if (hoverTimer.current !== null) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n };\n\n useEffect(() => clearHover, []);\n\n const listTriggers = () =>\n Array.from(\n barRef.current?.querySelectorAll<HTMLButtonElement>(\n \".sph-menu__trigger\",\n ) ?? [],\n );\n\n const handleBarKeyDown = (event: KeyboardActionEvent) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(event.key)) return;\n const list = listTriggers();\n const pos = list.indexOf(document.activeElement as HTMLButtonElement);\n if (pos === -1) return;\n event.preventDefault();\n const last = list.length - 1;\n const nextPos =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? last\n : event.key === \"ArrowRight\"\n ? (pos + 1) % list.length\n : (pos - 1 + list.length) % list.length;\n list[nextPos]?.focus();\n\n if (openIndex !== null) setOpenIndex(nextPos);\n };\n\n const handleTriggerEnter = (index: number) => {\n if (menus[index]?.disabled) return;\n if (openIndex === index) return;\n clearHover();\n if (openIndex !== null) {\n setOpenIndex(index);\n return;\n }\n hoverTimer.current = setTimeout(() => setOpenIndex(index), HOVER_INTENT_MS);\n };\n\n const handleTriggerLeave = () => {\n if (openIndex === null) clearHover();\n };\n\n return (\n <div\n {...node(props)}\n ref={barRef}\n role=\"menubar\"\n aria-label={label}\n className={cn(\"sph-menubar\", className)}\n onKeyDown={handleBarKeyDown}\n onPointerLeave={handleTriggerLeave}\n >\n {menus.map((menu, index) => (\n <div\n key={`menubar-menu-${index}`}\n className=\"sph-menubar__slot-wrap\"\n onPointerEnter={() => handleTriggerEnter(index)}\n onPointerLeave={handleTriggerLeave}\n >\n <Menu\n className=\"sph-menubar__slot\"\n trigger={menu.trigger ?? menu.label}\n label={menu.label}\n items={menu.items}\n disabled={menu.disabled}\n align={index === menus.length - 1 ? \"end\" : \"start\"}\n open={openIndex === index}\n onOpenChange={(next) => setOpenIndex(next ? index : null)}\n onSelect={onSelect}\n />\n </div>\n ))}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { Collapsible } from \"@/molecules/Collapsible\";\n\nexport type ReasoningStep = {\n id?: string;\n title: Renderable;\n detail?: Renderable;\n status?: \"pending\" | \"active\" | \"done\";\n};\n\nexport type ReasoningStepsProps = {\n steps: ReasoningStep[];\n label?: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n};\n\nexport function ReasoningSteps({\n steps,\n label = \"Reasoning\",\n open,\n defaultOpen = true,\n onOpenChange,\n className,\n}: ReasoningStepsProps) {\n const activeCount = steps.filter((step) => step.status === \"active\").length;\n\n return (\n <div className={cn(\"sph-reasoning\", className)}>\n <Collapsible\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n trigger={\n <span className=\"sph-reasoning__trigger\">\n <span className=\"sph-reasoning__label\">{node(label)}</span>\n <span className=\"sph-reasoning__meta\">\n {activeCount > 0 && (\n <span className=\"sph-typing\" aria-hidden=\"true\">\n <i />\n <i />\n <i />\n </span>\n )}\n <span className=\"sph-reasoning__count\">\n {steps.length} {steps.length === 1 ? \"step\" : \"steps\"}\n </span>\n </span>\n </span>\n }\n >\n <ol className=\"sph-reasoning__list\">\n {steps.map((step, index) => (\n <li\n key={step.id ?? index}\n className=\"sph-reasoning__step\"\n data-status={step.status ?? \"done\"}\n style={\n { \"--sph-motion-index\": index } as CSSProperties &\n Record<string, string | number>\n }\n >\n <span className=\"sph-reasoning__marker\" aria-hidden=\"true\">\n <span className=\"sph-reasoning__dot\" />\n </span>\n <span className=\"sph-reasoning__body\">\n <span className=\"sph-reasoning__title\">{node(step.title)}</span>\n {step.detail !== undefined && (\n <span className=\"sph-reasoning__detail\">\n {node(step.detail)}\n </span>\n )}\n </span>\n <span className=\"sph-reasoning__status\">\n {step.status === \"active\"\n ? \"thinking\"\n : step.status === \"pending\"\n ? \"queued\"\n : \"done\"}\n </span>\n </li>\n ))}\n </ol>\n </Collapsible>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useMemo, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type ResizableProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n /** The panes, in visual order. A handle is rendered between each pair. */\n panes: Renderable[];\n direction?: \"horizontal\" | \"vertical\";\n /** Controlled pane sizes in percent; they should sum to 100. */\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n /** Smallest share a pane may keep, in percent. Default: 10. */\n min?: number;\n handleLabel?: string;\n};\n\n/**\n * Structural event shapes: React's and Preact's pointer/keyboard events do\n * not share types, but everything this component reads is common ground.\n */\ntype PointerLike = {\n clientX: number;\n clientY: number;\n pointerId: number;\n button: number;\n currentTarget: EventTarget & {\n setPointerCapture(id: number): void;\n releasePointerCapture(id: number): void;\n };\n preventDefault(): void;\n};\n\ntype KeyboardLike = KeyboardActionEvent & { shiftKey: boolean };\n\nfunction clamp(value: number, low: number, high: number): number {\n return Math.min(Math.max(value, low), high);\n}\n\nexport function Resizable({\n panes,\n direction = \"horizontal\",\n sizes,\n defaultSizes,\n onSizesChange,\n min = 10,\n handleLabel = \"Resize panels\",\n className,\n ...props\n}: ResizableProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [uncontrolled, setUncontrolled] = useState<number[]>(\n () => defaultSizes ?? [],\n );\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n const drag = useRef<{\n index: number;\n pointer: { x: number; y: number };\n sizes: number[];\n extent: number;\n } | null>(null);\n\n const even = useMemo(\n () => panes.map(() => 100 / Math.max(panes.length, 1)),\n [panes.length],\n );\n const candidate = sizes ?? uncontrolled;\n const active =\n candidate.length === panes.length && panes.length > 0 ? candidate : even;\n\n const commit = (next: number[]) => {\n setUncontrolled(next);\n onSizesChange?.(next);\n };\n\n const startDrag = (event: PointerLike, index: number) => {\n if (event.button !== 0) return;\n const rect = rootRef.current?.getBoundingClientRect();\n if (!rect) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n drag.current = {\n index,\n pointer: { x: event.clientX, y: event.clientY },\n sizes: [...active],\n extent: direction === \"horizontal\" ? rect.width : rect.height,\n };\n setDragIndex(index);\n };\n\n const moveDrag = (event: PointerLike) => {\n const state = drag.current;\n if (!state || state.extent <= 0) return;\n const position = direction === \"horizontal\" ? event.clientX : event.clientY;\n const origin =\n direction === \"horizontal\" ? state.pointer.x : state.pointer.y;\n const delta = ((position - origin) / state.extent) * 100;\n\n const next = [...state.sizes];\n const before = next[state.index] ?? 0;\n const after = next[state.index + 1] ?? 0;\n const span = before + after;\n const moved = clamp(before + delta, min, span - min);\n next[state.index] = moved;\n next[state.index + 1] = span - moved;\n commit(next);\n };\n\n const endDrag = (event: PointerLike) => {\n if (drag.current === null) return;\n drag.current = null;\n setDragIndex(null);\n if (event.pointerId !== undefined) {\n try {\n event.currentTarget.releasePointerCapture(event.pointerId);\n } catch {}\n }\n };\n\n const handleKeyDown = (event: KeyboardLike, index: number) => {\n const step =\n (event.shiftKey ? 10 : 2) *\n (direction === \"horizontal\"\n ? event.key === \"ArrowLeft\"\n ? -1\n : event.key === \"ArrowRight\"\n ? 1\n : 0\n : event.key === \"ArrowUp\"\n ? -1\n : event.key === \"ArrowDown\"\n ? 1\n : 0);\n if (step === 0) return;\n event.preventDefault();\n const next = [...active];\n const before = next[index] ?? 0;\n const after = next[index + 1] ?? 0;\n const span = before + after;\n const moved = clamp(before + step, min, span - min);\n next[index] = moved;\n next[index + 1] = span - moved;\n commit(next);\n };\n\n return (\n <div\n {...node(props)}\n ref={rootRef}\n className={cn(\"sph-resizable\", className)}\n data-direction={direction}\n >\n {panes.flatMap((pane, index) => {\n const items = [\n <div\n key={`pane-${index}`}\n className=\"sph-resizable__pane\"\n style={{\n flexGrow: active[index] ?? even[index] ?? 1,\n flexBasis: 0,\n minWidth: 0,\n minHeight: 0,\n }}\n >\n {node(pane)}\n </div>,\n ];\n if (index < panes.length - 1) {\n items.push(\n <div\n key={`handle-${index}`}\n role=\"separator\"\n tabIndex={0}\n aria-orientation={\n direction === \"horizontal\" ? \"vertical\" : \"horizontal\"\n }\n aria-valuenow={Math.round(active[index] ?? 0)}\n aria-label={handleLabel}\n className=\"sph-resizable__handle\"\n data-dragging={dragIndex === index || undefined}\n onPointerDown={(event) => startDrag(event, index)}\n onPointerMove={moveDrag}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={(event) => handleKeyDown(event, index)}\n />,\n );\n }\n return items;\n })}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SidePanelSide = \"left\" | \"right\";\n\nexport type SidePanelState = {\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n toggle: () => void;\n};\n\nexport type SidePanelProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n children?: Renderable | ((state: SidePanelState) => Renderable);\n side?: SidePanelSide;\n width?: number | string;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n peek?: boolean;\n};\n\nexport function SidePanel({\n children,\n side = \"left\",\n width = 280,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n peek = false,\n className,\n style,\n ...props\n}: SidePanelProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultCollapsed);\n const isCollapsed = collapsed ?? uncontrolled;\n\n const setCollapsed = (next: boolean) => {\n setUncontrolled(next);\n onCollapsedChange?.(next);\n };\n\n const state: SidePanelState = {\n collapsed: isCollapsed,\n setCollapsed,\n toggle: () => setCollapsed(!isCollapsed),\n };\n\n return (\n <aside\n {...node(props)}\n className={cn(\"sph-side-panel\", className)}\n style={{\n ...(style as CSSProperties),\n \"--sph-side-panel-width\":\n typeof width === \"number\" ? `${width}px` : width,\n }}\n data-side={side}\n data-collapsed={isCollapsed || undefined}\n data-peek={(isCollapsed && peek) || undefined}\n >\n <div className=\"sph-side-panel__inner\">\n {node(typeof children === \"function\" ? children(state) : children)}\n </div>\n </aside>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useId, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SidebarItem = {\n value: string;\n label: Renderable;\n icon?: Renderable;\n badge?: Renderable;\n disabled?: boolean;\n};\n\nexport type SidebarSection = {\n title?: string;\n items: SidebarItem[];\n};\n\nexport type SidebarSide = \"left\" | \"right\";\n\nexport type SidebarCollapsedMode = \"rail\" | \"hover\" | \"hidden\";\n\nexport type SidebarProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"onSelect\"\n> & {\n sections: SidebarSection[];\n value?: string;\n defaultValue?: string;\n onSelect?: (value: string) => void;\n header?: Renderable;\n footer?: Renderable;\n side?: SidebarSide;\n collapsible?: boolean;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n collapsedMode?: SidebarCollapsedMode;\n onCollapsedChange?: (collapsed: boolean) => void;\n ariaLabel?: string;\n};\n\nexport function Sidebar({\n sections,\n value,\n defaultValue,\n onSelect,\n header,\n footer,\n side = \"left\",\n collapsible = false,\n collapsed,\n collapsedMode = \"rail\",\n defaultCollapsed = collapsedMode !== \"rail\",\n onCollapsedChange,\n ariaLabel = \"Primary\",\n className,\n ...props\n}: SidebarProps) {\n const listId = useId();\n const [uncontrolled, setUncontrolled] = useState(defaultCollapsed);\n const isCollapsed = collapsed ?? uncontrolled;\n const active = value ?? defaultValue;\n\n const toggleCollapsed = () => {\n const next = !isCollapsed;\n setUncontrolled(next);\n onCollapsedChange?.(next);\n };\n\n const expandChevron = side === \"left\" ? \"»\" : \"«\";\n const collapseChevron = side === \"left\" ? \"«\" : \"»\";\n const showItemTitle = isCollapsed && collapsedMode !== \"hover\";\n\n return (\n <aside\n {...node(props)}\n className={cn(\"sph-sidebar\", className)}\n data-side={side}\n data-collapsed={isCollapsed || undefined}\n data-collapsed-mode={collapsedMode}\n data-rail={isCollapsed || undefined}\n >\n {header !== undefined && (\n <div className=\"sph-sidebar__header\">{node(header)}</div>\n )}\n <nav className=\"sph-sidebar__nav\" aria-label={ariaLabel}>\n {sections.map((section, sectionIndex) => (\n <div\n key={section.title ?? `section-${sectionIndex}`}\n className=\"sph-sidebar__section\"\n >\n {section.title !== undefined && (\n <div className=\"sph-sidebar__section-title\" aria-hidden=\"true\">\n {section.title}\n </div>\n )}\n {section.items.map((item) => {\n const isActive = item.value === active;\n return (\n <button\n key={item.value}\n type=\"button\"\n className=\"sph-sidebar__item\"\n data-active={isActive || undefined}\n aria-current={isActive ? \"page\" : undefined}\n disabled={item.disabled}\n title={\n showItemTitle && typeof item.label === \"string\"\n ? item.label\n : undefined\n }\n onClick={() => onSelect?.(item.value)}\n >\n {item.icon !== undefined && (\n <span className=\"sph-sidebar__icon\" aria-hidden=\"true\">\n {node(item.icon)}\n </span>\n )}\n <span className=\"sph-sidebar__label\">{node(item.label)}</span>\n {item.badge !== undefined && (\n <span className=\"sph-sidebar__badge\">\n {node(item.badge)}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ))}\n <span id={`${listId}-hint`} className=\"sph-visually-hidden\">\n {isCollapsed ? \"Sidebar collapsed\" : \"Sidebar expanded\"}\n </span>\n </nav>\n {(footer !== undefined || collapsible) && (\n <div className=\"sph-sidebar__footer\">\n {footer !== undefined && (\n <div className=\"sph-sidebar__footer-content\">{node(footer)}</div>\n )}\n {collapsible && (\n <button\n type=\"button\"\n className=\"sph-sidebar__toggle\"\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n onClick={toggleCollapsed}\n >\n <span aria-hidden=\"true\">\n {isCollapsed ? expandChevron : collapseChevron}\n </span>\n </button>\n )}\n </div>\n )}\n </aside>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type StreamingTextProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n text: string;\n /** Delay between word entrances, in ms. Default: 30. */\n speed?: number;\n /** Reveal words progressively. Default: true. */\n animated?: boolean;\n};\n\n/**\n * Words arrive one at a time — and because each word animates only when it\n * mounts, appending to `text` streams naturally without any JS timing: the\n * new words cascade in while finished ones stay put.\n */\nexport function StreamingText({\n text,\n speed = 30,\n animated = true,\n className,\n ...props\n}: StreamingTextProps) {\n const tokens = text.split(/(\\s+)/);\n let wordIndex = -1;\n\n return (\n <div {...node(props)} className={cn(\"sph-stream\", className)}>\n {tokens.map((token, index) => {\n if (token.trim().length === 0) return token;\n wordIndex += 1;\n const delay = animated ? wordIndex * speed : 0;\n return (\n <span\n key={index}\n className=\"sph-stream__word\"\n data-animated={animated || undefined}\n style={{ animationDelay: `${delay}ms` }}\n >\n {token}\n </span>\n );\n })}\n </div>\n );\n}\n","export type TableSortDirection = \"asc\" | \"desc\";\n\nexport type TableSort = { key: string; direction: TableSortDirection };\n\nexport type SortableColumn<Row> = {\n key: string;\n sortValue?: (row: Row) => unknown;\n compare?: (a: Row, b: Row) => number;\n};\n\nconst collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: \"base\",\n});\n\nfunction comparable(value: unknown) {\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"boolean\") return Number(value);\n return value;\n}\n\nfunction isEmpty(value: unknown) {\n return (\n value === null ||\n value === undefined ||\n value === \"\" ||\n (typeof value === \"number\" && Number.isNaN(value))\n );\n}\n\nexport function compareValues(a: unknown, b: unknown) {\n const left = comparable(a);\n const right = comparable(b);\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n return collator.compare(String(left), String(right));\n}\n\nexport function sortRows<Row>(\n rows: Row[],\n sort: TableSort[],\n columns: SortableColumn<Row>[],\n) {\n const entries = rows.map((row, index) => ({ row, index }));\n const rules = sort.flatMap(({ key, direction }) => {\n const column = columns.find((candidate) => candidate.key === key);\n if (!column) return [];\n const sign = direction === \"desc\" ? -1 : 1;\n const read =\n column.sortValue ??\n ((row: Row) => (row as Record<string, unknown>)[column.key]);\n return [{ column, sign, read }];\n });\n if (rules.length === 0) return entries;\n\n return entries.sort((a, b) => {\n for (const { column, sign, read } of rules) {\n let result: number;\n if (column.compare) {\n result = sign * column.compare(a.row, b.row);\n } else {\n const left = read(a.row);\n const right = read(b.row);\n const leftEmpty = isEmpty(left);\n const rightEmpty = isEmpty(right);\n if (leftEmpty || rightEmpty) {\n result = leftEmpty === rightEmpty ? 0 : leftEmpty ? 1 : -1;\n } else {\n result = sign * compareValues(left, right);\n }\n }\n if (result !== 0) return result;\n }\n return a.index - b.index;\n });\n}\n\nfunction cycle(direction?: TableSortDirection) {\n if (direction === undefined) return \"asc\";\n return direction === \"asc\" ? \"desc\" : undefined;\n}\n\nexport function nextSort(\n current: TableSort[],\n key: string,\n additive: boolean,\n): TableSort[] {\n const existing = current.find((entry) => entry.key === key);\n if (!additive) {\n const own = current.length === 1 ? existing : undefined;\n const direction = cycle(own?.direction);\n return direction ? [{ key, direction }] : [];\n }\n if (!existing) return [...current, { key, direction: \"asc\" }];\n const direction = cycle(existing.direction);\n return direction\n ? current.map((entry) => (entry.key === key ? { key, direction } : entry))\n : current.filter((entry) => entry.key !== key);\n}\n\nexport function toggleSelection(\n selected: ReadonlySet<string>,\n order: string[],\n id: string,\n anchor: string | null,\n range: boolean,\n) {\n const next = new Set(selected);\n const select = !selected.has(id);\n const from = range && anchor !== null ? order.indexOf(anchor) : -1;\n const to = order.indexOf(id);\n const ids =\n from >= 0 && to >= 0\n ? order.slice(Math.min(from, to), Math.max(from, to) + 1)\n : [id];\n for (const entry of ids) {\n if (select) next.add(entry);\n else next.delete(entry);\n }\n return next;\n}\n\nexport function toggleAll(\n selected: ReadonlySet<string>,\n order: string[],\n select: boolean,\n) {\n const next = new Set(selected);\n for (const id of order) {\n if (select) next.add(id);\n else next.delete(id);\n }\n return next;\n}\n","import { CaretUpIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { TableHTMLAttributes } from \"react\";\nimport { Checkbox } from \"@/atoms/Checkbox\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n nextSort,\n sortRows,\n toggleAll,\n toggleSelection,\n type TableSort,\n} from \"./rows\";\n\nexport type { TableSort, TableSortDirection } from \"./rows\";\n\nexport type TableColumn<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = {\n key: string;\n label: Renderable;\n align?: \"start\" | \"center\" | \"end\";\n width?: string;\n render?: (row: Row, index: number) => Renderable;\n sortable?: boolean;\n sortValue?: (row: Row) => unknown;\n compare?: (a: Row, b: Row) => number;\n};\n\nexport type TableProps<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<\n TableHTMLAttributes<HTMLTableElement>,\n \"children\" | \"rows\" | \"className\" | \"cellPadding\" | \"cellSpacing\"\n> & {\n columns: TableColumn<Row>[];\n rows: Row[];\n caption?: Renderable;\n emptyMessage?: Renderable;\n rowKey?: keyof Row & string;\n getRowId?: (row: Row, index: number) => string;\n density?: \"compact\" | \"comfortable\";\n striped?: boolean;\n stickyHeader?: boolean;\n stickyFirstColumn?: boolean;\n sort?: TableSort[];\n defaultSort?: TableSort[];\n onSortChange?: (sort: TableSort[]) => void;\n multiSort?: boolean;\n manualSort?: boolean;\n selectable?: boolean;\n selected?: ReadonlySet<string> | readonly string[];\n defaultSelected?: ReadonlySet<string> | readonly string[];\n onSelectedChange?: (selected: string[]) => void;\n rowLabel?: (row: Row, index: number) => string;\n selectAllLabel?: string;\n className?: string;\n};\n\ntype ModifierEvent = { shiftKey: boolean };\n\nconst ariaSort = {\n asc: \"ascending\",\n desc: \"descending\",\n} as const;\n\nfunction scrollTimelines() {\n return (\n typeof CSS !== \"undefined\" &&\n typeof CSS.supports === \"function\" &&\n CSS.supports(\"animation-timeline: scroll()\")\n );\n}\n\nexport function Table<\n Row extends Record<string, unknown> = Record<string, unknown>,\n>({\n columns,\n rows,\n caption,\n emptyMessage = \"No results\",\n rowKey,\n getRowId,\n density = \"comfortable\",\n striped = false,\n stickyHeader = false,\n stickyFirstColumn = false,\n sort,\n defaultSort,\n onSortChange,\n multiSort = false,\n manualSort = false,\n selectable = false,\n selected,\n defaultSelected,\n onSelectedChange,\n rowLabel,\n selectAllLabel = \"Select all rows\",\n className,\n ...props\n}: TableProps<Row>) {\n const [internalSort, setInternalSort] = useState<TableSort[]>(\n defaultSort ?? [],\n );\n const [internalSelected, setInternalSelected] = useState<string[]>(() => [\n ...(defaultSelected ?? []),\n ]);\n const selectAllRef = useRef<HTMLTableCellElement>(null);\n const anchor = useRef<string | null>(null);\n const shift = useRef(false);\n\n const activeSort = sort ?? internalSort;\n const selectedIds = useMemo(\n () => new Set(selected ?? internalSelected),\n [selected, internalSelected],\n );\n\n const idOf = (row: Row, index: number) =>\n getRowId\n ? getRowId(row, index)\n : rowKey\n ? String(row[rowKey])\n : String(index);\n const entries = (\n manualSort\n ? rows.map((row, index) => ({ row, index }))\n : sortRows(rows, activeSort, columns)\n ).map((entry) => ({ ...entry, id: idOf(entry.row, entry.index) }));\n const order = entries.map((entry) => entry.id);\n const selectedCount = order.filter((id) => selectedIds.has(id)).length;\n const allSelected = order.length > 0 && selectedCount === order.length;\n const someSelected = selectedCount > 0 && !allSelected;\n\n useEffect(() => {\n const input = selectAllRef.current?.querySelector(\"input\");\n if (input) input.indeterminate = someSelected;\n });\n\n const changeSort = (key: string, event: ModifierEvent) => {\n const next = nextSort(activeSort, key, multiSort && event.shiftKey);\n setInternalSort(next);\n onSortChange?.(next);\n };\n const commitSelection = (next: Set<string>) => {\n const ids = [...next];\n setInternalSelected(ids);\n onSelectedChange?.(ids);\n };\n const changeRow = (id: string) => {\n commitSelection(\n toggleSelection(selectedIds, order, id, anchor.current, shift.current),\n );\n anchor.current = id;\n shift.current = false;\n };\n const changeAll = () => {\n anchor.current = null;\n commitSelection(toggleAll(selectedIds, order, !allSelected));\n };\n const trackShift = (event: ModifierEvent) => {\n shift.current = event.shiftKey;\n };\n const holdSelection = (event: ModifierEvent & { preventDefault(): void }) => {\n shift.current = event.shiftKey;\n if (event.shiftKey) event.preventDefault();\n };\n const sortKey = (key: string, event: KeyboardActionEvent & ModifierEvent) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n changeSort(key, event);\n };\n const markScroll = (event: { currentTarget: HTMLDivElement }) => {\n if (!(stickyHeader || stickyFirstColumn) || scrollTimelines()) return;\n const wrap = event.currentTarget;\n wrap.dataset.scrolledBlock = String(wrap.scrollTop > 0);\n wrap.dataset.scrolledInline = String(Math.abs(wrap.scrollLeft) > 0);\n };\n\n const pinned = (columnIndex: number) =>\n stickyFirstColumn && columnIndex === 0\n ? { \"data-pinned\": true, \"data-edge\": true }\n : {};\n const selectPin = stickyFirstColumn ? { \"data-pinned\": true } : {};\n const colSpan = columns.length + (selectable ? 1 : 0);\n\n return (\n <div\n className={cn(\"sph-table-wrap\", className)}\n onScroll={stickyHeader || stickyFirstColumn ? markScroll : undefined}\n >\n <table\n {...node(props)}\n className=\"sph-table\"\n data-density={density}\n data-striped={striped || undefined}\n data-sticky-header={stickyHeader || undefined}\n data-sticky-column={stickyFirstColumn || undefined}\n data-selectable={selectable || undefined}\n >\n {caption !== undefined && <caption>{node(caption)}</caption>}\n <thead>\n <tr>\n {selectable && (\n <th\n ref={selectAllRef}\n scope=\"col\"\n className=\"sph-table__select\"\n {...selectPin}\n >\n <Checkbox\n size=\"sm\"\n aria-label={selectAllLabel}\n checked={allSelected}\n disabled={order.length === 0}\n data-indeterminate={someSelected || undefined}\n onChange={changeAll}\n />\n </th>\n )}\n {columns.map((column, columnIndex) => {\n const align = column.align ?? \"start\";\n const rank = activeSort.findIndex(\n (entry) => entry.key === column.key,\n );\n const direction =\n rank >= 0 ? activeSort[rank].direction : undefined;\n return (\n <th\n key={column.key}\n scope=\"col\"\n data-align={align}\n aria-sort={\n column.sortable\n ? direction\n ? ariaSort[direction]\n : \"none\"\n : undefined\n }\n style={{ width: column.width }}\n {...pinned(columnIndex)}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className=\"sph-table__sort\"\n data-align={align}\n data-direction={direction}\n onClick={(event) => changeSort(column.key, event)}\n onKeyDown={(event) => sortKey(column.key, event)}\n >\n <span className=\"sph-table__sort-label\">\n {node(column.label)}\n </span>\n <span className=\"sph-table__caret\" aria-hidden=\"true\">\n <CaretUpIcon weight=\"bold\" />\n </span>\n {direction && activeSort.length > 1 && (\n <span className=\"sph-table__rank\" aria-hidden=\"true\">\n {rank + 1}\n </span>\n )}\n </button>\n ) : (\n node(column.label)\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {entries.length === 0 ? (\n <tr>\n <td className=\"sph-table__empty\" colSpan={colSpan}>\n {node(emptyMessage)}\n </td>\n </tr>\n ) : (\n entries.map(({ row, id }, rowIndex) => {\n const isSelected = selectable && selectedIds.has(id);\n return (\n <tr\n key={id}\n aria-selected={selectable ? isSelected : undefined}\n data-selected={isSelected || undefined}\n >\n {selectable && (\n <td\n className=\"sph-table__select\"\n onMouseDown={holdSelection}\n onKeyDown={trackShift}\n {...selectPin}\n >\n <Checkbox\n size=\"sm\"\n aria-label={\n rowLabel\n ? rowLabel(row, rowIndex)\n : `Select row ${rowIndex + 1}`\n }\n checked={isSelected}\n onChange={() => changeRow(id)}\n />\n </td>\n )}\n {columns.map((column, columnIndex) => (\n <td\n key={column.key}\n data-align={column.align ?? \"start\"}\n {...pinned(columnIndex)}\n >\n {node(\n column.render\n ? column.render(row, rowIndex)\n : row[column.key],\n )}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type StatusMarkState =\n | \"idle\"\n | \"running\"\n | \"progress\"\n | \"success\"\n | \"error\";\n\nexport type StatusMarkProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"children\" | \"role\" | \"aria-label\"\n> & {\n state?: StatusMarkState;\n value?: number;\n label: string;\n size?: ControlSize;\n className?: string;\n};\n\nconst clampValue = (value: number | undefined) =>\n typeof value === \"number\" && Number.isFinite(value)\n ? Math.min(Math.max(value, 0), 100)\n : 0;\n\nexport function StatusMark({\n state = \"idle\",\n value,\n label,\n size = \"md\",\n className,\n style,\n ...props\n}: StatusMarkProps) {\n const progress = state === \"progress\" ? clampValue(value) : undefined;\n\n return (\n <span\n {...node(props)}\n className={cn(\"sph-status-mark\", className)}\n data-state={state}\n data-size={size}\n role=\"img\"\n aria-label={label}\n style={\n progress === undefined\n ? style\n : ({\n ...style,\n \"--sph-status-mark-value\": progress,\n } as CSSProperties & Record<string, string | number>)\n }\n >\n <svg\n className=\"sph-status-mark__glyph\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle className=\"sph-status-mark__track\" cx=\"8\" cy=\"8\" r=\"6\" />\n <circle className=\"sph-status-mark__fill\" cx=\"8\" cy=\"8\" r=\"6.75\" />\n <circle className=\"sph-status-mark__arc\" cx=\"8\" cy=\"8\" r=\"6\" />\n <path\n className=\"sph-status-mark__check\"\n d=\"M5.25 8.25 7.1 10l3.65-3.75\"\n />\n <path className=\"sph-status-mark__cross\" d=\"M5.75 5.75l4.5 4.5\" />\n <path className=\"sph-status-mark__cross\" d=\"M10.25 5.75l-4.5 4.5\" />\n </svg>\n </span>\n );\n}\n","import { cn } from \"cn\";\nimport type { TimeHTMLAttributes } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type TimestampFormat = \"relative\" | \"absolute\" | \"auto\";\n\nexport type TimestampProps = Omit<\n TimeHTMLAttributes<HTMLTimeElement>,\n \"children\" | \"dateTime\"\n> & {\n date: Date | string | number;\n format?: TimestampFormat;\n locale?: string | string[];\n absoluteOptions?: Intl.DateTimeFormatOptions;\n live?: boolean;\n now?: Date | number;\n};\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30.44 * DAY;\nconst YEAR = 365.25 * DAY;\n\nconst RELATIVE_UNITS: [Intl.RelativeTimeFormatUnit, number, number][] = [\n [\"minute\", MINUTE, HOUR],\n [\"hour\", HOUR, DAY],\n [\"day\", DAY, WEEK],\n [\"week\", WEEK, MONTH],\n [\"month\", MONTH, YEAR],\n];\n\nconst DEFAULT_ABSOLUTE: Intl.DateTimeFormatOptions = {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n};\n\nexport function formatRelativeTime(\n time: number,\n now: number,\n locale?: string | string[],\n): string {\n const formatter = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n const diff = time - now;\n const distance = Math.abs(diff);\n if (distance < 45 * SECOND) return formatter.format(0, \"second\");\n const [unit, size] =\n RELATIVE_UNITS.find(([, , limit]) => distance < limit) ??\n ([\"year\", YEAR] as const);\n const amount = Math.max(1, Math.round(distance / size));\n return formatter.format(diff < 0 ? -amount : amount, unit);\n}\n\ntype Subscriber = { every: number; notify: () => void };\n\nconst subscribers = new Set<Subscriber>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet scheduledEvery = Number.POSITIVE_INFINITY;\n\nfunction schedule() {\n let every = Number.POSITIVE_INFINITY;\n for (const subscriber of subscribers) {\n every = Math.min(every, subscriber.every);\n }\n if (timer !== undefined && every === scheduledEvery) return;\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n scheduledEvery = Number.POSITIVE_INFINITY;\n if (!Number.isFinite(every)) return;\n scheduledEvery = every;\n timer = setTimeout(() => {\n timer = undefined;\n scheduledEvery = Number.POSITIVE_INFINITY;\n for (const subscriber of Array.from(subscribers)) subscriber.notify();\n schedule();\n }, every);\n}\n\nexport const timestampClock = {\n subscribe(every: number, notify: () => void): () => void {\n const subscriber: Subscriber = { every, notify };\n subscribers.add(subscriber);\n schedule();\n return () => {\n subscribers.delete(subscriber);\n schedule();\n };\n },\n get size() {\n return subscribers.size;\n },\n get interval() {\n return timer === undefined ? undefined : scheduledEvery;\n },\n};\n\nconst toTime = (value: Date | string | number) =>\n value instanceof Date ? value.getTime() : new Date(value).getTime();\n\nconst refreshEvery = (distance: number) =>\n distance < HOUR ? 30 * SECOND : distance < DAY ? 5 * MINUTE : HOUR;\n\nexport function Timestamp({\n date,\n format = \"auto\",\n locale,\n absoluteOptions,\n live = false,\n now,\n className,\n ...props\n}: TimestampProps) {\n const [, setTick] = useState(0);\n const time = toTime(date);\n const valid = Number.isFinite(time);\n const reference = now === undefined ? Date.now() : toTime(now);\n const distance = Math.abs(time - reference);\n const relative =\n format === \"relative\" || (format === \"auto\" && distance < WEEK);\n const every = refreshEvery(distance);\n const ticking = live && valid && now === undefined && format !== \"absolute\";\n\n useEffect(() => {\n if (!ticking) return;\n return timestampClock.subscribe(every, () => setTick((count) => count + 1));\n }, [ticking, every]);\n\n if (!valid) {\n return (\n <time\n {...node(props)}\n className={cn(\"sph-timestamp\", className)}\n data-invalid=\"true\"\n >\n {String(date)}\n </time>\n );\n }\n\n const instant = new Date(time);\n const full = new Intl.DateTimeFormat(locale, {\n dateStyle: \"full\",\n timeStyle: \"long\",\n timeZone: absoluteOptions?.timeZone,\n }).format(instant);\n const text = relative\n ? formatRelativeTime(time, reference, locale)\n : new Intl.DateTimeFormat(\n locale,\n absoluteOptions ?? DEFAULT_ABSOLUTE,\n ).format(instant);\n\n return (\n <time\n title={full}\n {...node(props)}\n className={cn(\"sph-timestamp\", className)}\n dateTime={instant.toISOString()}\n data-format={relative ? \"relative\" : \"absolute\"}\n data-live={ticking || undefined}\n >\n {text}\n </time>\n );\n}\n","import {\n ArrowsHorizontalIcon,\n MinusIcon,\n PlusIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { IconButton } from \"../IconButton\";\n\nexport type NumberInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"size\"\n | \"type\"\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"min\"\n | \"max\"\n | \"step\"\n | \"children\"\n> & {\n value?: number | null;\n defaultValue?: number | null;\n onValueChange?: (value: number | null) => void;\n min?: number;\n max?: number;\n step?: number;\n largeStep?: number;\n precision?: number;\n format?: Intl.NumberFormatOptions;\n locale?: string;\n size?: ControlSize;\n invalid?: boolean;\n scrub?: boolean;\n label?: string;\n decrementLabel?: string;\n incrementLabel?: string;\n};\n\ntype PressEvent = {\n button: number;\n pointerId: number;\n currentTarget: Element;\n preventDefault(): void;\n};\n\ntype DragEvent = PressEvent & {\n type: string;\n clientX: number;\n shiftKey: boolean;\n};\n\ntype StepKeyEvent = {\n key: string;\n shiftKey: boolean;\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nconst REPEAT_DELAY = 400;\nconst REPEAT_INTERVAL = 60;\nconst SCRUB_PIXELS = 4;\nconst SCRUB_THRESHOLD = 3;\nconst ICON_SIZE: Record<ControlSize, number> = { sm: 12, md: 14, lg: 16 };\n\nexport function decimalsOf(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const text = String(value);\n const exponent = text.match(/e-(\\d+)$/);\n if (exponent) return Number(exponent[1]);\n const dot = text.indexOf(\".\");\n return dot < 0 ? 0 : text.length - dot - 1;\n}\n\nexport function clampNumber(value: number, min?: number, max?: number): number {\n let next = value;\n if (max !== undefined) next = Math.min(next, max);\n if (min !== undefined) next = Math.max(next, min);\n return next;\n}\n\nfunction roundTo(value: number, digits: number): number {\n return Number(value.toFixed(Math.min(Math.max(digits, 0), 100)));\n}\n\nexport function createFormatter(\n locale: string | undefined,\n format: Intl.NumberFormatOptions | undefined,\n precision: number | undefined,\n step: number,\n): Intl.NumberFormat {\n const options: Intl.NumberFormatOptions =\n precision !== undefined\n ? {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n ...format,\n }\n : { maximumFractionDigits: Math.max(3, decimalsOf(step)), ...format };\n const low = options.minimumFractionDigits;\n const high = options.maximumFractionDigits;\n if (low !== undefined && high !== undefined && low > high)\n options.maximumFractionDigits = low;\n try {\n return new Intl.NumberFormat(locale, options);\n } catch {\n return new Intl.NumberFormat(locale);\n }\n}\n\nexport function parseNumber(\n text: string,\n locale?: string,\n format?: Intl.NumberFormatOptions,\n): number | null | undefined {\n const trimmed = text.trim();\n if (trimmed === \"\") return null;\n const parts = new Intl.NumberFormat(locale).formatToParts(-12345.6);\n const decimal = parts.find((part) => part.type === \"decimal\")?.value ?? \".\";\n const group = parts.find((part) => part.type === \"group\")?.value ?? \",\";\n let normalized = trimmed.replace(/[−‒–﹣-]/g, \"-\");\n normalized = normalized.replace(/[\\s ]/g, \"\");\n if (group.trim() !== \"\")\n normalized = normalized.split(group.replace(/\\s/g, \"\")).join(\"\");\n if (decimal !== \".\") normalized = normalized.split(decimal).join(\".\");\n normalized = normalized.replace(/[^\\d.+-]/g, \"\");\n if (!/^[-+]?(\\d+\\.?\\d*|\\.\\d+)$/.test(normalized)) return undefined;\n const parsed = Number(normalized);\n if (!Number.isFinite(parsed)) return undefined;\n return format?.style === \"percent\" ? parsed / 100 : parsed;\n}\n\nexport function NumberInput({\n value,\n defaultValue = null,\n onValueChange,\n min,\n max,\n step = 1,\n largeStep,\n precision,\n format,\n locale,\n size = \"md\",\n invalid = false,\n disabled = false,\n readOnly = false,\n scrub = false,\n label,\n decrementLabel = \"Decrease\",\n incrementLabel = \"Increase\",\n className,\n style,\n name,\n onKeyDown,\n onBlur,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: NumberInputProps) {\n const [uncontrolled, setUncontrolled] = useState<number | null>(defaultValue);\n const [draft, setDraft] = useState<string | null>(null);\n const [scrubbing, setScrubbing] = useState(false);\n const current = value !== undefined ? value : uncontrolled;\n const latest = useRef(current);\n latest.current = current;\n const inputRef = useRef<HTMLInputElement | null>(null);\n const repeat = useRef<ReturnType<typeof setTimeout> | null>(null);\n const drag = useRef<{\n id: number;\n x: number;\n start: number | null;\n moved: boolean;\n } | null>(null);\n\n const bigStep = largeStep ?? step * 10;\n const digits =\n precision ?? Math.max(decimalsOf(step), decimalsOf(bigStep), 0);\n const formatter = createFormatter(locale, format, precision, step);\n const formatted = current === null ? \"\" : formatter.format(current);\n const locked = disabled || readOnly;\n const atMin = current !== null && min !== undefined && current <= min;\n const atMax = current !== null && max !== undefined && current >= max;\n const iconSize = ICON_SIZE[size];\n\n const normalize = (next: number) => {\n const clamped = clampNumber(next, min, max);\n return precision !== undefined ? roundTo(clamped, precision) : clamped;\n };\n\n const commit = (next: number | null) => {\n const settled = next === null ? null : normalize(next);\n setDraft(null);\n if (settled === latest.current) return;\n latest.current = settled;\n setUncontrolled(settled);\n onValueChange?.(settled);\n };\n\n const resolveDraft = (): number | null => {\n if (draft === null) return latest.current;\n const parsed = parseNumber(draft, locale, format);\n if (parsed === undefined) {\n setDraft(null);\n return latest.current;\n }\n return parsed === null ? null : normalize(parsed);\n };\n\n const commitDraft = () => {\n if (draft === null) return;\n commit(resolveDraft());\n };\n\n const nudge = (delta: number, base: number | null = latest.current) => {\n if (base === null) {\n commit(clampNumber(0, min, max));\n return;\n }\n commit(roundTo(base + delta, Math.max(digits, decimalsOf(base))));\n };\n\n const stopRepeat = () => {\n if (repeat.current !== null) clearTimeout(repeat.current);\n repeat.current = null;\n };\n\n useEffect(() => stopRepeat, []);\n\n const startRepeat = (event: PressEvent, direction: 1 | -1) => {\n if (event.button !== 0 || locked) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture?.(event.pointerId);\n const first = resolveDraft();\n const run = (delay: number, base?: number | null) => {\n const before = base === undefined ? latest.current : base;\n nudge(direction * step, before);\n const reachedBound =\n latest.current === before ||\n (direction > 0 && max !== undefined && (latest.current ?? 0) >= max) ||\n (direction < 0 && min !== undefined && (latest.current ?? 0) <= min);\n if (reachedBound) {\n stopRepeat();\n return;\n }\n repeat.current = setTimeout(() => run(REPEAT_INTERVAL), delay);\n };\n stopRepeat();\n run(REPEAT_DELAY, first);\n };\n\n const stepperClick = (event: { detail: number }, direction: 1 | -1) => {\n if (event.detail !== 0 || locked) return;\n nudge(direction * step, resolveDraft());\n };\n\n const handleKeyDown = (event: StepKeyEvent) => {\n onKeyDown?.(node(event));\n if (event.defaultPrevented || disabled) return;\n const amount = event.shiftKey ? bigStep : step;\n const move = (delta: number) => {\n event.preventDefault();\n if (!readOnly) nudge(delta, resolveDraft());\n };\n switch (event.key) {\n case \"ArrowUp\":\n move(amount);\n break;\n case \"ArrowDown\":\n move(-amount);\n break;\n case \"PageUp\":\n move(bigStep);\n break;\n case \"PageDown\":\n move(-bigStep);\n break;\n case \"Home\":\n if (min === undefined) return;\n event.preventDefault();\n if (!readOnly) commit(min);\n break;\n case \"End\":\n if (max === undefined) return;\n event.preventDefault();\n if (!readOnly) commit(max);\n break;\n case \"Enter\":\n commitDraft();\n break;\n case \"Escape\":\n if (draft === null) return;\n event.preventDefault();\n setDraft(null);\n break;\n }\n };\n\n const scrubStart = (event: DragEvent) => {\n if (event.button !== 0 || disabled) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture?.(event.pointerId);\n drag.current = {\n id: event.pointerId,\n x: event.clientX,\n start: resolveDraft(),\n moved: false,\n };\n };\n\n const scrubMove = (event: DragEvent) => {\n const state = drag.current;\n if (!state || state.id !== event.pointerId) return;\n const dx = event.clientX - state.x;\n if (!state.moved && Math.abs(dx) < SCRUB_THRESHOLD) return;\n if (!state.moved) {\n state.moved = true;\n setScrubbing(true);\n }\n if (readOnly) return;\n const amount = event.shiftKey ? bigStep : step;\n const steps = Math.trunc(dx / SCRUB_PIXELS);\n const base = state.start ?? clampNumber(0, min, max);\n commit(roundTo(base + steps * amount, Math.max(digits, decimalsOf(base))));\n };\n\n const scrubEnd = (event: DragEvent) => {\n const state = drag.current;\n if (!state || state.id !== event.pointerId) return;\n drag.current = null;\n setScrubbing(false);\n if (!state.moved && event.type === \"pointerup\") {\n inputRef.current?.focus();\n inputRef.current?.select();\n }\n };\n\n return (\n <div\n className={cn(\"sph-number-input\", className)}\n style={node(style)}\n data-size={size}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-scrub={scrub || undefined}\n data-scrubbing={scrubbing || undefined}\n >\n {scrub && (\n <span\n className=\"sph-number-input__scrub\"\n aria-hidden=\"true\"\n onPointerDown={scrubStart}\n onPointerMove={scrubMove}\n onPointerUp={scrubEnd}\n onPointerCancel={scrubEnd}\n >\n {label || <ArrowsHorizontalIcon size={iconSize} weight=\"bold\" />}\n </span>\n )}\n <IconButton\n className=\"sph-number-input__step\"\n data-direction=\"decrement\"\n size={size}\n label={decrementLabel}\n icon={<MinusIcon size={iconSize} weight=\"bold\" />}\n tabIndex={-1}\n disabled={locked || atMin}\n onPointerDown={(event) => startRepeat(event, -1)}\n onPointerUp={stopRepeat}\n onPointerCancel={stopRepeat}\n onLostPointerCapture={stopRepeat}\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => stepperClick(event, -1)}\n />\n <input\n {...node(props)}\n ref={inputRef}\n type=\"text\"\n role=\"spinbutton\"\n inputMode=\"decimal\"\n autoComplete=\"off\"\n className=\"sph-number-input__input\"\n value={draft ?? formatted}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={\n ariaLabel ?? (ariaLabelledBy ? undefined : label || undefined)\n }\n aria-labelledby={ariaLabelledBy}\n aria-valuenow={current ?? undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={formatted || undefined}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n onBlur={(event) => {\n commitDraft();\n onBlur?.(node(event));\n }}\n />\n <IconButton\n className=\"sph-number-input__step\"\n data-direction=\"increment\"\n size={size}\n label={incrementLabel}\n icon={<PlusIcon size={iconSize} weight=\"bold\" />}\n tabIndex={-1}\n disabled={locked || atMax}\n onPointerDown={(event) => startRepeat(event, 1)}\n onPointerUp={stopRepeat}\n onPointerCancel={stopRepeat}\n onLostPointerCapture={stopRepeat}\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => stepperClick(event, 1)}\n />\n {name !== undefined && (\n <input\n type=\"hidden\"\n name={name}\n value={current === null ? \"\" : String(current)}\n disabled={disabled}\n />\n )}\n </div>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { ButtonHTMLAttributes, CSSProperties } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type HoldButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"type\"\n> & {\n onConfirm: () => void;\n children?: Renderable;\n holdLabel?: Renderable;\n confirmedLabel?: Renderable;\n hint?: string;\n duration?: number;\n variant?: \"danger\" | \"primary\" | \"secondary\";\n size?: ControlSize;\n};\n\nexport type HoldPhase = \"idle\" | \"holding\" | \"releasing\" | \"confirmed\";\n\nconst REWIND_RATE = 3;\nconst CONFIRMED_FOR = 1100;\nconst DEFAULT_DURATION = 1200;\n\nexport function advanceHold(\n progress: number,\n elapsed: number,\n duration: number,\n holding: boolean,\n): number {\n const span = Math.max(duration, 1);\n const delta = holding ? elapsed / span : (-elapsed * REWIND_RATE) / span;\n return Math.min(1, Math.max(0, progress + delta));\n}\n\nfunction textOf(value: Renderable, fallback: string): string {\n return typeof value === \"string\" || typeof value === \"number\"\n ? String(value)\n : fallback;\n}\n\nexport function HoldButton({\n onConfirm,\n children,\n holdLabel,\n confirmedLabel = \"Confirmed\",\n hint = \"Press and hold to confirm\",\n duration = DEFAULT_DURATION,\n variant = \"danger\",\n size = \"md\",\n disabled = false,\n className,\n style,\n onPointerDown,\n onPointerUp,\n onPointerCancel,\n onPointerMove,\n onKeyDown,\n onKeyUp,\n onBlur,\n onContextMenu,\n onClick,\n \"aria-describedby\": ariaDescribedBy,\n ...props\n}: HoldButtonProps) {\n const hintId = `${useId()}-hint`;\n const [phase, setPhase] = useState<HoldPhase>(\"idle\");\n const [status, setStatus] = useState(\"\");\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const progress = useRef(0);\n const holding = useRef(false);\n const source = useRef<\"pointer\" | \"key\" | null>(null);\n const frame = useRef<number | null>(null);\n const stamp = useRef(0);\n const reset = useRef<ReturnType<typeof setTimeout> | null>(null);\n const confirmRef = useRef(onConfirm);\n confirmRef.current = onConfirm;\n const durationRef = useRef(duration);\n durationRef.current = duration;\n const confirmed = phase === \"confirmed\";\n\n const paint = (value: number) => {\n progress.current = value;\n buttonRef.current?.style.setProperty(\"--sph-hold-progress\", String(value));\n };\n\n const cancelFrame = () => {\n if (frame.current !== null) cancelAnimationFrame(frame.current);\n frame.current = null;\n };\n\n const tick = (now: number) => {\n const elapsed = now - stamp.current;\n stamp.current = now;\n const next = advanceHold(\n progress.current,\n elapsed,\n durationRef.current,\n holding.current,\n );\n paint(next);\n if (holding.current && next >= 1) {\n holding.current = false;\n frame.current = null;\n setPhase(\"confirmed\");\n setStatus(textOf(confirmedLabel, \"Confirmed\"));\n confirmRef.current();\n reset.current = setTimeout(() => {\n reset.current = null;\n setPhase(\"releasing\");\n run();\n }, CONFIRMED_FOR);\n return;\n }\n if (!holding.current && next <= 0) {\n frame.current = null;\n setPhase(\"idle\");\n return;\n }\n frame.current = requestAnimationFrame(tick);\n };\n\n const run = () => {\n if (frame.current !== null) return;\n stamp.current = performance.now();\n frame.current = requestAnimationFrame(tick);\n };\n\n const start = (from: \"pointer\" | \"key\") => {\n if (disabled || confirmed || holding.current) return;\n holding.current = true;\n source.current = from;\n setPhase(\"holding\");\n setStatus(textOf(holdLabel, \"Keep holding to confirm\"));\n run();\n };\n\n const release = (from: \"pointer\" | \"key\") => {\n if (source.current !== from) return;\n source.current = null;\n if (!holding.current) return;\n holding.current = false;\n setPhase(\"releasing\");\n setStatus(\"\");\n run();\n };\n\n useEffect(\n () => () => {\n cancelFrame();\n if (reset.current !== null) clearTimeout(reset.current);\n },\n [],\n );\n\n useEffect(() => {\n if (!disabled || !holding.current) return;\n holding.current = false;\n source.current = null;\n setPhase(\"releasing\");\n setStatus(\"\");\n run();\n }, [disabled]);\n\n const describedBy = [ariaDescribedBy, hintId].filter(Boolean).join(\" \");\n const buttonStyle = {\n ...style,\n \"--sph-hold-progress\": String(progress.current),\n } as CSSProperties;\n const holdText = holdLabel ?? children;\n\n return (\n <>\n <button\n {...node(props)}\n ref={buttonRef}\n type=\"button\"\n className={cn(\"sph-hold-button\", className)}\n style={node(buttonStyle)}\n data-variant={variant}\n data-size={size}\n data-state={phase}\n disabled={disabled}\n aria-describedby={describedBy}\n onPointerDown={(event) => {\n onPointerDown?.(node(event));\n if (event.defaultPrevented || event.button !== 0) return;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n start(\"pointer\");\n }}\n onPointerUp={(event) => {\n onPointerUp?.(node(event));\n release(\"pointer\");\n }}\n onPointerCancel={(event) => {\n onPointerCancel?.(node(event));\n release(\"pointer\");\n }}\n onPointerMove={(event) => {\n onPointerMove?.(node(event));\n if (source.current !== \"pointer\" || !holding.current) return;\n const rect = event.currentTarget.getBoundingClientRect();\n const outside =\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom;\n if (outside) release(\"pointer\");\n }}\n onKeyDown={(event) => {\n onKeyDown?.(node(event));\n if (event.defaultPrevented) return;\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n event.preventDefault();\n if (!event.repeat) start(\"key\");\n }}\n onKeyUp={(event) => {\n onKeyUp?.(node(event));\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n event.preventDefault();\n release(\"key\");\n }}\n onBlur={(event) => {\n onBlur?.(node(event));\n release(\"key\");\n release(\"pointer\");\n }}\n onContextMenu={(event) => {\n onContextMenu?.(node(event));\n if (holding.current) event.preventDefault();\n }}\n onClick={(event) => {\n onClick?.(node(event));\n event.preventDefault();\n }}\n >\n <span className=\"sph-hold-button__fill\" aria-hidden=\"true\" />\n <span className=\"sph-hold-button__labels\">\n <span className=\"sph-hold-button__label\" data-label=\"rest\">\n {node(children)}\n </span>\n <span\n className=\"sph-hold-button__label\"\n data-label=\"hold\"\n aria-hidden=\"true\"\n >\n {node(holdText)}\n </span>\n <span\n className=\"sph-hold-button__label\"\n data-label=\"confirmed\"\n aria-hidden=\"true\"\n >\n <CheckIcon size={size === \"lg\" ? 16 : 14} weight=\"bold\" />\n {node(confirmedLabel)}\n </span>\n </span>\n </button>\n <span id={hintId} className=\"sph-visually-hidden\">\n {hint}\n </span>\n <span className=\"sph-visually-hidden\" role=\"status\" aria-live=\"polite\">\n {status}\n </span>\n </>\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties } from \"react\";\nimport { useId, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlDensity, ControlSize } from \"../../lib/control\";\n\nexport type SegmentedOption = {\n value: string;\n label: Renderable;\n icon?: Renderable;\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps = {\n options: SegmentedOption[];\n ariaLabel: string;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n size?: ControlSize;\n density?: ControlDensity;\n fullWidth?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\nconst forward = [\"ArrowRight\", \"ArrowDown\"];\nconst backward = [\"ArrowLeft\", \"ArrowUp\"];\n\nexport function segmentTarget(\n options: SegmentedOption[],\n index: number,\n key: string,\n): number {\n const count = options.length;\n const enabled = (candidate: number) => !options[candidate]?.disabled;\n if (key === \"Home\" || key === \"End\") {\n const order = options.map((_, position) => position);\n if (key === \"End\") order.reverse();\n return order.find(enabled) ?? -1;\n }\n const direction = forward.includes(key) ? 1 : backward.includes(key) ? -1 : 0;\n if (direction === 0 || count === 0) return -1;\n for (let step = 1; step <= count; step += 1) {\n const next = (((index + step * direction) % count) + count) % count;\n if (enabled(next)) return next;\n }\n return -1;\n}\n\nexport function SegmentedControl({\n options,\n ariaLabel,\n value,\n defaultValue,\n onValueChange,\n size = \"md\",\n density = \"default\",\n fullWidth = false,\n disabled = false,\n className,\n}: SegmentedControlProps) {\n const generatedId = useId();\n const [uncontrolledValue, setUncontrolledValue] = useState(\n () =>\n defaultValue ?? options.find((option) => !option.disabled)?.value ?? \"\",\n );\n const activeValue = value ?? uncontrolledValue;\n const checkedIndex = options.findIndex(\n (option) => option.value === activeValue,\n );\n const tabbableIndex =\n checkedIndex >= 0 && !options[checkedIndex].disabled\n ? checkedIndex\n : options.findIndex((option) => !option.disabled);\n\n const select = (index: number) => {\n const option = options[index];\n if (!option || option.disabled || disabled) return;\n if (value === undefined) setUncontrolledValue(option.value);\n if (option.value !== activeValue) onValueChange?.(option.value);\n };\n\n const handleKeyDown = (event: KeyboardActionEvent, index: number) => {\n const next = segmentTarget(options, index, event.key);\n if (next === -1) return;\n event.preventDefault();\n select(next);\n document.getElementById(`${generatedId}-${next}`)?.focus();\n };\n\n const style = {\n \"--sph-segmented-count\": Math.max(options.length, 1),\n \"--sph-segmented-index\": Math.max(checkedIndex, 0),\n } as CSSProperties & Record<string, string | number>;\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n className={cn(\"sph-segmented-control\", className)}\n data-size={size}\n data-density={density}\n data-full-width={fullWidth || undefined}\n data-disabled={disabled || undefined}\n style={style}\n >\n <span\n className=\"sph-segmented-control__thumb\"\n data-hidden={checkedIndex === -1 || undefined}\n aria-hidden=\"true\"\n />\n {options.map((option, index) => {\n const checked = index === checkedIndex;\n return (\n <button\n key={option.value}\n id={`${generatedId}-${index}`}\n type=\"button\"\n role=\"radio\"\n className=\"sph-segmented-control__option\"\n aria-checked={checked}\n tabIndex={index === tabbableIndex ? 0 : -1}\n disabled={disabled || option.disabled}\n data-state={checked ? \"checked\" : \"unchecked\"}\n onClick={() => select(index)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {option.icon !== undefined && (\n <span className=\"sph-segmented-control__icon\" aria-hidden=\"true\">\n {node(option.icon)}\n </span>\n )}\n <span className=\"sph-segmented-control__label\">\n {node(option.label)}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type StepperStep = {\n id?: string;\n label: Renderable;\n description?: Renderable;\n};\n\nexport type StepperStepState = \"done\" | \"current\" | \"upcoming\";\n\nexport type StepperProps = {\n steps: StepperStep[];\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n onStepSelect?: (index: number) => void;\n ariaLabel?: string;\n completedLabel?: string;\n className?: string;\n};\n\nconst checkSize: Record<ControlSize, number> = { sm: 11, md: 13, lg: 15 };\n\nexport function stepState(index: number, current: number): StepperStepState {\n if (index < current) return \"done\";\n return index === current ? \"current\" : \"upcoming\";\n}\n\nexport function Stepper({\n steps,\n current,\n orientation = \"horizontal\",\n size = \"md\",\n onStepSelect,\n ariaLabel = \"Progress\",\n completedLabel = \"Completed\",\n className,\n}: StepperProps) {\n return (\n <ol\n className={cn(\"sph-stepper\", className)}\n aria-label={ariaLabel}\n data-orientation={orientation}\n data-size={size}\n >\n {steps.map((step, index) => {\n const state = stepState(index, current);\n const selectable = state === \"done\" && onStepSelect !== undefined;\n const content = (\n <>\n <span className=\"sph-stepper__marker\" aria-hidden=\"true\">\n <span className=\"sph-stepper__number\">{index + 1}</span>\n <span className=\"sph-stepper__check\">\n <CheckIcon size={checkSize[size]} weight=\"bold\" />\n </span>\n </span>\n <span className=\"sph-stepper__text\">\n <span className=\"sph-stepper__label\">\n {node(step.label)}\n {state === \"done\" && (\n <span className=\"sph-stepper__status\">\n {`, ${completedLabel}`}\n </span>\n )}\n </span>\n {step.description !== undefined && (\n <span className=\"sph-stepper__description\">\n {node(step.description)}\n </span>\n )}\n </span>\n </>\n );\n return (\n <li\n key={step.id ?? index}\n className=\"sph-stepper__step\"\n data-state={state}\n aria-current={state === \"current\" ? \"step\" : undefined}\n >\n {selectable ? (\n <button\n type=\"button\"\n className=\"sph-stepper__trigger\"\n onClick={() => onStepSelect(index)}\n >\n {content}\n </button>\n ) : (\n <div className=\"sph-stepper__trigger\">{content}</div>\n )}\n {index < steps.length - 1 && (\n <span className=\"sph-stepper__connector\" aria-hidden=\"true\">\n <span className=\"sph-stepper__fill\" />\n </span>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type MetadataEntry = {\n label: Renderable;\n value: Renderable;\n hint?: Renderable;\n id?: string;\n};\n\nexport type MetadataListLayout = \"columns\" | \"stacked\" | \"inline\";\n\nexport type MetadataListProps = Omit<\n HTMLAttributes<HTMLDListElement>,\n \"children\"\n> & {\n items: MetadataEntry[];\n layout?: MetadataListLayout;\n size?: ControlSize;\n dividers?: boolean;\n};\n\nconst isEmpty = (value: Renderable) =>\n value === null ||\n value === undefined ||\n value === false ||\n (typeof value === \"string\" && value.trim() === \"\");\n\nexport function MetadataList({\n items,\n layout = \"columns\",\n size = \"md\",\n dividers = false,\n className,\n ...props\n}: MetadataListProps) {\n return (\n <dl\n {...node(props)}\n className={cn(\"sph-metadata-list\", className)}\n data-layout={layout}\n data-size={size}\n data-dividers={dividers || undefined}\n >\n {items.map((item, index) => (\n <div\n key={item.id ?? index}\n className=\"sph-metadata-list__item\"\n data-empty={isEmpty(item.value) || undefined}\n >\n <dt className=\"sph-metadata-list__label\">{node(item.label)}</dt>\n <dd className=\"sph-metadata-list__value\">\n {isEmpty(item.value) ? (\n <>\n <span className=\"sph-metadata-list__empty\" aria-hidden=\"true\">\n —\n </span>\n <span className=\"sph-metadata-list__sr\">Not set</span>\n </>\n ) : (\n node(item.value)\n )}\n {item.hint !== undefined && item.hint !== null && (\n <span className=\"sph-metadata-list__hint\">{node(item.hint)}</span>\n )}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Popover } from \"@/molecules/Popover\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { useFocusTrap } from \"@/lib/focus.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\n\nexport type OverflowCollapse = \"end\" | \"start\";\n\nexport type OverflowListProps<T = unknown> = Omit<\n HTMLAttributes<HTMLUListElement>,\n \"children\"\n> & {\n items: T[];\n renderItem: (item: T, index: number) => Renderable;\n renderOverflow?: (hidden: T[]) => Renderable;\n renderOverflowItem?: (item: T, index: number) => Renderable;\n getKey?: (item: T, index: number) => string | number;\n minVisible?: number;\n collapseFrom?: OverflowCollapse;\n overflowLabel?: (count: number) => string;\n};\n\nexport type OverflowFit = {\n widths: number[];\n available: number;\n gap: number;\n reserve: number;\n minVisible?: number;\n};\n\nexport function fitOverflowCount({\n widths,\n available,\n gap,\n reserve,\n minVisible = 0,\n}: OverflowFit): number {\n const total = widths.length;\n if (total === 0) return 0;\n const full =\n widths.reduce((sum, width) => sum + width, 0) + gap * (total - 1);\n if (full <= available) return total;\n let used = reserve;\n let count = 0;\n while (count < total && used + widths[count] + gap <= available) {\n used += widths[count] + gap;\n count += 1;\n }\n const floor = Math.min(Math.max(Math.floor(minVisible), 0), total);\n const visible = Math.max(count, floor);\n return visible >= total ? total : visible;\n}\n\nconst defaultLabel = (count: number) => `${count} more`;\n\nfunction OverflowPanel<T>({\n hidden,\n offset,\n render,\n getKey,\n onEscape,\n}: {\n hidden: T[];\n offset: number;\n render: (item: T, index: number) => Renderable;\n getKey: (item: T, index: number) => string | number;\n onEscape: () => void;\n}) {\n const panelRef = useRef<HTMLUListElement>(null);\n useFocusTrap(panelRef, true);\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current;\n if (panel && !panel.contains(document.activeElement)) panel.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, []);\n\n const handleKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"Escape\") onEscape();\n };\n\n return (\n <ul\n ref={panelRef}\n className=\"sph-overflow-list__panel\"\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n {hidden.map((item, position) => (\n <li\n key={getKey(item, offset + position)}\n className=\"sph-overflow-list__panel-item\"\n >\n {node(render(item, offset + position))}\n </li>\n ))}\n </ul>\n );\n}\n\nexport function OverflowList<T>({\n items,\n renderItem,\n renderOverflow,\n renderOverflowItem,\n getKey = (_item, index) => index,\n minVisible = 0,\n collapseFrom = \"end\",\n overflowLabel = defaultLabel,\n className,\n ...props\n}: OverflowListProps<T>) {\n const rootRef = useRef<HTMLUListElement>(null);\n const measureRef = useRef<HTMLLIElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const chipRef = useRef<HTMLSpanElement>(null);\n const frameRef = useRef<number | null>(null);\n const [ready, setReady] = useState(false);\n const [visible, setVisible] = useState<number | null>(null);\n const [open, setOpen] = useState(false);\n const settings = useRef({ minVisible, collapseFrom });\n settings.current = { minVisible, collapseFrom };\n\n const measure = useCallback(() => {\n frameRef.current = null;\n const root = rootRef.current;\n const track = trackRef.current;\n if (!root || !track) return;\n const style = getComputedStyle(root);\n const available =\n root.clientWidth -\n (Number.parseFloat(style.paddingLeft) || 0) -\n (Number.parseFloat(style.paddingRight) || 0);\n const gap = Number.parseFloat(style.columnGap) || 0;\n const cells = Array.from(track.children);\n const sample = cells.pop();\n const widths = cells.map((cell) => cell.getBoundingClientRect().width);\n const { minVisible: floor, collapseFrom: from } = settings.current;\n setVisible(\n fitOverflowCount({\n widths: from === \"start\" ? widths.reverse() : widths,\n available,\n gap,\n reserve: sample?.getBoundingClientRect().width ?? 0,\n minVisible: floor,\n }),\n );\n }, []);\n\n useIsoLayoutEffect(() => {\n setReady(true);\n }, []);\n\n useIsoLayoutEffect(() => {\n if (ready) measure();\n }, [ready, items, minVisible, collapseFrom, measure]);\n\n useIsoLayoutEffect(() => {\n if (!ready) return;\n measureRef.current?.setAttribute(\"inert\", \"\");\n const schedule = () => {\n if (frameRef.current === null)\n frameRef.current = requestAnimationFrame(measure);\n };\n const cancel = () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n };\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", schedule);\n return () => {\n window.removeEventListener(\"resize\", schedule);\n cancel();\n };\n }\n const observer = new ResizeObserver(schedule);\n if (rootRef.current) observer.observe(rootRef.current);\n if (trackRef.current) observer.observe(trackRef.current);\n return () => {\n observer.disconnect();\n cancel();\n };\n }, [ready, measure]);\n\n const total = items.length;\n const shown = Math.min(visible ?? total, total);\n const hiddenCount = total - shown;\n const offset = collapseFrom === \"start\" ? 0 : shown;\n const hidden = items.slice(offset, offset + hiddenCount);\n const start = collapseFrom === \"start\" ? hiddenCount : 0;\n const label = overflowLabel(hiddenCount);\n\n useEffect(() => {\n if (hiddenCount === 0 && open) setOpen(false);\n }, [hiddenCount, open]);\n\n const focusTrigger = () => {\n chipRef.current?.closest(\"button\")?.focus();\n };\n\n const chipContent = (count: number, ref?: typeof chipRef) => (\n <span ref={ref} className=\"sph-overflow-list__chip\">\n <span className=\"sph-overflow-list__count\" aria-hidden=\"true\">\n +{count}\n </span>\n <span className=\"sph-overflow-list__label\">{overflowLabel(count)}</span>\n </span>\n );\n\n const more =\n hiddenCount > 0 ? (\n <li className=\"sph-overflow-list__more\">\n {renderOverflow ? (\n node(renderOverflow(hidden))\n ) : (\n <Popover\n className=\"sph-overflow-list__popover\"\n trigger={chipContent(hiddenCount, chipRef)}\n ariaLabel={label}\n placement={collapseFrom === \"start\" ? \"start\" : \"end\"}\n open={open}\n onOpenChange={setOpen}\n >\n <OverflowPanel\n hidden={hidden}\n offset={offset}\n render={renderOverflowItem ?? renderItem}\n getKey={getKey}\n onEscape={focusTrigger}\n />\n </Popover>\n )}\n </li>\n ) : null;\n\n return (\n <ul\n {...node(props)}\n ref={rootRef}\n className={cn(\"sph-overflow-list\", className)}\n data-collapse-from={collapseFrom}\n data-overflowing={hiddenCount > 0 || undefined}\n >\n {collapseFrom === \"start\" && more}\n {items.slice(start, start + shown).map((item, position) => (\n <li\n key={getKey(item, start + position)}\n className=\"sph-overflow-list__item\"\n >\n {node(renderItem(item, start + position))}\n </li>\n ))}\n {collapseFrom === \"end\" && more}\n {ready && (\n <li\n ref={measureRef}\n className=\"sph-overflow-list__measure\"\n aria-hidden=\"true\"\n >\n <div ref={trackRef} className=\"sph-overflow-list__track\">\n {items.map((item, index) => (\n <div\n key={getKey(item, index)}\n className=\"sph-overflow-list__item\"\n >\n {node(renderItem(item, index))}\n </div>\n ))}\n <div className=\"sph-overflow-list__item\">\n {renderOverflow\n ? node(renderOverflow(items))\n : chipContent(total)}\n </div>\n </div>\n </li>\n )}\n </ul>\n );\n}\n","import {\n ArrowUpRightIcon,\n CaretLeftIcon,\n CaretRightIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n type OverlaySide,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\n\nexport type CitationSource = {\n title: string;\n url?: string;\n site?: string;\n snippet?: string;\n favicon?: string;\n};\n\nexport type CitationProps = {\n sources: CitationSource[];\n index?: number;\n max?: number;\n placement?: OverlaySide;\n openDelay?: number;\n closeDelay?: number;\n className?: string;\n};\n\nexport function sourceSite(source: CitationSource): string | undefined {\n if (source.site) return source.site;\n if (!source.url) return undefined;\n try {\n return new URL(source.url).hostname.replace(/^www\\./, \"\");\n } catch {\n return undefined;\n }\n}\n\nexport function citationLabel(\n sources: CitationSource[],\n index: number,\n): string {\n const [first] = sources;\n if (!first) return \"\";\n const base = `Source ${index}: ${first.title}`;\n const rest = sources.length - 1;\n if (rest <= 0) return base;\n return `${base}, plus ${rest} more ${rest === 1 ? \"source\" : \"sources\"}`;\n}\n\ntype PointerLike = { pointerType?: string };\n\nexport function Citation({\n sources,\n index = 1,\n max = 1,\n placement = \"top\",\n openDelay = 160,\n closeDelay = 140,\n className,\n}: CitationProps) {\n const id = useId();\n const rootRef = useRef<HTMLSpanElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const timers = useRef<{ open?: number; close?: number }>({});\n const pinnedRef = useRef(false);\n const focusOnOpen = useRef(false);\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(0);\n const [focusTick, setFocusTick] = useState(0);\n const {\n present,\n state,\n ref: cardRef,\n } = usePresence<HTMLDivElement>(open, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, cardRef, present && portaled, {\n side: placement,\n align: \"start\",\n offset: 6,\n });\n\n const total = sources.length;\n const shown = Math.min(total, Math.max(1, Math.floor(max)));\n const hidden = total - shown;\n const current = sources[Math.min(active, total - 1)];\n\n const clearTimers = () => {\n if (timers.current.open !== undefined)\n window.clearTimeout(timers.current.open);\n if (timers.current.close !== undefined)\n window.clearTimeout(timers.current.close);\n timers.current = {};\n };\n\n const show = () => {\n clearTimers();\n if (!open) setActive(0);\n setOpen(true);\n };\n\n const hide = () => {\n clearTimers();\n pinnedRef.current = false;\n setOpen(false);\n };\n\n const requestOpen = () => {\n clearTimers();\n timers.current.open = window.setTimeout(show, openDelay);\n };\n\n const requestClose = () => {\n if (pinnedRef.current) return;\n clearTimers();\n timers.current.close = window.setTimeout(hide, closeDelay);\n };\n\n useEffect(() => clearTimers, []);\n\n useEffect(() => {\n if (!present || !portaled) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n const inside = cardRef.current?.contains(document.activeElement);\n hide();\n if (inside) triggerRef.current?.focus();\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !cardRef.current?.contains(target)\n )\n hide();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [cardRef, present, portaled]);\n\n useEffect(() => {\n if (!open || !present || !portaled || !focusOnOpen.current) return;\n focusOnOpen.current = false;\n cardRef.current\n ?.querySelector<HTMLElement>(\"a[href], button:not(:disabled)\")\n ?.focus();\n }, [cardRef, focusTick, open, present, portaled]);\n\n if (total === 0 || !current) return null;\n\n const handleBlur = (event: { relatedTarget: EventTarget | null }) => {\n const next = event.relatedTarget as Node | null;\n if (\n next &&\n (rootRef.current?.contains(next) || cardRef.current?.contains(next))\n )\n return;\n hide();\n };\n\n const handleClick = (event: { detail: number }) => {\n if (open && pinnedRef.current) {\n hide();\n return;\n }\n pinnedRef.current = true;\n if (event.detail === 0) {\n focusOnOpen.current = true;\n setFocusTick((value) => value + 1);\n }\n show();\n };\n\n const step = (delta: number) => {\n setActive((value) => (value + delta + total) % total);\n };\n\n const handleCardKeyDown = (event: {\n key: string;\n preventDefault(): void;\n }) => {\n if (total < 2) return;\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n step(1);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n step(-1);\n }\n };\n\n const site = sourceSite(current);\n const position = Math.min(active, total - 1);\n\n return (\n <span\n ref={rootRef}\n className={cn(\"sph-citation\", className)}\n data-open={open || undefined}\n onPointerEnter={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") requestOpen();\n }}\n onPointerLeave={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") requestClose();\n }}\n onBlur={handleBlur}\n >\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-citation__marker\"\n aria-label={citationLabel(sources, index)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? id : undefined}\n data-group={total > 1 || undefined}\n onFocus={requestOpen}\n onClick={handleClick}\n >\n {sources.slice(0, shown).map((source, offset) => (\n <span\n key={`${offset}-${source.title}`}\n className=\"sph-citation__number\"\n >\n {index + offset}\n </span>\n ))}\n {hidden > 0 && <span className=\"sph-citation__more\">+{hidden}</span>}\n </button>\n {present &&\n portaled &&\n createPortal(\n <div\n id={id}\n ref={cardRef}\n className=\"sph-citation__card\"\n data-state={state}\n role=\"dialog\"\n tabIndex={-1}\n aria-label={\n total > 1\n ? `Sources ${index} to ${index + total - 1}`\n : `Source ${index}`\n }\n onPointerEnter={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") clearTimers();\n }}\n onPointerLeave={(event: PointerLike) => {\n if (event.pointerType !== \"touch\") requestClose();\n }}\n onBlur={handleBlur}\n onKeyDown={handleCardKeyDown}\n >\n <div className=\"sph-citation__meta\">\n <span className=\"sph-citation__favicon\" aria-hidden=\"true\">\n {current.favicon ? (\n <img src={current.favicon} alt=\"\" width={14} height={14} />\n ) : (\n (site ?? current.title).charAt(0).toUpperCase()\n )}\n </span>\n <span className=\"sph-citation__site\">\n {site ?? `Source ${index + position}`}\n </span>\n <span className=\"sph-citation__index\">{index + position}</span>\n </div>\n {current.url ? (\n <a\n className=\"sph-citation__title\"\n href={current.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {current.title}\n <ArrowUpRightIcon\n className=\"sph-citation__external\"\n size={12}\n weight=\"bold\"\n aria-hidden=\"true\"\n />\n <span className=\"sph-citation__sr\">(opens in a new tab)</span>\n </a>\n ) : (\n <span className=\"sph-citation__title\">{current.title}</span>\n )}\n {current.snippet && (\n <p className=\"sph-citation__snippet\">{current.snippet}</p>\n )}\n {total > 1 && (\n <div className=\"sph-citation__pager\">\n <button\n type=\"button\"\n className=\"sph-citation__step\"\n aria-label=\"Previous source\"\n onClick={() => step(-1)}\n >\n <CaretLeftIcon size={12} weight=\"bold\" aria-hidden=\"true\" />\n </button>\n <span className=\"sph-citation__position\" aria-live=\"polite\">\n {position + 1} of {total}\n </span>\n <button\n type=\"button\"\n className=\"sph-citation__step\"\n aria-label=\"Next source\"\n onClick={() => step(1)}\n >\n <CaretRightIcon size={12} weight=\"bold\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n </div>,\n document.body,\n )}\n </span>\n );\n}\n","import { CaretRightIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { StatusMark, type StatusMarkState } from \"../../atoms/StatusMark\";\n\nexport type ToolCall = {\n id: string;\n name: string;\n title?: Renderable;\n state: StatusMarkState;\n input?: Renderable;\n output?: Renderable;\n duration?: number;\n};\n\nexport type ToolCallsProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n calls: ToolCall[];\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n label?: Renderable;\n};\n\nconst STATE_WORD: Record<StatusMarkState, string> = {\n idle: \"Queued\",\n running: \"Running\",\n progress: \"Running\",\n success: \"Done\",\n error: \"Failed\",\n};\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.max(0, Math.round(ms))}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n}\n\nconst isActive = (state: StatusMarkState) =>\n state === \"running\" || state === \"progress\";\n\nconst isSettled = (state: StatusMarkState) =>\n state === \"success\" || state === \"error\";\n\nfunction summarizeCalls(calls: ToolCall[]): StatusMarkState {\n if (calls.length === 0) return \"idle\";\n if (calls.some((call) => isActive(call.state))) return \"running\";\n if (calls.every((call) => isSettled(call.state))) {\n return calls.some((call) => call.state === \"error\") ? \"error\" : \"success\";\n }\n return calls.some((call) => isSettled(call.state)) ? \"running\" : \"idle\";\n}\n\nfunction announce(calls: ToolCall[]): string {\n const failed = calls.filter((call) => call.state === \"error\").length;\n if (calls.length === 1) {\n return `${calls[0].name} ${failed > 0 ? \"failed\" : \"finished\"}`;\n }\n const noun = `${calls.length} tools`;\n return failed > 0 ? `${failed} of ${noun} failed` : `Ran ${noun}`;\n}\n\nfunction totalDuration(calls: ToolCall[]): number | undefined {\n const timed = calls.filter((call) => call.duration !== undefined);\n if (timed.length === 0) return undefined;\n return timed.reduce((sum, call) => sum + (call.duration ?? 0), 0);\n}\n\nfunction latestCall(calls: ToolCall[]): ToolCall | undefined {\n for (let index = calls.length - 1; index >= 0; index -= 1) {\n if (isActive(calls[index].state)) return calls[index];\n }\n for (let index = calls.length - 1; index >= 0; index -= 1) {\n if (calls[index].state !== \"idle\") return calls[index];\n }\n return calls[calls.length - 1];\n}\n\nfunction ToolCallRow({ call, tag }: { call: ToolCall; tag: \"li\" | \"div\" }) {\n const [open, setOpen] = useState(false);\n const detailsId = `${useId()}-details`;\n const expandable = call.input !== undefined || call.output !== undefined;\n const Tag = tag as \"div\";\n\n const content = (\n <>\n <StatusMark state={call.state} label={STATE_WORD[call.state]} size=\"sm\" />\n <span className=\"sph-tool-calls__title\">\n {node(call.title ?? call.name)}\n </span>\n {call.title !== undefined && (\n <code className=\"sph-tool-calls__name\">{call.name}</code>\n )}\n {call.duration !== undefined && (\n <span className=\"sph-tool-calls__duration\">\n {formatDuration(call.duration)}\n </span>\n )}\n </>\n );\n\n return (\n <Tag\n className=\"sph-tool-calls__call\"\n data-state={call.state}\n data-open={expandable ? (open ? \"true\" : \"false\") : undefined}\n >\n {expandable ? (\n <button\n type=\"button\"\n className=\"sph-tool-calls__row\"\n aria-expanded={open}\n aria-controls={detailsId}\n onClick={() => setOpen(!open)}\n >\n {content}\n <span className=\"sph-tool-calls__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={11} weight=\"bold\" />\n </span>\n </button>\n ) : (\n <div className=\"sph-tool-calls__row\">{content}</div>\n )}\n {expandable && (\n <div className=\"sph-tool-calls__details\" id={detailsId}>\n <div className=\"sph-tool-calls__details-inner\">\n {call.input !== undefined && (\n <div className=\"sph-tool-calls__block\" data-kind=\"input\">\n <span className=\"sph-tool-calls__block-label\">Input</span>\n <pre className=\"sph-tool-calls__code\">{node(call.input)}</pre>\n </div>\n )}\n {call.output !== undefined && (\n <div className=\"sph-tool-calls__block\" data-kind=\"output\">\n <span className=\"sph-tool-calls__block-label\">Output</span>\n <pre className=\"sph-tool-calls__code\">{node(call.output)}</pre>\n </div>\n )}\n </div>\n </div>\n )}\n </Tag>\n );\n}\n\nexport function ToolCalls({\n calls,\n open,\n defaultOpen = false,\n onOpenChange,\n label,\n className,\n ...props\n}: ToolCallsProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const isOpen = open ?? uncontrolled;\n const listId = `${useId()}-list`;\n const state = summarizeCalls(calls);\n const settled = state === \"success\" || state === \"error\";\n const [announcement, setAnnouncement] = useState(\"\");\n const wasSettled = useRef(settled);\n const message = settled ? announce(calls) : \"\";\n\n useEffect(() => {\n if (settled && !wasSettled.current) setAnnouncement(message);\n if (!settled) setAnnouncement(\"\");\n wasSettled.current = settled;\n }, [settled, message]);\n\n const toggle = () => {\n const next = !isOpen;\n setUncontrolled(next);\n onOpenChange?.(next);\n };\n\n const status = (\n <span className=\"sph-tool-calls__status\" role=\"status\">\n {announcement}\n </span>\n );\n\n if (calls.length <= 1) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-tool-calls\", className)}\n data-layout=\"single\"\n data-status={state}\n >\n {calls[0] && <ToolCallRow call={calls[0]} tag=\"div\" />}\n {status}\n </div>\n );\n }\n\n const failed = calls.filter((call) => call.state === \"error\").length;\n const finished = calls.filter((call) => isSettled(call.state)).length;\n const total = totalDuration(calls);\n const latest = latestCall(calls);\n const summary =\n label !== undefined\n ? label\n : state === \"running\" && latest\n ? (latest.title ?? latest.name)\n : `Ran ${calls.length} tools`;\n const meta = settled\n ? [\n failed > 0 ? `${failed} failed` : undefined,\n total !== undefined ? formatDuration(total) : undefined,\n ].filter(Boolean)\n : [`${finished} of ${calls.length}`];\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-tool-calls\", className)}\n data-layout=\"group\"\n data-state={isOpen ? \"open\" : \"closed\"}\n data-status={state}\n >\n <button\n type=\"button\"\n className=\"sph-tool-calls__summary\"\n aria-expanded={isOpen}\n aria-controls={listId}\n onClick={toggle}\n >\n <StatusMark state={state} label={STATE_WORD[state]} size=\"sm\" />\n <span\n key={state === \"running\" && latest ? latest.id : \"summary\"}\n className=\"sph-tool-calls__summary-text\"\n >\n {node(summary)}\n </span>\n {meta.map((part) => (\n <span key={part} className=\"sph-tool-calls__meta\">\n {part}\n </span>\n ))}\n <span className=\"sph-tool-calls__chevron\" aria-hidden=\"true\">\n <CaretRightIcon size={11} weight=\"bold\" />\n </span>\n </button>\n <div className=\"sph-tool-calls__body\" id={listId}>\n <div className=\"sph-tool-calls__inner\">\n <ul className=\"sph-tool-calls__list\">\n {calls.map((call) => (\n <ToolCallRow key={call.id} call={call} tag=\"li\" />\n ))}\n </ul>\n </div>\n </div>\n {status}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { Button } from \"@/atoms/Button\";\nimport { Checkbox } from \"@/atoms/Checkbox\";\nimport { Kbd } from \"@/atoms/Kbd\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { StatusMark, type StatusMarkState } from \"../../atoms/StatusMark\";\n\nexport type PlanStep = {\n id: string;\n label: Renderable;\n detail?: Renderable;\n state?: StatusMarkState;\n};\n\nexport type PlanCardState = \"pending\" | \"approved\" | \"rejected\" | \"running\";\n\nexport type PlanCardProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"title\"\n> & {\n title: Renderable;\n description?: Renderable;\n steps: PlanStep[];\n editable?: boolean;\n onApprove: (steps: PlanStep[]) => void;\n onReject?: () => void;\n approveLabel?: Renderable;\n rejectLabel?: Renderable;\n state?: PlanCardState;\n hotkey?: boolean;\n autoFocus?: boolean;\n};\n\nconst STATE_LABEL: Record<PlanCardState, string> = {\n pending: \"\",\n approved: \"Approved\",\n running: \"Running\",\n rejected: \"Cancelled\",\n};\n\nconst STEP_WORD: Record<StatusMarkState, string> = {\n idle: \"Queued\",\n running: \"Running\",\n progress: \"Running\",\n success: \"Done\",\n error: \"Failed\",\n};\n\nconst TEXT_INPUT_EXEMPT = new Set([\n \"checkbox\",\n \"radio\",\n \"button\",\n \"submit\",\n \"reset\",\n \"range\",\n \"color\",\n \"file\",\n \"image\",\n]);\n\nfunction typingInto(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n if (target instanceof HTMLTextAreaElement) return true;\n if (target instanceof HTMLInputElement)\n return !TEXT_INPUT_EXEMPT.has(target.type);\n return false;\n}\n\nexport function PlanCard({\n title,\n description,\n steps,\n editable = false,\n onApprove,\n onReject,\n approveLabel = \"Run plan\",\n rejectLabel = \"Cancel\",\n state = \"pending\",\n hotkey = true,\n autoFocus = false,\n className,\n ...props\n}: PlanCardProps) {\n const baseId = useId();\n const titleId = `${baseId}-title`;\n const descriptionId = `${baseId}-description`;\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [excluded, setExcluded] = useState<string[]>([]);\n const [mac, setMac] = useState(false);\n const pending = state === \"pending\";\n const included = steps.filter((step) => !excluded.includes(step.id));\n const canApprove = pending && included.length > 0;\n\n const approve = () => {\n if (canApprove) onApprove(included);\n };\n const approveRef = useRef(approve);\n approveRef.current = approve;\n\n useEffect(() => {\n setMac(/Mac|iPhone|iPad/.test(navigator.userAgent));\n }, []);\n\n useEffect(() => {\n if (!autoFocus) return;\n rootRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-plan-card__approve\")\n ?.focus();\n }, [autoFocus]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root || !hotkey || !pending) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Enter\" || !(event.metaKey || event.ctrlKey)) return;\n if (typingInto(event.target)) return;\n event.preventDefault();\n approveRef.current();\n };\n root.addEventListener(\"keydown\", handleKeyDown);\n return () => root.removeEventListener(\"keydown\", handleKeyDown);\n }, [hotkey, pending]);\n\n const wasPending = useRef(pending);\n useEffect(() => {\n const root = rootRef.current;\n if (wasPending.current && !pending && root) {\n const active = document.activeElement;\n if (!active || active === document.body || root.contains(active)) {\n root.focus();\n }\n }\n wasPending.current = pending;\n }, [pending]);\n\n const toggle = (id: string) => {\n setExcluded((current) =>\n current.includes(id)\n ? current.filter((entry) => entry !== id)\n : [...current, id],\n );\n };\n\n const visible = pending ? steps : included;\n const done = included.filter((step) => step.state === \"success\").length;\n\n return (\n <div\n {...node(props)}\n ref={rootRef}\n role=\"group\"\n tabIndex={pending ? undefined : -1}\n aria-labelledby={titleId}\n aria-describedby={description !== undefined ? descriptionId : undefined}\n className={cn(\"sph-plan-card\", className)}\n data-state={state}\n data-editable={editable && pending ? \"true\" : undefined}\n >\n <div className=\"sph-plan-card__header\">\n <div className=\"sph-plan-card__heading\">\n <span className=\"sph-plan-card__title\" id={titleId}>\n {node(title)}\n </span>\n {description !== undefined && (\n <span className=\"sph-plan-card__description\" id={descriptionId}>\n {node(description)}\n </span>\n )}\n </div>\n <span className=\"sph-plan-card__status\" role=\"status\">\n {!pending && (\n <span className=\"sph-plan-card__badge\">{STATE_LABEL[state]}</span>\n )}\n </span>\n {state === \"running\" && (\n <span className=\"sph-plan-card__progress\">\n {done} of {included.length}\n </span>\n )}\n </div>\n\n {state !== \"rejected\" && (\n <ol className=\"sph-plan-card__steps\">\n {visible.map((step, index) => {\n const inputId = `${baseId}-step-${index}`;\n const detailId = `${inputId}-detail`;\n const isIncluded = !excluded.includes(step.id);\n const stepState = step.state ?? \"idle\";\n return (\n <li\n key={step.id}\n className=\"sph-plan-card__step\"\n data-included={isIncluded ? \"true\" : \"false\"}\n data-step-state={state === \"running\" ? stepState : undefined}\n >\n <span className=\"sph-plan-card__marker\">\n {editable && pending ? (\n <Checkbox\n id={inputId}\n size=\"sm\"\n checked={isIncluded}\n onChange={() => toggle(step.id)}\n aria-describedby={\n step.detail !== undefined ? detailId : undefined\n }\n />\n ) : state === \"running\" ? (\n <StatusMark\n state={stepState}\n label={STEP_WORD[stepState]}\n size=\"sm\"\n />\n ) : (\n <span className=\"sph-plan-card__number\" aria-hidden=\"true\">\n {index + 1}\n </span>\n )}\n </span>\n <span className=\"sph-plan-card__body\">\n {editable && pending ? (\n <label className=\"sph-plan-card__label\" htmlFor={inputId}>\n {node(step.label)}\n </label>\n ) : (\n <span className=\"sph-plan-card__label\">\n {node(step.label)}\n </span>\n )}\n {step.detail !== undefined && pending && (\n <span className=\"sph-plan-card__detail\" id={detailId}>\n {node(step.detail)}\n </span>\n )}\n </span>\n </li>\n );\n })}\n </ol>\n )}\n\n {pending && (\n <div className=\"sph-plan-card__footer\">\n {editable && (\n <span className=\"sph-plan-card__count\">\n {included.length} of {steps.length} steps\n </span>\n )}\n {onReject && (\n <Button variant=\"quiet\" size=\"sm\" onClick={onReject}>\n {node(rejectLabel)}\n </Button>\n )}\n <span className=\"sph-plan-card__action\">\n {hotkey && (\n <span className=\"sph-plan-card__shortcut\" aria-hidden=\"true\">\n <Kbd keys={[mac ? \"⌘\" : \"Ctrl\", \"↵\"]} />\n </span>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n className=\"sph-plan-card__approve\"\n disabled={!canApprove}\n aria-keyshortcuts={\n hotkey ? (mac ? \"Meta+Enter\" : \"Control+Enter\") : undefined\n }\n onClick={approve}\n >\n {node(approveLabel)}\n </Button>\n </span>\n </div>\n )}\n </div>\n );\n}\n","import { ArrowDownIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { useIsoLayoutEffect } from \"@/lib/overlay.js\";\nimport { motionDurationMs, usePresence } from \"@/lib/presence.js\";\n\nexport type ChatScrollerProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> & {\n children?: Renderable;\n itemCount?: number;\n newCount?: number;\n threshold?: number;\n ariaLabel?: string;\n jumpLabel?: string;\n contentClassName?: string;\n onPinnedChange?: (pinned: boolean) => void;\n};\n\nexport type ScrollMetrics = {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n};\n\nexport function distanceFromBottom(metrics: ScrollMetrics): number {\n return Math.max(\n 0,\n metrics.scrollHeight - metrics.scrollTop - metrics.clientHeight,\n );\n}\n\nexport function isNearBottom(\n metrics: ScrollMetrics,\n threshold: number,\n): boolean {\n return distanceFromBottom(metrics) <= Math.max(0, threshold);\n}\n\nexport function newMessagesText(count: number): string {\n if (count <= 0) return \"\";\n return `${count} new ${count === 1 ? \"message\" : \"messages\"}`;\n}\n\ntype TouchPoint = { touches: ArrayLike<{ clientY: number }> };\n\nconst UPWARD_KEYS = new Set([\"ArrowUp\", \"PageUp\", \"Home\"]);\n\nexport function ChatScroller({\n children,\n itemCount,\n newCount,\n threshold = 48,\n ariaLabel = \"Conversation\",\n jumpLabel = \"Jump to latest\",\n contentClassName,\n onPinnedChange,\n className,\n ...props\n}: ChatScrollerProps) {\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const pinnedRef = useRef(true);\n const jumpingRef = useRef(false);\n const thresholdRef = useRef(threshold);\n const onPinnedChangeRef = useRef(onPinnedChange);\n const lastItemCount = useRef(itemCount);\n const reportedPinned = useRef(true);\n const lastTop = useRef(0);\n const touchY = useRef<number | null>(null);\n const [pinned, setPinnedState] = useState(true);\n const [unread, setUnread] = useState(0);\n\n thresholdRef.current = threshold;\n onPinnedChangeRef.current = onPinnedChange;\n\n const count = pinned ? 0 : Math.max(0, newCount ?? unread);\n const {\n present,\n state,\n ref: jumpRef,\n } = usePresence<HTMLButtonElement>(!pinned, \"fast\");\n\n const setPinned = (next: boolean) => {\n pinnedRef.current = next;\n setPinnedState(next);\n if (next) setUnread(0);\n };\n\n const stickToBottom = () => {\n const viewport = viewportRef.current;\n if (!viewport || !pinnedRef.current) return;\n viewport.scrollTop = viewport.scrollHeight;\n };\n\n useIsoLayoutEffect(() => {\n stickToBottom();\n }, []);\n\n useEffect(() => {\n const viewport = viewportRef.current;\n const content = contentRef.current;\n if (!viewport || !content || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => {\n if (pinnedRef.current) jumpingRef.current = false;\n stickToBottom();\n });\n observer.observe(content);\n observer.observe(viewport);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n const previous = lastItemCount.current;\n lastItemCount.current = itemCount;\n if (itemCount === undefined || previous === undefined) return;\n if (!pinnedRef.current && itemCount > previous)\n setUnread((current) => current + itemCount - previous);\n }, [itemCount]);\n\n useEffect(() => {\n if (reportedPinned.current === pinned) return;\n reportedPinned.current = pinned;\n onPinnedChangeRef.current?.(pinned);\n }, [pinned]);\n\n const handleScroll = () => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const top = viewport.scrollTop;\n const movingDown = top > lastTop.current;\n lastTop.current = top;\n const atBottom = isNearBottom(viewport, thresholdRef.current);\n if (jumpingRef.current) {\n if (atBottom) jumpingRef.current = false;\n return;\n }\n if (pinnedRef.current) {\n if (!atBottom) setPinned(false);\n return;\n }\n if (atBottom && (movingDown || distanceFromBottom(viewport) <= 1))\n setPinned(true);\n };\n\n const release = () => {\n jumpingRef.current = false;\n const viewport = viewportRef.current;\n if (\n pinnedRef.current &&\n viewport &&\n viewport.scrollTop > 0 &&\n viewport.scrollHeight > viewport.clientHeight\n )\n setPinned(false);\n };\n\n const handleWheel = (event: { deltaY: number }) => {\n jumpingRef.current = false;\n if (event.deltaY < 0) release();\n };\n\n const handleTouchStart = (event: TouchPoint) => {\n jumpingRef.current = false;\n touchY.current = event.touches[0]?.clientY ?? null;\n };\n\n const handleTouchMove = (event: TouchPoint) => {\n const y = event.touches[0]?.clientY;\n if (touchY.current === null || y === undefined) return;\n if (y - touchY.current > 4) release();\n };\n\n const handleKeyDown = (event: {\n key: string;\n target: EventTarget | null;\n }) => {\n jumpingRef.current = false;\n if (event.target !== viewportRef.current) return;\n if (UPWARD_KEYS.has(event.key)) release();\n };\n\n const jumpToLatest = () => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const hadFocus = jumpRef.current === document.activeElement;\n const smooth = motionDurationMs(viewport, \"normal\") > 0;\n jumpingRef.current = distanceFromBottom(viewport) > 0;\n setPinned(true);\n if (typeof viewport.scrollTo === \"function\")\n viewport.scrollTo({\n top: viewport.scrollHeight,\n behavior: smooth ? \"smooth\" : \"auto\",\n });\n else viewport.scrollTop = viewport.scrollHeight;\n if (hadFocus) viewport.focus({ preventScroll: true });\n };\n\n const expanded = count > 0;\n const buttonName = expanded\n ? `${jumpLabel}, ${newMessagesText(count)}`\n : jumpLabel;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-chat-scroller\", className)}\n data-pinned={pinned || undefined}\n >\n <div\n ref={viewportRef}\n className=\"sph-chat-scroller__viewport\"\n role=\"log\"\n aria-label={ariaLabel}\n aria-live=\"off\"\n tabIndex={0}\n onScroll={handleScroll}\n onWheel={handleWheel}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onPointerDown={() => {\n jumpingRef.current = false;\n }}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={contentRef}\n className={cn(\"sph-chat-scroller__content\", contentClassName)}\n >\n {node(children)}\n </div>\n </div>\n {present && (\n <button\n type=\"button\"\n ref={jumpRef}\n className=\"sph-chat-scroller__jump\"\n data-state={state}\n data-expanded={expanded || undefined}\n aria-label={buttonName}\n onClick={jumpToLatest}\n >\n <ArrowDownIcon\n className=\"sph-chat-scroller__jump-icon\"\n size={14}\n weight=\"bold\"\n aria-hidden=\"true\"\n />\n <span className=\"sph-chat-scroller__jump-count\" aria-hidden=\"true\">\n <span className=\"sph-chat-scroller__jump-text\">\n {expanded ? `${count} new` : \"\"}\n </span>\n </span>\n </button>\n )}\n <span\n className=\"sph-chat-scroller__status\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {newMessagesText(count)}\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
|