@salemcobalt/ui 0.2.0-rc.30 → 0.2.0-rc.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cx.ts","../src/components/Button/Button.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/Stack/Stack.tsx","../src/components/Inline/Inline.tsx","../src/components/Kbd/Kbd.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/sheetSwipe.ts","../src/components/Icon/Icon.tsx","../src/icons/icons.gen.tsx","../src/icons/icon-names.gen.ts","../src/components/IconButton/IconButton.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Menu/Menu.tsx","../src/components/Input/Input.tsx","../src/components/Field/FieldShell.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Select/Select.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Banner/Banner.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Progress/Progress.tsx","../src/components/Heading/Heading.tsx","../src/components/Text/Text.tsx","../src/components/Table/Table.tsx","../src/components/Table/useRowSelection.ts","../src/components/Table/rowSelection.ts","../src/components/SelectionBar/SelectionBar.tsx","../src/components/Toast/Toast.tsx","../src/components/Stat/Stat.tsx","../src/components/Chip/Chip.tsx","../src/components/Disclosure/Disclosure.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/FileInput/FileInput.tsx","../src/components/FilePreviewDialog/FilePreviewDialog.tsx","../src/components/FileInput/accept.ts","../src/utils/useMediaQuery.ts","../src/components/PriorityNav/PriorityNav.tsx","../src/components/PriorityNav/fit.ts","../src/components/PriorityNav/place.ts","../src/components/Popover/Popover.tsx","../src/components/BroomIcon/BroomIcon.tsx","../src/components/FullScreenFlow/FullScreenFlow.tsx","../src/components/Score/Score.tsx","../src/components/ReasonList/ReasonList.tsx","../src/components/WordDiff/WordDiff.tsx","../src/components/Quote/Quote.tsx","../src/components/Avatar/Avatar.tsx","../src/index.ts"],"sourcesContent":["/** Joins class names, dropping falsy entries. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ');\n}\n","import type { ComponentPropsWithRef, MouseEvent, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends ComponentPropsWithRef<'button'> {\n /** `primary` for the one main action in a view, `secondary` for the rest, `ghost` in toolbars and rows, `danger` for destructive confirmations. */\n variant?: ButtonVariant | undefined;\n /** 32, 40 or 48px tall. Compact density shrinks each by one step. */\n size?: ButtonSize | undefined;\n /** A 16px icon before the label. */\n iconStart?: ReactNode | undefined;\n /** A 16px icon after the label. */\n iconEnd?: ReactNode | undefined;\n /** Keeps the width, hides the label, shows a spinner, sets `aria-busy` and ignores clicks. */\n loading?: boolean | undefined;\n /** Stretches to the container. */\n fullWidth?: boolean | undefined;\n /** A keyboard hint after the label: `shortcut={<Kbd>N</Kbd>}`. Hidden from assistive tech; announce the key with `aria-keyshortcuts=\"n\"`. Not shown on devices with no fine pointer (touch only). */\n shortcut?: ReactNode | undefined;\n /** Shows only `iconStart` (or `iconEnd`) in a square button; the label stays the accessible name and the shortcut hides. Toggles without remounting, e.g. when a header runs out of room. Pair with a Tooltip carrying the label. */\n iconOnly?: boolean | undefined;\n}\n\n/** The one way to trigger an action. Renders a native `<button>`; `type` defaults to `button`. */\nexport function Button({\n variant = 'primary',\n size = 'md',\n iconStart,\n iconEnd,\n loading = false,\n fullWidth = false,\n shortcut,\n iconOnly = false,\n type = 'button',\n className,\n children,\n onClick,\n ...rest\n}: ButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n return (\n <button\n type={type}\n className={cx('sc-button', className)}\n data-variant={variant}\n data-size={size}\n data-loading={loading || undefined}\n data-full-width={fullWidth || undefined}\n data-icon-only={iconOnly || undefined}\n aria-busy={loading || undefined}\n onClick={handleClick}\n {...rest}\n >\n {iconStart ? (\n <span className=\"sc-button__icon\" aria-hidden=\"true\">\n {iconStart}\n </span>\n ) : null}\n <span className=\"sc-button__label\">{children}</span>\n {iconEnd ? (\n <span className=\"sc-button__icon\" aria-hidden=\"true\">\n {iconEnd}\n </span>\n ) : null}\n {shortcut ? (\n <span className=\"sc-button__shortcut\" aria-hidden=\"true\">\n {shortcut}\n </span>\n ) : null}\n {loading ? <span className=\"sc-button__spinner\" aria-hidden=\"true\" /> : null}\n </button>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\nexport type BadgeVariant = 'soft' | 'solid' | 'outline';\nexport type BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends ComponentPropsWithRef<'span'> {\n /** Color reinforces the status; the word is the status. */\n tone?: BadgeTone | undefined;\n /** `soft` tinted fill (default), `solid` filled, `outline` hairline. */\n variant?: BadgeVariant | undefined;\n /** `md` 24px (default) or `sm` 20px for table rows and Card headers. */\n size?: BadgeSize | undefined;\n /** A 6px dot before the label for scannable lists. */\n dot?: boolean | undefined;\n}\n\n/** One or two words of status beside a thing. Text only; never clickable. */\nexport function Badge({\n tone = 'neutral',\n variant = 'soft',\n size = 'md',\n dot = false,\n className,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n className={cx('sc-badge', className)}\n data-tone={tone}\n data-variant={variant}\n data-size={size}\n {...rest}\n >\n {dot ? <span className=\"sc-badge__dot\" aria-hidden=\"true\" /> : null}\n {children}\n </span>\n );\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { cx } from '../../utils/cx';\n\nexport type CardVariant = 'outlined' | 'elevated' | 'filled' | 'plain';\nexport type CardPadding = 'none' | 'sm' | 'md' | 'lg';\nexport type CardElement = 'div' | 'article' | 'section' | 'nav' | 'li' | 'a' | 'button';\n\nexport interface CardProps extends useRender.ComponentProps<'div'> {\n /** `outlined` hairline (default), `elevated` floats, `filled` is an inset region, `plain` has no surface: a quiet list row that washes on hover and takes the accent wash and border when selected. */\n variant?: CardVariant | undefined;\n /** `none`, `sm` 12px, `md` 16px (default), `lg` 24px. */\n padding?: CardPadding | undefined;\n /** Hover lifts the card and the whole card is the target. Render it as `a` or `button` so it is a real control. */\n interactive?: boolean | undefined;\n /** Accent border with a 1px inset, for the active row or chosen option; on `plain`, the accent wash with a 1px accent border. Also recolours a Score inside. Visual only: pair it with `aria-pressed`, `aria-selected` or `aria-current`. */\n selected?: boolean | undefined;\n /** Element to render when `render` is not given. Use `nav` (with an `aria-label`) for a carded navigation landmark. */\n as?: CardElement | undefined;\n}\n\n/** A bordered surface that groups related content. Compose the inside with Stack and Inline. */\nexport function Card({\n variant = 'outlined',\n padding = 'md',\n interactive = false,\n selected = false,\n as = 'div',\n render,\n className,\n ref,\n ...rest\n}: CardProps) {\n return useRender({\n render,\n ref,\n defaultTagName: as,\n props: {\n className: cx('sc-card', className),\n 'data-variant': variant,\n 'data-padding': padding,\n 'data-interactive': interactive || undefined,\n 'data-selected': selected || undefined,\n ...rest,\n },\n });\n}\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport type { SpacingSize } from '../../types';\nimport { cx } from '../../utils/cx';\n\nexport type StackAlign = 'stretch' | 'start' | 'center' | 'end';\nexport type StackJustify = 'start' | 'center' | 'end' | 'between';\nexport type StackElement =\n | 'div'\n | 'section'\n | 'article'\n | 'ul'\n | 'ol'\n | 'li'\n | 'nav'\n | 'form'\n | 'fieldset'\n | 'header'\n | 'footer'\n | 'main'\n | 'aside'\n | 'dl';\n\nexport interface StackProps extends ComponentPropsWithRef<'div'> {\n /** Gap from the spacing scale. Default `sm` (12px). */\n gap?: SpacingSize | undefined;\n /** Cross-axis alignment. Default `stretch`. */\n align?: StackAlign | undefined;\n /** Main-axis distribution. Default `start`. */\n justify?: StackJustify | undefined;\n /** Element to render. Use `ul`/`ol` for lists and `li` for an item that stacks its own content, so semantics survive the layout. */\n as?: StackElement | undefined;\n /** Lays out as `inline-flex`. */\n inline?: boolean | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Vertical flex layout with a token gap. The only way children should be spaced vertically. */\nexport function Stack({\n gap = 'sm',\n align = 'stretch',\n justify = 'start',\n as = 'div',\n inline = false,\n className,\n ...rest\n}: StackProps) {\n return createElement(as, {\n className: cx('sc-stack', className),\n 'data-gap': gap,\n 'data-align': align,\n 'data-justify': justify,\n 'data-inline': inline || undefined,\n ...rest,\n });\n}\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport type { SpacingSize } from '../../types';\nimport { cx } from '../../utils/cx';\n\nexport type InlineAlign = 'center' | 'start' | 'end' | 'baseline' | 'stretch';\nexport type InlineJustify = 'start' | 'center' | 'end' | 'between';\nexport type InlineElement =\n 'div' | 'span' | 'ul' | 'ol' | 'li' | 'nav' | 'header' | 'footer' | 'p' | 'label' | 'dd';\n\nexport interface InlineProps extends ComponentPropsWithRef<'div'> {\n /** Gap from the spacing scale. Default `xs` (8px). */\n gap?: SpacingSize | undefined;\n /** Cross-axis alignment. Default `center`; use `baseline` when mixing text sizes. */\n align?: InlineAlign | undefined;\n /** Main-axis distribution. Default `start`. */\n justify?: InlineJustify | undefined;\n /** Wraps by default; `false` for toolbars that scroll. */\n wrap?: boolean | undefined;\n /** Element to render. Use `ul`/`ol` for a row of items and `li` for an item laid out as a row. */\n as?: InlineElement | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Horizontal flex layout that wraps. For rows of buttons, badges, metadata and key combinations. */\nexport function Inline({\n gap = 'xs',\n align = 'center',\n justify = 'start',\n wrap = true,\n as = 'div',\n className,\n ...rest\n}: InlineProps) {\n return createElement(as, {\n className: cx('sc-inline', className),\n 'data-gap': gap,\n 'data-align': align,\n 'data-justify': justify,\n 'data-nowrap': wrap ? undefined : '',\n ...rest,\n });\n}\n","import { Children, Fragment, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type KbdProps = ComponentPropsWithRef<'kbd'>;\n\n/** A single key, rendered like a keycap. One Kbd per key; group keys with `Kbd.Group`. */\nfunction KbdBase({ className, ...rest }: KbdProps) {\n return <kbd className={cx('sc-kbd', className)} {...rest} />;\n}\n\nexport interface KbdGroupProps extends ComponentPropsWithRef<'span'> {\n /** The readable combination, announced instead of the symbols: \"Command K\". */\n label: string;\n /** `plus` (default) draws a muted + between keys; `space` leaves a gap. */\n separator?: 'plus' | 'space' | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Groups the keys of one shortcut. */\nfunction KbdGroup({ label, separator = 'plus', className, children, ...rest }: KbdGroupProps) {\n const keys = Children.toArray(children);\n return (\n <span role=\"group\" aria-label={label} className={cx('sc-kbd-group', className)} {...rest}>\n {keys.map((key, i) => (\n <Fragment key={i}>\n {i > 0 && separator === 'plus' ? (\n <span className=\"sc-kbd-group__sep\" aria-hidden=\"true\">\n +\n </span>\n ) : null}\n {key}\n </Fragment>\n ))}\n </span>\n );\n}\n\nexport const Kbd = Object.assign(KbdBase, { Group: KbdGroup });\n","import { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport { createContext, useCallback, useContext, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Inline, type InlineProps } from '../Inline/Inline';\nimport { attachSheetSwipe } from './sheetSwipe';\nimport { XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogVariant = 'dialog' | 'sheet' | 'fullscreen';\n/** How a person asked to close: Esc, a press on the backdrop, or a `Dialog.Close`. */\nexport type DialogCloseRequestReason = 'escape-key' | 'outside-press' | 'close-press';\n\nconst REQUESTABLE: ReadonlySet<string> = new Set<DialogCloseRequestReason>([\n 'escape-key',\n 'outside-press',\n 'close-press',\n]);\n\nexport interface DialogRootProps {\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the dialog opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** When `false`, Esc and backdrop clicks no longer close the dialog. Default `true`. */\n dismissible?: boolean | undefined;\n /**\n * When set, the dialog no longer closes itself: Esc, a backdrop press and every `Dialog.Close` call\n * this with the reason instead, and the app closes it by setting `open` to `false` (for example after\n * a \"Leave for now?\" confirmation). Use with a controlled `open`. `dismissible={false}` still swallows\n * Esc and backdrop presses first.\n */\n onRequestClose?: ((reason: DialogCloseRequestReason) => void) | undefined;\n children?: ReactNode | undefined;\n}\n\nconst DismissibleContext = createContext(true);\n\n/** Owns the open state. Wrap a `Dialog.Trigger` and a `Dialog.Content`. */\nfunction Root({\n dismissible = true,\n onOpenChange,\n onRequestClose,\n open,\n defaultOpen,\n children,\n}: DialogRootProps) {\n return (\n <BaseDialog.Root\n open={open}\n defaultOpen={defaultOpen}\n disablePointerDismissal={!dismissible}\n onOpenChange={(next, details) => {\n if (\n !dismissible &&\n !next &&\n (details.reason === 'escape-key' || details.reason === 'outside-press')\n ) {\n details.cancel();\n return;\n }\n if (!next && onRequestClose && REQUESTABLE.has(details.reason)) {\n details.cancel();\n onRequestClose(details.reason as DialogCloseRequestReason);\n return;\n }\n onOpenChange?.(next);\n }}\n >\n <DismissibleContext.Provider value={dismissible}>{children}</DismissibleContext.Provider>\n </BaseDialog.Root>\n );\n}\n\n/** Opens the dialog. Pass the Button through `render`: `<Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>`. */\nconst Trigger = BaseDialog.Trigger;\n\nexport interface DialogContentProps extends Omit<BaseDialog.Popup.Props, 'className'> {\n /**\n * Maximum width: `sm` 400px for yes/no, `md` 560px (default) for a short form, `lg` 720px rarely.\n * Every size clamps to the viewport minus a 16px gutter, so a 390px phone gets a 358px dialog.\n */\n size?: DialogSize | undefined;\n /**\n * `dialog` (default) centres the popup. `sheet` is the same on wide viewports but below 640px it\n * becomes a bottom sheet: full width, rounded top, title and actions pinned while `Dialog.Body`\n * scrolls, padding that clears the home indicator. Use it for forms and pickers opened from a list.\n * `fullscreen` covers the viewport (inset by 16px with a rounded edge from 900px), slides in from the\n * inline end, keeps clear of the safe areas, and lets `Dialog.Body` scroll between a pinned title and\n * actions; `size` is ignored. It is the surface of `FullScreenFlow`. Pair it with `onRequestClose` on\n * the Root when leaving needs a confirmation.\n */\n variant?: DialogVariant | undefined;\n /**\n * `sheet` only. Below 640px a downward drag on the handle or the header (the top 64px, outside controls\n * and `Dialog.Body`) moves the sheet; letting go past 30% of its height, or flicking down, closes it the\n * way a press on the handle does (the handle is a `Dialog.Close` named \"Dismiss\"). Set `false` where an\n * accidental close loses work; the handle then stays as decoration only. Off whenever the Root is not\n * `dismissible`. Default `true`.\n */\n dismissOnSwipe?: boolean | undefined;\n className?: string | undefined;\n}\n\n/**\n * Portal, backdrop and the popup. Focus moves inside on open and returns to the trigger on close. A dialog opened\n * from inside another has its own backdrop too, over the first dialog.\n * Menus, selects and tooltips opened from inside render above it (`--sc-z-dropdown` > `--sc-z-dialog`).\n */\nfunction Content({\n size = 'md',\n variant = 'dialog',\n dismissOnSwipe = true,\n className,\n children,\n ...rest\n}: DialogContentProps) {\n const dismissible = useContext(DismissibleContext);\n const isSheet = variant === 'sheet';\n const swipe = isSheet && dismissOnSwipe && dismissible;\n return (\n <BaseDialog.Portal>\n {/* `forceRender`: Base UI drops the backdrop of a dialog opened inside another, so a sheet over a full-screen\n dialog didn't dim it. The nested one's scrim sits above its parent's popup (dialog.css). */}\n <BaseDialog.Backdrop className=\"sc-dialog__backdrop\" forceRender />\n <BaseDialog.Popup\n className={cx('sc-dialog__popup', className)}\n data-size={size}\n data-variant={variant}\n data-swipe-dismiss={swipe ? '' : undefined}\n aria-modal=\"true\"\n {...rest}\n >\n {isSheet && <SheetHandle swipe={swipe} />}\n {children}\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n );\n}\n\n/**\n * The grab handle at the top of a docked sheet (hidden from 640px). With swipe on it is a `Dialog.Close`:\n * Enter, Space or a tap closes, and a drag from it or the header follows the finger.\n */\nfunction SheetHandle({ swipe }: { swipe: boolean }) {\n const attach = useCallback(\n (node: HTMLButtonElement | null) => (node ? attachSheetSwipe(node) : undefined),\n [],\n );\n if (!swipe) return <div className=\"sc-dialog__handle\" aria-hidden=\"true\" />;\n return <BaseDialog.Close ref={attach} className=\"sc-dialog__handle\" aria-label=\"Dismiss\" />;\n}\n\nexport interface DialogTitleProps extends Omit<BaseDialog.Title.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Required. Labels the dialog; a question or a statement. Renders an `<h2>`. */\nfunction Title({ className, ...rest }: DialogTitleProps) {\n return <BaseDialog.Title className={cx('sc-dialog__title', className)} {...rest} />;\n}\n\nexport interface DialogDescriptionProps extends Omit<BaseDialog.Description.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Optional, muted. Says what will happen. */\nfunction Description({ className, ...rest }: DialogDescriptionProps) {\n return <BaseDialog.Description className={cx('sc-dialog__description', className)} {...rest} />;\n}\n\nexport type DialogBodyProps = ComponentPropsWithRef<'div'>;\n\n/** Free content between the description and the actions. In a `sheet` it is the part that scrolls. */\nfunction Body({ className, ...rest }: DialogBodyProps) {\n return <div className={cx('sc-dialog__body', className)} {...rest} />;\n}\n\nexport type DialogActionsProps = Omit<InlineProps, 'justify'>;\n\n/** Right-aligned row of Buttons. Put the confirming action last. */\nfunction Actions({ className, ...rest }: DialogActionsProps) {\n return <Inline justify=\"end\" className={cx('sc-dialog__actions', className)} {...rest} />;\n}\n\nexport interface DialogCloseProps extends Omit<BaseDialog.Close.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** With no children or `render`, the × in the corner. Otherwise wraps any Button: `<Dialog.Close render={<Button variant=\"secondary\" />}>Cancel</Dialog.Close>`. */\nfunction Close({ className, children, render, ...rest }: DialogCloseProps) {\n if (children === undefined && render === undefined) {\n return (\n <BaseDialog.Close className={cx('sc-dialog__close', className)} aria-label=\"Close\" {...rest}>\n <XIcon />\n </BaseDialog.Close>\n );\n }\n return (\n <BaseDialog.Close className={className} render={render} {...rest}>\n {children}\n </BaseDialog.Close>\n );\n}\n\n/** A modal that interrupts for a decision or a short form. Built on Base UI's Dialog. */\nexport const Dialog = { Root, Trigger, Content, Title, Description, Body, Actions, Close };\n","/**\n * Swipe down to dismiss a `Dialog variant=\"sheet\"` docked to the bottom edge (below 640px).\n *\n * A drag may start on the handle, or anywhere in the top `zone` px of the sheet outside `Dialog.Body` and\n * outside controls (buttons, links, fields). It never starts inside `Dialog.Body`, scrolled or not: the\n * body keeps native scrolling, and a touch the browser takes for a scroll ends in `pointercancel`, which\n * springs the sheet back. A release dismisses by pressing the handle, which is a `Dialog.Close`, so a\n * swipe goes wherever a press on the handle goes: `onOpenChange(false)`, or `onRequestClose('close-press')`\n * when the Root has it.\n */\nexport const SHEET_SWIPE = {\n /** Height in px, from the sheet's top edge, where a drag may start: the handle and the header. */\n zone: 64,\n /** Movement in px before a press becomes a drag, so taps stay taps. */\n slop: 6,\n /** Fraction of the sheet's height past which a release dismisses. */\n distance: 0.3,\n /** Release speed in px/ms: this fast downward dismisses at any distance, this fast upward keeps it open. */\n velocity: 0.5,\n /** Only samples this recent (ms) before the release count toward its speed. */\n window: 100,\n} as const;\n\nexport type DragIntent = 'pending' | 'drag' | 'cancel';\n\n/** Whether a press that has moved by (`dx`, `dy`) is still undecided, a downward drag, or something else. */\nexport function dragIntent(dx: number, dy: number, slop: number = SHEET_SWIPE.slop): DragIntent {\n if (Math.abs(dx) < slop && Math.abs(dy) < slop) return 'pending';\n return dy > 0 && dy >= Math.abs(dx) ? 'drag' : 'cancel';\n}\n\nexport interface SwipeSample {\n /** Event time in ms. */\n t: number;\n /** `clientY` in px. */\n y: number;\n}\n\n/**\n * Speed in px/ms (positive is downward) over the samples within `window` ms of the last one. The last\n * sample is the release itself, so a finger that stops before lifting reads as 0.\n */\nexport function releaseVelocity(\n samples: readonly SwipeSample[],\n window: number = SHEET_SWIPE.window,\n): number {\n const last = samples[samples.length - 1];\n if (!last) return 0;\n const first = samples.find((s) => last.t - s.t <= window) ?? last;\n const dt = last.t - first.t;\n return dt > 0 ? (last.y - first.y) / dt : 0;\n}\n\nexport interface SwipeRelease {\n /** How far the sheet has moved down, in px. */\n offset: number;\n /** The sheet's height in px. */\n height: number;\n /** Release speed in px/ms, positive downward. */\n velocity: number;\n}\n\n/** Dismiss on a quick downward flick, or past `distance` of the height unless flicked back up. */\nexport function shouldDismissSheet({ offset, height, velocity }: SwipeRelease): boolean {\n if (offset <= 0 || height <= 0) return false;\n if (velocity >= SHEET_SWIPE.velocity) return true;\n if (velocity <= -SHEET_SWIPE.velocity) return false;\n return offset >= height * SHEET_SWIPE.distance;\n}\n\nconst IGNORE = 'a,button,input,select,textarea,label,[role=\"button\"],[contenteditable]';\n\n/**\n * Wires the gesture onto the handle's parent, the popup. Returns the cleanup. Does nothing while the handle\n * is hidden (wide viewports, where the sheet is a centred dialog).\n */\nexport function attachSheetSwipe(handle: HTMLElement): () => void {\n const popup = handle.parentElement;\n if (!popup) return () => {};\n\n let press: { id: number; x: number; y: number } | null = null;\n let dragging = false;\n let height = 0;\n let samples: SwipeSample[] = [];\n let suppressClick = false;\n\n const startsDrag = (e: PointerEvent) => {\n if (!e.isPrimary || (e.pointerType === 'mouse' && e.button !== 0)) return false;\n if (handle.getClientRects().length === 0) return false;\n const target = e.target instanceof Element ? e.target : null;\n if (!target || handle.contains(target)) return true;\n if (target.closest(IGNORE) || target.closest('.sc-dialog__body')) return false;\n return e.clientY - popup.getBoundingClientRect().top <= SHEET_SWIPE.zone;\n };\n\n const settle = () => {\n delete popup.dataset.swiping;\n popup.style.removeProperty('transform');\n };\n\n const onDown = (e: PointerEvent) => {\n if (press || !startsDrag(e)) return;\n press = { id: e.pointerId, x: e.clientX, y: e.clientY };\n samples = [{ t: e.timeStamp, y: e.clientY }];\n };\n\n const onMove = (e: PointerEvent) => {\n if (!press || e.pointerId !== press.id) return;\n const dy = e.clientY - press.y;\n if (!dragging) {\n const intent = dragIntent(e.clientX - press.x, dy);\n if (intent === 'pending') return;\n if (intent === 'cancel') {\n press = null;\n return;\n }\n dragging = true;\n height = popup.getBoundingClientRect().height;\n popup.dataset.swiping = '';\n popup.setPointerCapture?.(e.pointerId);\n window.getSelection()?.removeAllRanges();\n }\n e.preventDefault();\n samples.push({ t: e.timeStamp, y: e.clientY });\n if (samples.length > 32) samples = samples.slice(-16);\n popup.style.transform = `translateY(${Math.max(0, dy)}px)`;\n };\n\n const end = (e: PointerEvent, cancelled: boolean) => {\n if (!press || e.pointerId !== press.id) return;\n const startY = press.y;\n const wasDragging = dragging;\n press = null;\n dragging = false;\n if (!wasDragging) return;\n // The click that follows a drag is not a press on whatever sits under the pointer.\n window.setTimeout(() => {\n suppressClick = false;\n }, 0);\n if (cancelled) {\n suppressClick = true;\n settle();\n return;\n }\n samples.push({ t: e.timeStamp, y: e.clientY });\n const release = {\n offset: Math.max(0, e.clientY - startY),\n height,\n velocity: releaseVelocity(samples),\n };\n if (shouldDismissSheet(release)) {\n // Keep the offset: the exit transition slides the rest of the way from here.\n delete popup.dataset.swiping;\n handle.click();\n suppressClick = true;\n // `onRequestClose` may have kept it open (a \"Discard changes?\" step): spring back.\n window.requestAnimationFrame(() => {\n if (popup.isConnected && popup.hasAttribute('data-open')) settle();\n });\n } else {\n suppressClick = true;\n settle();\n }\n };\n const onUp = (e: PointerEvent) => end(e, false);\n const onCancel = (e: PointerEvent) => end(e, true);\n\n const onClick = (e: MouseEvent) => {\n if (!suppressClick) return;\n suppressClick = false;\n e.preventDefault();\n e.stopPropagation();\n };\n\n popup.addEventListener('pointerdown', onDown);\n popup.addEventListener('pointermove', onMove);\n popup.addEventListener('pointerup', onUp);\n popup.addEventListener('pointercancel', onCancel);\n popup.addEventListener('click', onClick, true);\n return () => {\n popup.removeEventListener('pointerdown', onDown);\n popup.removeEventListener('pointermove', onMove);\n popup.removeEventListener('pointerup', onUp);\n popup.removeEventListener('pointercancel', onCancel);\n popup.removeEventListener('click', onClick, true);\n settle();\n };\n}\n","import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'em';\n\nexport interface IconProps extends Omit<ComponentPropsWithRef<'svg'>, 'children'> {\n /** `xs` 12, `sm` 14, `md` 16 (default), `lg` 20, `xl` 24, or `em` to follow the surrounding font size. */\n size?: IconSize | undefined;\n /** Gives the icon an accessible name (`role=\"img\"`). Without it the icon is decorative and hidden from assistive tech. */\n title?: string | undefined;\n /** The glyph: `<path>`, `<circle>` … on a 16×16 grid, stroke `currentColor`. */\n children: ReactNode;\n}\n\n/** Props of a shipped icon such as `PlayIcon`: everything `Icon` takes except the glyph. */\nexport type IconGlyphProps = Omit<IconProps, 'children'>;\n\n/**\n * The frame every icon renders in: a 16×16 outline in `currentColor`, sized by `size`, decorative unless\n * `title` is given. Use the shipped `<Name>Icon` components, or wrap your own paths.\n */\nexport function Icon({ size = 'md', title, className, children, ...rest }: IconProps) {\n return (\n <svg\n className={cx('sc-icon', className)}\n data-size={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n focusable=\"false\"\n aria-hidden={title ? undefined : true}\n role={title ? 'img' : undefined}\n aria-label={title}\n {...rest}\n >\n {children}\n </svg>\n );\n}\n","// Generated by scripts/build-icons.mjs from src/icons/svg/*.svg. Do not edit; add an SVG and run `pnpm build`.\nimport { Icon, type IconGlyphProps } from '../components/Icon/Icon';\n\n/** `archive` */\nexport function ArchiveIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2.25\" y=\"2.75\" width=\"11.5\" height=\"3\" rx=\".75\" />\n <path d=\"M3.25 5.75v6.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1v-6.5M6.5 8.75h3\" />\n </Icon>\n );\n}\n\n/** `arrow-down` */\nexport function ArrowDownIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 3v10M4 9l4 4 4-4\" />\n </Icon>\n );\n}\n\n/** `arrow-left` */\nexport function ArrowLeftIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M13 8H3M7 4 3 8l4 4\" />\n </Icon>\n );\n}\n\n/** `arrow-right` */\nexport function ArrowRightIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3 8h10M9 4l4 4-4 4\" />\n </Icon>\n );\n}\n\n/** `arrow-up` */\nexport function ArrowUpIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 13V3M4 7l4-4 4 4\" />\n </Icon>\n );\n}\n\n/** `bell` */\nexport function BellIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M4 6.5a4 4 0 0 1 8 0v3l1.25 2H2.75L4 9.5z\" />\n <path d=\"M6.5 13.5a1.5 1.5 0 0 0 3 0\" />\n </Icon>\n );\n}\n\n/** `briefcase` */\nexport function BriefcaseIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2\" y=\"4.75\" width=\"12\" height=\"8.5\" rx=\"1\" />\n <path d=\"M5.5 4.75V3.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1.25M2 8.5h12\" />\n </Icon>\n );\n}\n\n/** `calendar` */\nexport function CalendarIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2.5\" y=\"3.25\" width=\"11\" height=\"10\" rx=\"1\" />\n <path d=\"M2.5 6.75h11M5.5 1.75v3M10.5 1.75v3\" />\n </Icon>\n );\n}\n\n/** `check` */\nexport function CheckIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m3 8.5 3.5 3.5L13 4.5\" />\n </Icon>\n );\n}\n\n/** `chevron-down` */\nexport function ChevronDownIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m4 6 4 4 4-4\" />\n </Icon>\n );\n}\n\n/** `chevron-left` */\nexport function ChevronLeftIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m10 4-4 4 4 4\" />\n </Icon>\n );\n}\n\n/** `chevron-right` */\nexport function ChevronRightIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m6 4 4 4-4 4\" />\n </Icon>\n );\n}\n\n/** `chevron-up` */\nexport function ChevronUpIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m4 10 4-4 4 4\" />\n </Icon>\n );\n}\n\n/** `circle-check` */\nexport function CircleCheckIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"m5.25 8 2 2 3.5-4\" />\n </Icon>\n );\n}\n\n/** `circle-x` */\nexport function CircleXIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"m6 6 4 4M10 6l-4 4\" />\n </Icon>\n );\n}\n\n/** `clock` */\nexport function ClockIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 4.75V8l2.25 1.5\" />\n </Icon>\n );\n}\n\n/** `copy` */\nexport function CopyIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"6\" y=\"6\" width=\"7.5\" height=\"7.5\" rx=\"1\" />\n <path d=\"M4 10H3.25a1 1 0 0 1-1-1V3.25a1 1 0 0 1 1-1H9a1 1 0 0 1 1 1V4\" />\n </Icon>\n );\n}\n\n/** `document` */\nexport function DocumentIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M9 2.25H4.5a1 1 0 0 0-1 1v9.5a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V5.75z\" />\n <path d=\"M9 2.25v3.5h3.5M6 8.5h4M6 11h4\" />\n </Icon>\n );\n}\n\n/** `download` */\nexport function DownloadIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 2.5v8M4.75 7.25 8 10.5l3.25-3.25\" />\n <path d=\"M2.75 11v1.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1V11\" />\n </Icon>\n );\n}\n\n/** `edit` */\nexport function EditIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m10.75 2.75 2.5 2.5-7.5 7.5H3.25v-2.5z\" />\n </Icon>\n );\n}\n\n/** `external-link` */\nexport function ExternalLinkIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M9 2.75h4.25V7M13.25 2.75 7.5 8.5\" />\n <path d=\"M11.25 9v3.25a1 1 0 0 1-1 1h-6.5a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1H7\" />\n </Icon>\n );\n}\n\n/** `eye` */\nexport function EyeIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M1.75 8s2.25-4.25 6.25-4.25S14.25 8 14.25 8s-2.25 4.25-6.25 4.25S1.75 8 1.75 8z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </Icon>\n );\n}\n\n/** `eye-off` */\nexport function EyeOffIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M6.37 3.99C6.87 3.84 7.42 3.75 8 3.75C12 3.75 14.25 8 14.25 8C14.25 8 13.65 9.13 12.53 10.22\" />\n <path d=\"M9.63 12.01C9.13 12.16 8.58 12.25 8 12.25C4 12.25 1.75 8 1.75 8C1.75 8 2.35 6.87 3.47 5.78\" />\n <path d=\"M9.41 9.41A2 2 0 0 1 6.59 6.59\" />\n <path d=\"M2.5 2.5l11 11\" />\n </Icon>\n );\n}\n\n/** `filter` */\nexport function FilterIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.5 3h11l-4.25 5v4.25L6.75 13.5V8z\" />\n </Icon>\n );\n}\n\n/** `flag` */\nexport function FlagIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3.5 14V2.75\" />\n <path d=\"M3.5 2.75h8.75l-2.25 3 2.25 3H3.5\" />\n </Icon>\n );\n}\n\n/** `inbox` */\nexport function InboxIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2 9v3.25a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9l-1.6-4.6a1 1 0 0 0-.95-.65H4.55a1 1 0 0 0-.95.65z\" />\n <path d=\"M2 9h3.25l1 2h3.5l1-2H14\" />\n </Icon>\n );\n}\n\n/** `info` */\nexport function InfoIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 7.25V11M8 5.25v.01\" />\n </Icon>\n );\n}\n\n/** `link` */\nexport function LinkIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M6.75 9.25a2.5 2.5 0 0 0 3.54 0l2-2a2.5 2.5 0 0 0-3.54-3.54l-.75.75\" />\n <path d=\"M9.25 6.75a2.5 2.5 0 0 0-3.54 0l-2 2a2.5 2.5 0 0 0 3.54 3.54l.75-.75\" />\n </Icon>\n );\n}\n\n/** `mail` */\nexport function MailIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2\" y=\"3.5\" width=\"12\" height=\"9\" rx=\"1\" />\n <path d=\"m2.5 4.5 5.5 4.25L13.5 4.5\" />\n </Icon>\n );\n}\n\n/** `map-pin` */\nexport function MapPinIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 14s4.5-3.9 4.5-7.5a4.5 4.5 0 1 0-9 0C3.5 10.1 8 14 8 14z\" />\n <circle cx=\"8\" cy=\"6.5\" r=\"1.5\" />\n </Icon>\n );\n}\n\n/** `menu` */\nexport function MenuIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.5 4.5h11M2.5 8h11M2.5 11.5h11\" />\n </Icon>\n );\n}\n\n/** `minus` */\nexport function MinusIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3 8h10\" />\n </Icon>\n );\n}\n\n/** `moon` */\nexport function MoonIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M13.25 9.5A5.5 5.5 0 0 1 6.5 2.75 5.5 5.5 0 1 0 13.25 9.5z\" />\n </Icon>\n );\n}\n\n/** `more-horizontal` */\nexport function MoreHorizontalIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"3.5\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n );\n}\n\n/** `more-vertical` */\nexport function MoreVerticalIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"3.5\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"12.5\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n );\n}\n\n/** `pause` */\nexport function PauseIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"3.75\" y=\"2.75\" width=\"3\" height=\"10.5\" rx=\".75\" />\n <rect x=\"9.25\" y=\"2.75\" width=\"3\" height=\"10.5\" rx=\".75\" />\n </Icon>\n );\n}\n\n/** `play` */\nexport function PlayIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M4.5 2.75v10.5L13 8z\" />\n </Icon>\n );\n}\n\n/** `plus` */\nexport function PlusIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 3v10M3 8h10\" />\n </Icon>\n );\n}\n\n/** `refresh` */\nexport function RefreshIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.75 8a5.25 5.25 0 0 1 9-3.7l1.5 1.45\" />\n <path d=\"M13.25 2.25v3.5h-3.5\" />\n <path d=\"M13.25 8a5.25 5.25 0 0 1-9 3.7l-1.5-1.45\" />\n <path d=\"M2.75 13.75v-3.5h3.5\" />\n </Icon>\n );\n}\n\n/** `search` */\nexport function SearchIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <path d=\"m10.5 10.5 3 3\" />\n </Icon>\n );\n}\n\n/** `settings` */\nexport function SettingsIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M13.01 6.42 14.67 6.94v2.12l-1.66.52-.35.84.8 1.55-1.49 1.49-1.55-.8-.84.35-.52 1.66H6.94l-.52-1.66-.84-.35-1.55.8-1.49-1.49.8-1.55-.35-.84-1.66-.52V6.94l1.66-.52.35-.84-.8-1.55 1.49-1.49 1.55.8.84-.35.52-1.66h2.12l.52 1.66.84.35 1.55-.8 1.49 1.49-.8 1.55z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2.25\" />\n </Icon>\n );\n}\n\n/** `star` */\nexport function StarIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m8 2.25 1.8 3.8 4.2.55-3.1 2.9.8 4.15L8 11.6l-3.7 2.05.8-4.15L2 6.6l4.2-.55z\" />\n </Icon>\n );\n}\n\n/** `sun` */\nexport function SunIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"3\" />\n <path d=\"M8 1.75v1.5M8 12.75v1.5M1.75 8h1.5M12.75 8h1.5M3.58 3.58l1.06 1.06M11.36 11.36l1.06 1.06M3.58 12.42l1.06-1.06M11.36 4.64l1.06-1.06\" />\n </Icon>\n );\n}\n\n/** `thumbs-down` */\nexport function ThumbsDownIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M5 2.5H3a.5.5 0 0 0-.5.5v5.5a.5.5 0 0 0 .5.5h2\" />\n <path d=\"M5 9l2.5 4.5a1.5 1.5 0 0 0 1.5-1.5V9.5h3.25a1.25 1.25 0 0 0 1.23-1.45l-.9-5a1.25 1.25 0 0 0-1.23-1.05H5z\" />\n </Icon>\n );\n}\n\n/** `thumbs-up` */\nexport function ThumbsUpIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M5 13.5H3a.5.5 0 0 1-.5-.5V7.5A.5.5 0 0 1 3 7h2\" />\n <path d=\"M5 7l2.5-4.5a1.5 1.5 0 0 1 1.5 1.5v2.5h3.25a1.25 1.25 0 0 1 1.23 1.45l-.9 5a1.25 1.25 0 0 1-1.23 1.05H5z\" />\n </Icon>\n );\n}\n\n/** `trash` */\nexport function TrashIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.75 4.25h10.5M6.25 4.25V3a.75.75 0 0 1 .75-.75h2A.75.75 0 0 1 9.75 3v1.25\" />\n <path d=\"M4 4.25l.5 8.5a1 1 0 0 0 1 .95h5a1 1 0 0 0 1-.95l.5-8.5\" />\n <path d=\"M6.5 7v4M9.5 7v4\" />\n </Icon>\n );\n}\n\n/** `undo` */\nexport function UndoIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3 7h7a3.5 3.5 0 0 1 0 7H6\" />\n <path d=\"M6 4 3 7l3 3\" />\n </Icon>\n );\n}\n\n/** `user` */\nexport function UserIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"5.25\" r=\"2.75\" />\n <path d=\"M2.75 13.75a5.25 5.25 0 0 1 10.5 0\" />\n </Icon>\n );\n}\n\n/** `warning` */\nexport function WarningIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 2.5 1.75 13.25h12.5z\" />\n <path d=\"M8 6.5v3M8 11.5v.01\" />\n </Icon>\n );\n}\n\n/** `x` */\nexport function XIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M4 4l8 8M12 4l-8 8\" />\n </Icon>\n );\n}\n","// Generated by scripts/build-icons.mjs from src/icons/svg/*.svg. Do not edit; add an SVG and run `pnpm build`.\n/** Every icon shipped by this package, as `<Name>Icon` components. */\nexport const iconNames = [\n 'archive',\n 'arrow-down',\n 'arrow-left',\n 'arrow-right',\n 'arrow-up',\n 'bell',\n 'briefcase',\n 'calendar',\n 'check',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'circle-check',\n 'circle-x',\n 'clock',\n 'copy',\n 'document',\n 'download',\n 'edit',\n 'external-link',\n 'eye',\n 'eye-off',\n 'filter',\n 'flag',\n 'inbox',\n 'info',\n 'link',\n 'mail',\n 'map-pin',\n 'menu',\n 'minus',\n 'moon',\n 'more-horizontal',\n 'more-vertical',\n 'pause',\n 'play',\n 'plus',\n 'refresh',\n 'search',\n 'settings',\n 'star',\n 'sun',\n 'thumbs-down',\n 'thumbs-up',\n 'trash',\n 'undo',\n 'user',\n 'warning',\n 'x',\n] as const;\nexport type IconName = (typeof iconNames)[number];\n","import { useRender } from '@base-ui/react/use-render';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { Tooltip, type TooltipSide } from '../Tooltip/Tooltip';\nimport type { ButtonSize, ButtonVariant } from '../Button/Button';\nimport { cx } from '../../utils/cx';\n\nexport type IconButtonDotTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface IconButtonProps extends Omit<useRender.ComponentProps<'button'>, 'children' | 'aria-label'> {\n /** Required. The accessible name, and the tooltip text when `tooltip` is `true`. */\n label: string;\n /** The icon, usually a shipped `<Name>Icon`. It is decorative; `label` names the button. Optional only so a popup trigger can supply it through `render`. */\n children?: ReactNode | undefined;\n /** `ghost` (default) in toolbars and rows, `secondary` when it must read as a button, `primary` and `danger` rarely. */\n variant?: ButtonVariant | undefined;\n /** Square: 32, 40 or 48px. Compact density shrinks each by one step. */\n size?: ButtonSize | undefined;\n /** `true` shows `label` as a tooltip on hover and focus; a string shows that text instead. */\n tooltip?: boolean | string | undefined;\n /** Side the tooltip opens on. Default `top`. */\n tooltipSide?: TooltipSide | undefined;\n /** Fully round, for avatars and floating actions. */\n round?: boolean | undefined;\n /** Shows a spinner, sets `aria-busy` and ignores clicks. */\n loading?: boolean | undefined;\n /** A status dot in the top-left corner, ringed in `--sc-icon-button-dot-ring` (default `surface-default`). Decorative: put the status in `label` too (\"Sweeps: paused\"). */\n dot?: IconButtonDotTone | undefined;\n}\n\n/**\n * A square Button for one icon. Always named by `label`; use `tooltip` to show that name on hover.\n * Renders a `<button>` unless `render` gives another element: `render={<a href=\"/settings\" />}` or a\n * Next.js `<Link href=\"/settings\" />` makes it a link with the same look and name.\n */\nexport function IconButton({\n label,\n children,\n variant = 'ghost',\n size = 'md',\n tooltip,\n tooltipSide = 'top',\n round = false,\n loading = false,\n dot,\n type,\n className,\n onClick,\n render,\n ref,\n ...rest\n}: IconButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n const button = useRender({\n render,\n ref,\n defaultTagName: 'button',\n props: {\n // `type` only means something on a real button; a rendered link keeps its own attributes.\n type: render ? type : (type ?? 'button'),\n className: cx('sc-button', 'sc-icon-button', className),\n 'data-variant': variant,\n 'data-size': size,\n 'data-round': round || undefined,\n 'data-loading': loading || undefined,\n 'aria-busy': loading || undefined,\n 'aria-label': label,\n onClick: handleClick,\n ...rest,\n children: (\n <>\n <span className=\"sc-button__icon\" aria-hidden=\"true\">\n {children}\n </span>\n {loading ? <span className=\"sc-button__spinner\" aria-hidden=\"true\" /> : null}\n {dot ? <span className=\"sc-icon-button__dot\" data-tone={dot} aria-hidden=\"true\" /> : null}\n </>\n ),\n },\n });\n if (!tooltip) return button;\n return (\n <Tooltip content={tooltip === true ? label : tooltip} side={tooltipSide}>\n {button}\n </Tooltip>\n );\n}\n","import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\nimport type { ReactElement, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type TooltipSide = 'top' | 'bottom' | 'left' | 'right';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\nexport interface TooltipProps {\n /** The hint. Short text; never anything the user cannot do without. */\n content: ReactNode;\n /** The trigger: one element that takes a ref and spreads props, such as `IconButton`, `Button` or `Badge`. */\n children: ReactElement;\n /** Which side of the trigger the hint opens on; flips when there is no room. Default `top`. */\n side?: TooltipSide | undefined;\n /** Alignment along that side. Default `center`. */\n align?: TooltipAlign | undefined;\n /** Hover delay in ms before opening. Default 300; inside `Tooltip.Provider` sibling tooltips open instantly once one is open. */\n delay?: number | undefined;\n /** Delay in ms before closing. Default 0. */\n closeDelay?: number | undefined;\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the hint opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Never opens. */\n disabled?: boolean | undefined;\n className?: string | undefined;\n}\n\n/**\n * A hint that opens on hover and keyboard focus. Supplementary only: touch devices never see it and\n * screen readers hear the trigger's own name, so the trigger must already be labelled.\n */\nfunction TooltipBase({\n content,\n children,\n side = 'top',\n align = 'center',\n delay = 300,\n closeDelay,\n open,\n defaultOpen,\n onOpenChange,\n disabled,\n className,\n}: TooltipProps) {\n return (\n <BaseTooltip.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange ? (next) => onOpenChange(next) : undefined}\n disabled={disabled}\n >\n <BaseTooltip.Trigger render={children} delay={delay} closeDelay={closeDelay} />\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner side={side} align={align} sideOffset={6} className=\"sc-tooltip__positioner\">\n <BaseTooltip.Popup role=\"tooltip\" className={cx('sc-tooltip', className)}>\n <BaseTooltip.Arrow className=\"sc-tooltip__arrow\" />\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n}\n\n/** Wrap a toolbar or a row of icon buttons so moving between them skips the delay. */\nconst Provider = BaseTooltip.Provider;\n\nexport const Tooltip = Object.assign(TooltipBase, { Provider });\n","import { Menu as BaseMenu } from '@base-ui/react/menu';\nimport { useId, type ReactNode } from 'react';\nimport { Button } from '../Button/Button';\nimport { CheckIcon, ChevronDownIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type MenuSide = 'top' | 'bottom' | 'left' | 'right';\nexport type MenuAlign = 'start' | 'center' | 'end';\nexport type MenuItemTone = 'default' | 'danger';\n\nexport interface MenuRootProps {\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the menu opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Disables the trigger. */\n disabled?: boolean | undefined;\n /** Default `true`: the page behind the menu is inert until it closes. */\n modal?: boolean | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Owns the open state. Wrap a `Menu.Trigger` and a `Menu.Content`. */\nfunction Root({ open, defaultOpen, onOpenChange, disabled, modal = true, children }: MenuRootProps) {\n return (\n <BaseMenu.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange ? (next) => onOpenChange(next) : undefined}\n disabled={disabled}\n modal={modal}\n >\n {children}\n </BaseMenu.Root>\n );\n}\n\nexport interface MenuTriggerProps extends Omit<BaseMenu.Trigger.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * Opens the menu. With no `render` it is a secondary Button with a chevron; pass any Button or\n * IconButton through `render`: `<Menu.Trigger render={<IconButton label=\"More\" />}><MoreHorizontalIcon /></Menu.Trigger>`.\n */\nfunction Trigger({ render, className, children, ...rest }: MenuTriggerProps) {\n return (\n <BaseMenu.Trigger\n render={render ?? <Button variant=\"secondary\" iconEnd={<ChevronDownIcon />} className={className} />}\n className={render ? className : undefined}\n {...rest}\n >\n {children}\n </BaseMenu.Trigger>\n );\n}\n\nexport interface MenuContentProps extends Omit<BaseMenu.Popup.Props, 'className'> {\n /** Side of the trigger the menu opens on; flips when there is no room. Default `bottom`. */\n side?: MenuSide | undefined;\n /** Alignment along that side. Default `start`. */\n align?: MenuAlign | undefined;\n /** Distance from the trigger in px. Default 4. */\n sideOffset?: number | undefined;\n className?: string | undefined;\n}\n\n/** Portal, positioner and the popup. Items go inside. */\nfunction Content({\n side = 'bottom',\n align = 'start',\n sideOffset = 4,\n className,\n children,\n ...rest\n}: MenuContentProps) {\n return (\n <BaseMenu.Portal>\n <BaseMenu.Positioner side={side} align={align} sideOffset={sideOffset} className=\"sc-menu__positioner\">\n <BaseMenu.Popup className={cx('sc-menu', className)} {...rest}>\n {children}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n );\n}\n\ninterface ItemSlots {\n /** A 16px icon before the label. Decorative: hidden from assistive tech. */\n icon?: ReactNode | undefined;\n /**\n * A muted second line under the label that says what the item does. It is the item's accessible\n * description (`aria-describedby`), not part of its name.\n */\n description?: ReactNode | undefined;\n /** Muted text at the end: a shortcut (`<Kbd>`) or a count. */\n trailing?: ReactNode | undefined;\n /** `danger` for destructive actions; put them last, after a separator. */\n tone?: MenuItemTone | undefined;\n}\n\ntype AriaRefs = { 'aria-labelledby'?: string | undefined; 'aria-describedby'?: string | undefined };\n\n/**\n * The item's body, and the ARIA that goes on the item. With a description, the name comes from the label\n * (and trailing text) through `aria-labelledby`, so the description line is not read twice; ids the caller\n * passes are kept in front.\n */\nfunction useItemBody(\n {\n icon,\n description,\n trailing,\n children,\n }: Pick<ItemSlots, 'icon' | 'description' | 'trailing'> & {\n children?: ReactNode;\n },\n aria: AriaRefs,\n): [ReactNode, AriaRefs] {\n const id = useId();\n const hasDescription = description !== undefined && description !== null && description !== false;\n const hasTrailing = trailing !== undefined;\n const join = (...ids: (string | false | undefined)[]) => ids.filter(Boolean).join(' ') || undefined;\n const body = (\n <>\n <span className=\"sc-menu__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n <span className=\"sc-menu__label\" id={hasDescription ? `${id}-label` : undefined}>\n {children}\n </span>\n {hasDescription ? (\n <span className=\"sc-menu__description\" id={`${id}-description`}>\n {description}\n </span>\n ) : null}\n {hasTrailing ? (\n <span className=\"sc-menu__trailing\" id={hasDescription ? `${id}-trailing` : undefined}>\n {trailing}\n </span>\n ) : null}\n </>\n );\n if (!hasDescription) return [body, aria];\n return [\n body,\n {\n 'aria-labelledby': aria['aria-labelledby'] ?? join(`${id}-label`, hasTrailing && `${id}-trailing`),\n 'aria-describedby': join(aria['aria-describedby'], `${id}-description`),\n },\n ];\n}\n\nexport interface MenuItemProps extends Omit<BaseMenu.Item.Props, 'className'>, ItemSlots {\n className?: string | undefined;\n}\n\n/** One action. Closes the menu when activated. */\nfunction Item({\n icon,\n description,\n trailing,\n tone = 'default',\n className,\n children,\n 'aria-labelledby': labelledBy,\n 'aria-describedby': describedBy,\n ...rest\n}: MenuItemProps) {\n const [body, aria] = useItemBody(\n { icon, description, trailing, children },\n { 'aria-labelledby': labelledBy, 'aria-describedby': describedBy },\n );\n return (\n <BaseMenu.Item className={cx('sc-menu__item', className)} data-tone={tone} {...aria} {...rest}>\n {body}\n </BaseMenu.Item>\n );\n}\n\nexport interface MenuLinkItemProps extends Omit<BaseMenu.LinkItem.Props, 'className'>, ItemSlots {\n className?: string | undefined;\n}\n\n/**\n * An item that navigates: renders an `<a href>`. Closes the menu when chosen, like `Menu.Item`: with client-side\n * routing the page stays mounted, so an open menu would sit over the new page. Pass `closeOnClick={false}` to keep it.\n */\nfunction LinkItem({\n icon,\n description,\n trailing,\n tone = 'default',\n className,\n closeOnClick = true,\n children,\n 'aria-labelledby': labelledBy,\n 'aria-describedby': describedBy,\n ...rest\n}: MenuLinkItemProps) {\n const [body, aria] = useItemBody(\n { icon, description, trailing, children },\n { 'aria-labelledby': labelledBy, 'aria-describedby': describedBy },\n );\n return (\n <BaseMenu.LinkItem\n className={cx('sc-menu__item', className)}\n data-tone={tone}\n closeOnClick={closeOnClick}\n {...aria}\n {...rest}\n >\n {body}\n </BaseMenu.LinkItem>\n );\n}\n\nexport interface MenuCheckboxItemProps extends Omit<\n BaseMenu.CheckboxItem.Props,\n 'className' | 'onCheckedChange'\n> {\n /** Called with the next checked state. */\n onCheckedChange?: ((checked: boolean) => void) | undefined;\n /** Muted text at the end. */\n trailing?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** A toggle. Stays open when activated so several can be flipped at once; pass `closeOnClick` to close. */\nfunction CheckboxItem({ trailing, onCheckedChange, className, children, ...rest }: MenuCheckboxItemProps) {\n return (\n <BaseMenu.CheckboxItem\n className={cx('sc-menu__item', className)}\n onCheckedChange={onCheckedChange ? (checked) => onCheckedChange(checked) : undefined}\n {...rest}\n >\n <BaseMenu.CheckboxItemIndicator className=\"sc-menu__icon sc-menu__indicator\">\n <CheckIcon size=\"sm\" />\n </BaseMenu.CheckboxItemIndicator>\n <span className=\"sc-menu__label\">{children}</span>\n {trailing !== undefined ? <span className=\"sc-menu__trailing\">{trailing}</span> : null}\n </BaseMenu.CheckboxItem>\n );\n}\n\nexport interface MenuRadioGroupProps<Value extends string = string> extends Omit<\n BaseMenu.RadioGroup.Props,\n 'className' | 'value' | 'defaultValue' | 'onValueChange'\n> {\n /** Controlled selected value. */\n value?: Value | undefined;\n /** Initial value when uncontrolled. */\n defaultValue?: Value | undefined;\n /** Called with the next selected value. */\n onValueChange?: ((value: Value) => void) | undefined;\n /** A heading for the group, rendered above the items. */\n label?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** A set of `Menu.RadioItem`s where exactly one is selected. */\nfunction RadioGroup<Value extends string = string>({\n label,\n onValueChange,\n className,\n children,\n ...rest\n}: MenuRadioGroupProps<Value>) {\n return (\n <BaseMenu.RadioGroup\n className={cx('sc-menu__group', className)}\n onValueChange={onValueChange ? (value: Value) => onValueChange(value) : undefined}\n {...rest}\n >\n {label !== undefined ? (\n <BaseMenu.GroupLabel className=\"sc-menu__group-label\">{label}</BaseMenu.GroupLabel>\n ) : null}\n {children}\n </BaseMenu.RadioGroup>\n );\n}\n\nexport interface MenuRadioItemProps extends Omit<BaseMenu.RadioItem.Props, 'className' | 'value'> {\n value: string;\n /** Muted text at the end. */\n trailing?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** One choice in a `Menu.RadioGroup`. Stays open when chosen; pass `closeOnClick` to close. */\nfunction RadioItem({ trailing, className, children, ...rest }: MenuRadioItemProps) {\n return (\n <BaseMenu.RadioItem className={cx('sc-menu__item', className)} {...rest}>\n <BaseMenu.RadioItemIndicator className=\"sc-menu__icon sc-menu__indicator\">\n <span className=\"sc-menu__radio-dot\" />\n </BaseMenu.RadioItemIndicator>\n <span className=\"sc-menu__label\">{children}</span>\n {trailing !== undefined ? <span className=\"sc-menu__trailing\">{trailing}</span> : null}\n </BaseMenu.RadioItem>\n );\n}\n\nexport interface MenuGroupProps extends Omit<BaseMenu.Group.Props, 'className'> {\n /** A heading for the group, rendered above the items. */\n label?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** Labels a run of items. */\nfunction Group({ label, className, children, ...rest }: MenuGroupProps) {\n return (\n <BaseMenu.Group className={cx('sc-menu__group', className)} {...rest}>\n {label !== undefined ? (\n <BaseMenu.GroupLabel className=\"sc-menu__group-label\">{label}</BaseMenu.GroupLabel>\n ) : null}\n {children}\n </BaseMenu.Group>\n );\n}\n\nexport interface MenuSeparatorProps extends Omit<BaseMenu.Separator.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** A hairline between runs of items. */\nfunction Separator({ className, ...rest }: MenuSeparatorProps) {\n return <BaseMenu.Separator className={cx('sc-menu__separator', className)} {...rest} />;\n}\n\n/** A dropdown of actions on a trigger, with full keyboard support. Built on Base UI's Menu. */\nexport const Menu = {\n Root,\n Trigger,\n Content,\n Item,\n LinkItem,\n CheckboxItem,\n RadioGroup,\n RadioItem,\n Group,\n Separator,\n};\n","import { Field } from '@base-ui/react/field';\nimport type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { FieldShell, type FieldProps } from '../Field/FieldShell';\n\nexport interface InputProps\n extends\n Omit<ComponentPropsWithRef<'input'>, 'size' | 'name' | 'disabled' | 'required' | 'className'>,\n FieldProps {\n /** A 16px icon inside the start edge, for search and URL fields. Decorative. */\n iconStart?: ReactNode | undefined;\n /** A 16px icon inside the end edge. Decorative; use an `IconButton` outside the field for an action. */\n iconEnd?: ReactNode | undefined;\n /** Called with the string value on every change, beside the native `onChange`. */\n onValueChange?: ((value: string) => void) | undefined;\n}\n\n/**\n * A labelled single-line text field. Renders a native `<input>` inside Base UI's Field, so every native\n * attribute passes through: `type=\"date\" | \"time\" | \"number\" | \"url\" | …` keep the same height and\n * `iconStart` slot; `list=\"id\"` with a `<datalist>` beside it gives native suggestions. Date and time\n * fields show the browser's picker at the end edge, so leave `iconEnd` off those.\n */\nexport function Input({\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n name,\n size,\n className,\n iconStart,\n iconEnd,\n onValueChange,\n ...rest\n}: InputProps) {\n return (\n <FieldShell\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n invalid={invalid}\n required={required}\n disabled={disabled}\n name={name}\n size={size}\n className={className}\n >\n <span\n className=\"sc-input-wrap\"\n data-icon-start={iconStart ? '' : undefined}\n data-icon-end={iconEnd ? '' : undefined}\n >\n {iconStart ? (\n <span className=\"sc-input__icon\" data-side=\"start\" aria-hidden=\"true\">\n {iconStart}\n </span>\n ) : null}\n <Field.Control\n className=\"sc-input\"\n required={required}\n onValueChange={onValueChange ? (value) => onValueChange(value) : undefined}\n {...rest}\n />\n {iconEnd ? (\n <span className=\"sc-input__icon\" data-side=\"end\" aria-hidden=\"true\">\n {iconEnd}\n </span>\n ) : null}\n </span>\n </FieldShell>\n );\n}\n","import { Field } from '@base-ui/react/field';\nimport type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ControlSize = 'sm' | 'md' | 'lg';\n\n/** Props shared by every labelled form control: Input, Textarea, Select. */\nexport interface FieldProps {\n /** Required. The visible label; use `hideLabel` to keep it for assistive tech only. */\n label: ReactNode;\n /** Visually hides the label (a search box with an icon, a table filter). */\n hideLabel?: boolean | undefined;\n /** Help text under the control, wired with `aria-describedby`. */\n description?: ReactNode | undefined;\n /** The error message. When given the control is invalid and the message is announced. */\n error?: ReactNode | undefined;\n /** Marks the control invalid without a message. */\n invalid?: boolean | undefined;\n /** Shows a mark after the label and sets the native `required`. */\n required?: boolean | undefined;\n disabled?: boolean | undefined;\n /** Identifies the value when a form is submitted. */\n name?: string | undefined;\n /** Control height: 32, 40 (default) or 48px. Compact density shrinks each by one step. */\n size?: ControlSize | undefined;\n /** Class on the wrapper, not the control. */\n className?: string | undefined;\n}\n\ninterface FieldShellProps extends FieldProps {\n children: ReactNode;\n}\n\n/** Internal: Field.Root with label, control slot, description and error in the right order and ARIA. */\nexport function FieldShell({\n label,\n hideLabel = false,\n description,\n error,\n invalid = false,\n required = false,\n disabled = false,\n name,\n size = 'md',\n className,\n children,\n}: FieldShellProps) {\n return (\n <Field.Root\n className={cx('sc-field', className)}\n name={name}\n disabled={disabled}\n invalid={invalid || error != null}\n data-size={size}\n >\n <Field.Label className={cx('sc-field__label', hideLabel && 'sc-visually-hidden')}>\n {label}\n {required ? (\n <span className=\"sc-field__required\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </Field.Label>\n {children}\n {description != null ? (\n <Field.Description className=\"sc-field__description\">{description}</Field.Description>\n ) : null}\n {error != null ? (\n <Field.Error className=\"sc-field__error\" match>\n {error}\n </Field.Error>\n ) : null}\n </Field.Root>\n );\n}\n","import { Field } from '@base-ui/react/field';\nimport type { ComponentPropsWithRef } from 'react';\nimport { FieldShell, type FieldProps } from '../Field/FieldShell';\n\nexport type TextareaVariant = 'default' | 'code';\n\nexport interface TextareaProps\n extends\n Omit<ComponentPropsWithRef<'textarea'>, 'name' | 'disabled' | 'required' | 'className'>,\n Omit<FieldProps, 'size'> {\n /** Visible lines. Default 3. */\n rows?: number | undefined;\n /** `vertical` (default) lets the user drag it taller; `none` fixes the height. */\n resize?: 'vertical' | 'none' | undefined;\n /**\n * `code` for Markdown, JSON and other source: monospace, `tab-size: 2`, spellcheck, autocorrect and\n * autocapitalize off. Add the native `wrap=\"off\"` to keep long lines on one line and scroll sideways.\n */\n variant?: TextareaVariant | undefined;\n /** Called with the string value on every change, beside the native `onChange`. */\n onValueChange?: ((value: string) => void) | undefined;\n}\n\n/** A labelled multi-line text field. Renders a native `<textarea>` inside Base UI's Field. */\nexport function Textarea({\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n name,\n className,\n rows = 3,\n resize = 'vertical',\n variant = 'default',\n onValueChange,\n spellCheck,\n autoCorrect,\n autoCapitalize,\n ...rest\n}: TextareaProps) {\n const code = variant === 'code';\n return (\n <FieldShell\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n invalid={invalid}\n required={required}\n disabled={disabled}\n name={name}\n className={className}\n >\n <Field.Control\n render={\n <textarea\n rows={rows}\n spellCheck={spellCheck ?? (code ? false : undefined)}\n autoCorrect={autoCorrect ?? (code ? 'off' : undefined)}\n autoCapitalize={autoCapitalize ?? (code ? 'off' : undefined)}\n {...rest}\n />\n }\n className=\"sc-input sc-textarea\"\n data-resize={resize}\n data-variant={code ? 'code' : undefined}\n required={required}\n onValueChange={onValueChange ? (value) => onValueChange(value) : undefined}\n />\n </FieldShell>\n );\n}\n","import { Select as BaseSelect } from '@base-ui/react/select';\nimport { useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { FieldShell, type FieldProps } from '../Field/FieldShell';\nimport { CheckIcon, ChevronDownIcon, XIcon } from '../../icons/icons.gen';\n\nexport interface SelectOption<Value extends string = string> {\n value: Value;\n label: ReactNode;\n disabled?: boolean | undefined;\n}\n\nexport interface SelectGroup<Value extends string = string> {\n /** Heading shown above the group's options. */\n label: ReactNode;\n options: SelectOption<Value>[];\n}\n\nexport interface SelectProps<Value extends string = string> extends FieldProps {\n /** Flat options, or groups of options with a heading. */\n options: Array<SelectOption<Value> | SelectGroup<Value>>;\n /** Controlled value; `null` for none, which shows `placeholder`. No sentinel option needed. */\n value?: Value | null | undefined;\n /** Initial value when uncontrolled; `null` (default) for none. */\n defaultValue?: Value | null | undefined;\n /** Called with the chosen value, or `null` when the field is cleared. */\n onValueChange?: ((value: Value | null) => void) | undefined;\n /** Shown in the trigger while nothing is chosen. */\n placeholder?: ReactNode | undefined;\n /**\n * Shows an × beside the chevron while a value is chosen; pressing it, or Backspace/Delete on the\n * focused trigger, sets the value to `null` and calls `onValueChange(null)`.\n */\n clearable?: boolean | undefined;\n /** Accessible name of the clear button. Default \"Clear\". */\n clearLabel?: string | undefined;\n /** Prevents choosing a different option. */\n readOnly?: boolean | undefined;\n /** Stretches the trigger to the container. */\n fullWidth?: boolean | undefined;\n id?: string | undefined;\n}\n\nfunction isGroup<V extends string>(entry: SelectOption<V> | SelectGroup<V>): entry is SelectGroup<V> {\n return 'options' in entry;\n}\n\nfunction Option<V extends string>({ option }: { option: SelectOption<V> }) {\n return (\n <BaseSelect.Item value={option.value} disabled={option.disabled} className=\"sc-select__item\">\n <BaseSelect.ItemIndicator className=\"sc-select__indicator\">\n <CheckIcon size=\"sm\" />\n </BaseSelect.ItemIndicator>\n <BaseSelect.ItemText className=\"sc-select__item-text\">{option.label}</BaseSelect.ItemText>\n </BaseSelect.Item>\n );\n}\n\n/**\n * A labelled single-choice dropdown. Built on Base UI's Select so the list is styled and keyboard\n * complete; submits like a native select through `name`.\n */\nexport function Select<Value extends string = string>({\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n name,\n size = 'md',\n className,\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder = 'Choose…',\n clearable = false,\n clearLabel = 'Clear',\n readOnly,\n fullWidth = false,\n id,\n}: SelectProps<Value>) {\n const items = options.flatMap((entry) => (isGroup(entry) ? entry.options : [entry]));\n const [internal, setInternal] = useState<Value | null>(defaultValue ?? null);\n const controlled = value !== undefined;\n const current = controlled ? value : internal;\n const setValue = (next: Value | null) => {\n if (!controlled) setInternal(next);\n onValueChange?.(next);\n };\n const canClear = clearable && current != null && !disabled && !readOnly;\n const onTriggerKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (canClear && (event.key === 'Backspace' || event.key === 'Delete')) {\n event.preventDefault();\n setValue(null);\n }\n };\n return (\n <FieldShell\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n invalid={invalid}\n required={required}\n disabled={disabled}\n name={name}\n size={size}\n className={className}\n >\n <BaseSelect.Root<Value | null>\n items={items}\n value={current}\n onValueChange={(next) => setValue(next)}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n >\n <span className=\"sc-select__wrap\" data-full-width={fullWidth || undefined}>\n <BaseSelect.Trigger\n id={id}\n className=\"sc-select\"\n data-size={size}\n data-full-width={fullWidth || undefined}\n data-clearable={canClear || undefined}\n onKeyDown={onTriggerKeyDown}\n >\n <BaseSelect.Value className=\"sc-select__value\" placeholder={placeholder} />\n <BaseSelect.Icon className=\"sc-select__icon\">\n <ChevronDownIcon />\n </BaseSelect.Icon>\n </BaseSelect.Trigger>\n {canClear ? (\n <button\n type=\"button\"\n className=\"sc-select__clear\"\n aria-label={clearLabel}\n onClick={() => setValue(null)}\n >\n <XIcon size=\"sm\" />\n </button>\n ) : null}\n </span>\n <BaseSelect.Portal>\n <BaseSelect.Positioner\n className=\"sc-select__positioner\"\n sideOffset={4}\n alignItemWithTrigger={false}\n >\n <BaseSelect.Popup className=\"sc-select__popup\">\n <BaseSelect.List>\n {options.map((entry, i) =>\n isGroup(entry) ? (\n <BaseSelect.Group key={i} className=\"sc-select__group\">\n <BaseSelect.GroupLabel className=\"sc-select__group-label\">\n {entry.label}\n </BaseSelect.GroupLabel>\n {entry.options.map((option) => (\n <Option key={option.value} option={option} />\n ))}\n </BaseSelect.Group>\n ) : (\n <Option key={entry.value} option={entry} />\n ),\n )}\n </BaseSelect.List>\n </BaseSelect.Popup>\n </BaseSelect.Positioner>\n </BaseSelect.Portal>\n </BaseSelect.Root>\n </FieldShell>\n );\n}\n","import { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';\nimport { useId, type ReactNode } from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport interface CheckboxProps extends Omit<\n BaseCheckbox.Root.Props,\n 'className' | 'onCheckedChange' | 'render' | 'children'\n> {\n /** Required. The visible label; clicking it toggles the box. */\n label: ReactNode;\n /** Help text under the label, wired with `aria-describedby`. */\n description?: ReactNode | undefined;\n /** Called with the next checked state. */\n onCheckedChange?: ((checked: boolean) => void) | undefined;\n className?: string | undefined;\n}\n\n/** A labelled checkbox. `indeterminate` shows a dash for \"some of these\". Built on Base UI's Checkbox. */\nexport function Checkbox({\n label,\n description,\n onCheckedChange,\n className,\n disabled,\n ...rest\n}: CheckboxProps) {\n const descriptionId = useId();\n return (\n <div className={cx('sc-choice', className)} data-disabled={disabled || undefined}>\n <label className=\"sc-choice__control\">\n <BaseCheckbox.Root\n className=\"sc-checkbox\"\n disabled={disabled}\n aria-describedby={description != null ? descriptionId : undefined}\n onCheckedChange={onCheckedChange ? (checked) => onCheckedChange(checked) : undefined}\n {...rest}\n >\n <BaseCheckbox.Indicator className=\"sc-checkbox__indicator\">\n <CheckIcon size=\"sm\" className=\"sc-checkbox__check\" />\n <MinusIcon size=\"sm\" className=\"sc-checkbox__dash\" />\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n <span className=\"sc-choice__label\">{label}</span>\n </label>\n {description != null ? (\n <span className=\"sc-choice__description\" id={descriptionId}>\n {description}\n </span>\n ) : null}\n </div>\n );\n}\n","import { Switch as BaseSwitch } from '@base-ui/react/switch';\nimport { useId, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport interface SwitchProps extends Omit<\n BaseSwitch.Root.Props,\n 'className' | 'onCheckedChange' | 'render' | 'children'\n> {\n /** Required. The visible label; clicking it flips the switch. */\n label: ReactNode;\n /** Help text under the label, wired with `aria-describedby`. */\n description?: ReactNode | undefined;\n /** Called with the next checked state. */\n onCheckedChange?: ((checked: boolean) => void) | undefined;\n /** `end` (default) puts the switch before the label; `start` puts the label first and the switch at the row's end. */\n labelPosition?: 'start' | 'end' | undefined;\n className?: string | undefined;\n}\n\n/** A labelled on/off switch for settings that apply at once. Built on Base UI's Switch. */\nexport function Switch({\n label,\n description,\n onCheckedChange,\n labelPosition = 'end',\n className,\n disabled,\n ...rest\n}: SwitchProps) {\n const descriptionId = useId();\n return (\n <div\n className={cx('sc-choice', className)}\n data-disabled={disabled || undefined}\n data-label-position={labelPosition}\n >\n <label className=\"sc-choice__control\">\n <BaseSwitch.Root\n className=\"sc-switch\"\n disabled={disabled}\n aria-describedby={description != null ? descriptionId : undefined}\n onCheckedChange={onCheckedChange ? (checked) => onCheckedChange(checked) : undefined}\n {...rest}\n >\n <BaseSwitch.Thumb className=\"sc-switch__thumb\" />\n </BaseSwitch.Root>\n <span className=\"sc-choice__label\">{label}</span>\n </label>\n {description != null ? (\n <span className=\"sc-choice__description\" id={descriptionId}>\n {description}\n </span>\n ) : null}\n </div>\n );\n}\n","import { Tabs as BaseTabs } from '@base-ui/react/tabs';\nimport type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport interface TabsRootProps extends Omit<\n BaseTabs.Root.Props,\n 'className' | 'value' | 'defaultValue' | 'onValueChange'\n> {\n /** Controlled active tab. */\n value?: string | undefined;\n /** Initial active tab when uncontrolled. Defaults to the first enabled tab. */\n defaultValue?: string | undefined;\n /** Called with the value of the newly active tab. */\n onValueChange?: ((value: string) => void) | undefined;\n className?: string | undefined;\n}\n\n/** Owns the active tab. Wrap a `Tabs.List` and one `Tabs.Panel` per tab. */\nfunction Root({ className, onValueChange, ...rest }: TabsRootProps) {\n return (\n <BaseTabs.Root\n className={cx('sc-tabs', className)}\n onValueChange={onValueChange ? (value) => onValueChange(String(value)) : undefined}\n {...rest}\n />\n );\n}\n\nexport type TabsListVariant = 'line' | 'segmented';\n\nexport interface TabsListProps extends Omit<BaseTabs.List.Props, 'className'> {\n /** Names the set of tabs for assistive tech: \"Inbox sections\". */\n 'aria-label': string;\n /** Tabs share the width equally instead of sizing to their labels. */\n fill?: boolean | undefined;\n /** `line` (default): an accent underline on the active tab. `segmented`: a quiet segmented control, a sunken track with the active tab raised and no accent colour. */\n variant?: TabsListVariant | undefined;\n className?: string | undefined;\n}\n\n/** The row of tabs with the sliding indicator. Arrow keys move between tabs; Enter or Space activates. */\nfunction List({ fill = false, variant = 'line', className, children, ...rest }: TabsListProps) {\n return (\n <BaseTabs.List\n className={cx('sc-tabs__list', className)}\n data-fill={fill || undefined}\n data-variant={variant}\n {...rest}\n >\n {children}\n <BaseTabs.Indicator className=\"sc-tabs__indicator\" />\n </BaseTabs.List>\n );\n}\n\nexport interface TabsTabProps extends Omit<BaseTabs.Tab.Props, 'className' | 'value'> {\n value: string;\n /** A 16px icon before the label. */\n icon?: ReactNode | undefined;\n /** A count after the label, muted: `12`. */\n count?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** One tab. */\nfunction Tab({ icon, count, className, children, ...rest }: TabsTabProps) {\n return (\n <BaseTabs.Tab className={cx('sc-tabs__tab', className)} {...rest}>\n {icon ? (\n <span className=\"sc-tabs__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className=\"sc-tabs__label\">{children}</span>\n {count != null ? (\n <>\n {' '}\n <span className=\"sc-tabs__count\">{count}</span>\n </>\n ) : null}\n </BaseTabs.Tab>\n );\n}\n\nexport interface TabsPanelProps extends Omit<BaseTabs.Panel.Props, 'className' | 'value'> {\n value: string;\n className?: string | undefined;\n}\n\n/** The content of one tab. Unmounted while hidden unless `keepMounted`. */\nfunction Panel({ className, ...rest }: TabsPanelProps) {\n return <BaseTabs.Panel className={cx('sc-tabs__panel', className)} {...rest} />;\n}\n\n/** Switches between sections of one view. Built on Base UI's Tabs. */\nexport const Tabs = { Root, List, Tab, Panel };\n","import { Toolbar as BaseToolbar } from '@base-ui/react/toolbar';\nimport type { SpacingSize } from '../../types';\nimport { cx } from '../../utils/cx';\n\nexport interface ToolbarRootProps extends Omit<BaseToolbar.Root.Props, 'className'> {\n /** Required. Names the toolbar for assistive tech: \"Inbox actions\". */\n 'aria-label': string;\n /** Wraps onto new lines on narrow widths (default). `false` keeps one line that overflows. */\n wrap?: boolean | undefined;\n /** Gap between items and groups. Default `xs`. */\n gap?: SpacingSize | undefined;\n className?: string | undefined;\n}\n\n/**\n * A row of controls with one tab stop: Tab enters, arrow keys move between items, Tab leaves. Put every\n * control through `Toolbar.Button` (`render={<IconButton … />}`) so it joins the roving focus.\n */\nfunction Root({ wrap = true, gap = 'xs', className, ...rest }: ToolbarRootProps) {\n return (\n <BaseToolbar.Root\n className={cx('sc-toolbar', className)}\n data-wrap={wrap || undefined}\n data-gap={gap}\n {...rest}\n />\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<BaseToolbar.Group.Props, 'className'> {\n /** Names the group: \"Playback\". */\n 'aria-label'?: string | undefined;\n /** Gap inside the group. Default `2xs`. */\n gap?: SpacingSize | undefined;\n className?: string | undefined;\n}\n\n/** Keeps related controls together with a tighter gap. */\nfunction Group({ gap = '2xs', className, ...rest }: ToolbarGroupProps) {\n return <BaseToolbar.Group className={cx('sc-toolbar__group', className)} data-gap={gap} {...rest} />;\n}\n\nexport interface ToolbarSeparatorProps extends Omit<BaseToolbar.Separator.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** A hairline between groups. */\nfunction Separator({ className, ...rest }: ToolbarSeparatorProps) {\n return <BaseToolbar.Separator className={cx('sc-toolbar__separator', className)} {...rest} />;\n}\n\nexport interface ToolbarButtonProps extends Omit<BaseToolbar.Button.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * Joins a control to the toolbar's keyboard navigation. Pass the real control through `render`:\n * `<Toolbar.Button render={<IconButton label=\"Pause\" tooltip />}><PauseIcon /></Toolbar.Button>`.\n * For a Menu, nest: `<Toolbar.Button render={<Menu.Trigger render={<IconButton … />} />}>`.\n */\nconst Button = BaseToolbar.Button;\n\nexport interface ToolbarLinkProps extends Omit<BaseToolbar.Link.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * A link that joins the toolbar's keyboard navigation. With no `render` it is a plain `<a>`; for an\n * icon link pass an IconButton that itself renders the anchor (or a Next.js `Link`):\n * `<Toolbar.Link render={<IconButton label=\"Settings\" tooltip render={<a href=\"/settings\" />} />}><SettingsIcon /></Toolbar.Link>`.\n */\nconst Link = BaseToolbar.Link;\n\nexport interface ToolbarSpacerProps {\n className?: string | undefined;\n}\n\n/** Pushes what follows to the far end. */\nfunction Spacer({ className }: ToolbarSpacerProps) {\n return <div className={cx('sc-toolbar__spacer', className)} aria-hidden=\"true\" />;\n}\n\n/** A horizontal container of controls. Built on Base UI's Toolbar. */\nexport const Toolbar = { Root, Group, Separator, Button, Link, Spacer };\n","import { useState, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { IconButton } from '../IconButton/IconButton';\nimport { CircleCheckIcon, CircleXIcon, InfoIcon, WarningIcon, XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type BannerTone = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\nexport interface BannerProps extends ComponentPropsWithRef<'div'> {\n /** Colour and default icon. `warning` and `danger` are announced as alerts; the rest as status. */\n tone?: BannerTone | undefined;\n /** Replaces the tone's icon; `false` removes it. */\n icon?: ReactNode | false | undefined;\n /** One Button, usually `variant=\"ghost\" size=\"sm\"`, at the end of the strip. */\n action?: ReactNode | undefined;\n /** Shows a close button that hides the banner. */\n dismissible?: boolean | undefined;\n /** Called when the close button is pressed. */\n onDismiss?: (() => void) | undefined;\n /** Controlled visibility when dismissible. */\n open?: boolean | undefined;\n /** Accessible name of the close button. Default \"Dismiss\". */\n dismissLabel?: string | undefined;\n}\n\nconst toneIcons: Record<BannerTone, ReactNode> = {\n info: <InfoIcon />,\n success: <CircleCheckIcon />,\n warning: <WarningIcon />,\n danger: <CircleXIcon />,\n neutral: null,\n};\n\n/** A single-line status strip across the top of a view: paused, offline, \"3 new since you looked\". */\nexport function Banner({\n tone = 'info',\n icon,\n action,\n dismissible = false,\n onDismiss,\n open,\n dismissLabel = 'Dismiss',\n role,\n className,\n children,\n ...rest\n}: BannerProps) {\n const [dismissed, setDismissed] = useState(false);\n const visible = open ?? !dismissed;\n if (!visible) return null;\n const glyph = icon === false ? null : (icon ?? toneIcons[tone]);\n return (\n <div\n role={role ?? (tone === 'warning' || tone === 'danger' ? 'alert' : 'status')}\n className={cx('sc-banner', className)}\n data-tone={tone}\n {...rest}\n >\n {glyph ? (\n <span className=\"sc-banner__icon\" aria-hidden=\"true\">\n {glyph}\n </span>\n ) : null}\n <div className=\"sc-banner__body\">{children}</div>\n {action ? <div className=\"sc-banner__action\">{action}</div> : null}\n {dismissible ? (\n <IconButton\n label={dismissLabel}\n size=\"sm\"\n className=\"sc-banner__dismiss\"\n onClick={() => {\n setDismissed(true);\n onDismiss?.();\n }}\n >\n <XIcon />\n </IconButton>\n ) : null}\n </div>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport type { IconSize } from '../Icon/Icon';\nimport { cx } from '../../utils/cx';\n\nexport interface SpinnerProps extends ComponentPropsWithRef<'span'> {\n /** `xs` 12, `sm` 14, `md` 16 (default), `lg` 20, `xl` 24, or `em` to follow the font size. */\n size?: IconSize | undefined;\n /** What is happening, announced once as a status. Default \"Loading\". */\n label?: string | undefined;\n /** Hides it from assistive tech when the text beside it already says what is happening. */\n decorative?: boolean | undefined;\n}\n\n/** An indeterminate activity indicator in `currentColor`. Slows down, never stops, under reduced motion. */\nexport function Spinner({\n size = 'md',\n label = 'Loading',\n decorative = false,\n className,\n ...rest\n}: SpinnerProps) {\n return (\n <span\n className={cx('sc-spinner', className)}\n data-size={size}\n role={decorative ? undefined : 'status'}\n aria-label={decorative ? undefined : label}\n aria-hidden={decorative || undefined}\n {...rest}\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle className=\"sc-spinner__track\" cx=\"8\" cy=\"8\" r=\"6.25\" />\n <circle className=\"sc-spinner__arc\" cx=\"8\" cy=\"8\" r=\"6.25\" strokeLinecap=\"round\" />\n </svg>\n </span>\n );\n}\n","import { Progress as BaseProgress } from '@base-ui/react/progress';\nimport type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { Spinner } from '../Spinner/Spinner';\nimport { cx } from '../../utils/cx';\n\nexport type ProgressTone = 'accent' | 'success' | 'warning' | 'danger' | 'neutral';\nexport type ProgressSize = 'sm' | 'md';\nexport type ProgressVariant = 'bar' | 'inline';\n\nexport interface ProgressProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n /** Current value. Omit or pass `null` while the amount of work is unknown (indeterminate). */\n value?: number | null | undefined;\n /** Default 100. Pass the total so `value` can be a count: `value={460} max={859}`. */\n max?: number | undefined;\n /** Default 0. */\n min?: number | undefined;\n /** What is happening: \"Verifying\". Visible, and names the bar for assistive tech. */\n label?: ReactNode | undefined;\n /** Detail at the end: \"460 of 859 · 3 min elapsed\". A string also becomes `aria-valuetext`. */\n valueText?: ReactNode | undefined;\n /** Shows the percentage when `valueText` is not given. */\n showValue?: boolean | undefined;\n /** Fill colour. Default `accent`; `success` when done, `danger` when it failed. */\n tone?: ProgressTone | undefined;\n /** Bar thickness: `sm` 4px, `md` 8px (default). Inline uses the text size. */\n size?: ProgressSize | undefined;\n /** `bar` (default) is label, value and a track; `inline` is a Spinner beside the text for toolbars and buttons. */\n variant?: ProgressVariant | undefined;\n /** Names the bar when there is no `label`. */\n 'aria-label'?: string | undefined;\n}\n\n/**\n * Says that something is processing and, when known, how far along it is. Built on Base UI's Progress:\n * `role=\"progressbar\"` with the aria value attributes, or none while indeterminate.\n */\nexport function Progress({\n value,\n max = 100,\n min = 0,\n label,\n valueText,\n showValue = false,\n tone = 'accent',\n size = 'md',\n variant = 'bar',\n className,\n ...rest\n}: ProgressProps) {\n const current = value ?? null;\n const hasValueText = valueText != null || (showValue && current !== null);\n return (\n <BaseProgress.Root\n value={current}\n max={max}\n min={min}\n getAriaValueText={(formatted) => (typeof valueText === 'string' ? valueText : (formatted ?? ''))}\n className={cx('sc-progress', className)}\n data-variant={variant}\n data-tone={tone}\n data-size={size}\n {...rest}\n >\n {variant === 'inline' ? <Spinner size=\"sm\" decorative className=\"sc-progress__spinner\" /> : null}\n {label != null ? <BaseProgress.Label className=\"sc-progress__label\">{label}</BaseProgress.Label> : null}\n {hasValueText ? (\n <BaseProgress.Value className=\"sc-progress__value\">\n {(formatted) => (valueText != null ? valueText : formatted)}\n </BaseProgress.Value>\n ) : null}\n {variant === 'bar' ? (\n <BaseProgress.Track className=\"sc-progress__track\">\n <BaseProgress.Indicator className=\"sc-progress__indicator\" />\n </BaseProgress.Track>\n ) : null}\n </BaseProgress.Root>\n );\n}\n","import { createElement, type ComponentPropsWithRef } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\nexport type HeadingSize = 'overline' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';\nexport type HeadingElement = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'div' | 'span' | 'p';\nexport type TextTone = 'default' | 'muted' | 'subtle' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface HeadingProps extends ComponentPropsWithRef<'h2'> {\n /** The outline level, rendered as `h1`–`h6`. Default 2. */\n level?: HeadingLevel | undefined;\n /** Visual size from the type scale, independent of the level. Defaults by level: 3xl, 2xl, xl, lg, md, sm. `overline` is a 12px uppercase mono label with wide tracking, muted by default, for section labels (\"Why it fits\"). */\n size?: HeadingSize | undefined;\n /** Render a different element and keep the look; `div`/`span` for a card title that is not an outline entry. */\n as?: HeadingElement | undefined;\n /** Colour. Default is the text colour; `muted` for `size=\"overline\"`. */\n tone?: TextTone | undefined;\n /** One line with an ellipsis. */\n truncate?: boolean | undefined;\n}\n\nconst sizeByLevel: Record<HeadingLevel, HeadingSize> = {\n 1: '3xl',\n 2: '2xl',\n 3: 'xl',\n 4: 'lg',\n 5: 'md',\n 6: 'sm',\n};\n\n/** A heading from the type scale. `level` is the semantics, `size` the look; they are set separately on purpose. */\nexport function Heading({ level = 2, size, as, tone, truncate = false, className, ...rest }: HeadingProps) {\n return createElement(as ?? `h${level}`, {\n className: cx('sc-heading', className),\n 'data-size': size ?? sizeByLevel[level],\n 'data-tone': tone ?? (size === 'overline' ? 'muted' : 'default'),\n 'data-truncate': truncate || undefined,\n ...rest,\n });\n}\n","import { createElement, type ComponentPropsWithRef, type CSSProperties, type ReactElement } from 'react';\nimport type { TextTone } from '../Heading/Heading';\nimport { cx } from '../../utils/cx';\n\nexport type TextSize = 'xs' | 'sm' | 'md' | 'lg';\nexport type TextWeight = 'regular' | 'medium' | 'semibold';\nexport type TextAlign = 'start' | 'center' | 'end';\nexport type TextFamily = 'sans' | 'mono';\nexport type TextElement =\n | 'p'\n | 'span'\n | 'div'\n | 'label'\n | 'li'\n | 'dt'\n | 'dd'\n | 'strong'\n | 'em'\n | 'small'\n | 'time'\n | 'figcaption'\n | 'legend';\n\nexport interface TextProps extends ComponentPropsWithRef<'p'> {\n /** Element to render. Default `p`; `span` inside other text. */\n as?: TextElement | undefined;\n /** `xs` 12 captions, `sm` 14 UI text (default), `md` body copy, `lg` lede. */\n size?: TextSize | undefined;\n /** Colour. `muted` for metadata, `subtle` for placeholders, status tones for inline status. */\n tone?: TextTone | undefined;\n weight?: TextWeight | undefined;\n align?: TextAlign | undefined;\n /** `true` keeps one line with an ellipsis; a number clamps to that many lines. */\n truncate?: boolean | number | undefined;\n /** Tabular figures, for numbers that line up in columns. */\n numeric?: boolean | undefined;\n /** `sans` (default) or `mono` for data next to prose: row metadata, dates, counts (\"Quillstack · 5 h\"). */\n family?: TextFamily | undefined;\n}\n\n/** Running text and labels from the type scale. Parents own spacing: Text has no margins. */\nexport function Text({\n as = 'p',\n size = 'sm',\n tone = 'default',\n weight = 'regular',\n align,\n truncate = false,\n numeric = false,\n family = 'sans',\n className,\n style,\n ...rest\n}: TextProps): ReactElement {\n const clamp = typeof truncate === 'number' ? truncate : undefined;\n return createElement(as, {\n className: cx('sc-text', className),\n 'data-size': size,\n 'data-tone': tone,\n 'data-weight': weight,\n 'data-align': align,\n 'data-truncate': truncate === true ? '' : clamp !== undefined ? 'clamp' : undefined,\n 'data-numeric': numeric || undefined,\n 'data-family': family === 'mono' ? 'mono' : undefined,\n style: clamp !== undefined ? ({ ...style, '--sc-text-lines': clamp } as CSSProperties) : style,\n ...rest,\n });\n}\n","import { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';\nimport {\n createContext,\n useContext,\n type ComponentPropsWithRef,\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { ArrowDownIcon, ArrowUpIcon, CheckIcon, MinusIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\nimport type { RowSelection } from './useRowSelection';\n\nexport type TableAlign = 'start' | 'center' | 'end';\nexport type TableDensity = 'comfortable' | 'compact';\nexport type TableSortDirection = 'ascending' | 'descending' | 'none';\n\nexport interface TableRootProps extends Omit<ComponentPropsWithRef<'table'>, 'style'> {\n /** Column headers stay visible while the table scrolls. Give `maxHeight` to scroll inside the table; otherwise they stick to the page. */\n stickyHeader?: boolean | undefined;\n /** Limits the height and scrolls rows inside; pairs with `stickyHeader`. A CSS length. */\n maxHeight?: string | undefined;\n /** `compact` tightens row height and padding; `data-density=\"compact\"` on an ancestor does the same. */\n density?: TableDensity | undefined;\n /** Hairlines between rows (default) or none. */\n divided?: boolean | undefined;\n /** `fixed` column widths from the first row, for truncating cells. Default `auto`. */\n layout?: 'auto' | 'fixed' | undefined;\n /** Style and class for the scrolling wrapper; `className` goes on the `<table>`. */\n wrapperClassName?: string | undefined;\n wrapperStyle?: CSSProperties | undefined;\n style?: CSSProperties | undefined;\n children?: ReactNode | undefined;\n /**\n * `useRowSelection(ids)`. Turns on the selection column parts (`Table.SelectionHeader`, `Table.SelectionCell`),\n * modifier clicks on rows with a `selectionId`, and the keyboard: Cmd/Ctrl+A selects every row while focus\n * is inside the table, Escape clears.\n */\n selection?: RowSelection | undefined;\n}\n\nconst SelectionContext = createContext<RowSelection | null>(null);\nconst RowIdContext = createContext<string | undefined>(undefined);\n\nfunction useSelection(part: string): RowSelection {\n const selection = useContext(SelectionContext);\n if (!selection) throw new Error(`${part} needs Table.Root selection={useRowSelection(ids)}`);\n return selection;\n}\n\n/** Typing into a field inside the table keeps the browser's own Cmd/Ctrl+A and Escape. */\nfunction isTextEntry(target: EventTarget): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (\n target.isContentEditable ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement\n )\n return true;\n return (\n target instanceof HTMLInputElement &&\n !['checkbox', 'radio', 'button', 'submit', 'reset', 'image', 'file', 'color', 'range'].includes(\n target.type,\n )\n );\n}\n\nconst CONTROLS =\n 'a[href], button, input, select, textarea, label, summary, [role=\"checkbox\"], [role=\"button\"], [role=\"link\"], [contenteditable=\"true\"]';\n\n/** The event started on a link, button or field inside `row`, which keeps its own click behaviour. */\nfunction fromControl(event: MouseEvent<HTMLElement>): boolean {\n const control = event.target instanceof Element ? event.target.closest(CONTROLS) : null;\n return control !== null && event.currentTarget.contains(control);\n}\n\n/** A semantic `<table>` in a horizontally scrolling wrapper. Compose `Table.Head`, `Table.Body`, `Table.Row`, `Table.Header`, `Table.Cell`. */\nfunction Root({\n stickyHeader = false,\n maxHeight,\n density,\n divided = true,\n layout = 'auto',\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n children,\n selection,\n onKeyDown,\n ...rest\n}: TableRootProps) {\n const handleKeyDown = (event: KeyboardEvent<HTMLTableElement>) => {\n onKeyDown?.(event);\n if (!selection || event.defaultPrevented) return;\n // Popups portalled out of a cell still bubble here through React; they are not \"inside the table\".\n if (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return;\n if (isTextEntry(event.target)) return;\n if ((event.metaKey || event.ctrlKey) && !event.altKey && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n selection.selectAll();\n } else if (event.key === 'Escape' && selection.count > 0) {\n event.preventDefault();\n selection.clear();\n }\n };\n return (\n <div\n className={cx('sc-table-wrap', wrapperClassName)}\n data-sticky-header={stickyHeader || undefined}\n data-scroll={maxHeight ? '' : undefined}\n style={maxHeight ? { ...wrapperStyle, maxBlockSize: maxHeight } : wrapperStyle}\n >\n {/* Selection shortcuts are delegated from the focusable controls inside (checkboxes, links, sort buttons). */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <table\n className={cx('sc-table', className)}\n data-density={density}\n data-divided={divided || undefined}\n data-layout={layout}\n style={style}\n onKeyDown={selection ? handleKeyDown : onKeyDown}\n {...rest}\n >\n <SelectionContext.Provider value={selection ?? null}>{children}</SelectionContext.Provider>\n </table>\n </div>\n );\n}\n\nexport type TableCaptionProps = ComponentPropsWithRef<'caption'>;\n\n/** Names the table for assistive tech; visually a muted line above it. */\nfunction Caption({ className, ...rest }: TableCaptionProps) {\n return <caption className={cx('sc-table__caption', className)} {...rest} />;\n}\n\nexport type TableHeadProps = ComponentPropsWithRef<'thead'>;\nfunction Head({ className, ...rest }: TableHeadProps) {\n return <thead className={cx('sc-table__head', className)} {...rest} />;\n}\n\nexport type TableBodyProps = ComponentPropsWithRef<'tbody'>;\nfunction Body({ className, ...rest }: TableBodyProps) {\n return <tbody className={cx('sc-table__body', className)} {...rest} />;\n}\n\nexport type TableFootProps = ComponentPropsWithRef<'tfoot'>;\nfunction Foot({ className, ...rest }: TableFootProps) {\n return <tfoot className={cx('sc-table__foot', className)} {...rest} />;\n}\n\nexport interface TableRowProps extends ComponentPropsWithRef<'tr'> {\n /** Accent wash, for the current row. With `selectionId` it defaults to the row's selection. */\n selected?: boolean | undefined;\n /** Hover wash and pointer; make the primary cell a link or button for the real target. */\n interactive?: boolean | undefined;\n /**\n * The row's id in `Table.Root selection`. Shift+click extends the range to this row and Cmd/Ctrl+click\n * toggles it, unless the click is on a link, button or field inside the row; neither reaches `onClick`,\n * so a plain click can still open the row.\n */\n selectionId?: string | undefined;\n}\n\nfunction Row({\n selected,\n interactive = false,\n selectionId,\n className,\n onClick,\n onMouseDown,\n ...rest\n}: TableRowProps) {\n const selection = useContext(SelectionContext);\n const selectable = selection !== null && selectionId !== undefined;\n const isSelected = selected ?? (selectable && selection.isSelected(selectionId));\n const row = (\n <tr\n className={cx('sc-table__row', className)}\n data-selected={isSelected || undefined}\n data-interactive={interactive || undefined}\n aria-selected={selectable ? isSelected : isSelected || undefined}\n onClick={\n selectable\n ? (event) => {\n if ((event.shiftKey || event.metaKey || event.ctrlKey) && !fromControl(event)) {\n event.preventDefault();\n if (event.shiftKey) selection.toggleRange(selectionId);\n else selection.toggle(selectionId);\n return;\n }\n onClick?.(event);\n }\n : onClick\n }\n onMouseDown={\n selectable\n ? (event) => {\n // Shift+click would otherwise select the text between the two clicks.\n if (event.shiftKey && !fromControl(event)) event.preventDefault();\n onMouseDown?.(event);\n }\n : onMouseDown\n }\n {...rest}\n />\n );\n return selectionId === undefined ? (\n row\n ) : (\n <RowIdContext.Provider value={selectionId}>{row}</RowIdContext.Provider>\n );\n}\n\nfunction SelectionBox({\n label,\n ...rest\n}: { label: string } & Omit<BaseCheckbox.Root.Props, 'className' | 'render'>) {\n return (\n <BaseCheckbox.Root className=\"sc-checkbox\" aria-label={label} {...rest}>\n <BaseCheckbox.Indicator className=\"sc-checkbox__indicator\">\n <CheckIcon size=\"sm\" className=\"sc-checkbox__check\" />\n <MinusIcon size=\"sm\" className=\"sc-checkbox__dash\" />\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n );\n}\n\nconst onCheckbox = (event: MouseEvent<HTMLElement>) =>\n event.target instanceof Element && event.target.closest('[role=\"checkbox\"]') !== null;\n\nexport interface TableSelectionHeaderProps extends Omit<ComponentPropsWithRef<'th'>, 'children'> {\n /** The checkbox's accessible name. Default \"Select all rows\". */\n label?: string | undefined;\n}\n\n/**\n * The selection column's header: a checkbox that is checked when every row is, mixed when some are, and\n * selects every row (or, when all are selected, none). The whole cell is the hit area.\n */\nfunction SelectionHeader({\n label = 'Select all rows',\n className,\n onClick,\n ...rest\n}: TableSelectionHeaderProps) {\n const selection = useSelection('Table.SelectionHeader');\n const disabled = selection.ids.length === 0;\n const toggleAll = () => (selection.headerState === 'all' ? selection.clear() : selection.selectAll());\n return (\n <th\n scope=\"col\"\n className={cx('sc-table__header', 'sc-table__select', className)}\n data-disabled={disabled || undefined}\n onClick={(event) => {\n onClick?.(event);\n if (!disabled && !onCheckbox(event)) toggleAll();\n }}\n {...rest}\n >\n <SelectionBox\n label={label}\n checked={selection.headerState === 'all'}\n indeterminate={selection.headerState === 'some'}\n disabled={disabled}\n onCheckedChange={toggleAll}\n />\n </th>\n );\n}\n\nexport interface TableSelectionCellProps extends Omit<ComponentPropsWithRef<'td'>, 'children'> {\n /** Required. Names the row's checkbox: \"Select Tailscale, Front End Engineer\". */\n label: string;\n}\n\n/**\n * The row's checkbox, inside a `Table.Row selectionId`. Click or Space toggles; Shift+click or Shift+Space\n * extends the range from the last toggled row. The whole cell is the hit area, and its clicks never reach the\n * row's `onClick`.\n */\nfunction SelectionCell({ label, className, onClick, onClickCapture, ...rest }: TableSelectionCellProps) {\n const selection = useSelection('Table.SelectionCell');\n const id = useContext(RowIdContext);\n if (id === undefined) throw new Error('Table.SelectionCell goes inside a Table.Row with selectionId');\n return (\n <td\n className={cx('sc-table__cell', 'sc-table__select', className)}\n onClickCapture={(event) => {\n onClickCapture?.(event);\n // Shift+click, and Shift+Space (Base UI turns the keyup into a click that keeps the modifiers), take the\n // range before the checkbox would flip on its own.\n if (!event.shiftKey) return;\n event.preventDefault();\n event.stopPropagation();\n selection.toggleRange(id);\n }}\n onClick={(event) => {\n onClick?.(event);\n event.stopPropagation();\n if (!onCheckbox(event)) selection.toggle(id);\n }}\n {...rest}\n >\n <SelectionBox\n label={label}\n checked={selection.isSelected(id)}\n onCheckedChange={() => selection.toggle(id)}\n />\n </td>\n );\n}\n\ninterface CellSlots {\n /** Horizontal alignment. Default `start`; `end` for numbers. */\n align?: TableAlign | undefined;\n /** Tabular figures and end alignment. */\n numeric?: boolean | undefined;\n /** No wrapping. */\n nowrap?: boolean | undefined;\n /** One line with an ellipsis; needs `layout=\"fixed\"` or a `width`. */\n truncate?: boolean | undefined;\n /** Column width as a CSS length, on headers. */\n width?: string | undefined;\n}\n\nexport interface TableHeaderProps extends Omit<ComponentPropsWithRef<'th'>, 'align' | 'width'>, CellSlots {\n /** Renders the label as a button that sorts the column. The table stays controlled: sort the rows yourself in `onSort`. */\n sortable?: boolean | undefined;\n /** The column's current sort, reflected as `aria-sort`. `none` (default) for every column but the sorted one. */\n sortDirection?: TableSortDirection | undefined;\n /** Called with the direction to apply: `ascending` first, then it toggles. */\n onSort?: ((direction: Exclude<TableSortDirection, 'none'>) => void) | undefined;\n}\n\n/** A `<th>`; `scope` defaults to `col`, pass `row` for the first cell of a row. */\nfunction Header({\n align,\n numeric = false,\n nowrap = false,\n truncate = false,\n width,\n sortable = false,\n sortDirection = 'none',\n onSort,\n scope = 'col',\n className,\n style,\n children,\n ...rest\n}: TableHeaderProps) {\n const sorted = sortable && sortDirection !== 'none';\n return (\n <th\n scope={scope}\n className={cx('sc-table__header', className)}\n data-align={align ?? (numeric ? 'end' : undefined)}\n data-numeric={numeric || undefined}\n data-nowrap={nowrap || undefined}\n data-truncate={truncate || undefined}\n data-sortable={sortable || undefined}\n data-sorted={sorted ? sortDirection : undefined}\n aria-sort={sorted ? sortDirection : undefined}\n style={width ? { ...style, inlineSize: width } : style}\n {...rest}\n >\n {sortable ? (\n <button\n type=\"button\"\n className=\"sc-table__sort\"\n onClick={() => onSort?.(sortDirection === 'ascending' ? 'descending' : 'ascending')}\n >\n <span className=\"sc-table__sort-label\">{children}</span>\n <span className=\"sc-table__sort-icon\" aria-hidden=\"true\">\n {sortDirection === 'descending' ? <ArrowDownIcon size=\"xs\" /> : <ArrowUpIcon size=\"xs\" />}\n </span>\n </button>\n ) : (\n children\n )}\n </th>\n );\n}\n\nexport interface TableCellProps extends Omit<ComponentPropsWithRef<'td'>, 'align' | 'width'>, CellSlots {}\n\nfunction Cell({\n align,\n numeric = false,\n nowrap = false,\n truncate = false,\n width,\n className,\n style,\n ...rest\n}: TableCellProps) {\n return (\n <td\n className={cx('sc-table__cell', className)}\n data-align={align ?? (numeric ? 'end' : undefined)}\n data-numeric={numeric || undefined}\n data-nowrap={nowrap || undefined}\n data-truncate={truncate || undefined}\n style={width ? { ...style, inlineSize: width } : style}\n {...rest}\n />\n );\n}\n\n/** Rows of records with column headers. Native table elements, so screen readers get rows and columns. */\nexport const Table = { Root, Caption, Head, Body, Foot, Row, Header, Cell, SelectionHeader, SelectionCell };\n","import { useMemo, useReducer } from 'react';\nimport {\n headerState,\n initRowSelection,\n rowSelectionReducer,\n sameIds,\n selectedIds,\n type RowSelectionHeaderState,\n} from './rowSelection';\n\nexport interface RowSelection {\n /** The selectable ids, in the order passed in. */\n ids: readonly string[];\n /** The selected ids; a subset of the ids passed in. */\n selected: ReadonlySet<string>;\n /** The selected ids in visible order. */\n selectedIds: readonly string[];\n count: number;\n /** Where the next Shift range starts. */\n anchor: string | null;\n /** For the header checkbox. */\n headerState: RowSelectionHeaderState;\n isSelected: (id: string) => boolean;\n toggle: (id: string) => void;\n /** Every row from the anchor to `id`, inclusive, in the current order, takes `id`'s new state. */\n toggleRange: (id: string) => void;\n selectAll: () => void;\n clear: () => void;\n}\n\n/**\n * Selection state for a list of rows, by id. Pass the selectable ids in visible order (after filtering and\n * sorting); when one disappears it leaves the selection and the rest stay. Hand the result to\n * `Table.Root selection` for the checkbox column and keyboard, or read it for a bulk-action bar.\n */\nexport function useRowSelection(ids: readonly string[]): RowSelection {\n const [stored, dispatch] = useReducer(rowSelectionReducer, ids, initRowSelection);\n // Rows changed since the last render: sync now (a render-phase update, so nothing paints a stale count),\n // and read the synced state this render.\n const state = sameIds(stored.ids, ids)\n ? stored\n : rowSelectionReducer(stored, { type: 'selection.sync', ids });\n if (state !== stored) dispatch({ type: 'selection.sync', ids });\n\n const actions = useMemo(\n () => ({\n toggle: (id: string) => dispatch({ type: 'selection.toggle', id }),\n toggleRange: (id: string) => dispatch({ type: 'selection.toggleRange', id }),\n selectAll: () => dispatch({ type: 'selection.selectAll' }),\n clear: () => dispatch({ type: 'selection.clear' }),\n }),\n [],\n );\n return useMemo(\n () => ({\n ids: state.ids,\n selected: state.selected,\n selectedIds: selectedIds(state),\n count: state.selected.size,\n anchor: state.anchor,\n headerState: headerState(state),\n isSelected: (id: string) => state.selected.has(id),\n ...actions,\n }),\n [state, actions],\n );\n}\n","// Row selection as a pure reducer: no React, no DOM. `useRowSelection` is the thin hook over it, and the Table's\n// selection column and keyboard handling only send it events. Events are namespaced `selection.*` (guideline 07).\n\n/** The header checkbox: nothing, some or every row selected. */\nexport type RowSelectionHeaderState = 'none' | 'some' | 'all';\n\nexport interface RowSelectionState {\n /** The selectable row ids in visible order (after the page's filter and sort). Unique. */\n readonly ids: readonly string[];\n /** The selected ids; always a subset of `ids`. */\n readonly selected: ReadonlySet<string>;\n /** Where the next range starts: the row toggled last, on its own or as the end of a range. */\n readonly anchor: string | null;\n}\n\nexport type RowSelectionEvent =\n /** The visible rows changed (filter, sort, new data): keep the order, drop what disappeared. */\n | { type: 'selection.sync'; ids: readonly string[] }\n /** Flip one row; it becomes the anchor. */\n | { type: 'selection.toggle'; id: string }\n /** Shift: every row from the anchor to `id`, inclusive, in visible order, takes `id`'s new state; `id` becomes the anchor. */\n | { type: 'selection.toggleRange'; id: string }\n | { type: 'selection.selectAll' }\n | { type: 'selection.clear' };\n\nexport function initRowSelection(ids: readonly string[]): RowSelectionState {\n return { ids, selected: new Set(), anchor: null };\n}\n\n/** Same ids in the same order. */\nexport function sameIds(a: readonly string[], b: readonly string[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;\n return true;\n}\n\nfunction toggle(state: RowSelectionState, id: string): RowSelectionState {\n if (!state.ids.includes(id)) return state;\n const selected = new Set(state.selected);\n if (selected.has(id)) selected.delete(id);\n else selected.add(id);\n return { ...state, selected, anchor: id };\n}\n\nfunction toggleRange(state: RowSelectionState, id: string): RowSelectionState {\n const to = state.ids.indexOf(id);\n if (to < 0) return state;\n const from = state.anchor === null ? -1 : state.ids.indexOf(state.anchor);\n if (from < 0 || from === to) return toggle(state, id);\n const on = !state.selected.has(id);\n const selected = new Set(state.selected);\n const [start, end] = from < to ? [from, to] : [to, from];\n for (let i = start; i <= end; i += 1) {\n const rowId = state.ids[i]!;\n if (on) selected.add(rowId);\n else selected.delete(rowId);\n }\n return { ...state, selected, anchor: id };\n}\n\nfunction sync(state: RowSelectionState, ids: readonly string[]): RowSelectionState {\n if (sameIds(state.ids, ids)) return state;\n const present = new Set(ids);\n let selected = state.selected;\n for (const id of state.selected) {\n if (present.has(id)) continue;\n selected = new Set([...state.selected].filter((x) => present.has(x)));\n break;\n }\n const anchor = state.anchor !== null && present.has(state.anchor) ? state.anchor : null;\n return { ids, selected, anchor };\n}\n\n/** Pure: returns `state` itself when an event changes nothing, so React can bail out. */\nexport function rowSelectionReducer(state: RowSelectionState, event: RowSelectionEvent): RowSelectionState {\n switch (event.type) {\n case 'selection.sync':\n return sync(state, event.ids);\n case 'selection.toggle':\n return toggle(state, event.id);\n case 'selection.toggleRange':\n return toggleRange(state, event.id);\n case 'selection.selectAll':\n return state.selected.size === state.ids.length ? state : { ...state, selected: new Set(state.ids) };\n case 'selection.clear':\n return state.selected.size === 0 && state.anchor === null\n ? state\n : { ...state, selected: new Set(), anchor: null };\n }\n}\n\nexport function headerState(state: RowSelectionState): RowSelectionHeaderState {\n if (state.selected.size === 0) return 'none';\n return state.selected.size === state.ids.length ? 'all' : 'some';\n}\n\n/** The selected ids in visible order. */\nexport function selectedIds(state: RowSelectionState): string[] {\n return state.ids.filter((id) => state.selected.has(id));\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { Button } from '../Button/Button';\nimport { Toolbar } from '../Toolbar/Toolbar';\nimport { cx } from '../../utils/cx';\n\nexport interface SelectionBarProps {\n /** How many rows are selected. The bar shows from 1 and leaves at 0. */\n count: number;\n /** Clears the selection (the Clear button). */\n onClear: () => void;\n /** The actions, each a `Toolbar.Button`: `<Toolbar.Button render={<Button size=\"sm\" variant=\"secondary\" />}>Close 3</Toolbar.Button>`. */\n children?: ReactNode | undefined;\n /** Names the toolbar. Default \"Bulk actions\". */\n 'aria-label'?: string | undefined;\n /** The count text, visible and announced. Default `${count} selected`. */\n countLabel?: ((count: number) => string) | undefined;\n /** Default \"Clear\". */\n clearLabel?: string | undefined;\n /** Announced when the selection goes back to none. Default \"Selection cleared\". */\n clearedMessage?: string | undefined;\n className?: string | undefined;\n}\n\nconst defaultCountLabel = (count: number) => `${count} selected`;\n/** Matches `--sc-duration-base` in selection-bar.css: the bar stays mounted this long to fade out. */\nconst LEAVE_MS = 200;\n\n/**\n * A floating bar for bulk actions on selected rows, centred at the bottom of the viewport: the count, the actions\n * and Clear, as one Toolbar (one tab stop, arrow keys inside). A polite status region announces the count as it\n * changes. Put it after the table, at the end of the scrolling content: while it shows, it leaves a spacer as\n * tall as itself there, so the last rows can scroll clear of it. When it leaves while holding focus (an action\n * cleared the selection), focus goes back to where it came from, usually the last row checkbox.\n */\nexport function SelectionBar({\n count,\n onClear,\n children,\n 'aria-label': ariaLabel = 'Bulk actions',\n countLabel = defaultCountLabel,\n clearLabel = 'Clear',\n clearedMessage = 'Selection cleared',\n className,\n}: SelectionBarProps) {\n const open = count > 0;\n // Nothing is announced on load; \"cleared\" only after there was a selection.\n const [hadSelection, setHadSelection] = useState(open);\n if (open && !hadSelection) setHadSelection(true);\n const message = open ? countLabel(count) : hadSelection ? clearedMessage : '';\n\n // Stay mounted for the fade-out, still showing the last count.\n const [rendered, setRendered] = useState(open);\n const [shownCount, setShownCount] = useState(count);\n if (open && !rendered) setRendered(true);\n if (open && shownCount !== count) setShownCount(count);\n useEffect(() => {\n if (open || !rendered) return;\n const timer = setTimeout(() => setRendered(false), LEAVE_MS);\n return () => clearTimeout(timer);\n }, [open, rendered]);\n\n const barRef = useRef<HTMLDivElement>(null);\n const returnTo = useRef<HTMLElement | null>(null);\n useLayoutEffect(() => {\n const bar = barRef.current;\n if (open || !bar?.contains(bar.ownerDocument.activeElement)) return;\n if (returnTo.current?.isConnected) returnTo.current.focus();\n }, [open]);\n\n // The spacer follows the bar's height (it wraps on narrow screens).\n const [height, setHeight] = useState(0);\n useEffect(() => {\n const bar = barRef.current;\n if (!rendered || !bar || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => setHeight(entry!.borderBoxSize[0]?.blockSize ?? 0));\n observer.observe(bar);\n return () => observer.disconnect();\n }, [rendered]);\n\n return (\n <>\n <span role=\"status\" className=\"sc-visually-hidden\">\n {message}\n </span>\n {rendered ? (\n <>\n {open ? (\n <div\n className=\"sc-selection-bar__spacer\"\n style={{ '--sc-selection-bar-height': `${height}px` } as CSSProperties}\n aria-hidden=\"true\"\n />\n ) : null}\n <div\n ref={barRef}\n className={cx('sc-selection-bar', className)}\n data-open={open || undefined}\n onFocus={(event) => {\n const from = event.relatedTarget;\n if (from instanceof HTMLElement && !event.currentTarget.contains(from)) returnTo.current = from;\n }}\n >\n <Toolbar.Root aria-label={ariaLabel} className=\"sc-selection-bar__toolbar\">\n <span className=\"sc-selection-bar__count\">{countLabel(shownCount)}</span>\n <Toolbar.Separator />\n {children}\n <Toolbar.Spacer />\n <Toolbar.Button render={<Button variant=\"ghost\" size=\"sm\" />} onClick={onClear}>\n {clearLabel}\n </Toolbar.Button>\n </Toolbar.Root>\n </div>\n </>\n ) : null}\n </>\n );\n}\n","import { Toast as BaseToast } from '@base-ui/react/toast';\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport { XIcon } from '../../icons/icons.gen';\nimport { Button } from '../Button/Button';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type ToastTone = 'neutral' | 'success' | 'danger';\n\nexport interface ToastOptions {\n /** Required. One line: \"Closed 5 applications\". */\n title: ReactNode;\n description?: ReactNode | undefined;\n /** A coloured edge. Default `neutral`. */\n tone?: ToastTone | undefined;\n /**\n * One action, usually Undo. It closes the toast after `onClick`, unless `keepOpen` (the action asks first, and the\n * person may cancel).\n */\n action?: { label: string; onClick: () => void; keepOpen?: boolean | undefined } | undefined;\n /** Milliseconds before it closes; paused while hovered or focused; `0` keeps it. Default: the Provider's. */\n timeout?: number | undefined;\n /** `high` announces assertively (errors). Default `low`, polite. */\n priority?: 'low' | 'high' | undefined;\n /**\n * Names the toast. Adding one whose id is showing updates it in place (new text, the timer starts again) instead\n * of stacking a second.\n */\n id?: string | undefined;\n /** The dismiss control as a text button (\"Later\") instead of the ×. */\n dismissLabel?: string | undefined;\n /** Called once when it closes, however: dismissed, swiped away, its action, its timeout or `close()`. */\n onClose?: (() => void) | undefined;\n}\n\nexport interface ToastProviderProps {\n children?: ReactNode | undefined;\n /** Default auto-close, in milliseconds. Default 6000. */\n timeout?: number | undefined;\n /** How many show at once; older ones close. Default 3. */\n limit?: number | undefined;\n}\n\nconst InsideProvider = createContext(false);\n\n/**\n * Holds the toasts for `useToast()` below it and renders them, bottom-end, above the page. One viewport per page: a\n * Provider inside another adds nothing (its `timeout` and `limit` are ignored), so a component may wrap itself in one\n * and still share the app's.\n */\nfunction Provider({ children, timeout = 6000, limit = 3 }: ToastProviderProps) {\n if (useContext(InsideProvider)) return children;\n return (\n <InsideProvider.Provider value>\n <BaseToast.Provider timeout={timeout} limit={limit}>\n {children}\n <BaseToast.Portal>\n <Viewport />\n </BaseToast.Portal>\n </BaseToast.Provider>\n </InsideProvider.Provider>\n );\n}\n\nfunction Viewport() {\n const { toasts, close } = BaseToast.useToastManager<ToastData>();\n return (\n <BaseToast.Viewport className=\"sc-toast-viewport\">\n {toasts.map((toast) => (\n <BaseToast.Root key={toast.id} toast={toast} className=\"sc-toast\" data-tone={toast.type ?? 'neutral'}>\n <BaseToast.Content className=\"sc-toast__content\">\n <BaseToast.Title className=\"sc-toast__title\" />\n {toast.description != null ? <BaseToast.Description className=\"sc-toast__description\" /> : null}\n </BaseToast.Content>\n {toast.actionProps ? (\n <BaseToast.Action\n className=\"sc-toast__action\"\n render={<Button variant=\"secondary\" size=\"sm\" />}\n />\n ) : null}\n {toast.data?.dismissLabel ? (\n <Button variant=\"ghost\" size=\"sm\" className=\"sc-toast__close\" onClick={() => close(toast.id)}>\n {toast.data.dismissLabel}\n </Button>\n ) : (\n <IconButton label=\"Dismiss\" size=\"sm\" className=\"sc-toast__close\" onClick={() => close(toast.id)}>\n <XIcon />\n </IconButton>\n )}\n </BaseToast.Root>\n ))}\n </BaseToast.Viewport>\n );\n}\n\ninterface ToastData {\n dismissLabel?: string | undefined;\n}\n\nexport interface ToastApi {\n /** Shows a toast and returns its id. */\n add: (options: ToastOptions) => string;\n /** Closes one toast, or every toast without an id. */\n close: (id?: string) => void;\n}\n\n/** Shows toasts from inside a `Toast.Provider`. */\nexport function useToast(): ToastApi {\n const manager = BaseToast.useToastManager<ToastData>();\n return useMemo(\n () => ({\n add: ({\n title,\n description,\n tone = 'neutral',\n action,\n timeout,\n priority,\n id: given,\n dismissLabel,\n onClose,\n }: ToastOptions) => {\n let id = given ?? '';\n id = manager.add({\n title,\n description,\n type: tone,\n data: { dismissLabel },\n ...(given ? { id: given } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n ...(priority ? { priority } : {}),\n ...(onClose ? { onClose } : {}),\n ...(action\n ? {\n actionProps: {\n children: action.label,\n onClick: () => {\n action.onClick();\n if (!action.keepOpen) manager.close(id);\n },\n },\n }\n : {}),\n });\n return id;\n },\n close: manager.close,\n }),\n [manager],\n );\n}\n\n/**\n * Short-lived status messages: \"Closed 5 applications · Undo\". Built on Base UI's Toast: announced through a\n * polite region (`priority: 'high'` for errors), paused while hovered or focused, F6 moves focus to them.\n */\nexport const Toast = { Provider };\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type StatTrend = 'up' | 'down' | 'flat';\nexport type StatDeltaTone = 'positive' | 'negative' | 'neutral';\nexport type StatElement = 'div' | 'li' | 'article';\nexport type StatVariant = 'outlined' | 'filled' | 'plain';\nexport type StatSize = 'sm' | 'md';\n\nexport interface StatProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n /** What the number is: \"Applications\", \"Reply rate\". */\n label: ReactNode;\n /** The number, already formatted: \"1,204\", \"37%\". */\n value: ReactNode;\n /** The change beside the value: \"+12\", \"−3.1 pts\", \"same as last week\". */\n delta?: ReactNode | undefined;\n /** Colour of the delta: `positive` green, `negative` red, `neutral` muted (default). Say which is good; up is not always good. */\n deltaTone?: StatDeltaTone | undefined;\n /** Arrow before the delta. */\n trend?: StatTrend | undefined;\n /** Muted line under the value: \"last 7 days\", \"of 2,000 budget\". */\n hint?: ReactNode | undefined;\n /** A 20px icon in the corner. Decorative. */\n icon?: ReactNode | undefined;\n /** `outlined` surface (default), `filled` inset, `plain` no surface for a row of stats inside a Card. */\n variant?: StatVariant | undefined;\n /** `md` (default) or `sm` for dense rows. */\n size?: StatSize | undefined;\n /** Element to render; `li` in a list of stats. */\n as?: StatElement | undefined;\n}\n\nconst trendIcons: Record<StatTrend, ReactNode> = {\n up: <ArrowUpIcon size=\"xs\" />,\n down: <ArrowDownIcon size=\"xs\" />,\n flat: <ArrowRightIcon size=\"xs\" />,\n};\n\n/** One number with its label: a KPI tile. The value is text, so it reads as \"Applications, 1,204, up 12\". */\nexport function Stat({\n label,\n value,\n delta,\n deltaTone = 'neutral',\n trend,\n hint,\n icon,\n variant = 'outlined',\n size = 'md',\n as = 'div',\n className,\n ...rest\n}: StatProps) {\n return createElement(\n as,\n {\n className: cx('sc-stat', className),\n 'data-variant': variant,\n 'data-size': size,\n ...rest,\n },\n <>\n <div className=\"sc-stat__label\">{label}</div>\n {icon ? (\n <span className=\"sc-stat__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <div className=\"sc-stat__value\">{value}</div>\n {delta != null ? (\n <div className=\"sc-stat__delta\" data-tone={deltaTone}>\n {trend ? (\n <span className=\"sc-stat__trend\" aria-hidden=\"true\">\n {trendIcons[trend]}\n </span>\n ) : null}\n {trend ? (\n <span className=\"sc-visually-hidden\">{trend === 'flat' ? 'unchanged' : trend} </span>\n ) : null}\n {delta}\n </div>\n ) : null}\n {hint != null ? <div className=\"sc-stat__hint\">{hint}</div> : null}\n </>,\n );\n}\n","import type { ComponentPropsWithRef, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type ChipTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\nexport type ChipSize = 'sm' | 'md';\n\nexport interface ChipProps extends Omit<ComponentPropsWithRef<'span'>, 'onClick' | 'onRemove'> {\n /** The chip text. Keep it to a word or three. */\n children: ReactNode;\n /** A 14px icon before the text. Decorative. */\n icon?: ReactNode | undefined;\n /** Colour. `neutral` (default) for filters, a status tone when the chip is the status. */\n tone?: ChipTone | undefined;\n /** `md` 32px (default) or `sm` 24px inside table rows and Card headers. */\n size?: ChipSize | undefined;\n /** Filled and `aria-pressed`. Use with `onClick` for a toggling filter chip. */\n selected?: boolean | undefined;\n /** Makes the chip a `<button>` that toggles; `selected` is reflected as `aria-pressed`. */\n onClick?: ((event: MouseEvent<HTMLButtonElement>) => void) | undefined;\n /**\n * Adds a labelled × that calls this. Backspace or Delete on the focused chip (or on the ×) removes it\n * too. Focus is yours to manage after removal: move it to the next chip or the filter input.\n */\n onRemove?: (() => void) | undefined;\n /** Accessible name of the ×. Default \"Remove\" followed by the chip text when that text is a string. */\n removeLabel?: string | undefined;\n disabled?: boolean | undefined;\n}\n\n/**\n * A small pill: an applied filter, a tag, a selectable option in a row of a few. `onClick` makes it a\n * toggle button, `onRemove` adds the ×, and the two combine. Plain text otherwise.\n */\nexport function Chip({\n children,\n icon,\n tone = 'neutral',\n size = 'md',\n selected = false,\n onClick,\n onRemove,\n removeLabel,\n disabled = false,\n className,\n ...rest\n}: ChipProps) {\n const interactive = onClick !== undefined;\n const removeName = removeLabel ?? (typeof children === 'string' ? `Remove ${children}` : 'Remove');\n const handleRemoveKey = (event: KeyboardEvent<HTMLElement>) => {\n if (onRemove && !disabled && (event.key === 'Backspace' || event.key === 'Delete')) {\n event.preventDefault();\n onRemove();\n }\n };\n const shared = {\n className: cx('sc-chip', className),\n 'data-tone': tone,\n 'data-size': size,\n 'data-selected': selected || undefined,\n 'data-removable': onRemove ? '' : undefined,\n 'data-disabled': disabled || undefined,\n };\n const body = (\n <>\n {icon ? (\n <span className=\"sc-chip__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className=\"sc-chip__label\">{children}</span>\n </>\n );\n const remove = onRemove ? (\n <button\n type=\"button\"\n className=\"sc-chip__remove\"\n aria-label={removeName}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onRemove();\n }}\n onKeyDown={handleRemoveKey}\n >\n <XIcon size=\"xs\" />\n </button>\n ) : null;\n\n if (interactive) {\n return (\n <span {...shared} {...rest}>\n <button\n type=\"button\"\n className=\"sc-chip__action\"\n aria-pressed={selected}\n disabled={disabled}\n onClick={onClick}\n onKeyDown={handleRemoveKey}\n >\n {body}\n </button>\n {remove}\n </span>\n );\n }\n return (\n <span {...shared} {...rest}>\n {body}\n {remove}\n </span>\n );\n}\n","import {\n type CSSProperties,\n useEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type ReactNode,\n type SyntheticEvent,\n} from 'react';\nimport { ChevronDownIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport interface DisclosureProps extends Omit<ComponentPropsWithRef<'details'>, 'open' | 'onToggle'> {\n /** Required. The summary line, a verb phrase: \"Show full description\". */\n summary: ReactNode;\n /** Replaces `summary` while open: \"Show less\". */\n summaryOpen?: ReactNode | undefined;\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the user toggles it. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /**\n * While closed, shows this many lines of the content fading out, so a long description still reads\n * as a teaser. Puts the summary line under the preview. Needs `::details-content` (2025 browsers);\n * older ones show the summary alone.\n */\n previewLines?: number | undefined;\n /** Puts the summary line above (default) or below the content. Defaults to `end` with `previewLines`. */\n summaryPosition?: 'start' | 'end' | undefined;\n children?: ReactNode | undefined;\n}\n\n/**\n * A native `<details>` collapse with a styled summary. Works without JavaScript, is announced as a\n * disclosure, and shares `name` with siblings for an exclusive group.\n */\nexport function Disclosure({\n summary,\n summaryOpen,\n open,\n defaultOpen = false,\n onOpenChange,\n previewLines,\n summaryPosition,\n className,\n style,\n children,\n ref,\n ...rest\n}: DisclosureProps) {\n const controlled = open !== undefined;\n const [internal, setInternal] = useState(defaultOpen);\n const isOpen = controlled ? open : internal;\n const inner = useRef<HTMLDetailsElement | null>(null);\n // A native toggle flips the element itself; when controlled and the parent declines, put it back.\n useEffect(() => {\n if (controlled && inner.current && inner.current.open !== open) inner.current.open = open;\n });\n const onToggle = (event: SyntheticEvent<HTMLDetailsElement>) => {\n const next = event.currentTarget.open;\n if (next === isOpen) return;\n if (!controlled) setInternal(next);\n onOpenChange?.(next);\n };\n const position = summaryPosition ?? (previewLines ? 'end' : 'start');\n return (\n <details\n ref={(node) => {\n inner.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n className={cx('sc-disclosure', className)}\n open={isOpen}\n onToggle={onToggle}\n data-summary-position={position}\n data-preview={previewLines ? '' : undefined}\n style={previewLines ? ({ ...style, '--_lines': previewLines } as CSSProperties) : style}\n {...rest}\n >\n <summary className=\"sc-disclosure__summary\">\n <ChevronDownIcon className=\"sc-disclosure__chevron\" />\n <span className=\"sc-disclosure__summary-text\">\n {isOpen && summaryOpen != null ? summaryOpen : summary}\n </span>\n </summary>\n <div className=\"sc-disclosure__content\">{children}</div>\n </details>\n );\n}\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type EmptyStateSize = 'sm' | 'md';\nexport type EmptyStateElement = 'div' | 'section' | 'li';\n\nexport interface EmptyStateProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {\n /** Required. What is empty, as a short statement: \"No applications yet\". */\n title: ReactNode;\n /** One sentence on why, or what to do: \"Postings you apply to show up here.\" */\n description?: ReactNode | undefined;\n /** A 24px icon in a muted circle above the title. Decorative. */\n icon?: ReactNode | undefined;\n /** The actions, usually one primary Button and at most one secondary. Rendered in an Inline. */\n children?: ReactNode | undefined;\n /** `md` (default) for a whole view or panel, `sm` inside a Card or a table body. */\n size?: EmptyStateSize | undefined;\n /** Element to render. Default `div`. */\n as?: EmptyStateElement | undefined;\n}\n\n/**\n * Centred placeholder for a view with nothing in it: an icon, a title, a sentence and the action that\n * fills it. Say what is missing and the next step; never apologise.\n */\nexport function EmptyState({\n title,\n description,\n icon,\n children,\n size = 'md',\n as = 'div',\n className,\n ...rest\n}: EmptyStateProps) {\n return createElement(\n as,\n { className: cx('sc-empty-state', className), 'data-size': size, ...rest },\n icon ? (\n <span className=\"sc-empty-state__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null,\n <p className=\"sc-empty-state__title\">{title}</p>,\n description != null ? <p className=\"sc-empty-state__description\">{description}</p> : null,\n children != null ? <div className=\"sc-empty-state__actions\">{children}</div> : null,\n );\n}\n","import type { ComponentPropsWithRef, CSSProperties } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type SkeletonVariant = 'text' | 'rect' | 'circle';\n\nexport interface SkeletonProps extends ComponentPropsWithRef<'span'> {\n /** `text` (default) is one line of the current font size; `rect` a block; `circle` an avatar. */\n variant?: SkeletonVariant | undefined;\n /** Any CSS length. Default: text `100%`, rect `100%`, circle `40px`. */\n width?: string | number | undefined;\n /** Any CSS length. Default: text `1em` (one line), rect `80px`, circle = `width`. */\n height?: string | number | undefined;\n /** For `text`: how many lines; the last is shorter. Default 1. */\n lines?: number | undefined;\n /** Hides the shimmer. Default `false`; reduced motion hides it anyway. */\n still?: boolean | undefined;\n}\n\n/**\n * A placeholder shape shown while real content loads. It is hidden from assistive tech: put\n * `aria-busy=\"true\"` on the region being filled, or a `Spinner` with a label beside it, so the loading\n * state is announced once instead of per block.\n */\nexport function Skeleton({\n variant = 'text',\n width,\n height,\n lines = 1,\n still = false,\n className,\n style,\n ...rest\n}: SkeletonProps) {\n const size: CSSProperties = {\n ...style,\n ...(width !== undefined ? { inlineSize: width } : {}),\n ...(height !== undefined ? { blockSize: height } : {}),\n };\n if (variant === 'text' && lines > 1) {\n return (\n <span className={cx('sc-skeleton-lines', className)} aria-hidden=\"true\" style={style} {...rest}>\n {Array.from({ length: lines }, (_, i) => (\n <span\n key={i}\n className=\"sc-skeleton\"\n data-variant=\"text\"\n data-still={still || undefined}\n data-last={i === lines - 1 || undefined}\n style={width !== undefined ? { inlineSize: width } : undefined}\n />\n ))}\n </span>\n );\n }\n return (\n <span\n className={cx('sc-skeleton', className)}\n data-variant={variant}\n data-still={still || undefined}\n aria-hidden=\"true\"\n style={size}\n {...rest}\n />\n );\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport type * as FilePondApi from 'filepond';\nimport type { FilePond, FilePondFile, FilePondOptions } from 'filepond';\nimport type { FieldProps } from '../Field/FieldShell';\nimport { cx } from '../../utils/cx';\nimport { FilePreviewDialog } from '../FilePreviewDialog/FilePreviewDialog';\nimport {\n describeAccept,\n escapeHtml,\n matchesAccept,\n parseAccept,\n parseSize,\n previewKind,\n rejectionMessage,\n type FileRejectionReason,\n} from './accept';\n\nexport interface FileInputProps extends FieldProps {\n /** Accepted types, as for the native attribute: `\".pdf,.docx,text/plain\"` or a list. Extensions, exact MIME types and `image/*` wildcards. */\n accept?: string | readonly string[] | undefined;\n /** How the accepted types read in the error message. Default derived from `accept` (\"PDF, DOCX or plain text\"). */\n acceptLabel?: string | undefined;\n /** Largest file accepted, in bytes or as `\"10MB\"` (base 1000, like the size shown in the list). */\n maxFileSize?: number | string | undefined;\n /** Allows several files. Without it a new file replaces the current one. */\n multiple?: boolean | undefined;\n /** With `multiple`, the most files the list holds. */\n maxFiles?: number | undefined;\n /** Controlled list of accepted files. Pass `[]` to clear. */\n files?: readonly File[] | undefined;\n /** Initial files when uncontrolled. */\n defaultFiles?: readonly File[] | undefined;\n /** Called with the accepted files (plain `File` objects) after every add or remove. Rejected files never appear here. */\n onFilesChange?: ((files: File[]) => void) | undefined;\n /** Drop zone text before the browse link. Default \"Drop a file here or\" (or \"Drop files here or\" with `multiple`). */\n idleLabel?: string | undefined;\n /** The browse link's text. Default \"browse\". */\n browseLabel?: string | undefined;\n /**\n * Lets people check a file before it is uploaded: the name of each PDF, plain text, Markdown or image\n * file becomes a button that opens it in a `FilePreviewDialog`. Other types (DOCX …) show a plain name.\n * Default `true`; no preview while `disabled`.\n */\n preview?: boolean | undefined;\n}\n\ntype FilePondModule = typeof FilePondApi;\n\nconst REMOVE_ICON =\n '<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M4 4l8 8M12 4l-8 8\"/></svg>';\n\nconst sameFiles = (a: readonly File[], b: readonly File[]) =>\n a.length === b.length && a.every((file, i) => file === b[i]);\n\n/**\n * A labelled file picker with a drop zone, on FilePond (docs/adr/0004). Files stay in the browser: the\n * component hands plain `File` objects to `onFilesChange`, and with `name` it also keeps them in a file\n * input so a `<form>` (or a Server Action) submits them. Type, size and count are checked before a file\n * joins the list; a rejected file never joins it, and the reason shows in the field's error slot and is\n * announced. FilePond loads on mount, so the server renders a static drop zone and nothing of FilePond.\n */\nexport function FileInput({\n label,\n hideLabel = false,\n description,\n error,\n invalid = false,\n required = false,\n disabled = false,\n name,\n size = 'md',\n className,\n accept,\n acceptLabel,\n maxFileSize,\n multiple = false,\n maxFiles,\n files,\n defaultFiles,\n onFilesChange,\n idleLabel,\n browseLabel = 'browse',\n preview = true,\n}: FileInputProps) {\n const id = useId();\n const labelId = `${id}label`;\n const descriptionId = `${id}description`;\n const messagesId = `${id}messages`;\n\n const controlled = files !== undefined;\n const [uncontrolledFiles, setUncontrolledFiles] = useState<readonly File[]>(defaultFiles ?? []);\n const current = controlled ? files : uncontrolledFiles;\n\n const [rejections, setRejections] = useState<string[]>([]);\n const [inputId, setInputId] = useState<string>();\n /** The file in the preview dialog (kept while it closes) and the row button that opened it. */\n const [previewFile, setPreviewFile] = useState<File | null>(null);\n const [previewOpen, setPreviewOpen] = useState(false);\n const previewTriggerRef = useRef<HTMLButtonElement | null>(null);\n /** Bumps every time a pond is created, so the sync effects run against the new instance. */\n const [pondVersion, setPondVersion] = useState(0);\n\n const hostRef = useRef<HTMLDivElement>(null);\n const pondRef = useRef<FilePond | null>(null);\n const moduleRef = useRef<FilePondModule | null>(null);\n const patchRef = useRef<() => void>(() => {});\n /** The files last handed out (or received), so FilePond's repeated events don't re-emit. */\n const settledRef = useRef<readonly File[]>(current);\n /** While the pond is being brought to the `files` prop, the list it should reach. */\n const targetRef = useRef<readonly File[] | null>(null);\n\n const acceptList = parseAccept(accept);\n const acceptAttr = acceptList.join(',');\n const maxBytes = parseSize(maxFileSize);\n const messages = [...rejections, ...(error != null ? [error] : [])];\n const isInvalid = invalid || messages.length > 0;\n const idleText =\n idleLabel ??\n (multiple\n ? 'Drop files here or'\n : current.length > 0\n ? 'Drop another file to replace it, or'\n : 'Drop a file here or');\n\n // Everything the long-lived FilePond callbacks read, refreshed on every render.\n const live = {\n acceptList,\n acceptLabel: acceptLabel ?? describeAccept(acceptList),\n maxBytes,\n maxFiles: multiple ? maxFiles : 1,\n multiple,\n current,\n controlled,\n onFilesChange,\n labelId,\n describedBy: [description != null ? descriptionId : null, messages.length > 0 ? messagesId : null],\n isInvalid,\n acceptAttr,\n preview: preview && !disabled,\n openPreview: (file: File, trigger: HTMLButtonElement) => {\n previewTriggerRef.current = trigger;\n setPreviewFile(file);\n setPreviewOpen(true);\n },\n };\n const liveRef = useRef(live);\n useEffect(() => {\n liveRef.current = live;\n });\n\n // Create the pond on mount; destroy it on unmount (and between StrictMode's double mount).\n useEffect(() => {\n let cancelled = false;\n let pond: FilePond | null = null;\n let observer: MutationObserver | null = null;\n const host = hostRef.current;\n if (!host) return undefined;\n\n const reject = (reason: FileRejectionReason, file?: File) => {\n const l = liveRef.current;\n const message = rejectionMessage(reason, {\n name: file?.name,\n size: file?.size,\n acceptLabel: l.acceptLabel,\n maxFileSize: l.maxBytes,\n maxFiles: l.maxFiles,\n });\n setRejections((list) => (list.includes(message) ? list : [...list, message]));\n // A file the `files` prop asked for but that fails validation: stop waiting for it.\n if (file && targetRef.current) {\n targetRef.current = targetRef.current.filter((f) => f !== file);\n queueMicrotask(emit);\n }\n };\n // A new drop or browse starts a new attempt: earlier rejections no longer apply.\n const startAttempt = () => setRejections((list) => (list.length ? [] : list));\n let removeIntent = false;\n const acceptedIds = new Set<string>();\n const noteRemove = (event: Event) => {\n if ((event.target as Element | null)?.closest?.('.filepond--action-remove-item')) removeIntent = true;\n };\n const onPreviewClick = (event: Event) => {\n const button = (event.target as Element | null)?.closest?.<HTMLButtonElement>(\n '.sc-file-input__preview',\n );\n const file = button?.dataset.fileId ? pond?.getFile(button.dataset.fileId)?.file : null;\n if (!button || !(file instanceof File)) return;\n // FilePond treats a click in a row as \"activate item\"; this click is ours.\n event.stopPropagation();\n liveRef.current.openPreview(file, button);\n };\n\n const emit = () => {\n const mod = moduleRef.current;\n if (!pond || !mod) return;\n const idle = pond\n .getFiles()\n .filter((item: FilePondFile) => item.status === mod.FileStatus.IDLE)\n .map((item: FilePondFile) => item.file as File);\n // Single mode: a new accepted file replaces the old one, which leaves a beat later.\n const accepted = liveRef.current.multiple ? idle : idle.slice(-1);\n const target = targetRef.current;\n if (target) {\n if (!sameFiles(accepted, target)) return;\n targetRef.current = null;\n settledRef.current = accepted;\n // The prop (or `defaultFiles`) asked for a file that was rejected: report what the pond holds.\n if (!sameFiles(accepted, liveRef.current.current)) {\n if (!liveRef.current.controlled) setUncontrolledFiles(accepted);\n liveRef.current.onFilesChange?.(accepted);\n }\n return;\n }\n if (sameFiles(accepted, settledRef.current)) return;\n settledRef.current = accepted;\n if (!liveRef.current.controlled) setUncontrolledFiles(accepted);\n liveRef.current.onFilesChange?.(accepted);\n };\n\n // Keeps FilePond's DOM wired to our label, description, errors and keyboard model.\n const patch = () => {\n if (!pond) return;\n const l = liveRef.current;\n const root = pond.element;\n if (!root) return;\n const set = (el: Element | null, attr: string, value: string | null) => {\n if (!el || el.getAttribute(attr) === value) return;\n if (value == null) el.removeAttribute(attr);\n else el.setAttribute(attr, value);\n };\n const input = root.querySelector<HTMLInputElement>('input.filepond--browser');\n const dropLabel = root.querySelector('.filepond--drop-label label');\n set(input, 'aria-labelledby', l.labelId);\n set(input, 'aria-describedby', [dropLabel?.id, ...l.describedBy].filter(Boolean).join(' ') || null);\n set(input, 'aria-invalid', l.isInvalid ? 'true' : null);\n set(input, 'accept', l.acceptAttr || null);\n // FilePond always runs in multi mode here (see `addfile`); the picker follows `multiple`.\n set(input, 'multiple', l.multiple ? '' : null);\n // One tab stop: the file input. FilePond also makes the \"browse\" text focusable, with no role.\n set(root.querySelector('.filepond--label-action'), 'tabindex', null);\n for (const item of root.querySelectorAll('.filepond--item')) {\n const fileName = item.querySelector('.filepond--file-info-main')?.textContent?.trim();\n const remove = item.querySelector('.filepond--action-remove-item');\n if (fileName) set(remove, 'aria-label', `Remove ${fileName}`);\n patchPreview(item, remove);\n }\n // FilePond drops its file input while disabled; the label's `for` follows.\n setInputId(input?.id || undefined);\n };\n\n // The file's name as a real button, a foreign node in FilePond's row. It goes before the × so the tab\n // order follows the row (name, then remove); FilePond attaches a row's children once, when it creates\n // the row, and never re-inserts them by index, so the extra node does not disturb it. FilePond's own\n // name span stays (it holds a reference to it) and is hidden by CSS while the button is there.\n const patchPreview = (item: Element, remove: Element | null) => {\n const row = item.querySelector('.filepond--file');\n if (!row) return;\n let button = row.querySelector<HTMLButtonElement>(':scope > .sc-file-input__preview');\n const id = item.id.replace(/^filepond--item-/, '');\n const file = pond?.getFile(id)?.file;\n if (!liveRef.current.preview || !(file instanceof File) || previewKind(file) == null) {\n button?.remove();\n return;\n }\n if (!button) {\n button = document.createElement('button');\n button.type = 'button';\n button.className = 'sc-file-input__preview';\n row.insertBefore(button, remove ?? row.firstChild);\n }\n // Only write what changed: these writes are seen by the observer that called this.\n if (button.dataset.fileId !== id) button.dataset.fileId = id;\n if (button.textContent !== file.name) button.textContent = file.name;\n const name = `Preview ${file.name}`;\n if (button.getAttribute('aria-label') !== name) button.setAttribute('aria-label', name);\n };\n\n void import('filepond').then((mod) => {\n if (cancelled || !mod.supported()) return;\n moduleRef.current = mod;\n const options: FilePondOptions = {\n credits: false,\n allowPaste: false,\n allowReorder: false,\n allowProcess: false,\n allowRevert: false,\n instantUpload: false,\n dropOnPage: false,\n // Always multi: FilePond's own single mode replaces the current file *before* validating the new\n // one, so a rejected file would discard a good one. Replacement happens in `addfile` instead.\n allowMultiple: true,\n allowReplace: false,\n itemInsertLocation: 'after',\n fileSizeBase: 1000,\n iconRemove: REMOVE_ICON,\n labelButtonRemoveItem: 'Remove',\n styleButtonRemoveItemPosition: 'right',\n beforeAddFile: (item) => {\n const l = liveRef.current;\n const file = item.file as File;\n if (!matchesAccept(file, l.acceptList)) return (reject('type', file), false);\n if (l.maxBytes != null && file.size > l.maxBytes) return (reject('size', file), false);\n return true;\n },\n };\n // At runtime `create(options)` builds a detached root; the typings only declare `create(element, options)`.\n pond = (mod.create as unknown as (o: FilePondOptions) => FilePond)(options);\n const root = pond.element;\n if (!root) return;\n host.appendChild(root);\n pondRef.current = pond;\n patchRef.current = patch;\n pond.on('addfile', (error: unknown, added: FilePondFile) => {\n if (!error) acceptedIds.add(added.id);\n if (!error && !liveRef.current.multiple)\n for (const other of pond?.getFiles() ?? []) if (other.id !== added.id) pond?.removeFile(other.id);\n emit();\n });\n pond.on('removefile', (_error: unknown, removed: FilePondFile) => {\n // Removing with the × takes focus with it; hand it back to the field's control.\n const active = document.activeElement;\n const inRemovedRow = active?.closest('.filepond--item')?.id === `filepond--item-${removed.id}`;\n if (inRemovedRow || (removeIntent && (active == null || active === document.body)))\n root.querySelector<HTMLInputElement>('input.filepond--browser')?.focus();\n removeIntent = false;\n // An accepted file leaving (the × or the `files` prop) ends the attempt a rejection was about. A\n // rejected file never fired `addfile`, so its own removal keeps the message.\n if (acceptedIds.delete(removed.id)) startAttempt();\n emit();\n });\n pond.on('updatefiles', emit);\n pond.on('warning', (warning: { body?: string } | undefined) => {\n if (warning?.body === 'Max files') reject('count');\n });\n observer = new MutationObserver(patch);\n observer.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['tabindex', 'aria-labelledby', 'aria-describedby', 'accept', 'id', 'multiple'],\n });\n host.addEventListener('drop', startAttempt, true);\n host.addEventListener('change', startAttempt, true);\n host.addEventListener('click', noteRemove, true);\n host.addEventListener('click', onPreviewClick);\n settledRef.current = [];\n setPondVersion((v) => v + 1);\n });\n\n return () => {\n cancelled = true;\n host.removeEventListener('drop', startAttempt, true);\n host.removeEventListener('change', startAttempt, true);\n host.removeEventListener('click', noteRemove, true);\n host.removeEventListener('click', onPreviewClick);\n observer?.disconnect();\n if (pond) {\n pond.element?.remove();\n pond.destroy();\n }\n pondRef.current = null;\n patchRef.current = () => {};\n };\n }, []);\n\n // Props → FilePond options and DOM wiring.\n useEffect(() => {\n const pond = pondRef.current;\n if (!pond) return;\n pond.setOptions({\n name: name ?? '',\n storeAsFile: name != null,\n disabled,\n required,\n maxFiles: multiple ? (maxFiles ?? null) : null,\n allowRemove: !disabled,\n labelIdle: `${escapeHtml(idleText)} <span class=\"filepond--label-action\">${escapeHtml(browseLabel)}</span>`,\n });\n // FilePond rewrites some attributes on its next frame; the MutationObserver re-patches then.\n patchRef.current();\n }, [\n pondVersion,\n name,\n disabled,\n required,\n multiple,\n maxFiles,\n idleText,\n browseLabel,\n labelId,\n acceptAttr,\n isInvalid,\n description,\n messages.length,\n preview,\n ]);\n\n // The `files` prop (or `defaultFiles`) → the pond's list.\n useEffect(() => {\n const pond = pondRef.current;\n const mod = moduleRef.current;\n if (!pond || !mod) return;\n const items = pond.getFiles();\n const idle = items.filter((item) => item.status === mod.FileStatus.IDLE);\n const inPond = idle.map((item) => item.file as File);\n if (sameFiles(inPond, current)) {\n settledRef.current = current;\n return;\n }\n targetRef.current = current;\n for (const item of idle) if (!current.includes(item.file as File)) pond.removeFile(item.id);\n const toAdd = current.filter((file) => !inPond.includes(file));\n if (toAdd.length > 0) void pond.addFiles(toAdd);\n }, [current, pondVersion]);\n\n const ready = pondVersion > 0;\n return (\n <div\n className={cx('sc-field', 'sc-file-input-field', className)}\n data-size={size}\n data-disabled={disabled ? '' : undefined}\n data-invalid={isInvalid ? '' : undefined}\n >\n <label\n id={labelId}\n htmlFor={inputId}\n className={cx('sc-field__label', hideLabel && 'sc-visually-hidden')}\n >\n {label}\n {required ? (\n <span className=\"sc-field__required\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </label>\n <div\n className=\"sc-file-input\"\n data-ready={ready ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n data-invalid={isInvalid ? '' : undefined}\n data-multiple={multiple ? '' : undefined}\n >\n {ready ? null : (\n // Server render and first paint: the same drop zone, inert until FilePond takes over.\n <div className=\"sc-file-input__placeholder\" aria-hidden=\"true\">\n {idleText} <span className=\"sc-file-input__browse\">{browseLabel}</span>\n </div>\n )}\n {/* FilePond's root is appended here; React never renders children into this node. */}\n <div ref={hostRef} className=\"sc-file-input__pond\" />\n </div>\n {description != null ? (\n <p id={descriptionId} className=\"sc-field__description\">\n {description}\n </p>\n ) : null}\n {/* Always present so a rejection that appears after a drop is announced. */}\n <div id={messagesId} className=\"sc-file-input__messages\" aria-live=\"polite\">\n {messages.map((message, i) => (\n <p key={i} className=\"sc-field__error\">\n {message}\n </p>\n ))}\n </div>\n {previewFile ? (\n <FilePreviewDialog\n file={previewFile}\n open={previewOpen}\n onOpenChange={setPreviewOpen}\n // Focus returns to the name button; Safari does not focus a button on click, so say so.\n finalFocus={() => {\n const trigger = previewTriggerRef.current;\n if (trigger?.isConnected) return trigger;\n return hostRef.current?.querySelector<HTMLInputElement>('input.filepond--browser') ?? true;\n }}\n />\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Dialog, type DialogContentProps } from '../Dialog/Dialog';\nimport { ExternalLinkIcon } from '../../icons/icons.gen';\nimport { fileTypeLabel, formatListSize, formatSize, previewKind } from '../FileInput/accept';\nimport { useMediaQuery } from '../../utils/useMediaQuery';\n\nexport interface FilePreviewDialogProps {\n /** The file to show. Kept while the dialog closes, so pass `null` only once it has. */\n file: File | null | undefined;\n /** Controlled open state. */\n open: boolean;\n /** Called when the dialog asks to close (Esc, the ×, the backdrop). */\n onOpenChange: (open: boolean) => void;\n /** Where focus goes on close. Default: the element that had focus when it opened. */\n finalFocus?: DialogContentProps['finalFocus'];\n}\n\n/** Text files longer than this show their beginning only. */\nconst TEXT_LIMIT = 1_000_000;\n/** Below this width a PDF opens in a new tab instead of a frame (iOS Safari only draws page 1 in a frame). */\nconst NARROW = '(max-width: 48rem)';\n\n/**\n * Shows a local file before it is uploaded: a PDF in the browser's own viewer, plain text and Markdown as\n * text, an image as an image. Any other type gets a short note and nothing else, because a blob URL runs\n * with the page's origin: only a PDF is ever framed, and it is re-typed `application/pdf` first, so an HTML\n * file named `.pdf` cannot run. The object URL exists only while the dialog is open.\n */\nexport function FilePreviewDialog({ file, open, onOpenChange, finalFocus }: FilePreviewDialogProps) {\n const kind = file ? previewKind(file) : null;\n const narrow = useMediaQuery(NARROW);\n const pdfInTab = kind === 'pdf' && narrow;\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content\n size=\"lg\"\n className=\"sc-file-preview\"\n data-kind={kind ?? 'none'}\n finalFocus={finalFocus}\n >\n <Dialog.Close />\n {file ? (\n <>\n <Dialog.Title>{file.name}</Dialog.Title>\n <Dialog.Description>\n {fileTypeLabel(file)}, {formatListSize(file.size)}\n </Dialog.Description>\n <Dialog.Body>\n <PreviewBody file={file} kind={kind} open={open} pdfInTab={pdfInTab} />\n </Dialog.Body>\n </>\n ) : (\n <Dialog.Title>Preview</Dialog.Title>\n )}\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nfunction PreviewBody({\n file,\n kind,\n open,\n pdfInTab,\n}: {\n file: File;\n kind: ReturnType<typeof previewKind>;\n open: boolean;\n pdfInTab: boolean;\n}) {\n const frameRef = useRef<HTMLIFrameElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const linkRef = useRef<HTMLAnchorElement>(null);\n const [text, setText] = useState<{ file: File; value: string } | null>(null);\n\n // The object URL lives exactly as long as the dialog is open on this file. It goes straight onto the\n // elements, so nothing renders with a revoked URL.\n useEffect(() => {\n if (!open || (kind !== 'pdf' && kind !== 'image')) return undefined;\n const url = URL.createObjectURL(kind === 'pdf' ? new Blob([file], { type: 'application/pdf' }) : file);\n if (frameRef.current) frameRef.current.src = url;\n if (imageRef.current) imageRef.current.src = url;\n if (linkRef.current) linkRef.current.href = url;\n return () => URL.revokeObjectURL(url);\n }, [open, file, kind, pdfInTab]);\n\n useEffect(() => {\n if (!open || kind !== 'text') return undefined;\n let cancelled = false;\n void file\n .slice(0, TEXT_LIMIT)\n .text()\n .then((value) => {\n if (!cancelled) setText({ file, value });\n });\n return () => {\n cancelled = true;\n };\n }, [open, file, kind]);\n\n if (kind === 'pdf') {\n const link = (\n // eslint-disable-next-line jsx-a11y/anchor-is-valid -- the effect above sets href to the object URL on mount\n <a\n ref={linkRef}\n className=\"sc-button\"\n data-variant={pdfInTab ? 'primary' : 'secondary'}\n data-size=\"md\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open in a new tab\n <ExternalLinkIcon />\n </a>\n );\n return pdfInTab ? (\n <div className=\"sc-file-preview__tab\">\n <p className=\"sc-file-preview__note\">On a small screen the PDF reads best in its own tab.</p>\n {link}\n </div>\n ) : (\n <>\n <iframe ref={frameRef} className=\"sc-file-preview__frame\" title={`Preview of ${file.name}`} />\n <div className=\"sc-file-preview__actions\">{link}</div>\n </>\n );\n }\n if (kind === 'text') {\n const value = text?.file === file ? text.value : null;\n return (\n <>\n <pre\n className=\"sc-file-preview__text\"\n role=\"region\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- a scrolling region takes focus so the keyboard can scroll it\n tabIndex={0}\n aria-label={`Contents of ${file.name}`}\n aria-busy={value == null || undefined}\n >\n {value}\n </pre>\n {file.size > TEXT_LIMIT ? (\n <p className=\"sc-file-preview__note\">Showing the first {formatSize(TEXT_LIMIT)}.</p>\n ) : null}\n </>\n );\n }\n if (kind === 'image') {\n return <img ref={imageRef} className=\"sc-file-preview__image\" alt={file.name} />;\n }\n return <p className=\"sc-file-preview__note\">There is no preview for {fileTypeLabel(file)} files.</p>;\n}\n","// Pure helpers for FileInput: parsing `accept` and sizes, matching files, and wording the messages.\n\n/** Splits `accept` (a native accept string or a list) into lower-cased entries. */\nexport function parseAccept(accept: string | readonly string[] | undefined): string[] {\n if (accept == null) return [];\n const list = typeof accept === 'string' ? accept.split(',') : accept;\n return list.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\n/**\n * Matches a file the way the native `accept` attribute does: `.pdf` against the name, `image/*` against\n * the type's prefix, `application/pdf` exactly. An empty list accepts everything.\n */\nexport function matchesAccept(file: { name: string; type: string }, accept: readonly string[]): boolean {\n if (accept.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return accept.some((entry) => {\n if (entry.startsWith('.')) return name.endsWith(entry);\n if (entry.endsWith('/*')) return type.startsWith(entry.slice(0, -1));\n return type === entry;\n });\n}\n\nconst UNITS: Record<string, number> = { b: 1, kb: 1e3, mb: 1e6, gb: 1e9 };\n\n/** Bytes from a number or a string such as `\"10MB\"` or `\"500 KB\"` (base 1000, like the file list). */\nexport function parseSize(size: number | string | undefined): number | undefined {\n if (size == null) return undefined;\n if (typeof size === 'number') return size;\n const match = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb)\\s*$/i.exec(size);\n if (!match) throw new Error(`FileInput: maxFileSize \"${size}\" is not a size like \"10MB\".`);\n return Math.round(Number(match[1]) * UNITS[match[2]!.toLowerCase()]!);\n}\n\n/** `1500000` → `1.5 MB`. Base 1000, at most one decimal; precise enough for a size limit message. */\nexport function formatSize(bytes: number): string {\n const [unit, base] =\n bytes >= 1e9 ? ['GB', 1e9] : bytes >= 1e6 ? ['MB', 1e6] : bytes >= 1e3 ? ['KB', 1e3] : ['bytes', 1];\n const value = bytes / base;\n return `${Number.isInteger(value) ? value : Number(value.toFixed(1))} ${unit}`;\n}\n\n/**\n * A file's size exactly as FilePond writes it in the list (whole KB rounded down, MB to one decimal, GB to\n * two), so the preview dialog agrees with the row it was opened from.\n */\nexport function formatListSize(bytes: number): string {\n const n = Math.round(Math.abs(bytes));\n const trim = (value: number, decimals: number) => value.toFixed(decimals).replace(/\\.0+$/, '');\n if (n < 1e3) return `${n} bytes`;\n if (n < 1e6) return `${Math.floor(n / 1e3)} KB`;\n if (n < 1e9) return `${trim(n / 1e6, 1)} MB`;\n return `${trim(n / 1e9, 2)} GB`;\n}\n\nconst MIME_NAMES: Record<string, string> = {\n 'application/pdf': 'PDF',\n 'application/msword': 'DOC',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'DOCX',\n 'application/json': 'JSON',\n 'text/plain': 'plain text',\n 'text/markdown': 'Markdown',\n 'text/csv': 'CSV',\n 'image/png': 'PNG',\n 'image/jpeg': 'JPEG',\n};\n\n/** A short human list of the accepted types: `.pdf, .docx, text/plain` → `PDF, DOCX or plain text`. */\nexport function describeAccept(accept: readonly string[]): string {\n const names = accept.map((entry) => {\n if (entry.startsWith('.')) return entry.slice(1).toUpperCase();\n if (entry.endsWith('/*')) return `any ${entry.slice(0, -2)}`;\n return MIME_NAMES[entry] ?? entry.split('/').pop()!.toUpperCase();\n });\n const unique = [...new Set(names)];\n if (unique.length <= 1) return unique[0] ?? '';\n return `${unique.slice(0, -1).join(', ')} or ${unique.at(-1)}`;\n}\n\nexport type FileRejectionReason = 'type' | 'size' | 'count';\n\nexport function rejectionMessage(\n reason: FileRejectionReason,\n detail: {\n name?: string | undefined;\n size?: number | undefined;\n acceptLabel?: string | undefined;\n maxFileSize?: number | undefined;\n maxFiles?: number | undefined;\n },\n): string {\n switch (reason) {\n case 'type':\n return `${detail.name} is not an accepted file type. Use ${detail.acceptLabel}.`;\n case 'size':\n return `${detail.name} is ${formatSize(detail.size ?? 0)}, over the ${formatSize(detail.maxFileSize ?? 0)} limit.`;\n case 'count':\n return detail.maxFiles === 1\n ? 'Choose one file.'\n : `Up to ${detail.maxFiles} files. Remove one to add another.`;\n }\n}\n\n/** Escapes text for FilePond's `labelIdle`, which it sets as HTML. */\nexport function escapeHtml(text: string): string {\n return text.replace(\n /[&<>\"']/g,\n (ch) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[ch]!,\n );\n}\n\n/** What a file can be previewed as before upload, or `null` when it cannot. */\nexport type FilePreviewKind = 'pdf' | 'text' | 'image';\n\nconst extensionOf = (name: string) => {\n const dot = name.lastIndexOf('.');\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : '';\n};\nconst TEXT_EXTENSIONS = new Set(['txt', 'text', 'md', 'markdown']);\nconst TEXT_TYPES = new Set(['text/plain', 'text/markdown', 'text/x-markdown']);\nconst IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'svg', 'bmp']);\n// Image types most browsers cannot draw in an <img>.\nconst UNDRAWABLE_IMAGE_TYPES = new Set(['image/heic', 'image/heif', 'image/tiff']);\n\n/**\n * Classifies a file by extension or MIME type, as `accept` does. Only these three are previewed: a PDF in\n * the browser's viewer, plain text and Markdown as text, images in an `<img>`. Everything else (DOCX, HTML,\n * unknown types) is `null`: a blob URL runs with the page's origin, so nothing else is ever framed.\n */\nexport function previewKind(file: { name: string; type: string }): FilePreviewKind | null {\n const ext = extensionOf(file.name);\n const type = file.type.toLowerCase();\n if (ext === 'pdf' || type === 'application/pdf') return 'pdf';\n if (TEXT_EXTENSIONS.has(ext) || TEXT_TYPES.has(type)) return 'text';\n if (UNDRAWABLE_IMAGE_TYPES.has(type)) return null;\n if (IMAGE_EXTENSIONS.has(ext) || type.startsWith('image/')) return 'image';\n return null;\n}\n\n/** A short type name for a file: `PDF`, `MD`, or the MIME subtype when there is no extension. */\nexport function fileTypeLabel(file: { name: string; type: string }): string {\n const ext = extensionOf(file.name);\n if (ext) return ext.toUpperCase();\n return MIME_NAMES[file.type.toLowerCase()] ?? (file.type.split('/').pop()?.toUpperCase() || 'File');\n}\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/** Whether a media query matches, kept current. `false` on the server and where `matchMedia` is missing. */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = useCallback(\n (onChange: () => void) => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => {};\n const list = window.matchMedia(query);\n list.addEventListener?.('change', onChange);\n return () => list.removeEventListener?.('change', onChange);\n },\n [query],\n );\n return useSyncExternalStore(\n subscribe,\n () => typeof window.matchMedia === 'function' && window.matchMedia(query).matches,\n () => false,\n );\n}\n","import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type CSSProperties,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { ChevronDownIcon, MoreHorizontalIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\nimport { fitCount, inlineFlags, isOverflowing } from './fit';\nimport { placePanel } from './place';\n\nexport interface PriorityNavItem {\n /** Where the link goes. */\n href: string;\n /** The visible text. A string (or number) is part of the width cache key; see `PriorityNav`. */\n label: ReactNode;\n /** A stable key. Defaults to `href`. */\n id?: string | undefined;\n /** The page being shown: `aria-current=\"page\"`, and the link never collapses into \"More\". */\n current?: boolean | undefined;\n /**\n * A small count (`2`) or `'dot'` after the label: something waiting there. `0` shows nothing. Visual only; say\n * what it means in `badgeLabel`. While the item is collapsed, \"More\" shows the summed count (or a dot) and adds\n * the label to its accessible name.\n */\n badge?: number | 'dot' | undefined;\n /** What the badge means, appended to the link's (and, while collapsed, More's) accessible name: \"2 suggestions to review\". A count without it is read as the bare number; a dot without it is not announced. */\n badgeLabel?: string | undefined;\n}\n\n/** What `renderLink` receives: spread it onto your link component. */\nexport interface PriorityNavLinkProps {\n href: string;\n className: string;\n 'aria-current': 'page' | undefined;\n onClick: MouseEventHandler<HTMLAnchorElement> | undefined;\n children: ReactNode;\n}\n\nexport interface PriorityNavProps extends Omit<ComponentPropsWithRef<'nav'>, 'children'> {\n /** Names the landmark: \"Main\". */\n 'aria-label': string;\n /** The links, in priority order: the first ones stay inline longest. */\n items: readonly PriorityNavItem[];\n /** Visible text of the overflow toggle. Default \"More\". */\n moreLabel?: string | undefined;\n /** Appended to the toggle's accessible name only: \"More, 3 links\". Default `n link(s)`. */\n moreCountLabel?: ((hidden: number) => string) | undefined;\n /** Renders each link. Default a plain `<a>`; pass a router link: `(props) => <Link {...props} />`. */\n renderLink?: ((props: PriorityNavLinkProps, item: PriorityNavItem) => ReactElement) | undefined;\n /**\n * Called when links start or stop collapsing into \"More\" (also `data-overflowing` on the `nav`), so a\n * header can make room, e.g. an action button going icon-only.\n */\n onOverflowChange?: ((overflowing: boolean) => void) | undefined;\n /**\n * Room in px the row must have beyond fitting every link before it stops reporting overflow. Set it to\n * the space your header gives back on overflow (the button label's width), so the two cannot oscillate.\n * Default 0.\n */\n overflowHysteresis?: number | undefined;\n}\n\nconst defaultCountLabel = (n: number) => (n === 1 ? '1 link' : `${n} links`);\nconst defaultLink = ({ children, ...props }: PriorityNavLinkProps) => <a {...props}>{children}</a>;\nconst keyOf = (item: PriorityNavItem) => item.id ?? item.href;\n/** The badge to draw, or none: `0`, negative and non-finite counts show nothing. */\nconst badgeOf = (item: PriorityNavItem): number | 'dot' | null =>\n item.badge === 'dot'\n ? 'dot'\n : typeof item.badge === 'number' && item.badge > 0 && Number.isFinite(item.badge)\n ? item.badge\n : null;\n/** What a badge adds to an accessible name. */\nconst badgeTextOf = (item: PriorityNavItem): string | null => {\n const badge = badgeOf(item);\n if (badge === null) return null;\n return item.badgeLabel ?? (badge === 'dot' ? null : String(badge));\n};\n\n/** The visible badge: a count pill or a dot. Decorative; its meaning is in visually hidden text beside it. */\nfunction Badge({ value }: { value: number | 'dot' }) {\n return (\n <span className=\"sc-priority-nav__badge\" data-kind={value === 'dot' ? 'dot' : 'count'} aria-hidden=\"true\">\n {value === 'dot' ? null : value}\n </span>\n );\n}\n\n/** CSS anchor positioning places the panel where it exists; elsewhere `placePanel` does, from JS. */\nconst supportsAnchor = () =>\n typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('anchor-name: --a');\n/** The Popover API puts the panel in the top layer, above every ancestor's overflow clip. */\nconst supportsPopover = (el: HTMLElement) => typeof el.showPopover === 'function';\n\n/** Widths are re-measured when this changes: the keys, any string labels and the badges, in order. */\nfunction signatureOf(items: readonly PriorityNavItem[]): string {\n return items\n .map((item) => {\n const text = typeof item.label === 'string' || typeof item.label === 'number' ? item.label : '';\n return `${keyOf(item)}\\u0001${text}\\u0001${badgeOf(item) ?? ''}`;\n })\n .join('\\u0002');\n}\n\ninterface Fit {\n /** The item signature these numbers were measured for; `null` until the first measurement. */\n signature: string | null;\n /** The current index `count` was computed with. */\n current: number;\n /** How many non-current items are inline (`fitCount`). */\n count: number;\n /** Latched overflow signal (`isOverflowing`). */\n overflowing: boolean;\n}\n\ninterface Measured {\n widths: number[];\n more: number;\n gap: number;\n available: number;\n}\n\n/**\n * Priority+ navigation: a row of primary links that keeps the ones that fit inline and collapses the rest\n * into a \"More\" disclosure at the end of the row. The current page is never collapsed. Follows the\n * WAI-ARIA APG disclosure navigation pattern (links in a list, a real button with `aria-expanded`), not\n * `role=\"menu\"`. Server-renders every link inline, so it works before hydration and without JavaScript;\n * see docs/adr/0005-priority-nav.md.\n */\nexport function PriorityNav({\n items,\n moreLabel = 'More',\n moreCountLabel = defaultCountLabel,\n renderLink = defaultLink,\n onOverflowChange,\n overflowHysteresis = 0,\n className,\n style,\n ...rest\n}: PriorityNavProps) {\n const signature = signatureOf(items);\n const current = items.findIndex((item) => item.current);\n const [fit, setFit] = useState<Fit>({ signature: null, current: -1, count: 0, overflowing: false });\n const [open, setOpen] = useState(false);\n const panelId = useId();\n const listRef = useRef<HTMLUListElement>(null);\n const moreRef = useRef<HTMLLIElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLUListElement>(null);\n const measured = useRef<Measured | null>(null);\n const currentRef = useRef(current);\n const fitRef = useRef(fit);\n const hysteresisRef = useRef(overflowHysteresis);\n const onOverflowRef = useRef(onOverflowChange);\n\n /** The split for the cached measurements: how many links stay inline, and the latched overflow flag. */\n const solve = (m: Measured, cur: number, was: boolean) => ({\n count: fitCount({ ...m, current: cur }),\n overflowing: isOverflowing({ ...m, was, hysteresis: hysteresisRef.current }),\n });\n\n // Until the items are measured (on the server, before hydration, after the items or the fonts change)\n // every link renders inline in a single line that clips (or scrolls without JS), and the toggle is laid\n // out invisibly so it can be measured too.\n const measuring = fit.signature !== signature;\n\n // Measure once per signature, then split. Reads first (all widths, the gap, the row), then one state\n // write; React re-renders before paint, so the measuring pass is never seen.\n useLayoutEffect(() => {\n currentRef.current = current;\n fitRef.current = fit;\n hysteresisRef.current = overflowHysteresis;\n onOverflowRef.current = onOverflowChange;\n });\n\n useLayoutEffect(() => {\n const list = listRef.current;\n const more = moreRef.current;\n if (!list || !more) return;\n if (measuring) {\n const widths = Array.from(\n list.querySelectorAll<HTMLElement>(':scope > .sc-priority-nav__item'),\n (el) => el.getBoundingClientRect().width,\n );\n measured.current = {\n widths,\n more: more.getBoundingClientRect().width,\n gap: parseFloat(getComputedStyle(list).columnGap) || 0,\n available: list.clientWidth,\n };\n } else if (fit.current === current) return;\n const m = measured.current;\n if (!m) return;\n setFit({ signature, current, ...solve(m, current, fit.overflowing) });\n }, [measuring, signature, current, fit]);\n\n // One observer, on the row and on the \"More\" item. Its callback reads sizes from the entries (no layout\n // read): the row's width, and the toggle's width when it switches between \"More\" and icon-only (a\n // container query). It writes state only when the inline count or the overflow flag changes.\n useEffect(() => {\n const list = listRef.current;\n const more = moreRef.current;\n if (!list || !more || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver((entries) => {\n const m = measured.current;\n if (!m) return;\n for (const entry of entries) {\n if (entry.target === list)\n m.available = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n else {\n // Hidden (no overflow) reports 0; keep the last real width.\n const width = entry.borderBoxSize?.[0]?.inlineSize ?? 0;\n if (width > 0) m.more = width;\n }\n }\n // Compare before calling setState: an unchanged split must not even schedule a render.\n const prev = fitRef.current;\n if (prev.signature === null) return;\n const next = solve(m, currentRef.current, prev.overflowing);\n if (prev.count !== next.count || prev.overflowing !== next.overflowing) setFit({ ...prev, ...next });\n });\n observer.observe(list);\n observer.observe(more);\n return () => observer.disconnect();\n }, []);\n\n // Tell the header when the overflow flag changes (not on mount: it starts false everywhere).\n const reported = useRef(false);\n useEffect(() => {\n if (reported.current === fit.overflowing) return;\n reported.current = fit.overflowing;\n onOverflowRef.current?.(fit.overflowing);\n }, [fit.overflowing]);\n\n // Web fonts change every width. If they are still loading at mount, measure again once they are ready.\n useEffect(() => {\n const fonts = typeof document === 'undefined' ? undefined : document.fonts;\n if (!fonts || fonts.status === 'loaded') return;\n let live = true;\n void fonts.ready.then(() => {\n if (live) setFit((prev) => ({ ...prev, signature: null }));\n });\n return () => {\n live = false;\n };\n }, []);\n\n const flags = measuring ? null : inlineFlags(items.length, current, fit.count);\n const overflow = flags ? items.filter((_, i) => !flags[i]) : [];\n const expanded = open && overflow.length > 0;\n // \"More\" carries the collapsed items' badges: their summed count, or a dot when they only have dots.\n const overflowBadges = overflow.map(badgeOf).filter((b) => b !== null);\n const overflowCount = overflowBadges.reduce<number>((sum, b) => sum + (b === 'dot' ? 0 : b), 0);\n const moreBadge = overflowCount > 0 ? overflowCount : overflowBadges.length > 0 ? 'dot' : null;\n const moreBadgeText = overflow\n .map(badgeTextOf)\n .filter((text) => text !== null)\n .map((text) => `, ${text}`)\n .join('');\n\n // The panel lives in the top layer while open (popover=\"manual\": opening, Escape, outside clicks and\n // focus stay ours, so behaviour is the same with or without the Popover API). It stays a DOM sibling of\n // the toggle, so Tab moves from the toggle into the links with no invoker wiring.\n useLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel || !supportsPopover(panel)) return;\n // Set on the client only, where the API exists: the server HTML and browsers without it keep `hidden`.\n if (!panel.hasAttribute('popover')) panel.setAttribute('popover', 'manual');\n const shown = panel.matches(':popover-open');\n if (expanded && !shown) panel.showPopover();\n else if (!expanded && shown) panel.hidePopover();\n }, [expanded]);\n\n // Without CSS anchor positioning: place the panel from JS on open, and again on resize or scroll while\n // open. Each pass reads (two rects, one computed style), then writes `left`/`top` once.\n useLayoutEffect(() => {\n const panel = panelRef.current;\n const toggle = toggleRef.current;\n if (!expanded || !panel || !toggle || supportsAnchor()) return;\n const place = () => {\n const anchor = toggle.getBoundingClientRect();\n const box = panel.getBoundingClientRect();\n const css = getComputedStyle(panel);\n const { left, top } = placePanel({\n anchor,\n panel: { width: box.width, height: box.height },\n viewport: { width: document.documentElement.clientWidth, height: window.innerHeight },\n gutter: parseFloat(css.getPropertyValue('--sc-spacing-md')) || 16,\n offset: parseFloat(css.getPropertyValue('--sc-spacing-2xs')) || 4,\n rtl: css.direction === 'rtl',\n });\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n };\n place();\n window.addEventListener('resize', place, { passive: true });\n window.addEventListener('scroll', place, { passive: true, capture: true });\n return () => {\n window.removeEventListener('resize', place);\n window.removeEventListener('scroll', place, { capture: true });\n panel.style.left = '';\n panel.style.top = '';\n };\n }, [expanded]);\n\n // Click outside and Escape close the panel. Escape returns focus to the toggle.\n useEffect(() => {\n if (!expanded) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!moreRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n const active = document.activeElement;\n setOpen(false);\n if (!active || active === document.body || moreRef.current?.contains(active))\n toggleRef.current?.focus();\n };\n document.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [expanded]);\n\n // Focus leaving the \"More\" item (Tab past the last link) closes the panel, as in the APG example.\n const onBlur = (event: FocusEvent<HTMLLIElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false);\n };\n\n const link = (item: PriorityNavItem, inPanel: boolean) => {\n const badge = badgeOf(item);\n const badgeText = badgeTextOf(item);\n return renderLink(\n {\n href: item.href,\n className: 'sc-priority-nav__link',\n 'aria-current': item.current ? 'page' : undefined,\n onClick: inPanel ? () => setOpen(false) : undefined,\n children: (\n <>\n <span className=\"sc-priority-nav__label\">{item.label}</span>\n {badge !== null ? <Badge value={badge} /> : null}\n {badgeText !== null ? <span className=\"sc-visually-hidden\">, {badgeText}</span> : null}\n </>\n ),\n },\n item,\n );\n };\n\n return (\n <nav\n className={cx('sc-priority-nav', className)}\n data-measuring={measuring || undefined}\n data-overflowing={fit.overflowing || undefined}\n // A per-instance anchor name, so two navs on a page never anchor to each other's toggle.\n style={{ ...style, '--_anchor': `--sc-priority-nav${panelId.replace(/[^\\w-]/g, '')}` } as CSSProperties}\n {...rest}\n >\n <ul ref={listRef} className=\"sc-priority-nav__list\">\n {items.map((item, i) =>\n flags && !flags[i] ? null : (\n <li key={keyOf(item)} className=\"sc-priority-nav__item\" data-current={item.current || undefined}>\n {link(item, false)}\n </li>\n ),\n )}\n <li\n ref={moreRef}\n className=\"sc-priority-nav__more\"\n hidden={measuring || overflow.length === 0}\n onBlur={onBlur}\n >\n <button\n ref={toggleRef}\n type=\"button\"\n className=\"sc-priority-nav__toggle\"\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={() => setOpen((o) => !o)}\n >\n {/* Narrow navs (a container query) show only the ellipsis; the label stays in the name. */}\n <MoreHorizontalIcon className=\"sc-priority-nav__ellipsis\" />\n <span className=\"sc-priority-nav__toggle-label\">{moreLabel}</span>\n <span className=\"sc-visually-hidden\">\n , {moreCountLabel(overflow.length)}\n {moreBadgeText}\n </span>\n {moreBadge !== null ? <Badge value={moreBadge} /> : null}\n <ChevronDownIcon size=\"sm\" className=\"sc-priority-nav__chevron\" />\n </button>\n <ul ref={panelRef} id={panelId} className=\"sc-priority-nav__panel\" hidden={!expanded}>\n {overflow.map((item) => (\n <li key={keyOf(item)}>{link(item, true)}</li>\n ))}\n </ul>\n </li>\n </ul>\n </nav>\n );\n}\n","// Pure layout arithmetic for PriorityNav: no DOM, unit-tested in fit.test.ts.\n\nexport interface FitInput {\n /** Measured inline size of each item, in order, px. */\n widths: readonly number[];\n /** Index of the current item, or -1. It is always kept inline. */\n current: number;\n /** Inline size of the row, px. */\n available: number;\n /** Inline size of the \"More\" item, px. */\n more: number;\n /** Gap between items, px. */\n gap: number;\n}\n\n/** Sub-pixel slack: measured widths are fractional and a row that fits exactly must not flip to \"More\". */\nconst EPSILON = 0.5;\n\n/**\n * How many of the non-current items stay inline, counted in order. Every item fits: all of them.\n * Otherwise room is made for the \"More\" item and the current item first, then items are added in order\n * until the next one does not fit. The run stays contiguous (a short item after a long one does not jump\n * the queue), so the row reads as the start of the list, plus the current page.\n */\n/** The inline size of every item in one row, gaps included. */\nexport function rowWidth(widths: readonly number[], gap: number): number {\n let total = 0;\n for (const w of widths) total += w;\n return widths.length > 1 ? total + gap * (widths.length - 1) : total;\n}\n\nexport function fitCount({ widths, current, available, more, gap }: FitInput): number {\n const n = widths.length;\n const hasCurrent = current >= 0 && current < n;\n const others = hasCurrent ? n - 1 : n;\n if (rowWidth(widths, gap) <= available + EPSILON) return others;\n\n let used = more + (hasCurrent ? widths[current]! + gap : 0);\n let count = 0;\n for (let i = 0; i < n; i++) {\n if (i === current) continue;\n const next = used + widths[i]! + gap;\n if (next > available + EPSILON) break;\n used = next;\n count++;\n }\n return count;\n}\n\n/**\n * Which items are inline, given `fitCount`'s answer: the first `count` non-current items, plus the\n * current one wherever it sits. Everything else goes into \"More\", in its original order.\n */\nexport function inlineFlags(length: number, current: number, count: number): boolean[] {\n const flags: boolean[] = [];\n let seen = 0;\n for (let i = 0; i < length; i++) {\n if (i === current) flags.push(true);\n else flags.push(seen++ < count);\n }\n return flags;\n}\n\nexport interface OverflowInput {\n widths: readonly number[];\n gap: number;\n available: number;\n /** The previous answer. */\n was: boolean;\n /** Extra room required, beyond fitting every item, before an overflowing row reports that it fits again. */\n hysteresis: number;\n}\n\n/**\n * Whether the row reports `overflowing`, with hysteresis. It starts as soon as the items do not all fit.\n * Once started, it ends only when every item fits with `hysteresis` px to spare: when a header reacts to\n * overflow by giving the row more room (an action button drops its label), the row then fits, and without\n * the margin it would report \"fits\", the label would come back, and the row would overflow again.\n */\nexport function isOverflowing({ widths, gap, available, was, hysteresis }: OverflowInput): boolean {\n const total = rowWidth(widths, gap);\n return was ? total + Math.max(0, hysteresis) > available + EPSILON : total > available + EPSILON;\n}\n","// Fallback placement for the \"More\" panel where CSS anchor positioning is missing. Pure: rects in, a\n// viewport position out. Unit-tested in place.test.ts.\n\nexport interface Rect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport interface PlaceInput {\n /** The toggle's viewport rect. */\n anchor: Rect;\n /** The panel's size. */\n panel: { width: number; height: number };\n /** The viewport's size. */\n viewport: { width: number; height: number };\n /** Minimum distance from every viewport edge, px. */\n gutter: number;\n /** Space between the toggle and the panel, px. */\n offset: number;\n /** Writing direction: the panel prefers the toggle's inline-end edge. */\n rtl?: boolean | undefined;\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max));\n\n/**\n * Mirrors the CSS: below the toggle, aligned to its inline-end edge; if that runs past the inline-start\n * side of the viewport, aligned to its inline-start edge instead; then shifted to stay inside the gutter.\n * Below the toggle unless only above has room. The width is capped by CSS, so it always fits.\n */\nexport function placePanel({ anchor, panel, viewport, gutter, offset, rtl = false }: PlaceInput): {\n left: number;\n top: number;\n} {\n const endAligned = rtl ? anchor.left : anchor.right - panel.width;\n const startAligned = rtl ? anchor.right - panel.width : anchor.left;\n const fitsX = (x: number) => x >= gutter && x + panel.width <= viewport.width - gutter;\n const x = fitsX(endAligned) ? endAligned : fitsX(startAligned) ? startAligned : endAligned;\n const left = clamp(x, gutter, Math.max(gutter, viewport.width - gutter - panel.width));\n\n const below = anchor.bottom + offset;\n const above = anchor.top - offset - panel.height;\n const fitsBelow = below + panel.height <= viewport.height - gutter;\n const top = fitsBelow || above < gutter ? below : above;\n return { left, top };\n}\n","import { Popover as BasePopover } from '@base-ui/react/popover';\nimport type { ReactNode } from 'react';\nimport { Button } from '../Button/Button';\nimport { XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\nexport interface PopoverRootProps {\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the popover opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Default `false`: the page stays interactive and focus may leave. `true` makes the page inert until it closes. */\n modal?: boolean | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Owns the open state. Wrap a `Popover.Trigger` and a `Popover.Content`. */\nfunction Root({ open, defaultOpen, onOpenChange, modal = false, children }: PopoverRootProps) {\n return (\n <BasePopover.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange ? (next) => onOpenChange(next) : undefined}\n modal={modal}\n >\n {children}\n </BasePopover.Root>\n );\n}\n\nexport interface PopoverTriggerProps extends Omit<BasePopover.Trigger.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * Opens the popover. With no `render` it is a secondary Button; pass any Button or IconButton through\n * `render`: `<Popover.Trigger render={<IconButton label=\"Sweeps: running\" dot=\"success\" />}>`.\n */\nfunction Trigger({ render, className, children, ...rest }: PopoverTriggerProps) {\n return (\n <BasePopover.Trigger\n render={render ?? <Button variant=\"secondary\" className={className} />}\n className={render ? className : undefined}\n {...rest}\n >\n {children}\n </BasePopover.Trigger>\n );\n}\n\nexport interface PopoverContentProps extends Omit<BasePopover.Popup.Props, 'className'> {\n /**\n * Side of the trigger it opens on. Default `bottom`. With no room it flips to the opposite side (`top` for `bottom`),\n * never to a perpendicular one; when neither side fits, it takes the roomier one and scrolls inside.\n */\n side?: PopoverSide | undefined;\n /** Alignment along that side. Default `center`. */\n align?: PopoverAlign | undefined;\n /** Distance from the trigger in px. Default 4, or 8 with `arrow`. */\n sideOffset?: number | undefined;\n /** Draws a tip pointing at the trigger. */\n arrow?: boolean | undefined;\n /**\n * What to position against instead of the `Popover.Trigger`: an element, a ref to one, a virtual element or a\n * function returning either. For a popover opened from elsewhere (a menu item, a row action) with a controlled\n * `Popover.Root open`. The panel is still portaled to `document.body`.\n */\n anchor?: BasePopover.Positioner.Props['anchor'];\n className?: string | undefined;\n}\n\n/**\n * Collisions stay on the axis asked for: flip to the opposite side, shift along it, then shrink to the room there\n * (`max-block-size: var(--available-height)`; the panel scrolls). Base UI's popover default instead falls back to the\n * perpendicular axis when neither side fits the whole panel, so on a short viewport a `bottom` popover anchored at the\n * end of a row opened to its left, over the row it is about. This is Base UI's own setting for Menu and Select.\n */\nconst COLLISION_AVOIDANCE = { fallbackAxisSide: 'none' } as const;\n\n/** Portal, positioner and the panel. Any content goes inside; name it with `Popover.Title`. */\nfunction Content({\n side = 'bottom',\n align = 'center',\n sideOffset,\n arrow = false,\n anchor,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n return (\n <BasePopover.Portal>\n <BasePopover.Positioner\n side={side}\n align={align}\n sideOffset={sideOffset ?? (arrow ? 8 : 4)}\n anchor={anchor}\n collisionAvoidance={COLLISION_AVOIDANCE}\n className=\"sc-popover__positioner\"\n >\n <BasePopover.Popup className={cx('sc-popover', className)} {...rest}>\n {arrow ? <BasePopover.Arrow className=\"sc-popover__arrow\" /> : null}\n {children}\n </BasePopover.Popup>\n </BasePopover.Positioner>\n </BasePopover.Portal>\n );\n}\n\nexport interface PopoverTitleProps extends Omit<BasePopover.Title.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Names the popover (`aria-labelledby`). A heading, `h2` by default. */\nfunction Title({ className, ...rest }: PopoverTitleProps) {\n return <BasePopover.Title className={cx('sc-popover__title', className)} {...rest} />;\n}\n\nexport interface PopoverDescriptionProps extends Omit<BasePopover.Description.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Describes the popover (`aria-describedby`). Muted text. */\nfunction Description({ className, ...rest }: PopoverDescriptionProps) {\n return <BasePopover.Description className={cx('sc-popover__description', className)} {...rest} />;\n}\n\nexport interface PopoverCloseProps extends Omit<BasePopover.Close.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** With no children or `render`, the × in the corner. Otherwise wraps any Button: `<Popover.Close render={<Button variant=\"ghost\" />}>Done</Popover.Close>`. */\nfunction Close({ className, children, render, ...rest }: PopoverCloseProps) {\n if (children === undefined && render === undefined) {\n return (\n <BasePopover.Close className={cx('sc-popover__close', className)} aria-label=\"Close\" {...rest}>\n <XIcon />\n </BasePopover.Close>\n );\n }\n return (\n <BasePopover.Close className={className} render={render} {...rest}>\n {children}\n </BasePopover.Close>\n );\n}\n\n/** A non-modal panel anchored to a trigger, for a small form, a status summary or a legend. Built on Base UI's Popover. */\nexport const Popover = { Root, Trigger, Content, Title, Description, Close };\n","import type { ComponentPropsWithRef } from 'react';\nimport type { IconSize } from '../Icon/Icon';\nimport { cx } from '../../utils/cx';\n\nexport interface BroomIconProps extends Omit<ComponentPropsWithRef<'svg'>, 'children'> {\n /** Sweeps back and forth while dust drifts. With `prefers-reduced-motion` it holds still and shows the dust. */\n sweeping?: boolean | undefined;\n /** The Icon sizes (`lg` 20, the nav size, is the default), or `display` (72px, stroke 1.75px) for empty states and showcases. Inside an IconButton it fills the icon slot one step up, since it is drawn on a 24px grid. */\n size?: IconSize | 'display' | undefined;\n /** Gives the icon an accessible name (`role=\"img\"`). Without it the icon is decorative and hidden from assistive tech. */\n title?: string | undefined;\n}\n\n/**\n * An animated broom on a 24×24 grid, for \"a sweep is running\". Inline SVG, because CSS cannot animate\n * inside a `<use>` clone. Strokes keep a fixed screen width at every size (`vector-effect: non-scaling-stroke`).\n * Decorative by default: say what is happening in the surrounding control's label (\"Sweeps: running\").\n */\nexport function BroomIcon({ sweeping = false, size = 'lg', title, className, ...rest }: BroomIconProps) {\n return (\n <svg\n className={cx('sc-icon', 'sc-broom', className)}\n data-size={size}\n data-sweeping={sweeping || undefined}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n focusable=\"false\"\n aria-hidden={title ? undefined : true}\n role={title ? 'img' : undefined}\n aria-label={title}\n {...rest}\n >\n <g\n className=\"sc-broom__body\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16.1 10.48 L19.36 1.86 A0.87 0.87 0 0 1 20.98 2.47 L17.84 10.78\" />\n <path d=\"M13.33 12 C14.23 10.67 16.73 9.87 18.17 11 C19.07 12.67 18.93 18.33 18.4 21.4 C16.07 22.4 11.07 22.07 6.4 18.07 C9.07 16.67 11.8 15 13.33 12 Z\" />\n <path className=\"sc-broom__band\" d=\"M13.47 12.13 L18.4 13.5 L18.33 14.1 L13.27 12.77 Z\" />\n <path d=\"M12.87 13.73 L14.4 14.47 M16.2 15.27 L18.47 15.87\" />\n <path d=\"M12.8 16.87 C11.86 18.24 10.75 19.38 9.57 20.23 M15.6 17.4 C15.22 18.96 14.6 20.44 13.77 21.71\" />\n </g>\n <g className=\"sc-broom__dust\" fill=\"none\" stroke=\"currentColor\">\n <circle cx=\"4.77\" cy=\"13.53\" r=\"0.5\" />\n <circle cx=\"2.7\" cy=\"15.53\" r=\"0.87\" />\n <circle cx=\"4.1\" cy=\"18.27\" r=\"0.5\" />\n </g>\n </svg>\n );\n}\n","import {\n Children,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Dialog } from '../Dialog/Dialog';\nimport { IconButton } from '../IconButton/IconButton';\nimport { CheckIcon, XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\n/** Which way the flow moved: `forward` slides the new step in from the inline end, `back` from the start. */\nexport type FlowDirection = 'forward' | 'back';\n/** Why the flow asked to close: Esc, or the × in the header. */\nexport type FlowCloseRequestReason = 'escape-key' | 'close-press';\n\ninterface FlowContextValue {\n announce: (message: string) => void;\n}\nconst FlowContext = createContext<FlowContextValue>({ announce: () => {} });\n\ntype FramePhase = 'enter' | 'exit' | undefined;\nconst FrameContext = createContext<FramePhase>(undefined);\n\n/** Enter continues unless focus is somewhere Enter already means something. */\nconst ENTER_IGNORES =\n 'textarea, button, a[href], summary, select, [contenteditable], [role=\"combobox\"], [data-flow-keys=\"local\"]';\n/** The arrow keys move between steps only when focus is not in a control that uses them. */\nconst ARROW_IGNORES =\n 'input, textarea, select, button, a[href], summary, [contenteditable], [role=\"radiogroup\"], [role=\"slider\"], [role=\"listbox\"], [role=\"tablist\"], [role=\"menu\"], [role=\"grid\"], [role=\"combobox\"], [data-flow-keys=\"local\"]';\n\nexport interface FullScreenFlowRootProps {\n /** Whether the flow is showing. Default `true`, for a flow that lives on its own route. */\n open?: boolean | undefined;\n /**\n * Esc and the header's × call this instead of closing. Show a leave confirmation (a nested `Dialog`),\n * then close by setting `open` to `false` or by navigating away. A press on the backdrop does nothing.\n */\n onRequestClose: (reason: FlowCloseRequestReason) => void;\n /** Enter (outside buttons, links, textareas and `[data-flow-keys=\"local\"]`) and the forward arrow key call this. */\n onNext?: (() => void) | undefined;\n /** The back arrow key (outside form controls) calls this. */\n onBack?: (() => void) | undefined;\n /** A decorative layer behind everything, such as an illustration. Hidden from assistive tech. */\n decoration?: ReactNode | undefined;\n className?: string | undefined;\n /** `Header`, `Body` and `Footer`, in that order. */\n children?: ReactNode | undefined;\n}\n\n/**\n * A full-screen modal for a multi-step task, on `Dialog variant=\"fullscreen\"`: focus is trapped, the page\n * behind is inert, and Esc goes to `onRequestClose`. Holds the polite live region that `Step` announces into.\n */\nfunction Root({\n open = true,\n onRequestClose,\n onNext,\n onBack,\n decoration,\n className,\n children,\n}: FullScreenFlowRootProps) {\n const popupRef = useRef<HTMLDivElement>(null);\n const [message, setMessage] = useState('');\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n // Clear first, then set after a beat, so the same words twice in a row are read twice.\n const announce = useCallback((next: string) => {\n setMessage('');\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setMessage(next), 30);\n }, []);\n useEffect(() => () => clearTimeout(timer.current), []);\n const context = useMemo(() => ({ announce }), [announce]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n const target = event.target as Element;\n // A nested dialog or popup is portalled out of the popup; its keys are its own.\n if (!event.currentTarget.contains(target)) return;\n if (event.key === 'Enter') {\n if (!onNext || target.closest(ENTER_IGNORES)) return;\n event.preventDefault();\n onNext();\n return;\n }\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') return;\n if (target.closest(ARROW_IGNORES)) return;\n const rtl = getComputedStyle(event.currentTarget).direction === 'rtl';\n const forward = (event.key === 'ArrowRight') !== rtl;\n const handler = forward ? onNext : onBack;\n if (!handler) return;\n event.preventDefault();\n handler();\n };\n\n return (\n <Dialog.Root\n open={open}\n onRequestClose={(reason) => {\n if (reason !== 'outside-press') onRequestClose(reason);\n }}\n >\n <Dialog.Content\n ref={popupRef}\n variant=\"fullscreen\"\n className={cx('sc-flow', className)}\n initialFocus={() => popupRef.current?.querySelector<HTMLElement>('.sc-flow__step-title') ?? true}\n onKeyDown={handleKeyDown}\n >\n <FlowContext.Provider value={context}>\n {decoration ? (\n <div className=\"sc-flow__decoration\" aria-hidden=\"true\">\n {decoration}\n </div>\n ) : null}\n {children}\n <div className=\"sc-visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n {message}\n </div>\n </FlowContext.Provider>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport interface FullScreenFlowHeaderProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {\n /** The flow's name (\"Set up your search\"). Labels the dialog. */\n title: ReactNode;\n /** A small mark before the title. Decorative. */\n logo?: ReactNode | undefined;\n /** Shown instead of `title` below 760px, where the progress drops to its own row: \"4 of 10 · Roles\". */\n compactTitle?: ReactNode | undefined;\n /** A status after the progress, such as a \"Saved\" tick. */\n status?: ReactNode | undefined;\n /** Name of the × button, which calls `onRequestClose('close-press')`. Default \"Close\". */\n closeLabel?: string | undefined;\n /** Usually a `FullScreenFlow.Progress`. */\n children?: ReactNode | undefined;\n}\n\n/** The top bar: logo and title, progress in the middle, a status, and the ×. Pinned; it never scrolls. */\nfunction Header({\n title,\n logo,\n compactTitle,\n status,\n closeLabel = 'Close',\n className,\n children,\n ...rest\n}: FullScreenFlowHeaderProps) {\n return (\n <div className={cx('sc-flow__header', className)} {...rest}>\n <div className=\"sc-flow__heading\" data-compact={compactTitle ? '' : undefined}>\n {logo ? (\n <span className=\"sc-flow__logo\" aria-hidden=\"true\">\n {logo}\n </span>\n ) : null}\n <Dialog.Title className=\"sc-flow__title\">{title}</Dialog.Title>\n {compactTitle ? <span className=\"sc-flow__compact-title\">{compactTitle}</span> : null}\n </div>\n {children}\n {status ? <div className=\"sc-flow__status\">{status}</div> : null}\n <Dialog.Close\n className=\"sc-flow__close\"\n render={<IconButton label={closeLabel} aria-keyshortcuts=\"Escape\" />}\n >\n <XIcon size=\"lg\" />\n </Dialog.Close>\n </div>\n );\n}\n\n/** A chapter of the flow and how many numbered steps it holds. */\nexport interface FlowChapter {\n label: string;\n steps: number;\n}\n\nexport interface FullScreenFlowProgressProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n /** The chapters in order. Each draws one segment, as wide as its share of the steps. */\n chapters: readonly FlowChapter[];\n /**\n * The current step, counted from 1 across every chapter. `0` is before the first (a welcome screen);\n * anything past the total fills every segment. The current step counts as half done.\n */\n step: number;\n /** One line above the segments: \"Step 4 of 10 · Roles · about 5 min left\". Hidden below 760px. */\n label?: ReactNode | undefined;\n /** Name of the list of segments. Default \"Progress\". */\n listLabel?: string | undefined;\n}\n\n/** Segmented progress, one segment per chapter; the chapter holding the current step has `aria-current=\"step\"`. */\nfunction Progress({\n chapters,\n step,\n label,\n listLabel = 'Progress',\n className,\n ...rest\n}: FullScreenFlowProgressProps) {\n const starts = chapters.reduce<number[]>(\n (acc, chapter, i) => [...acc, i === 0 ? 0 : acc[i - 1]! + chapters[i - 1]!.steps],\n [],\n );\n return (\n <div className={cx('sc-flow__progress', className)} {...rest}>\n {label ? <div className=\"sc-flow__progress-label\">{label}</div> : null}\n <ol className=\"sc-flow__segments\" aria-label={listLabel}>\n {chapters.map((chapter, i) => {\n const from = starts[i]!;\n const current = step > from && step <= from + chapter.steps;\n const done = Math.min(chapter.steps, Math.max(0, step - 1 - from)) + (current ? 0.5 : 0);\n const percent = chapter.steps > 0 ? Math.min(100, (done / chapter.steps) * 100) : 0;\n return (\n <li\n key={chapter.label}\n className=\"sc-flow__segment\"\n style={{ flexGrow: chapter.steps }}\n aria-current={current ? 'step' : undefined}\n >\n <span className=\"sc-flow__segment-fill\" style={{ inlineSize: `${percent}%` }} />\n <span className=\"sc-visually-hidden\">{chapter.label}</span>\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n\nexport type FullScreenFlowBodyProps = ComponentPropsWithRef<'div'>;\n\n/** Between header and footer: a `Rail` (from 1000px) beside the `Viewport`. */\nfunction Body({ className, ...rest }: FullScreenFlowBodyProps) {\n return <div className={cx('sc-flow__body', className)} {...rest} />;\n}\n\nexport interface FullScreenFlowRailProps extends ComponentPropsWithRef<'nav'> {\n /** A note under the steps, such as where answers can be changed later. Hidden on short screens. */\n footer?: ReactNode | undefined;\n}\n\n/** Every step by chapter, shown from 1000px. Holds `RailGroup`s of `RailItem`s. Named \"Steps\" unless `aria-label` says otherwise. */\nfunction Rail({\n 'aria-label': ariaLabel = 'Steps',\n footer,\n className,\n children,\n ...rest\n}: FullScreenFlowRailProps) {\n return (\n <nav className={cx('sc-flow__rail', className)} aria-label={ariaLabel} {...rest}>\n {children}\n {footer ? <div className=\"sc-flow__rail-note\">{footer}</div> : null}\n </nav>\n );\n}\n\nexport interface FullScreenFlowRailGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {\n /** The chapter name. */\n label: ReactNode;\n}\n\n/** One chapter in the rail: its name over a list of `RailItem`s. */\nfunction RailGroup({ label, className, children, ...rest }: FullScreenFlowRailGroupProps) {\n const id = useId();\n return (\n <div className={cx('sc-flow__rail-group', className)} {...rest}>\n <span className=\"sc-flow__rail-label\" id={id}>\n {label}\n </span>\n <ol className=\"sc-flow__rail-list\" aria-labelledby={id}>\n {children}\n </ol>\n </div>\n );\n}\n\nexport interface FullScreenFlowRailItemProps extends ComponentPropsWithRef<'button'> {\n /** The step on screen: `aria-current=\"step\"` and the accent wash. */\n current?: boolean | undefined;\n /** Shows a check and adds `doneLabel` for assistive tech. */\n done?: boolean | undefined;\n /** Read after the label when `done`. Default \"done\". */\n doneLabel?: string | undefined;\n /** A small icon at the end of the row, e.g. \"drafted for you\". Give it a `title` if it carries meaning. */\n adornment?: ReactNode | undefined;\n}\n\n/** A step in the rail. A button: disable the steps not reached yet. */\nfunction RailItem({\n current = false,\n done = false,\n doneLabel = 'done',\n adornment,\n type = 'button',\n className,\n children,\n ...rest\n}: FullScreenFlowRailItemProps) {\n return (\n <li className=\"sc-flow__rail-entry\">\n <button\n type={type}\n className={cx('sc-flow__rail-item', className)}\n aria-current={current ? 'step' : undefined}\n data-done={done || undefined}\n {...rest}\n >\n <span className=\"sc-flow__rail-mark\" aria-hidden=\"true\">\n {done ? <CheckIcon size=\"sm\" /> : null}\n </span>\n <span className=\"sc-flow__rail-text\">\n {children}\n {done ? <span className=\"sc-visually-hidden\">, {doneLabel}</span> : null}\n </span>\n {adornment ? <span className=\"sc-flow__rail-adornment\">{adornment}</span> : null}\n </button>\n </li>\n );\n}\n\ninterface Frame {\n key: string;\n element: ReactElement;\n direction: FlowDirection;\n}\n\nexport interface FullScreenFlowViewportProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'ref'> {\n /** Which way this change goes. Set it with the step: `back` when the person went back. Default `forward`. */\n direction?: FlowDirection | undefined;\n /** Exactly one `FullScreenFlow.Step`, keyed by step: `<FullScreenFlow.Step key={step.id} …>`. */\n children: ReactElement;\n}\n\n/**\n * The scrolling area that shows one step. When the child's `key` changes, the old step slides out and the\n * new one slides in (by `direction`; a short crossfade under reduced motion), the area scrolls to the top,\n * and the new step's title takes focus and is announced.\n */\nfunction Viewport({ direction = 'forward', className, children, ...rest }: FullScreenFlowViewportProps) {\n const element = Children.only(children);\n const key = String(element.key ?? '');\n const [state, setState] = useState<{ current: Frame; leaving: Frame | null; moved: boolean }>({\n current: { key, element, direction },\n leaving: null,\n moved: false,\n });\n // Derived during render (React's \"store information from previous renders\"): the step that is leaving\n // keeps the props it last rendered with, and stays mounted under its own key while it animates out.\n if (state.current.key !== key) {\n setState({\n current: { key, element, direction },\n leaving: { ...state.current, direction },\n moved: true,\n });\n } else if (state.current.element !== element) {\n setState((s) => ({ ...s, current: { ...s.current, element } }));\n }\n const finishExit = useCallback((leftKey: string) => {\n setState((s) => (s.leaving?.key === leftKey ? { ...s, leaving: null } : s));\n }, []);\n\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (state.moved && ref.current) ref.current.scrollTop = 0;\n }, [key, state.moved]);\n\n const frames: Array<{ frame: Frame; phase: FramePhase }> = [];\n if (state.leaving && state.leaving.key !== key) frames.push({ frame: state.leaving, phase: 'exit' });\n frames.push({\n frame: { key, element, direction: state.current.direction },\n phase: state.moved ? 'enter' : undefined,\n });\n\n return (\n <div ref={ref} className={cx('sc-flow__viewport', className)} {...rest}>\n {frames.map(({ frame, phase }) => (\n <FrameView\n key={frame.key}\n frameKey={frame.key}\n phase={phase}\n direction={frame.direction}\n onExited={finishExit}\n >\n {frame.element}\n </FrameView>\n ))}\n </div>\n );\n}\n\nfunction FrameView({\n frameKey,\n phase,\n direction,\n onExited,\n children,\n}: {\n frameKey: string;\n phase: FramePhase;\n direction: FlowDirection;\n onExited: (key: string) => void;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (phase !== 'exit') return;\n let cancelled = false;\n const el = ref.current;\n // CSS runs the motion (tokens, reduced motion); wait for it. Where nothing animates, leave at once.\n const animations = el && typeof el.getAnimations === 'function' ? el.getAnimations() : [];\n const done = () => {\n if (!cancelled) onExited(frameKey);\n };\n Promise.all(animations.map((a) => a.finished)).then(done, done);\n return () => {\n cancelled = true;\n };\n }, [phase, frameKey, onExited]);\n return (\n <div\n ref={ref}\n className=\"sc-flow__frame\"\n data-phase={phase}\n data-direction={direction}\n inert={phase === 'exit'}\n >\n <FrameContext.Provider value={phase}>{children}</FrameContext.Provider>\n </div>\n );\n}\n\nexport interface FullScreenFlowStepProps extends Omit<ComponentPropsWithRef<'section'>, 'title'> {\n /** The step's heading, an `<h2>` that takes focus (`tabindex=\"-1\"`) when the step arrives. */\n title: ReactNode;\n /** A short line above the title: \"Your search · Step 4 of 10\". */\n eyebrow?: ReactNode | undefined;\n /** Why this step is asked, under the title. */\n description?: ReactNode | undefined;\n /** What the live region says when the step arrives: \"Step 4 of 10, Roles\". Defaults to `title` when it is a string. */\n announcement?: string | undefined;\n}\n\n/** One step: eyebrow, title, description, then its content. Render it inside `Viewport` with a `key`. */\nfunction Step({\n title,\n eyebrow,\n description,\n announcement,\n className,\n children,\n ...rest\n}: FullScreenFlowStepProps) {\n const id = useId();\n const titleRef = useRef<HTMLHeadingElement>(null);\n const phase = useContext(FrameContext);\n const { announce } = useContext(FlowContext);\n const message = announcement ?? (typeof title === 'string' ? title : undefined);\n // The latest message and announcer, read when the step arrives. A ref rather than React's useEffectEvent, which\n // the React canary bundled with Next 15 exports only as experimental_useEffectEvent (the import breaks next build).\n const latest = useRef({ message, announce });\n useEffect(() => {\n latest.current = { message, announce };\n });\n useEffect(() => {\n if (phase !== 'enter') return;\n titleRef.current?.focus({ preventScroll: true });\n if (latest.current.message) latest.current.announce(latest.current.message);\n }, [phase]);\n return (\n <section className={cx('sc-flow__step', className)} aria-labelledby={id} {...rest}>\n <div className=\"sc-flow__step-head\">\n {eyebrow ? <p className=\"sc-flow__eyebrow\">{eyebrow}</p> : null}\n <h2 className=\"sc-flow__step-title\" id={id} ref={titleRef} tabIndex={-1}>\n {title}\n </h2>\n {description ? <div className=\"sc-flow__step-description\">{description}</div> : null}\n </div>\n {children}\n </section>\n );\n}\n\nexport interface FullScreenFlowFooterProps extends ComponentPropsWithRef<'div'> {\n /** At the inline start: a Back button. */\n back?: ReactNode | undefined;\n /** Before the actions, from 760px: \"Press Enter to continue\". */\n hint?: ReactNode | undefined;\n /** The primary action, at the inline end; stretches below 520px. */\n children?: ReactNode | undefined;\n}\n\n/** The pinned bottom bar. Buttons in it are at least 44px tall and wide, and it clears the home indicator. */\nfunction Footer({ back, hint, className, children, ...rest }: FullScreenFlowFooterProps) {\n return (\n <div className={cx('sc-flow__footer', className)} {...rest}>\n {back ? <div className=\"sc-flow__footer-back\">{back}</div> : null}\n {hint ? <div className=\"sc-flow__footer-hint\">{hint}</div> : null}\n <div className=\"sc-flow__footer-actions\">{children}</div>\n </div>\n );\n}\n\n/**\n * A full-screen, multi-step flow (onboarding, setup) on `Dialog variant=\"fullscreen\"`:\n * `Root` › `Header` (with `Progress`) · `Body` (`Rail` › `RailGroup` › `RailItem`, and `Viewport` › `Step`) · `Footer`.\n * The app owns the state (which step, which direction); this owns the surface, motion, focus and announcements.\n */\nexport const FullScreenFlow = {\n Root,\n Header,\n Progress,\n Body,\n Rail,\n RailGroup,\n RailItem,\n Viewport,\n Step,\n Footer,\n};\n","import type { ComponentPropsWithRef, CSSProperties, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ScoreTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger';\nexport type ScoreSize = 'sm' | 'md';\nexport type ScoreVariant = 'tile' | 'ring';\n\nexport interface ScoreProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * The number shown, e.g. a fit score. Rendered as given; round it first. `null` means not scored yet: a neutral\n * tile (or an empty ring) with a dash, read as \"{label}: not scored\", and `tone` is ignored.\n */\n value: number | null;\n /** The top of the scale. Default 100. Fills the ring and ends the default accessible text. */\n max?: number | undefined;\n /** Colour. The system holds no thresholds: map the value to a tone in the app. Default `accent`. */\n tone?: ScoreTone | undefined;\n /** `tile` (default), a number on a tinted square, or `ring`, a donut for detail headers. */\n variant?: ScoreVariant | undefined;\n /** Tile size: `sm` 40px for list rows (default), `md` 48px. The ring is 64px. */\n size?: ScoreSize | undefined;\n /** A short word under the number: \"fit\". Visual only; say it in `label`. */\n caption?: ReactNode | undefined;\n /** What the number measures, read before it: \"Fit score\". Default \"Score\". */\n label?: string | undefined;\n /** The whole text assistive tech reads instead of the default \"{label} {value} out of {max}\" (\"{label}: not scored\" without a value). */\n valueText?: string | undefined;\n /** Shows the selected look (solid fill). Also on automatically inside a selected Card or an element with `aria-pressed=\"true\"` or `aria-selected=\"true\"`. */\n selected?: boolean | undefined;\n}\n\n/**\n * A score as a number on a tinted tile or inside a ring. The number and caption are visual; assistive tech reads one\n * visually hidden sentence (\"Fit score 94 out of 100\"), so the score is named without `aria-label` on a non-interactive\n * element and reads whole inside a row button. A `null` value is \"not scored\": a dash, no tone, no arc.\n */\nexport function Score({\n value,\n max = 100,\n tone = 'accent',\n variant = 'tile',\n size = 'sm',\n caption,\n label = 'Score',\n valueText,\n selected = false,\n className,\n style,\n ...rest\n}: ScoreProps) {\n const scored = value !== null;\n const fraction = scored && max > 0 ? Math.min(1, Math.max(0, value / max)) : 0;\n return (\n <span\n className={cx('sc-score', className)}\n data-variant={variant}\n data-size={variant === 'tile' ? size : undefined}\n data-tone={scored ? tone : undefined}\n data-unscored={scored ? undefined : true}\n data-selected={selected || undefined}\n style={\n variant === 'ring'\n ? ({ ...style, '--sc-score-fill': (fraction * 100).toFixed(2) } as CSSProperties)\n : style\n }\n {...rest}\n >\n <span className=\"sc-visually-hidden\">\n {valueText ?? (scored ? `${label} ${value} out of ${max}` : `${label}: not scored`)}\n </span>\n {variant === 'ring' ? (\n <svg className=\"sc-score__ring\" viewBox=\"0 0 64 64\" aria-hidden=\"true\" focusable=\"false\">\n {/* r = (64 - ring stroke 6) / 2, so the stroke sits inside the 64px box. */}\n <circle className=\"sc-score__track\" cx=\"32\" cy=\"32\" r=\"29\" pathLength={100} />\n {/* No arc at 0: a zero-length dash with round caps would still paint a dot. */}\n {fraction > 0 ? <circle className=\"sc-score__arc\" cx=\"32\" cy=\"32\" r=\"29\" pathLength={100} /> : null}\n </svg>\n ) : null}\n <span className=\"sc-score__body\" aria-hidden=\"true\">\n <span className=\"sc-score__value\">{scored ? value : '–'}</span>\n {caption != null ? <span className=\"sc-score__caption\">{caption}</span> : null}\n </span>\n </span>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ReasonTone = 'for' | 'against' | 'gap';\nexport type ReasonListSize = 'sm' | 'md';\n\nexport interface ReasonListProps extends ComponentPropsWithRef<'ul'> {\n /** What every item in the list is: `for` (a filled square), `against` (a bar) or `gap` (a hollow circle). Shape and colour both carry it. */\n tone: ReasonTone;\n /** `md` 14px (default) for a detail view, `sm` 12px for the compact form inside a card. */\n size?: ReasonListSize | undefined;\n /** A dashed rule above the list, for the compact form under a card's title. */\n divider?: boolean | undefined;\n}\n\nexport type ReasonListItemProps = ComponentPropsWithRef<'li'>;\n\n/**\n * A list of reasons with a marker shape per tone, so the meaning is never colour alone. Name the list with a\n * heading (\"Why it fits\", \"Watch for\") and point `aria-labelledby` at it: the heading says what the marker means.\n */\nfunction ReasonListRoot({ tone, size = 'md', divider = false, className, ...rest }: ReasonListProps) {\n return (\n <ul\n className={cx('sc-reason-list', className)}\n data-tone={tone}\n data-size={size}\n data-divider={divider || undefined}\n {...rest}\n />\n );\n}\n\n/** One reason. `<strong>` inside picks out the key words in the default text colour. */\nfunction ReasonListItem({ className, ...rest }: ReasonListItemProps) {\n return <li className={cx('sc-reason-list__item', className)} {...rest} />;\n}\n\nexport const ReasonList = Object.assign(ReasonListRoot, { Item: ReasonListItem });\n","import { createElement, Fragment, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type WordDiffKind = 'same' | 'added' | 'removed';\nexport interface WordDiffPart {\n kind: WordDiffKind;\n text: string;\n}\nexport type WordDiffElement = 'p' | 'div' | 'span';\nexport type WordDiffSize = 'sm' | 'md';\nexport type WordDiffFamily = 'sans' | 'mono';\n\nexport interface WordDiffProps extends Omit<ComponentPropsWithRef<'p'>, 'children'> {\n /** Runs of unchanged, removed and added text, in reading order, whitespace included. Rendered exactly: joining every `text` gives the visible string. */\n parts: readonly WordDiffPart[];\n /** Element to render. Default `p`; `div` or `span` inside other text. */\n as?: WordDiffElement | undefined;\n /** `sm` 14px UI text (default) or `md` body copy. */\n size?: WordDiffSize | undefined;\n /**\n * `sans` prose (default), or `mono` for code and structured text (YAML, JSON, Markdown source): the mono face, no\n * reading-measure cap, and marks without side padding so columns stay aligned.\n */\n family?: WordDiffFamily | undefined;\n /** Screen reader word around added text: \"[added: …]\". Default \"added\". */\n addedLabel?: string | undefined;\n /** Screen reader word around removed text: \"[removed: …]\". Default \"removed\". */\n removedLabel?: string | undefined;\n}\n\nconst edges = /^(\\s*)([\\s\\S]*?)(\\s*)$/;\n\nfunction Change({ kind, text, label }: { kind: 'added' | 'removed'; text: string; label: string }) {\n // Leading and trailing whitespace stays outside the mark, so the tint and line hug the words.\n const [, lead = '', core = '', trail = ''] = edges.exec(text) ?? [];\n if (!core) return <>{text}</>;\n const Tag = kind === 'added' ? 'ins' : 'del';\n return (\n <>\n {lead}\n <Tag className={`sc-word-diff__${kind}`}>\n <span className=\"sc-visually-hidden\">[{label}: </span>\n {core}\n <span className=\"sc-visually-hidden\">]</span>\n </Tag>\n {trail}\n </>\n );\n}\n\n/**\n * A word-level diff as prose: removed text struck through and added text underlined, each on a tint, inside real\n * `<del>` and `<ins>` with \"[removed: …]\" / \"[added: …]\" for screen readers. The line, not the colour, carries the\n * meaning. Whitespace is preserved exactly (`white-space: pre-wrap`).\n */\nexport function WordDiff({\n parts,\n as = 'p',\n size = 'sm',\n family = 'sans',\n addedLabel = 'added',\n removedLabel = 'removed',\n className,\n ...rest\n}: WordDiffProps) {\n const children: ReactNode = parts.map((part, i) =>\n part.kind === 'same' ? (\n <Fragment key={i}>{part.text}</Fragment>\n ) : (\n <Change\n key={i}\n kind={part.kind}\n text={part.text}\n label={part.kind === 'added' ? addedLabel : removedLabel}\n />\n ),\n );\n return createElement(\n as,\n {\n className: cx('sc-word-diff', className),\n 'data-size': size,\n ...(family === 'mono' ? { 'data-family': 'mono' } : {}),\n ...rest,\n },\n children,\n );\n}\n","import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport interface QuoteProps extends ComponentPropsWithRef<'figure'> {\n /** Who said it, shown as a small overline before the words: \"You\". */\n label: ReactNode;\n /** The quoted words. Phrasing content: the quote renders inline after the label. */\n children: ReactNode;\n}\n\n/**\n * Someone's own words echoed back on the accent wash, with who said them: the instruction you gave above the\n * rewrite it produced. A `<figure>` whose `<figcaption>` is the label and whose `<blockquote>` is the text, so the\n * attribution is part of the semantics, not just the styling.\n */\nexport function Quote({ label, className, children, ...rest }: QuoteProps) {\n return (\n <figure className={cx('sc-quote', className)} {...rest}>\n <figcaption className=\"sc-quote__label\">{label}</figcaption>\n <blockquote className=\"sc-quote__text\">{children}</blockquote>\n </figure>\n );\n}\n","import { Avatar as BaseAvatar } from '@base-ui/react/avatar';\nimport { useRender } from '@base-ui/react/use-render';\nimport type { ComponentPropsWithRef } from 'react';\nimport { UserIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/**\n * One or two capital letters for a person: the first letters of the first and last words of a name, or, for an email\n * address, of its local part split on `.`, `_`, `+`, `-` and digits. Empty when there is nothing to take a letter from.\n */\nexport function avatarInitials(name: string | null | undefined): string {\n const value = name?.trim() ?? '';\n const words = (\n value.includes('@') ? (value.split('@')[0] ?? '').split(/[._+\\-\\d]+/) : value.split(/\\s+/)\n ).filter(Boolean);\n const first = (w: string | undefined) => (w ? (Array.from(w)[0] ?? '') : '');\n const letters = words.length > 1 ? first(words[0]) + first(words[words.length - 1]) : first(words[0]);\n return letters.toUpperCase();\n}\n\ninterface AvatarLookProps {\n /** The person's name, or their email address when there is no name. The initials come from it. (On AvatarButton it is not the form `name` attribute.) */\n name?: string | null | undefined;\n /** Overrides the initials taken from `name`. Shown as given, up to two characters. */\n initials?: string | undefined;\n /** A picture. The initials show until it loads, and stay if it fails. */\n src?: string | undefined;\n /** `xs` 24px (beside text), `sm` 32, `md` 40 (default) and `lg` 48 follow the control heights, compact density included. */\n size?: AvatarSize | undefined;\n}\n\nexport interface AvatarProps extends AvatarLookProps, Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /** Gives the avatar an accessible name (`role=\"img\"`), e.g. the person's name where it is not written next to it. Without it the avatar is decorative and hidden from assistive tech. */\n label?: string | undefined;\n}\n\nfunction Letters({ name, initials }: Pick<AvatarLookProps, 'name' | 'initials'>) {\n const letters = initials?.trim() ? Array.from(initials.trim()).slice(0, 2).join('') : avatarInitials(name);\n return letters ? (\n <span className=\"sc-avatar__initials\">{letters}</span>\n ) : (\n <UserIcon className=\"sc-avatar__icon\" size=\"em\" />\n );\n}\n\n/**\n * A person: their picture, else their initials on a brand tint inside a 1px ring (the ring is what keeps the circle\n * visible on every surface). Decorative unless `label` is given. For a clickable avatar use `AvatarButton`.\n */\nexport function Avatar({ name, initials, src, size = 'md', label, className, ...rest }: AvatarProps) {\n return (\n <BaseAvatar.Root\n className={cx('sc-avatar', className)}\n data-size={size}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n {...rest}\n >\n {src ? <BaseAvatar.Image className=\"sc-avatar__image\" src={src} alt=\"\" /> : null}\n <BaseAvatar.Fallback className=\"sc-avatar__fallback\">\n <Letters name={name} initials={initials} />\n </BaseAvatar.Fallback>\n </BaseAvatar.Root>\n );\n}\n\nexport interface AvatarButtonProps\n extends AvatarLookProps, Omit<useRender.ComponentProps<'button'>, 'children' | 'aria-label' | 'name'> {\n /** Required. The button's accessible name, e.g. `Account: Robin Test`; the avatar inside is decorative. */\n label: string;\n}\n\n/**\n * A round button that is an Avatar, for an account menu or a profile link. The ring thickens on hover and while its\n * popup is open; the focus ring is the system's; on touch the hit area is at least 44px. Compose it as a trigger:\n * `<Menu.Trigger render={<AvatarButton label=\"Account: Robin Test\" name=\"Robin Test\" size=\"sm\" />} />`, or make it a\n * link with `render={<a href=\"/profile\" />}`.\n */\nexport function AvatarButton({\n label,\n name,\n initials,\n src,\n size = 'md',\n type,\n className,\n render,\n ref,\n ...rest\n}: AvatarButtonProps) {\n return useRender({\n render,\n ref,\n defaultTagName: 'button',\n props: {\n // `type` only means something on a real button; a rendered link keeps its own attributes.\n type: render ? type : (type ?? 'button'),\n className: cx('sc-avatar-button', className),\n 'data-size': size,\n 'aria-label': label,\n ...rest,\n children: <Avatar name={name} initials={initials} src={src} size={size} />,\n },\n });\n}\n","export { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from './components/Button/Button';\nexport {\n Badge,\n type BadgeProps,\n type BadgeSize,\n type BadgeTone,\n type BadgeVariant,\n} from './components/Badge/Badge';\nexport {\n Card,\n type CardElement,\n type CardPadding,\n type CardProps,\n type CardVariant,\n} from './components/Card/Card';\nexport {\n Stack,\n type StackAlign,\n type StackElement,\n type StackJustify,\n type StackProps,\n} from './components/Stack/Stack';\nexport {\n Inline,\n type InlineAlign,\n type InlineElement,\n type InlineJustify,\n type InlineProps,\n} from './components/Inline/Inline';\nexport { Kbd, type KbdGroupProps, type KbdProps } from './components/Kbd/Kbd';\nexport {\n Dialog,\n type DialogActionsProps,\n type DialogBodyProps,\n type DialogCloseProps,\n type DialogCloseRequestReason,\n type DialogContentProps,\n type DialogDescriptionProps,\n type DialogRootProps,\n type DialogSize,\n type DialogTitleProps,\n type DialogVariant,\n} from './components/Dialog/Dialog';\nexport { Icon, type IconGlyphProps, type IconProps, type IconSize } from './components/Icon/Icon';\nexport * from './icons/icons.gen';\nexport { iconNames, type IconName } from './icons/icon-names.gen';\nexport { IconButton, type IconButtonDotTone, type IconButtonProps } from './components/IconButton/IconButton';\nexport {\n Tooltip,\n type TooltipAlign,\n type TooltipProps,\n type TooltipSide,\n} from './components/Tooltip/Tooltip';\nexport {\n Menu,\n type MenuAlign,\n type MenuCheckboxItemProps,\n type MenuContentProps,\n type MenuGroupProps,\n type MenuItemProps,\n type MenuItemTone,\n type MenuLinkItemProps,\n type MenuRadioGroupProps,\n type MenuRadioItemProps,\n type MenuRootProps,\n type MenuSeparatorProps,\n type MenuSide,\n type MenuTriggerProps,\n} from './components/Menu/Menu';\nexport type { ControlSize, FieldProps } from './components/Field/FieldShell';\nexport { Input, type InputProps } from './components/Input/Input';\nexport { Textarea, type TextareaProps, type TextareaVariant } from './components/Textarea/Textarea';\nexport { Select, type SelectGroup, type SelectOption, type SelectProps } from './components/Select/Select';\nexport { Checkbox, type CheckboxProps } from './components/Checkbox/Checkbox';\nexport { Switch, type SwitchProps } from './components/Switch/Switch';\nexport {\n Tabs,\n type TabsListProps,\n type TabsListVariant,\n type TabsPanelProps,\n type TabsRootProps,\n type TabsTabProps,\n} from './components/Tabs/Tabs';\nexport {\n Toolbar,\n type ToolbarButtonProps,\n type ToolbarGroupProps,\n type ToolbarLinkProps,\n type ToolbarRootProps,\n type ToolbarSeparatorProps,\n type ToolbarSpacerProps,\n} from './components/Toolbar/Toolbar';\nexport { Banner, type BannerProps, type BannerTone } from './components/Banner/Banner';\nexport { Spinner, type SpinnerProps } from './components/Spinner/Spinner';\nexport {\n Progress,\n type ProgressProps,\n type ProgressSize,\n type ProgressTone,\n type ProgressVariant,\n} from './components/Progress/Progress';\nexport {\n Heading,\n type HeadingElement,\n type HeadingLevel,\n type HeadingProps,\n type HeadingSize,\n type TextTone,\n} from './components/Heading/Heading';\nexport {\n Text,\n type TextAlign,\n type TextElement,\n type TextFamily,\n type TextProps,\n type TextSize,\n type TextWeight,\n} from './components/Text/Text';\nexport {\n Table,\n type TableAlign,\n type TableBodyProps,\n type TableCaptionProps,\n type TableCellProps,\n type TableDensity,\n type TableFootProps,\n type TableHeadProps,\n type TableHeaderProps,\n type TableRootProps,\n type TableRowProps,\n type TableSelectionCellProps,\n type TableSelectionHeaderProps,\n type TableSortDirection,\n} from './components/Table/Table';\nexport { useRowSelection, type RowSelection } from './components/Table/useRowSelection';\nexport type { RowSelectionHeaderState } from './components/Table/rowSelection';\nexport { SelectionBar, type SelectionBarProps } from './components/SelectionBar/SelectionBar';\nexport {\n Toast,\n useToast,\n type ToastApi,\n type ToastOptions,\n type ToastProviderProps,\n type ToastTone,\n} from './components/Toast/Toast';\nexport {\n Stat,\n type StatDeltaTone,\n type StatElement,\n type StatProps,\n type StatSize,\n type StatTrend,\n type StatVariant,\n} from './components/Stat/Stat';\nexport { Chip, type ChipProps, type ChipSize, type ChipTone } from './components/Chip/Chip';\nexport { Disclosure, type DisclosureProps } from './components/Disclosure/Disclosure';\nexport {\n EmptyState,\n type EmptyStateElement,\n type EmptyStateProps,\n type EmptyStateSize,\n} from './components/EmptyState/EmptyState';\nexport { Skeleton, type SkeletonProps, type SkeletonVariant } from './components/Skeleton/Skeleton';\nexport type { SpacingSize } from './types';\nexport const version = '0.1.1';\nexport { FileInput, type FileInputProps } from './components/FileInput/FileInput';\nexport {\n FilePreviewDialog,\n type FilePreviewDialogProps,\n} from './components/FilePreviewDialog/FilePreviewDialog';\nexport {\n PriorityNav,\n type PriorityNavItem,\n type PriorityNavLinkProps,\n type PriorityNavProps,\n} from './components/PriorityNav/PriorityNav';\nexport {\n Popover,\n type PopoverAlign,\n type PopoverCloseProps,\n type PopoverContentProps,\n type PopoverDescriptionProps,\n type PopoverRootProps,\n type PopoverSide,\n type PopoverTitleProps,\n type PopoverTriggerProps,\n} from './components/Popover/Popover';\nexport { BroomIcon, type BroomIconProps } from './components/BroomIcon/BroomIcon';\nexport {\n FullScreenFlow,\n type FlowChapter,\n type FlowCloseRequestReason,\n type FlowDirection,\n type FullScreenFlowBodyProps,\n type FullScreenFlowFooterProps,\n type FullScreenFlowHeaderProps,\n type FullScreenFlowProgressProps,\n type FullScreenFlowRailGroupProps,\n type FullScreenFlowRailItemProps,\n type FullScreenFlowRailProps,\n type FullScreenFlowRootProps,\n type FullScreenFlowStepProps,\n type FullScreenFlowViewportProps,\n} from './components/FullScreenFlow/FullScreenFlow';\nexport {\n Score,\n type ScoreProps,\n type ScoreSize,\n type ScoreTone,\n type ScoreVariant,\n} from './components/Score/Score';\nexport {\n ReasonList,\n type ReasonListItemProps,\n type ReasonListProps,\n type ReasonListSize,\n type ReasonTone,\n} from './components/ReasonList/ReasonList';\nexport {\n WordDiff,\n type WordDiffElement,\n type WordDiffKind,\n type WordDiffPart,\n type WordDiffProps,\n type WordDiffSize,\n} from './components/WordDiff/WordDiff';\nexport { Quote, type QuoteProps } from './components/Quote/Quote';\nexport {\n Avatar,\n AvatarButton,\n avatarInitials,\n type AvatarButtonProps,\n type AvatarProps,\n type AvatarSize,\n} from './components/Avatar/Avatar';\n"],"mappings":";;;AACO,SAAS,MAAM,OAAyD;AAC7E,SAAO,MAAM,OAAO,OAAO,EAAE,KAAK,GAAG;AACvC;;;AC8CI,SAaI,KAbJ;AAvBG,SAAS,OAAO;AAAA,EACrB,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,cAAc,CAAC,UAAyC;AAC5D,QAAI,SAAS;AACX,YAAM,eAAe;AACrB;AAAA,IACF;AACA,cAAU,KAAK;AAAA,EACjB;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,gBAAc,WAAW;AAAA,MACzB,mBAAiB,aAAa;AAAA,MAC9B,kBAAgB,YAAY;AAAA,MAC5B,aAAW,WAAW;AAAA,MACtB,SAAS;AAAA,MACR,GAAG;AAAA,MAEH;AAAA,oBACC,oBAAC,UAAK,WAAU,mBAAkB,eAAY,QAC3C,qBACH,IACE;AAAA,QACJ,oBAAC,UAAK,WAAU,oBAAoB,UAAS;AAAA,QAC5C,UACC,oBAAC,UAAK,WAAU,mBAAkB,eAAY,QAC3C,mBACH,IACE;AAAA,QACH,WACC,oBAAC,UAAK,WAAU,uBAAsB,eAAY,QAC/C,oBACH,IACE;AAAA,QACH,UAAU,oBAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,IAAK;AAAA;AAAA;AAAA,EAC1E;AAEJ;;;ACnDI,SAOS,OAAAA,MAPT,QAAAC,aAAA;AAVG,SAAS,MAAM;AAAA,EACpB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAe;AACb,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,YAAY,SAAS;AAAA,MACnC,aAAW;AAAA,MACX,gBAAc;AAAA,MACd,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,cAAM,gBAAAD,KAAC,UAAK,WAAU,iBAAgB,eAAY,QAAO,IAAK;AAAA,QAC9D;AAAA;AAAA;AAAA,EACH;AAEJ;;;ACxCA,SAAS,iBAAiB;AAqBnB,SAAS,KAAK;AAAA,EACnB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAc;AACZ,SAAO,UAAU;AAAA,IACf;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA,MACL,WAAW,GAAG,WAAW,SAAS;AAAA,MAClC,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,oBAAoB,eAAe;AAAA,MACnC,iBAAiB,YAAY;AAAA,MAC7B,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AACH;;;AC7CA,SAAS,qBAAiE;AAqCnE,SAAS,MAAM;AAAA,EACpB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AAAA,EACL,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACL,GAAe;AACb,SAAO,cAAc,IAAI;AAAA,IACvB,WAAW,GAAG,YAAY,SAAS;AAAA,IACnC,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe,UAAU;AAAA,IACzB,GAAG;AAAA,EACL,CAAC;AACH;;;ACtDA,SAAS,iBAAAE,sBAAiE;AAwBnE,SAAS,OAAO;AAAA,EACrB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL;AAAA,EACA,GAAG;AACL,GAAgB;AACd,SAAOC,eAAc,IAAI;AAAA,IACvB,WAAW,GAAG,aAAa,SAAS;AAAA,IACpC,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe,OAAO,SAAY;AAAA,IAClC,GAAG;AAAA,EACL,CAAC;AACH;;;ACzCA,SAAS,UAAU,gBAA4D;AAOtE,gBAAAC,MAiBD,QAAAC,aAjBC;AADT,SAAS,QAAQ,EAAE,WAAW,GAAG,KAAK,GAAa;AACjD,SAAO,gBAAAD,KAAC,SAAI,WAAW,GAAG,UAAU,SAAS,GAAI,GAAG,MAAM;AAC5D;AAWA,SAAS,SAAS,EAAE,OAAO,YAAY,QAAQ,WAAW,UAAU,GAAG,KAAK,GAAkB;AAC5F,QAAM,OAAO,SAAS,QAAQ,QAAQ;AACtC,SACE,gBAAAA,KAAC,UAAK,MAAK,SAAQ,cAAY,OAAO,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,MACjF,eAAK,IAAI,CAAC,KAAK,MACd,gBAAAC,MAAC,YACE;AAAA,QAAI,KAAK,cAAc,SACtB,gBAAAD,KAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO,eAEvD,IACE;AAAA,IACH;AAAA,OANY,CAOf,CACD,GACH;AAEJ;AAEO,IAAM,MAAM,OAAO,OAAO,SAAS,EAAE,OAAO,SAAS,CAAC;;;ACrC7D,SAAS,UAAU,kBAAkB;AACrC,SAAS,eAAe,aAAa,kBAA8D;;;ACS5F,IAAM,cAAc;AAAA;AAAA,EAEzB,MAAM;AAAA;AAAA,EAEN,MAAM;AAAA;AAAA,EAEN,UAAU;AAAA;AAAA,EAEV,UAAU;AAAA;AAAA,EAEV,QAAQ;AACV;AAKO,SAAS,WAAW,IAAY,IAAY,OAAe,YAAY,MAAkB;AAC9F,MAAI,KAAK,IAAI,EAAE,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,KAAM,QAAO;AACvD,SAAO,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,SAAS;AACjD;AAaO,SAAS,gBACd,SACAE,UAAiB,YAAY,QACrB;AACR,QAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC;AACvC,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,KAAKA,OAAM,KAAK;AAC7D,QAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,SAAO,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK;AAC5C;AAYO,SAAS,mBAAmB,EAAE,QAAQ,QAAQ,SAAS,GAA0B;AACtF,MAAI,UAAU,KAAK,UAAU,EAAG,QAAO;AACvC,MAAI,YAAY,YAAY,SAAU,QAAO;AAC7C,MAAI,YAAY,CAAC,YAAY,SAAU,QAAO;AAC9C,SAAO,UAAU,SAAS,YAAY;AACxC;AAEA,IAAM,SAAS;AAMR,SAAS,iBAAiB,QAAiC;AAChE,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MAAO,QAAO,MAAM;AAAA,EAAC;AAE1B,MAAI,QAAqD;AACzD,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,UAAyB,CAAC;AAC9B,MAAI,gBAAgB;AAEpB,QAAM,aAAa,CAAC,MAAoB;AACtC,QAAI,CAAC,EAAE,aAAc,EAAE,gBAAgB,WAAW,EAAE,WAAW,EAAI,QAAO;AAC1E,QAAI,OAAO,eAAe,EAAE,WAAW,EAAG,QAAO;AACjD,UAAM,SAAS,EAAE,kBAAkB,UAAU,EAAE,SAAS;AACxD,QAAI,CAAC,UAAU,OAAO,SAAS,MAAM,EAAG,QAAO;AAC/C,QAAI,OAAO,QAAQ,MAAM,KAAK,OAAO,QAAQ,kBAAkB,EAAG,QAAO;AACzE,WAAO,EAAE,UAAU,MAAM,sBAAsB,EAAE,OAAO,YAAY;AAAA,EACtE;AAEA,QAAM,SAAS,MAAM;AACnB,WAAO,MAAM,QAAQ;AACrB,UAAM,MAAM,eAAe,WAAW;AAAA,EACxC;AAEA,QAAM,SAAS,CAAC,MAAoB;AAClC,QAAI,SAAS,CAAC,WAAW,CAAC,EAAG;AAC7B,YAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AACtD,cAAU,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC7C;AAEA,QAAM,SAAS,CAAC,MAAoB;AAClC,QAAI,CAAC,SAAS,EAAE,cAAc,MAAM,GAAI;AACxC,UAAM,KAAK,EAAE,UAAU,MAAM;AAC7B,QAAI,CAAC,UAAU;AACb,YAAM,SAAS,WAAW,EAAE,UAAU,MAAM,GAAG,EAAE;AACjD,UAAI,WAAW,UAAW;AAC1B,UAAI,WAAW,UAAU;AACvB,gBAAQ;AACR;AAAA,MACF;AACA,iBAAW;AACX,eAAS,MAAM,sBAAsB,EAAE;AACvC,YAAM,QAAQ,UAAU;AACxB,YAAM,oBAAoB,EAAE,SAAS;AACrC,aAAO,aAAa,GAAG,gBAAgB;AAAA,IACzC;AACA,MAAE,eAAe;AACjB,YAAQ,KAAK,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,QAAQ,CAAC;AAC7C,QAAI,QAAQ,SAAS,GAAI,WAAU,QAAQ,MAAM,GAAG;AACpD,UAAM,MAAM,YAAY,cAAc,KAAK,IAAI,GAAG,EAAE,CAAC;AAAA,EACvD;AAEA,QAAM,MAAM,CAAC,GAAiB,cAAuB;AACnD,QAAI,CAAC,SAAS,EAAE,cAAc,MAAM,GAAI;AACxC,UAAM,SAAS,MAAM;AACrB,UAAM,cAAc;AACpB,YAAQ;AACR,eAAW;AACX,QAAI,CAAC,YAAa;AAElB,WAAO,WAAW,MAAM;AACtB,sBAAgB;AAAA,IAClB,GAAG,CAAC;AACJ,QAAI,WAAW;AACb,sBAAgB;AAChB,aAAO;AACP;AAAA,IACF;AACA,YAAQ,KAAK,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,QAAQ,CAAC;AAC7C,UAAM,UAAU;AAAA,MACd,QAAQ,KAAK,IAAI,GAAG,EAAE,UAAU,MAAM;AAAA,MACtC;AAAA,MACA,UAAU,gBAAgB,OAAO;AAAA,IACnC;AACA,QAAI,mBAAmB,OAAO,GAAG;AAE/B,aAAO,MAAM,QAAQ;AACrB,aAAO,MAAM;AACb,sBAAgB;AAEhB,aAAO,sBAAsB,MAAM;AACjC,YAAI,MAAM,eAAe,MAAM,aAAa,WAAW,EAAG,QAAO;AAAA,MACnE,CAAC;AAAA,IACH,OAAO;AACL,sBAAgB;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,OAAO,CAAC,MAAoB,IAAI,GAAG,KAAK;AAC9C,QAAM,WAAW,CAAC,MAAoB,IAAI,GAAG,IAAI;AAEjD,QAAM,UAAU,CAAC,MAAkB;AACjC,QAAI,CAAC,cAAe;AACpB,oBAAgB;AAChB,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAAA,EACpB;AAEA,QAAM,iBAAiB,eAAe,MAAM;AAC5C,QAAM,iBAAiB,eAAe,MAAM;AAC5C,QAAM,iBAAiB,aAAa,IAAI;AACxC,QAAM,iBAAiB,iBAAiB,QAAQ;AAChD,QAAM,iBAAiB,SAAS,SAAS,IAAI;AAC7C,SAAO,MAAM;AACX,UAAM,oBAAoB,eAAe,MAAM;AAC/C,UAAM,oBAAoB,eAAe,MAAM;AAC/C,UAAM,oBAAoB,aAAa,IAAI;AAC3C,UAAM,oBAAoB,iBAAiB,QAAQ;AACnD,UAAM,oBAAoB,SAAS,SAAS,IAAI;AAChD,WAAO;AAAA,EACT;AACF;;;ACpKI,gBAAAC,YAAA;AAFG,SAAS,KAAK,EAAE,OAAO,MAAM,OAAO,WAAW,UAAU,GAAG,KAAK,GAAc;AACpF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,WAAW,SAAS;AAAA,MAClC,aAAW;AAAA,MACX,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAU;AAAA,MACV,eAAa,QAAQ,SAAY;AAAA,MACjC,MAAM,QAAQ,QAAQ;AAAA,MACtB,cAAY;AAAA,MACX,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACnCI,SACE,OAAAC,MADF,QAAAC,aAAA;AAFG,SAAS,YAAY,OAAuB;AACjD,SACE,gBAAAA,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,QAAO,GAAE,QAAO,OAAM,QAAO,QAAO,KAAI,IAAG,OAAM;AAAA,IACzD,gBAAAA,KAAC,UAAK,GAAE,kEAAiE;AAAA,KAC3E;AAEJ;AAGO,SAAS,cAAc,OAAuB;AACnD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,uBAAsB,GAChC;AAEJ;AAGO,SAAS,cAAc,OAAuB;AACnD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,uBAAsB,GAChC;AAEJ;AAGO,SAAS,eAAe,OAAuB;AACpD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,uBAAsB,GAChC;AAEJ;AAGO,SAAS,YAAY,OAAuB;AACjD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,uBAAsB,GAChC;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,gBAAAA,KAAC,UAAK,GAAE,+BAA8B;AAAA,KACxC;AAEJ;AAGO,SAAS,cAAc,OAAuB;AACnD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,QAAO,OAAM,MAAK,QAAO,OAAM,IAAG,KAAI;AAAA,IACpD,gBAAAA,KAAC,UAAK,GAAE,6DAA4D;AAAA,KACtE;AAEJ;AAGO,SAAS,aAAa,OAAuB;AAClD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,OAAM,GAAE,QAAO,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IACrD,gBAAAA,KAAC,UAAK,GAAE,uCAAsC;AAAA,KAChD;AAEJ;AAGO,SAAS,UAAU,OAAuB;AAC/C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,yBAAwB,GAClC;AAEJ;AAGO,SAAS,gBAAgB,OAAuB;AACrD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,gBAAe,GACzB;AAEJ;AAGO,SAAS,gBAAgB,OAAuB;AACrD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,iBAAgB,GAC1B;AAEJ;AAGO,SAAS,iBAAiB,OAAuB;AACtD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,gBAAe,GACzB;AAEJ;AAGO,SAAS,cAAc,OAAuB;AACnD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,iBAAgB,GAC1B;AAEJ;AAGO,SAAS,gBAAgB,OAAuB;AACrD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,gBAAAA,KAAC,UAAK,GAAE,qBAAoB;AAAA,KAC9B;AAEJ;AAGO,SAAS,YAAY,OAAuB;AACjD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,gBAAAA,KAAC,UAAK,GAAE,sBAAqB;AAAA,KAC/B;AAEJ;AAGO,SAAS,UAAU,OAAuB;AAC/C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,gBAAAA,KAAC,UAAK,GAAE,sBAAqB;AAAA,KAC/B;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,OAAM,IAAG,KAAI;AAAA,IAClD,gBAAAA,KAAC,UAAK,GAAE,iEAAgE;AAAA,KAC1E;AAEJ;AAGO,SAAS,aAAa,OAAuB;AAClD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,qEAAoE;AAAA,IAC5E,gBAAAA,KAAC,UAAK,GAAE,kCAAiC;AAAA,KAC3C;AAEJ;AAGO,SAAS,aAAa,OAAuB;AAClD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,uCAAsC;AAAA,IAC9C,gBAAAA,KAAC,UAAK,GAAE,mDAAkD;AAAA,KAC5D;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,0CAAyC,GACnD;AAEJ;AAGO,SAAS,iBAAiB,OAAuB;AACtD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,qCAAoC;AAAA,IAC5C,gBAAAA,KAAC,UAAK,GAAE,uEAAsE;AAAA,KAChF;AAEJ;AAGO,SAAS,QAAQ,OAAuB;AAC7C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,mFAAkF;AAAA,IAC1F,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,KAC9B;AAEJ;AAGO,SAAS,WAAW,OAAuB;AAChD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,gGAA+F;AAAA,IACvG,gBAAAA,KAAC,UAAK,GAAE,8FAA6F;AAAA,IACrG,gBAAAA,KAAC,UAAK,GAAE,kCAAiC;AAAA,IACzC,gBAAAA,KAAC,UAAK,GAAE,kBAAiB;AAAA,KAC3B;AAEJ;AAGO,SAAS,WAAW,OAAuB;AAChD,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,uCAAsC,GAChD;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,gBAAAA,KAAC,UAAK,GAAE,qCAAoC;AAAA,KAC9C;AAEJ;AAGO,SAAS,UAAU,OAAuB;AAC/C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,gGAA+F;AAAA,IACvG,gBAAAA,KAAC,UAAK,GAAE,4BAA2B;AAAA,KACrC;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,gBAAAA,KAAC,UAAK,GAAE,yBAAwB;AAAA,KAClC;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,uEAAsE;AAAA,IAC9E,gBAAAA,KAAC,UAAK,GAAE,wEAAuE;AAAA,KACjF;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,KAAI,IAAG,KAAI;AAAA,IACjD,gBAAAA,KAAC,UAAK,GAAE,8BAA6B;AAAA,KACvC;AAEJ;AAGO,SAAS,WAAW,OAAuB;AAChD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,+DAA8D;AAAA,IACtE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,OAAM,GAAE,OAAM;AAAA,KAClC;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,oCAAmC,GAC7C;AAEJ;AAGO,SAAS,UAAU,OAAuB;AAC/C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,WAAU,GACpB;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,8DAA6D,GACvE;AAEJ;AAGO,SAAS,mBAAmB,OAAuB;AACxD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,OAAM,IAAG,KAAI,GAAE,QAAO,MAAK,gBAAe,QAAO,QAAO;AAAA,IACnE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,QAAO,MAAK,gBAAe,QAAO,QAAO;AAAA,IACjE,gBAAAA,KAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,QAAO,MAAK,gBAAe,QAAO,QAAO;AAAA,KACtE;AAEJ;AAGO,SAAS,iBAAiB,OAAuB;AACtD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,OAAM,GAAE,QAAO,MAAK,gBAAe,QAAO,QAAO;AAAA,IACnE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,QAAO,MAAK,gBAAe,QAAO,QAAO;AAAA,IACjE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,QAAO,GAAE,QAAO,MAAK,gBAAe,QAAO,QAAO;AAAA,KACtE;AAEJ;AAGO,SAAS,UAAU,OAAuB;AAC/C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,QAAO,GAAE,QAAO,OAAM,KAAI,QAAO,QAAO,IAAG,OAAM;AAAA,IACzD,gBAAAA,KAAC,UAAK,GAAE,QAAO,GAAE,QAAO,OAAM,KAAI,QAAO,QAAO,IAAG,OAAM;AAAA,KAC3D;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,wBAAuB,GACjC;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,kBAAiB,GAC3B;AAEJ;AAGO,SAAS,YAAY,OAAuB;AACjD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,0CAAyC;AAAA,IACjD,gBAAAA,KAAC,UAAK,GAAE,wBAAuB;AAAA,IAC/B,gBAAAA,KAAC,UAAK,GAAE,4CAA2C;AAAA,IACnD,gBAAAA,KAAC,UAAK,GAAE,wBAAuB;AAAA,KACjC;AAEJ;AAGO,SAAS,WAAW,OAAuB;AAChD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM;AAAA,IAC9B,gBAAAA,KAAC,UAAK,GAAE,kBAAiB;AAAA,KAC3B;AAEJ;AAGO,SAAS,aAAa,OAAuB;AAClD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,oQAAmQ;AAAA,IAC3Q,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,QAAO;AAAA,KACjC;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,gFAA+E,GACzF;AAEJ;AAGO,SAAS,QAAQ,OAAuB;AAC7C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,gBAAAA,KAAC,UAAK,GAAE,sIAAqI;AAAA,KAC/I;AAEJ;AAGO,SAAS,eAAe,OAAuB;AACpD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,kDAAiD;AAAA,IACzD,gBAAAA,KAAC,UAAK,GAAE,4GAA2G;AAAA,KACrH;AAEJ;AAGO,SAAS,aAAa,OAAuB;AAClD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,mDAAkD;AAAA,IAC1D,gBAAAA,KAAC,UAAK,GAAE,4GAA2G;AAAA,KACrH;AAEJ;AAGO,SAAS,UAAU,OAAuB;AAC/C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,+EAA8E;AAAA,IACtF,gBAAAA,KAAC,UAAK,GAAE,2DAA0D;AAAA,IAClE,gBAAAA,KAAC,UAAK,GAAE,oBAAmB;AAAA,KAC7B;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,gBAAAA,KAAC,UAAK,GAAE,gBAAe;AAAA,KACzB;AAEJ;AAGO,SAAS,SAAS,OAAuB;AAC9C,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,QAAO,GAAE,QAAO;AAAA,IAClC,gBAAAA,KAAC,UAAK,GAAE,sCAAqC;AAAA,KAC/C;AAEJ;AAGO,SAAS,YAAY,OAAuB;AACjD,SACE,gBAAAC,MAAC,QAAM,GAAG,OACR;AAAA,oBAAAD,KAAC,UAAK,GAAE,2BAA0B;AAAA,IAClC,gBAAAA,KAAC,UAAK,GAAE,uBAAsB;AAAA,KAChC;AAEJ;AAGO,SAAS,MAAM,OAAuB;AAC3C,SACE,gBAAAA,KAAC,QAAM,GAAG,OACR,0BAAAA,KAAC,UAAK,GAAE,sBAAqB,GAC/B;AAEJ;;;AHpaM,gBAAAE,MAwDA,QAAAC,aAxDA;AA1DN,IAAM,cAAmC,oBAAI,IAA8B;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAqBD,IAAM,qBAAqB,cAAc,IAAI;AAG7C,SAAS,KAAK;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,SACE,gBAAAD;AAAA,IAAC,WAAW;AAAA,IAAX;AAAA,MACC;AAAA,MACA;AAAA,MACA,yBAAyB,CAAC;AAAA,MAC1B,cAAc,CAAC,MAAM,YAAY;AAC/B,YACE,CAAC,eACD,CAAC,SACA,QAAQ,WAAW,gBAAgB,QAAQ,WAAW,kBACvD;AACA,kBAAQ,OAAO;AACf;AAAA,QACF;AACA,YAAI,CAAC,QAAQ,kBAAkB,YAAY,IAAI,QAAQ,MAAM,GAAG;AAC9D,kBAAQ,OAAO;AACf,yBAAe,QAAQ,MAAkC;AACzD;AAAA,QACF;AACA,uBAAe,IAAI;AAAA,MACrB;AAAA,MAEA,0BAAAA,KAAC,mBAAmB,UAAnB,EAA4B,OAAO,aAAc,UAAS;AAAA;AAAA,EAC7D;AAEJ;AAGA,IAAM,UAAU,WAAW;AAkC3B,SAAS,QAAQ;AAAA,EACf,OAAO;AAAA,EACP,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,cAAc,WAAW,kBAAkB;AACjD,QAAM,UAAU,YAAY;AAC5B,QAAM,QAAQ,WAAW,kBAAkB;AAC3C,SACE,gBAAAC,MAAC,WAAW,QAAX,EAGC;AAAA,oBAAAD,KAAC,WAAW,UAAX,EAAoB,WAAU,uBAAsB,aAAW,MAAC;AAAA,IACjE,gBAAAC;AAAA,MAAC,WAAW;AAAA,MAAX;AAAA,QACC,WAAW,GAAG,oBAAoB,SAAS;AAAA,QAC3C,aAAW;AAAA,QACX,gBAAc;AAAA,QACd,sBAAoB,QAAQ,KAAK;AAAA,QACjC,cAAW;AAAA,QACV,GAAG;AAAA,QAEH;AAAA,qBAAW,gBAAAD,KAAC,eAAY,OAAc;AAAA,UACtC;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAMA,SAAS,YAAY,EAAE,MAAM,GAAuB;AAClD,QAAM,SAAS;AAAA,IACb,CAAC,SAAoC,OAAO,iBAAiB,IAAI,IAAI;AAAA,IACrE,CAAC;AAAA,EACH;AACA,MAAI,CAAC,MAAO,QAAO,gBAAAA,KAAC,SAAI,WAAU,qBAAoB,eAAY,QAAO;AACzE,SAAO,gBAAAA,KAAC,WAAW,OAAX,EAAiB,KAAK,QAAQ,WAAU,qBAAoB,cAAW,WAAU;AAC3F;AAOA,SAAS,MAAM,EAAE,WAAW,GAAG,KAAK,GAAqB;AACvD,SAAO,gBAAAA,KAAC,WAAW,OAAX,EAAiB,WAAW,GAAG,oBAAoB,SAAS,GAAI,GAAG,MAAM;AACnF;AAOA,SAAS,YAAY,EAAE,WAAW,GAAG,KAAK,GAA2B;AACnE,SAAO,gBAAAA,KAAC,WAAW,aAAX,EAAuB,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,MAAM;AAC/F;AAKA,SAAS,KAAK,EAAE,WAAW,GAAG,KAAK,GAAoB;AACrD,SAAO,gBAAAA,KAAC,SAAI,WAAW,GAAG,mBAAmB,SAAS,GAAI,GAAG,MAAM;AACrE;AAKA,SAAS,QAAQ,EAAE,WAAW,GAAG,KAAK,GAAuB;AAC3D,SAAO,gBAAAA,KAAC,UAAO,SAAQ,OAAM,WAAW,GAAG,sBAAsB,SAAS,GAAI,GAAG,MAAM;AACzF;AAOA,SAAS,MAAM,EAAE,WAAW,UAAU,QAAQ,GAAG,KAAK,GAAqB;AACzE,MAAI,aAAa,UAAa,WAAW,QAAW;AAClD,WACE,gBAAAA,KAAC,WAAW,OAAX,EAAiB,WAAW,GAAG,oBAAoB,SAAS,GAAG,cAAW,SAAS,GAAG,MACrF,0BAAAA,KAAC,SAAM,GACT;AAAA,EAEJ;AACA,SACE,gBAAAA,KAAC,WAAW,OAAX,EAAiB,WAAsB,QAAiB,GAAG,MACzD,UACH;AAEJ;AAGO,IAAM,SAAS,EAAE,MAAM,SAAS,SAAS,OAAO,aAAa,MAAM,SAAS,MAAM;;;AI7MlF,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACrDA,SAAS,aAAAE,kBAAiB;;;ACA1B,SAAS,WAAW,mBAAmB;AAuDjC,gBAAAC,MAGI,QAAAC,aAHJ;AApBN,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiB;AACf,SACE,gBAAAA;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC;AAAA,MACA;AAAA,MACA,cAAc,eAAe,CAAC,SAAS,aAAa,IAAI,IAAI;AAAA,MAC5D;AAAA,MAEA;AAAA,wBAAAD,KAAC,YAAY,SAAZ,EAAoB,QAAQ,UAAU,OAAc,YAAwB;AAAA,QAC7E,gBAAAA,KAAC,YAAY,QAAZ,EACC,0BAAAA,KAAC,YAAY,YAAZ,EAAuB,MAAY,OAAc,YAAY,GAAG,WAAU,0BACzE,0BAAAC,MAAC,YAAY,OAAZ,EAAkB,MAAK,WAAU,WAAW,GAAG,cAAc,SAAS,GACrE;AAAA,0BAAAD,KAAC,YAAY,OAAZ,EAAkB,WAAU,qBAAoB;AAAA,UAChD;AAAA,WACH,GACF,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,IAAM,WAAW,YAAY;AAEtB,IAAM,UAAU,OAAO,OAAO,aAAa,EAAE,SAAS,CAAC;;;ADItD,qBAAAE,WACE,OAAAC,MADF,QAAAC,aAAA;AAzCD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoB;AAClB,QAAM,cAAc,CAAC,UAAyC;AAC5D,QAAI,SAAS;AACX,YAAM,eAAe;AACrB;AAAA,IACF;AACA,cAAU,KAAK;AAAA,EACjB;AACA,QAAM,SAASC,WAAU;AAAA,IACvB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA;AAAA,MAEL,MAAM,SAAS,OAAQ,QAAQ;AAAA,MAC/B,WAAW,GAAG,aAAa,kBAAkB,SAAS;AAAA,MACtD,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc,SAAS;AAAA,MACvB,gBAAgB,WAAW;AAAA,MAC3B,aAAa,WAAW;AAAA,MACxB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,GAAG;AAAA,MACH,UACE,gBAAAD,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,UAAK,WAAU,mBAAkB,eAAY,QAC3C,UACH;AAAA,QACC,UAAU,gBAAAA,KAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,IAAK;AAAA,QACvE,MAAM,gBAAAA,KAAC,UAAK,WAAU,uBAAsB,aAAW,KAAK,eAAY,QAAO,IAAK;AAAA,SACvF;AAAA,IAEJ;AAAA,EACF,CAAC;AACD,MAAI,CAAC,QAAS,QAAO;AACrB,SACE,gBAAAA,KAAC,WAAQ,SAAS,YAAY,OAAO,QAAQ,SAAS,MAAM,aACzD,kBACH;AAEJ;;;AE3FA,SAAS,QAAQ,gBAAgB;AACjC,SAAS,aAA6B;AA0BlC,SAmGA,YAAAG,WAnGA,OAAAC,MAmGA,QAAAC,aAnGA;AAFJ,SAASC,MAAK,EAAE,MAAM,aAAa,cAAc,UAAU,QAAQ,MAAM,SAAS,GAAkB;AAClG,SACE,gBAAAF;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC;AAAA,MACA;AAAA,MACA,cAAc,eAAe,CAAC,SAAS,aAAa,IAAI,IAAI;AAAA,MAC5D;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAUA,SAASG,SAAQ,EAAE,QAAQ,WAAW,UAAU,GAAG,KAAK,GAAqB;AAC3E,SACE,gBAAAH;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,QAAQ,UAAU,gBAAAA,KAAC,UAAO,SAAQ,aAAY,SAAS,gBAAAA,KAAC,mBAAgB,GAAI,WAAsB;AAAA,MAClG,WAAW,SAAS,YAAY;AAAA,MAC/B,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAaA,SAASI,SAAQ;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,SACE,gBAAAJ,KAAC,SAAS,QAAT,EACC,0BAAAA,KAAC,SAAS,YAAT,EAAoB,MAAY,OAAc,YAAwB,WAAU,uBAC/E,0BAAAA,KAAC,SAAS,OAAT,EAAe,WAAW,GAAG,WAAW,SAAS,GAAI,GAAG,MACtD,UACH,GACF,GACF;AAEJ;AAuBA,SAAS,YACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGA,MACuB;AACvB,QAAM,KAAK,MAAM;AACjB,QAAM,iBAAiB,gBAAgB,UAAa,gBAAgB,QAAQ,gBAAgB;AAC5F,QAAM,cAAc,aAAa;AACjC,QAAM,OAAO,IAAI,QAAwC,IAAI,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAC1F,QAAM,OACJ,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,UAAK,WAAU,iBAAgB,eAAY,QACzC,gBACH;AAAA,IACA,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,IAAI,iBAAiB,GAAG,EAAE,WAAW,QACnE,UACH;AAAA,IACC,iBACC,gBAAAA,KAAC,UAAK,WAAU,wBAAuB,IAAI,GAAG,EAAE,gBAC7C,uBACH,IACE;AAAA,IACH,cACC,gBAAAA,KAAC,UAAK,WAAU,qBAAoB,IAAI,iBAAiB,GAAG,EAAE,cAAc,QACzE,oBACH,IACE;AAAA,KACN;AAEF,MAAI,CAAC,eAAgB,QAAO,CAAC,MAAM,IAAI;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,mBAAmB,KAAK,iBAAiB,KAAK,KAAK,GAAG,EAAE,UAAU,eAAe,GAAG,EAAE,WAAW;AAAA,MACjG,oBAAoB,KAAK,KAAK,kBAAkB,GAAG,GAAG,EAAE,cAAc;AAAA,IACxE;AAAA,EACF;AACF;AAOA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,GAAG;AACL,GAAkB;AAChB,QAAM,CAAC,MAAM,IAAI,IAAI;AAAA,IACnB,EAAE,MAAM,aAAa,UAAU,SAAS;AAAA,IACxC,EAAE,mBAAmB,YAAY,oBAAoB,YAAY;AAAA,EACnE;AACA,SACE,gBAAAA,KAAC,SAAS,MAAT,EAAc,WAAW,GAAG,iBAAiB,SAAS,GAAG,aAAW,MAAO,GAAG,MAAO,GAAG,MACtF,gBACH;AAEJ;AAUA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,GAAG;AACL,GAAsB;AACpB,QAAM,CAAC,MAAM,IAAI,IAAI;AAAA,IACnB,EAAE,MAAM,aAAa,UAAU,SAAS;AAAA,IACxC,EAAE,mBAAmB,YAAY,oBAAoB,YAAY;AAAA,EACnE;AACA,SACE,gBAAAA;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACxC,aAAW;AAAA,MACX;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAcA,SAAS,aAAa,EAAE,UAAU,iBAAiB,WAAW,UAAU,GAAG,KAAK,GAA0B;AACxG,SACE,gBAAAC;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACxC,iBAAiB,kBAAkB,CAAC,YAAY,gBAAgB,OAAO,IAAI;AAAA,MAC1E,GAAG;AAAA,MAEJ;AAAA,wBAAAD,KAAC,SAAS,uBAAT,EAA+B,WAAU,oCACxC,0BAAAA,KAAC,aAAU,MAAK,MAAK,GACvB;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,QAC1C,aAAa,SAAY,gBAAAA,KAAC,UAAK,WAAU,qBAAqB,oBAAS,IAAU;AAAA;AAAA;AAAA,EACpF;AAEJ;AAkBA,SAAS,WAA0C;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,SACE,gBAAAC;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACzC,eAAe,gBAAgB,CAAC,UAAiB,cAAc,KAAK,IAAI;AAAA,MACvE,GAAG;AAAA,MAEH;AAAA,kBAAU,SACT,gBAAAD,KAAC,SAAS,YAAT,EAAoB,WAAU,wBAAwB,iBAAM,IAC3D;AAAA,QACH;AAAA;AAAA;AAAA,EACH;AAEJ;AAUA,SAAS,UAAU,EAAE,UAAU,WAAW,UAAU,GAAG,KAAK,GAAuB;AACjF,SACE,gBAAAC,MAAC,SAAS,WAAT,EAAmB,WAAW,GAAG,iBAAiB,SAAS,GAAI,GAAG,MACjE;AAAA,oBAAAD,KAAC,SAAS,oBAAT,EAA4B,WAAU,oCACrC,0BAAAA,KAAC,UAAK,WAAU,sBAAqB,GACvC;AAAA,IACA,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,IAC1C,aAAa,SAAY,gBAAAA,KAAC,UAAK,WAAU,qBAAqB,oBAAS,IAAU;AAAA,KACpF;AAEJ;AASA,SAAS,MAAM,EAAE,OAAO,WAAW,UAAU,GAAG,KAAK,GAAmB;AACtE,SACE,gBAAAC,MAAC,SAAS,OAAT,EAAe,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,MAC7D;AAAA,cAAU,SACT,gBAAAD,KAAC,SAAS,YAAT,EAAoB,WAAU,wBAAwB,iBAAM,IAC3D;AAAA,IACH;AAAA,KACH;AAEJ;AAOA,SAAS,UAAU,EAAE,WAAW,GAAG,KAAK,GAAuB;AAC7D,SAAO,gBAAAA,KAAC,SAAS,WAAT,EAAmB,WAAW,GAAG,sBAAsB,SAAS,GAAI,GAAG,MAAM;AACvF;AAGO,IAAM,OAAO;AAAA,EAClB,MAAAE;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACvVA,SAAS,SAAAC,cAAa;;;ACAtB,SAAS,aAAa;AAuDhB,SAGI,OAAAC,OAHJ,QAAAC,aAAA;AArBC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAAoB;AAClB,SACE,gBAAAA;AAAA,IAAC,MAAM;AAAA,IAAN;AAAA,MACC,WAAW,GAAG,YAAY,SAAS;AAAA,MACnC;AAAA,MACA;AAAA,MACA,SAAS,WAAW,SAAS;AAAA,MAC7B,aAAW;AAAA,MAEX;AAAA,wBAAAA,MAAC,MAAM,OAAN,EAAY,WAAW,GAAG,mBAAmB,aAAa,oBAAoB,GAC5E;AAAA;AAAA,UACA,WACC,gBAAAD,MAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,eAExD,IACE;AAAA,WACN;AAAA,QACC;AAAA,QACA,eAAe,OACd,gBAAAA,MAAC,MAAM,aAAN,EAAkB,WAAU,yBAAyB,uBAAY,IAChE;AAAA,QACH,SAAS,OACR,gBAAAA,MAAC,MAAM,OAAN,EAAY,WAAU,mBAAkB,OAAK,MAC3C,iBACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;ADvBM,SAMI,OAAAE,OANJ,QAAAC,cAAA;AA7BC,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAe;AACb,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,mBAAiB,YAAY,KAAK;AAAA,UAClC,iBAAe,UAAU,KAAK;AAAA,UAE7B;AAAA,wBACC,gBAAAD,MAAC,UAAK,WAAU,kBAAiB,aAAU,SAAQ,eAAY,QAC5D,qBACH,IACE;AAAA,YACJ,gBAAAA;AAAA,cAACE,OAAM;AAAA,cAAN;AAAA,gBACC,WAAU;AAAA,gBACV;AAAA,gBACA,eAAe,gBAAgB,CAAC,UAAU,cAAc,KAAK,IAAI;AAAA,gBAChE,GAAG;AAAA;AAAA,YACN;AAAA,YACC,UACC,gBAAAF,MAAC,UAAK,WAAU,kBAAiB,aAAU,OAAM,eAAY,QAC1D,mBACH,IACE;AAAA;AAAA;AAAA,MACN;AAAA;AAAA,EACF;AAEJ;;;AE3EA,SAAS,SAAAG,cAAa;AA0DZ,gBAAAC,aAAA;AAlCH,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,OAAO,YAAY;AACzB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAA;AAAA,QAACC,OAAM;AAAA,QAAN;AAAA,UACC,QACE,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,YAAY,eAAe,OAAO,QAAQ;AAAA,cAC1C,aAAa,gBAAgB,OAAO,QAAQ;AAAA,cAC5C,gBAAgB,mBAAmB,OAAO,QAAQ;AAAA,cACjD,GAAG;AAAA;AAAA,UACN;AAAA,UAEF,WAAU;AAAA,UACV,eAAa;AAAA,UACb,gBAAc,OAAO,SAAS;AAAA,UAC9B;AAAA,UACA,eAAe,gBAAgB,CAAC,UAAU,cAAc,KAAK,IAAI;AAAA;AAAA,MACnE;AAAA;AAAA,EACF;AAEJ;;;AC1EA,SAAS,UAAU,kBAAkB;AACrC,SAAS,gBAAoD;AA+CzD,SAEI,OAAAE,OAFJ,QAAAC,cAAA;AANJ,SAAS,QAA0B,OAAkE;AACnG,SAAO,aAAa;AACtB;AAEA,SAAS,OAAyB,EAAE,OAAO,GAAgC;AACzE,SACE,gBAAAA,OAAC,WAAW,MAAX,EAAgB,OAAO,OAAO,OAAO,UAAU,OAAO,UAAU,WAAU,mBACzE;AAAA,oBAAAD,MAAC,WAAW,eAAX,EAAyB,WAAU,wBAClC,0BAAAA,MAAC,aAAU,MAAK,MAAK,GACvB;AAAA,IACA,gBAAAA,MAAC,WAAW,UAAX,EAAoB,WAAU,wBAAwB,iBAAO,OAAM;AAAA,KACtE;AAEJ;AAMO,SAAS,OAAsC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAuB;AACrB,QAAM,QAAQ,QAAQ,QAAQ,CAAC,UAAW,QAAQ,KAAK,IAAI,MAAM,UAAU,CAAC,KAAK,CAAE;AACnF,QAAM,CAAC,UAAU,WAAW,IAAI,SAAuB,gBAAgB,IAAI;AAC3E,QAAM,aAAa,UAAU;AAC7B,QAAM,UAAU,aAAa,QAAQ;AACrC,QAAM,WAAW,CAAC,SAAuB;AACvC,QAAI,CAAC,WAAY,aAAY,IAAI;AACjC,oBAAgB,IAAI;AAAA,EACtB;AACA,QAAM,WAAW,aAAa,WAAW,QAAQ,CAAC,YAAY,CAAC;AAC/D,QAAM,mBAAmB,CAAC,UAA4C;AACpE,QAAI,aAAa,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACrE,YAAM,eAAe;AACrB,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAC;AAAA,QAAC,WAAW;AAAA,QAAX;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,eAAe,CAAC,SAAS,SAAS,IAAI;AAAA,UACtC;AAAA,UACA;AAAA,UACA;AAAA,UAEA;AAAA,4BAAAA,OAAC,UAAK,WAAU,mBAAkB,mBAAiB,aAAa,QAC9D;AAAA,8BAAAA;AAAA,gBAAC,WAAW;AAAA,gBAAX;AAAA,kBACC;AAAA,kBACA,WAAU;AAAA,kBACV,aAAW;AAAA,kBACX,mBAAiB,aAAa;AAAA,kBAC9B,kBAAgB,YAAY;AAAA,kBAC5B,WAAW;AAAA,kBAEX;AAAA,oCAAAD,MAAC,WAAW,OAAX,EAAiB,WAAU,oBAAmB,aAA0B;AAAA,oBACzE,gBAAAA,MAAC,WAAW,MAAX,EAAgB,WAAU,mBACzB,0BAAAA,MAAC,mBAAgB,GACnB;AAAA;AAAA;AAAA,cACF;AAAA,cACC,WACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY;AAAA,kBACZ,SAAS,MAAM,SAAS,IAAI;AAAA,kBAE5B,0BAAAA,MAAC,SAAM,MAAK,MAAK;AAAA;AAAA,cACnB,IACE;AAAA,eACN;AAAA,YACA,gBAAAA,MAAC,WAAW,QAAX,EACC,0BAAAA;AAAA,cAAC,WAAW;AAAA,cAAX;AAAA,gBACC,WAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,sBAAsB;AAAA,gBAEtB,0BAAAA,MAAC,WAAW,OAAX,EAAiB,WAAU,oBAC1B,0BAAAA,MAAC,WAAW,MAAX,EACE,kBAAQ;AAAA,kBAAI,CAAC,OAAO,MACnB,QAAQ,KAAK,IACX,gBAAAC,OAAC,WAAW,OAAX,EAAyB,WAAU,oBAClC;AAAA,oCAAAD,MAAC,WAAW,YAAX,EAAsB,WAAU,0BAC9B,gBAAM,OACT;AAAA,oBACC,MAAM,QAAQ,IAAI,CAAC,WAClB,gBAAAA,MAAC,UAA0B,UAAd,OAAO,KAAuB,CAC5C;AAAA,uBANoB,CAOvB,IAEA,gBAAAA,MAAC,UAAyB,QAAQ,SAArB,MAAM,KAAsB;AAAA,gBAE7C,GACF,GACF;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AC7KA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAAE,cAA6B;AAqC5B,SACE,OAAAC,OADF,QAAAC,cAAA;AAnBH,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,gBAAgBC,OAAM;AAC5B,SACE,gBAAAD,OAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GAAG,iBAAe,YAAY,QACrE;AAAA,oBAAAA,OAAC,WAAM,WAAU,sBACf;AAAA,sBAAAD;AAAA,QAAC,aAAa;AAAA,QAAb;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA,oBAAkB,eAAe,OAAO,gBAAgB;AAAA,UACxD,iBAAiB,kBAAkB,CAAC,YAAY,gBAAgB,OAAO,IAAI;AAAA,UAC1E,GAAG;AAAA,UAEJ,0BAAAC,OAAC,aAAa,WAAb,EAAuB,WAAU,0BAChC;AAAA,4BAAAD,MAAC,aAAU,MAAK,MAAK,WAAU,sBAAqB;AAAA,YACpD,gBAAAA,MAAC,aAAU,MAAK,MAAK,WAAU,qBAAoB;AAAA,aACrD;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA,MAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,OAC5C;AAAA,IACC,eAAe,OACd,gBAAAA,MAAC,UAAK,WAAU,0BAAyB,IAAI,eAC1C,uBACH,IACE;AAAA,KACN;AAEJ;;;ACpDA,SAAS,UAAU,kBAAkB;AACrC,SAAS,SAAAG,cAA6B;AAmChC,SAQI,OAAAC,OARJ,QAAAC,cAAA;AAhBC,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,gBAAgBC,OAAM;AAC5B,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,iBAAe,YAAY;AAAA,MAC3B,uBAAqB;AAAA,MAErB;AAAA,wBAAAA,OAAC,WAAM,WAAU,sBACf;AAAA,0BAAAD;AAAA,YAAC,WAAW;AAAA,YAAX;AAAA,cACC,WAAU;AAAA,cACV;AAAA,cACA,oBAAkB,eAAe,OAAO,gBAAgB;AAAA,cACxD,iBAAiB,kBAAkB,CAAC,YAAY,gBAAgB,OAAO,IAAI;AAAA,cAC1E,GAAG;AAAA,cAEJ,0BAAAA,MAAC,WAAW,OAAX,EAAiB,WAAU,oBAAmB;AAAA;AAAA,UACjD;AAAA,UACA,gBAAAA,MAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,WAC5C;AAAA,QACC,eAAe,OACd,gBAAAA,MAAC,UAAK,WAAU,0BAAyB,IAAI,eAC1C,uBACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;ACvDA,SAAS,QAAQ,gBAAgB;AAoB7B,SAuDI,YAAAG,WAvDJ,OAAAC,OAuBA,QAAAC,cAvBA;AAFJ,SAASC,MAAK,EAAE,WAAW,eAAe,GAAG,KAAK,GAAkB;AAClE,SACE,gBAAAF;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,WAAW,GAAG,WAAW,SAAS;AAAA,MAClC,eAAe,gBAAgB,CAAC,UAAU,cAAc,OAAO,KAAK,CAAC,IAAI;AAAA,MACxE,GAAG;AAAA;AAAA,EACN;AAEJ;AAeA,SAAS,KAAK,EAAE,OAAO,OAAO,UAAU,QAAQ,WAAW,UAAU,GAAG,KAAK,GAAkB;AAC7F,SACE,gBAAAC;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACxC,aAAW,QAAQ;AAAA,MACnB,gBAAc;AAAA,MACb,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAD,MAAC,SAAS,WAAT,EAAmB,WAAU,sBAAqB;AAAA;AAAA;AAAA,EACrD;AAEJ;AAYA,SAAS,IAAI,EAAE,MAAM,OAAO,WAAW,UAAU,GAAG,KAAK,GAAiB;AACxE,SACE,gBAAAC,OAAC,SAAS,KAAT,EAAa,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,MACzD;AAAA,WACC,gBAAAD,MAAC,UAAK,WAAU,iBAAgB,eAAY,QACzC,gBACH,IACE;AAAA,IACJ,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,IAC1C,SAAS,OACR,gBAAAC,OAAAF,WAAA,EACG;AAAA;AAAA,MACD,gBAAAC,MAAC,UAAK,WAAU,kBAAkB,iBAAM;AAAA,OAC1C,IACE;AAAA,KACN;AAEJ;AAQA,SAAS,MAAM,EAAE,WAAW,GAAG,KAAK,GAAmB;AACrD,SAAO,gBAAAA,MAAC,SAAS,OAAT,EAAe,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,MAAM;AAC/E;AAGO,IAAM,OAAO,EAAE,MAAAE,OAAM,MAAM,KAAK,MAAM;;;AC/F7C,SAAS,WAAW,mBAAmB;AAoBnC,gBAAAC,aAAA;AAFJ,SAASC,MAAK,EAAE,OAAO,MAAM,MAAM,MAAM,WAAW,GAAG,KAAK,GAAqB;AAC/E,SACE,gBAAAD;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC,WAAW,GAAG,cAAc,SAAS;AAAA,MACrC,aAAW,QAAQ;AAAA,MACnB,YAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACN;AAEJ;AAWA,SAASE,OAAM,EAAE,MAAM,OAAO,WAAW,GAAG,KAAK,GAAsB;AACrE,SAAO,gBAAAF,MAAC,YAAY,OAAZ,EAAkB,WAAW,GAAG,qBAAqB,SAAS,GAAG,YAAU,KAAM,GAAG,MAAM;AACpG;AAOA,SAASG,WAAU,EAAE,WAAW,GAAG,KAAK,GAA0B;AAChE,SAAO,gBAAAH,MAAC,YAAY,WAAZ,EAAsB,WAAW,GAAG,yBAAyB,SAAS,GAAI,GAAG,MAAM;AAC7F;AAWA,IAAMI,UAAS,YAAY;AAW3B,IAAM,OAAO,YAAY;AAOzB,SAAS,OAAO,EAAE,UAAU,GAAuB;AACjD,SAAO,gBAAAJ,MAAC,SAAI,WAAW,GAAG,sBAAsB,SAAS,GAAG,eAAY,QAAO;AACjF;AAGO,IAAM,UAAU,EAAE,MAAAC,OAAM,OAAAC,QAAO,WAAAC,YAAW,QAAAC,SAAQ,MAAM,OAAO;;;ACnFtE,SAAS,YAAAC,iBAA4D;AAyB7D,gBAAAC,OA0BJ,QAAAC,cA1BI;AADR,IAAM,YAA2C;AAAA,EAC/C,MAAM,gBAAAD,MAAC,YAAS;AAAA,EAChB,SAAS,gBAAAA,MAAC,mBAAgB;AAAA,EAC1B,SAAS,gBAAAA,MAAC,eAAY;AAAA,EACtB,QAAQ,gBAAAA,MAAC,eAAY;AAAA,EACrB,SAAS;AACX;AAGO,SAAS,OAAO;AAAA,EACrB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,CAAC,WAAW,YAAY,IAAIE,UAAS,KAAK;AAChD,QAAM,UAAU,QAAQ,CAAC;AACzB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,SAAS,QAAQ,OAAQ,QAAQ,UAAU,IAAI;AAC7D,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,SAAS,SAAS,aAAa,SAAS,WAAW,UAAU;AAAA,MACnE,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,gBACC,gBAAAD,MAAC,UAAK,WAAU,mBAAkB,eAAY,QAC3C,iBACH,IACE;AAAA,QACJ,gBAAAA,MAAC,SAAI,WAAU,mBAAmB,UAAS;AAAA,QAC1C,SAAS,gBAAAA,MAAC,SAAI,WAAU,qBAAqB,kBAAO,IAAS;AAAA,QAC7D,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,2BAAa,IAAI;AACjB,0BAAY;AAAA,YACd;AAAA,YAEA,0BAAAA,MAAC,SAAM;AAAA;AAAA,QACT,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;ACjDM,SAQE,OAAAG,OARF,QAAAC,cAAA;AAhBC,SAAS,QAAQ;AAAA,EACtB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAAiB;AACf,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,cAAc,SAAS;AAAA,MACrC,aAAW;AAAA,MACX,MAAM,aAAa,SAAY;AAAA,MAC/B,cAAY,aAAa,SAAY;AAAA,MACrC,eAAa,cAAc;AAAA,MAC1B,GAAG;AAAA,MAEJ,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAY;AAAA,UACZ,WAAU;AAAA,UAEV;AAAA,4BAAAD,MAAC,YAAO,WAAU,qBAAoB,IAAG,KAAI,IAAG,KAAI,GAAE,QAAO;AAAA,YAC7D,gBAAAA,MAAC,YAAO,WAAU,mBAAkB,IAAG,KAAI,IAAG,KAAI,GAAE,QAAO,eAAc,SAAQ;AAAA;AAAA;AAAA,MACnF;AAAA;AAAA,EACF;AAEJ;;;AC3CA,SAAS,YAAY,oBAAoB;AAoDrC,SAW0B,OAAAE,OAX1B,QAAAC,cAAA;AAhBG,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,MAAM;AAAA,EACN,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,UAAU,SAAS;AACzB,QAAM,eAAe,aAAa,QAAS,aAAa,YAAY;AACpE,SACE,gBAAAA;AAAA,IAAC,aAAa;AAAA,IAAb;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,kBAAkB,CAAC,cAAe,OAAO,cAAc,WAAW,YAAa,aAAa;AAAA,MAC5F,WAAW,GAAG,eAAe,SAAS;AAAA,MACtC,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,oBAAY,WAAW,gBAAAD,MAAC,WAAQ,MAAK,MAAK,YAAU,MAAC,WAAU,wBAAuB,IAAK;AAAA,QAC3F,SAAS,OAAO,gBAAAA,MAAC,aAAa,OAAb,EAAmB,WAAU,sBAAsB,iBAAM,IAAwB;AAAA,QAClG,eACC,gBAAAA,MAAC,aAAa,OAAb,EAAmB,WAAU,sBAC3B,WAAC,cAAe,aAAa,OAAO,YAAY,WACnD,IACE;AAAA,QACH,YAAY,QACX,gBAAAA,MAAC,aAAa,OAAb,EAAmB,WAAU,sBAC5B,0BAAAA,MAAC,aAAa,WAAb,EAAuB,WAAU,0BAAyB,GAC7D,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AC7EA,SAAS,iBAAAE,sBAAiD;AAqB1D,IAAM,cAAiD;AAAA,EACrD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAGO,SAAS,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,MAAM,WAAW,OAAO,WAAW,GAAG,KAAK,GAAiB;AACzG,SAAOC,eAAc,MAAM,IAAI,KAAK,IAAI;AAAA,IACtC,WAAW,GAAG,cAAc,SAAS;AAAA,IACrC,aAAa,QAAQ,YAAY,KAAK;AAAA,IACtC,aAAa,SAAS,SAAS,aAAa,UAAU;AAAA,IACtD,iBAAiB,YAAY;AAAA,IAC7B,GAAG;AAAA,EACL,CAAC;AACH;;;ACvCA,SAAS,iBAAAC,sBAAwF;AAyC1F,SAAS,KAAK;AAAA,EACnB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,QAAMC,SAAQ,OAAO,aAAa,WAAW,WAAW;AACxD,SAAOC,eAAc,IAAI;AAAA,IACvB,WAAW,GAAG,WAAW,SAAS;AAAA,IAClC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,iBAAiB,aAAa,OAAO,KAAKD,WAAU,SAAY,UAAU;AAAA,IAC1E,gBAAgB,WAAW;AAAA,IAC3B,eAAe,WAAW,SAAS,SAAS;AAAA,IAC5C,OAAOA,WAAU,SAAa,EAAE,GAAG,OAAO,mBAAmBA,OAAM,IAAsB;AAAA,IACzF,GAAG;AAAA,EACL,CAAC;AACH;;;ACnEA,SAAS,YAAYE,qBAAoB;AACzC;AAAA,EACE,iBAAAC;AAAA,EACA,cAAAC;AAAA,OAMK;AAoHC,gBAAAC,OAiGF,QAAAC,cAjGE;AAnFR,IAAM,mBAAmBC,eAAmC,IAAI;AAChE,IAAM,eAAeA,eAAkC,MAAS;AAEhE,SAAS,aAAa,MAA4B;AAChD,QAAM,YAAYC,YAAW,gBAAgB;AAC7C,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,GAAG,IAAI,oDAAoD;AAC3F,SAAO;AACT;AAGA,SAAS,YAAY,QAA8B;AACjD,MAAI,EAAE,kBAAkB,aAAc,QAAO;AAC7C,MACE,OAAO,qBACP,kBAAkB,uBAClB,kBAAkB;AAElB,WAAO;AACT,SACE,kBAAkB,oBAClB,CAAC,CAAC,YAAY,SAAS,UAAU,UAAU,SAAS,SAAS,QAAQ,SAAS,OAAO,EAAE;AAAA,IACrF,OAAO;AAAA,EACT;AAEJ;AAEA,IAAM,WACJ;AAGF,SAAS,YAAY,OAAyC;AAC5D,QAAM,UAAU,MAAM,kBAAkB,UAAU,MAAM,OAAO,QAAQ,QAAQ,IAAI;AACnF,SAAO,YAAY,QAAQ,MAAM,cAAc,SAAS,OAAO;AACjE;AAGA,SAASC,MAAK;AAAA,EACZ,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,QAAM,gBAAgB,CAAC,UAA2C;AAChE,gBAAY,KAAK;AACjB,QAAI,CAAC,aAAa,MAAM,iBAAkB;AAE1C,QAAI,EAAE,MAAM,kBAAkB,SAAS,CAAC,MAAM,cAAc,SAAS,MAAM,MAAM,EAAG;AACpF,QAAI,YAAY,MAAM,MAAM,EAAG;AAC/B,SAAK,MAAM,WAAW,MAAM,YAAY,CAAC,MAAM,UAAU,MAAM,IAAI,YAAY,MAAM,KAAK;AACxF,YAAM,eAAe;AACrB,gBAAU,UAAU;AAAA,IACtB,WAAW,MAAM,QAAQ,YAAY,UAAU,QAAQ,GAAG;AACxD,YAAM,eAAe;AACrB,gBAAU,MAAM;AAAA,IAClB;AAAA,EACF;AACA,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,iBAAiB,gBAAgB;AAAA,MAC/C,sBAAoB,gBAAgB;AAAA,MACpC,eAAa,YAAY,KAAK;AAAA,MAC9B,OAAO,YAAY,EAAE,GAAG,cAAc,cAAc,UAAU,IAAI;AAAA,MAIlE,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,YAAY,SAAS;AAAA,UACnC,gBAAc;AAAA,UACd,gBAAc,WAAW;AAAA,UACzB,eAAa;AAAA,UACb;AAAA,UACA,WAAW,YAAY,gBAAgB;AAAA,UACtC,GAAG;AAAA,UAEJ,0BAAAA,MAAC,iBAAiB,UAAjB,EAA0B,OAAO,aAAa,MAAO,UAAS;AAAA;AAAA,MACjE;AAAA;AAAA,EACF;AAEJ;AAKA,SAAS,QAAQ,EAAE,WAAW,GAAG,KAAK,GAAsB;AAC1D,SAAO,gBAAAA,MAAC,aAAQ,WAAW,GAAG,qBAAqB,SAAS,GAAI,GAAG,MAAM;AAC3E;AAGA,SAAS,KAAK,EAAE,WAAW,GAAG,KAAK,GAAmB;AACpD,SAAO,gBAAAA,MAAC,WAAM,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,MAAM;AACtE;AAGA,SAASK,MAAK,EAAE,WAAW,GAAG,KAAK,GAAmB;AACpD,SAAO,gBAAAL,MAAC,WAAM,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,MAAM;AACtE;AAGA,SAAS,KAAK,EAAE,WAAW,GAAG,KAAK,GAAmB;AACpD,SAAO,gBAAAA,MAAC,WAAM,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,MAAM;AACtE;AAeA,SAAS,IAAI;AAAA,EACX;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,YAAYG,YAAW,gBAAgB;AAC7C,QAAM,aAAa,cAAc,QAAQ,gBAAgB;AACzD,QAAM,aAAa,aAAa,cAAc,UAAU,WAAW,WAAW;AAC9E,QAAM,MACJ,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACxC,iBAAe,cAAc;AAAA,MAC7B,oBAAkB,eAAe;AAAA,MACjC,iBAAe,aAAa,aAAa,cAAc;AAAA,MACvD,SACE,aACI,CAAC,UAAU;AACT,aAAK,MAAM,YAAY,MAAM,WAAW,MAAM,YAAY,CAAC,YAAY,KAAK,GAAG;AAC7E,gBAAM,eAAe;AACrB,cAAI,MAAM,SAAU,WAAU,YAAY,WAAW;AAAA,cAChD,WAAU,OAAO,WAAW;AACjC;AAAA,QACF;AACA,kBAAU,KAAK;AAAA,MACjB,IACA;AAAA,MAEN,aACE,aACI,CAAC,UAAU;AAET,YAAI,MAAM,YAAY,CAAC,YAAY,KAAK,EAAG,OAAM,eAAe;AAChE,sBAAc,KAAK;AAAA,MACrB,IACA;AAAA,MAEL,GAAG;AAAA;AAAA,EACN;AAEF,SAAO,gBAAgB,SACrB,MAEA,gBAAAA,MAAC,aAAa,UAAb,EAAsB,OAAO,aAAc,eAAI;AAEpD;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,GAAG;AACL,GAA8E;AAC5E,SACE,gBAAAA,MAACM,cAAa,MAAb,EAAkB,WAAU,eAAc,cAAY,OAAQ,GAAG,MAChE,0BAAAL,OAACK,cAAa,WAAb,EAAuB,WAAU,0BAChC;AAAA,oBAAAN,MAAC,aAAU,MAAK,MAAK,WAAU,sBAAqB;AAAA,IACpD,gBAAAA,MAAC,aAAU,MAAK,MAAK,WAAU,qBAAoB;AAAA,KACrD,GACF;AAEJ;AAEA,IAAM,aAAa,CAAC,UAClB,MAAM,kBAAkB,WAAW,MAAM,OAAO,QAAQ,mBAAmB,MAAM;AAWnF,SAAS,gBAAgB;AAAA,EACvB,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA8B;AAC5B,QAAM,YAAY,aAAa,uBAAuB;AACtD,QAAM,WAAW,UAAU,IAAI,WAAW;AAC1C,QAAM,YAAY,MAAO,UAAU,gBAAgB,QAAQ,UAAU,MAAM,IAAI,UAAU,UAAU;AACnG,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,WAAW,GAAG,oBAAoB,oBAAoB,SAAS;AAAA,MAC/D,iBAAe,YAAY;AAAA,MAC3B,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AACf,YAAI,CAAC,YAAY,CAAC,WAAW,KAAK,EAAG,WAAU;AAAA,MACjD;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,SAAS,UAAU,gBAAgB;AAAA,UACnC,eAAe,UAAU,gBAAgB;AAAA,UACzC;AAAA,UACA,iBAAiB;AAAA;AAAA,MACnB;AAAA;AAAA,EACF;AAEJ;AAYA,SAAS,cAAc,EAAE,OAAO,WAAW,SAAS,gBAAgB,GAAG,KAAK,GAA4B;AACtG,QAAM,YAAY,aAAa,qBAAqB;AACpD,QAAM,KAAKG,YAAW,YAAY;AAClC,MAAI,OAAO,OAAW,OAAM,IAAI,MAAM,8DAA8D;AACpG,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kBAAkB,oBAAoB,SAAS;AAAA,MAC7D,gBAAgB,CAAC,UAAU;AACzB,yBAAiB,KAAK;AAGtB,YAAI,CAAC,MAAM,SAAU;AACrB,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,kBAAU,YAAY,EAAE;AAAA,MAC1B;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AACf,cAAM,gBAAgB;AACtB,YAAI,CAAC,WAAW,KAAK,EAAG,WAAU,OAAO,EAAE;AAAA,MAC7C;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,SAAS,UAAU,WAAW,EAAE;AAAA,UAChC,iBAAiB,MAAM,UAAU,OAAO,EAAE;AAAA;AAAA,MAC5C;AAAA;AAAA,EACF;AAEJ;AAyBA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,SAAS,YAAY,kBAAkB;AAC7C,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,oBAAoB,SAAS;AAAA,MAC3C,cAAY,UAAU,UAAU,QAAQ;AAAA,MACxC,gBAAc,WAAW;AAAA,MACzB,eAAa,UAAU;AAAA,MACvB,iBAAe,YAAY;AAAA,MAC3B,iBAAe,YAAY;AAAA,MAC3B,eAAa,SAAS,gBAAgB;AAAA,MACtC,aAAW,SAAS,gBAAgB;AAAA,MACpC,OAAO,QAAQ,EAAE,GAAG,OAAO,YAAY,MAAM,IAAI;AAAA,MAChD,GAAG;AAAA,MAEH,qBACC,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,SAAS,kBAAkB,cAAc,eAAe,WAAW;AAAA,UAElF;AAAA,4BAAAD,MAAC,UAAK,WAAU,wBAAwB,UAAS;AAAA,YACjD,gBAAAA,MAAC,UAAK,WAAU,uBAAsB,eAAY,QAC/C,4BAAkB,eAAe,gBAAAA,MAAC,iBAAc,MAAK,MAAK,IAAK,gBAAAA,MAAC,eAAY,MAAK,MAAK,GACzF;AAAA;AAAA;AAAA,MACF,IAEA;AAAA;AAAA,EAEJ;AAEJ;AAIA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACzC,cAAY,UAAU,UAAU,QAAQ;AAAA,MACxC,gBAAc,WAAW;AAAA,MACzB,eAAa,UAAU;AAAA,MACvB,iBAAe,YAAY;AAAA,MAC3B,OAAO,QAAQ,EAAE,GAAG,OAAO,YAAY,MAAM,IAAI;AAAA,MAChD,GAAG;AAAA;AAAA,EACN;AAEJ;AAGO,IAAM,QAAQ,EAAE,MAAAI,OAAM,SAAS,MAAM,MAAAC,OAAM,MAAM,KAAK,QAAQ,MAAM,iBAAiB,cAAc;;;AC5Z1G,SAAS,SAAS,kBAAkB;;;ACyB7B,SAAS,iBAAiB,KAA2C;AAC1E,SAAO,EAAE,KAAK,UAAU,oBAAI,IAAI,GAAG,QAAQ,KAAK;AAClD;AAGO,SAAS,QAAQ,GAAsB,GAA+B;AAC3E,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAChE,SAAO;AACT;AAEA,SAAS,OAAO,OAA0B,IAA+B;AACvE,MAAI,CAAC,MAAM,IAAI,SAAS,EAAE,EAAG,QAAO;AACpC,QAAM,WAAW,IAAI,IAAI,MAAM,QAAQ;AACvC,MAAI,SAAS,IAAI,EAAE,EAAG,UAAS,OAAO,EAAE;AAAA,MACnC,UAAS,IAAI,EAAE;AACpB,SAAO,EAAE,GAAG,OAAO,UAAU,QAAQ,GAAG;AAC1C;AAEA,SAAS,YAAY,OAA0B,IAA+B;AAC5E,QAAM,KAAK,MAAM,IAAI,QAAQ,EAAE;AAC/B,MAAI,KAAK,EAAG,QAAO;AACnB,QAAM,OAAO,MAAM,WAAW,OAAO,KAAK,MAAM,IAAI,QAAQ,MAAM,MAAM;AACxE,MAAI,OAAO,KAAK,SAAS,GAAI,QAAO,OAAO,OAAO,EAAE;AACpD,QAAM,KAAK,CAAC,MAAM,SAAS,IAAI,EAAE;AACjC,QAAM,WAAW,IAAI,IAAI,MAAM,QAAQ;AACvC,QAAM,CAAC,OAAO,GAAG,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACvD,WAAS,IAAI,OAAO,KAAK,KAAK,KAAK,GAAG;AACpC,UAAM,QAAQ,MAAM,IAAI,CAAC;AACzB,QAAI,GAAI,UAAS,IAAI,KAAK;AAAA,QACrB,UAAS,OAAO,KAAK;AAAA,EAC5B;AACA,SAAO,EAAE,GAAG,OAAO,UAAU,QAAQ,GAAG;AAC1C;AAEA,SAAS,KAAK,OAA0B,KAA2C;AACjF,MAAI,QAAQ,MAAM,KAAK,GAAG,EAAG,QAAO;AACpC,QAAM,UAAU,IAAI,IAAI,GAAG;AAC3B,MAAI,WAAW,MAAM;AACrB,aAAW,MAAM,MAAM,UAAU;AAC/B,QAAI,QAAQ,IAAI,EAAE,EAAG;AACrB,eAAW,IAAI,IAAI,CAAC,GAAG,MAAM,QAAQ,EAAE,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC;AACpE;AAAA,EACF;AACA,QAAM,SAAS,MAAM,WAAW,QAAQ,QAAQ,IAAI,MAAM,MAAM,IAAI,MAAM,SAAS;AACnF,SAAO,EAAE,KAAK,UAAU,OAAO;AACjC;AAGO,SAAS,oBAAoB,OAA0B,OAA6C;AACzG,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,KAAK,OAAO,MAAM,GAAG;AAAA,IAC9B,KAAK;AACH,aAAO,OAAO,OAAO,MAAM,EAAE;AAAA,IAC/B,KAAK;AACH,aAAO,YAAY,OAAO,MAAM,EAAE;AAAA,IACpC,KAAK;AACH,aAAO,MAAM,SAAS,SAAS,MAAM,IAAI,SAAS,QAAQ,EAAE,GAAG,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG,EAAE;AAAA,IACrG,KAAK;AACH,aAAO,MAAM,SAAS,SAAS,KAAK,MAAM,WAAW,OACjD,QACA,EAAE,GAAG,OAAO,UAAU,oBAAI,IAAI,GAAG,QAAQ,KAAK;AAAA,EACtD;AACF;AAEO,SAAS,YAAY,OAAmD;AAC7E,MAAI,MAAM,SAAS,SAAS,EAAG,QAAO;AACtC,SAAO,MAAM,SAAS,SAAS,MAAM,IAAI,SAAS,QAAQ;AAC5D;AAGO,SAAS,YAAY,OAAoC;AAC9D,SAAO,MAAM,IAAI,OAAO,CAAC,OAAO,MAAM,SAAS,IAAI,EAAE,CAAC;AACxD;;;ADjEO,SAAS,gBAAgB,KAAsC;AACpE,QAAM,CAAC,QAAQ,QAAQ,IAAI,WAAW,qBAAqB,KAAK,gBAAgB;AAGhF,QAAM,QAAQ,QAAQ,OAAO,KAAK,GAAG,IACjC,SACA,oBAAoB,QAAQ,EAAE,MAAM,kBAAkB,IAAI,CAAC;AAC/D,MAAI,UAAU,OAAQ,UAAS,EAAE,MAAM,kBAAkB,IAAI,CAAC;AAE9D,QAAM,UAAU;AAAA,IACd,OAAO;AAAA,MACL,QAAQ,CAAC,OAAe,SAAS,EAAE,MAAM,oBAAoB,GAAG,CAAC;AAAA,MACjE,aAAa,CAAC,OAAe,SAAS,EAAE,MAAM,yBAAyB,GAAG,CAAC;AAAA,MAC3E,WAAW,MAAM,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAAA,MACzD,OAAO,MAAM,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAAA,IACnD;AAAA,IACA,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,KAAK,MAAM;AAAA,MACX,UAAU,MAAM;AAAA,MAChB,aAAa,YAAY,KAAK;AAAA,MAC9B,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM;AAAA,MACd,aAAa,YAAY,KAAK;AAAA,MAC9B,YAAY,CAAC,OAAe,MAAM,SAAS,IAAI,EAAE;AAAA,MACjD,GAAG;AAAA,IACL;AAAA,IACA,CAAC,OAAO,OAAO;AAAA,EACjB;AACF;;;AElEA,SAAS,WAAW,iBAAiB,QAAQ,YAAAE,iBAAoD;AAiF3F,SAIE,YAAAC,WAJF,OAAAC,OAqBM,QAAAC,cArBN;AA1DN,IAAM,oBAAoB,CAAC,UAAkB,GAAG,KAAK;AAErD,IAAM,WAAW;AASV,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB;AACF,GAAsB;AACpB,QAAM,OAAO,QAAQ;AAErB,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,IAAI;AACrD,MAAI,QAAQ,CAAC,aAAc,iBAAgB,IAAI;AAC/C,QAAM,UAAU,OAAO,WAAW,KAAK,IAAI,eAAe,iBAAiB;AAG3E,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,IAAI;AAC7C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,MAAI,QAAQ,CAAC,SAAU,aAAY,IAAI;AACvC,MAAI,QAAQ,eAAe,MAAO,eAAc,KAAK;AACrD,YAAU,MAAM;AACd,QAAI,QAAQ,CAAC,SAAU;AACvB,UAAM,QAAQ,WAAW,MAAM,YAAY,KAAK,GAAG,QAAQ;AAC3D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,SAAS,OAAuB,IAAI;AAC1C,QAAM,WAAW,OAA2B,IAAI;AAChD,kBAAgB,MAAM;AACpB,UAAM,MAAM,OAAO;AACnB,QAAI,QAAQ,CAAC,KAAK,SAAS,IAAI,cAAc,aAAa,EAAG;AAC7D,QAAI,SAAS,SAAS,YAAa,UAAS,QAAQ,MAAM;AAAA,EAC5D,GAAG,CAAC,IAAI,CAAC;AAGT,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AACtC,YAAU,MAAM;AACd,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,YAAY,CAAC,OAAO,OAAO,mBAAmB,YAAa;AAChE,UAAM,WAAW,IAAI,eAAe,CAAC,CAAC,KAAK,MAAM,UAAU,MAAO,cAAc,CAAC,GAAG,aAAa,CAAC,CAAC;AACnG,aAAS,QAAQ,GAAG;AACpB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,gBAAAD,OAAAF,WAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,MAAK,UAAS,WAAU,sBAC3B,mBACH;AAAA,IACC,WACC,gBAAAC,OAAAF,WAAA,EACG;AAAA,aACC,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,6BAA6B,GAAG,MAAM,KAAK;AAAA,UACpD,eAAY;AAAA;AAAA,MACd,IACE;AAAA,MACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAW,GAAG,oBAAoB,SAAS;AAAA,UAC3C,aAAW,QAAQ;AAAA,UACnB,SAAS,CAAC,UAAU;AAClB,kBAAM,OAAO,MAAM;AACnB,gBAAI,gBAAgB,eAAe,CAAC,MAAM,cAAc,SAAS,IAAI,EAAG,UAAS,UAAU;AAAA,UAC7F;AAAA,UAEA,0BAAAC,OAAC,QAAQ,MAAR,EAAa,cAAY,WAAW,WAAU,6BAC7C;AAAA,4BAAAD,MAAC,UAAK,WAAU,2BAA2B,qBAAW,UAAU,GAAE;AAAA,YAClE,gBAAAA,MAAC,QAAQ,WAAR,EAAkB;AAAA,YAClB;AAAA,YACD,gBAAAA,MAAC,QAAQ,QAAR,EAAe;AAAA,YAChB,gBAAAA,MAAC,QAAQ,QAAR,EAAe,QAAQ,gBAAAA,MAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,GAAI,SAAS,SACpE,sBACH;AAAA,aACF;AAAA;AAAA,MACF;AAAA,OACF,IACE;AAAA,KACN;AAEJ;;;ACpHA,SAAS,SAAS,iBAAiB;AACnC,SAAS,iBAAAG,gBAAe,cAAAC,aAAY,WAAAC,gBAA+B;AAoD7D,SAGI,OAAAC,OAHJ,QAAAC,cAAA;AAXN,IAAM,iBAAiBC,eAAc,KAAK;AAO1C,SAASC,UAAS,EAAE,UAAU,UAAU,KAAM,QAAQ,EAAE,GAAuB;AAC7E,MAAIC,YAAW,cAAc,EAAG,QAAO;AACvC,SACE,gBAAAJ,MAAC,eAAe,UAAf,EAAwB,OAAK,MAC5B,0BAAAC,OAAC,UAAU,UAAV,EAAmB,SAAkB,OACnC;AAAA;AAAA,IACD,gBAAAD,MAAC,UAAU,QAAV,EACC,0BAAAA,MAAC,YAAS,GACZ;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,WAAW;AAClB,QAAM,EAAE,QAAQ,MAAM,IAAI,UAAU,gBAA2B;AAC/D,SACE,gBAAAA,MAAC,UAAU,UAAV,EAAmB,WAAU,qBAC3B,iBAAO,IAAI,CAAC,UACX,gBAAAC,OAAC,UAAU,MAAV,EAA8B,OAAc,WAAU,YAAW,aAAW,MAAM,QAAQ,WACzF;AAAA,oBAAAA,OAAC,UAAU,SAAV,EAAkB,WAAU,qBAC3B;AAAA,sBAAAD,MAAC,UAAU,OAAV,EAAgB,WAAU,mBAAkB;AAAA,MAC5C,MAAM,eAAe,OAAO,gBAAAA,MAAC,UAAU,aAAV,EAAsB,WAAU,yBAAwB,IAAK;AAAA,OAC7F;AAAA,IACC,MAAM,cACL,gBAAAA;AAAA,MAAC,UAAU;AAAA,MAAV;AAAA,QACC,WAAU;AAAA,QACV,QAAQ,gBAAAA,MAAC,UAAO,SAAQ,aAAY,MAAK,MAAK;AAAA;AAAA,IAChD,IACE;AAAA,IACH,MAAM,MAAM,eACX,gBAAAA,MAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,WAAU,mBAAkB,SAAS,MAAM,MAAM,MAAM,EAAE,GACxF,gBAAM,KAAK,cACd,IAEA,gBAAAA,MAAC,cAAW,OAAM,WAAU,MAAK,MAAK,WAAU,mBAAkB,SAAS,MAAM,MAAM,MAAM,EAAE,GAC7F,0BAAAA,MAAC,SAAM,GACT;AAAA,OAlBiB,MAAM,EAoB3B,CACD,GACH;AAEJ;AAcO,SAAS,WAAqB;AACnC,QAAM,UAAU,UAAU,gBAA2B;AACrD,SAAOK;AAAA,IACL,OAAO;AAAA,MACL,KAAK,CAAC;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,MACF,MAAoB;AAClB,YAAI,KAAK,SAAS;AAClB,aAAK,QAAQ,IAAI;AAAA,UACf;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,MAAM,EAAE,aAAa;AAAA,UACrB,GAAI,QAAQ,EAAE,IAAI,MAAM,IAAI,CAAC;AAAA,UAC7B,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,UAC3C,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,UAC7B,GAAI,SACA;AAAA,YACE,aAAa;AAAA,cACX,UAAU,OAAO;AAAA,cACjB,SAAS,MAAM;AACb,uBAAO,QAAQ;AACf,oBAAI,CAAC,OAAO,SAAU,SAAQ,MAAM,EAAE;AAAA,cACxC;AAAA,YACF;AAAA,UACF,IACA,CAAC;AAAA,QACP,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AACF;AAMO,IAAM,QAAQ,EAAE,UAAAF,UAAS;;;AC3JhC,SAAS,iBAAAG,sBAAiE;AAkCpE,SA4BF,YAAAC,WA5BE,OAAAC,OA4CM,QAAAC,cA5CN;AADN,IAAM,aAA2C;AAAA,EAC/C,IAAI,gBAAAD,MAAC,eAAY,MAAK,MAAK;AAAA,EAC3B,MAAM,gBAAAA,MAAC,iBAAc,MAAK,MAAK;AAAA,EAC/B,MAAM,gBAAAA,MAAC,kBAAe,MAAK,MAAK;AAClC;AAGO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL;AAAA,EACA,GAAG;AACL,GAAc;AACZ,SAAOE;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW,GAAG,WAAW,SAAS;AAAA,MAClC,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,GAAG;AAAA,IACL;AAAA,IACA,gBAAAD,OAAAF,WAAA,EACE;AAAA,sBAAAC,MAAC,SAAI,WAAU,kBAAkB,iBAAM;AAAA,MACtC,OACC,gBAAAA,MAAC,UAAK,WAAU,iBAAgB,eAAY,QACzC,gBACH,IACE;AAAA,MACJ,gBAAAA,MAAC,SAAI,WAAU,kBAAkB,iBAAM;AAAA,MACtC,SAAS,OACR,gBAAAC,OAAC,SAAI,WAAU,kBAAiB,aAAW,WACxC;AAAA,gBACC,gBAAAD,MAAC,UAAK,WAAU,kBAAiB,eAAY,QAC1C,qBAAW,KAAK,GACnB,IACE;AAAA,QACH,QACC,gBAAAC,OAAC,UAAK,WAAU,sBAAsB;AAAA,oBAAU,SAAS,cAAc;AAAA,UAAM;AAAA,WAAC,IAC5E;AAAA,QACH;AAAA,SACH,IACE;AAAA,MACH,QAAQ,OAAO,gBAAAD,MAAC,SAAI,WAAU,iBAAiB,gBAAK,IAAS;AAAA,OAChE;AAAA,EACF;AACF;;;ACtBI,qBAAAG,WAEI,OAAAC,OAFJ,QAAAC,cAAA;AA9BG,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAc;AACZ,QAAM,cAAc,YAAY;AAChC,QAAM,aAAa,gBAAgB,OAAO,aAAa,WAAW,UAAU,QAAQ,KAAK;AACzF,QAAM,kBAAkB,CAAC,UAAsC;AAC7D,QAAI,YAAY,CAAC,aAAa,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AAClF,YAAM,eAAe;AACrB,eAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb,WAAW,GAAG,WAAW,SAAS;AAAA,IAClC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB,YAAY;AAAA,IAC7B,kBAAkB,WAAW,KAAK;AAAA,IAClC,iBAAiB,YAAY;AAAA,EAC/B;AACA,QAAM,OACJ,gBAAAA,OAAAF,WAAA,EACG;AAAA,WACC,gBAAAC,MAAC,UAAK,WAAU,iBAAgB,eAAY,QACzC,gBACH,IACE;AAAA,IACJ,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,KAC7C;AAEF,QAAM,SAAS,WACb,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,cAAY;AAAA,MACZ;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,cAAM,gBAAgB;AACtB,iBAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,MAEX,0BAAAA,MAAC,SAAM,MAAK,MAAK;AAAA;AAAA,EACnB,IACE;AAEJ,MAAI,aAAa;AACf,WACE,gBAAAC,OAAC,UAAM,GAAG,QAAS,GAAG,MACpB;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,gBAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UAEV;AAAA;AAAA,MACH;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AACA,SACE,gBAAAC,OAAC,UAAM,GAAG,QAAS,GAAG,MACnB;AAAA;AAAA,IACA;AAAA,KACH;AAEJ;;;AChHA;AAAA,EAEE,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIK;AA0ED,SACE,OAAAC,OADF,QAAAC,cAAA;AA5CC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoB;AAClB,QAAM,aAAa,SAAS;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,WAAW;AACpD,QAAM,SAAS,aAAa,OAAO;AACnC,QAAM,QAAQC,QAAkC,IAAI;AAEpD,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAM,OAAM,QAAQ,OAAO;AAAA,EACvF,CAAC;AACD,QAAM,WAAW,CAAC,UAA8C;AAC9D,UAAM,OAAO,MAAM,cAAc;AACjC,QAAI,SAAS,OAAQ;AACrB,QAAI,CAAC,WAAY,aAAY,IAAI;AACjC,mBAAe,IAAI;AAAA,EACrB;AACA,QAAM,WAAW,oBAAoB,eAAe,QAAQ;AAC5D,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,CAAC,SAAS;AACb,cAAM,UAAU;AAChB,YAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,iBAC9B,IAAK,KAAI,UAAU;AAAA,MAC9B;AAAA,MACA,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACxC,MAAM;AAAA,MACN;AAAA,MACA,yBAAuB;AAAA,MACvB,gBAAc,eAAe,KAAK;AAAA,MAClC,OAAO,eAAgB,EAAE,GAAG,OAAO,YAAY,aAAa,IAAsB;AAAA,MACjF,GAAG;AAAA,MAEJ;AAAA,wBAAAA,OAAC,aAAQ,WAAU,0BACjB;AAAA,0BAAAD,MAAC,mBAAgB,WAAU,0BAAyB;AAAA,UACpD,gBAAAA,MAAC,UAAK,WAAU,+BACb,oBAAU,eAAe,OAAO,cAAc,SACjD;AAAA,WACF;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,0BAA0B,UAAS;AAAA;AAAA;AAAA,EACpD;AAEJ;;;AC3FA,SAAS,iBAAAK,sBAAiE;AAuCpE,gBAAAC,aAAA;AAdC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,KAAK;AAAA,EACL;AAAA,EACA,GAAG;AACL,GAAoB;AAClB,SAAOC;AAAA,IACL;AAAA,IACA,EAAE,WAAW,GAAG,kBAAkB,SAAS,GAAG,aAAa,MAAM,GAAG,KAAK;AAAA,IACzE,OACE,gBAAAD,MAAC,UAAK,WAAU,wBAAuB,eAAY,QAChD,gBACH,IACE;AAAA,IACJ,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,iBAAM;AAAA,IAC5C,eAAe,OAAO,gBAAAA,MAAC,OAAE,WAAU,+BAA+B,uBAAY,IAAO;AAAA,IACrF,YAAY,OAAO,gBAAAA,MAAC,SAAI,WAAU,2BAA2B,UAAS,IAAS;AAAA,EACjF;AACF;;;ACLU,gBAAAE,aAAA;AAnBH,SAAS,SAAS;AAAA,EACvB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,OAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,GAAI,UAAU,SAAY,EAAE,YAAY,MAAM,IAAI,CAAC;AAAA,IACnD,GAAI,WAAW,SAAY,EAAE,WAAW,OAAO,IAAI,CAAC;AAAA,EACtD;AACA,MAAI,YAAY,UAAU,QAAQ,GAAG;AACnC,WACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,qBAAqB,SAAS,GAAG,eAAY,QAAO,OAAe,GAAG,MACvF,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MACjC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,gBAAa;AAAA,QACb,cAAY,SAAS;AAAA,QACrB,aAAW,MAAM,QAAQ,KAAK;AAAA,QAC9B,OAAO,UAAU,SAAY,EAAE,YAAY,MAAM,IAAI;AAAA;AAAA,MALhD;AAAA,IAMP,CACD,GACH;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,eAAe,SAAS;AAAA,MACtC,gBAAc;AAAA,MACd,cAAY,SAAS;AAAA,MACrB,eAAY;AAAA,MACZ,OAAO;AAAA,MACN,GAAG;AAAA;AAAA,EACN;AAEJ;;;AChEA,SAAS,aAAAC,YAAW,SAAAC,QAAO,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACAnD,SAAS,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACGrC,SAAS,YAAY,QAA0D;AACpF,MAAI,UAAU,KAAM,QAAO,CAAC;AAC5B,QAAM,OAAO,OAAO,WAAW,WAAW,OAAO,MAAM,GAAG,IAAI;AAC9D,SAAO,KAAK,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,OAAO;AACvE;AAMO,SAAS,cAAc,MAAsC,QAAoC;AACtG,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,OAAO,KAAK,KAAK,YAAY;AACnC,QAAM,OAAO,KAAK,KAAK,YAAY;AACnC,SAAO,OAAO,KAAK,CAAC,UAAU;AAC5B,QAAI,MAAM,WAAW,GAAG,EAAG,QAAO,KAAK,SAAS,KAAK;AACrD,QAAI,MAAM,SAAS,IAAI,EAAG,QAAO,KAAK,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC;AACnE,WAAO,SAAS;AAAA,EAClB,CAAC;AACH;AAEA,IAAM,QAAgC,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAGjE,SAAS,UAAU,MAAuD;AAC/E,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,QAAQ,0CAA0C,KAAK,IAAI;AACjE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,2BAA2B,IAAI,8BAA8B;AACzF,SAAO,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC,EAAG,YAAY,CAAC,CAAE;AACtE;AAGO,SAAS,WAAW,OAAuB;AAChD,QAAM,CAAC,MAAM,IAAI,IACf,SAAS,MAAM,CAAC,MAAM,GAAG,IAAI,SAAS,MAAM,CAAC,MAAM,GAAG,IAAI,SAAS,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;AACpG,QAAM,QAAQ,QAAQ;AACtB,SAAO,GAAG,OAAO,UAAU,KAAK,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI;AAC9E;AAMO,SAAS,eAAe,OAAuB;AACpD,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC;AACpC,QAAM,OAAO,CAAC,OAAe,aAAqB,MAAM,QAAQ,QAAQ,EAAE,QAAQ,SAAS,EAAE;AAC7F,MAAI,IAAI,IAAK,QAAO,GAAG,CAAC;AACxB,MAAI,IAAI,IAAK,QAAO,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC;AAC1C,MAAI,IAAI,IAAK,QAAO,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;AACvC,SAAO,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;AAC5B;AAEA,IAAM,aAAqC;AAAA,EACzC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,2EAA2E;AAAA,EAC3E,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAChB;AAGO,SAAS,eAAe,QAAmC;AAChE,QAAM,QAAQ,OAAO,IAAI,CAAC,UAAU;AAClC,QAAI,MAAM,WAAW,GAAG,EAAG,QAAO,MAAM,MAAM,CAAC,EAAE,YAAY;AAC7D,QAAI,MAAM,SAAS,IAAI,EAAG,QAAO,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AAC1D,WAAO,WAAW,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,EAAG,YAAY;AAAA,EAClE,CAAC;AACD,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACjC,MAAI,OAAO,UAAU,EAAG,QAAO,OAAO,CAAC,KAAK;AAC5C,SAAO,GAAG,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC;AAC9D;AAIO,SAAS,iBACd,QACA,QAOQ;AACR,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,GAAG,OAAO,IAAI,sCAAsC,OAAO,WAAW;AAAA,IAC/E,KAAK;AACH,aAAO,GAAG,OAAO,IAAI,OAAO,WAAW,OAAO,QAAQ,CAAC,CAAC,cAAc,WAAW,OAAO,eAAe,CAAC,CAAC;AAAA,IAC3G,KAAK;AACH,aAAO,OAAO,aAAa,IACvB,qBACA,SAAS,OAAO,QAAQ;AAAA,EAChC;AACF;AAGO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KAAK;AAAA,IACV;AAAA,IACA,CAAC,QAAQ,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,GAAG,EAAE;AAAA,EACtF;AACF;AAKA,IAAM,cAAc,CAAC,SAAiB;AACpC,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,SAAO,MAAM,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,YAAY,IAAI;AACvD;AACA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,OAAO,QAAQ,MAAM,UAAU,CAAC;AACjE,IAAM,aAAa,oBAAI,IAAI,CAAC,cAAc,iBAAiB,iBAAiB,CAAC;AAC7E,IAAM,mBAAmB,oBAAI,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,KAAK,CAAC;AAE5F,IAAM,yBAAyB,oBAAI,IAAI,CAAC,cAAc,cAAc,YAAY,CAAC;AAO1E,SAAS,YAAY,MAA8D;AACxF,QAAM,MAAM,YAAY,KAAK,IAAI;AACjC,QAAM,OAAO,KAAK,KAAK,YAAY;AACnC,MAAI,QAAQ,SAAS,SAAS,kBAAmB,QAAO;AACxD,MAAI,gBAAgB,IAAI,GAAG,KAAK,WAAW,IAAI,IAAI,EAAG,QAAO;AAC7D,MAAI,uBAAuB,IAAI,IAAI,EAAG,QAAO;AAC7C,MAAI,iBAAiB,IAAI,GAAG,KAAK,KAAK,WAAW,QAAQ,EAAG,QAAO;AACnE,SAAO;AACT;AAGO,SAAS,cAAc,MAA8C;AAC1E,QAAM,MAAM,YAAY,KAAK,IAAI;AACjC,MAAI,IAAK,QAAO,IAAI,YAAY;AAChC,SAAO,WAAW,KAAK,KAAK,YAAY,CAAC,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAC9F;;;ACjJA,SAAS,eAAAC,cAAa,4BAA4B;AAG3C,SAAS,cAAc,OAAwB;AACpD,QAAM,YAAYA;AAAA,IAChB,CAAC,aAAyB;AACxB,UAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,WAAY,QAAO,MAAM;AAAA,MAAC;AAC5F,YAAM,OAAO,OAAO,WAAW,KAAK;AACpC,WAAK,mBAAmB,UAAU,QAAQ;AAC1C,aAAO,MAAM,KAAK,sBAAsB,UAAU,QAAQ;AAAA,IAC5D;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,KAAK,EAAE;AAAA,IAC1E,MAAM;AAAA,EACR;AACF;;;AFsBQ,SAEE,YAAAC,WAFF,OAAAC,OAII,QAAAC,cAJJ;AAtBR,IAAM,aAAa;AAEnB,IAAM,SAAS;AAQR,SAAS,kBAAkB,EAAE,MAAM,MAAM,cAAc,WAAW,GAA2B;AAClG,QAAM,OAAO,OAAO,YAAY,IAAI,IAAI;AACxC,QAAM,SAAS,cAAc,MAAM;AACnC,QAAM,WAAW,SAAS,SAAS;AACnC,SACE,gBAAAD,MAAC,OAAO,MAAP,EAAY,MAAY,cACvB,0BAAAC;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,aAAW,QAAQ;AAAA,MACnB;AAAA,MAEA;AAAA,wBAAAD,MAAC,OAAO,OAAP,EAAa;AAAA,QACb,OACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,OAAO,OAAP,EAAc,eAAK,MAAK;AAAA,UACzB,gBAAAC,OAAC,OAAO,aAAP,EACE;AAAA,0BAAc,IAAI;AAAA,YAAE;AAAA,YAAG,eAAe,KAAK,IAAI;AAAA,aAClD;AAAA,UACA,gBAAAD,MAAC,OAAO,MAAP,EACC,0BAAAA,MAAC,eAAY,MAAY,MAAY,MAAY,UAAoB,GACvE;AAAA,WACF,IAEA,gBAAAA,MAAC,OAAO,OAAP,EAAa,qBAAO;AAAA;AAAA;AAAA,EAEzB,GACF;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,WAAWE,QAA0B,IAAI;AAC/C,QAAM,WAAWA,QAAyB,IAAI;AAC9C,QAAM,UAAUA,QAA0B,IAAI;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAIC,UAA+C,IAAI;AAI3E,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,QAAS,SAAS,SAAS,SAAS,QAAU,QAAO;AAC1D,UAAM,MAAM,IAAI,gBAAgB,SAAS,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,kBAAkB,CAAC,IAAI,IAAI;AACrG,QAAI,SAAS,QAAS,UAAS,QAAQ,MAAM;AAC7C,QAAI,SAAS,QAAS,UAAS,QAAQ,MAAM;AAC7C,QAAI,QAAQ,QAAS,SAAQ,QAAQ,OAAO;AAC5C,WAAO,MAAM,IAAI,gBAAgB,GAAG;AAAA,EACtC,GAAG,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC;AAE/B,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO;AACrC,QAAI,YAAY;AAChB,SAAK,KACF,MAAM,GAAG,UAAU,EACnB,KAAK,EACL,KAAK,CAAC,UAAU;AACf,UAAI,CAAC,UAAW,SAAQ,EAAE,MAAM,MAAM,CAAC;AAAA,IACzC,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC;AAErB,MAAI,SAAS,OAAO;AAClB,UAAM;AAAA;AAAA,MAEJ,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,gBAAc,WAAW,YAAY;AAAA,UACrC,aAAU;AAAA,UACV,QAAO;AAAA,UACP,KAAI;AAAA,UACL;AAAA;AAAA,YAEC,gBAAAD,MAAC,oBAAiB;AAAA;AAAA;AAAA,MACpB;AAAA;AAEF,WAAO,WACL,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,sBAAAD,MAAC,OAAE,WAAU,yBAAwB,kEAAoD;AAAA,MACxF;AAAA,OACH,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAC,MAAC,YAAO,KAAK,UAAU,WAAU,0BAAyB,OAAO,cAAc,KAAK,IAAI,IAAI;AAAA,MAC5F,gBAAAA,MAAC,SAAI,WAAU,4BAA4B,gBAAK;AAAA,OAClD;AAAA,EAEJ;AACA,MAAI,SAAS,QAAQ;AACnB,UAAM,QAAQ,MAAM,SAAS,OAAO,KAAK,QAAQ;AACjD,WACE,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UAEL,UAAU;AAAA,UACV,cAAY,eAAe,KAAK,IAAI;AAAA,UACpC,aAAW,SAAS,QAAQ;AAAA,UAE3B;AAAA;AAAA,MACH;AAAA,MACC,KAAK,OAAO,aACX,gBAAAC,OAAC,OAAE,WAAU,yBAAwB;AAAA;AAAA,QAAmB,WAAW,UAAU;AAAA,QAAE;AAAA,SAAC,IAC9E;AAAA,OACN;AAAA,EAEJ;AACA,MAAI,SAAS,SAAS;AACpB,WAAO,gBAAAD,MAAC,SAAI,KAAK,UAAU,WAAU,0BAAyB,KAAK,KAAK,MAAM;AAAA,EAChF;AACA,SAAO,gBAAAC,OAAC,OAAE,WAAU,yBAAwB;AAAA;AAAA,IAAyB,cAAc,IAAI;AAAA,IAAE;AAAA,KAAO;AAClG;;;ADgRM,SAOI,OAAAI,OAPJ,QAAAC,cAAA;AAvXN,IAAM,cACJ;AAEF,IAAM,YAAY,CAAC,GAAoB,MACrC,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;AAStD,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AACZ,GAAmB;AACjB,QAAM,KAAKC,OAAM;AACjB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,gBAAgB,GAAG,EAAE;AAC3B,QAAM,aAAa,GAAG,EAAE;AAExB,QAAM,aAAa,UAAU;AAC7B,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC,UAA0B,gBAAgB,CAAC,CAAC;AAC9F,QAAM,UAAU,aAAa,QAAQ;AAErC,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAmB,CAAC,CAAC;AACzD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAiB;AAE/C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAsB,IAAI;AAChE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,oBAAoBC,QAAiC,IAAI;AAE/D,QAAM,CAAC,aAAa,cAAc,IAAID,UAAS,CAAC;AAEhD,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,UAAUA,QAAwB,IAAI;AAC5C,QAAM,YAAYA,QAA8B,IAAI;AACpD,QAAM,WAAWA,QAAmB,MAAM;AAAA,EAAC,CAAC;AAE5C,QAAM,aAAaA,QAAwB,OAAO;AAElD,QAAM,YAAYA,QAA+B,IAAI;AAErD,QAAM,aAAa,YAAY,MAAM;AACrC,QAAM,aAAa,WAAW,KAAK,GAAG;AACtC,QAAM,WAAW,UAAU,WAAW;AACtC,QAAM,WAAW,CAAC,GAAG,YAAY,GAAI,SAAS,OAAO,CAAC,KAAK,IAAI,CAAC,CAAE;AAClE,QAAM,YAAY,WAAW,SAAS,SAAS;AAC/C,QAAM,WACJ,cACC,WACG,uBACA,QAAQ,SAAS,IACf,wCACA;AAGR,QAAM,OAAO;AAAA,IACX;AAAA,IACA,aAAa,eAAe,eAAe,UAAU;AAAA,IACrD;AAAA,IACA,UAAU,WAAW,WAAW;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,CAAC,eAAe,OAAO,gBAAgB,MAAM,SAAS,SAAS,IAAI,aAAa,IAAI;AAAA,IACjG;AAAA,IACA;AAAA,IACA,SAAS,WAAW,CAAC;AAAA,IACrB,aAAa,CAAC,MAAY,YAA+B;AACvD,wBAAkB,UAAU;AAC5B,qBAAe,IAAI;AACnB,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AACA,QAAM,UAAUA,QAAO,IAAI;AAC3B,EAAAC,WAAU,MAAM;AACd,YAAQ,UAAU;AAAA,EACpB,CAAC;AAGD,EAAAA,WAAU,MAAM;AACd,QAAI,YAAY;AAChB,QAAI,OAAwB;AAC5B,QAAI,WAAoC;AACxC,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,SAAS,CAAC,QAA6B,SAAgB;AAC3D,YAAM,IAAI,QAAQ;AAClB,YAAM,UAAU,iBAAiB,QAAQ;AAAA,QACvC,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ,aAAa,EAAE;AAAA,QACf,aAAa,EAAE;AAAA,QACf,UAAU,EAAE;AAAA,MACd,CAAC;AACD,oBAAc,CAAC,SAAU,KAAK,SAAS,OAAO,IAAI,OAAO,CAAC,GAAG,MAAM,OAAO,CAAE;AAE5E,UAAI,QAAQ,UAAU,SAAS;AAC7B,kBAAU,UAAU,UAAU,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI;AAC9D,uBAAe,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,cAAc,CAAC,SAAU,KAAK,SAAS,CAAC,IAAI,IAAK;AAC5E,QAAI,eAAe;AACnB,UAAM,cAAc,oBAAI,IAAY;AACpC,UAAM,aAAa,CAAC,UAAiB;AACnC,UAAK,MAAM,QAA2B,UAAU,+BAA+B,EAAG,gBAAe;AAAA,IACnG;AACA,UAAM,iBAAiB,CAAC,UAAiB;AACvC,YAAM,SAAU,MAAM,QAA2B;AAAA,QAC/C;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,QAAQ,SAAS,MAAM,QAAQ,OAAO,QAAQ,MAAM,GAAG,OAAO;AACnF,UAAI,CAAC,UAAU,EAAE,gBAAgB,MAAO;AAExC,YAAM,gBAAgB;AACtB,cAAQ,QAAQ,YAAY,MAAM,MAAM;AAAA,IAC1C;AAEA,UAAM,OAAO,MAAM;AACjB,YAAM,MAAM,UAAU;AACtB,UAAI,CAAC,QAAQ,CAAC,IAAK;AACnB,YAAM,OAAO,KACV,SAAS,EACT,OAAO,CAAC,SAAuB,KAAK,WAAW,IAAI,WAAW,IAAI,EAClE,IAAI,CAAC,SAAuB,KAAK,IAAY;AAEhD,YAAM,WAAW,QAAQ,QAAQ,WAAW,OAAO,KAAK,MAAM,EAAE;AAChE,YAAM,SAAS,UAAU;AACzB,UAAI,QAAQ;AACV,YAAI,CAAC,UAAU,UAAU,MAAM,EAAG;AAClC,kBAAU,UAAU;AACpB,mBAAW,UAAU;AAErB,YAAI,CAAC,UAAU,UAAU,QAAQ,QAAQ,OAAO,GAAG;AACjD,cAAI,CAAC,QAAQ,QAAQ,WAAY,sBAAqB,QAAQ;AAC9D,kBAAQ,QAAQ,gBAAgB,QAAQ;AAAA,QAC1C;AACA;AAAA,MACF;AACA,UAAI,UAAU,UAAU,WAAW,OAAO,EAAG;AAC7C,iBAAW,UAAU;AACrB,UAAI,CAAC,QAAQ,QAAQ,WAAY,sBAAqB,QAAQ;AAC9D,cAAQ,QAAQ,gBAAgB,QAAQ;AAAA,IAC1C;AAGA,UAAM,QAAQ,MAAM;AAClB,UAAI,CAAC,KAAM;AACX,YAAM,IAAI,QAAQ;AAClB,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,YAAM,MAAM,CAAC,IAAoB,MAAc,UAAyB;AACtE,YAAI,CAAC,MAAM,GAAG,aAAa,IAAI,MAAM,MAAO;AAC5C,YAAI,SAAS,KAAM,IAAG,gBAAgB,IAAI;AAAA,YACrC,IAAG,aAAa,MAAM,KAAK;AAAA,MAClC;AACA,YAAM,QAAQ,KAAK,cAAgC,yBAAyB;AAC5E,YAAM,YAAY,KAAK,cAAc,6BAA6B;AAClE,UAAI,OAAO,mBAAmB,EAAE,OAAO;AACvC,UAAI,OAAO,oBAAoB,CAAC,WAAW,IAAI,GAAG,EAAE,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI;AAClG,UAAI,OAAO,gBAAgB,EAAE,YAAY,SAAS,IAAI;AACtD,UAAI,OAAO,UAAU,EAAE,cAAc,IAAI;AAEzC,UAAI,OAAO,YAAY,EAAE,WAAW,KAAK,IAAI;AAE7C,UAAI,KAAK,cAAc,yBAAyB,GAAG,YAAY,IAAI;AACnE,iBAAW,QAAQ,KAAK,iBAAiB,iBAAiB,GAAG;AAC3D,cAAM,WAAW,KAAK,cAAc,2BAA2B,GAAG,aAAa,KAAK;AACpF,cAAM,SAAS,KAAK,cAAc,+BAA+B;AACjE,YAAI,SAAU,KAAI,QAAQ,cAAc,UAAU,QAAQ,EAAE;AAC5D,qBAAa,MAAM,MAAM;AAAA,MAC3B;AAEA,iBAAW,OAAO,MAAM,MAAS;AAAA,IACnC;AAMA,UAAM,eAAe,CAAC,MAAe,WAA2B;AAC9D,YAAM,MAAM,KAAK,cAAc,iBAAiB;AAChD,UAAI,CAAC,IAAK;AACV,UAAI,SAAS,IAAI,cAAiC,kCAAkC;AACpF,YAAMC,MAAK,KAAK,GAAG,QAAQ,oBAAoB,EAAE;AACjD,YAAM,OAAO,MAAM,QAAQA,GAAE,GAAG;AAChC,UAAI,CAAC,QAAQ,QAAQ,WAAW,EAAE,gBAAgB,SAAS,YAAY,IAAI,KAAK,MAAM;AACpF,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,UAAI,CAAC,QAAQ;AACX,iBAAS,SAAS,cAAc,QAAQ;AACxC,eAAO,OAAO;AACd,eAAO,YAAY;AACnB,YAAI,aAAa,QAAQ,UAAU,IAAI,UAAU;AAAA,MACnD;AAEA,UAAI,OAAO,QAAQ,WAAWA,IAAI,QAAO,QAAQ,SAASA;AAC1D,UAAI,OAAO,gBAAgB,KAAK,KAAM,QAAO,cAAc,KAAK;AAChE,YAAMC,QAAO,WAAW,KAAK,IAAI;AACjC,UAAI,OAAO,aAAa,YAAY,MAAMA,MAAM,QAAO,aAAa,cAAcA,KAAI;AAAA,IACxF;AAEA,SAAK,OAAO,UAAU,EAAE,KAAK,CAAC,QAAQ;AACpC,UAAI,aAAa,CAAC,IAAI,UAAU,EAAG;AACnC,gBAAU,UAAU;AACpB,YAAM,UAA2B;AAAA,QAC/B,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,cAAc;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,YAAY;AAAA;AAAA;AAAA,QAGZ,eAAe;AAAA,QACf,cAAc;AAAA,QACd,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,uBAAuB;AAAA,QACvB,+BAA+B;AAAA,QAC/B,eAAe,CAAC,SAAS;AACvB,gBAAM,IAAI,QAAQ;AAClB,gBAAM,OAAO,KAAK;AAClB,cAAI,CAAC,cAAc,MAAM,EAAE,UAAU,EAAG,QAAQ,OAAO,QAAQ,IAAI,GAAG;AACtE,cAAI,EAAE,YAAY,QAAQ,KAAK,OAAO,EAAE,SAAU,QAAQ,OAAO,QAAQ,IAAI,GAAG;AAChF,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAQ,IAAI,OAAuD,OAAO;AAC1E,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,WAAK,YAAY,IAAI;AACrB,cAAQ,UAAU;AAClB,eAAS,UAAU;AACnB,WAAK,GAAG,WAAW,CAACC,QAAgB,UAAwB;AAC1D,YAAI,CAACA,OAAO,aAAY,IAAI,MAAM,EAAE;AACpC,YAAI,CAACA,UAAS,CAAC,QAAQ,QAAQ;AAC7B,qBAAW,SAAS,MAAM,SAAS,KAAK,CAAC,EAAG,KAAI,MAAM,OAAO,MAAM,GAAI,OAAM,WAAW,MAAM,EAAE;AAAA;AAClG,aAAK;AAAA,MACP,CAAC;AACD,WAAK,GAAG,cAAc,CAAC,QAAiB,YAA0B;AAEhE,cAAM,SAAS,SAAS;AACxB,cAAM,eAAe,QAAQ,QAAQ,iBAAiB,GAAG,OAAO,kBAAkB,QAAQ,EAAE;AAC5F,YAAI,gBAAiB,iBAAiB,UAAU,QAAQ,WAAW,SAAS;AAC1E,eAAK,cAAgC,yBAAyB,GAAG,MAAM;AACzE,uBAAe;AAGf,YAAI,YAAY,OAAO,QAAQ,EAAE,EAAG,cAAa;AACjD,aAAK;AAAA,MACP,CAAC;AACD,WAAK,GAAG,eAAe,IAAI;AAC3B,WAAK,GAAG,WAAW,CAAC,YAA2C;AAC7D,YAAI,SAAS,SAAS,YAAa,QAAO,OAAO;AAAA,MACnD,CAAC;AACD,iBAAW,IAAI,iBAAiB,KAAK;AACrC,eAAS,QAAQ,MAAM;AAAA,QACrB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,iBAAiB,CAAC,YAAY,mBAAmB,oBAAoB,UAAU,MAAM,UAAU;AAAA,MACjG,CAAC;AACD,WAAK,iBAAiB,QAAQ,cAAc,IAAI;AAChD,WAAK,iBAAiB,UAAU,cAAc,IAAI;AAClD,WAAK,iBAAiB,SAAS,YAAY,IAAI;AAC/C,WAAK,iBAAiB,SAAS,cAAc;AAC7C,iBAAW,UAAU,CAAC;AACtB,qBAAe,CAAC,MAAM,IAAI,CAAC;AAAA,IAC7B,CAAC;AAED,WAAO,MAAM;AACX,kBAAY;AACZ,WAAK,oBAAoB,QAAQ,cAAc,IAAI;AACnD,WAAK,oBAAoB,UAAU,cAAc,IAAI;AACrD,WAAK,oBAAoB,SAAS,YAAY,IAAI;AAClD,WAAK,oBAAoB,SAAS,cAAc;AAChD,gBAAU,WAAW;AACrB,UAAI,MAAM;AACR,aAAK,SAAS,OAAO;AACrB,aAAK,QAAQ;AAAA,MACf;AACA,cAAQ,UAAU;AAClB,eAAS,UAAU,MAAM;AAAA,MAAC;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,EAAAH,WAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AACX,SAAK,WAAW;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA,UAAU,WAAY,YAAY,OAAQ;AAAA,MAC1C,aAAa,CAAC;AAAA,MACd,WAAW,GAAG,WAAW,QAAQ,CAAC,yCAAyC,WAAW,WAAW,CAAC;AAAA,IACpG,CAAC;AAED,aAAS,QAAQ;AAAA,EACnB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAGD,EAAAA,WAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,UAAM,MAAM,UAAU;AACtB,QAAI,CAAC,QAAQ,CAAC,IAAK;AACnB,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,IAAI,WAAW,IAAI;AACvE,UAAM,SAAS,KAAK,IAAI,CAAC,SAAS,KAAK,IAAY;AACnD,QAAI,UAAU,QAAQ,OAAO,GAAG;AAC9B,iBAAW,UAAU;AACrB;AAAA,IACF;AACA,cAAU,UAAU;AACpB,eAAW,QAAQ,KAAM,KAAI,CAAC,QAAQ,SAAS,KAAK,IAAY,EAAG,MAAK,WAAW,KAAK,EAAE;AAC1F,UAAM,QAAQ,QAAQ,OAAO,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC;AAC7D,QAAI,MAAM,SAAS,EAAG,MAAK,KAAK,SAAS,KAAK;AAAA,EAChD,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,QAAM,QAAQ,cAAc;AAC5B,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,YAAY,uBAAuB,SAAS;AAAA,MAC1D,aAAW;AAAA,MACX,iBAAe,WAAW,KAAK;AAAA,MAC/B,gBAAc,YAAY,KAAK;AAAA,MAE/B;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,WAAW,GAAG,mBAAmB,aAAa,oBAAoB;AAAA,YAEjE;AAAA;AAAA,cACA,WACC,gBAAAD,MAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,eAExD,IACE;AAAA;AAAA;AAAA,QACN;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAY,QAAQ,KAAK;AAAA,YACzB,iBAAe,WAAW,KAAK;AAAA,YAC/B,gBAAc,YAAY,KAAK;AAAA,YAC/B,iBAAe,WAAW,KAAK;AAAA,YAE9B;AAAA,sBAAQ;AAAA;AAAA,gBAEP,gBAAAA,OAAC,SAAI,WAAU,8BAA6B,eAAY,QACrD;AAAA;AAAA,kBAAS;AAAA,kBAAC,gBAAAD,MAAC,UAAK,WAAU,yBAAyB,uBAAY;AAAA,mBAClE;AAAA;AAAA,cAGF,gBAAAA,MAAC,SAAI,KAAK,SAAS,WAAU,uBAAsB;AAAA;AAAA;AAAA,QACrD;AAAA,QACC,eAAe,OACd,gBAAAA,MAAC,OAAE,IAAI,eAAe,WAAU,yBAC7B,uBACH,IACE;AAAA,QAEJ,gBAAAA,MAAC,SAAI,IAAI,YAAY,WAAU,2BAA0B,aAAU,UAChE,mBAAS,IAAI,CAAC,SAAS,MACtB,gBAAAA,MAAC,OAAU,WAAU,mBAClB,qBADK,CAER,CACD,GACH;AAAA,QACC,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,YAEd,YAAY,MAAM;AAChB,oBAAM,UAAU,kBAAkB;AAClC,kBAAI,SAAS,YAAa,QAAO;AACjC,qBAAO,QAAQ,SAAS,cAAgC,yBAAyB,KAAK;AAAA,YACxF;AAAA;AAAA,QACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AI/dA;AAAA,EACE,aAAAS;AAAA,EACA,SAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAOK;;;ACIP,IAAM,UAAU;AAST,SAAS,SAAS,QAA2B,KAAqB;AACvE,MAAI,QAAQ;AACZ,aAAW,KAAK,OAAQ,UAAS;AACjC,SAAO,OAAO,SAAS,IAAI,QAAQ,OAAO,OAAO,SAAS,KAAK;AACjE;AAEO,SAAS,SAAS,EAAE,QAAQ,SAAS,WAAW,MAAM,IAAI,GAAqB;AACpF,QAAM,IAAI,OAAO;AACjB,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,SAAS,aAAa,IAAI,IAAI;AACpC,MAAI,SAAS,QAAQ,GAAG,KAAK,YAAY,QAAS,QAAO;AAEzD,MAAI,OAAO,QAAQ,aAAa,OAAO,OAAO,IAAK,MAAM;AACzD,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,MAAM,QAAS;AACnB,UAAM,OAAO,OAAO,OAAO,CAAC,IAAK;AACjC,QAAI,OAAO,YAAY,QAAS;AAChC,WAAO;AACP;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,YAAY,QAAgB,SAAiB,OAA0B;AACrF,QAAM,QAAmB,CAAC;AAC1B,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,QAAI,MAAM,QAAS,OAAM,KAAK,IAAI;AAAA,QAC7B,OAAM,KAAK,SAAS,KAAK;AAAA,EAChC;AACA,SAAO;AACT;AAkBO,SAAS,cAAc,EAAE,QAAQ,KAAK,WAAW,KAAK,WAAW,GAA2B;AACjG,QAAM,QAAQ,SAAS,QAAQ,GAAG;AAClC,SAAO,MAAM,QAAQ,KAAK,IAAI,GAAG,UAAU,IAAI,YAAY,UAAU,QAAQ,YAAY;AAC3F;;;ACzDA,IAAM,QAAQ,CAAC,OAAe,KAAa,QAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC;AAOtF,SAAS,WAAW,EAAE,QAAQ,OAAO,UAAU,QAAQ,QAAQ,MAAM,MAAM,GAGhF;AACA,QAAM,aAAa,MAAM,OAAO,OAAO,OAAO,QAAQ,MAAM;AAC5D,QAAM,eAAe,MAAM,OAAO,QAAQ,MAAM,QAAQ,OAAO;AAC/D,QAAM,QAAQ,CAACC,OAAcA,MAAK,UAAUA,KAAI,MAAM,SAAS,SAAS,QAAQ;AAChF,QAAM,IAAI,MAAM,UAAU,IAAI,aAAa,MAAM,YAAY,IAAI,eAAe;AAChF,QAAM,OAAO,MAAM,GAAG,QAAQ,KAAK,IAAI,QAAQ,SAAS,QAAQ,SAAS,MAAM,KAAK,CAAC;AAErF,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,QAAQ,OAAO,MAAM,SAAS,MAAM;AAC1C,QAAM,YAAY,QAAQ,MAAM,UAAU,SAAS,SAAS;AAC5D,QAAM,MAAM,aAAa,QAAQ,SAAS,QAAQ;AAClD,SAAO,EAAE,MAAM,IAAI;AACrB;;;AFwBsE,SAsR5D,YAAAC,WAtR4D,OAAAC,OAyRpC,QAAAC,cAzRoC;AADtE,IAAMC,qBAAoB,CAAC,MAAe,MAAM,IAAI,WAAW,GAAG,CAAC;AACnE,IAAM,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,MAA4B,gBAAAF,MAAC,OAAG,GAAG,OAAQ,UAAS;AAC9F,IAAM,QAAQ,CAAC,SAA0B,KAAK,MAAM,KAAK;AAEzD,IAAM,UAAU,CAAC,SACf,KAAK,UAAU,QACX,QACA,OAAO,KAAK,UAAU,YAAY,KAAK,QAAQ,KAAK,OAAO,SAAS,KAAK,KAAK,IAC5E,KAAK,QACL;AAER,IAAM,cAAc,CAAC,SAAyC;AAC5D,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,KAAK,eAAe,UAAU,QAAQ,OAAO,OAAO,KAAK;AAClE;AAGA,SAASG,OAAM,EAAE,MAAM,GAA8B;AACnD,SACE,gBAAAH,MAAC,UAAK,WAAU,0BAAyB,aAAW,UAAU,QAAQ,QAAQ,SAAS,eAAY,QAChG,oBAAU,QAAQ,OAAO,OAC5B;AAEJ;AAGA,IAAM,iBAAiB,MACrB,OAAO,QAAQ,eAAe,OAAO,IAAI,aAAa,cAAc,IAAI,SAAS,kBAAkB;AAErG,IAAM,kBAAkB,CAAC,OAAoB,OAAO,GAAG,gBAAgB;AAGvE,SAAS,YAAY,OAA2C;AAC9D,SAAO,MACJ,IAAI,CAAC,SAAS;AACb,UAAM,OAAO,OAAO,KAAK,UAAU,YAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC7F,WAAO,GAAG,MAAM,IAAI,CAAC,IAAS,IAAI,IAAS,QAAQ,IAAI,KAAK,EAAE;AAAA,EAChE,CAAC,EACA,KAAK,GAAQ;AAClB;AA2BO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,YAAY;AAAA,EACZ,iBAAiBE;AAAA,EACjB,aAAa;AAAA,EACb;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,YAAY,YAAY,KAAK;AACnC,QAAM,UAAU,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO;AACtD,QAAM,CAAC,KAAK,MAAM,IAAIE,UAAc,EAAE,WAAW,MAAM,SAAS,IAAI,OAAO,GAAG,aAAa,MAAM,CAAC;AAClG,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,UAAUC,OAAM;AACtB,QAAM,UAAUC,QAAyB,IAAI;AAC7C,QAAM,UAAUA,QAAsB,IAAI;AAC1C,QAAM,YAAYA,QAA0B,IAAI;AAChD,QAAM,WAAWA,QAAyB,IAAI;AAC9C,QAAM,WAAWA,QAAwB,IAAI;AAC7C,QAAM,aAAaA,QAAO,OAAO;AACjC,QAAM,SAASA,QAAO,GAAG;AACzB,QAAM,gBAAgBA,QAAO,kBAAkB;AAC/C,QAAM,gBAAgBA,QAAO,gBAAgB;AAG7C,QAAM,QAAQ,CAAC,GAAa,KAAa,SAAkB;AAAA,IACzD,OAAO,SAAS,EAAE,GAAG,GAAG,SAAS,IAAI,CAAC;AAAA,IACtC,aAAa,cAAc,EAAE,GAAG,GAAG,KAAK,YAAY,cAAc,QAAQ,CAAC;AAAA,EAC7E;AAKA,QAAM,YAAY,IAAI,cAAc;AAIpC,EAAAC,iBAAgB,MAAM;AACpB,eAAW,UAAU;AACrB,WAAO,UAAU;AACjB,kBAAc,UAAU;AACxB,kBAAc,UAAU;AAAA,EAC1B,CAAC;AAED,EAAAA,iBAAgB,MAAM;AACpB,UAAM,OAAO,QAAQ;AACrB,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,CAAC,KAAM;AACpB,QAAI,WAAW;AACb,YAAM,SAAS,MAAM;AAAA,QACnB,KAAK,iBAA8B,iCAAiC;AAAA,QACpE,CAAC,OAAO,GAAG,sBAAsB,EAAE;AAAA,MACrC;AACA,eAAS,UAAU;AAAA,QACjB;AAAA,QACA,MAAM,KAAK,sBAAsB,EAAE;AAAA,QACnC,KAAK,WAAW,iBAAiB,IAAI,EAAE,SAAS,KAAK;AAAA,QACrD,WAAW,KAAK;AAAA,MAClB;AAAA,IACF,WAAW,IAAI,YAAY,QAAS;AACpC,UAAM,IAAI,SAAS;AACnB,QAAI,CAAC,EAAG;AACR,WAAO,EAAE,WAAW,SAAS,GAAG,MAAM,GAAG,SAAS,IAAI,WAAW,EAAE,CAAC;AAAA,EACtE,GAAG,CAAC,WAAW,WAAW,SAAS,GAAG,CAAC;AAKvC,EAAAC,WAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,CAAC,QAAQ,OAAO,mBAAmB,YAAa;AAC7D,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,YAAM,IAAI,SAAS;AACnB,UAAI,CAAC,EAAG;AACR,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,WAAW;AACnB,YAAE,YAAY,MAAM,iBAAiB,CAAC,GAAG,cAAc,MAAM,YAAY;AAAA,aACtE;AAEH,gBAAM,QAAQ,MAAM,gBAAgB,CAAC,GAAG,cAAc;AACtD,cAAI,QAAQ,EAAG,GAAE,OAAO;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,OAAO,OAAO;AACpB,UAAI,KAAK,cAAc,KAAM;AAC7B,YAAM,OAAO,MAAM,GAAG,WAAW,SAAS,KAAK,WAAW;AAC1D,UAAI,KAAK,UAAU,KAAK,SAAS,KAAK,gBAAgB,KAAK,YAAa,QAAO,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAAA,IACrG,CAAC;AACD,aAAS,QAAQ,IAAI;AACrB,aAAS,QAAQ,IAAI;AACrB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAGL,QAAM,WAAWF,QAAO,KAAK;AAC7B,EAAAE,WAAU,MAAM;AACd,QAAI,SAAS,YAAY,IAAI,YAAa;AAC1C,aAAS,UAAU,IAAI;AACvB,kBAAc,UAAU,IAAI,WAAW;AAAA,EACzC,GAAG,CAAC,IAAI,WAAW,CAAC;AAGpB,EAAAA,WAAU,MAAM;AACd,UAAM,QAAQ,OAAO,aAAa,cAAc,SAAY,SAAS;AACrE,QAAI,CAAC,SAAS,MAAM,WAAW,SAAU;AACzC,QAAI,OAAO;AACX,SAAK,MAAM,MAAM,KAAK,MAAM;AAC1B,UAAI,KAAM,QAAO,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,KAAK,EAAE;AAAA,IAC3D,CAAC;AACD,WAAO,MAAM;AACX,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,OAAO,YAAY,MAAM,QAAQ,SAAS,IAAI,KAAK;AAC7E,QAAM,WAAW,QAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;AAC9D,QAAM,WAAW,QAAQ,SAAS,SAAS;AAE3C,QAAM,iBAAiB,SAAS,IAAI,OAAO,EAAE,OAAO,CAAC,MAAM,MAAM,IAAI;AACrE,QAAM,gBAAgB,eAAe,OAAe,CAAC,KAAK,MAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,CAAC;AAC9F,QAAM,YAAY,gBAAgB,IAAI,gBAAgB,eAAe,SAAS,IAAI,QAAQ;AAC1F,QAAM,gBAAgB,SACnB,IAAI,WAAW,EACf,OAAO,CAAC,SAAS,SAAS,IAAI,EAC9B,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK,EAAE;AAKV,EAAAD,iBAAgB,MAAM;AACpB,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,SAAS,CAAC,gBAAgB,KAAK,EAAG;AAEvC,QAAI,CAAC,MAAM,aAAa,SAAS,EAAG,OAAM,aAAa,WAAW,QAAQ;AAC1E,UAAM,QAAQ,MAAM,QAAQ,eAAe;AAC3C,QAAI,YAAY,CAAC,MAAO,OAAM,YAAY;AAAA,aACjC,CAAC,YAAY,MAAO,OAAM,YAAY;AAAA,EACjD,GAAG,CAAC,QAAQ,CAAC;AAIb,EAAAA,iBAAgB,MAAM;AACpB,UAAM,QAAQ,SAAS;AACvB,UAAME,UAAS,UAAU;AACzB,QAAI,CAAC,YAAY,CAAC,SAAS,CAACA,WAAU,eAAe,EAAG;AACxD,UAAM,QAAQ,MAAM;AAClB,YAAM,SAASA,QAAO,sBAAsB;AAC5C,YAAM,MAAM,MAAM,sBAAsB;AACxC,YAAM,MAAM,iBAAiB,KAAK;AAClC,YAAM,EAAE,MAAM,IAAI,IAAI,WAAW;AAAA,QAC/B;AAAA,QACA,OAAO,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA,QAC9C,UAAU,EAAE,OAAO,SAAS,gBAAgB,aAAa,QAAQ,OAAO,YAAY;AAAA,QACpF,QAAQ,WAAW,IAAI,iBAAiB,iBAAiB,CAAC,KAAK;AAAA,QAC/D,QAAQ,WAAW,IAAI,iBAAiB,kBAAkB,CAAC,KAAK;AAAA,QAChE,KAAK,IAAI,cAAc;AAAA,MACzB,CAAC;AACD,YAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,YAAM,MAAM,MAAM,GAAG,GAAG;AAAA,IAC1B;AACA,UAAM;AACN,WAAO,iBAAiB,UAAU,OAAO,EAAE,SAAS,KAAK,CAAC;AAC1D,WAAO,iBAAiB,UAAU,OAAO,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AACzE,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,KAAK;AAC1C,aAAO,oBAAoB,UAAU,OAAO,EAAE,SAAS,KAAK,CAAC;AAC7D,YAAM,MAAM,OAAO;AACnB,YAAM,MAAM,MAAM;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IACrE;AACA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU;AAC5B,YAAM,SAAS,SAAS;AACxB,cAAQ,KAAK;AACb,UAAI,CAAC,UAAU,WAAW,SAAS,QAAQ,QAAQ,SAAS,SAAS,MAAM;AACzE,kBAAU,SAAS,MAAM;AAAA,IAC7B;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,aAAa;AACzD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,SAAS,CAAC,UAAqC;AACnD,QAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAA4B,EAAG,SAAQ,KAAK;AAAA,EACtF;AAEA,QAAM,OAAO,CAAC,MAAuB,YAAqB;AACxD,UAAM,QAAQ,QAAQ,IAAI;AAC1B,UAAM,YAAY,YAAY,IAAI;AAClC,WAAO;AAAA,MACL;AAAA,QACE,MAAM,KAAK;AAAA,QACX,WAAW;AAAA,QACX,gBAAgB,KAAK,UAAU,SAAS;AAAA,QACxC,SAAS,UAAU,MAAM,QAAQ,KAAK,IAAI;AAAA,QAC1C,UACE,gBAAAP,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,UAAK,WAAU,0BAA0B,eAAK,OAAM;AAAA,UACpD,UAAU,OAAO,gBAAAA,MAACG,QAAA,EAAM,OAAO,OAAO,IAAK;AAAA,UAC3C,cAAc,OAAO,gBAAAF,OAAC,UAAK,WAAU,sBAAqB;AAAA;AAAA,YAAG;AAAA,aAAU,IAAU;AAAA,WACpF;AAAA,MAEJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,mBAAmB,SAAS;AAAA,MAC1C,kBAAgB,aAAa;AAAA,MAC7B,oBAAkB,IAAI,eAAe;AAAA,MAErC,OAAO,EAAE,GAAG,OAAO,aAAa,oBAAoB,QAAQ,QAAQ,WAAW,EAAE,CAAC,GAAG;AAAA,MACpF,GAAG;AAAA,MAEJ,0BAAAC,OAAC,QAAG,KAAK,SAAS,WAAU,yBACzB;AAAA,cAAM;AAAA,UAAI,CAAC,MAAM,MAChB,SAAS,CAAC,MAAM,CAAC,IAAI,OACnB,gBAAAD,MAAC,QAAqB,WAAU,yBAAwB,gBAAc,KAAK,WAAW,QACnF,eAAK,MAAM,KAAK,KADV,MAAM,IAAI,CAEnB;AAAA,QAEJ;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,QAAQ,aAAa,SAAS,WAAW;AAAA,YACzC;AAAA,YAEA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,iBAAe;AAAA,kBACf,iBAAe;AAAA,kBACf,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,kBAGhC;AAAA,oCAAAD,MAAC,sBAAmB,WAAU,6BAA4B;AAAA,oBAC1D,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,qBAAU;AAAA,oBAC3D,gBAAAC,OAAC,UAAK,WAAU,sBAAqB;AAAA;AAAA,sBAChC,eAAe,SAAS,MAAM;AAAA,sBAChC;AAAA,uBACH;AAAA,oBACC,cAAc,OAAO,gBAAAD,MAACG,QAAA,EAAM,OAAO,WAAW,IAAK;AAAA,oBACpD,gBAAAH,MAAC,mBAAgB,MAAK,MAAK,WAAU,4BAA2B;AAAA;AAAA;AAAA,cAClE;AAAA,cACA,gBAAAA,MAAC,QAAG,KAAK,UAAU,IAAI,SAAS,WAAU,0BAAyB,QAAQ,CAAC,UACzE,mBAAS,IAAI,CAAC,SACb,gBAAAA,MAAC,QAAsB,eAAK,MAAM,IAAI,KAA7B,MAAM,IAAI,CAAqB,CACzC,GACH;AAAA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AG1ZA,SAAS,WAAW,mBAAmB;AAwBnC,gBAAAU,OAiFI,QAAAC,cAjFJ;AAFJ,SAASC,MAAK,EAAE,MAAM,aAAa,cAAc,QAAQ,OAAO,SAAS,GAAqB;AAC5F,SACE,gBAAAF;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC;AAAA,MACA;AAAA,MACA,cAAc,eAAe,CAAC,SAAS,aAAa,IAAI,IAAI;AAAA,MAC5D;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAUA,SAASG,SAAQ,EAAE,QAAQ,WAAW,UAAU,GAAG,KAAK,GAAwB;AAC9E,SACE,gBAAAH;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC,QAAQ,UAAU,gBAAAA,MAAC,UAAO,SAAQ,aAAY,WAAsB;AAAA,MACpE,WAAW,SAAS,YAAY;AAAA,MAC/B,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AA6BA,IAAM,sBAAsB,EAAE,kBAAkB,OAAO;AAGvD,SAASI,SAAQ;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,SACE,gBAAAJ,MAAC,YAAY,QAAZ,EACC,0BAAAA;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC;AAAA,MACA;AAAA,MACA,YAAY,eAAe,QAAQ,IAAI;AAAA,MACvC;AAAA,MACA,oBAAoB;AAAA,MACpB,WAAU;AAAA,MAEV,0BAAAC,OAAC,YAAY,OAAZ,EAAkB,WAAW,GAAG,cAAc,SAAS,GAAI,GAAG,MAC5D;AAAA,gBAAQ,gBAAAD,MAAC,YAAY,OAAZ,EAAkB,WAAU,qBAAoB,IAAK;AAAA,QAC9D;AAAA,SACH;AAAA;AAAA,EACF,GACF;AAEJ;AAOA,SAASK,OAAM,EAAE,WAAW,GAAG,KAAK,GAAsB;AACxD,SAAO,gBAAAL,MAAC,YAAY,OAAZ,EAAkB,WAAW,GAAG,qBAAqB,SAAS,GAAI,GAAG,MAAM;AACrF;AAOA,SAASM,aAAY,EAAE,WAAW,GAAG,KAAK,GAA4B;AACpE,SAAO,gBAAAN,MAAC,YAAY,aAAZ,EAAwB,WAAW,GAAG,2BAA2B,SAAS,GAAI,GAAG,MAAM;AACjG;AAOA,SAASO,OAAM,EAAE,WAAW,UAAU,QAAQ,GAAG,KAAK,GAAsB;AAC1E,MAAI,aAAa,UAAa,WAAW,QAAW;AAClD,WACE,gBAAAP,MAAC,YAAY,OAAZ,EAAkB,WAAW,GAAG,qBAAqB,SAAS,GAAG,cAAW,SAAS,GAAG,MACvF,0BAAAA,MAAC,SAAM,GACT;AAAA,EAEJ;AACA,SACE,gBAAAA,MAAC,YAAY,OAAZ,EAAkB,WAAsB,QAAiB,GAAG,MAC1D,UACH;AAEJ;AAGO,IAAM,UAAU,EAAE,MAAAE,OAAM,SAAAC,UAAS,SAAAC,UAAS,OAAAC,QAAO,aAAAC,cAAa,OAAAC,OAAM;;;ACzHrE,SAOE,OAAAC,OAPF,QAAAC,cAAA;AAdC,SAAS,UAAU,EAAE,WAAW,OAAO,OAAO,MAAM,OAAO,WAAW,GAAG,KAAK,GAAmB;AACtG,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,WAAW,YAAY,SAAS;AAAA,MAC9C,aAAW;AAAA,MACX,iBAAe,YAAY;AAAA,MAC3B,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,WAAU;AAAA,MACV,eAAa,QAAQ,SAAY;AAAA,MACjC,MAAM,QAAQ,QAAQ;AAAA,MACtB,cAAY;AAAA,MACX,GAAG;AAAA,MAEJ;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,QAAO;AAAA,YACP,eAAc;AAAA,YACd,gBAAe;AAAA,YAEf;AAAA,8BAAAD,MAAC,UAAK,GAAE,oEAAmE;AAAA,cAC3E,gBAAAA,MAAC,UAAK,GAAE,kJAAiJ;AAAA,cACzJ,gBAAAA,MAAC,UAAK,WAAU,kBAAiB,GAAE,sDAAqD;AAAA,cACxF,gBAAAA,MAAC,UAAK,GAAE,qDAAoD;AAAA,cAC5D,gBAAAA,MAAC,UAAK,GAAE,kGAAiG;AAAA;AAAA;AAAA,QAC3G;AAAA,QACA,gBAAAC,OAAC,OAAE,WAAU,kBAAiB,MAAK,QAAO,QAAO,gBAC/C;AAAA,0BAAAD,MAAC,YAAO,IAAG,QAAO,IAAG,SAAQ,GAAE,OAAM;AAAA,UACrC,gBAAAA,MAAC,YAAO,IAAG,OAAM,IAAG,SAAQ,GAAE,QAAO;AAAA,UACrC,gBAAAA,MAAC,YAAO,IAAG,OAAM,IAAG,SAAQ,GAAE,OAAM;AAAA,WACtC;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACpDA;AAAA,EACE,YAAAE;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAKK;AA0GC,SAEI,OAAAC,OAFJ,QAAAC,cAAA;AA5FR,IAAM,cAAcC,eAAgC,EAAE,UAAU,MAAM;AAAC,EAAE,CAAC;AAG1E,IAAM,eAAeA,eAA0B,MAAS;AAGxD,IAAM,gBACJ;AAEF,IAAM,gBACJ;AAyBF,SAASC,MAAK;AAAA,EACZ,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,WAAWC,QAAuB,IAAI;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,EAAE;AACzC,QAAM,QAAQD,QAAsC,MAAS;AAE7D,QAAM,WAAWE,aAAY,CAAC,SAAiB;AAC7C,eAAW,EAAE;AACb,iBAAa,MAAM,OAAO;AAC1B,UAAM,UAAU,WAAW,MAAM,WAAW,IAAI,GAAG,EAAE;AAAA,EACvD,GAAG,CAAC,CAAC;AACL,EAAAC,WAAU,MAAM,MAAM,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AACrD,QAAM,UAAUC,SAAQ,OAAO,EAAE,SAAS,IAAI,CAAC,QAAQ,CAAC;AAExD,QAAM,gBAAgB,CAAC,UAAyC;AAC9D,QAAI,MAAM,oBAAoB,MAAM,WAAW,MAAM,WAAW,MAAM,UAAU,MAAM,SAAU;AAChG,QAAI,MAAM,YAAY,YAAa;AACnC,UAAM,SAAS,MAAM;AAErB,QAAI,CAAC,MAAM,cAAc,SAAS,MAAM,EAAG;AAC3C,QAAI,MAAM,QAAQ,SAAS;AACzB,UAAI,CAAC,UAAU,OAAO,QAAQ,aAAa,EAAG;AAC9C,YAAM,eAAe;AACrB,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,YAAa;AAC7D,QAAI,OAAO,QAAQ,aAAa,EAAG;AACnC,UAAM,MAAM,iBAAiB,MAAM,aAAa,EAAE,cAAc;AAChE,UAAM,UAAW,MAAM,QAAQ,iBAAkB;AACjD,UAAM,UAAU,UAAU,SAAS;AACnC,QAAI,CAAC,QAAS;AACd,UAAM,eAAe;AACrB,YAAQ;AAAA,EACV;AAEA,SACE,gBAAAR;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC;AAAA,MACA,gBAAgB,CAAC,WAAW;AAC1B,YAAI,WAAW,gBAAiB,gBAAe,MAAM;AAAA,MACvD;AAAA,MAEA,0BAAAA;AAAA,QAAC,OAAO;AAAA,QAAP;AAAA,UACC,KAAK;AAAA,UACL,SAAQ;AAAA,UACR,WAAW,GAAG,WAAW,SAAS;AAAA,UAClC,cAAc,MAAM,SAAS,SAAS,cAA2B,sBAAsB,KAAK;AAAA,UAC5F,WAAW;AAAA,UAEX,0BAAAC,OAAC,YAAY,UAAZ,EAAqB,OAAO,SAC1B;AAAA,yBACC,gBAAAD,MAAC,SAAI,WAAU,uBAAsB,eAAY,QAC9C,sBACH,IACE;AAAA,YACH;AAAA,YACD,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,aAAU,UAAS,eAAY,QAChE,mBACH;AAAA,aACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAkBA,SAASS,QAAO;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA8B;AAC5B,SACE,gBAAAR,OAAC,SAAI,WAAW,GAAG,mBAAmB,SAAS,GAAI,GAAG,MACpD;AAAA,oBAAAA,OAAC,SAAI,WAAU,oBAAmB,gBAAc,eAAe,KAAK,QACjE;AAAA,aACC,gBAAAD,MAAC,UAAK,WAAU,iBAAgB,eAAY,QACzC,gBACH,IACE;AAAA,MACJ,gBAAAA,MAAC,OAAO,OAAP,EAAa,WAAU,kBAAkB,iBAAM;AAAA,MAC/C,eAAe,gBAAAA,MAAC,UAAK,WAAU,0BAA0B,wBAAa,IAAU;AAAA,OACnF;AAAA,IACC;AAAA,IACA,SAAS,gBAAAA,MAAC,SAAI,WAAU,mBAAmB,kBAAO,IAAS;AAAA,IAC5D,gBAAAA;AAAA,MAAC,OAAO;AAAA,MAAP;AAAA,QACC,WAAU;AAAA,QACV,QAAQ,gBAAAA,MAAC,cAAW,OAAO,YAAY,qBAAkB,UAAS;AAAA,QAElE,0BAAAA,MAAC,SAAM,MAAK,MAAK;AAAA;AAAA,IACnB;AAAA,KACF;AAEJ;AAuBA,SAASU,UAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,QAAM,SAAS,SAAS;AAAA,IACtB,CAAC,KAAK,SAAS,MAAM,CAAC,GAAG,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAK,SAAS,IAAI,CAAC,EAAG,KAAK;AAAA,IAChF,CAAC;AAAA,EACH;AACA,SACE,gBAAAT,OAAC,SAAI,WAAW,GAAG,qBAAqB,SAAS,GAAI,GAAG,MACrD;AAAA,YAAQ,gBAAAD,MAAC,SAAI,WAAU,2BAA2B,iBAAM,IAAS;AAAA,IAClE,gBAAAA,MAAC,QAAG,WAAU,qBAAoB,cAAY,WAC3C,mBAAS,IAAI,CAAC,SAAS,MAAM;AAC5B,YAAM,OAAO,OAAO,CAAC;AACrB,YAAM,UAAU,OAAO,QAAQ,QAAQ,OAAO,QAAQ;AACtD,YAAM,OAAO,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,KAAK,UAAU,MAAM;AACtF,YAAM,UAAU,QAAQ,QAAQ,IAAI,KAAK,IAAI,KAAM,OAAO,QAAQ,QAAS,GAAG,IAAI;AAClF,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UACV,OAAO,EAAE,UAAU,QAAQ,MAAM;AAAA,UACjC,gBAAc,UAAU,SAAS;AAAA,UAEjC;AAAA,4BAAAD,MAAC,UAAK,WAAU,yBAAwB,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,GAAG;AAAA,YAC9E,gBAAAA,MAAC,UAAK,WAAU,sBAAsB,kBAAQ,OAAM;AAAA;AAAA;AAAA,QAN/C,QAAQ;AAAA,MAOf;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAKA,SAASW,MAAK,EAAE,WAAW,GAAG,KAAK,GAA4B;AAC7D,SAAO,gBAAAX,MAAC,SAAI,WAAW,GAAG,iBAAiB,SAAS,GAAI,GAAG,MAAM;AACnE;AAQA,SAAS,KAAK;AAAA,EACZ,cAAc,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,SACE,gBAAAC,OAAC,SAAI,WAAW,GAAG,iBAAiB,SAAS,GAAG,cAAY,WAAY,GAAG,MACxE;AAAA;AAAA,IACA,SAAS,gBAAAD,MAAC,SAAI,WAAU,sBAAsB,kBAAO,IAAS;AAAA,KACjE;AAEJ;AAQA,SAAS,UAAU,EAAE,OAAO,WAAW,UAAU,GAAG,KAAK,GAAiC;AACxF,QAAM,KAAKY,OAAM;AACjB,SACE,gBAAAX,OAAC,SAAI,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,MACxD;AAAA,oBAAAD,MAAC,UAAK,WAAU,uBAAsB,IACnC,iBACH;AAAA,IACA,gBAAAA,MAAC,QAAG,WAAU,sBAAqB,mBAAiB,IACjD,UACH;AAAA,KACF;AAEJ;AAcA,SAAS,SAAS;AAAA,EAChB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,gBAAAA,MAAC,QAAG,WAAU,uBACZ,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,sBAAsB,SAAS;AAAA,MAC7C,gBAAc,UAAU,SAAS;AAAA,MACjC,aAAW,QAAQ;AAAA,MAClB,GAAG;AAAA,MAEJ;AAAA,wBAAAD,MAAC,UAAK,WAAU,sBAAqB,eAAY,QAC9C,iBAAO,gBAAAA,MAAC,aAAU,MAAK,MAAK,IAAK,MACpC;AAAA,QACA,gBAAAC,OAAC,UAAK,WAAU,sBACb;AAAA;AAAA,UACA,OAAO,gBAAAA,OAAC,UAAK,WAAU,sBAAqB;AAAA;AAAA,YAAG;AAAA,aAAU,IAAU;AAAA,WACtE;AAAA,QACC,YAAY,gBAAAD,MAAC,UAAK,WAAU,2BAA2B,qBAAU,IAAU;AAAA;AAAA;AAAA,EAC9E,GACF;AAEJ;AAoBA,SAASa,UAAS,EAAE,YAAY,WAAW,WAAW,UAAU,GAAG,KAAK,GAAgC;AACtG,QAAM,UAAUC,UAAS,KAAK,QAAQ;AACtC,QAAM,MAAM,OAAO,QAAQ,OAAO,EAAE;AACpC,QAAM,CAAC,OAAO,QAAQ,IAAIT,UAAoE;AAAA,IAC5F,SAAS,EAAE,KAAK,SAAS,UAAU;AAAA,IACnC,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AAGD,MAAI,MAAM,QAAQ,QAAQ,KAAK;AAC7B,aAAS;AAAA,MACP,SAAS,EAAE,KAAK,SAAS,UAAU;AAAA,MACnC,SAAS,EAAE,GAAG,MAAM,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,IACT,CAAC;AAAA,EACH,WAAW,MAAM,QAAQ,YAAY,SAAS;AAC5C,aAAS,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,EAAE,GAAG,EAAE,SAAS,QAAQ,EAAE,EAAE;AAAA,EAChE;AACA,QAAM,aAAaC,aAAY,CAAC,YAAoB;AAClD,aAAS,CAAC,MAAO,EAAE,SAAS,QAAQ,UAAU,EAAE,GAAG,GAAG,SAAS,KAAK,IAAI,CAAE;AAAA,EAC5E,GAAG,CAAC,CAAC;AAEL,QAAM,MAAMF,QAAuB,IAAI;AACvC,EAAAG,WAAU,MAAM;AACd,QAAI,MAAM,SAAS,IAAI,QAAS,KAAI,QAAQ,YAAY;AAAA,EAC1D,GAAG,CAAC,KAAK,MAAM,KAAK,CAAC;AAErB,QAAM,SAAqD,CAAC;AAC5D,MAAI,MAAM,WAAW,MAAM,QAAQ,QAAQ,IAAK,QAAO,KAAK,EAAE,OAAO,MAAM,SAAS,OAAO,OAAO,CAAC;AACnG,SAAO,KAAK;AAAA,IACV,OAAO,EAAE,KAAK,SAAS,WAAW,MAAM,QAAQ,UAAU;AAAA,IAC1D,OAAO,MAAM,QAAQ,UAAU;AAAA,EACjC,CAAC;AAED,SACE,gBAAAP,MAAC,SAAI,KAAU,WAAW,GAAG,qBAAqB,SAAS,GAAI,GAAG,MAC/D,iBAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAC1B,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,UAAU,MAAM;AAAA,MAChB;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,UAAU;AAAA,MAET,gBAAM;AAAA;AAAA,IANF,MAAM;AAAA,EAOb,CACD,GACH;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,MAAMI,QAAuB,IAAI;AACvC,EAAAG,WAAU,MAAM;AACd,QAAI,UAAU,OAAQ;AACtB,QAAI,YAAY;AAChB,UAAM,KAAK,IAAI;AAEf,UAAM,aAAa,MAAM,OAAO,GAAG,kBAAkB,aAAa,GAAG,cAAc,IAAI,CAAC;AACxF,UAAM,OAAO,MAAM;AACjB,UAAI,CAAC,UAAW,UAAS,QAAQ;AAAA,IACnC;AACA,YAAQ,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI;AAC9D,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,QAAQ,CAAC;AAC9B,SACE,gBAAAP;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,cAAY;AAAA,MACZ,kBAAgB;AAAA,MAChB,OAAO,UAAU;AAAA,MAEjB,0BAAAA,MAAC,aAAa,UAAb,EAAsB,OAAO,OAAQ,UAAS;AAAA;AAAA,EACjD;AAEJ;AAcA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,QAAM,KAAKY,OAAM;AACjB,QAAM,WAAWR,QAA2B,IAAI;AAChD,QAAM,QAAQW,YAAW,YAAY;AACrC,QAAM,EAAE,SAAS,IAAIA,YAAW,WAAW;AAC3C,QAAM,UAAU,iBAAiB,OAAO,UAAU,WAAW,QAAQ;AAGrE,QAAM,SAASX,QAAO,EAAE,SAAS,SAAS,CAAC;AAC3C,EAAAG,WAAU,MAAM;AACd,WAAO,UAAU,EAAE,SAAS,SAAS;AAAA,EACvC,CAAC;AACD,EAAAA,WAAU,MAAM;AACd,QAAI,UAAU,QAAS;AACvB,aAAS,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC/C,QAAI,OAAO,QAAQ,QAAS,QAAO,QAAQ,SAAS,OAAO,QAAQ,OAAO;AAAA,EAC5E,GAAG,CAAC,KAAK,CAAC;AACV,SACE,gBAAAN,OAAC,aAAQ,WAAW,GAAG,iBAAiB,SAAS,GAAG,mBAAiB,IAAK,GAAG,MAC3E;AAAA,oBAAAA,OAAC,SAAI,WAAU,sBACZ;AAAA,gBAAU,gBAAAD,MAAC,OAAE,WAAU,oBAAoB,mBAAQ,IAAO;AAAA,MAC3D,gBAAAA,MAAC,QAAG,WAAU,uBAAsB,IAAQ,KAAK,UAAU,UAAU,IAClE,iBACH;AAAA,MACC,cAAc,gBAAAA,MAAC,SAAI,WAAU,6BAA6B,uBAAY,IAAS;AAAA,OAClF;AAAA,IACC;AAAA,KACH;AAEJ;AAYA,SAAS,OAAO,EAAE,MAAM,MAAM,WAAW,UAAU,GAAG,KAAK,GAA8B;AACvF,SACE,gBAAAC,OAAC,SAAI,WAAW,GAAG,mBAAmB,SAAS,GAAI,GAAG,MACnD;AAAA,WAAO,gBAAAD,MAAC,SAAI,WAAU,wBAAwB,gBAAK,IAAS;AAAA,IAC5D,OAAO,gBAAAA,MAAC,SAAI,WAAU,wBAAwB,gBAAK,IAAS;AAAA,IAC7D,gBAAAA,MAAC,SAAI,WAAU,2BAA2B,UAAS;AAAA,KACrD;AAEJ;AAOO,IAAM,iBAAiB;AAAA,EAC5B,MAAAG;AAAA,EACA,QAAAM;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAE;AAAA,EACA;AAAA,EACA;AACF;;;ACndM,gBAAAG,OAIE,QAAAC,cAJF;AA/BC,SAAS,MAAM;AAAA,EACpB;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAe;AACb,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,UAAU,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI;AAC7E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,YAAY,SAAS;AAAA,MACnC,gBAAc;AAAA,MACd,aAAW,YAAY,SAAS,OAAO;AAAA,MACvC,aAAW,SAAS,OAAO;AAAA,MAC3B,iBAAe,SAAS,SAAY;AAAA,MACpC,iBAAe,YAAY;AAAA,MAC3B,OACE,YAAY,SACP,EAAE,GAAG,OAAO,oBAAoB,WAAW,KAAK,QAAQ,CAAC,EAAE,IAC5D;AAAA,MAEL,GAAG;AAAA,MAEJ;AAAA,wBAAAD,MAAC,UAAK,WAAU,sBACb,wBAAc,SAAS,GAAG,KAAK,IAAI,KAAK,WAAW,GAAG,KAAK,GAAG,KAAK,iBACtE;AAAA,QACC,YAAY,SACX,gBAAAC,OAAC,SAAI,WAAU,kBAAiB,SAAQ,aAAY,eAAY,QAAO,WAAU,SAE/E;AAAA,0BAAAD,MAAC,YAAO,WAAU,mBAAkB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,YAAY,KAAK;AAAA,UAE3E,WAAW,IAAI,gBAAAA,MAAC,YAAO,WAAU,iBAAgB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,YAAY,KAAK,IAAK;AAAA,WACjG,IACE;AAAA,QACJ,gBAAAC,OAAC,UAAK,WAAU,kBAAiB,eAAY,QAC3C;AAAA,0BAAAD,MAAC,UAAK,WAAU,mBAAmB,mBAAS,QAAQ,UAAI;AAAA,UACvD,WAAW,OAAO,gBAAAA,MAAC,UAAK,WAAU,qBAAqB,mBAAQ,IAAU;AAAA,WAC5E;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC7DI,gBAAAE,aAAA;AAFJ,SAAS,eAAe,EAAE,MAAM,OAAO,MAAM,UAAU,OAAO,WAAW,GAAG,KAAK,GAAoB;AACnG,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACzC,aAAW;AAAA,MACX,aAAW;AAAA,MACX,gBAAc,WAAW;AAAA,MACxB,GAAG;AAAA;AAAA,EACN;AAEJ;AAGA,SAAS,eAAe,EAAE,WAAW,GAAG,KAAK,GAAwB;AACnE,SAAO,gBAAAA,MAAC,QAAG,WAAW,GAAG,wBAAwB,SAAS,GAAI,GAAG,MAAM;AACzE;AAEO,IAAM,aAAa,OAAO,OAAO,gBAAgB,EAAE,MAAM,eAAe,CAAC;;;ACtChF,SAAS,iBAAAC,gBAAe,YAAAC,kBAA4D;AAmChE,qBAAAC,YAAA,OAAAC,OAMZ,QAAAC,cANY;AALpB,IAAM,QAAQ;AAEd,SAAS,OAAO,EAAE,MAAM,MAAM,MAAM,GAA+D;AAEjG,QAAM,CAAC,EAAE,OAAO,IAAI,OAAO,IAAI,QAAQ,EAAE,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC;AAClE,MAAI,CAAC,KAAM,QAAO,gBAAAD,MAAAD,YAAA,EAAG,gBAAK;AAC1B,QAAM,MAAM,SAAS,UAAU,QAAQ;AACvC,SACE,gBAAAE,OAAAF,YAAA,EACG;AAAA;AAAA,IACD,gBAAAE,OAAC,OAAI,WAAW,iBAAiB,IAAI,IACnC;AAAA,sBAAAA,OAAC,UAAK,WAAU,sBAAqB;AAAA;AAAA,QAAE;AAAA,QAAM;AAAA,SAAE;AAAA,MAC9C;AAAA,MACD,gBAAAD,MAAC,UAAK,WAAU,sBAAqB,eAAC;AAAA,OACxC;AAAA,IACC;AAAA,KACH;AAEJ;AAOO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,eAAe;AAAA,EACf;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,WAAsB,MAAM;AAAA,IAAI,CAAC,MAAM,MAC3C,KAAK,SAAS,SACZ,gBAAAA,MAACD,YAAA,EAAkB,eAAK,QAAT,CAAc,IAE7B,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,OAAO,KAAK,SAAS,UAAU,aAAa;AAAA;AAAA,MAHvC;AAAA,IAIP;AAAA,EAEJ;AACA,SAAOE;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW,GAAG,gBAAgB,SAAS;AAAA,MACvC,aAAa;AAAA,MACb,GAAI,WAAW,SAAS,EAAE,eAAe,OAAO,IAAI,CAAC;AAAA,MACrD,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACtEI,SACE,OAAAC,OADF,QAAAC,cAAA;AAFG,SAAS,MAAM,EAAE,OAAO,WAAW,UAAU,GAAG,KAAK,GAAe;AACzE,SACE,gBAAAA,OAAC,YAAO,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,MAChD;AAAA,oBAAAD,MAAC,gBAAW,WAAU,mBAAmB,iBAAM;AAAA,IAC/C,gBAAAA,MAAC,gBAAW,WAAU,kBAAkB,UAAS;AAAA,KACnD;AAEJ;;;ACtBA,SAAS,UAAU,kBAAkB;AACrC,SAAS,aAAAE,kBAAiB;AAwCtB,gBAAAC,OAYA,QAAAC,cAZA;AA7BG,SAAS,eAAe,MAAyC;AACtE,QAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,QAAM,SACJ,MAAM,SAAS,GAAG,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,MAAM,YAAY,IAAI,MAAM,MAAM,KAAK,GACzF,OAAO,OAAO;AAChB,QAAM,QAAQ,CAAC,MAA2B,IAAK,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,KAAM;AACzE,QAAM,UAAU,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,CAAC,IAAI,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC;AACpG,SAAO,QAAQ,YAAY;AAC7B;AAkBA,SAAS,QAAQ,EAAE,MAAM,SAAS,GAA+C;AAC/E,QAAM,UAAU,UAAU,KAAK,IAAI,MAAM,KAAK,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,eAAe,IAAI;AACzG,SAAO,UACL,gBAAAD,MAAC,UAAK,WAAU,uBAAuB,mBAAQ,IAE/C,gBAAAA,MAAC,YAAS,WAAU,mBAAkB,MAAK,MAAK;AAEpD;AAMO,SAAS,OAAO,EAAE,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,WAAW,GAAG,KAAK,GAAgB;AACnG,SACE,gBAAAC;AAAA,IAAC,WAAW;AAAA,IAAX;AAAA,MACC,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,aAAW;AAAA,MACX,MAAM,QAAQ,QAAQ;AAAA,MACtB,cAAY;AAAA,MACZ,eAAa,QAAQ,SAAY;AAAA,MAChC,GAAG;AAAA,MAEH;AAAA,cAAM,gBAAAD,MAAC,WAAW,OAAX,EAAiB,WAAU,oBAAmB,KAAU,KAAI,IAAG,IAAK;AAAA,QAC5E,gBAAAA,MAAC,WAAW,UAAX,EAAoB,WAAU,uBAC7B,0BAAAA,MAAC,WAAQ,MAAY,UAAoB,GAC3C;AAAA;AAAA;AAAA,EACF;AAEJ;AAcO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,SAAOE,WAAU;AAAA,IACf;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA;AAAA,MAEL,MAAM,SAAS,OAAQ,QAAQ;AAAA,MAC/B,WAAW,GAAG,oBAAoB,SAAS;AAAA,MAC3C,aAAa;AAAA,MACb,cAAc;AAAA,MACd,GAAG;AAAA,MACH,UAAU,gBAAAF,MAAC,UAAO,MAAY,UAAoB,KAAU,MAAY;AAAA,IAC1E;AAAA,EACF,CAAC;AACH;;;ACyDO,IAAM,UAAU;","names":["jsx","jsxs","createElement","createElement","jsx","jsxs","window","jsx","jsx","jsxs","jsx","jsxs","useRender","jsx","jsxs","Fragment","jsx","jsxs","useRender","Fragment","jsx","jsxs","Root","Trigger","Content","Field","jsx","jsxs","jsx","jsxs","Field","Field","jsx","Field","jsx","jsxs","useId","jsx","jsxs","useId","useId","jsx","jsxs","useId","Fragment","jsx","jsxs","Root","jsx","Root","Group","Separator","Button","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","createElement","createElement","createElement","clamp","createElement","BaseCheckbox","createContext","useContext","jsx","jsxs","createContext","useContext","Root","Body","BaseCheckbox","useState","Fragment","jsx","jsxs","useState","createContext","useContext","useMemo","jsx","jsxs","createContext","Provider","useContext","useMemo","createElement","Fragment","jsx","jsxs","createElement","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","createElement","jsx","createElement","jsx","useEffect","useId","useRef","useState","useEffect","useRef","useState","useCallback","Fragment","jsx","jsxs","useRef","useState","useEffect","jsx","jsxs","useId","useState","useRef","useEffect","id","name","error","useEffect","useId","useLayoutEffect","useRef","useState","x","Fragment","jsx","jsxs","defaultCountLabel","Badge","useState","useId","useRef","useLayoutEffect","useEffect","toggle","jsx","jsxs","Root","Trigger","Content","Title","Description","Close","jsx","jsxs","Children","createContext","useCallback","useContext","useEffect","useId","useMemo","useRef","useState","jsx","jsxs","createContext","Root","useRef","useState","useCallback","useEffect","useMemo","Header","Progress","Body","useId","Viewport","Children","useContext","jsx","jsxs","jsx","createElement","Fragment","Fragment","jsx","jsxs","createElement","jsx","jsxs","useRender","jsx","jsxs","useRender"]}
1
+ {"version":3,"sources":["../src/utils/cx.ts","../src/components/Button/Button.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/Stack/Stack.tsx","../src/components/Inline/Inline.tsx","../src/components/Kbd/Kbd.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/sheetSwipe.ts","../src/components/Icon/Icon.tsx","../src/icons/icons.gen.tsx","../src/icons/icon-names.gen.ts","../src/components/IconButton/IconButton.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Menu/Menu.tsx","../src/components/Input/Input.tsx","../src/components/Field/FieldShell.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Select/Select.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Banner/Banner.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Progress/Progress.tsx","../src/components/Heading/Heading.tsx","../src/components/Text/Text.tsx","../src/components/Table/Table.tsx","../src/components/Table/useRowSelection.ts","../src/components/Table/rowSelection.ts","../src/components/SelectionBar/SelectionBar.tsx","../src/components/Toast/Toast.tsx","../src/components/Stat/Stat.tsx","../src/components/Chip/Chip.tsx","../src/components/Disclosure/Disclosure.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/FileInput/FileInput.tsx","../src/components/FilePreviewDialog/FilePreviewDialog.tsx","../src/components/FileInput/accept.ts","../src/utils/useMediaQuery.ts","../src/components/PriorityNav/PriorityNav.tsx","../src/components/PriorityNav/fit.ts","../src/components/PriorityNav/place.ts","../src/components/Popover/Popover.tsx","../src/components/BroomIcon/BroomIcon.tsx","../src/components/FullScreenFlow/FullScreenFlow.tsx","../src/components/Score/Score.tsx","../src/components/ReasonList/ReasonList.tsx","../src/components/WordDiff/WordDiff.tsx","../src/components/Quote/Quote.tsx","../src/components/Avatar/Avatar.tsx","../src/index.ts"],"sourcesContent":["/** Joins class names, dropping falsy entries. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ');\n}\n","import type { ComponentPropsWithRef, MouseEvent, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends ComponentPropsWithRef<'button'> {\n /** `primary` for the one main action in a view, `secondary` for the rest, `ghost` in toolbars and rows, `danger` for destructive confirmations. */\n variant?: ButtonVariant | undefined;\n /** 32, 40 or 48px tall. Compact density shrinks each by one step. */\n size?: ButtonSize | undefined;\n /** A 16px icon before the label. */\n iconStart?: ReactNode | undefined;\n /** A 16px icon after the label. */\n iconEnd?: ReactNode | undefined;\n /** Keeps the width, hides the label, shows a spinner, sets `aria-busy` and ignores clicks. */\n loading?: boolean | undefined;\n /** Stretches to the container. */\n fullWidth?: boolean | undefined;\n /** A keyboard hint after the label: `shortcut={<Kbd>N</Kbd>}`. Hidden from assistive tech; announce the key with `aria-keyshortcuts=\"n\"`. Not shown on devices with no fine pointer (touch only). */\n shortcut?: ReactNode | undefined;\n /** Shows only `iconStart` (or `iconEnd`) in a square button; the label stays the accessible name and the shortcut hides. Toggles without remounting, e.g. when a header runs out of room. Pair with a Tooltip carrying the label. */\n iconOnly?: boolean | undefined;\n}\n\n/** The one way to trigger an action. Renders a native `<button>`; `type` defaults to `button`. */\nexport function Button({\n variant = 'primary',\n size = 'md',\n iconStart,\n iconEnd,\n loading = false,\n fullWidth = false,\n shortcut,\n iconOnly = false,\n type = 'button',\n className,\n children,\n onClick,\n ...rest\n}: ButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n return (\n <button\n type={type}\n className={cx('sc-button', className)}\n data-variant={variant}\n data-size={size}\n data-loading={loading || undefined}\n data-full-width={fullWidth || undefined}\n data-icon-only={iconOnly || undefined}\n aria-busy={loading || undefined}\n onClick={handleClick}\n {...rest}\n >\n {iconStart ? (\n <span className=\"sc-button__icon\" aria-hidden=\"true\">\n {iconStart}\n </span>\n ) : null}\n <span className=\"sc-button__label\">{children}</span>\n {iconEnd ? (\n <span className=\"sc-button__icon\" aria-hidden=\"true\">\n {iconEnd}\n </span>\n ) : null}\n {shortcut ? (\n <span className=\"sc-button__shortcut\" aria-hidden=\"true\">\n {shortcut}\n </span>\n ) : null}\n {loading ? <span className=\"sc-button__spinner\" aria-hidden=\"true\" /> : null}\n </button>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\nexport type BadgeVariant = 'soft' | 'solid' | 'outline';\nexport type BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends ComponentPropsWithRef<'span'> {\n /** Color reinforces the status; the word is the status. */\n tone?: BadgeTone | undefined;\n /** `soft` tinted fill (default), `solid` filled, `outline` hairline. */\n variant?: BadgeVariant | undefined;\n /** `md` 24px (default) or `sm` 20px for table rows and Card headers. */\n size?: BadgeSize | undefined;\n /** A 6px dot before the label for scannable lists. */\n dot?: boolean | undefined;\n}\n\n/** One or two words of status beside a thing. Text only; never clickable. */\nexport function Badge({\n tone = 'neutral',\n variant = 'soft',\n size = 'md',\n dot = false,\n className,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n className={cx('sc-badge', className)}\n data-tone={tone}\n data-variant={variant}\n data-size={size}\n {...rest}\n >\n {dot ? <span className=\"sc-badge__dot\" aria-hidden=\"true\" /> : null}\n {children}\n </span>\n );\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { cx } from '../../utils/cx';\n\nexport type CardVariant = 'outlined' | 'elevated' | 'filled' | 'plain';\nexport type CardPadding = 'none' | 'sm' | 'md' | 'lg';\nexport type CardElement = 'div' | 'article' | 'section' | 'nav' | 'li' | 'a' | 'button';\n\nexport interface CardProps extends useRender.ComponentProps<'div'> {\n /** `outlined` hairline (default), `elevated` floats, `filled` is an inset region, `plain` has no surface: a quiet list row that washes on hover and takes the accent wash and border when selected. */\n variant?: CardVariant | undefined;\n /** `none`, `sm` 12px, `md` 16px (default), `lg` 24px. */\n padding?: CardPadding | undefined;\n /** Hover lifts the card and the whole card is the target. Render it as `a` or `button` so it is a real control. */\n interactive?: boolean | undefined;\n /** Accent border with a 1px inset, for the active row or chosen option; on `plain`, the accent wash with a 1px accent border. Also recolours a Score inside. Visual only: pair it with `aria-pressed`, `aria-selected` or `aria-current`. */\n selected?: boolean | undefined;\n /** Element to render when `render` is not given. Use `nav` (with an `aria-label`) for a carded navigation landmark. */\n as?: CardElement | undefined;\n}\n\n/** A bordered surface that groups related content. Compose the inside with Stack and Inline. */\nexport function Card({\n variant = 'outlined',\n padding = 'md',\n interactive = false,\n selected = false,\n as = 'div',\n render,\n className,\n ref,\n ...rest\n}: CardProps) {\n return useRender({\n render,\n ref,\n defaultTagName: as,\n props: {\n className: cx('sc-card', className),\n 'data-variant': variant,\n 'data-padding': padding,\n 'data-interactive': interactive || undefined,\n 'data-selected': selected || undefined,\n ...rest,\n },\n });\n}\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport type { SpacingSize } from '../../types';\nimport { cx } from '../../utils/cx';\n\nexport type StackAlign = 'stretch' | 'start' | 'center' | 'end';\nexport type StackJustify = 'start' | 'center' | 'end' | 'between';\nexport type StackElement =\n | 'div'\n | 'section'\n | 'article'\n | 'ul'\n | 'ol'\n | 'li'\n | 'nav'\n | 'form'\n | 'fieldset'\n | 'header'\n | 'footer'\n | 'main'\n | 'aside'\n | 'dl';\n\nexport interface StackProps extends ComponentPropsWithRef<'div'> {\n /** Gap from the spacing scale. Default `sm` (12px). */\n gap?: SpacingSize | undefined;\n /** Cross-axis alignment. Default `stretch`. */\n align?: StackAlign | undefined;\n /** Main-axis distribution. Default `start`. */\n justify?: StackJustify | undefined;\n /** Element to render. Use `ul`/`ol` for lists and `li` for an item that stacks its own content, so semantics survive the layout. */\n as?: StackElement | undefined;\n /** Lays out as `inline-flex`. */\n inline?: boolean | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Vertical flex layout with a token gap. The only way children should be spaced vertically. */\nexport function Stack({\n gap = 'sm',\n align = 'stretch',\n justify = 'start',\n as = 'div',\n inline = false,\n className,\n ...rest\n}: StackProps) {\n return createElement(as, {\n className: cx('sc-stack', className),\n 'data-gap': gap,\n 'data-align': align,\n 'data-justify': justify,\n 'data-inline': inline || undefined,\n ...rest,\n });\n}\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport type { SpacingSize } from '../../types';\nimport { cx } from '../../utils/cx';\n\nexport type InlineAlign = 'center' | 'start' | 'end' | 'baseline' | 'stretch';\nexport type InlineJustify = 'start' | 'center' | 'end' | 'between';\nexport type InlineElement =\n 'div' | 'span' | 'ul' | 'ol' | 'li' | 'nav' | 'header' | 'footer' | 'p' | 'label' | 'dd';\n\nexport interface InlineProps extends ComponentPropsWithRef<'div'> {\n /** Gap from the spacing scale. Default `xs` (8px). */\n gap?: SpacingSize | undefined;\n /** Cross-axis alignment. Default `center`; use `baseline` when mixing text sizes. */\n align?: InlineAlign | undefined;\n /** Main-axis distribution. Default `start`. */\n justify?: InlineJustify | undefined;\n /** Wraps by default; `false` for toolbars that scroll. */\n wrap?: boolean | undefined;\n /** Element to render. Use `ul`/`ol` for a row of items and `li` for an item laid out as a row. */\n as?: InlineElement | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Horizontal flex layout that wraps. For rows of buttons, badges, metadata and key combinations. */\nexport function Inline({\n gap = 'xs',\n align = 'center',\n justify = 'start',\n wrap = true,\n as = 'div',\n className,\n ...rest\n}: InlineProps) {\n return createElement(as, {\n className: cx('sc-inline', className),\n 'data-gap': gap,\n 'data-align': align,\n 'data-justify': justify,\n 'data-nowrap': wrap ? undefined : '',\n ...rest,\n });\n}\n","import { Children, Fragment, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type KbdProps = ComponentPropsWithRef<'kbd'>;\n\n/** A single key, rendered like a keycap. One Kbd per key; group keys with `Kbd.Group`. */\nfunction KbdBase({ className, ...rest }: KbdProps) {\n return <kbd className={cx('sc-kbd', className)} {...rest} />;\n}\n\nexport interface KbdGroupProps extends ComponentPropsWithRef<'span'> {\n /** The readable combination, announced instead of the symbols: \"Command K\". */\n label: string;\n /** `plus` (default) draws a muted + between keys; `space` leaves a gap. */\n separator?: 'plus' | 'space' | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Groups the keys of one shortcut. */\nfunction KbdGroup({ label, separator = 'plus', className, children, ...rest }: KbdGroupProps) {\n const keys = Children.toArray(children);\n return (\n <span role=\"group\" aria-label={label} className={cx('sc-kbd-group', className)} {...rest}>\n {keys.map((key, i) => (\n <Fragment key={i}>\n {i > 0 && separator === 'plus' ? (\n <span className=\"sc-kbd-group__sep\" aria-hidden=\"true\">\n +\n </span>\n ) : null}\n {key}\n </Fragment>\n ))}\n </span>\n );\n}\n\nexport const Kbd = Object.assign(KbdBase, { Group: KbdGroup });\n","import { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport { createContext, useCallback, useContext, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Inline, type InlineProps } from '../Inline/Inline';\nimport { attachSheetSwipe } from './sheetSwipe';\nimport { XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogVariant = 'dialog' | 'sheet' | 'fullscreen';\n/** How a person asked to close: Esc, a press on the backdrop, or a `Dialog.Close`. */\nexport type DialogCloseRequestReason = 'escape-key' | 'outside-press' | 'close-press';\n\nconst REQUESTABLE: ReadonlySet<string> = new Set<DialogCloseRequestReason>([\n 'escape-key',\n 'outside-press',\n 'close-press',\n]);\n\nexport interface DialogRootProps {\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the dialog opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** When `false`, Esc and backdrop clicks no longer close the dialog. Default `true`. */\n dismissible?: boolean | undefined;\n /**\n * When set, the dialog no longer closes itself: Esc, a backdrop press and every `Dialog.Close` call\n * this with the reason instead, and the app closes it by setting `open` to `false` (for example after\n * a \"Leave for now?\" confirmation). Use with a controlled `open`. `dismissible={false}` still swallows\n * Esc and backdrop presses first.\n */\n onRequestClose?: ((reason: DialogCloseRequestReason) => void) | undefined;\n children?: ReactNode | undefined;\n}\n\nconst DismissibleContext = createContext(true);\n\n/** Owns the open state. Wrap a `Dialog.Trigger` and a `Dialog.Content`. */\nfunction Root({\n dismissible = true,\n onOpenChange,\n onRequestClose,\n open,\n defaultOpen,\n children,\n}: DialogRootProps) {\n return (\n <BaseDialog.Root\n open={open}\n defaultOpen={defaultOpen}\n disablePointerDismissal={!dismissible}\n onOpenChange={(next, details) => {\n if (\n !dismissible &&\n !next &&\n (details.reason === 'escape-key' || details.reason === 'outside-press')\n ) {\n details.cancel();\n return;\n }\n if (!next && onRequestClose && REQUESTABLE.has(details.reason)) {\n details.cancel();\n onRequestClose(details.reason as DialogCloseRequestReason);\n return;\n }\n onOpenChange?.(next);\n }}\n >\n <DismissibleContext.Provider value={dismissible}>{children}</DismissibleContext.Provider>\n </BaseDialog.Root>\n );\n}\n\n/** Opens the dialog. Pass the Button through `render`: `<Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>`. */\nconst Trigger = BaseDialog.Trigger;\n\nexport interface DialogContentProps extends Omit<BaseDialog.Popup.Props, 'className'> {\n /**\n * Maximum width: `sm` 400px for yes/no, `md` 560px (default) for a short form, `lg` 720px rarely.\n * Every size clamps to the viewport minus a 16px gutter, so a 390px phone gets a 358px dialog.\n */\n size?: DialogSize | undefined;\n /**\n * `dialog` (default) centres the popup. `sheet` is the same on wide viewports but below 640px it\n * becomes a bottom sheet: full width, rounded top, title and actions pinned while `Dialog.Body`\n * scrolls, padding that clears the home indicator. Use it for forms and pickers opened from a list.\n * `fullscreen` covers the viewport (inset by 16px with a rounded edge from 900px), slides in from the\n * inline end, keeps clear of the safe areas, and lets `Dialog.Body` scroll between a pinned title and\n * actions; `size` is ignored. It is the surface of `FullScreenFlow`. Pair it with `onRequestClose` on\n * the Root when leaving needs a confirmation.\n */\n variant?: DialogVariant | undefined;\n /**\n * `sheet` only. Below 640px a downward drag on the handle or the header (the top 64px, outside controls\n * and `Dialog.Body`) moves the sheet; letting go past 30% of its height, or flicking down, closes it the\n * way a press on the handle does (the handle is a `Dialog.Close` named \"Dismiss\"). Set `false` where an\n * accidental close loses work; the handle then stays as decoration only. Off whenever the Root is not\n * `dismissible`. Default `true`.\n */\n dismissOnSwipe?: boolean | undefined;\n className?: string | undefined;\n}\n\n/**\n * Portal, backdrop and the popup. Focus moves inside on open and returns to the trigger on close. A dialog opened\n * from inside another has its own backdrop too, over the first dialog.\n * Menus, selects and tooltips opened from inside render above it (`--sc-z-dropdown` > `--sc-z-dialog`).\n */\nfunction Content({\n size = 'md',\n variant = 'dialog',\n dismissOnSwipe = true,\n className,\n children,\n ...rest\n}: DialogContentProps) {\n const dismissible = useContext(DismissibleContext);\n const isSheet = variant === 'sheet';\n const swipe = isSheet && dismissOnSwipe && dismissible;\n return (\n <BaseDialog.Portal>\n {/* `forceRender`: Base UI drops the backdrop of a dialog opened inside another, so a sheet over a full-screen\n dialog didn't dim it. The nested one's scrim sits above its parent's popup (dialog.css). */}\n <BaseDialog.Backdrop className=\"sc-dialog__backdrop\" forceRender />\n <BaseDialog.Popup\n className={cx('sc-dialog__popup', className)}\n data-size={size}\n data-variant={variant}\n data-swipe-dismiss={swipe ? '' : undefined}\n aria-modal=\"true\"\n {...rest}\n >\n {isSheet && <SheetHandle swipe={swipe} />}\n {children}\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n );\n}\n\n/**\n * The grab handle at the top of a docked sheet (hidden from 640px). With swipe on it is a `Dialog.Close`:\n * Enter, Space or a tap closes, and a drag from it or the header follows the finger.\n */\nfunction SheetHandle({ swipe }: { swipe: boolean }) {\n const attach = useCallback(\n (node: HTMLButtonElement | null) => (node ? attachSheetSwipe(node) : undefined),\n [],\n );\n if (!swipe) return <div className=\"sc-dialog__handle\" aria-hidden=\"true\" />;\n return <BaseDialog.Close ref={attach} className=\"sc-dialog__handle\" aria-label=\"Dismiss\" />;\n}\n\nexport interface DialogTitleProps extends Omit<BaseDialog.Title.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Required. Labels the dialog; a question or a statement. Renders an `<h2>`. */\nfunction Title({ className, ...rest }: DialogTitleProps) {\n return <BaseDialog.Title className={cx('sc-dialog__title', className)} {...rest} />;\n}\n\nexport interface DialogDescriptionProps extends Omit<BaseDialog.Description.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Optional, muted. Says what will happen. */\nfunction Description({ className, ...rest }: DialogDescriptionProps) {\n return <BaseDialog.Description className={cx('sc-dialog__description', className)} {...rest} />;\n}\n\nexport type DialogBodyProps = ComponentPropsWithRef<'div'>;\n\n/** Free content between the description and the actions. In a `sheet` it is the part that scrolls. */\nfunction Body({ className, ...rest }: DialogBodyProps) {\n return <div className={cx('sc-dialog__body', className)} {...rest} />;\n}\n\nexport type DialogActionsProps = Omit<InlineProps, 'justify'>;\n\n/** Right-aligned row of Buttons. Put the confirming action last. */\nfunction Actions({ className, ...rest }: DialogActionsProps) {\n return <Inline justify=\"end\" className={cx('sc-dialog__actions', className)} {...rest} />;\n}\n\nexport interface DialogCloseProps extends Omit<BaseDialog.Close.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** With no children or `render`, the × in the corner. Otherwise wraps any Button: `<Dialog.Close render={<Button variant=\"secondary\" />}>Cancel</Dialog.Close>`. */\nfunction Close({ className, children, render, ...rest }: DialogCloseProps) {\n if (children === undefined && render === undefined) {\n return (\n <BaseDialog.Close className={cx('sc-dialog__close', className)} aria-label=\"Close\" {...rest}>\n <XIcon />\n </BaseDialog.Close>\n );\n }\n return (\n <BaseDialog.Close className={className} render={render} {...rest}>\n {children}\n </BaseDialog.Close>\n );\n}\n\n/** A modal that interrupts for a decision or a short form. Built on Base UI's Dialog. */\nexport const Dialog = { Root, Trigger, Content, Title, Description, Body, Actions, Close };\n","/**\n * Swipe down to dismiss a `Dialog variant=\"sheet\"` docked to the bottom edge (below 640px).\n *\n * A drag may start on the handle, or anywhere in the top `zone` px of the sheet outside `Dialog.Body` and\n * outside controls (buttons, links, fields). It never starts inside `Dialog.Body`, scrolled or not: the\n * body keeps native scrolling, and a touch the browser takes for a scroll ends in `pointercancel`, which\n * springs the sheet back. A release dismisses by pressing the handle, which is a `Dialog.Close`, so a\n * swipe goes wherever a press on the handle goes: `onOpenChange(false)`, or `onRequestClose('close-press')`\n * when the Root has it.\n */\nexport const SHEET_SWIPE = {\n /** Height in px, from the sheet's top edge, where a drag may start: the handle and the header. */\n zone: 64,\n /** Movement in px before a press becomes a drag, so taps stay taps. */\n slop: 6,\n /** Fraction of the sheet's height past which a release dismisses. */\n distance: 0.3,\n /** Release speed in px/ms: this fast downward dismisses at any distance, this fast upward keeps it open. */\n velocity: 0.5,\n /** Only samples this recent (ms) before the release count toward its speed. */\n window: 100,\n} as const;\n\nexport type DragIntent = 'pending' | 'drag' | 'cancel';\n\n/** Whether a press that has moved by (`dx`, `dy`) is still undecided, a downward drag, or something else. */\nexport function dragIntent(dx: number, dy: number, slop: number = SHEET_SWIPE.slop): DragIntent {\n if (Math.abs(dx) < slop && Math.abs(dy) < slop) return 'pending';\n return dy > 0 && dy >= Math.abs(dx) ? 'drag' : 'cancel';\n}\n\nexport interface SwipeSample {\n /** Event time in ms. */\n t: number;\n /** `clientY` in px. */\n y: number;\n}\n\n/**\n * Speed in px/ms (positive is downward) over the samples within `window` ms of the last one. The last\n * sample is the release itself, so a finger that stops before lifting reads as 0.\n */\nexport function releaseVelocity(\n samples: readonly SwipeSample[],\n window: number = SHEET_SWIPE.window,\n): number {\n const last = samples[samples.length - 1];\n if (!last) return 0;\n const first = samples.find((s) => last.t - s.t <= window) ?? last;\n const dt = last.t - first.t;\n return dt > 0 ? (last.y - first.y) / dt : 0;\n}\n\nexport interface SwipeRelease {\n /** How far the sheet has moved down, in px. */\n offset: number;\n /** The sheet's height in px. */\n height: number;\n /** Release speed in px/ms, positive downward. */\n velocity: number;\n}\n\n/** Dismiss on a quick downward flick, or past `distance` of the height unless flicked back up. */\nexport function shouldDismissSheet({ offset, height, velocity }: SwipeRelease): boolean {\n if (offset <= 0 || height <= 0) return false;\n if (velocity >= SHEET_SWIPE.velocity) return true;\n if (velocity <= -SHEET_SWIPE.velocity) return false;\n return offset >= height * SHEET_SWIPE.distance;\n}\n\nconst IGNORE = 'a,button,input,select,textarea,label,[role=\"button\"],[contenteditable]';\n\n/**\n * Wires the gesture onto the handle's parent, the popup. Returns the cleanup. Does nothing while the handle\n * is hidden (wide viewports, where the sheet is a centred dialog).\n */\nexport function attachSheetSwipe(handle: HTMLElement): () => void {\n const popup = handle.parentElement;\n if (!popup) return () => {};\n\n let press: { id: number; x: number; y: number } | null = null;\n let dragging = false;\n let height = 0;\n let samples: SwipeSample[] = [];\n let suppressClick = false;\n\n const startsDrag = (e: PointerEvent) => {\n if (!e.isPrimary || (e.pointerType === 'mouse' && e.button !== 0)) return false;\n if (handle.getClientRects().length === 0) return false;\n const target = e.target instanceof Element ? e.target : null;\n if (!target || handle.contains(target)) return true;\n if (target.closest(IGNORE) || target.closest('.sc-dialog__body')) return false;\n return e.clientY - popup.getBoundingClientRect().top <= SHEET_SWIPE.zone;\n };\n\n const settle = () => {\n delete popup.dataset.swiping;\n popup.style.removeProperty('transform');\n };\n\n const onDown = (e: PointerEvent) => {\n if (press || !startsDrag(e)) return;\n press = { id: e.pointerId, x: e.clientX, y: e.clientY };\n samples = [{ t: e.timeStamp, y: e.clientY }];\n };\n\n const onMove = (e: PointerEvent) => {\n if (!press || e.pointerId !== press.id) return;\n const dy = e.clientY - press.y;\n if (!dragging) {\n const intent = dragIntent(e.clientX - press.x, dy);\n if (intent === 'pending') return;\n if (intent === 'cancel') {\n press = null;\n return;\n }\n dragging = true;\n height = popup.getBoundingClientRect().height;\n popup.dataset.swiping = '';\n popup.setPointerCapture?.(e.pointerId);\n window.getSelection()?.removeAllRanges();\n }\n e.preventDefault();\n samples.push({ t: e.timeStamp, y: e.clientY });\n if (samples.length > 32) samples = samples.slice(-16);\n popup.style.transform = `translateY(${Math.max(0, dy)}px)`;\n };\n\n const end = (e: PointerEvent, cancelled: boolean) => {\n if (!press || e.pointerId !== press.id) return;\n const startY = press.y;\n const wasDragging = dragging;\n press = null;\n dragging = false;\n if (!wasDragging) return;\n // The click that follows a drag is not a press on whatever sits under the pointer.\n window.setTimeout(() => {\n suppressClick = false;\n }, 0);\n if (cancelled) {\n suppressClick = true;\n settle();\n return;\n }\n samples.push({ t: e.timeStamp, y: e.clientY });\n const release = {\n offset: Math.max(0, e.clientY - startY),\n height,\n velocity: releaseVelocity(samples),\n };\n if (shouldDismissSheet(release)) {\n // Keep the offset: the exit transition slides the rest of the way from here.\n delete popup.dataset.swiping;\n handle.click();\n suppressClick = true;\n // `onRequestClose` may have kept it open (a \"Discard changes?\" step): spring back.\n window.requestAnimationFrame(() => {\n if (popup.isConnected && popup.hasAttribute('data-open')) settle();\n });\n } else {\n suppressClick = true;\n settle();\n }\n };\n const onUp = (e: PointerEvent) => end(e, false);\n const onCancel = (e: PointerEvent) => end(e, true);\n\n const onClick = (e: MouseEvent) => {\n if (!suppressClick) return;\n suppressClick = false;\n e.preventDefault();\n e.stopPropagation();\n };\n\n popup.addEventListener('pointerdown', onDown);\n popup.addEventListener('pointermove', onMove);\n popup.addEventListener('pointerup', onUp);\n popup.addEventListener('pointercancel', onCancel);\n popup.addEventListener('click', onClick, true);\n return () => {\n popup.removeEventListener('pointerdown', onDown);\n popup.removeEventListener('pointermove', onMove);\n popup.removeEventListener('pointerup', onUp);\n popup.removeEventListener('pointercancel', onCancel);\n popup.removeEventListener('click', onClick, true);\n settle();\n };\n}\n","import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'em';\n\nexport interface IconProps extends Omit<ComponentPropsWithRef<'svg'>, 'children'> {\n /** `xs` 12, `sm` 14, `md` 16 (default), `lg` 20, `xl` 24, or `em` to follow the surrounding font size. */\n size?: IconSize | undefined;\n /** Gives the icon an accessible name (`role=\"img\"`). Without it the icon is decorative and hidden from assistive tech. */\n title?: string | undefined;\n /** The glyph: `<path>`, `<circle>` … on a 16×16 grid, stroke `currentColor`. */\n children: ReactNode;\n}\n\n/** Props of a shipped icon such as `PlayIcon`: everything `Icon` takes except the glyph. */\nexport type IconGlyphProps = Omit<IconProps, 'children'>;\n\n/**\n * The frame every icon renders in: a 16×16 outline in `currentColor`, sized by `size`, decorative unless\n * `title` is given. Use the shipped `<Name>Icon` components, or wrap your own paths.\n */\nexport function Icon({ size = 'md', title, className, children, ...rest }: IconProps) {\n return (\n <svg\n className={cx('sc-icon', className)}\n data-size={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n focusable=\"false\"\n aria-hidden={title ? undefined : true}\n role={title ? 'img' : undefined}\n aria-label={title}\n {...rest}\n >\n {children}\n </svg>\n );\n}\n","// Generated by scripts/build-icons.mjs from src/icons/svg/*.svg. Do not edit; add an SVG and run `pnpm build`.\nimport { Icon, type IconGlyphProps } from '../components/Icon/Icon';\n\n/** `archive` */\nexport function ArchiveIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2.25\" y=\"2.75\" width=\"11.5\" height=\"3\" rx=\".75\" />\n <path d=\"M3.25 5.75v6.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1v-6.5M6.5 8.75h3\" />\n </Icon>\n );\n}\n\n/** `arrow-down` */\nexport function ArrowDownIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 3v10M4 9l4 4 4-4\" />\n </Icon>\n );\n}\n\n/** `arrow-left` */\nexport function ArrowLeftIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M13 8H3M7 4 3 8l4 4\" />\n </Icon>\n );\n}\n\n/** `arrow-right` */\nexport function ArrowRightIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3 8h10M9 4l4 4-4 4\" />\n </Icon>\n );\n}\n\n/** `arrow-up` */\nexport function ArrowUpIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 13V3M4 7l4-4 4 4\" />\n </Icon>\n );\n}\n\n/** `bell` */\nexport function BellIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M4 6.5a4 4 0 0 1 8 0v3l1.25 2H2.75L4 9.5z\" />\n <path d=\"M6.5 13.5a1.5 1.5 0 0 0 3 0\" />\n </Icon>\n );\n}\n\n/** `briefcase` */\nexport function BriefcaseIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2\" y=\"4.75\" width=\"12\" height=\"8.5\" rx=\"1\" />\n <path d=\"M5.5 4.75V3.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1.25M2 8.5h12\" />\n </Icon>\n );\n}\n\n/** `calendar` */\nexport function CalendarIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2.5\" y=\"3.25\" width=\"11\" height=\"10\" rx=\"1\" />\n <path d=\"M2.5 6.75h11M5.5 1.75v3M10.5 1.75v3\" />\n </Icon>\n );\n}\n\n/** `check` */\nexport function CheckIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m3 8.5 3.5 3.5L13 4.5\" />\n </Icon>\n );\n}\n\n/** `chevron-down` */\nexport function ChevronDownIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m4 6 4 4 4-4\" />\n </Icon>\n );\n}\n\n/** `chevron-left` */\nexport function ChevronLeftIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m10 4-4 4 4 4\" />\n </Icon>\n );\n}\n\n/** `chevron-right` */\nexport function ChevronRightIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m6 4 4 4-4 4\" />\n </Icon>\n );\n}\n\n/** `chevron-up` */\nexport function ChevronUpIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m4 10 4-4 4 4\" />\n </Icon>\n );\n}\n\n/** `circle-check` */\nexport function CircleCheckIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"m5.25 8 2 2 3.5-4\" />\n </Icon>\n );\n}\n\n/** `circle-x` */\nexport function CircleXIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"m6 6 4 4M10 6l-4 4\" />\n </Icon>\n );\n}\n\n/** `clock` */\nexport function ClockIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 4.75V8l2.25 1.5\" />\n </Icon>\n );\n}\n\n/** `copy` */\nexport function CopyIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"6\" y=\"6\" width=\"7.5\" height=\"7.5\" rx=\"1\" />\n <path d=\"M4 10H3.25a1 1 0 0 1-1-1V3.25a1 1 0 0 1 1-1H9a1 1 0 0 1 1 1V4\" />\n </Icon>\n );\n}\n\n/** `document` */\nexport function DocumentIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M9 2.25H4.5a1 1 0 0 0-1 1v9.5a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V5.75z\" />\n <path d=\"M9 2.25v3.5h3.5M6 8.5h4M6 11h4\" />\n </Icon>\n );\n}\n\n/** `download` */\nexport function DownloadIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 2.5v8M4.75 7.25 8 10.5l3.25-3.25\" />\n <path d=\"M2.75 11v1.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1V11\" />\n </Icon>\n );\n}\n\n/** `edit` */\nexport function EditIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m10.75 2.75 2.5 2.5-7.5 7.5H3.25v-2.5z\" />\n </Icon>\n );\n}\n\n/** `external-link` */\nexport function ExternalLinkIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M9 2.75h4.25V7M13.25 2.75 7.5 8.5\" />\n <path d=\"M11.25 9v3.25a1 1 0 0 1-1 1h-6.5a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1H7\" />\n </Icon>\n );\n}\n\n/** `eye` */\nexport function EyeIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M1.75 8s2.25-4.25 6.25-4.25S14.25 8 14.25 8s-2.25 4.25-6.25 4.25S1.75 8 1.75 8z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </Icon>\n );\n}\n\n/** `eye-off` */\nexport function EyeOffIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M6.37 3.99C6.87 3.84 7.42 3.75 8 3.75C12 3.75 14.25 8 14.25 8C14.25 8 13.65 9.13 12.53 10.22\" />\n <path d=\"M9.63 12.01C9.13 12.16 8.58 12.25 8 12.25C4 12.25 1.75 8 1.75 8C1.75 8 2.35 6.87 3.47 5.78\" />\n <path d=\"M9.41 9.41A2 2 0 0 1 6.59 6.59\" />\n <path d=\"M2.5 2.5l11 11\" />\n </Icon>\n );\n}\n\n/** `filter` */\nexport function FilterIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.5 3h11l-4.25 5v4.25L6.75 13.5V8z\" />\n </Icon>\n );\n}\n\n/** `flag` */\nexport function FlagIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3.5 14V2.75\" />\n <path d=\"M3.5 2.75h8.75l-2.25 3 2.25 3H3.5\" />\n </Icon>\n );\n}\n\n/** `inbox` */\nexport function InboxIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2 9v3.25a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9l-1.6-4.6a1 1 0 0 0-.95-.65H4.55a1 1 0 0 0-.95.65z\" />\n <path d=\"M2 9h3.25l1 2h3.5l1-2H14\" />\n </Icon>\n );\n}\n\n/** `info` */\nexport function InfoIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 7.25V11M8 5.25v.01\" />\n </Icon>\n );\n}\n\n/** `link` */\nexport function LinkIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M6.75 9.25a2.5 2.5 0 0 0 3.54 0l2-2a2.5 2.5 0 0 0-3.54-3.54l-.75.75\" />\n <path d=\"M9.25 6.75a2.5 2.5 0 0 0-3.54 0l-2 2a2.5 2.5 0 0 0 3.54 3.54l.75-.75\" />\n </Icon>\n );\n}\n\n/** `mail` */\nexport function MailIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"2\" y=\"3.5\" width=\"12\" height=\"9\" rx=\"1\" />\n <path d=\"m2.5 4.5 5.5 4.25L13.5 4.5\" />\n </Icon>\n );\n}\n\n/** `map-pin` */\nexport function MapPinIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 14s4.5-3.9 4.5-7.5a4.5 4.5 0 1 0-9 0C3.5 10.1 8 14 8 14z\" />\n <circle cx=\"8\" cy=\"6.5\" r=\"1.5\" />\n </Icon>\n );\n}\n\n/** `menu` */\nexport function MenuIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.5 4.5h11M2.5 8h11M2.5 11.5h11\" />\n </Icon>\n );\n}\n\n/** `minus` */\nexport function MinusIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3 8h10\" />\n </Icon>\n );\n}\n\n/** `moon` */\nexport function MoonIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M13.25 9.5A5.5 5.5 0 0 1 6.5 2.75 5.5 5.5 0 1 0 13.25 9.5z\" />\n </Icon>\n );\n}\n\n/** `more-horizontal` */\nexport function MoreHorizontalIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"3.5\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n );\n}\n\n/** `more-vertical` */\nexport function MoreVerticalIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"3.5\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"12.5\" r=\"1.25\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n );\n}\n\n/** `pause` */\nexport function PauseIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <rect x=\"3.75\" y=\"2.75\" width=\"3\" height=\"10.5\" rx=\".75\" />\n <rect x=\"9.25\" y=\"2.75\" width=\"3\" height=\"10.5\" rx=\".75\" />\n </Icon>\n );\n}\n\n/** `play` */\nexport function PlayIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M4.5 2.75v10.5L13 8z\" />\n </Icon>\n );\n}\n\n/** `plus` */\nexport function PlusIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 3v10M3 8h10\" />\n </Icon>\n );\n}\n\n/** `refresh` */\nexport function RefreshIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.75 8a5.25 5.25 0 0 1 9-3.7l1.5 1.45\" />\n <path d=\"M13.25 2.25v3.5h-3.5\" />\n <path d=\"M13.25 8a5.25 5.25 0 0 1-9 3.7l-1.5-1.45\" />\n <path d=\"M2.75 13.75v-3.5h3.5\" />\n </Icon>\n );\n}\n\n/** `search` */\nexport function SearchIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <path d=\"m10.5 10.5 3 3\" />\n </Icon>\n );\n}\n\n/** `settings` */\nexport function SettingsIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M13.01 6.42 14.67 6.94v2.12l-1.66.52-.35.84.8 1.55-1.49 1.49-1.55-.8-.84.35-.52 1.66H6.94l-.52-1.66-.84-.35-1.55.8-1.49-1.49.8-1.55-.35-.84-1.66-.52V6.94l1.66-.52.35-.84-.8-1.55 1.49-1.49 1.55.8.84-.35.52-1.66h2.12l.52 1.66.84.35 1.55-.8 1.49 1.49-.8 1.55z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2.25\" />\n </Icon>\n );\n}\n\n/** `star` */\nexport function StarIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"m8 2.25 1.8 3.8 4.2.55-3.1 2.9.8 4.15L8 11.6l-3.7 2.05.8-4.15L2 6.6l4.2-.55z\" />\n </Icon>\n );\n}\n\n/** `sun` */\nexport function SunIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"3\" />\n <path d=\"M8 1.75v1.5M8 12.75v1.5M1.75 8h1.5M12.75 8h1.5M3.58 3.58l1.06 1.06M11.36 11.36l1.06 1.06M3.58 12.42l1.06-1.06M11.36 4.64l1.06-1.06\" />\n </Icon>\n );\n}\n\n/** `thumbs-down` */\nexport function ThumbsDownIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M5 2.5H3a.5.5 0 0 0-.5.5v5.5a.5.5 0 0 0 .5.5h2\" />\n <path d=\"M5 9l2.5 4.5a1.5 1.5 0 0 0 1.5-1.5V9.5h3.25a1.25 1.25 0 0 0 1.23-1.45l-.9-5a1.25 1.25 0 0 0-1.23-1.05H5z\" />\n </Icon>\n );\n}\n\n/** `thumbs-up` */\nexport function ThumbsUpIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M5 13.5H3a.5.5 0 0 1-.5-.5V7.5A.5.5 0 0 1 3 7h2\" />\n <path d=\"M5 7l2.5-4.5a1.5 1.5 0 0 1 1.5 1.5v2.5h3.25a1.25 1.25 0 0 1 1.23 1.45l-.9 5a1.25 1.25 0 0 1-1.23 1.05H5z\" />\n </Icon>\n );\n}\n\n/** `trash` */\nexport function TrashIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.75 4.25h10.5M6.25 4.25V3a.75.75 0 0 1 .75-.75h2A.75.75 0 0 1 9.75 3v1.25\" />\n <path d=\"M4 4.25l.5 8.5a1 1 0 0 0 1 .95h5a1 1 0 0 0 1-.95l.5-8.5\" />\n <path d=\"M6.5 7v4M9.5 7v4\" />\n </Icon>\n );\n}\n\n/** `undo` */\nexport function UndoIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M3 7h7a3.5 3.5 0 0 1 0 7H6\" />\n <path d=\"M6 4 3 7l3 3\" />\n </Icon>\n );\n}\n\n/** `user` */\nexport function UserIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"5.25\" r=\"2.75\" />\n <path d=\"M2.75 13.75a5.25 5.25 0 0 1 10.5 0\" />\n </Icon>\n );\n}\n\n/** `warning` */\nexport function WarningIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 2.5 1.75 13.25h12.5z\" />\n <path d=\"M8 6.5v3M8 11.5v.01\" />\n </Icon>\n );\n}\n\n/** `x` */\nexport function XIcon(props: IconGlyphProps) {\n return (\n <Icon {...props}>\n <path d=\"M4 4l8 8M12 4l-8 8\" />\n </Icon>\n );\n}\n","// Generated by scripts/build-icons.mjs from src/icons/svg/*.svg. Do not edit; add an SVG and run `pnpm build`.\n/** Every icon shipped by this package, as `<Name>Icon` components. */\nexport const iconNames = [\n 'archive',\n 'arrow-down',\n 'arrow-left',\n 'arrow-right',\n 'arrow-up',\n 'bell',\n 'briefcase',\n 'calendar',\n 'check',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'circle-check',\n 'circle-x',\n 'clock',\n 'copy',\n 'document',\n 'download',\n 'edit',\n 'external-link',\n 'eye',\n 'eye-off',\n 'filter',\n 'flag',\n 'inbox',\n 'info',\n 'link',\n 'mail',\n 'map-pin',\n 'menu',\n 'minus',\n 'moon',\n 'more-horizontal',\n 'more-vertical',\n 'pause',\n 'play',\n 'plus',\n 'refresh',\n 'search',\n 'settings',\n 'star',\n 'sun',\n 'thumbs-down',\n 'thumbs-up',\n 'trash',\n 'undo',\n 'user',\n 'warning',\n 'x',\n] as const;\nexport type IconName = (typeof iconNames)[number];\n","import { useRender } from '@base-ui/react/use-render';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { Tooltip, type TooltipSide } from '../Tooltip/Tooltip';\nimport type { ButtonSize, ButtonVariant } from '../Button/Button';\nimport { cx } from '../../utils/cx';\n\nexport type IconButtonDotTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface IconButtonProps extends Omit<useRender.ComponentProps<'button'>, 'children' | 'aria-label'> {\n /** Required. The accessible name, and the tooltip text when `tooltip` is `true`. */\n label: string;\n /** The icon, usually a shipped `<Name>Icon`. It is decorative; `label` names the button. Optional only so a popup trigger can supply it through `render`. */\n children?: ReactNode | undefined;\n /** `ghost` (default) in toolbars and rows, `secondary` when it must read as a button, `primary` and `danger` rarely. */\n variant?: ButtonVariant | undefined;\n /** Square: 32, 40 or 48px. Compact density shrinks each by one step. */\n size?: ButtonSize | undefined;\n /** `true` shows `label` as a tooltip on hover and focus; a string shows that text instead. */\n tooltip?: boolean | string | undefined;\n /** Side the tooltip opens on. Default `top`. */\n tooltipSide?: TooltipSide | undefined;\n /** Fully round, for avatars and floating actions. */\n round?: boolean | undefined;\n /** Shows a spinner, sets `aria-busy` and ignores clicks. */\n loading?: boolean | undefined;\n /** A status dot in the top-left corner, ringed in `--sc-icon-button-dot-ring` (default `surface-default`). Decorative: put the status in `label` too (\"Sweeps: paused\"). */\n dot?: IconButtonDotTone | undefined;\n}\n\n/**\n * A square Button for one icon. Always named by `label`; use `tooltip` to show that name on hover.\n * Renders a `<button>` unless `render` gives another element: `render={<a href=\"/settings\" />}` or a\n * Next.js `<Link href=\"/settings\" />` makes it a link with the same look and name.\n */\nexport function IconButton({\n label,\n children,\n variant = 'ghost',\n size = 'md',\n tooltip,\n tooltipSide = 'top',\n round = false,\n loading = false,\n dot,\n type,\n className,\n onClick,\n render,\n ref,\n ...rest\n}: IconButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n const button = useRender({\n render,\n ref,\n defaultTagName: 'button',\n props: {\n // `type` only means something on a real button; a rendered link keeps its own attributes.\n type: render ? type : (type ?? 'button'),\n className: cx('sc-button', 'sc-icon-button', className),\n 'data-variant': variant,\n 'data-size': size,\n 'data-round': round || undefined,\n 'data-loading': loading || undefined,\n 'aria-busy': loading || undefined,\n 'aria-label': label,\n onClick: handleClick,\n ...rest,\n children: (\n <>\n <span className=\"sc-button__icon\" aria-hidden=\"true\">\n {children}\n </span>\n {loading ? <span className=\"sc-button__spinner\" aria-hidden=\"true\" /> : null}\n {dot ? <span className=\"sc-icon-button__dot\" data-tone={dot} aria-hidden=\"true\" /> : null}\n </>\n ),\n },\n });\n if (!tooltip) return button;\n return (\n <Tooltip content={tooltip === true ? label : tooltip} side={tooltipSide}>\n {button}\n </Tooltip>\n );\n}\n","import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\nimport type { ReactElement, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type TooltipSide = 'top' | 'bottom' | 'left' | 'right';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\nexport interface TooltipProps {\n /** The hint. Short text; never anything the user cannot do without. */\n content: ReactNode;\n /** The trigger: one element that takes a ref and spreads props, such as `IconButton`, `Button` or `Badge`. */\n children: ReactElement;\n /** Which side of the trigger the hint opens on; flips when there is no room. Default `top`. */\n side?: TooltipSide | undefined;\n /** Alignment along that side. Default `center`. */\n align?: TooltipAlign | undefined;\n /** Hover delay in ms before opening. Default 300; inside `Tooltip.Provider` sibling tooltips open instantly once one is open. */\n delay?: number | undefined;\n /** Delay in ms before closing. Default 0. */\n closeDelay?: number | undefined;\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the hint opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Never opens. */\n disabled?: boolean | undefined;\n className?: string | undefined;\n}\n\n/**\n * A hint that opens on hover and keyboard focus. Supplementary only: touch devices never see it and\n * screen readers hear the trigger's own name, so the trigger must already be labelled.\n */\nfunction TooltipBase({\n content,\n children,\n side = 'top',\n align = 'center',\n delay = 300,\n closeDelay,\n open,\n defaultOpen,\n onOpenChange,\n disabled,\n className,\n}: TooltipProps) {\n return (\n <BaseTooltip.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange ? (next) => onOpenChange(next) : undefined}\n disabled={disabled}\n >\n <BaseTooltip.Trigger render={children} delay={delay} closeDelay={closeDelay} />\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner side={side} align={align} sideOffset={6} className=\"sc-tooltip__positioner\">\n <BaseTooltip.Popup role=\"tooltip\" className={cx('sc-tooltip', className)}>\n <BaseTooltip.Arrow className=\"sc-tooltip__arrow\" />\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n}\n\n/** Wrap a toolbar or a row of icon buttons so moving between them skips the delay. */\nconst Provider = BaseTooltip.Provider;\n\nexport const Tooltip = Object.assign(TooltipBase, { Provider });\n","import { Menu as BaseMenu } from '@base-ui/react/menu';\nimport { useId, type ReactNode } from 'react';\nimport { Button } from '../Button/Button';\nimport { CheckIcon, ChevronDownIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type MenuSide = 'top' | 'bottom' | 'left' | 'right';\nexport type MenuAlign = 'start' | 'center' | 'end';\nexport type MenuItemTone = 'default' | 'danger';\n\nexport interface MenuRootProps {\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the menu opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Disables the trigger. */\n disabled?: boolean | undefined;\n /** Default `true`: the page behind the menu is inert until it closes. */\n modal?: boolean | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Owns the open state. Wrap a `Menu.Trigger` and a `Menu.Content`. */\nfunction Root({ open, defaultOpen, onOpenChange, disabled, modal = true, children }: MenuRootProps) {\n return (\n <BaseMenu.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange ? (next) => onOpenChange(next) : undefined}\n disabled={disabled}\n modal={modal}\n >\n {children}\n </BaseMenu.Root>\n );\n}\n\nexport interface MenuTriggerProps extends Omit<BaseMenu.Trigger.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * Opens the menu. With no `render` it is a secondary Button with a chevron; pass any Button or\n * IconButton through `render`: `<Menu.Trigger render={<IconButton label=\"More\" />}><MoreHorizontalIcon /></Menu.Trigger>`.\n */\nfunction Trigger({ render, className, children, ...rest }: MenuTriggerProps) {\n return (\n <BaseMenu.Trigger\n render={render ?? <Button variant=\"secondary\" iconEnd={<ChevronDownIcon />} className={className} />}\n className={render ? className : undefined}\n {...rest}\n >\n {children}\n </BaseMenu.Trigger>\n );\n}\n\nexport interface MenuContentProps extends Omit<BaseMenu.Popup.Props, 'className'> {\n /** Side of the trigger the menu opens on; flips when there is no room. Default `bottom`. */\n side?: MenuSide | undefined;\n /** Alignment along that side. Default `start`. */\n align?: MenuAlign | undefined;\n /** Distance from the trigger in px. Default 4. */\n sideOffset?: number | undefined;\n className?: string | undefined;\n}\n\n/** Portal, positioner and the popup. Items go inside. */\nfunction Content({\n side = 'bottom',\n align = 'start',\n sideOffset = 4,\n className,\n children,\n ...rest\n}: MenuContentProps) {\n return (\n <BaseMenu.Portal>\n <BaseMenu.Positioner side={side} align={align} sideOffset={sideOffset} className=\"sc-menu__positioner\">\n <BaseMenu.Popup className={cx('sc-menu', className)} {...rest}>\n {children}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n );\n}\n\ninterface ItemSlots {\n /** A 16px icon before the label. Decorative: hidden from assistive tech. */\n icon?: ReactNode | undefined;\n /**\n * A muted second line under the label that says what the item does. It is the item's accessible\n * description (`aria-describedby`), not part of its name.\n */\n description?: ReactNode | undefined;\n /** Muted text at the end: a shortcut (`<Kbd>`) or a count. */\n trailing?: ReactNode | undefined;\n /** `danger` for destructive actions; put them last, after a separator. */\n tone?: MenuItemTone | undefined;\n}\n\ntype AriaRefs = { 'aria-labelledby'?: string | undefined; 'aria-describedby'?: string | undefined };\n\n/**\n * The item's body, and the ARIA that goes on the item. With a description, the name comes from the label\n * (and trailing text) through `aria-labelledby`, so the description line is not read twice; ids the caller\n * passes are kept in front.\n */\nfunction useItemBody(\n {\n icon,\n description,\n trailing,\n children,\n }: Pick<ItemSlots, 'icon' | 'description' | 'trailing'> & {\n children?: ReactNode;\n },\n aria: AriaRefs,\n): [ReactNode, AriaRefs] {\n const id = useId();\n const hasDescription = description !== undefined && description !== null && description !== false;\n const hasTrailing = trailing !== undefined;\n const join = (...ids: (string | false | undefined)[]) => ids.filter(Boolean).join(' ') || undefined;\n const body = (\n <>\n <span className=\"sc-menu__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n <span className=\"sc-menu__label\" id={hasDescription ? `${id}-label` : undefined}>\n {children}\n </span>\n {hasDescription ? (\n <span className=\"sc-menu__description\" id={`${id}-description`}>\n {description}\n </span>\n ) : null}\n {hasTrailing ? (\n <span className=\"sc-menu__trailing\" id={hasDescription ? `${id}-trailing` : undefined}>\n {trailing}\n </span>\n ) : null}\n </>\n );\n if (!hasDescription) return [body, aria];\n return [\n body,\n {\n 'aria-labelledby': aria['aria-labelledby'] ?? join(`${id}-label`, hasTrailing && `${id}-trailing`),\n 'aria-describedby': join(aria['aria-describedby'], `${id}-description`),\n },\n ];\n}\n\nexport interface MenuItemProps extends Omit<BaseMenu.Item.Props, 'className'>, ItemSlots {\n className?: string | undefined;\n}\n\n/** One action. Closes the menu when activated. */\nfunction Item({\n icon,\n description,\n trailing,\n tone = 'default',\n className,\n children,\n 'aria-labelledby': labelledBy,\n 'aria-describedby': describedBy,\n ...rest\n}: MenuItemProps) {\n const [body, aria] = useItemBody(\n { icon, description, trailing, children },\n { 'aria-labelledby': labelledBy, 'aria-describedby': describedBy },\n );\n return (\n <BaseMenu.Item className={cx('sc-menu__item', className)} data-tone={tone} {...aria} {...rest}>\n {body}\n </BaseMenu.Item>\n );\n}\n\nexport interface MenuLinkItemProps extends Omit<BaseMenu.LinkItem.Props, 'className'>, ItemSlots {\n className?: string | undefined;\n}\n\n/**\n * An item that navigates: renders an `<a href>`. Closes the menu when chosen, like `Menu.Item`: with client-side\n * routing the page stays mounted, so an open menu would sit over the new page. Pass `closeOnClick={false}` to keep it.\n */\nfunction LinkItem({\n icon,\n description,\n trailing,\n tone = 'default',\n className,\n closeOnClick = true,\n children,\n 'aria-labelledby': labelledBy,\n 'aria-describedby': describedBy,\n ...rest\n}: MenuLinkItemProps) {\n const [body, aria] = useItemBody(\n { icon, description, trailing, children },\n { 'aria-labelledby': labelledBy, 'aria-describedby': describedBy },\n );\n return (\n <BaseMenu.LinkItem\n className={cx('sc-menu__item', className)}\n data-tone={tone}\n closeOnClick={closeOnClick}\n {...aria}\n {...rest}\n >\n {body}\n </BaseMenu.LinkItem>\n );\n}\n\nexport interface MenuCheckboxItemProps extends Omit<\n BaseMenu.CheckboxItem.Props,\n 'className' | 'onCheckedChange'\n> {\n /** Called with the next checked state. */\n onCheckedChange?: ((checked: boolean) => void) | undefined;\n /** Muted text at the end. */\n trailing?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** A toggle. Stays open when activated so several can be flipped at once; pass `closeOnClick` to close. */\nfunction CheckboxItem({ trailing, onCheckedChange, className, children, ...rest }: MenuCheckboxItemProps) {\n return (\n <BaseMenu.CheckboxItem\n className={cx('sc-menu__item', className)}\n onCheckedChange={onCheckedChange ? (checked) => onCheckedChange(checked) : undefined}\n {...rest}\n >\n <BaseMenu.CheckboxItemIndicator className=\"sc-menu__icon sc-menu__indicator\">\n <CheckIcon size=\"sm\" />\n </BaseMenu.CheckboxItemIndicator>\n <span className=\"sc-menu__label\">{children}</span>\n {trailing !== undefined ? <span className=\"sc-menu__trailing\">{trailing}</span> : null}\n </BaseMenu.CheckboxItem>\n );\n}\n\nexport interface MenuRadioGroupProps<Value extends string = string> extends Omit<\n BaseMenu.RadioGroup.Props,\n 'className' | 'value' | 'defaultValue' | 'onValueChange'\n> {\n /** Controlled selected value. */\n value?: Value | undefined;\n /** Initial value when uncontrolled. */\n defaultValue?: Value | undefined;\n /** Called with the next selected value. */\n onValueChange?: ((value: Value) => void) | undefined;\n /** A heading for the group, rendered above the items. */\n label?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** A set of `Menu.RadioItem`s where exactly one is selected. */\nfunction RadioGroup<Value extends string = string>({\n label,\n onValueChange,\n className,\n children,\n ...rest\n}: MenuRadioGroupProps<Value>) {\n return (\n <BaseMenu.RadioGroup\n className={cx('sc-menu__group', className)}\n onValueChange={onValueChange ? (value: Value) => onValueChange(value) : undefined}\n {...rest}\n >\n {label !== undefined ? (\n <BaseMenu.GroupLabel className=\"sc-menu__group-label\">{label}</BaseMenu.GroupLabel>\n ) : null}\n {children}\n </BaseMenu.RadioGroup>\n );\n}\n\nexport interface MenuRadioItemProps extends Omit<BaseMenu.RadioItem.Props, 'className' | 'value'> {\n value: string;\n /** Muted text at the end. */\n trailing?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** One choice in a `Menu.RadioGroup`. Stays open when chosen; pass `closeOnClick` to close. */\nfunction RadioItem({ trailing, className, children, ...rest }: MenuRadioItemProps) {\n return (\n <BaseMenu.RadioItem className={cx('sc-menu__item', className)} {...rest}>\n <BaseMenu.RadioItemIndicator className=\"sc-menu__icon sc-menu__indicator\">\n <span className=\"sc-menu__radio-dot\" />\n </BaseMenu.RadioItemIndicator>\n <span className=\"sc-menu__label\">{children}</span>\n {trailing !== undefined ? <span className=\"sc-menu__trailing\">{trailing}</span> : null}\n </BaseMenu.RadioItem>\n );\n}\n\nexport interface MenuGroupProps extends Omit<BaseMenu.Group.Props, 'className'> {\n /** A heading for the group, rendered above the items. */\n label?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** Labels a run of items. */\nfunction Group({ label, className, children, ...rest }: MenuGroupProps) {\n return (\n <BaseMenu.Group className={cx('sc-menu__group', className)} {...rest}>\n {label !== undefined ? (\n <BaseMenu.GroupLabel className=\"sc-menu__group-label\">{label}</BaseMenu.GroupLabel>\n ) : null}\n {children}\n </BaseMenu.Group>\n );\n}\n\nexport interface MenuSeparatorProps extends Omit<BaseMenu.Separator.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** A hairline between runs of items. */\nfunction Separator({ className, ...rest }: MenuSeparatorProps) {\n return <BaseMenu.Separator className={cx('sc-menu__separator', className)} {...rest} />;\n}\n\n/** A dropdown of actions on a trigger, with full keyboard support. Built on Base UI's Menu. */\nexport const Menu = {\n Root,\n Trigger,\n Content,\n Item,\n LinkItem,\n CheckboxItem,\n RadioGroup,\n RadioItem,\n Group,\n Separator,\n};\n","import { Field } from '@base-ui/react/field';\nimport type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { FieldShell, type FieldProps } from '../Field/FieldShell';\n\nexport interface InputProps\n extends\n Omit<ComponentPropsWithRef<'input'>, 'size' | 'name' | 'disabled' | 'required' | 'className'>,\n FieldProps {\n /** A 16px icon inside the start edge, for search and URL fields. Decorative. */\n iconStart?: ReactNode | undefined;\n /** A 16px icon inside the end edge. Decorative; use an `IconButton` outside the field for an action. */\n iconEnd?: ReactNode | undefined;\n /** Called with the string value on every change, beside the native `onChange`. */\n onValueChange?: ((value: string) => void) | undefined;\n}\n\n/**\n * A labelled single-line text field. Renders a native `<input>` inside Base UI's Field, so every native\n * attribute passes through: `type=\"date\" | \"time\" | \"number\" | \"url\" | …` keep the same height and\n * `iconStart` slot; `list=\"id\"` with a `<datalist>` beside it gives native suggestions. Date and time\n * fields show the browser's picker at the end edge, so leave `iconEnd` off those.\n */\nexport function Input({\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n name,\n size,\n className,\n iconStart,\n iconEnd,\n onValueChange,\n ...rest\n}: InputProps) {\n return (\n <FieldShell\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n invalid={invalid}\n required={required}\n disabled={disabled}\n name={name}\n size={size}\n className={className}\n >\n <span\n className=\"sc-input-wrap\"\n data-icon-start={iconStart ? '' : undefined}\n data-icon-end={iconEnd ? '' : undefined}\n >\n {iconStart ? (\n <span className=\"sc-input__icon\" data-side=\"start\" aria-hidden=\"true\">\n {iconStart}\n </span>\n ) : null}\n <Field.Control\n className=\"sc-input\"\n required={required}\n onValueChange={onValueChange ? (value) => onValueChange(value) : undefined}\n {...rest}\n />\n {iconEnd ? (\n <span className=\"sc-input__icon\" data-side=\"end\" aria-hidden=\"true\">\n {iconEnd}\n </span>\n ) : null}\n </span>\n </FieldShell>\n );\n}\n","import { Field } from '@base-ui/react/field';\nimport type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ControlSize = 'sm' | 'md' | 'lg';\n\n/** Props shared by every labelled form control: Input, Textarea, Select. */\nexport interface FieldProps {\n /** Required. The visible label; use `hideLabel` to keep it for assistive tech only. */\n label: ReactNode;\n /** Visually hides the label (a search box with an icon, a table filter). */\n hideLabel?: boolean | undefined;\n /** Help text under the control, wired with `aria-describedby`. */\n description?: ReactNode | undefined;\n /** The error message. When given the control is invalid and the message is announced. */\n error?: ReactNode | undefined;\n /** Marks the control invalid without a message. */\n invalid?: boolean | undefined;\n /** Shows a mark after the label and sets the native `required`. */\n required?: boolean | undefined;\n disabled?: boolean | undefined;\n /** Identifies the value when a form is submitted. */\n name?: string | undefined;\n /** Control height: 32, 40 (default) or 48px. Compact density shrinks each by one step. */\n size?: ControlSize | undefined;\n /** Class on the wrapper, not the control. */\n className?: string | undefined;\n}\n\ninterface FieldShellProps extends FieldProps {\n children: ReactNode;\n}\n\n/** Internal: Field.Root with label, control slot, description and error in the right order and ARIA. */\nexport function FieldShell({\n label,\n hideLabel = false,\n description,\n error,\n invalid = false,\n required = false,\n disabled = false,\n name,\n size = 'md',\n className,\n children,\n}: FieldShellProps) {\n return (\n <Field.Root\n className={cx('sc-field', className)}\n name={name}\n disabled={disabled}\n invalid={invalid || error != null}\n data-size={size}\n >\n <Field.Label className={cx('sc-field__label', hideLabel && 'sc-visually-hidden')}>\n {label}\n {required ? (\n <span className=\"sc-field__required\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </Field.Label>\n {children}\n {description != null ? (\n <Field.Description className=\"sc-field__description\">{description}</Field.Description>\n ) : null}\n {error != null ? (\n <Field.Error className=\"sc-field__error\" match>\n {error}\n </Field.Error>\n ) : null}\n </Field.Root>\n );\n}\n","import { Field } from '@base-ui/react/field';\nimport type { ComponentPropsWithRef } from 'react';\nimport { FieldShell, type FieldProps } from '../Field/FieldShell';\n\nexport type TextareaVariant = 'default' | 'code';\n\nexport interface TextareaProps\n extends\n Omit<ComponentPropsWithRef<'textarea'>, 'name' | 'disabled' | 'required' | 'className'>,\n Omit<FieldProps, 'size'> {\n /** Visible lines. Default 3. */\n rows?: number | undefined;\n /** `vertical` (default) lets the user drag it taller; `none` fixes the height. */\n resize?: 'vertical' | 'none' | undefined;\n /**\n * `code` for Markdown, JSON and other source: monospace, `tab-size: 2`, spellcheck, autocorrect and\n * autocapitalize off. Add the native `wrap=\"off\"` to keep long lines on one line and scroll sideways.\n */\n variant?: TextareaVariant | undefined;\n /** Called with the string value on every change, beside the native `onChange`. */\n onValueChange?: ((value: string) => void) | undefined;\n}\n\n/** A labelled multi-line text field. Renders a native `<textarea>` inside Base UI's Field. */\nexport function Textarea({\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n name,\n className,\n rows = 3,\n resize = 'vertical',\n variant = 'default',\n onValueChange,\n spellCheck,\n autoCorrect,\n autoCapitalize,\n ...rest\n}: TextareaProps) {\n const code = variant === 'code';\n return (\n <FieldShell\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n invalid={invalid}\n required={required}\n disabled={disabled}\n name={name}\n className={className}\n >\n <Field.Control\n render={\n <textarea\n rows={rows}\n spellCheck={spellCheck ?? (code ? false : undefined)}\n autoCorrect={autoCorrect ?? (code ? 'off' : undefined)}\n autoCapitalize={autoCapitalize ?? (code ? 'off' : undefined)}\n {...rest}\n />\n }\n className=\"sc-input sc-textarea\"\n data-resize={resize}\n data-variant={code ? 'code' : undefined}\n required={required}\n onValueChange={onValueChange ? (value) => onValueChange(value) : undefined}\n />\n </FieldShell>\n );\n}\n","import { Select as BaseSelect } from '@base-ui/react/select';\nimport { useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { FieldShell, type FieldProps } from '../Field/FieldShell';\nimport { CheckIcon, ChevronDownIcon, XIcon } from '../../icons/icons.gen';\n\nexport interface SelectOption<Value extends string = string> {\n value: Value;\n label: ReactNode;\n disabled?: boolean | undefined;\n}\n\nexport interface SelectGroup<Value extends string = string> {\n /** Heading shown above the group's options. */\n label: ReactNode;\n options: SelectOption<Value>[];\n}\n\nexport interface SelectProps<Value extends string = string> extends FieldProps {\n /** Flat options, or groups of options with a heading. */\n options: Array<SelectOption<Value> | SelectGroup<Value>>;\n /** Controlled value; `null` for none, which shows `placeholder`. No sentinel option needed. */\n value?: Value | null | undefined;\n /** Initial value when uncontrolled; `null` (default) for none. */\n defaultValue?: Value | null | undefined;\n /** Called with the chosen value, or `null` when the field is cleared. */\n onValueChange?: ((value: Value | null) => void) | undefined;\n /** Shown in the trigger while nothing is chosen. */\n placeholder?: ReactNode | undefined;\n /**\n * Shows an × beside the chevron while a value is chosen; pressing it, or Backspace/Delete on the\n * focused trigger, sets the value to `null` and calls `onValueChange(null)`.\n */\n clearable?: boolean | undefined;\n /** Accessible name of the clear button. Default \"Clear\". */\n clearLabel?: string | undefined;\n /** Prevents choosing a different option. */\n readOnly?: boolean | undefined;\n /** Stretches the trigger to the container. */\n fullWidth?: boolean | undefined;\n id?: string | undefined;\n}\n\nfunction isGroup<V extends string>(entry: SelectOption<V> | SelectGroup<V>): entry is SelectGroup<V> {\n return 'options' in entry;\n}\n\nfunction Option<V extends string>({ option }: { option: SelectOption<V> }) {\n return (\n <BaseSelect.Item value={option.value} disabled={option.disabled} className=\"sc-select__item\">\n <BaseSelect.ItemIndicator className=\"sc-select__indicator\">\n <CheckIcon size=\"sm\" />\n </BaseSelect.ItemIndicator>\n <BaseSelect.ItemText className=\"sc-select__item-text\">{option.label}</BaseSelect.ItemText>\n </BaseSelect.Item>\n );\n}\n\n/**\n * A labelled single-choice dropdown. Built on Base UI's Select so the list is styled and keyboard\n * complete; submits like a native select through `name`.\n */\nexport function Select<Value extends string = string>({\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n name,\n size = 'md',\n className,\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder = 'Choose…',\n clearable = false,\n clearLabel = 'Clear',\n readOnly,\n fullWidth = false,\n id,\n}: SelectProps<Value>) {\n const items = options.flatMap((entry) => (isGroup(entry) ? entry.options : [entry]));\n const [internal, setInternal] = useState<Value | null>(defaultValue ?? null);\n const controlled = value !== undefined;\n const current = controlled ? value : internal;\n const setValue = (next: Value | null) => {\n if (!controlled) setInternal(next);\n onValueChange?.(next);\n };\n const canClear = clearable && current != null && !disabled && !readOnly;\n const onTriggerKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (canClear && (event.key === 'Backspace' || event.key === 'Delete')) {\n event.preventDefault();\n setValue(null);\n }\n };\n return (\n <FieldShell\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n invalid={invalid}\n required={required}\n disabled={disabled}\n name={name}\n size={size}\n className={className}\n >\n <BaseSelect.Root<Value | null>\n items={items}\n value={current}\n onValueChange={(next) => setValue(next)}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n >\n <span className=\"sc-select__wrap\" data-full-width={fullWidth || undefined}>\n <BaseSelect.Trigger\n id={id}\n className=\"sc-select\"\n data-size={size}\n data-full-width={fullWidth || undefined}\n data-clearable={canClear || undefined}\n onKeyDown={onTriggerKeyDown}\n >\n <BaseSelect.Value className=\"sc-select__value\" placeholder={placeholder} />\n <BaseSelect.Icon className=\"sc-select__icon\">\n <ChevronDownIcon />\n </BaseSelect.Icon>\n </BaseSelect.Trigger>\n {canClear ? (\n <button\n type=\"button\"\n className=\"sc-select__clear\"\n aria-label={clearLabel}\n onClick={() => setValue(null)}\n >\n <XIcon size=\"sm\" />\n </button>\n ) : null}\n </span>\n <BaseSelect.Portal>\n <BaseSelect.Positioner\n className=\"sc-select__positioner\"\n sideOffset={4}\n alignItemWithTrigger={false}\n >\n <BaseSelect.Popup className=\"sc-select__popup\">\n <BaseSelect.List>\n {options.map((entry, i) =>\n isGroup(entry) ? (\n <BaseSelect.Group key={i} className=\"sc-select__group\">\n <BaseSelect.GroupLabel className=\"sc-select__group-label\">\n {entry.label}\n </BaseSelect.GroupLabel>\n {entry.options.map((option) => (\n <Option key={option.value} option={option} />\n ))}\n </BaseSelect.Group>\n ) : (\n <Option key={entry.value} option={entry} />\n ),\n )}\n </BaseSelect.List>\n </BaseSelect.Popup>\n </BaseSelect.Positioner>\n </BaseSelect.Portal>\n </BaseSelect.Root>\n </FieldShell>\n );\n}\n","import { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';\nimport { useId, type ReactNode } from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport interface CheckboxProps extends Omit<\n BaseCheckbox.Root.Props,\n 'className' | 'onCheckedChange' | 'render' | 'children'\n> {\n /** Required. The visible label; clicking it toggles the box. */\n label: ReactNode;\n /** Help text under the label, wired with `aria-describedby`. */\n description?: ReactNode | undefined;\n /** Called with the next checked state. */\n onCheckedChange?: ((checked: boolean) => void) | undefined;\n className?: string | undefined;\n}\n\n/** A labelled checkbox. `indeterminate` shows a dash for \"some of these\". Built on Base UI's Checkbox. */\nexport function Checkbox({\n label,\n description,\n onCheckedChange,\n className,\n disabled,\n ...rest\n}: CheckboxProps) {\n const descriptionId = useId();\n return (\n <div className={cx('sc-choice', className)} data-disabled={disabled || undefined}>\n <label className=\"sc-choice__control\">\n <BaseCheckbox.Root\n className=\"sc-checkbox\"\n disabled={disabled}\n aria-describedby={description != null ? descriptionId : undefined}\n onCheckedChange={onCheckedChange ? (checked) => onCheckedChange(checked) : undefined}\n {...rest}\n >\n <BaseCheckbox.Indicator className=\"sc-checkbox__indicator\">\n <CheckIcon size=\"sm\" className=\"sc-checkbox__check\" />\n <MinusIcon size=\"sm\" className=\"sc-checkbox__dash\" />\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n <span className=\"sc-choice__label\">{label}</span>\n </label>\n {description != null ? (\n <span className=\"sc-choice__description\" id={descriptionId}>\n {description}\n </span>\n ) : null}\n </div>\n );\n}\n","import { Switch as BaseSwitch } from '@base-ui/react/switch';\nimport { useId, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport interface SwitchProps extends Omit<\n BaseSwitch.Root.Props,\n 'className' | 'onCheckedChange' | 'render' | 'children'\n> {\n /** Required. The visible label; clicking it flips the switch. */\n label: ReactNode;\n /** Help text under the label, wired with `aria-describedby`. */\n description?: ReactNode | undefined;\n /** Called with the next checked state. */\n onCheckedChange?: ((checked: boolean) => void) | undefined;\n /** `end` (default) puts the switch before the label; `start` puts the label first and the switch at the row's end. */\n labelPosition?: 'start' | 'end' | undefined;\n className?: string | undefined;\n}\n\n/** A labelled on/off switch for settings that apply at once. Built on Base UI's Switch. */\nexport function Switch({\n label,\n description,\n onCheckedChange,\n labelPosition = 'end',\n className,\n disabled,\n ...rest\n}: SwitchProps) {\n const descriptionId = useId();\n return (\n <div\n className={cx('sc-choice', className)}\n data-disabled={disabled || undefined}\n data-label-position={labelPosition}\n >\n <label className=\"sc-choice__control\">\n <BaseSwitch.Root\n className=\"sc-switch\"\n disabled={disabled}\n aria-describedby={description != null ? descriptionId : undefined}\n onCheckedChange={onCheckedChange ? (checked) => onCheckedChange(checked) : undefined}\n {...rest}\n >\n <BaseSwitch.Thumb className=\"sc-switch__thumb\" />\n </BaseSwitch.Root>\n <span className=\"sc-choice__label\">{label}</span>\n </label>\n {description != null ? (\n <span className=\"sc-choice__description\" id={descriptionId}>\n {description}\n </span>\n ) : null}\n </div>\n );\n}\n","import { Tabs as BaseTabs } from '@base-ui/react/tabs';\nimport type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport interface TabsRootProps extends Omit<\n BaseTabs.Root.Props,\n 'className' | 'value' | 'defaultValue' | 'onValueChange'\n> {\n /** Controlled active tab. */\n value?: string | undefined;\n /** Initial active tab when uncontrolled. Defaults to the first enabled tab. */\n defaultValue?: string | undefined;\n /** Called with the value of the newly active tab. */\n onValueChange?: ((value: string) => void) | undefined;\n className?: string | undefined;\n}\n\n/** Owns the active tab. Wrap a `Tabs.List` and one `Tabs.Panel` per tab. */\nfunction Root({ className, onValueChange, ...rest }: TabsRootProps) {\n return (\n <BaseTabs.Root\n className={cx('sc-tabs', className)}\n onValueChange={onValueChange ? (value) => onValueChange(String(value)) : undefined}\n {...rest}\n />\n );\n}\n\nexport type TabsListVariant = 'line' | 'segmented';\n\nexport interface TabsListProps extends Omit<BaseTabs.List.Props, 'className'> {\n /** Names the set of tabs for assistive tech: \"Inbox sections\". */\n 'aria-label': string;\n /** Tabs share the width equally instead of sizing to their labels. */\n fill?: boolean | undefined;\n /** `line` (default): an accent underline on the active tab. `segmented`: a quiet segmented control, a sunken track with the active tab raised and no accent colour. */\n variant?: TabsListVariant | undefined;\n className?: string | undefined;\n}\n\n/** The row of tabs with the sliding indicator. Arrow keys move between tabs; Enter or Space activates. */\nfunction List({ fill = false, variant = 'line', className, children, ...rest }: TabsListProps) {\n return (\n <BaseTabs.List\n className={cx('sc-tabs__list', className)}\n data-fill={fill || undefined}\n data-variant={variant}\n {...rest}\n >\n {children}\n <BaseTabs.Indicator className=\"sc-tabs__indicator\" />\n </BaseTabs.List>\n );\n}\n\nexport interface TabsTabProps extends Omit<BaseTabs.Tab.Props, 'className' | 'value'> {\n value: string;\n /** A 16px icon before the label. */\n icon?: ReactNode | undefined;\n /** A count after the label, muted: `12`. */\n count?: ReactNode | undefined;\n className?: string | undefined;\n}\n\n/** One tab. */\nfunction Tab({ icon, count, className, children, ...rest }: TabsTabProps) {\n return (\n <BaseTabs.Tab className={cx('sc-tabs__tab', className)} {...rest}>\n {icon ? (\n <span className=\"sc-tabs__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className=\"sc-tabs__label\">{children}</span>\n {count != null ? (\n <>\n {' '}\n <span className=\"sc-tabs__count\">{count}</span>\n </>\n ) : null}\n </BaseTabs.Tab>\n );\n}\n\nexport interface TabsPanelProps extends Omit<BaseTabs.Panel.Props, 'className' | 'value'> {\n value: string;\n className?: string | undefined;\n}\n\n/** The content of one tab. Unmounted while hidden unless `keepMounted`. */\nfunction Panel({ className, ...rest }: TabsPanelProps) {\n return <BaseTabs.Panel className={cx('sc-tabs__panel', className)} {...rest} />;\n}\n\n/** Switches between sections of one view. Built on Base UI's Tabs. */\nexport const Tabs = { Root, List, Tab, Panel };\n","import { Toolbar as BaseToolbar } from '@base-ui/react/toolbar';\nimport type { SpacingSize } from '../../types';\nimport { cx } from '../../utils/cx';\n\nexport interface ToolbarRootProps extends Omit<BaseToolbar.Root.Props, 'className'> {\n /** Required. Names the toolbar for assistive tech: \"Inbox actions\". */\n 'aria-label': string;\n /** Wraps onto new lines on narrow widths (default). `false` keeps one line that overflows. */\n wrap?: boolean | undefined;\n /** Gap between items and groups. Default `xs`. */\n gap?: SpacingSize | undefined;\n className?: string | undefined;\n}\n\n/**\n * A row of controls with one tab stop: Tab enters, arrow keys move between items, Tab leaves. Put every\n * control through `Toolbar.Button` (`render={<IconButton … />}`) so it joins the roving focus.\n */\nfunction Root({ wrap = true, gap = 'xs', className, ...rest }: ToolbarRootProps) {\n return (\n <BaseToolbar.Root\n className={cx('sc-toolbar', className)}\n data-wrap={wrap || undefined}\n data-gap={gap}\n {...rest}\n />\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<BaseToolbar.Group.Props, 'className'> {\n /** Names the group: \"Playback\". */\n 'aria-label'?: string | undefined;\n /** Gap inside the group. Default `2xs`. */\n gap?: SpacingSize | undefined;\n className?: string | undefined;\n}\n\n/** Keeps related controls together with a tighter gap. */\nfunction Group({ gap = '2xs', className, ...rest }: ToolbarGroupProps) {\n return <BaseToolbar.Group className={cx('sc-toolbar__group', className)} data-gap={gap} {...rest} />;\n}\n\nexport interface ToolbarSeparatorProps extends Omit<BaseToolbar.Separator.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** A hairline between groups. */\nfunction Separator({ className, ...rest }: ToolbarSeparatorProps) {\n return <BaseToolbar.Separator className={cx('sc-toolbar__separator', className)} {...rest} />;\n}\n\nexport interface ToolbarButtonProps extends Omit<BaseToolbar.Button.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * Joins a control to the toolbar's keyboard navigation. Pass the real control through `render`:\n * `<Toolbar.Button render={<IconButton label=\"Pause\" tooltip />}><PauseIcon /></Toolbar.Button>`.\n * For a Menu, nest: `<Toolbar.Button render={<Menu.Trigger render={<IconButton … />} />}>`.\n */\nconst Button = BaseToolbar.Button;\n\nexport interface ToolbarLinkProps extends Omit<BaseToolbar.Link.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * A link that joins the toolbar's keyboard navigation. With no `render` it is a plain `<a>`; for an\n * icon link pass an IconButton that itself renders the anchor (or a Next.js `Link`):\n * `<Toolbar.Link render={<IconButton label=\"Settings\" tooltip render={<a href=\"/settings\" />} />}><SettingsIcon /></Toolbar.Link>`.\n */\nconst Link = BaseToolbar.Link;\n\nexport interface ToolbarSpacerProps {\n className?: string | undefined;\n}\n\n/** Pushes what follows to the far end. */\nfunction Spacer({ className }: ToolbarSpacerProps) {\n return <div className={cx('sc-toolbar__spacer', className)} aria-hidden=\"true\" />;\n}\n\n/** A horizontal container of controls. Built on Base UI's Toolbar. */\nexport const Toolbar = { Root, Group, Separator, Button, Link, Spacer };\n","import { useState, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { IconButton } from '../IconButton/IconButton';\nimport { CircleCheckIcon, CircleXIcon, InfoIcon, WarningIcon, XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type BannerTone = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\nexport interface BannerProps extends ComponentPropsWithRef<'div'> {\n /** Colour and default icon. `warning` and `danger` are announced as alerts; the rest as status. */\n tone?: BannerTone | undefined;\n /** Replaces the tone's icon; `false` removes it. */\n icon?: ReactNode | false | undefined;\n /** One Button, usually `variant=\"ghost\" size=\"sm\"`, at the end of the strip. */\n action?: ReactNode | undefined;\n /** Shows a close button that hides the banner. */\n dismissible?: boolean | undefined;\n /** Called when the close button is pressed. */\n onDismiss?: (() => void) | undefined;\n /** Controlled visibility when dismissible. */\n open?: boolean | undefined;\n /** Accessible name of the close button. Default \"Dismiss\". */\n dismissLabel?: string | undefined;\n}\n\nconst toneIcons: Record<BannerTone, ReactNode> = {\n info: <InfoIcon />,\n success: <CircleCheckIcon />,\n warning: <WarningIcon />,\n danger: <CircleXIcon />,\n neutral: null,\n};\n\n/** A single-line status strip across the top of a view: paused, offline, \"3 new since you looked\". */\nexport function Banner({\n tone = 'info',\n icon,\n action,\n dismissible = false,\n onDismiss,\n open,\n dismissLabel = 'Dismiss',\n role,\n className,\n children,\n ...rest\n}: BannerProps) {\n const [dismissed, setDismissed] = useState(false);\n const visible = open ?? !dismissed;\n if (!visible) return null;\n const glyph = icon === false ? null : (icon ?? toneIcons[tone]);\n return (\n <div\n role={role ?? (tone === 'warning' || tone === 'danger' ? 'alert' : 'status')}\n className={cx('sc-banner', className)}\n data-tone={tone}\n {...rest}\n >\n {glyph ? (\n <span className=\"sc-banner__icon\" aria-hidden=\"true\">\n {glyph}\n </span>\n ) : null}\n <div className=\"sc-banner__body\">{children}</div>\n {action ? <div className=\"sc-banner__action\">{action}</div> : null}\n {dismissible ? (\n <IconButton\n label={dismissLabel}\n size=\"sm\"\n className=\"sc-banner__dismiss\"\n onClick={() => {\n setDismissed(true);\n onDismiss?.();\n }}\n >\n <XIcon />\n </IconButton>\n ) : null}\n </div>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport type { IconSize } from '../Icon/Icon';\nimport { cx } from '../../utils/cx';\n\nexport interface SpinnerProps extends ComponentPropsWithRef<'span'> {\n /** `xs` 12, `sm` 14, `md` 16 (default), `lg` 20, `xl` 24, or `em` to follow the font size. */\n size?: IconSize | undefined;\n /** What is happening, announced once as a status. Default \"Loading\". */\n label?: string | undefined;\n /** Hides it from assistive tech when the text beside it already says what is happening. */\n decorative?: boolean | undefined;\n}\n\n/** An indeterminate activity indicator in `currentColor`. Slows down, never stops, under reduced motion. */\nexport function Spinner({\n size = 'md',\n label = 'Loading',\n decorative = false,\n className,\n ...rest\n}: SpinnerProps) {\n return (\n <span\n className={cx('sc-spinner', className)}\n data-size={size}\n role={decorative ? undefined : 'status'}\n aria-label={decorative ? undefined : label}\n aria-hidden={decorative || undefined}\n {...rest}\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle className=\"sc-spinner__track\" cx=\"8\" cy=\"8\" r=\"6.25\" />\n <circle className=\"sc-spinner__arc\" cx=\"8\" cy=\"8\" r=\"6.25\" strokeLinecap=\"round\" />\n </svg>\n </span>\n );\n}\n","import { Progress as BaseProgress } from '@base-ui/react/progress';\nimport type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { Spinner } from '../Spinner/Spinner';\nimport { cx } from '../../utils/cx';\n\nexport type ProgressTone = 'accent' | 'success' | 'warning' | 'danger' | 'neutral';\nexport type ProgressSize = 'sm' | 'md';\nexport type ProgressVariant = 'bar' | 'inline';\n\nexport interface ProgressProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n /** Current value. Omit or pass `null` while the amount of work is unknown (indeterminate). */\n value?: number | null | undefined;\n /** Default 100. Pass the total so `value` can be a count: `value={460} max={859}`. */\n max?: number | undefined;\n /** Default 0. */\n min?: number | undefined;\n /** What is happening: \"Verifying\". Visible, and names the bar for assistive tech. */\n label?: ReactNode | undefined;\n /** Detail at the end: \"460 of 859 · 3 min elapsed\". A string also becomes `aria-valuetext`. */\n valueText?: ReactNode | undefined;\n /** Shows the percentage when `valueText` is not given. */\n showValue?: boolean | undefined;\n /** Fill colour. Default `accent`; `success` when done, `danger` when it failed. */\n tone?: ProgressTone | undefined;\n /** Bar thickness: `sm` 4px, `md` 8px (default). Inline uses the text size. */\n size?: ProgressSize | undefined;\n /** `bar` (default) is label, value and a track; `inline` is a Spinner beside the text for toolbars and buttons. */\n variant?: ProgressVariant | undefined;\n /** Names the bar when there is no `label`. */\n 'aria-label'?: string | undefined;\n}\n\n/**\n * Says that something is processing and, when known, how far along it is. Built on Base UI's Progress:\n * `role=\"progressbar\"` with the aria value attributes, or none while indeterminate.\n */\nexport function Progress({\n value,\n max = 100,\n min = 0,\n label,\n valueText,\n showValue = false,\n tone = 'accent',\n size = 'md',\n variant = 'bar',\n className,\n ...rest\n}: ProgressProps) {\n const current = value ?? null;\n const hasValueText = valueText != null || (showValue && current !== null);\n return (\n <BaseProgress.Root\n value={current}\n max={max}\n min={min}\n getAriaValueText={(formatted) => (typeof valueText === 'string' ? valueText : (formatted ?? ''))}\n className={cx('sc-progress', className)}\n data-variant={variant}\n data-tone={tone}\n data-size={size}\n {...rest}\n >\n {variant === 'inline' ? <Spinner size=\"sm\" decorative className=\"sc-progress__spinner\" /> : null}\n {label != null ? <BaseProgress.Label className=\"sc-progress__label\">{label}</BaseProgress.Label> : null}\n {hasValueText ? (\n <BaseProgress.Value className=\"sc-progress__value\">\n {(formatted) => (valueText != null ? valueText : formatted)}\n </BaseProgress.Value>\n ) : null}\n {variant === 'bar' ? (\n <BaseProgress.Track className=\"sc-progress__track\">\n <BaseProgress.Indicator className=\"sc-progress__indicator\" />\n </BaseProgress.Track>\n ) : null}\n </BaseProgress.Root>\n );\n}\n","import { createElement, type ComponentPropsWithRef } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\nexport type HeadingSize = 'overline' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';\nexport type HeadingElement = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'div' | 'span' | 'p';\nexport type TextTone = 'default' | 'muted' | 'subtle' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface HeadingProps extends ComponentPropsWithRef<'h2'> {\n /** The outline level, rendered as `h1`–`h6`. Default 2. */\n level?: HeadingLevel | undefined;\n /** Visual size from the type scale, independent of the level. Defaults by level: 3xl, 2xl, xl, lg, md, sm. `overline` is a 12px uppercase mono label with wide tracking, muted by default, for section labels (\"Why it fits\"). */\n size?: HeadingSize | undefined;\n /** Render a different element and keep the look; `div`/`span` for a card title that is not an outline entry. */\n as?: HeadingElement | undefined;\n /** Colour. Default is the text colour; `muted` for `size=\"overline\"`. */\n tone?: TextTone | undefined;\n /** One line with an ellipsis. */\n truncate?: boolean | undefined;\n}\n\nconst sizeByLevel: Record<HeadingLevel, HeadingSize> = {\n 1: '3xl',\n 2: '2xl',\n 3: 'xl',\n 4: 'lg',\n 5: 'md',\n 6: 'sm',\n};\n\n/** A heading from the type scale. `level` is the semantics, `size` the look; they are set separately on purpose. */\nexport function Heading({ level = 2, size, as, tone, truncate = false, className, ...rest }: HeadingProps) {\n return createElement(as ?? `h${level}`, {\n className: cx('sc-heading', className),\n 'data-size': size ?? sizeByLevel[level],\n 'data-tone': tone ?? (size === 'overline' ? 'muted' : 'default'),\n 'data-truncate': truncate || undefined,\n ...rest,\n });\n}\n","import { createElement, type ComponentPropsWithRef, type CSSProperties, type ReactElement } from 'react';\nimport type { TextTone } from '../Heading/Heading';\nimport { cx } from '../../utils/cx';\n\nexport type TextSize = 'xs' | 'sm' | 'md' | 'lg';\nexport type TextWeight = 'regular' | 'medium' | 'semibold';\nexport type TextAlign = 'start' | 'center' | 'end';\nexport type TextFamily = 'sans' | 'mono';\nexport type TextElement =\n | 'p'\n | 'span'\n | 'div'\n | 'label'\n | 'li'\n | 'dt'\n | 'dd'\n | 'strong'\n | 'em'\n | 'small'\n | 'time'\n | 'figcaption'\n | 'legend';\n\nexport interface TextProps extends ComponentPropsWithRef<'p'> {\n /** Element to render. Default `p`; `span` inside other text. */\n as?: TextElement | undefined;\n /** `xs` 12 captions, `sm` 14 UI text (default), `md` body copy, `lg` lede. */\n size?: TextSize | undefined;\n /** Colour. `muted` for metadata, `subtle` for placeholders, status tones for inline status. */\n tone?: TextTone | undefined;\n weight?: TextWeight | undefined;\n align?: TextAlign | undefined;\n /** `true` keeps one line with an ellipsis; a number clamps to that many lines. */\n truncate?: boolean | number | undefined;\n /** Tabular figures, for numbers that line up in columns. */\n numeric?: boolean | undefined;\n /** `sans` (default) or `mono` for data next to prose: row metadata, dates, counts (\"Quillstack · 5 h\"). */\n family?: TextFamily | undefined;\n}\n\n/** Running text and labels from the type scale. Parents own spacing: Text has no margins. */\nexport function Text({\n as = 'p',\n size = 'sm',\n tone = 'default',\n weight = 'regular',\n align,\n truncate = false,\n numeric = false,\n family = 'sans',\n className,\n style,\n ...rest\n}: TextProps): ReactElement {\n const clamp = typeof truncate === 'number' ? truncate : undefined;\n return createElement(as, {\n className: cx('sc-text', className),\n 'data-size': size,\n 'data-tone': tone,\n 'data-weight': weight,\n 'data-align': align,\n 'data-truncate': truncate === true ? '' : clamp !== undefined ? 'clamp' : undefined,\n 'data-numeric': numeric || undefined,\n 'data-family': family === 'mono' ? 'mono' : undefined,\n style: clamp !== undefined ? ({ ...style, '--sc-text-lines': clamp } as CSSProperties) : style,\n ...rest,\n });\n}\n","import { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';\nimport {\n createContext,\n useContext,\n type ComponentPropsWithRef,\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { ArrowDownIcon, ArrowUpIcon, CheckIcon, MinusIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\nimport type { RowSelection } from './useRowSelection';\n\nexport type TableAlign = 'start' | 'center' | 'end';\nexport type TableDensity = 'comfortable' | 'compact';\nexport type TableSortDirection = 'ascending' | 'descending' | 'none';\n\nexport interface TableRootProps extends Omit<ComponentPropsWithRef<'table'>, 'style'> {\n /** Column headers stay visible while the table scrolls. Give `maxHeight` to scroll inside the table; otherwise they stick to the page. */\n stickyHeader?: boolean | undefined;\n /** Limits the height and scrolls rows inside; pairs with `stickyHeader`. A CSS length. */\n maxHeight?: string | undefined;\n /** `compact` tightens row height and padding; `data-density=\"compact\"` on an ancestor does the same. */\n density?: TableDensity | undefined;\n /** Hairlines between rows (default) or none. */\n divided?: boolean | undefined;\n /** `fixed` column widths from the first row, for truncating cells. Default `auto`. */\n layout?: 'auto' | 'fixed' | undefined;\n /** Style and class for the scrolling wrapper; `className` goes on the `<table>`. */\n wrapperClassName?: string | undefined;\n wrapperStyle?: CSSProperties | undefined;\n style?: CSSProperties | undefined;\n children?: ReactNode | undefined;\n /**\n * `useRowSelection(ids)`. Turns on the selection column parts (`Table.SelectionHeader`, `Table.SelectionCell`),\n * modifier clicks on rows with a `selectionId`, and the keyboard: Cmd/Ctrl+A selects every row while focus\n * is inside the table, Escape clears.\n */\n selection?: RowSelection | undefined;\n}\n\nconst SelectionContext = createContext<RowSelection | null>(null);\nconst RowIdContext = createContext<string | undefined>(undefined);\n\nfunction useSelection(part: string): RowSelection {\n const selection = useContext(SelectionContext);\n if (!selection) throw new Error(`${part} needs Table.Root selection={useRowSelection(ids)}`);\n return selection;\n}\n\n/** Typing into a field inside the table keeps the browser's own Cmd/Ctrl+A and Escape. */\nfunction isTextEntry(target: EventTarget): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (\n target.isContentEditable ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement\n )\n return true;\n return (\n target instanceof HTMLInputElement &&\n !['checkbox', 'radio', 'button', 'submit', 'reset', 'image', 'file', 'color', 'range'].includes(\n target.type,\n )\n );\n}\n\nconst CONTROLS =\n 'a[href], button, input, select, textarea, label, summary, [role=\"checkbox\"], [role=\"button\"], [role=\"link\"], [contenteditable=\"true\"]';\n\n/** The event started on a link, button or field inside `row`, which keeps its own click behaviour. */\nfunction fromControl(event: MouseEvent<HTMLElement>): boolean {\n const control = event.target instanceof Element ? event.target.closest(CONTROLS) : null;\n return control !== null && event.currentTarget.contains(control);\n}\n\n/** A semantic `<table>` in a horizontally scrolling wrapper. Compose `Table.Head`, `Table.Body`, `Table.Row`, `Table.Header`, `Table.Cell`. */\nfunction Root({\n stickyHeader = false,\n maxHeight,\n density,\n divided = true,\n layout = 'auto',\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n children,\n selection,\n onKeyDown,\n ...rest\n}: TableRootProps) {\n const handleKeyDown = (event: KeyboardEvent<HTMLTableElement>) => {\n onKeyDown?.(event);\n if (!selection || event.defaultPrevented) return;\n // Popups portalled out of a cell still bubble here through React; they are not \"inside the table\".\n if (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return;\n if (isTextEntry(event.target)) return;\n if ((event.metaKey || event.ctrlKey) && !event.altKey && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n selection.selectAll();\n } else if (event.key === 'Escape' && selection.count > 0) {\n event.preventDefault();\n selection.clear();\n }\n };\n return (\n <div\n className={cx('sc-table-wrap', wrapperClassName)}\n data-sticky-header={stickyHeader || undefined}\n data-scroll={maxHeight ? '' : undefined}\n style={maxHeight ? { ...wrapperStyle, maxBlockSize: maxHeight } : wrapperStyle}\n >\n {/* Selection shortcuts are delegated from the focusable controls inside (checkboxes, links, sort buttons). */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <table\n className={cx('sc-table', className)}\n data-density={density}\n data-divided={divided || undefined}\n data-layout={layout}\n style={style}\n onKeyDown={selection ? handleKeyDown : onKeyDown}\n {...rest}\n >\n <SelectionContext.Provider value={selection ?? null}>{children}</SelectionContext.Provider>\n </table>\n </div>\n );\n}\n\nexport type TableCaptionProps = ComponentPropsWithRef<'caption'>;\n\n/** Names the table for assistive tech; visually a muted line above it. */\nfunction Caption({ className, ...rest }: TableCaptionProps) {\n return <caption className={cx('sc-table__caption', className)} {...rest} />;\n}\n\nexport type TableHeadProps = ComponentPropsWithRef<'thead'>;\nfunction Head({ className, ...rest }: TableHeadProps) {\n return <thead className={cx('sc-table__head', className)} {...rest} />;\n}\n\nexport type TableBodyProps = ComponentPropsWithRef<'tbody'>;\nfunction Body({ className, ...rest }: TableBodyProps) {\n return <tbody className={cx('sc-table__body', className)} {...rest} />;\n}\n\nexport type TableFootProps = ComponentPropsWithRef<'tfoot'>;\nfunction Foot({ className, ...rest }: TableFootProps) {\n return <tfoot className={cx('sc-table__foot', className)} {...rest} />;\n}\n\nexport interface TableRowProps extends ComponentPropsWithRef<'tr'> {\n /** Accent wash, for the current row. With `selectionId` it defaults to the row's selection. */\n selected?: boolean | undefined;\n /** Hover wash and pointer; make the primary cell a link or button for the real target. */\n interactive?: boolean | undefined;\n /**\n * The row's id in `Table.Root selection`. Shift+click extends the range to this row and Cmd/Ctrl+click\n * toggles it, unless the click is on a link, button or field inside the row; neither reaches `onClick`,\n * so a plain click can still open the row.\n */\n selectionId?: string | undefined;\n}\n\nfunction Row({\n selected,\n interactive = false,\n selectionId,\n className,\n onClick,\n onMouseDown,\n ...rest\n}: TableRowProps) {\n const selection = useContext(SelectionContext);\n const selectable = selection !== null && selectionId !== undefined;\n const isSelected = selected ?? (selectable && selection.isSelected(selectionId));\n const row = (\n <tr\n className={cx('sc-table__row', className)}\n data-selected={isSelected || undefined}\n data-interactive={interactive || undefined}\n aria-selected={selectable ? isSelected : isSelected || undefined}\n onClick={\n selectable\n ? (event) => {\n if ((event.shiftKey || event.metaKey || event.ctrlKey) && !fromControl(event)) {\n event.preventDefault();\n if (event.shiftKey) selection.toggleRange(selectionId);\n else selection.toggle(selectionId);\n return;\n }\n onClick?.(event);\n }\n : onClick\n }\n onMouseDown={\n selectable\n ? (event) => {\n // Shift+click would otherwise select the text between the two clicks.\n if (event.shiftKey && !fromControl(event)) event.preventDefault();\n onMouseDown?.(event);\n }\n : onMouseDown\n }\n {...rest}\n />\n );\n return selectionId === undefined ? (\n row\n ) : (\n <RowIdContext.Provider value={selectionId}>{row}</RowIdContext.Provider>\n );\n}\n\nfunction SelectionBox({\n label,\n ...rest\n}: { label: string } & Omit<BaseCheckbox.Root.Props, 'className' | 'render'>) {\n return (\n <BaseCheckbox.Root className=\"sc-checkbox\" aria-label={label} {...rest}>\n <BaseCheckbox.Indicator className=\"sc-checkbox__indicator\">\n <CheckIcon size=\"sm\" className=\"sc-checkbox__check\" />\n <MinusIcon size=\"sm\" className=\"sc-checkbox__dash\" />\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n );\n}\n\nconst onCheckbox = (event: MouseEvent<HTMLElement>) =>\n event.target instanceof Element && event.target.closest('[role=\"checkbox\"]') !== null;\n\nexport interface TableSelectionHeaderProps extends Omit<ComponentPropsWithRef<'th'>, 'children'> {\n /** The checkbox's accessible name. Default \"Select all rows\". */\n label?: string | undefined;\n}\n\n/**\n * The selection column's header: a checkbox that is checked when every row is, mixed when some are, and\n * selects every row (or, when all are selected, none). The whole cell is the hit area.\n */\nfunction SelectionHeader({\n label = 'Select all rows',\n className,\n onClick,\n ...rest\n}: TableSelectionHeaderProps) {\n const selection = useSelection('Table.SelectionHeader');\n const disabled = selection.ids.length === 0;\n const toggleAll = () => (selection.headerState === 'all' ? selection.clear() : selection.selectAll());\n return (\n <th\n scope=\"col\"\n className={cx('sc-table__header', 'sc-table__select', className)}\n data-disabled={disabled || undefined}\n onClick={(event) => {\n onClick?.(event);\n if (!disabled && !onCheckbox(event)) toggleAll();\n }}\n {...rest}\n >\n <SelectionBox\n label={label}\n checked={selection.headerState === 'all'}\n indeterminate={selection.headerState === 'some'}\n disabled={disabled}\n onCheckedChange={toggleAll}\n />\n </th>\n );\n}\n\nexport interface TableSelectionCellProps extends Omit<ComponentPropsWithRef<'td'>, 'children'> {\n /** Required. Names the row's checkbox: \"Select Tailscale, Front End Engineer\". */\n label: string;\n}\n\n/**\n * The row's checkbox, inside a `Table.Row selectionId`. Click or Space toggles; Shift+click or Shift+Space\n * extends the range from the last toggled row. The whole cell is the hit area, and its clicks never reach the\n * row's `onClick`.\n */\nfunction SelectionCell({ label, className, onClick, onClickCapture, ...rest }: TableSelectionCellProps) {\n const selection = useSelection('Table.SelectionCell');\n const id = useContext(RowIdContext);\n if (id === undefined) throw new Error('Table.SelectionCell goes inside a Table.Row with selectionId');\n return (\n <td\n className={cx('sc-table__cell', 'sc-table__select', className)}\n onClickCapture={(event) => {\n onClickCapture?.(event);\n // Shift+click, and Shift+Space (Base UI turns the keyup into a click that keeps the modifiers), take the\n // range before the checkbox would flip on its own.\n if (!event.shiftKey) return;\n event.preventDefault();\n event.stopPropagation();\n selection.toggleRange(id);\n }}\n onClick={(event) => {\n onClick?.(event);\n event.stopPropagation();\n if (!onCheckbox(event)) selection.toggle(id);\n }}\n {...rest}\n >\n <SelectionBox\n label={label}\n checked={selection.isSelected(id)}\n onCheckedChange={() => selection.toggle(id)}\n />\n </td>\n );\n}\n\ninterface CellSlots {\n /** Horizontal alignment. Default `start`; `end` for numbers. */\n align?: TableAlign | undefined;\n /** Tabular figures and end alignment. */\n numeric?: boolean | undefined;\n /** No wrapping. */\n nowrap?: boolean | undefined;\n /** One line with an ellipsis; needs `layout=\"fixed\"` or a `width`. */\n truncate?: boolean | undefined;\n /** Column width as a CSS length, on headers. */\n width?: string | undefined;\n}\n\nexport interface TableHeaderProps extends Omit<ComponentPropsWithRef<'th'>, 'align' | 'width'>, CellSlots {\n /** Renders the label as a button that sorts the column. The table stays controlled: sort the rows yourself in `onSort`. */\n sortable?: boolean | undefined;\n /** The column's current sort, reflected as `aria-sort`. `none` (default) for every column but the sorted one. */\n sortDirection?: TableSortDirection | undefined;\n /** Called with the direction to apply: `ascending` first, then it toggles. */\n onSort?: ((direction: Exclude<TableSortDirection, 'none'>) => void) | undefined;\n}\n\n/** A `<th>`; `scope` defaults to `col`, pass `row` for the first cell of a row. */\nfunction Header({\n align,\n numeric = false,\n nowrap = false,\n truncate = false,\n width,\n sortable = false,\n sortDirection = 'none',\n onSort,\n scope = 'col',\n className,\n style,\n children,\n ...rest\n}: TableHeaderProps) {\n const sorted = sortable && sortDirection !== 'none';\n return (\n <th\n scope={scope}\n className={cx('sc-table__header', className)}\n data-align={align ?? (numeric ? 'end' : undefined)}\n data-numeric={numeric || undefined}\n data-nowrap={nowrap || undefined}\n data-truncate={truncate || undefined}\n data-sortable={sortable || undefined}\n data-sorted={sorted ? sortDirection : undefined}\n aria-sort={sorted ? sortDirection : undefined}\n style={width ? { ...style, inlineSize: width } : style}\n {...rest}\n >\n {sortable ? (\n <button\n type=\"button\"\n className=\"sc-table__sort\"\n onClick={() => onSort?.(sortDirection === 'ascending' ? 'descending' : 'ascending')}\n >\n <span className=\"sc-table__sort-label\">{children}</span>\n <span className=\"sc-table__sort-icon\" aria-hidden=\"true\">\n {sortDirection === 'descending' ? <ArrowDownIcon size=\"xs\" /> : <ArrowUpIcon size=\"xs\" />}\n </span>\n </button>\n ) : (\n children\n )}\n </th>\n );\n}\n\nexport interface TableCellProps extends Omit<ComponentPropsWithRef<'td'>, 'align' | 'width'>, CellSlots {}\n\nfunction Cell({\n align,\n numeric = false,\n nowrap = false,\n truncate = false,\n width,\n className,\n style,\n ...rest\n}: TableCellProps) {\n return (\n <td\n className={cx('sc-table__cell', className)}\n data-align={align ?? (numeric ? 'end' : undefined)}\n data-numeric={numeric || undefined}\n data-nowrap={nowrap || undefined}\n data-truncate={truncate || undefined}\n style={width ? { ...style, inlineSize: width } : style}\n {...rest}\n />\n );\n}\n\n/** Rows of records with column headers. Native table elements, so screen readers get rows and columns. */\nexport const Table = { Root, Caption, Head, Body, Foot, Row, Header, Cell, SelectionHeader, SelectionCell };\n","import { useMemo, useReducer } from 'react';\nimport {\n headerState,\n initRowSelection,\n rowSelectionReducer,\n sameIds,\n selectedIds,\n type RowSelectionHeaderState,\n} from './rowSelection';\n\nexport interface RowSelection {\n /** The selectable ids, in the order passed in. */\n ids: readonly string[];\n /** The selected ids; a subset of the ids passed in. */\n selected: ReadonlySet<string>;\n /** The selected ids in visible order. */\n selectedIds: readonly string[];\n count: number;\n /** Where the next Shift range starts. */\n anchor: string | null;\n /** For the header checkbox. */\n headerState: RowSelectionHeaderState;\n isSelected: (id: string) => boolean;\n toggle: (id: string) => void;\n /** Every row from the anchor to `id`, inclusive, in the current order, takes `id`'s new state. */\n toggleRange: (id: string) => void;\n selectAll: () => void;\n clear: () => void;\n}\n\n/**\n * Selection state for a list of rows, by id. Pass the selectable ids in visible order (after filtering and\n * sorting); when one disappears it leaves the selection and the rest stay. Hand the result to\n * `Table.Root selection` for the checkbox column and keyboard, or read it for a bulk-action bar.\n */\nexport function useRowSelection(ids: readonly string[]): RowSelection {\n const [stored, dispatch] = useReducer(rowSelectionReducer, ids, initRowSelection);\n // Rows changed since the last render: sync now (a render-phase update, so nothing paints a stale count),\n // and read the synced state this render.\n const state = sameIds(stored.ids, ids)\n ? stored\n : rowSelectionReducer(stored, { type: 'selection.sync', ids });\n if (state !== stored) dispatch({ type: 'selection.sync', ids });\n\n const actions = useMemo(\n () => ({\n toggle: (id: string) => dispatch({ type: 'selection.toggle', id }),\n toggleRange: (id: string) => dispatch({ type: 'selection.toggleRange', id }),\n selectAll: () => dispatch({ type: 'selection.selectAll' }),\n clear: () => dispatch({ type: 'selection.clear' }),\n }),\n [],\n );\n return useMemo(\n () => ({\n ids: state.ids,\n selected: state.selected,\n selectedIds: selectedIds(state),\n count: state.selected.size,\n anchor: state.anchor,\n headerState: headerState(state),\n isSelected: (id: string) => state.selected.has(id),\n ...actions,\n }),\n [state, actions],\n );\n}\n","// Row selection as a pure reducer: no React, no DOM. `useRowSelection` is the thin hook over it, and the Table's\n// selection column and keyboard handling only send it events. Events are namespaced `selection.*` (guideline 07).\n\n/** The header checkbox: nothing, some or every row selected. */\nexport type RowSelectionHeaderState = 'none' | 'some' | 'all';\n\nexport interface RowSelectionState {\n /** The selectable row ids in visible order (after the page's filter and sort). Unique. */\n readonly ids: readonly string[];\n /** The selected ids; always a subset of `ids`. */\n readonly selected: ReadonlySet<string>;\n /** Where the next range starts: the row toggled last, on its own or as the end of a range. */\n readonly anchor: string | null;\n}\n\nexport type RowSelectionEvent =\n /** The visible rows changed (filter, sort, new data): keep the order, drop what disappeared. */\n | { type: 'selection.sync'; ids: readonly string[] }\n /** Flip one row; it becomes the anchor. */\n | { type: 'selection.toggle'; id: string }\n /** Shift: every row from the anchor to `id`, inclusive, in visible order, takes `id`'s new state; `id` becomes the anchor. */\n | { type: 'selection.toggleRange'; id: string }\n | { type: 'selection.selectAll' }\n | { type: 'selection.clear' };\n\nexport function initRowSelection(ids: readonly string[]): RowSelectionState {\n return { ids, selected: new Set(), anchor: null };\n}\n\n/** Same ids in the same order. */\nexport function sameIds(a: readonly string[], b: readonly string[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;\n return true;\n}\n\nfunction toggle(state: RowSelectionState, id: string): RowSelectionState {\n if (!state.ids.includes(id)) return state;\n const selected = new Set(state.selected);\n if (selected.has(id)) selected.delete(id);\n else selected.add(id);\n return { ...state, selected, anchor: id };\n}\n\nfunction toggleRange(state: RowSelectionState, id: string): RowSelectionState {\n const to = state.ids.indexOf(id);\n if (to < 0) return state;\n const from = state.anchor === null ? -1 : state.ids.indexOf(state.anchor);\n if (from < 0 || from === to) return toggle(state, id);\n const on = !state.selected.has(id);\n const selected = new Set(state.selected);\n const [start, end] = from < to ? [from, to] : [to, from];\n for (let i = start; i <= end; i += 1) {\n const rowId = state.ids[i]!;\n if (on) selected.add(rowId);\n else selected.delete(rowId);\n }\n return { ...state, selected, anchor: id };\n}\n\nfunction sync(state: RowSelectionState, ids: readonly string[]): RowSelectionState {\n if (sameIds(state.ids, ids)) return state;\n const present = new Set(ids);\n let selected = state.selected;\n for (const id of state.selected) {\n if (present.has(id)) continue;\n selected = new Set([...state.selected].filter((x) => present.has(x)));\n break;\n }\n const anchor = state.anchor !== null && present.has(state.anchor) ? state.anchor : null;\n return { ids, selected, anchor };\n}\n\n/** Pure: returns `state` itself when an event changes nothing, so React can bail out. */\nexport function rowSelectionReducer(state: RowSelectionState, event: RowSelectionEvent): RowSelectionState {\n switch (event.type) {\n case 'selection.sync':\n return sync(state, event.ids);\n case 'selection.toggle':\n return toggle(state, event.id);\n case 'selection.toggleRange':\n return toggleRange(state, event.id);\n case 'selection.selectAll':\n return state.selected.size === state.ids.length ? state : { ...state, selected: new Set(state.ids) };\n case 'selection.clear':\n return state.selected.size === 0 && state.anchor === null\n ? state\n : { ...state, selected: new Set(), anchor: null };\n }\n}\n\nexport function headerState(state: RowSelectionState): RowSelectionHeaderState {\n if (state.selected.size === 0) return 'none';\n return state.selected.size === state.ids.length ? 'all' : 'some';\n}\n\n/** The selected ids in visible order. */\nexport function selectedIds(state: RowSelectionState): string[] {\n return state.ids.filter((id) => state.selected.has(id));\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { Button } from '../Button/Button';\nimport { Toolbar } from '../Toolbar/Toolbar';\nimport { cx } from '../../utils/cx';\n\nexport interface SelectionBarProps {\n /** How many rows are selected. The bar shows from 1 and leaves at 0. */\n count: number;\n /** Clears the selection (the Clear button). */\n onClear: () => void;\n /** The actions, each a `Toolbar.Button`: `<Toolbar.Button render={<Button size=\"sm\" variant=\"secondary\" />}>Close 3</Toolbar.Button>`. */\n children?: ReactNode | undefined;\n /** Names the toolbar. Default \"Bulk actions\". */\n 'aria-label'?: string | undefined;\n /** The count text, visible and announced. Default `${count} selected`. */\n countLabel?: ((count: number) => string) | undefined;\n /** Default \"Clear\". */\n clearLabel?: string | undefined;\n /** Announced when the selection goes back to none. Default \"Selection cleared\". */\n clearedMessage?: string | undefined;\n className?: string | undefined;\n}\n\nconst defaultCountLabel = (count: number) => `${count} selected`;\n/** Matches `--sc-duration-base` in selection-bar.css: the bar stays mounted this long to fade out. */\nconst LEAVE_MS = 200;\n\n/**\n * A floating bar for bulk actions on selected rows, centred at the bottom of the viewport: the count, the actions\n * and Clear, as one Toolbar (one tab stop, arrow keys inside). A polite status region announces the count as it\n * changes. Put it after the table, at the end of the scrolling content: while it shows, it leaves a spacer as\n * tall as itself there, so the last rows can scroll clear of it. When it leaves while holding focus (an action\n * cleared the selection), focus goes back to where it came from, usually the last row checkbox.\n */\nexport function SelectionBar({\n count,\n onClear,\n children,\n 'aria-label': ariaLabel = 'Bulk actions',\n countLabel = defaultCountLabel,\n clearLabel = 'Clear',\n clearedMessage = 'Selection cleared',\n className,\n}: SelectionBarProps) {\n const open = count > 0;\n // Nothing is announced on load; \"cleared\" only after there was a selection.\n const [hadSelection, setHadSelection] = useState(open);\n if (open && !hadSelection) setHadSelection(true);\n const message = open ? countLabel(count) : hadSelection ? clearedMessage : '';\n\n // Stay mounted for the fade-out, still showing the last count.\n const [rendered, setRendered] = useState(open);\n const [shownCount, setShownCount] = useState(count);\n if (open && !rendered) setRendered(true);\n if (open && shownCount !== count) setShownCount(count);\n useEffect(() => {\n if (open || !rendered) return;\n const timer = setTimeout(() => setRendered(false), LEAVE_MS);\n return () => clearTimeout(timer);\n }, [open, rendered]);\n\n const barRef = useRef<HTMLDivElement>(null);\n const returnTo = useRef<HTMLElement | null>(null);\n useLayoutEffect(() => {\n const bar = barRef.current;\n if (open || !bar?.contains(bar.ownerDocument.activeElement)) return;\n if (returnTo.current?.isConnected) returnTo.current.focus();\n }, [open]);\n\n // The spacer follows the bar's height (it wraps on narrow screens).\n const [height, setHeight] = useState(0);\n useEffect(() => {\n const bar = barRef.current;\n if (!rendered || !bar || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => setHeight(entry!.borderBoxSize[0]?.blockSize ?? 0));\n observer.observe(bar);\n return () => observer.disconnect();\n }, [rendered]);\n\n return (\n <>\n <span role=\"status\" className=\"sc-visually-hidden\">\n {message}\n </span>\n {rendered ? (\n <>\n {open ? (\n <div\n className=\"sc-selection-bar__spacer\"\n style={{ '--sc-selection-bar-height': `${height}px` } as CSSProperties}\n aria-hidden=\"true\"\n />\n ) : null}\n <div\n ref={barRef}\n className={cx('sc-selection-bar', className)}\n data-open={open || undefined}\n onFocus={(event) => {\n const from = event.relatedTarget;\n if (from instanceof HTMLElement && !event.currentTarget.contains(from)) returnTo.current = from;\n }}\n >\n <Toolbar.Root aria-label={ariaLabel} className=\"sc-selection-bar__toolbar\">\n <span className=\"sc-selection-bar__count\">{countLabel(shownCount)}</span>\n <Toolbar.Separator />\n {children}\n <Toolbar.Spacer />\n <Toolbar.Button render={<Button variant=\"ghost\" size=\"sm\" />} onClick={onClear}>\n {clearLabel}\n </Toolbar.Button>\n </Toolbar.Root>\n </div>\n </>\n ) : null}\n </>\n );\n}\n","import { Toast as BaseToast } from '@base-ui/react/toast';\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport { XIcon } from '../../icons/icons.gen';\nimport { Button } from '../Button/Button';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type ToastTone = 'neutral' | 'success' | 'danger' | 'accent';\n\nexport interface ToastOptions {\n /** Required. One line: \"Closed 5 applications\". */\n title: ReactNode;\n description?: ReactNode | undefined;\n /**\n * `neutral` (default), `success` and `danger` colour the edge. `accent` fills the toast with the accent colour, for\n * the rare notice that has to be seen (the app was updated); its buttons read on the fill (`.sc-on-accent`).\n */\n tone?: ToastTone | undefined;\n /**\n * One action, usually Undo. It closes the toast after `onClick`, unless `keepOpen` (the action asks first, and the\n * person may cancel).\n */\n action?: { label: string; onClick: () => void; keepOpen?: boolean | undefined } | undefined;\n /** Milliseconds before it closes; paused while hovered or focused; `0` keeps it. Default: the Provider's. */\n timeout?: number | undefined;\n /** `high` announces assertively (errors). Default `low`, polite. */\n priority?: 'low' | 'high' | undefined;\n /**\n * Names the toast. Adding one whose id is showing updates it in place (new text, the timer starts again) instead\n * of stacking a second.\n */\n id?: string | undefined;\n /** The dismiss control as a text button (\"Later\") instead of the ×. */\n dismissLabel?: string | undefined;\n /** Called once when it closes, however: dismissed, swiped away, its action, its timeout or `close()`. */\n onClose?: (() => void) | undefined;\n}\n\nexport interface ToastProviderProps {\n children?: ReactNode | undefined;\n /** Default auto-close, in milliseconds. Default 6000. */\n timeout?: number | undefined;\n /** How many show at once; older ones close. Default 3. */\n limit?: number | undefined;\n}\n\nconst InsideProvider = createContext(false);\n\n/**\n * Holds the toasts for `useToast()` below it and renders them, bottom-end, above the page. One viewport per page: a\n * Provider inside another adds nothing (its `timeout` and `limit` are ignored), so a component may wrap itself in one\n * and still share the app's.\n */\nfunction Provider({ children, timeout = 6000, limit = 3 }: ToastProviderProps) {\n if (useContext(InsideProvider)) return children;\n return (\n <InsideProvider.Provider value>\n <BaseToast.Provider timeout={timeout} limit={limit}>\n {children}\n <BaseToast.Portal>\n <Viewport />\n </BaseToast.Portal>\n </BaseToast.Provider>\n </InsideProvider.Provider>\n );\n}\n\nfunction Viewport() {\n const { toasts, close } = BaseToast.useToastManager<ToastData>();\n return (\n <BaseToast.Viewport className=\"sc-toast-viewport\">\n {toasts.map((toast) => (\n <BaseToast.Root key={toast.id} toast={toast} className=\"sc-toast\" data-tone={toast.type ?? 'neutral'}>\n <BaseToast.Content className=\"sc-toast__content\">\n <BaseToast.Title className=\"sc-toast__title\" />\n {toast.description != null ? <BaseToast.Description className=\"sc-toast__description\" /> : null}\n </BaseToast.Content>\n {toast.actionProps ? (\n <BaseToast.Action\n className=\"sc-toast__action\"\n render={<Button variant=\"secondary\" size=\"sm\" />}\n />\n ) : null}\n {toast.data?.dismissLabel ? (\n <Button variant=\"ghost\" size=\"sm\" className=\"sc-toast__close\" onClick={() => close(toast.id)}>\n {toast.data.dismissLabel}\n </Button>\n ) : (\n <IconButton label=\"Dismiss\" size=\"sm\" className=\"sc-toast__close\" onClick={() => close(toast.id)}>\n <XIcon />\n </IconButton>\n )}\n </BaseToast.Root>\n ))}\n </BaseToast.Viewport>\n );\n}\n\ninterface ToastData {\n dismissLabel?: string | undefined;\n}\n\nexport interface ToastApi {\n /** Shows a toast and returns its id. */\n add: (options: ToastOptions) => string;\n /** Closes one toast, or every toast without an id. */\n close: (id?: string) => void;\n}\n\n/** Shows toasts from inside a `Toast.Provider`. */\nexport function useToast(): ToastApi {\n const manager = BaseToast.useToastManager<ToastData>();\n return useMemo(\n () => ({\n add: ({\n title,\n description,\n tone = 'neutral',\n action,\n timeout,\n priority,\n id: given,\n dismissLabel,\n onClose,\n }: ToastOptions) => {\n let id = given ?? '';\n id = manager.add({\n title,\n description,\n type: tone,\n data: { dismissLabel },\n ...(given ? { id: given } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n ...(priority ? { priority } : {}),\n ...(onClose ? { onClose } : {}),\n ...(action\n ? {\n actionProps: {\n children: action.label,\n onClick: () => {\n action.onClick();\n if (!action.keepOpen) manager.close(id);\n },\n },\n }\n : {}),\n });\n return id;\n },\n close: manager.close,\n }),\n [manager],\n );\n}\n\n/**\n * Short-lived status messages: \"Closed 5 applications · Undo\". Built on Base UI's Toast: announced through a\n * polite region (`priority: 'high'` for errors), paused while hovered or focused, F6 moves focus to them.\n */\nexport const Toast = { Provider };\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type StatTrend = 'up' | 'down' | 'flat';\nexport type StatDeltaTone = 'positive' | 'negative' | 'neutral';\nexport type StatElement = 'div' | 'li' | 'article';\nexport type StatVariant = 'outlined' | 'filled' | 'plain';\nexport type StatSize = 'sm' | 'md';\n\nexport interface StatProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n /** What the number is: \"Applications\", \"Reply rate\". */\n label: ReactNode;\n /** The number, already formatted: \"1,204\", \"37%\". */\n value: ReactNode;\n /** The change beside the value: \"+12\", \"−3.1 pts\", \"same as last week\". */\n delta?: ReactNode | undefined;\n /** Colour of the delta: `positive` green, `negative` red, `neutral` muted (default). Say which is good; up is not always good. */\n deltaTone?: StatDeltaTone | undefined;\n /** Arrow before the delta. */\n trend?: StatTrend | undefined;\n /** Muted line under the value: \"last 7 days\", \"of 2,000 budget\". */\n hint?: ReactNode | undefined;\n /** A 20px icon in the corner. Decorative. */\n icon?: ReactNode | undefined;\n /** `outlined` surface (default), `filled` inset, `plain` no surface for a row of stats inside a Card. */\n variant?: StatVariant | undefined;\n /** `md` (default) or `sm` for dense rows. */\n size?: StatSize | undefined;\n /** Element to render; `li` in a list of stats. */\n as?: StatElement | undefined;\n}\n\nconst trendIcons: Record<StatTrend, ReactNode> = {\n up: <ArrowUpIcon size=\"xs\" />,\n down: <ArrowDownIcon size=\"xs\" />,\n flat: <ArrowRightIcon size=\"xs\" />,\n};\n\n/** One number with its label: a KPI tile. The value is text, so it reads as \"Applications, 1,204, up 12\". */\nexport function Stat({\n label,\n value,\n delta,\n deltaTone = 'neutral',\n trend,\n hint,\n icon,\n variant = 'outlined',\n size = 'md',\n as = 'div',\n className,\n ...rest\n}: StatProps) {\n return createElement(\n as,\n {\n className: cx('sc-stat', className),\n 'data-variant': variant,\n 'data-size': size,\n ...rest,\n },\n <>\n <div className=\"sc-stat__label\">{label}</div>\n {icon ? (\n <span className=\"sc-stat__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <div className=\"sc-stat__value\">{value}</div>\n {delta != null ? (\n <div className=\"sc-stat__delta\" data-tone={deltaTone}>\n {trend ? (\n <span className=\"sc-stat__trend\" aria-hidden=\"true\">\n {trendIcons[trend]}\n </span>\n ) : null}\n {trend ? (\n <span className=\"sc-visually-hidden\">{trend === 'flat' ? 'unchanged' : trend} </span>\n ) : null}\n {delta}\n </div>\n ) : null}\n {hint != null ? <div className=\"sc-stat__hint\">{hint}</div> : null}\n </>,\n );\n}\n","import type { ComponentPropsWithRef, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type ChipTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\nexport type ChipSize = 'sm' | 'md';\n\nexport interface ChipProps extends Omit<ComponentPropsWithRef<'span'>, 'onClick' | 'onRemove'> {\n /** The chip text. Keep it to a word or three. */\n children: ReactNode;\n /** A 14px icon before the text. Decorative. */\n icon?: ReactNode | undefined;\n /** Colour. `neutral` (default) for filters, a status tone when the chip is the status. */\n tone?: ChipTone | undefined;\n /** `md` 32px (default) or `sm` 24px inside table rows and Card headers. */\n size?: ChipSize | undefined;\n /** Filled and `aria-pressed`. Use with `onClick` for a toggling filter chip. */\n selected?: boolean | undefined;\n /** Makes the chip a `<button>` that toggles; `selected` is reflected as `aria-pressed`. */\n onClick?: ((event: MouseEvent<HTMLButtonElement>) => void) | undefined;\n /**\n * Adds a labelled × that calls this. Backspace or Delete on the focused chip (or on the ×) removes it\n * too. Focus is yours to manage after removal: move it to the next chip or the filter input.\n */\n onRemove?: (() => void) | undefined;\n /** Accessible name of the ×. Default \"Remove\" followed by the chip text when that text is a string. */\n removeLabel?: string | undefined;\n disabled?: boolean | undefined;\n}\n\n/**\n * A small pill: an applied filter, a tag, a selectable option in a row of a few. `onClick` makes it a\n * toggle button, `onRemove` adds the ×, and the two combine. Plain text otherwise.\n */\nexport function Chip({\n children,\n icon,\n tone = 'neutral',\n size = 'md',\n selected = false,\n onClick,\n onRemove,\n removeLabel,\n disabled = false,\n className,\n ...rest\n}: ChipProps) {\n const interactive = onClick !== undefined;\n const removeName = removeLabel ?? (typeof children === 'string' ? `Remove ${children}` : 'Remove');\n const handleRemoveKey = (event: KeyboardEvent<HTMLElement>) => {\n if (onRemove && !disabled && (event.key === 'Backspace' || event.key === 'Delete')) {\n event.preventDefault();\n onRemove();\n }\n };\n const shared = {\n className: cx('sc-chip', className),\n 'data-tone': tone,\n 'data-size': size,\n 'data-selected': selected || undefined,\n 'data-removable': onRemove ? '' : undefined,\n 'data-disabled': disabled || undefined,\n };\n const body = (\n <>\n {icon ? (\n <span className=\"sc-chip__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className=\"sc-chip__label\">{children}</span>\n </>\n );\n const remove = onRemove ? (\n <button\n type=\"button\"\n className=\"sc-chip__remove\"\n aria-label={removeName}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onRemove();\n }}\n onKeyDown={handleRemoveKey}\n >\n <XIcon size=\"xs\" />\n </button>\n ) : null;\n\n if (interactive) {\n return (\n <span {...shared} {...rest}>\n <button\n type=\"button\"\n className=\"sc-chip__action\"\n aria-pressed={selected}\n disabled={disabled}\n onClick={onClick}\n onKeyDown={handleRemoveKey}\n >\n {body}\n </button>\n {remove}\n </span>\n );\n }\n return (\n <span {...shared} {...rest}>\n {body}\n {remove}\n </span>\n );\n}\n","import {\n type CSSProperties,\n useEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type ReactNode,\n type SyntheticEvent,\n} from 'react';\nimport { ChevronDownIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport interface DisclosureProps extends Omit<ComponentPropsWithRef<'details'>, 'open' | 'onToggle'> {\n /** Required. The summary line, a verb phrase: \"Show full description\". */\n summary: ReactNode;\n /** Replaces `summary` while open: \"Show less\". */\n summaryOpen?: ReactNode | undefined;\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the user toggles it. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /**\n * While closed, shows this many lines of the content fading out, so a long description still reads\n * as a teaser. Puts the summary line under the preview. Needs `::details-content` (2025 browsers);\n * older ones show the summary alone.\n */\n previewLines?: number | undefined;\n /** Puts the summary line above (default) or below the content. Defaults to `end` with `previewLines`. */\n summaryPosition?: 'start' | 'end' | undefined;\n children?: ReactNode | undefined;\n}\n\n/**\n * A native `<details>` collapse with a styled summary. Works without JavaScript, is announced as a\n * disclosure, and shares `name` with siblings for an exclusive group.\n */\nexport function Disclosure({\n summary,\n summaryOpen,\n open,\n defaultOpen = false,\n onOpenChange,\n previewLines,\n summaryPosition,\n className,\n style,\n children,\n ref,\n ...rest\n}: DisclosureProps) {\n const controlled = open !== undefined;\n const [internal, setInternal] = useState(defaultOpen);\n const isOpen = controlled ? open : internal;\n const inner = useRef<HTMLDetailsElement | null>(null);\n // A native toggle flips the element itself; when controlled and the parent declines, put it back.\n useEffect(() => {\n if (controlled && inner.current && inner.current.open !== open) inner.current.open = open;\n });\n const onToggle = (event: SyntheticEvent<HTMLDetailsElement>) => {\n const next = event.currentTarget.open;\n if (next === isOpen) return;\n if (!controlled) setInternal(next);\n onOpenChange?.(next);\n };\n const position = summaryPosition ?? (previewLines ? 'end' : 'start');\n return (\n <details\n ref={(node) => {\n inner.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n className={cx('sc-disclosure', className)}\n open={isOpen}\n onToggle={onToggle}\n data-summary-position={position}\n data-preview={previewLines ? '' : undefined}\n style={previewLines ? ({ ...style, '--_lines': previewLines } as CSSProperties) : style}\n {...rest}\n >\n <summary className=\"sc-disclosure__summary\">\n <ChevronDownIcon className=\"sc-disclosure__chevron\" />\n <span className=\"sc-disclosure__summary-text\">\n {isOpen && summaryOpen != null ? summaryOpen : summary}\n </span>\n </summary>\n <div className=\"sc-disclosure__content\">{children}</div>\n </details>\n );\n}\n","import { createElement, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type EmptyStateSize = 'sm' | 'md';\nexport type EmptyStateElement = 'div' | 'section' | 'li';\n\nexport interface EmptyStateProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {\n /** Required. What is empty, as a short statement: \"No applications yet\". */\n title: ReactNode;\n /** One sentence on why, or what to do: \"Postings you apply to show up here.\" */\n description?: ReactNode | undefined;\n /** A 24px icon in a muted circle above the title. Decorative. */\n icon?: ReactNode | undefined;\n /** The actions, usually one primary Button and at most one secondary. Rendered in an Inline. */\n children?: ReactNode | undefined;\n /** `md` (default) for a whole view or panel, `sm` inside a Card or a table body. */\n size?: EmptyStateSize | undefined;\n /** Element to render. Default `div`. */\n as?: EmptyStateElement | undefined;\n}\n\n/**\n * Centred placeholder for a view with nothing in it: an icon, a title, a sentence and the action that\n * fills it. Say what is missing and the next step; never apologise.\n */\nexport function EmptyState({\n title,\n description,\n icon,\n children,\n size = 'md',\n as = 'div',\n className,\n ...rest\n}: EmptyStateProps) {\n return createElement(\n as,\n { className: cx('sc-empty-state', className), 'data-size': size, ...rest },\n icon ? (\n <span className=\"sc-empty-state__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null,\n <p className=\"sc-empty-state__title\">{title}</p>,\n description != null ? <p className=\"sc-empty-state__description\">{description}</p> : null,\n children != null ? <div className=\"sc-empty-state__actions\">{children}</div> : null,\n );\n}\n","import type { ComponentPropsWithRef, CSSProperties } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type SkeletonVariant = 'text' | 'rect' | 'circle';\n\nexport interface SkeletonProps extends ComponentPropsWithRef<'span'> {\n /** `text` (default) is one line of the current font size; `rect` a block; `circle` an avatar. */\n variant?: SkeletonVariant | undefined;\n /** Any CSS length. Default: text `100%`, rect `100%`, circle `40px`. */\n width?: string | number | undefined;\n /** Any CSS length. Default: text `1em` (one line), rect `80px`, circle = `width`. */\n height?: string | number | undefined;\n /** For `text`: how many lines; the last is shorter. Default 1. */\n lines?: number | undefined;\n /** Hides the shimmer. Default `false`; reduced motion hides it anyway. */\n still?: boolean | undefined;\n}\n\n/**\n * A placeholder shape shown while real content loads. It is hidden from assistive tech: put\n * `aria-busy=\"true\"` on the region being filled, or a `Spinner` with a label beside it, so the loading\n * state is announced once instead of per block.\n */\nexport function Skeleton({\n variant = 'text',\n width,\n height,\n lines = 1,\n still = false,\n className,\n style,\n ...rest\n}: SkeletonProps) {\n const size: CSSProperties = {\n ...style,\n ...(width !== undefined ? { inlineSize: width } : {}),\n ...(height !== undefined ? { blockSize: height } : {}),\n };\n if (variant === 'text' && lines > 1) {\n return (\n <span className={cx('sc-skeleton-lines', className)} aria-hidden=\"true\" style={style} {...rest}>\n {Array.from({ length: lines }, (_, i) => (\n <span\n key={i}\n className=\"sc-skeleton\"\n data-variant=\"text\"\n data-still={still || undefined}\n data-last={i === lines - 1 || undefined}\n style={width !== undefined ? { inlineSize: width } : undefined}\n />\n ))}\n </span>\n );\n }\n return (\n <span\n className={cx('sc-skeleton', className)}\n data-variant={variant}\n data-still={still || undefined}\n aria-hidden=\"true\"\n style={size}\n {...rest}\n />\n );\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport type * as FilePondApi from 'filepond';\nimport type { FilePond, FilePondFile, FilePondOptions } from 'filepond';\nimport type { FieldProps } from '../Field/FieldShell';\nimport { cx } from '../../utils/cx';\nimport { FilePreviewDialog } from '../FilePreviewDialog/FilePreviewDialog';\nimport {\n describeAccept,\n escapeHtml,\n matchesAccept,\n parseAccept,\n parseSize,\n previewKind,\n rejectionMessage,\n type FileRejectionReason,\n} from './accept';\n\nexport interface FileInputProps extends FieldProps {\n /** Accepted types, as for the native attribute: `\".pdf,.docx,text/plain\"` or a list. Extensions, exact MIME types and `image/*` wildcards. */\n accept?: string | readonly string[] | undefined;\n /** How the accepted types read in the error message. Default derived from `accept` (\"PDF, DOCX or plain text\"). */\n acceptLabel?: string | undefined;\n /** Largest file accepted, in bytes or as `\"10MB\"` (base 1000, like the size shown in the list). */\n maxFileSize?: number | string | undefined;\n /** Allows several files. Without it a new file replaces the current one. */\n multiple?: boolean | undefined;\n /** With `multiple`, the most files the list holds. */\n maxFiles?: number | undefined;\n /** Controlled list of accepted files. Pass `[]` to clear. */\n files?: readonly File[] | undefined;\n /** Initial files when uncontrolled. */\n defaultFiles?: readonly File[] | undefined;\n /** Called with the accepted files (plain `File` objects) after every add or remove. Rejected files never appear here. */\n onFilesChange?: ((files: File[]) => void) | undefined;\n /** Drop zone text before the browse link. Default \"Drop a file here or\" (or \"Drop files here or\" with `multiple`). */\n idleLabel?: string | undefined;\n /** The browse link's text. Default \"browse\". */\n browseLabel?: string | undefined;\n /**\n * Lets people check a file before it is uploaded: the name of each PDF, plain text, Markdown or image\n * file becomes a button that opens it in a `FilePreviewDialog`. Other types (DOCX …) show a plain name.\n * Default `true`; no preview while `disabled`.\n */\n preview?: boolean | undefined;\n}\n\ntype FilePondModule = typeof FilePondApi;\n\nconst REMOVE_ICON =\n '<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M4 4l8 8M12 4l-8 8\"/></svg>';\n\nconst sameFiles = (a: readonly File[], b: readonly File[]) =>\n a.length === b.length && a.every((file, i) => file === b[i]);\n\n/**\n * A labelled file picker with a drop zone, on FilePond (docs/adr/0004). Files stay in the browser: the\n * component hands plain `File` objects to `onFilesChange`, and with `name` it also keeps them in a file\n * input so a `<form>` (or a Server Action) submits them. Type, size and count are checked before a file\n * joins the list; a rejected file never joins it, and the reason shows in the field's error slot and is\n * announced. FilePond loads on mount, so the server renders a static drop zone and nothing of FilePond.\n */\nexport function FileInput({\n label,\n hideLabel = false,\n description,\n error,\n invalid = false,\n required = false,\n disabled = false,\n name,\n size = 'md',\n className,\n accept,\n acceptLabel,\n maxFileSize,\n multiple = false,\n maxFiles,\n files,\n defaultFiles,\n onFilesChange,\n idleLabel,\n browseLabel = 'browse',\n preview = true,\n}: FileInputProps) {\n const id = useId();\n const labelId = `${id}label`;\n const descriptionId = `${id}description`;\n const messagesId = `${id}messages`;\n\n const controlled = files !== undefined;\n const [uncontrolledFiles, setUncontrolledFiles] = useState<readonly File[]>(defaultFiles ?? []);\n const current = controlled ? files : uncontrolledFiles;\n\n const [rejections, setRejections] = useState<string[]>([]);\n const [inputId, setInputId] = useState<string>();\n /** The file in the preview dialog (kept while it closes) and the row button that opened it. */\n const [previewFile, setPreviewFile] = useState<File | null>(null);\n const [previewOpen, setPreviewOpen] = useState(false);\n const previewTriggerRef = useRef<HTMLButtonElement | null>(null);\n /** Bumps every time a pond is created, so the sync effects run against the new instance. */\n const [pondVersion, setPondVersion] = useState(0);\n\n const hostRef = useRef<HTMLDivElement>(null);\n const pondRef = useRef<FilePond | null>(null);\n const moduleRef = useRef<FilePondModule | null>(null);\n const patchRef = useRef<() => void>(() => {});\n /** The files last handed out (or received), so FilePond's repeated events don't re-emit. */\n const settledRef = useRef<readonly File[]>(current);\n /** While the pond is being brought to the `files` prop, the list it should reach. */\n const targetRef = useRef<readonly File[] | null>(null);\n\n const acceptList = parseAccept(accept);\n const acceptAttr = acceptList.join(',');\n const maxBytes = parseSize(maxFileSize);\n const messages = [...rejections, ...(error != null ? [error] : [])];\n const isInvalid = invalid || messages.length > 0;\n const idleText =\n idleLabel ??\n (multiple\n ? 'Drop files here or'\n : current.length > 0\n ? 'Drop another file to replace it, or'\n : 'Drop a file here or');\n\n // Everything the long-lived FilePond callbacks read, refreshed on every render.\n const live = {\n acceptList,\n acceptLabel: acceptLabel ?? describeAccept(acceptList),\n maxBytes,\n maxFiles: multiple ? maxFiles : 1,\n multiple,\n current,\n controlled,\n onFilesChange,\n labelId,\n describedBy: [description != null ? descriptionId : null, messages.length > 0 ? messagesId : null],\n isInvalid,\n acceptAttr,\n preview: preview && !disabled,\n openPreview: (file: File, trigger: HTMLButtonElement) => {\n previewTriggerRef.current = trigger;\n setPreviewFile(file);\n setPreviewOpen(true);\n },\n };\n const liveRef = useRef(live);\n useEffect(() => {\n liveRef.current = live;\n });\n\n // Create the pond on mount; destroy it on unmount (and between StrictMode's double mount).\n useEffect(() => {\n let cancelled = false;\n let pond: FilePond | null = null;\n let observer: MutationObserver | null = null;\n const host = hostRef.current;\n if (!host) return undefined;\n\n const reject = (reason: FileRejectionReason, file?: File) => {\n const l = liveRef.current;\n const message = rejectionMessage(reason, {\n name: file?.name,\n size: file?.size,\n acceptLabel: l.acceptLabel,\n maxFileSize: l.maxBytes,\n maxFiles: l.maxFiles,\n });\n setRejections((list) => (list.includes(message) ? list : [...list, message]));\n // A file the `files` prop asked for but that fails validation: stop waiting for it.\n if (file && targetRef.current) {\n targetRef.current = targetRef.current.filter((f) => f !== file);\n queueMicrotask(emit);\n }\n };\n // A new drop or browse starts a new attempt: earlier rejections no longer apply.\n const startAttempt = () => setRejections((list) => (list.length ? [] : list));\n let removeIntent = false;\n const acceptedIds = new Set<string>();\n const noteRemove = (event: Event) => {\n if ((event.target as Element | null)?.closest?.('.filepond--action-remove-item')) removeIntent = true;\n };\n const onPreviewClick = (event: Event) => {\n const button = (event.target as Element | null)?.closest?.<HTMLButtonElement>(\n '.sc-file-input__preview',\n );\n const file = button?.dataset.fileId ? pond?.getFile(button.dataset.fileId)?.file : null;\n if (!button || !(file instanceof File)) return;\n // FilePond treats a click in a row as \"activate item\"; this click is ours.\n event.stopPropagation();\n liveRef.current.openPreview(file, button);\n };\n\n const emit = () => {\n const mod = moduleRef.current;\n if (!pond || !mod) return;\n const idle = pond\n .getFiles()\n .filter((item: FilePondFile) => item.status === mod.FileStatus.IDLE)\n .map((item: FilePondFile) => item.file as File);\n // Single mode: a new accepted file replaces the old one, which leaves a beat later.\n const accepted = liveRef.current.multiple ? idle : idle.slice(-1);\n const target = targetRef.current;\n if (target) {\n if (!sameFiles(accepted, target)) return;\n targetRef.current = null;\n settledRef.current = accepted;\n // The prop (or `defaultFiles`) asked for a file that was rejected: report what the pond holds.\n if (!sameFiles(accepted, liveRef.current.current)) {\n if (!liveRef.current.controlled) setUncontrolledFiles(accepted);\n liveRef.current.onFilesChange?.(accepted);\n }\n return;\n }\n if (sameFiles(accepted, settledRef.current)) return;\n settledRef.current = accepted;\n if (!liveRef.current.controlled) setUncontrolledFiles(accepted);\n liveRef.current.onFilesChange?.(accepted);\n };\n\n // Keeps FilePond's DOM wired to our label, description, errors and keyboard model.\n const patch = () => {\n if (!pond) return;\n const l = liveRef.current;\n const root = pond.element;\n if (!root) return;\n const set = (el: Element | null, attr: string, value: string | null) => {\n if (!el || el.getAttribute(attr) === value) return;\n if (value == null) el.removeAttribute(attr);\n else el.setAttribute(attr, value);\n };\n const input = root.querySelector<HTMLInputElement>('input.filepond--browser');\n const dropLabel = root.querySelector('.filepond--drop-label label');\n set(input, 'aria-labelledby', l.labelId);\n set(input, 'aria-describedby', [dropLabel?.id, ...l.describedBy].filter(Boolean).join(' ') || null);\n set(input, 'aria-invalid', l.isInvalid ? 'true' : null);\n set(input, 'accept', l.acceptAttr || null);\n // FilePond always runs in multi mode here (see `addfile`); the picker follows `multiple`.\n set(input, 'multiple', l.multiple ? '' : null);\n // One tab stop: the file input. FilePond also makes the \"browse\" text focusable, with no role.\n set(root.querySelector('.filepond--label-action'), 'tabindex', null);\n for (const item of root.querySelectorAll('.filepond--item')) {\n const fileName = item.querySelector('.filepond--file-info-main')?.textContent?.trim();\n const remove = item.querySelector('.filepond--action-remove-item');\n if (fileName) set(remove, 'aria-label', `Remove ${fileName}`);\n patchPreview(item, remove);\n }\n // FilePond drops its file input while disabled; the label's `for` follows.\n setInputId(input?.id || undefined);\n };\n\n // The file's name as a real button, a foreign node in FilePond's row. It goes before the × so the tab\n // order follows the row (name, then remove); FilePond attaches a row's children once, when it creates\n // the row, and never re-inserts them by index, so the extra node does not disturb it. FilePond's own\n // name span stays (it holds a reference to it) and is hidden by CSS while the button is there.\n const patchPreview = (item: Element, remove: Element | null) => {\n const row = item.querySelector('.filepond--file');\n if (!row) return;\n let button = row.querySelector<HTMLButtonElement>(':scope > .sc-file-input__preview');\n const id = item.id.replace(/^filepond--item-/, '');\n const file = pond?.getFile(id)?.file;\n if (!liveRef.current.preview || !(file instanceof File) || previewKind(file) == null) {\n button?.remove();\n return;\n }\n if (!button) {\n button = document.createElement('button');\n button.type = 'button';\n button.className = 'sc-file-input__preview';\n row.insertBefore(button, remove ?? row.firstChild);\n }\n // Only write what changed: these writes are seen by the observer that called this.\n if (button.dataset.fileId !== id) button.dataset.fileId = id;\n if (button.textContent !== file.name) button.textContent = file.name;\n const name = `Preview ${file.name}`;\n if (button.getAttribute('aria-label') !== name) button.setAttribute('aria-label', name);\n };\n\n void import('filepond').then((mod) => {\n if (cancelled || !mod.supported()) return;\n moduleRef.current = mod;\n const options: FilePondOptions = {\n credits: false,\n allowPaste: false,\n allowReorder: false,\n allowProcess: false,\n allowRevert: false,\n instantUpload: false,\n dropOnPage: false,\n // Always multi: FilePond's own single mode replaces the current file *before* validating the new\n // one, so a rejected file would discard a good one. Replacement happens in `addfile` instead.\n allowMultiple: true,\n allowReplace: false,\n itemInsertLocation: 'after',\n fileSizeBase: 1000,\n iconRemove: REMOVE_ICON,\n labelButtonRemoveItem: 'Remove',\n styleButtonRemoveItemPosition: 'right',\n beforeAddFile: (item) => {\n const l = liveRef.current;\n const file = item.file as File;\n if (!matchesAccept(file, l.acceptList)) return (reject('type', file), false);\n if (l.maxBytes != null && file.size > l.maxBytes) return (reject('size', file), false);\n return true;\n },\n };\n // At runtime `create(options)` builds a detached root; the typings only declare `create(element, options)`.\n pond = (mod.create as unknown as (o: FilePondOptions) => FilePond)(options);\n const root = pond.element;\n if (!root) return;\n host.appendChild(root);\n pondRef.current = pond;\n patchRef.current = patch;\n pond.on('addfile', (error: unknown, added: FilePondFile) => {\n if (!error) acceptedIds.add(added.id);\n if (!error && !liveRef.current.multiple)\n for (const other of pond?.getFiles() ?? []) if (other.id !== added.id) pond?.removeFile(other.id);\n emit();\n });\n pond.on('removefile', (_error: unknown, removed: FilePondFile) => {\n // Removing with the × takes focus with it; hand it back to the field's control.\n const active = document.activeElement;\n const inRemovedRow = active?.closest('.filepond--item')?.id === `filepond--item-${removed.id}`;\n if (inRemovedRow || (removeIntent && (active == null || active === document.body)))\n root.querySelector<HTMLInputElement>('input.filepond--browser')?.focus();\n removeIntent = false;\n // An accepted file leaving (the × or the `files` prop) ends the attempt a rejection was about. A\n // rejected file never fired `addfile`, so its own removal keeps the message.\n if (acceptedIds.delete(removed.id)) startAttempt();\n emit();\n });\n pond.on('updatefiles', emit);\n pond.on('warning', (warning: { body?: string } | undefined) => {\n if (warning?.body === 'Max files') reject('count');\n });\n observer = new MutationObserver(patch);\n observer.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['tabindex', 'aria-labelledby', 'aria-describedby', 'accept', 'id', 'multiple'],\n });\n host.addEventListener('drop', startAttempt, true);\n host.addEventListener('change', startAttempt, true);\n host.addEventListener('click', noteRemove, true);\n host.addEventListener('click', onPreviewClick);\n settledRef.current = [];\n setPondVersion((v) => v + 1);\n });\n\n return () => {\n cancelled = true;\n host.removeEventListener('drop', startAttempt, true);\n host.removeEventListener('change', startAttempt, true);\n host.removeEventListener('click', noteRemove, true);\n host.removeEventListener('click', onPreviewClick);\n observer?.disconnect();\n if (pond) {\n pond.element?.remove();\n pond.destroy();\n }\n pondRef.current = null;\n patchRef.current = () => {};\n };\n }, []);\n\n // Props → FilePond options and DOM wiring.\n useEffect(() => {\n const pond = pondRef.current;\n if (!pond) return;\n pond.setOptions({\n name: name ?? '',\n storeAsFile: name != null,\n disabled,\n required,\n maxFiles: multiple ? (maxFiles ?? null) : null,\n allowRemove: !disabled,\n labelIdle: `${escapeHtml(idleText)} <span class=\"filepond--label-action\">${escapeHtml(browseLabel)}</span>`,\n });\n // FilePond rewrites some attributes on its next frame; the MutationObserver re-patches then.\n patchRef.current();\n }, [\n pondVersion,\n name,\n disabled,\n required,\n multiple,\n maxFiles,\n idleText,\n browseLabel,\n labelId,\n acceptAttr,\n isInvalid,\n description,\n messages.length,\n preview,\n ]);\n\n // The `files` prop (or `defaultFiles`) → the pond's list.\n useEffect(() => {\n const pond = pondRef.current;\n const mod = moduleRef.current;\n if (!pond || !mod) return;\n const items = pond.getFiles();\n const idle = items.filter((item) => item.status === mod.FileStatus.IDLE);\n const inPond = idle.map((item) => item.file as File);\n if (sameFiles(inPond, current)) {\n settledRef.current = current;\n return;\n }\n targetRef.current = current;\n for (const item of idle) if (!current.includes(item.file as File)) pond.removeFile(item.id);\n const toAdd = current.filter((file) => !inPond.includes(file));\n if (toAdd.length > 0) void pond.addFiles(toAdd);\n }, [current, pondVersion]);\n\n const ready = pondVersion > 0;\n return (\n <div\n className={cx('sc-field', 'sc-file-input-field', className)}\n data-size={size}\n data-disabled={disabled ? '' : undefined}\n data-invalid={isInvalid ? '' : undefined}\n >\n <label\n id={labelId}\n htmlFor={inputId}\n className={cx('sc-field__label', hideLabel && 'sc-visually-hidden')}\n >\n {label}\n {required ? (\n <span className=\"sc-field__required\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </label>\n <div\n className=\"sc-file-input\"\n data-ready={ready ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n data-invalid={isInvalid ? '' : undefined}\n data-multiple={multiple ? '' : undefined}\n >\n {ready ? null : (\n // Server render and first paint: the same drop zone, inert until FilePond takes over.\n <div className=\"sc-file-input__placeholder\" aria-hidden=\"true\">\n {idleText} <span className=\"sc-file-input__browse\">{browseLabel}</span>\n </div>\n )}\n {/* FilePond's root is appended here; React never renders children into this node. */}\n <div ref={hostRef} className=\"sc-file-input__pond\" />\n </div>\n {description != null ? (\n <p id={descriptionId} className=\"sc-field__description\">\n {description}\n </p>\n ) : null}\n {/* Always present so a rejection that appears after a drop is announced. */}\n <div id={messagesId} className=\"sc-file-input__messages\" aria-live=\"polite\">\n {messages.map((message, i) => (\n <p key={i} className=\"sc-field__error\">\n {message}\n </p>\n ))}\n </div>\n {previewFile ? (\n <FilePreviewDialog\n file={previewFile}\n open={previewOpen}\n onOpenChange={setPreviewOpen}\n // Focus returns to the name button; Safari does not focus a button on click, so say so.\n finalFocus={() => {\n const trigger = previewTriggerRef.current;\n if (trigger?.isConnected) return trigger;\n return hostRef.current?.querySelector<HTMLInputElement>('input.filepond--browser') ?? true;\n }}\n />\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Dialog, type DialogContentProps } from '../Dialog/Dialog';\nimport { ExternalLinkIcon } from '../../icons/icons.gen';\nimport { fileTypeLabel, formatListSize, formatSize, previewKind } from '../FileInput/accept';\nimport { useMediaQuery } from '../../utils/useMediaQuery';\n\nexport interface FilePreviewDialogProps {\n /** The file to show. Kept while the dialog closes, so pass `null` only once it has. */\n file: File | null | undefined;\n /** Controlled open state. */\n open: boolean;\n /** Called when the dialog asks to close (Esc, the ×, the backdrop). */\n onOpenChange: (open: boolean) => void;\n /** Where focus goes on close. Default: the element that had focus when it opened. */\n finalFocus?: DialogContentProps['finalFocus'];\n}\n\n/** Text files longer than this show their beginning only. */\nconst TEXT_LIMIT = 1_000_000;\n/** Below this width a PDF opens in a new tab instead of a frame (iOS Safari only draws page 1 in a frame). */\nconst NARROW = '(max-width: 48rem)';\n\n/**\n * Shows a local file before it is uploaded: a PDF in the browser's own viewer, plain text and Markdown as\n * text, an image as an image. Any other type gets a short note and nothing else, because a blob URL runs\n * with the page's origin: only a PDF is ever framed, and it is re-typed `application/pdf` first, so an HTML\n * file named `.pdf` cannot run. The object URL exists only while the dialog is open.\n */\nexport function FilePreviewDialog({ file, open, onOpenChange, finalFocus }: FilePreviewDialogProps) {\n const kind = file ? previewKind(file) : null;\n const narrow = useMediaQuery(NARROW);\n const pdfInTab = kind === 'pdf' && narrow;\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content\n size=\"lg\"\n className=\"sc-file-preview\"\n data-kind={kind ?? 'none'}\n finalFocus={finalFocus}\n >\n <Dialog.Close />\n {file ? (\n <>\n <Dialog.Title>{file.name}</Dialog.Title>\n <Dialog.Description>\n {fileTypeLabel(file)}, {formatListSize(file.size)}\n </Dialog.Description>\n <Dialog.Body>\n <PreviewBody file={file} kind={kind} open={open} pdfInTab={pdfInTab} />\n </Dialog.Body>\n </>\n ) : (\n <Dialog.Title>Preview</Dialog.Title>\n )}\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nfunction PreviewBody({\n file,\n kind,\n open,\n pdfInTab,\n}: {\n file: File;\n kind: ReturnType<typeof previewKind>;\n open: boolean;\n pdfInTab: boolean;\n}) {\n const frameRef = useRef<HTMLIFrameElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const linkRef = useRef<HTMLAnchorElement>(null);\n const [text, setText] = useState<{ file: File; value: string } | null>(null);\n\n // The object URL lives exactly as long as the dialog is open on this file. It goes straight onto the\n // elements, so nothing renders with a revoked URL.\n useEffect(() => {\n if (!open || (kind !== 'pdf' && kind !== 'image')) return undefined;\n const url = URL.createObjectURL(kind === 'pdf' ? new Blob([file], { type: 'application/pdf' }) : file);\n if (frameRef.current) frameRef.current.src = url;\n if (imageRef.current) imageRef.current.src = url;\n if (linkRef.current) linkRef.current.href = url;\n return () => URL.revokeObjectURL(url);\n }, [open, file, kind, pdfInTab]);\n\n useEffect(() => {\n if (!open || kind !== 'text') return undefined;\n let cancelled = false;\n void file\n .slice(0, TEXT_LIMIT)\n .text()\n .then((value) => {\n if (!cancelled) setText({ file, value });\n });\n return () => {\n cancelled = true;\n };\n }, [open, file, kind]);\n\n if (kind === 'pdf') {\n const link = (\n // eslint-disable-next-line jsx-a11y/anchor-is-valid -- the effect above sets href to the object URL on mount\n <a\n ref={linkRef}\n className=\"sc-button\"\n data-variant={pdfInTab ? 'primary' : 'secondary'}\n data-size=\"md\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open in a new tab\n <ExternalLinkIcon />\n </a>\n );\n return pdfInTab ? (\n <div className=\"sc-file-preview__tab\">\n <p className=\"sc-file-preview__note\">On a small screen the PDF reads best in its own tab.</p>\n {link}\n </div>\n ) : (\n <>\n <iframe ref={frameRef} className=\"sc-file-preview__frame\" title={`Preview of ${file.name}`} />\n <div className=\"sc-file-preview__actions\">{link}</div>\n </>\n );\n }\n if (kind === 'text') {\n const value = text?.file === file ? text.value : null;\n return (\n <>\n <pre\n className=\"sc-file-preview__text\"\n role=\"region\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- a scrolling region takes focus so the keyboard can scroll it\n tabIndex={0}\n aria-label={`Contents of ${file.name}`}\n aria-busy={value == null || undefined}\n >\n {value}\n </pre>\n {file.size > TEXT_LIMIT ? (\n <p className=\"sc-file-preview__note\">Showing the first {formatSize(TEXT_LIMIT)}.</p>\n ) : null}\n </>\n );\n }\n if (kind === 'image') {\n return <img ref={imageRef} className=\"sc-file-preview__image\" alt={file.name} />;\n }\n return <p className=\"sc-file-preview__note\">There is no preview for {fileTypeLabel(file)} files.</p>;\n}\n","// Pure helpers for FileInput: parsing `accept` and sizes, matching files, and wording the messages.\n\n/** Splits `accept` (a native accept string or a list) into lower-cased entries. */\nexport function parseAccept(accept: string | readonly string[] | undefined): string[] {\n if (accept == null) return [];\n const list = typeof accept === 'string' ? accept.split(',') : accept;\n return list.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\n/**\n * Matches a file the way the native `accept` attribute does: `.pdf` against the name, `image/*` against\n * the type's prefix, `application/pdf` exactly. An empty list accepts everything.\n */\nexport function matchesAccept(file: { name: string; type: string }, accept: readonly string[]): boolean {\n if (accept.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return accept.some((entry) => {\n if (entry.startsWith('.')) return name.endsWith(entry);\n if (entry.endsWith('/*')) return type.startsWith(entry.slice(0, -1));\n return type === entry;\n });\n}\n\nconst UNITS: Record<string, number> = { b: 1, kb: 1e3, mb: 1e6, gb: 1e9 };\n\n/** Bytes from a number or a string such as `\"10MB\"` or `\"500 KB\"` (base 1000, like the file list). */\nexport function parseSize(size: number | string | undefined): number | undefined {\n if (size == null) return undefined;\n if (typeof size === 'number') return size;\n const match = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb)\\s*$/i.exec(size);\n if (!match) throw new Error(`FileInput: maxFileSize \"${size}\" is not a size like \"10MB\".`);\n return Math.round(Number(match[1]) * UNITS[match[2]!.toLowerCase()]!);\n}\n\n/** `1500000` → `1.5 MB`. Base 1000, at most one decimal; precise enough for a size limit message. */\nexport function formatSize(bytes: number): string {\n const [unit, base] =\n bytes >= 1e9 ? ['GB', 1e9] : bytes >= 1e6 ? ['MB', 1e6] : bytes >= 1e3 ? ['KB', 1e3] : ['bytes', 1];\n const value = bytes / base;\n return `${Number.isInteger(value) ? value : Number(value.toFixed(1))} ${unit}`;\n}\n\n/**\n * A file's size exactly as FilePond writes it in the list (whole KB rounded down, MB to one decimal, GB to\n * two), so the preview dialog agrees with the row it was opened from.\n */\nexport function formatListSize(bytes: number): string {\n const n = Math.round(Math.abs(bytes));\n const trim = (value: number, decimals: number) => value.toFixed(decimals).replace(/\\.0+$/, '');\n if (n < 1e3) return `${n} bytes`;\n if (n < 1e6) return `${Math.floor(n / 1e3)} KB`;\n if (n < 1e9) return `${trim(n / 1e6, 1)} MB`;\n return `${trim(n / 1e9, 2)} GB`;\n}\n\nconst MIME_NAMES: Record<string, string> = {\n 'application/pdf': 'PDF',\n 'application/msword': 'DOC',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'DOCX',\n 'application/json': 'JSON',\n 'text/plain': 'plain text',\n 'text/markdown': 'Markdown',\n 'text/csv': 'CSV',\n 'image/png': 'PNG',\n 'image/jpeg': 'JPEG',\n};\n\n/** A short human list of the accepted types: `.pdf, .docx, text/plain` → `PDF, DOCX or plain text`. */\nexport function describeAccept(accept: readonly string[]): string {\n const names = accept.map((entry) => {\n if (entry.startsWith('.')) return entry.slice(1).toUpperCase();\n if (entry.endsWith('/*')) return `any ${entry.slice(0, -2)}`;\n return MIME_NAMES[entry] ?? entry.split('/').pop()!.toUpperCase();\n });\n const unique = [...new Set(names)];\n if (unique.length <= 1) return unique[0] ?? '';\n return `${unique.slice(0, -1).join(', ')} or ${unique.at(-1)}`;\n}\n\nexport type FileRejectionReason = 'type' | 'size' | 'count';\n\nexport function rejectionMessage(\n reason: FileRejectionReason,\n detail: {\n name?: string | undefined;\n size?: number | undefined;\n acceptLabel?: string | undefined;\n maxFileSize?: number | undefined;\n maxFiles?: number | undefined;\n },\n): string {\n switch (reason) {\n case 'type':\n return `${detail.name} is not an accepted file type. Use ${detail.acceptLabel}.`;\n case 'size':\n return `${detail.name} is ${formatSize(detail.size ?? 0)}, over the ${formatSize(detail.maxFileSize ?? 0)} limit.`;\n case 'count':\n return detail.maxFiles === 1\n ? 'Choose one file.'\n : `Up to ${detail.maxFiles} files. Remove one to add another.`;\n }\n}\n\n/** Escapes text for FilePond's `labelIdle`, which it sets as HTML. */\nexport function escapeHtml(text: string): string {\n return text.replace(\n /[&<>\"']/g,\n (ch) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[ch]!,\n );\n}\n\n/** What a file can be previewed as before upload, or `null` when it cannot. */\nexport type FilePreviewKind = 'pdf' | 'text' | 'image';\n\nconst extensionOf = (name: string) => {\n const dot = name.lastIndexOf('.');\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : '';\n};\nconst TEXT_EXTENSIONS = new Set(['txt', 'text', 'md', 'markdown']);\nconst TEXT_TYPES = new Set(['text/plain', 'text/markdown', 'text/x-markdown']);\nconst IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'svg', 'bmp']);\n// Image types most browsers cannot draw in an <img>.\nconst UNDRAWABLE_IMAGE_TYPES = new Set(['image/heic', 'image/heif', 'image/tiff']);\n\n/**\n * Classifies a file by extension or MIME type, as `accept` does. Only these three are previewed: a PDF in\n * the browser's viewer, plain text and Markdown as text, images in an `<img>`. Everything else (DOCX, HTML,\n * unknown types) is `null`: a blob URL runs with the page's origin, so nothing else is ever framed.\n */\nexport function previewKind(file: { name: string; type: string }): FilePreviewKind | null {\n const ext = extensionOf(file.name);\n const type = file.type.toLowerCase();\n if (ext === 'pdf' || type === 'application/pdf') return 'pdf';\n if (TEXT_EXTENSIONS.has(ext) || TEXT_TYPES.has(type)) return 'text';\n if (UNDRAWABLE_IMAGE_TYPES.has(type)) return null;\n if (IMAGE_EXTENSIONS.has(ext) || type.startsWith('image/')) return 'image';\n return null;\n}\n\n/** A short type name for a file: `PDF`, `MD`, or the MIME subtype when there is no extension. */\nexport function fileTypeLabel(file: { name: string; type: string }): string {\n const ext = extensionOf(file.name);\n if (ext) return ext.toUpperCase();\n return MIME_NAMES[file.type.toLowerCase()] ?? (file.type.split('/').pop()?.toUpperCase() || 'File');\n}\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/** Whether a media query matches, kept current. `false` on the server and where `matchMedia` is missing. */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = useCallback(\n (onChange: () => void) => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => {};\n const list = window.matchMedia(query);\n list.addEventListener?.('change', onChange);\n return () => list.removeEventListener?.('change', onChange);\n },\n [query],\n );\n return useSyncExternalStore(\n subscribe,\n () => typeof window.matchMedia === 'function' && window.matchMedia(query).matches,\n () => false,\n );\n}\n","import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type CSSProperties,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { ChevronDownIcon, MoreHorizontalIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\nimport { fitCount, inlineFlags, isOverflowing } from './fit';\nimport { placePanel } from './place';\n\nexport interface PriorityNavItem {\n /** Where the link goes. */\n href: string;\n /** The visible text. A string (or number) is part of the width cache key; see `PriorityNav`. */\n label: ReactNode;\n /** A stable key. Defaults to `href`. */\n id?: string | undefined;\n /** The page being shown: `aria-current=\"page\"`, and the link never collapses into \"More\". */\n current?: boolean | undefined;\n /**\n * A small count (`2`) or `'dot'` after the label: something waiting there. `0` shows nothing. Visual only; say\n * what it means in `badgeLabel`. While the item is collapsed, \"More\" shows the summed count (or a dot) and adds\n * the label to its accessible name.\n */\n badge?: number | 'dot' | undefined;\n /** What the badge means, appended to the link's (and, while collapsed, More's) accessible name: \"2 suggestions to review\". A count without it is read as the bare number; a dot without it is not announced. */\n badgeLabel?: string | undefined;\n}\n\n/** What `renderLink` receives: spread it onto your link component. */\nexport interface PriorityNavLinkProps {\n href: string;\n className: string;\n 'aria-current': 'page' | undefined;\n onClick: MouseEventHandler<HTMLAnchorElement> | undefined;\n children: ReactNode;\n}\n\nexport interface PriorityNavProps extends Omit<ComponentPropsWithRef<'nav'>, 'children'> {\n /** Names the landmark: \"Main\". */\n 'aria-label': string;\n /** The links, in priority order: the first ones stay inline longest. */\n items: readonly PriorityNavItem[];\n /** Visible text of the overflow toggle. Default \"More\". */\n moreLabel?: string | undefined;\n /** Appended to the toggle's accessible name only: \"More, 3 links\". Default `n link(s)`. */\n moreCountLabel?: ((hidden: number) => string) | undefined;\n /** Renders each link. Default a plain `<a>`; pass a router link: `(props) => <Link {...props} />`. */\n renderLink?: ((props: PriorityNavLinkProps, item: PriorityNavItem) => ReactElement) | undefined;\n /**\n * Called when links start or stop collapsing into \"More\" (also `data-overflowing` on the `nav`), so a\n * header can make room, e.g. an action button going icon-only.\n */\n onOverflowChange?: ((overflowing: boolean) => void) | undefined;\n /**\n * Room in px the row must have beyond fitting every link before it stops reporting overflow. Set it to\n * the space your header gives back on overflow (the button label's width), so the two cannot oscillate.\n * Default 0.\n */\n overflowHysteresis?: number | undefined;\n}\n\nconst defaultCountLabel = (n: number) => (n === 1 ? '1 link' : `${n} links`);\nconst defaultLink = ({ children, ...props }: PriorityNavLinkProps) => <a {...props}>{children}</a>;\nconst keyOf = (item: PriorityNavItem) => item.id ?? item.href;\n/** The badge to draw, or none: `0`, negative and non-finite counts show nothing. */\nconst badgeOf = (item: PriorityNavItem): number | 'dot' | null =>\n item.badge === 'dot'\n ? 'dot'\n : typeof item.badge === 'number' && item.badge > 0 && Number.isFinite(item.badge)\n ? item.badge\n : null;\n/** What a badge adds to an accessible name. */\nconst badgeTextOf = (item: PriorityNavItem): string | null => {\n const badge = badgeOf(item);\n if (badge === null) return null;\n return item.badgeLabel ?? (badge === 'dot' ? null : String(badge));\n};\n\n/** The visible badge: a count pill or a dot. Decorative; its meaning is in visually hidden text beside it. */\nfunction Badge({ value }: { value: number | 'dot' }) {\n return (\n <span className=\"sc-priority-nav__badge\" data-kind={value === 'dot' ? 'dot' : 'count'} aria-hidden=\"true\">\n {value === 'dot' ? null : value}\n </span>\n );\n}\n\n/** CSS anchor positioning places the panel where it exists; elsewhere `placePanel` does, from JS. */\nconst supportsAnchor = () =>\n typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('anchor-name: --a');\n/** The Popover API puts the panel in the top layer, above every ancestor's overflow clip. */\nconst supportsPopover = (el: HTMLElement) => typeof el.showPopover === 'function';\n\n/** Widths are re-measured when this changes: the keys, any string labels and the badges, in order. */\nfunction signatureOf(items: readonly PriorityNavItem[]): string {\n return items\n .map((item) => {\n const text = typeof item.label === 'string' || typeof item.label === 'number' ? item.label : '';\n return `${keyOf(item)}\\u0001${text}\\u0001${badgeOf(item) ?? ''}`;\n })\n .join('\\u0002');\n}\n\ninterface Fit {\n /** The item signature these numbers were measured for; `null` until the first measurement. */\n signature: string | null;\n /** The current index `count` was computed with. */\n current: number;\n /** How many non-current items are inline (`fitCount`). */\n count: number;\n /** Latched overflow signal (`isOverflowing`). */\n overflowing: boolean;\n}\n\ninterface Measured {\n widths: number[];\n more: number;\n gap: number;\n available: number;\n}\n\n/**\n * Priority+ navigation: a row of primary links that keeps the ones that fit inline and collapses the rest\n * into a \"More\" disclosure at the end of the row. The current page is never collapsed. Follows the\n * WAI-ARIA APG disclosure navigation pattern (links in a list, a real button with `aria-expanded`), not\n * `role=\"menu\"`. Server-renders every link inline, so it works before hydration and without JavaScript;\n * see docs/adr/0005-priority-nav.md.\n */\nexport function PriorityNav({\n items,\n moreLabel = 'More',\n moreCountLabel = defaultCountLabel,\n renderLink = defaultLink,\n onOverflowChange,\n overflowHysteresis = 0,\n className,\n style,\n ...rest\n}: PriorityNavProps) {\n const signature = signatureOf(items);\n const current = items.findIndex((item) => item.current);\n const [fit, setFit] = useState<Fit>({ signature: null, current: -1, count: 0, overflowing: false });\n const [open, setOpen] = useState(false);\n const panelId = useId();\n const listRef = useRef<HTMLUListElement>(null);\n const moreRef = useRef<HTMLLIElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLUListElement>(null);\n const measured = useRef<Measured | null>(null);\n const currentRef = useRef(current);\n const fitRef = useRef(fit);\n const hysteresisRef = useRef(overflowHysteresis);\n const onOverflowRef = useRef(onOverflowChange);\n\n /** The split for the cached measurements: how many links stay inline, and the latched overflow flag. */\n const solve = (m: Measured, cur: number, was: boolean) => ({\n count: fitCount({ ...m, current: cur }),\n overflowing: isOverflowing({ ...m, was, hysteresis: hysteresisRef.current }),\n });\n\n // Until the items are measured (on the server, before hydration, after the items or the fonts change)\n // every link renders inline in a single line that clips (or scrolls without JS), and the toggle is laid\n // out invisibly so it can be measured too.\n const measuring = fit.signature !== signature;\n\n // Measure once per signature, then split. Reads first (all widths, the gap, the row), then one state\n // write; React re-renders before paint, so the measuring pass is never seen.\n useLayoutEffect(() => {\n currentRef.current = current;\n fitRef.current = fit;\n hysteresisRef.current = overflowHysteresis;\n onOverflowRef.current = onOverflowChange;\n });\n\n useLayoutEffect(() => {\n const list = listRef.current;\n const more = moreRef.current;\n if (!list || !more) return;\n if (measuring) {\n const widths = Array.from(\n list.querySelectorAll<HTMLElement>(':scope > .sc-priority-nav__item'),\n (el) => el.getBoundingClientRect().width,\n );\n measured.current = {\n widths,\n more: more.getBoundingClientRect().width,\n gap: parseFloat(getComputedStyle(list).columnGap) || 0,\n available: list.clientWidth,\n };\n } else if (fit.current === current) return;\n const m = measured.current;\n if (!m) return;\n setFit({ signature, current, ...solve(m, current, fit.overflowing) });\n }, [measuring, signature, current, fit]);\n\n // One observer, on the row and on the \"More\" item. Its callback reads sizes from the entries (no layout\n // read): the row's width, and the toggle's width when it switches between \"More\" and icon-only (a\n // container query). It writes state only when the inline count or the overflow flag changes.\n useEffect(() => {\n const list = listRef.current;\n const more = moreRef.current;\n if (!list || !more || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver((entries) => {\n const m = measured.current;\n if (!m) return;\n for (const entry of entries) {\n if (entry.target === list)\n m.available = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n else {\n // Hidden (no overflow) reports 0; keep the last real width.\n const width = entry.borderBoxSize?.[0]?.inlineSize ?? 0;\n if (width > 0) m.more = width;\n }\n }\n // Compare before calling setState: an unchanged split must not even schedule a render.\n const prev = fitRef.current;\n if (prev.signature === null) return;\n const next = solve(m, currentRef.current, prev.overflowing);\n if (prev.count !== next.count || prev.overflowing !== next.overflowing) setFit({ ...prev, ...next });\n });\n observer.observe(list);\n observer.observe(more);\n return () => observer.disconnect();\n }, []);\n\n // Tell the header when the overflow flag changes (not on mount: it starts false everywhere).\n const reported = useRef(false);\n useEffect(() => {\n if (reported.current === fit.overflowing) return;\n reported.current = fit.overflowing;\n onOverflowRef.current?.(fit.overflowing);\n }, [fit.overflowing]);\n\n // Web fonts change every width. If they are still loading at mount, measure again once they are ready.\n useEffect(() => {\n const fonts = typeof document === 'undefined' ? undefined : document.fonts;\n if (!fonts || fonts.status === 'loaded') return;\n let live = true;\n void fonts.ready.then(() => {\n if (live) setFit((prev) => ({ ...prev, signature: null }));\n });\n return () => {\n live = false;\n };\n }, []);\n\n const flags = measuring ? null : inlineFlags(items.length, current, fit.count);\n const overflow = flags ? items.filter((_, i) => !flags[i]) : [];\n const expanded = open && overflow.length > 0;\n // \"More\" carries the collapsed items' badges: their summed count, or a dot when they only have dots.\n const overflowBadges = overflow.map(badgeOf).filter((b) => b !== null);\n const overflowCount = overflowBadges.reduce<number>((sum, b) => sum + (b === 'dot' ? 0 : b), 0);\n const moreBadge = overflowCount > 0 ? overflowCount : overflowBadges.length > 0 ? 'dot' : null;\n const moreBadgeText = overflow\n .map(badgeTextOf)\n .filter((text) => text !== null)\n .map((text) => `, ${text}`)\n .join('');\n\n // The panel lives in the top layer while open (popover=\"manual\": opening, Escape, outside clicks and\n // focus stay ours, so behaviour is the same with or without the Popover API). It stays a DOM sibling of\n // the toggle, so Tab moves from the toggle into the links with no invoker wiring.\n useLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel || !supportsPopover(panel)) return;\n // Set on the client only, where the API exists: the server HTML and browsers without it keep `hidden`.\n if (!panel.hasAttribute('popover')) panel.setAttribute('popover', 'manual');\n const shown = panel.matches(':popover-open');\n if (expanded && !shown) panel.showPopover();\n else if (!expanded && shown) panel.hidePopover();\n }, [expanded]);\n\n // Without CSS anchor positioning: place the panel from JS on open, and again on resize or scroll while\n // open. Each pass reads (two rects, one computed style), then writes `left`/`top` once.\n useLayoutEffect(() => {\n const panel = panelRef.current;\n const toggle = toggleRef.current;\n if (!expanded || !panel || !toggle || supportsAnchor()) return;\n const place = () => {\n const anchor = toggle.getBoundingClientRect();\n const box = panel.getBoundingClientRect();\n const css = getComputedStyle(panel);\n const { left, top } = placePanel({\n anchor,\n panel: { width: box.width, height: box.height },\n viewport: { width: document.documentElement.clientWidth, height: window.innerHeight },\n gutter: parseFloat(css.getPropertyValue('--sc-spacing-md')) || 16,\n offset: parseFloat(css.getPropertyValue('--sc-spacing-2xs')) || 4,\n rtl: css.direction === 'rtl',\n });\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n };\n place();\n window.addEventListener('resize', place, { passive: true });\n window.addEventListener('scroll', place, { passive: true, capture: true });\n return () => {\n window.removeEventListener('resize', place);\n window.removeEventListener('scroll', place, { capture: true });\n panel.style.left = '';\n panel.style.top = '';\n };\n }, [expanded]);\n\n // Click outside and Escape close the panel. Escape returns focus to the toggle.\n useEffect(() => {\n if (!expanded) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!moreRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n const active = document.activeElement;\n setOpen(false);\n if (!active || active === document.body || moreRef.current?.contains(active))\n toggleRef.current?.focus();\n };\n document.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [expanded]);\n\n // Focus leaving the \"More\" item (Tab past the last link) closes the panel, as in the APG example.\n const onBlur = (event: FocusEvent<HTMLLIElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false);\n };\n\n const link = (item: PriorityNavItem, inPanel: boolean) => {\n const badge = badgeOf(item);\n const badgeText = badgeTextOf(item);\n return renderLink(\n {\n href: item.href,\n className: 'sc-priority-nav__link',\n 'aria-current': item.current ? 'page' : undefined,\n onClick: inPanel ? () => setOpen(false) : undefined,\n children: (\n <>\n <span className=\"sc-priority-nav__label\">{item.label}</span>\n {badge !== null ? <Badge value={badge} /> : null}\n {badgeText !== null ? <span className=\"sc-visually-hidden\">, {badgeText}</span> : null}\n </>\n ),\n },\n item,\n );\n };\n\n return (\n <nav\n className={cx('sc-priority-nav', className)}\n data-measuring={measuring || undefined}\n data-overflowing={fit.overflowing || undefined}\n // A per-instance anchor name, so two navs on a page never anchor to each other's toggle.\n style={{ ...style, '--_anchor': `--sc-priority-nav${panelId.replace(/[^\\w-]/g, '')}` } as CSSProperties}\n {...rest}\n >\n <ul ref={listRef} className=\"sc-priority-nav__list\">\n {items.map((item, i) =>\n flags && !flags[i] ? null : (\n <li key={keyOf(item)} className=\"sc-priority-nav__item\" data-current={item.current || undefined}>\n {link(item, false)}\n </li>\n ),\n )}\n <li\n ref={moreRef}\n className=\"sc-priority-nav__more\"\n hidden={measuring || overflow.length === 0}\n onBlur={onBlur}\n >\n <button\n ref={toggleRef}\n type=\"button\"\n className=\"sc-priority-nav__toggle\"\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={() => setOpen((o) => !o)}\n >\n {/* Narrow navs (a container query) show only the ellipsis; the label stays in the name. */}\n <MoreHorizontalIcon className=\"sc-priority-nav__ellipsis\" />\n <span className=\"sc-priority-nav__toggle-label\">{moreLabel}</span>\n <span className=\"sc-visually-hidden\">\n , {moreCountLabel(overflow.length)}\n {moreBadgeText}\n </span>\n {moreBadge !== null ? <Badge value={moreBadge} /> : null}\n <ChevronDownIcon size=\"sm\" className=\"sc-priority-nav__chevron\" />\n </button>\n <ul ref={panelRef} id={panelId} className=\"sc-priority-nav__panel\" hidden={!expanded}>\n {overflow.map((item) => (\n <li key={keyOf(item)}>{link(item, true)}</li>\n ))}\n </ul>\n </li>\n </ul>\n </nav>\n );\n}\n","// Pure layout arithmetic for PriorityNav: no DOM, unit-tested in fit.test.ts.\n\nexport interface FitInput {\n /** Measured inline size of each item, in order, px. */\n widths: readonly number[];\n /** Index of the current item, or -1. It is always kept inline. */\n current: number;\n /** Inline size of the row, px. */\n available: number;\n /** Inline size of the \"More\" item, px. */\n more: number;\n /** Gap between items, px. */\n gap: number;\n}\n\n/** Sub-pixel slack: measured widths are fractional and a row that fits exactly must not flip to \"More\". */\nconst EPSILON = 0.5;\n\n/**\n * How many of the non-current items stay inline, counted in order. Every item fits: all of them.\n * Otherwise room is made for the \"More\" item and the current item first, then items are added in order\n * until the next one does not fit. The run stays contiguous (a short item after a long one does not jump\n * the queue), so the row reads as the start of the list, plus the current page.\n */\n/** The inline size of every item in one row, gaps included. */\nexport function rowWidth(widths: readonly number[], gap: number): number {\n let total = 0;\n for (const w of widths) total += w;\n return widths.length > 1 ? total + gap * (widths.length - 1) : total;\n}\n\nexport function fitCount({ widths, current, available, more, gap }: FitInput): number {\n const n = widths.length;\n const hasCurrent = current >= 0 && current < n;\n const others = hasCurrent ? n - 1 : n;\n if (rowWidth(widths, gap) <= available + EPSILON) return others;\n\n let used = more + (hasCurrent ? widths[current]! + gap : 0);\n let count = 0;\n for (let i = 0; i < n; i++) {\n if (i === current) continue;\n const next = used + widths[i]! + gap;\n if (next > available + EPSILON) break;\n used = next;\n count++;\n }\n return count;\n}\n\n/**\n * Which items are inline, given `fitCount`'s answer: the first `count` non-current items, plus the\n * current one wherever it sits. Everything else goes into \"More\", in its original order.\n */\nexport function inlineFlags(length: number, current: number, count: number): boolean[] {\n const flags: boolean[] = [];\n let seen = 0;\n for (let i = 0; i < length; i++) {\n if (i === current) flags.push(true);\n else flags.push(seen++ < count);\n }\n return flags;\n}\n\nexport interface OverflowInput {\n widths: readonly number[];\n gap: number;\n available: number;\n /** The previous answer. */\n was: boolean;\n /** Extra room required, beyond fitting every item, before an overflowing row reports that it fits again. */\n hysteresis: number;\n}\n\n/**\n * Whether the row reports `overflowing`, with hysteresis. It starts as soon as the items do not all fit.\n * Once started, it ends only when every item fits with `hysteresis` px to spare: when a header reacts to\n * overflow by giving the row more room (an action button drops its label), the row then fits, and without\n * the margin it would report \"fits\", the label would come back, and the row would overflow again.\n */\nexport function isOverflowing({ widths, gap, available, was, hysteresis }: OverflowInput): boolean {\n const total = rowWidth(widths, gap);\n return was ? total + Math.max(0, hysteresis) > available + EPSILON : total > available + EPSILON;\n}\n","// Fallback placement for the \"More\" panel where CSS anchor positioning is missing. Pure: rects in, a\n// viewport position out. Unit-tested in place.test.ts.\n\nexport interface Rect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport interface PlaceInput {\n /** The toggle's viewport rect. */\n anchor: Rect;\n /** The panel's size. */\n panel: { width: number; height: number };\n /** The viewport's size. */\n viewport: { width: number; height: number };\n /** Minimum distance from every viewport edge, px. */\n gutter: number;\n /** Space between the toggle and the panel, px. */\n offset: number;\n /** Writing direction: the panel prefers the toggle's inline-end edge. */\n rtl?: boolean | undefined;\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max));\n\n/**\n * Mirrors the CSS: below the toggle, aligned to its inline-end edge; if that runs past the inline-start\n * side of the viewport, aligned to its inline-start edge instead; then shifted to stay inside the gutter.\n * Below the toggle unless only above has room. The width is capped by CSS, so it always fits.\n */\nexport function placePanel({ anchor, panel, viewport, gutter, offset, rtl = false }: PlaceInput): {\n left: number;\n top: number;\n} {\n const endAligned = rtl ? anchor.left : anchor.right - panel.width;\n const startAligned = rtl ? anchor.right - panel.width : anchor.left;\n const fitsX = (x: number) => x >= gutter && x + panel.width <= viewport.width - gutter;\n const x = fitsX(endAligned) ? endAligned : fitsX(startAligned) ? startAligned : endAligned;\n const left = clamp(x, gutter, Math.max(gutter, viewport.width - gutter - panel.width));\n\n const below = anchor.bottom + offset;\n const above = anchor.top - offset - panel.height;\n const fitsBelow = below + panel.height <= viewport.height - gutter;\n const top = fitsBelow || above < gutter ? below : above;\n return { left, top };\n}\n","import { Popover as BasePopover } from '@base-ui/react/popover';\nimport type { ReactNode } from 'react';\nimport { Button } from '../Button/Button';\nimport { XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\nexport interface PopoverRootProps {\n /** Controlled open state. */\n open?: boolean | undefined;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean | undefined;\n /** Called when the popover opens or closes. */\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Default `false`: the page stays interactive and focus may leave. `true` makes the page inert until it closes. */\n modal?: boolean | undefined;\n children?: ReactNode | undefined;\n}\n\n/** Owns the open state. Wrap a `Popover.Trigger` and a `Popover.Content`. */\nfunction Root({ open, defaultOpen, onOpenChange, modal = false, children }: PopoverRootProps) {\n return (\n <BasePopover.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange ? (next) => onOpenChange(next) : undefined}\n modal={modal}\n >\n {children}\n </BasePopover.Root>\n );\n}\n\nexport interface PopoverTriggerProps extends Omit<BasePopover.Trigger.Props, 'className'> {\n className?: string | undefined;\n}\n\n/**\n * Opens the popover. With no `render` it is a secondary Button; pass any Button or IconButton through\n * `render`: `<Popover.Trigger render={<IconButton label=\"Sweeps: running\" dot=\"success\" />}>`.\n */\nfunction Trigger({ render, className, children, ...rest }: PopoverTriggerProps) {\n return (\n <BasePopover.Trigger\n render={render ?? <Button variant=\"secondary\" className={className} />}\n className={render ? className : undefined}\n {...rest}\n >\n {children}\n </BasePopover.Trigger>\n );\n}\n\nexport interface PopoverContentProps extends Omit<BasePopover.Popup.Props, 'className'> {\n /**\n * Side of the trigger it opens on. Default `bottom`. With no room it flips to the opposite side (`top` for `bottom`),\n * never to a perpendicular one; when neither side fits, it takes the roomier one and scrolls inside.\n */\n side?: PopoverSide | undefined;\n /** Alignment along that side. Default `center`. */\n align?: PopoverAlign | undefined;\n /** Distance from the trigger in px. Default 4, or 8 with `arrow`. */\n sideOffset?: number | undefined;\n /** Draws a tip pointing at the trigger. */\n arrow?: boolean | undefined;\n /**\n * What to position against instead of the `Popover.Trigger`: an element, a ref to one, a virtual element or a\n * function returning either. For a popover opened from elsewhere (a menu item, a row action) with a controlled\n * `Popover.Root open`. The panel is still portaled to `document.body`.\n */\n anchor?: BasePopover.Positioner.Props['anchor'];\n className?: string | undefined;\n}\n\n/**\n * Collisions stay on the axis asked for: flip to the opposite side, shift along it, then shrink to the room there\n * (`max-block-size: var(--available-height)`; the panel scrolls). Base UI's popover default instead falls back to the\n * perpendicular axis when neither side fits the whole panel, so on a short viewport a `bottom` popover anchored at the\n * end of a row opened to its left, over the row it is about. This is Base UI's own setting for Menu and Select.\n */\nconst COLLISION_AVOIDANCE = { fallbackAxisSide: 'none' } as const;\n\n/** Portal, positioner and the panel. Any content goes inside; name it with `Popover.Title`. */\nfunction Content({\n side = 'bottom',\n align = 'center',\n sideOffset,\n arrow = false,\n anchor,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n return (\n <BasePopover.Portal>\n <BasePopover.Positioner\n side={side}\n align={align}\n sideOffset={sideOffset ?? (arrow ? 8 : 4)}\n anchor={anchor}\n collisionAvoidance={COLLISION_AVOIDANCE}\n className=\"sc-popover__positioner\"\n >\n <BasePopover.Popup className={cx('sc-popover', className)} {...rest}>\n {arrow ? <BasePopover.Arrow className=\"sc-popover__arrow\" /> : null}\n {children}\n </BasePopover.Popup>\n </BasePopover.Positioner>\n </BasePopover.Portal>\n );\n}\n\nexport interface PopoverTitleProps extends Omit<BasePopover.Title.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Names the popover (`aria-labelledby`). A heading, `h2` by default. */\nfunction Title({ className, ...rest }: PopoverTitleProps) {\n return <BasePopover.Title className={cx('sc-popover__title', className)} {...rest} />;\n}\n\nexport interface PopoverDescriptionProps extends Omit<BasePopover.Description.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** Describes the popover (`aria-describedby`). Muted text. */\nfunction Description({ className, ...rest }: PopoverDescriptionProps) {\n return <BasePopover.Description className={cx('sc-popover__description', className)} {...rest} />;\n}\n\nexport interface PopoverCloseProps extends Omit<BasePopover.Close.Props, 'className'> {\n className?: string | undefined;\n}\n\n/** With no children or `render`, the × in the corner. Otherwise wraps any Button: `<Popover.Close render={<Button variant=\"ghost\" />}>Done</Popover.Close>`. */\nfunction Close({ className, children, render, ...rest }: PopoverCloseProps) {\n if (children === undefined && render === undefined) {\n return (\n <BasePopover.Close className={cx('sc-popover__close', className)} aria-label=\"Close\" {...rest}>\n <XIcon />\n </BasePopover.Close>\n );\n }\n return (\n <BasePopover.Close className={className} render={render} {...rest}>\n {children}\n </BasePopover.Close>\n );\n}\n\n/** A non-modal panel anchored to a trigger, for a small form, a status summary or a legend. Built on Base UI's Popover. */\nexport const Popover = { Root, Trigger, Content, Title, Description, Close };\n","import type { ComponentPropsWithRef } from 'react';\nimport type { IconSize } from '../Icon/Icon';\nimport { cx } from '../../utils/cx';\n\nexport interface BroomIconProps extends Omit<ComponentPropsWithRef<'svg'>, 'children'> {\n /** Sweeps back and forth while dust drifts. With `prefers-reduced-motion` it holds still and shows the dust. */\n sweeping?: boolean | undefined;\n /** The Icon sizes (`lg` 20, the nav size, is the default), or `display` (72px, stroke 1.75px) for empty states and showcases. Inside an IconButton it fills the icon slot one step up, since it is drawn on a 24px grid. */\n size?: IconSize | 'display' | undefined;\n /** Gives the icon an accessible name (`role=\"img\"`). Without it the icon is decorative and hidden from assistive tech. */\n title?: string | undefined;\n}\n\n/**\n * An animated broom on a 24×24 grid, for \"a sweep is running\". Inline SVG, because CSS cannot animate\n * inside a `<use>` clone. Strokes keep a fixed screen width at every size (`vector-effect: non-scaling-stroke`).\n * Decorative by default: say what is happening in the surrounding control's label (\"Sweeps: running\").\n */\nexport function BroomIcon({ sweeping = false, size = 'lg', title, className, ...rest }: BroomIconProps) {\n return (\n <svg\n className={cx('sc-icon', 'sc-broom', className)}\n data-size={size}\n data-sweeping={sweeping || undefined}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n focusable=\"false\"\n aria-hidden={title ? undefined : true}\n role={title ? 'img' : undefined}\n aria-label={title}\n {...rest}\n >\n <g\n className=\"sc-broom__body\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16.1 10.48 L19.36 1.86 A0.87 0.87 0 0 1 20.98 2.47 L17.84 10.78\" />\n <path d=\"M13.33 12 C14.23 10.67 16.73 9.87 18.17 11 C19.07 12.67 18.93 18.33 18.4 21.4 C16.07 22.4 11.07 22.07 6.4 18.07 C9.07 16.67 11.8 15 13.33 12 Z\" />\n <path className=\"sc-broom__band\" d=\"M13.47 12.13 L18.4 13.5 L18.33 14.1 L13.27 12.77 Z\" />\n <path d=\"M12.87 13.73 L14.4 14.47 M16.2 15.27 L18.47 15.87\" />\n <path d=\"M12.8 16.87 C11.86 18.24 10.75 19.38 9.57 20.23 M15.6 17.4 C15.22 18.96 14.6 20.44 13.77 21.71\" />\n </g>\n <g className=\"sc-broom__dust\" fill=\"none\" stroke=\"currentColor\">\n <circle cx=\"4.77\" cy=\"13.53\" r=\"0.5\" />\n <circle cx=\"2.7\" cy=\"15.53\" r=\"0.87\" />\n <circle cx=\"4.1\" cy=\"18.27\" r=\"0.5\" />\n </g>\n </svg>\n );\n}\n","import {\n Children,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Dialog } from '../Dialog/Dialog';\nimport { IconButton } from '../IconButton/IconButton';\nimport { CheckIcon, XIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\n/** Which way the flow moved: `forward` slides the new step in from the inline end, `back` from the start. */\nexport type FlowDirection = 'forward' | 'back';\n/** Why the flow asked to close: Esc, or the × in the header. */\nexport type FlowCloseRequestReason = 'escape-key' | 'close-press';\n\ninterface FlowContextValue {\n announce: (message: string) => void;\n}\nconst FlowContext = createContext<FlowContextValue>({ announce: () => {} });\n\ntype FramePhase = 'enter' | 'exit' | undefined;\nconst FrameContext = createContext<FramePhase>(undefined);\n\n/** Enter continues unless focus is somewhere Enter already means something. */\nconst ENTER_IGNORES =\n 'textarea, button, a[href], summary, select, [contenteditable], [role=\"combobox\"], [data-flow-keys=\"local\"]';\n/** The arrow keys move between steps only when focus is not in a control that uses them. */\nconst ARROW_IGNORES =\n 'input, textarea, select, button, a[href], summary, [contenteditable], [role=\"radiogroup\"], [role=\"slider\"], [role=\"listbox\"], [role=\"tablist\"], [role=\"menu\"], [role=\"grid\"], [role=\"combobox\"], [data-flow-keys=\"local\"]';\n\nexport interface FullScreenFlowRootProps {\n /** Whether the flow is showing. Default `true`, for a flow that lives on its own route. */\n open?: boolean | undefined;\n /**\n * Esc and the header's × call this instead of closing. Show a leave confirmation (a nested `Dialog`),\n * then close by setting `open` to `false` or by navigating away. A press on the backdrop does nothing.\n */\n onRequestClose: (reason: FlowCloseRequestReason) => void;\n /** Enter (outside buttons, links, textareas and `[data-flow-keys=\"local\"]`) and the forward arrow key call this. */\n onNext?: (() => void) | undefined;\n /** The back arrow key (outside form controls) calls this. */\n onBack?: (() => void) | undefined;\n /** A decorative layer behind everything, such as an illustration. Hidden from assistive tech. */\n decoration?: ReactNode | undefined;\n className?: string | undefined;\n /** `Header`, `Body` and `Footer`, in that order. */\n children?: ReactNode | undefined;\n}\n\n/**\n * A full-screen modal for a multi-step task, on `Dialog variant=\"fullscreen\"`: focus is trapped, the page\n * behind is inert, and Esc goes to `onRequestClose`. Holds the polite live region that `Step` announces into.\n */\nfunction Root({\n open = true,\n onRequestClose,\n onNext,\n onBack,\n decoration,\n className,\n children,\n}: FullScreenFlowRootProps) {\n const popupRef = useRef<HTMLDivElement>(null);\n const [message, setMessage] = useState('');\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n // Clear first, then set after a beat, so the same words twice in a row are read twice.\n const announce = useCallback((next: string) => {\n setMessage('');\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setMessage(next), 30);\n }, []);\n useEffect(() => () => clearTimeout(timer.current), []);\n const context = useMemo(() => ({ announce }), [announce]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n const target = event.target as Element;\n // A nested dialog or popup is portalled out of the popup; its keys are its own.\n if (!event.currentTarget.contains(target)) return;\n if (event.key === 'Enter') {\n if (!onNext || target.closest(ENTER_IGNORES)) return;\n event.preventDefault();\n onNext();\n return;\n }\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') return;\n if (target.closest(ARROW_IGNORES)) return;\n const rtl = getComputedStyle(event.currentTarget).direction === 'rtl';\n const forward = (event.key === 'ArrowRight') !== rtl;\n const handler = forward ? onNext : onBack;\n if (!handler) return;\n event.preventDefault();\n handler();\n };\n\n return (\n <Dialog.Root\n open={open}\n onRequestClose={(reason) => {\n if (reason !== 'outside-press') onRequestClose(reason);\n }}\n >\n <Dialog.Content\n ref={popupRef}\n variant=\"fullscreen\"\n className={cx('sc-flow', className)}\n initialFocus={() => popupRef.current?.querySelector<HTMLElement>('.sc-flow__step-title') ?? true}\n onKeyDown={handleKeyDown}\n >\n <FlowContext.Provider value={context}>\n {decoration ? (\n <div className=\"sc-flow__decoration\" aria-hidden=\"true\">\n {decoration}\n </div>\n ) : null}\n {children}\n <div className=\"sc-visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n {message}\n </div>\n </FlowContext.Provider>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport interface FullScreenFlowHeaderProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {\n /** The flow's name (\"Set up your search\"). Labels the dialog. */\n title: ReactNode;\n /** A small mark before the title. Decorative. */\n logo?: ReactNode | undefined;\n /** Shown instead of `title` below 760px, where the progress drops to its own row: \"4 of 10 · Roles\". */\n compactTitle?: ReactNode | undefined;\n /** A status after the progress, such as a \"Saved\" tick. */\n status?: ReactNode | undefined;\n /** Name of the × button, which calls `onRequestClose('close-press')`. Default \"Close\". */\n closeLabel?: string | undefined;\n /** Usually a `FullScreenFlow.Progress`. */\n children?: ReactNode | undefined;\n}\n\n/** The top bar: logo and title, progress in the middle, a status, and the ×. Pinned; it never scrolls. */\nfunction Header({\n title,\n logo,\n compactTitle,\n status,\n closeLabel = 'Close',\n className,\n children,\n ...rest\n}: FullScreenFlowHeaderProps) {\n return (\n <div className={cx('sc-flow__header', className)} {...rest}>\n <div className=\"sc-flow__heading\" data-compact={compactTitle ? '' : undefined}>\n {logo ? (\n <span className=\"sc-flow__logo\" aria-hidden=\"true\">\n {logo}\n </span>\n ) : null}\n <Dialog.Title className=\"sc-flow__title\">{title}</Dialog.Title>\n {compactTitle ? <span className=\"sc-flow__compact-title\">{compactTitle}</span> : null}\n </div>\n {children}\n {status ? <div className=\"sc-flow__status\">{status}</div> : null}\n <Dialog.Close\n className=\"sc-flow__close\"\n render={<IconButton label={closeLabel} aria-keyshortcuts=\"Escape\" />}\n >\n <XIcon size=\"lg\" />\n </Dialog.Close>\n </div>\n );\n}\n\n/** A chapter of the flow and how many numbered steps it holds. */\nexport interface FlowChapter {\n label: string;\n steps: number;\n}\n\nexport interface FullScreenFlowProgressProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n /** The chapters in order. Each draws one segment, as wide as its share of the steps. */\n chapters: readonly FlowChapter[];\n /**\n * The current step, counted from 1 across every chapter. `0` is before the first (a welcome screen);\n * anything past the total fills every segment. The current step counts as half done.\n */\n step: number;\n /** One line above the segments: \"Step 4 of 10 · Roles · about 5 min left\". Hidden below 760px. */\n label?: ReactNode | undefined;\n /** Name of the list of segments. Default \"Progress\". */\n listLabel?: string | undefined;\n}\n\n/** Segmented progress, one segment per chapter; the chapter holding the current step has `aria-current=\"step\"`. */\nfunction Progress({\n chapters,\n step,\n label,\n listLabel = 'Progress',\n className,\n ...rest\n}: FullScreenFlowProgressProps) {\n const starts = chapters.reduce<number[]>(\n (acc, chapter, i) => [...acc, i === 0 ? 0 : acc[i - 1]! + chapters[i - 1]!.steps],\n [],\n );\n return (\n <div className={cx('sc-flow__progress', className)} {...rest}>\n {label ? <div className=\"sc-flow__progress-label\">{label}</div> : null}\n <ol className=\"sc-flow__segments\" aria-label={listLabel}>\n {chapters.map((chapter, i) => {\n const from = starts[i]!;\n const current = step > from && step <= from + chapter.steps;\n const done = Math.min(chapter.steps, Math.max(0, step - 1 - from)) + (current ? 0.5 : 0);\n const percent = chapter.steps > 0 ? Math.min(100, (done / chapter.steps) * 100) : 0;\n return (\n <li\n key={chapter.label}\n className=\"sc-flow__segment\"\n style={{ flexGrow: chapter.steps }}\n aria-current={current ? 'step' : undefined}\n >\n <span className=\"sc-flow__segment-fill\" style={{ inlineSize: `${percent}%` }} />\n <span className=\"sc-visually-hidden\">{chapter.label}</span>\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n\nexport type FullScreenFlowBodyProps = ComponentPropsWithRef<'div'>;\n\n/** Between header and footer: a `Rail` (from 1000px) beside the `Viewport`. */\nfunction Body({ className, ...rest }: FullScreenFlowBodyProps) {\n return <div className={cx('sc-flow__body', className)} {...rest} />;\n}\n\nexport interface FullScreenFlowRailProps extends ComponentPropsWithRef<'nav'> {\n /** A note under the steps, such as where answers can be changed later. Hidden on short screens. */\n footer?: ReactNode | undefined;\n}\n\n/** Every step by chapter, shown from 1000px. Holds `RailGroup`s of `RailItem`s. Named \"Steps\" unless `aria-label` says otherwise. */\nfunction Rail({\n 'aria-label': ariaLabel = 'Steps',\n footer,\n className,\n children,\n ...rest\n}: FullScreenFlowRailProps) {\n return (\n <nav className={cx('sc-flow__rail', className)} aria-label={ariaLabel} {...rest}>\n {children}\n {footer ? <div className=\"sc-flow__rail-note\">{footer}</div> : null}\n </nav>\n );\n}\n\nexport interface FullScreenFlowRailGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {\n /** The chapter name. */\n label: ReactNode;\n}\n\n/** One chapter in the rail: its name over a list of `RailItem`s. */\nfunction RailGroup({ label, className, children, ...rest }: FullScreenFlowRailGroupProps) {\n const id = useId();\n return (\n <div className={cx('sc-flow__rail-group', className)} {...rest}>\n <span className=\"sc-flow__rail-label\" id={id}>\n {label}\n </span>\n <ol className=\"sc-flow__rail-list\" aria-labelledby={id}>\n {children}\n </ol>\n </div>\n );\n}\n\nexport interface FullScreenFlowRailItemProps extends ComponentPropsWithRef<'button'> {\n /** The step on screen: `aria-current=\"step\"` and the accent wash. */\n current?: boolean | undefined;\n /** Shows a check and adds `doneLabel` for assistive tech. */\n done?: boolean | undefined;\n /** Read after the label when `done`. Default \"done\". */\n doneLabel?: string | undefined;\n /** A small icon at the end of the row, e.g. \"drafted for you\". Give it a `title` if it carries meaning. */\n adornment?: ReactNode | undefined;\n}\n\n/** A step in the rail. A button: disable the steps not reached yet. */\nfunction RailItem({\n current = false,\n done = false,\n doneLabel = 'done',\n adornment,\n type = 'button',\n className,\n children,\n ...rest\n}: FullScreenFlowRailItemProps) {\n return (\n <li className=\"sc-flow__rail-entry\">\n <button\n type={type}\n className={cx('sc-flow__rail-item', className)}\n aria-current={current ? 'step' : undefined}\n data-done={done || undefined}\n {...rest}\n >\n <span className=\"sc-flow__rail-mark\" aria-hidden=\"true\">\n {done ? <CheckIcon size=\"sm\" /> : null}\n </span>\n <span className=\"sc-flow__rail-text\">\n {children}\n {done ? <span className=\"sc-visually-hidden\">, {doneLabel}</span> : null}\n </span>\n {adornment ? <span className=\"sc-flow__rail-adornment\">{adornment}</span> : null}\n </button>\n </li>\n );\n}\n\ninterface Frame {\n key: string;\n element: ReactElement;\n direction: FlowDirection;\n}\n\nexport interface FullScreenFlowViewportProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'ref'> {\n /** Which way this change goes. Set it with the step: `back` when the person went back. Default `forward`. */\n direction?: FlowDirection | undefined;\n /** Exactly one `FullScreenFlow.Step`, keyed by step: `<FullScreenFlow.Step key={step.id} …>`. */\n children: ReactElement;\n}\n\n/**\n * The scrolling area that shows one step. When the child's `key` changes, the old step slides out and the\n * new one slides in (by `direction`; a short crossfade under reduced motion), the area scrolls to the top,\n * and the new step's title takes focus and is announced.\n */\nfunction Viewport({ direction = 'forward', className, children, ...rest }: FullScreenFlowViewportProps) {\n const element = Children.only(children);\n const key = String(element.key ?? '');\n const [state, setState] = useState<{ current: Frame; leaving: Frame | null; moved: boolean }>({\n current: { key, element, direction },\n leaving: null,\n moved: false,\n });\n // Derived during render (React's \"store information from previous renders\"): the step that is leaving\n // keeps the props it last rendered with, and stays mounted under its own key while it animates out.\n if (state.current.key !== key) {\n setState({\n current: { key, element, direction },\n leaving: { ...state.current, direction },\n moved: true,\n });\n } else if (state.current.element !== element) {\n setState((s) => ({ ...s, current: { ...s.current, element } }));\n }\n const finishExit = useCallback((leftKey: string) => {\n setState((s) => (s.leaving?.key === leftKey ? { ...s, leaving: null } : s));\n }, []);\n\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (state.moved && ref.current) ref.current.scrollTop = 0;\n }, [key, state.moved]);\n\n const frames: Array<{ frame: Frame; phase: FramePhase }> = [];\n if (state.leaving && state.leaving.key !== key) frames.push({ frame: state.leaving, phase: 'exit' });\n frames.push({\n frame: { key, element, direction: state.current.direction },\n phase: state.moved ? 'enter' : undefined,\n });\n\n return (\n <div ref={ref} className={cx('sc-flow__viewport', className)} {...rest}>\n {frames.map(({ frame, phase }) => (\n <FrameView\n key={frame.key}\n frameKey={frame.key}\n phase={phase}\n direction={frame.direction}\n onExited={finishExit}\n >\n {frame.element}\n </FrameView>\n ))}\n </div>\n );\n}\n\nfunction FrameView({\n frameKey,\n phase,\n direction,\n onExited,\n children,\n}: {\n frameKey: string;\n phase: FramePhase;\n direction: FlowDirection;\n onExited: (key: string) => void;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (phase !== 'exit') return;\n let cancelled = false;\n const el = ref.current;\n // CSS runs the motion (tokens, reduced motion); wait for it. Where nothing animates, leave at once.\n const animations = el && typeof el.getAnimations === 'function' ? el.getAnimations() : [];\n const done = () => {\n if (!cancelled) onExited(frameKey);\n };\n Promise.all(animations.map((a) => a.finished)).then(done, done);\n return () => {\n cancelled = true;\n };\n }, [phase, frameKey, onExited]);\n return (\n <div\n ref={ref}\n className=\"sc-flow__frame\"\n data-phase={phase}\n data-direction={direction}\n inert={phase === 'exit'}\n >\n <FrameContext.Provider value={phase}>{children}</FrameContext.Provider>\n </div>\n );\n}\n\nexport interface FullScreenFlowStepProps extends Omit<ComponentPropsWithRef<'section'>, 'title'> {\n /** The step's heading, an `<h2>` that takes focus (`tabindex=\"-1\"`) when the step arrives. */\n title: ReactNode;\n /** A short line above the title: \"Your search · Step 4 of 10\". */\n eyebrow?: ReactNode | undefined;\n /** Why this step is asked, under the title. */\n description?: ReactNode | undefined;\n /** What the live region says when the step arrives: \"Step 4 of 10, Roles\". Defaults to `title` when it is a string. */\n announcement?: string | undefined;\n}\n\n/** One step: eyebrow, title, description, then its content. Render it inside `Viewport` with a `key`. */\nfunction Step({\n title,\n eyebrow,\n description,\n announcement,\n className,\n children,\n ...rest\n}: FullScreenFlowStepProps) {\n const id = useId();\n const titleRef = useRef<HTMLHeadingElement>(null);\n const phase = useContext(FrameContext);\n const { announce } = useContext(FlowContext);\n const message = announcement ?? (typeof title === 'string' ? title : undefined);\n // The latest message and announcer, read when the step arrives. A ref rather than React's useEffectEvent, which\n // the React canary bundled with Next 15 exports only as experimental_useEffectEvent (the import breaks next build).\n const latest = useRef({ message, announce });\n useEffect(() => {\n latest.current = { message, announce };\n });\n useEffect(() => {\n if (phase !== 'enter') return;\n titleRef.current?.focus({ preventScroll: true });\n if (latest.current.message) latest.current.announce(latest.current.message);\n }, [phase]);\n return (\n <section className={cx('sc-flow__step', className)} aria-labelledby={id} {...rest}>\n <div className=\"sc-flow__step-head\">\n {eyebrow ? <p className=\"sc-flow__eyebrow\">{eyebrow}</p> : null}\n <h2 className=\"sc-flow__step-title\" id={id} ref={titleRef} tabIndex={-1}>\n {title}\n </h2>\n {description ? <div className=\"sc-flow__step-description\">{description}</div> : null}\n </div>\n {children}\n </section>\n );\n}\n\nexport interface FullScreenFlowFooterProps extends ComponentPropsWithRef<'div'> {\n /** At the inline start: a Back button. */\n back?: ReactNode | undefined;\n /** Before the actions, from 760px: \"Press Enter to continue\". */\n hint?: ReactNode | undefined;\n /** The primary action, at the inline end; stretches below 520px. */\n children?: ReactNode | undefined;\n}\n\n/** The pinned bottom bar. Buttons in it are at least 44px tall and wide, and it clears the home indicator. */\nfunction Footer({ back, hint, className, children, ...rest }: FullScreenFlowFooterProps) {\n return (\n <div className={cx('sc-flow__footer', className)} {...rest}>\n {back ? <div className=\"sc-flow__footer-back\">{back}</div> : null}\n {hint ? <div className=\"sc-flow__footer-hint\">{hint}</div> : null}\n <div className=\"sc-flow__footer-actions\">{children}</div>\n </div>\n );\n}\n\n/**\n * A full-screen, multi-step flow (onboarding, setup) on `Dialog variant=\"fullscreen\"`:\n * `Root` › `Header` (with `Progress`) · `Body` (`Rail` › `RailGroup` › `RailItem`, and `Viewport` › `Step`) · `Footer`.\n * The app owns the state (which step, which direction); this owns the surface, motion, focus and announcements.\n */\nexport const FullScreenFlow = {\n Root,\n Header,\n Progress,\n Body,\n Rail,\n RailGroup,\n RailItem,\n Viewport,\n Step,\n Footer,\n};\n","import type { ComponentPropsWithRef, CSSProperties, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ScoreTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger';\nexport type ScoreSize = 'sm' | 'md';\nexport type ScoreVariant = 'tile' | 'ring';\n\nexport interface ScoreProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * The number shown, e.g. a fit score. Rendered as given; round it first. `null` means not scored yet: a neutral\n * tile (or an empty ring) with a dash, read as \"{label}: not scored\", and `tone` is ignored.\n */\n value: number | null;\n /** The top of the scale. Default 100. Fills the ring and ends the default accessible text. */\n max?: number | undefined;\n /** Colour. The system holds no thresholds: map the value to a tone in the app. Default `accent`. */\n tone?: ScoreTone | undefined;\n /** `tile` (default), a number on a tinted square, or `ring`, a donut for detail headers. */\n variant?: ScoreVariant | undefined;\n /** Tile size: `sm` 40px for list rows (default), `md` 48px. The ring is 64px. */\n size?: ScoreSize | undefined;\n /** A short word under the number: \"fit\". Visual only; say it in `label`. */\n caption?: ReactNode | undefined;\n /** What the number measures, read before it: \"Fit score\". Default \"Score\". */\n label?: string | undefined;\n /** The whole text assistive tech reads instead of the default \"{label} {value} out of {max}\" (\"{label}: not scored\" without a value). */\n valueText?: string | undefined;\n /** Shows the selected look (solid fill). Also on automatically inside a selected Card or an element with `aria-pressed=\"true\"` or `aria-selected=\"true\"`. */\n selected?: boolean | undefined;\n}\n\n/**\n * A score as a number on a tinted tile or inside a ring. The number and caption are visual; assistive tech reads one\n * visually hidden sentence (\"Fit score 94 out of 100\"), so the score is named without `aria-label` on a non-interactive\n * element and reads whole inside a row button. A `null` value is \"not scored\": a dash, no tone, no arc.\n */\nexport function Score({\n value,\n max = 100,\n tone = 'accent',\n variant = 'tile',\n size = 'sm',\n caption,\n label = 'Score',\n valueText,\n selected = false,\n className,\n style,\n ...rest\n}: ScoreProps) {\n const scored = value !== null;\n const fraction = scored && max > 0 ? Math.min(1, Math.max(0, value / max)) : 0;\n return (\n <span\n className={cx('sc-score', className)}\n data-variant={variant}\n data-size={variant === 'tile' ? size : undefined}\n data-tone={scored ? tone : undefined}\n data-unscored={scored ? undefined : true}\n data-selected={selected || undefined}\n style={\n variant === 'ring'\n ? ({ ...style, '--sc-score-fill': (fraction * 100).toFixed(2) } as CSSProperties)\n : style\n }\n {...rest}\n >\n <span className=\"sc-visually-hidden\">\n {valueText ?? (scored ? `${label} ${value} out of ${max}` : `${label}: not scored`)}\n </span>\n {variant === 'ring' ? (\n <svg className=\"sc-score__ring\" viewBox=\"0 0 64 64\" aria-hidden=\"true\" focusable=\"false\">\n {/* r = (64 - ring stroke 6) / 2, so the stroke sits inside the 64px box. */}\n <circle className=\"sc-score__track\" cx=\"32\" cy=\"32\" r=\"29\" pathLength={100} />\n {/* No arc at 0: a zero-length dash with round caps would still paint a dot. */}\n {fraction > 0 ? <circle className=\"sc-score__arc\" cx=\"32\" cy=\"32\" r=\"29\" pathLength={100} /> : null}\n </svg>\n ) : null}\n <span className=\"sc-score__body\" aria-hidden=\"true\">\n <span className=\"sc-score__value\">{scored ? value : '–'}</span>\n {caption != null ? <span className=\"sc-score__caption\">{caption}</span> : null}\n </span>\n </span>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type ReasonTone = 'for' | 'against' | 'gap';\nexport type ReasonListSize = 'sm' | 'md';\n\nexport interface ReasonListProps extends ComponentPropsWithRef<'ul'> {\n /** What every item in the list is: `for` (a filled square), `against` (a bar) or `gap` (a hollow circle). Shape and colour both carry it. */\n tone: ReasonTone;\n /** `md` 14px (default) for a detail view, `sm` 12px for the compact form inside a card. */\n size?: ReasonListSize | undefined;\n /** A dashed rule above the list, for the compact form under a card's title. */\n divider?: boolean | undefined;\n}\n\nexport type ReasonListItemProps = ComponentPropsWithRef<'li'>;\n\n/**\n * A list of reasons with a marker shape per tone, so the meaning is never colour alone. Name the list with a\n * heading (\"Why it fits\", \"Watch for\") and point `aria-labelledby` at it: the heading says what the marker means.\n */\nfunction ReasonListRoot({ tone, size = 'md', divider = false, className, ...rest }: ReasonListProps) {\n return (\n <ul\n className={cx('sc-reason-list', className)}\n data-tone={tone}\n data-size={size}\n data-divider={divider || undefined}\n {...rest}\n />\n );\n}\n\n/** One reason. `<strong>` inside picks out the key words in the default text colour. */\nfunction ReasonListItem({ className, ...rest }: ReasonListItemProps) {\n return <li className={cx('sc-reason-list__item', className)} {...rest} />;\n}\n\nexport const ReasonList = Object.assign(ReasonListRoot, { Item: ReasonListItem });\n","import { createElement, Fragment, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport type WordDiffKind = 'same' | 'added' | 'removed';\nexport interface WordDiffPart {\n kind: WordDiffKind;\n text: string;\n}\nexport type WordDiffElement = 'p' | 'div' | 'span';\nexport type WordDiffSize = 'sm' | 'md';\nexport type WordDiffFamily = 'sans' | 'mono';\n\nexport interface WordDiffProps extends Omit<ComponentPropsWithRef<'p'>, 'children'> {\n /** Runs of unchanged, removed and added text, in reading order, whitespace included. Rendered exactly: joining every `text` gives the visible string. */\n parts: readonly WordDiffPart[];\n /** Element to render. Default `p`; `div` or `span` inside other text. */\n as?: WordDiffElement | undefined;\n /** `sm` 14px UI text (default) or `md` body copy. */\n size?: WordDiffSize | undefined;\n /**\n * `sans` prose (default), or `mono` for code and structured text (YAML, JSON, Markdown source): the mono face, no\n * reading-measure cap, and marks without side padding so columns stay aligned.\n */\n family?: WordDiffFamily | undefined;\n /** Screen reader word around added text: \"[added: …]\". Default \"added\". */\n addedLabel?: string | undefined;\n /** Screen reader word around removed text: \"[removed: …]\". Default \"removed\". */\n removedLabel?: string | undefined;\n}\n\nconst edges = /^(\\s*)([\\s\\S]*?)(\\s*)$/;\n\nfunction Change({ kind, text, label }: { kind: 'added' | 'removed'; text: string; label: string }) {\n // Leading and trailing whitespace stays outside the mark, so the tint and line hug the words.\n const [, lead = '', core = '', trail = ''] = edges.exec(text) ?? [];\n if (!core) return <>{text}</>;\n const Tag = kind === 'added' ? 'ins' : 'del';\n return (\n <>\n {lead}\n <Tag className={`sc-word-diff__${kind}`}>\n <span className=\"sc-visually-hidden\">[{label}: </span>\n {core}\n <span className=\"sc-visually-hidden\">]</span>\n </Tag>\n {trail}\n </>\n );\n}\n\n/**\n * A word-level diff as prose: removed text struck through and added text underlined, each on a tint, inside real\n * `<del>` and `<ins>` with \"[removed: …]\" / \"[added: …]\" for screen readers. The line, not the colour, carries the\n * meaning. Whitespace is preserved exactly (`white-space: pre-wrap`).\n */\nexport function WordDiff({\n parts,\n as = 'p',\n size = 'sm',\n family = 'sans',\n addedLabel = 'added',\n removedLabel = 'removed',\n className,\n ...rest\n}: WordDiffProps) {\n const children: ReactNode = parts.map((part, i) =>\n part.kind === 'same' ? (\n <Fragment key={i}>{part.text}</Fragment>\n ) : (\n <Change\n key={i}\n kind={part.kind}\n text={part.text}\n label={part.kind === 'added' ? addedLabel : removedLabel}\n />\n ),\n );\n return createElement(\n as,\n {\n className: cx('sc-word-diff', className),\n 'data-size': size,\n ...(family === 'mono' ? { 'data-family': 'mono' } : {}),\n ...rest,\n },\n children,\n );\n}\n","import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\n\nexport interface QuoteProps extends ComponentPropsWithRef<'figure'> {\n /** Who said it, shown as a small overline before the words: \"You\". */\n label: ReactNode;\n /** The quoted words. Phrasing content: the quote renders inline after the label. */\n children: ReactNode;\n}\n\n/**\n * Someone's own words echoed back on the accent wash, with who said them: the instruction you gave above the\n * rewrite it produced. A `<figure>` whose `<figcaption>` is the label and whose `<blockquote>` is the text, so the\n * attribution is part of the semantics, not just the styling.\n */\nexport function Quote({ label, className, children, ...rest }: QuoteProps) {\n return (\n <figure className={cx('sc-quote', className)} {...rest}>\n <figcaption className=\"sc-quote__label\">{label}</figcaption>\n <blockquote className=\"sc-quote__text\">{children}</blockquote>\n </figure>\n );\n}\n","import { Avatar as BaseAvatar } from '@base-ui/react/avatar';\nimport { useRender } from '@base-ui/react/use-render';\nimport type { ComponentPropsWithRef } from 'react';\nimport { UserIcon } from '../../icons/icons.gen';\nimport { cx } from '../../utils/cx';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/**\n * One or two capital letters for a person: the first letters of the first and last words of a name, or, for an email\n * address, of its local part split on `.`, `_`, `+`, `-` and digits. Empty when there is nothing to take a letter from.\n */\nexport function avatarInitials(name: string | null | undefined): string {\n const value = name?.trim() ?? '';\n const words = (\n value.includes('@') ? (value.split('@')[0] ?? '').split(/[._+\\-\\d]+/) : value.split(/\\s+/)\n ).filter(Boolean);\n const first = (w: string | undefined) => (w ? (Array.from(w)[0] ?? '') : '');\n const letters = words.length > 1 ? first(words[0]) + first(words[words.length - 1]) : first(words[0]);\n return letters.toUpperCase();\n}\n\ninterface AvatarLookProps {\n /** The person's name, or their email address when there is no name. The initials come from it. (On AvatarButton it is not the form `name` attribute.) */\n name?: string | null | undefined;\n /** Overrides the initials taken from `name`. Shown as given, up to two characters. */\n initials?: string | undefined;\n /** A picture. The initials show until it loads, and stay if it fails. */\n src?: string | undefined;\n /** `xs` 24px (beside text), `sm` 32, `md` 40 (default) and `lg` 48 follow the control heights, compact density included. */\n size?: AvatarSize | undefined;\n}\n\nexport interface AvatarProps extends AvatarLookProps, Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /** Gives the avatar an accessible name (`role=\"img\"`), e.g. the person's name where it is not written next to it. Without it the avatar is decorative and hidden from assistive tech. */\n label?: string | undefined;\n}\n\nfunction Letters({ name, initials }: Pick<AvatarLookProps, 'name' | 'initials'>) {\n const letters = initials?.trim() ? Array.from(initials.trim()).slice(0, 2).join('') : avatarInitials(name);\n return letters ? (\n <span className=\"sc-avatar__initials\">{letters}</span>\n ) : (\n <UserIcon className=\"sc-avatar__icon\" size=\"em\" />\n );\n}\n\n/**\n * A person: their picture, else their initials on a brand tint inside a 1px ring (the ring is what keeps the circle\n * visible on every surface). Decorative unless `label` is given. For a clickable avatar use `AvatarButton`.\n */\nexport function Avatar({ name, initials, src, size = 'md', label, className, ...rest }: AvatarProps) {\n return (\n <BaseAvatar.Root\n className={cx('sc-avatar', className)}\n data-size={size}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n {...rest}\n >\n {src ? <BaseAvatar.Image className=\"sc-avatar__image\" src={src} alt=\"\" /> : null}\n <BaseAvatar.Fallback className=\"sc-avatar__fallback\">\n <Letters name={name} initials={initials} />\n </BaseAvatar.Fallback>\n </BaseAvatar.Root>\n );\n}\n\nexport interface AvatarButtonProps\n extends AvatarLookProps, Omit<useRender.ComponentProps<'button'>, 'children' | 'aria-label' | 'name'> {\n /** Required. The button's accessible name, e.g. `Account: Robin Test`; the avatar inside is decorative. */\n label: string;\n}\n\n/**\n * A round button that is an Avatar, for an account menu or a profile link. The ring thickens on hover and while its\n * popup is open; the focus ring is the system's; on touch the hit area is at least 44px. Compose it as a trigger:\n * `<Menu.Trigger render={<AvatarButton label=\"Account: Robin Test\" name=\"Robin Test\" size=\"sm\" />} />`, or make it a\n * link with `render={<a href=\"/profile\" />}`.\n */\nexport function AvatarButton({\n label,\n name,\n initials,\n src,\n size = 'md',\n type,\n className,\n render,\n ref,\n ...rest\n}: AvatarButtonProps) {\n return useRender({\n render,\n ref,\n defaultTagName: 'button',\n props: {\n // `type` only means something on a real button; a rendered link keeps its own attributes.\n type: render ? type : (type ?? 'button'),\n className: cx('sc-avatar-button', className),\n 'data-size': size,\n 'aria-label': label,\n ...rest,\n children: <Avatar name={name} initials={initials} src={src} size={size} />,\n },\n });\n}\n","export { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from './components/Button/Button';\nexport {\n Badge,\n type BadgeProps,\n type BadgeSize,\n type BadgeTone,\n type BadgeVariant,\n} from './components/Badge/Badge';\nexport {\n Card,\n type CardElement,\n type CardPadding,\n type CardProps,\n type CardVariant,\n} from './components/Card/Card';\nexport {\n Stack,\n type StackAlign,\n type StackElement,\n type StackJustify,\n type StackProps,\n} from './components/Stack/Stack';\nexport {\n Inline,\n type InlineAlign,\n type InlineElement,\n type InlineJustify,\n type InlineProps,\n} from './components/Inline/Inline';\nexport { Kbd, type KbdGroupProps, type KbdProps } from './components/Kbd/Kbd';\nexport {\n Dialog,\n type DialogActionsProps,\n type DialogBodyProps,\n type DialogCloseProps,\n type DialogCloseRequestReason,\n type DialogContentProps,\n type DialogDescriptionProps,\n type DialogRootProps,\n type DialogSize,\n type DialogTitleProps,\n type DialogVariant,\n} from './components/Dialog/Dialog';\nexport { Icon, type IconGlyphProps, type IconProps, type IconSize } from './components/Icon/Icon';\nexport * from './icons/icons.gen';\nexport { iconNames, type IconName } from './icons/icon-names.gen';\nexport { IconButton, type IconButtonDotTone, type IconButtonProps } from './components/IconButton/IconButton';\nexport {\n Tooltip,\n type TooltipAlign,\n type TooltipProps,\n type TooltipSide,\n} from './components/Tooltip/Tooltip';\nexport {\n Menu,\n type MenuAlign,\n type MenuCheckboxItemProps,\n type MenuContentProps,\n type MenuGroupProps,\n type MenuItemProps,\n type MenuItemTone,\n type MenuLinkItemProps,\n type MenuRadioGroupProps,\n type MenuRadioItemProps,\n type MenuRootProps,\n type MenuSeparatorProps,\n type MenuSide,\n type MenuTriggerProps,\n} from './components/Menu/Menu';\nexport type { ControlSize, FieldProps } from './components/Field/FieldShell';\nexport { Input, type InputProps } from './components/Input/Input';\nexport { Textarea, type TextareaProps, type TextareaVariant } from './components/Textarea/Textarea';\nexport { Select, type SelectGroup, type SelectOption, type SelectProps } from './components/Select/Select';\nexport { Checkbox, type CheckboxProps } from './components/Checkbox/Checkbox';\nexport { Switch, type SwitchProps } from './components/Switch/Switch';\nexport {\n Tabs,\n type TabsListProps,\n type TabsListVariant,\n type TabsPanelProps,\n type TabsRootProps,\n type TabsTabProps,\n} from './components/Tabs/Tabs';\nexport {\n Toolbar,\n type ToolbarButtonProps,\n type ToolbarGroupProps,\n type ToolbarLinkProps,\n type ToolbarRootProps,\n type ToolbarSeparatorProps,\n type ToolbarSpacerProps,\n} from './components/Toolbar/Toolbar';\nexport { Banner, type BannerProps, type BannerTone } from './components/Banner/Banner';\nexport { Spinner, type SpinnerProps } from './components/Spinner/Spinner';\nexport {\n Progress,\n type ProgressProps,\n type ProgressSize,\n type ProgressTone,\n type ProgressVariant,\n} from './components/Progress/Progress';\nexport {\n Heading,\n type HeadingElement,\n type HeadingLevel,\n type HeadingProps,\n type HeadingSize,\n type TextTone,\n} from './components/Heading/Heading';\nexport {\n Text,\n type TextAlign,\n type TextElement,\n type TextFamily,\n type TextProps,\n type TextSize,\n type TextWeight,\n} from './components/Text/Text';\nexport {\n Table,\n type TableAlign,\n type TableBodyProps,\n type TableCaptionProps,\n type TableCellProps,\n type TableDensity,\n type TableFootProps,\n type TableHeadProps,\n type TableHeaderProps,\n type TableRootProps,\n type TableRowProps,\n type TableSelectionCellProps,\n type TableSelectionHeaderProps,\n type TableSortDirection,\n} from './components/Table/Table';\nexport { useRowSelection, type RowSelection } from './components/Table/useRowSelection';\nexport type { RowSelectionHeaderState } from './components/Table/rowSelection';\nexport { SelectionBar, type SelectionBarProps } from './components/SelectionBar/SelectionBar';\nexport {\n Toast,\n useToast,\n type ToastApi,\n type ToastOptions,\n type ToastProviderProps,\n type ToastTone,\n} from './components/Toast/Toast';\nexport {\n Stat,\n type StatDeltaTone,\n type StatElement,\n type StatProps,\n type StatSize,\n type StatTrend,\n type StatVariant,\n} from './components/Stat/Stat';\nexport { Chip, type ChipProps, type ChipSize, type ChipTone } from './components/Chip/Chip';\nexport { Disclosure, type DisclosureProps } from './components/Disclosure/Disclosure';\nexport {\n EmptyState,\n type EmptyStateElement,\n type EmptyStateProps,\n type EmptyStateSize,\n} from './components/EmptyState/EmptyState';\nexport { Skeleton, type SkeletonProps, type SkeletonVariant } from './components/Skeleton/Skeleton';\nexport type { SpacingSize } from './types';\nexport const version = '0.1.1';\nexport { FileInput, type FileInputProps } from './components/FileInput/FileInput';\nexport {\n FilePreviewDialog,\n type FilePreviewDialogProps,\n} from './components/FilePreviewDialog/FilePreviewDialog';\nexport {\n PriorityNav,\n type PriorityNavItem,\n type PriorityNavLinkProps,\n type PriorityNavProps,\n} from './components/PriorityNav/PriorityNav';\nexport {\n Popover,\n type PopoverAlign,\n type PopoverCloseProps,\n type PopoverContentProps,\n type PopoverDescriptionProps,\n type PopoverRootProps,\n type PopoverSide,\n type PopoverTitleProps,\n type PopoverTriggerProps,\n} from './components/Popover/Popover';\nexport { BroomIcon, type BroomIconProps } from './components/BroomIcon/BroomIcon';\nexport {\n FullScreenFlow,\n type FlowChapter,\n type FlowCloseRequestReason,\n type FlowDirection,\n type FullScreenFlowBodyProps,\n type FullScreenFlowFooterProps,\n type FullScreenFlowHeaderProps,\n type FullScreenFlowProgressProps,\n type FullScreenFlowRailGroupProps,\n type FullScreenFlowRailItemProps,\n type FullScreenFlowRailProps,\n type FullScreenFlowRootProps,\n type FullScreenFlowStepProps,\n type FullScreenFlowViewportProps,\n} from './components/FullScreenFlow/FullScreenFlow';\nexport {\n Score,\n type ScoreProps,\n type ScoreSize,\n type ScoreTone,\n type ScoreVariant,\n} from './components/Score/Score';\nexport {\n ReasonList,\n type ReasonListItemProps,\n type ReasonListProps,\n type ReasonListSize,\n type ReasonTone,\n} from './components/ReasonList/ReasonList';\nexport {\n WordDiff,\n type WordDiffElement,\n type WordDiffKind,\n type WordDiffPart,\n type WordDiffProps,\n type WordDiffSize,\n} from './components/WordDiff/WordDiff';\nexport { Quote, type QuoteProps } from './components/Quote/Quote';\nexport {\n Avatar,\n AvatarButton,\n avatarInitials,\n type AvatarButtonProps,\n type AvatarProps,\n type AvatarSize,\n} from './components/Avatar/Avatar';\n"],"mappings":"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","names":["jsx","jsxs","createElement","createElement","jsx","jsxs","window","jsx","jsx","jsxs","jsx","jsxs","useRender","jsx","jsxs","Fragment","jsx","jsxs","useRender","Fragment","jsx","jsxs","Root","Trigger","Content","Field","jsx","jsxs","jsx","jsxs","Field","Field","jsx","Field","jsx","jsxs","useId","jsx","jsxs","useId","useId","jsx","jsxs","useId","Fragment","jsx","jsxs","Root","jsx","Root","Group","Separator","Button","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","createElement","createElement","createElement","clamp","createElement","BaseCheckbox","createContext","useContext","jsx","jsxs","createContext","useContext","Root","Body","BaseCheckbox","useState","Fragment","jsx","jsxs","useState","createContext","useContext","useMemo","jsx","jsxs","createContext","Provider","useContext","useMemo","createElement","Fragment","jsx","jsxs","createElement","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","createElement","jsx","createElement","jsx","useEffect","useId","useRef","useState","useEffect","useRef","useState","useCallback","Fragment","jsx","jsxs","useRef","useState","useEffect","jsx","jsxs","useId","useState","useRef","useEffect","id","name","error","useEffect","useId","useLayoutEffect","useRef","useState","x","Fragment","jsx","jsxs","defaultCountLabel","Badge","useState","useId","useRef","useLayoutEffect","useEffect","toggle","jsx","jsxs","Root","Trigger","Content","Title","Description","Close","jsx","jsxs","Children","createContext","useCallback","useContext","useEffect","useId","useMemo","useRef","useState","jsx","jsxs","createContext","Root","useRef","useState","useCallback","useEffect","useMemo","Header","Progress","Body","useId","Viewport","Children","useContext","jsx","jsxs","jsx","createElement","Fragment","Fragment","jsx","jsxs","createElement","jsx","jsxs","useRender","jsx","jsxs","useRender"]}