@zovaris/sephiro 0.6.0 → 0.7.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 +2123 -107
- package/dist/index.css +2132 -105
- package/dist/index.d.ts +274 -4
- package/dist/index.js +2412 -312
- package/dist/index.js.map +1 -1
- package/dist/themes.css +11 -0
- package/package.json +6 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atoms/Badge/index.tsx","../src/lib/node.ts","../src/atoms/Button/index.tsx","../src/atoms/Spinner/index.tsx","../src/atoms/Checkbox/index.tsx","../src/atoms/IconButton/index.tsx","../src/atoms/Input/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/Alert/index.tsx","../src/molecules/Card/index.tsx","../src/molecules/Dialog/index.tsx","../src/molecules/Field/index.tsx","../src/molecules/FieldMessage/index.tsx","../src/molecules/Menu/index.tsx","../src/molecules/Popover/index.tsx","../src/molecules/RadioGroup/index.tsx","../src/molecules/Select/index.tsx","../src/molecules/Tabs/index.tsx","../src/molecules/Toast/index.tsx","../src/molecules/Toolbar/index.tsx","../src/molecules/Tooltip/index.tsx","../src/organisms/EmptyState/index.tsx","../src/organisms/Table/index.tsx"],"sourcesContent":["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","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 { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } 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 \"aria-busy\": ariaBusy,\n ...props\n}: ButtonProps) {\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 || loading}\n {...node(props)}\n aria-busy={ariaBusy ?? (loading || undefined)}\n >\n {loading && <Spinner size=\"sm\" />}\n <span className=\"sph-button__label\">{node(children)}</span>\n </button>\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 { 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 if (label === undefined) return control;\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 <span className=\"sph-checkbox__label\">{node(label)}</span>\n </label>\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } 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 ...props\n}: IconButtonProps) {\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 disabled={disabled || loading}\n >\n {loading ? <Spinner size={size === \"lg\" ? \"md\" : \"sm\"} /> : node(icon)}\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 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 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 <span className=\"sph-toggle__track\">\n <span className=\"sph-toggle__thumb\" />\n </span>\n </button>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.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 if (title === undefined && children === undefined) return null;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-alert\", className)}\n data-variant={variant}\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={onDismiss}\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 { 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 { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.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 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 className,\n}: DialogProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId = description ? `${id}-description` : undefined;\n const dialogRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const dialog = dialogRef.current;\n const focusable = () =>\n Array.from(\n dialog?.querySelectorAll<HTMLElement>(\n \"button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])\",\n ) ?? [],\n ).filter((element) => !element.hasAttribute(\"disabled\"));\n requestAnimationFrame(() => focusable()[0]?.focus());\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n return;\n }\n if (event.key !== \"Tab\") return;\n const elements = focusable();\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onClose, open]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"sph-dialog__backdrop\"\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 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 { cn } from \"cn\";\nimport { 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\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\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\">{node(children)}</div>\n {message !== undefined && message !== null && (\n <FieldMessage id={messageId} variant={messageType}>\n {node(message)}\n </FieldMessage>\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 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 { useEffect, useId, useRef, useState } from \"react\";\nimport 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 MenuProps = {\n trigger: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n label?: string;\n align?: \"start\" | \"end\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function Menu({\n trigger,\n items,\n onSelect,\n label = \"Open menu\",\n align = \"start\",\n disabled = false,\n className,\n}: MenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const [open, setOpen] = useState(false);\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 if (!rootRef.current?.contains(event.target as Node)) 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 handleItemKeyDown = (event: KeyboardActionEvent, index: number) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n rootRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-menu__trigger\")\n ?.focus();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n choose(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 <div id={menuId} ref={rootRef} className={cn(\"sph-menu\", className)}>\n <button\n type=\"button\"\n className=\"sph-menu__trigger\"\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n {node(trigger)}\n </button>\n {open && (\n <div className=\"sph-menu__content\" data-align={align} role=\"menu\">\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={() => choose(item)}\n onKeyDown={(event) => handleItemKeyDown(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\">\n {node(item.shortcut)}\n </span>\n )}\n </button>\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\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 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 className,\n}: PopoverProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const setOpen = (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\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: KeyboardActionEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-popover\", className)}\n data-open={isOpen || undefined}\n >\n <button\n type=\"button\"\n className=\"sph-popover__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? id : undefined}\n disabled={disabled}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={handleTriggerKeyDown}\n >\n {node(trigger)}\n </button>\n {isOpen && (\n <div\n id={id}\n className=\"sph-popover__content\"\n data-placement={placement}\n role=\"dialog\"\n aria-label={ariaLabel}\n >\n {node(children)}\n </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 { CaretDownIcon, CaretUpIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, 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 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 selectedIndex = options.findIndex((option) => option.value === value);\n const firstEnabled = options.findIndex((option) => !option.disabled);\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : firstEnabled,\n );\n\n useEffect(() => {\n if (!open) return;\n const close = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) 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 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 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 {open ? (\n <CaretUpIcon className=\"sph-select__caret\" aria-hidden=\"true\" />\n ) : (\n <CaretDownIcon className=\"sph-select__caret\" aria-hidden=\"true\" />\n )}\n </button>\n\n {open && (\n <div id={listboxId} role=\"listbox\" className=\"sph-select__listbox\">\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 )}\n </div>\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 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, 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","import { cn } from \"cn\";\nimport { useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\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 function Tooltip({\n content,\n children,\n side = \"top\",\n delay = 400,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [visible, setVisible] = useState(false);\n const show = () => {\n if (disabled) return;\n timerRef.current = setTimeout(() => setVisible(true), delay);\n };\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n };\n\n return (\n <span\n className={cn(\"sph-tooltip\", className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <span\n className=\"sph-tooltip__trigger\"\n aria-describedby={visible ? id : undefined}\n >\n {node(children)}\n </span>\n <span\n id={id}\n className=\"sph-tooltip__content\"\n data-side={side}\n data-visible={visible || undefined}\n role=\"tooltip\"\n hidden={!visible}\n >\n {node(content)}\n </span>\n </span>\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 { TableHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\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};\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 density?: \"compact\" | \"comfortable\";\n striped?: boolean;\n stickyHeader?: boolean;\n className?: string;\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 density = \"comfortable\",\n striped = false,\n stickyHeader = false,\n className,\n ...props\n}: TableProps<Row>) {\n return (\n <div className={cn(\"sph-table-wrap\", className)}>\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 >\n {caption !== undefined && <caption>{node(caption)}</caption>}\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n data-align={column.align ?? \"start\"}\n style={{ width: column.width }}\n >\n {node(column.label)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td className=\"sph-table__empty\" colSpan={columns.length}>\n {node(emptyMessage)}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr key={rowKey ? String(row[rowKey]) : rowIndex}>\n {columns.map((column) => (\n <td key={column.key} data-align={column.align ?? \"start\"}>\n {node(\n column.render\n ? column.render(row, rowIndex)\n : row[column.key],\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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","names":["cn","cn","jsx","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","CheckIcon","cn","jsx","jsxs","CheckIcon","cn","cn","jsx","jsxs","cn","XIcon","cn","useId","jsx","jsxs","useId","cn","XIcon","cn","useId","cn","jsx","cn","jsx","jsxs","useId","cn","cn","useEffect","useId","useRef","jsx","jsxs","useRef","useId","useEffect","cn","cn","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","useEffect","cn","cn","useId","jsx","jsxs","useId","cn","CheckIcon","cn","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","firstEnabled","useState","useEffect","cn","CheckIcon","cn","useId","useState","jsx","jsxs","useId","useState","cn","CheckIcon","InfoIcon","WarningIcon","XIcon","cn","useEffect","jsx","jsx","CheckIcon","InfoIcon","WarningIcon","XIcon","useEffect","cn","cn","jsx","jsxs","cn","cn","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","cn","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn"]}
|
|
1
|
+
{"version":3,"sources":["../src/atoms/Avatar/index.tsx","../src/lib/node.ts","../src/atoms/Badge/index.tsx","../src/atoms/Button/index.tsx","../src/atoms/Spinner/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/lib/presence.ts","../src/molecules/Alert/index.tsx","../src/molecules/AvatarGroup/index.tsx","../src/molecules/Card/index.tsx","../src/molecules/Collapsible/index.tsx","../src/molecules/Combobox/index.tsx","../src/lib/filter.ts","../src/lib/highlight.tsx","../src/lib/overlay.ts","../src/molecules/Dialog/index.tsx","../src/lib/focus.ts","../src/molecules/Drawer/index.tsx","../src/molecules/Field/index.tsx","../src/molecules/FieldMessage/index.tsx","../src/molecules/HoverCard/index.tsx","../src/molecules/Menu/index.tsx","../src/molecules/Popover/index.tsx","../src/molecules/RadioGroup/index.tsx","../src/molecules/Select/index.tsx","../src/molecules/Tabs/index.tsx","../src/molecules/Toast/index.tsx","../src/molecules/Toolbar/index.tsx","../src/molecules/Tooltip/index.tsx","../src/organisms/CommandPalette/index.tsx","../src/organisms/EmptyState/index.tsx","../src/organisms/MagneticDropzone/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/index.tsx"],"sourcesContent":["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","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 { 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 { ButtonHTMLAttributes } 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 \"aria-busy\": ariaBusy,\n ...props\n}: ButtonProps) {\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 || loading}\n {...node(props)}\n aria-busy={ariaBusy ?? (loading || undefined)}\n >\n {loading && <Spinner size=\"sm\" />}\n <span className=\"sph-button__label\">{node(children)}</span>\n </button>\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 { 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 if (label === undefined) return control;\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 <span className=\"sph-checkbox__label\">{node(label)}</span>\n </label>\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } 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 ...props\n}: IconButtonProps) {\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 disabled={disabled || loading}\n >\n {loading ? <Spinner size={size === \"lg\" ? \"md\" : \"sm\"} /> : node(icon)}\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 { 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={determinate ? { width: `${clamped}%` } : undefined}\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 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 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 { 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, \"fast\");\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 { 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 { 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","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","/**\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 // First character landing on the very start is the strongest signal.\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 // Prefer shorter haystacks when the score is otherwise equal.\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 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\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 // Go fixed first: as a static block inside the portal the content\n // would measure viewport-wide. Fixed sizes shrink-to-fit, and layout\n // sizes ignore the entrance animation's transform.\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 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 { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId } from \"react\";\nimport { useFocusTrap } 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 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 className,\n}: DialogProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId = description ? `${id}-description` : undefined;\n const { present, state, ref: dialogRef } = usePresence<HTMLElement>(open);\n\n useFocusTrap(dialogRef, open);\n\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [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 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 type { RefObject } from \"react\";\nimport { useEffect } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n \"button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])\";\n\nfunction focusable(container: HTMLElement | null): HTMLElement[] {\n return Array.from(\n container?.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR) ?? [],\n ).filter((element) => !element.hasAttribute(\"disabled\"));\n}\n\n/**\n * Keeps keyboard focus inside `ref` while `active`:\n *\n * - on activation, focus lands on `initial` (or the first focusable node),\n * - Tab and Shift+Tab cycle within the container afterwards.\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>,\n): void {\n useEffect(() => {\n if (!active) return;\n requestAnimationFrame(() => {\n const target = initial?.current ?? focusable(ref.current)[0];\n target?.focus();\n });\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Tab\") return;\n const elements = focusable(ref.current);\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [active, initial, ref]);\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId } from \"react\";\nimport { useFocusTrap } 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 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 className,\n}: DrawerProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId = description ? `${id}-description` : undefined;\n const { present, state, ref: drawerRef } = usePresence<HTMLElement>(open);\n\n useFocusTrap(drawerRef, open);\n\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [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 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 { 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\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\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\">{node(children)}</div>\n {message !== undefined && message !== null && (\n <FieldMessage id={messageId} variant={messageType}>\n {node(message)}\n </FieldMessage>\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 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 { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport {\n type OverlaySide,\n useOverlayPosition,\n usePortaled,\n} from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\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 className?: string;\n};\n\nexport function HoverCard({\n trigger,\n children,\n openDelay = 180,\n closeDelay = 140,\n placement = \"bottom\",\n ariaLabel = \"Hover card\",\n className,\n}: HoverCardProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const timers = useRef<{ open?: number; close?: number }>({});\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 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 useEffect(() => clearTimers, []);\n\n useEffect(() => {\n if (!present || !portaled) return;\n const closeNow = () => {\n clearTimers();\n setOpen(false);\n };\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") closeNow();\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 /* Structural on purpose: React's FocusEvent and Preact's TargetedFocusEvent\n both carry relatedTarget but do not share a type. */\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 clearTimers();\n setOpen(false);\n };\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 <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-hover-card__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? id : undefined}\n onFocus={requestOpen}\n >\n {node(trigger)}\n </button>\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={requestClose}\n onBlur={handleBlur}\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 { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.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 MenuProps = {\n trigger: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n label?: string;\n align?: \"start\" | \"end\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function Menu({\n trigger,\n items,\n onSelect,\n label = \"Open menu\",\n align = \"start\",\n disabled = false,\n className,\n}: MenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuId = useId();\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 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 handleItemKeyDown = (event: KeyboardActionEvent, index: number) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n rootRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-menu__trigger\")\n ?.focus();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n choose(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 <div id={menuId} ref={rootRef} className={cn(\"sph-menu\", className)}>\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-menu__trigger\"\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? `${menuId}-menu` : undefined}\n disabled={disabled}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n {node(trigger)}\n </button>\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 >\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={() => choose(item)}\n onKeyDown={(event) => handleItemKeyDown(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\">\n {node(item.shortcut)}\n </span>\n )}\n </button>\n ),\n )}\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 { useOverlayPosition, usePortaled } from \"@/lib/overlay.js\";\nimport { usePresence } from \"@/lib/presence.js\";\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 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 className,\n}: PopoverProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const {\n present,\n state,\n ref: contentRef,\n } = usePresence<HTMLDivElement>(isOpen, \"fast\");\n const portaled = usePortaled();\n useOverlayPosition(triggerRef, contentRef, present && portaled, {\n side: \"bottom\",\n align: placement,\n offset: 6,\n });\n const setOpen = (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\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\") setOpen(false);\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: KeyboardActionEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-popover\", className)}\n data-open={isOpen || undefined}\n >\n <button\n type=\"button\"\n ref={triggerRef}\n className=\"sph-popover__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? id : undefined}\n disabled={disabled}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={handleTriggerKeyDown}\n >\n {node(trigger)}\n </button>\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 >\n {node(children)}\n </div>,\n document.body,\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 { CaretDownIcon, CaretUpIcon, 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 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\n className=\"sph-select__caret\"\n style={{ transform: open ? \"rotate(180deg)\" : undefined }}\n aria-hidden=\"true\"\n />\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 { 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, 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","import { cn } from \"cn\";\nimport { useId, useRef, useState } 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\";\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 function Tooltip({\n content,\n children,\n side = \"top\",\n delay = 400,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [visible, setVisible] = useState(false);\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 const show = () => {\n if (disabled) return;\n timerRef.current = setTimeout(() => setVisible(true), delay);\n };\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n };\n\n return (\n <span\n className={cn(\"sph-tooltip\", className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <span\n ref={triggerRef}\n className=\"sph-tooltip__trigger\"\n aria-describedby={visible ? id : undefined}\n >\n {node(children)}\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 role=\"tooltip\"\n >\n {node(content)}\n </span>,\n document.body,\n )}\n </span>\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 { useIsoLayoutEffect, usePortaled } 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: true. */\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 /* --- data ------------------------------------------------------------- */\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 /* --- behaviour --------------------------------------------------------- */\n\n const close = () => onOpenChange(false);\n\n const back = () => {\n if (query) setQuery(\"\");\n else if (path.length > 0) setPath(path.slice(0, -1));\n else close();\n };\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 /* --- effects ----------------------------------------------------------- */\n\n useEffect(() => {\n if (!open) {\n setPath([]);\n setQuery(\"\");\n setActive(0);\n }\n }, [open]);\n\n /*\n * `spellcheck` is an enumerated attribute: React would set the IDL\n * property, Preact drops a boolean prop — the attribute itself is the\n * only spelling both renderers honour.\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 /* Sliding active pill: measure the active option and glide there. */\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 /* Height morph: the panel glides between levels and filter results. */\n useIsoLayoutEffect(() => {\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, \"fast\");\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-standard)`;\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 /* Level changes pulse the panel and lift the list out of a dim. */\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 /* --- render ------------------------------------------------------------ */\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 } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\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 /** Forwarded to the hidden file input, e.g. \"image/*,.pdf\". */\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n className?: string;\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 accept,\n multiple = true,\n disabled = false,\n className,\n ...props\n}: MagneticDropzoneProps) {\n const zoneRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = useState(false);\n\n const pull = (event: { clientX: number; clientY: number }) => {\n const zone = zoneRef.current;\n if (!zone) return;\n const rect = zone.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 zone.style.setProperty(\"--sph-pull-x\", `${(x * 10).toFixed(1)}px`);\n zone.style.setProperty(\"--sph-pull-y\", `${(y * 8).toFixed(1)}px`);\n };\n\n const reset = () => {\n const zone = zoneRef.current;\n if (!zone) return;\n zone.style.setProperty(\"--sph-pull-x\", \"0px\");\n zone.style.setProperty(\"--sph-pull-y\", \"0px\");\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\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 if (disabled) return;\n event.preventDefault();\n setDragging(false);\n reset();\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (files.length > 0) onFiles?.(multiple ? files : files.slice(0, 1));\n };\n\n const openPicker = () => {\n if (!disabled) inputRef.current?.click();\n };\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 onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={openPicker}\n >\n <div className=\"sph-dropzone__content\">\n {node(\n dragging && activeContent !== undefined ? activeContent : children,\n )}\n </div>\n <input\n ref={inputRef}\n className=\"sph-dropzone__input\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n aria-hidden=\"true\"\n tabIndex={-1}\n disabled={disabled}\n onChange={(event) => {\n const files = Array.from(event.currentTarget.files ?? []);\n if (files.length > 0) onFiles?.(multiple ? files : files.slice(0, 1));\n event.currentTarget.value = \"\";\n }}\n />\n </div>\n );\n}\n","import { cn } from \"cn\";\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 /** Header label. Default: \"Reasoning\". */\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={{ animationDelay: `${index * 26}ms` }}\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 /* capture may already be gone on pointercancel */\n }\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","import { cn } from \"cn\";\nimport type { TableHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\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};\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 density?: \"compact\" | \"comfortable\";\n striped?: boolean;\n stickyHeader?: boolean;\n className?: string;\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 density = \"comfortable\",\n striped = false,\n stickyHeader = false,\n className,\n ...props\n}: TableProps<Row>) {\n return (\n <div className={cn(\"sph-table-wrap\", className)}>\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 >\n {caption !== undefined && <caption>{node(caption)}</caption>}\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n data-align={column.align ?? \"start\"}\n style={{ width: column.width }}\n >\n {node(column.label)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td className=\"sph-table__empty\" colSpan={columns.length}>\n {node(emptyMessage)}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr key={rowKey ? String(row[rowKey]) : rowIndex}>\n {columns.map((column) => (\n <td key={column.key} data-align={column.align ?? \"start\"}>\n {node(\n column.render\n ? column.render(row, rowIndex)\n : row[column.key],\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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","names":["cn","jsx","cn","cn","cn","jsx","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","jsxs","cn","useState","CheckIcon","cn","useEffect","useRef","useState","jsx","jsxs","CheckIcon","useRef","useState","useEffect","cn","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn","cn","useId","useState","jsx","jsxs","useState","useId","cn","CheckIcon","XIcon","cn","useEffect","useId","useRef","useState","jsx","useEffect","useRef","useState","jsx","jsxs","useId","useRef","useState","useEffect","cn","XIcon","CheckIcon","XIcon","cn","useEffect","useId","useEffect","jsx","jsxs","useId","useEffect","cn","XIcon","XIcon","cn","useEffect","useId","jsx","jsxs","useId","useEffect","cn","XIcon","cn","useId","cn","jsx","cn","jsx","jsxs","useId","cn","cn","useEffect","useId","useRef","useState","createPortal","jsx","jsxs","useId","useRef","useState","useEffect","cn","createPortal","cn","useEffect","useId","useRef","useState","createPortal","jsx","jsxs","useRef","useId","useState","useEffect","cn","createPortal","cn","useEffect","useId","useRef","useState","createPortal","jsx","jsxs","useId","useRef","useState","useEffect","cn","createPortal","cn","useId","jsx","jsxs","useId","cn","CaretDownIcon","CheckIcon","cn","useEffect","useId","useRef","useState","createPortal","jsx","jsxs","useId","useRef","firstEnabled","useState","useEffect","cn","CaretDownIcon","createPortal","CheckIcon","cn","useId","useState","jsx","jsxs","useId","useState","cn","CheckIcon","InfoIcon","WarningIcon","XIcon","cn","useEffect","jsx","jsx","CheckIcon","InfoIcon","WarningIcon","XIcon","useEffect","cn","cn","jsx","jsxs","cn","cn","useId","useRef","useState","createPortal","jsx","jsxs","useId","useRef","useState","cn","createPortal","CaretRightIcon","MagnifyingGlassIcon","cn","useEffect","useId","useMemo","useRef","useState","createPortal","jsx","jsxs","readableLabel","resolveActive","useId","useRef","useState","useMemo","useEffect","createPortal","cn","CaretRightIcon","MagnifyingGlassIcon","cn","jsx","jsxs","cn","cn","useRef","useState","jsx","jsxs","useRef","useState","cn","cn","jsx","jsxs","cn","cn","useMemo","useRef","useState","jsx","clamp","useRef","useState","useMemo","cn","cn","useId","useState","jsx","jsxs","useId","useState","cn","cn","jsx","cn","cn","jsx","jsxs","cn"]}
|