krts.ui 0.0.0-stage → 0.1.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/README.md +151 -2
- package/dist/index.cjs +2334 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +715 -0
- package/dist/index.d.ts +715 -0
- package/dist/index.js +2293 -0
- package/dist/index.js.map +1 -0
- package/dist/krts.css +2 -0
- package/package.json +82 -4
- package/src/styles/build.css +4 -0
- package/src/styles/tailwind.css +3 -0
- package/src/styles/theme.css +152 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/cn.ts","../src/lib/dom-events.ts","../src/lib/config.tsx","../src/hooks/useGesture.ts","../src/hooks/usePerceived.ts","../src/hooks/useAnimatedWidth.ts","../src/components/Button.tsx","../src/components/Spinner.tsx","../src/components/HoldButton.tsx","../src/components/icons.tsx","../src/components/CopyButton.tsx","../src/components/GestureArea.tsx","../src/components/ToggleButton.tsx","../src/components/Menu.tsx","../src/components/Popover.tsx","../src/components/DropdownButton.tsx","../src/components/Tooltip.tsx","../src/components/Field.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/Switch.tsx","../src/components/Slider.tsx","../src/components/Select.tsx","../src/components/Dialog.tsx","../src/components/Tabs.tsx","../src/components/Progress.tsx","../src/components/Disclosure.tsx","../src/components/Toast.tsx","../src/components/Display.tsx"],"sourcesContent":["// Utilities\nexport { cn, composeTw, focusRing } from './lib/cn';\nexport { KRTS_EVENTS, dispatchKrtsEvent, type KrtsEventName } from './lib/dom-events';\nexport { KrtsProvider, useKrtsConfig, type KrtsConfig, type OverlayAnimation } from './lib/config';\n\n// Hooks\nexport {\n useGesture,\n useGestureHandlers,\n type GestureOptions,\n type GesturePointerType,\n type HoldGestureEvent,\n type SwipeDirection,\n type SwipeGestureEvent,\n type TapGestureEvent,\n type UseGestureResult,\n} from './hooks/useGesture';\nexport { usePerceivedProgress, usePrefersReducedMotion, useSmoothPending } from './hooks/usePerceived';\nexport { useAnimatedWidth, type AnimatedWidthOptions } from './hooks/useAnimatedWidth';\n\n// Components\nexport { Button, buttonStyles, type ButtonProps, type ButtonSize, type ButtonVariant } from './components/Button';\nexport { HoldButton, type HoldButtonProps, type HoldButtonVariant } from './components/HoldButton';\nexport { CopyButton, type CopyButtonProps } from './components/CopyButton';\nexport { GestureArea, type GestureAreaProps } from './components/GestureArea';\nexport { Spinner, type SpinnerProps } from './components/Spinner';\nexport { ToggleButton, SegmentedControl, Segment, type ToggleButtonProps, type SegmentedControlProps } from './components/ToggleButton';\nexport {\n DropdownButton,\n SplitButton,\n type DropdownButtonProps,\n type SplitButtonProps,\n} from './components/DropdownButton';\nexport {\n Menu,\n MenuItem,\n MenuSection,\n MenuSeparator,\n MenuTrigger,\n SubmenuTrigger,\n type MenuItemProps,\n type MenuProps,\n type MenuSectionProps,\n} from './components/Menu';\nexport { Popover, floatingMotion, floatingSurface, type PopoverProps } from './components/Popover';\nexport { Tooltip, TooltipTrigger, WithTooltip, type TooltipProps, type TooltipTriggerProps } from './components/Tooltip';\nexport {\n Description,\n FieldError,\n Input,\n Label,\n NumberField,\n SearchField,\n TextAreaField,\n TextField,\n inputFrame,\n type NumberFieldProps,\n type SearchFieldProps,\n type TextAreaFieldProps,\n type TextFieldProps,\n} from './components/Field';\nexport { Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps } from './components/Checkbox';\nexport { Radio, RadioGroup, type RadioGroupProps } from './components/Radio';\nexport { Switch, type SwitchProps } from './components/Switch';\nexport { Slider, type SliderProps } from './components/Slider';\nexport { Select, SelectItem, type SelectProps } from './components/Select';\nexport { AlertDialog, Dialog, DialogTrigger, Drawer, Modal, type AlertDialogProps, type DialogProps, type DrawerProps, type ModalProps } from './components/Dialog';\nexport { Tab, TabList, TabPanel, Tabs, type TabProps, type TabsProps } from './components/Tabs';\nexport { Meter, ProgressBar, type MeterProps, type ProgressBarProps } from './components/Progress';\nexport { Accordion, Disclosure, type DisclosureProps } from './components/Disclosure';\nexport { Toaster, toast, type ToastAction, type ToastOptions, type ToasterProps, type ToastType } from './components/Toast';\nexport {\n Avatar,\n Badge,\n Card,\n CardHeader,\n Kbd,\n Link,\n Separator,\n Skeleton,\n type AvatarProps,\n type BadgeProps,\n type SkeletonProps,\n} from './components/Display';\nexport * from './components/icons';\n","import { clsx, type ClassValue } from 'clsx';\nimport { composeRenderProps } from 'react-aria-components';\nimport { twMerge } from 'tailwind-merge';\n\n/** Merge class names, letting later Tailwind utilities win over earlier ones. */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Merge a component's base classes with a React Aria `className` prop,\n * which may be a string or a render-prop function of the component state.\n */\nexport function composeTw<T>(\n className: string | ((v: T) => string) | undefined,\n tw: string | ((v: T) => string),\n): string | ((v: T) => string) {\n return composeRenderProps(className, (cls, state) =>\n cn(typeof tw === 'function' ? tw(state) : tw, cls),\n );\n}\n\n/** Focus ring shared by every interactive control. */\nexport const focusRing =\n 'outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus';\n","/**\n * Names of the DOM CustomEvents krts.ui dispatches. They bubble, so\n * non-React code can listen with `el.addEventListener('krts:doubletap', …)`.\n */\nexport const KRTS_EVENTS = {\n singleTap: 'krts:singletap',\n doubleTap: 'krts:doubletap',\n multiTap: 'krts:multitap',\n holdStart: 'krts:holdstart',\n hold: 'krts:hold',\n holdTick: 'krts:holdtick',\n holdEnd: 'krts:holdend',\n holdCancel: 'krts:holdcancel',\n swipe: 'krts:swipe',\n confirm: 'krts:confirm',\n} as const;\n\nexport type KrtsEventName = (typeof KRTS_EVENTS)[keyof typeof KRTS_EVENTS];\n\nexport function dispatchKrtsEvent<D>(target: EventTarget | null | undefined, name: KrtsEventName, detail: D) {\n if (!target || typeof CustomEvent === 'undefined') return;\n target.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n}\n","import { createContext, useContext, type ReactNode } from 'react';\n\n/** How floating menus (Menu, Select, DropdownButton, Popover) appear. */\nexport type OverlayAnimation = 'fade' | 'scale' | 'none';\n\nexport interface KrtsConfig {\n /**\n * Default animation for menus, selects and popovers.\n * `'fade'` (default) is a quick opacity fade — calm enough for dashboards\n * where menus open dozens of times a day. `'scale'` grows the menu out of\n * its trigger. `'none'` shows it instantly.\n */\n menuAnimation: OverlayAnimation;\n}\n\nconst defaults: KrtsConfig = { menuAnimation: 'fade' };\nconst KrtsContext = createContext<KrtsConfig>(defaults);\n\n/** Optional. Sets app-wide defaults; any component prop still wins. */\nexport function KrtsProvider({ children, ...config }: Partial<KrtsConfig> & { children: ReactNode }) {\n const parent = useContext(KrtsContext);\n return <KrtsContext.Provider value={{ ...parent, ...config }}>{children}</KrtsContext.Provider>;\n}\n\nexport function useKrtsConfig(): KrtsConfig {\n return useContext(KrtsContext);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DOMAttributes, PointerEvent as ReactPointerEvent } from 'react';\nimport { mergeProps, usePress, type PressEvent, type PressEvents } from 'react-aria';\nimport { dispatchKrtsEvent, KRTS_EVENTS } from '../lib/dom-events';\n\nexport type GesturePointerType = PressEvent['pointerType'];\n\nexport interface TapGestureEvent {\n type: 'singletap' | 'doubletap' | 'multitap';\n /** Number of taps in the sequence (1 = single, 2 = double, …). */\n count: number;\n pointerType: GesturePointerType;\n target: Element;\n}\n\nexport interface HoldGestureEvent {\n type: 'holdstart' | 'hold' | 'holdtick' | 'holdend' | 'holdcancel';\n /** Milliseconds since the press started. */\n duration: number;\n /** Whole seconds held (handy for `hold(sec)`-style logic). */\n seconds: number;\n /** 0 → 1 progress toward `holdDuration`. */\n progress: number;\n pointerType: GesturePointerType;\n target: Element;\n}\n\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down';\n\nexport interface SwipeGestureEvent {\n type: 'swipe';\n direction: SwipeDirection;\n /** Distance travelled along the dominant axis, in px. */\n distance: number;\n /** px / ms along the dominant axis. */\n velocity: number;\n target: Element;\n}\n\nexport interface GestureOptions {\n /** Fires once a tap is confirmed *not* to be part of a double/multi tap. */\n onSingleTap?: (e: TapGestureEvent) => void;\n /** Fires when two taps land within `multiTapDelay`. */\n onDoubleTap?: (e: TapGestureEvent) => void;\n /** Fires at the end of every tap sequence with the final `count`. */\n onMultiTap?: (e: TapGestureEvent) => void;\n /** Highest tap count to wait for when `onMultiTap` is used. Default 3. */\n maxTaps?: number;\n /** Max gap between taps in a sequence, ms. Default 250. */\n multiTapDelay?: number;\n\n /** Press began; a hold is now possible. */\n onHoldStart?: (e: HoldGestureEvent) => void;\n /** Held for `holdDuration` ms. A hold never also counts as a tap. */\n onHold?: (e: HoldGestureEvent) => void;\n /** Fires every `holdTickInterval` ms while held — e.g. at 1s, 2s, 3s. */\n onHoldTick?: (e: HoldGestureEvent) => void;\n /** Called every animation frame with 0 → 1 progress while held. */\n onHoldProgress?: (progress: number) => void;\n /** Released after `onHold` fired. */\n onHoldEnd?: (e: HoldGestureEvent) => void;\n /** Released (or interrupted) before `holdDuration`. */\n onHoldCancel?: (e: HoldGestureEvent) => void;\n /** ms before `onHold` fires. Default 500. */\n holdDuration?: number;\n /** ms between `onHoldTick` calls. Default 1000. */\n holdTickInterval?: number;\n\n /** Quick flick or long drag on touch/pen/mouse. */\n onSwipe?: (e: SwipeGestureEvent) => void;\n /** Minimum travel for a swipe, px. Default 40. */\n swipeThreshold?: number;\n /** A flick faster than this (px/ms) counts even under the threshold. Default 0.11. */\n swipeVelocity?: number;\n\n /** Movement (px) after which a press stops counting as a tap or hold. Default 10. */\n moveTolerance?: number;\n /** Also dispatch bubbling `krts:*` DOM CustomEvents. Default true. */\n dispatchDomEvents?: boolean;\n isDisabled?: boolean;\n}\n\nexport interface GestureState {\n isPressed: boolean;\n isHolding: boolean;\n /** True once `onHold` has fired during the current press. */\n didHold: boolean;\n}\n\ninterface Internal {\n taps: number;\n tapTimer: ReturnType<typeof setTimeout> | undefined;\n lastTarget: Element | null;\n lastPointer: GesturePointerType;\n pressStart: number;\n holdTimer: ReturnType<typeof setTimeout> | undefined;\n tickTimer: ReturnType<typeof setInterval> | undefined;\n raf: number | undefined;\n holdFired: boolean;\n holdSettled: boolean;\n pressActive: boolean;\n moved: boolean;\n pointerId: number | null;\n origin: { x: number; y: number; t: number } | null;\n}\n\nconst now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());\n\n/**\n * Low-level gesture engine. Returns React Aria press handlers (so it\n * composes with any RAC component that takes `onPressStart`/`onPress`…)\n * and pointer handlers for movement-based gestures (swipe, tap cancel).\n */\nexport function useGestureHandlers(options: GestureOptions) {\n const opts = useRef(options);\n opts.current = options;\n\n const s = useRef<Internal>({\n taps: 0,\n tapTimer: undefined,\n lastTarget: null,\n lastPointer: 'mouse',\n pressStart: 0,\n holdTimer: undefined,\n tickTimer: undefined,\n raf: undefined,\n holdFired: false,\n holdSettled: false,\n pressActive: false,\n moved: false,\n pointerId: null,\n origin: null,\n }).current;\n\n const [state, setState] = useState<GestureState>({ isPressed: false, isHolding: false, didHold: false });\n\n const holdEvent = useCallback(\n (type: HoldGestureEvent['type']): HoldGestureEvent => {\n const duration = s.pressStart ? now() - s.pressStart : 0;\n const holdDuration = opts.current.holdDuration ?? 500;\n return {\n type,\n duration,\n seconds: Math.floor(duration / 1000),\n progress: Math.min(1, duration / holdDuration),\n pointerType: s.lastPointer,\n target: s.lastTarget as Element,\n };\n },\n [s],\n );\n\n const emit = useCallback(\n (name: (typeof KRTS_EVENTS)[keyof typeof KRTS_EVENTS], detail: unknown) => {\n if (opts.current.dispatchDomEvents === false) return;\n dispatchKrtsEvent(s.lastTarget, name, detail);\n },\n [s],\n );\n\n const stopHoldTimers = useCallback(() => {\n clearTimeout(s.holdTimer);\n clearInterval(s.tickTimer);\n if (s.raf !== undefined) cancelAnimationFrame(s.raf);\n s.holdTimer = undefined;\n s.tickTimer = undefined;\n s.raf = undefined;\n }, [s]);\n\n const resolveTaps = useCallback(() => {\n clearTimeout(s.tapTimer);\n s.tapTimer = undefined;\n const count = s.taps;\n s.taps = 0;\n if (count === 0 || !s.lastTarget) return;\n const o = opts.current;\n const base = { count, pointerType: s.lastPointer, target: s.lastTarget };\n if (count === 1 && o.onSingleTap) {\n const e: TapGestureEvent = { ...base, type: 'singletap' };\n o.onSingleTap(e);\n emit(KRTS_EVENTS.singleTap, e);\n } else if (count === 1) {\n emit(KRTS_EVENTS.singleTap, { ...base, type: 'singletap' });\n }\n if (count === 2) {\n const e: TapGestureEvent = { ...base, type: 'doubletap' };\n o.onDoubleTap?.(e);\n emit(KRTS_EVENTS.doubleTap, e);\n }\n const multi: TapGestureEvent = { ...base, type: 'multitap' };\n o.onMultiTap?.(multi);\n emit(KRTS_EVENTS.multiTap, multi);\n }, [s, emit]);\n\n /** How many taps could still be coming? Decides whether a single tap must wait. */\n const maxTaps = () => {\n const o = opts.current;\n if (o.onMultiTap) return Math.max(2, o.maxTaps ?? 3);\n if (o.onDoubleTap) return 2;\n return 1;\n };\n\n const cancelHold = useCallback(\n (fireCancel: boolean) => {\n const wasActive = s.pressActive;\n stopHoldTimers();\n if (wasActive && fireCancel && !s.holdFired && !s.holdSettled) {\n s.holdSettled = true;\n const e = holdEvent('holdcancel');\n opts.current.onHoldCancel?.(e);\n emit(KRTS_EVENTS.holdCancel, e);\n }\n opts.current.onHoldProgress?.(0);\n setState((p) => (p.isHolding ? { ...p, isHolding: false } : p));\n },\n [s, stopHoldTimers, holdEvent, emit],\n );\n\n const onPressStart = useCallback(\n (e: PressEvent) => {\n if (opts.current.isDisabled) return;\n const o = opts.current;\n // A new press inside a tap sequence: hold the sequence open.\n clearTimeout(s.tapTimer);\n s.tapTimer = undefined;\n s.lastTarget = e.target;\n s.lastPointer = e.pointerType;\n s.pressStart = now();\n s.holdFired = false;\n s.holdSettled = false;\n s.pressActive = true;\n s.moved = false;\n setState({ isPressed: true, isHolding: true, didHold: false });\n\n const startEvt = holdEvent('holdstart');\n o.onHoldStart?.(startEvt);\n emit(KRTS_EVENTS.holdStart, startEvt);\n\n const holdDuration = o.holdDuration ?? 500;\n s.holdTimer = setTimeout(() => {\n s.holdFired = true;\n s.taps = 0; // a hold breaks any tap sequence\n const he = holdEvent('hold');\n opts.current.onHold?.(he);\n emit(KRTS_EVENTS.hold, he);\n setState((p) => ({ ...p, didHold: true }));\n }, holdDuration);\n\n const tickInterval = o.holdTickInterval ?? 1000;\n let ticks = 0;\n s.tickTimer = setInterval(() => {\n ticks += 1;\n // Count from ticks, not the clock, so seconds never come out as 0.999 → 0.\n const te = { ...holdEvent('holdtick'), seconds: Math.floor((ticks * tickInterval) / 1000) };\n opts.current.onHoldTick?.(te);\n emit(KRTS_EVENTS.holdTick, te);\n }, tickInterval);\n if (o.onHoldProgress && typeof requestAnimationFrame !== 'undefined') {\n const loop = () => {\n const p = Math.min(1, (now() - s.pressStart) / (opts.current.holdDuration ?? 500));\n opts.current.onHoldProgress?.(p);\n s.raf = p < 1 ? requestAnimationFrame(loop) : undefined;\n };\n s.raf = requestAnimationFrame(loop);\n }\n },\n [s, holdEvent, emit],\n );\n\n const onPressEnd = useCallback(\n (_e: PressEvent) => {\n if (!s.pressActive) return;\n if (s.holdFired) {\n const e = holdEvent('holdend');\n opts.current.onHoldEnd?.(e);\n emit(KRTS_EVENTS.holdEnd, e);\n }\n cancelHold(true);\n s.pressActive = false;\n setState((p) => ({ ...p, isPressed: false, isHolding: false }));\n // If this press was cancelled (no onPress), still resolve any earlier taps.\n if (s.taps > 0 && !s.tapTimer) {\n s.tapTimer = setTimeout(resolveTaps, opts.current.multiTapDelay ?? 250);\n }\n },\n [s, holdEvent, emit, cancelHold, resolveTaps],\n );\n\n const onPress = useCallback(\n (e: PressEvent) => {\n if (opts.current.isDisabled || s.holdFired || s.moved) return;\n s.lastTarget = e.target;\n s.lastPointer = e.pointerType;\n s.taps += 1;\n clearTimeout(s.tapTimer);\n // Only make a single tap wait if a double/multi tap is actually possible.\n if (s.taps >= maxTaps()) resolveTaps();\n else s.tapTimer = setTimeout(resolveTaps, opts.current.multiTapDelay ?? 250);\n },\n [s, resolveTaps],\n );\n\n // ── movement: tap/hold cancellation + swipe ────────────────────────────\n const onPointerDown = useCallback(\n (e: ReactPointerEvent<Element>) => {\n if (opts.current.isDisabled || !e.isPrimary) return;\n // Multi-touch protection: ignore extra fingers once tracking.\n if (s.pointerId !== null) return;\n s.pointerId = e.pointerId;\n s.origin = { x: e.clientX, y: e.clientY, t: now() };\n },\n [s],\n );\n\n const onPointerMove = useCallback(\n (e: ReactPointerEvent<Element>) => {\n if (e.pointerId !== s.pointerId || !s.origin) return;\n const dx = e.clientX - s.origin.x;\n const dy = e.clientY - s.origin.y;\n if (!s.moved && Math.hypot(dx, dy) > (opts.current.moveTolerance ?? 10)) {\n s.moved = true;\n if (!s.holdFired) cancelHold(true);\n }\n },\n [s, cancelHold],\n );\n\n const endPointer = useCallback(\n (e: ReactPointerEvent<Element>, cancelled: boolean) => {\n if (e.pointerId !== s.pointerId || !s.origin) return;\n const origin = s.origin;\n s.pointerId = null;\n s.origin = null;\n const o = opts.current;\n if (cancelled || !o.onSwipe) return;\n const dx = e.clientX - origin.x;\n const dy = e.clientY - origin.y;\n const horizontal = Math.abs(dx) >= Math.abs(dy);\n const distance = Math.abs(horizontal ? dx : dy);\n const elapsed = Math.max(1, now() - origin.t);\n const velocity = distance / elapsed;\n // A quick flick is enough — don't demand a long drag.\n if (distance >= (o.swipeThreshold ?? 40) || (distance > 10 && velocity > (o.swipeVelocity ?? 0.11))) {\n const direction: SwipeDirection = horizontal ? (dx > 0 ? 'right' : 'left') : dy > 0 ? 'down' : 'up';\n const se: SwipeGestureEvent = { type: 'swipe', direction, distance, velocity, target: e.currentTarget };\n o.onSwipe(se);\n if (o.dispatchDomEvents !== false) dispatchKrtsEvent(e.currentTarget, KRTS_EVENTS.swipe, se);\n }\n },\n [s],\n );\n\n const pointerProps = useMemo(\n () => ({\n onPointerDown,\n onPointerMove,\n onPointerUp: (e: ReactPointerEvent<Element>) => endPointer(e, false),\n onPointerCancel: (e: ReactPointerEvent<Element>) => endPointer(e, true),\n onContextMenu: (e: React.MouseEvent) => {\n // Stop the long-press context menu on touch from stealing a hold.\n const o = opts.current;\n if ((o.onHold || o.onHoldTick) && s.lastPointer === 'touch') e.preventDefault();\n },\n 'data-krts-gesture': '',\n }),\n [onPointerDown, onPointerMove, endPointer, s],\n );\n\n const pressHandlers: Required<Pick<PressEvents, 'onPressStart' | 'onPressEnd' | 'onPress'>> = useMemo(\n () => ({ onPressStart, onPressEnd, onPress }),\n [onPressStart, onPressEnd, onPress],\n );\n\n useEffect(\n () => () => {\n clearTimeout(s.tapTimer);\n stopHoldTimers();\n },\n [s, stopHoldTimers],\n );\n\n return { pressHandlers, pointerProps, state };\n}\n\nexport interface UseGestureResult {\n /** Spread onto any element (div, img, canvas…) to give it gesture events. */\n gestureProps: DOMAttributes<Element> & Record<string, unknown>;\n isPressed: boolean;\n isHolding: boolean;\n didHold: boolean;\n}\n\n/**\n * Give any element `singleTap`, `doubleTap`, `multiTap`, `hold`,\n * `holdTick` and `swipe` events — with keyboard (Enter/Space) and\n * screen-reader support via React Aria's `usePress`.\n *\n * ```tsx\n * const { gestureProps } = useGesture({\n * onSingleTap: () => select(),\n * onDoubleTap: () => like(),\n * onHold: () => openMenu(),\n * holdDuration: 600,\n * });\n * return <div {...gestureProps} tabIndex={0}>…</div>;\n * ```\n */\nexport function useGesture(options: GestureOptions): UseGestureResult {\n const { pressHandlers, pointerProps, state } = useGestureHandlers(options);\n const { pressProps } = usePress({ ...pressHandlers, isDisabled: options.isDisabled });\n return {\n gestureProps: mergeProps(pressProps, pointerProps) as unknown as UseGestureResult['gestureProps'],\n isPressed: state.isPressed,\n isHolding: state.isHolding,\n didHold: state.didHold,\n };\n}\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * Honest-but-kind loading state.\n *\n * - Don't flash a spinner for work that finishes almost instantly\n * (`delay`, default 150ms).\n * - Once a spinner *is* shown, keep it up long enough to read\n * (`minDuration`, default 500ms) so it never flickers.\n */\nexport function useSmoothPending(isPending: boolean, { delay = 150, minDuration = 500 } = {}): boolean {\n const [shown, setShown] = useState(false);\n const shownAt = useRef(0);\n\n useEffect(() => {\n if (isPending && !shown) {\n const t = setTimeout(() => {\n shownAt.current = Date.now();\n setShown(true);\n }, delay);\n return () => clearTimeout(t);\n }\n if (!isPending && shown) {\n const remaining = Math.max(0, minDuration - (Date.now() - shownAt.current));\n const t = setTimeout(() => setShown(false), remaining);\n return () => clearTimeout(t);\n }\n return undefined;\n }, [isPending, shown, delay, minDuration]);\n\n return shown;\n}\n\n/**\n * Progress for work whose real progress is unknown. Moves fast at first,\n * then eases toward `ceiling` (never claiming to be done), and jumps to\n * 100 the moment `isDone` flips. Returns a 0–100 number.\n */\nexport function usePerceivedProgress(\n isRunning: boolean,\n isDone: boolean,\n { expectedDuration = 3000, ceiling = 92 } = {},\n): number {\n const [value, setValue] = useState(0);\n const start = useRef<number | null>(null);\n\n useEffect(() => {\n if (isDone) {\n setValue(100);\n start.current = null;\n return undefined;\n }\n if (!isRunning) {\n setValue(0);\n start.current = null;\n return undefined;\n }\n start.current = typeof performance !== 'undefined' ? performance.now() : Date.now();\n let raf = 0;\n const tick = () => {\n const t = (performance.now() - (start.current ?? 0)) / expectedDuration;\n // 1 - e^(-kt): front-loaded, asymptotic to the ceiling.\n setValue(ceiling * (1 - Math.exp(-2.2 * t)));\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [isRunning, isDone, expectedDuration, ceiling]);\n\n return value;\n}\n\n/** True when the user asked the OS for reduced motion. */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false);\n useEffect(() => {\n if (typeof matchMedia === 'undefined') return undefined;\n const mq = matchMedia('(prefers-reduced-motion: reduce)');\n setReduced(mq.matches);\n const on = () => setReduced(mq.matches);\n mq.addEventListener('change', on);\n return () => mq.removeEventListener('change', on);\n }, []);\n return reduced;\n}\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState, type CSSProperties } from 'react';\nimport { usePrefersReducedMotion } from './usePerceived';\n\nconst useIsoLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport interface AnimatedWidthOptions {\n enabled?: boolean;\n /** ms. Default 250. */\n duration?: number;\n}\n\n/**\n * Smoothly resizes a box when its content changes (\"Save\" → \"Saved ✓\").\n *\n * Attach `contentRef` to an element that hugs the content (it must not\n * shrink — give it `shrink-0`). The host gets an explicit, transitioned\n * `width` = content width + the host's padding and border.\n *\n * The first measurement (and the swap to web fonts) is applied without\n * animation, so nothing slides around on page load.\n */\nexport function useAnimatedWidth({ enabled = true, duration = 250 }: AnimatedWidthOptions = {}) {\n const contentRef = useRef<HTMLElement | null>(null);\n const [width, setWidth] = useState<number | undefined>(undefined);\n const [ready, setReady] = useState(false);\n const reduced = usePrefersReducedMotion();\n\n const measure = useCallback(() => {\n const content = contentRef.current;\n const host = content?.parentElement;\n if (!content || !host) return;\n const cs = getComputedStyle(host);\n const chrome =\n parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight) + parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth);\n const next = Math.ceil(content.getBoundingClientRect().width + chrome);\n setWidth((prev) => (prev === next ? prev : next));\n }, []);\n\n useIsoLayoutEffect(() => {\n if (!enabled) {\n setWidth(undefined);\n return undefined;\n }\n const content = contentRef.current;\n if (!content || typeof ResizeObserver === 'undefined') return undefined;\n measure();\n const ro = new ResizeObserver(() => measure());\n ro.observe(content);\n return () => ro.disconnect();\n }, [enabled, measure]);\n\n // Only animate once the first layout (and web fonts) have settled.\n useEffect(() => {\n if (!enabled || width === undefined || ready) return undefined;\n let cancelled = false;\n const fonts = typeof document !== 'undefined' && document.fonts ? document.fonts.ready : Promise.resolve();\n fonts.then(() => {\n requestAnimationFrame(() => {\n if (!cancelled) setReady(true);\n });\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, width, ready]);\n\n const style: CSSProperties | undefined =\n enabled && width !== undefined ? { width } : undefined;\n\n return {\n contentRef,\n /** Spread into the host's `style`. */\n widthStyle: style,\n /** Append to the host's `transition` list. */\n widthTransition: enabled && ready && !reduced ? `width ${duration}ms var(--ease-out)` : '',\n };\n}\n","import { forwardRef, type ReactNode } from 'react';\nimport { Button as RACButton, type ButtonProps as RACButtonProps, composeRenderProps } from 'react-aria-components';\nimport { mergeProps } from 'react-aria';\nimport { useGestureHandlers, type GestureOptions } from '../hooks/useGesture';\nimport { useSmoothPending } from '../hooks/usePerceived';\nimport { useAnimatedWidth } from '../hooks/useAnimatedWidth';\nimport { cn, focusRing } from '../lib/cn';\nimport { Spinner } from './Spinner';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'ghost';\nexport type ButtonSize = 'xs' | 'sm' | 'md';\n\nconst variants: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary border-primary-line text-primary-fg hover:bg-primary-hover pressed:bg-primary-pressed shadow-control',\n secondary:\n 'bg-surface border-line text-fg hover:bg-surface-hover pressed:bg-surface-pressed pressed:border-line-strong shadow-control',\n danger:\n 'bg-danger border-danger-line text-danger-fg hover:bg-danger-hover pressed:bg-danger-pressed shadow-control',\n ghost:\n 'bg-transparent border-transparent text-fg/80 hover:bg-surface/70 hover:text-fg pressed:bg-surface-pressed/60 pressed:text-fg',\n};\n\nconst sizes: Record<ButtonSize, string> = {\n xs: 'h-7 px-2.5 text-[13px] gap-1.5 rounded-[6px]',\n sm: 'h-9 px-3.5 text-sm gap-2',\n md: 'h-12 px-[18px] text-base gap-2.5',\n};\nconst iconSizes: Record<ButtonSize, string> = { xs: 'size-7 px-0', sm: 'size-9 px-0', md: 'size-12 px-0' };\n\nexport function buttonStyles({\n variant = 'secondary',\n size = 'md',\n isIconOnly = false,\n className,\n}: { variant?: ButtonVariant; size?: ButtonSize; isIconOnly?: boolean; className?: string } = {}) {\n return cn(\n 'group/button relative isolate inline-flex select-none items-center justify-center whitespace-nowrap rounded-control border font-sans font-normal leading-none',\n 'cursor-default [-webkit-tap-highlight-color:transparent] touch-manipulation',\n // Press feedback comes from the pressed colours (Figma \"Pressed\" row) — no scaling.\n 'transition-[background-color,border-color,color,box-shadow,opacity] duration-150 ease-out',\n 'disabled:cursor-not-allowed disabled:opacity-45 disabled:shadow-none',\n focusRing,\n variants[variant],\n sizes[size],\n isIconOnly && iconSizes[size],\n className,\n );\n}\n\ntype GestureProps = Pick<\n GestureOptions,\n | 'onSingleTap'\n | 'onDoubleTap'\n | 'onMultiTap'\n | 'maxTaps'\n | 'multiTapDelay'\n | 'onHoldStart'\n | 'onHold'\n | 'onHoldTick'\n | 'onHoldProgress'\n | 'onHoldEnd'\n | 'onHoldCancel'\n | 'holdDuration'\n | 'holdTickInterval'\n | 'onSwipe'\n>;\n\nconst gestureKeys: (keyof GestureProps)[] = [\n 'onSingleTap',\n 'onDoubleTap',\n 'onMultiTap',\n 'onHoldStart',\n 'onHold',\n 'onHoldTick',\n 'onHoldProgress',\n 'onHoldEnd',\n 'onHoldCancel',\n 'onSwipe',\n];\n\nexport interface ButtonProps extends Omit<RACButtonProps, 'children'>, GestureProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Square button for a lone icon. Remember an `aria-label`. */\n isIconOnly?: boolean;\n children?: RACButtonProps['children'];\n /** Shown before the label. */\n startContent?: ReactNode;\n /** Shown after the label. */\n endContent?: ReactNode;\n /**\n * When the label changes (\"Save\" → \"Saved\"), glide to the new width with\n * an ease-out curve instead of jumping. Default true (off for icon-only).\n * Turn off if you size the button yourself (e.g. `w-full`).\n */\n animateWidth?: boolean;\n}\n\nconst BASE_TRANSITION =\n 'background-color 150ms var(--ease-out), border-color 150ms var(--ease-out), color 150ms var(--ease-out), box-shadow 150ms var(--ease-out), opacity 150ms var(--ease-out)';\n\n/**\n * The krts.ui button. Accepts every React Aria `Button` prop plus gesture\n * events: `onSingleTap`, `onDoubleTap`, `onMultiTap`, `onHold`,\n * `onHoldTick`, `onSwipe`…\n *\n * `isPending` shows a spinner only if the work takes longer than 150ms,\n * and then keeps it for at least 500ms — no flicker.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(props, ref) {\n const {\n variant = 'secondary',\n size = 'md',\n isIconOnly,\n className,\n children,\n startContent,\n endContent,\n isPending,\n maxTaps,\n multiTapDelay,\n holdDuration,\n holdTickInterval,\n animateWidth = !isIconOnly,\n style,\n ...rest\n } = props;\n\n const gestureOpts: GestureOptions = { maxTaps, multiTapDelay, holdDuration, holdTickInterval };\n const racProps: Record<string, unknown> = {};\n let hasGestures = false;\n for (const [k, v] of Object.entries(rest)) {\n if ((gestureKeys as string[]).includes(k)) {\n (gestureOpts as Record<string, unknown>)[k] = v;\n if (v) hasGestures = true;\n } else racProps[k] = v;\n }\n gestureOpts.isDisabled = !!props.isDisabled || !!isPending;\n\n const { pressHandlers, pointerProps } = useGestureHandlers(gestureOpts);\n const showSpinner = useSmoothPending(!!isPending);\n\n const { contentRef, widthStyle, widthTransition } = useAnimatedWidth({ enabled: animateWidth });\n\n const merged = hasGestures ? mergeProps(racProps, pressHandlers, pointerProps) : racProps;\n\n return (\n <RACButton\n {...(merged as RACButtonProps)}\n ref={ref}\n isPending={isPending}\n data-spinner={showSpinner || undefined}\n className={composeRenderProps(className, (cls) =>\n buttonStyles({ variant, size, isIconOnly, className: cn(animateWidth && 'shrink-0 overflow-hidden', cls) }),\n )}\n style={composeRenderProps(style, (s) => ({\n ...widthStyle,\n ...(widthTransition ? { transition: `${BASE_TRANSITION}, ${widthTransition}` } : null),\n ...s,\n }))}\n >\n {composeRenderProps(children, (child) => (\n <>\n <span\n ref={contentRef}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center gap-[inherit] self-stretch transition-[opacity,filter] duration-200 ease-out',\n showSpinner && 'opacity-0 blur-[2px]',\n )}\n >\n {startContent}\n {child}\n {endContent}\n </span>\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-0 flex items-center justify-center transition-[opacity,filter] duration-200 ease-out',\n showSpinner ? 'opacity-100 blur-0' : 'opacity-0 blur-[2px]',\n )}\n >\n {showSpinner && <Spinner size={size === 'md' ? 18 : 14} />}\n </span>\n </>\n ))}\n </RACButton>\n );\n});\n","import { cn } from '../lib/cn';\n\nexport interface SpinnerProps {\n size?: number;\n className?: string;\n /** Accessible label. Omit when the spinner is decorative (e.g. inside a pending button). */\n label?: string;\n}\n\n/**\n * A fast spinner (600ms/turn). A faster spinner makes the same wait\n * *feel* shorter.\n */\nexport function Spinner({ size = 16, className, label }: SpinnerProps) {\n return (\n <span\n role={label ? 'progressbar' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn(\n 'inline-block shrink-0 animate-krts-spin rounded-full border-2 border-current border-r-transparent opacity-80',\n className,\n )}\n style={{ width: size, height: size }}\n />\n );\n}\n","import { forwardRef, useEffect, useId, useRef, useState, type ReactNode } from 'react';\nimport { Button as RACButton, type ButtonProps as RACButtonProps } from 'react-aria-components';\nimport { mergeProps } from 'react-aria';\nimport { useAnimatedWidth } from '../hooks/useAnimatedWidth';\nimport { useGestureHandlers, type HoldGestureEvent } from '../hooks/useGesture';\nimport { cn, focusRing } from '../lib/cn';\nimport { dispatchKrtsEvent, KRTS_EVENTS } from '../lib/dom-events';\nimport { CheckIcon } from './icons';\n\nexport type HoldButtonVariant = 'danger' | 'primary' | 'secondary';\n\nexport interface HoldButtonProps\n extends Omit<RACButtonProps, 'children' | 'onPress' | 'onPressStart' | 'onPressEnd' | 'className' | 'style'> {\n children: ReactNode;\n /** Fires once the button has been held for `holdDuration`. */\n onConfirm: (e: HoldGestureEvent | { type: 'virtual' }) => void;\n /** How long to hold, ms. Default 2000. */\n holdDuration?: number;\n /** 0 → 1 while held (every frame). */\n onHoldProgress?: (progress: number) => void;\n /** Released before confirming. */\n onHoldCancel?: (e: HoldGestureEvent) => void;\n /** Shown briefly if someone taps instead of holding. */\n hint?: ReactNode;\n /** Shown after confirming. Pass `null` to keep the label. */\n confirmedContent?: ReactNode;\n /** How long the confirmed state is shown before resetting, ms. Default 1600. */\n resetAfter?: number;\n variant?: HoldButtonVariant;\n size?: 'sm' | 'md';\n /** Glide to the new width when the label swaps (hint / done). Default true. */\n animateWidth?: boolean;\n className?: string;\n}\n\nconst fills: Record<HoldButtonVariant, string> = {\n danger: 'bg-danger text-danger-fg',\n primary: 'bg-primary text-primary-fg',\n secondary: 'bg-surface-pressed text-fg',\n};\nconst bases: Record<HoldButtonVariant, string> = {\n danger: 'bg-surface border-line text-danger hover:bg-danger-soft',\n primary: 'bg-surface border-line text-fg hover:bg-surface-hover',\n secondary: 'bg-surface border-line text-fg hover:bg-surface-hover',\n};\n\n/**\n * Hold-to-confirm button — a calmer alternative to an \"Are you sure?\"\n * dialog for destructive actions.\n *\n * Holding fills the button left→right (linear, deliberate). Letting go\n * snaps back fast (ease-out). Works with a mouse, touch, and by holding\n * Space/Enter. Screen-reader activation confirms immediately, since a\n * virtual click can't be held.\n */\nexport const HoldButton = forwardRef<HTMLButtonElement, HoldButtonProps>(function HoldButton(\n {\n children,\n onConfirm,\n holdDuration = 2000,\n onHoldProgress,\n onHoldCancel,\n hint = 'Hold to confirm',\n confirmedContent,\n resetAfter = 1600,\n variant = 'danger',\n size = 'md',\n className,\n isDisabled,\n animateWidth = true,\n ...rest\n },\n ref,\n) {\n const [phase, setPhase] = useState<'idle' | 'holding' | 'hint' | 'confirmed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n const hintId = useId();\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const settle = (next: 'hint' | 'confirmed', ms: number) => {\n setPhase(next);\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setPhase('idle'), ms);\n };\n\n const { pressHandlers, pointerProps } = useGestureHandlers({\n holdDuration,\n isDisabled: isDisabled || phase === 'confirmed',\n onHoldStart: (e) => {\n if (e.pointerType === 'virtual') return;\n clearTimeout(timer.current);\n setPhase('holding');\n },\n onHold: (e) => {\n settle('confirmed', resetAfter);\n dispatchKrtsEvent(e.target, KRTS_EVENTS.confirm, e);\n onConfirm(e);\n },\n onHoldCancel: (e) => {\n onHoldCancel?.(e);\n // A quick tap means they didn't know to hold: tell them.\n if (e.duration < 350 && hint) settle('hint', 1400);\n else setPhase('idle');\n },\n onHoldProgress,\n });\n\n const onPress = (e: Parameters<NonNullable<RACButtonProps['onPress']>>[0]) => {\n if (e.pointerType === 'virtual' && phase !== 'confirmed') {\n settle('confirmed', resetAfter);\n onConfirm({ type: 'virtual' });\n }\n };\n\n const { contentRef, widthStyle, widthTransition } = useAnimatedWidth({ enabled: animateWidth });\n\n const holding = phase === 'holding';\n const confirmed = phase === 'confirmed';\n const label = phase === 'hint' ? hint : confirmed && confirmedContent !== null ? (confirmedContent ?? <><CheckIcon size={16} /> Done</>) : children;\n\n const content = (\n <span key={phase === 'hint' ? 'hint' : confirmed ? 'done' : 'label'} className=\"inline-flex items-center gap-2 transition-[opacity,filter] duration-200 ease-out starting:opacity-0 starting:blur-[2px]\">\n {label}\n </span>\n );\n\n return (\n <RACButton\n {...(mergeProps(rest, pressHandlers, pointerProps, { onPress }) as RACButtonProps)}\n ref={ref}\n isDisabled={isDisabled}\n aria-describedby={hintId}\n data-holding={holding || undefined}\n data-confirmed={confirmed || undefined}\n className={cn(\n 'group/hold relative isolate inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap rounded-control border font-sans leading-none shadow-control',\n 'cursor-default touch-manipulation [-webkit-tap-highlight-color:transparent] [-webkit-touch-callout:none]',\n 'transition-[background-color,border-color,color] duration-150 ease-out',\n 'disabled:cursor-not-allowed disabled:opacity-45',\n focusRing,\n size === 'md' ? 'h-12 px-[18px] text-base' : 'h-9 px-3.5 text-sm',\n animateWidth && 'shrink-0',\n bases[variant],\n className,\n )}\n style={{\n ...widthStyle,\n ...(widthTransition\n ? { transition: `background-color 150ms var(--ease-out), border-color 150ms var(--ease-out), color 150ms var(--ease-out), ${widthTransition}` }\n : null),\n }}\n >\n <span ref={contentRef} className=\"relative inline-flex shrink-0 items-center gap-2\">\n {content}\n </span>\n {/* The fill: a clipped copy of the label so the text colour flips exactly at the edge. */}\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-0 flex items-center justify-center',\n fills[variant],\n // Release: snap back fast. Press: slow, linear, deliberate.\n '[clip-path:inset(0_100%_0_0)] [transition:clip-path_200ms_var(--ease-out)]',\n 'group-data-[holding]/hold:[clip-path:inset(0_0_0_0)] group-data-[holding]/hold:[transition:clip-path_var(--hold-ms)_linear]',\n 'group-data-[confirmed]/hold:[clip-path:inset(0_0_0_0)]',\n )}\n style={{ '--hold-ms': `${holdDuration}ms` } as React.CSSProperties}\n >\n <span className=\"inline-flex items-center gap-2\">{content}</span>\n </span>\n <span id={hintId} className=\"sr-only\">\n Press and hold for {Math.round(holdDuration / 100) / 10} seconds to confirm.\n </span>\n </RACButton>\n );\n});\n","import type { SVGProps } from 'react';\n\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number };\n\nfunction Svg({ size = 16, children, ...props }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...props}\n >\n {children}\n </svg>\n );\n}\n\nexport const ChevronDownIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m6 9 6 6 6-6\" />\n </Svg>\n);\nexport const ChevronRightIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m9 6 6 6-6 6\" />\n </Svg>\n);\nexport const CheckIcon = (p: IconProps) => (\n <Svg strokeWidth={2.5} {...p}>\n <path d=\"M20 6 9 17l-5-5\" />\n </Svg>\n);\nexport const MinusIcon = (p: IconProps) => (\n <Svg strokeWidth={2.5} {...p}>\n <path d=\"M5 12h14\" />\n </Svg>\n);\nexport const XIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </Svg>\n);\nexport const SearchIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m20 20-3.5-3.5\" />\n </Svg>\n);\nexport const CopyIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </Svg>\n);\nexport const PlusIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M12 5v14M5 12h14\" />\n </Svg>\n);\n","import { useEffect, useRef, useState } from 'react';\nimport { cn } from '../lib/cn';\nimport { Button, type ButtonProps } from './Button';\nimport { CheckIcon, CopyIcon } from './icons';\n\nexport interface CopyButtonProps extends Omit<ButtonProps, 'onPress' | 'children' | 'value'> {\n /** Text to copy (or a function returning it). */\n value: string | (() => string);\n label?: string;\n copiedLabel?: string;\n onCopy?: (value: string) => void;\n}\n\n/**\n * Copies to the clipboard and morphs its icon. The swap is a crossfade\n * with a touch of blur so it reads as one object changing, not two\n * objects swapping. Says \"copied\" immediately — the clipboard write is\n * effectively instant and rarely fails.\n */\nexport function CopyButton({ value, label = 'Copy', copiedLabel = 'Copied', onCopy, isIconOnly = true, size = 'sm', variant = 'secondary', ...props }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const t = useRef<ReturnType<typeof setTimeout>>(undefined);\n useEffect(() => () => clearTimeout(t.current), []);\n\n const icon = (\n <span className=\"relative grid size-4 place-items-center\">\n <CopyIcon\n size={16}\n className={cn('absolute transition-[opacity,filter] duration-200 ease-out', copied ? 'opacity-0 blur-[2px]' : 'opacity-100')}\n />\n <CheckIcon\n size={16}\n className={cn('absolute transition-[opacity,filter] duration-200 ease-out', copied ? 'opacity-100' : 'opacity-0 blur-[2px]')}\n />\n </span>\n );\n\n return (\n <Button\n {...props}\n size={size}\n variant={variant}\n isIconOnly={isIconOnly}\n aria-label={isIconOnly ? (copied ? copiedLabel : label) : undefined}\n onPress={() => {\n const text = typeof value === 'function' ? value() : value;\n void navigator.clipboard?.writeText(text).catch(() => setCopied(false));\n setCopied(true);\n onCopy?.(text);\n clearTimeout(t.current);\n t.current = setTimeout(() => setCopied(false), 1600);\n }}\n >\n {icon}\n {!isIconOnly && <span>{copied ? copiedLabel : label}</span>}\n <span role=\"status\" className=\"sr-only\">\n {copied ? copiedLabel : ''}\n </span>\n </Button>\n );\n}\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { mergeProps } from 'react-aria';\nimport { useGesture, type GestureOptions } from '../hooks/useGesture';\nimport { cn, focusRing } from '../lib/cn';\n\nexport interface GestureAreaProps extends GestureOptions, Omit<HTMLAttributes<HTMLDivElement>, keyof GestureOptions | 'onContextMenu'> {\n /** Name for assistive tech. Gesture areas are focusable and act like buttons. */\n 'aria-label'?: string;\n}\n\n/**\n * A focusable box that understands `onSingleTap`, `onDoubleTap`,\n * `onMultiTap`, `onHold`, `onHoldTick` and `onSwipe`. Exposes\n * `data-pressed` / `data-holding` for styling.\n *\n * Keyboard: Enter/Space taps; holding Enter/Space holds.\n */\nexport const GestureArea = forwardRef<HTMLDivElement, GestureAreaProps>(function GestureArea(props, ref) {\n const {\n onSingleTap,\n onDoubleTap,\n onMultiTap,\n maxTaps,\n multiTapDelay,\n onHoldStart,\n onHold,\n onHoldTick,\n onHoldProgress,\n onHoldEnd,\n onHoldCancel,\n holdDuration,\n holdTickInterval,\n onSwipe,\n swipeThreshold,\n swipeVelocity,\n moveTolerance,\n dispatchDomEvents,\n isDisabled,\n className,\n ...rest\n } = props;\n const { gestureProps, isPressed, isHolding, didHold } = useGesture({\n onSingleTap,\n onDoubleTap,\n onMultiTap,\n maxTaps,\n multiTapDelay,\n onHoldStart,\n onHold,\n onHoldTick,\n onHoldProgress,\n onHoldEnd,\n onHoldCancel,\n holdDuration,\n holdTickInterval,\n onSwipe,\n swipeThreshold,\n swipeVelocity,\n moveTolerance,\n dispatchDomEvents,\n isDisabled,\n });\n return (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n aria-disabled={isDisabled || undefined}\n {...mergeProps(rest, gestureProps)}\n data-pressed={isPressed || undefined}\n data-holding={(isPressed && isHolding && !didHold) || undefined}\n data-held={didHold || undefined}\n className={cn('touch-manipulation select-none [-webkit-touch-callout:none] [-webkit-tap-highlight-color:transparent]', focusRing, className)}\n />\n );\n});\n","import type { ReactNode } from 'react';\nimport {\n SelectionIndicator,\n ToggleButton as RACToggleButton,\n ToggleButtonGroup as RACToggleButtonGroup,\n type ToggleButtonGroupProps,\n type ToggleButtonProps as RACToggleButtonProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { buttonStyles, type ButtonSize } from './Button';\n\nexport interface ToggleButtonProps extends Omit<RACToggleButtonProps, 'children'> {\n children?: ReactNode;\n size?: ButtonSize;\n isIconOnly?: boolean;\n}\n\n/** A button that stays pressed. Selected state uses the primary fill. */\nexport function ToggleButton({ size = 'sm', isIconOnly, className, ...props }: ToggleButtonProps) {\n return (\n <RACToggleButton\n {...props}\n className={composeTw(className, (rp: { isSelected: boolean }) =>\n buttonStyles({\n variant: rp.isSelected ? 'primary' : 'secondary',\n size,\n isIconOnly,\n }),\n )}\n />\n );\n}\n\nexport interface SegmentedControlProps extends Omit<ToggleButtonGroupProps, 'children'> {\n children: ReactNode;\n size?: 'sm' | 'md';\n}\n\n/**\n * iOS-style segmented control. Single selection by default; the thumb\n * slides between segments.\n */\nexport function SegmentedControl({ size = 'sm', className, selectionMode = 'single', disallowEmptySelection = true, ...props }: SegmentedControlProps) {\n return (\n <RACToggleButtonGroup\n {...props}\n selectionMode={selectionMode}\n disallowEmptySelection={disallowEmptySelection}\n data-size={size}\n className={composeTw(\n className,\n 'group/seg inline-flex w-fit gap-0.5 rounded-[10px] border border-line bg-surface p-[3px] shadow-control',\n )}\n />\n );\n}\n\nexport function Segment({ children, className, ...props }: Omit<RACToggleButtonProps, 'children'> & { children?: ReactNode }) {\n return (\n <RACToggleButton\n {...props}\n className={composeTw(\n className,\n cn(\n 'relative inline-flex cursor-default items-center justify-center gap-2 rounded-[7px] px-3.5 whitespace-nowrap outline-none select-none',\n 'text-fg-muted transition-colors duration-200 ease-out hover:text-fg selected:text-fg disabled:opacity-40',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',\n 'h-8 text-[14px] group-data-[size=md]/seg:h-10 group-data-[size=md]/seg:text-[15px]',\n ),\n )}\n >\n <SelectionIndicator className=\"absolute inset-0 rounded-[7px] bg-bg shadow-control transition-[translate,width] duration-250 ease-out motion-reduce:transition-none\" />\n <span className=\"relative z-10 inline-flex items-center gap-2\">{children}</span>\n </RACToggleButton>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Collection,\n Header,\n Keyboard,\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuSection as RACMenuSection,\n MenuTrigger as RACMenuTrigger,\n Separator,\n SubmenuTrigger as RACSubmenuTrigger,\n Text,\n type MenuItemProps as RACMenuItemProps,\n type MenuProps as RACMenuProps,\n type MenuSectionProps as RACMenuSectionProps,\n type MenuTriggerProps,\n type PopoverProps,\n type SubmenuTriggerProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { CheckIcon, ChevronRightIcon } from './icons';\nimport type { OverlayAnimation } from '../lib/config';\nimport { Popover } from './Popover';\n\nexport function MenuTrigger(props: MenuTriggerProps) {\n return <RACMenuTrigger {...props} />;\n}\n\nexport function SubmenuTrigger(props: SubmenuTriggerProps) {\n return <RACSubmenuTrigger {...props} />;\n}\n\nexport interface MenuProps<T> extends RACMenuProps<T> {\n placement?: PopoverProps['placement'];\n /** Set false when rendering a Menu inline (not in a popover). */\n withPopover?: boolean;\n popoverClassName?: string;\n /** `'fade'` (default), `'scale'` or `'none'`. */\n animation?: OverlayAnimation;\n}\n\nexport function Menu<T extends object>({ placement = 'bottom start', withPopover = true, popoverClassName, animation, className, ...props }: MenuProps<T>) {\n const menu = (\n <RACMenu\n {...props}\n className={composeTw(className, 'max-h-[inherit] min-w-[13rem] overflow-auto p-1.5 outline-none')}\n />\n );\n if (!withPopover) return menu;\n return (\n <Popover placement={placement} animation={animation} className={popoverClassName}>\n {menu}\n </Popover>\n );\n}\n\nexport interface MenuItemProps<T> extends Omit<RACMenuItemProps<T>, 'children'> {\n children?: ReactNode;\n /** Secondary line under the label. */\n description?: ReactNode;\n /** Leading icon. */\n icon?: ReactNode;\n /** Keyboard shortcut shown on the right. */\n shortcut?: string;\n variant?: 'default' | 'danger';\n}\n\nexport function MenuItem<T extends object>({ children, description, icon, shortcut, variant = 'default', className, ...props }: MenuItemProps<T>) {\n const textValue = props.textValue ?? (typeof children === 'string' ? children : undefined);\n return (\n <RACMenuItem\n textValue={textValue}\n {...props}\n className={composeTw(\n className,\n cn(\n // Hovered/focused items change instantly: menus are used too often to animate.\n 'group relative flex min-h-9 cursor-default items-center gap-2.5 rounded-control px-2.5 py-1.5 text-[15px] outline-none select-none',\n 'disabled:opacity-40',\n variant === 'danger'\n ? 'text-danger focus:bg-danger-soft'\n : 'text-fg focus:bg-surface-hover pressed:bg-surface-pressed',\n ),\n )}\n >\n {({ hasSubmenu, isSelected, selectionMode }) => (\n <>\n {selectionMode !== 'none' && (\n <span className=\"grid size-4 shrink-0 place-items-center\">{isSelected && <CheckIcon size={14} />}</span>\n )}\n {icon && <span className=\"grid size-4 shrink-0 place-items-center text-fg-muted group-focus:text-current\">{icon}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <Text slot=\"label\" className=\"truncate\">\n {children}\n </Text>\n {description && (\n <Text slot=\"description\" className=\"truncate text-[13px] text-fg-muted\">\n {description}\n </Text>\n )}\n </span>\n {shortcut && <Keyboard className=\"font-sans text-[12px] tracking-wide text-fg-subtle\">{shortcut}</Keyboard>}\n {hasSubmenu && <ChevronRightIcon size={14} className=\"text-fg-subtle\" />}\n </>\n )}\n </RACMenuItem>\n );\n}\n\nexport interface MenuSectionProps<T> extends RACMenuSectionProps<T> {\n title?: ReactNode;\n}\n\nexport function MenuSection<T extends object>({ title, children, className, ...props }: MenuSectionProps<T>) {\n return (\n <RACMenuSection {...props} className={cn('flex flex-col', className as string)}>\n {title && <Header className=\"px-2.5 pt-2 pb-1 text-[12px] font-medium text-fg-subtle\">{title}</Header>}\n <Collection items={props.items}>{children}</Collection>\n </RACMenuSection>\n );\n}\n\nexport function MenuSeparator() {\n return <Separator className=\"mx-1 my-1.5 h-px bg-line-subtle\" />;\n}\n","import { Popover as RACPopover, type PopoverProps as RACPopoverProps } from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { useKrtsConfig, type OverlayAnimation } from '../lib/config';\n\n/** Shared floating-surface look (Figma \"Dropdown menu\": 12px radius). */\nexport const floatingSurface = cn(\n 'rounded-menu border border-line-subtle bg-overlay text-fg shadow-float outline-none',\n);\n\n/**\n * Enter/exit motion for floating menus. Exits are quicker than entrances.\n *\n * - `fade`: a quick opacity fade (default — good for dashboards).\n * - `scale`: grows out of the trigger (`--trigger-anchor-point`), never from\n * the centre and never from scale(0).\n * - `none`: instant.\n */\nexport const floatingMotion: Record<OverlayAnimation, string> = {\n fade: cn('transition-opacity duration-120 ease-out', 'entering:opacity-0 exiting:opacity-0 exiting:duration-100'),\n scale: cn(\n 'origin-(--trigger-anchor-point) will-change-transform',\n 'transition-[opacity,transform] duration-200 ease-out',\n 'entering:opacity-0 entering:scale-[0.96]',\n 'exiting:opacity-0 exiting:scale-[0.98] exiting:duration-120',\n 'motion-reduce:entering:scale-100 motion-reduce:exiting:scale-100',\n ),\n none: '',\n};\n\nexport interface PopoverProps extends RACPopoverProps {\n /** Defaults to `menuAnimation` from `<KrtsProvider>`, which defaults to `'fade'`. */\n animation?: OverlayAnimation;\n}\n\nexport function Popover({ className, offset = 6, animation, ...props }: PopoverProps) {\n const { menuAnimation } = useKrtsConfig();\n return (\n <RACPopover\n offset={offset}\n {...props}\n data-animation={animation ?? menuAnimation}\n className={composeTw(className, cn(floatingSurface, floatingMotion[animation ?? menuAnimation], 'min-w-(--trigger-width)'))}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport type { MenuProps as RACMenuProps, PopoverProps } from 'react-aria-components';\nimport { cn } from '../lib/cn';\nimport type { OverlayAnimation } from '../lib/config';\nimport { Button, type ButtonProps } from './Button';\nimport { ChevronDownIcon } from './icons';\nimport { Menu, MenuTrigger } from './Menu';\n\nexport interface DropdownButtonProps<T> extends Omit<RACMenuProps<T>, 'children' | 'className'> {\n /** Button label. */\n label: ReactNode;\n /** Menu items (`<MenuItem>`s or a render function). */\n children: RACMenuProps<T>['children'];\n variant?: ButtonProps['variant'];\n size?: ButtonProps['size'];\n isDisabled?: boolean;\n placement?: PopoverProps['placement'];\n /** Menu animation: `'fade'` (default), `'scale'` or `'none'`. */\n animation?: OverlayAnimation;\n className?: string;\n}\n\n/**\n * The Figma \"Dropdown Button\": label │ divider │ chevron, opening a menu.\n * The chevron flips while the menu is open.\n */\nexport function DropdownButton<T extends object>({\n label,\n children,\n variant = 'primary',\n size = 'md',\n isDisabled,\n placement = 'bottom start',\n className,\n ...menuProps\n}: DropdownButtonProps<T>) {\n const divider = variant === 'primary' ? 'bg-primary-line' : variant === 'danger' ? 'bg-danger-line' : 'bg-line';\n return (\n <MenuTrigger>\n <Button variant={variant} size={size} isDisabled={isDisabled} className={cn('group gap-0 pr-0', size === 'md' ? 'pl-6' : 'pl-3.5', className)}>\n <span>{label}</span>\n <span aria-hidden className={cn('w-px self-stretch', size === 'md' ? 'ml-3' : 'ml-2.5', divider)} />\n <span className={cn('grid place-items-center', size === 'md' ? 'w-11' : size === 'sm' ? 'w-9' : 'w-7')}>\n <ChevronDownIcon\n size={size === 'md' ? 20 : 16}\n className=\"transition-transform duration-200 ease-out group-aria-expanded:rotate-180\"\n />\n </span>\n </Button>\n <Menu placement={placement} {...menuProps}>\n {children}\n </Menu>\n </MenuTrigger>\n );\n}\n\nexport interface SplitButtonProps<T> extends DropdownButtonProps<T> {\n /** Main action when the label half is pressed. */\n onAction?: () => void;\n onMenuAction?: RACMenuProps<T>['onAction'];\n /** Accessible label for the chevron half. */\n menuLabel?: string;\n}\n\n/** A main action and a menu of related actions, joined. */\nexport function SplitButton<T extends object>({\n label,\n children,\n variant = 'primary',\n size = 'md',\n isDisabled,\n placement = 'bottom end',\n onAction,\n onMenuAction,\n menuLabel = 'More options',\n className,\n ...menuProps\n}: SplitButtonProps<T>) {\n return (\n <div className={cn('inline-flex', className)} role=\"group\">\n <Button variant={variant} size={size} isDisabled={isDisabled} onPress={onAction} className=\"rounded-r-none border-r-0\">\n {label}\n </Button>\n <MenuTrigger>\n <Button\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n isIconOnly\n aria-label={menuLabel}\n className={cn(\n 'group rounded-l-none',\n variant === 'primary' ? 'border-l-primary-line' : variant === 'danger' ? 'border-l-danger-line' : 'border-l-line',\n )}\n >\n <ChevronDownIcon size={size === 'md' ? 20 : 16} className=\"transition-transform duration-200 ease-out group-aria-expanded:rotate-180\" />\n </Button>\n <Menu placement={placement} onAction={onMenuAction} {...menuProps}>\n {children}\n </Menu>\n </MenuTrigger>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n OverlayArrow,\n Tooltip as RACTooltip,\n TooltipTrigger as RACTooltipTrigger,\n type TooltipProps as RACTooltipProps,\n type TooltipTriggerComponentProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\n\nexport interface TooltipProps extends Omit<RACTooltipProps, 'children'> {\n children: ReactNode;\n /** Small keyboard shortcut shown on the right, e.g. \"⌘K\". */\n shortcut?: ReactNode;\n showArrow?: boolean;\n}\n\n/**\n * Origin-aware tooltip. React Aria handles the warm-up: the first tooltip\n * waits, neighbours open instantly *and* skip their animation.\n */\nexport function Tooltip({ children, shortcut, showArrow = false, offset = 8, className, ...props }: TooltipProps) {\n return (\n <RACTooltip\n offset={offset}\n {...props}\n className={composeTw(\n className,\n cn(\n 'group z-50 flex max-w-64 items-center gap-2 rounded-lg bg-primary px-2.5 py-1.5 text-[13px] leading-snug text-primary-fg shadow-float',\n 'origin-(--trigger-anchor-point) will-change-transform',\n 'transition-[opacity,transform] duration-125 ease-out',\n 'entering:scale-[0.97] entering:opacity-0 exiting:scale-[0.97] exiting:opacity-0',\n 'motion-reduce:entering:scale-100 motion-reduce:exiting:scale-100',\n ),\n )}\n >\n {showArrow && (\n <OverlayArrow>\n <svg width={8} height={8} viewBox=\"0 0 8 8\" className=\"fill-primary group-placement-bottom:rotate-180 group-placement-left:-rotate-90 group-placement-right:rotate-90\">\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n </OverlayArrow>\n )}\n <span>{children}</span>\n {shortcut && (\n <kbd className=\"rounded border border-primary-fg/20 px-1 font-sans text-[11px] text-primary-fg/70\">{shortcut}</kbd>\n )}\n </RACTooltip>\n );\n}\n\nexport interface TooltipTriggerProps extends TooltipTriggerComponentProps {}\n\n/** Wraps a focusable trigger and a `<Tooltip>`. Default delay 600ms. */\nexport function TooltipTrigger({ delay = 600, closeDelay = 300, ...props }: TooltipTriggerProps) {\n return <RACTooltipTrigger delay={delay} closeDelay={closeDelay} {...props} />;\n}\n\n/** One-liner: `<WithTooltip content=\"Save\"><Button…/></WithTooltip>` */\nexport function WithTooltip({\n content,\n children,\n placement,\n shortcut,\n delay,\n}: {\n content: ReactNode;\n children: React.ReactElement;\n placement?: RACTooltipProps['placement'];\n shortcut?: ReactNode;\n delay?: number;\n}) {\n return (\n <TooltipTrigger delay={delay}>\n {children}\n <Tooltip placement={placement} shortcut={shortcut}>\n {content}\n </Tooltip>\n </TooltipTrigger>\n );\n}\n\n","import { forwardRef, type ReactNode } from 'react';\nimport {\n FieldError as RACFieldError,\n Input as RACInput,\n Label as RACLabel,\n NumberField as RACNumberField,\n SearchField as RACSearchField,\n Text,\n TextArea as RACTextArea,\n TextField as RACTextField,\n Group,\n Button as RACButton,\n type FieldErrorProps,\n type InputProps,\n type LabelProps,\n type NumberFieldProps as RACNumberFieldProps,\n type SearchFieldProps as RACSearchFieldProps,\n type TextFieldProps as RACTextFieldProps,\n type TextProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { MinusIcon, PlusIcon, SearchIcon, XIcon } from './icons';\n\nexport function Label(props: LabelProps) {\n return <RACLabel {...props} className={cn('text-sm font-medium text-fg select-none', props.className)} />;\n}\n\nexport function Description(props: TextProps) {\n return <Text {...props} slot=\"description\" className={cn('text-[13px] text-fg-muted', props.className)} />;\n}\n\nexport function FieldError(props: FieldErrorProps) {\n return (\n <RACFieldError\n {...props}\n className={composeTw(\n props.className,\n // Errors appear mid-form; ease them in so the layout change isn't jarring.\n 'text-[13px] text-danger transition-[opacity,translate] duration-200 ease-out starting:-translate-y-1 starting:opacity-0 motion-reduce:starting:translate-y-0',\n )}\n />\n );\n}\n\n/** Shared look for text-like controls (from the Figma \"Input Field\"). */\nexport const inputFrame = cn(\n 'flex w-full items-center rounded-control border bg-surface text-fg shadow-control',\n 'border-line transition-[border-color,box-shadow,background-color] duration-150 ease-out',\n 'hover:border-line-strong',\n 'focus-within:border-line-strong focus-within:ring-2 focus-within:ring-focus/15',\n 'has-[[data-invalid]]:border-danger has-[[aria-invalid=true]]:border-danger',\n 'has-[[data-disabled]]:opacity-50 has-[[data-disabled]]:cursor-not-allowed',\n);\n\nexport const inputSizes = { sm: 'h-9 text-sm', md: 'h-12 text-base' } as const;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(props, ref) {\n return (\n <RACInput\n ref={ref}\n {...props}\n className={composeTw(\n props.className,\n 'min-w-0 flex-1 bg-transparent px-3.5 font-sans text-fg outline-none placeholder:text-fg-subtle disabled:cursor-not-allowed [&::-webkit-search-cancel-button]:hidden',\n )}\n />\n );\n});\n\ninterface FieldChrome {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: string | ((v: ValidationResult) => string);\n size?: keyof typeof inputSizes;\n}\n\nexport interface TextFieldProps extends RACTextFieldProps, FieldChrome {\n placeholder?: string;\n /** Rendered inside the field, before the input. */\n startContent?: ReactNode;\n endContent?: ReactNode;\n}\n\nexport function TextField({\n label,\n description,\n errorMessage,\n placeholder,\n size = 'md',\n startContent,\n endContent,\n className,\n ...props\n}: TextFieldProps) {\n return (\n <RACTextField {...props} className={composeTw(className, 'group flex flex-col gap-1.5')}>\n {label && <Label>{label}</Label>}\n <div className={cn(inputFrame, inputSizes[size])}>\n {startContent && <span className=\"pl-3.5 text-fg-subtle [&+input]:pl-2\">{startContent}</span>}\n <Input placeholder={placeholder} />\n {endContent && <span className=\"pr-3.5 text-fg-subtle\">{endContent}</span>}\n </div>\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n </RACTextField>\n );\n}\n\nexport interface TextAreaFieldProps extends RACTextFieldProps, Omit<FieldChrome, 'size'> {\n placeholder?: string;\n rows?: number;\n}\n\nexport function TextAreaField({ label, description, errorMessage, placeholder, rows = 4, className, ...props }: TextAreaFieldProps) {\n return (\n <RACTextField {...props} className={composeTw(className, 'group flex flex-col gap-1.5')}>\n {label && <Label>{label}</Label>}\n <div className={cn(inputFrame, 'items-stretch')}>\n <RACTextArea\n rows={rows}\n placeholder={placeholder}\n className=\"min-h-0 w-full resize-y bg-transparent px-3.5 py-3 font-sans text-base text-fg outline-none placeholder:text-fg-subtle\"\n />\n </div>\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n </RACTextField>\n );\n}\n\nexport interface SearchFieldProps extends RACSearchFieldProps, FieldChrome {\n placeholder?: string;\n}\n\nexport function SearchField({ label, description, errorMessage, placeholder = 'Search…', size = 'md', className, ...props }: SearchFieldProps) {\n return (\n <RACSearchField {...props} className={composeTw(className, 'group flex flex-col gap-1.5')}>\n {label && <Label>{label}</Label>}\n <div className={cn(inputFrame, inputSizes[size])}>\n <SearchIcon className=\"ml-3.5 shrink-0 text-fg-subtle\" />\n <Input placeholder={placeholder} className=\"pl-2\" />\n <RACButton\n className={cn(\n 'mr-2 grid size-7 place-items-center rounded-md text-fg-subtle outline-none',\n 'transition-[opacity,background-color] duration-150 ease-out hover:bg-surface-hover pressed:bg-surface-pressed',\n 'focus-visible:ring-2 focus-visible:ring-focus/40 group-data-[empty]:pointer-events-none group-data-[empty]:opacity-0',\n )}\n >\n <XIcon size={14} />\n </RACButton>\n </div>\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n </RACSearchField>\n );\n}\n\nexport interface NumberFieldProps extends RACNumberFieldProps, FieldChrome {\n placeholder?: string;\n}\n\nconst stepper = cn(\n 'grid h-full w-10 shrink-0 place-items-center text-fg-muted outline-none',\n 'transition-[background-color,color] duration-150 ease-out hover:bg-surface-hover hover:text-fg pressed:bg-surface-pressed',\n 'disabled:opacity-40 focus-visible:bg-surface-hover',\n);\n\nexport function NumberField({ label, description, errorMessage, placeholder, size = 'md', className, ...props }: NumberFieldProps) {\n return (\n <RACNumberField {...props} className={composeTw(className, 'group flex flex-col gap-1.5')}>\n {label && <Label>{label}</Label>}\n <Group className={cn(inputFrame, inputSizes[size], 'overflow-hidden')}>\n <RACButton slot=\"decrement\" className={cn(stepper, 'border-r border-line')}>\n <MinusIcon size={14} />\n </RACButton>\n <Input placeholder={placeholder} className=\"text-center tabular-nums\" />\n <RACButton slot=\"increment\" className={cn(stepper, 'border-l border-line')}>\n <PlusIcon size={14} />\n </RACButton>\n </Group>\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n </RACNumberField>\n );\n}\n\n","import type { ReactNode } from 'react';\nimport {\n Checkbox as RACCheckbox,\n CheckboxGroup as RACCheckboxGroup,\n type CheckboxGroupProps as RACCheckboxGroupProps,\n type CheckboxProps as RACCheckboxProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { Description, FieldError, Label } from './Field';\n\nexport interface CheckboxProps extends Omit<RACCheckboxProps, 'children'> {\n children?: ReactNode;\n}\n\n/** 24px box from the Figma file; the check draws itself in on select. */\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <RACCheckbox\n {...props}\n className={composeTw(\n className,\n 'group flex items-center gap-2.5 text-base text-fg select-none disabled:opacity-50 [-webkit-tap-highlight-color:transparent]',\n )}\n >\n {({ isSelected, isIndeterminate }) => (\n <>\n <span\n className={cn(\n 'grid size-6 shrink-0 place-items-center rounded-[7px] border shadow-control',\n 'transition-[background-color,border-color] duration-150 ease-out',\n 'group-focus-visible:outline-2 group-focus-visible:outline-offset-2 group-focus-visible:outline-focus',\n isSelected || isIndeterminate\n ? 'border-primary-line bg-primary text-primary-fg group-hover:bg-primary-hover'\n : 'border-line bg-surface group-hover:border-line-strong',\n 'group-invalid:border-danger',\n )}\n >\n <svg viewBox=\"0 0 16 16\" className=\"size-4\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.25} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {isIndeterminate ? (\n <path d=\"M4 8h8\" />\n ) : (\n <path\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\n pathLength={1}\n className=\"transition-[stroke-dashoffset] duration-200 ease-out [stroke-dasharray:1]\"\n style={{ strokeDashoffset: isSelected ? 0 : 1 }}\n />\n )}\n </svg>\n </span>\n {children}\n </>\n )}\n </RACCheckbox>\n );\n}\n\nexport interface CheckboxGroupProps extends Omit<RACCheckboxGroupProps, 'children'> {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: string;\n children?: ReactNode;\n}\n\nexport function CheckboxGroup({ label, description, errorMessage, children, className, ...props }: CheckboxGroupProps) {\n return (\n <RACCheckboxGroup {...props} className={composeTw(className, 'flex flex-col gap-2.5')}>\n {label && <Label>{label}</Label>}\n {children}\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n </RACCheckboxGroup>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Radio as RACRadio,\n RadioGroup as RACRadioGroup,\n type RadioGroupProps as RACRadioGroupProps,\n type RadioProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { Description, FieldError, Label } from './Field';\n\nexport interface RadioGroupProps extends Omit<RACRadioGroupProps, 'children'> {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: string;\n children?: ReactNode;\n}\n\nexport function RadioGroup({ label, description, errorMessage, children, className, ...props }: RadioGroupProps) {\n return (\n <RACRadioGroup\n {...props}\n className={composeTw(className, 'group flex flex-col gap-2.5')}\n >\n {label && <Label>{label}</Label>}\n <div className=\"flex gap-x-5 gap-y-2.5 group-orientation-vertical:flex-col group-orientation-horizontal:flex-wrap\">\n {children}\n </div>\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n </RACRadioGroup>\n );\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <RACRadio\n {...props}\n className={composeTw(\n className,\n 'group flex items-center gap-2.5 text-base text-fg select-none disabled:opacity-50 [-webkit-tap-highlight-color:transparent]',\n )}\n >\n {(rp) => (\n <>\n <span\n className={cn(\n 'relative grid size-6 shrink-0 place-items-center rounded-full border shadow-control',\n 'transition-[background-color,border-color] duration-150 ease-out',\n 'group-focus-visible:outline-2 group-focus-visible:outline-offset-2 group-focus-visible:outline-focus',\n rp.isSelected\n ? 'border-primary-line bg-primary group-hover:bg-primary-hover'\n : 'border-line bg-surface group-hover:border-line-strong',\n )}\n >\n {/* The dot grows from 0.5, never from 0. */}\n <span\n className={cn(\n 'size-3 rounded-full bg-primary-fg shadow-hairline transition-[transform,opacity] duration-200 ease-out',\n rp.isSelected ? 'scale-100 opacity-100' : 'scale-50 opacity-0',\n )}\n />\n </span>\n {typeof children === 'function' ? children(rp) : children}\n </>\n )}\n </RACRadio>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Switch as RACSwitch, type SwitchProps as RACSwitchProps } from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\n\nexport interface SwitchProps extends Omit<RACSwitchProps, 'children'> {\n children?: ReactNode;\n size?: 'sm' | 'md';\n}\n\n/**\n * From the Figma \"Toggle\" frames — including the \"halfway\" frame, where\n * the thumb stretches while pressed and then settles on the other side.\n */\nexport function Switch({ children, size = 'md', className, ...props }: SwitchProps) {\n const md = size === 'md';\n return (\n <RACSwitch\n {...props}\n className={composeTw(\n className,\n 'group flex items-center gap-2.5 text-base text-fg select-none disabled:opacity-50 [-webkit-tap-highlight-color:transparent]',\n )}\n >\n <span\n className={cn(\n 'relative shrink-0 rounded-full border shadow-control',\n 'transition-[background-color,border-color] duration-200 ease-out',\n 'border-line bg-surface group-hover:border-line-strong',\n 'group-selected:border-primary-line group-selected:bg-primary',\n 'group-focus-visible:outline-2 group-focus-visible:outline-offset-2 group-focus-visible:outline-focus',\n md ? 'h-8 w-16' : 'h-6 w-11',\n )}\n >\n <span\n className={cn(\n 'absolute top-[1px] rounded-full bg-white group-selected:bg-primary-fg shadow-[0_0_1px_rgb(0_0_0/0.35),0_1px_3px_rgb(0_0_0/0.12)]',\n 'transition-[left,width,background-color] duration-250 ease-out motion-reduce:transition-none',\n md\n ? 'left-[1px] size-7 group-pressed:w-9 group-selected:left-[calc(100%-29px)] group-selected:group-pressed:left-[calc(100%-37px)]'\n : 'left-[1px] size-5 group-pressed:w-6 group-selected:left-[calc(100%-21px)] group-selected:group-pressed:left-[calc(100%-25px)]',\n )}\n />\n </span>\n {children}\n </RACSwitch>\n );\n}\n","import { useLayoutEffect, useRef, type ReactNode } from 'react';\nimport {\n Slider as RACSlider,\n SliderOutput,\n SliderThumb,\n SliderTrack,\n type SliderProps as RACSliderProps,\n type SliderState,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { Label } from './Field';\n\nexport interface SliderProps<T extends number | number[]> extends RACSliderProps<T> {\n label?: ReactNode;\n /** Show the current value next to the label. Default true when a label is given. */\n showValue?: boolean;\n /** Show the filled portion of the track (Figma \"Slider Fill\"). Default true. */\n showFill?: boolean;\n /** Accessible names for each thumb (range sliders). */\n thumbLabels?: string[];\n}\n\nexport function Slider<T extends number | number[]>({\n label,\n showValue = !!label,\n showFill = true,\n thumbLabels,\n className,\n ...props\n}: SliderProps<T>) {\n return (\n <RACSlider\n {...props}\n className={composeTw(className, 'group flex w-full flex-col gap-2 select-none disabled:opacity-50')}\n >\n {(label || showValue) && (\n <div className=\"flex items-center justify-between gap-4\">\n {label && <Label>{label}</Label>}\n {showValue && (\n <SliderOutput className=\"text-sm tabular-nums text-fg-muted\">\n {({ state }) => state.values.map((_, i) => state.getThumbValueLabel(i)).join(' – ')}\n </SliderOutput>\n )}\n </div>\n )}\n <SliderTrack className=\"group/track relative h-7 w-full touch-none\">\n {({ state }) => <TrackContents state={state} showFill={showFill} thumbLabels={thumbLabels} />}\n </SliderTrack>\n </RACSlider>\n );\n}\n\n/**\n * Motion rules:\n * - While a thumb is being dragged it follows the pointer 1:1 (no lag).\n * - Jumps — clicking the track, keyboard steps, programmatic changes —\n * glide there with a short ease-out instead of teleporting.\n */\nfunction TrackContents({ state, showFill, thumbLabels }: { state: SliderState; showFill: boolean; thumbLabels?: string[] }) {\n const pcts = state.values.map((_, i) => state.getThumbPercent(i) * 100);\n const dragging = state.values.map((_, i) => state.isThumbDragging(i));\n\n // What was dragging at the last commit. The first frame of a drag that\n // starts with a track click is a jump, so it still animates.\n const wasDragging = useRef<boolean[]>(dragging);\n useLayoutEffect(() => {\n wasDragging.current = dragging;\n });\n const glide = dragging.map((d, i) => !d || !wasDragging.current[i]);\n const anyTracking = dragging.some((d, i) => d && !glide[i]);\n\n const start = pcts.length > 1 ? pcts[0]! : 0;\n const end = pcts.length > 1 ? pcts[pcts.length - 1]! : pcts[0]!;\n\n return (\n <>\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 rounded-full bg-surface shadow-hairline\" />\n {showFill && (\n <div\n className={cn(\n 'absolute top-1/2 h-2 -translate-y-1/2 rounded-full bg-primary',\n !anyTracking && 'transition-[left,width] duration-200 ease-out motion-reduce:transition-none',\n )}\n style={{ left: `${start}%`, width: `${end - start}%` }}\n />\n )}\n {state.values.map((_, i) => (\n <SliderThumb\n key={i}\n index={i}\n aria-label={thumbLabels?.[i]}\n className={cn(\n 'top-1/2 size-7 rounded-full border border-surface bg-white',\n 'shadow-[0_0_1px_rgb(0_0_0/0.35),0_1px_3px_rgb(0_0_0/0.15),0_0_0_0_rgb(0_0_0/0)]',\n // Halo instead of scaling: grows on hover, stronger while dragging.\n 'hover:shadow-[0_0_1px_rgb(0_0_0/0.35),0_1px_3px_rgb(0_0_0/0.15),0_0_0_5px_rgb(0_0_0/0.06)]',\n 'dragging:shadow-[0_0_1px_rgb(0_0_0/0.35),0_1px_3px_rgb(0_0_0/0.15),0_0_0_7px_rgb(0_0_0/0.08)]',\n 'dark:hover:shadow-[0_0_1px_rgb(0_0_0/0.35),0_1px_3px_rgb(0_0_0/0.15),0_0_0_5px_rgb(255_255_255/0.1)]',\n 'dark:dragging:shadow-[0_0_1px_rgb(0_0_0/0.35),0_1px_3px_rgb(0_0_0/0.15),0_0_0_7px_rgb(255_255_255/0.14)]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',\n glide[i]\n ? 'transition-[left,box-shadow] duration-200 ease-out motion-reduce:transition-[box-shadow]'\n : 'transition-[box-shadow] duration-200 ease-out',\n )}\n />\n ))}\n </>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Button as RACButton,\n ListBox,\n ListBoxItem as RACListBoxItem,\n Select as RACSelect,\n SelectValue,\n type ListBoxItemProps,\n type SelectProps as RACSelectProps,\n} from 'react-aria-components';\nimport { cn, composeTw, focusRing } from '../lib/cn';\nimport { Description, FieldError, Label, inputSizes } from './Field';\nimport { CheckIcon, ChevronDownIcon } from './icons';\nimport type { OverlayAnimation } from '../lib/config';\nimport { Popover } from './Popover';\n\nexport interface SelectProps<T extends object> extends Omit<RACSelectProps<T>, 'children'> {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: string;\n items?: Iterable<T>;\n children: ReactNode | ((item: T) => ReactNode);\n size?: keyof typeof inputSizes;\n /** Listbox animation: `'fade'` (default), `'scale'` or `'none'`. */\n animation?: OverlayAnimation;\n}\n\nexport function Select<T extends object>({\n label,\n description,\n errorMessage,\n children,\n items,\n size = 'md',\n animation,\n className,\n ...props\n}: SelectProps<T>) {\n return (\n <RACSelect {...props} className={composeTw(className, 'group flex flex-col gap-1.5')}>\n {label && <Label>{label}</Label>}\n <RACButton\n className={cn(\n 'flex w-full items-center justify-between gap-2 rounded-control border border-line bg-surface px-3.5 text-left text-fg shadow-control',\n 'transition-[border-color,background-color] duration-150 ease-out hover:border-line-strong pressed:bg-surface-hover',\n 'group-invalid:border-danger disabled:opacity-50',\n focusRing,\n inputSizes[size],\n )}\n >\n <SelectValue className=\"truncate data-[placeholder]:text-fg-subtle\" />\n <ChevronDownIcon size={18} className=\"shrink-0 text-fg-muted transition-transform duration-200 ease-out group-open:rotate-180\" />\n </RACButton>\n {description && <Description>{description}</Description>}\n <FieldError>{errorMessage}</FieldError>\n <Popover placement=\"bottom start\" animation={animation}>\n <ListBox items={items} className=\"max-h-72 overflow-auto p-1.5 outline-none\">\n {children}\n </ListBox>\n </Popover>\n </RACSelect>\n );\n}\n\nexport function SelectItem(props: ListBoxItemProps & { children?: ReactNode }) {\n const textValue = props.textValue ?? (typeof props.children === 'string' ? props.children : undefined);\n return (\n <RACListBoxItem\n {...props}\n textValue={textValue}\n className={composeTw(\n props.className,\n 'group flex h-9 cursor-default items-center gap-2 rounded-control px-2.5 text-[15px] text-fg outline-none select-none focus:bg-surface-hover pressed:bg-surface-pressed disabled:opacity-40',\n )}\n >\n {({ isSelected }) => (\n <>\n <span className=\"flex-1 truncate\">{props.children as ReactNode}</span>\n {isSelected && <CheckIcon size={14} />}\n </>\n )}\n </RACListBoxItem>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Dialog as RACDialog,\n DialogTrigger as RACDialogTrigger,\n Heading,\n Modal as RACModal,\n ModalOverlay,\n type DialogProps as RACDialogProps,\n type DialogTriggerProps,\n type ModalOverlayProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { Button } from './Button';\nimport { XIcon } from './icons';\n\nexport function DialogTrigger(props: DialogTriggerProps) {\n return <RACDialogTrigger {...props} />;\n}\n\nconst overlayMotion = cn(\n 'fixed inset-0 z-50 bg-black/35 backdrop-blur-[2px]',\n 'transition-opacity duration-200 ease-out entering:opacity-0 exiting:opacity-0 exiting:duration-150',\n);\n\nexport interface ModalProps extends ModalOverlayProps {\n size?: 'sm' | 'md' | 'lg';\n}\n\n/** Modals stay centred (they aren't anchored to a trigger). */\nexport function Modal({ size = 'md', className, children, ...props }: ModalProps) {\n return (\n <ModalOverlay {...props} className={overlayMotion}>\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <RACModal\n className={composeTw(\n className,\n cn(\n 'w-full rounded-[16px] border border-line-subtle bg-bg text-fg shadow-float outline-none',\n 'transition-[opacity,transform] duration-250 ease-out',\n 'entering:translate-y-2 entering:scale-[0.97] entering:opacity-0',\n 'exiting:scale-[0.98] exiting:opacity-0 exiting:duration-150',\n 'motion-reduce:entering:translate-y-0 motion-reduce:entering:scale-100 motion-reduce:exiting:scale-100',\n size === 'sm' ? 'max-w-sm' : size === 'lg' ? 'max-w-2xl' : 'max-w-md',\n ),\n )}\n >\n {children}\n </RACModal>\n </div>\n </ModalOverlay>\n );\n}\n\nexport interface DialogProps extends Omit<RACDialogProps, 'children'> {\n title?: ReactNode;\n description?: ReactNode;\n children?: RACDialogProps['children'];\n /** Footer actions. Receives `close`. */\n footer?: (close: () => void) => ReactNode;\n showClose?: boolean;\n}\n\nexport function Dialog({ title, description, children, footer, showClose = true, className, ...props }: DialogProps) {\n return (\n <RACDialog {...props} className={cn('relative flex flex-col gap-4 p-6 outline-none', className)}>\n {(rp) => (\n <>\n {(title || description) && (\n <div className=\"flex flex-col gap-1.5 pr-8\">\n {title && (\n <Heading slot=\"title\" className=\"text-lg font-semibold leading-tight text-fg\">\n {title}\n </Heading>\n )}\n {description && <p className=\"text-[15px] leading-relaxed text-fg-muted\">{description}</p>}\n </div>\n )}\n {typeof children === 'function' ? children(rp) : children}\n {footer && <div className=\"mt-2 flex flex-wrap justify-end gap-2\">{footer(rp.close)}</div>}\n {showClose && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n isIconOnly\n aria-label=\"Close\"\n onPress={rp.close}\n className=\"absolute top-4 right-4\"\n >\n <XIcon size={16} />\n </Button>\n )}\n </>\n )}\n </RACDialog>\n );\n}\n\nexport interface AlertDialogProps extends Omit<DialogProps, 'footer' | 'role'> {\n confirmLabel?: ReactNode;\n cancelLabel?: ReactNode;\n variant?: 'primary' | 'danger';\n onConfirm?: () => void | Promise<void>;\n}\n\nexport function AlertDialog({\n confirmLabel = 'Continue',\n cancelLabel = 'Cancel',\n variant = 'primary',\n onConfirm,\n ...props\n}: AlertDialogProps) {\n return (\n <Dialog\n role=\"alertdialog\"\n showClose={false}\n {...props}\n footer={(close) => (\n <>\n <Button size=\"sm\" variant=\"secondary\" onPress={close}>\n {cancelLabel}\n </Button>\n <Button\n size=\"sm\"\n variant={variant}\n autoFocus\n onPress={async () => {\n await onConfirm?.();\n close();\n }}\n >\n {confirmLabel}\n </Button>\n </>\n )}\n />\n );\n}\n\nexport interface DrawerProps extends Omit<ModalOverlayProps, 'children'> {\n side?: 'right' | 'left' | 'bottom';\n}\n\n/**\n * A panel that slides in from an edge. Uses translate percentages so it\n * works at any size, with the iOS-like drawer curve.\n */\nexport function Drawer({ side = 'right', className, children, ...props }: DrawerProps & { children?: ReactNode }) {\n const pos =\n side === 'bottom'\n ? 'inset-x-0 bottom-0 max-h-[85vh] rounded-t-[20px] entering:translate-y-full exiting:translate-y-full'\n : side === 'left'\n ? 'inset-y-0 left-0 w-[min(24rem,90vw)] entering:-translate-x-full exiting:-translate-x-full'\n : 'inset-y-0 right-0 w-[min(24rem,90vw)] entering:translate-x-full exiting:translate-x-full';\n return (\n <ModalOverlay {...props} className={overlayMotion}>\n <RACModal\n className={composeTw(\n className,\n cn(\n 'fixed flex flex-col overflow-auto border-line-subtle bg-bg text-fg shadow-float outline-none',\n 'transition-transform duration-400 ease-drawer exiting:duration-250',\n 'motion-reduce:transition-opacity motion-reduce:entering:translate-0 motion-reduce:exiting:translate-0 motion-reduce:entering:opacity-0',\n side === 'bottom' ? 'border-t' : side === 'left' ? 'border-r' : 'border-l',\n pos,\n ),\n )}\n >\n {side === 'bottom' && <div aria-hidden className=\"mx-auto mt-2.5 h-1 w-10 shrink-0 rounded-full bg-line\" />}\n {children}\n </RACModal>\n </ModalOverlay>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n SelectionIndicator,\n Tab as RACTab,\n TabList as RACTabList,\n TabPanel as RACTabPanel,\n Tabs as RACTabs,\n type TabListProps,\n type TabPanelProps,\n type TabProps as RACTabProps,\n type TabsProps as RACTabsProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\n\ntype TabsVariant = 'pill' | 'underline';\n\nexport interface TabsProps extends RACTabsProps {}\n\nexport function Tabs({ className, ...props }: TabsProps) {\n return <RACTabs {...props} className={composeTw(className, 'flex gap-4 orientation-horizontal:flex-col')} />;\n}\n\nexport function TabList<T extends object>({ variant = 'pill', className, ...props }: TabListProps<T> & { variant?: TabsVariant }) {\n return (\n <RACTabList\n {...props}\n data-variant={variant}\n className={composeTw(\n className,\n cn(\n 'group/tablist relative flex',\n variant === 'pill'\n ? 'w-fit gap-0.5 rounded-[10px] border border-line bg-surface p-[3px] shadow-control'\n : 'gap-5 border-b border-line-subtle',\n ),\n )}\n />\n );\n}\n\nexport interface TabProps extends Omit<RACTabProps, 'children'> {\n children?: ReactNode;\n}\n\n/**\n * The selection indicator glides between tabs (shared-element transition);\n * text colour changes in sync with it.\n */\nexport function Tab({ children, className, ...props }: TabProps) {\n return (\n <RACTab\n {...props}\n className={composeTw(\n className,\n cn(\n 'group relative flex cursor-default items-center justify-center gap-2 text-[15px] whitespace-nowrap outline-none select-none',\n 'text-fg-muted transition-colors duration-200 ease-out hover:text-fg selected:text-fg disabled:opacity-40',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',\n 'group-data-[variant=pill]/tablist:h-9 group-data-[variant=pill]/tablist:rounded-[7px] group-data-[variant=pill]/tablist:px-3.5',\n 'group-data-[variant=underline]/tablist:h-10 group-data-[variant=underline]/tablist:px-0.5',\n ),\n )}\n >\n <SelectionIndicator\n className={cn(\n 'absolute -z-0 transition-[translate,width,height] duration-250 ease-out motion-reduce:transition-none',\n 'group-data-[variant=pill]/tablist:inset-0 group-data-[variant=pill]/tablist:rounded-[7px] group-data-[variant=pill]/tablist:bg-bg group-data-[variant=pill]/tablist:shadow-control',\n 'group-data-[variant=underline]/tablist:inset-x-0 group-data-[variant=underline]/tablist:-bottom-px group-data-[variant=underline]/tablist:h-0.5 group-data-[variant=underline]/tablist:bg-primary',\n )}\n />\n <span className=\"relative z-10 inline-flex items-center gap-2\">{children}</span>\n </RACTab>\n );\n}\n\nexport function TabPanel({ className, ...props }: TabPanelProps) {\n return (\n <RACTabPanel\n {...props}\n className={composeTw(\n className,\n 'rounded-control outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',\n )}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Meter as RACMeter,\n ProgressBar as RACProgressBar,\n type MeterProps as RACMeterProps,\n type ProgressBarProps as RACProgressBarProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { Label } from './Field';\n\nexport interface ProgressBarProps extends RACProgressBarProps {\n label?: ReactNode;\n showValue?: boolean;\n}\n\n/** Progress uses linear motion: it's a constant process, not a gesture. */\nexport function ProgressBar({ label, showValue = !!label, className, ...props }: ProgressBarProps) {\n return (\n <RACProgressBar {...props} className={composeTw(className, 'flex w-full flex-col gap-2')}>\n {({ percentage, valueText, isIndeterminate }) => (\n <>\n {(label || showValue) && (\n <div className=\"flex justify-between gap-4\">\n {label && <Label>{label}</Label>}\n {showValue && !isIndeterminate && <span className=\"text-sm tabular-nums text-fg-muted\">{valueText}</span>}\n </div>\n )}\n <div className=\"relative h-2 w-full overflow-hidden rounded-full bg-surface shadow-hairline\">\n {isIndeterminate ? (\n <div className=\"absolute inset-y-0 left-0 w-full origin-left animate-krts-indeterminate rounded-full bg-primary\" />\n ) : (\n <div\n className=\"absolute inset-y-0 left-0 w-full origin-left rounded-full bg-primary transition-transform duration-300 ease-linear\"\n style={{ transform: `scaleX(${(percentage ?? 0) / 100})` }}\n />\n )}\n </div>\n </>\n )}\n </RACProgressBar>\n );\n}\n\nexport interface MeterProps extends RACMeterProps {\n label?: ReactNode;\n /** Colour the fill by thresholds (fractions of the range). */\n thresholds?: { warning: number; danger: number };\n}\n\nexport function Meter({ label, thresholds = { warning: 0.7, danger: 0.9 }, className, ...props }: MeterProps) {\n return (\n <RACMeter {...props} className={composeTw(className, 'flex w-full flex-col gap-2')}>\n {({ percentage, valueText }) => {\n const f = percentage / 100;\n const tone = f >= thresholds.danger ? 'bg-danger' : f >= thresholds.warning ? 'bg-warning' : 'bg-success';\n return (\n <>\n <div className=\"flex justify-between gap-4\">\n {label && <Label>{label}</Label>}\n <span className=\"text-sm tabular-nums text-fg-muted\">{valueText}</span>\n </div>\n <div className=\"relative h-2 w-full overflow-hidden rounded-full bg-surface shadow-hairline\">\n <div\n className={cn('absolute inset-y-0 left-0 w-full origin-left rounded-full transition-[transform,background-color] duration-300 ease-out', tone)}\n style={{ transform: `scaleX(${f})` }}\n />\n </div>\n </>\n );\n }}\n </RACMeter>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Button as RACButton,\n Disclosure as RACDisclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps as RACDisclosureProps,\n} from 'react-aria-components';\nimport { cn, composeTw } from '../lib/cn';\nimport { ChevronDownIcon } from './icons';\n\nexport interface DisclosureProps extends Omit<RACDisclosureProps, 'children'> {\n title: ReactNode;\n children: ReactNode;\n}\n\n/**\n * Expandable section. Height animates via `--disclosure-panel-height`\n * which React Aria measures for us.\n */\nexport function Disclosure({ title, children, className, ...props }: DisclosureProps) {\n return (\n <RACDisclosure {...props} className={composeTw(className, 'group border-b border-line-subtle')}>\n <Heading className=\"m-0\">\n <RACButton\n slot=\"trigger\"\n className={cn(\n 'flex w-full items-center justify-between gap-4 py-3.5 text-left text-[15px] font-medium text-fg outline-none',\n 'rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',\n )}\n >\n {title}\n <ChevronDownIcon size={18} className=\"shrink-0 text-fg-muted transition-transform duration-250 ease-out group-expanded:rotate-180\" />\n </RACButton>\n </Heading>\n <DisclosurePanel\n className={cn(\n 'h-(--disclosure-panel-height) overflow-clip motion-safe:transition-[height] duration-250 ease-out',\n )}\n >\n <div className=\"pb-4 text-[15px] leading-relaxed text-fg-muted opacity-0 transition-opacity duration-200 ease-out group-expanded:opacity-100\">\n {children}\n </div>\n </DisclosurePanel>\n </RACDisclosure>\n );\n}\n\nexport function Accordion({ className, ...props }: DisclosureGroupProps) {\n return <DisclosureGroup {...props} className={composeTw(className, 'flex flex-col border-t border-line-subtle')} />;\n}\n","import { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { cn } from '../lib/cn';\nimport { CheckIcon, XIcon } from './icons';\nimport { Spinner } from './Spinner';\n\n/* ── store ────────────────────────────────────────────────────────────── */\n\nexport type ToastType = 'default' | 'success' | 'error' | 'loading';\n\nexport interface ToastAction {\n label: ReactNode;\n onPress: () => void;\n}\n\nexport interface ToastOptions {\n id?: string | number;\n description?: ReactNode;\n /** ms before auto-dismiss. `Infinity` keeps it. Default 4000 (loading: Infinity). */\n duration?: number;\n action?: ToastAction;\n onDismiss?: () => void;\n}\n\ninterface ToastRecord extends ToastOptions {\n id: string | number;\n title: ReactNode;\n type: ToastType;\n createdAt: number;\n removing?: boolean;\n}\n\nlet toasts: ToastRecord[] = [];\nlet counter = 0;\nconst listeners = new Set<() => void>();\nconst emit = () => listeners.forEach((l) => l());\nconst subscribe = (l: () => void) => {\n listeners.add(l);\n return () => listeners.delete(l);\n};\n\nfunction upsert(title: ReactNode, type: ToastType, opts: ToastOptions = {}) {\n const id = opts.id ?? ++counter;\n const existing = toasts.find((t) => t.id === id);\n if (existing) {\n // Updating in place (e.g. loading → success) keeps position and restarts the timer.\n toasts = toasts.map((t) => (t.id === id ? { ...t, ...opts, title, type, createdAt: Date.now(), removing: false } : t));\n } else {\n toasts = [...toasts, { ...opts, id, title, type, createdAt: Date.now() }];\n }\n emit();\n return id;\n}\n\nfunction dismiss(id?: string | number) {\n toasts = toasts.map((t) => (id === undefined || t.id === id ? { ...t, removing: true } : t));\n emit();\n}\n\nfunction remove(id: string | number) {\n const t = toasts.find((x) => x.id === id);\n toasts = toasts.filter((x) => x.id !== id);\n t?.onDismiss?.();\n emit();\n}\n\n/**\n * Call from anywhere — no hooks or context needed. Render `<Toaster />` once.\n *\n * ```ts\n * toast('Saved');\n * toast.success('Uploaded', { description: 'photo.jpg' });\n * toast('Message archived', { action: { label: 'Undo', onPress: restore } });\n * toast.promise(save(), { loading: 'Saving…', success: 'Saved', error: 'Failed' });\n * ```\n */\nexport const toast = Object.assign((title: ReactNode, opts?: ToastOptions) => upsert(title, 'default', opts), {\n success: (title: ReactNode, opts?: ToastOptions) => upsert(title, 'success', opts),\n error: (title: ReactNode, opts?: ToastOptions) => upsert(title, 'error', opts),\n loading: (title: ReactNode, opts?: ToastOptions) => upsert(title, 'loading', opts),\n dismiss,\n promise<T>(\n promise: Promise<T>,\n msgs: { loading: ReactNode; success: ReactNode | ((v: T) => ReactNode); error: ReactNode | ((e: unknown) => ReactNode) },\n opts?: ToastOptions,\n ) {\n const id = upsert(msgs.loading, 'loading', opts);\n promise.then(\n (v) => upsert(typeof msgs.success === 'function' ? msgs.success(v) : msgs.success, 'success', { ...opts, id }),\n (e) => upsert(typeof msgs.error === 'function' ? msgs.error(e) : msgs.error, 'error', { ...opts, id }),\n );\n return promise;\n },\n});\n\n/* ── UI ───────────────────────────────────────────────────────────────── */\n\nexport interface ToasterProps {\n position?: 'bottom-right' | 'bottom-center' | 'bottom-left' | 'top-right' | 'top-center' | 'top-left';\n /** How many toasts are visible in the collapsed stack. Default 3. */\n visibleToasts?: number;\n /** Always show the stack expanded. */\n expand?: boolean;\n}\n\nconst GAP = 10;\n\nexport function Toaster({ position = 'bottom-right', visibleToasts = 3, expand = false }: ToasterProps) {\n const list = useSyncExternalStore(subscribe, () => toasts, () => toasts);\n const [hovered, setHovered] = useState(false);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const isTop = position.startsWith('top');\n const expanded = expand || hovered;\n\n // Pause timers while the tab is hidden: nobody saw that toast.\n const [docHidden, setDocHidden] = useState(false);\n useEffect(() => {\n const on = () => setDocHidden(document.hidden);\n document.addEventListener('visibilitychange', on);\n return () => document.removeEventListener('visibilitychange', on);\n }, []);\n\n useEffect(() => {\n if (list.length === 0) setHovered(false);\n }, [list.length]);\n\n const ordered = [...list].reverse(); // newest first\n const visible = ordered.filter((t) => !t.removing);\n const frontHeight = heights[String(visible[0]?.id)] ?? 56;\n\n return (\n <section\n aria-label=\"Notifications\"\n tabIndex={-1}\n className={cn(\n 'pointer-events-none fixed z-[100] w-[min(360px,calc(100vw-32px))]',\n isTop ? 'top-4' : 'bottom-4',\n position.endsWith('right') ? 'right-4' : position.endsWith('left') ? 'left-4' : 'left-1/2 -translate-x-1/2',\n )}\n >\n <ol\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n className=\"pointer-events-auto relative\"\n // Fill the gaps between expanded toasts so hover doesn't flicker.\n style={{\n height: expanded\n ? visible.reduce((sum, t) => sum + (heights[String(t.id)] ?? 56) + GAP, 0)\n : list.length\n ? frontHeight\n : 0,\n }}\n >\n {ordered.map((t) => {\n const index = visible.indexOf(t);\n const offset = expanded\n ? visible.slice(0, Math.max(0, index)).reduce((sum, x) => sum + (heights[String(x.id)] ?? 56) + GAP, 0)\n : Math.max(0, index) * 12;\n return (\n <ToastItem\n key={t.id}\n toast={t}\n index={index}\n isTop={isTop}\n expanded={expanded}\n offset={offset}\n hiddenInStack={index >= visibleToasts}\n collapsedHeight={frontHeight}\n paused={hovered || docHidden}\n onHeight={(h) => setHeights((p) => (p[String(t.id)] === h ? p : { ...p, [String(t.id)]: h }))}\n />\n );\n })}\n </ol>\n </section>\n );\n}\n\nconst typeIcon: Record<ToastType, ReactNode> = {\n default: null,\n success: (\n <span className=\"grid size-5 place-items-center rounded-full bg-success text-white\">\n <CheckIcon size={12} />\n </span>\n ),\n error: (\n <span className=\"grid size-5 place-items-center rounded-full bg-danger text-white\">\n <XIcon size={12} />\n </span>\n ),\n loading: <Spinner size={16} className=\"text-fg-muted\" />,\n};\n\nfunction ToastItem({\n toast: t,\n index,\n isTop,\n expanded,\n offset,\n hiddenInStack,\n collapsedHeight,\n paused,\n onHeight,\n}: {\n toast: ToastRecord;\n index: number;\n isTop: boolean;\n expanded: boolean;\n offset: number;\n hiddenInStack: boolean;\n collapsedHeight: number;\n paused: boolean;\n onHeight: (h: number) => void;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const [mounted, setMounted] = useState(false);\n const drag = useRef<{ x: number; y: number; t: number; id: number } | null>(null);\n const removing = !!t.removing;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n const prev = el.style.height;\n el.style.height = 'auto';\n onHeight(el.getBoundingClientRect().height);\n el.style.height = prev;\n }, [t.title, t.description, t.action, t.type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const r = requestAnimationFrame(() => setMounted(true));\n return () => cancelAnimationFrame(r);\n }, []);\n\n // Auto-dismiss with pause/resume that remembers elapsed time.\n const remaining = useRef<number>(t.duration ?? (t.type === 'loading' ? Infinity : 4000));\n useEffect(() => {\n remaining.current = t.duration ?? (t.type === 'loading' ? Infinity : 4000);\n }, [t.createdAt, t.duration, t.type]);\n useEffect(() => {\n if (removing || paused || !Number.isFinite(remaining.current)) return;\n const start = Date.now();\n const timer = setTimeout(() => dismiss(t.id), remaining.current);\n return () => {\n clearTimeout(timer);\n remaining.current -= Date.now() - start;\n };\n }, [paused, removing, t.id, t.createdAt]);\n\n useEffect(() => {\n if (!removing) return;\n const timer = setTimeout(() => remove(t.id), 200);\n return () => clearTimeout(timer);\n }, [removing, t.id]);\n\n const dir = isTop ? 1 : -1;\n const visible = mounted && !removing && !hiddenInStack;\n const scale = expanded || index <= 0 ? 1 : Math.max(0.8, 1 - index * 0.05);\n const transform = `translateY(${!mounted || removing ? `${isTop ? -100 : 100}%` : `${dir * offset}px`}) scale(${scale})`;\n\n return (\n <li\n ref={ref}\n role={t.type === 'error' ? 'alert' : 'status'}\n aria-live={t.type === 'error' ? 'assertive' : 'polite'}\n aria-atomic\n tabIndex={0}\n data-front={index === 0 || undefined}\n onKeyDown={(e) => {\n if (e.key === 'Escape') dismiss(t.id);\n }}\n onPointerDown={(e) => {\n if ((e.target as HTMLElement).closest('button')) return;\n if (drag.current) return; // ignore extra fingers\n drag.current = { x: e.clientX, y: e.clientY, t: Date.now(), id: e.pointerId };\n e.currentTarget.setPointerCapture(e.pointerId);\n }}\n onPointerMove={(e) => {\n const d = drag.current;\n if (!d || d.id !== e.pointerId || !ref.current) return;\n const dx = e.clientX - d.x;\n // Update transform directly (not a CSS var) to avoid restyling children.\n ref.current.style.transition = 'none';\n ref.current.style.transform = `translateY(${dir * offset}px) translateX(${dx}px)`;\n ref.current.style.opacity = String(Math.max(0, 1 - Math.abs(dx) / 260));\n }}\n onPointerUp={(e) => {\n const d = drag.current;\n drag.current = null;\n if (!d || !ref.current) return;\n const dx = e.clientX - d.x;\n const velocity = Math.abs(dx) / Math.max(1, Date.now() - d.t);\n ref.current.style.transition = '';\n ref.current.style.opacity = '';\n // A quick flick is enough; no need to drag past a threshold.\n if (Math.abs(dx) > 80 || velocity > 0.11) {\n ref.current.style.transform = `translateX(${dx > 0 ? 120 : -120}%)`;\n ref.current.style.opacity = '0';\n dismiss(t.id);\n } else {\n ref.current.style.transform = '';\n }\n }}\n onPointerCancel={() => {\n drag.current = null;\n if (ref.current) {\n ref.current.style.transition = '';\n ref.current.style.transform = '';\n ref.current.style.opacity = '';\n }\n }}\n className={cn(\n 'absolute inset-x-0 flex touch-none items-start gap-3 overflow-hidden rounded-[12px] border border-line-subtle bg-overlay p-3.5 text-fg shadow-float outline-none select-none',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus',\n // Transitions, not keyframes: toasts arrive in bursts and must retarget smoothly.\n 'transition-[transform,opacity,height] duration-400 ease-[ease] motion-reduce:transition-opacity',\n isTop ? 'top-0 origin-bottom' : 'bottom-0 origin-top',\n )}\n style={{\n transform,\n opacity: visible ? 1 : 0,\n zIndex: 100 - Math.max(0, index),\n height: !expanded && index > 0 ? collapsedHeight : undefined,\n pointerEvents: hiddenInStack ? 'none' : undefined,\n }}\n >\n {typeIcon[t.type] && <span className=\"mt-px shrink-0\">{typeIcon[t.type]}</span>}\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-0.5 transition-opacity duration-200',\n !expanded && index > 0 && 'opacity-0',\n )}\n >\n <div className=\"text-[14.5px] font-medium leading-snug\">{t.title}</div>\n {t.description && <div className=\"text-[13.5px] leading-snug text-fg-muted\">{t.description}</div>}\n </div>\n {t.action && (\n <button\n type=\"button\"\n onClick={() => {\n t.action!.onPress();\n dismiss(t.id);\n }}\n className=\"h-7 shrink-0 rounded-md bg-primary px-2.5 text-[13px] font-medium text-primary-fg transition-opacity duration-150 ease-out outline-none hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t.action.label}\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={() => dismiss(t.id)}\n className=\"-mt-0.5 -mr-1 grid size-6 shrink-0 place-items-center rounded-md text-fg-subtle outline-none transition-colors duration-150 hover:bg-surface-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-focus\"\n >\n <XIcon size={13} />\n </button>\n </li>\n );\n}\n","import { forwardRef, useState, type HTMLAttributes, type ReactNode } from 'react';\nimport { Link as RACLink, Separator as RACSeparator, type LinkProps, type SeparatorProps } from 'react-aria-components';\nimport { cn, composeTw, focusRing } from '../lib/cn';\n\n/* ── Skeleton ─────────────────────────────────────────────────────────── */\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n /** Render a circle (avatars). */\n circle?: boolean;\n}\n\n/**\n * Placeholder in the exact shape of the content to come, so the layout\n * doesn't jump when it arrives.\n */\nexport function Skeleton({ circle, className, ...props }: SkeletonProps) {\n return (\n <div\n aria-hidden\n {...props}\n className={cn(\n 'relative isolate overflow-hidden bg-surface-hover',\n circle ? 'rounded-full' : 'rounded-md',\n 'after:absolute after:inset-0 after:-translate-x-full after:animate-krts-shimmer after:bg-gradient-to-r after:from-transparent after:via-bg/60 after:to-transparent',\n 'motion-reduce:after:hidden',\n className,\n )}\n />\n );\n}\n\n/* ── Badge ────────────────────────────────────────────────────────────── */\n\nconst badgeTones = {\n neutral: 'bg-surface text-fg border-line',\n solid: 'bg-primary text-primary-fg border-primary-line',\n danger: 'bg-danger-soft text-danger border-danger/25',\n success: 'bg-success/10 text-success border-success/25',\n warning: 'bg-warning/10 text-warning border-warning/25',\n} as const;\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: keyof typeof badgeTones;\n /** Show a leading status dot. */\n dot?: boolean;\n}\n\nexport function Badge({ tone = 'neutral', dot, className, children, ...props }: BadgeProps) {\n return (\n <span\n {...props}\n className={cn(\n 'inline-flex h-6 items-center gap-1.5 rounded-full border px-2.5 text-[12.5px] font-medium leading-none whitespace-nowrap',\n badgeTones[tone],\n className,\n )}\n >\n {dot && <span aria-hidden className=\"size-1.5 rounded-full bg-current\" />}\n {children}\n </span>\n );\n}\n\n/* ── Kbd ──────────────────────────────────────────────────────────────── */\n\nexport function Kbd({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return (\n <kbd\n {...props}\n className={cn(\n 'inline-flex h-6 min-w-6 items-center justify-center rounded-md border border-line border-b-2 bg-surface px-1.5 font-sans text-[12px] text-fg-muted',\n className,\n )}\n />\n );\n}\n\n/* ── Avatar ───────────────────────────────────────────────────────────── */\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n /** Used for initials when there's no image. */\n name?: string;\n size?: number;\n}\n\nexport function Avatar({ src, alt, name = '', size = 36, className, ...props }: AvatarProps) {\n const [loadedSrc, setLoadedSrc] = useState<string | null>(null);\n const loaded = !!src && loadedSrc === src;\n const initials = name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]!.toUpperCase())\n .join('');\n return (\n <span\n {...props}\n role=\"img\"\n aria-label={alt ?? name}\n className={cn(\n 'relative inline-grid shrink-0 place-items-center overflow-hidden rounded-full border border-line bg-surface font-medium text-fg-muted select-none',\n className,\n )}\n style={{ width: size, height: size, fontSize: size * 0.38, ...props.style }}\n >\n {/* Initials sit underneath; the photo fades in once it has loaded instead of popping. */}\n {(!src || !loaded) && initials}\n {src && (\n <img\n src={src}\n alt=\"\"\n draggable={false}\n onLoad={() => setLoadedSrc(src)}\n className={cn('absolute inset-0 size-full object-cover transition-opacity duration-300 ease-out', loaded ? 'opacity-100' : 'opacity-0')}\n />\n )}\n </span>\n );\n}\n\n/* ── Card ─────────────────────────────────────────────────────────────── */\n\nexport const Card = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function Card({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n {...props}\n className={cn('rounded-[14px] border border-line-subtle bg-bg p-5 text-fg shadow-control', className)}\n />\n );\n});\n\nexport function CardHeader({ title, description, action }: { title: ReactNode; description?: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-base font-semibold leading-tight text-fg\">{title}</h3>\n {description && <p className=\"text-sm text-fg-muted\">{description}</p>}\n </div>\n {action}\n </div>\n );\n}\n\n/* ── Separator & Link ─────────────────────────────────────────────────── */\n\nexport function Separator({ className, ...props }: SeparatorProps & { className?: string }) {\n return (\n <RACSeparator\n {...props}\n className={cn(\n 'shrink-0 bg-line-subtle',\n props.orientation === 'vertical' ? 'w-px self-stretch' : 'h-px w-full',\n className,\n )}\n />\n );\n}\n\nexport function Link({ className, ...props }: LinkProps) {\n return (\n <RACLink\n {...props}\n className={composeTw(\n className,\n cn(\n 'rounded-sm text-fg underline decoration-line-strong underline-offset-[3px] transition-[text-decoration-color] duration-150 ease-out hover:decoration-fg',\n focusRing,\n ),\n )}\n />\n );\n}\n"],"mappings":"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","names":["Separator","import_react","emit","import_react","import_react","import_react","import_react_aria_components","import_react_aria","import_jsx_runtime","import_jsx_runtime","Button","RACButton","import_react","import_react_aria_components","import_react_aria","import_jsx_runtime","import_jsx_runtime","HoldButton","RACButton","import_react","import_jsx_runtime","import_react","import_react_aria","import_jsx_runtime","GestureArea","import_react_aria_components","import_jsx_runtime","RACToggleButton","RACToggleButtonGroup","import_react_aria_components","import_react_aria_components","import_jsx_runtime","RACPopover","import_jsx_runtime","RACMenuTrigger","RACSubmenuTrigger","RACMenu","RACMenuItem","RACMenuSection","import_jsx_runtime","import_react_aria_components","import_jsx_runtime","RACTooltip","RACTooltipTrigger","import_react","import_react_aria_components","import_jsx_runtime","RACLabel","RACFieldError","Input","RACInput","RACTextField","RACTextArea","RACSearchField","RACButton","RACNumberField","import_react_aria_components","import_jsx_runtime","RACCheckbox","RACCheckboxGroup","import_react_aria_components","import_jsx_runtime","RACRadioGroup","RACRadio","import_react_aria_components","import_jsx_runtime","RACSwitch","import_react","import_react_aria_components","import_jsx_runtime","RACSlider","import_react_aria_components","import_jsx_runtime","RACSelect","RACButton","RACListBoxItem","import_react_aria_components","import_jsx_runtime","RACDialogTrigger","RACModal","RACDialog","import_react_aria_components","import_jsx_runtime","RACTabs","RACTabList","RACTab","RACTabPanel","import_react_aria_components","import_jsx_runtime","RACProgressBar","RACMeter","import_react_aria_components","import_jsx_runtime","RACDisclosure","RACButton","import_react","import_jsx_runtime","import_react","import_react_aria_components","import_jsx_runtime","Card","Separator","RACSeparator","RACLink"]}
|