@cytario/design 5.2.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +1 -1
- package/dist/index.d.ts +51 -41
- package/dist/index.js +79 -59
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/tokens/variables-dark.css +82 -41
- package/src/tokens/variables.css +54 -44
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/Button/Button.tsx","../src/components/_shared/styles.ts","../src/components/Icon/Icon.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Form/InputGroup/InputGroupContext.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/TruncatedText/TruncatedText.tsx","../src/components/TruncatedText/useCopyToClipboard.ts","../src/components/TruncatedText/useMiddleEllipsis.ts","../src/components/TruncatedText/useOverflowDetection.ts","../src/components/IconButton/IconButton.tsx","../src/components/Form/Input/Input.tsx","../src/components/Form/Label/Label.tsx","../src/components/Form/Select/Select.tsx","../src/components/Table/Table.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogFooter.tsx","../src/components/Toast/Toast.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/Switch/Switch.tsx","../src/components/Form/Radio/Radio.tsx","../src/components/Form/Fieldset/Fieldset.tsx","../src/components/Form/InputGroup/InputGroup.tsx","../src/components/Form/InputAddon/InputAddon.tsx","../src/components/Heading/Heading.tsx","../src/components/Link/Link.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/ButtonLink/ButtonLink.tsx","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButtonGroup/ToggleButtonGroup.tsx","../src/components/Menu/Menu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuCheckboxItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuHeader.tsx","../src/components/Menu/MenuSeparator.tsx","../src/components/Popover/Popover.tsx","../src/components/Tabs/Tabs.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/DeltaIndicator/DeltaIndicator.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Banner/Banner.tsx","../src/components/MetricCard/MetricCard.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Pill/Pill.tsx","../src/components/Pill/PathPill.tsx","../src/components/FormWizard/FormWizard.tsx","../src/components/FormWizard/FormWizardProgress.tsx","../src/components/FormWizard/FormWizardNav.tsx","../src/tokens/tokens.ts"],"sourcesContent":["\"use client\";\n\n// React Aria re-exports for consumer integration\nexport { RouterProvider } from \"react-aria-components\";\nexport type { RouterConfig, Key } from \"react-aria-components\";\n\n// Components\nexport { Button } from \"./components/Button\";\nexport type {\n ButtonProps,\n ButtonVariant,\n ButtonSize,\n} from \"./components/Button\";\n\nexport { Spinner } from \"./components/Spinner\";\nexport type { SpinnerProps } from \"./components/Spinner\";\n\nexport { Icon } from \"./components/Icon\";\nexport type { IconProps } from \"./components/Icon\";\n\nexport { Tooltip } from \"./components/Tooltip\";\nexport type { TooltipProps } from \"./components/Tooltip\";\n\nexport { TruncatedText } from \"./components/TruncatedText\";\nexport type { TruncatedTextProps } from \"./components/TruncatedText\";\n\nexport { IconButton } from \"./components/IconButton\";\nexport type { IconButtonProps } from \"./components/IconButton\";\n\nexport { Input } from \"./components/Form/Input\";\nexport type { InputProps } from \"./components/Form/Input\";\n\nexport { Select } from \"./components/Form/Select\";\nexport type { SelectProps, SelectItem } from \"./components/Form/Select\";\n\nexport {\n Table,\n TableHeader,\n Column,\n TableBody,\n Row,\n Cell,\n} from \"./components/Table\";\nexport type { DataTableProps, TableSize } from \"./components/Table\";\n\nexport { Dialog } from \"./components/Dialog\";\nexport type { DialogProps } from \"./components/Dialog\";\n\nexport { ToastProvider, useToast, createToastBridge } from \"./components/Toast\";\nexport type {\n ToastData,\n ToastVariant,\n ToastPlacement,\n ToastContextValue,\n ToastBridge,\n ToastProviderProps,\n} from \"./components/Toast\";\n\nexport { EmptyState } from \"./components/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState\";\n\nexport { Checkbox } from \"./components/Form/Checkbox\";\nexport type { CheckboxProps } from \"./components/Form/Checkbox\";\n\nexport { Switch } from \"./components/Form/Switch\";\nexport type { SwitchProps } from \"./components/Form/Switch\";\n\nexport { RadioGroup, Radio, RadioButton } from \"./components/Form/Radio\";\nexport type {\n RadioGroupProps,\n RadioProps,\n RadioButtonProps,\n} from \"./components/Form/Radio\";\n\nexport { Label } from \"./components/Form/Label\";\nexport type { LabelProps } from \"./components/Form/Label\";\n\nexport { Fieldset } from \"./components/Form/Fieldset\";\nexport type { FieldsetProps } from \"./components/Form/Fieldset\";\n\nexport {\n InputGroup,\n InputGroupContext,\n useInputGroup,\n} from \"./components/Form/InputGroup\";\nexport type { InputGroupProps, GroupPosition } from \"./components/Form/InputGroup\";\n\nexport { InputAddon } from \"./components/Form/InputAddon\";\nexport type { InputAddonProps } from \"./components/Form/InputAddon\";\n\nexport { Heading, H1, H2, H3 } from \"./components/Heading\";\nexport type {\n HeadingProps,\n HeadingLevel,\n HeadingSize,\n} from \"./components/Heading\";\n\nexport { Link } from \"./components/Link\";\nexport type { LinkProps, LinkVariant } from \"./components/Link\";\n\nexport { Breadcrumbs } from \"./components/Breadcrumbs\";\nexport type {\n BreadcrumbsProps,\n BreadcrumbItem,\n} from \"./components/Breadcrumbs\";\n\nexport { ButtonLink, IconButtonLink } from \"./components/ButtonLink\";\nexport type {\n ButtonLinkProps,\n IconButtonLinkProps,\n} from \"./components/ButtonLink\";\n\nexport { ToggleButton } from \"./components/ToggleButton\";\nexport type {\n ToggleButtonProps,\n ToggleButtonVariant,\n ToggleButtonSize,\n} from \"./components/ToggleButton\";\n\nexport {\n ToggleButtonGroup,\n ToggleButtonGroupItem,\n} from \"./components/ToggleButtonGroup\";\nexport type {\n ToggleButtonGroupProps,\n ToggleButtonGroupItemProps,\n ToggleButtonGroupSize,\n} from \"./components/ToggleButtonGroup\";\n\nexport {\n Menu,\n MenuItem,\n MenuCheckboxItem,\n MenuSection,\n MenuHeader,\n MenuSeparator,\n} from \"./components/Menu\";\nexport type {\n MenuProps,\n MenuItemData,\n MenuItemProps,\n MenuCheckboxItemProps,\n MenuSectionProps,\n MenuHeaderProps,\n MenuSeparatorProps,\n} from \"./components/Menu\";\n\nexport { Popover, PopoverTrigger, PopoverContent } from \"./components/Popover\";\nexport type {\n PopoverProps,\n PopoverTriggerProps,\n PopoverContentProps,\n} from \"./components/Popover\";\n\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type {\n TabsProps,\n TabListProps,\n TabProps,\n TabPanelProps,\n TabsVariant,\n TabsSize,\n} from \"./components/Tabs\";\n\n// Raw React Aria Components tab primitives (unstyled escape hatch)\nexport {\n Tabs as UnstyledTabs,\n TabList as UnstyledTabList,\n Tab as UnstyledTab,\n TabPanel as UnstyledTabPanel,\n} from \"react-aria-components\";\n\nexport {\n SegmentedControl,\n SegmentedControlItem,\n} from \"./components/SegmentedControl\";\nexport type {\n SegmentedControlProps,\n SegmentedControlItemProps,\n SegmentedControlSize,\n SegmentedControlSelectionMode,\n} from \"./components/SegmentedControl\";\n\nexport { Badge } from \"./components/Badge\";\nexport type { BadgeProps, BadgeVariant, BadgeSize } from \"./components/Badge\";\n\nexport { Card } from \"./components/Card\";\nexport type { CardProps, CardPadding } from \"./components/Card\";\n\nexport { DeltaIndicator } from \"./components/DeltaIndicator\";\nexport type {\n DeltaIndicatorProps,\n DeltaFormat,\n DeltaMode,\n} from \"./components/DeltaIndicator\";\n\nexport { ProgressBar } from \"./components/ProgressBar\";\nexport type {\n ProgressBarProps,\n ProgressBarVariant,\n ProgressBarSize,\n} from \"./components/ProgressBar\";\n\nexport { Banner } from \"./components/Banner\";\nexport type { BannerProps, BannerVariant } from \"./components/Banner\";\n\nexport { MetricCard } from \"./components/MetricCard\";\nexport type { MetricCardProps, MetricCardSize } from \"./components/MetricCard\";\n\nexport { SectionHeader } from \"./components/SectionHeader\";\nexport type { SectionHeaderProps } from \"./components/SectionHeader\";\n\nexport { Pill, pillColorFromName, PathPill } from \"./components/Pill\";\nexport type { PillProps, PillColor, PathPillProps } from \"./components/Pill\";\n\nexport { FormWizard, useFormWizard } from \"./components/FormWizard\";\nexport type {\n FormWizardProps,\n FormWizardContextValue,\n} from \"./components/FormWizard\";\n\nexport { FormWizardProgress } from \"./components/FormWizard\";\nexport type { FormWizardProgressProps } from \"./components/FormWizard\";\n\nexport { FormWizardNav } from \"./components/FormWizard\";\nexport type { FormWizardNavProps } from \"./components/FormWizard\";\n\n// Design tokens (TypeScript constants)\nexport * from \"./tokens/tokens\";\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type Size,\n type ButtonVariant,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { useInputGroup } from \"../Form/InputGroup/InputGroupContext\";\n\nexport type { ButtonVariant };\nexport type ButtonSize = Size;\n\nexport interface ButtonProps extends AriaButtonProps {\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: ButtonSize;\n /** Shows a spinner and disables interaction */\n isLoading?: boolean;\n /** Lucide icon rendered before children */\n iconLeft?: LucideIcon;\n /** Lucide icon rendered after children */\n iconRight?: LucideIcon;\n}\n\nconst iconSizeMap = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"sm\",\n lg: \"md\",\n} as const;\n\nfunction groupRadiusClass(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-md rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-md rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n isDisabled,\n iconLeft,\n iconRight,\n className,\n children,\n ...props\n}: ButtonProps) {\n const { inGroup, position } = useInputGroup();\n\n const groupGhost =\n inGroup && variant === \"ghost\"\n ? \"bg-(--color-surface-default) text-(--color-text-secondary) border border-(--color-border-default) hover:bg-(--color-surface-hover) hover:text-(--color-text-primary) hover:border-(--color-border-strong) pressed:bg-(--color-surface-pressed) pressed:text-(--color-text-primary)\"\n : \"\";\n\n const radiusClass = inGroup ? groupRadiusClass(position) : \"rounded-md\";\n\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n const focusRing = inGroup\n ? \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\";\n\n return (\n <AriaButton\n {...props}\n isDisabled={isDisabled || isLoading}\n className={twMerge(\n \"inline-flex items-center justify-center gap-2 shrink-0 cursor-pointer\",\n radiusClass,\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n groupGhost || variantStyles[variant],\n sizeStyles[size],\n marginClass,\n className as string,\n )}\n >\n {isLoading && <Spinner size={iconSizeMap[size]} />}\n {!isLoading && iconLeft && (\n <Icon icon={iconLeft} size={iconSizeMap[size]} />\n )}\n {children as React.ReactNode}\n {!isLoading && iconRight && (\n <Icon icon={iconRight} size={iconSizeMap[size]} />\n )}\n </AriaButton>\n );\n}\n","/* ── Shared sizes ── */\n\nexport type Size = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport const sizeStyles: Record<Size, string> = {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\n/* ── Button ── */\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"default\"\n | \"success\"\n | \"info\"\n | \"neutral\";\n\nexport const variantStyles: Record<ButtonVariant, string> = {\n primary: [\n \"bg-(--color-action-primary) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-primary-hover)\",\n \"pressed:bg-(--color-action-primary-active)\",\n ].join(\" \"),\n secondary: [\n \"bg-transparent text-(--color-action-secondary)\",\n \"border border-(--color-border-brand)\",\n \"hover:bg-purple-50\",\n \"pressed:bg-purple-100\",\n ].join(\" \"),\n ghost: [\n \"bg-transparent text-(--color-text-primary)\",\n \"hover:bg-(--color-surface-hover)\",\n \"pressed:bg-(--color-surface-pressed)\",\n ].join(\" \"),\n destructive: [\n \"bg-(--color-action-danger) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-danger-hover)\",\n \"pressed:bg-(--color-action-danger-hover)\",\n ].join(\" \"),\n default: [\n \"bg-(--color-action-default) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-default-hover)\",\n \"pressed:bg-slate-600\",\n ].join(\" \"),\n success: [\n \"bg-(--color-action-success) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-success-hover)\",\n \"pressed:bg-green-800\",\n ].join(\" \"),\n info: [\n \"bg-(--color-action-info) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-info-hover)\",\n \"pressed:bg-slate-800\",\n ].join(\" \"),\n neutral: [\n \"bg-(--color-surface-default) text-(--color-text-primary)\",\n \"border border-(--color-border-default)\",\n \"hover:bg-(--color-surface-subtle)\",\n \"pressed:bg-(--color-surface-muted)\",\n ].join(\" \"),\n};\n","import type { LucideIcon } from \"lucide-react\";\n\nexport interface IconProps {\n /** A Lucide icon component */\n icon: LucideIcon;\n /** Size preset */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** SVG stroke width */\n strokeWidth?: number;\n /** Accessible label — when provided, the icon is treated as meaningful */\n \"aria-label\"?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst sizeMap = {\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n} as const;\n\nexport function Icon({\n icon: LucideComponent,\n size = \"md\",\n strokeWidth,\n \"aria-label\": ariaLabel,\n className,\n}: IconProps) {\n const isDecorative = !ariaLabel;\n\n return (\n <LucideComponent\n size={sizeMap[size]}\n strokeWidth={strokeWidth}\n role={isDecorative ? undefined : \"img\"}\n aria-label={ariaLabel}\n aria-hidden={isDecorative ? \"true\" : undefined}\n className={className}\n />\n );\n}\n","export interface SpinnerProps {\n /** Size preset */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Accessible label — when provided, the spinner is announced to screen readers */\n \"aria-label\"?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst sizeMap = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n} as const;\n\nexport function Spinner({\n size = \"md\",\n \"aria-label\": ariaLabel,\n className,\n}: SpinnerProps) {\n const isDecorative = !ariaLabel;\n\n return (\n <svg\n role={isDecorative ? undefined : \"status\"}\n aria-label={ariaLabel}\n aria-hidden={isDecorative ? \"true\" : undefined}\n className={[sizeMap[size], \"animate-spin\", className]\n .filter(Boolean)\n .join(\" \")}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","import { createContext, useContext } from \"react\";\n\nexport type GroupPosition = \"start\" | \"middle\" | \"end\" | \"standalone\";\n\ninterface InputGroupContextValue {\n inGroup: boolean;\n position: GroupPosition;\n}\n\nexport const InputGroupContext = createContext<InputGroupContextValue>({\n inGroup: false,\n position: \"standalone\",\n});\n\nexport function useInputGroup() {\n return useContext(InputGroupContext);\n}\n","import {\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n// Use useLayoutEffect on client, useEffect on server to avoid SSR warning\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport interface TooltipProps {\n /** Tooltip content; `null`/`undefined` disables the tooltip entirely */\n content: ReactNode;\n /** Trigger element(s) */\n children: ReactNode;\n}\n\ninterface Coords {\n x: number;\n y: number;\n}\n\nconst offsetThreshold = 5;\nconst tooltipDelay = 500; // ms of cursor rest before showing\nconst tooltipOffset = 12;\nconst viewportMargin = 4; // minimum gap to the viewport edge\n\nconst tooltipCx = [\n \"fixed z-50 px-2 py-1 rounded shadow-lg\",\n // Natural content width (capped at max-w-xs): being positioned near the\n // right viewport edge must shift the tooltip left, not squeeze its layout.\n \"w-max max-w-xs\",\n \"bg-(--color-surface-overlay) backdrop-blur-sm\",\n \"text-(--color-text-inverse) text-sm\",\n \"pointer-events-none\",\n].join(\" \");\n\n/**\n * Cursor-following tooltip. Shows after the cursor rests on the trigger for\n * 500ms (movement beyond 5px restarts the wait), positioned at a 12px offset\n * from the cursor and flipped at viewport edges.\n *\n * Keyboard: when an already-focusable child (button, switch, link) receives\n * visible focus, the tooltip shows immediately, anchored to the element's\n * center. It never makes anything focusable itself. Escape dismisses.\n *\n * Known limitation (WCAG 1.4.13 \"hoverable\"): the tooltip is\n * pointer-events-none and follows the cursor, so it cannot itself be hovered.\n * Keep tooltip content short — it is a glance affordance, not a reading\n * surface; the underlying value must stay accessible on the trigger itself.\n */\nexport function Tooltip({ content, children }: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState<Coords>({ x: 0, y: 0 });\n const [adjustedCoords, setAdjustedCoords] = useState<Coords>({ x: 0, y: 0 });\n const timerRef = useRef<number | null>(null);\n // Cursor-rest anchor. A ref, not state: the move-cancel comparison must see\n // the value set earlier in the SAME event stream, not a previous render's.\n const restAnchorRef = useRef<Coords | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const isVisible = visible && content != null;\n\n const calculateAdjustedPosition = (anchorX: number, anchorY: number) => {\n if (!tooltipRef.current) {\n return { x: anchorX + tooltipOffset, y: anchorY + tooltipOffset };\n }\n\n const { width, height } = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let x = anchorX + tooltipOffset;\n let y = anchorY + tooltipOffset;\n\n // Flip to the other side of the anchor at right/bottom edges\n if (anchorX + width > viewportWidth) {\n x = anchorX - width - tooltipOffset;\n }\n if (anchorY + height > viewportHeight) {\n y = anchorY - height - tooltipOffset;\n }\n\n // Hard-clamp into the viewport — flipping alone can still overshoot\n // (e.g. anchor near a corner, or tooltip wider than the remaining space)\n x = Math.max(\n viewportMargin,\n Math.min(x, viewportWidth - width - viewportMargin),\n );\n y = Math.max(\n viewportMargin,\n Math.min(y, viewportHeight - height - viewportMargin),\n );\n\n return { x, y };\n };\n\n // Recalculate position after tooltip is rendered/resized\n useIsomorphicLayoutEffect(() => {\n if (!isVisible || !tooltipRef.current) return;\n setAdjustedCoords(calculateAdjustedPosition(coords.x, coords.y));\n }, [isVisible, coords, content]);\n\n const hideTooltip = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n restAnchorRef.current = null;\n setVisible(false);\n };\n\n // Cursor-rest model: any move beyond the threshold (measured against the\n // incoming event coordinates, not stale state) hides the tooltip, re-anchors\n // and restarts the dwell; staying within it lets the pending timer fire.\n const handleMouseMove = ({ clientX, clientY }: MouseEvent) => {\n setCoords({ x: clientX, y: clientY });\n\n const anchor = restAnchorRef.current;\n const moved =\n anchor == null ||\n Math.abs(clientX - anchor.x) > offsetThreshold ||\n Math.abs(clientY - anchor.y) > offsetThreshold;\n\n if (!moved) return;\n\n hideTooltip();\n restAnchorRef.current = { x: clientX, y: clientY };\n timerRef.current = window.setTimeout(() => {\n setVisible(true);\n }, tooltipDelay);\n };\n\n // Keyboard path: a focusable child received focus. Only react to visible\n // (keyboard-driven) focus and anchor at the element's center — no dwell,\n // deliberate focus is intent enough.\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as Element;\n let focusVisible = true;\n try {\n focusVisible = target.matches(\":focus-visible\");\n } catch {\n // Older engines without :focus-visible — fall back to showing.\n }\n if (!focusVisible) return;\n\n const rect = target.getBoundingClientRect();\n const center = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n // Anchor at the element center so incidental mouse movement over the\n // focused trigger doesn't immediately cancel the keyboard-shown tooltip.\n restAnchorRef.current = center;\n setCoords(center);\n setVisible(true);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") hideTooltip();\n };\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n const tooltipContent =\n isVisible && content != null ? (\n <div\n ref={tooltipRef}\n role=\"tooltip\"\n className={tooltipCx}\n style={{ left: adjustedCoords.x, top: adjustedCoords.y }}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <span\n style={{ display: \"contents\" }}\n onMouseMove={handleMouseMove}\n onMouseLeave={hideTooltip}\n onFocus={handleFocus}\n onBlur={hideTooltip}\n onKeyDown={handleKeyDown}\n >\n {children}\n {typeof window !== \"undefined\" &&\n createPortal(tooltipContent, document.body)}\n </span>\n );\n}\n","import {\n CSSProperties,\n KeyboardEvent,\n ReactNode,\n UIEvent,\n useRef,\n} from \"react\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useCopyToClipboard } from \"./useCopyToClipboard\";\nimport { useMiddleEllipsis } from \"./useMiddleEllipsis\";\nimport { useOverflowDetection } from \"./useOverflowDetection\";\n\ntype EllipsisMode = \"left\" | \"middle\" | \"right\";\n\nexport interface TruncatedTextProps {\n /** Text to display. `middle` ellipsis requires a string child. */\n children: ReactNode;\n /** Where the ellipsis is placed when the text overflows (default `right`). */\n ellipsis?: EllipsisMode;\n /** When set, the text becomes click-to-copy and copies this value. */\n copyValue?: string;\n}\n\nconst spanCx = \"truncate overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n// Web's original used -mx-1 px-1 to widen the hover highlight beyond the\n// text; on a w-full element the negative margin overflows the container and\n// clips on the right — keep the highlight within the text box instead.\nconst copyCx =\n \"hover:bg-(--color-surface-hover) transition-colors rounded cursor-pointer\";\n\nconst leftStyle: CSSProperties = { direction: \"rtl\", textAlign: \"left\" };\n\n// An overflow-hidden + ellipsis element is still a horizontal scroll\n// container: a click-drag text selection (or focus) scrolls it, sliding the\n// text and hiding the ellipsis. Pin it so the truncation always shows.\nconst pinScroll = (e: UIEvent<HTMLElement>) => {\n if (e.currentTarget.scrollLeft !== 0) e.currentTarget.scrollLeft = 0;\n};\n\nconst handleCopyKeyDown = (handleClick: () => void) => (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n};\n\nconst CopiedOverlay = () => (\n <span\n // Announce the successful copy to screen readers; as a live region the\n // text is not glued onto the button's accessible name.\n role=\"status\"\n aria-live=\"polite\"\n className=\"absolute inset-0 flex items-center text-(--color-text-secondary) pointer-events-none\"\n >\n Copied\n </span>\n);\n\n// ─── Right (default): pure CSS truncation ───────────────────────────\n\nconst RightEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {children}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Left: CSS direction trick ──────────────────────────────────────\n\nconst LeftEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n style={leftStyle}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n <bdi>{children}</bdi>\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Middle: JS-based truncation ────────────────────────────────────\n\nconst middleCx = \"overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n\nconst MiddleEllipsisString = ({ text, copyValue }: { text: string; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const displayed = useMiddleEllipsis(ref, text);\n const isTruncated = displayed !== text;\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${middleCx} ${copyCx} relative` : middleCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? text : null}>\n <span\n ref={ref}\n className={cx}\n // Middle truncation replaces the DOM text, so screen readers would\n // otherwise announce the mutilated string — expose the full value.\n aria-label={isTruncated ? text : undefined}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {displayed}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Public component ───────────────────────────────────────────────\n\n/**\n * Truncating text span (ported from cytario-web's TooltipSpan). Reveals the\n * full value via the cursor tooltip only while actually truncated. Plain text\n * stays non-focusable; passing `copyValue` turns it into a click-to-copy\n * button (focusable, keyboard operable).\n */\nexport const TruncatedText = ({ children, ellipsis = \"right\", copyValue }: TruncatedTextProps) => {\n if (ellipsis === \"left\") return <LeftEllipsis copyValue={copyValue}>{children}</LeftEllipsis>;\n if (ellipsis === \"middle\" && typeof children === \"string\")\n return <MiddleEllipsisString text={children} copyValue={copyValue} />;\n return <RightEllipsis copyValue={copyValue}>{children}</RightEllipsis>;\n};\n","import { useCallback, useRef, useState } from \"react\";\n\nconst FLASH_DURATION = 1500;\n\ninterface UseCopyToClipboardResult {\n handleClick: () => void;\n isCopied: boolean;\n}\n\nexport function useCopyToClipboard(copyValue: string | undefined): UseCopyToClipboardResult {\n const [isCopied, setIsCopied] = useState(false);\n const timerRef = useRef<number | null>(null);\n\n const handleClick = useCallback(() => {\n if (copyValue == null) return;\n\n const selection = window.getSelection()?.toString();\n if (selection && selection.length > 0) return;\n\n // Clipboard API is absent in insecure contexts and can reject on denied\n // permission — fail silently rather than throw.\n if (!navigator.clipboard) return;\n navigator.clipboard\n .writeText(copyValue)\n .then(() => {\n if (timerRef.current != null) clearTimeout(timerRef.current);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => {\n setIsCopied(false);\n timerRef.current = null;\n }, FLASH_DURATION);\n })\n .catch(() => {});\n }, [copyValue]);\n\n return { handleClick, isCopied };\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\nconst ELLIPSIS = \"…\";\n\n/**\n * Binary-search for the longest `start…end` that fits within the element.\n * Uses actual DOM measurement (scrollWidth vs clientWidth) instead of canvas,\n * so results are pixel-perfect regardless of font, letter-spacing, or rendering.\n */\nfunction computeTruncated(el: HTMLElement, text: string): string {\n el.textContent = text;\n if (el.scrollWidth <= el.clientWidth) return text;\n\n let lo = 0;\n let hi = text.length;\n\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n const startLen = Math.ceil(mid / 2);\n const endLen = Math.floor(mid / 2);\n el.textContent =\n text.slice(0, startLen) + ELLIPSIS + (endLen > 0 ? text.slice(text.length - endLen) : \"\");\n\n if (el.scrollWidth <= el.clientWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n\n if (lo === 0) return ELLIPSIS;\n\n const startLen = Math.ceil(lo / 2);\n const endLen = Math.floor(lo / 2);\n\n const result =\n endLen === 0\n ? text.slice(0, startLen) + ELLIPSIS\n : text.slice(0, startLen) + ELLIPSIS + text.slice(text.length - endLen);\n\n // Ensure the DOM shows the final result immediately, before React re-renders.\n el.textContent = result;\n return result;\n}\n\n/**\n * Observes the container width and returns a middle-truncated string.\n * Returns the original text if it fits within the container.\n */\nexport function useMiddleEllipsis(ref: RefObject<HTMLSpanElement | null>, text: string): string {\n const [displayed, setDisplayed] = useState(text);\n\n // useLayoutEffect runs before paint, so the user never sees the full text.\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const update = () => setDisplayed(computeTruncated(el, text));\n\n update();\n\n const observer = new ResizeObserver(() => update());\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, text]);\n\n return displayed;\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\n/**\n * Detects whether an element's content overflows its visible width.\n * Uses ResizeObserver to recheck on any container size change\n * (column resize, flex layout shifts, not just window resize).\n */\nexport function useOverflowDetection(ref: RefObject<HTMLElement | null>): boolean {\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const check = () => setIsTruncated(el.scrollWidth > el.offsetWidth);\n\n check();\n\n // Defer + coalesce to the next frame so a live container resize (e.g.\n // dragging a sidebar) can't drive a synchronous observe→setState→layout\n // loop (\"Maximum update depth\").\n let raf = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(check);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n observer.disconnect();\n };\n }, [ref]);\n\n return isTruncated;\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { type ButtonVariant, variantStyles } from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useInputGroup } from \"../Form/InputGroup/InputGroupContext\";\n\nexport interface IconButtonProps extends Omit<AriaButtonProps, \"className\"> {\n /** Lucide icon to render */\n icon: LucideIcon;\n /** Required for accessibility — also used as tooltip content */\n \"aria-label\": string;\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Show tooltip on hover (default true) */\n showTooltip?: boolean;\n /** Shows a spinner and disables interaction */\n isLoading?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles = {\n xs: \"h-7 w-7\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n} as const;\n\nconst squareWidthOnly = {\n xs: \"w-7\",\n sm: \"w-8\",\n md: \"w-10\",\n lg: \"w-12\",\n} as const;\n\nconst iconSizeMap = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"sm\",\n lg: \"md\",\n} as const;\n\nfunction groupRadiusClass(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-md rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-md rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function IconButton({\n icon,\n \"aria-label\": ariaLabel,\n variant = \"ghost\",\n size = \"md\",\n showTooltip = true,\n isLoading = false,\n isDisabled,\n className,\n ...props\n}: IconButtonProps) {\n const { inGroup, position } = useInputGroup();\n\n const groupGhost =\n inGroup && variant === \"ghost\"\n ? \"bg-(--color-surface-default) text-(--color-text-secondary) border border-(--color-border-default) hover:bg-(--color-surface-hover) hover:text-(--color-text-primary) hover:border-(--color-border-strong) pressed:bg-(--color-surface-pressed) pressed:text-(--color-text-primary)\"\n : \"\";\n\n const radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-md\";\n\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n const focusRing = inGroup\n ? \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\";\n\n const button = (\n <AriaButton\n {...props}\n aria-label={ariaLabel}\n isDisabled={isDisabled || isLoading}\n className={[\n \"inline-flex items-center justify-center shrink-0 cursor-pointer\",\n radiusClass,\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n groupGhost || variantStyles[variant],\n inGroup ? squareWidthOnly[size] : squareSizeStyles[size],\n marginClass,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {isLoading ? (\n <Spinner size={iconSizeMap[size]} />\n ) : (\n <Icon icon={icon} size={iconSizeMap[size]} />\n )}\n </AriaButton>\n );\n\n if (showTooltip) {\n return (\n <Tooltip content={ariaLabel}>{button}</Tooltip>\n );\n }\n\n return button;\n}\n","import type { ElementType } from \"react\";\nimport {\n TextField,\n Input as AriaInput,\n Text,\n type TextFieldProps,\n ColorField,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type Size, sizeStyles } from \"../../_shared/styles\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\nimport { Label } from \"../Label\";\n\nconst alignClasses = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\nexport interface InputProps extends Omit<\n TextFieldProps,\n \"children\" | \"className\"\n> {\n as?: typeof TextField | typeof ColorField;\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\";\n size?: Size;\n prefix?: string;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\n/**\n * Returns Tailwind border-radius classes for the border-bearing element\n * based on InputGroup position context.\n */\nfunction groupRadiusClasses(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-(--border-radius-md) rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-(--border-radius-md) rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function Input({\n as: FieldProp = TextField,\n label,\n placeholder,\n description,\n errorMessage,\n type = \"text\",\n size = \"md\",\n prefix,\n align = \"left\",\n isDisabled,\n isRequired,\n className,\n ...props\n}: InputProps) {\n const Field: ElementType = FieldProp;\n\n const isInvalid = !!errorMessage;\n const { inGroup, position } = useInputGroup();\n\n const borderColor = isInvalid\n ? \"border-(--color-border-danger)\"\n : \"border-(--color-border-default) hover:border-(--color-border-strong)\";\n\n const radiusClass = inGroup ? groupRadiusClasses(position) : \"rounded-md\";\n\n /** When not first in a group, overlap left border with previous sibling */\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n return (\n <Field\n {...props}\n type={type}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n className={twMerge(\n \"flex w-full flex-col gap-1\",\n inGroup ? \"min-w-0 flex-1\" : \"\",\n marginClass,\n className,\n )}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n {prefix ? (\n <div\n className={twMerge(\n \"flex items-center overflow-hidden\",\n radiusClass,\n \"border\",\n \"bg-(--color-surface-default)\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus-within:ring-2 focus-within:ring-(--color-border-focus) focus-within:border-(--color-border-focus)\",\n inGroup && \"focus-within:z-10\",\n isDisabled && \"opacity-50 pointer-events-none\",\n )}\n >\n <span\n className={twMerge(\n \"self-stretch flex items-center shrink-0 select-none\",\n \"bg-(--color-surface-subtle)\",\n \"border-r border-r-(--color-border-default)\",\n \"text-(--color-text-secondary)\",\n sizeStyles[size],\n )}\n >\n {prefix}\n </span>\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full bg-transparent\",\n sizeStyles[size],\n alignClasses[align],\n \"text-(--color-text-primary)\",\n \"placeholder:text-(--color-text-tertiary)\",\n \"outline-none border-none\",\n )}\n />\n </div>\n ) : (\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full\",\n sizeStyles[size],\n alignClasses[align],\n radiusClass,\n \"border\",\n \"text-(--color-text-primary)\",\n \"bg-(--color-surface-default)\",\n \"placeholder:text-(--color-text-tertiary)\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus:ring-2 focus:ring-(--color-border-focus) focus:border-(--color-border-focus)\",\n inGroup && \"focus:z-10\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n )}\n />\n )}\n\n {description && (\n <Text\n slot=\"description\"\n className=\"text-sm text-(--color-text-secondary)\"\n >\n {description}\n </Text>\n )}\n\n {isInvalid && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-(--color-text-danger)\"\n >\n {errorMessage}\n </Text>\n )}\n </Field>\n );\n}\n","import {\n Label as AriaLabel,\n type LabelProps as AriaLabelProps,\n} from \"react-aria-components\";\n\nexport interface LabelProps extends Omit<AriaLabelProps, \"className\"> {\n isRequired?: boolean;\n className?: string;\n}\n\nexport function Label({ isRequired, children, className, ...props }: LabelProps) {\n return (\n <AriaLabel\n {...props}\n className={[\n \"text-sm\",\n \"font-medium\",\n \"text-(--color-text-primary)\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n {isRequired && (\n <span\n aria-hidden=\"true\"\n className=\"ml-0.5 text-(--color-text-danger)\"\n >\n *\n </span>\n )}\n </AriaLabel>\n );\n}\n","import type React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport {\n Button,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n SelectValue,\n Text,\n type SelectProps as AriaSelectProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type Size, sizeStyles } from \"../../_shared/styles\";\nimport { Label } from \"../Label\";\n\nexport interface SelectItem {\n id: string;\n name: string;\n}\n\nexport interface SelectProps extends Omit<\n AriaSelectProps<SelectItem>,\n \"children\"\n> {\n items: SelectItem[];\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n /** Controls padding and font size */\n size?: Size;\n /** Custom visual renderer for items in the dropdown and trigger.\n * `item.name` remains the accessible label (used for typeahead and screen readers). */\n renderItem?: (item: SelectItem) => React.ReactNode;\n}\n\nexport function Select({\n label,\n items,\n placeholder = \"Select an option\",\n description,\n errorMessage,\n size = \"md\",\n isDisabled,\n isRequired,\n className,\n renderItem,\n ...props\n}: SelectProps) {\n const hasError = Boolean(errorMessage);\n\n return (\n <AriaSelect\n {...props}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={hasError}\n className={twMerge(\"flex flex-col gap-1\", className as string)}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n <Button\n aria-required={isRequired || undefined}\n className={twMerge(\n `\n inline-flex items-center justify-between\n w-full rounded-md\n text-left\n border outline-none transition-colors\n focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\n cursor-pointer disabled:opacity-50 disabled:pointer-events-none\n bg-(--color-surface-default)\n `,\n sizeStyles[size],\n hasError\n ? \"border-(--color-border-danger)\"\n : \"border-(--color-border-default)\",\n )}\n >\n <SelectValue\n className={twMerge(\n renderItem ? \"min-w-0\" : \"truncate\",\n \"data-placeholder:text-(--color-text-tertiary)\",\n )}\n >\n {({ selectedItem, isPlaceholder }) => {\n if (isPlaceholder) return placeholder;\n const item = selectedItem as SelectItem;\n return renderItem ? renderItem(item) : (item?.name ?? placeholder);\n }}\n </SelectValue>\n <ChevronDown\n aria-hidden\n className={twMerge(\n \"shrink-0 text-(--color-text-secondary)\",\n size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\",\n )}\n />\n </Button>\n\n {description && (\n <Text slot=\"description\" className=\"text-sm text-(--color-text-secondary)\">\n {description}\n </Text>\n )}\n\n {hasError && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-(--color-text-danger)\"\n >\n {errorMessage}\n </Text>\n )}\n\n <Popover\n className={twMerge(\n \"w-(--trigger-width)\",\n \"rounded-md\",\n \"border border-(--color-border-default)\",\n \"bg-(--color-surface-default)\",\n \"shadow-lg\",\n \"overflow-auto\",\n \"entering:animate-in entering:fade-in\",\n \"exiting:animate-out exiting:fade-out\",\n )}\n >\n <ListBox className=\"p-1 outline-none\" items={items}>\n {(item) => (\n <ListBoxItem\n id={item.id}\n textValue={item.name}\n className={twMerge(\n `\n flex items-center justify-between gap-2\n rounded-sm\n text-(--color-text-primary)\n cursor-pointer outline-none\n hover:bg-(--color-surface-muted)\n focus-visible:bg-(--color-surface-muted)\n selected:text-(--color-action-primary) selected:font-medium\n `,\n sizeStyles[size],\n )}\n >\n {({ isSelected }) => (\n <>\n <span className={renderItem ? \"min-w-0 flex-1\" : \"truncate\"}>\n {renderItem ? renderItem(item) : item.name}\n </span>\n {isSelected && (\n <Check className=\"h-4 w-4 shrink-0 text-(--color-action-primary)\" />\n )}\n </>\n )}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n","import {\n Cell as AriaCell,\n Column as AriaColumn,\n Row as AriaRow,\n Table as AriaTable,\n TableBody as AriaTableBody,\n TableHeader as AriaTableHeader,\n type CellProps,\n type ColumnProps,\n type RowProps,\n type TableBodyProps,\n type TableHeaderProps,\n type TableProps,\n} from \"react-aria-components\";\n\nexport type TableSize = \"compact\" | \"comfortable\";\n\n/* ------------------------------------------------------------------ */\n/* Table */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps extends TableProps {\n /** Row density */\n size?: TableSize;\n}\n\nconst tableSizeClass: Record<TableSize, string> = {\n compact: \"[--table-row-py:theme(spacing.1)]\",\n comfortable: \"[--table-row-py:theme(spacing.3)]\",\n};\n\nexport function Table({ size = \"comfortable\", className, ...props }: DataTableProps) {\n return (\n <AriaTable\n {...props}\n className={[\n \"w-full border-collapse text-(--font-size-sm) text-(--color-text-primary)\",\n tableSizeClass[size],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* TableHeader */\n/* ------------------------------------------------------------------ */\n\nexport function TableHeader<T extends object>(props: TableHeaderProps<T>) {\n return <AriaTableHeader {...props} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Column */\n/* ------------------------------------------------------------------ */\n\nexport function Column(props: ColumnProps) {\n return (\n <AriaColumn\n {...props}\n className={[\n \"px-3 py-2 text-left font-semibold text-(--color-text-secondary)\",\n \"border-b-2 border-(--color-border-default)\",\n \"cursor-default select-none outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-(--color-border-focus) focus-visible:outline-offset-[-2px]\",\n ].join(\" \")}\n >\n {({ allowsSorting, sortDirection }) => (\n <span className=\"inline-flex items-center gap-1\">\n {props.children as React.ReactNode}\n {allowsSorting && (\n <span aria-hidden=\"true\" className=\"text-(--color-text-tertiary)\">\n {sortDirection === \"ascending\" ? \"\\u25B2\" : sortDirection === \"descending\" ? \"\\u25BC\" : \"\\u25B4\"}\n </span>\n )}\n </span>\n )}\n </AriaColumn>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* TableBody */\n/* ------------------------------------------------------------------ */\n\nexport function TableBody<T extends object>(props: TableBodyProps<T>) {\n return <AriaTableBody {...props} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Row */\n/* ------------------------------------------------------------------ */\n\nexport function Row<T extends object>(props: RowProps<T>) {\n return (\n <AriaRow\n {...props}\n className={[\n \"border-b border-(--color-border-default)\",\n \"even:bg-(--color-surface-subtle)\",\n \"hover:bg-(--color-surface-muted)\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-(--color-border-focus) focus-visible:outline-offset-[-2px]\",\n \"transition-colors\",\n ].join(\" \")}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Cell */\n/* ------------------------------------------------------------------ */\n\nexport function Cell(props: CellProps) {\n return (\n <AriaCell\n {...props}\n className={[\n \"px-3 py-(--table-row-py)\",\n \"text-(--color-text-primary)\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-(--color-border-focus) focus-visible:outline-offset-[-2px]\",\n ].join(\" \")}\n />\n );\n}\n","import type React from \"react\";\nimport {\n Modal,\n ModalOverlay,\n Dialog as AriaDialog,\n Heading,\n type DialogProps as AriaDialogProps,\n} from \"react-aria-components\";\nimport { X } from \"lucide-react\";\n\nexport interface DialogProps {\n isOpen: boolean;\n onOpenChange: (isOpen: boolean) => void;\n title: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Whether clicking outside the dialog dismisses it. Defaults to true. */\n isDismissable?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nconst sizeStyles = {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n} as const;\n\nexport function Dialog({\n isOpen,\n onOpenChange,\n title,\n size = \"md\",\n isDismissable = true,\n children,\n className,\n}: DialogProps) {\n return (\n <ModalOverlay\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n isDismissable={isDismissable}\n className={[\n \"fixed inset-0 z-50 bg-(--color-overlay-backdrop) backdrop-blur-sm\",\n \"flex items-center justify-center\",\n \"data-[entering]:animate-in data-[entering]:fade-in\",\n \"data-[exiting]:animate-out data-[exiting]:fade-out\",\n ].join(\" \")}\n >\n <Modal\n className={[\n \"w-full mx-4\",\n sizeStyles[size],\n \"bg-(--color-surface-default) rounded-lg shadow-xl max-h-[85vh] flex flex-col\",\n \"data-[entering]:animate-in data-[entering]:zoom-in-95 data-[entering]:fade-in\",\n \"data-[exiting]:animate-out data-[exiting]:zoom-out-95 data-[exiting]:fade-out\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <AriaDialog className=\"outline-none flex flex-col max-h-[85vh]\">\n {({ close }) => (\n <>\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-(--color-border-default)\">\n <Heading\n slot=\"title\"\n className=\"text-lg font-semibold text-(--color-text-primary)\"\n >\n {title}\n </Heading>\n <button\n type=\"button\"\n onClick={close}\n className={[\n \"inline-flex items-center justify-center rounded-sm p-1\",\n \"text-(--color-text-secondary) hover:text-(--color-text-primary) hover:bg-(--color-surface-muted)\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n \"transition-colors\",\n ].join(\" \")}\n aria-label=\"Close\"\n >\n <X size={20} aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"px-6 py-4 overflow-y-auto\">{children}</div>\n </>\n )}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type React from \"react\";\n\nexport interface DialogFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function DialogFooter({ children, className }: DialogFooterProps) {\n return (\n <div\n className={[\n \"pt-4 mt-4 border-t border-(--color-border-default) flex items-center justify-between gap-3\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CheckCircle, XCircle, Info, X } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport type ToastVariant = \"success\" | \"error\" | \"info\";\nexport type ToastPlacement = \"top-center\" | \"top-right\" | \"bottom-center\" | \"bottom-right\";\n\nexport interface ToastData {\n id: string;\n variant: ToastVariant;\n message: string;\n duration?: number;\n}\n\nexport interface ToastContextValue {\n toasts: ToastData[];\n addToast: (toast: Omit<ToastData, \"id\">) => void;\n removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nlet toastCounter = 0;\n\nconst defaultDuration: Record<ToastVariant, number> = {\n success: 5000,\n info: 5000,\n error: 10000,\n};\n\nconst variantConfig: Record<\n ToastVariant,\n { icon: LucideIcon; containerClass: string; iconClass: string }\n> = {\n success: {\n icon: CheckCircle,\n containerClass: \"bg-(--color-surface-success) border-(--color-border-success) text-(--color-text-success)\",\n iconClass: \"text-(--color-action-success)\",\n },\n error: {\n icon: XCircle,\n containerClass: \"bg-(--color-surface-danger) border-(--color-border-danger) text-(--color-text-danger)\",\n iconClass: \"text-(--color-action-danger)\",\n },\n info: {\n icon: Info,\n containerClass: \"bg-(--color-surface-info) border-(--color-border-info) text-(--color-text-info)\",\n iconClass: \"text-(--color-text-info)\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Placement context — passed from ToastContainer to ToastItem\n// ---------------------------------------------------------------------------\n\nconst PlacementContext = createContext<ToastPlacement>(\"bottom-right\");\n\nconst exitAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"-translate-y-full opacity-0\",\n \"top-right\": \"translate-x-full opacity-0\",\n \"bottom-center\": \"translate-y-full opacity-0\",\n \"bottom-right\": \"translate-x-full opacity-0\",\n};\n\nconst enterAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-top\",\n \"top-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n \"bottom-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-bottom\",\n \"bottom-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n};\n\nfunction ToastItem({\n toast,\n onRemove,\n}: {\n toast: ToastData;\n onRemove: (id: string) => void;\n}) {\n const [isExiting, setIsExiting] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const placement = useContext(PlacementContext);\n const config = variantConfig[toast.variant];\n const IconComponent = config.icon;\n\n const dismiss = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => onRemove(toast.id), 200);\n }, [onRemove, toast.id]);\n\n useEffect(() => {\n const duration = toast.duration ?? defaultDuration[toast.variant];\n timerRef.current = setTimeout(dismiss, duration);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [toast.duration, toast.variant, dismiss]);\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={[\n \"flex items-start gap-3 rounded-lg border px-4 py-3 shadow-md\",\n \"min-w-[320px] max-w-[420px]\",\n \"transition-all duration-200\",\n isExiting\n ? exitAnimationByPlacement[placement]\n : enterAnimationByPlacement[placement],\n config.containerClass,\n ].join(\" \")}\n >\n <IconComponent size={20} className={[\"shrink-0 mt-0.5\", config.iconClass].join(\" \")} aria-hidden=\"true\" />\n <p className=\"flex-1 text-sm font-medium\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={dismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <X size={16} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n\nconst containerPositionStyles: Record<ToastPlacement, string> = {\n \"top-center\": \"fixed top-4 left-1/2 -translate-x-1/2 z-50 flex flex-col-reverse gap-2 items-center\",\n \"top-right\": \"fixed top-4 right-4 z-50 flex flex-col-reverse gap-2\",\n \"bottom-center\": \"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 flex flex-col gap-2 items-center\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-50 flex flex-col gap-2\",\n};\n\nfunction ToastContainer({\n toasts,\n removeToast,\n placement = \"bottom-right\",\n}: {\n toasts: ToastData[];\n removeToast: (id: string) => void;\n placement?: ToastPlacement;\n}) {\n if (toasts.length === 0) return null;\n\n return createPortal(\n <PlacementContext.Provider value={placement}>\n <div className={containerPositionStyles[placement]}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n </PlacementContext.Provider>,\n document.body,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Toast Bridge — allows code outside the React tree to emit toasts\n// ---------------------------------------------------------------------------\n\nexport interface ToastBridge {\n /** Call from anywhere (including outside React) to show a toast. */\n emit: (toast: Omit<ToastData, \"id\">) => void;\n /** Used internally by ToastProvider to subscribe to external emits. */\n subscribe: (fn: (toast: Omit<ToastData, \"id\">) => void) => () => void;\n}\n\nexport function createToastBridge(): ToastBridge {\n const listeners = new Set<(toast: Omit<ToastData, \"id\">) => void>();\n return {\n emit: (toast) => {\n listeners.forEach((fn) => fn(toast));\n },\n subscribe: (fn) => {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// ToastProvider\n// ---------------------------------------------------------------------------\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Optional bridge for receiving toasts from outside the React tree. */\n bridge?: ToastBridge;\n /** Where to display toasts on screen. Defaults to \"bottom-right\". */\n placement?: ToastPlacement;\n}\n\nexport function ToastProvider({ children, bridge, placement = \"bottom-right\" }: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n\n const addToast = useCallback((toast: Omit<ToastData, \"id\">) => {\n const id = `toast-${++toastCounter}`;\n setToasts((prev) => [...prev, { ...toast, id }]);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n // Subscribe to external bridge emits\n useEffect(() => {\n if (!bridge) return;\n return bridge.subscribe(addToast);\n }, [bridge, addToast]);\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} placement={placement} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return {\n toast: context.addToast,\n toasts: context.toasts,\n removeToast: context.removeToast,\n };\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { Icon } from \"../Icon\";\n\nexport interface EmptyStateProps {\n icon?: LucideIcon;\n title: string;\n description?: string;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={[\n \"flex flex-col items-center text-center py-12 px-6\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && (\n <Icon icon={icon} size=\"xl\" className=\"text-(--color-text-tertiary)\" />\n )}\n <h3 className=\"text-lg font-semibold text-(--color-text-primary) mt-4\">\n {title}\n </h3>\n {description && (\n <p className=\"text-sm text-(--color-text-secondary) mt-2 max-w-sm\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n","import type React from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from \"react-aria-components\";\nimport { Check } from \"lucide-react\";\n\nexport interface CheckboxProps\n extends Omit<AriaCheckboxProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <AriaCheckbox\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-(--color-text-primary) cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected, isIndeterminate }) => (\n <>\n <div\n className={[\n \"flex items-center justify-center w-6 h-6 shrink-0\",\n \"rounded-sm border transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected || isIndeterminate\n ? \"bg-(--color-action-primary) border-(--color-action-primary)\"\n : \"bg-(--color-surface-default) border-(--color-border-default) group-hover:border-(--color-border-strong)\",\n ].join(\" \")}\n >\n {isSelected && (\n <Check className=\"w-4 h-4 text-(--color-text-inverse)\" strokeWidth={3} />\n )}\n {isIndeterminate && (\n <div className=\"w-3 h-0.5 bg-(--color-text-inverse) rounded-full\" />\n )}\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaCheckbox>\n );\n}\n","import type React from \"react\";\nimport {\n Switch as AriaSwitch,\n type SwitchProps as AriaSwitchProps,\n} from \"react-aria-components\";\n\ntype PresetColor = \"primary\" | \"success\" | \"destructive\";\n\nexport interface SwitchProps\n extends Omit<AriaSwitchProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n /** Preset color name or any valid CSS color string for the track when selected */\n color?: PresetColor | (string & {});\n className?: string;\n}\n\nconst trackColorMap: Record<PresetColor, string> = {\n primary: \"bg-(--color-action-primary)\",\n success: \"bg-(--color-action-success)\",\n destructive: \"bg-(--color-action-danger)\",\n};\n\nconst presetColors = new Set<string>(Object.keys(trackColorMap));\n\nfunction isPresetColor(color: string): color is PresetColor {\n return presetColors.has(color);\n}\n\nexport function Switch({\n children,\n color = \"primary\",\n className,\n ...props\n}: SwitchProps) {\n const isPreset = isPresetColor(color);\n\n return (\n <AriaSwitch\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-(--color-text-primary) cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <>\n <div\n className={[\n \"w-9 h-5 rounded-full transition-colors shrink-0 p-0.5\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected && isPreset\n ? trackColorMap[color]\n : !isSelected\n ? \"bg-(--color-border-strong)\"\n : \"\",\n ].join(\" \")}\n style={\n isSelected && !isPreset\n ? { backgroundColor: color }\n : undefined\n }\n >\n <div\n className={[\n \"w-4 h-4 rounded-full bg-(--color-surface-default) transition-transform shadow-sm\",\n isSelected ? \"translate-x-4\" : \"translate-x-0\",\n ].join(\" \")}\n />\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaSwitch>\n );\n}\n","import type React from \"react\";\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\n\nexport interface RadioGroupProps\n extends Omit<AriaRadioGroupProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioButtonProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function RadioGroup({ children, className, ...props }: RadioGroupProps) {\n return (\n <AriaRadioGroup\n {...props}\n className={[\n \"flex flex-col gap-2\",\n \"disabled:opacity-50\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </AriaRadioGroup>\n );\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-(--color-text-primary) cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <>\n <div\n className={[\n \"flex items-center justify-center w-5 h-5 shrink-0\",\n \"rounded-full border-2 transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected\n ? \"border-(--color-action-primary)\"\n : \"border-(--color-border-default) group-hover:border-(--color-border-strong)\",\n ].join(\" \")}\n >\n {isSelected && (\n <div className=\"w-2.5 h-2.5 rounded-full bg-(--color-action-primary)\" />\n )}\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaRadio>\n );\n}\n\nexport function RadioButton({ children, className, ...props }: RadioButtonProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <div\n className={[\n \"px-4 py-2 text-sm font-medium\",\n \"rounded-md border transition-colors text-center\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected\n ? \"bg-(--color-action-primary) border-(--color-action-primary) text-(--color-text-inverse)\"\n : \"bg-(--color-surface-default) border-(--color-border-default) text-(--color-text-primary) hover:border-(--color-border-strong)\",\n ].join(\" \")}\n >\n {children}\n </div>\n )}\n </AriaRadio>\n );\n}\n","import type React from \"react\";\n\nexport interface FieldsetProps {\n legend?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Fieldset({ legend, children, className }: FieldsetProps) {\n return (\n <fieldset\n className={[\n \"flex flex-col gap-8\",\n \"border-none p-0 m-0\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {legend && (\n <legend\n className={[\n \"text-lg\",\n \"font-semibold\",\n \"text-(--color-text-primary)\",\n \"p-0\",\n ].join(\" \")}\n >\n {legend}\n </legend>\n )}\n {children}\n </fieldset>\n );\n}\n","import React from \"react\";\nimport { InputGroupContext, type GroupPosition } from \"./InputGroupContext\";\n\nexport interface InputGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function InputGroup({ children, className }: InputGroupProps) {\n const childArray = React.Children.toArray(children).filter(\n React.isValidElement,\n );\n\n return (\n <div\n className={[\"flex items-stretch\", className].filter(Boolean).join(\" \")}\n >\n {childArray.map((child, index) => {\n const position: GroupPosition =\n childArray.length === 1\n ? \"standalone\"\n : index === 0\n ? \"start\"\n : index === childArray.length - 1\n ? \"end\"\n : \"middle\";\n\n return (\n <InputGroupContext.Provider\n key={index}\n value={{ inGroup: true, position }}\n >\n {child}\n </InputGroupContext.Provider>\n );\n })}\n </div>\n );\n}\n","import type React from \"react\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\n\nexport interface InputAddonProps {\n children: React.ReactNode;\n className?: string;\n}\n\nfunction groupRadiusClass(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-(--border-radius-md) rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-(--border-radius-md) rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function InputAddon({ children, className }: InputAddonProps) {\n const { inGroup, position } = useInputGroup();\n\n const radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-md\";\n\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n return (\n <div\n className={[\n \"flex items-center self-stretch shrink-0 select-none\",\n \"px-3 py-2 text-base\",\n \"bg-(--color-surface-subtle)\",\n \"text-(--color-text-secondary)\",\n \"border border-(--color-border-default)\",\n radiusClass,\n marginClass,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\nexport type HeadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\nexport type HeadingWeight = \"semibold\" | \"bold\";\n\nexport interface HeadingProps {\n /** HTML heading element to render */\n as?: HeadingLevel;\n /** Visual size (defaults to match the `as` level) */\n size?: HeadingSize;\n /** Font weight (defaults to \"semibold\") */\n weight?: HeadingWeight;\n children: React.ReactNode;\n className?: string;\n}\n\nconst defaultSizeMap: Record<HeadingLevel, HeadingSize> = {\n h1: \"2xl\",\n h2: \"xl\",\n h3: \"lg\",\n h4: \"md\",\n h5: \"sm\",\n h6: \"xs\",\n};\n\nconst sizeStyles: Record<HeadingSize, string> = {\n xs: \"text-sm\",\n sm: \"text-base\",\n md: \"text-lg\",\n lg: \"text-xl\",\n xl: \"text-2xl\",\n \"2xl\": \"text-3xl\",\n \"3xl\": \"text-4xl\",\n};\n\nconst weightStyles: Record<HeadingWeight, string> = {\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n};\n\nexport function Heading({\n as: Tag = \"h2\",\n size,\n weight = \"semibold\",\n className,\n children,\n}: HeadingProps) {\n const resolvedSize = size ?? defaultSizeMap[Tag];\n\n return (\n <Tag\n className={twMerge(\n weightStyles[weight],\n \"text-(--color-text-primary)\",\n sizeStyles[resolvedSize],\n className,\n )}\n >\n {children}\n </Tag>\n );\n}\n\n/** Convenience: renders `<h1>` at 2xl size with bold weight */\nexport function H1(props: Omit<HeadingProps, \"as\">) {\n return (\n <Heading\n {...props}\n as=\"h1\"\n size={props.size ?? \"2xl\"}\n weight={props.weight ?? \"bold\"}\n />\n );\n}\n\n/** Convenience: renders `<h2>` at xl size */\nexport function H2(props: Omit<HeadingProps, \"as\">) {\n return <Heading {...props} as=\"h2\" size={props.size ?? \"xl\"} />;\n}\n\n/** Convenience: renders `<h3>` at lg size */\nexport function H3(props: Omit<HeadingProps, \"as\">) {\n return <Heading {...props} as=\"h3\" size={props.size ?? \"lg\"} />;\n}\n","import {\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\n\nexport type LinkVariant = \"default\" | \"subtle\";\n\nexport interface LinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Visual style variant */\n variant?: LinkVariant;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst variantStyles: Record<LinkVariant, string> = {\n default: [\n \"text-teal-700 underline\",\n \"hover:text-teal-800\",\n ].join(\" \"),\n subtle: [\n \"text-(--color-text-secondary) no-underline\",\n \"hover:underline hover:text-(--color-text-primary)\",\n ].join(\" \"),\n};\n\nexport function Link({\n variant = \"default\",\n className,\n ...props\n}: LinkProps) {\n return (\n <AriaLink\n {...props}\n className={[\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 focus-visible:rounded-sm\",\n variantStyles[variant],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import {\n Breadcrumbs as AriaBreadcrumbs,\n Breadcrumb as AriaBreadcrumb,\n Link,\n} from \"react-aria-components\";\nimport { ChevronRight } from \"lucide-react\";\n\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumbs({ items, className }: BreadcrumbsProps) {\n return (\n <nav\n aria-label=\"Breadcrumb\"\n className={className}\n >\n <AriaBreadcrumbs\n className=\"flex items-center gap-1 text-sm min-w-0\"\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <AriaBreadcrumb\n key={item.id}\n id={item.id}\n className={[\n \"flex items-center gap-1\",\n isLast ? \"min-w-0\" : \"shrink-0\",\n ].join(\" \")}\n >\n {isLast ? (\n <span className=\"font-medium text-(--color-text-primary) truncate\">\n {item.label}\n </span>\n ) : (\n <>\n <Link\n href={item.href}\n className=\"whitespace-nowrap text-(--color-text-secondary) outline-none transition-colors hover:text-(--color-text-primary) focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 focus-visible:rounded-sm\"\n >\n {item.label}\n </Link>\n <ChevronRight\n className=\"shrink-0 text-neutral-400\"\n size={16}\n aria-hidden=\"true\"\n />\n </>\n )}\n </AriaBreadcrumb>\n );\n })}\n </AriaBreadcrumbs>\n </nav>\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type Size,\n type ButtonVariant,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport type { ButtonVariant };\nexport type ButtonSize = Size;\n\nexport interface ButtonLinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: ButtonSize;\n /** Lucide icon rendered before children */\n iconLeft?: LucideIcon;\n /** Lucide icon rendered after children */\n iconRight?: LucideIcon;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst iconSizeMap = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"sm\",\n lg: \"md\",\n} as const;\n\nexport function ButtonLink({\n variant = \"primary\",\n size = \"md\",\n iconLeft,\n iconRight,\n className,\n children,\n ...props\n}: ButtonLinkProps) {\n return (\n <AriaLink\n {...props}\n className={twMerge(\n \"inline-flex items-center justify-center gap-2 cursor-pointer\",\n \"rounded-md\",\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n >\n {iconLeft && <Icon icon={iconLeft} size={iconSizeMap[size]} />}\n {children as React.ReactNode}\n {iconRight && <Icon icon={iconRight} size={iconSizeMap[size]} />}\n </AriaLink>\n );\n}\n\n// --- IconButtonLink ---\n\nexport interface IconButtonLinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Lucide icon to render */\n icon: LucideIcon;\n /** Required for accessibility — also used as tooltip content */\n \"aria-label\": string;\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show tooltip on hover (default true) */\n showTooltip?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles = {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n} as const;\n\nexport function IconButtonLink({\n icon,\n \"aria-label\": ariaLabel,\n variant = \"ghost\",\n size = \"md\",\n showTooltip = true,\n className,\n ...props\n}: IconButtonLinkProps) {\n const link = (\n <AriaLink\n {...props}\n aria-label={ariaLabel}\n className={twMerge(\n \"inline-flex items-center justify-center cursor-pointer\",\n \"rounded-md\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n variantStyles[variant],\n squareSizeStyles[size],\n className,\n )}\n >\n <Icon icon={icon} size={iconSizeMap[size]} />\n </AriaLink>\n );\n\n if (showTooltip) {\n return (\n <Tooltip content={ariaLabel}>{link}</Tooltip>\n );\n }\n\n return link;\n}\n","import {\n ToggleButton as AriaToggleButton,\n type ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type Size, sizeStyles } from \"../_shared/styles\";\n\nexport type ToggleButtonVariant = \"default\" | \"primary\" | \"outlined\";\nexport type ToggleButtonSize = Size;\n\nexport interface ToggleButtonProps\n extends Omit<AriaToggleButtonProps, \"className\"> {\n /** Visual style variant */\n variant?: ToggleButtonVariant;\n /** Size preset */\n size?: ToggleButtonSize;\n /** Use fixed square dimensions instead of padding-based sizing */\n isSquare?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles: Record<ToggleButtonSize, string> = {\n xs: \"h-6 w-6 text-xs\",\n sm: \"h-7 w-7 text-sm\",\n md: \"h-8 w-8 text-base\",\n lg: \"h-10 w-10 text-lg\",\n};\n\nconst variantStyles: Record<ToggleButtonVariant, { base: string; selected: string }> = {\n default: {\n base: [\n \"bg-transparent text-(--color-text-primary)\",\n \"hover:bg-(--color-surface-hover)\",\n \"pressed:bg-(--color-surface-pressed)\",\n ].join(\" \"),\n selected: \"bg-(--color-surface-pressed) text-(--color-text-primary)\",\n },\n primary: {\n base: [\n \"bg-transparent text-(--color-text-primary)\",\n \"hover:bg-(--color-surface-hover)\",\n \"pressed:bg-(--color-surface-pressed)\",\n ].join(\" \"),\n selected: \"bg-(--color-action-primary-active) text-(--color-text-inverse)\",\n },\n outlined: {\n base: [\n \"bg-(--color-surface-default) text-(--color-text-primary)\",\n \"border border-(--color-border-default)\",\n \"hover:bg-(--color-surface-subtle)\",\n \"pressed:bg-(--color-surface-muted)\",\n ].join(\" \"),\n selected: [\n \"bg-neutral-800 text-(--color-text-inverse)\",\n \"border border-neutral-800\",\n ].join(\" \"),\n },\n};\n\nexport function ToggleButton({\n variant = \"default\",\n size = \"md\",\n isSquare = false,\n className,\n ...props\n}: ToggleButtonProps) {\n const styles = variantStyles[variant];\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected }) =>\n twMerge(\n \"inline-flex items-center justify-center gap-2 cursor-pointer\",\n isSquare ? \"rounded-none\" : \"rounded-md\",\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isSquare ? squareSizeStyles[size] : sizeStyles[size],\n isSelected ? styles.selected : styles.base,\n className,\n )\n }\n />\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToggleButtonGroupSize = \"sm\" | \"md\" | \"lg\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface ToggleButtonGroupContextValue {\n size: ToggleButtonGroupSize;\n}\n\nconst ToggleButtonGroupContext = createContext<ToggleButtonGroupContextValue>({\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Size maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<ToggleButtonGroupSize, string> = {\n sm: \"px-2.5 py-1 text-xs gap-1\",\n md: \"px-3 py-1.5 text-sm gap-1.5\",\n lg: \"px-4 py-2 text-base gap-2\",\n};\n\nconst iconOnlySizeStyles: Record<ToggleButtonGroupSize, string> = {\n sm: \"p-1\",\n md: \"p-1.5\",\n lg: \"p-2\",\n};\n\n// ---------------------------------------------------------------------------\n// ToggleButtonGroup\n// ---------------------------------------------------------------------------\n\nexport interface ToggleButtonGroupProps\n extends Omit<AriaRadioGroupProps, \"className\" | \"children\" | \"orientation\"> {\n /** Size preset for all items */\n size?: ToggleButtonGroupSize;\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function ToggleButtonGroup({\n size = \"md\",\n className,\n children,\n ...props\n}: ToggleButtonGroupProps) {\n return (\n <ToggleButtonGroupContext.Provider value={{ size }}>\n <AriaRadioGroup\n {...props}\n orientation=\"horizontal\"\n className={twMerge(\n \"inline-flex items-center rounded-lg border border-(--color-border-default) bg-(--color-surface-muted) p-0.5 gap-0.5\",\n className,\n )}\n >\n {children}\n </AriaRadioGroup>\n </ToggleButtonGroupContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ToggleButtonGroupItem\n// ---------------------------------------------------------------------------\n\nexport interface ToggleButtonGroupItemProps\n extends Omit<AriaRadioProps, \"className\" | \"children\"> {\n /** Label content — text or icon */\n children: ReactNode;\n /** When true, applies square icon-only sizing */\n isIconOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function ToggleButtonGroupItem({\n children,\n isIconOnly,\n className,\n ...props\n}: ToggleButtonGroupItemProps) {\n const { size } = useContext(ToggleButtonGroupContext);\n\n return (\n <AriaRadio\n {...props}\n className={({ isSelected, isHovered, isPressed, isDisabled }) =>\n twMerge(\n // Base layout\n \"inline-flex items-center justify-center\",\n \"rounded-md\",\n \"font-medium\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-1\",\n\n // Disabled\n isDisabled && \"opacity-50 pointer-events-none\",\n\n // Size\n isIconOnly ? iconOnlySizeStyles[size] : sizeStyles[size],\n\n // Selected state\n isSelected\n ? \"bg-(--color-surface-default) text-(--color-text-primary) shadow-sm font-semibold\"\n : isPressed\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : isHovered\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : \"bg-transparent text-(--color-text-secondary)\",\n\n className,\n )\n }\n >\n {children}\n </AriaRadio>\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { Selection } from \"react-aria-components\";\nimport {\n MenuTrigger,\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n Popover,\n} from \"react-aria-components\";\nimport { Icon } from \"../Icon\";\n\nexport interface MenuItemData {\n id: string;\n label: string;\n icon?: LucideIcon;\n onAction?: () => void;\n /** When set, renders the menu item as a navigational link */\n href?: string;\n /** Link target, e.g. \"_blank\" for external links */\n target?: string;\n isDisabled?: boolean;\n isDanger?: boolean;\n /** Optional end content rendered after the label (e.g. badge, shortcut hint) */\n endContent?: React.ReactNode;\n}\n\nexport interface MenuProps {\n /** Items for simple flat menus (backward compat). Mutually exclusive with content. */\n items?: MenuItemData[];\n /** Menu content for composition mode — MenuSection, MenuItem, MenuSeparator */\n content?: React.ReactNode;\n /** Trigger element (typically a Button or IconButton) */\n children: React.ReactNode;\n /** Called when any MenuItem is activated (receives the item key) */\n onAction?: (key: string) => void;\n /** Selection mode: \"none\" (default), \"single\", or \"multiple\" for checkbox-style items */\n selectionMode?: \"none\" | \"single\" | \"multiple\";\n /** Currently selected keys (controlled) */\n selectedKeys?: Selection;\n /** Default selected keys (uncontrolled) */\n defaultSelectedKeys?: Selection;\n /** Called when selection changes */\n onSelectionChange?: (keys: Selection) => void;\n /** Additional CSS classes for the menu popover */\n className?: string;\n}\n\nconst popoverStyles = [\n \"bg-(--color-surface-default) rounded-md\",\n \"shadow-lg border border-(--color-border-default)\",\n \"py-1 min-w-48\",\n \"entering:animate-in entering:fade-in entering:zoom-in-95\",\n \"exiting:animate-out exiting:fade-out exiting:zoom-out-95\",\n].join(\" \");\n\nexport function Menu({\n items,\n content,\n children,\n onAction,\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n className,\n}: MenuProps) {\n const selectionProps = selectionMode && selectionMode !== \"none\"\n ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange }\n : {};\n\n return (\n <MenuTrigger>\n {children}\n <Popover\n className={[popoverStyles, className].filter(Boolean).join(\" \")}\n >\n {items ? (\n <AriaMenu\n items={items}\n onAction={(key) => {\n const item = items.find((i) => i.id === key);\n item?.onAction?.();\n onAction?.(key as string);\n }}\n {...selectionProps}\n className=\"outline-none\"\n >\n {(item) => (\n <AriaMenuItem\n id={item.id}\n href={item.href}\n target={item.target}\n isDisabled={item.isDisabled}\n className={[\n \"flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default\",\n \"transition-colors\",\n \"focus:bg-(--color-surface-muted)\",\n \"hover:bg-(--color-surface-muted)\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n item.isDanger\n ? \"text-(--color-text-danger)\"\n : \"text-(--color-text-primary)\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.icon && <Icon icon={item.icon} size=\"sm\" />}\n <span className=\"flex-1\">{item.label}</span>\n {item.endContent && (\n <span className=\"ml-auto flex items-center\">\n {item.endContent}\n </span>\n )}\n </AriaMenuItem>\n )}\n </AriaMenu>\n ) : (\n <AriaMenu\n onAction={(key) => onAction?.(key as string)}\n {...selectionProps}\n className=\"outline-none\"\n >\n {content}\n </AriaMenu>\n )}\n </Popover>\n </MenuTrigger>\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { MenuItem as AriaMenuItem } from \"react-aria-components\";\nimport { Icon } from \"../Icon\";\n\nexport interface MenuItemProps {\n id: string;\n /** Item label */\n children: React.ReactNode;\n icon?: LucideIcon;\n /** End-slot content: badges, shortcuts, chevrons */\n endContent?: React.ReactNode;\n onAction?: () => void;\n href?: string;\n target?: string;\n isDisabled?: boolean;\n isDanger?: boolean;\n /** Accessible text override for complex children */\n textValue?: string;\n className?: string;\n}\n\nexport function MenuItem({\n id,\n children,\n icon,\n endContent,\n onAction,\n href,\n target,\n isDisabled,\n isDanger,\n textValue,\n className,\n}: MenuItemProps) {\n return (\n <AriaMenuItem\n id={id}\n href={href}\n target={target}\n isDisabled={isDisabled}\n onAction={onAction}\n textValue={textValue}\n className={[\n \"flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default\",\n \"transition-colors\",\n \"focus:bg-(--color-surface-muted)\",\n \"hover:bg-(--color-surface-muted)\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isDanger\n ? \"text-(--color-text-danger)\"\n : \"text-(--color-text-primary)\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && <Icon icon={icon} size=\"sm\" />}\n <span className=\"flex-1\">{children}</span>\n {endContent && (\n <span className=\"ml-auto flex items-center\">{endContent}</span>\n )}\n </AriaMenuItem>\n );\n}\n","import type React from \"react\";\nimport { MenuItem as AriaMenuItem } from \"react-aria-components\";\nimport { Check } from \"lucide-react\";\n\nexport interface MenuCheckboxItemProps {\n id: string;\n /** Item label */\n children: React.ReactNode;\n /** Accessible text override for complex children */\n textValue?: string;\n isDisabled?: boolean;\n className?: string;\n}\n\nexport function MenuCheckboxItem({\n id,\n children,\n textValue,\n isDisabled,\n className,\n}: MenuCheckboxItemProps) {\n return (\n <AriaMenuItem\n id={id}\n textValue={textValue}\n isDisabled={isDisabled}\n className={({ isSelected }) =>\n [\n \"flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default\",\n \"transition-colors\",\n \"focus:bg-(--color-surface-muted)\",\n \"hover:bg-(--color-surface-muted)\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"text-(--color-text-primary)\",\n isSelected ? \"font-medium\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")\n }\n >\n {({ isSelected }) => (\n <>\n <span className=\"flex items-center justify-center w-4 h-4 shrink-0\">\n {isSelected && (\n <Check size={14} className=\"text-(--color-action-primary)\" aria-hidden=\"true\" />\n )}\n </span>\n <span className=\"flex-1\">{children}</span>\n </>\n )}\n </AriaMenuItem>\n );\n}\n","import type React from \"react\";\nimport {\n MenuSection as AriaMenuSection,\n Header,\n} from \"react-aria-components\";\n\nexport interface MenuSectionProps {\n /** Optional section header — string renders as styled text, ReactNode for custom */\n header?: React.ReactNode;\n /** MenuItems within this section */\n children: React.ReactNode;\n /** Accessible label for the section group (useful when header is absent or non-textual) */\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function MenuSection({\n header,\n children,\n \"aria-label\": ariaLabel,\n className,\n}: MenuSectionProps) {\n return (\n <AriaMenuSection className={className} aria-label={ariaLabel}>\n {header && (\n <Header\n className={[\n \"px-3 py-1.5\",\n \"text-xs font-semibold\",\n \"text-(--color-text-secondary)\",\n \"uppercase tracking-wider\",\n \"select-none\",\n ].join(\" \")}\n >\n {header}\n </Header>\n )}\n {children}\n </AriaMenuSection>\n );\n}\n","import type React from \"react\";\nimport { Header } from \"react-aria-components\";\n\nexport interface MenuHeaderProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function MenuHeader({ children, className }: MenuHeaderProps) {\n return <Header className={className}>{children}</Header>;\n}\n","import { Separator } from \"react-aria-components\";\n\nexport interface MenuSeparatorProps {\n className?: string;\n}\n\nexport function MenuSeparator({ className }: MenuSeparatorProps) {\n return (\n <Separator\n className={[\n \"border-t border-(--color-border-default) my-1\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import type React from \"react\";\nimport {\n DialogTrigger,\n Popover as AriaPopover,\n Button as AriaButton,\n type PopoverProps as AriaPopoverProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface PopoverProps {\n /** Controls open state (uncontrolled by default via DialogTrigger) */\n isOpen?: boolean;\n /** Called when open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n children: React.ReactNode;\n}\n\n/** Provides open/close state to a paired PopoverTrigger and PopoverContent. */\nexport function Popover({ children, isOpen, onOpenChange }: PopoverProps) {\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </DialogTrigger>\n );\n}\n\nexport interface PopoverTriggerProps {\n children: React.ReactNode;\n /** Additional CSS classes for the trigger wrapper */\n className?: string;\n}\n\n/** Wraps its child in an AriaButton so it can toggle the parent Popover. */\nexport function PopoverTrigger({ children, className }: PopoverTriggerProps) {\n const cx = `\n inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer\n focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:rounded-sm\n `;\n\n return <AriaButton className={twMerge(cx, className)}>{children}</AriaButton>;\n}\n\nexport interface PopoverContentProps {\n placement?: AriaPopoverProps[\"placement\"];\n offset?: number;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Floating panel anchored to the trigger. Provides focus trap,\n * Escape-to-close, focus restore, and outside-click dismiss via RAC's\n * Popover (no Dialog wrapper needed for those behaviors).\n */\nexport function PopoverContent({\n placement = \"bottom\",\n offset: offsetPx = 8,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n const cx = `\n z-50\n bg-(--color-surface-default)\n border border-(--color-border-default)\n rounded-md shadow-lg\n entering:animate-in entering:fade-in entering:duration-300\n exiting:animate-out exiting:fade-out exiting:duration-300\n entering:placement-top:slide-in-from-bottom-1\n entering:placement-bottom:slide-in-from-top-1\n entering:placement-left:slide-in-from-right-1\n entering:placement-right:slide-in-from-left-1\n `;\n return (\n <AriaPopover\n {...rest}\n placement={placement}\n offset={offsetPx}\n className={twMerge(cx, className)}\n >\n {children}\n </AriaPopover>\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n type TabsProps as AriaTabsProps,\n type TabListProps as AriaTabListProps,\n type TabProps as AriaTabProps,\n type TabPanelProps as AriaTabPanelProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type TabsVariant = \"underline\" | \"pills\" | \"unstyled\";\nexport type TabsSize = \"sm\" | \"md\" | \"lg\";\n\ninterface TabsContextValue {\n variant: TabsVariant;\n size: TabsSize;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: \"underline\",\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Style maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<TabsSize, string> = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\n// ---------------------------------------------------------------------------\n// Tabs (root)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps\n extends Omit<AriaTabsProps, \"className\" | \"orientation\"> {\n /** Visual style variant */\n variant?: TabsVariant;\n /** Size preset */\n size?: TabsSize;\n /** Layout orientation */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function Tabs({\n variant = \"underline\",\n size = \"md\",\n orientation = \"horizontal\",\n className,\n children,\n ...props\n}: TabsProps) {\n return (\n <TabsContext.Provider value={{ variant, size }}>\n <AriaTabs\n {...props}\n orientation={orientation}\n className={twMerge(\n orientation === \"vertical\" ? \"flex\" : \"\",\n className,\n )}\n >\n {children}\n </AriaTabs>\n </TabsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabList\n// ---------------------------------------------------------------------------\n\nexport interface TabListProps<T extends object>\n extends Omit<AriaTabListProps<T>, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabList<T extends object>({\n className,\n ...props\n}: TabListProps<T>) {\n const { variant } = useContext(TabsContext);\n\n const baseStyles =\n variant === \"unstyled\"\n ? \"flex items-center\"\n : variant === \"underline\"\n ? \"flex items-center border-b border-(--color-border-default)\"\n : \"inline-flex items-center bg-(--color-surface-muted) rounded-lg p-1 gap-1\";\n\n // Vertical orientation overrides\n const verticalStyles =\n variant === \"unstyled\"\n ? \"flex-col\"\n : variant === \"underline\"\n ? \"flex-col border-b-0 border-r border-(--color-border-default)\"\n : \"flex-col\";\n\n return (\n <AriaTabList\n {...props}\n className={({ orientation }) =>\n twMerge(\n baseStyles,\n orientation === \"vertical\" ? verticalStyles : \"\",\n className,\n )\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tab\n// ---------------------------------------------------------------------------\n\nexport interface TabProps extends Omit<AriaTabProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function Tab({ className, ...props }: TabProps) {\n const { variant, size } = useContext(TabsContext);\n\n return (\n <AriaTab\n {...props}\n className={({ isSelected, isDisabled, isHovered, isPressed }) => {\n if (variant === \"unstyled\") {\n return twMerge(\n \"cursor-pointer outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n className,\n );\n }\n\n return twMerge(\n // Base\n \"cursor-pointer outline-none transition-colors\",\n \"font-medium\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n\n // Disabled\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n\n // Size\n sizeStyles[size],\n\n // Variant-specific styles\n ...getTabVariantStyles(variant, {\n isSelected,\n isHovered,\n isPressed,\n isDisabled,\n }),\n\n className,\n );\n }}\n />\n );\n}\n\nfunction getTabVariantStyles(\n variant: TabsVariant,\n state: {\n isSelected: boolean;\n isHovered: boolean;\n isPressed: boolean;\n isDisabled: boolean;\n },\n): string[] {\n if (variant === \"underline\") {\n return [\n // Shape\n \"relative rounded-t-(--border-radius-sm)\",\n\n // Color states\n state.isSelected\n ? [\n \"text-teal-700 font-semibold\",\n // Bottom indicator via pseudo-element\n \"after:absolute after:bottom-[-1px] after:left-0 after:right-0 after:h-0.5 after:bg-teal-600\",\n ].join(\" \")\n : state.isPressed\n ? \"text-(--color-text-primary) bg-(--color-surface-muted)\"\n : state.isHovered\n ? \"text-(--color-text-primary) bg-(--color-surface-subtle)\"\n : \"text-(--color-text-secondary) bg-transparent\",\n ];\n }\n\n // Pills variant\n return [\n // Shape\n \"rounded-md\",\n\n // Color states\n state.isSelected\n ? \"text-(--color-text-primary) font-semibold bg-(--color-surface-default) shadow-sm\"\n : state.isPressed\n ? \"text-(--color-text-primary) bg-(--color-surface-subtle) shadow-none\"\n : state.isHovered\n ? \"text-(--color-text-primary) bg-(--color-surface-pressed)\"\n : \"text-(--color-text-secondary) bg-transparent\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// TabPanel\n// ---------------------------------------------------------------------------\n\nexport interface TabPanelProps extends Omit<AriaTabPanelProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabPanel({ className, ...props }: TabPanelProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <AriaTabPanel\n {...props}\n className={twMerge(\n variant === \"unstyled\" ? \"outline-none\" : \"mt-4 outline-none\",\n className,\n )}\n />\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n ToggleButtonGroup as AriaToggleButtonGroup,\n ToggleButton as AriaToggleButton,\n type ToggleButtonGroupProps as AriaToggleButtonGroupProps,\n type ToggleButtonProps as AriaToggleButtonProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type SegmentedControlSize = \"sm\" | \"md\" | \"lg\";\nexport type SegmentedControlSelectionMode = \"single\" | \"none\";\n\ninterface SegmentedControlContextValue {\n size: SegmentedControlSize;\n}\n\nconst SegmentedControlContext = createContext<SegmentedControlContextValue>({\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Size maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<SegmentedControlSize, string> = {\n sm: \"px-2.5 py-1 text-xs\",\n md: \"px-3 py-1.5 text-sm\",\n lg: \"px-4 py-2 text-base\",\n};\n\n// ---------------------------------------------------------------------------\n// SegmentedControl (group)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlProps\n extends Omit<\n AriaToggleButtonGroupProps,\n \"className\" | \"selectionMode\" | \"selectedKeys\" | \"defaultSelectedKeys\" | \"onSelectionChange\"\n > {\n /** Size preset for all items */\n size?: SegmentedControlSize;\n /** Selection behavior: \"single\" keeps one item selected, \"none\" means buttons fire actions without staying selected */\n selectionMode?: SegmentedControlSelectionMode;\n /** The currently selected keys (controlled, only for selectionMode=\"single\") */\n selectedKeys?: Iterable<Key>;\n /** The initial selected keys (uncontrolled, only for selectionMode=\"single\") */\n defaultSelectedKeys?: Iterable<Key>;\n /** Called when selection changes (only for selectionMode=\"single\") */\n onSelectionChange?: (keys: Set<Key>) => void;\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function SegmentedControl({\n size = \"md\",\n selectionMode = \"single\",\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n className,\n children,\n ...props\n}: SegmentedControlProps) {\n // For \"none\" mode: pass selectionMode=\"single\" to RAC but force selection to empty\n const isNoneMode = selectionMode === \"none\";\n\n return (\n <SegmentedControlContext.Provider value={{ size }}>\n <AriaToggleButtonGroup\n {...props}\n selectionMode=\"single\"\n selectedKeys={isNoneMode ? new Set<Key>() : selectedKeys}\n defaultSelectedKeys={isNoneMode ? undefined : defaultSelectedKeys}\n onSelectionChange={isNoneMode ? undefined : onSelectionChange}\n className={twMerge(\n \"inline-flex items-center rounded-lg border border-(--color-border-default) bg-(--color-surface-muted) p-0.5 gap-0.5\",\n className,\n )}\n >\n {children}\n </AriaToggleButtonGroup>\n </SegmentedControlContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedControlItem (button)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlItemProps\n extends Omit<AriaToggleButtonProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function SegmentedControlItem({\n className,\n ...props\n}: SegmentedControlItemProps) {\n const { size } = useContext(SegmentedControlContext);\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected, isHovered, isPressed, isDisabled }) =>\n twMerge(\n // Base layout\n \"inline-flex items-center justify-center\",\n \"rounded-md\",\n \"font-medium\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-1\",\n\n // Disabled\n isDisabled && \"opacity-50 pointer-events-none\",\n\n // Size\n sizeStyles[size],\n\n // Selected state\n isSelected\n ? \"bg-(--color-surface-default) text-(--color-text-primary) shadow-sm font-semibold\"\n : isPressed\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : isHovered\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : \"bg-transparent text-(--color-text-secondary)\",\n\n className,\n )\n }\n />\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type BadgeVariant =\n | \"neutral\"\n | \"purple\"\n | \"teal\"\n | \"rose\"\n | \"slate\"\n | \"green\"\n | \"amber\";\n\nexport type BadgeSize = \"sm\" | \"md\";\n\nexport interface BadgeProps {\n /** Badge text content */\n children: React.ReactNode;\n /** Color variant */\n variant?: BadgeVariant;\n /** Size preset */\n size?: BadgeSize;\n /** Optional leading icon */\n icon?: LucideIcon;\n /** Merge override */\n className?: string;\n}\n\nconst variantStyles: Record<BadgeVariant, string> = {\n neutral:\n \"bg-(--color-badge-neutral-bg) text-(--color-badge-neutral-text)\",\n purple:\n \"bg-(--color-badge-purple-bg) text-(--color-badge-purple-text)\",\n teal: \"bg-(--color-badge-teal-bg) text-(--color-badge-teal-text)\",\n rose: \"bg-(--color-badge-rose-bg) text-(--color-badge-rose-text)\",\n slate:\n \"bg-(--color-badge-slate-bg) text-(--color-badge-slate-text)\",\n green:\n \"bg-(--color-badge-green-bg) text-(--color-badge-green-text)\",\n amber:\n \"bg-(--color-badge-amber-bg) text-(--color-badge-amber-text)\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n sm: \"px-1.5 py-0.5\",\n md: \"px-2 py-0.5\",\n};\n\nconst iconSizeMap: Record<BadgeSize, number> = {\n sm: 12,\n md: 14,\n};\n\nexport function Badge({\n children,\n variant = \"neutral\",\n size = \"sm\",\n icon: IconComponent,\n className,\n}: BadgeProps) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 rounded-full\",\n \"text-xs font-medium leading-tight\",\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n >\n {IconComponent && (\n <IconComponent size={iconSizeMap[size]} aria-hidden=\"true\" />\n )}\n {children}\n </span>\n );\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface CardProps {\n /** Card body content */\n children: React.ReactNode;\n /** Optional header content */\n header?: React.ReactNode;\n /** Optional footer content (rendered with top border separator) */\n footer?: React.ReactNode;\n /** Body padding preset */\n padding?: CardPadding;\n /** Makes the card a clickable link */\n href?: string;\n /** Handler for click/press interaction (use instead of href for programmatic navigation) */\n onPress?: () => void;\n /** Enables hover elevation even without href */\n interactive?: boolean;\n /** Merge override */\n className?: string;\n}\n\nconst paddingStyles: Record<CardPadding, string> = {\n none: \"p-0\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n};\n\nexport function Card({\n children,\n header,\n footer,\n padding = \"md\",\n href,\n onPress,\n interactive = false,\n className,\n}: CardProps) {\n const isInteractive = interactive || !!href || !!onPress;\n\n const containerClass = twMerge(\n \"bg-(--color-surface-default) border border-(--color-border-default) rounded-lg overflow-hidden shadow-sm\",\n isInteractive && \"transition-all hover:shadow-md hover:border-(--color-border-focus) cursor-pointer\",\n (href || onPress) && \"block focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (onPress && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onPress();\n }\n },\n [onPress],\n );\n\n const content = (\n <>\n {header && (\n <div\n className={twMerge(\n \"border-b border-(--color-border-default)\",\n paddingStyles[padding],\n )}\n >\n {header}\n </div>\n )}\n <div className={paddingStyles[padding]}>{children}</div>\n {footer && (\n <div\n className={twMerge(\n \"border-t border-(--color-border-default)\",\n paddingStyles[padding],\n )}\n >\n {footer}\n </div>\n )}\n </>\n );\n\n if (href) {\n return (\n <a href={href} className={containerClass}>\n {content}\n </a>\n );\n }\n\n if (onPress) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={containerClass}\n onClick={onPress}\n onKeyDown={handleKeyDown}\n >\n {content}\n </div>\n );\n }\n\n return <div className={containerClass}>{content}</div>;\n}\n","import type React from \"react\";\nimport { ArrowUp, ArrowDown, Minus } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type DeltaFormat = \"currency\" | \"percentage\" | \"combined\";\nexport type DeltaMode = \"inline\" | \"pill\";\n\nexport interface DeltaIndicatorProps {\n /** Current period value */\n current: number;\n /** Comparison period value */\n previous: number;\n /** Display format */\n format?: DeltaFormat;\n /** Display mode: inline (no background) or pill (tinted background) */\n mode?: DeltaMode;\n /** Optional prefix label (e.g., \"MoM\", \"YoY\") */\n label?: string;\n /** When true, increase = green, decrease = red (for metrics where higher is better) */\n reverseColor?: boolean;\n /** Renders \"N/A\" in muted text */\n unavailable?: boolean;\n /** Custom unavailable text */\n unavailableText?: string;\n /** Merge override */\n className?: string;\n}\n\ntype Direction = \"increase\" | \"decrease\" | \"flat\";\n\nfunction getDirection(current: number, previous: number): Direction {\n const diff = current - previous;\n if (diff > 0) return \"increase\";\n if (diff < 0) return \"decrease\";\n return \"flat\";\n}\n\nfunction formatCurrency(value: number): string {\n const abs = Math.abs(value);\n const sign = value >= 0 ? \"+\" : \"-\";\n if (abs < 1000) {\n return `${sign}$${abs.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n return `${sign}$${abs.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`;\n}\n\nfunction formatPercentage(current: number, previous: number): string | null {\n if (previous === 0) return null;\n const pct = ((current - previous) / Math.abs(previous)) * 100;\n const sign = pct >= 0 ? \"+\" : \"\";\n return `${sign}${pct.toFixed(1)}%`;\n}\n\nconst directionColors: Record<Direction, string> = {\n increase: \"text-(--color-delta-increase-text)\",\n decrease: \"text-(--color-delta-decrease-text)\",\n flat: \"text-(--color-delta-flat-text)\",\n};\n\nconst reverseDirectionColors: Record<Direction, string> = {\n increase: \"text-(--color-delta-decrease-text)\",\n decrease: \"text-(--color-delta-increase-text)\",\n flat: \"text-(--color-delta-flat-text)\",\n};\n\nconst directionIcons: Record<Direction, React.ComponentType<{ size: number; \"aria-hidden\": boolean }>> = {\n increase: ArrowUp,\n decrease: ArrowDown,\n flat: Minus,\n};\n\nconst directionBgColors: Record<Direction, string> = {\n increase: \"bg-(--color-delta-increase-bg)\",\n decrease: \"bg-(--color-delta-decrease-bg)\",\n flat: \"bg-(--color-delta-flat-bg)\",\n};\n\nexport function DeltaIndicator({\n current,\n previous,\n format = \"combined\",\n mode = \"inline\",\n label,\n reverseColor = false,\n unavailable = false,\n unavailableText = \"N/A\",\n className,\n}: DeltaIndicatorProps) {\n if (unavailable) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n \"text-(--color-text-tertiary)\",\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-(--color-text-secondary) mr-1\">\n {label}\n </span>\n )}\n {unavailableText}\n </span>\n );\n }\n\n const diff = current - previous;\n const direction = getDirection(current, previous);\n const colorStyles = reverseColor\n ? reverseDirectionColors[direction]\n : directionColors[direction];\n const IconComponent = directionIcons[direction];\n\n const isNew = previous === 0 && current > 0;\n\n let valueText: string;\n if (format === \"currency\") {\n valueText = formatCurrency(diff);\n if (isNew) valueText = `${formatCurrency(diff)} (new)`;\n } else if (format === \"percentage\") {\n const pct = formatPercentage(current, previous);\n valueText = pct ?? formatCurrency(diff);\n if (isNew) valueText = \"New\";\n } else {\n // combined\n const pct = formatPercentage(current, previous);\n if (isNew) {\n valueText = `${formatCurrency(diff)} (new)`;\n } else if (pct) {\n valueText = `${formatCurrency(diff)} (${pct})`;\n } else {\n valueText = formatCurrency(diff);\n }\n }\n\n const isPill = mode === \"pill\";\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n colorStyles,\n isPill && [\n \"rounded-full px-2 py-0.5\",\n \"text-xs\",\n directionBgColors[direction],\n ],\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-(--color-text-secondary) mr-1\">\n {label}\n </span>\n )}\n <IconComponent size={14} aria-hidden={true} />\n {valueText}\n </span>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\n\nexport type ProgressBarVariant =\n | \"brand\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\nexport type ProgressBarSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ProgressBarProps {\n /** Percentage value (0-100) */\n value: number;\n /** Label text above the bar */\n label?: string;\n /** Description text (right-aligned, above bar) */\n description?: string;\n /** Fill color variant */\n variant?: ProgressBarVariant;\n /** Bar height */\n size?: ProgressBarSize;\n /** Show percentage text */\n showValue?: boolean;\n /** Merge override */\n className?: string;\n}\n\nconst fillStyles: Record<ProgressBarVariant, string> = {\n brand: \"bg-(--color-progress-fill)\",\n success: \"bg-(--color-progress-fill-success)\",\n warning: \"bg-(--color-progress-fill-warning)\",\n danger: \"bg-(--color-progress-fill-danger)\",\n neutral: \"bg-(--color-text-secondary)\",\n};\n\nconst sizeStyles: Record<ProgressBarSize, string> = {\n sm: \"h-1.5\",\n md: \"h-3\",\n lg: \"h-4\",\n};\n\nexport function ProgressBar({\n value,\n label,\n description,\n variant = \"brand\",\n size = \"md\",\n showValue = true,\n className,\n}: ProgressBarProps) {\n const clampedValue = Math.min(100, Math.max(0, value));\n\n return (\n <div className={twMerge(\"w-full\", className)}>\n {(label || description || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium text-(--color-text-primary)\">\n {label}\n </span>\n <span className=\"text-sm text-(--color-text-secondary)\">\n {description ?? (showValue ? `${clampedValue}%` : null)}\n </span>\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ?? \"Progress\"}\n className={twMerge(\n \"w-full rounded-full bg-(--color-progress-track)\",\n sizeStyles[size],\n )}\n >\n <div\n className={twMerge(\n \"h-full rounded-full transition-all duration-300\",\n fillStyles[variant],\n )}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport {\n Info,\n AlertTriangle,\n AlertCircle,\n CheckCircle2,\n X,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type BannerVariant = \"info\" | \"warning\" | \"danger\" | \"success\";\n\nexport interface BannerProps {\n /** Banner content */\n children: ReactNode;\n /** Visual variant */\n variant?: BannerVariant;\n /** Bold lead text */\n title?: string;\n /** Leading icon (auto-selected per variant if not set) */\n icon?: LucideIcon;\n /** Shows dismiss button */\n dismissible?: boolean;\n /** Dismiss callback */\n onDismiss?: () => void;\n /** Merge override */\n className?: string;\n}\n\nconst variantConfig: Record<\n BannerVariant,\n { icon: LucideIcon; containerClass: string; iconClass: string; role: string }\n> = {\n info: {\n icon: Info,\n containerClass:\n \"bg-(--color-banner-info-bg) border-(--color-banner-info-border) text-(--color-banner-info-text)\",\n iconClass: \"text-(--color-banner-info-icon)\",\n role: \"status\",\n },\n warning: {\n icon: AlertTriangle,\n containerClass:\n \"bg-(--color-banner-warning-bg) border-(--color-banner-warning-border) text-(--color-banner-warning-text)\",\n iconClass: \"text-(--color-banner-warning-icon)\",\n role: \"alert\",\n },\n danger: {\n icon: AlertCircle,\n containerClass:\n \"bg-(--color-banner-danger-bg) border-(--color-banner-danger-border) text-(--color-banner-danger-text)\",\n iconClass: \"text-(--color-banner-danger-icon)\",\n role: \"alert\",\n },\n success: {\n icon: CheckCircle2,\n containerClass:\n \"bg-(--color-banner-success-bg) border-(--color-banner-success-border) text-(--color-banner-success-text)\",\n iconClass: \"text-(--color-banner-success-icon)\",\n role: \"status\",\n },\n};\n\nexport function Banner({\n children,\n variant = \"info\",\n title,\n icon,\n dismissible = false,\n onDismiss,\n className,\n}: BannerProps) {\n const [dismissed, setDismissed] = useState(false);\n\n if (dismissed) return null;\n\n const config = variantConfig[variant];\n const IconComponent = icon ?? config.icon;\n\n const handleDismiss = () => {\n setDismissed(true);\n onDismiss?.();\n };\n\n return (\n <div\n role={config.role}\n className={twMerge(\n \"flex items-start gap-3 rounded-lg border px-4 py-3\",\n \"text-sm\",\n config.containerClass,\n className,\n )}\n >\n <IconComponent\n size={20}\n className={twMerge(\"shrink-0 mt-0.5\", config.iconClass)}\n aria-hidden=\"true\"\n />\n <div className=\"flex-1\">\n {title && (\n <span className=\"font-medium\">\n {title}\n {\" \\u2014 \"}\n </span>\n )}\n {children}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n onClick={handleDismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <X size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type MetricCardSize = \"sm\" | \"md\";\n\nexport interface MetricCardProps {\n /** Metric label (e.g., \"Total Spend\") */\n label: React.ReactNode;\n /** Primary value (formatted string or component) */\n value: React.ReactNode;\n /** Secondary content rendered below the value */\n secondary?: React.ReactNode;\n /** Makes the entire card a clickable link */\n href?: string;\n /** Size preset */\n size?: MetricCardSize;\n /** Merge override */\n className?: string;\n}\n\nconst sizeConfig: Record<\n MetricCardSize,\n { padding: string; labelClass: string; valueClass: string }\n> = {\n sm: {\n padding: \"p-3\",\n labelClass: \"text-xs\",\n valueClass: \"text-xl\",\n },\n md: {\n padding: \"p-4\",\n labelClass: \"text-sm\",\n valueClass: \"text-2xl\",\n },\n};\n\nexport function MetricCard({\n label,\n value,\n secondary,\n href,\n size = \"md\",\n className,\n}: MetricCardProps) {\n const config = sizeConfig[size];\n\n const containerClass = twMerge(\n \"bg-(--color-surface-default) border border-(--color-border-default) rounded-lg shadow-sm\",\n config.padding,\n href &&\n \"block transition-shadow hover:shadow-md hover:border-(--color-border-focus) focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n const content = (\n <>\n <div className={twMerge(config.labelClass, \"text-(--color-text-secondary)\")}>\n {label}\n </div>\n <div\n className={twMerge(\n config.valueClass,\n \"font-semibold text-(--color-text-primary) mt-1 tabular-nums\",\n )}\n >\n {value}\n </div>\n {secondary && <div className=\"mt-1 text-sm\">{secondary}</div>}\n </>\n );\n\n if (href) {\n return (\n <a href={href} className={containerClass}>\n {content}\n </a>\n );\n }\n\n return <div className={containerClass}>{content}</div>;\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { H2 } from \"../Heading\";\n\nexport interface SectionHeaderProps {\n /** Section title rendered as an H2 heading */\n title: string;\n /** Optional action elements (buttons, badges, etc.) rendered on the right */\n children?: React.ReactNode;\n /** Additional CSS classes applied to the outer container */\n className?: string;\n}\n\n/**\n * Section header with a title on the left and optional action slots on the right.\n *\n * Mirrors the `SectionHeader` pattern from cytario-web's `Container.tsx`.\n * The title renders as an `<H2>` heading; any `children` are placed in a\n * flex container that aligns to the trailing edge.\n */\nexport function SectionHeader({\n title,\n children,\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={twMerge(\n \"flex flex-wrap items-center gap-3 py-4\",\n className,\n )}\n >\n <H2>{title}</H2>\n {children && (\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {children}\n </div>\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst hashColors = {\n purple: \"bg-(--color-badge-purple-bg) text-(--color-badge-purple-text) border-(--color-badge-purple-text)/20\",\n teal: \"bg-(--color-badge-teal-bg) text-(--color-badge-teal-text) border-(--color-badge-teal-text)/20\",\n rose: \"bg-(--color-badge-rose-bg) text-(--color-badge-rose-text) border-(--color-badge-rose-text)/20\",\n green: \"bg-(--color-badge-green-bg) text-(--color-badge-green-text) border-(--color-badge-green-text)/20\",\n amber: \"bg-(--color-badge-amber-bg) text-(--color-badge-amber-text) border-(--color-badge-amber-text)/20\",\n} as const;\n\nexport const colorStyles = {\n ...hashColors,\n slate:\n \"bg-(--color-badge-slate-bg) text-(--color-badge-slate-text) border-(--color-badge-slate-text)/20\",\n} as const;\n\nexport type PillColor = keyof typeof colorStyles;\n\nexport interface PillProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\" | \"color\"> {\n children?: string;\n color?: PillColor;\n}\n\nconst hashKeys = Object.keys(hashColors) as (keyof typeof hashColors)[];\n\nexport function pillColorFromName(name = \"\"): PillColor {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hashKeys[Math.abs(hash) % hashKeys.length];\n}\n\n/** Non-interactive hash-colored label badge. Color is derived from the text unless explicitly set. */\nexport function Pill({\n children,\n color = pillColorFromName(children),\n className,\n ...rest\n}: PillProps) {\n const cx = twMerge(\n `\n inline-flex items-center\n rounded-full\n border\n px-2 py-0.5\n text-xs font-medium\n leading-tight\n `,\n colorStyles[color],\n className,\n );\n\n return (\n <span className={cx} {...rest}>\n {children}\n </span>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { Pill, type PillColor, pillColorFromName } from \"./Pill\";\n\nexport interface PathPillProps {\n children: string;\n /** Number of trailing segments to show; earlier ones collapse to dots. Defaults to all. */\n visibleCount?: number;\n /** Override per-segment color. Falls back to hash-based `pillColorFromName`. */\n colorFn?: (segment: string, index: number) => PillColor;\n className?: string;\n}\n\n/** Renders a slash-separated path as overlapping, hash-colored pill segments. */\nexport function PathPill({\n children,\n visibleCount,\n colorFn,\n className,\n}: PathPillProps) {\n const segments = children.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) return null;\n\n const effectiveVisible = visibleCount ?? segments.length;\n const dotCount = Math.max(0, segments.length - effectiveVisible);\n const fullPath = segments.join(\" / \");\n\n return (\n <div\n className={twMerge(\"relative flex\", className)}\n aria-label={`Path: ${fullPath}`}\n >\n {segments.map((segment, i) => {\n const isCollapsed = i < dotCount;\n const isLast = i === segments.length - 1;\n const cx = twMerge(!isLast && \"pr-5 -mr-4\", isCollapsed && \"pr-3\");\n const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);\n return (\n <Pill\n key={`pill-${i}-${segment}`}\n className={cx}\n color={color}\n aria-hidden={isCollapsed || undefined}\n >\n {isCollapsed ? undefined : segment}\n </Pill>\n );\n })}\n </div>\n );\n}\n","import { createContext, useContext, useCallback, useMemo } from \"react\";\nimport type React from \"react\";\n\nexport interface FormWizardContextValue {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Whether the user can navigate backwards */\n canGoBack: boolean;\n /** Navigate to the previous step */\n goBack: () => void;\n /** Whether the current step is the last step */\n isLastStep: boolean;\n}\n\nconst FormWizardContext = createContext<FormWizardContextValue>({\n currentStep: 0,\n totalSteps: 1,\n canGoBack: false,\n goBack: () => {},\n isLastStep: true,\n});\n\nexport function useFormWizard(): FormWizardContextValue {\n return useContext(FormWizardContext);\n}\n\nexport interface FormWizardProps {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Callback invoked when the step should change */\n onStepChange: (step: number) => void;\n /** Wizard content (step panels, progress indicator, navigation) */\n children: React.ReactNode;\n}\n\nexport function FormWizard({\n currentStep,\n totalSteps,\n onStepChange,\n children,\n}: FormWizardProps) {\n const canGoBack = currentStep > 0;\n const isLastStep = currentStep >= totalSteps - 1;\n\n const goBack = useCallback(() => {\n if (currentStep > 0) {\n onStepChange(currentStep - 1);\n }\n }, [currentStep, onStepChange]);\n\n const value = useMemo<FormWizardContextValue>(\n () => ({\n currentStep,\n totalSteps,\n canGoBack,\n goBack,\n isLastStep,\n }),\n [currentStep, totalSteps, canGoBack, goBack, isLastStep],\n );\n\n return (\n <FormWizardContext.Provider value={value}>\n {children}\n </FormWizardContext.Provider>\n );\n}\n","import { useFormWizard } from \"./FormWizard\";\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-(--color-text-inverse)\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 8.5l3.5 3.5 6.5-7\" />\n </svg>\n );\n}\n\nexport interface FormWizardProgressProps {\n /** Labels for each step, displayed below the step circles */\n labels: string[];\n}\n\nexport function FormWizardProgress({ labels }: FormWizardProgressProps) {\n const { currentStep, totalSteps } = useFormWizard();\n\n return (\n <nav aria-label=\"Form progress\">\n <ol className=\"flex items-start\" role=\"list\">\n {labels.map((label, index) => {\n const isCompleted = index < currentStep;\n const isCurrent = index === currentStep;\n const isFuture = index > currentStep;\n\n return (\n <li\n key={label}\n className=\"flex flex-1 flex-col items-center\"\n aria-current={isCurrent ? \"step\" : undefined}\n >\n {/* Row with optional connector lines and the step circle */}\n <div className=\"flex w-full items-center\">\n {/* Left connector line */}\n {index > 0 ? (\n <div\n aria-hidden=\"true\"\n className={[\n \"h-0.5 flex-1\",\n index <= currentStep\n ? \"bg-(--color-brand-primary)\"\n : \"bg-(--color-border-default)\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n\n {/* Step circle */}\n <div\n className={[\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full\",\n \"text-sm font-medium\",\n \"transition-colors\",\n isCompleted\n ? \"bg-(--color-brand-primary) text-(--color-text-inverse)\"\n : \"\",\n isCurrent\n ? \"border-2 border-(--color-brand-primary) bg-(--color-surface-default) text-(--color-brand-primary)\"\n : \"\",\n isFuture\n ? \"border-2 border-(--color-border-default) bg-(--color-surface-default) text-(--color-text-tertiary)\"\n : \"\",\n ].join(\" \")}\n aria-hidden=\"true\"\n >\n {isCompleted ? <CheckIcon /> : index + 1}\n </div>\n\n {/* Right connector line */}\n {index < totalSteps - 1 ? (\n <div\n aria-hidden=\"true\"\n className={[\n \"h-0.5 flex-1\",\n index < currentStep\n ? \"bg-(--color-brand-primary)\"\n : \"bg-(--color-border-default)\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Label */}\n <span\n className={[\n \"mt-2 text-center text-sm\",\n isCurrent\n ? \"font-semibold text-(--color-text-primary)\"\n : \"font-normal text-(--color-text-secondary)\",\n ].join(\" \")}\n >\n {label}\n </span>\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { Button } from \"../Button\";\nimport { useFormWizard } from \"./FormWizard\";\n\nexport interface FormWizardNavProps {\n /** Callback invoked when the user presses Next or Submit */\n onNext: () => void;\n /** Whether the form is currently submitting (shows loading state on the submit button) */\n isSubmitting?: boolean;\n /** Label for the submit button on the last step (defaults to \"Submit\") */\n submitLabel?: string;\n}\n\nexport function FormWizardNav({\n onNext,\n isSubmitting = false,\n submitLabel = \"Submit\",\n}: FormWizardNavProps) {\n const { canGoBack, goBack, isLastStep } = useFormWizard();\n\n return (\n <div className=\"flex items-center justify-end gap-3\">\n {canGoBack && (\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onPress={goBack}\n isDisabled={isSubmitting}\n >\n Back\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"lg\"\n onPress={onNext}\n isLoading={isSubmitting}\n >\n {isLastStep ? submitLabel : \"Next\"}\n </Button>\n </div>\n );\n}\n","/**\n * Do not edit directly, this file was auto-generated.\n */\n\nexport const ColorPurple50 = \"#f5f0fa\";\nexport const ColorPurple100 = \"#ead9f5\";\nexport const ColorPurple200 = \"#d4b3eb\";\nexport const ColorPurple300 = \"#b87ddb\";\nexport const ColorPurple400 = \"#9b4fcb\";\nexport const ColorPurple500 = \"#7a2ea8\";\nexport const ColorPurple600 = \"#6b2695\";\nexport const ColorPurple700 = \"#5c2483\";\nexport const ColorPurple800 = \"#4a1d6a\";\nexport const ColorPurple900 = \"#3a1754\";\nexport const ColorTeal50 = \"#edf9f9\";\nexport const ColorTeal100 = \"#d0f0f0\";\nexport const ColorTeal200 = \"#a1e1e2\";\nexport const ColorTeal300 = \"#6dd0d1\";\nexport const ColorTeal400 = \"#44c4c5\";\nexport const ColorTeal500 = \"#35b7b8\";\nexport const ColorTeal600 = \"#2a9b9c\";\nexport const ColorTeal700 = \"#217d7e\";\nexport const ColorTeal800 = \"#1a6364\";\nexport const ColorTeal900 = \"#144d4e\";\nexport const ColorGreen50 = \"#f0fdf4\";\nexport const ColorGreen100 = \"#dcfce7\";\nexport const ColorGreen200 = \"#bbf7d0\";\nexport const ColorGreen300 = \"#86efac\";\nexport const ColorGreen400 = \"#4ade80\";\nexport const ColorGreen500 = \"#22c55e\";\nexport const ColorGreen600 = \"#16a34a\";\nexport const ColorGreen700 = \"#15803d\";\nexport const ColorGreen800 = \"#166534\";\nexport const ColorGreen900 = \"#14532d\";\nexport const ColorRose50 = \"#fff1f2\";\nexport const ColorRose100 = \"#ffe4e6\";\nexport const ColorRose200 = \"#fecdd3\";\nexport const ColorRose300 = \"#fda4af\";\nexport const ColorRose400 = \"#fb7185\";\nexport const ColorRose500 = \"#f43f5e\";\nexport const ColorRose600 = \"#e11d48\";\nexport const ColorRose700 = \"#be123c\";\nexport const ColorRose800 = \"#9f1239\";\nexport const ColorRose900 = \"#881337\";\nexport const ColorSlate50 = \"#f8fafc\";\nexport const ColorSlate100 = \"#f1f5f9\";\nexport const ColorSlate200 = \"#e2e8f0\";\nexport const ColorSlate300 = \"#cbd5e1\";\nexport const ColorSlate400 = \"#94a3b8\";\nexport const ColorSlate500 = \"#64748b\";\nexport const ColorSlate600 = \"#475569\";\nexport const ColorSlate700 = \"#334155\";\nexport const ColorSlate800 = \"#1e293b\";\nexport const ColorSlate900 = \"#0f172a\";\nexport const ColorAmber50 = \"#fffbeb\";\nexport const ColorAmber100 = \"#fef3c7\";\nexport const ColorAmber200 = \"#fde68a\";\nexport const ColorAmber300 = \"#fcd34d\";\nexport const ColorAmber400 = \"#fbbf24\";\nexport const ColorAmber500 = \"#f59e0b\";\nexport const ColorAmber600 = \"#d97706\";\nexport const ColorAmber700 = \"#b45309\";\nexport const ColorAmber800 = \"#92400e\";\nexport const ColorAmber900 = \"#78350f\";\nexport const ColorNeutral0 = \"#ffffff\";\nexport const ColorNeutral50 = \"#f9fafb\";\nexport const ColorNeutral100 = \"#f3f4f6\";\nexport const ColorNeutral200 = \"#e5e7eb\";\nexport const ColorNeutral300 = \"#d1d5db\";\nexport const ColorNeutral400 = \"#9ca3af\";\nexport const ColorNeutral500 = \"#6b7280\";\nexport const ColorNeutral600 = \"#4b5563\";\nexport const ColorNeutral700 = \"#374151\";\nexport const ColorNeutral800 = \"#1f2937\";\nexport const ColorNeutral900 = \"#111827\";\nexport const ColorNeutral950 = \"#030712\";\nexport const ColorNeutral1000 = \"#000000\";\nexport const ColorBrandPrimary = \"#5c2483\";\nexport const ColorBrandAccent = \"#35b7b8\";\nexport const ColorActionPrimary = \"#5c2483\";\nexport const ColorActionPrimaryHover = \"#6b2695\";\nexport const ColorActionPrimaryActive = \"#4a1d6a\";\nexport const ColorActionSecondary = \"#5c2483\";\nexport const ColorActionSecondaryHover = \"#6b2695\";\nexport const ColorActionDanger = \"#e11d48\";\nexport const ColorActionDangerHover = \"#be123c\";\nexport const ColorActionSuccess = \"#16a34a\";\nexport const ColorActionSuccessHover = \"#15803d\";\nexport const ColorActionInfo = \"#475569\";\nexport const ColorActionInfoHover = \"#334155\";\nexport const ColorActionDefault = \"#1e293b\";\nexport const ColorActionDefaultHover = \"#334155\";\nexport const ColorTextPrimary = \"#111827\";\nexport const ColorTextSecondary = \"#4b5563\";\nexport const ColorTextTertiary = \"#9ca3af\";\nexport const ColorTextInverse = \"#ffffff\";\nexport const ColorTextBrand = \"#5c2483\";\nexport const ColorTextAccent = \"#35b7b8\";\nexport const ColorTextDanger = \"#e11d48\";\nexport const ColorTextSuccess = \"#16a34a\";\nexport const ColorTextInfo = \"#475569\";\nexport const ColorTextWarning = \"#d97706\";\nexport const ColorSurfaceDefault = \"#ffffff\";\nexport const ColorSurfaceSubtle = \"#f9fafb\";\nexport const ColorSurfaceMuted = \"#f3f4f6\";\nexport const ColorSurfaceBrand = \"#5c2483\";\nexport const ColorSurfaceAccent = \"#35b7b8\";\nexport const ColorSurfaceDanger = \"#fff1f2\";\nexport const ColorSurfaceSuccess = \"#f0fdf4\";\nexport const ColorSurfaceWarning = \"#fffbeb\";\nexport const ColorSurfaceInfo = \"#f8fafc\";\nexport const ColorSurfaceOverlay = \"#000000cc\";\nexport const ColorSurfaceHover = \"#f3f4f6\";\nexport const ColorSurfacePressed = \"#e5e7eb\";\nexport const ColorSurfaceSelected = \"#edf9f9\";\nexport const ColorSurfaceSelectedHover = \"#d0f0f0\";\nexport const ColorBorderDefault = \"#e5e7eb\";\nexport const ColorBorderStrong = \"#d1d5db\";\nexport const ColorBorderBrand = \"#5c2483\";\nexport const ColorBorderAccent = \"#35b7b8\";\nexport const ColorBorderFocus = \"#35b7b8\";\nexport const ColorBorderDanger = \"#e11d48\";\nexport const ColorBorderSuccess = \"#16a34a\";\nexport const ColorBorderInfo = \"#94a3b8\";\nexport const ColorBorderWarning = \"#d97706\";\nexport const ColorOverlayBackdrop = \"#00000066\";\nexport const ColorStatusSuccess = \"#22c55e\";\nexport const ColorStatusDanger = \"#f43f5e\";\nexport const ColorStatusWarning = \"#d97706\";\nexport const ColorStatusInfo = \"#64748b\";\nexport const ColorDeltaIncreaseBg = \"#fff1f2\";\nexport const ColorDeltaIncreaseText = \"#be123c\";\nexport const ColorDeltaIncreaseIcon = \"#f43f5e\";\nexport const ColorDeltaDecreaseBg = \"#f0fdf4\";\nexport const ColorDeltaDecreaseText = \"#15803d\";\nexport const ColorDeltaDecreaseIcon = \"#22c55e\";\nexport const ColorDeltaFlatBg = \"#f3f4f6\";\nexport const ColorDeltaFlatText = \"#6b7280\";\nexport const ColorDeltaFlatIcon = \"#9ca3af\";\nexport const ColorProgressTrack = \"#e5e7eb\";\nexport const ColorProgressFill = \"#6b2695\";\nexport const ColorProgressFillSuccess = \"#22c55e\";\nexport const ColorProgressFillWarning = \"#f59e0b\";\nexport const ColorProgressFillDanger = \"#f43f5e\";\nexport const ColorBannerInfoBg = \"#f8fafc\";\nexport const ColorBannerInfoText = \"#334155\";\nexport const ColorBannerInfoBorder = \"#e2e8f0\";\nexport const ColorBannerInfoIcon = \"#64748b\";\nexport const ColorBannerWarningBg = \"#fffbeb\";\nexport const ColorBannerWarningText = \"#92400e\";\nexport const ColorBannerWarningBorder = \"#fde68a\";\nexport const ColorBannerWarningIcon = \"#f59e0b\";\nexport const ColorBannerDangerBg = \"#fff1f2\";\nexport const ColorBannerDangerText = \"#be123c\";\nexport const ColorBannerDangerBorder = \"#fecdd3\";\nexport const ColorBannerDangerIcon = \"#f43f5e\";\nexport const ColorBannerSuccessBg = \"#f0fdf4\";\nexport const ColorBannerSuccessText = \"#15803d\";\nexport const ColorBannerSuccessBorder = \"#bbf7d0\";\nexport const ColorBannerSuccessIcon = \"#22c55e\";\nexport const ColorBadgePurpleBg = \"#ead9f5\";\nexport const ColorBadgePurpleText = \"#5c2483\";\nexport const ColorBadgeTealBg = \"#d0f0f0\";\nexport const ColorBadgeTealText = \"#1a6364\";\nexport const ColorBadgeSlateBg = \"#f1f5f9\";\nexport const ColorBadgeSlateText = \"#334155\";\nexport const ColorBadgeRoseBg = \"#ffe4e6\";\nexport const ColorBadgeRoseText = \"#be123c\";\nexport const ColorBadgeNeutralBg = \"#f3f4f6\";\nexport const ColorBadgeNeutralText = \"#374151\";\nexport const ColorBadgeGreenBg = \"#dcfce7\";\nexport const ColorBadgeGreenText = \"#15803d\";\nexport const ColorBadgeAmberBg = \"#fef3c7\";\nexport const ColorBadgeAmberText = \"#92400e\";\nexport const Spacing1 = \"4px\";\nexport const Spacing2 = \"8px\";\nexport const Spacing3 = \"12px\";\nexport const Spacing4 = \"16px\";\nexport const Spacing6 = \"24px\";\nexport const Spacing8 = \"32px\";\nexport const Spacing12 = \"48px\";\nexport const Spacing16 = \"64px\";\nexport const BorderRadiusNone = \"0px\";\nexport const BorderRadiusSm = \"4px\";\nexport const BorderRadiusMd = \"8px\";\nexport const BorderRadiusLg = \"12px\";\nexport const BorderRadiusXl = \"16px\";\nexport const BorderRadiusFull = \"9999px\";\nexport const FontSizeXs = \"12px\";\nexport const FontSizeSm = \"14px\";\nexport const FontSizeBase = \"16px\";\nexport const FontSizeLg = \"18px\";\nexport const FontSizeXl = \"20px\";\nexport const FontSize2xl = \"24px\";\nexport const FontSize3xl = \"30px\";\nexport const FontSize4xl = \"36px\";\nexport const FontSize5xl = \"48px\";\nexport const FontWeightLight = 300;\nexport const FontWeightRegular = 400;\nexport const FontWeightMedium = 500;\nexport const FontWeightSemibold = 600;\nexport const FontWeightBold = 700;\nexport const FontWeightExtrabold = 800;\nexport const LineHeightTight = 1.25;\nexport const LineHeightNormal = 1.5;\nexport const LineHeightRelaxed = 1.625;\n"],"mappings":"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","names":["jsx","sizeMap","jsx","jsxs","jsx","jsxs","useRef","useRef","useState","useLayoutEffect","useState","startLen","endLen","useLayoutEffect","useState","jsx","jsxs","useRef","AriaButton","jsx","iconSizeMap","groupRadiusClass","AriaButton","twMerge","jsx","jsxs","jsx","jsxs","twMerge","Button","Text","twMerge","jsx","jsxs","twMerge","Button","Text","jsx","jsxs","Fragment","jsx","jsxs","sizeStyles","jsx","createContext","useCallback","useContext","useEffect","useRef","useState","createPortal","X","jsx","jsxs","jsx","jsxs","Check","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsx","groupRadiusClass","twMerge","jsx","sizeStyles","Heading","jsx","variantStyles","Link","Fragment","jsx","jsxs","AriaLink","twMerge","jsx","jsxs","iconSizeMap","AriaLink","twMerge","squareSizeStyles","twMerge","jsx","squareSizeStyles","variantStyles","twMerge","createContext","useContext","twMerge","AriaRadioGroup","AriaRadio","jsx","sizeStyles","Popover","jsx","jsxs","Popover","AriaMenuItem","jsx","jsxs","AriaMenuItem","AriaMenuItem","Check","Fragment","jsx","jsxs","jsx","jsxs","Header","jsx","jsx","AriaButton","twMerge","jsx","Popover","createContext","useContext","twMerge","jsx","sizeStyles","Tabs","TabList","Tab","TabPanel","createContext","useContext","twMerge","AriaToggleButton","jsx","sizeStyles","twMerge","jsx","jsxs","variantStyles","sizeStyles","iconSizeMap","useCallback","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","colorStyles","twMerge","jsx","jsxs","sizeStyles","useState","Info","X","twMerge","jsx","jsxs","variantConfig","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","twMerge","twMerge","jsx","twMerge","jsx","twMerge","createContext","useContext","useCallback","jsx","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Button/Button.tsx","../src/components/_shared/styles.ts","../src/components/Icon/Icon.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Form/InputGroup/InputGroupContext.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/TruncatedText/TruncatedText.tsx","../src/components/TruncatedText/useCopyToClipboard.ts","../src/components/TruncatedText/useMiddleEllipsis.ts","../src/components/TruncatedText/useOverflowDetection.ts","../src/components/IconButton/IconButton.tsx","../src/components/Form/Input/Input.tsx","../src/components/Form/Label/Label.tsx","../src/components/Form/Select/Select.tsx","../src/components/Table/Table.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogFooter.tsx","../src/components/Toast/Toast.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/Switch/Switch.tsx","../src/components/Form/Radio/Radio.tsx","../src/components/Form/Fieldset/Fieldset.tsx","../src/components/Form/InputGroup/InputGroup.tsx","../src/components/Form/InputAddon/InputAddon.tsx","../src/components/Heading/Heading.tsx","../src/components/Link/Link.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/ButtonLink/ButtonLink.tsx","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButtonGroup/ToggleButtonGroup.tsx","../src/components/Menu/Menu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuCheckboxItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuHeader.tsx","../src/components/Menu/MenuSeparator.tsx","../src/components/Popover/Popover.tsx","../src/components/Tabs/Tabs.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/DeltaIndicator/DeltaIndicator.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Banner/Banner.tsx","../src/components/MetricCard/MetricCard.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Pill/Pill.tsx","../src/components/Pill/PathPill.tsx","../src/components/FormWizard/FormWizard.tsx","../src/components/FormWizard/FormWizardProgress.tsx","../src/components/FormWizard/FormWizardNav.tsx","../src/tokens/tokens.ts"],"sourcesContent":["\"use client\";\n\n// React Aria re-exports for consumer integration\nexport { RouterProvider } from \"react-aria-components\";\nexport type { RouterConfig, Key } from \"react-aria-components\";\n\n// Components\nexport { Button } from \"./components/Button\";\nexport type {\n ButtonProps,\n ButtonVariant,\n ButtonSize,\n} from \"./components/Button\";\n\nexport { Spinner } from \"./components/Spinner\";\nexport type { SpinnerProps } from \"./components/Spinner\";\n\nexport { Icon } from \"./components/Icon\";\nexport type { IconProps } from \"./components/Icon\";\n\nexport { Tooltip } from \"./components/Tooltip\";\nexport type { TooltipProps } from \"./components/Tooltip\";\n\nexport { TruncatedText } from \"./components/TruncatedText\";\nexport type { TruncatedTextProps } from \"./components/TruncatedText\";\n\nexport { IconButton } from \"./components/IconButton\";\nexport type { IconButtonProps } from \"./components/IconButton\";\n\nexport { Input } from \"./components/Form/Input\";\nexport type { InputProps } from \"./components/Form/Input\";\n\nexport { Select } from \"./components/Form/Select\";\nexport type { SelectProps, SelectItem } from \"./components/Form/Select\";\n\nexport {\n Table,\n TableHeader,\n Column,\n TableBody,\n Row,\n Cell,\n} from \"./components/Table\";\nexport type { DataTableProps, TableSize } from \"./components/Table\";\n\nexport { Dialog } from \"./components/Dialog\";\nexport type { DialogProps } from \"./components/Dialog\";\n\nexport { ToastProvider, useToast, createToastBridge } from \"./components/Toast\";\nexport type {\n ToastData,\n ToastVariant,\n ToastPlacement,\n ToastContextValue,\n ToastBridge,\n ToastProviderProps,\n} from \"./components/Toast\";\n\nexport { EmptyState } from \"./components/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState\";\n\nexport { Checkbox } from \"./components/Form/Checkbox\";\nexport type { CheckboxProps } from \"./components/Form/Checkbox\";\n\nexport { Switch } from \"./components/Form/Switch\";\nexport type { SwitchProps } from \"./components/Form/Switch\";\n\nexport { RadioGroup, Radio, RadioButton } from \"./components/Form/Radio\";\nexport type {\n RadioGroupProps,\n RadioProps,\n RadioButtonProps,\n} from \"./components/Form/Radio\";\n\nexport { Label } from \"./components/Form/Label\";\nexport type { LabelProps } from \"./components/Form/Label\";\n\nexport { Fieldset } from \"./components/Form/Fieldset\";\nexport type { FieldsetProps } from \"./components/Form/Fieldset\";\n\nexport {\n InputGroup,\n InputGroupContext,\n useInputGroup,\n} from \"./components/Form/InputGroup\";\nexport type { InputGroupProps, GroupPosition } from \"./components/Form/InputGroup\";\n\nexport { InputAddon } from \"./components/Form/InputAddon\";\nexport type { InputAddonProps } from \"./components/Form/InputAddon\";\n\nexport { Heading, H1, H2, H3 } from \"./components/Heading\";\nexport type {\n HeadingProps,\n HeadingLevel,\n HeadingSize,\n} from \"./components/Heading\";\n\nexport { Link } from \"./components/Link\";\nexport type { LinkProps, LinkVariant } from \"./components/Link\";\n\nexport { Breadcrumbs } from \"./components/Breadcrumbs\";\nexport type {\n BreadcrumbsProps,\n BreadcrumbItem,\n} from \"./components/Breadcrumbs\";\n\nexport { ButtonLink, IconButtonLink } from \"./components/ButtonLink\";\nexport type {\n ButtonLinkProps,\n IconButtonLinkProps,\n} from \"./components/ButtonLink\";\n\nexport { ToggleButton } from \"./components/ToggleButton\";\nexport type {\n ToggleButtonProps,\n ToggleButtonVariant,\n ToggleButtonSize,\n} from \"./components/ToggleButton\";\n\nexport {\n ToggleButtonGroup,\n ToggleButtonGroupItem,\n} from \"./components/ToggleButtonGroup\";\nexport type {\n ToggleButtonGroupProps,\n ToggleButtonGroupItemProps,\n ToggleButtonGroupSize,\n} from \"./components/ToggleButtonGroup\";\n\nexport {\n Menu,\n MenuItem,\n MenuCheckboxItem,\n MenuSection,\n MenuHeader,\n MenuSeparator,\n} from \"./components/Menu\";\nexport type {\n MenuProps,\n MenuItemData,\n MenuItemProps,\n MenuCheckboxItemProps,\n MenuSectionProps,\n MenuHeaderProps,\n MenuSeparatorProps,\n} from \"./components/Menu\";\n\nexport { Popover, PopoverTrigger, PopoverContent } from \"./components/Popover\";\nexport type {\n PopoverProps,\n PopoverTriggerProps,\n PopoverContentProps,\n} from \"./components/Popover\";\n\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type {\n TabsProps,\n TabListProps,\n TabProps,\n TabPanelProps,\n TabsVariant,\n TabsSize,\n} from \"./components/Tabs\";\n\n// Raw React Aria Components tab primitives (unstyled escape hatch)\nexport {\n Tabs as UnstyledTabs,\n TabList as UnstyledTabList,\n Tab as UnstyledTab,\n TabPanel as UnstyledTabPanel,\n} from \"react-aria-components\";\n\nexport {\n SegmentedControl,\n SegmentedControlItem,\n} from \"./components/SegmentedControl\";\nexport type {\n SegmentedControlProps,\n SegmentedControlItemProps,\n SegmentedControlSize,\n SegmentedControlSelectionMode,\n} from \"./components/SegmentedControl\";\n\nexport { Badge } from \"./components/Badge\";\nexport type { BadgeProps, BadgeVariant, BadgeSize } from \"./components/Badge\";\n\nexport { Card } from \"./components/Card\";\nexport type { CardProps, CardPadding } from \"./components/Card\";\n\nexport { DeltaIndicator } from \"./components/DeltaIndicator\";\nexport type {\n DeltaIndicatorProps,\n DeltaFormat,\n DeltaMode,\n} from \"./components/DeltaIndicator\";\n\nexport { ProgressBar } from \"./components/ProgressBar\";\nexport type {\n ProgressBarProps,\n ProgressBarVariant,\n ProgressBarSize,\n} from \"./components/ProgressBar\";\n\nexport { Banner } from \"./components/Banner\";\nexport type { BannerProps, BannerVariant } from \"./components/Banner\";\n\nexport { MetricCard } from \"./components/MetricCard\";\nexport type { MetricCardProps, MetricCardSize } from \"./components/MetricCard\";\n\nexport { SectionHeader } from \"./components/SectionHeader\";\nexport type { SectionHeaderProps } from \"./components/SectionHeader\";\n\nexport { Pill, pillColorFromName, PathPill } from \"./components/Pill\";\nexport type { PillProps, PillColor, PathPillProps } from \"./components/Pill\";\n\nexport { FormWizard, useFormWizard } from \"./components/FormWizard\";\nexport type {\n FormWizardProps,\n FormWizardContextValue,\n} from \"./components/FormWizard\";\n\nexport { FormWizardProgress } from \"./components/FormWizard\";\nexport type { FormWizardProgressProps } from \"./components/FormWizard\";\n\nexport { FormWizardNav } from \"./components/FormWizard\";\nexport type { FormWizardNavProps } from \"./components/FormWizard\";\n\n// Design tokens (TypeScript constants)\nexport * from \"./tokens/tokens\";\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type Size,\n type ButtonVariant,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { useInputGroup } from \"../Form/InputGroup/InputGroupContext\";\n\nexport type { ButtonVariant };\nexport type ButtonSize = Size;\n\nexport interface ButtonProps extends AriaButtonProps {\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: ButtonSize;\n /** Shows a spinner and disables interaction */\n isLoading?: boolean;\n /** Lucide icon rendered before children */\n iconLeft?: LucideIcon;\n /** Lucide icon rendered after children */\n iconRight?: LucideIcon;\n}\n\nconst iconSizeMap = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"sm\",\n lg: \"md\",\n} as const;\n\nfunction groupRadiusClass(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-md rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-md rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n isDisabled,\n iconLeft,\n iconRight,\n className,\n children,\n ...props\n}: ButtonProps) {\n const { inGroup, position } = useInputGroup();\n\n const groupGhost =\n inGroup && variant === \"ghost\"\n ? \"bg-(--color-surface-default) text-(--color-text-secondary) border border-(--color-border-default) hover:bg-(--color-surface-hover) hover:text-(--color-text-primary) hover:border-(--color-border-strong) pressed:bg-(--color-surface-pressed) pressed:text-(--color-text-primary)\"\n : \"\";\n\n const radiusClass = inGroup ? groupRadiusClass(position) : \"rounded-md\";\n\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n const focusRing = inGroup\n ? \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\";\n\n return (\n <AriaButton\n {...props}\n isDisabled={isDisabled || isLoading}\n className={twMerge(\n \"inline-flex items-center justify-center gap-2 shrink-0 cursor-pointer\",\n radiusClass,\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n groupGhost || variantStyles[variant],\n sizeStyles[size],\n marginClass,\n className as string,\n )}\n >\n {isLoading && <Spinner size={iconSizeMap[size]} />}\n {!isLoading && iconLeft && (\n <Icon icon={iconLeft} size={iconSizeMap[size]} />\n )}\n {children as React.ReactNode}\n {!isLoading && iconRight && (\n <Icon icon={iconRight} size={iconSizeMap[size]} />\n )}\n </AriaButton>\n );\n}\n","/* ── Shared sizes ── */\n\nexport type Size = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport const sizeStyles: Record<Size, string> = {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\n/* ── Button ── */\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"default\"\n | \"success\"\n | \"info\"\n | \"neutral\";\n\nexport const variantStyles: Record<ButtonVariant, string> = {\n primary: [\n \"bg-(--color-action-primary) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-primary-hover)\",\n \"pressed:bg-(--color-action-primary-active)\",\n ].join(\" \"),\n secondary: [\n \"bg-transparent text-(--color-action-secondary)\",\n \"border border-(--color-border-brand)\",\n \"hover:bg-purple-50\",\n \"pressed:bg-purple-100\",\n ].join(\" \"),\n ghost: [\n \"bg-transparent text-(--color-text-primary)\",\n \"hover:bg-(--color-surface-hover)\",\n \"pressed:bg-(--color-surface-pressed)\",\n ].join(\" \"),\n destructive: [\n \"bg-(--color-action-danger) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-danger-hover)\",\n \"pressed:bg-(--color-action-danger-hover)\",\n ].join(\" \"),\n default: [\n \"bg-(--color-action-default) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-default-hover)\",\n \"pressed:bg-slate-600\",\n ].join(\" \"),\n success: [\n \"bg-(--color-action-success) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-success-hover)\",\n \"pressed:bg-green-800\",\n ].join(\" \"),\n info: [\n \"bg-(--color-action-info) text-(--color-text-inverse)\",\n \"hover:bg-(--color-action-info-hover)\",\n \"pressed:bg-slate-800\",\n ].join(\" \"),\n neutral: [\n \"bg-(--color-surface-default) text-(--color-text-primary)\",\n \"border border-(--color-border-default)\",\n \"hover:bg-(--color-surface-subtle)\",\n \"pressed:bg-(--color-surface-muted)\",\n ].join(\" \"),\n};\n","import type { LucideIcon } from \"lucide-react\";\n\nexport interface IconProps {\n /** A Lucide icon component */\n icon: LucideIcon;\n /** Size preset */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** SVG stroke width */\n strokeWidth?: number;\n /** Accessible label — when provided, the icon is treated as meaningful */\n \"aria-label\"?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst sizeMap = {\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n} as const;\n\nexport function Icon({\n icon: LucideComponent,\n size = \"md\",\n strokeWidth,\n \"aria-label\": ariaLabel,\n className,\n}: IconProps) {\n const isDecorative = !ariaLabel;\n\n return (\n <LucideComponent\n size={sizeMap[size]}\n strokeWidth={strokeWidth}\n role={isDecorative ? undefined : \"img\"}\n aria-label={ariaLabel}\n aria-hidden={isDecorative ? \"true\" : undefined}\n className={className}\n />\n );\n}\n","export interface SpinnerProps {\n /** Size preset */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Accessible label — when provided, the spinner is announced to screen readers */\n \"aria-label\"?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst sizeMap = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n} as const;\n\nexport function Spinner({\n size = \"md\",\n \"aria-label\": ariaLabel,\n className,\n}: SpinnerProps) {\n const isDecorative = !ariaLabel;\n\n return (\n <svg\n role={isDecorative ? undefined : \"status\"}\n aria-label={ariaLabel}\n aria-hidden={isDecorative ? \"true\" : undefined}\n className={[sizeMap[size], \"animate-spin\", className]\n .filter(Boolean)\n .join(\" \")}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","import { createContext, useContext } from \"react\";\n\nexport type GroupPosition = \"start\" | \"middle\" | \"end\" | \"standalone\";\n\ninterface InputGroupContextValue {\n inGroup: boolean;\n position: GroupPosition;\n}\n\nexport const InputGroupContext = createContext<InputGroupContextValue>({\n inGroup: false,\n position: \"standalone\",\n});\n\nexport function useInputGroup() {\n return useContext(InputGroupContext);\n}\n","import {\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n// Use useLayoutEffect on client, useEffect on server to avoid SSR warning\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport interface TooltipProps {\n /** Tooltip content; `null`/`undefined` disables the tooltip entirely */\n content: ReactNode;\n /** Trigger element(s) */\n children: ReactNode;\n}\n\ninterface Coords {\n x: number;\n y: number;\n}\n\nconst offsetThreshold = 5;\nconst tooltipDelay = 500; // ms of cursor rest before showing\nconst tooltipOffset = 12;\nconst viewportMargin = 4; // minimum gap to the viewport edge\n\nconst tooltipCx = [\n \"fixed z-50 px-2 py-1 rounded shadow-lg\",\n // Natural content width (capped at max-w-xs): being positioned near the\n // right viewport edge must shift the tooltip left, not squeeze its layout.\n \"w-max max-w-xs\",\n \"bg-(--color-surface-overlay) backdrop-blur-sm\",\n \"text-(--color-text-inverse) text-sm\",\n \"pointer-events-none\",\n].join(\" \");\n\n/**\n * Cursor-following tooltip. Shows after the cursor rests on the trigger for\n * 500ms (movement beyond 5px restarts the wait), positioned at a 12px offset\n * from the cursor and flipped at viewport edges.\n *\n * Keyboard: when an already-focusable child (button, switch, link) receives\n * visible focus, the tooltip shows immediately, anchored to the element's\n * center. It never makes anything focusable itself. Escape dismisses.\n *\n * Known limitation (WCAG 1.4.13 \"hoverable\"): the tooltip is\n * pointer-events-none and follows the cursor, so it cannot itself be hovered.\n * Keep tooltip content short — it is a glance affordance, not a reading\n * surface; the underlying value must stay accessible on the trigger itself.\n */\nexport function Tooltip({ content, children }: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState<Coords>({ x: 0, y: 0 });\n const [adjustedCoords, setAdjustedCoords] = useState<Coords>({ x: 0, y: 0 });\n const timerRef = useRef<number | null>(null);\n // Cursor-rest anchor. A ref, not state: the move-cancel comparison must see\n // the value set earlier in the SAME event stream, not a previous render's.\n const restAnchorRef = useRef<Coords | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const isVisible = visible && content != null;\n\n const calculateAdjustedPosition = (anchorX: number, anchorY: number) => {\n if (!tooltipRef.current) {\n return { x: anchorX + tooltipOffset, y: anchorY + tooltipOffset };\n }\n\n const { width, height } = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let x = anchorX + tooltipOffset;\n let y = anchorY + tooltipOffset;\n\n // Flip to the other side of the anchor at right/bottom edges\n if (anchorX + width > viewportWidth) {\n x = anchorX - width - tooltipOffset;\n }\n if (anchorY + height > viewportHeight) {\n y = anchorY - height - tooltipOffset;\n }\n\n // Hard-clamp into the viewport — flipping alone can still overshoot\n // (e.g. anchor near a corner, or tooltip wider than the remaining space)\n x = Math.max(\n viewportMargin,\n Math.min(x, viewportWidth - width - viewportMargin),\n );\n y = Math.max(\n viewportMargin,\n Math.min(y, viewportHeight - height - viewportMargin),\n );\n\n return { x, y };\n };\n\n // Recalculate position after tooltip is rendered/resized\n useIsomorphicLayoutEffect(() => {\n if (!isVisible || !tooltipRef.current) return;\n setAdjustedCoords(calculateAdjustedPosition(coords.x, coords.y));\n }, [isVisible, coords, content]);\n\n const hideTooltip = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n restAnchorRef.current = null;\n setVisible(false);\n };\n\n // Cursor-rest model: any move beyond the threshold (measured against the\n // incoming event coordinates, not stale state) hides the tooltip, re-anchors\n // and restarts the dwell; staying within it lets the pending timer fire.\n const handleMouseMove = ({ clientX, clientY }: MouseEvent) => {\n setCoords({ x: clientX, y: clientY });\n\n const anchor = restAnchorRef.current;\n const moved =\n anchor == null ||\n Math.abs(clientX - anchor.x) > offsetThreshold ||\n Math.abs(clientY - anchor.y) > offsetThreshold;\n\n if (!moved) return;\n\n hideTooltip();\n restAnchorRef.current = { x: clientX, y: clientY };\n timerRef.current = window.setTimeout(() => {\n setVisible(true);\n }, tooltipDelay);\n };\n\n // Keyboard path: a focusable child received focus. Only react to visible\n // (keyboard-driven) focus and anchor at the element's center — no dwell,\n // deliberate focus is intent enough.\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as Element;\n let focusVisible = true;\n try {\n focusVisible = target.matches(\":focus-visible\");\n } catch {\n // Older engines without :focus-visible — fall back to showing.\n }\n if (!focusVisible) return;\n\n const rect = target.getBoundingClientRect();\n const center = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n // Anchor at the element center so incidental mouse movement over the\n // focused trigger doesn't immediately cancel the keyboard-shown tooltip.\n restAnchorRef.current = center;\n setCoords(center);\n setVisible(true);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") hideTooltip();\n };\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n const tooltipContent =\n isVisible && content != null ? (\n <div\n ref={tooltipRef}\n role=\"tooltip\"\n className={tooltipCx}\n style={{ left: adjustedCoords.x, top: adjustedCoords.y }}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <span\n style={{ display: \"contents\" }}\n onMouseMove={handleMouseMove}\n onMouseLeave={hideTooltip}\n onFocus={handleFocus}\n onBlur={hideTooltip}\n onKeyDown={handleKeyDown}\n >\n {children}\n {typeof window !== \"undefined\" &&\n createPortal(tooltipContent, document.body)}\n </span>\n );\n}\n","import {\n CSSProperties,\n KeyboardEvent,\n ReactNode,\n UIEvent,\n useRef,\n} from \"react\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useCopyToClipboard } from \"./useCopyToClipboard\";\nimport { useMiddleEllipsis } from \"./useMiddleEllipsis\";\nimport { useOverflowDetection } from \"./useOverflowDetection\";\n\ntype EllipsisMode = \"left\" | \"middle\" | \"right\";\n\nexport interface TruncatedTextProps {\n /** Text to display. `middle` ellipsis requires a string child. */\n children: ReactNode;\n /** Where the ellipsis is placed when the text overflows (default `right`). */\n ellipsis?: EllipsisMode;\n /** When set, the text becomes click-to-copy and copies this value. */\n copyValue?: string;\n}\n\nconst spanCx = \"truncate overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n// Web's original used -mx-1 px-1 to widen the hover highlight beyond the\n// text; on a w-full element the negative margin overflows the container and\n// clips on the right — keep the highlight within the text box instead.\nconst copyCx =\n \"hover:bg-(--color-surface-hover) transition-colors rounded cursor-pointer\";\n\nconst leftStyle: CSSProperties = { direction: \"rtl\", textAlign: \"left\" };\n\n// An overflow-hidden + ellipsis element is still a horizontal scroll\n// container: a click-drag text selection (or focus) scrolls it, sliding the\n// text and hiding the ellipsis. Pin it so the truncation always shows.\nconst pinScroll = (e: UIEvent<HTMLElement>) => {\n if (e.currentTarget.scrollLeft !== 0) e.currentTarget.scrollLeft = 0;\n};\n\nconst handleCopyKeyDown = (handleClick: () => void) => (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n};\n\nconst CopiedOverlay = () => (\n <span\n // Announce the successful copy to screen readers; as a live region the\n // text is not glued onto the button's accessible name.\n role=\"status\"\n aria-live=\"polite\"\n className=\"absolute inset-0 flex items-center text-(--color-text-secondary) pointer-events-none\"\n >\n Copied\n </span>\n);\n\n// ─── Right (default): pure CSS truncation ───────────────────────────\n\nconst RightEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {children}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Left: CSS direction trick ──────────────────────────────────────\n\nconst LeftEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n style={leftStyle}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n <bdi>{children}</bdi>\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Middle: JS-based truncation ────────────────────────────────────\n\nconst middleCx = \"overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n\nconst MiddleEllipsisString = ({ text, copyValue }: { text: string; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const displayed = useMiddleEllipsis(ref, text);\n const isTruncated = displayed !== text;\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${middleCx} ${copyCx} relative` : middleCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? text : null}>\n <span\n ref={ref}\n className={cx}\n // Middle truncation replaces the DOM text, so screen readers would\n // otherwise announce the mutilated string — expose the full value.\n aria-label={isTruncated ? text : undefined}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {displayed}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Public component ───────────────────────────────────────────────\n\n/**\n * Truncating text span (ported from cytario-web's TooltipSpan). Reveals the\n * full value via the cursor tooltip only while actually truncated. Plain text\n * stays non-focusable; passing `copyValue` turns it into a click-to-copy\n * button (focusable, keyboard operable).\n */\nexport const TruncatedText = ({ children, ellipsis = \"right\", copyValue }: TruncatedTextProps) => {\n if (ellipsis === \"left\") return <LeftEllipsis copyValue={copyValue}>{children}</LeftEllipsis>;\n if (ellipsis === \"middle\" && typeof children === \"string\")\n return <MiddleEllipsisString text={children} copyValue={copyValue} />;\n return <RightEllipsis copyValue={copyValue}>{children}</RightEllipsis>;\n};\n","import { useCallback, useRef, useState } from \"react\";\n\nconst FLASH_DURATION = 1500;\n\ninterface UseCopyToClipboardResult {\n handleClick: () => void;\n isCopied: boolean;\n}\n\nexport function useCopyToClipboard(copyValue: string | undefined): UseCopyToClipboardResult {\n const [isCopied, setIsCopied] = useState(false);\n const timerRef = useRef<number | null>(null);\n\n const handleClick = useCallback(() => {\n if (copyValue == null) return;\n\n const selection = window.getSelection()?.toString();\n if (selection && selection.length > 0) return;\n\n // Clipboard API is absent in insecure contexts and can reject on denied\n // permission — fail silently rather than throw.\n if (!navigator.clipboard) return;\n navigator.clipboard\n .writeText(copyValue)\n .then(() => {\n if (timerRef.current != null) clearTimeout(timerRef.current);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => {\n setIsCopied(false);\n timerRef.current = null;\n }, FLASH_DURATION);\n })\n .catch(() => {});\n }, [copyValue]);\n\n return { handleClick, isCopied };\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\nconst ELLIPSIS = \"…\";\n\n/**\n * Binary-search for the longest `start…end` that fits within the element.\n * Uses actual DOM measurement (scrollWidth vs clientWidth) instead of canvas,\n * so results are pixel-perfect regardless of font, letter-spacing, or rendering.\n */\nfunction computeTruncated(el: HTMLElement, text: string): string {\n el.textContent = text;\n if (el.scrollWidth <= el.clientWidth) return text;\n\n let lo = 0;\n let hi = text.length;\n\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n const startLen = Math.ceil(mid / 2);\n const endLen = Math.floor(mid / 2);\n el.textContent =\n text.slice(0, startLen) + ELLIPSIS + (endLen > 0 ? text.slice(text.length - endLen) : \"\");\n\n if (el.scrollWidth <= el.clientWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n\n if (lo === 0) return ELLIPSIS;\n\n const startLen = Math.ceil(lo / 2);\n const endLen = Math.floor(lo / 2);\n\n const result =\n endLen === 0\n ? text.slice(0, startLen) + ELLIPSIS\n : text.slice(0, startLen) + ELLIPSIS + text.slice(text.length - endLen);\n\n // Ensure the DOM shows the final result immediately, before React re-renders.\n el.textContent = result;\n return result;\n}\n\n/**\n * Observes the container width and returns a middle-truncated string.\n * Returns the original text if it fits within the container.\n */\nexport function useMiddleEllipsis(ref: RefObject<HTMLSpanElement | null>, text: string): string {\n const [displayed, setDisplayed] = useState(text);\n\n // useLayoutEffect runs before paint, so the user never sees the full text.\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const update = () => setDisplayed(computeTruncated(el, text));\n\n update();\n\n const observer = new ResizeObserver(() => update());\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, text]);\n\n return displayed;\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\n/**\n * Detects whether an element's content overflows its visible width.\n * Uses ResizeObserver to recheck on any container size change\n * (column resize, flex layout shifts, not just window resize).\n */\nexport function useOverflowDetection(ref: RefObject<HTMLElement | null>): boolean {\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const check = () => setIsTruncated(el.scrollWidth > el.offsetWidth);\n\n check();\n\n // Defer + coalesce to the next frame so a live container resize (e.g.\n // dragging a sidebar) can't drive a synchronous observe→setState→layout\n // loop (\"Maximum update depth\").\n let raf = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(check);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n observer.disconnect();\n };\n }, [ref]);\n\n return isTruncated;\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { type ButtonVariant, variantStyles } from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useInputGroup } from \"../Form/InputGroup/InputGroupContext\";\n\nexport interface IconButtonProps extends Omit<AriaButtonProps, \"className\"> {\n /** Lucide icon to render */\n icon: LucideIcon;\n /** Required for accessibility — also used as tooltip content */\n \"aria-label\": string;\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Show tooltip on hover (default true) */\n showTooltip?: boolean;\n /** Shows a spinner and disables interaction */\n isLoading?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles = {\n xs: \"h-7 w-7\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n} as const;\n\nconst squareWidthOnly = {\n xs: \"w-7\",\n sm: \"w-8\",\n md: \"w-10\",\n lg: \"w-12\",\n} as const;\n\nconst iconSizeMap = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"sm\",\n lg: \"md\",\n} as const;\n\nfunction groupRadiusClass(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-md rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-md rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function IconButton({\n icon,\n \"aria-label\": ariaLabel,\n variant = \"ghost\",\n size = \"md\",\n showTooltip = true,\n isLoading = false,\n isDisabled,\n className,\n ...props\n}: IconButtonProps) {\n const { inGroup, position } = useInputGroup();\n\n const groupGhost =\n inGroup && variant === \"ghost\"\n ? \"bg-(--color-surface-default) text-(--color-text-secondary) border border-(--color-border-default) hover:bg-(--color-surface-hover) hover:text-(--color-text-primary) hover:border-(--color-border-strong) pressed:bg-(--color-surface-pressed) pressed:text-(--color-text-primary)\"\n : \"\";\n\n const radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-md\";\n\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n const focusRing = inGroup\n ? \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\";\n\n const button = (\n <AriaButton\n {...props}\n aria-label={ariaLabel}\n isDisabled={isDisabled || isLoading}\n className={[\n \"inline-flex items-center justify-center shrink-0 cursor-pointer\",\n radiusClass,\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n groupGhost || variantStyles[variant],\n inGroup ? squareWidthOnly[size] : squareSizeStyles[size],\n marginClass,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {isLoading ? (\n <Spinner size={iconSizeMap[size]} />\n ) : (\n <Icon icon={icon} size={iconSizeMap[size]} />\n )}\n </AriaButton>\n );\n\n if (showTooltip) {\n return (\n <Tooltip content={ariaLabel}>{button}</Tooltip>\n );\n }\n\n return button;\n}\n","import type { ElementType } from \"react\";\nimport {\n TextField,\n Input as AriaInput,\n Text,\n type TextFieldProps,\n ColorField,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type Size, sizeStyles } from \"../../_shared/styles\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\nimport { Label } from \"../Label\";\n\nconst alignClasses = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\nexport interface InputProps extends Omit<\n TextFieldProps,\n \"children\" | \"className\"\n> {\n as?: typeof TextField | typeof ColorField;\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\";\n size?: Size;\n prefix?: string;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\n/**\n * Returns Tailwind border-radius classes for the border-bearing element\n * based on InputGroup position context.\n */\nfunction groupRadiusClasses(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-(--border-radius-md) rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-(--border-radius-md) rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function Input({\n as: FieldProp = TextField,\n label,\n placeholder,\n description,\n errorMessage,\n type = \"text\",\n size = \"md\",\n prefix,\n align = \"left\",\n isDisabled,\n isRequired,\n className,\n ...props\n}: InputProps) {\n const Field: ElementType = FieldProp;\n\n const isInvalid = !!errorMessage;\n const { inGroup, position } = useInputGroup();\n\n const borderColor = isInvalid\n ? \"border-(--color-border-danger)\"\n : \"border-(--color-border-default) hover:border-(--color-border-strong)\";\n\n const radiusClass = inGroup ? groupRadiusClasses(position) : \"rounded-md\";\n\n /** When not first in a group, overlap left border with previous sibling */\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n return (\n <Field\n {...props}\n type={type}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n className={twMerge(\n \"flex w-full flex-col gap-1\",\n inGroup ? \"min-w-0 flex-1\" : \"\",\n marginClass,\n className,\n )}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n {prefix ? (\n <div\n className={twMerge(\n \"flex items-center overflow-hidden\",\n radiusClass,\n \"border\",\n \"bg-(--color-surface-default)\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus-within:ring-2 focus-within:ring-(--color-border-focus) focus-within:border-(--color-border-focus)\",\n inGroup && \"focus-within:z-10\",\n isDisabled && \"opacity-50 pointer-events-none\",\n )}\n >\n <span\n className={twMerge(\n \"self-stretch flex items-center shrink-0 select-none\",\n \"bg-(--color-surface-subtle)\",\n \"border-r border-r-(--color-border-default)\",\n \"text-(--color-text-secondary)\",\n sizeStyles[size],\n )}\n >\n {prefix}\n </span>\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full bg-transparent\",\n sizeStyles[size],\n alignClasses[align],\n \"text-(--color-text-primary)\",\n \"placeholder:text-(--color-text-tertiary)\",\n \"outline-none border-none\",\n )}\n />\n </div>\n ) : (\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full\",\n sizeStyles[size],\n alignClasses[align],\n radiusClass,\n \"border\",\n \"text-(--color-text-primary)\",\n \"bg-(--color-surface-default)\",\n \"placeholder:text-(--color-text-tertiary)\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus:ring-2 focus:ring-(--color-border-focus) focus:border-(--color-border-focus)\",\n inGroup && \"focus:z-10\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n )}\n />\n )}\n\n {description && (\n <Text\n slot=\"description\"\n className=\"text-sm text-(--color-text-secondary)\"\n >\n {description}\n </Text>\n )}\n\n {isInvalid && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-(--color-text-danger)\"\n >\n {errorMessage}\n </Text>\n )}\n </Field>\n );\n}\n","import {\n Label as AriaLabel,\n type LabelProps as AriaLabelProps,\n} from \"react-aria-components\";\n\nexport interface LabelProps extends Omit<AriaLabelProps, \"className\"> {\n isRequired?: boolean;\n className?: string;\n}\n\nexport function Label({ isRequired, children, className, ...props }: LabelProps) {\n return (\n <AriaLabel\n {...props}\n className={[\n \"text-sm\",\n \"font-medium\",\n \"text-(--color-text-primary)\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n {isRequired && (\n <span\n aria-hidden=\"true\"\n className=\"ml-0.5 text-(--color-text-danger)\"\n >\n *\n </span>\n )}\n </AriaLabel>\n );\n}\n","import type React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport {\n Button,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n SelectValue,\n Text,\n type SelectProps as AriaSelectProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type Size, sizeStyles } from \"../../_shared/styles\";\nimport { Label } from \"../Label\";\n\nexport interface SelectItem {\n id: string;\n name: string;\n}\n\nexport interface SelectProps extends Omit<\n AriaSelectProps<SelectItem>,\n \"children\"\n> {\n items: SelectItem[];\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n /** Controls padding and font size */\n size?: Size;\n /** Custom visual renderer for items in the dropdown and trigger.\n * `item.name` remains the accessible label (used for typeahead and screen readers). */\n renderItem?: (item: SelectItem) => React.ReactNode;\n}\n\nexport function Select({\n label,\n items,\n placeholder = \"Select an option\",\n description,\n errorMessage,\n size = \"md\",\n isDisabled,\n isRequired,\n className,\n renderItem,\n ...props\n}: SelectProps) {\n const hasError = Boolean(errorMessage);\n\n return (\n <AriaSelect\n {...props}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={hasError}\n className={twMerge(\"flex flex-col gap-1\", className as string)}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n <Button\n aria-required={isRequired || undefined}\n className={twMerge(\n `\n inline-flex items-center justify-between\n w-full rounded-md\n text-left\n border outline-none transition-colors\n focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\n cursor-pointer disabled:opacity-50 disabled:pointer-events-none\n bg-(--color-surface-default)\n `,\n sizeStyles[size],\n hasError\n ? \"border-(--color-border-danger)\"\n : \"border-(--color-border-default)\",\n )}\n >\n <SelectValue\n className={twMerge(\n renderItem ? \"min-w-0\" : \"truncate\",\n \"data-placeholder:text-(--color-text-tertiary)\",\n )}\n >\n {({ selectedItem, isPlaceholder }) => {\n if (isPlaceholder) return placeholder;\n const item = selectedItem as SelectItem;\n return renderItem ? renderItem(item) : (item?.name ?? placeholder);\n }}\n </SelectValue>\n <ChevronDown\n aria-hidden\n className={twMerge(\n \"shrink-0 text-(--color-text-secondary)\",\n size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\",\n )}\n />\n </Button>\n\n {description && (\n <Text slot=\"description\" className=\"text-sm text-(--color-text-secondary)\">\n {description}\n </Text>\n )}\n\n {hasError && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-(--color-text-danger)\"\n >\n {errorMessage}\n </Text>\n )}\n\n <Popover\n className={twMerge(\n \"w-(--trigger-width)\",\n \"rounded-md\",\n \"border border-(--color-border-default)\",\n \"bg-(--color-surface-default)\",\n \"shadow-lg\",\n \"overflow-auto\",\n \"entering:animate-in entering:fade-in\",\n \"exiting:animate-out exiting:fade-out\",\n )}\n >\n <ListBox className=\"p-1 outline-none\" items={items}>\n {(item) => (\n <ListBoxItem\n id={item.id}\n textValue={item.name}\n className={twMerge(\n `\n flex items-center justify-between gap-2\n rounded-sm\n text-(--color-text-primary)\n cursor-pointer outline-none\n hover:bg-(--color-surface-muted)\n focus-visible:bg-(--color-surface-muted)\n selected:text-(--color-action-primary) selected:font-medium\n `,\n sizeStyles[size],\n )}\n >\n {({ isSelected }) => (\n <>\n <span className={renderItem ? \"min-w-0 flex-1\" : \"truncate\"}>\n {renderItem ? renderItem(item) : item.name}\n </span>\n {isSelected && (\n <Check className=\"h-4 w-4 shrink-0 text-(--color-action-primary)\" />\n )}\n </>\n )}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n","import {\n Cell as AriaCell,\n Column as AriaColumn,\n Row as AriaRow,\n Table as AriaTable,\n TableBody as AriaTableBody,\n TableHeader as AriaTableHeader,\n type CellProps,\n type ColumnProps,\n type RowProps,\n type TableBodyProps,\n type TableHeaderProps,\n type TableProps,\n} from \"react-aria-components\";\n\nexport type TableSize = \"compact\" | \"comfortable\";\n\n/* ------------------------------------------------------------------ */\n/* Table */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps extends TableProps {\n /** Row density */\n size?: TableSize;\n}\n\nconst tableSizeClass: Record<TableSize, string> = {\n compact: \"[--table-row-py:theme(spacing.1)]\",\n comfortable: \"[--table-row-py:theme(spacing.3)]\",\n};\n\nexport function Table({ size = \"comfortable\", className, ...props }: DataTableProps) {\n return (\n <AriaTable\n {...props}\n className={[\n \"w-full border-collapse text-(--font-size-sm) text-(--color-text-primary)\",\n tableSizeClass[size],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* TableHeader */\n/* ------------------------------------------------------------------ */\n\nexport function TableHeader<T extends object>(props: TableHeaderProps<T>) {\n return <AriaTableHeader {...props} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Column */\n/* ------------------------------------------------------------------ */\n\nexport function Column(props: ColumnProps) {\n return (\n <AriaColumn\n {...props}\n className={[\n \"px-3 py-2 text-left font-semibold text-(--color-text-secondary)\",\n \"border-b-2 border-(--color-border-default)\",\n \"cursor-default select-none outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-(--color-border-focus) focus-visible:outline-offset-[-2px]\",\n ].join(\" \")}\n >\n {({ allowsSorting, sortDirection }) => (\n <span className=\"inline-flex items-center gap-1\">\n {props.children as React.ReactNode}\n {allowsSorting && (\n <span aria-hidden=\"true\" className=\"text-(--color-text-tertiary)\">\n {sortDirection === \"ascending\" ? \"\\u25B2\" : sortDirection === \"descending\" ? \"\\u25BC\" : \"\\u25B4\"}\n </span>\n )}\n </span>\n )}\n </AriaColumn>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* TableBody */\n/* ------------------------------------------------------------------ */\n\nexport function TableBody<T extends object>(props: TableBodyProps<T>) {\n return <AriaTableBody {...props} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Row */\n/* ------------------------------------------------------------------ */\n\nexport function Row<T extends object>(props: RowProps<T>) {\n return (\n <AriaRow\n {...props}\n className={[\n \"border-b border-(--color-border-default)\",\n \"even:bg-(--color-surface-subtle)\",\n \"hover:bg-(--color-surface-muted)\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-(--color-border-focus) focus-visible:outline-offset-[-2px]\",\n \"transition-colors\",\n ].join(\" \")}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Cell */\n/* ------------------------------------------------------------------ */\n\nexport function Cell(props: CellProps) {\n return (\n <AriaCell\n {...props}\n className={[\n \"px-3 py-(--table-row-py)\",\n \"text-(--color-text-primary)\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-(--color-border-focus) focus-visible:outline-offset-[-2px]\",\n ].join(\" \")}\n />\n );\n}\n","import type React from \"react\";\nimport {\n Modal,\n ModalOverlay,\n Dialog as AriaDialog,\n Heading,\n type DialogProps as AriaDialogProps,\n} from \"react-aria-components\";\nimport { X } from \"lucide-react\";\n\nexport interface DialogProps {\n isOpen: boolean;\n onOpenChange: (isOpen: boolean) => void;\n title: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Whether clicking outside the dialog dismisses it. Defaults to true. */\n isDismissable?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nconst sizeStyles = {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n} as const;\n\nexport function Dialog({\n isOpen,\n onOpenChange,\n title,\n size = \"md\",\n isDismissable = true,\n children,\n className,\n}: DialogProps) {\n return (\n <ModalOverlay\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n isDismissable={isDismissable}\n className={[\n \"fixed inset-0 z-50 bg-(--color-overlay-backdrop) backdrop-blur-sm\",\n \"flex items-center justify-center\",\n \"data-[entering]:animate-in data-[entering]:fade-in\",\n \"data-[exiting]:animate-out data-[exiting]:fade-out\",\n ].join(\" \")}\n >\n <Modal\n className={[\n \"w-full mx-4\",\n sizeStyles[size],\n \"bg-(--color-surface-default) rounded-lg shadow-xl max-h-[85vh] flex flex-col\",\n \"data-[entering]:animate-in data-[entering]:zoom-in-95 data-[entering]:fade-in\",\n \"data-[exiting]:animate-out data-[exiting]:zoom-out-95 data-[exiting]:fade-out\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <AriaDialog className=\"outline-none flex flex-col max-h-[85vh]\">\n {({ close }) => (\n <>\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-(--color-border-default)\">\n <Heading\n slot=\"title\"\n className=\"text-lg font-semibold text-(--color-text-primary)\"\n >\n {title}\n </Heading>\n <button\n type=\"button\"\n onClick={close}\n className={[\n \"inline-flex items-center justify-center rounded-sm p-1\",\n \"text-(--color-text-secondary) hover:text-(--color-text-primary) hover:bg-(--color-surface-muted)\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n \"transition-colors\",\n ].join(\" \")}\n aria-label=\"Close\"\n >\n <X size={20} aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"px-6 py-4 overflow-y-auto\">{children}</div>\n </>\n )}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type React from \"react\";\n\nexport interface DialogFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function DialogFooter({ children, className }: DialogFooterProps) {\n return (\n <div\n className={[\n \"pt-4 mt-4 border-t border-(--color-border-default) flex items-center justify-between gap-3\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CheckCircle, XCircle, Info, X } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport type ToastVariant = \"success\" | \"error\" | \"info\";\nexport type ToastPlacement = \"top-center\" | \"top-right\" | \"bottom-center\" | \"bottom-right\";\n\nexport interface ToastData {\n id: string;\n variant: ToastVariant;\n message: string;\n duration?: number;\n}\n\nexport interface ToastContextValue {\n toasts: ToastData[];\n addToast: (toast: Omit<ToastData, \"id\">) => void;\n removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nlet toastCounter = 0;\n\nconst defaultDuration: Record<ToastVariant, number> = {\n success: 5000,\n info: 5000,\n error: 10000,\n};\n\nconst variantConfig: Record<\n ToastVariant,\n { icon: LucideIcon; containerClass: string; iconClass: string }\n> = {\n success: {\n icon: CheckCircle,\n containerClass: \"bg-(--color-surface-success) border-(--color-border-success) text-(--color-text-success)\",\n iconClass: \"text-(--color-action-success)\",\n },\n error: {\n icon: XCircle,\n containerClass: \"bg-(--color-surface-danger) border-(--color-border-danger) text-(--color-text-danger)\",\n iconClass: \"text-(--color-action-danger)\",\n },\n info: {\n icon: Info,\n containerClass: \"bg-(--color-surface-info) border-(--color-border-info) text-(--color-text-info)\",\n iconClass: \"text-(--color-text-info)\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Placement context — passed from ToastContainer to ToastItem\n// ---------------------------------------------------------------------------\n\nconst PlacementContext = createContext<ToastPlacement>(\"bottom-right\");\n\nconst exitAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"-translate-y-full opacity-0\",\n \"top-right\": \"translate-x-full opacity-0\",\n \"bottom-center\": \"translate-y-full opacity-0\",\n \"bottom-right\": \"translate-x-full opacity-0\",\n};\n\nconst enterAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-top\",\n \"top-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n \"bottom-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-bottom\",\n \"bottom-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n};\n\nfunction ToastItem({\n toast,\n onRemove,\n}: {\n toast: ToastData;\n onRemove: (id: string) => void;\n}) {\n const [isExiting, setIsExiting] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const placement = useContext(PlacementContext);\n const config = variantConfig[toast.variant];\n const IconComponent = config.icon;\n\n const dismiss = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => onRemove(toast.id), 200);\n }, [onRemove, toast.id]);\n\n useEffect(() => {\n const duration = toast.duration ?? defaultDuration[toast.variant];\n timerRef.current = setTimeout(dismiss, duration);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [toast.duration, toast.variant, dismiss]);\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={[\n \"flex items-start gap-3 rounded-lg border px-4 py-3 shadow-md\",\n \"min-w-[320px] max-w-[420px]\",\n \"transition-all duration-200\",\n isExiting\n ? exitAnimationByPlacement[placement]\n : enterAnimationByPlacement[placement],\n config.containerClass,\n ].join(\" \")}\n >\n <IconComponent size={20} className={[\"shrink-0 mt-0.5\", config.iconClass].join(\" \")} aria-hidden=\"true\" />\n <p className=\"flex-1 text-sm font-medium\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={dismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <X size={16} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n\nconst containerPositionStyles: Record<ToastPlacement, string> = {\n \"top-center\": \"fixed top-4 left-1/2 -translate-x-1/2 z-50 flex flex-col-reverse gap-2 items-center\",\n \"top-right\": \"fixed top-4 right-4 z-50 flex flex-col-reverse gap-2\",\n \"bottom-center\": \"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 flex flex-col gap-2 items-center\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-50 flex flex-col gap-2\",\n};\n\nfunction ToastContainer({\n toasts,\n removeToast,\n placement = \"bottom-right\",\n}: {\n toasts: ToastData[];\n removeToast: (id: string) => void;\n placement?: ToastPlacement;\n}) {\n if (toasts.length === 0) return null;\n\n return createPortal(\n <PlacementContext.Provider value={placement}>\n <div className={containerPositionStyles[placement]}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n </PlacementContext.Provider>,\n document.body,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Toast Bridge — allows code outside the React tree to emit toasts\n// ---------------------------------------------------------------------------\n\nexport interface ToastBridge {\n /** Call from anywhere (including outside React) to show a toast. */\n emit: (toast: Omit<ToastData, \"id\">) => void;\n /** Used internally by ToastProvider to subscribe to external emits. */\n subscribe: (fn: (toast: Omit<ToastData, \"id\">) => void) => () => void;\n}\n\nexport function createToastBridge(): ToastBridge {\n const listeners = new Set<(toast: Omit<ToastData, \"id\">) => void>();\n return {\n emit: (toast) => {\n listeners.forEach((fn) => fn(toast));\n },\n subscribe: (fn) => {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// ToastProvider\n// ---------------------------------------------------------------------------\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Optional bridge for receiving toasts from outside the React tree. */\n bridge?: ToastBridge;\n /** Where to display toasts on screen. Defaults to \"bottom-right\". */\n placement?: ToastPlacement;\n}\n\nexport function ToastProvider({ children, bridge, placement = \"bottom-right\" }: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n\n const addToast = useCallback((toast: Omit<ToastData, \"id\">) => {\n const id = `toast-${++toastCounter}`;\n setToasts((prev) => [...prev, { ...toast, id }]);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n // Subscribe to external bridge emits\n useEffect(() => {\n if (!bridge) return;\n return bridge.subscribe(addToast);\n }, [bridge, addToast]);\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} placement={placement} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return {\n toast: context.addToast,\n toasts: context.toasts,\n removeToast: context.removeToast,\n };\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { Icon } from \"../Icon\";\n\nexport interface EmptyStateProps {\n icon?: LucideIcon;\n title: string;\n description?: string;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={[\n \"flex flex-col items-center text-center py-12 px-6\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && (\n <Icon icon={icon} size=\"xl\" className=\"text-(--color-text-tertiary)\" />\n )}\n <h3 className=\"text-lg font-semibold text-(--color-text-primary) mt-4\">\n {title}\n </h3>\n {description && (\n <p className=\"text-sm text-(--color-text-secondary) mt-2 max-w-sm\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n","import type React from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from \"react-aria-components\";\nimport { Check } from \"lucide-react\";\n\nexport interface CheckboxProps\n extends Omit<AriaCheckboxProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <AriaCheckbox\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-(--color-text-primary) cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected, isIndeterminate }) => (\n <>\n <div\n className={[\n \"flex items-center justify-center w-6 h-6 shrink-0\",\n \"rounded-sm border transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected || isIndeterminate\n ? \"bg-(--color-action-primary) border-(--color-action-primary)\"\n : \"bg-(--color-surface-default) border-(--color-border-default) group-hover:border-(--color-border-strong)\",\n ].join(\" \")}\n >\n {isSelected && (\n <Check className=\"w-4 h-4 text-(--color-text-inverse)\" strokeWidth={3} />\n )}\n {isIndeterminate && (\n <div className=\"w-3 h-0.5 bg-(--color-text-inverse) rounded-full\" />\n )}\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaCheckbox>\n );\n}\n","import type React from \"react\";\nimport {\n Switch as AriaSwitch,\n type SwitchProps as AriaSwitchProps,\n} from \"react-aria-components\";\n\ntype PresetColor = \"primary\" | \"success\" | \"destructive\";\n\nexport interface SwitchProps\n extends Omit<AriaSwitchProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n /** Preset color name or any valid CSS color string for the track when selected */\n color?: PresetColor | (string & {});\n className?: string;\n}\n\nconst trackColorMap: Record<PresetColor, string> = {\n primary: \"bg-(--color-action-primary)\",\n success: \"bg-(--color-action-success)\",\n destructive: \"bg-(--color-action-danger)\",\n};\n\nconst presetColors = new Set<string>(Object.keys(trackColorMap));\n\nfunction isPresetColor(color: string): color is PresetColor {\n return presetColors.has(color);\n}\n\nexport function Switch({\n children,\n color = \"primary\",\n className,\n ...props\n}: SwitchProps) {\n const isPreset = isPresetColor(color);\n\n return (\n <AriaSwitch\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-(--color-text-primary) cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <>\n <div\n className={[\n \"w-9 h-5 rounded-full transition-colors shrink-0 p-0.5\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected && isPreset\n ? trackColorMap[color]\n : !isSelected\n ? \"bg-(--color-border-strong)\"\n : \"\",\n ].join(\" \")}\n style={\n isSelected && !isPreset\n ? { backgroundColor: color }\n : undefined\n }\n >\n <div\n className={[\n \"w-4 h-4 rounded-full bg-(--color-surface-default) transition-transform shadow-sm\",\n isSelected ? \"translate-x-4\" : \"translate-x-0\",\n ].join(\" \")}\n />\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaSwitch>\n );\n}\n","import type React from \"react\";\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\n\nexport interface RadioGroupProps\n extends Omit<AriaRadioGroupProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioButtonProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function RadioGroup({ children, className, ...props }: RadioGroupProps) {\n return (\n <AriaRadioGroup\n {...props}\n className={[\n \"flex flex-col gap-2\",\n \"disabled:opacity-50\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </AriaRadioGroup>\n );\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-(--color-text-primary) cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <>\n <div\n className={[\n \"flex items-center justify-center w-5 h-5 shrink-0\",\n \"rounded-full border-2 transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected\n ? \"border-(--color-action-primary)\"\n : \"border-(--color-border-default) group-hover:border-(--color-border-strong)\",\n ].join(\" \")}\n >\n {isSelected && (\n <div className=\"w-2.5 h-2.5 rounded-full bg-(--color-action-primary)\" />\n )}\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaRadio>\n );\n}\n\nexport function RadioButton({ children, className, ...props }: RadioButtonProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <div\n className={[\n \"px-4 py-2 text-sm font-medium\",\n \"rounded-md border transition-colors text-center\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-(--color-border-focus) group-focus-visible:ring-offset-2\",\n isSelected\n ? \"bg-(--color-action-primary) border-(--color-action-primary) text-(--color-text-inverse)\"\n : \"bg-(--color-surface-default) border-(--color-border-default) text-(--color-text-primary) hover:border-(--color-border-strong)\",\n ].join(\" \")}\n >\n {children}\n </div>\n )}\n </AriaRadio>\n );\n}\n","import type React from \"react\";\n\nexport interface FieldsetProps {\n legend?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Fieldset({ legend, children, className }: FieldsetProps) {\n return (\n <fieldset\n className={[\n \"flex flex-col gap-8\",\n \"border-none p-0 m-0\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {legend && (\n <legend\n className={[\n \"text-lg\",\n \"font-semibold\",\n \"text-(--color-text-primary)\",\n \"p-0\",\n ].join(\" \")}\n >\n {legend}\n </legend>\n )}\n {children}\n </fieldset>\n );\n}\n","import React from \"react\";\nimport { InputGroupContext, type GroupPosition } from \"./InputGroupContext\";\n\nexport interface InputGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function InputGroup({ children, className }: InputGroupProps) {\n const childArray = React.Children.toArray(children).filter(\n React.isValidElement,\n );\n\n return (\n <div\n className={[\"flex items-stretch\", className].filter(Boolean).join(\" \")}\n >\n {childArray.map((child, index) => {\n const position: GroupPosition =\n childArray.length === 1\n ? \"standalone\"\n : index === 0\n ? \"start\"\n : index === childArray.length - 1\n ? \"end\"\n : \"middle\";\n\n return (\n <InputGroupContext.Provider\n key={index}\n value={{ inGroup: true, position }}\n >\n {child}\n </InputGroupContext.Provider>\n );\n })}\n </div>\n );\n}\n","import type React from \"react\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\n\nexport interface InputAddonProps {\n children: React.ReactNode;\n className?: string;\n}\n\nfunction groupRadiusClass(\n position: \"start\" | \"middle\" | \"end\" | \"standalone\",\n): string {\n switch (position) {\n case \"start\":\n return \"rounded-l-(--border-radius-md) rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-(--border-radius-md) rounded-l-none\";\n default:\n return \"rounded-md\";\n }\n}\n\nexport function InputAddon({ children, className }: InputAddonProps) {\n const { inGroup, position } = useInputGroup();\n\n const radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-md\";\n\n const marginClass =\n inGroup && position !== \"start\" && position !== \"standalone\"\n ? \"-ml-px\"\n : \"\";\n\n return (\n <div\n className={[\n \"flex items-center self-stretch shrink-0 select-none\",\n \"px-3 py-2 text-base\",\n \"bg-(--color-surface-subtle)\",\n \"text-(--color-text-secondary)\",\n \"border border-(--color-border-default)\",\n radiusClass,\n marginClass,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\nexport type HeadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\nexport type HeadingWeight = \"semibold\" | \"bold\";\n\nexport interface HeadingProps {\n /** HTML heading element to render */\n as?: HeadingLevel;\n /** Visual size (defaults to match the `as` level) */\n size?: HeadingSize;\n /** Font weight (defaults to \"semibold\") */\n weight?: HeadingWeight;\n children: React.ReactNode;\n className?: string;\n}\n\nconst defaultSizeMap: Record<HeadingLevel, HeadingSize> = {\n h1: \"2xl\",\n h2: \"xl\",\n h3: \"lg\",\n h4: \"md\",\n h5: \"sm\",\n h6: \"xs\",\n};\n\nconst sizeStyles: Record<HeadingSize, string> = {\n xs: \"text-sm\",\n sm: \"text-base\",\n md: \"text-lg\",\n lg: \"text-xl\",\n xl: \"text-2xl\",\n \"2xl\": \"text-3xl\",\n \"3xl\": \"text-4xl\",\n};\n\nconst weightStyles: Record<HeadingWeight, string> = {\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n};\n\nexport function Heading({\n as: Tag = \"h2\",\n size,\n weight = \"semibold\",\n className,\n children,\n}: HeadingProps) {\n const resolvedSize = size ?? defaultSizeMap[Tag];\n\n return (\n <Tag\n className={twMerge(\n weightStyles[weight],\n \"text-(--color-text-primary)\",\n sizeStyles[resolvedSize],\n className,\n )}\n >\n {children}\n </Tag>\n );\n}\n\n/** Convenience: renders `<h1>` at 2xl size with bold weight */\nexport function H1(props: Omit<HeadingProps, \"as\">) {\n return (\n <Heading\n {...props}\n as=\"h1\"\n size={props.size ?? \"2xl\"}\n weight={props.weight ?? \"bold\"}\n />\n );\n}\n\n/** Convenience: renders `<h2>` at xl size */\nexport function H2(props: Omit<HeadingProps, \"as\">) {\n return <Heading {...props} as=\"h2\" size={props.size ?? \"xl\"} />;\n}\n\n/** Convenience: renders `<h3>` at lg size */\nexport function H3(props: Omit<HeadingProps, \"as\">) {\n return <Heading {...props} as=\"h3\" size={props.size ?? \"lg\"} />;\n}\n","import {\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\n\nexport type LinkVariant = \"default\" | \"subtle\";\n\nexport interface LinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Visual style variant */\n variant?: LinkVariant;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst variantStyles: Record<LinkVariant, string> = {\n default: [\n \"text-teal-700 underline\",\n \"hover:text-teal-800\",\n ].join(\" \"),\n subtle: [\n \"text-(--color-text-secondary) no-underline\",\n \"hover:underline hover:text-(--color-text-primary)\",\n ].join(\" \"),\n};\n\nexport function Link({\n variant = \"default\",\n className,\n ...props\n}: LinkProps) {\n return (\n <AriaLink\n {...props}\n className={[\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 focus-visible:rounded-sm\",\n variantStyles[variant],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import {\n Breadcrumbs as AriaBreadcrumbs,\n Breadcrumb as AriaBreadcrumb,\n Link,\n} from \"react-aria-components\";\nimport { ChevronRight } from \"lucide-react\";\n\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumbs({ items, className }: BreadcrumbsProps) {\n return (\n <nav\n aria-label=\"Breadcrumb\"\n className={className}\n >\n <AriaBreadcrumbs\n className=\"flex items-center gap-1 text-sm min-w-0\"\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <AriaBreadcrumb\n key={item.id}\n id={item.id}\n className={[\n \"flex items-center gap-1\",\n isLast ? \"min-w-0\" : \"shrink-0\",\n ].join(\" \")}\n >\n {isLast ? (\n <span className=\"font-medium text-(--color-text-primary) truncate\">\n {item.label}\n </span>\n ) : (\n <>\n <Link\n href={item.href}\n className=\"whitespace-nowrap text-(--color-text-secondary) outline-none transition-colors hover:text-(--color-text-primary) focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 focus-visible:rounded-sm\"\n >\n {item.label}\n </Link>\n <ChevronRight\n className=\"shrink-0 text-neutral-400\"\n size={16}\n aria-hidden=\"true\"\n />\n </>\n )}\n </AriaBreadcrumb>\n );\n })}\n </AriaBreadcrumbs>\n </nav>\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type Size,\n type ButtonVariant,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport type { ButtonVariant };\nexport type ButtonSize = Size;\n\nexport interface ButtonLinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: ButtonSize;\n /** Lucide icon rendered before children */\n iconLeft?: LucideIcon;\n /** Lucide icon rendered after children */\n iconRight?: LucideIcon;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst iconSizeMap = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"sm\",\n lg: \"md\",\n} as const;\n\nexport function ButtonLink({\n variant = \"primary\",\n size = \"md\",\n iconLeft,\n iconRight,\n className,\n children,\n ...props\n}: ButtonLinkProps) {\n return (\n <AriaLink\n {...props}\n className={twMerge(\n \"inline-flex items-center justify-center gap-2 cursor-pointer\",\n \"rounded-md\",\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n >\n {iconLeft && <Icon icon={iconLeft} size={iconSizeMap[size]} />}\n {children as React.ReactNode}\n {iconRight && <Icon icon={iconRight} size={iconSizeMap[size]} />}\n </AriaLink>\n );\n}\n\n// --- IconButtonLink ---\n\nexport interface IconButtonLinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Lucide icon to render */\n icon: LucideIcon;\n /** Required for accessibility — also used as tooltip content */\n \"aria-label\": string;\n /** Visual style variant */\n variant?: ButtonVariant;\n /** Size preset */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show tooltip on hover (default true) */\n showTooltip?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles = {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n} as const;\n\nexport function IconButtonLink({\n icon,\n \"aria-label\": ariaLabel,\n variant = \"ghost\",\n size = \"md\",\n showTooltip = true,\n className,\n ...props\n}: IconButtonLinkProps) {\n const link = (\n <AriaLink\n {...props}\n aria-label={ariaLabel}\n className={twMerge(\n \"inline-flex items-center justify-center cursor-pointer\",\n \"rounded-md\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n variantStyles[variant],\n squareSizeStyles[size],\n className,\n )}\n >\n <Icon icon={icon} size={iconSizeMap[size]} />\n </AriaLink>\n );\n\n if (showTooltip) {\n return (\n <Tooltip content={ariaLabel}>{link}</Tooltip>\n );\n }\n\n return link;\n}\n","import {\n ToggleButton as AriaToggleButton,\n type ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type Size, sizeStyles } from \"../_shared/styles\";\n\nexport type ToggleButtonVariant = \"default\" | \"primary\" | \"outlined\";\nexport type ToggleButtonSize = Size;\n\nexport interface ToggleButtonProps\n extends Omit<AriaToggleButtonProps, \"className\"> {\n /** Visual style variant */\n variant?: ToggleButtonVariant;\n /** Size preset */\n size?: ToggleButtonSize;\n /** Use fixed square dimensions instead of padding-based sizing */\n isSquare?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles: Record<ToggleButtonSize, string> = {\n xs: \"h-6 w-6 text-xs\",\n sm: \"h-7 w-7 text-sm\",\n md: \"h-8 w-8 text-base\",\n lg: \"h-10 w-10 text-lg\",\n};\n\nconst variantStyles: Record<ToggleButtonVariant, { base: string; selected: string }> = {\n default: {\n base: [\n \"bg-transparent text-(--color-text-primary)\",\n \"hover:bg-(--color-surface-hover)\",\n \"pressed:bg-(--color-surface-pressed)\",\n ].join(\" \"),\n selected: \"bg-(--color-surface-pressed) text-(--color-text-primary)\",\n },\n primary: {\n base: [\n \"bg-transparent text-(--color-text-primary)\",\n \"hover:bg-(--color-surface-hover)\",\n \"pressed:bg-(--color-surface-pressed)\",\n ].join(\" \"),\n selected: \"bg-(--color-action-primary-active) text-(--color-text-inverse)\",\n },\n outlined: {\n base: [\n \"bg-(--color-surface-default) text-(--color-text-primary)\",\n \"border border-(--color-border-default)\",\n \"hover:bg-(--color-surface-subtle)\",\n \"pressed:bg-(--color-surface-muted)\",\n ].join(\" \"),\n selected: [\n \"bg-neutral-800 text-(--color-text-inverse)\",\n \"border border-neutral-800\",\n ].join(\" \"),\n },\n};\n\nexport function ToggleButton({\n variant = \"default\",\n size = \"md\",\n isSquare = false,\n className,\n ...props\n}: ToggleButtonProps) {\n const styles = variantStyles[variant];\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected }) =>\n twMerge(\n \"inline-flex items-center justify-center gap-2 cursor-pointer\",\n isSquare ? \"rounded-none\" : \"rounded-md\",\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isSquare ? squareSizeStyles[size] : sizeStyles[size],\n isSelected ? styles.selected : styles.base,\n className,\n )\n }\n />\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToggleButtonGroupSize = \"sm\" | \"md\" | \"lg\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface ToggleButtonGroupContextValue {\n size: ToggleButtonGroupSize;\n}\n\nconst ToggleButtonGroupContext = createContext<ToggleButtonGroupContextValue>({\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Size maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<ToggleButtonGroupSize, string> = {\n sm: \"px-2.5 py-1 text-xs gap-1\",\n md: \"px-3 py-1.5 text-sm gap-1.5\",\n lg: \"px-4 py-2 text-base gap-2\",\n};\n\nconst iconOnlySizeStyles: Record<ToggleButtonGroupSize, string> = {\n sm: \"p-1\",\n md: \"p-1.5\",\n lg: \"p-2\",\n};\n\n// ---------------------------------------------------------------------------\n// ToggleButtonGroup\n// ---------------------------------------------------------------------------\n\nexport interface ToggleButtonGroupProps\n extends Omit<AriaRadioGroupProps, \"className\" | \"children\" | \"orientation\"> {\n /** Size preset for all items */\n size?: ToggleButtonGroupSize;\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function ToggleButtonGroup({\n size = \"md\",\n className,\n children,\n ...props\n}: ToggleButtonGroupProps) {\n return (\n <ToggleButtonGroupContext.Provider value={{ size }}>\n <AriaRadioGroup\n {...props}\n orientation=\"horizontal\"\n className={twMerge(\n \"inline-flex items-center rounded-lg border border-(--color-border-default) bg-(--color-surface-muted) p-0.5 gap-0.5\",\n className,\n )}\n >\n {children}\n </AriaRadioGroup>\n </ToggleButtonGroupContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ToggleButtonGroupItem\n// ---------------------------------------------------------------------------\n\nexport interface ToggleButtonGroupItemProps\n extends Omit<AriaRadioProps, \"className\" | \"children\"> {\n /** Label content — text or icon */\n children: ReactNode;\n /** When true, applies square icon-only sizing */\n isIconOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function ToggleButtonGroupItem({\n children,\n isIconOnly,\n className,\n ...props\n}: ToggleButtonGroupItemProps) {\n const { size } = useContext(ToggleButtonGroupContext);\n\n return (\n <AriaRadio\n {...props}\n className={({ isSelected, isHovered, isPressed, isDisabled }) =>\n twMerge(\n // Base layout\n \"inline-flex items-center justify-center\",\n \"rounded-md\",\n \"font-medium\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-1\",\n\n // Disabled\n isDisabled && \"opacity-50 pointer-events-none\",\n\n // Size\n isIconOnly ? iconOnlySizeStyles[size] : sizeStyles[size],\n\n // Selected state\n isSelected\n ? \"bg-(--color-surface-default) text-(--color-text-primary) shadow-sm font-semibold\"\n : isPressed\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : isHovered\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : \"bg-transparent text-(--color-text-secondary)\",\n\n className,\n )\n }\n >\n {children}\n </AriaRadio>\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { Selection } from \"react-aria-components\";\nimport {\n MenuTrigger,\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n Popover,\n} from \"react-aria-components\";\nimport { Icon } from \"../Icon\";\n\nexport interface MenuItemData {\n id: string;\n label: string;\n icon?: LucideIcon;\n onAction?: () => void;\n /** When set, renders the menu item as a navigational link */\n href?: string;\n /** Link target, e.g. \"_blank\" for external links */\n target?: string;\n isDisabled?: boolean;\n isDanger?: boolean;\n /** Optional end content rendered after the label (e.g. badge, shortcut hint) */\n endContent?: React.ReactNode;\n}\n\nexport interface MenuProps {\n /** Items for simple flat menus (backward compat). Mutually exclusive with content. */\n items?: MenuItemData[];\n /** Menu content for composition mode — MenuSection, MenuItem, MenuSeparator */\n content?: React.ReactNode;\n /** Trigger element (typically a Button or IconButton) */\n children: React.ReactNode;\n /** Called when any MenuItem is activated (receives the item key) */\n onAction?: (key: string) => void;\n /** Selection mode: \"none\" (default), \"single\", or \"multiple\" for checkbox-style items */\n selectionMode?: \"none\" | \"single\" | \"multiple\";\n /** Currently selected keys (controlled) */\n selectedKeys?: Selection;\n /** Default selected keys (uncontrolled) */\n defaultSelectedKeys?: Selection;\n /** Called when selection changes */\n onSelectionChange?: (keys: Selection) => void;\n /** Additional CSS classes for the menu popover */\n className?: string;\n}\n\nconst popoverStyles = [\n \"bg-(--color-surface-default) rounded-md\",\n \"shadow-lg border border-(--color-border-default)\",\n \"py-1 min-w-48\",\n \"entering:animate-in entering:fade-in entering:zoom-in-95\",\n \"exiting:animate-out exiting:fade-out exiting:zoom-out-95\",\n].join(\" \");\n\nexport function Menu({\n items,\n content,\n children,\n onAction,\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n className,\n}: MenuProps) {\n const selectionProps = selectionMode && selectionMode !== \"none\"\n ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange }\n : {};\n\n return (\n <MenuTrigger>\n {children}\n <Popover\n className={[popoverStyles, className].filter(Boolean).join(\" \")}\n >\n {items ? (\n <AriaMenu\n items={items}\n onAction={(key) => {\n const item = items.find((i) => i.id === key);\n item?.onAction?.();\n onAction?.(key as string);\n }}\n {...selectionProps}\n className=\"outline-none\"\n >\n {(item) => (\n <AriaMenuItem\n id={item.id}\n href={item.href}\n target={item.target}\n isDisabled={item.isDisabled}\n className={[\n \"flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default\",\n \"transition-colors\",\n \"focus:bg-(--color-surface-muted)\",\n \"hover:bg-(--color-surface-muted)\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n item.isDanger\n ? \"text-(--color-text-danger)\"\n : \"text-(--color-text-primary)\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.icon && <Icon icon={item.icon} size=\"sm\" />}\n <span className=\"flex-1\">{item.label}</span>\n {item.endContent && (\n <span className=\"ml-auto flex items-center\">\n {item.endContent}\n </span>\n )}\n </AriaMenuItem>\n )}\n </AriaMenu>\n ) : (\n <AriaMenu\n onAction={(key) => onAction?.(key as string)}\n {...selectionProps}\n className=\"outline-none\"\n >\n {content}\n </AriaMenu>\n )}\n </Popover>\n </MenuTrigger>\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { MenuItem as AriaMenuItem } from \"react-aria-components\";\nimport { Icon } from \"../Icon\";\n\nexport interface MenuItemProps {\n id: string;\n /** Item label */\n children: React.ReactNode;\n icon?: LucideIcon;\n /** End-slot content: badges, shortcuts, chevrons */\n endContent?: React.ReactNode;\n onAction?: () => void;\n href?: string;\n target?: string;\n isDisabled?: boolean;\n isDanger?: boolean;\n /** Accessible text override for complex children */\n textValue?: string;\n className?: string;\n}\n\nexport function MenuItem({\n id,\n children,\n icon,\n endContent,\n onAction,\n href,\n target,\n isDisabled,\n isDanger,\n textValue,\n className,\n}: MenuItemProps) {\n return (\n <AriaMenuItem\n id={id}\n href={href}\n target={target}\n isDisabled={isDisabled}\n onAction={onAction}\n textValue={textValue}\n className={[\n \"flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default\",\n \"transition-colors\",\n \"focus:bg-(--color-surface-muted)\",\n \"hover:bg-(--color-surface-muted)\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isDanger\n ? \"text-(--color-text-danger)\"\n : \"text-(--color-text-primary)\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && <Icon icon={icon} size=\"sm\" />}\n <span className=\"flex-1\">{children}</span>\n {endContent && (\n <span className=\"ml-auto flex items-center\">{endContent}</span>\n )}\n </AriaMenuItem>\n );\n}\n","import type React from \"react\";\nimport { MenuItem as AriaMenuItem } from \"react-aria-components\";\nimport { Check } from \"lucide-react\";\n\nexport interface MenuCheckboxItemProps {\n id: string;\n /** Item label */\n children: React.ReactNode;\n /** Accessible text override for complex children */\n textValue?: string;\n isDisabled?: boolean;\n className?: string;\n}\n\nexport function MenuCheckboxItem({\n id,\n children,\n textValue,\n isDisabled,\n className,\n}: MenuCheckboxItemProps) {\n return (\n <AriaMenuItem\n id={id}\n textValue={textValue}\n isDisabled={isDisabled}\n className={({ isSelected }) =>\n [\n \"flex items-center gap-2 px-3 py-2 text-sm outline-none cursor-default\",\n \"transition-colors\",\n \"focus:bg-(--color-surface-muted)\",\n \"hover:bg-(--color-surface-muted)\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"text-(--color-text-primary)\",\n isSelected ? \"font-medium\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")\n }\n >\n {({ isSelected }) => (\n <>\n <span className=\"flex items-center justify-center w-4 h-4 shrink-0\">\n {isSelected && (\n <Check size={14} className=\"text-(--color-action-primary)\" aria-hidden=\"true\" />\n )}\n </span>\n <span className=\"flex-1\">{children}</span>\n </>\n )}\n </AriaMenuItem>\n );\n}\n","import type React from \"react\";\nimport {\n MenuSection as AriaMenuSection,\n Header,\n} from \"react-aria-components\";\n\nexport interface MenuSectionProps {\n /** Optional section header — string renders as styled text, ReactNode for custom */\n header?: React.ReactNode;\n /** MenuItems within this section */\n children: React.ReactNode;\n /** Accessible label for the section group (useful when header is absent or non-textual) */\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function MenuSection({\n header,\n children,\n \"aria-label\": ariaLabel,\n className,\n}: MenuSectionProps) {\n return (\n <AriaMenuSection className={className} aria-label={ariaLabel}>\n {header && (\n <Header\n className={[\n \"px-3 py-1.5\",\n \"text-xs font-semibold\",\n \"text-(--color-text-secondary)\",\n \"uppercase tracking-wider\",\n \"select-none\",\n ].join(\" \")}\n >\n {header}\n </Header>\n )}\n {children}\n </AriaMenuSection>\n );\n}\n","import type React from \"react\";\nimport { Header } from \"react-aria-components\";\n\nexport interface MenuHeaderProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function MenuHeader({ children, className }: MenuHeaderProps) {\n return <Header className={className}>{children}</Header>;\n}\n","import { Separator } from \"react-aria-components\";\n\nexport interface MenuSeparatorProps {\n className?: string;\n}\n\nexport function MenuSeparator({ className }: MenuSeparatorProps) {\n return (\n <Separator\n className={[\n \"border-t border-(--color-border-default) my-1\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import type React from \"react\";\nimport {\n DialogTrigger,\n Popover as AriaPopover,\n Button as AriaButton,\n type PopoverProps as AriaPopoverProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface PopoverProps {\n /** Controls open state (uncontrolled by default via DialogTrigger) */\n isOpen?: boolean;\n /** Called when open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n children: React.ReactNode;\n}\n\n/** Provides open/close state to a paired PopoverTrigger and PopoverContent. */\nexport function Popover({ children, isOpen, onOpenChange }: PopoverProps) {\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </DialogTrigger>\n );\n}\n\nexport interface PopoverTriggerProps {\n children: React.ReactNode;\n /** Additional CSS classes for the trigger wrapper */\n className?: string;\n}\n\n/** Wraps its child in an AriaButton so it can toggle the parent Popover. */\nexport function PopoverTrigger({ children, className }: PopoverTriggerProps) {\n const cx = `\n inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer\n focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:rounded-sm\n `;\n\n return <AriaButton className={twMerge(cx, className)}>{children}</AriaButton>;\n}\n\nexport interface PopoverContentProps {\n placement?: AriaPopoverProps[\"placement\"];\n offset?: number;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Floating panel anchored to the trigger. Provides focus trap,\n * Escape-to-close, focus restore, and outside-click dismiss via RAC's\n * Popover (no Dialog wrapper needed for those behaviors).\n */\nexport function PopoverContent({\n placement = \"bottom\",\n offset: offsetPx = 8,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n const cx = `\n z-50\n bg-(--color-surface-default)\n border border-(--color-border-default)\n rounded-md shadow-lg\n entering:animate-in entering:fade-in entering:duration-300\n exiting:animate-out exiting:fade-out exiting:duration-300\n entering:placement-top:slide-in-from-bottom-1\n entering:placement-bottom:slide-in-from-top-1\n entering:placement-left:slide-in-from-right-1\n entering:placement-right:slide-in-from-left-1\n `;\n return (\n <AriaPopover\n {...rest}\n placement={placement}\n offset={offsetPx}\n className={twMerge(cx, className)}\n >\n {children}\n </AriaPopover>\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n type TabsProps as AriaTabsProps,\n type TabListProps as AriaTabListProps,\n type TabProps as AriaTabProps,\n type TabPanelProps as AriaTabPanelProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type TabsVariant = \"underline\" | \"pills\" | \"unstyled\";\nexport type TabsSize = \"sm\" | \"md\" | \"lg\";\n\ninterface TabsContextValue {\n variant: TabsVariant;\n size: TabsSize;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: \"underline\",\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Style maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<TabsSize, string> = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\n// ---------------------------------------------------------------------------\n// Tabs (root)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps\n extends Omit<AriaTabsProps, \"className\" | \"orientation\"> {\n /** Visual style variant */\n variant?: TabsVariant;\n /** Size preset */\n size?: TabsSize;\n /** Layout orientation */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function Tabs({\n variant = \"underline\",\n size = \"md\",\n orientation = \"horizontal\",\n className,\n children,\n ...props\n}: TabsProps) {\n return (\n <TabsContext.Provider value={{ variant, size }}>\n <AriaTabs\n {...props}\n orientation={orientation}\n className={twMerge(\n orientation === \"vertical\" ? \"flex\" : \"\",\n className,\n )}\n >\n {children}\n </AriaTabs>\n </TabsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabList\n// ---------------------------------------------------------------------------\n\nexport interface TabListProps<T extends object>\n extends Omit<AriaTabListProps<T>, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabList<T extends object>({\n className,\n ...props\n}: TabListProps<T>) {\n const { variant } = useContext(TabsContext);\n\n const baseStyles =\n variant === \"unstyled\"\n ? \"flex items-center\"\n : variant === \"underline\"\n ? \"flex items-center border-b border-(--color-border-default)\"\n : \"inline-flex items-center bg-(--color-surface-muted) rounded-lg p-1 gap-1\";\n\n // Vertical orientation overrides\n const verticalStyles =\n variant === \"unstyled\"\n ? \"flex-col\"\n : variant === \"underline\"\n ? \"flex-col border-b-0 border-r border-(--color-border-default)\"\n : \"flex-col\";\n\n return (\n <AriaTabList\n {...props}\n className={({ orientation }) =>\n twMerge(\n baseStyles,\n orientation === \"vertical\" ? verticalStyles : \"\",\n className,\n )\n }\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tab\n// ---------------------------------------------------------------------------\n\nexport interface TabProps extends Omit<AriaTabProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function Tab({ className, ...props }: TabProps) {\n const { variant, size } = useContext(TabsContext);\n\n return (\n <AriaTab\n {...props}\n className={({ isSelected, isDisabled, isHovered, isPressed }) => {\n if (variant === \"unstyled\") {\n return twMerge(\n \"cursor-pointer outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n className,\n );\n }\n\n return twMerge(\n // Base\n \"cursor-pointer outline-none transition-colors\",\n \"font-medium\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2\",\n\n // Disabled\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n\n // Size\n sizeStyles[size],\n\n // Variant-specific styles\n ...getTabVariantStyles(variant, {\n isSelected,\n isHovered,\n isPressed,\n isDisabled,\n }),\n\n className,\n );\n }}\n />\n );\n}\n\nfunction getTabVariantStyles(\n variant: TabsVariant,\n state: {\n isSelected: boolean;\n isHovered: boolean;\n isPressed: boolean;\n isDisabled: boolean;\n },\n): string[] {\n if (variant === \"underline\") {\n return [\n // Shape\n \"relative rounded-t-(--border-radius-sm)\",\n\n // Color states\n state.isSelected\n ? [\n \"text-teal-700 font-semibold\",\n // Bottom indicator via pseudo-element\n \"after:absolute after:bottom-[-1px] after:left-0 after:right-0 after:h-0.5 after:bg-teal-600\",\n ].join(\" \")\n : state.isPressed\n ? \"text-(--color-text-primary) bg-(--color-surface-muted)\"\n : state.isHovered\n ? \"text-(--color-text-primary) bg-(--color-surface-subtle)\"\n : \"text-(--color-text-secondary) bg-transparent\",\n ];\n }\n\n // Pills variant\n return [\n // Shape\n \"rounded-md\",\n\n // Color states\n state.isSelected\n ? \"text-(--color-text-primary) font-semibold bg-(--color-surface-default) shadow-sm\"\n : state.isPressed\n ? \"text-(--color-text-primary) bg-(--color-surface-subtle) shadow-none\"\n : state.isHovered\n ? \"text-(--color-text-primary) bg-(--color-surface-pressed)\"\n : \"text-(--color-text-secondary) bg-transparent\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// TabPanel\n// ---------------------------------------------------------------------------\n\nexport interface TabPanelProps extends Omit<AriaTabPanelProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabPanel({ className, ...props }: TabPanelProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <AriaTabPanel\n {...props}\n className={twMerge(\n variant === \"unstyled\" ? \"outline-none\" : \"mt-4 outline-none\",\n className,\n )}\n />\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n ToggleButtonGroup as AriaToggleButtonGroup,\n ToggleButton as AriaToggleButton,\n type ToggleButtonGroupProps as AriaToggleButtonGroupProps,\n type ToggleButtonProps as AriaToggleButtonProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type SegmentedControlSize = \"sm\" | \"md\" | \"lg\";\nexport type SegmentedControlSelectionMode = \"single\" | \"none\";\n\ninterface SegmentedControlContextValue {\n size: SegmentedControlSize;\n}\n\nconst SegmentedControlContext = createContext<SegmentedControlContextValue>({\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Size maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<SegmentedControlSize, string> = {\n sm: \"px-2.5 py-1 text-xs\",\n md: \"px-3 py-1.5 text-sm\",\n lg: \"px-4 py-2 text-base\",\n};\n\n// ---------------------------------------------------------------------------\n// SegmentedControl (group)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlProps\n extends Omit<\n AriaToggleButtonGroupProps,\n \"className\" | \"selectionMode\" | \"selectedKeys\" | \"defaultSelectedKeys\" | \"onSelectionChange\"\n > {\n /** Size preset for all items */\n size?: SegmentedControlSize;\n /** Selection behavior: \"single\" keeps one item selected, \"none\" means buttons fire actions without staying selected */\n selectionMode?: SegmentedControlSelectionMode;\n /** The currently selected keys (controlled, only for selectionMode=\"single\") */\n selectedKeys?: Iterable<Key>;\n /** The initial selected keys (uncontrolled, only for selectionMode=\"single\") */\n defaultSelectedKeys?: Iterable<Key>;\n /** Called when selection changes (only for selectionMode=\"single\") */\n onSelectionChange?: (keys: Set<Key>) => void;\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function SegmentedControl({\n size = \"md\",\n selectionMode = \"single\",\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n className,\n children,\n ...props\n}: SegmentedControlProps) {\n // For \"none\" mode: pass selectionMode=\"single\" to RAC but force selection to empty\n const isNoneMode = selectionMode === \"none\";\n\n return (\n <SegmentedControlContext.Provider value={{ size }}>\n <AriaToggleButtonGroup\n {...props}\n selectionMode=\"single\"\n selectedKeys={isNoneMode ? new Set<Key>() : selectedKeys}\n defaultSelectedKeys={isNoneMode ? undefined : defaultSelectedKeys}\n onSelectionChange={isNoneMode ? undefined : onSelectionChange}\n className={twMerge(\n \"inline-flex items-center rounded-lg border border-(--color-border-default) bg-(--color-surface-muted) p-0.5 gap-0.5\",\n className,\n )}\n >\n {children}\n </AriaToggleButtonGroup>\n </SegmentedControlContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedControlItem (button)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlItemProps\n extends Omit<AriaToggleButtonProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function SegmentedControlItem({\n className,\n ...props\n}: SegmentedControlItemProps) {\n const { size } = useContext(SegmentedControlContext);\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected, isHovered, isPressed, isDisabled }) =>\n twMerge(\n // Base layout\n \"inline-flex items-center justify-center\",\n \"rounded-md\",\n \"font-medium\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-1\",\n\n // Disabled\n isDisabled && \"opacity-50 pointer-events-none\",\n\n // Size\n sizeStyles[size],\n\n // Selected state\n isSelected\n ? \"bg-(--color-surface-default) text-(--color-text-primary) shadow-sm font-semibold\"\n : isPressed\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : isHovered\n ? \"bg-(--color-surface-subtle) text-(--color-text-primary)\"\n : \"bg-transparent text-(--color-text-secondary)\",\n\n className,\n )\n }\n />\n );\n}\n","import type React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type BadgeVariant =\n | \"neutral\"\n | \"purple\"\n | \"teal\"\n | \"rose\"\n | \"slate\"\n | \"green\"\n | \"amber\";\n\nexport type BadgeSize = \"sm\" | \"md\";\n\nexport interface BadgeProps {\n /** Badge text content */\n children: React.ReactNode;\n /** Color variant */\n variant?: BadgeVariant;\n /** Size preset */\n size?: BadgeSize;\n /** Optional leading icon */\n icon?: LucideIcon;\n /** Merge override */\n className?: string;\n}\n\nconst variantStyles: Record<BadgeVariant, string> = {\n neutral:\n \"bg-(--color-badge-neutral-bg) text-(--color-badge-neutral-text)\",\n purple:\n \"bg-(--color-badge-purple-bg) text-(--color-badge-purple-text)\",\n teal: \"bg-(--color-badge-teal-bg) text-(--color-badge-teal-text)\",\n rose: \"bg-(--color-badge-rose-bg) text-(--color-badge-rose-text)\",\n slate:\n \"bg-(--color-badge-slate-bg) text-(--color-badge-slate-text)\",\n green:\n \"bg-(--color-badge-green-bg) text-(--color-badge-green-text)\",\n amber:\n \"bg-(--color-badge-amber-bg) text-(--color-badge-amber-text)\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n sm: \"px-1.5 py-0.5\",\n md: \"px-2 py-0.5\",\n};\n\nconst iconSizeMap: Record<BadgeSize, number> = {\n sm: 12,\n md: 14,\n};\n\nexport function Badge({\n children,\n variant = \"neutral\",\n size = \"sm\",\n icon: IconComponent,\n className,\n}: BadgeProps) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 rounded-full\",\n \"text-xs font-medium leading-tight\",\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n >\n {IconComponent && (\n <IconComponent size={iconSizeMap[size]} aria-hidden=\"true\" />\n )}\n {children}\n </span>\n );\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface CardProps {\n /** Card body content */\n children: React.ReactNode;\n /** Optional header content */\n header?: React.ReactNode;\n /** Optional footer content (rendered with top border separator) */\n footer?: React.ReactNode;\n /** Body padding preset */\n padding?: CardPadding;\n /** Makes the card a clickable link */\n href?: string;\n /** Handler for click/press interaction (use instead of href for programmatic navigation) */\n onPress?: () => void;\n /** Enables hover elevation even without href */\n interactive?: boolean;\n /** Merge override */\n className?: string;\n}\n\nconst paddingStyles: Record<CardPadding, string> = {\n none: \"p-0\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n};\n\nexport function Card({\n children,\n header,\n footer,\n padding = \"md\",\n href,\n onPress,\n interactive = false,\n className,\n}: CardProps) {\n const isInteractive = interactive || !!href || !!onPress;\n\n const containerClass = twMerge(\n \"bg-(--color-surface-default) border border-(--color-border-default) rounded-lg overflow-hidden shadow-sm\",\n isInteractive && \"transition-all hover:shadow-md hover:border-(--color-border-focus) cursor-pointer\",\n (href || onPress) && \"block focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (onPress && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onPress();\n }\n },\n [onPress],\n );\n\n const content = (\n <>\n {header && (\n <div\n className={twMerge(\n \"border-b border-(--color-border-default)\",\n paddingStyles[padding],\n )}\n >\n {header}\n </div>\n )}\n <div className={paddingStyles[padding]}>{children}</div>\n {footer && (\n <div\n className={twMerge(\n \"border-t border-(--color-border-default)\",\n paddingStyles[padding],\n )}\n >\n {footer}\n </div>\n )}\n </>\n );\n\n if (href) {\n return (\n <a href={href} className={containerClass}>\n {content}\n </a>\n );\n }\n\n if (onPress) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={containerClass}\n onClick={onPress}\n onKeyDown={handleKeyDown}\n >\n {content}\n </div>\n );\n }\n\n return <div className={containerClass}>{content}</div>;\n}\n","import type React from \"react\";\nimport { ArrowUp, ArrowDown, Minus } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type DeltaFormat = \"currency\" | \"percentage\" | \"combined\";\nexport type DeltaMode = \"inline\" | \"pill\";\n\nexport interface DeltaIndicatorProps {\n /** Current period value */\n current: number;\n /** Comparison period value */\n previous: number;\n /** Display format */\n format?: DeltaFormat;\n /** Display mode: inline (no background) or pill (tinted background) */\n mode?: DeltaMode;\n /** Optional prefix label (e.g., \"MoM\", \"YoY\") */\n label?: string;\n /** When true, increase = green, decrease = red (for metrics where higher is better) */\n reverseColor?: boolean;\n /** Renders \"N/A\" in muted text */\n unavailable?: boolean;\n /** Custom unavailable text */\n unavailableText?: string;\n /** Merge override */\n className?: string;\n}\n\ntype Direction = \"increase\" | \"decrease\" | \"flat\";\n\nfunction getDirection(current: number, previous: number): Direction {\n const diff = current - previous;\n if (diff > 0) return \"increase\";\n if (diff < 0) return \"decrease\";\n return \"flat\";\n}\n\nfunction formatCurrency(value: number): string {\n const abs = Math.abs(value);\n const sign = value >= 0 ? \"+\" : \"-\";\n if (abs < 1000) {\n return `${sign}$${abs.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n return `${sign}$${abs.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`;\n}\n\nfunction formatPercentage(current: number, previous: number): string | null {\n if (previous === 0) return null;\n const pct = ((current - previous) / Math.abs(previous)) * 100;\n const sign = pct >= 0 ? \"+\" : \"\";\n return `${sign}${pct.toFixed(1)}%`;\n}\n\nconst directionColors: Record<Direction, string> = {\n increase: \"text-(--color-delta-increase-text)\",\n decrease: \"text-(--color-delta-decrease-text)\",\n flat: \"text-(--color-delta-flat-text)\",\n};\n\nconst reverseDirectionColors: Record<Direction, string> = {\n increase: \"text-(--color-delta-decrease-text)\",\n decrease: \"text-(--color-delta-increase-text)\",\n flat: \"text-(--color-delta-flat-text)\",\n};\n\nconst directionIcons: Record<Direction, React.ComponentType<{ size: number; \"aria-hidden\": boolean }>> = {\n increase: ArrowUp,\n decrease: ArrowDown,\n flat: Minus,\n};\n\nconst directionBgColors: Record<Direction, string> = {\n increase: \"bg-(--color-delta-increase-bg)\",\n decrease: \"bg-(--color-delta-decrease-bg)\",\n flat: \"bg-(--color-delta-flat-bg)\",\n};\n\nexport function DeltaIndicator({\n current,\n previous,\n format = \"combined\",\n mode = \"inline\",\n label,\n reverseColor = false,\n unavailable = false,\n unavailableText = \"N/A\",\n className,\n}: DeltaIndicatorProps) {\n if (unavailable) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n \"text-(--color-text-tertiary)\",\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-(--color-text-secondary) mr-1\">\n {label}\n </span>\n )}\n {unavailableText}\n </span>\n );\n }\n\n const diff = current - previous;\n const direction = getDirection(current, previous);\n const colorStyles = reverseColor\n ? reverseDirectionColors[direction]\n : directionColors[direction];\n const IconComponent = directionIcons[direction];\n\n const isNew = previous === 0 && current > 0;\n\n let valueText: string;\n if (format === \"currency\") {\n valueText = formatCurrency(diff);\n if (isNew) valueText = `${formatCurrency(diff)} (new)`;\n } else if (format === \"percentage\") {\n const pct = formatPercentage(current, previous);\n valueText = pct ?? formatCurrency(diff);\n if (isNew) valueText = \"New\";\n } else {\n // combined\n const pct = formatPercentage(current, previous);\n if (isNew) {\n valueText = `${formatCurrency(diff)} (new)`;\n } else if (pct) {\n valueText = `${formatCurrency(diff)} (${pct})`;\n } else {\n valueText = formatCurrency(diff);\n }\n }\n\n const isPill = mode === \"pill\";\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n colorStyles,\n isPill && [\n \"rounded-full px-2 py-0.5\",\n \"text-xs\",\n directionBgColors[direction],\n ],\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-(--color-text-secondary) mr-1\">\n {label}\n </span>\n )}\n <IconComponent size={14} aria-hidden={true} />\n {valueText}\n </span>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\n\nexport type ProgressBarVariant =\n | \"brand\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\nexport type ProgressBarSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ProgressBarProps {\n /** Percentage value (0-100) */\n value: number;\n /** Label text above the bar */\n label?: string;\n /** Description text (right-aligned, above bar) */\n description?: string;\n /** Fill color variant */\n variant?: ProgressBarVariant;\n /** Bar height */\n size?: ProgressBarSize;\n /** Show percentage text */\n showValue?: boolean;\n /** Merge override */\n className?: string;\n}\n\nconst fillStyles: Record<ProgressBarVariant, string> = {\n brand: \"bg-(--color-progress-fill)\",\n success: \"bg-(--color-progress-fill-success)\",\n warning: \"bg-(--color-progress-fill-warning)\",\n danger: \"bg-(--color-progress-fill-danger)\",\n neutral: \"bg-(--color-text-secondary)\",\n};\n\nconst sizeStyles: Record<ProgressBarSize, string> = {\n sm: \"h-1.5\",\n md: \"h-3\",\n lg: \"h-4\",\n};\n\nexport function ProgressBar({\n value,\n label,\n description,\n variant = \"brand\",\n size = \"md\",\n showValue = true,\n className,\n}: ProgressBarProps) {\n const clampedValue = Math.min(100, Math.max(0, value));\n\n return (\n <div className={twMerge(\"w-full\", className)}>\n {(label || description || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium text-(--color-text-primary)\">\n {label}\n </span>\n <span className=\"text-sm text-(--color-text-secondary)\">\n {description ?? (showValue ? `${clampedValue}%` : null)}\n </span>\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ?? \"Progress\"}\n className={twMerge(\n \"w-full rounded-full bg-(--color-progress-track)\",\n sizeStyles[size],\n )}\n >\n <div\n className={twMerge(\n \"h-full rounded-full transition-all duration-300\",\n fillStyles[variant],\n )}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport {\n Info,\n AlertTriangle,\n AlertCircle,\n CheckCircle2,\n X,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type BannerVariant = \"info\" | \"warning\" | \"danger\" | \"success\";\n\nexport interface BannerProps {\n /** Banner content */\n children: ReactNode;\n /** Visual variant */\n variant?: BannerVariant;\n /** Bold lead text */\n title?: string;\n /** Leading icon (auto-selected per variant if not set) */\n icon?: LucideIcon;\n /** Shows dismiss button */\n dismissible?: boolean;\n /** Dismiss callback */\n onDismiss?: () => void;\n /** Merge override */\n className?: string;\n}\n\nconst variantConfig: Record<\n BannerVariant,\n { icon: LucideIcon; containerClass: string; iconClass: string; role: string }\n> = {\n info: {\n icon: Info,\n containerClass:\n \"bg-(--color-banner-info-bg) border-(--color-banner-info-border) text-(--color-banner-info-text)\",\n iconClass: \"text-(--color-banner-info-icon)\",\n role: \"status\",\n },\n warning: {\n icon: AlertTriangle,\n containerClass:\n \"bg-(--color-banner-warning-bg) border-(--color-banner-warning-border) text-(--color-banner-warning-text)\",\n iconClass: \"text-(--color-banner-warning-icon)\",\n role: \"alert\",\n },\n danger: {\n icon: AlertCircle,\n containerClass:\n \"bg-(--color-banner-danger-bg) border-(--color-banner-danger-border) text-(--color-banner-danger-text)\",\n iconClass: \"text-(--color-banner-danger-icon)\",\n role: \"alert\",\n },\n success: {\n icon: CheckCircle2,\n containerClass:\n \"bg-(--color-banner-success-bg) border-(--color-banner-success-border) text-(--color-banner-success-text)\",\n iconClass: \"text-(--color-banner-success-icon)\",\n role: \"status\",\n },\n};\n\nexport function Banner({\n children,\n variant = \"info\",\n title,\n icon,\n dismissible = false,\n onDismiss,\n className,\n}: BannerProps) {\n const [dismissed, setDismissed] = useState(false);\n\n if (dismissed) return null;\n\n const config = variantConfig[variant];\n const IconComponent = icon ?? config.icon;\n\n const handleDismiss = () => {\n setDismissed(true);\n onDismiss?.();\n };\n\n return (\n <div\n role={config.role}\n className={twMerge(\n \"flex items-start gap-3 rounded-lg border px-4 py-3\",\n \"text-sm\",\n config.containerClass,\n className,\n )}\n >\n <IconComponent\n size={20}\n className={twMerge(\"shrink-0 mt-0.5\", config.iconClass)}\n aria-hidden=\"true\"\n />\n <div className=\"flex-1\">\n {title && (\n <span className=\"font-medium\">\n {title}\n {\" \\u2014 \"}\n </span>\n )}\n {children}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n onClick={handleDismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <X size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type MetricCardSize = \"sm\" | \"md\";\n\nexport interface MetricCardProps {\n /** Metric label (e.g., \"Total Spend\") */\n label: React.ReactNode;\n /** Primary value (formatted string or component) */\n value: React.ReactNode;\n /** Secondary content rendered below the value */\n secondary?: React.ReactNode;\n /** Makes the entire card a clickable link */\n href?: string;\n /** Size preset */\n size?: MetricCardSize;\n /** Merge override */\n className?: string;\n}\n\nconst sizeConfig: Record<\n MetricCardSize,\n { padding: string; labelClass: string; valueClass: string }\n> = {\n sm: {\n padding: \"p-3\",\n labelClass: \"text-xs\",\n valueClass: \"text-xl\",\n },\n md: {\n padding: \"p-4\",\n labelClass: \"text-sm\",\n valueClass: \"text-2xl\",\n },\n};\n\nexport function MetricCard({\n label,\n value,\n secondary,\n href,\n size = \"md\",\n className,\n}: MetricCardProps) {\n const config = sizeConfig[size];\n\n const containerClass = twMerge(\n \"bg-(--color-surface-default) border border-(--color-border-default) rounded-lg shadow-sm\",\n config.padding,\n href &&\n \"block transition-shadow hover:shadow-md hover:border-(--color-border-focus) focus-visible:ring-2 focus-visible:ring-(--color-border-focus) focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n const content = (\n <>\n <div className={twMerge(config.labelClass, \"text-(--color-text-secondary)\")}>\n {label}\n </div>\n <div\n className={twMerge(\n config.valueClass,\n \"font-semibold text-(--color-text-primary) mt-1 tabular-nums\",\n )}\n >\n {value}\n </div>\n {secondary && <div className=\"mt-1 text-sm\">{secondary}</div>}\n </>\n );\n\n if (href) {\n return (\n <a href={href} className={containerClass}>\n {content}\n </a>\n );\n }\n\n return <div className={containerClass}>{content}</div>;\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { H2 } from \"../Heading\";\n\nexport interface SectionHeaderProps {\n /** Section title rendered as an H2 heading */\n title: string;\n /** Optional action elements (buttons, badges, etc.) rendered on the right */\n children?: React.ReactNode;\n /** Additional CSS classes applied to the outer container */\n className?: string;\n}\n\n/**\n * Section header with a title on the left and optional action slots on the right.\n *\n * Mirrors the `SectionHeader` pattern from cytario-web's `Container.tsx`.\n * The title renders as an `<H2>` heading; any `children` are placed in a\n * flex container that aligns to the trailing edge.\n */\nexport function SectionHeader({\n title,\n children,\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={twMerge(\n \"flex flex-wrap items-center gap-3 py-4\",\n className,\n )}\n >\n <H2>{title}</H2>\n {children && (\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {children}\n </div>\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst hashColors = {\n purple: \"bg-(--color-badge-purple-bg) text-(--color-badge-purple-text) border-(--color-badge-purple-text)/20\",\n teal: \"bg-(--color-badge-teal-bg) text-(--color-badge-teal-text) border-(--color-badge-teal-text)/20\",\n rose: \"bg-(--color-badge-rose-bg) text-(--color-badge-rose-text) border-(--color-badge-rose-text)/20\",\n green: \"bg-(--color-badge-green-bg) text-(--color-badge-green-text) border-(--color-badge-green-text)/20\",\n amber: \"bg-(--color-badge-amber-bg) text-(--color-badge-amber-text) border-(--color-badge-amber-text)/20\",\n} as const;\n\nexport const colorStyles = {\n ...hashColors,\n slate:\n \"bg-(--color-badge-slate-bg) text-(--color-badge-slate-text) border-(--color-badge-slate-text)/20\",\n} as const;\n\nexport type PillColor = keyof typeof colorStyles;\n\nexport interface PillProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\" | \"color\"> {\n children?: string;\n color?: PillColor;\n}\n\nconst hashKeys = Object.keys(hashColors) as (keyof typeof hashColors)[];\n\nexport function pillColorFromName(name = \"\"): PillColor {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hashKeys[Math.abs(hash) % hashKeys.length];\n}\n\n/** Non-interactive hash-colored label badge. Color is derived from the text unless explicitly set. */\nexport function Pill({\n children,\n color = pillColorFromName(children),\n className,\n ...rest\n}: PillProps) {\n const cx = twMerge(\n `\n inline-flex items-center\n rounded-full\n border\n px-2 py-0.5\n text-xs font-medium\n leading-tight\n `,\n colorStyles[color],\n className,\n );\n\n return (\n <span className={cx} {...rest}>\n {children}\n </span>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { Pill, type PillColor, pillColorFromName } from \"./Pill\";\n\nexport interface PathPillProps {\n children: string;\n /** Number of trailing segments to show; earlier ones collapse to dots. Defaults to all. */\n visibleCount?: number;\n /** Override per-segment color. Falls back to hash-based `pillColorFromName`. */\n colorFn?: (segment: string, index: number) => PillColor;\n className?: string;\n}\n\n/** Renders a slash-separated path as overlapping, hash-colored pill segments. */\nexport function PathPill({\n children,\n visibleCount,\n colorFn,\n className,\n}: PathPillProps) {\n const segments = children.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) return null;\n\n const effectiveVisible = visibleCount ?? segments.length;\n const dotCount = Math.max(0, segments.length - effectiveVisible);\n const fullPath = segments.join(\" / \");\n\n return (\n <div\n className={twMerge(\"relative flex\", className)}\n aria-label={`Path: ${fullPath}`}\n >\n {segments.map((segment, i) => {\n const isCollapsed = i < dotCount;\n const isLast = i === segments.length - 1;\n const cx = twMerge(!isLast && \"pr-5 -mr-4\", isCollapsed && \"pr-3\");\n const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);\n return (\n <Pill\n key={`pill-${i}-${segment}`}\n className={cx}\n color={color}\n aria-hidden={isCollapsed || undefined}\n >\n {isCollapsed ? undefined : segment}\n </Pill>\n );\n })}\n </div>\n );\n}\n","import { createContext, useContext, useCallback, useMemo } from \"react\";\nimport type React from \"react\";\n\nexport interface FormWizardContextValue {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Whether the user can navigate backwards */\n canGoBack: boolean;\n /** Navigate to the previous step */\n goBack: () => void;\n /** Whether the current step is the last step */\n isLastStep: boolean;\n}\n\nconst FormWizardContext = createContext<FormWizardContextValue>({\n currentStep: 0,\n totalSteps: 1,\n canGoBack: false,\n goBack: () => {},\n isLastStep: true,\n});\n\nexport function useFormWizard(): FormWizardContextValue {\n return useContext(FormWizardContext);\n}\n\nexport interface FormWizardProps {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Callback invoked when the step should change */\n onStepChange: (step: number) => void;\n /** Wizard content (step panels, progress indicator, navigation) */\n children: React.ReactNode;\n}\n\nexport function FormWizard({\n currentStep,\n totalSteps,\n onStepChange,\n children,\n}: FormWizardProps) {\n const canGoBack = currentStep > 0;\n const isLastStep = currentStep >= totalSteps - 1;\n\n const goBack = useCallback(() => {\n if (currentStep > 0) {\n onStepChange(currentStep - 1);\n }\n }, [currentStep, onStepChange]);\n\n const value = useMemo<FormWizardContextValue>(\n () => ({\n currentStep,\n totalSteps,\n canGoBack,\n goBack,\n isLastStep,\n }),\n [currentStep, totalSteps, canGoBack, goBack, isLastStep],\n );\n\n return (\n <FormWizardContext.Provider value={value}>\n {children}\n </FormWizardContext.Provider>\n );\n}\n","import { useFormWizard } from \"./FormWizard\";\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-(--color-text-inverse)\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 8.5l3.5 3.5 6.5-7\" />\n </svg>\n );\n}\n\nexport interface FormWizardProgressProps {\n /** Labels for each step, displayed below the step circles */\n labels: string[];\n}\n\nexport function FormWizardProgress({ labels }: FormWizardProgressProps) {\n const { currentStep, totalSteps } = useFormWizard();\n\n return (\n <nav aria-label=\"Form progress\">\n <ol className=\"flex items-start\" role=\"list\">\n {labels.map((label, index) => {\n const isCompleted = index < currentStep;\n const isCurrent = index === currentStep;\n const isFuture = index > currentStep;\n\n return (\n <li\n key={label}\n className=\"flex flex-1 flex-col items-center\"\n aria-current={isCurrent ? \"step\" : undefined}\n >\n {/* Row with optional connector lines and the step circle */}\n <div className=\"flex w-full items-center\">\n {/* Left connector line */}\n {index > 0 ? (\n <div\n aria-hidden=\"true\"\n className={[\n \"h-0.5 flex-1\",\n index <= currentStep\n ? \"bg-(--color-surface-brand)\"\n : \"bg-(--color-border-default)\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n\n {/* Step circle */}\n <div\n className={[\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full\",\n \"text-sm font-medium\",\n \"transition-colors\",\n isCompleted\n ? \"bg-(--color-surface-brand) text-(--color-text-inverse)\"\n : \"\",\n isCurrent\n ? \"border-2 border-(--color-border-brand) bg-(--color-surface-default) text-(--color-text-brand)\"\n : \"\",\n isFuture\n ? \"border-2 border-(--color-border-default) bg-(--color-surface-default) text-(--color-text-tertiary)\"\n : \"\",\n ].join(\" \")}\n aria-hidden=\"true\"\n >\n {isCompleted ? <CheckIcon /> : index + 1}\n </div>\n\n {/* Right connector line */}\n {index < totalSteps - 1 ? (\n <div\n aria-hidden=\"true\"\n className={[\n \"h-0.5 flex-1\",\n index < currentStep\n ? \"bg-(--color-surface-brand)\"\n : \"bg-(--color-border-default)\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Label */}\n <span\n className={[\n \"mt-2 text-center text-sm\",\n isCurrent\n ? \"font-semibold text-(--color-text-primary)\"\n : \"font-normal text-(--color-text-secondary)\",\n ].join(\" \")}\n >\n {label}\n </span>\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { Button } from \"../Button\";\nimport { useFormWizard } from \"./FormWizard\";\n\nexport interface FormWizardNavProps {\n /** Callback invoked when the user presses Next or Submit */\n onNext: () => void;\n /** Whether the form is currently submitting (shows loading state on the submit button) */\n isSubmitting?: boolean;\n /** Label for the submit button on the last step (defaults to \"Submit\") */\n submitLabel?: string;\n}\n\nexport function FormWizardNav({\n onNext,\n isSubmitting = false,\n submitLabel = \"Submit\",\n}: FormWizardNavProps) {\n const { canGoBack, goBack, isLastStep } = useFormWizard();\n\n return (\n <div className=\"flex items-center justify-end gap-3\">\n {canGoBack && (\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onPress={goBack}\n isDisabled={isSubmitting}\n >\n Back\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"lg\"\n onPress={onNext}\n isLoading={isSubmitting}\n >\n {isLastStep ? submitLabel : \"Next\"}\n </Button>\n </div>\n );\n}\n","/**\n * Do not edit directly, this file was auto-generated.\n */\n\nexport const ColorPurple50 = \"#f5f0fa\";\nexport const ColorPurple100 = \"#ead9f5\";\nexport const ColorPurple200 = \"#d4b3eb\";\nexport const ColorPurple300 = \"#b87ddb\";\nexport const ColorPurple400 = \"#9b4fcb\";\nexport const ColorPurple500 = \"#7a2ea8\";\nexport const ColorPurple600 = \"#6b2695\";\nexport const ColorPurple700 = \"#5c2483\";\nexport const ColorPurple800 = \"#4a1d6a\";\nexport const ColorPurple900 = \"#3a1754\";\nexport const ColorPurple950 = \"#2a0f3e\";\nexport const ColorTeal50 = \"#edf9f9\";\nexport const ColorTeal100 = \"#d0f0f0\";\nexport const ColorTeal200 = \"#a1e1e2\";\nexport const ColorTeal300 = \"#6dd0d1\";\nexport const ColorTeal400 = \"#44c4c5\";\nexport const ColorTeal500 = \"#35b7b8\";\nexport const ColorTeal600 = \"#2a9b9c\";\nexport const ColorTeal700 = \"#217d7e\";\nexport const ColorTeal800 = \"#1a6364\";\nexport const ColorTeal900 = \"#144d4e\";\nexport const ColorTeal950 = \"#0a2829\";\nexport const ColorGreen50 = \"#f0fdf4\";\nexport const ColorGreen100 = \"#dcfce7\";\nexport const ColorGreen200 = \"#bbf7d0\";\nexport const ColorGreen300 = \"#86efac\";\nexport const ColorGreen400 = \"#4ade80\";\nexport const ColorGreen500 = \"#22c55e\";\nexport const ColorGreen600 = \"#16a34a\";\nexport const ColorGreen700 = \"#15803d\";\nexport const ColorGreen800 = \"#166534\";\nexport const ColorGreen900 = \"#14532d\";\nexport const ColorGreen950 = \"#052e16\";\nexport const ColorRose50 = \"#fff1f2\";\nexport const ColorRose100 = \"#ffe4e6\";\nexport const ColorRose200 = \"#fecdd3\";\nexport const ColorRose300 = \"#fda4af\";\nexport const ColorRose400 = \"#fb7185\";\nexport const ColorRose500 = \"#f43f5e\";\nexport const ColorRose600 = \"#e11d48\";\nexport const ColorRose700 = \"#be123c\";\nexport const ColorRose800 = \"#9f1239\";\nexport const ColorRose900 = \"#881337\";\nexport const ColorRose950 = \"#4c0519\";\nexport const ColorSlate50 = \"#f8fafc\";\nexport const ColorSlate100 = \"#f1f5f9\";\nexport const ColorSlate200 = \"#e2e8f0\";\nexport const ColorSlate300 = \"#cbd5e1\";\nexport const ColorSlate400 = \"#94a3b8\";\nexport const ColorSlate500 = \"#64748b\";\nexport const ColorSlate600 = \"#475569\";\nexport const ColorSlate700 = \"#334155\";\nexport const ColorSlate800 = \"#1e293b\";\nexport const ColorSlate900 = \"#0f172a\";\nexport const ColorSlate950 = \"#020617\";\nexport const ColorAmber50 = \"#fffbeb\";\nexport const ColorAmber100 = \"#fef3c7\";\nexport const ColorAmber200 = \"#fde68a\";\nexport const ColorAmber300 = \"#fcd34d\";\nexport const ColorAmber400 = \"#fbbf24\";\nexport const ColorAmber500 = \"#f59e0b\";\nexport const ColorAmber600 = \"#d97706\";\nexport const ColorAmber700 = \"#b45309\";\nexport const ColorAmber800 = \"#92400e\";\nexport const ColorAmber900 = \"#78350f\";\nexport const ColorAmber950 = \"#451a03\";\nexport const ColorBlue50 = \"#eff6ff\";\nexport const ColorBlue100 = \"#dbeafe\";\nexport const ColorBlue200 = \"#bfdbfe\";\nexport const ColorBlue300 = \"#93c5fd\";\nexport const ColorBlue400 = \"#60a5fa\";\nexport const ColorBlue500 = \"#3b82f6\";\nexport const ColorBlue600 = \"#2563eb\";\nexport const ColorBlue700 = \"#1d4ed8\";\nexport const ColorBlue800 = \"#1e40af\";\nexport const ColorBlue900 = \"#1e3a8a\";\nexport const ColorBlue950 = \"#172554\";\nexport const ColorWhite = \"#ffffff\";\nexport const ColorBlack = \"#000000\";\nexport const ColorAlphaBlack80 = \"#000000cc\";\nexport const ColorAlphaBlack60 = \"#00000099\";\nexport const ColorAlphaBlack40 = \"#00000066\";\nexport const ColorAlphaBlack06 = \"#0000000f\";\nexport const ColorAlphaWhite10 = \"#ffffff1a\";\nexport const ColorAlphaWhite06 = \"#ffffff0f\";\nexport const ColorActionPrimary = \"#5c2483\";\nexport const ColorActionPrimaryHover = \"#6b2695\";\nexport const ColorActionPrimaryActive = \"#4a1d6a\";\nexport const ColorActionSecondary = \"#5c2483\";\nexport const ColorActionSecondaryHover = \"#6b2695\";\nexport const ColorActionDanger = \"#e11d48\";\nexport const ColorActionDangerHover = \"#be123c\";\nexport const ColorActionSuccess = \"#16a34a\";\nexport const ColorActionSuccessHover = \"#15803d\";\nexport const ColorActionInfo = \"#2563eb\";\nexport const ColorActionInfoHover = \"#1d4ed8\";\nexport const ColorActionDefault = \"#1e293b\";\nexport const ColorActionDefaultHover = \"#334155\";\nexport const ColorTextPrimary = \"#0f172a\";\nexport const ColorTextSecondary = \"#475569\";\nexport const ColorTextTertiary = \"#94a3b8\";\nexport const ColorTextInverse = \"#ffffff\";\nexport const ColorTextBrand = \"#5c2483\";\nexport const ColorTextAccent = \"#35b7b8\";\nexport const ColorTextDanger = \"#e11d48\";\nexport const ColorTextSuccess = \"#16a34a\";\nexport const ColorTextInfo = \"#2563eb\";\nexport const ColorTextWarning = \"#d97706\";\nexport const ColorSurfaceDefault = \"#ffffff\";\nexport const ColorSurfaceSubtle = \"#f8fafc\";\nexport const ColorSurfaceMuted = \"#f1f5f9\";\nexport const ColorSurfaceBrand = \"#5c2483\";\nexport const ColorSurfaceAccent = \"#35b7b8\";\nexport const ColorSurfaceDanger = \"#fff1f2\";\nexport const ColorSurfaceSuccess = \"#f0fdf4\";\nexport const ColorSurfaceWarning = \"#fffbeb\";\nexport const ColorSurfaceInfo = \"#eff6ff\";\nexport const ColorSurfaceOverlay = \"#000000cc\";\nexport const ColorSurfaceHover = \"#0000000f\";\nexport const ColorSurfacePressed = \"#e2e8f0\";\nexport const ColorSurfaceSelected = \"#edf9f9\";\nexport const ColorSurfaceSelectedHover = \"#d0f0f0\";\nexport const ColorBorderDefault = \"#e2e8f0\";\nexport const ColorBorderStrong = \"#cbd5e1\";\nexport const ColorBorderBrand = \"#5c2483\";\nexport const ColorBorderAccent = \"#35b7b8\";\nexport const ColorBorderFocus = \"#35b7b8\";\nexport const ColorBorderDanger = \"#e11d48\";\nexport const ColorBorderSuccess = \"#16a34a\";\nexport const ColorBorderInfo = \"#60a5fa\";\nexport const ColorBorderWarning = \"#d97706\";\nexport const ColorOverlayBackdrop = \"#00000066\";\nexport const ColorStatusSuccess = \"#22c55e\";\nexport const ColorStatusDanger = \"#f43f5e\";\nexport const ColorStatusWarning = \"#d97706\";\nexport const ColorStatusInfo = \"#3b82f6\";\nexport const ColorDeltaIncreaseBg = \"#fff1f2\";\nexport const ColorDeltaIncreaseText = \"#be123c\";\nexport const ColorDeltaIncreaseIcon = \"#f43f5e\";\nexport const ColorDeltaDecreaseBg = \"#f0fdf4\";\nexport const ColorDeltaDecreaseText = \"#15803d\";\nexport const ColorDeltaDecreaseIcon = \"#22c55e\";\nexport const ColorDeltaFlatBg = \"#f1f5f9\";\nexport const ColorDeltaFlatText = \"#64748b\";\nexport const ColorDeltaFlatIcon = \"#94a3b8\";\nexport const ColorProgressTrack = \"#e2e8f0\";\nexport const ColorProgressFill = \"#6b2695\";\nexport const ColorProgressFillSuccess = \"#22c55e\";\nexport const ColorProgressFillWarning = \"#f59e0b\";\nexport const ColorProgressFillDanger = \"#f43f5e\";\nexport const ColorBannerInfoBg = \"#eff6ff\";\nexport const ColorBannerInfoText = \"#1d4ed8\";\nexport const ColorBannerInfoBorder = \"#bfdbfe\";\nexport const ColorBannerInfoIcon = \"#3b82f6\";\nexport const ColorBannerWarningBg = \"#fffbeb\";\nexport const ColorBannerWarningText = \"#92400e\";\nexport const ColorBannerWarningBorder = \"#fde68a\";\nexport const ColorBannerWarningIcon = \"#f59e0b\";\nexport const ColorBannerDangerBg = \"#fff1f2\";\nexport const ColorBannerDangerText = \"#be123c\";\nexport const ColorBannerDangerBorder = \"#fecdd3\";\nexport const ColorBannerDangerIcon = \"#f43f5e\";\nexport const ColorBannerSuccessBg = \"#f0fdf4\";\nexport const ColorBannerSuccessText = \"#15803d\";\nexport const ColorBannerSuccessBorder = \"#bbf7d0\";\nexport const ColorBannerSuccessIcon = \"#22c55e\";\nexport const ColorBadgePurpleBg = \"#ead9f5\";\nexport const ColorBadgePurpleText = \"#5c2483\";\nexport const ColorBadgeTealBg = \"#d0f0f0\";\nexport const ColorBadgeTealText = \"#1a6364\";\nexport const ColorBadgeSlateBg = \"#f1f5f9\";\nexport const ColorBadgeSlateText = \"#334155\";\nexport const ColorBadgeRoseBg = \"#ffe4e6\";\nexport const ColorBadgeRoseText = \"#be123c\";\nexport const ColorBadgeNeutralBg = \"#f1f5f9\";\nexport const ColorBadgeNeutralText = \"#334155\";\nexport const ColorBadgeGreenBg = \"#dcfce7\";\nexport const ColorBadgeGreenText = \"#15803d\";\nexport const ColorBadgeAmberBg = \"#fef3c7\";\nexport const ColorBadgeAmberText = \"#92400e\";\nexport const Spacing1 = \"4px\";\nexport const Spacing2 = \"8px\";\nexport const Spacing3 = \"12px\";\nexport const Spacing4 = \"16px\";\nexport const Spacing6 = \"24px\";\nexport const Spacing8 = \"32px\";\nexport const Spacing12 = \"48px\";\nexport const Spacing16 = \"64px\";\nexport const BorderRadiusNone = \"0px\";\nexport const BorderRadiusSm = \"4px\";\nexport const BorderRadiusMd = \"8px\";\nexport const BorderRadiusLg = \"12px\";\nexport const BorderRadiusXl = \"16px\";\nexport const BorderRadiusFull = \"9999px\";\nexport const FontSizeXs = \"12px\";\nexport const FontSizeSm = \"14px\";\nexport const FontSizeBase = \"16px\";\nexport const FontSizeLg = \"18px\";\nexport const FontSizeXl = \"20px\";\nexport const FontSize2xl = \"24px\";\nexport const FontSize3xl = \"30px\";\nexport const FontSize4xl = \"36px\";\nexport const FontSize5xl = \"48px\";\nexport const FontWeightLight = 300;\nexport const FontWeightRegular = 400;\nexport const FontWeightMedium = 500;\nexport const FontWeightSemibold = 600;\nexport const FontWeightBold = 700;\nexport const FontWeightExtrabold = 800;\nexport const LineHeightTight = 1.25;\nexport const LineHeightNormal = 1.5;\nexport const LineHeightRelaxed = 1.625;\n"],"mappings":"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","names":["jsx","sizeMap","jsx","jsxs","jsx","jsxs","useRef","useRef","useState","useLayoutEffect","useState","startLen","endLen","useLayoutEffect","useState","jsx","jsxs","useRef","AriaButton","jsx","iconSizeMap","groupRadiusClass","AriaButton","twMerge","jsx","jsxs","jsx","jsxs","twMerge","Button","Text","twMerge","jsx","jsxs","twMerge","Button","Text","jsx","jsxs","Fragment","jsx","jsxs","sizeStyles","jsx","createContext","useCallback","useContext","useEffect","useRef","useState","createPortal","X","jsx","jsxs","jsx","jsxs","Check","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsx","groupRadiusClass","twMerge","jsx","sizeStyles","Heading","jsx","variantStyles","Link","Fragment","jsx","jsxs","AriaLink","twMerge","jsx","jsxs","iconSizeMap","AriaLink","twMerge","squareSizeStyles","twMerge","jsx","squareSizeStyles","variantStyles","twMerge","createContext","useContext","twMerge","AriaRadioGroup","AriaRadio","jsx","sizeStyles","Popover","jsx","jsxs","Popover","AriaMenuItem","jsx","jsxs","AriaMenuItem","AriaMenuItem","Check","Fragment","jsx","jsxs","jsx","jsxs","Header","jsx","jsx","AriaButton","twMerge","jsx","Popover","createContext","useContext","twMerge","jsx","sizeStyles","Tabs","TabList","Tab","TabPanel","createContext","useContext","twMerge","AriaToggleButton","jsx","sizeStyles","twMerge","jsx","jsxs","variantStyles","sizeStyles","iconSizeMap","useCallback","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","colorStyles","twMerge","jsx","jsxs","sizeStyles","useState","Info","X","twMerge","jsx","jsxs","variantConfig","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","twMerge","twMerge","jsx","twMerge","jsx","twMerge","createContext","useContext","useCallback","jsx","jsx","jsxs","jsx","jsxs"]}
|