@cytario/design 1.17.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/styles/global.css +17 -7
- package/src/tokens/variables.css +3 -3
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/InputGroup/InputGroupContext.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/IconButton/IconButton.tsx","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../src/components/Table/Table.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Toast/Toast.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.tsx","../src/components/Radio/Radio.tsx","../src/components/Label/Label.tsx","../src/components/Field/Field.tsx","../src/components/Fieldset/Fieldset.tsx","../src/components/InputGroup/InputGroup.tsx","../src/components/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/Tree/Tree.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/FileCard/FileCard.tsx","../src/components/StorageConnectionCard/StorageConnectionCard.tsx","../src/components/Pill/Pill.tsx","../src/components/Pill/GroupPill.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/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 { ButtonProps, ButtonVariant, ButtonSize } 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 { IconButton } from \"./components/IconButton\";\nexport type { IconButtonProps } from \"./components/IconButton\";\n\nexport { Input } from \"./components/Input\";\nexport type { InputProps } from \"./components/Input\";\n\nexport { Select } from \"./components/Select\";\nexport type { SelectProps, SelectItem } from \"./components/Select\";\n\nexport { Table, TableHeader, Column, TableBody, Row, Cell } 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 { ToastData, ToastVariant, ToastPlacement, ToastContextValue, ToastBridge, ToastProviderProps } from \"./components/Toast\";\n\nexport { EmptyState } from \"./components/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState\";\n\nexport { Checkbox } from \"./components/Checkbox\";\nexport type { CheckboxProps } from \"./components/Checkbox\";\n\nexport { Switch } from \"./components/Switch\";\nexport type { SwitchProps } from \"./components/Switch\";\n\nexport { RadioGroup, Radio, RadioButton } from \"./components/Radio\";\nexport type { RadioGroupProps, RadioProps, RadioButtonProps } from \"./components/Radio\";\n\nexport { Label } from \"./components/Label\";\nexport type { LabelProps } from \"./components/Label\";\n\nexport { Field } from \"./components/Field\";\nexport type { FieldProps } from \"./components/Field\";\n\nexport { Fieldset } from \"./components/Fieldset\";\nexport type { FieldsetProps } from \"./components/Fieldset\";\n\nexport { InputGroup, InputGroupContext, useInputGroup } from \"./components/InputGroup\";\nexport type { InputGroupProps, GroupPosition } from \"./components/InputGroup\";\n\nexport { InputAddon } from \"./components/InputAddon\";\nexport type { InputAddonProps } from \"./components/InputAddon\";\n\nexport { Heading, H1, H2, H3 } from \"./components/Heading\";\nexport type { HeadingProps, HeadingLevel, HeadingSize } from \"./components/Heading\";\n\nexport { Link } from \"./components/Link\";\nexport type { LinkProps, LinkVariant } from \"./components/Link\";\n\nexport { Breadcrumbs } from \"./components/Breadcrumbs\";\nexport type { BreadcrumbsProps, BreadcrumbItem } from \"./components/Breadcrumbs\";\n\nexport { ButtonLink, IconButtonLink } from \"./components/ButtonLink\";\nexport type { ButtonLinkProps, IconButtonLinkProps } from \"./components/ButtonLink\";\n\nexport { ToggleButton } from \"./components/ToggleButton\";\nexport type { ToggleButtonProps, ToggleButtonVariant, ToggleButtonSize } from \"./components/ToggleButton\";\n\nexport { ToggleButtonGroup, ToggleButtonGroupItem } from \"./components/ToggleButtonGroup\";\nexport type {\n ToggleButtonGroupProps,\n ToggleButtonGroupItemProps,\n ToggleButtonGroupSize,\n} from \"./components/ToggleButtonGroup\";\n\nexport { Menu, MenuItem, MenuCheckboxItem, MenuSection, MenuHeader, MenuSeparator } 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 { PopoverProps, PopoverTriggerProps, PopoverContentProps } from \"./components/Popover\";\n\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps, TabsVariant, TabsSize } 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 { Tree } from \"./components/Tree\";\nexport type { TreeProps, TreeNode, TreeApi } from \"./components/Tree\";\n\nexport { SegmentedControl, SegmentedControlItem } from \"./components/SegmentedControl\";\nexport type {\n SegmentedControlProps,\n SegmentedControlItemProps,\n SegmentedControlSize,\n SegmentedControlSelectionMode,\n} from \"./components/SegmentedControl\";\n\nexport { FileCard, FileIcon, getFileIcon, getTypeLabel } from \"./components/FileCard\";\nexport type { FileCardProps } from \"./components/FileCard\";\n\nexport { StorageConnectionCard } from \"./components/StorageConnectionCard\";\nexport type { StorageConnectionCardProps } from \"./components/StorageConnectionCard\";\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 { DeltaIndicatorProps, DeltaFormat, DeltaMode } from \"./components/DeltaIndicator\";\n\nexport { ProgressBar } from \"./components/ProgressBar\";\nexport type { ProgressBarProps, ProgressBarVariant, ProgressBarSize } 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 } from \"./components/Pill\";\nexport type { PillProps, PillColor } from \"./components/Pill\";\n\nexport { GroupPill } from \"./components/Pill\";\nexport type { GroupPillProps } from \"./components/Pill\";\n\nexport { FormWizard, useFormWizard } from \"./components/FormWizard\";\nexport type { FormWizardProps, FormWizardContextValue } 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 ButtonVariant,\n type ButtonSize,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\n\nexport type { ButtonVariant, ButtonSize };\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 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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-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 radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-[var(--border-radius-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-[var(--color-border-focus)] focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-[var(--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\",\n radiusClass,\n \"font-[var(--font-weight-medium)]\",\n \"leading-[var(--line-height-tight)]\",\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n 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","export type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"default\"\n | \"success\"\n | \"info\"\n | \"neutral\";\n\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport const variantStyles: Record<ButtonVariant, string> = {\n primary: [\n \"bg-[var(--color-action-primary)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-primary-hover)]\",\n \"pressed:bg-[var(--color-action-primary-active)]\",\n ].join(\" \"),\n secondary: [\n \"bg-transparent text-[var(--color-action-secondary)]\",\n \"border border-[var(--color-border-brand)]\",\n \"hover:bg-[var(--color-purple-50)]\",\n \"pressed:bg-[var(--color-purple-100)]\",\n ].join(\" \"),\n ghost: [\n \"bg-transparent text-[var(--color-text-primary)]\",\n \"hover:bg-[var(--color-surface-hover)]\",\n \"pressed:bg-[var(--color-surface-pressed)]\",\n ].join(\" \"),\n destructive: [\n \"bg-[var(--color-action-danger)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-danger-hover)]\",\n \"pressed:bg-[var(--color-action-danger-hover)]\",\n ].join(\" \"),\n default: [\n \"bg-[var(--color-action-default)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-default-hover)]\",\n \"pressed:bg-[var(--color-slate-600)]\",\n ].join(\" \"),\n success: [\n \"bg-[var(--color-action-success)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-success-hover)]\",\n \"pressed:bg-[var(--color-green-800)]\",\n ].join(\" \"),\n info: [\n \"bg-[var(--color-action-info)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-info-hover)]\",\n \"pressed:bg-[var(--color-slate-800)]\",\n ].join(\" \"),\n neutral: [\n \"bg-[var(--color-surface-default)] text-[var(--color-text-primary)]\",\n \"border border-[var(--color-border-default)]\",\n \"hover:bg-[var(--color-surface-subtle)]\",\n \"pressed:bg-[var(--color-surface-muted)]\",\n ].join(\" \"),\n};\n\nexport const sizeStyles: Record<ButtonSize, 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","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 type React from \"react\";\nimport {\n Tooltip as AriaTooltip,\n TooltipTrigger,\n type TooltipProps as AriaTooltipProps,\n} from \"react-aria-components\";\n\nexport interface TooltipProps {\n /** Tooltip text content */\n content: string;\n /** Trigger element */\n children: React.ReactElement;\n /** Placement relative to trigger */\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Delay in ms before showing (default 500) */\n delay?: number;\n /** Additional CSS classes for the tooltip */\n className?: string;\n}\n\nexport function Tooltip({\n content,\n children,\n placement = \"top\",\n delay = 500,\n className,\n}: TooltipProps) {\n return (\n <TooltipTrigger delay={delay}>\n {children}\n <AriaTooltip\n placement={placement}\n className={[\n \"bg-[var(--color-surface-overlay)] backdrop-blur-sm\",\n \"text-[var(--color-text-inverse)] text-sm\",\n \"px-3 py-1.5\",\n \"rounded-[var(--border-radius-md)]\",\n \"max-w-xs\",\n \"entering:animate-in entering:fade-in entering:duration-150\",\n \"exiting:animate-out exiting:fade-out exiting:duration-100\",\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 className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {content}\n </AriaTooltip>\n </TooltipTrigger>\n );\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 \"../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?: \"sm\" | \"md\" | \"lg\";\n /** Show tooltip on hover (default true) */\n showTooltip?: boolean;\n /** Tooltip placement */\n tooltipPlacement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Shows a spinner and disables interaction */\n isLoading?: 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\nconst iconSizeMap = {\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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-md)]\";\n }\n}\n\nexport function IconButton({\n icon,\n \"aria-label\": ariaLabel,\n variant = \"ghost\",\n size = \"md\",\n showTooltip = true,\n tooltipPlacement = \"top\",\n isLoading = false,\n isDisabled,\n className,\n ...props\n}: IconButtonProps) {\n const { inGroup, position } = useInputGroup();\n\n const radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-[var(--border-radius-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-[var(--color-border-focus)] focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-[var(--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\",\n radiusClass,\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n variantStyles[variant],\n 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} placement={tooltipPlacement}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n}\n","import {\n TextField,\n Label,\n Input as AriaInput,\n Text,\n type TextFieldProps,\n} from \"react-aria-components\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\n\nconst sizeClasses = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-4 py-3 text-lg\",\n} as const;\n\nconst prefixSizeClasses = {\n sm: \"px-3 text-sm\",\n md: \"px-3 text-base\",\n lg: \"px-4 text-lg\",\n} as const;\n\nconst alignClasses = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\nexport interface InputProps\n extends Omit<TextFieldProps, \"children\" | \"className\"> {\n /** Label text displayed above the input. Omit for raw input mode. */\n label?: string;\n /** Placeholder text shown when the input is empty */\n placeholder?: string;\n /** Help text shown below the input */\n description?: string;\n /** Error message shown below the input (triggers error styling) */\n errorMessage?: string;\n /** HTML input type */\n type?: \"text\" | \"email\" | \"password\" | \"number\";\n /** Controls padding and font size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Text prefix shown inside the input on the left (e.g., \"$\", \"https://\") */\n prefix?: string;\n /** Text alignment within the input */\n align?: \"left\" | \"center\" | \"right\";\n /** Additional CSS class for the outer wrapper */\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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-md)]\";\n }\n}\n\nexport function Input({\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 isInvalid = !!errorMessage;\n const { inGroup, position } = useInputGroup();\n\n const borderColor = isInvalid\n ? \"border-[var(--color-border-danger)]\"\n : \"border-[var(--color-border-default)] hover:border-[var(--color-border-strong)]\";\n\n const radiusClass = inGroup\n ? groupRadiusClasses(position)\n : \"rounded-[var(--border-radius-md)]\";\n\n /** When not first in a group, overlap left border with previous sibling */\n const marginClass = inGroup && position !== \"start\" && position !== \"standalone\" ? \"-ml-px\" : \"\";\n\n return (\n <TextField\n {...props}\n type={type}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n className={[\n \"flex flex-col gap-[var(--spacing-1)]\",\n inGroup ? \"min-w-0 flex-1\" : \"\",\n marginClass,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {label && (\n <Label\n className={[\n \"text-[length:var(--font-size-sm)]\",\n \"font-[number:var(--font-weight-medium)]\",\n \"text-[var(--color-text-primary)]\",\n ].join(\" \")}\n >\n {label}\n {isRequired && (\n <span\n aria-hidden=\"true\"\n className=\"ml-0.5 text-[var(--color-text-danger)]\"\n >\n *\n </span>\n )}\n </Label>\n )}\n\n {prefix ? (\n <div\n className={[\n \"flex items-center overflow-hidden\",\n radiusClass,\n \"border\",\n \"bg-[var(--color-surface-default)]\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus-within:ring-2 focus-within:ring-[var(--color-border-focus)] focus-within:border-[var(--color-border-focus)]\",\n inGroup ? \"focus-within:z-10\" : \"\",\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <span\n className={[\n \"self-stretch flex items-center shrink-0 select-none\",\n \"bg-[var(--color-surface-subtle)]\",\n \"border-r border-r-[var(--color-border-default)]\",\n \"text-[var(--color-text-secondary)]\",\n prefixSizeClasses[size],\n ].join(\" \")}\n >\n {prefix}\n </span>\n <AriaInput\n placeholder={placeholder}\n className={[\n \"w-full bg-transparent\",\n sizeClasses[size],\n alignClasses[align],\n \"text-[var(--color-text-primary)]\",\n \"placeholder:text-[var(--color-text-tertiary)]\",\n \"outline-none border-none\",\n ].join(\" \")}\n />\n </div>\n ) : (\n <AriaInput\n placeholder={placeholder}\n className={[\n \"w-full\",\n sizeClasses[size],\n alignClasses[align],\n radiusClass,\n \"border\",\n \"text-[var(--color-text-primary)]\",\n \"bg-[var(--color-surface-default)]\",\n \"placeholder:text-[var(--color-text-tertiary)]\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus:ring-2 focus:ring-[var(--color-border-focus)] focus:border-[var(--color-border-focus)]\",\n inGroup ? \"focus:z-10\" : \"\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n ].join(\" \")}\n />\n )}\n\n {description && !isInvalid && (\n <Text\n slot=\"description\"\n className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]\"\n >\n {description}\n </Text>\n )}\n\n {isInvalid && (\n <Text\n slot=\"errorMessage\"\n className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-danger)]\"\n >\n {errorMessage}\n </Text>\n )}\n </TextField>\n );\n}\n","import {\n Button,\n Label,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n SelectValue,\n type SelectProps as AriaSelectProps,\n type Key,\n} from \"react-aria-components\";\n\nexport interface SelectItem {\n id: string;\n name: string;\n}\n\nexport interface SelectProps\n extends Omit<AriaSelectProps<SelectItem>, \"children\"> {\n /** Label displayed above the trigger (always visible) */\n label: string;\n /** Options to display in the dropdown */\n items: SelectItem[];\n /** Placeholder text when no item is selected */\n placeholder?: string;\n /** Error message displayed below the trigger */\n errorMessage?: string;\n /** When true, visually hides the label (remains accessible to screen readers). Useful when Select is used inside a Field that already renders a visible label. */\n hideLabel?: boolean;\n}\n\nfunction ChevronDown() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-[var(--color-text-secondary)]\"\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=\"M4 6l4 4 4-4\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-[var(--color-action-primary)]\"\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 function Select({\n label,\n items,\n placeholder = \"Select an option\",\n errorMessage,\n hideLabel = false,\n isDisabled,\n isRequired,\n className,\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={[\"flex flex-col gap-[var(--spacing-1)]\", className].filter(Boolean).join(\" \")}\n >\n <Label\n className={[\n \"text-[length:var(--font-size-sm)] font-[var(--font-weight-medium)] text-[var(--color-text-primary)]\",\n hideLabel && \"sr-only\",\n ].filter(Boolean).join(\" \")}\n >\n {label}\n {isRequired && (\n <span\n aria-hidden=\"true\"\n className=\"ml-0.5 text-[var(--color-text-danger)]\"\n >\n *\n </span>\n )}\n </Label>\n\n <Button\n className={[\n \"inline-flex items-center justify-between\",\n \"w-full rounded-[var(--border-radius-md)] px-4 py-2\",\n \"text-base text-left\",\n \"border outline-none transition-colors\",\n hasError\n ? \"border-[var(--color-border-danger)]\"\n : \"border-[var(--color-border-default)]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"bg-[var(--color-surface-default)]\",\n ].join(\" \")}\n >\n <SelectValue className=\"truncate data-[placeholder]:text-[var(--color-text-tertiary)]\">\n {({ selectedText }) => selectedText || placeholder}\n </SelectValue>\n <ChevronDown />\n </Button>\n\n {hasError && (\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-danger)]\">\n {errorMessage}\n </span>\n )}\n\n <Popover\n className={[\n \"w-[var(--trigger-width)]\",\n \"rounded-[var(--border-radius-md)]\",\n \"border border-[var(--color-border-default)]\",\n \"bg-[var(--color-surface-default)]\",\n \"shadow-lg\",\n \"overflow-auto\",\n \"entering:animate-in entering:fade-in entering:slide-in-from-top-1\",\n \"exiting:animate-out exiting:fade-out exiting:slide-out-to-top-1\",\n ].join(\" \")}\n >\n <ListBox className=\"p-1 outline-none\" items={items}>\n {(item) => (\n <ListBoxItem\n id={item.id}\n textValue={item.name}\n className={[\n \"flex items-center justify-between gap-2\",\n \"px-4 py-2 rounded-[var(--border-radius-sm)]\",\n \"text-base text-[var(--color-text-primary)]\",\n \"cursor-pointer outline-none\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"focus:bg-[var(--color-surface-muted)]\",\n \"selected:text-[var(--color-action-primary)] selected:font-[var(--font-weight-medium)]\",\n ].join(\" \")}\n >\n {({ isSelected }) => (\n <>\n <span className=\"truncate\">{item.name}</span>\n {isSelected && <CheckIcon />}\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-[var(--font-size-sm)] text-[var(--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-[var(--font-weight-semibold)] text-[var(--color-text-secondary)]\",\n \"border-b-2 border-[var(--color-border-default)]\",\n \"cursor-default select-none outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-[var(--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-[var(--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-[var(--color-border-default)]\",\n \"even:bg-[var(--color-surface-subtle)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-[var(--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-[var(--table-row-py)]\",\n \"text-[var(--color-text-primary)]\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-[var(--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-[var(--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-[var(--color-surface-default)] rounded-[var(--border-radius-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-[var(--color-border-default)]\">\n <Heading\n slot=\"title\"\n className=\"text-[length:var(--font-size-lg)] font-[number:var(--font-weight-semibold)] text-[var(--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-[var(--border-radius-sm)] p-1\",\n \"text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-surface-muted)]\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--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 {\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-[var(--color-surface-success)] border-[var(--color-border-success)] text-[var(--color-text-success)]\",\n iconClass: \"text-[var(--color-action-success)]\",\n },\n error: {\n icon: XCircle,\n containerClass: \"bg-[var(--color-surface-danger)] border-[var(--color-border-danger)] text-[var(--color-text-danger)]\",\n iconClass: \"text-[var(--color-action-danger)]\",\n },\n info: {\n icon: Info,\n containerClass: \"bg-[var(--color-surface-info)] border-[var(--color-border-info)] text-[var(--color-text-info)]\",\n iconClass: \"text-[var(--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-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)]\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={dismiss}\n className=\"shrink-0 rounded-[var(--border-radius-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-[var(--spacing-12)] px-[var(--spacing-6)]\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && (\n <Icon icon={icon} size=\"xl\" className=\"text-[var(--color-text-tertiary)]\" />\n )}\n <h3 className=\"text-[length:var(--font-size-lg)] font-[number:var(--font-weight-semibold)] text-[var(--color-text-primary)] mt-4\">\n {title}\n </h3>\n {description && (\n <p className=\"text-sm text-[var(--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-[length:var(--font-size-sm)] text-[var(--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-[var(--border-radius-sm)] border transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected || isIndeterminate\n ? \"bg-[var(--color-action-primary)] border-[var(--color-action-primary)]\"\n : \"bg-[var(--color-surface-default)] border-[var(--color-border-default)] group-hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n >\n {isSelected && (\n <Check className=\"w-4 h-4 text-[var(--color-text-inverse)]\" strokeWidth={3} />\n )}\n {isIndeterminate && (\n <div className=\"w-3 h-0.5 bg-[var(--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-[var(--color-action-primary)]\",\n success: \"bg-[var(--color-action-success)]\",\n destructive: \"bg-[var(--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-[length:var(--font-size-sm)] text-[var(--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-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected && isPreset\n ? trackColorMap[color]\n : !isSelected\n ? \"bg-[var(--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-[var(--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-[length:var(--font-size-sm)] text-[var(--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-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected\n ? \"border-[var(--color-action-primary)]\"\n : \"border-[var(--color-border-default)] group-hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n >\n {isSelected && (\n <div className=\"w-2.5 h-2.5 rounded-full bg-[var(--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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)]\",\n \"rounded-[var(--border-radius-md)] border transition-colors text-center\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected\n ? \"bg-[var(--color-action-primary)] border-[var(--color-action-primary)] text-[var(--color-text-inverse)]\"\n : \"bg-[var(--color-surface-default)] border-[var(--color-border-default)] text-[var(--color-text-primary)] hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n >\n {children}\n </div>\n )}\n </AriaRadio>\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-[length:var(--font-size-sm)]\",\n \"font-[number:var(--font-weight-medium)]\",\n \"text-[var(--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-[var(--color-text-danger)]\"\n >\n *\n </span>\n )}\n </AriaLabel>\n );\n}\n","import type React from \"react\";\nimport { Label } from \"../Label\";\n\nexport interface FieldProps {\n label?: string;\n isRequired?: boolean;\n description?: string;\n error?: string | { message?: string };\n children: React.ReactNode;\n className?: string;\n}\n\nfunction getErrorMessage(error: FieldProps[\"error\"]): string | undefined {\n if (!error) return undefined;\n if (typeof error === \"string\") return error;\n return error.message;\n}\n\nexport function Field({\n label,\n isRequired,\n description,\n error,\n children,\n className,\n}: FieldProps) {\n const errorMessage = getErrorMessage(error);\n\n return (\n <div\n className={[\"flex flex-col gap-[var(--spacing-1)]\", className]\n .filter(Boolean)\n .join(\" \")}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n {children}\n {description && !errorMessage && (\n <p className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]\">\n {description}\n </p>\n )}\n {errorMessage && (\n <p className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-danger)]\">\n {errorMessage}\n </p>\n )}\n </div>\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-[var(--spacing-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-[length:var(--font-size-lg)]\",\n \"font-[number:var(--font-weight-semibold)]\",\n \"text-[var(--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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-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-[var(--border-radius-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-[var(--color-surface-subtle)]\",\n \"text-[var(--color-text-secondary)]\",\n \"border border-[var(--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-[length:var(--font-size-sm)]\",\n sm: \"text-[length:var(--font-size-base)]\",\n md: \"text-[length:var(--font-size-lg)]\",\n lg: \"text-[length:var(--font-size-xl)]\",\n xl: \"text-[length:var(--font-size-2xl)]\",\n \"2xl\": \"text-[length:var(--font-size-3xl)]\",\n \"3xl\": \"text-[length:var(--font-size-4xl)]\",\n};\n\nconst weightStyles: Record<HeadingWeight, string> = {\n semibold: \"font-[number:var(--font-weight-semibold)]\",\n bold: \"font-[number:var(--font-weight-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-[var(--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-[var(--color-teal-700)] underline\",\n \"hover:text-[var(--color-teal-800)]\",\n ].join(\" \"),\n subtle: [\n \"text-[var(--color-text-secondary)] no-underline\",\n \"hover:underline hover:text-[var(--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-[var(--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-[number:var(--font-weight-medium)] text-[var(--color-text-primary)] truncate\">\n {item.label}\n </span>\n ) : (\n <>\n <Link\n href={item.href}\n className=\"whitespace-nowrap text-[var(--color-text-secondary)] outline-none transition-colors hover:text-[var(--color-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-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 ButtonVariant,\n type ButtonSize,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport type { ButtonVariant, ButtonSize };\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 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\",\n \"rounded-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"leading-[var(--line-height-tight)]\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--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 /** Tooltip placement */\n tooltipPlacement?: \"top\" | \"bottom\" | \"left\" | \"right\";\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 tooltipPlacement = \"top\",\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\",\n \"rounded-[var(--border-radius-md)]\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--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} placement={tooltipPlacement}>\n {link}\n </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\";\n\nexport type ToggleButtonVariant = \"default\" | \"primary\" | \"outlined\";\nexport type ToggleButtonSize = \"sm\" | \"md\" | \"lg\";\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 sizeStyles: Record<ToggleButtonSize, 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\nconst squareSizeStyles: Record<ToggleButtonSize, string> = {\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-[var(--color-text-primary)]\",\n \"hover:bg-[var(--color-surface-hover)]\",\n \"pressed:bg-[var(--color-surface-pressed)]\",\n ].join(\" \"),\n selected: \"bg-[var(--color-surface-pressed)] text-[var(--color-text-primary)]\",\n },\n primary: {\n base: [\n \"bg-transparent text-[var(--color-text-primary)]\",\n \"hover:bg-[var(--color-surface-hover)]\",\n \"pressed:bg-[var(--color-surface-pressed)]\",\n ].join(\" \"),\n selected: \"bg-[var(--color-action-primary-active)] text-[var(--color-text-inverse)]\",\n },\n outlined: {\n base: [\n \"bg-[var(--color-surface-default)] text-[var(--color-text-primary)]\",\n \"border border-[var(--color-border-default)]\",\n \"hover:bg-[var(--color-surface-subtle)]\",\n \"pressed:bg-[var(--color-surface-muted)]\",\n ].join(\" \"),\n selected: [\n \"bg-[var(--color-neutral-800)] text-[var(--color-text-inverse)]\",\n \"border border-[var(--color-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\",\n isSquare ? \"rounded-none\" : \"rounded-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"leading-[var(--line-height-tight)]\",\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--border-radius-lg)] border border-[var(--color-border-default)] bg-[var(--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-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-surface-default)] text-[var(--color-text-primary)] shadow-sm font-[var(--font-weight-semibold)]\"\n : isPressed\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : isHovered\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : \"bg-transparent text-[var(--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-[var(--color-surface-default)] rounded-[var(--border-radius-md)]\",\n \"shadow-lg border border-[var(--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-[var(--color-surface-muted)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n item.isDanger\n ? \"text-[var(--color-text-danger)]\"\n : \"text-[var(--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-[var(--color-surface-muted)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isDanger\n ? \"text-[var(--color-text-danger)]\"\n : \"text-[var(--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-[var(--color-surface-muted)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"text-[var(--color-text-primary)]\",\n isSelected ? \"font-[number:var(--font-weight-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-[var(--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-[length:var(--font-size-xs)] font-[number:var(--font-weight-semibold)]\",\n \"text-[var(--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-[var(--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 Dialog as AriaDialog,\n Button as AriaButton,\n type PopoverProps as AriaPopoverProps,\n} from \"react-aria-components\";\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\nexport interface PopoverTriggerProps {\n children: React.ReactNode;\n /** Additional CSS classes for the trigger wrapper */\n className?: string;\n}\n\nexport interface PopoverContentProps {\n /** Placement relative to the trigger element */\n placement?: AriaPopoverProps[\"placement\"];\n /** Offset from the trigger in pixels */\n offset?: number;\n /** Additional CSS classes */\n className?: string;\n /** Content to render inside the popover. Can be a render function receiving { close }. */\n children:\n | React.ReactNode\n | ((opts: { close: () => void }) => React.ReactNode);\n}\n\n/**\n * Popover root -- wraps React Aria's DialogTrigger.\n */\nexport function Popover({ children, isOpen, onOpenChange }: PopoverProps) {\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </DialogTrigger>\n );\n}\n\n/**\n * PopoverTrigger -- wraps the child in a React Aria Button so it\n * participates in DialogTrigger's open/close handling.\n *\n * Renders as an unstyled inline element. Pass your visual trigger\n * (text, icon, swatch) as children.\n */\nexport function PopoverTrigger({ children, className }: PopoverTriggerProps) {\n return (\n <AriaButton\n className={[\n \"inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:rounded-[var(--border-radius-sm)]\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </AriaButton>\n );\n}\n\n/**\n * PopoverContent -- the floating panel anchored to the trigger.\n * Built on React Aria's Popover + Dialog for accessible focus management.\n */\nexport function PopoverContent({\n placement = \"bottom\",\n offset: offsetPx = 8,\n className,\n children,\n}: PopoverContentProps) {\n return (\n <AriaPopover\n placement={placement}\n offset={offsetPx}\n className={[\n \"z-50\",\n \"bg-[var(--color-surface-default)] border border-[var(--color-border-default)]\",\n \"rounded-[var(--border-radius-md)] shadow-lg\",\n \"entering:animate-in entering:fade-in entering:duration-150\",\n \"exiting:animate-out exiting:fade-out exiting:duration-100\",\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 className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <AriaDialog className=\"outline-none\">\n {({ close }) => (\n <>\n {typeof children === \"function\"\n ? children({ close })\n : children}\n </>\n )}\n </AriaDialog>\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-[var(--color-border-default)]\"\n : \"inline-flex items-center bg-[var(--color-surface-muted)] rounded-[var(--border-radius-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-[var(--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-[var(--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-[var(--font-weight-medium)]\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--border-radius-sm)]\",\n\n // Color states\n state.isSelected\n ? [\n \"text-[var(--color-teal-700)] font-[var(--font-weight-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-[var(--color-teal-600)]\",\n ].join(\" \")\n : state.isPressed\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-muted)]\"\n : state.isHovered\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-subtle)]\"\n : \"text-[var(--color-text-secondary)] bg-transparent\",\n ];\n }\n\n // Pills variant\n return [\n // Shape\n \"rounded-[var(--border-radius-md)]\",\n\n // Color states\n state.isSelected\n ? \"text-[var(--color-text-primary)] font-[var(--font-weight-semibold)] bg-[var(--color-surface-default)] shadow-sm\"\n : state.isPressed\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-subtle)] shadow-none\"\n : state.isHovered\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-pressed)]\"\n : \"text-[var(--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 { useCallback, useImperativeHandle, useRef, useState } from \"react\";\nimport { Tree as ArboristTree } from \"react-arborist\";\nimport type { TreeApi, NodeApi, NodeRendererProps } from \"react-arborist\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { ChevronRight, Folder, File } from \"lucide-react\";\nimport { Check } from \"lucide-react\";\n\nexport type { TreeApi } from \"react-arborist\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TreeNode {\n id: string;\n name: string;\n icon?: LucideIcon;\n children?: TreeNode[];\n}\n\nexport interface TreeProps<T extends TreeNode = TreeNode> {\n data: readonly T[];\n \"aria-label\": string;\n size?: \"compact\" | \"comfortable\";\n selectionMode?: \"none\" | \"single\" | \"multi\" | \"checkbox\";\n selectedIds?: Set<string>;\n onSelectionChange?: (ids: Set<string>) => void;\n onActivate?: (node: T) => void;\n /** Called when the pointer enters a tree node row. */\n onHover?: (node: T) => void;\n /** Called when the pointer leaves a tree node row. */\n onHoverEnd?: (node: T) => void;\n openByDefault?: boolean;\n searchTerm?: string;\n searchMatch?: (node: T, term: string) => boolean;\n height?: number;\n indent?: number;\n disableDrag?: boolean;\n disableDrop?: boolean;\n treeRef?: React.Ref<TreeApi<T>>;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Row heights */\n/* ------------------------------------------------------------------ */\n\nconst rowHeightMap = {\n compact: 32,\n comfortable: 40,\n} as const;\n\n/* ------------------------------------------------------------------ */\n/* Node renderer */\n/* ------------------------------------------------------------------ */\n\nfunction NodeRenderer<T extends TreeNode>({\n node,\n style,\n tree,\n dragHandle,\n checkedIds,\n onCheckToggle,\n selectionMode,\n size,\n onHover,\n onHoverEnd,\n}: NodeRendererProps<T> & {\n checkedIds: Set<string>;\n onCheckToggle: (id: string) => void;\n selectionMode: string;\n size: \"compact\" | \"comfortable\";\n onHover?: (node: T) => void;\n onHoverEnd?: (node: T) => void;\n}) {\n const data = node.data;\n const isCheckbox = selectionMode === \"checkbox\";\n const isChecked = isCheckbox && checkedIds.has(node.id);\n const isSelected = node.isSelected && !isCheckbox;\n const isCompact = size === \"compact\";\n\n const IconComponent: LucideIcon = data.icon\n ? data.icon\n : node.isInternal\n ? Folder\n : File;\n\n return (\n <div\n ref={dragHandle}\n style={style}\n className={[\n \"relative flex items-center cursor-default select-none\",\n isCompact ? \"gap-0.5 px-2\" : \"gap-1 px-3\",\n \"text-[length:var(--font-size-sm)] text-[var(--color-text-primary)]\",\n \"outline-none\",\n // Full-width background via pseudo-element\n \"before:absolute before:inset-y-0 before:left-[-100vw] before:right-0 before:-z-10 before:transition-colors\",\n isSelected\n ? \"before:bg-[var(--color-surface-selected)] hover:before:bg-[var(--color-surface-selected-hover)] border-l-2 border-l-[var(--color-brand-accent)]\"\n : \"hover:before:bg-[var(--color-surface-hover)]\",\n node.isFocused\n ? \"outline-2 outline-[var(--color-border-focus)] outline-offset-[-2px]\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n role=\"treeitem\"\n aria-selected={isCheckbox ? isChecked : node.isSelected}\n aria-expanded={node.isInternal ? node.isOpen : undefined}\n aria-level={node.level + 1}\n onPointerEnter={() => onHover?.(node.data)}\n onPointerLeave={() => onHoverEnd?.(node.data)}\n onClick={(e) => {\n if (isCheckbox) {\n onCheckToggle(node.id);\n } else {\n node.handleClick(e);\n }\n }}\n onKeyDown={(e) => {\n if (isCheckbox && (e.key === \" \" || e.key === \"Enter\")) {\n e.preventDefault();\n onCheckToggle(node.id);\n }\n }}\n >\n {/* Chevron toggle */}\n <button\n type=\"button\"\n className={[\n \"flex items-center justify-center w-6 h-6 shrink-0\",\n \"rounded-[var(--border-radius-sm)]\",\n \"text-[var(--color-text-secondary)]\",\n \"hover:text-[var(--color-text-primary)]\",\n \"transition-transform\",\n node.isInternal ? \"visible\" : \"invisible\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n node.toggle();\n }}\n tabIndex={-1}\n aria-label={node.isOpen ? \"Collapse\" : \"Expand\"}\n >\n <ChevronRight\n size={14}\n className={[\n \"transition-transform\",\n node.isOpen ? \"rotate-90\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n </button>\n\n {/* Checkbox (only in checkbox mode) */}\n {isCheckbox && (\n <div\n className={[\n \"flex items-center justify-center w-5 h-5 shrink-0\",\n \"rounded-[var(--border-radius-sm)] border transition-colors\",\n isChecked\n ? \"bg-[var(--color-action-primary)] border-[var(--color-action-primary)]\"\n : \"bg-[var(--color-surface-default)] border-[var(--color-border-default)] hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n role=\"checkbox\"\n aria-checked={isChecked}\n aria-label={`Select ${data.name}`}\n >\n {isChecked && (\n <Check\n className=\"w-3 h-3 text-[var(--color-text-inverse)]\"\n strokeWidth={3}\n />\n )}\n </div>\n )}\n\n {/* Icon */}\n <IconComponent\n size={16}\n className=\"shrink-0 text-[var(--color-text-secondary)]\"\n aria-hidden=\"true\"\n />\n\n {/* Name */}\n <span className=\"truncate\">{data.name}</span>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Tree component */\n/* ------------------------------------------------------------------ */\n\nexport function Tree<T extends TreeNode = TreeNode>({\n data,\n \"aria-label\": ariaLabel,\n size = \"comfortable\",\n selectionMode = \"single\",\n selectedIds,\n onSelectionChange,\n onActivate,\n onHover,\n onHoverEnd,\n openByDefault = false,\n searchTerm,\n searchMatch,\n height = 400,\n indent = 24,\n disableDrag = true,\n disableDrop = true,\n treeRef,\n className,\n}: TreeProps<T>) {\n const internalRef = useRef<TreeApi<T>>(null);\n\n // Expose tree API via treeRef\n useImperativeHandle(treeRef, () => internalRef.current!, []);\n\n // Checkbox state (managed separately from react-arborist selection)\n const [internalChecked, setInternalChecked] = useState<Set<string>>(\n () => new Set(),\n );\n const checkedIds = selectedIds ?? internalChecked;\n\n const handleCheckToggle = useCallback(\n (id: string) => {\n const next = new Set(checkedIds);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n if (onSelectionChange) {\n onSelectionChange(next);\n } else {\n setInternalChecked(next);\n }\n },\n [checkedIds, onSelectionChange],\n );\n\n // Selection handling for non-checkbox modes\n const handleSelect = useCallback(\n (nodes: NodeApi<T>[]) => {\n if (selectionMode === \"checkbox\" || selectionMode === \"none\") return;\n if (onSelectionChange) {\n onSelectionChange(new Set(nodes.map((n) => n.id)));\n }\n },\n [selectionMode, onSelectionChange],\n );\n\n // Activation handling\n const handleActivate = useCallback(\n (node: NodeApi<T>) => {\n if (onActivate) {\n onActivate(node.data);\n }\n },\n [onActivate],\n );\n\n // Search match adapter: react-arborist passes NodeApi, our prop passes T\n const arboristSearchMatch = searchMatch\n ? (node: NodeApi<T>, term: string) => searchMatch(node.data, term)\n : undefined;\n\n // Selection prop for react-arborist (controls selected node by id)\n // In single mode, pass the first selectedId. In multi, arborist handles it via onSelect.\n const selectionProp =\n selectionMode === \"single\" && selectedIds && selectedIds.size > 0\n ? [...selectedIds][0]\n : undefined;\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n className={[\"outline-none overflow-hidden\", className].filter(Boolean).join(\" \")}\n >\n <ArboristTree<T>\n ref={internalRef}\n data={data as T[]}\n width=\"100%\"\n height={height}\n rowHeight={rowHeightMap[size]}\n indent={indent}\n openByDefault={openByDefault}\n searchTerm={searchTerm}\n searchMatch={arboristSearchMatch}\n disableDrag={disableDrag}\n disableDrop={disableDrop}\n disableMultiSelection={selectionMode === \"single\" || selectionMode === \"none\"}\n selection={selectionProp}\n onSelect={handleSelect}\n onActivate={handleActivate}\n disableEdit={true}\n >\n {(props) => (\n <NodeRenderer<T>\n {...props}\n checkedIds={checkedIds}\n onCheckToggle={handleCheckToggle}\n selectionMode={selectionMode}\n size={size}\n onHover={onHover}\n onHoverEnd={onHoverEnd}\n />\n )}\n </ArboristTree>\n </div>\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-[var(--border-radius-lg)] border border-[var(--color-border-default)] bg-[var(--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-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-surface-default)] text-[var(--color-text-primary)] shadow-sm font-[var(--font-weight-semibold)]\"\n : isPressed\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : isHovered\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : \"bg-transparent text-[var(--color-text-secondary)]\",\n\n className,\n )\n }\n />\n );\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\nimport {\n File,\n FileSpreadsheet,\n Folder,\n Image,\n Info,\n Microscope,\n type LucideIcon,\n} from \"lucide-react\";\nimport { IconButton } from \"../IconButton\";\n\n/* ------------------------------------------------------------------ */\n/* File type helpers */\n/* ------------------------------------------------------------------ */\n\nexport function getFileIcon(\n type: \"directory\" | \"file\",\n extension?: string,\n): LucideIcon {\n if (type === \"directory\") return Folder;\n const ext = (extension ?? \"\").toLowerCase();\n if (ext === \"ome.tif\" || ext === \"ome.tiff\") return Microscope;\n if (/^(tiff?|png|jpe?g)$/.test(ext)) return Image;\n if (/^(csv|parquet)$/.test(ext)) return FileSpreadsheet;\n return File;\n}\n\nexport function getTypeLabel(\n type: \"directory\" | \"file\",\n extension?: string,\n): string {\n if (type === \"directory\") return \"Folder\";\n const ext = (extension ?? \"\").toLowerCase();\n if (ext === \"ome.tif\" || ext === \"ome.tiff\") return \"OME-TIFF\";\n if (/^tiff?$/.test(ext)) return \"TIFF\";\n if (ext === \"csv\") return \"CSV\";\n if (ext === \"parquet\") return \"Parquet\";\n if (ext === \"png\") return \"PNG\";\n if (/^jpe?g$/.test(ext)) return \"JPEG\";\n return ext.toUpperCase() || \"File\";\n}\n\nexport function FileIcon({\n type,\n extension,\n size = 16,\n}: {\n type: \"directory\" | \"file\";\n extension?: string;\n size?: number;\n}) {\n const IconComponent = getFileIcon(type, extension);\n return (\n <IconComponent\n size={size}\n className=\"shrink-0 text-[var(--color-text-secondary)]\"\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* FileCard */\n/* ------------------------------------------------------------------ */\n\nexport interface FileCardProps {\n /** File or folder name */\n name: string;\n /** Whether this is a directory or file */\n type: \"directory\" | \"file\";\n /** Human-readable file size (e.g., \"12.3 GB\") */\n size?: string;\n /** Last modified date/time */\n modified?: string;\n /** File extension (e.g., \"ome.tif\", \"csv\") */\n extension?: string;\n /** Whether a thumbnail preview is available */\n hasPreview?: boolean;\n /** Compact mode (smaller card, square aspect, minimal metadata) */\n compact?: boolean;\n /** Custom thumbnail content (e.g., an image preview) */\n children?: React.ReactNode;\n /** Info button handler */\n onInfo?: () => void;\n /** Navigation target — clicking the card navigates here */\n href?: string;\n /** Handler for click/press interaction (use instead of href for programmatic navigation) */\n onPress?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function FileCard({\n name,\n type,\n size,\n extension,\n compact = false,\n children,\n onInfo,\n href,\n onPress,\n className,\n}: FileCardProps) {\n const isInteractive = !!href || !!onPress;\n\n const radius = compact\n ? \"rounded-[var(--border-radius-md)]\"\n : \"rounded-[var(--border-radius-lg)]\";\n\n const IconComponent = getFileIcon(type, extension);\n const iconSize = compact ? 24 : 32;\n const iconColor =\n type === \"directory\"\n ? \"text-[var(--color-text-tertiary)]\"\n : \"text-[var(--color-text-secondary)]\";\n\n const thumbnailClass = compact\n ? \"aspect-square rounded-t-[var(--border-radius-md)]\"\n : \"aspect-[4/3] rounded-t-[var(--border-radius-lg)]\";\n\n const handleInfoClick = useCallback(\n (e: React.MouseEvent | React.KeyboardEvent) => {\n if (isInteractive) {\n e.stopPropagation();\n e.preventDefault();\n }\n onInfo?.();\n },\n [onInfo, isInteractive],\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 cardContent = (\n <>\n {/* Thumbnail area */}\n <div\n className={`shrink-0 overflow-hidden bg-[var(--color-neutral-900)] ${thumbnailClass}`}\n >\n {children ? (\n <div className=\"h-full w-full overflow-hidden\">{children}</div>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <IconComponent size={iconSize} className={iconColor} />\n </div>\n )}\n </div>\n\n {/* Metadata area */}\n <div\n className={[\n \"flex flex-col border-t border-[var(--color-border-default)]\",\n \"bg-[var(--color-surface-default)]\",\n compact\n ? \"px-2 py-1.5 rounded-b-[var(--border-radius-md)]\"\n : \"gap-0.5 px-3 py-2 rounded-b-[var(--border-radius-lg)]\",\n ].join(\" \")}\n >\n {compact ? (\n <span className=\"text-xs font-medium text-[var(--color-text-primary)] truncate\">\n {name}\n </span>\n ) : (\n <>\n <span className=\"flex items-center gap-1.5\">\n <FileIcon type={type} extension={extension} size={16} />\n <span className=\"min-w-0 flex-1 text-sm font-medium text-[var(--color-text-primary)] truncate\">\n {name}\n </span>\n {onInfo && (\n <span\n onClick={handleInfoClick}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleInfoClick(e);\n }\n }}\n role=\"presentation\"\n >\n <IconButton\n icon={Info}\n aria-label={`Show info for ${name}`}\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 -mt-0.5 -mr-1\"\n onPress={onInfo}\n />\n </span>\n )}\n </span>\n {size && (\n <span className=\"text-xs text-[var(--color-text-secondary)] tabular-nums pl-[22px]\">\n {size}\n </span>\n )}\n </>\n )}\n </div>\n </>\n );\n\n const baseStyles = [\n \"group flex flex-col overflow-hidden\",\n radius,\n \"border border-[var(--color-border-default)]\",\n \"shadow-sm\",\n \"transition-all\",\n isInteractive &&\n \"hover:border-[var(--color-border-focus)] hover:shadow-md cursor-pointer\",\n isInteractive &&\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (href) {\n return (\n <a\n href={href}\n aria-label={name}\n className={[baseStyles, \"no-underline\"].join(\" \")}\n >\n {cardContent}\n </a>\n );\n }\n\n if (onPress) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={name}\n className={baseStyles}\n onClick={onPress}\n onKeyDown={handleKeyDown}\n >\n {cardContent}\n </div>\n );\n }\n\n return <div className={baseStyles}>{cardContent}</div>;\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\nimport { AlertCircle, Database, Info } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\nimport { IconButton } from \"../IconButton\";\nimport type { PillColor } from \"../Pill\";\nimport { Pill } from \"../Pill\";\nimport { Spinner } from \"../Spinner\";\n\nexport interface StorageConnectionCardProps {\n /** Display name for the connection */\n name: string;\n /** Cloud provider identifier (e.g., \"aws\", \"minio\", \"azure\", \"gcp\"). When omitted, the provider badge and region are hidden. */\n provider?: string;\n /** AWS region or equivalent (only rendered when provider is set) */\n region?: string;\n /** Connection health status. When omitted, the status dot is hidden and the preview area behaves as \"connected\". */\n status?: \"connected\" | \"error\" | \"loading\";\n /** Human-readable error message when status is \"error\" */\n errorMessage?: string;\n /** Number of viewable images in the bucket */\n imageCount?: number;\n /** Children rendered in the preview area (e.g., an actual tile viewer, or an img) */\n children?: React.ReactNode;\n /** Navigation target — clicking the card navigates here */\n href?: string;\n /** Handler for click/press interaction (use instead of href for programmatic navigation) */\n onPress?: () => void;\n /** Info button handler */\n onInfo?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport const statusDotStyles = {\n connected: \"bg-[var(--color-status-success)]\",\n error: \"border-2 border-[var(--color-status-danger)] bg-transparent\",\n loading: \"bg-[var(--color-status-warning)] animate-pulse\",\n} as const;\n\nconst providerConfig: Record<string, { label: string; color: PillColor }> = {\n aws: { label: \"AWS\", color: \"purple\" },\n azure: { label: \"Azure\", color: \"teal\" },\n gcp: { label: \"GCP\", color: \"slate\" },\n minio: { label: \"MinIO\", color: \"rose\" },\n};\n\nexport function ProviderBadge({ provider }: { provider: string }) {\n const config = providerConfig[provider.toLowerCase()];\n const label = config?.label ?? provider;\n const color: PillColor = config?.color ?? \"neutral\";\n\n return (\n <Pill color={color}>\n {label}\n </Pill>\n );\n}\n\nfunction PreviewArea({\n status = \"connected\",\n errorMessage,\n children,\n}: Pick<StorageConnectionCardProps, \"status\" | \"errorMessage\" | \"children\">) {\n if (status === \"loading\") {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Spinner size=\"lg\" aria-label=\"Loading connection\" />\n </div>\n );\n }\n\n if (status === \"error\") {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-2 bg-[var(--color-surface-danger)] px-4\">\n <Icon\n icon={AlertCircle}\n size=\"lg\"\n className=\"text-[var(--color-text-danger)]\"\n />\n {errorMessage && (\n <p className=\"text-center text-xs text-[var(--color-text-danger)]\">{errorMessage}</p>\n )}\n </div>\n );\n }\n\n if (children) {\n return <div className=\"h-full w-full overflow-hidden\">{children}</div>;\n }\n\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Icon\n icon={Database}\n size=\"xl\"\n className=\"text-[var(--color-text-secondary)]\"\n />\n </div>\n );\n}\n\nexport function StorageConnectionCard({\n name,\n provider,\n region,\n status,\n errorMessage,\n imageCount,\n children,\n href,\n onPress,\n onInfo,\n className,\n}: StorageConnectionCardProps) {\n const isInteractive = !!href || !!onPress;\n\n const handleInfoPress = useCallback(\n (e: React.MouseEvent | React.KeyboardEvent) => {\n if (isInteractive) {\n e.stopPropagation();\n e.preventDefault();\n }\n onInfo?.();\n },\n [onInfo, isInteractive],\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 cardContent = (\n <>\n {/* Preview area */}\n <div className=\"aspect-[4/3] bg-[var(--color-neutral-900)] overflow-hidden rounded-t-[var(--border-radius-lg)]\">\n <PreviewArea status={status} errorMessage={errorMessage}>\n {children}\n </PreviewArea>\n </div>\n\n {/* Info bar */}\n <div className=\"flex flex-col gap-1.5 border-t border-[var(--color-border-default)] bg-[var(--color-surface-default)] px-3 py-2.5 rounded-b-[var(--border-radius-lg)]\">\n {/* Top row: status dot + name + info button */}\n <div className=\"flex items-start gap-2\">\n {status && (\n <span\n className={twMerge(\n \"mt-1.5 h-2 w-2 shrink-0 rounded-full\",\n statusDotStyles[status],\n )}\n aria-label={`Status: ${status}`}\n />\n )}\n <span className=\"min-w-0 flex-1 line-clamp-2 text-sm font-medium text-[var(--color-text-primary)]\">\n {name}\n </span>\n {onInfo && (\n <span\n onClick={handleInfoPress}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleInfoPress(e);\n }\n }}\n role=\"presentation\"\n >\n <IconButton\n icon={Info}\n aria-label=\"Connection info\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 -mt-1 -mr-1\"\n onPress={onInfo}\n />\n </span>\n )}\n </div>\n\n {/* Bottom row: provider badge + region + image count */}\n {(provider || (imageCount != null && (!status || status === \"connected\"))) && (\n <div className={twMerge(\"flex items-center gap-2\", status && \"pl-4\")}>\n {provider && <ProviderBadge provider={provider} />}\n {provider && region && (\n <span className=\"shrink-0 text-xs text-[var(--color-text-secondary)]\">\n {region}\n </span>\n )}\n {imageCount != null && (!status || status === \"connected\") && (\n <span className=\"ml-auto shrink-0 text-xs tabular-nums text-[var(--color-text-secondary)]\">\n {imageCount} {imageCount === 1 ? \"image\" : \"images\"}\n </span>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n const baseStyles = twMerge(\n \"flex flex-col overflow-hidden rounded-[var(--border-radius-lg)]\",\n \"border border-[var(--color-border-default)]\",\n \"shadow-sm transition-all\",\n isInteractive && \"hover:border-[var(--color-border-focus)] hover:shadow-md cursor-pointer\",\n isInteractive && \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n if (href) {\n return (\n <a href={href} className={twMerge(baseStyles, \"no-underline\")}>\n {cardContent}\n </a>\n );\n }\n\n if (onPress) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={baseStyles}\n onClick={onPress}\n onKeyDown={handleKeyDown}\n >\n {cardContent}\n </div>\n );\n }\n\n return <div className={baseStyles}>{cardContent}</div>;\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Available pill color variants, mapped to existing badge design tokens.\n *\n * The seven base variants correspond 1:1 to the `--color-badge-*` token set\n * defined in `tokens/semantic.json`.\n */\nexport type PillColor =\n | \"neutral\"\n | \"purple\"\n | \"teal\"\n | \"rose\"\n | \"slate\"\n | \"green\"\n | \"amber\";\n\nexport interface PillProps {\n /** Pill label content */\n children: React.ReactNode;\n /**\n * Explicit color variant, or `\"auto\"` to derive from `name` via\n * deterministic hash. Defaults to `\"auto\"` when `name` is provided,\n * `\"neutral\"` otherwise.\n */\n color?: PillColor | \"auto\";\n /**\n * String used for deterministic hash-based color assignment.\n * When provided and `color` is `\"auto\"` (or omitted), the pill color\n * is derived from this value so the same name always produces the same\n * color across renders and sessions.\n */\n name?: string;\n /** Additional CSS class names merged via tailwind-merge */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Deterministic hash -> color mapping */\n/* ------------------------------------------------------------------ */\n\n/**\n * Ordered color palette used by the hash function. The sequence mirrors\n * the cytario-web `pillColors` array, with each entry mapped to the\n * nearest available badge token variant.\n *\n * cytario-web name -> design-system badge variant\n * sky -> teal\n * amber -> amber\n * emerald -> green\n * rose -> rose\n * violet -> purple\n * orange -> amber (closest warm tone with existing tokens)\n * teal -> teal\n * fuchsia -> rose (closest pink tone with existing tokens)\n */\nconst HASH_PALETTE: PillColor[] = [\n \"teal\", // sky\n \"amber\", // amber\n \"green\", // emerald\n \"rose\", // rose\n \"purple\", // violet\n \"amber\", // orange (mapped to amber -- closest warm token)\n \"teal\", // teal\n \"rose\", // fuchsia (mapped to rose -- closest pink token)\n];\n\n/**\n * Deterministic string-to-color hash, matching the algorithm used in\n * cytario-web's `Pill.tsx`.\n */\nexport function pillColorFromName(name: string): 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 HASH_PALETTE[Math.abs(hash) % HASH_PALETTE.length];\n}\n\n/* ------------------------------------------------------------------ */\n/* Variant styles */\n/* ------------------------------------------------------------------ */\n\nconst colorStyles: Record<PillColor, string> = {\n neutral:\n \"bg-[var(--color-badge-neutral-bg)] text-[var(--color-badge-neutral-text)]\",\n purple:\n \"bg-[var(--color-badge-purple-bg)] text-[var(--color-badge-purple-text)]\",\n teal:\n \"bg-[var(--color-badge-teal-bg)] text-[var(--color-badge-teal-text)]\",\n rose:\n \"bg-[var(--color-badge-rose-bg)] text-[var(--color-badge-rose-text)]\",\n slate:\n \"bg-[var(--color-badge-slate-bg)] text-[var(--color-badge-slate-text)]\",\n green:\n \"bg-[var(--color-badge-green-bg)] text-[var(--color-badge-green-text)]\",\n amber:\n \"bg-[var(--color-badge-amber-bg)] text-[var(--color-badge-amber-text)]\",\n};\n\n/**\n * CSS class for the dot indicator used in GroupPill collapsed segments.\n * Exported so GroupPill can reuse it without duplicating the mapping.\n */\nexport const dotColorStyles: Record<PillColor, string> = {\n neutral: \"bg-[var(--color-badge-neutral-text)]\",\n purple: \"bg-[var(--color-badge-purple-text)]\",\n teal: \"bg-[var(--color-badge-teal-text)]\",\n rose: \"bg-[var(--color-badge-rose-text)]\",\n slate: \"bg-[var(--color-badge-slate-text)]\",\n green: \"bg-[var(--color-badge-green-text)]\",\n amber: \"bg-[var(--color-badge-amber-text)]\",\n};\n\n/* ------------------------------------------------------------------ */\n/* Resolve effective color */\n/* ------------------------------------------------------------------ */\n\nfunction resolveColor(\n color: PillColor | \"auto\" | undefined,\n name: string | undefined,\n): PillColor {\n if (color && color !== \"auto\") return color;\n if (name) return pillColorFromName(name);\n return \"neutral\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pill -- a small, rounded label used for tags, user groups, and status\n * indicators. Supports deterministic hash-based coloring so the same\n * `name` always renders the same color.\n */\nexport function Pill({ children, color, name, className }: PillProps) {\n const resolved = resolveColor(color, name);\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center rounded-full\",\n \"px-2 py-0.5\",\n \"text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-tight)]\",\n colorStyles[resolved],\n className,\n )}\n >\n {children}\n </span>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Pill, pillColorFromName, dotColorStyles } from \"./Pill\";\n\nexport interface GroupPillProps {\n /**\n * Slash-separated group path, e.g. `\"/org/team/admins\"`.\n * Leading slash is optional and stripped before splitting.\n */\n path: string;\n /**\n * Maximum number of path segments to display as full pills.\n * Extra leading segments are collapsed into small colored dots.\n * @default 3\n */\n visibleCount?: number;\n /** Additional CSS class names merged via tailwind-merge */\n className?: string;\n}\n\n/**\n * GroupPill -- displays a hierarchical group path as a row of\n * deterministically-colored pills. When the path has more segments\n * than `visibleCount`, the leading overflow segments are shown as\n * small colored dots to preserve context without consuming space.\n */\nexport function GroupPill({\n path,\n visibleCount = 3,\n className,\n}: GroupPillProps) {\n // Normalise: strip leading/trailing slashes, split, drop empty segments\n const segments = path\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n if (segments.length === 0) return null;\n\n const hiddenCount = Math.max(0, segments.length - visibleCount);\n const hiddenSegments = segments.slice(0, hiddenCount);\n const visibleSegments = segments.slice(hiddenCount);\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1\",\n className,\n )}\n aria-label={`Group: ${segments.join(\" / \")}`}\n >\n {/* Collapsed dots for hidden leading segments */}\n {hiddenSegments.map((segment, index) => {\n const color = pillColorFromName(segment);\n return (\n <span\n key={`dot-${index}-${segment}`}\n className={twMerge(\n \"inline-block size-2 shrink-0 rounded-full\",\n dotColorStyles[color],\n )}\n aria-hidden=\"true\"\n title={segment}\n />\n );\n })}\n\n {/* Visible segment pills */}\n {visibleSegments.map((segment, index) => (\n <Pill key={`pill-${index}-${segment}`} name={segment}>\n {segment}\n </Pill>\n ))}\n </span>\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-[var(--color-badge-neutral-bg)] text-[var(--color-badge-neutral-text)]\",\n purple:\n \"bg-[var(--color-badge-purple-bg)] text-[var(--color-badge-purple-text)]\",\n teal: \"bg-[var(--color-badge-teal-bg)] text-[var(--color-badge-teal-text)]\",\n rose: \"bg-[var(--color-badge-rose-bg)] text-[var(--color-badge-rose-text)]\",\n slate:\n \"bg-[var(--color-badge-slate-bg)] text-[var(--color-badge-slate-text)]\",\n green:\n \"bg-[var(--color-badge-green-bg)] text-[var(--color-badge-green-text)]\",\n amber:\n \"bg-[var(--color-badge-amber-bg)] text-[var(--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-[var(--border-radius-full)]\",\n \"text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-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-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] overflow-hidden shadow-sm\",\n isInteractive && \"transition-all hover:shadow-md hover:border-[var(--color-border-focus)] cursor-pointer\",\n (href || onPress) && \"block focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--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-[var(--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-[var(--color-delta-increase-text)]\",\n decrease: \"text-[var(--color-delta-decrease-text)]\",\n flat: \"text-[var(--color-delta-flat-text)]\",\n};\n\nconst reverseDirectionColors: Record<Direction, string> = {\n increase: \"text-[var(--color-delta-decrease-text)]\",\n decrease: \"text-[var(--color-delta-increase-text)]\",\n flat: \"text-[var(--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-[var(--color-delta-increase-bg)]\",\n decrease: \"bg-[var(--color-delta-decrease-bg)]\",\n flat: \"bg-[var(--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-[number:var(--font-weight-medium)]\",\n \"text-[var(--color-text-tertiary)]\",\n className,\n )}\n >\n {label && (\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--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-[number:var(--font-weight-medium)]\",\n colorStyles,\n isPill && [\n \"rounded-[var(--border-radius-full)] px-2 py-0.5\",\n \"text-[length:var(--font-size-xs)]\",\n directionBgColors[direction],\n ],\n className,\n )}\n >\n {label && (\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--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-[var(--color-progress-fill)]\",\n success: \"bg-[var(--color-progress-fill-success)]\",\n warning: \"bg-[var(--color-progress-fill-warning)]\",\n danger: \"bg-[var(--color-progress-fill-danger)]\",\n neutral: \"bg-[var(--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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)] text-[var(--color-text-primary)]\">\n {label}\n </span>\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--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-[var(--border-radius-full)] bg-[var(--color-progress-track)]\",\n sizeStyles[size],\n )}\n >\n <div\n className={twMerge(\n \"h-full rounded-[var(--border-radius-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-[var(--color-banner-info-bg)] border-[var(--color-banner-info-border)] text-[var(--color-banner-info-text)]\",\n iconClass: \"text-[var(--color-banner-info-icon)]\",\n role: \"status\",\n },\n warning: {\n icon: AlertTriangle,\n containerClass:\n \"bg-[var(--color-banner-warning-bg)] border-[var(--color-banner-warning-border)] text-[var(--color-banner-warning-text)]\",\n iconClass: \"text-[var(--color-banner-warning-icon)]\",\n role: \"alert\",\n },\n danger: {\n icon: AlertCircle,\n containerClass:\n \"bg-[var(--color-banner-danger-bg)] border-[var(--color-banner-danger-border)] text-[var(--color-banner-danger-text)]\",\n iconClass: \"text-[var(--color-banner-danger-icon)]\",\n role: \"alert\",\n },\n success: {\n icon: CheckCircle2,\n containerClass:\n \"bg-[var(--color-banner-success-bg)] border-[var(--color-banner-success-border)] text-[var(--color-banner-success-text)]\",\n iconClass: \"text-[var(--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-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-3)]\",\n \"text-[length:var(--font-size-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-[number:var(--font-weight-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-[var(--border-radius-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-[length:var(--font-size-xs)]\",\n valueClass: \"text-[length:var(--font-size-xl)]\",\n },\n md: {\n padding: \"p-4\",\n labelClass: \"text-[length:var(--font-size-sm)]\",\n valueClass: \"text-[length:var(--font-size-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-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] shadow-sm\",\n config.padding,\n href &&\n \"block transition-shadow hover:shadow-md hover:border-[var(--color-border-focus)] focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-text-secondary)]\")}>\n {label}\n </div>\n <div\n className={twMerge(\n config.valueClass,\n \"font-[number:var(--font-weight-semibold)] text-[var(--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-[var(--spacing-3)] py-[var(--spacing-4)]\",\n className,\n )}\n >\n <H2>{title}</H2>\n {children && (\n <div className=\"ml-auto flex flex-wrap items-center gap-[var(--spacing-2)]\">\n {children}\n </div>\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-[var(--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-[var(--color-brand-primary)]\"\n : \"bg-[var(--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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)]\",\n \"transition-colors\",\n isCompleted\n ? \"bg-[var(--color-brand-primary)] text-[var(--color-text-inverse)]\"\n : \"\",\n isCurrent\n ? \"border-2 border-[var(--color-brand-primary)] bg-[var(--color-surface-default)] text-[var(--color-brand-primary)]\"\n : \"\",\n isFuture\n ? \"border-2 border-[var(--color-border-default)] bg-[var(--color-surface-default)] text-[var(--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-[var(--color-brand-primary)]\"\n : \"bg-[var(--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-[var(--spacing-2)] text-center text-[length:var(--font-size-sm)]\",\n isCurrent\n ? \"font-[number:var(--font-weight-semibold)] text-[var(--color-text-primary)]\"\n : \"font-[number:var(--font-weight-regular)] text-[var(--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-[var(--spacing-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 = \"#35b7b8\";\nexport const ColorActionPrimaryHover = \"#2a9b9c\";\nexport const ColorActionPrimaryActive = \"#217d7e\";\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 = \"#217d7e\";\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 = \"#b45309\";\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","AriaButton","jsx","iconSizeMap","groupRadiusClass","AriaButton","jsx","jsxs","Button","Label","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","sizeStyles","createContext","useContext","X","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Label","jsx","jsxs","Label","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","sizeStyles","squareSizeStyles","variantStyles","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","AriaDialog","AriaButton","Fragment","jsx","Popover","createContext","useContext","twMerge","jsx","sizeStyles","Tabs","TabList","Tab","TabPanel","useCallback","useRef","useState","ChevronRight","Check","jsx","jsxs","createContext","useContext","twMerge","AriaToggleButton","jsx","sizeStyles","useCallback","File","Folder","Info","Fragment","jsx","jsxs","Folder","File","useCallback","Info","useCallback","Info","twMerge","twMerge","jsx","twMerge","jsx","jsxs","twMerge","Fragment","jsx","jsxs","useCallback","twMerge","Info","twMerge","jsx","jsxs","variantStyles","sizeStyles","iconSizeMap","useCallback","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","colorStyles","twMerge","jsx","jsxs","sizeStyles","useState","Info","AlertCircle","X","twMerge","jsx","jsxs","variantConfig","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","twMerge","createContext","useContext","useCallback","jsx","jsx","jsxs","CheckIcon","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/InputGroup/InputGroupContext.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/IconButton/IconButton.tsx","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../src/components/Table/Table.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Toast/Toast.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.tsx","../src/components/Radio/Radio.tsx","../src/components/Label/Label.tsx","../src/components/Field/Field.tsx","../src/components/Fieldset/Fieldset.tsx","../src/components/InputGroup/InputGroup.tsx","../src/components/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/Tree/Tree.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/FileCard/FileCard.tsx","../src/components/StorageConnectionCard/StorageConnectionCard.tsx","../src/components/Pill/Pill.tsx","../src/components/Pill/GroupPill.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/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 { ButtonProps, ButtonVariant, ButtonSize } 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 { IconButton } from \"./components/IconButton\";\nexport type { IconButtonProps } from \"./components/IconButton\";\n\nexport { Input } from \"./components/Input\";\nexport type { InputProps } from \"./components/Input\";\n\nexport { Select } from \"./components/Select\";\nexport type { SelectProps, SelectItem } from \"./components/Select\";\n\nexport { Table, TableHeader, Column, TableBody, Row, Cell } 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 { ToastData, ToastVariant, ToastPlacement, ToastContextValue, ToastBridge, ToastProviderProps } from \"./components/Toast\";\n\nexport { EmptyState } from \"./components/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState\";\n\nexport { Checkbox } from \"./components/Checkbox\";\nexport type { CheckboxProps } from \"./components/Checkbox\";\n\nexport { Switch } from \"./components/Switch\";\nexport type { SwitchProps } from \"./components/Switch\";\n\nexport { RadioGroup, Radio, RadioButton } from \"./components/Radio\";\nexport type { RadioGroupProps, RadioProps, RadioButtonProps } from \"./components/Radio\";\n\nexport { Label } from \"./components/Label\";\nexport type { LabelProps } from \"./components/Label\";\n\nexport { Field } from \"./components/Field\";\nexport type { FieldProps } from \"./components/Field\";\n\nexport { Fieldset } from \"./components/Fieldset\";\nexport type { FieldsetProps } from \"./components/Fieldset\";\n\nexport { InputGroup, InputGroupContext, useInputGroup } from \"./components/InputGroup\";\nexport type { InputGroupProps, GroupPosition } from \"./components/InputGroup\";\n\nexport { InputAddon } from \"./components/InputAddon\";\nexport type { InputAddonProps } from \"./components/InputAddon\";\n\nexport { Heading, H1, H2, H3 } from \"./components/Heading\";\nexport type { HeadingProps, HeadingLevel, HeadingSize } from \"./components/Heading\";\n\nexport { Link } from \"./components/Link\";\nexport type { LinkProps, LinkVariant } from \"./components/Link\";\n\nexport { Breadcrumbs } from \"./components/Breadcrumbs\";\nexport type { BreadcrumbsProps, BreadcrumbItem } from \"./components/Breadcrumbs\";\n\nexport { ButtonLink, IconButtonLink } from \"./components/ButtonLink\";\nexport type { ButtonLinkProps, IconButtonLinkProps } from \"./components/ButtonLink\";\n\nexport { ToggleButton } from \"./components/ToggleButton\";\nexport type { ToggleButtonProps, ToggleButtonVariant, ToggleButtonSize } from \"./components/ToggleButton\";\n\nexport { ToggleButtonGroup, ToggleButtonGroupItem } from \"./components/ToggleButtonGroup\";\nexport type {\n ToggleButtonGroupProps,\n ToggleButtonGroupItemProps,\n ToggleButtonGroupSize,\n} from \"./components/ToggleButtonGroup\";\n\nexport { Menu, MenuItem, MenuCheckboxItem, MenuSection, MenuHeader, MenuSeparator } 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 { PopoverProps, PopoverTriggerProps, PopoverContentProps } from \"./components/Popover\";\n\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps, TabsVariant, TabsSize } 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 { Tree } from \"./components/Tree\";\nexport type { TreeProps, TreeNode, TreeApi } from \"./components/Tree\";\n\nexport { SegmentedControl, SegmentedControlItem } from \"./components/SegmentedControl\";\nexport type {\n SegmentedControlProps,\n SegmentedControlItemProps,\n SegmentedControlSize,\n SegmentedControlSelectionMode,\n} from \"./components/SegmentedControl\";\n\nexport { FileCard, FileIcon, getFileIcon, getTypeLabel } from \"./components/FileCard\";\nexport type { FileCardProps } from \"./components/FileCard\";\n\nexport { StorageConnectionCard } from \"./components/StorageConnectionCard\";\nexport type { StorageConnectionCardProps } from \"./components/StorageConnectionCard\";\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 { DeltaIndicatorProps, DeltaFormat, DeltaMode } from \"./components/DeltaIndicator\";\n\nexport { ProgressBar } from \"./components/ProgressBar\";\nexport type { ProgressBarProps, ProgressBarVariant, ProgressBarSize } 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 } from \"./components/Pill\";\nexport type { PillProps, PillColor } from \"./components/Pill\";\n\nexport { GroupPill } from \"./components/Pill\";\nexport type { GroupPillProps } from \"./components/Pill\";\n\nexport { FormWizard, useFormWizard } from \"./components/FormWizard\";\nexport type { FormWizardProps, FormWizardContextValue } 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 ButtonVariant,\n type ButtonSize,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\n\nexport type { ButtonVariant, ButtonSize };\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 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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-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 radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-[var(--border-radius-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-[var(--color-border-focus)] focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-[var(--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\",\n radiusClass,\n \"font-[var(--font-weight-medium)]\",\n \"leading-[var(--line-height-tight)]\",\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n 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","export type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"default\"\n | \"success\"\n | \"info\"\n | \"neutral\";\n\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport const variantStyles: Record<ButtonVariant, string> = {\n primary: [\n \"bg-[var(--color-action-primary)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-primary-hover)]\",\n \"pressed:bg-[var(--color-action-primary-active)]\",\n ].join(\" \"),\n secondary: [\n \"bg-transparent text-[var(--color-action-secondary)]\",\n \"border border-[var(--color-border-brand)]\",\n \"hover:bg-[var(--color-purple-50)]\",\n \"pressed:bg-[var(--color-purple-100)]\",\n ].join(\" \"),\n ghost: [\n \"bg-transparent text-[var(--color-text-primary)]\",\n \"hover:bg-[var(--color-surface-hover)]\",\n \"pressed:bg-[var(--color-surface-pressed)]\",\n ].join(\" \"),\n destructive: [\n \"bg-[var(--color-action-danger)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-danger-hover)]\",\n \"pressed:bg-[var(--color-action-danger-hover)]\",\n ].join(\" \"),\n default: [\n \"bg-[var(--color-action-default)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-default-hover)]\",\n \"pressed:bg-[var(--color-slate-600)]\",\n ].join(\" \"),\n success: [\n \"bg-[var(--color-action-success)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-success-hover)]\",\n \"pressed:bg-[var(--color-green-800)]\",\n ].join(\" \"),\n info: [\n \"bg-[var(--color-action-info)] text-[var(--color-text-inverse)]\",\n \"hover:bg-[var(--color-action-info-hover)]\",\n \"pressed:bg-[var(--color-slate-800)]\",\n ].join(\" \"),\n neutral: [\n \"bg-[var(--color-surface-default)] text-[var(--color-text-primary)]\",\n \"border border-[var(--color-border-default)]\",\n \"hover:bg-[var(--color-surface-subtle)]\",\n \"pressed:bg-[var(--color-surface-muted)]\",\n ].join(\" \"),\n};\n\nexport const sizeStyles: Record<ButtonSize, 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","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 type React from \"react\";\nimport {\n Tooltip as AriaTooltip,\n TooltipTrigger,\n type TooltipProps as AriaTooltipProps,\n} from \"react-aria-components\";\n\nexport interface TooltipProps {\n /** Tooltip text content */\n content: string;\n /** Trigger element */\n children: React.ReactElement;\n /** Placement relative to trigger */\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Delay in ms before showing (default 500) */\n delay?: number;\n /** Additional CSS classes for the tooltip */\n className?: string;\n}\n\nexport function Tooltip({\n content,\n children,\n placement = \"top\",\n delay = 500,\n className,\n}: TooltipProps) {\n return (\n <TooltipTrigger delay={delay}>\n {children}\n <AriaTooltip\n placement={placement}\n className={[\n \"bg-[var(--color-surface-overlay)] backdrop-blur-sm\",\n \"text-[var(--color-text-inverse)] text-sm\",\n \"px-3 py-1.5\",\n \"rounded-[var(--border-radius-md)]\",\n \"max-w-xs\",\n \"entering:animate-in entering:fade-in entering:duration-150\",\n \"exiting:animate-out exiting:fade-out exiting:duration-100\",\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 className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {content}\n </AriaTooltip>\n </TooltipTrigger>\n );\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 \"../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?: \"sm\" | \"md\" | \"lg\";\n /** Show tooltip on hover (default true) */\n showTooltip?: boolean;\n /** Tooltip placement */\n tooltipPlacement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Shows a spinner and disables interaction */\n isLoading?: 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\nconst iconSizeMap = {\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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-md)]\";\n }\n}\n\nexport function IconButton({\n icon,\n \"aria-label\": ariaLabel,\n variant = \"ghost\",\n size = \"md\",\n showTooltip = true,\n tooltipPlacement = \"top\",\n isLoading = false,\n isDisabled,\n className,\n ...props\n}: IconButtonProps) {\n const { inGroup, position } = useInputGroup();\n\n const radiusClass = inGroup\n ? groupRadiusClass(position)\n : \"rounded-[var(--border-radius-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-[var(--color-border-focus)] focus-visible:ring-offset-0 focus-visible:z-10\"\n : \"focus-visible:ring-2 focus-visible:ring-[var(--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\",\n radiusClass,\n \"outline-none transition-colors\",\n focusRing,\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isLoading ? \"pointer-events-none\" : \"\",\n variantStyles[variant],\n 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} placement={tooltipPlacement}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n}\n","import {\n TextField,\n Label,\n Input as AriaInput,\n Text,\n type TextFieldProps,\n} from \"react-aria-components\";\nimport { useInputGroup } from \"../InputGroup/InputGroupContext\";\n\nconst sizeClasses = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-4 py-3 text-lg\",\n} as const;\n\nconst prefixSizeClasses = {\n sm: \"px-3 text-sm\",\n md: \"px-3 text-base\",\n lg: \"px-4 text-lg\",\n} as const;\n\nconst alignClasses = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\nexport interface InputProps\n extends Omit<TextFieldProps, \"children\" | \"className\"> {\n /** Label text displayed above the input. Omit for raw input mode. */\n label?: string;\n /** Placeholder text shown when the input is empty */\n placeholder?: string;\n /** Help text shown below the input */\n description?: string;\n /** Error message shown below the input (triggers error styling) */\n errorMessage?: string;\n /** HTML input type */\n type?: \"text\" | \"email\" | \"password\" | \"number\";\n /** Controls padding and font size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Text prefix shown inside the input on the left (e.g., \"$\", \"https://\") */\n prefix?: string;\n /** Text alignment within the input */\n align?: \"left\" | \"center\" | \"right\";\n /** Additional CSS class for the outer wrapper */\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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-md)]\";\n }\n}\n\nexport function Input({\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 isInvalid = !!errorMessage;\n const { inGroup, position } = useInputGroup();\n\n const borderColor = isInvalid\n ? \"border-[var(--color-border-danger)]\"\n : \"border-[var(--color-border-default)] hover:border-[var(--color-border-strong)]\";\n\n const radiusClass = inGroup\n ? groupRadiusClasses(position)\n : \"rounded-[var(--border-radius-md)]\";\n\n /** When not first in a group, overlap left border with previous sibling */\n const marginClass = inGroup && position !== \"start\" && position !== \"standalone\" ? \"-ml-px\" : \"\";\n\n return (\n <TextField\n {...props}\n type={type}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n className={[\n \"flex flex-col gap-[var(--spacing-1)]\",\n inGroup ? \"min-w-0 flex-1\" : \"\",\n marginClass,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {label && (\n <Label\n className={[\n \"text-[length:var(--font-size-sm)]\",\n \"font-[number:var(--font-weight-medium)]\",\n \"text-[var(--color-text-primary)]\",\n ].join(\" \")}\n >\n {label}\n {isRequired && (\n <span\n aria-hidden=\"true\"\n className=\"ml-0.5 text-[var(--color-text-danger)]\"\n >\n *\n </span>\n )}\n </Label>\n )}\n\n {prefix ? (\n <div\n className={[\n \"flex items-center overflow-hidden\",\n radiusClass,\n \"border\",\n \"bg-[var(--color-surface-default)]\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus-within:ring-2 focus-within:ring-[var(--color-border-focus)] focus-within:border-[var(--color-border-focus)]\",\n inGroup ? \"focus-within:z-10\" : \"\",\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <span\n className={[\n \"self-stretch flex items-center shrink-0 select-none\",\n \"bg-[var(--color-surface-subtle)]\",\n \"border-r border-r-[var(--color-border-default)]\",\n \"text-[var(--color-text-secondary)]\",\n prefixSizeClasses[size],\n ].join(\" \")}\n >\n {prefix}\n </span>\n <AriaInput\n placeholder={placeholder}\n className={[\n \"w-full bg-transparent\",\n sizeClasses[size],\n alignClasses[align],\n \"text-[var(--color-text-primary)]\",\n \"placeholder:text-[var(--color-text-tertiary)]\",\n \"outline-none border-none\",\n ].join(\" \")}\n />\n </div>\n ) : (\n <AriaInput\n placeholder={placeholder}\n className={[\n \"w-full\",\n sizeClasses[size],\n alignClasses[align],\n radiusClass,\n \"border\",\n \"text-[var(--color-text-primary)]\",\n \"bg-[var(--color-surface-default)]\",\n \"placeholder:text-[var(--color-text-tertiary)]\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus:ring-2 focus:ring-[var(--color-border-focus)] focus:border-[var(--color-border-focus)]\",\n inGroup ? \"focus:z-10\" : \"\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n ].join(\" \")}\n />\n )}\n\n {description && !isInvalid && (\n <Text\n slot=\"description\"\n className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]\"\n >\n {description}\n </Text>\n )}\n\n {isInvalid && (\n <Text\n slot=\"errorMessage\"\n className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-danger)]\"\n >\n {errorMessage}\n </Text>\n )}\n </TextField>\n );\n}\n","import {\n Button,\n Label,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n SelectValue,\n type SelectProps as AriaSelectProps,\n type Key,\n} from \"react-aria-components\";\n\nexport interface SelectItem {\n id: string;\n name: string;\n}\n\nexport interface SelectProps\n extends Omit<AriaSelectProps<SelectItem>, \"children\"> {\n /** Label displayed above the trigger (always visible) */\n label: string;\n /** Options to display in the dropdown */\n items: SelectItem[];\n /** Placeholder text when no item is selected */\n placeholder?: string;\n /** Error message displayed below the trigger */\n errorMessage?: string;\n /** When true, visually hides the label (remains accessible to screen readers). Useful when Select is used inside a Field that already renders a visible label. */\n hideLabel?: boolean;\n}\n\nfunction ChevronDown() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-[var(--color-text-secondary)]\"\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=\"M4 6l4 4 4-4\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-[var(--color-action-primary)]\"\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 function Select({\n label,\n items,\n placeholder = \"Select an option\",\n errorMessage,\n hideLabel = false,\n isDisabled,\n isRequired,\n className,\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={[\"flex flex-col gap-[var(--spacing-1)]\", className].filter(Boolean).join(\" \")}\n >\n <Label\n className={[\n \"text-[length:var(--font-size-sm)] font-[var(--font-weight-medium)] text-[var(--color-text-primary)]\",\n hideLabel && \"sr-only\",\n ].filter(Boolean).join(\" \")}\n >\n {label}\n {isRequired && (\n <span\n aria-hidden=\"true\"\n className=\"ml-0.5 text-[var(--color-text-danger)]\"\n >\n *\n </span>\n )}\n </Label>\n\n <Button\n className={[\n \"inline-flex items-center justify-between\",\n \"w-full rounded-[var(--border-radius-md)] px-4 py-2\",\n \"text-base text-left\",\n \"border outline-none transition-colors\",\n hasError\n ? \"border-[var(--color-border-danger)]\"\n : \"border-[var(--color-border-default)]\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"bg-[var(--color-surface-default)]\",\n ].join(\" \")}\n >\n <SelectValue className=\"truncate data-[placeholder]:text-[var(--color-text-tertiary)]\">\n {({ selectedText }) => selectedText || placeholder}\n </SelectValue>\n <ChevronDown />\n </Button>\n\n {hasError && (\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-danger)]\">\n {errorMessage}\n </span>\n )}\n\n <Popover\n className={[\n \"w-[var(--trigger-width)]\",\n \"rounded-[var(--border-radius-md)]\",\n \"border border-[var(--color-border-default)]\",\n \"bg-[var(--color-surface-default)]\",\n \"shadow-lg\",\n \"overflow-auto\",\n \"entering:animate-in entering:fade-in entering:slide-in-from-top-1\",\n \"exiting:animate-out exiting:fade-out exiting:slide-out-to-top-1\",\n ].join(\" \")}\n >\n <ListBox className=\"p-1 outline-none\" items={items}>\n {(item) => (\n <ListBoxItem\n id={item.id}\n textValue={item.name}\n className={[\n \"flex items-center justify-between gap-2\",\n \"px-4 py-2 rounded-[var(--border-radius-sm)]\",\n \"text-base text-[var(--color-text-primary)]\",\n \"cursor-pointer outline-none\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"focus:bg-[var(--color-surface-muted)]\",\n \"selected:text-[var(--color-action-primary)] selected:font-[var(--font-weight-medium)]\",\n ].join(\" \")}\n >\n {({ isSelected }) => (\n <>\n <span className=\"truncate\">{item.name}</span>\n {isSelected && <CheckIcon />}\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-[var(--font-size-sm)] text-[var(--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-[var(--font-weight-semibold)] text-[var(--color-text-secondary)]\",\n \"border-b-2 border-[var(--color-border-default)]\",\n \"cursor-default select-none outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-[var(--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-[var(--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-[var(--color-border-default)]\",\n \"even:bg-[var(--color-surface-subtle)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-[var(--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-[var(--table-row-py)]\",\n \"text-[var(--color-text-primary)]\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-[var(--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-[var(--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-[var(--color-surface-default)] rounded-[var(--border-radius-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-[var(--color-border-default)]\">\n <Heading\n slot=\"title\"\n className=\"text-[length:var(--font-size-lg)] font-[number:var(--font-weight-semibold)] text-[var(--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-[var(--border-radius-sm)] p-1\",\n \"text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-surface-muted)]\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--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 {\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-[var(--color-surface-success)] border-[var(--color-border-success)] text-[var(--color-text-success)]\",\n iconClass: \"text-[var(--color-action-success)]\",\n },\n error: {\n icon: XCircle,\n containerClass: \"bg-[var(--color-surface-danger)] border-[var(--color-border-danger)] text-[var(--color-text-danger)]\",\n iconClass: \"text-[var(--color-action-danger)]\",\n },\n info: {\n icon: Info,\n containerClass: \"bg-[var(--color-surface-info)] border-[var(--color-border-info)] text-[var(--color-text-info)]\",\n iconClass: \"text-[var(--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-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)]\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={dismiss}\n className=\"shrink-0 rounded-[var(--border-radius-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-[var(--spacing-12)] px-[var(--spacing-6)]\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && (\n <Icon icon={icon} size=\"xl\" className=\"text-[var(--color-text-tertiary)]\" />\n )}\n <h3 className=\"text-[length:var(--font-size-lg)] font-[number:var(--font-weight-semibold)] text-[var(--color-text-primary)] mt-4\">\n {title}\n </h3>\n {description && (\n <p className=\"text-sm text-[var(--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-[length:var(--font-size-sm)] text-[var(--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-[var(--border-radius-sm)] border transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected || isIndeterminate\n ? \"bg-[var(--color-action-primary)] border-[var(--color-action-primary)]\"\n : \"bg-[var(--color-surface-default)] border-[var(--color-border-default)] group-hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n >\n {isSelected && (\n <Check className=\"w-4 h-4 text-[var(--color-text-inverse)]\" strokeWidth={3} />\n )}\n {isIndeterminate && (\n <div className=\"w-3 h-0.5 bg-[var(--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-[var(--color-action-primary)]\",\n success: \"bg-[var(--color-action-success)]\",\n destructive: \"bg-[var(--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-[length:var(--font-size-sm)] text-[var(--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-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected && isPreset\n ? trackColorMap[color]\n : !isSelected\n ? \"bg-[var(--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-[var(--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-[length:var(--font-size-sm)] text-[var(--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-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected\n ? \"border-[var(--color-action-primary)]\"\n : \"border-[var(--color-border-default)] group-hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n >\n {isSelected && (\n <div className=\"w-2.5 h-2.5 rounded-full bg-[var(--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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)]\",\n \"rounded-[var(--border-radius-md)] border transition-colors text-center\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-[var(--color-border-focus)] group-focus-visible:ring-offset-2\",\n isSelected\n ? \"bg-[var(--color-action-primary)] border-[var(--color-action-primary)] text-[var(--color-text-inverse)]\"\n : \"bg-[var(--color-surface-default)] border-[var(--color-border-default)] text-[var(--color-text-primary)] hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n >\n {children}\n </div>\n )}\n </AriaRadio>\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-[length:var(--font-size-sm)]\",\n \"font-[number:var(--font-weight-medium)]\",\n \"text-[var(--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-[var(--color-text-danger)]\"\n >\n *\n </span>\n )}\n </AriaLabel>\n );\n}\n","import type React from \"react\";\nimport { Label } from \"../Label\";\n\nexport interface FieldProps {\n label?: string;\n isRequired?: boolean;\n description?: string;\n error?: string | { message?: string };\n children: React.ReactNode;\n className?: string;\n}\n\nfunction getErrorMessage(error: FieldProps[\"error\"]): string | undefined {\n if (!error) return undefined;\n if (typeof error === \"string\") return error;\n return error.message;\n}\n\nexport function Field({\n label,\n isRequired,\n description,\n error,\n children,\n className,\n}: FieldProps) {\n const errorMessage = getErrorMessage(error);\n\n return (\n <div\n className={[\"flex flex-col gap-[var(--spacing-1)]\", className]\n .filter(Boolean)\n .join(\" \")}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n {children}\n {description && !errorMessage && (\n <p className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-secondary)]\">\n {description}\n </p>\n )}\n {errorMessage && (\n <p className=\"text-[length:var(--font-size-sm)] text-[var(--color-text-danger)]\">\n {errorMessage}\n </p>\n )}\n </div>\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-[var(--spacing-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-[length:var(--font-size-lg)]\",\n \"font-[number:var(--font-weight-semibold)]\",\n \"text-[var(--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-[var(--border-radius-md)] rounded-r-none\";\n case \"middle\":\n return \"rounded-none\";\n case \"end\":\n return \"rounded-r-[var(--border-radius-md)] rounded-l-none\";\n default:\n return \"rounded-[var(--border-radius-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-[var(--border-radius-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-[var(--color-surface-subtle)]\",\n \"text-[var(--color-text-secondary)]\",\n \"border border-[var(--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-[length:var(--font-size-sm)]\",\n sm: \"text-[length:var(--font-size-base)]\",\n md: \"text-[length:var(--font-size-lg)]\",\n lg: \"text-[length:var(--font-size-xl)]\",\n xl: \"text-[length:var(--font-size-2xl)]\",\n \"2xl\": \"text-[length:var(--font-size-3xl)]\",\n \"3xl\": \"text-[length:var(--font-size-4xl)]\",\n};\n\nconst weightStyles: Record<HeadingWeight, string> = {\n semibold: \"font-[number:var(--font-weight-semibold)]\",\n bold: \"font-[number:var(--font-weight-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-[var(--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-[var(--color-teal-700)] underline\",\n \"hover:text-[var(--color-teal-800)]\",\n ].join(\" \"),\n subtle: [\n \"text-[var(--color-text-secondary)] no-underline\",\n \"hover:underline hover:text-[var(--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-[var(--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-[number:var(--font-weight-medium)] text-[var(--color-text-primary)] truncate\">\n {item.label}\n </span>\n ) : (\n <>\n <Link\n href={item.href}\n className=\"whitespace-nowrap text-[var(--color-text-secondary)] outline-none transition-colors hover:text-[var(--color-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-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 ButtonVariant,\n type ButtonSize,\n variantStyles,\n sizeStyles,\n} from \"../_shared/styles\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport type { ButtonVariant, ButtonSize };\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 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\",\n \"rounded-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"leading-[var(--line-height-tight)]\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--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 /** Tooltip placement */\n tooltipPlacement?: \"top\" | \"bottom\" | \"left\" | \"right\";\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 tooltipPlacement = \"top\",\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\",\n \"rounded-[var(--border-radius-md)]\",\n \"outline-none transition-colors no-underline\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--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} placement={tooltipPlacement}>\n {link}\n </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\";\n\nexport type ToggleButtonVariant = \"default\" | \"primary\" | \"outlined\";\nexport type ToggleButtonSize = \"sm\" | \"md\" | \"lg\";\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 sizeStyles: Record<ToggleButtonSize, 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\nconst squareSizeStyles: Record<ToggleButtonSize, string> = {\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-[var(--color-text-primary)]\",\n \"hover:bg-[var(--color-surface-hover)]\",\n \"pressed:bg-[var(--color-surface-pressed)]\",\n ].join(\" \"),\n selected: \"bg-[var(--color-surface-pressed)] text-[var(--color-text-primary)]\",\n },\n primary: {\n base: [\n \"bg-transparent text-[var(--color-text-primary)]\",\n \"hover:bg-[var(--color-surface-hover)]\",\n \"pressed:bg-[var(--color-surface-pressed)]\",\n ].join(\" \"),\n selected: \"bg-[var(--color-action-primary-active)] text-[var(--color-text-inverse)]\",\n },\n outlined: {\n base: [\n \"bg-[var(--color-surface-default)] text-[var(--color-text-primary)]\",\n \"border border-[var(--color-border-default)]\",\n \"hover:bg-[var(--color-surface-subtle)]\",\n \"pressed:bg-[var(--color-surface-muted)]\",\n ].join(\" \"),\n selected: [\n \"bg-[var(--color-neutral-800)] text-[var(--color-text-inverse)]\",\n \"border border-[var(--color-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\",\n isSquare ? \"rounded-none\" : \"rounded-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"leading-[var(--line-height-tight)]\",\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--border-radius-lg)] border border-[var(--color-border-default)] bg-[var(--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-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-surface-default)] text-[var(--color-text-primary)] shadow-sm font-[var(--font-weight-semibold)]\"\n : isPressed\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : isHovered\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : \"bg-transparent text-[var(--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-[var(--color-surface-default)] rounded-[var(--border-radius-md)]\",\n \"shadow-lg border border-[var(--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-[var(--color-surface-muted)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n item.isDanger\n ? \"text-[var(--color-text-danger)]\"\n : \"text-[var(--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-[var(--color-surface-muted)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isDanger\n ? \"text-[var(--color-text-danger)]\"\n : \"text-[var(--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-[var(--color-surface-muted)]\",\n \"hover:bg-[var(--color-surface-muted)]\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"text-[var(--color-text-primary)]\",\n isSelected ? \"font-[number:var(--font-weight-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-[var(--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-[length:var(--font-size-xs)] font-[number:var(--font-weight-semibold)]\",\n \"text-[var(--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-[var(--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 Dialog as AriaDialog,\n Button as AriaButton,\n type PopoverProps as AriaPopoverProps,\n} from \"react-aria-components\";\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\nexport interface PopoverTriggerProps {\n children: React.ReactNode;\n /** Additional CSS classes for the trigger wrapper */\n className?: string;\n}\n\nexport interface PopoverContentProps {\n /** Placement relative to the trigger element */\n placement?: AriaPopoverProps[\"placement\"];\n /** Offset from the trigger in pixels */\n offset?: number;\n /** Additional CSS classes */\n className?: string;\n /** Content to render inside the popover. Can be a render function receiving { close }. */\n children:\n | React.ReactNode\n | ((opts: { close: () => void }) => React.ReactNode);\n}\n\n/**\n * Popover root -- wraps React Aria's DialogTrigger.\n */\nexport function Popover({ children, isOpen, onOpenChange }: PopoverProps) {\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </DialogTrigger>\n );\n}\n\n/**\n * PopoverTrigger -- wraps the child in a React Aria Button so it\n * participates in DialogTrigger's open/close handling.\n *\n * Renders as an unstyled inline element. Pass your visual trigger\n * (text, icon, swatch) as children.\n */\nexport function PopoverTrigger({ children, className }: PopoverTriggerProps) {\n return (\n <AriaButton\n className={[\n \"inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:rounded-[var(--border-radius-sm)]\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </AriaButton>\n );\n}\n\n/**\n * PopoverContent -- the floating panel anchored to the trigger.\n * Built on React Aria's Popover + Dialog for accessible focus management.\n */\nexport function PopoverContent({\n placement = \"bottom\",\n offset: offsetPx = 8,\n className,\n children,\n}: PopoverContentProps) {\n return (\n <AriaPopover\n placement={placement}\n offset={offsetPx}\n className={[\n \"z-50\",\n \"bg-[var(--color-surface-default)] border border-[var(--color-border-default)]\",\n \"rounded-[var(--border-radius-md)] shadow-lg\",\n \"entering:animate-in entering:fade-in entering:duration-150\",\n \"exiting:animate-out exiting:fade-out exiting:duration-100\",\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 className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <AriaDialog className=\"outline-none\">\n {({ close }) => (\n <>\n {typeof children === \"function\"\n ? children({ close })\n : children}\n </>\n )}\n </AriaDialog>\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-[var(--color-border-default)]\"\n : \"inline-flex items-center bg-[var(--color-surface-muted)] rounded-[var(--border-radius-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-[var(--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-[var(--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-[var(--font-weight-medium)]\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--border-radius-sm)]\",\n\n // Color states\n state.isSelected\n ? [\n \"text-[var(--color-teal-700)] font-[var(--font-weight-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-[var(--color-teal-600)]\",\n ].join(\" \")\n : state.isPressed\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-muted)]\"\n : state.isHovered\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-subtle)]\"\n : \"text-[var(--color-text-secondary)] bg-transparent\",\n ];\n }\n\n // Pills variant\n return [\n // Shape\n \"rounded-[var(--border-radius-md)]\",\n\n // Color states\n state.isSelected\n ? \"text-[var(--color-text-primary)] font-[var(--font-weight-semibold)] bg-[var(--color-surface-default)] shadow-sm\"\n : state.isPressed\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-subtle)] shadow-none\"\n : state.isHovered\n ? \"text-[var(--color-text-primary)] bg-[var(--color-surface-pressed)]\"\n : \"text-[var(--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 { useCallback, useImperativeHandle, useRef, useState } from \"react\";\nimport { Tree as ArboristTree } from \"react-arborist\";\nimport type { TreeApi, NodeApi, NodeRendererProps } from \"react-arborist\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { ChevronRight, Folder, File } from \"lucide-react\";\nimport { Check } from \"lucide-react\";\n\nexport type { TreeApi } from \"react-arborist\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TreeNode {\n id: string;\n name: string;\n icon?: LucideIcon;\n children?: TreeNode[];\n}\n\nexport interface TreeProps<T extends TreeNode = TreeNode> {\n data: readonly T[];\n \"aria-label\": string;\n size?: \"compact\" | \"comfortable\";\n selectionMode?: \"none\" | \"single\" | \"multi\" | \"checkbox\";\n selectedIds?: Set<string>;\n onSelectionChange?: (ids: Set<string>) => void;\n onActivate?: (node: T) => void;\n /** Called when the pointer enters a tree node row. */\n onHover?: (node: T) => void;\n /** Called when the pointer leaves a tree node row. */\n onHoverEnd?: (node: T) => void;\n openByDefault?: boolean;\n searchTerm?: string;\n searchMatch?: (node: T, term: string) => boolean;\n height?: number;\n indent?: number;\n disableDrag?: boolean;\n disableDrop?: boolean;\n treeRef?: React.Ref<TreeApi<T>>;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Row heights */\n/* ------------------------------------------------------------------ */\n\nconst rowHeightMap = {\n compact: 32,\n comfortable: 40,\n} as const;\n\n/* ------------------------------------------------------------------ */\n/* Node renderer */\n/* ------------------------------------------------------------------ */\n\nfunction NodeRenderer<T extends TreeNode>({\n node,\n style,\n tree,\n dragHandle,\n checkedIds,\n onCheckToggle,\n selectionMode,\n size,\n onHover,\n onHoverEnd,\n}: NodeRendererProps<T> & {\n checkedIds: Set<string>;\n onCheckToggle: (id: string) => void;\n selectionMode: string;\n size: \"compact\" | \"comfortable\";\n onHover?: (node: T) => void;\n onHoverEnd?: (node: T) => void;\n}) {\n const data = node.data;\n const isCheckbox = selectionMode === \"checkbox\";\n const isChecked = isCheckbox && checkedIds.has(node.id);\n const isSelected = node.isSelected && !isCheckbox;\n const isCompact = size === \"compact\";\n\n const IconComponent: LucideIcon = data.icon\n ? data.icon\n : node.isInternal\n ? Folder\n : File;\n\n return (\n <div\n ref={dragHandle}\n style={style}\n className={[\n \"relative flex items-center cursor-default select-none\",\n isCompact ? \"gap-0.5 px-2\" : \"gap-1 px-3\",\n \"text-[length:var(--font-size-sm)] text-[var(--color-text-primary)]\",\n \"outline-none\",\n // Full-width background via pseudo-element\n \"before:absolute before:inset-y-0 before:left-[-100vw] before:right-0 before:-z-10 before:transition-colors\",\n isSelected\n ? \"before:bg-[var(--color-surface-selected)] hover:before:bg-[var(--color-surface-selected-hover)] border-l-2 border-l-[var(--color-brand-accent)]\"\n : \"hover:before:bg-[var(--color-surface-hover)]\",\n node.isFocused\n ? \"outline-2 outline-[var(--color-border-focus)] outline-offset-[-2px]\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n role=\"treeitem\"\n aria-selected={isCheckbox ? isChecked : node.isSelected}\n aria-expanded={node.isInternal ? node.isOpen : undefined}\n aria-level={node.level + 1}\n onPointerEnter={() => onHover?.(node.data)}\n onPointerLeave={() => onHoverEnd?.(node.data)}\n onClick={(e) => {\n if (isCheckbox) {\n onCheckToggle(node.id);\n } else {\n node.handleClick(e);\n }\n }}\n onKeyDown={(e) => {\n if (isCheckbox && (e.key === \" \" || e.key === \"Enter\")) {\n e.preventDefault();\n onCheckToggle(node.id);\n }\n }}\n >\n {/* Chevron toggle */}\n <button\n type=\"button\"\n className={[\n \"flex items-center justify-center w-6 h-6 shrink-0\",\n \"rounded-[var(--border-radius-sm)]\",\n \"text-[var(--color-text-secondary)]\",\n \"hover:text-[var(--color-text-primary)]\",\n \"transition-transform\",\n node.isInternal ? \"visible\" : \"invisible\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n node.toggle();\n }}\n tabIndex={-1}\n aria-label={node.isOpen ? \"Collapse\" : \"Expand\"}\n >\n <ChevronRight\n size={14}\n className={[\n \"transition-transform\",\n node.isOpen ? \"rotate-90\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n </button>\n\n {/* Checkbox (only in checkbox mode) */}\n {isCheckbox && (\n <div\n className={[\n \"flex items-center justify-center w-5 h-5 shrink-0\",\n \"rounded-[var(--border-radius-sm)] border transition-colors\",\n isChecked\n ? \"bg-[var(--color-action-primary)] border-[var(--color-action-primary)]\"\n : \"bg-[var(--color-surface-default)] border-[var(--color-border-default)] hover:border-[var(--color-border-strong)]\",\n ].join(\" \")}\n role=\"checkbox\"\n aria-checked={isChecked}\n aria-label={`Select ${data.name}`}\n >\n {isChecked && (\n <Check\n className=\"w-3 h-3 text-[var(--color-text-inverse)]\"\n strokeWidth={3}\n />\n )}\n </div>\n )}\n\n {/* Icon */}\n <IconComponent\n size={16}\n className=\"shrink-0 text-[var(--color-text-secondary)]\"\n aria-hidden=\"true\"\n />\n\n {/* Name */}\n <span className=\"truncate\">{data.name}</span>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Tree component */\n/* ------------------------------------------------------------------ */\n\nexport function Tree<T extends TreeNode = TreeNode>({\n data,\n \"aria-label\": ariaLabel,\n size = \"comfortable\",\n selectionMode = \"single\",\n selectedIds,\n onSelectionChange,\n onActivate,\n onHover,\n onHoverEnd,\n openByDefault = false,\n searchTerm,\n searchMatch,\n height = 400,\n indent = 24,\n disableDrag = true,\n disableDrop = true,\n treeRef,\n className,\n}: TreeProps<T>) {\n const internalRef = useRef<TreeApi<T>>(null);\n\n // Expose tree API via treeRef\n useImperativeHandle(treeRef, () => internalRef.current!, []);\n\n // Checkbox state (managed separately from react-arborist selection)\n const [internalChecked, setInternalChecked] = useState<Set<string>>(\n () => new Set(),\n );\n const checkedIds = selectedIds ?? internalChecked;\n\n const handleCheckToggle = useCallback(\n (id: string) => {\n const next = new Set(checkedIds);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n if (onSelectionChange) {\n onSelectionChange(next);\n } else {\n setInternalChecked(next);\n }\n },\n [checkedIds, onSelectionChange],\n );\n\n // Selection handling for non-checkbox modes\n const handleSelect = useCallback(\n (nodes: NodeApi<T>[]) => {\n if (selectionMode === \"checkbox\" || selectionMode === \"none\") return;\n if (onSelectionChange) {\n onSelectionChange(new Set(nodes.map((n) => n.id)));\n }\n },\n [selectionMode, onSelectionChange],\n );\n\n // Activation handling\n const handleActivate = useCallback(\n (node: NodeApi<T>) => {\n if (onActivate) {\n onActivate(node.data);\n }\n },\n [onActivate],\n );\n\n // Search match adapter: react-arborist passes NodeApi, our prop passes T\n const arboristSearchMatch = searchMatch\n ? (node: NodeApi<T>, term: string) => searchMatch(node.data, term)\n : undefined;\n\n // Selection prop for react-arborist (controls selected node by id)\n // In single mode, pass the first selectedId. In multi, arborist handles it via onSelect.\n const selectionProp =\n selectionMode === \"single\" && selectedIds && selectedIds.size > 0\n ? [...selectedIds][0]\n : undefined;\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n className={[\"outline-none overflow-hidden\", className].filter(Boolean).join(\" \")}\n >\n <ArboristTree<T>\n ref={internalRef}\n data={data as T[]}\n width=\"100%\"\n height={height}\n rowHeight={rowHeightMap[size]}\n indent={indent}\n openByDefault={openByDefault}\n searchTerm={searchTerm}\n searchMatch={arboristSearchMatch}\n disableDrag={disableDrag}\n disableDrop={disableDrop}\n disableMultiSelection={selectionMode === \"single\" || selectionMode === \"none\"}\n selection={selectionProp}\n onSelect={handleSelect}\n onActivate={handleActivate}\n disableEdit={true}\n >\n {(props) => (\n <NodeRenderer<T>\n {...props}\n checkedIds={checkedIds}\n onCheckToggle={handleCheckToggle}\n selectionMode={selectionMode}\n size={size}\n onHover={onHover}\n onHoverEnd={onHoverEnd}\n />\n )}\n </ArboristTree>\n </div>\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-[var(--border-radius-lg)] border border-[var(--color-border-default)] bg-[var(--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-[var(--border-radius-md)]\",\n \"font-[var(--font-weight-medium)]\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-surface-default)] text-[var(--color-text-primary)] shadow-sm font-[var(--font-weight-semibold)]\"\n : isPressed\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : isHovered\n ? \"bg-[var(--color-surface-subtle)] text-[var(--color-text-primary)]\"\n : \"bg-transparent text-[var(--color-text-secondary)]\",\n\n className,\n )\n }\n />\n );\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\nimport {\n File,\n FileSpreadsheet,\n Folder,\n Image,\n Info,\n Microscope,\n type LucideIcon,\n} from \"lucide-react\";\nimport { IconButton } from \"../IconButton\";\n\n/* ------------------------------------------------------------------ */\n/* File type helpers */\n/* ------------------------------------------------------------------ */\n\nexport function getFileIcon(\n type: \"directory\" | \"file\",\n extension?: string,\n): LucideIcon {\n if (type === \"directory\") return Folder;\n const ext = (extension ?? \"\").toLowerCase();\n if (ext === \"ome.tif\" || ext === \"ome.tiff\") return Microscope;\n if (/^(tiff?|png|jpe?g)$/.test(ext)) return Image;\n if (/^(csv|parquet)$/.test(ext)) return FileSpreadsheet;\n return File;\n}\n\nexport function getTypeLabel(\n type: \"directory\" | \"file\",\n extension?: string,\n): string {\n if (type === \"directory\") return \"Folder\";\n const ext = (extension ?? \"\").toLowerCase();\n if (ext === \"ome.tif\" || ext === \"ome.tiff\") return \"OME-TIFF\";\n if (/^tiff?$/.test(ext)) return \"TIFF\";\n if (ext === \"csv\") return \"CSV\";\n if (ext === \"parquet\") return \"Parquet\";\n if (ext === \"png\") return \"PNG\";\n if (/^jpe?g$/.test(ext)) return \"JPEG\";\n return ext.toUpperCase() || \"File\";\n}\n\nexport function FileIcon({\n type,\n extension,\n size = 16,\n}: {\n type: \"directory\" | \"file\";\n extension?: string;\n size?: number;\n}) {\n const IconComponent = getFileIcon(type, extension);\n return (\n <IconComponent\n size={size}\n className=\"shrink-0 text-[var(--color-text-secondary)]\"\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* FileCard */\n/* ------------------------------------------------------------------ */\n\nexport interface FileCardProps {\n /** File or folder name */\n name: string;\n /** Whether this is a directory or file */\n type: \"directory\" | \"file\";\n /** Human-readable file size (e.g., \"12.3 GB\") */\n size?: string;\n /** Last modified date/time */\n modified?: string;\n /** File extension (e.g., \"ome.tif\", \"csv\") */\n extension?: string;\n /** Whether a thumbnail preview is available */\n hasPreview?: boolean;\n /** Compact mode (smaller card, square aspect, minimal metadata) */\n compact?: boolean;\n /** Custom thumbnail content (e.g., an image preview) */\n children?: React.ReactNode;\n /** Info button handler */\n onInfo?: () => void;\n /** Navigation target — clicking the card navigates here */\n href?: string;\n /** Handler for click/press interaction (use instead of href for programmatic navigation) */\n onPress?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function FileCard({\n name,\n type,\n size,\n extension,\n compact = false,\n children,\n onInfo,\n href,\n onPress,\n className,\n}: FileCardProps) {\n const isInteractive = !!href || !!onPress;\n\n const radius = compact\n ? \"rounded-[var(--border-radius-md)]\"\n : \"rounded-[var(--border-radius-lg)]\";\n\n const IconComponent = getFileIcon(type, extension);\n const iconSize = compact ? 24 : 32;\n const iconColor =\n type === \"directory\"\n ? \"text-[var(--color-text-tertiary)]\"\n : \"text-[var(--color-text-secondary)]\";\n\n const thumbnailClass = compact\n ? \"aspect-square rounded-t-[var(--border-radius-md)]\"\n : \"aspect-[4/3] rounded-t-[var(--border-radius-lg)]\";\n\n const handleInfoClick = useCallback(\n (e: React.MouseEvent | React.KeyboardEvent) => {\n if (isInteractive) {\n e.stopPropagation();\n e.preventDefault();\n }\n onInfo?.();\n },\n [onInfo, isInteractive],\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 cardContent = (\n <>\n {/* Thumbnail area */}\n <div\n className={`shrink-0 overflow-hidden bg-[var(--color-neutral-900)] ${thumbnailClass}`}\n >\n {children ? (\n <div className=\"h-full w-full overflow-hidden\">{children}</div>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <IconComponent size={iconSize} className={iconColor} />\n </div>\n )}\n </div>\n\n {/* Metadata area */}\n <div\n className={[\n \"flex flex-col border-t border-[var(--color-border-default)]\",\n \"bg-[var(--color-surface-default)]\",\n compact\n ? \"px-2 py-1.5 rounded-b-[var(--border-radius-md)]\"\n : \"gap-0.5 px-3 py-2 rounded-b-[var(--border-radius-lg)]\",\n ].join(\" \")}\n >\n {compact ? (\n <span className=\"text-xs font-medium text-[var(--color-text-primary)] truncate\">\n {name}\n </span>\n ) : (\n <>\n <span className=\"flex items-center gap-1.5\">\n <FileIcon type={type} extension={extension} size={16} />\n <span className=\"min-w-0 flex-1 text-sm font-medium text-[var(--color-text-primary)] truncate\">\n {name}\n </span>\n {onInfo && (\n <span\n onClick={handleInfoClick}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleInfoClick(e);\n }\n }}\n role=\"presentation\"\n >\n <IconButton\n icon={Info}\n aria-label={`Show info for ${name}`}\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 -mt-0.5 -mr-1\"\n onPress={onInfo}\n />\n </span>\n )}\n </span>\n {size && (\n <span className=\"text-xs text-[var(--color-text-secondary)] tabular-nums pl-[22px]\">\n {size}\n </span>\n )}\n </>\n )}\n </div>\n </>\n );\n\n const baseStyles = [\n \"group flex flex-col overflow-hidden\",\n radius,\n \"border border-[var(--color-border-default)]\",\n \"shadow-sm\",\n \"transition-all\",\n isInteractive &&\n \"hover:border-[var(--color-border-focus)] hover:shadow-md cursor-pointer\",\n isInteractive &&\n \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (href) {\n return (\n <a\n href={href}\n aria-label={name}\n className={[baseStyles, \"no-underline\"].join(\" \")}\n >\n {cardContent}\n </a>\n );\n }\n\n if (onPress) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={name}\n className={baseStyles}\n onClick={onPress}\n onKeyDown={handleKeyDown}\n >\n {cardContent}\n </div>\n );\n }\n\n return <div className={baseStyles}>{cardContent}</div>;\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\nimport { AlertCircle, Database, Info } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\nimport { IconButton } from \"../IconButton\";\nimport type { PillColor } from \"../Pill\";\nimport { Pill } from \"../Pill\";\nimport { Spinner } from \"../Spinner\";\n\nexport interface StorageConnectionCardProps {\n /** Display name for the connection */\n name: string;\n /** Cloud provider identifier (e.g., \"aws\", \"minio\", \"azure\", \"gcp\"). When omitted, the provider badge and region are hidden. */\n provider?: string;\n /** AWS region or equivalent (only rendered when provider is set) */\n region?: string;\n /** Connection health status. When omitted, the status dot is hidden and the preview area behaves as \"connected\". */\n status?: \"connected\" | \"error\" | \"loading\";\n /** Human-readable error message when status is \"error\" */\n errorMessage?: string;\n /** Number of viewable images in the bucket */\n imageCount?: number;\n /** Children rendered in the preview area (e.g., an actual tile viewer, or an img) */\n children?: React.ReactNode;\n /** Navigation target — clicking the card navigates here */\n href?: string;\n /** Handler for click/press interaction (use instead of href for programmatic navigation) */\n onPress?: () => void;\n /** Info button handler */\n onInfo?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport const statusDotStyles = {\n connected: \"bg-[var(--color-status-success)]\",\n error: \"border-2 border-[var(--color-status-danger)] bg-transparent\",\n loading: \"bg-[var(--color-status-warning)] animate-pulse\",\n} as const;\n\nconst providerConfig: Record<string, { label: string; color: PillColor }> = {\n aws: { label: \"AWS\", color: \"purple\" },\n azure: { label: \"Azure\", color: \"teal\" },\n gcp: { label: \"GCP\", color: \"slate\" },\n minio: { label: \"MinIO\", color: \"rose\" },\n};\n\nexport function ProviderBadge({ provider }: { provider: string }) {\n const config = providerConfig[provider.toLowerCase()];\n const label = config?.label ?? provider;\n const color: PillColor = config?.color ?? \"neutral\";\n\n return (\n <Pill color={color}>\n {label}\n </Pill>\n );\n}\n\nfunction PreviewArea({\n status = \"connected\",\n errorMessage,\n children,\n}: Pick<StorageConnectionCardProps, \"status\" | \"errorMessage\" | \"children\">) {\n if (status === \"loading\") {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Spinner size=\"lg\" aria-label=\"Loading connection\" />\n </div>\n );\n }\n\n if (status === \"error\") {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-2 bg-[var(--color-surface-danger)] px-4\">\n <Icon\n icon={AlertCircle}\n size=\"lg\"\n className=\"text-[var(--color-text-danger)]\"\n />\n {errorMessage && (\n <p className=\"text-center text-xs text-[var(--color-text-danger)]\">{errorMessage}</p>\n )}\n </div>\n );\n }\n\n if (children) {\n return <div className=\"h-full w-full overflow-hidden\">{children}</div>;\n }\n\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Icon\n icon={Database}\n size=\"xl\"\n className=\"text-[var(--color-text-secondary)]\"\n />\n </div>\n );\n}\n\nexport function StorageConnectionCard({\n name,\n provider,\n region,\n status,\n errorMessage,\n imageCount,\n children,\n href,\n onPress,\n onInfo,\n className,\n}: StorageConnectionCardProps) {\n const isInteractive = !!href || !!onPress;\n\n const handleInfoPress = useCallback(\n (e: React.MouseEvent | React.KeyboardEvent) => {\n if (isInteractive) {\n e.stopPropagation();\n e.preventDefault();\n }\n onInfo?.();\n },\n [onInfo, isInteractive],\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 cardContent = (\n <>\n {/* Preview area */}\n <div className=\"aspect-[4/3] bg-[var(--color-neutral-900)] overflow-hidden rounded-t-[var(--border-radius-lg)]\">\n <PreviewArea status={status} errorMessage={errorMessage}>\n {children}\n </PreviewArea>\n </div>\n\n {/* Info bar */}\n <div className=\"flex flex-col gap-1.5 border-t border-[var(--color-border-default)] bg-[var(--color-surface-default)] px-3 py-2.5 rounded-b-[var(--border-radius-lg)]\">\n {/* Top row: status dot + name + info button */}\n <div className=\"flex items-start gap-2\">\n {status && (\n <span\n className={twMerge(\n \"mt-1.5 h-2 w-2 shrink-0 rounded-full\",\n statusDotStyles[status],\n )}\n aria-label={`Status: ${status}`}\n />\n )}\n <span className=\"min-w-0 flex-1 line-clamp-2 text-sm font-medium text-[var(--color-text-primary)]\">\n {name}\n </span>\n {onInfo && (\n <span\n onClick={handleInfoPress}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleInfoPress(e);\n }\n }}\n role=\"presentation\"\n >\n <IconButton\n icon={Info}\n aria-label=\"Connection info\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 -mt-1 -mr-1\"\n onPress={onInfo}\n />\n </span>\n )}\n </div>\n\n {/* Bottom row: provider badge + region + image count */}\n {(provider || (imageCount != null && (!status || status === \"connected\"))) && (\n <div className={twMerge(\"flex items-center gap-2\", status && \"pl-4\")}>\n {provider && <ProviderBadge provider={provider} />}\n {provider && region && (\n <span className=\"shrink-0 text-xs text-[var(--color-text-secondary)]\">\n {region}\n </span>\n )}\n {imageCount != null && (!status || status === \"connected\") && (\n <span className=\"ml-auto shrink-0 text-xs tabular-nums text-[var(--color-text-secondary)]\">\n {imageCount} {imageCount === 1 ? \"image\" : \"images\"}\n </span>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n const baseStyles = twMerge(\n \"flex flex-col overflow-hidden rounded-[var(--border-radius-lg)]\",\n \"border border-[var(--color-border-default)]\",\n \"shadow-sm transition-all\",\n isInteractive && \"hover:border-[var(--color-border-focus)] hover:shadow-md cursor-pointer\",\n isInteractive && \"focus-visible:ring-2 focus-visible:ring-[var(--color-border-focus)] focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n if (href) {\n return (\n <a href={href} className={twMerge(baseStyles, \"no-underline\")}>\n {cardContent}\n </a>\n );\n }\n\n if (onPress) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={baseStyles}\n onClick={onPress}\n onKeyDown={handleKeyDown}\n >\n {cardContent}\n </div>\n );\n }\n\n return <div className={baseStyles}>{cardContent}</div>;\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Available pill color variants, mapped to existing badge design tokens.\n *\n * The seven base variants correspond 1:1 to the `--color-badge-*` token set\n * defined in `tokens/semantic.json`.\n */\nexport type PillColor =\n | \"neutral\"\n | \"purple\"\n | \"teal\"\n | \"rose\"\n | \"slate\"\n | \"green\"\n | \"amber\";\n\nexport interface PillProps {\n /** Pill label content */\n children: React.ReactNode;\n /**\n * Explicit color variant, or `\"auto\"` to derive from `name` via\n * deterministic hash. Defaults to `\"auto\"` when `name` is provided,\n * `\"neutral\"` otherwise.\n */\n color?: PillColor | \"auto\";\n /**\n * String used for deterministic hash-based color assignment.\n * When provided and `color` is `\"auto\"` (or omitted), the pill color\n * is derived from this value so the same name always produces the same\n * color across renders and sessions.\n */\n name?: string;\n /** Additional CSS class names merged via tailwind-merge */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Deterministic hash -> color mapping */\n/* ------------------------------------------------------------------ */\n\n/**\n * Ordered color palette used by the hash function. The sequence mirrors\n * the cytario-web `pillColors` array, with each entry mapped to the\n * nearest available badge token variant.\n *\n * cytario-web name -> design-system badge variant\n * sky -> teal\n * amber -> amber\n * emerald -> green\n * rose -> rose\n * violet -> purple\n * orange -> amber (closest warm tone with existing tokens)\n * teal -> teal\n * fuchsia -> rose (closest pink tone with existing tokens)\n */\nconst HASH_PALETTE: PillColor[] = [\n \"teal\", // sky\n \"amber\", // amber\n \"green\", // emerald\n \"rose\", // rose\n \"purple\", // violet\n \"amber\", // orange (mapped to amber -- closest warm token)\n \"teal\", // teal\n \"rose\", // fuchsia (mapped to rose -- closest pink token)\n];\n\n/**\n * Deterministic string-to-color hash, matching the algorithm used in\n * cytario-web's `Pill.tsx`.\n */\nexport function pillColorFromName(name: string): 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 HASH_PALETTE[Math.abs(hash) % HASH_PALETTE.length];\n}\n\n/* ------------------------------------------------------------------ */\n/* Variant styles */\n/* ------------------------------------------------------------------ */\n\nconst colorStyles: Record<PillColor, string> = {\n neutral:\n \"bg-[var(--color-badge-neutral-bg)] text-[var(--color-badge-neutral-text)]\",\n purple:\n \"bg-[var(--color-badge-purple-bg)] text-[var(--color-badge-purple-text)]\",\n teal:\n \"bg-[var(--color-badge-teal-bg)] text-[var(--color-badge-teal-text)]\",\n rose:\n \"bg-[var(--color-badge-rose-bg)] text-[var(--color-badge-rose-text)]\",\n slate:\n \"bg-[var(--color-badge-slate-bg)] text-[var(--color-badge-slate-text)]\",\n green:\n \"bg-[var(--color-badge-green-bg)] text-[var(--color-badge-green-text)]\",\n amber:\n \"bg-[var(--color-badge-amber-bg)] text-[var(--color-badge-amber-text)]\",\n};\n\n/**\n * CSS class for the dot indicator used in GroupPill collapsed segments.\n * Exported so GroupPill can reuse it without duplicating the mapping.\n */\nexport const dotColorStyles: Record<PillColor, string> = {\n neutral: \"bg-[var(--color-badge-neutral-text)]\",\n purple: \"bg-[var(--color-badge-purple-text)]\",\n teal: \"bg-[var(--color-badge-teal-text)]\",\n rose: \"bg-[var(--color-badge-rose-text)]\",\n slate: \"bg-[var(--color-badge-slate-text)]\",\n green: \"bg-[var(--color-badge-green-text)]\",\n amber: \"bg-[var(--color-badge-amber-text)]\",\n};\n\n/* ------------------------------------------------------------------ */\n/* Resolve effective color */\n/* ------------------------------------------------------------------ */\n\nfunction resolveColor(\n color: PillColor | \"auto\" | undefined,\n name: string | undefined,\n): PillColor {\n if (color && color !== \"auto\") return color;\n if (name) return pillColorFromName(name);\n return \"neutral\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pill -- a small, rounded label used for tags, user groups, and status\n * indicators. Supports deterministic hash-based coloring so the same\n * `name` always renders the same color.\n */\nexport function Pill({ children, color, name, className }: PillProps) {\n const resolved = resolveColor(color, name);\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center rounded-full\",\n \"px-2 py-0.5\",\n \"text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-tight)]\",\n colorStyles[resolved],\n className,\n )}\n >\n {children}\n </span>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Pill, pillColorFromName, dotColorStyles } from \"./Pill\";\n\nexport interface GroupPillProps {\n /**\n * Slash-separated group path, e.g. `\"/org/team/admins\"`.\n * Leading slash is optional and stripped before splitting.\n */\n path: string;\n /**\n * Maximum number of path segments to display as full pills.\n * Extra leading segments are collapsed into small colored dots.\n * @default 3\n */\n visibleCount?: number;\n /** Additional CSS class names merged via tailwind-merge */\n className?: string;\n}\n\n/**\n * GroupPill -- displays a hierarchical group path as a row of\n * deterministically-colored pills. When the path has more segments\n * than `visibleCount`, the leading overflow segments are shown as\n * small colored dots to preserve context without consuming space.\n */\nexport function GroupPill({\n path,\n visibleCount = 3,\n className,\n}: GroupPillProps) {\n // Normalise: strip leading/trailing slashes, split, drop empty segments\n const segments = path\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n if (segments.length === 0) return null;\n\n const hiddenCount = Math.max(0, segments.length - visibleCount);\n const hiddenSegments = segments.slice(0, hiddenCount);\n const visibleSegments = segments.slice(hiddenCount);\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1\",\n className,\n )}\n aria-label={`Group: ${segments.join(\" / \")}`}\n >\n {/* Collapsed dots for hidden leading segments */}\n {hiddenSegments.map((segment, index) => {\n const color = pillColorFromName(segment);\n return (\n <span\n key={`dot-${index}-${segment}`}\n className={twMerge(\n \"inline-block size-2 shrink-0 rounded-full\",\n dotColorStyles[color],\n )}\n aria-hidden=\"true\"\n title={segment}\n />\n );\n })}\n\n {/* Visible segment pills */}\n {visibleSegments.map((segment, index) => (\n <Pill key={`pill-${index}-${segment}`} name={segment}>\n {segment}\n </Pill>\n ))}\n </span>\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-[var(--color-badge-neutral-bg)] text-[var(--color-badge-neutral-text)]\",\n purple:\n \"bg-[var(--color-badge-purple-bg)] text-[var(--color-badge-purple-text)]\",\n teal: \"bg-[var(--color-badge-teal-bg)] text-[var(--color-badge-teal-text)]\",\n rose: \"bg-[var(--color-badge-rose-bg)] text-[var(--color-badge-rose-text)]\",\n slate:\n \"bg-[var(--color-badge-slate-bg)] text-[var(--color-badge-slate-text)]\",\n green:\n \"bg-[var(--color-badge-green-bg)] text-[var(--color-badge-green-text)]\",\n amber:\n \"bg-[var(--color-badge-amber-bg)] text-[var(--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-[var(--border-radius-full)]\",\n \"text-[length:var(--font-size-xs)] font-[number:var(--font-weight-medium)] leading-[var(--line-height-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-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] overflow-hidden shadow-sm\",\n isInteractive && \"transition-all hover:shadow-md hover:border-[var(--color-border-focus)] cursor-pointer\",\n (href || onPress) && \"block focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--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-[var(--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-[var(--color-delta-increase-text)]\",\n decrease: \"text-[var(--color-delta-decrease-text)]\",\n flat: \"text-[var(--color-delta-flat-text)]\",\n};\n\nconst reverseDirectionColors: Record<Direction, string> = {\n increase: \"text-[var(--color-delta-decrease-text)]\",\n decrease: \"text-[var(--color-delta-increase-text)]\",\n flat: \"text-[var(--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-[var(--color-delta-increase-bg)]\",\n decrease: \"bg-[var(--color-delta-decrease-bg)]\",\n flat: \"bg-[var(--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-[number:var(--font-weight-medium)]\",\n \"text-[var(--color-text-tertiary)]\",\n className,\n )}\n >\n {label && (\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--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-[number:var(--font-weight-medium)]\",\n colorStyles,\n isPill && [\n \"rounded-[var(--border-radius-full)] px-2 py-0.5\",\n \"text-[length:var(--font-size-xs)]\",\n directionBgColors[direction],\n ],\n className,\n )}\n >\n {label && (\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--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-[var(--color-progress-fill)]\",\n success: \"bg-[var(--color-progress-fill-success)]\",\n warning: \"bg-[var(--color-progress-fill-warning)]\",\n danger: \"bg-[var(--color-progress-fill-danger)]\",\n neutral: \"bg-[var(--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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)] text-[var(--color-text-primary)]\">\n {label}\n </span>\n <span className=\"text-[length:var(--font-size-sm)] text-[var(--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-[var(--border-radius-full)] bg-[var(--color-progress-track)]\",\n sizeStyles[size],\n )}\n >\n <div\n className={twMerge(\n \"h-full rounded-[var(--border-radius-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-[var(--color-banner-info-bg)] border-[var(--color-banner-info-border)] text-[var(--color-banner-info-text)]\",\n iconClass: \"text-[var(--color-banner-info-icon)]\",\n role: \"status\",\n },\n warning: {\n icon: AlertTriangle,\n containerClass:\n \"bg-[var(--color-banner-warning-bg)] border-[var(--color-banner-warning-border)] text-[var(--color-banner-warning-text)]\",\n iconClass: \"text-[var(--color-banner-warning-icon)]\",\n role: \"alert\",\n },\n danger: {\n icon: AlertCircle,\n containerClass:\n \"bg-[var(--color-banner-danger-bg)] border-[var(--color-banner-danger-border)] text-[var(--color-banner-danger-text)]\",\n iconClass: \"text-[var(--color-banner-danger-icon)]\",\n role: \"alert\",\n },\n success: {\n icon: CheckCircle2,\n containerClass:\n \"bg-[var(--color-banner-success-bg)] border-[var(--color-banner-success-border)] text-[var(--color-banner-success-text)]\",\n iconClass: \"text-[var(--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-[var(--spacing-3)] rounded-[var(--border-radius-lg)] border px-[var(--spacing-4)] py-[var(--spacing-3)]\",\n \"text-[length:var(--font-size-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-[number:var(--font-weight-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-[var(--border-radius-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-[length:var(--font-size-xs)]\",\n valueClass: \"text-[length:var(--font-size-xl)]\",\n },\n md: {\n padding: \"p-4\",\n labelClass: \"text-[length:var(--font-size-sm)]\",\n valueClass: \"text-[length:var(--font-size-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-[var(--color-surface-default)] border border-[var(--color-border-default)] rounded-[var(--border-radius-lg)] shadow-sm\",\n config.padding,\n href &&\n \"block transition-shadow hover:shadow-md hover:border-[var(--color-border-focus)] focus-visible:ring-2 focus-visible:ring-[var(--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-[var(--color-text-secondary)]\")}>\n {label}\n </div>\n <div\n className={twMerge(\n config.valueClass,\n \"font-[number:var(--font-weight-semibold)] text-[var(--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-[var(--spacing-3)] py-[var(--spacing-4)]\",\n className,\n )}\n >\n <H2>{title}</H2>\n {children && (\n <div className=\"ml-auto flex flex-wrap items-center gap-[var(--spacing-2)]\">\n {children}\n </div>\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-[var(--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-[var(--color-brand-primary)]\"\n : \"bg-[var(--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-[length:var(--font-size-sm)] font-[number:var(--font-weight-medium)]\",\n \"transition-colors\",\n isCompleted\n ? \"bg-[var(--color-brand-primary)] text-[var(--color-text-inverse)]\"\n : \"\",\n isCurrent\n ? \"border-2 border-[var(--color-brand-primary)] bg-[var(--color-surface-default)] text-[var(--color-brand-primary)]\"\n : \"\",\n isFuture\n ? \"border-2 border-[var(--color-border-default)] bg-[var(--color-surface-default)] text-[var(--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-[var(--color-brand-primary)]\"\n : \"bg-[var(--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-[var(--spacing-2)] text-center text-[length:var(--font-size-sm)]\",\n isCurrent\n ? \"font-[number:var(--font-weight-semibold)] text-[var(--color-text-primary)]\"\n : \"font-[number:var(--font-weight-regular)] text-[var(--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-[var(--spacing-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 = \"#217d7e\";\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 = \"#b45309\";\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","AriaButton","jsx","iconSizeMap","groupRadiusClass","AriaButton","jsx","jsxs","Button","Label","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","sizeStyles","createContext","useContext","X","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Label","jsx","jsxs","Label","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","sizeStyles","squareSizeStyles","variantStyles","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","AriaDialog","AriaButton","Fragment","jsx","Popover","createContext","useContext","twMerge","jsx","sizeStyles","Tabs","TabList","Tab","TabPanel","useCallback","useRef","useState","ChevronRight","Check","jsx","jsxs","createContext","useContext","twMerge","AriaToggleButton","jsx","sizeStyles","useCallback","File","Folder","Info","Fragment","jsx","jsxs","Folder","File","useCallback","Info","useCallback","Info","twMerge","twMerge","jsx","twMerge","jsx","jsxs","twMerge","Fragment","jsx","jsxs","useCallback","twMerge","Info","twMerge","jsx","jsxs","variantStyles","sizeStyles","iconSizeMap","useCallback","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","colorStyles","twMerge","jsx","jsxs","sizeStyles","useState","Info","AlertCircle","X","twMerge","jsx","jsxs","variantConfig","twMerge","Fragment","jsx","jsxs","twMerge","jsx","jsxs","twMerge","createContext","useContext","useCallback","jsx","jsx","jsxs","CheckIcon","jsx","jsxs"]}
|