@cytario/design 9.2.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ type ButtonSize = "xs" | "sm" | "md" | "lg";
|
|
|
19
19
|
type ButtonVariant = "primary" | "secondary" | "destructive" | "success" | "warning" | "info" | "neutral" | "outline" | "ghost";
|
|
20
20
|
|
|
21
21
|
/** Union of every registered icon name. */
|
|
22
|
-
type IconName = "AlertCircle" | "AlertTriangle" | "AlignCenter" | "AlignLeft" | "AlignRight" | "Archive" | "ArrowDown" | "ArrowLeft" | "ArrowRight" | "ArrowUp" | "ArrowUpRight" | "Ban" | "Bookmark" | "BookmarkCheck" | "Braces" | "Building2" | "Calendar" | "Check" | "CheckCircle" | "CheckCircle2" | "ChevronDown" | "ChevronRight" | "ChevronUp" | "Circle" | "CircleDot" | "CircleSlash" | "Clock" | "Cloud" | "Columns2" | "Columns3" | "Copy" | "CreditCard" | "Database" | "Download" | "Edit" | "EllipsisVertical" | "ExternalLink" | "Eye" | "EyeOff" | "File" | "FileSearch" | "FileSpreadsheet" | "FilterX" | "Folder" | "FolderPlus" | "FolderTree" | "Fullscreen" | "Github" | "Grid2x2" | "Grid3x3" | "Heart" | "Image" | "ImageOff" | "Inbox" | "Info" | "KeyRound" | "Lasso" | "Layers" | "Layers2" | "LayoutDashboard" | "LayoutGrid" | "Linkedin" | "List" | "ListFilter" | "LogOut" | "Mail" | "MapPin" | "Maximize" | "Menu" | "Microscope" | "Minus" | "MoreVertical" | "Network" | "PanelLeftClose" | "PanelLeftOpen" | "PanelRightClose" | "PanelRightOpen" | "Pencil" | "Plug" | "Plus" | "Power" | "PowerOff" | "RefreshCw" | "RotateCcw" | "RotateCw" | "ScrollText" | "Search" | "SearchX" | "Send" | "Settings" | "Shield" | "ShieldCheck" | "Spline" | "Square" | "SquarePen" | "Star" | "Table" | "Tag" | "Trash2" | "Unplug" | "User" | "UserMinus" | "UserPlus" | "Users" | "UsersRound" | "X" | "XCircle" | "ZoomIn" | "ZoomOut";
|
|
22
|
+
type IconName = "AlertCircle" | "AlertTriangle" | "AlignCenter" | "AlignLeft" | "AlignRight" | "Archive" | "ArrowDown" | "ArrowLeft" | "ArrowRight" | "ArrowUp" | "ArrowUpRight" | "Ban" | "Bookmark" | "BookmarkCheck" | "Braces" | "Building2" | "Calendar" | "Check" | "CheckCircle" | "CheckCircle2" | "ChevronDown" | "ChevronRight" | "ChevronUp" | "Circle" | "CircleDot" | "CircleSlash" | "Clock" | "Cloud" | "Columns2" | "Columns3" | "Copy" | "CreditCard" | "Database" | "Download" | "Edit" | "EllipsisVertical" | "ExternalLink" | "Eye" | "EyeOff" | "File" | "FileSearch" | "FileSpreadsheet" | "FilterX" | "Folder" | "FolderPlus" | "FolderTree" | "Fullscreen" | "Github" | "Grid2x2" | "Grid3x3" | "Hand" | "Heart" | "Image" | "ImageOff" | "Inbox" | "Info" | "KeyRound" | "Lasso" | "Layers" | "Layers2" | "LayoutDashboard" | "LayoutGrid" | "Linkedin" | "List" | "ListFilter" | "LogOut" | "Mail" | "MapPin" | "Maximize" | "Menu" | "Microscope" | "Minus" | "MoreVertical" | "Move" | "Network" | "PanelLeftClose" | "PanelLeftOpen" | "PanelRightClose" | "PanelRightOpen" | "Pencil" | "Pentagon" | "Plug" | "Plus" | "Power" | "PowerOff" | "RefreshCw" | "RotateCcw" | "RotateCw" | "ScrollText" | "Search" | "SearchX" | "Send" | "Settings" | "Shield" | "ShieldCheck" | "Spline" | "Square" | "SquarePen" | "Star" | "Table" | "Tag" | "Trash2" | "Unplug" | "User" | "UserMinus" | "UserPlus" | "Users" | "UsersRound" | "X" | "XCircle" | "ZoomIn" | "ZoomOut";
|
|
23
23
|
/**
|
|
24
24
|
* Allowlist of icons available by name. Keys mirror the Lucide export name so
|
|
25
25
|
* call sites read `<Icon icon="Search" />`. Add an entry here (and to IconName
|
package/dist/index.js
CHANGED
|
@@ -185,6 +185,7 @@ import {
|
|
|
185
185
|
Fullscreen,
|
|
186
186
|
Grid2x2,
|
|
187
187
|
Grid3x3,
|
|
188
|
+
Hand,
|
|
188
189
|
Heart,
|
|
189
190
|
Image,
|
|
190
191
|
ImageOff,
|
|
@@ -206,12 +207,14 @@ import {
|
|
|
206
207
|
Microscope,
|
|
207
208
|
Minus,
|
|
208
209
|
MoreVertical,
|
|
210
|
+
Move,
|
|
209
211
|
Network,
|
|
210
212
|
PanelLeftClose,
|
|
211
213
|
PanelLeftOpen,
|
|
212
214
|
PanelRightClose,
|
|
213
215
|
PanelRightOpen,
|
|
214
216
|
Pencil,
|
|
217
|
+
Pentagon,
|
|
215
218
|
Plug,
|
|
216
219
|
Plus,
|
|
217
220
|
Power,
|
|
@@ -343,6 +346,7 @@ var iconRegistry = {
|
|
|
343
346
|
Github: GithubIcon,
|
|
344
347
|
Grid2x2,
|
|
345
348
|
Grid3x3,
|
|
349
|
+
Hand,
|
|
346
350
|
Heart,
|
|
347
351
|
Image,
|
|
348
352
|
ImageOff,
|
|
@@ -365,12 +369,14 @@ var iconRegistry = {
|
|
|
365
369
|
Microscope,
|
|
366
370
|
Minus,
|
|
367
371
|
MoreVertical,
|
|
372
|
+
Move,
|
|
368
373
|
Network,
|
|
369
374
|
PanelLeftClose,
|
|
370
375
|
PanelLeftOpen,
|
|
371
376
|
PanelRightClose,
|
|
372
377
|
PanelRightOpen,
|
|
373
378
|
Pencil,
|
|
379
|
+
Pentagon,
|
|
374
380
|
Plug,
|
|
375
381
|
Plus,
|
|
376
382
|
Power,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/Logo/Logo.tsx","../src/components/Button/Button.tsx","../src/components/_shared/styles.ts","../src/components/Icon/Icon.tsx","../src/components/Icon/icon-registry.ts","../src/components/Icon/icons/LinkedinIcon.tsx","../src/components/Icon/icons/GithubIcon.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Heading/Heading.tsx","../src/components/Prose/Prose.tsx","../src/components/Description/Description.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/TruncatedText/TruncatedText.tsx","../src/components/TruncatedText/useCopyToClipboard.ts","../src/components/TruncatedText/useMiddleEllipsis.ts","../src/components/TruncatedText/useOverflowDetection.ts","../src/components/IconButton/IconButton.tsx","../src/components/Form/Input/Input.tsx","../src/components/Form/Label/Label.tsx","../src/components/Form/InputPassword/InputPassword.tsx","../src/components/Form/Select/Select.tsx","../src/components/Table/Table.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogFooter.tsx","../src/components/Toast/Toast.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/Switch/Switch.tsx","../src/components/Form/Radio/Radio.tsx","../src/components/Form/Fieldset/Fieldset.tsx","../src/components/Link/Link.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/ToggleButton/ToggleButton.tsx","../src/components/Menu/Menu.tsx","../src/components/Menu/menuStyles.ts","../src/components/Menu/useContextMenu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuCheckboxItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuHeader.tsx","../src/components/Menu/MenuSeparator.tsx","../src/components/Popover/Popover.tsx","../src/components/Tabs/Tabs.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/DeltaIndicator/DeltaIndicator.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Banner/Banner.tsx","../src/components/MetricCard/MetricCard.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/PathPill/PathPill.tsx","../src/components/FormWizard/FormWizard.tsx","../src/components/FormWizard/FormWizardProgress.tsx","../src/components/FormWizard/FormWizardNav.tsx"],"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 { Logo } from \"./components/Logo\";\nexport type { LogoProps } from \"./components/Logo\";\n\nexport { Button } from \"./components/Button\";\nexport type {\n ButtonProps,\n ButtonVariant,\n ButtonSize,\n} from \"./components/Button\";\n\nexport { Spinner } from \"./components/Spinner\";\nexport type { SpinnerProps } from \"./components/Spinner\";\n\nexport { Heading, H1, H2, H3, H4, H5, H6 } from \"./components/Heading\";\nexport type {\n HeadingProps,\n HeadingLevel,\n HeadingSize,\n} from \"./components/Heading\";\n\nexport { Prose } from \"./components/Prose\";\nexport type { ProseProps } from \"./components/Prose\";\n\nexport { Description } from \"./components/Description\";\nexport type { DescriptionProps, DescriptionSize } from \"./components/Description\";\n\nexport { Icon, iconRegistry } from \"./components/Icon\";\nexport type {\n IconProps,\n IconName,\n IconComponent,\n IconValue,\n} from \"./components/Icon\";\n\nexport { Tooltip } from \"./components/Tooltip\";\nexport type { TooltipProps } from \"./components/Tooltip\";\n\nexport { TruncatedText } from \"./components/TruncatedText\";\nexport type { TruncatedTextProps } from \"./components/TruncatedText\";\n\nexport {\n IconButton,\n IconButtonLink,\n IconButtonToggle,\n} from \"./components/IconButton\";\nexport type {\n IconButtonProps,\n IconButtonLinkProps,\n IconButtonToggleProps,\n} from \"./components/IconButton\";\n\nexport { Input } from \"./components/Form/Input\";\nexport type { InputProps } from \"./components/Form/Input\";\n\nexport { InputPassword } from \"./components/Form/InputPassword\";\nexport type { InputPasswordProps } from \"./components/Form/InputPassword\";\n\nexport { Select } from \"./components/Form/Select\";\nexport type { SelectProps, SelectItem } from \"./components/Form/Select\";\n\nexport {\n Table,\n TableHeader,\n Column,\n TableBody,\n Row,\n Cell,\n} from \"./components/Table\";\nexport type { DataTableProps, TableSize } from \"./components/Table\";\n\nexport { Dialog } from \"./components/Dialog\";\nexport type { DialogProps } from \"./components/Dialog\";\n\nexport { ToastProvider, useToast, createToastBridge } from \"./components/Toast\";\nexport type {\n ToastData,\n ToastVariant,\n ToastPlacement,\n ToastContextValue,\n ToastBridge,\n ToastProviderProps,\n} from \"./components/Toast\";\n\nexport { EmptyState } from \"./components/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState\";\n\nexport { Checkbox } from \"./components/Form/Checkbox\";\nexport type { CheckboxProps } from \"./components/Form/Checkbox\";\n\nexport { Switch } from \"./components/Form/Switch\";\nexport type { SwitchProps } from \"./components/Form/Switch\";\n\nexport { RadioGroup, Radio, RadioButton } from \"./components/Form/Radio\";\nexport type {\n RadioGroupProps,\n RadioProps,\n RadioButtonProps,\n} from \"./components/Form/Radio\";\n\nexport { Label } from \"./components/Form/Label\";\nexport type { LabelProps } from \"./components/Form/Label\";\n\nexport { Fieldset } from \"./components/Form/Fieldset\";\nexport type { FieldsetProps } from \"./components/Form/Fieldset\";\n\nexport { Link } from \"./components/Link\";\nexport type { LinkProps, LinkVariant } from \"./components/Link\";\n\nexport { Breadcrumbs } from \"./components/Breadcrumbs\";\nexport type {\n BreadcrumbsProps,\n BreadcrumbItem,\n} from \"./components/Breadcrumbs\";\n\nexport { ButtonLink } from \"./components/Button\";\nexport type { ButtonLinkProps } from \"./components/Button\";\n\nexport { ToggleButton } from \"./components/ToggleButton\";\nexport type {\n ToggleButtonProps,\n ToggleButtonVariant,\n ToggleButtonSize,\n} from \"./components/ToggleButton\";\n\nexport {\n Menu,\n MenuItem,\n MenuCheckboxItem,\n MenuSection,\n MenuHeader,\n MenuSeparator,\n useContextMenu,\n} from \"./components/Menu\";\nexport type {\n MenuProps,\n MenuItemData,\n MenuItemProps,\n MenuCheckboxItemProps,\n MenuSectionProps,\n MenuHeaderProps,\n MenuSeparatorProps,\n UseContextMenuProps,\n UseContextMenuResult,\n} from \"./components/Menu\";\n\nexport { Popover, PopoverTrigger, PopoverContent } from \"./components/Popover\";\nexport type {\n PopoverProps,\n PopoverTriggerProps,\n PopoverContentProps,\n} from \"./components/Popover\";\n\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type {\n TabsProps,\n TabListProps,\n TabProps,\n TabPanelProps,\n TabsVariant,\n TabsSize,\n} from \"./components/Tabs\";\n\n// Raw React Aria Components tab primitives (unstyled escape hatch)\nexport {\n Tabs as UnstyledTabs,\n TabList as UnstyledTabList,\n Tab as UnstyledTab,\n TabPanel as UnstyledTabPanel,\n} from \"react-aria-components\";\n\nexport {\n SegmentedControl,\n SegmentedControlItem,\n} from \"./components/SegmentedControl\";\nexport type {\n SegmentedControlProps,\n SegmentedControlItemProps,\n SegmentedControlSize,\n SegmentedControlSelectionMode,\n} from \"./components/SegmentedControl\";\n\nexport { Badge } from \"./components/Badge\";\nexport type { BadgeProps, BadgeColor, BadgeSize } from \"./components/Badge\";\n\nexport { Card } from \"./components/Card\";\nexport type { CardProps } from \"./components/Card\";\n\nexport { DeltaIndicator } from \"./components/DeltaIndicator\";\nexport type {\n DeltaIndicatorProps,\n DeltaFormat,\n DeltaMode,\n} from \"./components/DeltaIndicator\";\n\nexport { ProgressBar } from \"./components/ProgressBar\";\nexport type {\n ProgressBarProps,\n ProgressBarVariant,\n ProgressBarSize,\n} from \"./components/ProgressBar\";\n\nexport { Banner } from \"./components/Banner\";\nexport type { BannerProps, BannerVariant } from \"./components/Banner\";\n\nexport { MetricCard } from \"./components/MetricCard\";\nexport type { MetricCardProps, MetricCardSize } from \"./components/MetricCard\";\n\nexport { SectionHeader } from \"./components/SectionHeader\";\nexport type { SectionHeaderProps } from \"./components/SectionHeader\";\n\nexport { DescriptionList } from \"./components/DescriptionList\";\nexport type {\n DescriptionListProps,\n DescriptionListItemProps,\n DescriptionListLayout,\n} from \"./components/DescriptionList\";\n\nexport { PathPill, pillColorFromName } from \"./components/PathPill\";\nexport type { PathPillProps } from \"./components/PathPill\";\n\nexport { FormWizard, useFormWizard } from \"./components/FormWizard\";\nexport type {\n FormWizardProps,\n FormWizardContextValue,\n} from \"./components/FormWizard\";\n\nexport { FormWizardProgress } from \"./components/FormWizard\";\nexport type { FormWizardProgressProps } from \"./components/FormWizard\";\n\nexport { FormWizardNav } from \"./components/FormWizard\";\nexport type { FormWizardNavProps } from \"./components/FormWizard\";\n","const W = 56;\nconst H = 20;\n\nconst paths: Record<string, string> = {\n c: \"M7.043,15.648C7.043,15.744 7.025,15.781 6.949,15.799C6.347,16.046 5.593,16.103 4.859,16.103C1.808,16.103 0,14.002 0,11.279C0,8.479 2.072,6.398 5.179,6.398C6.121,6.398 6.629,6.493 6.949,6.606C7.025,6.644 7.043,6.7 7.043,6.814L7.025,8.497C7.025,8.63 6.949,8.63 6.874,8.612C6.479,8.46 5.989,8.365 5.255,8.365C3.54,8.365 2.335,9.387 2.335,11.203C2.335,13.266 3.823,14.059 5.273,14.059C5.951,14.059 6.535,14.002 6.912,13.87C7.006,13.833 7.043,13.89 7.043,13.965L7.043,15.648Z\",\n y: \"M9.919,6.588C9.994,6.588 10.051,6.606 10.088,6.701C11.313,10.238 11.953,12.282 12.197,13.208C12.819,11.297 13.479,9.349 14.326,6.701C14.364,6.625 14.42,6.588 14.533,6.588L16.473,6.588C16.586,6.588 16.605,6.644 16.586,6.738C15.23,10.919 13.071,16.185 11.546,19.684C11.508,19.76 11.452,19.817 11.301,19.817L9.238,20C9.125,20 9.099,19.938 9.144,19.849C9.71,18.713 10.427,17.181 11.03,15.744C11.068,15.63 11.086,15.573 11.048,15.44C10.54,14.192 8.732,9.69 7.602,6.72C7.564,6.644 7.62,6.588 7.715,6.588L9.919,6.588Z\",\n t: \"M22.706,15.61C22.706,15.725 22.688,15.8 22.593,15.838C22.085,16.027 21.614,16.102 20.992,16.102C19.448,16.102 18.525,15.346 18.525,13.473L18.525,8.498L17.338,8.498C17.244,8.48 17.206,8.441 17.206,8.328L17.206,6.738C17.206,6.625 17.244,6.587 17.357,6.587L18.525,6.583C18.543,5.921 18.525,4.912 18.525,4.26C18.543,4.166 18.581,4.109 18.675,4.09L20.674,3.912C20.764,3.904 20.806,3.912 20.806,4.007L20.806,6.583L22.65,6.587C22.744,6.587 22.781,6.625 22.781,6.72L22.781,8.365C22.781,8.46 22.744,8.498 22.65,8.498L20.804,8.498L20.804,12.981C20.804,13.813 21.067,14.211 21.878,14.211C22.122,14.211 22.33,14.193 22.593,14.135C22.65,14.116 22.706,14.135 22.706,14.248L22.706,15.61Z\",\n a: \"M28.959,11.752C28.676,11.714 28.356,11.695 27.923,11.695C26.435,11.695 25.776,12.186 25.776,13C25.776,13.7 26.265,14.305 27.621,14.305C28.111,14.305 28.544,14.248 28.959,14.079L28.959,11.752ZM31.162,13.984C31.162,14.4 31.162,14.778 31.2,15.176C31.2,15.213 31.2,15.232 31.162,15.252C29.618,15.913 28.526,16.102 27.244,16.102C25.192,16.102 23.553,15.138 23.553,13C23.553,10.995 25.342,9.992 27.791,9.992C28.356,9.992 28.789,10.011 28.959,10.03L28.959,9.803C28.959,9.368 28.714,8.384 27.056,8.384C26.115,8.384 25.286,8.574 24.588,8.914C24.532,8.933 24.438,8.914 24.438,8.801L24.438,7.155C24.438,7.06 24.457,7.022 24.551,6.966C25.361,6.587 26.397,6.397 27.415,6.397C30.032,6.397 31.162,8.044 31.162,10.144L31.162,13.984Z\",\n r: \"M34.267,6.588C34.381,6.588 34.438,6.625 34.475,6.738C34.569,6.984 34.644,7.458 34.663,7.874C35.304,7.079 36.327,6.398 37.627,6.398C37.739,6.398 37.827,6.453 37.827,6.594L37.827,8.535C37.827,8.63 37.789,8.668 37.658,8.668C36.321,8.63 35.21,9.103 34.776,9.671L34.776,15.762C34.776,15.876 34.72,15.913 34.606,15.913L32.648,15.913C32.516,15.913 32.478,15.856 32.478,15.762C32.478,15.762 32.485,7.369 32.485,6.701C32.485,6.606 32.504,6.588 32.598,6.588L34.267,6.588Z\",\n i: \"M38.777,6.55C38.777,6.466 38.845,6.398 38.929,6.398C40.114,6.398 41.075,7.362 41.075,8.553L41.075,15.764C41.075,15.877 41.036,15.915 40.905,15.915L38.966,15.915C38.834,15.915 38.777,15.858 38.777,15.745L38.777,6.55Z\",\n o: \"M47.169,14.138C45.576,14.123 44.297,12.814 44.311,11.214C44.326,9.615 45.629,8.329 47.222,8.344C48.815,8.359 50.094,9.668 50.079,11.268C50.065,12.868 48.761,14.153 47.169,14.138M47.876,6.482C47.119,6.369 46.014,6.446 45.46,6.41C43.518,6.279 42.185,4.377 42.182,2.485C42.181,1.047 41.374,0.235 40.308,0.039C39.63,-0.088 38.97,0.105 38.471,0.501C37.984,0.908 37.658,1.518 37.642,2.21C37.612,3.297 38.236,4.259 39.637,4.556C41.479,4.951 43.056,6.656 42.782,8.591C42.702,9.142 42.392,10.273 42.346,11.04C42.18,13.708 44.321,16.035 47.032,16.093C48.225,16.119 49.332,15.719 50.191,15.02C51.049,14.322 51.682,13.32 51.889,12.138C52.369,9.509 50.569,6.882 47.876,6.482\",\n \"\\u00ae\": \"M54.243,7.684C54.243,7.493 54.104,7.355 53.837,7.355L53.499,7.355L53.499,8.006L53.837,8.006C54.104,8.006 54.243,7.884 54.243,7.684M53.499,8.224L53.499,8.893L53.257,8.893L53.257,7.137L53.837,7.137C54.235,7.137 54.494,7.346 54.494,7.676C54.494,7.937 54.33,8.11 54.088,8.18L54.581,8.893L54.295,8.893L53.845,8.224L53.499,8.224ZM55.212,8.015C55.212,7.207 54.65,6.633 53.837,6.633C53.023,6.633 52.452,7.207 52.452,8.015C52.452,8.832 53.023,9.405 53.837,9.405C54.65,9.405 55.212,8.832 55.212,8.015M52.21,8.015C52.21,7.085 52.894,6.398 53.837,6.398C54.78,6.398 55.463,7.085 55.463,8.015C55.463,8.954 54.78,9.64 53.837,9.64C52.894,9.64 52.21,8.954 52.21,8.015\",\n};\n\nexport type LogoProps = {\n /** Override the wordmark fill (defaults to theme-driven --logo-fill) */\n color?: string;\n /** Override the accent fill on the \"o\" (defaults to theme-driven --logo-highlight) */\n highlightColor?: string;\n scale?: number;\n className?: string;\n};\n\nexport function Logo({\n color,\n highlightColor,\n scale = 1,\n className,\n}: LogoProps) {\n const width = W * scale;\n const height = H * scale;\n const style: React.CSSProperties = {\n fill: \"var(--logo-fill)\",\n ...(color && { \"--logo-fill\": color } as React.CSSProperties),\n ...(highlightColor && { \"--logo-highlight\": highlightColor } as React.CSSProperties),\n };\n\n return (\n <svg\n role=\"img\"\n aria-label=\"Cytario Logo\"\n width={width}\n height={height}\n viewBox={`0 0 ${W} ${H}`}\n className={className}\n style={style}\n >\n {Object.entries(paths).map(([key, d], i) => (\n <path\n key={key}\n d={d}\n aria-hidden=\"true\"\n style={{\n fill: key === \"o\" ? \"var(--logo-highlight)\" : undefined,\n animation: \"logo-fade-in 0.4s ease-out both\",\n animationDelay: `${i * 0.06}s`,\n }}\n />\n ))}\n </svg>\n );\n}\n","import type { ElementType, ReactNode } from \"react\";\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type ButtonSize,\n type ButtonVariant,\n sizeStyles,\n variantStyles,\n} from \"../_shared/styles\";\nimport { Icon, type IconValue } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\n\nexport type { ButtonVariant, ButtonSize };\n\n/** Layout, shape and state classes shared by the text buttons (Button, ButtonLink). */\nexport const buttonBaseClass = `\n inline-flex items-center justify-center gap-2 shrink-0 cursor-pointer\n rounded-full\n font-medium\n leading-tight\n outline-none transition-colors no-underline\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\n disabled:opacity-50 disabled:pointer-events-none\n`;\n\n/** Shared visual props for the button family (Button, ButtonLink). */\nexport interface ButtonBaseProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n iconLeft?: IconValue;\n iconRight?: IconValue;\n className?: string;\n}\n\n/**\n * Shared text button: builds the className and renders the icon/label/icon\n * content (or a spinner while loading). The wrapper element is polymorphic via\n * `as`; the public Button/ButtonLink pass their own precisely-typed props.\n */\nfunction ButtonBase({\n as: Component,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n isDisabled,\n iconLeft,\n iconRight,\n className,\n children,\n ...props\n}: ButtonBaseProps & {\n as: ElementType;\n isDisabled?: boolean;\n} & Record<string, unknown>) {\n const cx = twMerge(\n buttonBaseClass,\n isLoading ? \"pointer-events-none\" : \"\",\n variantStyles[variant],\n sizeStyles[size],\n className,\n );\n\n return (\n <Component {...props} isDisabled={isDisabled || isLoading} className={cx}>\n {isLoading && <Spinner size={size} />}\n {!isLoading && iconLeft && <Icon icon={iconLeft} size={size} />}\n {children as ReactNode}\n {!isLoading && iconRight && <Icon icon={iconRight} size={size} />}\n </Component>\n );\n}\n\nexport type ButtonProps = Omit<AriaButtonProps, \"className\"> & ButtonBaseProps;\n\nexport function Button(props: ButtonProps) {\n return <ButtonBase as={AriaButton} {...props} />;\n}\n\nexport type ButtonLinkProps = Omit<AriaLinkProps, \"className\"> &\n ButtonBaseProps;\n\nexport function ButtonLink(props: ButtonLinkProps) {\n return <ButtonBase as={AriaLink} {...props} />;\n}\n","export type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport const sizeStyles: Record<ButtonSize, string> = {\n xs: \"px-2 py-1.5 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"neutral\"\n | \"outline\"\n | \"ghost\";\n\nexport const variantStyles: Record<ButtonVariant, string> = {\n primary: `\n bg-primary text-primary-foreground\n hover:bg-primary-hover\n pressed:bg-primary-pressed\n `,\n secondary: `\n bg-secondary text-secondary-foreground\n hover:bg-secondary-hover\n pressed:bg-secondary-pressed\n `,\n destructive: `\n bg-destructive text-destructive-foreground\n hover:bg-destructive-hover\n pressed:bg-destructive-pressed\n `,\n success: `\n bg-success text-success-foreground\n hover:bg-success-hover\n pressed:bg-success-pressed\n `,\n warning: `\n bg-warning text-warning-foreground\n hover:bg-warning-hover\n pressed:bg-warning-pressed\n `,\n info: `\n bg-info text-info-foreground\n hover:bg-info-hover\n pressed:bg-info-pressed\n `,\n neutral: `\n bg-muted text-foreground\n hover:bg-accent\n pressed:bg-accent-pressed\n `,\n outline: `\n bg-transparent text-foreground\n border border-border\n hover:bg-muted\n pressed:bg-accent-pressed\n `,\n ghost: `\n bg-transparent text-foreground\n hover:bg-muted\n pressed:bg-accent-pressed\n `,\n};\n\n/** Selected (toggled-on) background per variant — reuses each variant's pressed\n * tone. Keyed on react-aria's `data-selected` (`selected:`), so it only takes\n * effect on ToggleButton-backed components. Literal classes for Tailwind. */\nexport const selectedStyles: Record<ButtonVariant, string> = {\n primary: \"selected:bg-primary-pressed\",\n secondary: \"selected:bg-secondary-pressed\",\n destructive: \"selected:bg-destructive-pressed\",\n success: \"selected:bg-success-pressed\",\n warning: \"selected:bg-warning-pressed\",\n info: \"selected:bg-info-pressed\",\n neutral: \"selected:bg-accent-pressed\",\n outline: \"selected:bg-accent-pressed\",\n ghost: \"selected:bg-accent-pressed\",\n};\n","import type { ComponentType } from \"react\";\nimport type { LucideProps } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { iconRegistry, type IconName } from \"./icon-registry\";\n\nexport type { IconName };\n\n/** Any Lucide-compatible icon component — a Lucide icon or a custom SVG. */\nexport type IconComponent = ComponentType<LucideProps>;\n\n/** A registered icon name, or an icon component passed directly. */\nexport type IconValue = IconName | IconComponent;\n\nexport interface IconProps {\n icon: IconValue;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n strokeWidth?: number;\n className?: string;\n}\n\nexport const sizeMap = {\n xs: 14,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n} as const;\n\n/** An icon rendered at one of the design system's preset sizes. */\nexport function Icon({\n icon,\n size = \"md\",\n strokeWidth = 2,\n className,\n}: IconProps) {\n const Component: IconComponent =\n typeof icon === \"string\" ? iconRegistry[icon] : icon;\n\n return (\n <Component\n size={sizeMap[size]}\n strokeWidth={strokeWidth}\n aria-hidden=\"true\"\n focusable={false}\n className={twMerge(\"shrink-0\", className)}\n />\n );\n}\n","import {\n AlertCircle,\n AlertTriangle,\n AlignCenter,\n AlignLeft,\n AlignRight,\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpRight,\n Ban,\n Bookmark,\n BookmarkCheck,\n Braces,\n Building2,\n Calendar,\n Check,\n CheckCircle,\n CheckCircle2,\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Circle,\n CircleDot,\n CircleSlash,\n Clock,\n Cloud,\n Columns2,\n Columns3,\n Copy,\n CreditCard,\n Database,\n Download,\n Edit,\n EllipsisVertical,\n ExternalLink,\n Eye,\n EyeOff,\n File,\n FileSearch,\n FileSpreadsheet,\n FilterX,\n Folder,\n FolderPlus,\n FolderTree,\n Fullscreen,\n Grid2x2,\n Grid3x3,\n Heart,\n Image,\n ImageOff,\n Inbox,\n Info,\n KeyRound,\n Lasso,\n Layers,\n Layers2,\n LayoutDashboard,\n LayoutGrid,\n List,\n ListFilter,\n LogOut,\n Mail,\n MapPin,\n Maximize,\n Menu,\n Microscope,\n Minus,\n MoreVertical,\n Network,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n Pencil,\n Plug,\n Plus,\n Power,\n PowerOff,\n RefreshCw,\n RotateCcw,\n RotateCw,\n ScrollText,\n Search,\n SearchX,\n Send,\n Settings,\n Shield,\n ShieldCheck,\n Spline,\n Square,\n SquarePen,\n Star,\n Table,\n Tag,\n Trash2,\n Unplug,\n User,\n UserMinus,\n UserPlus,\n Users,\n UsersRound,\n X,\n XCircle,\n ZoomIn,\n ZoomOut,\n type LucideIcon,\n} from \"lucide-react\";\nimport { LinkedinIcon } from \"./icons/LinkedinIcon\";\nimport { GithubIcon } from \"./icons/GithubIcon\";\n\n/** Union of every registered icon name. */\nexport type IconName =\n | \"AlertCircle\"\n | \"AlertTriangle\"\n | \"AlignCenter\"\n | \"AlignLeft\"\n | \"AlignRight\"\n | \"Archive\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"ArrowUp\"\n | \"ArrowUpRight\"\n | \"Ban\"\n | \"Bookmark\"\n | \"BookmarkCheck\"\n | \"Braces\"\n | \"Building2\"\n | \"Calendar\"\n | \"Check\"\n | \"CheckCircle\"\n | \"CheckCircle2\"\n | \"ChevronDown\"\n | \"ChevronRight\"\n | \"ChevronUp\"\n | \"Circle\"\n | \"CircleDot\"\n | \"CircleSlash\"\n | \"Clock\"\n | \"Cloud\"\n | \"Columns2\"\n | \"Columns3\"\n | \"Copy\"\n | \"CreditCard\"\n | \"Database\"\n | \"Download\"\n | \"Edit\"\n | \"EllipsisVertical\"\n | \"ExternalLink\"\n | \"Eye\"\n | \"EyeOff\"\n | \"File\"\n | \"FileSearch\"\n | \"FileSpreadsheet\"\n | \"FilterX\"\n | \"Folder\"\n | \"FolderPlus\"\n | \"FolderTree\"\n | \"Fullscreen\"\n | \"Github\"\n | \"Grid2x2\"\n | \"Grid3x3\"\n | \"Heart\"\n | \"Image\"\n | \"ImageOff\"\n | \"Inbox\"\n | \"Info\"\n | \"KeyRound\"\n | \"Lasso\"\n | \"Layers\"\n | \"Layers2\"\n | \"LayoutDashboard\"\n | \"LayoutGrid\"\n | \"Linkedin\"\n | \"List\"\n | \"ListFilter\"\n | \"LogOut\"\n | \"Mail\"\n | \"MapPin\"\n | \"Maximize\"\n | \"Menu\"\n | \"Microscope\"\n | \"Minus\"\n | \"MoreVertical\"\n | \"Network\"\n | \"PanelLeftClose\"\n | \"PanelLeftOpen\"\n | \"PanelRightClose\"\n | \"PanelRightOpen\"\n | \"Pencil\"\n | \"Plug\"\n | \"Plus\"\n | \"Power\"\n | \"PowerOff\"\n | \"RefreshCw\"\n | \"RotateCcw\"\n | \"RotateCw\"\n | \"ScrollText\"\n | \"Search\"\n | \"SearchX\"\n | \"Send\"\n | \"Settings\"\n | \"Shield\"\n | \"ShieldCheck\"\n | \"Spline\"\n | \"Square\"\n | \"SquarePen\"\n | \"Star\"\n | \"Table\"\n | \"Tag\"\n | \"Trash2\"\n | \"Unplug\"\n | \"User\"\n | \"UserMinus\"\n | \"UserPlus\"\n | \"Users\"\n | \"UsersRound\"\n | \"X\"\n | \"XCircle\"\n | \"ZoomIn\"\n | \"ZoomOut\";\n\n/**\n * Allowlist of icons available by name. Keys mirror the Lucide export name so\n * call sites read `<Icon icon=\"Search\" />`. Add an entry here (and to IconName\n * above) before using a new icon — the explicit map keeps the bundle\n * tree-shakeable (no wildcard import of the full Lucide set).\n */\nexport const iconRegistry: Record<IconName, LucideIcon> = {\n AlertCircle,\n AlertTriangle,\n AlignCenter,\n AlignLeft,\n AlignRight,\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpRight: ArrowUpRight,\n Ban,\n Bookmark,\n BookmarkCheck,\n Braces,\n Building2: Building2,\n Calendar,\n Check,\n CheckCircle,\n CheckCircle2,\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Circle,\n CircleDot,\n CircleSlash: CircleSlash,\n Clock,\n Cloud,\n Columns2,\n Columns3,\n Copy,\n CreditCard: CreditCard,\n Database: Database,\n Download,\n Edit,\n EllipsisVertical,\n ExternalLink,\n Eye,\n EyeOff,\n File,\n FileSearch,\n FileSpreadsheet,\n FilterX,\n Folder,\n FolderPlus,\n FolderTree,\n Fullscreen,\n Github: GithubIcon as unknown as LucideIcon,\n Grid2x2,\n Grid3x3,\n Heart,\n Image,\n ImageOff,\n Inbox,\n Info,\n KeyRound: KeyRound,\n Lasso,\n Layers,\n Layers2,\n LayoutDashboard: LayoutDashboard,\n LayoutGrid,\n Linkedin: LinkedinIcon as unknown as LucideIcon,\n List,\n ListFilter,\n LogOut,\n Mail,\n MapPin,\n Maximize,\n Menu,\n Microscope,\n Minus,\n MoreVertical,\n Network: Network,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n Pencil,\n Plug,\n Plus,\n Power: Power,\n PowerOff: PowerOff,\n RefreshCw: RefreshCw,\n RotateCcw,\n RotateCw,\n ScrollText: ScrollText,\n Search,\n SearchX,\n Send,\n Settings,\n Shield,\n ShieldCheck,\n Spline,\n Square,\n SquarePen: SquarePen,\n Star,\n Table,\n Tag,\n Trash2,\n Unplug,\n User,\n UserMinus,\n UserPlus,\n Users,\n UsersRound,\n X,\n XCircle,\n ZoomIn,\n ZoomOut,\n};\n","import { forwardRef } from \"react\";\nimport type { LucideProps } from \"lucide-react\";\n\nexport const LinkedinIcon = forwardRef<SVGSVGElement, LucideProps>(\n function LinkedinIcon({ size = 24, className, ...props }, ref) {\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n focusable={false}\n {...props}\n >\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.063 2.063 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n );\n },\n);\n","import { forwardRef } from \"react\";\nimport type { LucideProps } from \"lucide-react\";\n\nexport const GithubIcon = forwardRef<SVGSVGElement, LucideProps>(\n function GithubIcon({ size = 24, className, ...props }, ref) {\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n focusable={false}\n {...props}\n >\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n },\n);\n","import { twMerge } from \"tailwind-merge\";\nimport { ButtonSize } from \"../_shared/styles\";\nimport { sizeMap } from \"../Icon/Icon\";\n\nexport interface SpinnerProps {\n size?: ButtonSize;\n \"aria-label\"?: string;\n className?: string;\n}\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={twMerge(\"animate-spin\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n width={sizeMap[size]}\n height={sizeMap[size]}\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 { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\nexport type HeadingSize = HeadingLevel | \"hero\";\n\nexport interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n as?: HeadingLevel;\n size?: HeadingSize;\n children: React.ReactNode;\n}\n\nconst sizeMap = {\n h1: \"text-4xl sm:text-5xl leading-tight font-bold\",\n h2: \"text-2xl sm:text-3xl leading-tight font-bold\",\n h3: \"text-lg sm:text-xl leading-snug font-bold\",\n h4: \"text-base sm:text-lg font-semibold\",\n h5: \"text-sm sm:text-base font-semibold\",\n h6: \"text-sm font-semibold\",\n hero: \"text-4xl sm:text-5xl lg:text-6xl leading-tight font-bold\",\n};\n\nexport const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(\n function Heading(\n { as: Tag = \"h2\", size, className, children, ...rest },\n ref,\n ) {\n const resolvedSize = size ?? Tag;\n const cx = twMerge(\"text-inherit mb-4\", sizeMap[resolvedSize], className);\n\n return (\n <Tag ref={ref} className={cx} {...rest}>\n {children}\n </Tag>\n );\n },\n);\n\n/** Convenience: renders `<h1>` with h1 styles (4xl→5xl responsive, bold) */\nexport const H1 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H1(props, ref) {\n return <Heading {...props} ref={ref} as=\"h1\" />;\n },\n);\n\n/** Convenience: renders `<h2>` with h2 styles (2xl→3xl responsive, bold) */\nexport const H2 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H2(props, ref) {\n return <Heading {...props} ref={ref} as=\"h2\" />;\n },\n);\n\n/** Convenience: renders `<h3>` with h3 styles (lg→xl responsive, bold) */\nexport const H3 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H3(props, ref) {\n return <Heading {...props} ref={ref} as=\"h3\" />;\n },\n);\n\n/** Convenience: renders `<h4>` with h4 styles (base→lg responsive, semibold) */\nexport const H4 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H4(props, ref) {\n return <Heading {...props} ref={ref} as=\"h4\" />;\n },\n);\n\n/** Convenience: renders `<h5>` with h5 styles (sm→base responsive, semibold) */\nexport const H5 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H5(props, ref) {\n return <Heading {...props} ref={ref} as=\"h5\" />;\n },\n);\n\n/** Convenience: renders `<h6>` with h6 styles (sm, semibold) */\nexport const H6 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H6(props, ref) {\n return <Heading {...props} ref={ref} as=\"h6\" />;\n },\n);\n","import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface ProseProps extends HTMLAttributes<HTMLDivElement> {\n /** Content rendered inside the `.prose` container */\n children: ReactNode;\n /** Visual size variant (default \"default\") */\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\";\n /** Invert colours for dark backgrounds (default false) */\n invert?: boolean;\n className?: string;\n}\n\nconst sizeClasses: Record<NonNullable<ProseProps[\"size\"]>, string> = {\n sm: \"prose-sm\",\n default: \"prose\",\n lg: \"prose-lg\",\n xl: \"prose-xl\",\n};\n\n/**\n * Renders rich-text / long-form content with the Tailwind Typography plugin.\n *\n * Wrap markdown output, static documentation, or any long-form content that\n * contains `<h1>`–`<h6>`, `<p>`, `<ul>`, `<ol>`, `<blockquote>`, `<code>` and\n * similar elements. The wrapper applies the `prose` class family so the\n * content inherits consistent typographic spacing and colour.\n *\n * @example\n * <Prose size=\"lg\">{renderMarkdown(content)}</Prose>\n */\nexport const Prose = forwardRef<HTMLDivElement, ProseProps>(function Prose(\n { size = \"default\", invert = false, className, children, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={twMerge(\n \"prose\",\n sizeClasses[size],\n invert && \"prose-invert\",\n \"max-w-none\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type DescriptionSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface DescriptionProps extends Omit<\n HTMLAttributes<HTMLParagraphElement>,\n \"children\"\n> {\n /** Content rendered inside the paragraph */\n children: ReactNode;\n /** Visual size variant (default \"md\") */\n size?: DescriptionSize;\n /** Merge override */\n className?: string;\n}\n\nconst sizeClasses: Record<DescriptionSize, string> = {\n sm: \"text-sm md:text-base\",\n md: \"text-base md:text-lg\",\n lg: \"text-lg md:text-xl\",\n xl: \"text-xl md:text-2xl\",\n};\n\n/**\n * Renders a single paragraph of muted body copy with responsive sizing.\n *\n * Use for lead text, supporting descriptions, and other non-heading prose.\n * The element is a `<p>` so it participates in normal document flow. Pass\n * `size` to scale the text; pass `className` to override colour, margin, or\n * any other utility.\n *\n * @example\n * <Description size=\"lg\">Supporting copy beneath a heading.</Description>\n */\nexport const Description = forwardRef<HTMLParagraphElement, DescriptionProps>(\n function Description({ size = \"md\", className, children, ...rest }, ref) {\n return (\n <p\n ref={ref}\n className={twMerge(\n \"text-pretty text-muted-foreground mb-4\",\n sizeClasses[size],\n className,\n )}\n {...rest}\n >\n {children}\n </p>\n );\n },\n);\n","import {\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n// Use useLayoutEffect on client, useEffect on server to avoid SSR warning\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport interface TooltipProps {\n /** Tooltip content; `null`/`undefined` disables the tooltip entirely */\n content: ReactNode;\n /** Trigger element(s) */\n children: ReactNode;\n}\n\ninterface Coords {\n x: number;\n y: number;\n}\n\nconst offsetThreshold = 5;\nconst tooltipDelay = 500; // ms of cursor rest before showing\nconst tooltipOffset = 12;\nconst viewportMargin = 4; // minimum gap to the viewport edge\n\nconst tooltipCx = [\n \"fixed z-50 px-2 py-1 rounded shadow-lg\",\n // Natural content width (capped at max-w-xs): being positioned near the\n // right viewport edge must shift the tooltip left, not squeeze its layout.\n \"w-max max-w-xs\",\n \"bg-overlay backdrop-blur-sm\",\n \"text-primary-foreground text-sm\",\n \"pointer-events-none\",\n].join(\" \");\n\n/**\n * Cursor-following tooltip. Shows after the cursor rests on the trigger for\n * 500ms (movement beyond 5px restarts the wait), positioned at a 12px offset\n * from the cursor and flipped at viewport edges.\n *\n * Keyboard: when an already-focusable child (button, switch, link) receives\n * visible focus, the tooltip shows immediately, anchored to the element's\n * center. It never makes anything focusable itself. Escape dismisses.\n *\n * Known limitation (WCAG 1.4.13 \"hoverable\"): the tooltip is\n * pointer-events-none and follows the cursor, so it cannot itself be hovered.\n * Keep tooltip content short — it is a glance affordance, not a reading\n * surface; the underlying value must stay accessible on the trigger itself.\n */\nexport function Tooltip({ content, children }: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState<Coords>({ x: 0, y: 0 });\n const [adjustedCoords, setAdjustedCoords] = useState<Coords>({ x: 0, y: 0 });\n const timerRef = useRef<number | null>(null);\n // Cursor-rest anchor. A ref, not state: the move-cancel comparison must see\n // the value set earlier in the SAME event stream, not a previous render's.\n const restAnchorRef = useRef<Coords | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const isVisible = visible && content != null;\n\n const calculateAdjustedPosition = (anchorX: number, anchorY: number) => {\n if (!tooltipRef.current) {\n return { x: anchorX + tooltipOffset, y: anchorY + tooltipOffset };\n }\n\n const { width, height } = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let x = anchorX + tooltipOffset;\n let y = anchorY + tooltipOffset;\n\n // Flip to the other side of the anchor at right/bottom edges\n if (anchorX + width > viewportWidth) {\n x = anchorX - width - tooltipOffset;\n }\n if (anchorY + height > viewportHeight) {\n y = anchorY - height - tooltipOffset;\n }\n\n // Hard-clamp into the viewport — flipping alone can still overshoot\n // (e.g. anchor near a corner, or tooltip wider than the remaining space)\n x = Math.max(\n viewportMargin,\n Math.min(x, viewportWidth - width - viewportMargin),\n );\n y = Math.max(\n viewportMargin,\n Math.min(y, viewportHeight - height - viewportMargin),\n );\n\n return { x, y };\n };\n\n // Recalculate position after tooltip is rendered/resized\n useIsomorphicLayoutEffect(() => {\n if (!isVisible || !tooltipRef.current) return;\n setAdjustedCoords(calculateAdjustedPosition(coords.x, coords.y));\n }, [isVisible, coords, content]);\n\n const hideTooltip = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n restAnchorRef.current = null;\n setVisible(false);\n };\n\n // Cursor-rest model: any move beyond the threshold (measured against the\n // incoming event coordinates, not stale state) hides the tooltip, re-anchors\n // and restarts the dwell; staying within it lets the pending timer fire.\n const handleMouseMove = ({ clientX, clientY }: MouseEvent) => {\n setCoords({ x: clientX, y: clientY });\n\n const anchor = restAnchorRef.current;\n const moved =\n anchor == null ||\n Math.abs(clientX - anchor.x) > offsetThreshold ||\n Math.abs(clientY - anchor.y) > offsetThreshold;\n\n if (!moved) return;\n\n hideTooltip();\n restAnchorRef.current = { x: clientX, y: clientY };\n timerRef.current = window.setTimeout(() => {\n setVisible(true);\n }, tooltipDelay);\n };\n\n // Keyboard path: a focusable child received focus. Only react to visible\n // (keyboard-driven) focus and anchor at the element's center — no dwell,\n // deliberate focus is intent enough.\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as Element;\n let focusVisible = true;\n try {\n focusVisible = target.matches(\":focus-visible\");\n } catch {\n // Older engines without :focus-visible — fall back to showing.\n }\n if (!focusVisible) return;\n\n const rect = target.getBoundingClientRect();\n const center = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n // Anchor at the element center so incidental mouse movement over the\n // focused trigger doesn't immediately cancel the keyboard-shown tooltip.\n restAnchorRef.current = center;\n setCoords(center);\n setVisible(true);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") hideTooltip();\n };\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n const tooltipContent =\n isVisible && content != null ? (\n <div\n ref={tooltipRef}\n role=\"tooltip\"\n className={tooltipCx}\n style={{ left: adjustedCoords.x, top: adjustedCoords.y }}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <span\n style={{ display: \"contents\" }}\n onMouseMove={handleMouseMove}\n onMouseLeave={hideTooltip}\n onFocus={handleFocus}\n onBlur={hideTooltip}\n onKeyDown={handleKeyDown}\n >\n {children}\n {typeof window !== \"undefined\" &&\n createPortal(tooltipContent, document.body)}\n </span>\n );\n}\n","import {\n CSSProperties,\n KeyboardEvent,\n ReactNode,\n UIEvent,\n useRef,\n} from \"react\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useCopyToClipboard } from \"./useCopyToClipboard\";\nimport { useMiddleEllipsis } from \"./useMiddleEllipsis\";\nimport { useOverflowDetection } from \"./useOverflowDetection\";\n\ntype EllipsisMode = \"left\" | \"middle\" | \"right\";\n\nexport interface TruncatedTextProps {\n /** Text to display. `middle` ellipsis requires a string child. */\n children: ReactNode;\n /** Where the ellipsis is placed when the text overflows (default `right`). */\n ellipsis?: EllipsisMode;\n /** When set, the text becomes click-to-copy and copies this value. */\n copyValue?: string;\n}\n\nconst spanCx = \"truncate overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n// Web's original used -mx-1 px-1 to widen the hover highlight beyond the\n// text; on a w-full element the negative margin overflows the container and\n// clips on the right — keep the highlight within the text box instead.\nconst copyCx =\n \"hover:bg-accent transition-colors rounded cursor-pointer\";\n\nconst leftStyle: CSSProperties = { direction: \"rtl\", textAlign: \"left\" };\n\n// An overflow-hidden + ellipsis element is still a horizontal scroll\n// container: a click-drag text selection (or focus) scrolls it, sliding the\n// text and hiding the ellipsis. Pin it so the truncation always shows.\nconst pinScroll = (e: UIEvent<HTMLElement>) => {\n if (e.currentTarget.scrollLeft !== 0) e.currentTarget.scrollLeft = 0;\n};\n\nconst handleCopyKeyDown = (handleClick: () => void) => (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n};\n\nconst CopiedOverlay = () => (\n <span\n // Announce the successful copy to screen readers; as a live region the\n // text is not glued onto the button's accessible name.\n role=\"status\"\n aria-live=\"polite\"\n className=\"absolute inset-0 flex items-center text-muted-foreground pointer-events-none\"\n >\n Copied\n </span>\n);\n\n// ─── Right (default): pure CSS truncation ───────────────────────────\n\nconst RightEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {children}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Left: CSS direction trick ──────────────────────────────────────\n\nconst LeftEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n style={leftStyle}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n <bdi>{children}</bdi>\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Middle: JS-based truncation ────────────────────────────────────\n\nconst middleCx = \"overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n\nconst MiddleEllipsisString = ({ text, copyValue }: { text: string; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const displayed = useMiddleEllipsis(ref, text);\n const isTruncated = displayed !== text;\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${middleCx} ${copyCx} relative` : middleCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? text : null}>\n <span\n ref={ref}\n className={cx}\n // Middle truncation replaces the DOM text, so screen readers would\n // otherwise announce the mutilated string — expose the full value.\n aria-label={isTruncated ? text : undefined}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {displayed}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Public component ───────────────────────────────────────────────\n\n/**\n * Truncating text span (ported from cytario-web's TooltipSpan). Reveals the\n * full value via the cursor tooltip only while actually truncated. Plain text\n * stays non-focusable; passing `copyValue` turns it into a click-to-copy\n * button (focusable, keyboard operable).\n */\nexport const TruncatedText = ({ children, ellipsis = \"right\", copyValue }: TruncatedTextProps) => {\n if (ellipsis === \"left\") return <LeftEllipsis copyValue={copyValue}>{children}</LeftEllipsis>;\n if (ellipsis === \"middle\" && typeof children === \"string\")\n return <MiddleEllipsisString text={children} copyValue={copyValue} />;\n return <RightEllipsis copyValue={copyValue}>{children}</RightEllipsis>;\n};\n","import { useCallback, useRef, useState } from \"react\";\n\nconst FLASH_DURATION = 1500;\n\ninterface UseCopyToClipboardResult {\n handleClick: () => void;\n isCopied: boolean;\n}\n\nexport function useCopyToClipboard(copyValue: string | undefined): UseCopyToClipboardResult {\n const [isCopied, setIsCopied] = useState(false);\n const timerRef = useRef<number | null>(null);\n\n const handleClick = useCallback(() => {\n if (copyValue == null) return;\n\n const selection = window.getSelection()?.toString();\n if (selection && selection.length > 0) return;\n\n // Clipboard API is absent in insecure contexts and can reject on denied\n // permission — fail silently rather than throw.\n if (!navigator.clipboard) return;\n navigator.clipboard\n .writeText(copyValue)\n .then(() => {\n if (timerRef.current != null) clearTimeout(timerRef.current);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => {\n setIsCopied(false);\n timerRef.current = null;\n }, FLASH_DURATION);\n })\n .catch(() => {});\n }, [copyValue]);\n\n return { handleClick, isCopied };\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\nconst ELLIPSIS = \"…\";\n\n/**\n * Binary-search for the longest `start…end` that fits within the element.\n * Uses actual DOM measurement (scrollWidth vs clientWidth) instead of canvas,\n * so results are pixel-perfect regardless of font, letter-spacing, or rendering.\n */\nfunction computeTruncated(el: HTMLElement, text: string): string {\n el.textContent = text;\n if (el.scrollWidth <= el.clientWidth) return text;\n\n let lo = 0;\n let hi = text.length;\n\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n const startLen = Math.ceil(mid / 2);\n const endLen = Math.floor(mid / 2);\n el.textContent =\n text.slice(0, startLen) + ELLIPSIS + (endLen > 0 ? text.slice(text.length - endLen) : \"\");\n\n if (el.scrollWidth <= el.clientWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n\n if (lo === 0) return ELLIPSIS;\n\n const startLen = Math.ceil(lo / 2);\n const endLen = Math.floor(lo / 2);\n\n const result =\n endLen === 0\n ? text.slice(0, startLen) + ELLIPSIS\n : text.slice(0, startLen) + ELLIPSIS + text.slice(text.length - endLen);\n\n // Ensure the DOM shows the final result immediately, before React re-renders.\n el.textContent = result;\n return result;\n}\n\n/**\n * Observes the container width and returns a middle-truncated string.\n * Returns the original text if it fits within the container.\n */\nexport function useMiddleEllipsis(ref: RefObject<HTMLSpanElement | null>, text: string): string {\n const [displayed, setDisplayed] = useState(text);\n\n // useLayoutEffect runs before paint, so the user never sees the full text.\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const update = () => setDisplayed(computeTruncated(el, text));\n\n update();\n\n const observer = new ResizeObserver(() => update());\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, text]);\n\n return displayed;\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\n/**\n * Detects whether an element's content overflows its visible width.\n * Uses ResizeObserver to recheck on any container size change\n * (column resize, flex layout shifts, not just window resize).\n */\nexport function useOverflowDetection(ref: RefObject<HTMLElement | null>): boolean {\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const check = () => setIsTruncated(el.scrollWidth > el.offsetWidth);\n\n check();\n\n // Defer + coalesce to the next frame so a live container resize (e.g.\n // dragging a sidebar) can't drive a synchronous observe→setState→layout\n // loop (\"Maximum update depth\").\n let raf = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(check);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n observer.disconnect();\n };\n }, [ref]);\n\n return isTruncated;\n}\n","import type { ElementType, Ref } from \"react\";\nimport {\n Button as AriaButton,\n Link as AriaLink,\n ToggleButton as AriaToggleButton,\n type ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type ButtonVariant,\n type ButtonSize,\n selectedStyles,\n variantStyles,\n} from \"../_shared/styles\";\nimport { type ButtonProps, type ButtonLinkProps } from \"../Button\";\nimport { buttonBaseClass } from \"../Button/Button\";\nimport { Icon, type IconValue } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport const squareSizeStyles: Record<ButtonSize, string> = {\n xs: \"h-7 w-7\", // 28px\n sm: \"h-8 w-8\", // 32px\n md: \"h-10 w-10\", // 40px\n lg: \"h-12 w-12\", // 48px\n};\n\ninterface IconButtonBaseProps {\n as: ElementType;\n icon: IconValue;\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n isDisabled?: boolean;\n className?: string;\n ref?: Ref<HTMLButtonElement | HTMLAnchorElement>;\n}\n\n/**\n * Shared square icon button: builds the className, wraps in a Tooltip, and\n * renders the icon (or a spinner while loading). The wrapper element is\n * polymorphic via `as`; the public IconButton/IconButtonLink pass their own\n * precisely-typed props through.\n */\nfunction IconButtonBase({\n as: Component,\n icon,\n label,\n variant = \"ghost\",\n size = \"md\",\n isLoading = false,\n isDisabled,\n className,\n ref,\n ...props\n}: IconButtonBaseProps & Record<string, unknown>) {\n const cx = twMerge(\n buttonBaseClass,\n isLoading ? \"pointer-events-none\" : \"\",\n variantStyles[variant],\n // No-op unless the wrapper is a ToggleButton (react-aria sets data-selected).\n selectedStyles[variant],\n squareSizeStyles[size],\n className,\n );\n\n return (\n <Tooltip content={label}>\n <Component\n {...props}\n ref={ref}\n aria-label={label}\n isDisabled={isDisabled || isLoading}\n className={cx}\n >\n {isLoading ? <Spinner size={size} /> : <Icon icon={icon} size={size} />}\n </Component>\n </Tooltip>\n );\n}\n\nexport type IconButtonProps = Omit<\n ButtonProps,\n \"iconLeft\" | \"iconRight\" | \"children\"\n> & {\n icon: IconValue;\n label: string;\n ref?: Ref<HTMLButtonElement>;\n};\n\nexport function IconButton(props: IconButtonProps) {\n return <IconButtonBase as={AriaButton} {...props} />;\n}\n\nexport type IconButtonLinkProps = Omit<\n ButtonLinkProps,\n \"iconLeft\" | \"iconRight\" | \"children\"\n> & {\n icon: IconValue;\n label: string;\n ref?: Ref<HTMLAnchorElement>;\n};\n\nexport function IconButtonLink(props: IconButtonLinkProps) {\n return <IconButtonBase as={AriaLink} {...props} />;\n}\n\nexport type IconButtonToggleProps = Omit<\n AriaToggleButtonProps,\n \"className\" | \"children\"\n> & {\n icon: IconValue;\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n ref?: Ref<HTMLButtonElement>;\n};\n\n/** Icon button with a persistent on/off state (react-aria ToggleButton): `isSelected` toggles `aria-pressed` and the selected background. */\nexport function IconButtonToggle(props: IconButtonToggleProps) {\n return <IconButtonBase as={AriaToggleButton} {...props} />;\n}\n","import type { ElementType } from \"react\";\nimport {\n TextField,\n Input as AriaInput,\n Text,\n type TextFieldProps,\n ColorField,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../../_shared/styles\";\nimport { Label } from \"../Label\";\n\nconst alignClasses = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\nexport interface InputProps extends Omit<\n TextFieldProps,\n \"children\" | \"className\"\n> {\n as?: typeof TextField | typeof ColorField;\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\";\n size?: ButtonSize;\n prefix?: string;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\nexport function Input({\n as: FieldProp = TextField,\n label,\n placeholder,\n description,\n errorMessage,\n type = \"text\",\n size = \"md\",\n prefix,\n align = \"left\",\n isDisabled,\n isRequired,\n className,\n ...props\n}: InputProps) {\n const Field: ElementType = FieldProp;\n\n const isInvalid = !!errorMessage;\n\n const borderColor = isInvalid\n ? \"border-destructive-border\"\n : \"border-border hover:border-border\";\n\n const radiusClass = \"rounded-md\";\n\n return (\n <Field\n {...props}\n type={type}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n className={twMerge(\"flex w-full flex-col gap-1\", className)}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n {prefix ? (\n <div\n className={twMerge(\n \"flex items-center overflow-hidden\",\n radiusClass,\n \"border\",\n \"bg-background\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus-within:ring-2 focus-within:ring-ring focus-within:border-ring\",\n isDisabled && \"opacity-50 pointer-events-none\",\n )}\n >\n <span\n className={twMerge(\n \"self-stretch flex items-center shrink-0 select-none\",\n \"bg-card\",\n \"border-r border-r-border\",\n \"text-muted-foreground\",\n sizeStyles[size],\n )}\n >\n {prefix}\n </span>\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full bg-transparent\",\n sizeStyles[size],\n alignClasses[align],\n \"text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"outline-none border-none\",\n )}\n />\n </div>\n ) : (\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full\",\n sizeStyles[size],\n alignClasses[align],\n radiusClass,\n \"border\",\n \"text-foreground\",\n \"bg-background\",\n \"placeholder:text-muted-foreground\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus:ring-2 focus:ring-ring focus:border-ring\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n )}\n />\n )}\n\n {description && (\n <Text slot=\"description\" className=\"text-sm text-muted-foreground\">\n {description}\n </Text>\n )}\n\n {isInvalid && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-destructive\"\n >\n {errorMessage}\n </Text>\n )}\n </Field>\n );\n}\n","import {\n Label as AriaLabel,\n type LabelProps as AriaLabelProps,\n} from \"react-aria-components\";\n\nexport interface LabelProps extends Omit<AriaLabelProps, \"className\"> {\n isRequired?: boolean;\n className?: string;\n}\n\nexport function Label({ isRequired, children, className, ...props }: LabelProps) {\n return (\n <AriaLabel\n {...props}\n className={[\n \"text-sm\",\n \"font-medium\",\n \"text-foreground\",\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-destructive\"\n >\n *\n </span>\n )}\n </AriaLabel>\n );\n}\n","import { forwardRef, useId, useState, type InputHTMLAttributes } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../../_shared/styles\";\nimport { Icon } from \"../../Icon\";\n\nexport interface InputPasswordProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n label?: string;\n description?: string;\n errorMessage?: string;\n size?: ButtonSize;\n isRequired?: boolean;\n isDisabled?: boolean;\n /** Disable only the visibility toggle; the input stays interactive. */\n isToggleDisabled?: boolean;\n showPasswordLabel?: string;\n hidePasswordLabel?: string;\n}\n\n/**\n * Password field with a built-in show/hide visibility toggle.\n *\n * Built on a native <input> (ref-forwarded, full native attribute/event\n * passthrough) so it works equally in controlled React forms and in\n * server-driven native forms (e.g. Keycloakify login themes). The toggle\n * lives inside the input's border — no InputGroup composition required.\n */\nexport const InputPassword = forwardRef<HTMLInputElement, InputPasswordProps>(\n function InputPassword(\n {\n label,\n description,\n errorMessage,\n size = \"md\",\n isRequired,\n isDisabled,\n isToggleDisabled,\n showPasswordLabel = \"Show password\",\n hidePasswordLabel = \"Hide password\",\n id,\n className,\n \"aria-invalid\": ariaInvalidProp,\n \"aria-describedby\": ariaDescribedByProp,\n ...inputProps\n },\n ref,\n ) {\n const [visible, setVisible] = useState(false);\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const isInvalid = !!errorMessage;\n\n const descId = description ? `${inputId}-description` : undefined;\n const errId = isInvalid ? `${inputId}-error` : undefined;\n const describedBy =\n [descId, errId, ariaDescribedByProp].filter(Boolean).join(\" \") ||\n undefined;\n\n const toggleDisabled = isToggleDisabled ?? isDisabled;\n\n return (\n <div className={twMerge(\"flex w-full flex-col gap-1\", className)}>\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-foreground\"\n >\n {label}\n {isRequired && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-destructive\">\n *\n </span>\n )}\n </label>\n )}\n\n <div\n className={twMerge(\n \"flex items-center overflow-hidden rounded-md border bg-background\",\n \"outline-none transition-colors\",\n isInvalid ? \"border-destructive-border\" : \"border-border\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:border-ring\",\n isDisabled && \"opacity-50 pointer-events-none\",\n )}\n >\n <input\n {...inputProps}\n ref={ref}\n id={inputId}\n type={visible ? \"text\" : \"password\"}\n required={isRequired}\n disabled={isDisabled}\n aria-invalid={isInvalid || ariaInvalidProp}\n aria-describedby={describedBy}\n className={twMerge(\n \"w-full bg-transparent text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"outline-none border-none\",\n sizeStyles[size],\n )}\n />\n <button\n type=\"button\"\n aria-label={visible ? hidePasswordLabel : showPasswordLabel}\n disabled={toggleDisabled}\n tabIndex={toggleDisabled ? -1 : undefined}\n onClick={() => setVisible((v) => !v)}\n className={twMerge(\n \"flex items-center justify-center shrink-0 self-stretch px-3 cursor-pointer\",\n \"text-muted-foreground hover:text-foreground transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n >\n <Icon icon={visible ? EyeOff : Eye} size=\"sm\" />\n </button>\n </div>\n\n {description && (\n <p id={descId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n\n {isInvalid && (\n <p id={errId} role=\"alert\" className=\"text-sm text-destructive\">\n {errorMessage}\n </p>\n )}\n </div>\n );\n },\n);\n","import type React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport {\n Button,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n SelectValue,\n Text,\n type SelectProps as AriaSelectProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../../_shared/styles\";\nimport { Label } from \"../Label\";\n\nexport interface SelectItem {\n id: string;\n name: string;\n}\n\nexport interface SelectProps extends Omit<\n AriaSelectProps<SelectItem>,\n \"children\"\n> {\n items: SelectItem[];\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n /** Controls padding and font size */\n size?: ButtonSize;\n /** Custom visual renderer for items in the dropdown and trigger.\n * `item.name` remains the accessible label (used for typeahead and screen readers). */\n renderItem?: (item: SelectItem) => React.ReactNode;\n}\n\nexport function Select({\n label,\n items,\n placeholder = \"Select an option\",\n description,\n errorMessage,\n size = \"md\",\n isDisabled,\n isRequired,\n className,\n renderItem,\n ...props\n}: SelectProps) {\n const hasError = Boolean(errorMessage);\n\n return (\n <AriaSelect\n {...props}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={hasError}\n className={twMerge(\"flex flex-col gap-1\", className as string)}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n <Button\n aria-required={isRequired || undefined}\n className={twMerge(\n `\n inline-flex items-center justify-between\n w-full rounded-md\n text-left\n border outline-none transition-colors\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\n cursor-pointer disabled:opacity-50 disabled:pointer-events-none\n bg-background\n `,\n sizeStyles[size],\n hasError ? \"border-destructive-border\" : \"border-border\",\n )}\n >\n <SelectValue\n className={twMerge(\n renderItem ? \"min-w-0\" : \"truncate\",\n \"data-placeholder:text-muted-foreground\",\n )}\n >\n {({ selectedItem, isPlaceholder }) => {\n if (isPlaceholder) return placeholder;\n const item = selectedItem as SelectItem;\n return renderItem ? renderItem(item) : (item?.name ?? placeholder);\n }}\n </SelectValue>\n <ChevronDown\n aria-hidden\n className={twMerge(\n \"shrink-0 text-muted-foreground\",\n size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\",\n )}\n />\n </Button>\n\n {description && (\n <Text slot=\"description\" className=\"text-sm text-muted-foreground\">\n {description}\n </Text>\n )}\n\n {hasError && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-destructive\"\n >\n {errorMessage}\n </Text>\n )}\n\n <Popover\n className={twMerge(\n \"w-(--trigger-width)\",\n \"rounded-md\",\n \"border border-border\",\n \"bg-background\",\n \"shadow-lg\",\n \"overflow-auto\",\n \"entering:animate-in entering:fade-in\",\n \"exiting:animate-out exiting:fade-out\",\n )}\n >\n <ListBox className=\"p-1 outline-none\" items={items}>\n {(item) => (\n <ListBoxItem\n id={item.id}\n textValue={item.name}\n className={twMerge(\n `\n flex items-center justify-between gap-2\n rounded-sm\n text-foreground\n cursor-pointer outline-none\n hover:bg-muted\n focus-visible:bg-muted\n selected:text-primary selected:font-medium\n `,\n sizeStyles[size],\n )}\n >\n {({ isSelected }) => (\n <>\n <span className={renderItem ? \"min-w-0 flex-1\" : \"truncate\"}>\n {renderItem ? renderItem(item) : item.name}\n </span>\n {isSelected && (\n <Check className=\"h-4 w-4 shrink-0 text-primary\" />\n )}\n </>\n )}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n","import {\n Cell as AriaCell,\n Column as AriaColumn,\n Row as AriaRow,\n Table as AriaTable,\n TableBody as AriaTableBody,\n TableHeader as AriaTableHeader,\n type CellProps as AriaCellProps,\n type ColumnProps as AriaColumnProps,\n type RowProps as AriaRowProps,\n type TableBodyProps,\n type TableHeaderProps,\n type TableProps as AriaTableProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type TableSize = \"compact\" | \"comfortable\";\n\n/* ------------------------------------------------------------------ */\n/* Table */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps\n extends Omit<AriaTableProps, \"className\"> {\n /** Row density */\n size?: TableSize;\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\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({\n size = \"comfortable\",\n className,\n ...props\n}: DataTableProps) {\n return (\n <AriaTable\n {...props}\n className={twMerge(\n \"w-full border-collapse text-sm text-foreground\",\n tableSizeClass[size],\n className,\n )}\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 interface ColumnProps extends Omit<AriaColumnProps, \"className\"> {\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\n}\n\nexport function Column({ className, ...props }: ColumnProps) {\n return (\n <AriaColumn\n {...props}\n className={twMerge(\n \"px-3 py-2 text-left font-semibold text-muted-foreground\",\n \"border-b-2 border-border\",\n \"cursor-default select-none outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]\",\n className,\n )}\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-muted-foreground\">\n {sortDirection === \"ascending\"\n ? \"\\u25B2\"\n : sortDirection === \"descending\"\n ? \"\\u25BC\"\n : \"\\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 interface RowProps<T extends object>\n extends Omit<AriaRowProps<T>, \"className\"> {\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\n}\n\nexport function Row<T extends object>({\n className,\n ...props\n}: RowProps<T>) {\n return (\n <AriaRow\n {...props}\n className={twMerge(\n \"border-b border-border\",\n \"even:bg-card\",\n \"hover:bg-muted\",\n \"data-[selected]:bg-accent\",\n \"data-[selected]:ring-2 data-[selected]:ring-ring data-[selected]:ring-inset\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]\",\n \"transition-colors\",\n className,\n )}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Cell */\n/* ------------------------------------------------------------------ */\n\nexport interface CellProps extends Omit<AriaCellProps, \"className\"> {\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\n}\n\nexport function Cell({ className, ...props }: CellProps) {\n return (\n <AriaCell\n {...props}\n className={twMerge(\n \"px-3 py-(--table-row-py)\",\n \"text-foreground\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]\",\n className,\n )}\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-backdrop backdrop-blur-sm\",\n \"flex items-center justify-center\",\n \"entering:animate-in entering:fade-in\",\n \"exiting:animate-out exiting:fade-out\",\n ].join(\" \")}\n >\n <Modal\n className={[\n \"w-full mx-4\",\n sizeStyles[size],\n \"bg-background rounded-lg shadow-xl max-h-[85vh] flex flex-col\",\n \"entering:animate-in entering:zoom-in-95 entering:fade-in\",\n \"exiting:animate-out exiting:zoom-out-95 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-border\">\n <Heading\n slot=\"title\"\n className=\"text-lg font-semibold text-foreground\"\n >\n {title}\n </Heading>\n <button\n type=\"button\"\n onClick={close}\n className={[\n \"inline-flex items-center justify-center rounded-sm p-1\",\n \"text-muted-foreground hover:text-foreground hover:bg-muted\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"transition-colors\",\n ].join(\" \")}\n aria-label=\"Close\"\n >\n <X size={20} aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"px-6 py-4 overflow-y-auto\">{children}</div>\n </>\n )}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type React from \"react\";\n\nexport interface DialogFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function DialogFooter({ children, className }: DialogFooterProps) {\n return (\n <div\n className={[\n \"pt-4 mt-4 border-t border-border flex items-center justify-between gap-3\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CheckCircle, XCircle, Info, X } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport type ToastVariant = \"success\" | \"error\" | \"info\";\nexport type ToastPlacement = \"top-center\" | \"top-right\" | \"bottom-center\" | \"bottom-right\";\n\nexport interface ToastData {\n id: string;\n variant: ToastVariant;\n message: string;\n duration?: number;\n}\n\nexport interface ToastContextValue {\n toasts: ToastData[];\n addToast: (toast: Omit<ToastData, \"id\">) => void;\n removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nlet toastCounter = 0;\n\nconst defaultDuration: Record<ToastVariant, number> = {\n success: 5000,\n info: 5000,\n error: 10000,\n};\n\nconst variantConfig: Record<\n ToastVariant,\n { icon: LucideIcon; containerClass: string; iconClass: string }\n> = {\n success: {\n icon: CheckCircle,\n containerClass: \"bg-success-surface border-success-border text-success\",\n iconClass: \"text-success\",\n },\n error: {\n icon: XCircle,\n containerClass: \"bg-destructive-surface border-destructive-border text-destructive\",\n iconClass: \"text-destructive\",\n },\n info: {\n icon: Info,\n containerClass: \"bg-info-surface border-info-border text-info\",\n iconClass: \"text-info\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Placement context — passed from ToastContainer to ToastItem\n// ---------------------------------------------------------------------------\n\nconst PlacementContext = createContext<ToastPlacement>(\"bottom-right\");\n\nconst exitAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"-translate-y-full opacity-0\",\n \"top-right\": \"translate-x-full opacity-0\",\n \"bottom-center\": \"translate-y-full opacity-0\",\n \"bottom-right\": \"translate-x-full opacity-0\",\n};\n\nconst enterAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-top\",\n \"top-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n \"bottom-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-bottom\",\n \"bottom-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n};\n\nfunction ToastItem({\n toast,\n onRemove,\n}: {\n toast: ToastData;\n onRemove: (id: string) => void;\n}) {\n const [isExiting, setIsExiting] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const placement = useContext(PlacementContext);\n const config = variantConfig[toast.variant];\n const IconComponent = config.icon;\n\n const dismiss = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => onRemove(toast.id), 200);\n }, [onRemove, toast.id]);\n\n useEffect(() => {\n const duration = toast.duration ?? defaultDuration[toast.variant];\n timerRef.current = setTimeout(dismiss, duration);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [toast.duration, toast.variant, dismiss]);\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={[\n \"flex items-start gap-3 rounded-lg border px-4 py-3 shadow-md\",\n \"min-w-[320px] max-w-[420px]\",\n \"transition-all duration-200\",\n isExiting\n ? exitAnimationByPlacement[placement]\n : enterAnimationByPlacement[placement],\n config.containerClass,\n ].join(\" \")}\n >\n <IconComponent size={20} className={[\"shrink-0 mt-0.5\", config.iconClass].join(\" \")} aria-hidden=\"true\" />\n <p className=\"flex-1 text-sm font-medium\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={dismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <X size={16} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n\nconst containerPositionStyles: Record<ToastPlacement, string> = {\n \"top-center\": \"fixed top-4 left-1/2 -translate-x-1/2 z-50 flex flex-col-reverse gap-2 items-center\",\n \"top-right\": \"fixed top-4 right-4 z-50 flex flex-col-reverse gap-2\",\n \"bottom-center\": \"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 flex flex-col gap-2 items-center\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-50 flex flex-col gap-2\",\n};\n\nfunction ToastContainer({\n toasts,\n removeToast,\n placement = \"bottom-right\",\n}: {\n toasts: ToastData[];\n removeToast: (id: string) => void;\n placement?: ToastPlacement;\n}) {\n if (toasts.length === 0) return null;\n\n return createPortal(\n <PlacementContext.Provider value={placement}>\n <div className={containerPositionStyles[placement]}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n </PlacementContext.Provider>,\n document.body,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Toast Bridge — allows code outside the React tree to emit toasts\n// ---------------------------------------------------------------------------\n\nexport interface ToastBridge {\n /** Call from anywhere (including outside React) to show a toast. */\n emit: (toast: Omit<ToastData, \"id\">) => void;\n /** Used internally by ToastProvider to subscribe to external emits. */\n subscribe: (fn: (toast: Omit<ToastData, \"id\">) => void) => () => void;\n}\n\nexport function createToastBridge(): ToastBridge {\n const listeners = new Set<(toast: Omit<ToastData, \"id\">) => void>();\n return {\n emit: (toast) => {\n listeners.forEach((fn) => fn(toast));\n },\n subscribe: (fn) => {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// ToastProvider\n// ---------------------------------------------------------------------------\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Optional bridge for receiving toasts from outside the React tree. */\n bridge?: ToastBridge;\n /** Where to display toasts on screen. Defaults to \"bottom-right\". */\n placement?: ToastPlacement;\n}\n\nexport function ToastProvider({ children, bridge, placement = \"bottom-right\" }: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n\n const addToast = useCallback((toast: Omit<ToastData, \"id\">) => {\n const id = `toast-${++toastCounter}`;\n setToasts((prev) => [...prev, { ...toast, id }]);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n // Subscribe to external bridge emits\n useEffect(() => {\n if (!bridge) return;\n return bridge.subscribe(addToast);\n }, [bridge, addToast]);\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} placement={placement} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return {\n toast: context.addToast,\n toasts: context.toasts,\n removeToast: context.removeToast,\n };\n}\n","import type React from \"react\";\nimport { Icon, type IconValue } from \"../Icon\";\n\nexport interface EmptyStateProps {\n icon?: IconValue;\n title: string;\n description?: string;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={[\n \"flex flex-col items-center text-center py-12 px-6\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && (\n <Icon icon={icon} size=\"xl\" className=\"text-muted-foreground\" />\n )}\n <h3 className=\"text-lg font-semibold text-foreground mt-4\">\n {title}\n </h3>\n {description && (\n <p className=\"text-sm text-muted-foreground mt-2 max-w-sm\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n","import type React from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from \"react-aria-components\";\nimport { Check } from \"lucide-react\";\n\nexport interface CheckboxProps\n extends Omit<AriaCheckboxProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <AriaCheckbox\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-foreground cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected, isIndeterminate }) => (\n <>\n <div\n className={[\n \"flex items-center justify-center w-6 h-6 shrink-0\",\n \"rounded-sm border transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-ring group-focus-visible:ring-offset-2\",\n isSelected || isIndeterminate\n ? \"bg-primary border-primary\"\n : \"bg-background border-border group-hover:border-border\",\n ].join(\" \")}\n >\n {isSelected && (\n <Check className=\"w-4 h-4 text-primary-foreground\" strokeWidth={3} />\n )}\n {isIndeterminate && (\n <div className=\"w-3 h-0.5 bg-primary-foreground 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-primary\",\n success: \"bg-success\",\n destructive: \"bg-destructive\",\n};\n\nconst presetColors = new Set<string>(Object.keys(trackColorMap));\n\nfunction isPresetColor(color: string): color is PresetColor {\n return presetColors.has(color);\n}\n\nexport function Switch({\n children,\n color = \"primary\",\n className,\n ...props\n}: SwitchProps) {\n const isPreset = isPresetColor(color);\n\n return (\n <AriaSwitch\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-foreground 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-ring group-focus-visible:ring-offset-2\",\n isSelected && isPreset\n ? trackColorMap[color]\n : !isSelected\n ? \"bg-border\"\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-background transition-transform shadow-sm\",\n isSelected ? \"translate-x-4\" : \"translate-x-0\",\n ].join(\" \")}\n />\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaSwitch>\n );\n}\n","import type React from \"react\";\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\n\nexport interface RadioGroupProps\n extends Omit<AriaRadioGroupProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioButtonProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function RadioGroup({ children, className, ...props }: RadioGroupProps) {\n return (\n <AriaRadioGroup\n {...props}\n className={[\n \"flex flex-col gap-2\",\n \"disabled:opacity-50\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </AriaRadioGroup>\n );\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-foreground 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-ring group-focus-visible:ring-offset-2\",\n isSelected\n ? \"border-primary\"\n : \"border-border group-hover:border-border\",\n ].join(\" \")}\n >\n {isSelected && (\n <div className=\"w-2.5 h-2.5 rounded-full bg-primary\" />\n )}\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaRadio>\n );\n}\n\nexport function RadioButton({ children, className, ...props }: RadioButtonProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <div\n className={[\n \"px-4 py-2 text-sm font-medium\",\n \"rounded-md border transition-colors text-center\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-ring group-focus-visible:ring-offset-2\",\n isSelected\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"bg-background border-border text-foreground hover:border-border\",\n ].join(\" \")}\n >\n {children}\n </div>\n )}\n </AriaRadio>\n );\n}\n","import type React from \"react\";\n\nexport interface FieldsetProps {\n legend?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Fieldset({ legend, children, className }: FieldsetProps) {\n return (\n <fieldset\n className={[\n \"flex flex-col gap-8\",\n \"border-none p-0 m-0\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {legend && (\n <legend\n className={[\n \"text-lg\",\n \"font-semibold\",\n \"text-foreground\",\n \"p-0\",\n ].join(\" \")}\n >\n {legend}\n </legend>\n )}\n {children}\n </fieldset>\n );\n}\n","import {\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\n\nexport type LinkVariant = \"default\" | \"subtle\";\n\nexport interface LinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Visual style variant */\n variant?: LinkVariant;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst variantStyles: Record<LinkVariant, string> = {\n default: [\n \"text-teal-700 underline\",\n \"hover:text-teal-800\",\n ].join(\" \"),\n subtle: [\n \"text-muted-foreground no-underline\",\n \"hover:underline hover:text-foreground\",\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-ring focus-visible:ring-offset-2 focus-visible:rounded-sm\",\n variantStyles[variant],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import {\n Breadcrumbs as AriaBreadcrumbs,\n Breadcrumb as AriaBreadcrumb,\n Link,\n} from \"react-aria-components\";\nimport { ChevronRight } from \"lucide-react\";\n\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumbs({ items, className }: BreadcrumbsProps) {\n return (\n <nav\n aria-label=\"Breadcrumb\"\n className={className}\n >\n <AriaBreadcrumbs\n className=\"flex items-center gap-1 text-sm min-w-0\"\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <AriaBreadcrumb\n key={item.id}\n id={item.id}\n className={[\n \"flex items-center gap-1\",\n isLast ? \"min-w-0\" : \"shrink-0\",\n ].join(\" \")}\n >\n {isLast ? (\n <span className=\"font-medium text-foreground truncate\">\n {item.label}\n </span>\n ) : (\n <>\n <Link\n href={item.href}\n className=\"whitespace-nowrap text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:rounded-sm\"\n >\n {item.label}\n </Link>\n <ChevronRight\n className=\"shrink-0 text-slate-400\"\n size={16}\n aria-hidden=\"true\"\n />\n </>\n )}\n </AriaBreadcrumb>\n );\n })}\n </AriaBreadcrumbs>\n </nav>\n );\n}\n","import {\n ToggleButton as AriaToggleButton,\n type ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../_shared/styles\";\n\nexport type ToggleButtonVariant = \"default\" | \"primary\" | \"outlined\";\nexport type ToggleButtonSize = ButtonSize;\n\nexport interface ToggleButtonProps extends Omit<\n AriaToggleButtonProps,\n \"className\"\n> {\n /** Visual style variant */\n variant?: ToggleButtonVariant;\n /** Size preset */\n size?: ToggleButtonSize;\n /** Use fixed square dimensions instead of padding-based sizing */\n isSquare?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles: Record<ToggleButtonSize, string> = {\n xs: \"h-6 w-6 text-xs\",\n sm: \"h-7 w-7 text-sm\",\n md: \"h-8 w-8 text-base\",\n lg: \"h-10 w-10 text-lg\",\n};\n\nconst variantStyles: Record<\n ToggleButtonVariant,\n { base: string; selected: string }\n> = {\n default: {\n base: [\n \"bg-transparent text-foreground\",\n \"hover:bg-accent\",\n \"pressed:bg-accent\",\n ].join(\" \"),\n selected: \"bg-accent text-foreground\",\n },\n primary: {\n base: [\n \"bg-transparent text-foreground\",\n \"hover:bg-accent\",\n \"pressed:bg-accent\",\n ].join(\" \"),\n selected: \"bg-primary-pressed text-primary-foreground\",\n },\n outlined: {\n base: [\n \"bg-background text-foreground\",\n \"border border-border\",\n \"hover:bg-card\",\n \"pressed:bg-muted\",\n ].join(\" \"),\n selected: [\n \"bg-slate-800 text-primary-foreground\",\n \"border border-slate-800\",\n ].join(\" \"),\n },\n};\n\nexport function ToggleButton({\n variant = \"default\",\n size = \"md\",\n isSquare = false,\n className,\n ...props\n}: ToggleButtonProps) {\n const styles = variantStyles[variant];\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected }) =>\n twMerge(\n \"inline-flex items-center justify-center gap-2 cursor-pointer\",\n isSquare ? \"rounded-none\" : \"rounded-md\",\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-ring 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 type React from \"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 { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconValue } from \"../Icon\";\nimport { popoverStyles } from \"./menuStyles\";\n\nexport interface MenuItemData {\n id: string;\n label: string;\n icon?: IconValue;\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\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 =\n selectionMode && selectionMode !== \"none\"\n ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange }\n : {};\n\n return (\n <MenuTrigger>\n {children}\n <Popover className={twMerge(popoverStyles, className)}>\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-muted\",\n \"hover:bg-muted\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n item.isDanger ? \"text-destructive\" : \"text-foreground\",\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","/** Shared popover chrome for `Menu` (click) and `useContextMenu` (right-click). */\nexport const popoverStyles = `\n bg-background rounded-md shadow-lg\n border border-border\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`;\n","import {\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Menu as AriaMenu,\n MenuTrigger,\n Popover,\n Pressable,\n type PressEvent,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { popoverStyles } from \"./menuStyles\";\n\nexport interface UseContextMenuProps {\n /** Menu body — compose `MenuItem` / `MenuSeparator` / `MenuSection`. */\n content: ReactNode;\n /** Called with the activated item key (fires alongside each item's own `onAction`). */\n onAction?: (key: string) => void;\n /** Extra classes for the menu popover. */\n className?: string;\n}\n\nexport interface UseContextMenuResult {\n /** Spread on the right-clickable element: opens the menu at the cursor. */\n targetProps: { onContextMenu: (event: React.MouseEvent) => void };\n /**\n * Spread on a keyboard/click trigger (e.g. an `IconButton`): opens the menu\n * anchored to that element. Uses the press event's target — no ref wiring.\n */\n triggerProps: { onPress: (event: PressEvent) => void };\n /** Render this wherever — it portals itself. */\n menu: ReactNode;\n isOpen: boolean;\n close: () => void;\n}\n\n/**\n * Cursor-anchored context menu. Unlike {@link Menu} (a click-triggered dropdown\n * anchored to its trigger), this opens at the pointer on right-click and stays\n * open across other right-clicks.\n *\n * Built on a controlled, **non-modal** `Popover` — non-modal so a right-click\n * on another element reaches its own handler (a modal popover's underlay would\n * swallow it and leak the native menu). Because non-modal drops React-Aria's\n * built-in outside dismiss (`isDismissable: !isNonModal`), this hook owns\n * dismissal: a right-click elsewhere closes this menu (and its target opens a\n * fresh one), any outside press closes it, and the native menu is suppressed\n * while open.\n *\n * The popover anchors to a real hidden 0×0 element moved to the cursor (or to\n * the trigger's rect for keyboard opens) — React-Aria's positioning observes\n * the trigger with a `ResizeObserver`, so a plain virtual object won't do.\n */\nexport function useContextMenu({\n content,\n onAction,\n className,\n}: UseContextMenuProps): UseContextMenuResult {\n // The anchor point in viewport coords; null when closed.\n const [anchor, setAnchor] = useState<{ x: number; y: number } | null>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const isOpen = anchor !== null;\n\n const close = useCallback(() => setAnchor(null), []);\n\n const onContextMenu = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n setAnchor({ x: event.clientX, y: event.clientY });\n }, []);\n\n const onPress = useCallback((event: PressEvent) => {\n // Anchor to the trigger's bottom-left for keyboard/click opens.\n const rect = event.target.getBoundingClientRect();\n setAnchor({ x: rect.left, y: rect.bottom });\n }, []);\n\n // Dismissal (non-modal has none of its own). Capture phase so it runs before\n // the menu's own item handlers and before other open menus.\n useEffect(() => {\n if (!isOpen) return;\n\n const isInside = (target: EventTarget | null) =>\n popoverRef.current?.contains(target as Node) ?? false;\n\n const onPointerDown = (event: PointerEvent) => {\n if (!isInside(event.target)) close();\n };\n const onOutsideContextMenu = (event: MouseEvent) => {\n if (isInside(event.target)) return;\n // Suppress the native menu; the right-clicked element's own onContextMenu\n // (if any) opens a fresh menu on this same interaction.\n event.preventDefault();\n close();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") close();\n };\n\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"contextmenu\", onOutsideContextMenu, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"contextmenu\", onOutsideContextMenu, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [isOpen, close]);\n\n const menu = (\n <MenuTrigger\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) close();\n }}\n >\n {/* Hidden anchor: MenuTrigger positions the popover at this element, which\n we move to the cursor. We open programmatically (controlled isOpen),\n never by pressing it. Pressable satisfies MenuTrigger's trigger slot. */}\n <Pressable>\n <span\n ref={anchorRef}\n aria-hidden\n className=\"pointer-events-none fixed h-0 w-0\"\n style={{ left: anchor?.x ?? 0, top: anchor?.y ?? 0 }}\n />\n </Pressable>\n <Popover\n isNonModal\n placement=\"bottom start\"\n ref={popoverRef}\n className={twMerge(popoverStyles, className)}\n >\n <AriaMenu\n autoFocus=\"first\"\n onAction={(key) => {\n onAction?.(String(key));\n close();\n }}\n className=\"outline-none\"\n >\n {content}\n </AriaMenu>\n </Popover>\n </MenuTrigger>\n );\n\n return {\n targetProps: { onContextMenu },\n triggerProps: { onPress },\n menu,\n isOpen,\n close,\n };\n}\n","import type React from \"react\";\nimport { MenuItem as AriaMenuItem } from \"react-aria-components\";\nimport { Icon, type IconValue } from \"../Icon\";\n\nexport interface MenuItemProps {\n id: string;\n /** Item label */\n children: React.ReactNode;\n icon?: IconValue;\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-muted\",\n \"hover:bg-muted\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isDanger\n ? \"text-destructive\"\n : \"text-foreground\",\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-muted\",\n \"hover:bg-muted\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"text-foreground\",\n isSelected ? \"font-medium\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")\n }\n >\n {({ isSelected }) => (\n <>\n <span className=\"flex items-center justify-center w-4 h-4 shrink-0\">\n {isSelected && (\n <Check size={14} className=\"text-primary\" aria-hidden=\"true\" />\n )}\n </span>\n <span className=\"flex-1\">{children}</span>\n </>\n )}\n </AriaMenuItem>\n );\n}\n","import type React from \"react\";\nimport {\n MenuSection as AriaMenuSection,\n Header,\n} from \"react-aria-components\";\n\nexport interface MenuSectionProps {\n /** Optional section header — string renders as styled text, ReactNode for custom */\n header?: React.ReactNode;\n /** MenuItems within this section */\n children: React.ReactNode;\n /** Accessible label for the section group (useful when header is absent or non-textual) */\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function MenuSection({\n header,\n children,\n \"aria-label\": ariaLabel,\n className,\n}: MenuSectionProps) {\n return (\n <AriaMenuSection className={className} aria-label={ariaLabel}>\n {header && (\n <Header\n className={[\n \"px-3 py-1.5\",\n \"text-xs font-semibold\",\n \"text-muted-foreground\",\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-border my-1\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import type React from \"react\";\nimport {\n DialogTrigger,\n Popover as AriaPopover,\n Button as AriaButton,\n type PopoverProps as AriaPopoverProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface PopoverProps {\n /** Controls open state (uncontrolled by default via DialogTrigger) */\n isOpen?: boolean;\n /** Called when open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n children: React.ReactNode;\n}\n\n/** Provides open/close state to a paired PopoverTrigger and PopoverContent. */\nexport function Popover({ children, isOpen, onOpenChange }: PopoverProps) {\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </DialogTrigger>\n );\n}\n\nexport interface PopoverTriggerProps {\n children: React.ReactNode;\n /** Additional CSS classes for the trigger wrapper */\n className?: string;\n}\n\n/** Wraps its child in an AriaButton so it can toggle the parent Popover. */\nexport function PopoverTrigger({ children, className }: PopoverTriggerProps) {\n const cx = `\n inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm\n `;\n\n return <AriaButton className={twMerge(cx, className)}>{children}</AriaButton>;\n}\n\nexport interface PopoverContentProps {\n placement?: AriaPopoverProps[\"placement\"];\n offset?: number;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Floating panel anchored to the trigger. Provides focus trap,\n * Escape-to-close, focus restore, and outside-click dismiss via RAC's\n * Popover (no Dialog wrapper needed for those behaviors).\n */\nexport function PopoverContent({\n placement = \"bottom\",\n offset: offsetPx = 8,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n const cx = `\n z-50\n bg-background\n border border-border\n rounded-md shadow-lg\n entering:animate-in entering:fade-in entering:duration-300\n exiting:animate-out exiting:fade-out exiting:duration-300\n entering:placement-top:slide-in-from-bottom-1\n entering:placement-bottom:slide-in-from-top-1\n entering:placement-left:slide-in-from-right-1\n entering:placement-right:slide-in-from-left-1\n `;\n return (\n <AriaPopover\n {...rest}\n placement={placement}\n offset={offsetPx}\n className={twMerge(cx, className)}\n >\n {children}\n </AriaPopover>\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n type TabsProps as AriaTabsProps,\n type TabListProps as AriaTabListProps,\n type TabProps as AriaTabProps,\n type TabPanelProps as AriaTabPanelProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type TabsVariant = \"underline\" | \"pills\" | \"unstyled\";\nexport type TabsSize = \"sm\" | \"md\" | \"lg\";\n\ninterface TabsContextValue {\n variant: TabsVariant;\n size: TabsSize;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: \"underline\",\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Style maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<TabsSize, string> = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\n// ---------------------------------------------------------------------------\n// Tabs (root)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps\n extends Omit<AriaTabsProps, \"className\" | \"orientation\"> {\n /** Visual style variant */\n variant?: TabsVariant;\n /** Size preset */\n size?: TabsSize;\n /** Layout orientation */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function Tabs({\n variant = \"underline\",\n size = \"md\",\n orientation = \"horizontal\",\n className,\n children,\n ...props\n}: TabsProps) {\n return (\n <TabsContext.Provider value={{ variant, size }}>\n <AriaTabs\n {...props}\n orientation={orientation}\n className={twMerge(\n orientation === \"vertical\" ? \"flex\" : \"\",\n className,\n )}\n >\n {children}\n </AriaTabs>\n </TabsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabList\n// ---------------------------------------------------------------------------\n\nexport interface TabListProps<T extends object>\n extends Omit<AriaTabListProps<T>, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabList<T extends object>({\n className,\n ...props\n}: TabListProps<T>) {\n const { variant } = useContext(TabsContext);\n\n const baseStyles =\n variant === \"unstyled\"\n ? \"flex items-center\"\n : variant === \"underline\"\n ? \"flex items-center border-b border-border\"\n : \"inline-flex items-center bg-muted rounded-lg p-1 gap-1\";\n\n // Vertical orientation overrides\n const verticalStyles =\n variant === \"unstyled\"\n ? \"flex-col\"\n : variant === \"underline\"\n ? \"flex-col border-b-0 border-r border-border\"\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-ring focus-visible:ring-offset-2\",\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n className,\n );\n }\n\n return twMerge(\n // Base\n \"cursor-pointer outline-none transition-colors\",\n \"font-medium\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n\n // Disabled\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n\n // Size\n sizeStyles[size],\n\n // Variant-specific styles\n ...getTabVariantStyles(variant, {\n isSelected,\n isHovered,\n isPressed,\n isDisabled,\n }),\n\n className,\n );\n }}\n />\n );\n}\n\nfunction getTabVariantStyles(\n variant: TabsVariant,\n state: {\n isSelected: boolean;\n isHovered: boolean;\n isPressed: boolean;\n isDisabled: boolean;\n },\n): string[] {\n if (variant === \"underline\") {\n return [\n // Shape\n \"relative rounded-t-(--border-radius-sm)\",\n\n // Color states\n state.isSelected\n ? [\n \"text-teal-700 font-semibold\",\n // Bottom indicator via pseudo-element\n \"after:absolute after:bottom-[-1px] after:left-0 after:right-0 after:h-0.5 after:bg-teal-600\",\n ].join(\" \")\n : state.isPressed\n ? \"text-foreground bg-muted\"\n : state.isHovered\n ? \"text-foreground bg-card\"\n : \"text-muted-foreground bg-transparent\",\n ];\n }\n\n // Pills variant\n return [\n // Shape\n \"rounded-md\",\n\n // Color states\n state.isSelected\n ? \"text-foreground font-semibold bg-background shadow-sm\"\n : state.isPressed\n ? \"text-foreground bg-card shadow-none\"\n : state.isHovered\n ? \"text-foreground bg-accent\"\n : \"text-muted-foreground bg-transparent\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// TabPanel\n// ---------------------------------------------------------------------------\n\nexport interface TabPanelProps extends Omit<AriaTabPanelProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabPanel({ className, ...props }: TabPanelProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <AriaTabPanel\n {...props}\n className={twMerge(\n variant === \"unstyled\" ? \"outline-none\" : \"mt-4 outline-none\",\n className,\n )}\n />\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n ToggleButtonGroup as AriaToggleButtonGroup,\n ToggleButton as AriaToggleButton,\n type ToggleButtonGroupProps as AriaToggleButtonGroupProps,\n type ToggleButtonProps as AriaToggleButtonProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type SegmentedControlSize = \"sm\" | \"md\" | \"lg\";\nexport type SegmentedControlSelectionMode = \"single\" | \"none\";\n\ninterface SegmentedControlContextValue {\n size: SegmentedControlSize;\n}\n\nconst SegmentedControlContext = createContext<SegmentedControlContextValue>({\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Size maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<SegmentedControlSize, string> = {\n sm: \"px-2.5 py-1 text-xs\",\n md: \"px-3 py-1.5 text-sm\",\n lg: \"px-4 py-2 text-base\",\n};\n\n// ---------------------------------------------------------------------------\n// SegmentedControl (group)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlProps\n extends Omit<\n AriaToggleButtonGroupProps,\n \"className\" | \"selectionMode\" | \"selectedKeys\" | \"defaultSelectedKeys\" | \"onSelectionChange\"\n > {\n /** Size preset for all items */\n size?: SegmentedControlSize;\n /** Selection behavior: \"single\" keeps one item selected, \"none\" means buttons fire actions without staying selected */\n selectionMode?: SegmentedControlSelectionMode;\n /** The currently selected keys (controlled, only for selectionMode=\"single\") */\n selectedKeys?: Iterable<Key>;\n /** The initial selected keys (uncontrolled, only for selectionMode=\"single\") */\n defaultSelectedKeys?: Iterable<Key>;\n /** Called when selection changes (only for selectionMode=\"single\") */\n onSelectionChange?: (keys: Set<Key>) => void;\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function SegmentedControl({\n size = \"md\",\n selectionMode = \"single\",\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n className,\n children,\n ...props\n}: SegmentedControlProps) {\n // For \"none\" mode: pass selectionMode=\"single\" to RAC but force selection to empty\n const isNoneMode = selectionMode === \"none\";\n\n return (\n <SegmentedControlContext.Provider value={{ size }}>\n <AriaToggleButtonGroup\n {...props}\n selectionMode=\"single\"\n selectedKeys={isNoneMode ? new Set<Key>() : selectedKeys}\n defaultSelectedKeys={isNoneMode ? undefined : defaultSelectedKeys}\n onSelectionChange={isNoneMode ? undefined : onSelectionChange}\n className={twMerge(\n \"inline-flex items-center rounded-lg border border-border bg-muted p-0.5 gap-0.5\",\n className,\n )}\n >\n {children}\n </AriaToggleButtonGroup>\n </SegmentedControlContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedControlItem (button)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlItemProps\n extends Omit<AriaToggleButtonProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function SegmentedControlItem({\n className,\n ...props\n}: SegmentedControlItemProps) {\n const { size } = useContext(SegmentedControlContext);\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected, isHovered, isPressed, isDisabled }) =>\n twMerge(\n // Base layout\n \"inline-flex items-center justify-center\",\n \"rounded-md\",\n \"font-medium\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-ring 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-background text-foreground shadow-sm font-semibold\"\n : isPressed\n ? \"bg-card text-foreground\"\n : isHovered\n ? \"bg-card text-foreground\"\n : \"bg-transparent text-muted-foreground\",\n\n className,\n )\n }\n />\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconValue } from \"../Icon\";\n\nexport type BadgeColor =\n | \"purple\"\n | \"teal\"\n | \"rose\"\n | \"slate\"\n | \"green\"\n | \"amber\";\n\nexport type BadgeSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface BadgeProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"color\"> {\n children?: React.ReactNode;\n color?: BadgeColor;\n size?: BadgeSize;\n icon?: IconValue;\n}\n\nconst colorStyles: Record<BadgeColor, string> = {\n purple:\n \"bg-badge-purple-bg text-badge-purple-text border-badge-purple-text/20\",\n teal: \"bg-badge-teal-bg text-badge-teal-text border-badge-teal-text/20\",\n rose: \"bg-badge-rose-bg text-badge-rose-text border-badge-rose-text/20\",\n slate: \"bg-badge-slate-bg text-badge-slate-text border-badge-slate-text/20\",\n green: \"bg-badge-green-bg text-badge-green-text border-badge-green-text/20\",\n amber: \"bg-badge-amber-bg text-badge-amber-text border-badge-amber-text/20\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-1 py-0 text-[10px]\",\n sm: \"px-1.5 py-0.5 text-xs\",\n md: \"px-2 py-0.5 text-xs\",\n lg: \"px-2.5 py-1 text-sm\",\n};\n\nexport function Badge({\n children,\n color = \"slate\",\n size = \"sm\",\n icon,\n className,\n ...rest\n}: BadgeProps) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 rounded-full border\",\n \"font-medium leading-tight tracking-wider tabular-nums\",\n colorStyles[color],\n sizeStyles[size],\n className,\n )}\n {...rest}\n >\n {icon && <Icon icon={icon} size=\"xs\" />}\n {children}\n </span>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface CardProps {\n /** Card body content */\n children: React.ReactNode;\n /** Optional header content (rendered with bottom border separator) */\n header?: React.ReactNode;\n /** Optional footer content (rendered with top border separator) */\n footer?: React.ReactNode;\n /** Merge override */\n className?: string;\n}\n\nexport function Card({ children, header, footer, className }: CardProps) {\n const cx = twMerge(\n `\n bg-card p-8\n border border-border\n rounded-lg\n shadow-sm\n `,\n className,\n );\n return (\n <div className={cx}>\n {header && <div className=\"border-b border-border\">{header}</div>}\n {children}\n {footer && <div className=\"border-t border-border\">{footer}</div>}\n </div>\n );\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-delta-increase-text\",\n decrease: \"text-delta-decrease-text\",\n flat: \"text-delta-flat-text\",\n};\n\nconst reverseDirectionColors: Record<Direction, string> = {\n increase: \"text-delta-decrease-text\",\n decrease: \"text-delta-increase-text\",\n flat: \"text-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-delta-increase-bg\",\n decrease: \"bg-delta-decrease-bg\",\n flat: \"bg-delta-flat-bg\",\n};\n\nexport function DeltaIndicator({\n current,\n previous,\n format = \"combined\",\n mode = \"inline\",\n label,\n reverseColor = false,\n unavailable = false,\n unavailableText = \"N/A\",\n className,\n}: DeltaIndicatorProps) {\n if (unavailable) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n \"text-muted-foreground\",\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-muted-foreground mr-1\">\n {label}\n </span>\n )}\n {unavailableText}\n </span>\n );\n }\n\n const diff = current - previous;\n const direction = getDirection(current, previous);\n const colorStyles = reverseColor\n ? reverseDirectionColors[direction]\n : directionColors[direction];\n const IconComponent = directionIcons[direction];\n\n const isNew = previous === 0 && current > 0;\n\n let valueText: string;\n if (format === \"currency\") {\n valueText = formatCurrency(diff);\n if (isNew) valueText = `${formatCurrency(diff)} (new)`;\n } else if (format === \"percentage\") {\n const pct = formatPercentage(current, previous);\n valueText = pct ?? formatCurrency(diff);\n if (isNew) valueText = \"New\";\n } else {\n // combined\n const pct = formatPercentage(current, previous);\n if (isNew) {\n valueText = `${formatCurrency(diff)} (new)`;\n } else if (pct) {\n valueText = `${formatCurrency(diff)} (${pct})`;\n } else {\n valueText = formatCurrency(diff);\n }\n }\n\n const isPill = mode === \"pill\";\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n colorStyles,\n isPill && [\n \"rounded-full px-2 py-0.5\",\n \"text-xs\",\n directionBgColors[direction],\n ],\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-muted-foreground 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-progress-fill\",\n success: \"bg-progress-fill-success\",\n warning: \"bg-progress-fill-warning\",\n danger: \"bg-progress-fill-danger\",\n neutral: \"bg-muted-foreground\",\n};\n\nconst sizeStyles: Record<ProgressBarSize, string> = {\n sm: \"h-1.5\",\n md: \"h-3\",\n lg: \"h-4\",\n};\n\nexport function ProgressBar({\n value,\n label,\n description,\n variant = \"brand\",\n size = \"md\",\n showValue = true,\n className,\n}: ProgressBarProps) {\n const clampedValue = Math.min(100, Math.max(0, value));\n\n return (\n <div className={twMerge(\"w-full\", className)}>\n {(label || description || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n <span className=\"text-sm text-muted-foreground\">\n {description ?? (showValue ? `${clampedValue}%` : null)}\n </span>\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ?? \"Progress\"}\n className={twMerge(\n \"w-full rounded-full bg-progress-track\",\n sizeStyles[size],\n )}\n >\n <div\n className={twMerge(\n \"h-full rounded-full transition-all duration-300\",\n fillStyles[variant],\n )}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport {\n Info,\n AlertTriangle,\n AlertCircle,\n CheckCircle2,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconValue } from \"../Icon\";\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?: IconValue;\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-info-surface border-info-border text-info-surface-foreground\",\n iconClass: \"text-info\",\n role: \"status\",\n },\n warning: {\n icon: AlertTriangle,\n containerClass:\n \"bg-warning-surface border-warning-border text-warning-surface-foreground\",\n iconClass: \"text-warning\",\n role: \"alert\",\n },\n danger: {\n icon: AlertCircle,\n containerClass:\n \"bg-destructive-surface border-destructive-border text-destructive-surface-foreground\",\n iconClass: \"text-destructive\",\n role: \"alert\",\n },\n success: {\n icon: CheckCircle2,\n containerClass:\n \"bg-success-surface border-success-border text-success-surface-foreground\",\n iconClass: \"text-success\",\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 resolvedIcon = icon ?? config.icon;\n\n const handleDismiss = () => {\n setDismissed(true);\n onDismiss?.();\n };\n\n return (\n <div\n role={config.role}\n className={twMerge(\n \"flex items-start gap-3 rounded-lg border px-4 py-3\",\n \"text-sm\",\n config.containerClass,\n className,\n )}\n >\n <Icon\n icon={resolvedIcon}\n size=\"md\"\n className={twMerge(\"mt-0.5\", config.iconClass)}\n />\n <div className=\"flex-1\">\n {title && (\n <span className=\"font-medium\">\n {title}\n {\" \\u2014 \"}\n </span>\n )}\n {children}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n onClick={handleDismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <Icon icon=\"X\" size=\"sm\" />\n </button>\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type MetricCardSize = \"sm\" | \"md\";\n\nexport interface MetricCardProps {\n /** Metric label (e.g., \"Total Spend\") */\n label: React.ReactNode;\n /** Primary value (formatted string or component) */\n value: React.ReactNode;\n /** Secondary content rendered below the value */\n secondary?: React.ReactNode;\n /** Makes the entire card a clickable link */\n href?: string;\n /** Size preset */\n size?: MetricCardSize;\n /** Merge override */\n className?: string;\n}\n\nconst sizeConfig: Record<\n MetricCardSize,\n { padding: string; labelClass: string; valueClass: string }\n> = {\n sm: {\n padding: \"p-3\",\n labelClass: \"text-xs\",\n valueClass: \"text-xl\",\n },\n md: {\n padding: \"p-4\",\n labelClass: \"text-sm\",\n valueClass: \"text-2xl\",\n },\n};\n\nexport function MetricCard({\n label,\n value,\n secondary,\n href,\n size = \"md\",\n className,\n}: MetricCardProps) {\n const config = sizeConfig[size];\n\n const containerClass = twMerge(\n \"bg-background border border-border rounded-lg shadow-sm\",\n config.padding,\n href &&\n \"block transition-shadow hover:shadow-md hover:border-ring focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n const content = (\n <>\n <div className={twMerge(config.labelClass, \"text-muted-foreground\")}>\n {label}\n </div>\n <div\n className={twMerge(\n config.valueClass,\n \"font-semibold text-foreground 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 { forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Heading } from \"../Heading\";\nimport type { HeadingLevel } from \"../Heading\";\n\nexport interface SectionHeaderProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Section title rendered as a heading (default H2). Accepts ReactNode\n * so a Badge/pill can be composed inline, e.g.:\n * `title={<>{name} <Badge>{version}</Badge></>}` */\n title: React.ReactNode;\n /** Heading level for the title (default \"h2\") */\n as?: HeadingLevel;\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 a heading (default `<H2>`); any `children` are\n * placed in a flex container that aligns to the trailing edge.\n */\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n function SectionHeader(\n { title, as = \"h2\", children, className, ...rest },\n ref,\n ) {\n return (\n <div\n ref={ref}\n className={twMerge(\n \"flex flex-wrap items-center gap-3 pt-0 pb-4\",\n className,\n )}\n {...rest}\n >\n <Heading as={as}>{title}</Heading>\n {children && (\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {children}\n </div>\n )}\n </div>\n );\n },\n);\n","import { createContext, useContext } from \"react\";\nimport type React from \"react\";\nimport { Button as AriaButton } from \"react-aria-components\";\nimport { Tooltip } from \"../Tooltip\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type DescriptionListLayout = \"stacked\" | \"horizontal\";\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n /** Layout for all items: \"stacked\" (label above value) or \"horizontal\" (side by side) */\n layout?: DescriptionListLayout;\n className?: string;\n}\n\nexport interface DescriptionListItemProps {\n label: string;\n children: React.ReactNode;\n /** De-emphasize the value text */\n muted?: boolean;\n /** When set, wraps value in a Tooltip showing the full text (useful for truncated ETags etc.) */\n fullValue?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\nconst LayoutContext = createContext<DescriptionListLayout>(\"stacked\");\n\n/* ------------------------------------------------------------------ */\n/* DescriptionList */\n/* ------------------------------------------------------------------ */\n\nconst listGapStyles: Record<DescriptionListLayout, string> = {\n stacked: \"gap-4\",\n horizontal: \"gap-3\",\n};\n\nexport function DescriptionList({\n children,\n layout = \"stacked\",\n className,\n}: DescriptionListProps) {\n return (\n <LayoutContext.Provider value={layout}>\n <dl\n className={[\"flex flex-col\", listGapStyles[layout], className]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </dl>\n </LayoutContext.Provider>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* DescriptionList.Item */\n/* ------------------------------------------------------------------ */\n\nconst itemLayoutStyles: Record<DescriptionListLayout, string> = {\n stacked: \"flex flex-col gap-1\",\n horizontal:\n \"grid grid-cols-[140px_1fr] gap-x-(--spacing-4) items-baseline\",\n};\n\nconst labelClasses =\n \"text-sm font-medium text-foreground\";\n\nfunction DescriptionListItem({\n label,\n children,\n muted = false,\n fullValue,\n}: DescriptionListItemProps) {\n const layout = useContext(LayoutContext);\n\n const valueClasses = [\n \"text-sm m-0\",\n muted\n ? \"text-muted-foreground\"\n : \"text-foreground\",\n ].join(\" \");\n\n const valueContent = <dd className={valueClasses}>{children}</dd>;\n\n return (\n <div className={itemLayoutStyles[layout]}>\n <dt className={labelClasses}>{label}</dt>\n {fullValue ? (\n <Tooltip content={fullValue}>\n <AriaButton className=\"text-left outline-none cursor-default\">\n {valueContent}\n </AriaButton>\n </Tooltip>\n ) : (\n valueContent\n )}\n </div>\n );\n}\n\nDescriptionList.Item = DescriptionListItem;\n","import { twMerge } from \"tailwind-merge\";\nimport { Badge, type BadgeColor } from \"../Badge\";\n\nconst hashColors = [\n \"purple\",\n \"teal\",\n \"rose\",\n \"green\",\n \"amber\",\n] as const satisfies BadgeColor[];\n\nexport function pillColorFromName(name = \"\"): BadgeColor {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hashColors[Math.abs(hash) % hashColors.length];\n}\n\nexport interface PathPillProps {\n children: string;\n visibleCount?: number;\n colorFn?: (segment: string, index: number) => BadgeColor;\n className?: string;\n}\n\nexport function PathPill({\n children,\n visibleCount,\n colorFn,\n className,\n}: PathPillProps) {\n const segments = children.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) return null;\n\n const effectiveVisible = visibleCount ?? segments.length;\n const dotCount = Math.max(0, segments.length - effectiveVisible);\n const fullPath = segments.join(\" / \");\n\n return (\n <div\n className={twMerge(\"relative flex\", className)}\n aria-label={`Path: ${fullPath}`}\n >\n {segments.map((segment, i) => {\n const isCollapsed = i < dotCount;\n const isLast = i === segments.length - 1;\n const cx = twMerge(!isLast && \"pr-5 -mr-4\", isCollapsed && \"pr-3\");\n const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);\n return (\n <Badge\n key={`pill-${i}-${segment}`}\n className={cx}\n color={color}\n aria-hidden={isCollapsed || undefined}\n >\n {isCollapsed ? undefined : segment}\n </Badge>\n );\n })}\n </div>\n );\n}\n","import { createContext, useContext, useCallback, useMemo } from \"react\";\nimport type React from \"react\";\n\nexport interface FormWizardContextValue {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Whether the user can navigate backwards */\n canGoBack: boolean;\n /** Navigate to the previous step */\n goBack: () => void;\n /** Whether the current step is the last step */\n isLastStep: boolean;\n}\n\nconst FormWizardContext = createContext<FormWizardContextValue>({\n currentStep: 0,\n totalSteps: 1,\n canGoBack: false,\n goBack: () => {},\n isLastStep: true,\n});\n\nexport function useFormWizard(): FormWizardContextValue {\n return useContext(FormWizardContext);\n}\n\nexport interface FormWizardProps {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Callback invoked when the step should change */\n onStepChange: (step: number) => void;\n /** Wizard content (step panels, progress indicator, navigation) */\n children: React.ReactNode;\n}\n\nexport function FormWizard({\n currentStep,\n totalSteps,\n onStepChange,\n children,\n}: FormWizardProps) {\n const canGoBack = currentStep > 0;\n const isLastStep = currentStep >= totalSteps - 1;\n\n const goBack = useCallback(() => {\n if (currentStep > 0) {\n onStepChange(currentStep - 1);\n }\n }, [currentStep, onStepChange]);\n\n const value = useMemo<FormWizardContextValue>(\n () => ({\n currentStep,\n totalSteps,\n canGoBack,\n goBack,\n isLastStep,\n }),\n [currentStep, totalSteps, canGoBack, goBack, isLastStep],\n );\n\n return (\n <FormWizardContext.Provider value={value}>\n {children}\n </FormWizardContext.Provider>\n );\n}\n","import { useFormWizard } from \"./FormWizard\";\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-primary-foreground\"\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-primary\"\n : \"bg-border\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n\n {/* Step circle */}\n <div\n className={[\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full\",\n \"text-sm font-medium\",\n \"transition-colors\",\n isCompleted\n ? \"bg-primary text-primary-foreground\"\n : \"\",\n isCurrent\n ? \"border-2 border-primary bg-background text-primary\"\n : \"\",\n isFuture\n ? \"border-2 border-border bg-background text-muted-foreground\"\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-primary\"\n : \"bg-border\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Label */}\n <span\n className={[\n \"mt-2 text-center text-sm\",\n isCurrent\n ? \"font-semibold text-foreground\"\n : \"font-normal text-muted-foreground\",\n ].join(\" \")}\n >\n {label}\n </span>\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { Button } from \"../Button\";\nimport { useFormWizard } from \"./FormWizard\";\n\nexport interface FormWizardNavProps {\n /** Callback invoked when the user presses Next or Submit */\n onNext: () => void;\n /** Whether the form is currently submitting (shows loading state on the submit button) */\n isSubmitting?: boolean;\n /** Label for the submit button on the last step (defaults to \"Submit\") */\n submitLabel?: string;\n}\n\nexport function FormWizardNav({\n onNext,\n isSubmitting = false,\n submitLabel = \"Submit\",\n}: FormWizardNavProps) {\n const { canGoBack, goBack, isLastStep } = useFormWizard();\n\n return (\n <div className=\"flex items-center justify-end gap-3\">\n {canGoBack && (\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onPress={goBack}\n isDisabled={isSubmitting}\n >\n Back\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"lg\"\n onPress={onNext}\n isLoading={isSubmitting}\n >\n {isLastStep ? submitLabel : \"Next\"}\n </Button>\n </div>\n );\n}\n"],"mappings":"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","names":["twMerge","jsx","LinkedinIcon","forwardRef","jsx","GithubIcon","jsx","twMerge","jsx","twMerge","jsx","jsxs","twMerge","forwardRef","twMerge","jsx","sizeMap","Heading","Tag","H1","H2","H3","H4","H5","H6","forwardRef","twMerge","jsx","Prose","forwardRef","twMerge","jsx","sizeClasses","Description","jsx","jsxs","useRef","useRef","useState","useLayoutEffect","useState","startLen","endLen","useLayoutEffect","useState","jsx","jsxs","useRef","AriaButton","AriaLink","twMerge","jsx","twMerge","AriaButton","AriaLink","twMerge","jsx","jsxs","jsx","jsxs","twMerge","forwardRef","useState","Eye","EyeOff","twMerge","jsx","jsxs","forwardRef","InputPassword","useState","twMerge","EyeOff","Eye","Check","ChevronDown","Button","Text","twMerge","jsx","jsxs","twMerge","Button","ChevronDown","Text","Check","twMerge","jsx","jsxs","Table","Heading","X","Fragment","jsx","jsxs","sizeStyles","jsx","useCallback","useEffect","useRef","useState","createPortal","CheckCircle","XCircle","Info","X","jsx","jsxs","jsx","jsxs","Check","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","AriaLink","jsx","variantStyles","Link","ChevronRight","Fragment","jsx","jsxs","AriaToggleButton","twMerge","jsx","squareSizeStyles","variantStyles","AriaToggleButton","twMerge","Popover","twMerge","jsx","jsxs","Menu","Popover","twMerge","useCallback","useEffect","useRef","useState","AriaMenu","MenuTrigger","Popover","twMerge","jsx","jsxs","useState","useRef","useCallback","useEffect","MenuTrigger","Popover","twMerge","AriaMenu","AriaMenuItem","jsx","jsxs","AriaMenuItem","AriaMenuItem","Check","Fragment","jsx","jsxs","jsx","jsxs","Header","jsx","jsx","AriaButton","twMerge","jsx","Popover","createContext","useContext","twMerge","jsx","sizeStyles","Tabs","TabList","Tab","TabPanel","createContext","useContext","twMerge","AriaToggleButton","jsx","sizeStyles","twMerge","jsx","jsxs","sizeStyles","twMerge","twMerge","jsx","jsxs","ArrowUp","ArrowDown","Minus","twMerge","jsx","jsxs","colorStyles","twMerge","jsx","jsxs","sizeStyles","useState","Info","AlertTriangle","AlertCircle","CheckCircle2","twMerge","jsx","jsxs","variantConfig","Info","AlertTriangle","AlertCircle","CheckCircle2","useState","twMerge","twMerge","Fragment","jsx","jsxs","forwardRef","twMerge","jsx","jsxs","forwardRef","SectionHeader","twMerge","createContext","useContext","AriaButton","jsx","jsxs","createContext","useContext","AriaButton","twMerge","jsx","twMerge","createContext","useContext","useCallback","jsx","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Logo/Logo.tsx","../src/components/Button/Button.tsx","../src/components/_shared/styles.ts","../src/components/Icon/Icon.tsx","../src/components/Icon/icon-registry.ts","../src/components/Icon/icons/LinkedinIcon.tsx","../src/components/Icon/icons/GithubIcon.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Heading/Heading.tsx","../src/components/Prose/Prose.tsx","../src/components/Description/Description.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/TruncatedText/TruncatedText.tsx","../src/components/TruncatedText/useCopyToClipboard.ts","../src/components/TruncatedText/useMiddleEllipsis.ts","../src/components/TruncatedText/useOverflowDetection.ts","../src/components/IconButton/IconButton.tsx","../src/components/Form/Input/Input.tsx","../src/components/Form/Label/Label.tsx","../src/components/Form/InputPassword/InputPassword.tsx","../src/components/Form/Select/Select.tsx","../src/components/Table/Table.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogFooter.tsx","../src/components/Toast/Toast.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/Switch/Switch.tsx","../src/components/Form/Radio/Radio.tsx","../src/components/Form/Fieldset/Fieldset.tsx","../src/components/Link/Link.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/ToggleButton/ToggleButton.tsx","../src/components/Menu/Menu.tsx","../src/components/Menu/menuStyles.ts","../src/components/Menu/useContextMenu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuCheckboxItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuHeader.tsx","../src/components/Menu/MenuSeparator.tsx","../src/components/Popover/Popover.tsx","../src/components/Tabs/Tabs.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/DeltaIndicator/DeltaIndicator.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Banner/Banner.tsx","../src/components/MetricCard/MetricCard.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/PathPill/PathPill.tsx","../src/components/FormWizard/FormWizard.tsx","../src/components/FormWizard/FormWizardProgress.tsx","../src/components/FormWizard/FormWizardNav.tsx"],"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 { Logo } from \"./components/Logo\";\nexport type { LogoProps } from \"./components/Logo\";\n\nexport { Button } from \"./components/Button\";\nexport type {\n ButtonProps,\n ButtonVariant,\n ButtonSize,\n} from \"./components/Button\";\n\nexport { Spinner } from \"./components/Spinner\";\nexport type { SpinnerProps } from \"./components/Spinner\";\n\nexport { Heading, H1, H2, H3, H4, H5, H6 } from \"./components/Heading\";\nexport type {\n HeadingProps,\n HeadingLevel,\n HeadingSize,\n} from \"./components/Heading\";\n\nexport { Prose } from \"./components/Prose\";\nexport type { ProseProps } from \"./components/Prose\";\n\nexport { Description } from \"./components/Description\";\nexport type { DescriptionProps, DescriptionSize } from \"./components/Description\";\n\nexport { Icon, iconRegistry } from \"./components/Icon\";\nexport type {\n IconProps,\n IconName,\n IconComponent,\n IconValue,\n} from \"./components/Icon\";\n\nexport { Tooltip } from \"./components/Tooltip\";\nexport type { TooltipProps } from \"./components/Tooltip\";\n\nexport { TruncatedText } from \"./components/TruncatedText\";\nexport type { TruncatedTextProps } from \"./components/TruncatedText\";\n\nexport {\n IconButton,\n IconButtonLink,\n IconButtonToggle,\n} from \"./components/IconButton\";\nexport type {\n IconButtonProps,\n IconButtonLinkProps,\n IconButtonToggleProps,\n} from \"./components/IconButton\";\n\nexport { Input } from \"./components/Form/Input\";\nexport type { InputProps } from \"./components/Form/Input\";\n\nexport { InputPassword } from \"./components/Form/InputPassword\";\nexport type { InputPasswordProps } from \"./components/Form/InputPassword\";\n\nexport { Select } from \"./components/Form/Select\";\nexport type { SelectProps, SelectItem } from \"./components/Form/Select\";\n\nexport {\n Table,\n TableHeader,\n Column,\n TableBody,\n Row,\n Cell,\n} from \"./components/Table\";\nexport type { DataTableProps, TableSize } from \"./components/Table\";\n\nexport { Dialog } from \"./components/Dialog\";\nexport type { DialogProps } from \"./components/Dialog\";\n\nexport { ToastProvider, useToast, createToastBridge } from \"./components/Toast\";\nexport type {\n ToastData,\n ToastVariant,\n ToastPlacement,\n ToastContextValue,\n ToastBridge,\n ToastProviderProps,\n} from \"./components/Toast\";\n\nexport { EmptyState } from \"./components/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState\";\n\nexport { Checkbox } from \"./components/Form/Checkbox\";\nexport type { CheckboxProps } from \"./components/Form/Checkbox\";\n\nexport { Switch } from \"./components/Form/Switch\";\nexport type { SwitchProps } from \"./components/Form/Switch\";\n\nexport { RadioGroup, Radio, RadioButton } from \"./components/Form/Radio\";\nexport type {\n RadioGroupProps,\n RadioProps,\n RadioButtonProps,\n} from \"./components/Form/Radio\";\n\nexport { Label } from \"./components/Form/Label\";\nexport type { LabelProps } from \"./components/Form/Label\";\n\nexport { Fieldset } from \"./components/Form/Fieldset\";\nexport type { FieldsetProps } from \"./components/Form/Fieldset\";\n\nexport { Link } from \"./components/Link\";\nexport type { LinkProps, LinkVariant } from \"./components/Link\";\n\nexport { Breadcrumbs } from \"./components/Breadcrumbs\";\nexport type {\n BreadcrumbsProps,\n BreadcrumbItem,\n} from \"./components/Breadcrumbs\";\n\nexport { ButtonLink } from \"./components/Button\";\nexport type { ButtonLinkProps } from \"./components/Button\";\n\nexport { ToggleButton } from \"./components/ToggleButton\";\nexport type {\n ToggleButtonProps,\n ToggleButtonVariant,\n ToggleButtonSize,\n} from \"./components/ToggleButton\";\n\nexport {\n Menu,\n MenuItem,\n MenuCheckboxItem,\n MenuSection,\n MenuHeader,\n MenuSeparator,\n useContextMenu,\n} from \"./components/Menu\";\nexport type {\n MenuProps,\n MenuItemData,\n MenuItemProps,\n MenuCheckboxItemProps,\n MenuSectionProps,\n MenuHeaderProps,\n MenuSeparatorProps,\n UseContextMenuProps,\n UseContextMenuResult,\n} from \"./components/Menu\";\n\nexport { Popover, PopoverTrigger, PopoverContent } from \"./components/Popover\";\nexport type {\n PopoverProps,\n PopoverTriggerProps,\n PopoverContentProps,\n} from \"./components/Popover\";\n\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type {\n TabsProps,\n TabListProps,\n TabProps,\n TabPanelProps,\n TabsVariant,\n TabsSize,\n} from \"./components/Tabs\";\n\n// Raw React Aria Components tab primitives (unstyled escape hatch)\nexport {\n Tabs as UnstyledTabs,\n TabList as UnstyledTabList,\n Tab as UnstyledTab,\n TabPanel as UnstyledTabPanel,\n} from \"react-aria-components\";\n\nexport {\n SegmentedControl,\n SegmentedControlItem,\n} from \"./components/SegmentedControl\";\nexport type {\n SegmentedControlProps,\n SegmentedControlItemProps,\n SegmentedControlSize,\n SegmentedControlSelectionMode,\n} from \"./components/SegmentedControl\";\n\nexport { Badge } from \"./components/Badge\";\nexport type { BadgeProps, BadgeColor, BadgeSize } from \"./components/Badge\";\n\nexport { Card } from \"./components/Card\";\nexport type { CardProps } from \"./components/Card\";\n\nexport { DeltaIndicator } from \"./components/DeltaIndicator\";\nexport type {\n DeltaIndicatorProps,\n DeltaFormat,\n DeltaMode,\n} from \"./components/DeltaIndicator\";\n\nexport { ProgressBar } from \"./components/ProgressBar\";\nexport type {\n ProgressBarProps,\n ProgressBarVariant,\n ProgressBarSize,\n} from \"./components/ProgressBar\";\n\nexport { Banner } from \"./components/Banner\";\nexport type { BannerProps, BannerVariant } from \"./components/Banner\";\n\nexport { MetricCard } from \"./components/MetricCard\";\nexport type { MetricCardProps, MetricCardSize } from \"./components/MetricCard\";\n\nexport { SectionHeader } from \"./components/SectionHeader\";\nexport type { SectionHeaderProps } from \"./components/SectionHeader\";\n\nexport { DescriptionList } from \"./components/DescriptionList\";\nexport type {\n DescriptionListProps,\n DescriptionListItemProps,\n DescriptionListLayout,\n} from \"./components/DescriptionList\";\n\nexport { PathPill, pillColorFromName } from \"./components/PathPill\";\nexport type { PathPillProps } from \"./components/PathPill\";\n\nexport { FormWizard, useFormWizard } from \"./components/FormWizard\";\nexport type {\n FormWizardProps,\n FormWizardContextValue,\n} from \"./components/FormWizard\";\n\nexport { FormWizardProgress } from \"./components/FormWizard\";\nexport type { FormWizardProgressProps } from \"./components/FormWizard\";\n\nexport { FormWizardNav } from \"./components/FormWizard\";\nexport type { FormWizardNavProps } from \"./components/FormWizard\";\n","const W = 56;\nconst H = 20;\n\nconst paths: Record<string, string> = {\n c: \"M7.043,15.648C7.043,15.744 7.025,15.781 6.949,15.799C6.347,16.046 5.593,16.103 4.859,16.103C1.808,16.103 0,14.002 0,11.279C0,8.479 2.072,6.398 5.179,6.398C6.121,6.398 6.629,6.493 6.949,6.606C7.025,6.644 7.043,6.7 7.043,6.814L7.025,8.497C7.025,8.63 6.949,8.63 6.874,8.612C6.479,8.46 5.989,8.365 5.255,8.365C3.54,8.365 2.335,9.387 2.335,11.203C2.335,13.266 3.823,14.059 5.273,14.059C5.951,14.059 6.535,14.002 6.912,13.87C7.006,13.833 7.043,13.89 7.043,13.965L7.043,15.648Z\",\n y: \"M9.919,6.588C9.994,6.588 10.051,6.606 10.088,6.701C11.313,10.238 11.953,12.282 12.197,13.208C12.819,11.297 13.479,9.349 14.326,6.701C14.364,6.625 14.42,6.588 14.533,6.588L16.473,6.588C16.586,6.588 16.605,6.644 16.586,6.738C15.23,10.919 13.071,16.185 11.546,19.684C11.508,19.76 11.452,19.817 11.301,19.817L9.238,20C9.125,20 9.099,19.938 9.144,19.849C9.71,18.713 10.427,17.181 11.03,15.744C11.068,15.63 11.086,15.573 11.048,15.44C10.54,14.192 8.732,9.69 7.602,6.72C7.564,6.644 7.62,6.588 7.715,6.588L9.919,6.588Z\",\n t: \"M22.706,15.61C22.706,15.725 22.688,15.8 22.593,15.838C22.085,16.027 21.614,16.102 20.992,16.102C19.448,16.102 18.525,15.346 18.525,13.473L18.525,8.498L17.338,8.498C17.244,8.48 17.206,8.441 17.206,8.328L17.206,6.738C17.206,6.625 17.244,6.587 17.357,6.587L18.525,6.583C18.543,5.921 18.525,4.912 18.525,4.26C18.543,4.166 18.581,4.109 18.675,4.09L20.674,3.912C20.764,3.904 20.806,3.912 20.806,4.007L20.806,6.583L22.65,6.587C22.744,6.587 22.781,6.625 22.781,6.72L22.781,8.365C22.781,8.46 22.744,8.498 22.65,8.498L20.804,8.498L20.804,12.981C20.804,13.813 21.067,14.211 21.878,14.211C22.122,14.211 22.33,14.193 22.593,14.135C22.65,14.116 22.706,14.135 22.706,14.248L22.706,15.61Z\",\n a: \"M28.959,11.752C28.676,11.714 28.356,11.695 27.923,11.695C26.435,11.695 25.776,12.186 25.776,13C25.776,13.7 26.265,14.305 27.621,14.305C28.111,14.305 28.544,14.248 28.959,14.079L28.959,11.752ZM31.162,13.984C31.162,14.4 31.162,14.778 31.2,15.176C31.2,15.213 31.2,15.232 31.162,15.252C29.618,15.913 28.526,16.102 27.244,16.102C25.192,16.102 23.553,15.138 23.553,13C23.553,10.995 25.342,9.992 27.791,9.992C28.356,9.992 28.789,10.011 28.959,10.03L28.959,9.803C28.959,9.368 28.714,8.384 27.056,8.384C26.115,8.384 25.286,8.574 24.588,8.914C24.532,8.933 24.438,8.914 24.438,8.801L24.438,7.155C24.438,7.06 24.457,7.022 24.551,6.966C25.361,6.587 26.397,6.397 27.415,6.397C30.032,6.397 31.162,8.044 31.162,10.144L31.162,13.984Z\",\n r: \"M34.267,6.588C34.381,6.588 34.438,6.625 34.475,6.738C34.569,6.984 34.644,7.458 34.663,7.874C35.304,7.079 36.327,6.398 37.627,6.398C37.739,6.398 37.827,6.453 37.827,6.594L37.827,8.535C37.827,8.63 37.789,8.668 37.658,8.668C36.321,8.63 35.21,9.103 34.776,9.671L34.776,15.762C34.776,15.876 34.72,15.913 34.606,15.913L32.648,15.913C32.516,15.913 32.478,15.856 32.478,15.762C32.478,15.762 32.485,7.369 32.485,6.701C32.485,6.606 32.504,6.588 32.598,6.588L34.267,6.588Z\",\n i: \"M38.777,6.55C38.777,6.466 38.845,6.398 38.929,6.398C40.114,6.398 41.075,7.362 41.075,8.553L41.075,15.764C41.075,15.877 41.036,15.915 40.905,15.915L38.966,15.915C38.834,15.915 38.777,15.858 38.777,15.745L38.777,6.55Z\",\n o: \"M47.169,14.138C45.576,14.123 44.297,12.814 44.311,11.214C44.326,9.615 45.629,8.329 47.222,8.344C48.815,8.359 50.094,9.668 50.079,11.268C50.065,12.868 48.761,14.153 47.169,14.138M47.876,6.482C47.119,6.369 46.014,6.446 45.46,6.41C43.518,6.279 42.185,4.377 42.182,2.485C42.181,1.047 41.374,0.235 40.308,0.039C39.63,-0.088 38.97,0.105 38.471,0.501C37.984,0.908 37.658,1.518 37.642,2.21C37.612,3.297 38.236,4.259 39.637,4.556C41.479,4.951 43.056,6.656 42.782,8.591C42.702,9.142 42.392,10.273 42.346,11.04C42.18,13.708 44.321,16.035 47.032,16.093C48.225,16.119 49.332,15.719 50.191,15.02C51.049,14.322 51.682,13.32 51.889,12.138C52.369,9.509 50.569,6.882 47.876,6.482\",\n \"\\u00ae\": \"M54.243,7.684C54.243,7.493 54.104,7.355 53.837,7.355L53.499,7.355L53.499,8.006L53.837,8.006C54.104,8.006 54.243,7.884 54.243,7.684M53.499,8.224L53.499,8.893L53.257,8.893L53.257,7.137L53.837,7.137C54.235,7.137 54.494,7.346 54.494,7.676C54.494,7.937 54.33,8.11 54.088,8.18L54.581,8.893L54.295,8.893L53.845,8.224L53.499,8.224ZM55.212,8.015C55.212,7.207 54.65,6.633 53.837,6.633C53.023,6.633 52.452,7.207 52.452,8.015C52.452,8.832 53.023,9.405 53.837,9.405C54.65,9.405 55.212,8.832 55.212,8.015M52.21,8.015C52.21,7.085 52.894,6.398 53.837,6.398C54.78,6.398 55.463,7.085 55.463,8.015C55.463,8.954 54.78,9.64 53.837,9.64C52.894,9.64 52.21,8.954 52.21,8.015\",\n};\n\nexport type LogoProps = {\n /** Override the wordmark fill (defaults to theme-driven --logo-fill) */\n color?: string;\n /** Override the accent fill on the \"o\" (defaults to theme-driven --logo-highlight) */\n highlightColor?: string;\n scale?: number;\n className?: string;\n};\n\nexport function Logo({\n color,\n highlightColor,\n scale = 1,\n className,\n}: LogoProps) {\n const width = W * scale;\n const height = H * scale;\n const style: React.CSSProperties = {\n fill: \"var(--logo-fill)\",\n ...(color && { \"--logo-fill\": color } as React.CSSProperties),\n ...(highlightColor && { \"--logo-highlight\": highlightColor } as React.CSSProperties),\n };\n\n return (\n <svg\n role=\"img\"\n aria-label=\"Cytario Logo\"\n width={width}\n height={height}\n viewBox={`0 0 ${W} ${H}`}\n className={className}\n style={style}\n >\n {Object.entries(paths).map(([key, d], i) => (\n <path\n key={key}\n d={d}\n aria-hidden=\"true\"\n style={{\n fill: key === \"o\" ? \"var(--logo-highlight)\" : undefined,\n animation: \"logo-fade-in 0.4s ease-out both\",\n animationDelay: `${i * 0.06}s`,\n }}\n />\n ))}\n </svg>\n );\n}\n","import type { ElementType, ReactNode } from \"react\";\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type ButtonSize,\n type ButtonVariant,\n sizeStyles,\n variantStyles,\n} from \"../_shared/styles\";\nimport { Icon, type IconValue } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\n\nexport type { ButtonVariant, ButtonSize };\n\n/** Layout, shape and state classes shared by the text buttons (Button, ButtonLink). */\nexport const buttonBaseClass = `\n inline-flex items-center justify-center gap-2 shrink-0 cursor-pointer\n rounded-full\n font-medium\n leading-tight\n outline-none transition-colors no-underline\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\n disabled:opacity-50 disabled:pointer-events-none\n`;\n\n/** Shared visual props for the button family (Button, ButtonLink). */\nexport interface ButtonBaseProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n iconLeft?: IconValue;\n iconRight?: IconValue;\n className?: string;\n}\n\n/**\n * Shared text button: builds the className and renders the icon/label/icon\n * content (or a spinner while loading). The wrapper element is polymorphic via\n * `as`; the public Button/ButtonLink pass their own precisely-typed props.\n */\nfunction ButtonBase({\n as: Component,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n isDisabled,\n iconLeft,\n iconRight,\n className,\n children,\n ...props\n}: ButtonBaseProps & {\n as: ElementType;\n isDisabled?: boolean;\n} & Record<string, unknown>) {\n const cx = twMerge(\n buttonBaseClass,\n isLoading ? \"pointer-events-none\" : \"\",\n variantStyles[variant],\n sizeStyles[size],\n className,\n );\n\n return (\n <Component {...props} isDisabled={isDisabled || isLoading} className={cx}>\n {isLoading && <Spinner size={size} />}\n {!isLoading && iconLeft && <Icon icon={iconLeft} size={size} />}\n {children as ReactNode}\n {!isLoading && iconRight && <Icon icon={iconRight} size={size} />}\n </Component>\n );\n}\n\nexport type ButtonProps = Omit<AriaButtonProps, \"className\"> & ButtonBaseProps;\n\nexport function Button(props: ButtonProps) {\n return <ButtonBase as={AriaButton} {...props} />;\n}\n\nexport type ButtonLinkProps = Omit<AriaLinkProps, \"className\"> &\n ButtonBaseProps;\n\nexport function ButtonLink(props: ButtonLinkProps) {\n return <ButtonBase as={AriaLink} {...props} />;\n}\n","export type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport const sizeStyles: Record<ButtonSize, string> = {\n xs: \"px-2 py-1.5 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"neutral\"\n | \"outline\"\n | \"ghost\";\n\nexport const variantStyles: Record<ButtonVariant, string> = {\n primary: `\n bg-primary text-primary-foreground\n hover:bg-primary-hover\n pressed:bg-primary-pressed\n `,\n secondary: `\n bg-secondary text-secondary-foreground\n hover:bg-secondary-hover\n pressed:bg-secondary-pressed\n `,\n destructive: `\n bg-destructive text-destructive-foreground\n hover:bg-destructive-hover\n pressed:bg-destructive-pressed\n `,\n success: `\n bg-success text-success-foreground\n hover:bg-success-hover\n pressed:bg-success-pressed\n `,\n warning: `\n bg-warning text-warning-foreground\n hover:bg-warning-hover\n pressed:bg-warning-pressed\n `,\n info: `\n bg-info text-info-foreground\n hover:bg-info-hover\n pressed:bg-info-pressed\n `,\n neutral: `\n bg-muted text-foreground\n hover:bg-accent\n pressed:bg-accent-pressed\n `,\n outline: `\n bg-transparent text-foreground\n border border-border\n hover:bg-muted\n pressed:bg-accent-pressed\n `,\n ghost: `\n bg-transparent text-foreground\n hover:bg-muted\n pressed:bg-accent-pressed\n `,\n};\n\n/** Selected (toggled-on) background per variant — reuses each variant's pressed\n * tone. Keyed on react-aria's `data-selected` (`selected:`), so it only takes\n * effect on ToggleButton-backed components. Literal classes for Tailwind. */\nexport const selectedStyles: Record<ButtonVariant, string> = {\n primary: \"selected:bg-primary-pressed\",\n secondary: \"selected:bg-secondary-pressed\",\n destructive: \"selected:bg-destructive-pressed\",\n success: \"selected:bg-success-pressed\",\n warning: \"selected:bg-warning-pressed\",\n info: \"selected:bg-info-pressed\",\n neutral: \"selected:bg-accent-pressed\",\n outline: \"selected:bg-accent-pressed\",\n ghost: \"selected:bg-accent-pressed\",\n};\n","import type { ComponentType } from \"react\";\nimport type { LucideProps } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { iconRegistry, type IconName } from \"./icon-registry\";\n\nexport type { IconName };\n\n/** Any Lucide-compatible icon component — a Lucide icon or a custom SVG. */\nexport type IconComponent = ComponentType<LucideProps>;\n\n/** A registered icon name, or an icon component passed directly. */\nexport type IconValue = IconName | IconComponent;\n\nexport interface IconProps {\n icon: IconValue;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n strokeWidth?: number;\n className?: string;\n}\n\nexport const sizeMap = {\n xs: 14,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n} as const;\n\n/** An icon rendered at one of the design system's preset sizes. */\nexport function Icon({\n icon,\n size = \"md\",\n strokeWidth = 2,\n className,\n}: IconProps) {\n const Component: IconComponent =\n typeof icon === \"string\" ? iconRegistry[icon] : icon;\n\n return (\n <Component\n size={sizeMap[size]}\n strokeWidth={strokeWidth}\n aria-hidden=\"true\"\n focusable={false}\n className={twMerge(\"shrink-0\", className)}\n />\n );\n}\n","import {\n AlertCircle,\n AlertTriangle,\n AlignCenter,\n AlignLeft,\n AlignRight,\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpRight,\n Ban,\n Bookmark,\n BookmarkCheck,\n Braces,\n Building2,\n Calendar,\n Check,\n CheckCircle,\n CheckCircle2,\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Circle,\n CircleDot,\n CircleSlash,\n Clock,\n Cloud,\n Columns2,\n Columns3,\n Copy,\n CreditCard,\n Database,\n Download,\n Edit,\n EllipsisVertical,\n ExternalLink,\n Eye,\n EyeOff,\n File,\n FileSearch,\n FileSpreadsheet,\n FilterX,\n Folder,\n FolderPlus,\n FolderTree,\n Fullscreen,\n Grid2x2,\n Grid3x3,\n Hand,\n Heart,\n Image,\n ImageOff,\n Inbox,\n Info,\n KeyRound,\n Lasso,\n Layers,\n Layers2,\n LayoutDashboard,\n LayoutGrid,\n List,\n ListFilter,\n LogOut,\n Mail,\n MapPin,\n Maximize,\n Menu,\n Microscope,\n Minus,\n MoreVertical,\n Move,\n Network,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n Pencil,\n Pentagon,\n Plug,\n Plus,\n Power,\n PowerOff,\n RefreshCw,\n RotateCcw,\n RotateCw,\n ScrollText,\n Search,\n SearchX,\n Send,\n Settings,\n Shield,\n ShieldCheck,\n Spline,\n Square,\n SquarePen,\n Star,\n Table,\n Tag,\n Trash2,\n Unplug,\n User,\n UserMinus,\n UserPlus,\n Users,\n UsersRound,\n X,\n XCircle,\n ZoomIn,\n ZoomOut,\n type LucideIcon,\n} from \"lucide-react\";\nimport { LinkedinIcon } from \"./icons/LinkedinIcon\";\nimport { GithubIcon } from \"./icons/GithubIcon\";\n\n/** Union of every registered icon name. */\nexport type IconName =\n | \"AlertCircle\"\n | \"AlertTriangle\"\n | \"AlignCenter\"\n | \"AlignLeft\"\n | \"AlignRight\"\n | \"Archive\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"ArrowUp\"\n | \"ArrowUpRight\"\n | \"Ban\"\n | \"Bookmark\"\n | \"BookmarkCheck\"\n | \"Braces\"\n | \"Building2\"\n | \"Calendar\"\n | \"Check\"\n | \"CheckCircle\"\n | \"CheckCircle2\"\n | \"ChevronDown\"\n | \"ChevronRight\"\n | \"ChevronUp\"\n | \"Circle\"\n | \"CircleDot\"\n | \"CircleSlash\"\n | \"Clock\"\n | \"Cloud\"\n | \"Columns2\"\n | \"Columns3\"\n | \"Copy\"\n | \"CreditCard\"\n | \"Database\"\n | \"Download\"\n | \"Edit\"\n | \"EllipsisVertical\"\n | \"ExternalLink\"\n | \"Eye\"\n | \"EyeOff\"\n | \"File\"\n | \"FileSearch\"\n | \"FileSpreadsheet\"\n | \"FilterX\"\n | \"Folder\"\n | \"FolderPlus\"\n | \"FolderTree\"\n | \"Fullscreen\"\n | \"Github\"\n | \"Grid2x2\"\n | \"Grid3x3\"\n | \"Hand\"\n | \"Heart\"\n | \"Image\"\n | \"ImageOff\"\n | \"Inbox\"\n | \"Info\"\n | \"KeyRound\"\n | \"Lasso\"\n | \"Layers\"\n | \"Layers2\"\n | \"LayoutDashboard\"\n | \"LayoutGrid\"\n | \"Linkedin\"\n | \"List\"\n | \"ListFilter\"\n | \"LogOut\"\n | \"Mail\"\n | \"MapPin\"\n | \"Maximize\"\n | \"Menu\"\n | \"Microscope\"\n | \"Minus\"\n | \"MoreVertical\"\n | \"Move\"\n | \"Network\"\n | \"PanelLeftClose\"\n | \"PanelLeftOpen\"\n | \"PanelRightClose\"\n | \"PanelRightOpen\"\n | \"Pencil\"\n | \"Pentagon\"\n | \"Plug\"\n | \"Plus\"\n | \"Power\"\n | \"PowerOff\"\n | \"RefreshCw\"\n | \"RotateCcw\"\n | \"RotateCw\"\n | \"ScrollText\"\n | \"Search\"\n | \"SearchX\"\n | \"Send\"\n | \"Settings\"\n | \"Shield\"\n | \"ShieldCheck\"\n | \"Spline\"\n | \"Square\"\n | \"SquarePen\"\n | \"Star\"\n | \"Table\"\n | \"Tag\"\n | \"Trash2\"\n | \"Unplug\"\n | \"User\"\n | \"UserMinus\"\n | \"UserPlus\"\n | \"Users\"\n | \"UsersRound\"\n | \"X\"\n | \"XCircle\"\n | \"ZoomIn\"\n | \"ZoomOut\";\n\n/**\n * Allowlist of icons available by name. Keys mirror the Lucide export name so\n * call sites read `<Icon icon=\"Search\" />`. Add an entry here (and to IconName\n * above) before using a new icon — the explicit map keeps the bundle\n * tree-shakeable (no wildcard import of the full Lucide set).\n */\nexport const iconRegistry: Record<IconName, LucideIcon> = {\n AlertCircle,\n AlertTriangle,\n AlignCenter,\n AlignLeft,\n AlignRight,\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpRight: ArrowUpRight,\n Ban,\n Bookmark,\n BookmarkCheck,\n Braces,\n Building2: Building2,\n Calendar,\n Check,\n CheckCircle,\n CheckCircle2,\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Circle,\n CircleDot,\n CircleSlash: CircleSlash,\n Clock,\n Cloud,\n Columns2,\n Columns3,\n Copy,\n CreditCard: CreditCard,\n Database: Database,\n Download,\n Edit,\n EllipsisVertical,\n ExternalLink,\n Eye,\n EyeOff,\n File,\n FileSearch,\n FileSpreadsheet,\n FilterX,\n Folder,\n FolderPlus,\n FolderTree,\n Fullscreen,\n Github: GithubIcon as unknown as LucideIcon,\n Grid2x2,\n Grid3x3,\n Hand,\n Heart,\n Image,\n ImageOff,\n Inbox,\n Info,\n KeyRound: KeyRound,\n Lasso,\n Layers,\n Layers2,\n LayoutDashboard: LayoutDashboard,\n LayoutGrid,\n Linkedin: LinkedinIcon as unknown as LucideIcon,\n List,\n ListFilter,\n LogOut,\n Mail,\n MapPin,\n Maximize,\n Menu,\n Microscope,\n Minus,\n MoreVertical,\n Move,\n Network: Network,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n Pencil,\n Pentagon,\n Plug,\n Plus,\n Power: Power,\n PowerOff: PowerOff,\n RefreshCw: RefreshCw,\n RotateCcw,\n RotateCw,\n ScrollText: ScrollText,\n Search,\n SearchX,\n Send,\n Settings,\n Shield,\n ShieldCheck,\n Spline,\n Square,\n SquarePen: SquarePen,\n Star,\n Table,\n Tag,\n Trash2,\n Unplug,\n User,\n UserMinus,\n UserPlus,\n Users,\n UsersRound,\n X,\n XCircle,\n ZoomIn,\n ZoomOut,\n};\n","import { forwardRef } from \"react\";\nimport type { LucideProps } from \"lucide-react\";\n\nexport const LinkedinIcon = forwardRef<SVGSVGElement, LucideProps>(\n function LinkedinIcon({ size = 24, className, ...props }, ref) {\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n focusable={false}\n {...props}\n >\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.063 2.063 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n );\n },\n);\n","import { forwardRef } from \"react\";\nimport type { LucideProps } from \"lucide-react\";\n\nexport const GithubIcon = forwardRef<SVGSVGElement, LucideProps>(\n function GithubIcon({ size = 24, className, ...props }, ref) {\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n focusable={false}\n {...props}\n >\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n },\n);\n","import { twMerge } from \"tailwind-merge\";\nimport { ButtonSize } from \"../_shared/styles\";\nimport { sizeMap } from \"../Icon/Icon\";\n\nexport interface SpinnerProps {\n size?: ButtonSize;\n \"aria-label\"?: string;\n className?: string;\n}\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={twMerge(\"animate-spin\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n width={sizeMap[size]}\n height={sizeMap[size]}\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 { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\nexport type HeadingSize = HeadingLevel | \"hero\";\n\nexport interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n as?: HeadingLevel;\n size?: HeadingSize;\n children: React.ReactNode;\n}\n\nconst sizeMap = {\n h1: \"text-4xl sm:text-5xl leading-tight font-bold\",\n h2: \"text-2xl sm:text-3xl leading-tight font-bold\",\n h3: \"text-lg sm:text-xl leading-snug font-bold\",\n h4: \"text-base sm:text-lg font-semibold\",\n h5: \"text-sm sm:text-base font-semibold\",\n h6: \"text-sm font-semibold\",\n hero: \"text-4xl sm:text-5xl lg:text-6xl leading-tight font-bold\",\n};\n\nexport const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(\n function Heading(\n { as: Tag = \"h2\", size, className, children, ...rest },\n ref,\n ) {\n const resolvedSize = size ?? Tag;\n const cx = twMerge(\"text-inherit mb-4\", sizeMap[resolvedSize], className);\n\n return (\n <Tag ref={ref} className={cx} {...rest}>\n {children}\n </Tag>\n );\n },\n);\n\n/** Convenience: renders `<h1>` with h1 styles (4xl→5xl responsive, bold) */\nexport const H1 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H1(props, ref) {\n return <Heading {...props} ref={ref} as=\"h1\" />;\n },\n);\n\n/** Convenience: renders `<h2>` with h2 styles (2xl→3xl responsive, bold) */\nexport const H2 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H2(props, ref) {\n return <Heading {...props} ref={ref} as=\"h2\" />;\n },\n);\n\n/** Convenience: renders `<h3>` with h3 styles (lg→xl responsive, bold) */\nexport const H3 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H3(props, ref) {\n return <Heading {...props} ref={ref} as=\"h3\" />;\n },\n);\n\n/** Convenience: renders `<h4>` with h4 styles (base→lg responsive, semibold) */\nexport const H4 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H4(props, ref) {\n return <Heading {...props} ref={ref} as=\"h4\" />;\n },\n);\n\n/** Convenience: renders `<h5>` with h5 styles (sm→base responsive, semibold) */\nexport const H5 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H5(props, ref) {\n return <Heading {...props} ref={ref} as=\"h5\" />;\n },\n);\n\n/** Convenience: renders `<h6>` with h6 styles (sm, semibold) */\nexport const H6 = forwardRef<HTMLHeadingElement, Omit<HeadingProps, \"as\">>(\n function H6(props, ref) {\n return <Heading {...props} ref={ref} as=\"h6\" />;\n },\n);\n","import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface ProseProps extends HTMLAttributes<HTMLDivElement> {\n /** Content rendered inside the `.prose` container */\n children: ReactNode;\n /** Visual size variant (default \"default\") */\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\";\n /** Invert colours for dark backgrounds (default false) */\n invert?: boolean;\n className?: string;\n}\n\nconst sizeClasses: Record<NonNullable<ProseProps[\"size\"]>, string> = {\n sm: \"prose-sm\",\n default: \"prose\",\n lg: \"prose-lg\",\n xl: \"prose-xl\",\n};\n\n/**\n * Renders rich-text / long-form content with the Tailwind Typography plugin.\n *\n * Wrap markdown output, static documentation, or any long-form content that\n * contains `<h1>`–`<h6>`, `<p>`, `<ul>`, `<ol>`, `<blockquote>`, `<code>` and\n * similar elements. The wrapper applies the `prose` class family so the\n * content inherits consistent typographic spacing and colour.\n *\n * @example\n * <Prose size=\"lg\">{renderMarkdown(content)}</Prose>\n */\nexport const Prose = forwardRef<HTMLDivElement, ProseProps>(function Prose(\n { size = \"default\", invert = false, className, children, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={twMerge(\n \"prose\",\n sizeClasses[size],\n invert && \"prose-invert\",\n \"max-w-none\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type DescriptionSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface DescriptionProps extends Omit<\n HTMLAttributes<HTMLParagraphElement>,\n \"children\"\n> {\n /** Content rendered inside the paragraph */\n children: ReactNode;\n /** Visual size variant (default \"md\") */\n size?: DescriptionSize;\n /** Merge override */\n className?: string;\n}\n\nconst sizeClasses: Record<DescriptionSize, string> = {\n sm: \"text-sm md:text-base\",\n md: \"text-base md:text-lg\",\n lg: \"text-lg md:text-xl\",\n xl: \"text-xl md:text-2xl\",\n};\n\n/**\n * Renders a single paragraph of muted body copy with responsive sizing.\n *\n * Use for lead text, supporting descriptions, and other non-heading prose.\n * The element is a `<p>` so it participates in normal document flow. Pass\n * `size` to scale the text; pass `className` to override colour, margin, or\n * any other utility.\n *\n * @example\n * <Description size=\"lg\">Supporting copy beneath a heading.</Description>\n */\nexport const Description = forwardRef<HTMLParagraphElement, DescriptionProps>(\n function Description({ size = \"md\", className, children, ...rest }, ref) {\n return (\n <p\n ref={ref}\n className={twMerge(\n \"text-pretty text-muted-foreground mb-4\",\n sizeClasses[size],\n className,\n )}\n {...rest}\n >\n {children}\n </p>\n );\n },\n);\n","import {\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n// Use useLayoutEffect on client, useEffect on server to avoid SSR warning\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport interface TooltipProps {\n /** Tooltip content; `null`/`undefined` disables the tooltip entirely */\n content: ReactNode;\n /** Trigger element(s) */\n children: ReactNode;\n}\n\ninterface Coords {\n x: number;\n y: number;\n}\n\nconst offsetThreshold = 5;\nconst tooltipDelay = 500; // ms of cursor rest before showing\nconst tooltipOffset = 12;\nconst viewportMargin = 4; // minimum gap to the viewport edge\n\nconst tooltipCx = [\n \"fixed z-50 px-2 py-1 rounded shadow-lg\",\n // Natural content width (capped at max-w-xs): being positioned near the\n // right viewport edge must shift the tooltip left, not squeeze its layout.\n \"w-max max-w-xs\",\n \"bg-overlay backdrop-blur-sm\",\n \"text-primary-foreground text-sm\",\n \"pointer-events-none\",\n].join(\" \");\n\n/**\n * Cursor-following tooltip. Shows after the cursor rests on the trigger for\n * 500ms (movement beyond 5px restarts the wait), positioned at a 12px offset\n * from the cursor and flipped at viewport edges.\n *\n * Keyboard: when an already-focusable child (button, switch, link) receives\n * visible focus, the tooltip shows immediately, anchored to the element's\n * center. It never makes anything focusable itself. Escape dismisses.\n *\n * Known limitation (WCAG 1.4.13 \"hoverable\"): the tooltip is\n * pointer-events-none and follows the cursor, so it cannot itself be hovered.\n * Keep tooltip content short — it is a glance affordance, not a reading\n * surface; the underlying value must stay accessible on the trigger itself.\n */\nexport function Tooltip({ content, children }: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState<Coords>({ x: 0, y: 0 });\n const [adjustedCoords, setAdjustedCoords] = useState<Coords>({ x: 0, y: 0 });\n const timerRef = useRef<number | null>(null);\n // Cursor-rest anchor. A ref, not state: the move-cancel comparison must see\n // the value set earlier in the SAME event stream, not a previous render's.\n const restAnchorRef = useRef<Coords | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const isVisible = visible && content != null;\n\n const calculateAdjustedPosition = (anchorX: number, anchorY: number) => {\n if (!tooltipRef.current) {\n return { x: anchorX + tooltipOffset, y: anchorY + tooltipOffset };\n }\n\n const { width, height } = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let x = anchorX + tooltipOffset;\n let y = anchorY + tooltipOffset;\n\n // Flip to the other side of the anchor at right/bottom edges\n if (anchorX + width > viewportWidth) {\n x = anchorX - width - tooltipOffset;\n }\n if (anchorY + height > viewportHeight) {\n y = anchorY - height - tooltipOffset;\n }\n\n // Hard-clamp into the viewport — flipping alone can still overshoot\n // (e.g. anchor near a corner, or tooltip wider than the remaining space)\n x = Math.max(\n viewportMargin,\n Math.min(x, viewportWidth - width - viewportMargin),\n );\n y = Math.max(\n viewportMargin,\n Math.min(y, viewportHeight - height - viewportMargin),\n );\n\n return { x, y };\n };\n\n // Recalculate position after tooltip is rendered/resized\n useIsomorphicLayoutEffect(() => {\n if (!isVisible || !tooltipRef.current) return;\n setAdjustedCoords(calculateAdjustedPosition(coords.x, coords.y));\n }, [isVisible, coords, content]);\n\n const hideTooltip = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n restAnchorRef.current = null;\n setVisible(false);\n };\n\n // Cursor-rest model: any move beyond the threshold (measured against the\n // incoming event coordinates, not stale state) hides the tooltip, re-anchors\n // and restarts the dwell; staying within it lets the pending timer fire.\n const handleMouseMove = ({ clientX, clientY }: MouseEvent) => {\n setCoords({ x: clientX, y: clientY });\n\n const anchor = restAnchorRef.current;\n const moved =\n anchor == null ||\n Math.abs(clientX - anchor.x) > offsetThreshold ||\n Math.abs(clientY - anchor.y) > offsetThreshold;\n\n if (!moved) return;\n\n hideTooltip();\n restAnchorRef.current = { x: clientX, y: clientY };\n timerRef.current = window.setTimeout(() => {\n setVisible(true);\n }, tooltipDelay);\n };\n\n // Keyboard path: a focusable child received focus. Only react to visible\n // (keyboard-driven) focus and anchor at the element's center — no dwell,\n // deliberate focus is intent enough.\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as Element;\n let focusVisible = true;\n try {\n focusVisible = target.matches(\":focus-visible\");\n } catch {\n // Older engines without :focus-visible — fall back to showing.\n }\n if (!focusVisible) return;\n\n const rect = target.getBoundingClientRect();\n const center = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n // Anchor at the element center so incidental mouse movement over the\n // focused trigger doesn't immediately cancel the keyboard-shown tooltip.\n restAnchorRef.current = center;\n setCoords(center);\n setVisible(true);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") hideTooltip();\n };\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n const tooltipContent =\n isVisible && content != null ? (\n <div\n ref={tooltipRef}\n role=\"tooltip\"\n className={tooltipCx}\n style={{ left: adjustedCoords.x, top: adjustedCoords.y }}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <span\n style={{ display: \"contents\" }}\n onMouseMove={handleMouseMove}\n onMouseLeave={hideTooltip}\n onFocus={handleFocus}\n onBlur={hideTooltip}\n onKeyDown={handleKeyDown}\n >\n {children}\n {typeof window !== \"undefined\" &&\n createPortal(tooltipContent, document.body)}\n </span>\n );\n}\n","import {\n CSSProperties,\n KeyboardEvent,\n ReactNode,\n UIEvent,\n useRef,\n} from \"react\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useCopyToClipboard } from \"./useCopyToClipboard\";\nimport { useMiddleEllipsis } from \"./useMiddleEllipsis\";\nimport { useOverflowDetection } from \"./useOverflowDetection\";\n\ntype EllipsisMode = \"left\" | \"middle\" | \"right\";\n\nexport interface TruncatedTextProps {\n /** Text to display. `middle` ellipsis requires a string child. */\n children: ReactNode;\n /** Where the ellipsis is placed when the text overflows (default `right`). */\n ellipsis?: EllipsisMode;\n /** When set, the text becomes click-to-copy and copies this value. */\n copyValue?: string;\n}\n\nconst spanCx = \"truncate overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n// Web's original used -mx-1 px-1 to widen the hover highlight beyond the\n// text; on a w-full element the negative margin overflows the container and\n// clips on the right — keep the highlight within the text box instead.\nconst copyCx =\n \"hover:bg-accent transition-colors rounded cursor-pointer\";\n\nconst leftStyle: CSSProperties = { direction: \"rtl\", textAlign: \"left\" };\n\n// An overflow-hidden + ellipsis element is still a horizontal scroll\n// container: a click-drag text selection (or focus) scrolls it, sliding the\n// text and hiding the ellipsis. Pin it so the truncation always shows.\nconst pinScroll = (e: UIEvent<HTMLElement>) => {\n if (e.currentTarget.scrollLeft !== 0) e.currentTarget.scrollLeft = 0;\n};\n\nconst handleCopyKeyDown = (handleClick: () => void) => (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n};\n\nconst CopiedOverlay = () => (\n <span\n // Announce the successful copy to screen readers; as a live region the\n // text is not glued onto the button's accessible name.\n role=\"status\"\n aria-live=\"polite\"\n className=\"absolute inset-0 flex items-center text-muted-foreground pointer-events-none\"\n >\n Copied\n </span>\n);\n\n// ─── Right (default): pure CSS truncation ───────────────────────────\n\nconst RightEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {children}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Left: CSS direction trick ──────────────────────────────────────\n\nconst LeftEllipsis = ({ children, copyValue }: { children: ReactNode; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const isTruncated = useOverflowDetection(ref);\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${spanCx} ${copyCx} relative` : spanCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? children : null}>\n <span\n ref={ref}\n className={cx}\n style={leftStyle}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n <bdi>{children}</bdi>\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Middle: JS-based truncation ────────────────────────────────────\n\nconst middleCx = \"overflow-hidden whitespace-nowrap block min-w-0 w-full\";\n\nconst MiddleEllipsisString = ({ text, copyValue }: { text: string; copyValue?: string }) => {\n const ref = useRef<HTMLSpanElement>(null);\n const displayed = useMiddleEllipsis(ref, text);\n const isTruncated = displayed !== text;\n const { handleClick, isCopied } = useCopyToClipboard(copyValue);\n const isCopyable = copyValue != null;\n\n const baseCx = isCopyable ? `${middleCx} ${copyCx} relative` : middleCx;\n const cx = isCopied ? `${baseCx} text-transparent` : baseCx;\n\n return (\n <Tooltip content={isTruncated ? text : null}>\n <span\n ref={ref}\n className={cx}\n // Middle truncation replaces the DOM text, so screen readers would\n // otherwise announce the mutilated string — expose the full value.\n aria-label={isTruncated ? text : undefined}\n onScroll={pinScroll}\n onClick={isCopyable ? handleClick : undefined}\n onKeyDown={isCopyable ? handleCopyKeyDown(handleClick) : undefined}\n role={isCopyable ? \"button\" : undefined}\n tabIndex={isCopyable ? 0 : undefined}\n >\n {displayed}\n {isCopied && <CopiedOverlay />}\n </span>\n </Tooltip>\n );\n};\n\n// ─── Public component ───────────────────────────────────────────────\n\n/**\n * Truncating text span (ported from cytario-web's TooltipSpan). Reveals the\n * full value via the cursor tooltip only while actually truncated. Plain text\n * stays non-focusable; passing `copyValue` turns it into a click-to-copy\n * button (focusable, keyboard operable).\n */\nexport const TruncatedText = ({ children, ellipsis = \"right\", copyValue }: TruncatedTextProps) => {\n if (ellipsis === \"left\") return <LeftEllipsis copyValue={copyValue}>{children}</LeftEllipsis>;\n if (ellipsis === \"middle\" && typeof children === \"string\")\n return <MiddleEllipsisString text={children} copyValue={copyValue} />;\n return <RightEllipsis copyValue={copyValue}>{children}</RightEllipsis>;\n};\n","import { useCallback, useRef, useState } from \"react\";\n\nconst FLASH_DURATION = 1500;\n\ninterface UseCopyToClipboardResult {\n handleClick: () => void;\n isCopied: boolean;\n}\n\nexport function useCopyToClipboard(copyValue: string | undefined): UseCopyToClipboardResult {\n const [isCopied, setIsCopied] = useState(false);\n const timerRef = useRef<number | null>(null);\n\n const handleClick = useCallback(() => {\n if (copyValue == null) return;\n\n const selection = window.getSelection()?.toString();\n if (selection && selection.length > 0) return;\n\n // Clipboard API is absent in insecure contexts and can reject on denied\n // permission — fail silently rather than throw.\n if (!navigator.clipboard) return;\n navigator.clipboard\n .writeText(copyValue)\n .then(() => {\n if (timerRef.current != null) clearTimeout(timerRef.current);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => {\n setIsCopied(false);\n timerRef.current = null;\n }, FLASH_DURATION);\n })\n .catch(() => {});\n }, [copyValue]);\n\n return { handleClick, isCopied };\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\nconst ELLIPSIS = \"…\";\n\n/**\n * Binary-search for the longest `start…end` that fits within the element.\n * Uses actual DOM measurement (scrollWidth vs clientWidth) instead of canvas,\n * so results are pixel-perfect regardless of font, letter-spacing, or rendering.\n */\nfunction computeTruncated(el: HTMLElement, text: string): string {\n el.textContent = text;\n if (el.scrollWidth <= el.clientWidth) return text;\n\n let lo = 0;\n let hi = text.length;\n\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n const startLen = Math.ceil(mid / 2);\n const endLen = Math.floor(mid / 2);\n el.textContent =\n text.slice(0, startLen) + ELLIPSIS + (endLen > 0 ? text.slice(text.length - endLen) : \"\");\n\n if (el.scrollWidth <= el.clientWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n\n if (lo === 0) return ELLIPSIS;\n\n const startLen = Math.ceil(lo / 2);\n const endLen = Math.floor(lo / 2);\n\n const result =\n endLen === 0\n ? text.slice(0, startLen) + ELLIPSIS\n : text.slice(0, startLen) + ELLIPSIS + text.slice(text.length - endLen);\n\n // Ensure the DOM shows the final result immediately, before React re-renders.\n el.textContent = result;\n return result;\n}\n\n/**\n * Observes the container width and returns a middle-truncated string.\n * Returns the original text if it fits within the container.\n */\nexport function useMiddleEllipsis(ref: RefObject<HTMLSpanElement | null>, text: string): string {\n const [displayed, setDisplayed] = useState(text);\n\n // useLayoutEffect runs before paint, so the user never sees the full text.\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const update = () => setDisplayed(computeTruncated(el, text));\n\n update();\n\n const observer = new ResizeObserver(() => update());\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, text]);\n\n return displayed;\n}\n","import { RefObject, useLayoutEffect, useState } from \"react\";\n\n/**\n * Detects whether an element's content overflows its visible width.\n * Uses ResizeObserver to recheck on any container size change\n * (column resize, flex layout shifts, not just window resize).\n */\nexport function useOverflowDetection(ref: RefObject<HTMLElement | null>): boolean {\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const check = () => setIsTruncated(el.scrollWidth > el.offsetWidth);\n\n check();\n\n // Defer + coalesce to the next frame so a live container resize (e.g.\n // dragging a sidebar) can't drive a synchronous observe→setState→layout\n // loop (\"Maximum update depth\").\n let raf = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(check);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n observer.disconnect();\n };\n }, [ref]);\n\n return isTruncated;\n}\n","import type { ElementType, Ref } from \"react\";\nimport {\n Button as AriaButton,\n Link as AriaLink,\n ToggleButton as AriaToggleButton,\n type ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n type ButtonVariant,\n type ButtonSize,\n selectedStyles,\n variantStyles,\n} from \"../_shared/styles\";\nimport { type ButtonProps, type ButtonLinkProps } from \"../Button\";\nimport { buttonBaseClass } from \"../Button/Button\";\nimport { Icon, type IconValue } from \"../Icon\";\nimport { Spinner } from \"../Spinner\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport const squareSizeStyles: Record<ButtonSize, string> = {\n xs: \"h-7 w-7\", // 28px\n sm: \"h-8 w-8\", // 32px\n md: \"h-10 w-10\", // 40px\n lg: \"h-12 w-12\", // 48px\n};\n\ninterface IconButtonBaseProps {\n as: ElementType;\n icon: IconValue;\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n isDisabled?: boolean;\n className?: string;\n ref?: Ref<HTMLButtonElement | HTMLAnchorElement>;\n}\n\n/**\n * Shared square icon button: builds the className, wraps in a Tooltip, and\n * renders the icon (or a spinner while loading). The wrapper element is\n * polymorphic via `as`; the public IconButton/IconButtonLink pass their own\n * precisely-typed props through.\n */\nfunction IconButtonBase({\n as: Component,\n icon,\n label,\n variant = \"ghost\",\n size = \"md\",\n isLoading = false,\n isDisabled,\n className,\n ref,\n ...props\n}: IconButtonBaseProps & Record<string, unknown>) {\n const cx = twMerge(\n buttonBaseClass,\n isLoading ? \"pointer-events-none\" : \"\",\n variantStyles[variant],\n // No-op unless the wrapper is a ToggleButton (react-aria sets data-selected).\n selectedStyles[variant],\n squareSizeStyles[size],\n className,\n );\n\n return (\n <Tooltip content={label}>\n <Component\n {...props}\n ref={ref}\n aria-label={label}\n isDisabled={isDisabled || isLoading}\n className={cx}\n >\n {isLoading ? <Spinner size={size} /> : <Icon icon={icon} size={size} />}\n </Component>\n </Tooltip>\n );\n}\n\nexport type IconButtonProps = Omit<\n ButtonProps,\n \"iconLeft\" | \"iconRight\" | \"children\"\n> & {\n icon: IconValue;\n label: string;\n ref?: Ref<HTMLButtonElement>;\n};\n\nexport function IconButton(props: IconButtonProps) {\n return <IconButtonBase as={AriaButton} {...props} />;\n}\n\nexport type IconButtonLinkProps = Omit<\n ButtonLinkProps,\n \"iconLeft\" | \"iconRight\" | \"children\"\n> & {\n icon: IconValue;\n label: string;\n ref?: Ref<HTMLAnchorElement>;\n};\n\nexport function IconButtonLink(props: IconButtonLinkProps) {\n return <IconButtonBase as={AriaLink} {...props} />;\n}\n\nexport type IconButtonToggleProps = Omit<\n AriaToggleButtonProps,\n \"className\" | \"children\"\n> & {\n icon: IconValue;\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n ref?: Ref<HTMLButtonElement>;\n};\n\n/** Icon button with a persistent on/off state (react-aria ToggleButton): `isSelected` toggles `aria-pressed` and the selected background. */\nexport function IconButtonToggle(props: IconButtonToggleProps) {\n return <IconButtonBase as={AriaToggleButton} {...props} />;\n}\n","import type { ElementType } from \"react\";\nimport {\n TextField,\n Input as AriaInput,\n Text,\n type TextFieldProps,\n ColorField,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../../_shared/styles\";\nimport { Label } from \"../Label\";\n\nconst alignClasses = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\nexport interface InputProps extends Omit<\n TextFieldProps,\n \"children\" | \"className\"\n> {\n as?: typeof TextField | typeof ColorField;\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\";\n size?: ButtonSize;\n prefix?: string;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\nexport function Input({\n as: FieldProp = TextField,\n label,\n placeholder,\n description,\n errorMessage,\n type = \"text\",\n size = \"md\",\n prefix,\n align = \"left\",\n isDisabled,\n isRequired,\n className,\n ...props\n}: InputProps) {\n const Field: ElementType = FieldProp;\n\n const isInvalid = !!errorMessage;\n\n const borderColor = isInvalid\n ? \"border-destructive-border\"\n : \"border-border hover:border-border\";\n\n const radiusClass = \"rounded-md\";\n\n return (\n <Field\n {...props}\n type={type}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n className={twMerge(\"flex w-full flex-col gap-1\", className)}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n {prefix ? (\n <div\n className={twMerge(\n \"flex items-center overflow-hidden\",\n radiusClass,\n \"border\",\n \"bg-background\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus-within:ring-2 focus-within:ring-ring focus-within:border-ring\",\n isDisabled && \"opacity-50 pointer-events-none\",\n )}\n >\n <span\n className={twMerge(\n \"self-stretch flex items-center shrink-0 select-none\",\n \"bg-card\",\n \"border-r border-r-border\",\n \"text-muted-foreground\",\n sizeStyles[size],\n )}\n >\n {prefix}\n </span>\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full bg-transparent\",\n sizeStyles[size],\n alignClasses[align],\n \"text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"outline-none border-none\",\n )}\n />\n </div>\n ) : (\n <AriaInput\n placeholder={placeholder}\n className={twMerge(\n \"w-full\",\n sizeStyles[size],\n alignClasses[align],\n radiusClass,\n \"border\",\n \"text-foreground\",\n \"bg-background\",\n \"placeholder:text-muted-foreground\",\n \"outline-none transition-colors\",\n borderColor,\n \"focus:ring-2 focus:ring-ring focus:border-ring\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n )}\n />\n )}\n\n {description && (\n <Text slot=\"description\" className=\"text-sm text-muted-foreground\">\n {description}\n </Text>\n )}\n\n {isInvalid && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-destructive\"\n >\n {errorMessage}\n </Text>\n )}\n </Field>\n );\n}\n","import {\n Label as AriaLabel,\n type LabelProps as AriaLabelProps,\n} from \"react-aria-components\";\n\nexport interface LabelProps extends Omit<AriaLabelProps, \"className\"> {\n isRequired?: boolean;\n className?: string;\n}\n\nexport function Label({ isRequired, children, className, ...props }: LabelProps) {\n return (\n <AriaLabel\n {...props}\n className={[\n \"text-sm\",\n \"font-medium\",\n \"text-foreground\",\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-destructive\"\n >\n *\n </span>\n )}\n </AriaLabel>\n );\n}\n","import { forwardRef, useId, useState, type InputHTMLAttributes } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../../_shared/styles\";\nimport { Icon } from \"../../Icon\";\n\nexport interface InputPasswordProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n label?: string;\n description?: string;\n errorMessage?: string;\n size?: ButtonSize;\n isRequired?: boolean;\n isDisabled?: boolean;\n /** Disable only the visibility toggle; the input stays interactive. */\n isToggleDisabled?: boolean;\n showPasswordLabel?: string;\n hidePasswordLabel?: string;\n}\n\n/**\n * Password field with a built-in show/hide visibility toggle.\n *\n * Built on a native <input> (ref-forwarded, full native attribute/event\n * passthrough) so it works equally in controlled React forms and in\n * server-driven native forms (e.g. Keycloakify login themes). The toggle\n * lives inside the input's border — no InputGroup composition required.\n */\nexport const InputPassword = forwardRef<HTMLInputElement, InputPasswordProps>(\n function InputPassword(\n {\n label,\n description,\n errorMessage,\n size = \"md\",\n isRequired,\n isDisabled,\n isToggleDisabled,\n showPasswordLabel = \"Show password\",\n hidePasswordLabel = \"Hide password\",\n id,\n className,\n \"aria-invalid\": ariaInvalidProp,\n \"aria-describedby\": ariaDescribedByProp,\n ...inputProps\n },\n ref,\n ) {\n const [visible, setVisible] = useState(false);\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const isInvalid = !!errorMessage;\n\n const descId = description ? `${inputId}-description` : undefined;\n const errId = isInvalid ? `${inputId}-error` : undefined;\n const describedBy =\n [descId, errId, ariaDescribedByProp].filter(Boolean).join(\" \") ||\n undefined;\n\n const toggleDisabled = isToggleDisabled ?? isDisabled;\n\n return (\n <div className={twMerge(\"flex w-full flex-col gap-1\", className)}>\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-foreground\"\n >\n {label}\n {isRequired && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-destructive\">\n *\n </span>\n )}\n </label>\n )}\n\n <div\n className={twMerge(\n \"flex items-center overflow-hidden rounded-md border bg-background\",\n \"outline-none transition-colors\",\n isInvalid ? \"border-destructive-border\" : \"border-border\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:border-ring\",\n isDisabled && \"opacity-50 pointer-events-none\",\n )}\n >\n <input\n {...inputProps}\n ref={ref}\n id={inputId}\n type={visible ? \"text\" : \"password\"}\n required={isRequired}\n disabled={isDisabled}\n aria-invalid={isInvalid || ariaInvalidProp}\n aria-describedby={describedBy}\n className={twMerge(\n \"w-full bg-transparent text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"outline-none border-none\",\n sizeStyles[size],\n )}\n />\n <button\n type=\"button\"\n aria-label={visible ? hidePasswordLabel : showPasswordLabel}\n disabled={toggleDisabled}\n tabIndex={toggleDisabled ? -1 : undefined}\n onClick={() => setVisible((v) => !v)}\n className={twMerge(\n \"flex items-center justify-center shrink-0 self-stretch px-3 cursor-pointer\",\n \"text-muted-foreground hover:text-foreground transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n >\n <Icon icon={visible ? EyeOff : Eye} size=\"sm\" />\n </button>\n </div>\n\n {description && (\n <p id={descId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n\n {isInvalid && (\n <p id={errId} role=\"alert\" className=\"text-sm text-destructive\">\n {errorMessage}\n </p>\n )}\n </div>\n );\n },\n);\n","import type React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport {\n Button,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n SelectValue,\n Text,\n type SelectProps as AriaSelectProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../../_shared/styles\";\nimport { Label } from \"../Label\";\n\nexport interface SelectItem {\n id: string;\n name: string;\n}\n\nexport interface SelectProps extends Omit<\n AriaSelectProps<SelectItem>,\n \"children\"\n> {\n items: SelectItem[];\n label?: string;\n placeholder?: string;\n description?: string;\n errorMessage?: string;\n /** Controls padding and font size */\n size?: ButtonSize;\n /** Custom visual renderer for items in the dropdown and trigger.\n * `item.name` remains the accessible label (used for typeahead and screen readers). */\n renderItem?: (item: SelectItem) => React.ReactNode;\n}\n\nexport function Select({\n label,\n items,\n placeholder = \"Select an option\",\n description,\n errorMessage,\n size = \"md\",\n isDisabled,\n isRequired,\n className,\n renderItem,\n ...props\n}: SelectProps) {\n const hasError = Boolean(errorMessage);\n\n return (\n <AriaSelect\n {...props}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={hasError}\n className={twMerge(\"flex flex-col gap-1\", className as string)}\n >\n {label && <Label isRequired={isRequired}>{label}</Label>}\n\n <Button\n aria-required={isRequired || undefined}\n className={twMerge(\n `\n inline-flex items-center justify-between\n w-full rounded-md\n text-left\n border outline-none transition-colors\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\n cursor-pointer disabled:opacity-50 disabled:pointer-events-none\n bg-background\n `,\n sizeStyles[size],\n hasError ? \"border-destructive-border\" : \"border-border\",\n )}\n >\n <SelectValue\n className={twMerge(\n renderItem ? \"min-w-0\" : \"truncate\",\n \"data-placeholder:text-muted-foreground\",\n )}\n >\n {({ selectedItem, isPlaceholder }) => {\n if (isPlaceholder) return placeholder;\n const item = selectedItem as SelectItem;\n return renderItem ? renderItem(item) : (item?.name ?? placeholder);\n }}\n </SelectValue>\n <ChevronDown\n aria-hidden\n className={twMerge(\n \"shrink-0 text-muted-foreground\",\n size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\",\n )}\n />\n </Button>\n\n {description && (\n <Text slot=\"description\" className=\"text-sm text-muted-foreground\">\n {description}\n </Text>\n )}\n\n {hasError && (\n <Text\n slot=\"errorMessage\"\n role=\"alert\"\n className=\"text-sm text-destructive\"\n >\n {errorMessage}\n </Text>\n )}\n\n <Popover\n className={twMerge(\n \"w-(--trigger-width)\",\n \"rounded-md\",\n \"border border-border\",\n \"bg-background\",\n \"shadow-lg\",\n \"overflow-auto\",\n \"entering:animate-in entering:fade-in\",\n \"exiting:animate-out exiting:fade-out\",\n )}\n >\n <ListBox className=\"p-1 outline-none\" items={items}>\n {(item) => (\n <ListBoxItem\n id={item.id}\n textValue={item.name}\n className={twMerge(\n `\n flex items-center justify-between gap-2\n rounded-sm\n text-foreground\n cursor-pointer outline-none\n hover:bg-muted\n focus-visible:bg-muted\n selected:text-primary selected:font-medium\n `,\n sizeStyles[size],\n )}\n >\n {({ isSelected }) => (\n <>\n <span className={renderItem ? \"min-w-0 flex-1\" : \"truncate\"}>\n {renderItem ? renderItem(item) : item.name}\n </span>\n {isSelected && (\n <Check className=\"h-4 w-4 shrink-0 text-primary\" />\n )}\n </>\n )}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n","import {\n Cell as AriaCell,\n Column as AriaColumn,\n Row as AriaRow,\n Table as AriaTable,\n TableBody as AriaTableBody,\n TableHeader as AriaTableHeader,\n type CellProps as AriaCellProps,\n type ColumnProps as AriaColumnProps,\n type RowProps as AriaRowProps,\n type TableBodyProps,\n type TableHeaderProps,\n type TableProps as AriaTableProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type TableSize = \"compact\" | \"comfortable\";\n\n/* ------------------------------------------------------------------ */\n/* Table */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps\n extends Omit<AriaTableProps, \"className\"> {\n /** Row density */\n size?: TableSize;\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\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({\n size = \"comfortable\",\n className,\n ...props\n}: DataTableProps) {\n return (\n <AriaTable\n {...props}\n className={twMerge(\n \"w-full border-collapse text-sm text-foreground\",\n tableSizeClass[size],\n className,\n )}\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 interface ColumnProps extends Omit<AriaColumnProps, \"className\"> {\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\n}\n\nexport function Column({ className, ...props }: ColumnProps) {\n return (\n <AriaColumn\n {...props}\n className={twMerge(\n \"px-3 py-2 text-left font-semibold text-muted-foreground\",\n \"border-b-2 border-border\",\n \"cursor-default select-none outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]\",\n className,\n )}\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-muted-foreground\">\n {sortDirection === \"ascending\"\n ? \"\\u25B2\"\n : sortDirection === \"descending\"\n ? \"\\u25BC\"\n : \"\\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 interface RowProps<T extends object>\n extends Omit<AriaRowProps<T>, \"className\"> {\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\n}\n\nexport function Row<T extends object>({\n className,\n ...props\n}: RowProps<T>) {\n return (\n <AriaRow\n {...props}\n className={twMerge(\n \"border-b border-border\",\n \"even:bg-card\",\n \"hover:bg-muted\",\n \"data-[selected]:bg-accent\",\n \"data-[selected]:ring-2 data-[selected]:ring-ring data-[selected]:ring-inset\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]\",\n \"transition-colors\",\n className,\n )}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Cell */\n/* ------------------------------------------------------------------ */\n\nexport interface CellProps extends Omit<AriaCellProps, \"className\"> {\n /** Additional classes merged into the base styles via twMerge. */\n className?: string;\n}\n\nexport function Cell({ className, ...props }: CellProps) {\n return (\n <AriaCell\n {...props}\n className={twMerge(\n \"px-3 py-(--table-row-py)\",\n \"text-foreground\",\n \"outline-none\",\n \"focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-[-2px]\",\n className,\n )}\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-backdrop backdrop-blur-sm\",\n \"flex items-center justify-center\",\n \"entering:animate-in entering:fade-in\",\n \"exiting:animate-out exiting:fade-out\",\n ].join(\" \")}\n >\n <Modal\n className={[\n \"w-full mx-4\",\n sizeStyles[size],\n \"bg-background rounded-lg shadow-xl max-h-[85vh] flex flex-col\",\n \"entering:animate-in entering:zoom-in-95 entering:fade-in\",\n \"exiting:animate-out exiting:zoom-out-95 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-border\">\n <Heading\n slot=\"title\"\n className=\"text-lg font-semibold text-foreground\"\n >\n {title}\n </Heading>\n <button\n type=\"button\"\n onClick={close}\n className={[\n \"inline-flex items-center justify-center rounded-sm p-1\",\n \"text-muted-foreground hover:text-foreground hover:bg-muted\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"transition-colors\",\n ].join(\" \")}\n aria-label=\"Close\"\n >\n <X size={20} aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"px-6 py-4 overflow-y-auto\">{children}</div>\n </>\n )}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type React from \"react\";\n\nexport interface DialogFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function DialogFooter({ children, className }: DialogFooterProps) {\n return (\n <div\n className={[\n \"pt-4 mt-4 border-t border-border flex items-center justify-between gap-3\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CheckCircle, XCircle, Info, X } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport type ToastVariant = \"success\" | \"error\" | \"info\";\nexport type ToastPlacement = \"top-center\" | \"top-right\" | \"bottom-center\" | \"bottom-right\";\n\nexport interface ToastData {\n id: string;\n variant: ToastVariant;\n message: string;\n duration?: number;\n}\n\nexport interface ToastContextValue {\n toasts: ToastData[];\n addToast: (toast: Omit<ToastData, \"id\">) => void;\n removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nlet toastCounter = 0;\n\nconst defaultDuration: Record<ToastVariant, number> = {\n success: 5000,\n info: 5000,\n error: 10000,\n};\n\nconst variantConfig: Record<\n ToastVariant,\n { icon: LucideIcon; containerClass: string; iconClass: string }\n> = {\n success: {\n icon: CheckCircle,\n containerClass: \"bg-success-surface border-success-border text-success\",\n iconClass: \"text-success\",\n },\n error: {\n icon: XCircle,\n containerClass: \"bg-destructive-surface border-destructive-border text-destructive\",\n iconClass: \"text-destructive\",\n },\n info: {\n icon: Info,\n containerClass: \"bg-info-surface border-info-border text-info\",\n iconClass: \"text-info\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Placement context — passed from ToastContainer to ToastItem\n// ---------------------------------------------------------------------------\n\nconst PlacementContext = createContext<ToastPlacement>(\"bottom-right\");\n\nconst exitAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"-translate-y-full opacity-0\",\n \"top-right\": \"translate-x-full opacity-0\",\n \"bottom-center\": \"translate-y-full opacity-0\",\n \"bottom-right\": \"translate-x-full opacity-0\",\n};\n\nconst enterAnimationByPlacement: Record<ToastPlacement, string> = {\n \"top-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-top\",\n \"top-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n \"bottom-center\": \"translate-y-0 opacity-100 animate-in slide-in-from-bottom\",\n \"bottom-right\": \"translate-x-0 opacity-100 animate-in slide-in-from-right\",\n};\n\nfunction ToastItem({\n toast,\n onRemove,\n}: {\n toast: ToastData;\n onRemove: (id: string) => void;\n}) {\n const [isExiting, setIsExiting] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const placement = useContext(PlacementContext);\n const config = variantConfig[toast.variant];\n const IconComponent = config.icon;\n\n const dismiss = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => onRemove(toast.id), 200);\n }, [onRemove, toast.id]);\n\n useEffect(() => {\n const duration = toast.duration ?? defaultDuration[toast.variant];\n timerRef.current = setTimeout(dismiss, duration);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [toast.duration, toast.variant, dismiss]);\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={[\n \"flex items-start gap-3 rounded-lg border px-4 py-3 shadow-md\",\n \"min-w-[320px] max-w-[420px]\",\n \"transition-all duration-200\",\n isExiting\n ? exitAnimationByPlacement[placement]\n : enterAnimationByPlacement[placement],\n config.containerClass,\n ].join(\" \")}\n >\n <IconComponent size={20} className={[\"shrink-0 mt-0.5\", config.iconClass].join(\" \")} aria-hidden=\"true\" />\n <p className=\"flex-1 text-sm font-medium\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={dismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <X size={16} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n\nconst containerPositionStyles: Record<ToastPlacement, string> = {\n \"top-center\": \"fixed top-4 left-1/2 -translate-x-1/2 z-50 flex flex-col-reverse gap-2 items-center\",\n \"top-right\": \"fixed top-4 right-4 z-50 flex flex-col-reverse gap-2\",\n \"bottom-center\": \"fixed bottom-4 left-1/2 -translate-x-1/2 z-50 flex flex-col gap-2 items-center\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-50 flex flex-col gap-2\",\n};\n\nfunction ToastContainer({\n toasts,\n removeToast,\n placement = \"bottom-right\",\n}: {\n toasts: ToastData[];\n removeToast: (id: string) => void;\n placement?: ToastPlacement;\n}) {\n if (toasts.length === 0) return null;\n\n return createPortal(\n <PlacementContext.Provider value={placement}>\n <div className={containerPositionStyles[placement]}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n </PlacementContext.Provider>,\n document.body,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Toast Bridge — allows code outside the React tree to emit toasts\n// ---------------------------------------------------------------------------\n\nexport interface ToastBridge {\n /** Call from anywhere (including outside React) to show a toast. */\n emit: (toast: Omit<ToastData, \"id\">) => void;\n /** Used internally by ToastProvider to subscribe to external emits. */\n subscribe: (fn: (toast: Omit<ToastData, \"id\">) => void) => () => void;\n}\n\nexport function createToastBridge(): ToastBridge {\n const listeners = new Set<(toast: Omit<ToastData, \"id\">) => void>();\n return {\n emit: (toast) => {\n listeners.forEach((fn) => fn(toast));\n },\n subscribe: (fn) => {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// ToastProvider\n// ---------------------------------------------------------------------------\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Optional bridge for receiving toasts from outside the React tree. */\n bridge?: ToastBridge;\n /** Where to display toasts on screen. Defaults to \"bottom-right\". */\n placement?: ToastPlacement;\n}\n\nexport function ToastProvider({ children, bridge, placement = \"bottom-right\" }: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n\n const addToast = useCallback((toast: Omit<ToastData, \"id\">) => {\n const id = `toast-${++toastCounter}`;\n setToasts((prev) => [...prev, { ...toast, id }]);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n // Subscribe to external bridge emits\n useEffect(() => {\n if (!bridge) return;\n return bridge.subscribe(addToast);\n }, [bridge, addToast]);\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} placement={placement} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return {\n toast: context.addToast,\n toasts: context.toasts,\n removeToast: context.removeToast,\n };\n}\n","import type React from \"react\";\nimport { Icon, type IconValue } from \"../Icon\";\n\nexport interface EmptyStateProps {\n icon?: IconValue;\n title: string;\n description?: string;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={[\n \"flex flex-col items-center text-center py-12 px-6\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {icon && (\n <Icon icon={icon} size=\"xl\" className=\"text-muted-foreground\" />\n )}\n <h3 className=\"text-lg font-semibold text-foreground mt-4\">\n {title}\n </h3>\n {description && (\n <p className=\"text-sm text-muted-foreground mt-2 max-w-sm\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n","import type React from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from \"react-aria-components\";\nimport { Check } from \"lucide-react\";\n\nexport interface CheckboxProps\n extends Omit<AriaCheckboxProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <AriaCheckbox\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-foreground cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected, isIndeterminate }) => (\n <>\n <div\n className={[\n \"flex items-center justify-center w-6 h-6 shrink-0\",\n \"rounded-sm border transition-colors\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-ring group-focus-visible:ring-offset-2\",\n isSelected || isIndeterminate\n ? \"bg-primary border-primary\"\n : \"bg-background border-border group-hover:border-border\",\n ].join(\" \")}\n >\n {isSelected && (\n <Check className=\"w-4 h-4 text-primary-foreground\" strokeWidth={3} />\n )}\n {isIndeterminate && (\n <div className=\"w-3 h-0.5 bg-primary-foreground 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-primary\",\n success: \"bg-success\",\n destructive: \"bg-destructive\",\n};\n\nconst presetColors = new Set<string>(Object.keys(trackColorMap));\n\nfunction isPresetColor(color: string): color is PresetColor {\n return presetColors.has(color);\n}\n\nexport function Switch({\n children,\n color = \"primary\",\n className,\n ...props\n}: SwitchProps) {\n const isPreset = isPresetColor(color);\n\n return (\n <AriaSwitch\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-foreground 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-ring group-focus-visible:ring-offset-2\",\n isSelected && isPreset\n ? trackColorMap[color]\n : !isSelected\n ? \"bg-border\"\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-background transition-transform shadow-sm\",\n isSelected ? \"translate-x-4\" : \"translate-x-0\",\n ].join(\" \")}\n />\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaSwitch>\n );\n}\n","import type React from \"react\";\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\n\nexport interface RadioGroupProps\n extends Omit<AriaRadioGroupProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport interface RadioButtonProps\n extends Omit<AriaRadioProps, \"children\" | \"className\"> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function RadioGroup({ children, className, ...props }: RadioGroupProps) {\n return (\n <AriaRadioGroup\n {...props}\n className={[\n \"flex flex-col gap-2\",\n \"disabled:opacity-50\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </AriaRadioGroup>\n );\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group flex items-center gap-2 text-sm text-foreground 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-ring group-focus-visible:ring-offset-2\",\n isSelected\n ? \"border-primary\"\n : \"border-border group-hover:border-border\",\n ].join(\" \")}\n >\n {isSelected && (\n <div className=\"w-2.5 h-2.5 rounded-full bg-primary\" />\n )}\n </div>\n {children && <span>{children}</span>}\n </>\n )}\n </AriaRadio>\n );\n}\n\nexport function RadioButton({ children, className, ...props }: RadioButtonProps) {\n return (\n <AriaRadio\n {...props}\n className={[\n \"group cursor-pointer\",\n \"disabled:opacity-50 disabled:cursor-default\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {({ isSelected }) => (\n <div\n className={[\n \"px-4 py-2 text-sm font-medium\",\n \"rounded-md border transition-colors text-center\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-ring group-focus-visible:ring-offset-2\",\n isSelected\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"bg-background border-border text-foreground hover:border-border\",\n ].join(\" \")}\n >\n {children}\n </div>\n )}\n </AriaRadio>\n );\n}\n","import type React from \"react\";\n\nexport interface FieldsetProps {\n legend?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Fieldset({ legend, children, className }: FieldsetProps) {\n return (\n <fieldset\n className={[\n \"flex flex-col gap-8\",\n \"border-none p-0 m-0\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {legend && (\n <legend\n className={[\n \"text-lg\",\n \"font-semibold\",\n \"text-foreground\",\n \"p-0\",\n ].join(\" \")}\n >\n {legend}\n </legend>\n )}\n {children}\n </fieldset>\n );\n}\n","import {\n Link as AriaLink,\n type LinkProps as AriaLinkProps,\n} from \"react-aria-components\";\n\nexport type LinkVariant = \"default\" | \"subtle\";\n\nexport interface LinkProps extends Omit<AriaLinkProps, \"className\"> {\n /** Visual style variant */\n variant?: LinkVariant;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst variantStyles: Record<LinkVariant, string> = {\n default: [\n \"text-teal-700 underline\",\n \"hover:text-teal-800\",\n ].join(\" \"),\n subtle: [\n \"text-muted-foreground no-underline\",\n \"hover:underline hover:text-foreground\",\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-ring focus-visible:ring-offset-2 focus-visible:rounded-sm\",\n variantStyles[variant],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import {\n Breadcrumbs as AriaBreadcrumbs,\n Breadcrumb as AriaBreadcrumb,\n Link,\n} from \"react-aria-components\";\nimport { ChevronRight } from \"lucide-react\";\n\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumbs({ items, className }: BreadcrumbsProps) {\n return (\n <nav\n aria-label=\"Breadcrumb\"\n className={className}\n >\n <AriaBreadcrumbs\n className=\"flex items-center gap-1 text-sm min-w-0\"\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <AriaBreadcrumb\n key={item.id}\n id={item.id}\n className={[\n \"flex items-center gap-1\",\n isLast ? \"min-w-0\" : \"shrink-0\",\n ].join(\" \")}\n >\n {isLast ? (\n <span className=\"font-medium text-foreground truncate\">\n {item.label}\n </span>\n ) : (\n <>\n <Link\n href={item.href}\n className=\"whitespace-nowrap text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:rounded-sm\"\n >\n {item.label}\n </Link>\n <ChevronRight\n className=\"shrink-0 text-slate-400\"\n size={16}\n aria-hidden=\"true\"\n />\n </>\n )}\n </AriaBreadcrumb>\n );\n })}\n </AriaBreadcrumbs>\n </nav>\n );\n}\n","import {\n ToggleButton as AriaToggleButton,\n type ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ButtonSize, sizeStyles } from \"../_shared/styles\";\n\nexport type ToggleButtonVariant = \"default\" | \"primary\" | \"outlined\";\nexport type ToggleButtonSize = ButtonSize;\n\nexport interface ToggleButtonProps extends Omit<\n AriaToggleButtonProps,\n \"className\"\n> {\n /** Visual style variant */\n variant?: ToggleButtonVariant;\n /** Size preset */\n size?: ToggleButtonSize;\n /** Use fixed square dimensions instead of padding-based sizing */\n isSquare?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst squareSizeStyles: Record<ToggleButtonSize, string> = {\n xs: \"h-6 w-6 text-xs\",\n sm: \"h-7 w-7 text-sm\",\n md: \"h-8 w-8 text-base\",\n lg: \"h-10 w-10 text-lg\",\n};\n\nconst variantStyles: Record<\n ToggleButtonVariant,\n { base: string; selected: string }\n> = {\n default: {\n base: [\n \"bg-transparent text-foreground\",\n \"hover:bg-accent\",\n \"pressed:bg-accent\",\n ].join(\" \"),\n selected: \"bg-accent text-foreground\",\n },\n primary: {\n base: [\n \"bg-transparent text-foreground\",\n \"hover:bg-accent\",\n \"pressed:bg-accent\",\n ].join(\" \"),\n selected: \"bg-primary-pressed text-primary-foreground\",\n },\n outlined: {\n base: [\n \"bg-background text-foreground\",\n \"border border-border\",\n \"hover:bg-card\",\n \"pressed:bg-muted\",\n ].join(\" \"),\n selected: [\n \"bg-slate-800 text-primary-foreground\",\n \"border border-slate-800\",\n ].join(\" \"),\n },\n};\n\nexport function ToggleButton({\n variant = \"default\",\n size = \"md\",\n isSquare = false,\n className,\n ...props\n}: ToggleButtonProps) {\n const styles = variantStyles[variant];\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected }) =>\n twMerge(\n \"inline-flex items-center justify-center gap-2 cursor-pointer\",\n isSquare ? \"rounded-none\" : \"rounded-md\",\n \"font-medium\",\n \"leading-tight\",\n \"outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-ring 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 type React from \"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 { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconValue } from \"../Icon\";\nimport { popoverStyles } from \"./menuStyles\";\n\nexport interface MenuItemData {\n id: string;\n label: string;\n icon?: IconValue;\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\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 =\n selectionMode && selectionMode !== \"none\"\n ? { selectionMode, selectedKeys, defaultSelectedKeys, onSelectionChange }\n : {};\n\n return (\n <MenuTrigger>\n {children}\n <Popover className={twMerge(popoverStyles, className)}>\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-muted\",\n \"hover:bg-muted\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n item.isDanger ? \"text-destructive\" : \"text-foreground\",\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","/** Shared popover chrome for `Menu` (click) and `useContextMenu` (right-click). */\nexport const popoverStyles = `\n bg-background rounded-md shadow-lg\n border border-border\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`;\n","import {\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Menu as AriaMenu,\n MenuTrigger,\n Popover,\n Pressable,\n type PressEvent,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { popoverStyles } from \"./menuStyles\";\n\nexport interface UseContextMenuProps {\n /** Menu body — compose `MenuItem` / `MenuSeparator` / `MenuSection`. */\n content: ReactNode;\n /** Called with the activated item key (fires alongside each item's own `onAction`). */\n onAction?: (key: string) => void;\n /** Extra classes for the menu popover. */\n className?: string;\n}\n\nexport interface UseContextMenuResult {\n /** Spread on the right-clickable element: opens the menu at the cursor. */\n targetProps: { onContextMenu: (event: React.MouseEvent) => void };\n /**\n * Spread on a keyboard/click trigger (e.g. an `IconButton`): opens the menu\n * anchored to that element. Uses the press event's target — no ref wiring.\n */\n triggerProps: { onPress: (event: PressEvent) => void };\n /** Render this wherever — it portals itself. */\n menu: ReactNode;\n isOpen: boolean;\n close: () => void;\n}\n\n/**\n * Cursor-anchored context menu. Unlike {@link Menu} (a click-triggered dropdown\n * anchored to its trigger), this opens at the pointer on right-click and stays\n * open across other right-clicks.\n *\n * Built on a controlled, **non-modal** `Popover` — non-modal so a right-click\n * on another element reaches its own handler (a modal popover's underlay would\n * swallow it and leak the native menu). Because non-modal drops React-Aria's\n * built-in outside dismiss (`isDismissable: !isNonModal`), this hook owns\n * dismissal: a right-click elsewhere closes this menu (and its target opens a\n * fresh one), any outside press closes it, and the native menu is suppressed\n * while open.\n *\n * The popover anchors to a real hidden 0×0 element moved to the cursor (or to\n * the trigger's rect for keyboard opens) — React-Aria's positioning observes\n * the trigger with a `ResizeObserver`, so a plain virtual object won't do.\n */\nexport function useContextMenu({\n content,\n onAction,\n className,\n}: UseContextMenuProps): UseContextMenuResult {\n // The anchor point in viewport coords; null when closed.\n const [anchor, setAnchor] = useState<{ x: number; y: number } | null>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const isOpen = anchor !== null;\n\n const close = useCallback(() => setAnchor(null), []);\n\n const onContextMenu = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n setAnchor({ x: event.clientX, y: event.clientY });\n }, []);\n\n const onPress = useCallback((event: PressEvent) => {\n // Anchor to the trigger's bottom-left for keyboard/click opens.\n const rect = event.target.getBoundingClientRect();\n setAnchor({ x: rect.left, y: rect.bottom });\n }, []);\n\n // Dismissal (non-modal has none of its own). Capture phase so it runs before\n // the menu's own item handlers and before other open menus.\n useEffect(() => {\n if (!isOpen) return;\n\n const isInside = (target: EventTarget | null) =>\n popoverRef.current?.contains(target as Node) ?? false;\n\n const onPointerDown = (event: PointerEvent) => {\n if (!isInside(event.target)) close();\n };\n const onOutsideContextMenu = (event: MouseEvent) => {\n if (isInside(event.target)) return;\n // Suppress the native menu; the right-clicked element's own onContextMenu\n // (if any) opens a fresh menu on this same interaction.\n event.preventDefault();\n close();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") close();\n };\n\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"contextmenu\", onOutsideContextMenu, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"contextmenu\", onOutsideContextMenu, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [isOpen, close]);\n\n const menu = (\n <MenuTrigger\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) close();\n }}\n >\n {/* Hidden anchor: MenuTrigger positions the popover at this element, which\n we move to the cursor. We open programmatically (controlled isOpen),\n never by pressing it. Pressable satisfies MenuTrigger's trigger slot. */}\n <Pressable>\n <span\n ref={anchorRef}\n aria-hidden\n className=\"pointer-events-none fixed h-0 w-0\"\n style={{ left: anchor?.x ?? 0, top: anchor?.y ?? 0 }}\n />\n </Pressable>\n <Popover\n isNonModal\n placement=\"bottom start\"\n ref={popoverRef}\n className={twMerge(popoverStyles, className)}\n >\n <AriaMenu\n autoFocus=\"first\"\n onAction={(key) => {\n onAction?.(String(key));\n close();\n }}\n className=\"outline-none\"\n >\n {content}\n </AriaMenu>\n </Popover>\n </MenuTrigger>\n );\n\n return {\n targetProps: { onContextMenu },\n triggerProps: { onPress },\n menu,\n isOpen,\n close,\n };\n}\n","import type React from \"react\";\nimport { MenuItem as AriaMenuItem } from \"react-aria-components\";\nimport { Icon, type IconValue } from \"../Icon\";\n\nexport interface MenuItemProps {\n id: string;\n /** Item label */\n children: React.ReactNode;\n icon?: IconValue;\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-muted\",\n \"hover:bg-muted\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n isDanger\n ? \"text-destructive\"\n : \"text-foreground\",\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-muted\",\n \"hover:bg-muted\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"text-foreground\",\n isSelected ? \"font-medium\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")\n }\n >\n {({ isSelected }) => (\n <>\n <span className=\"flex items-center justify-center w-4 h-4 shrink-0\">\n {isSelected && (\n <Check size={14} className=\"text-primary\" aria-hidden=\"true\" />\n )}\n </span>\n <span className=\"flex-1\">{children}</span>\n </>\n )}\n </AriaMenuItem>\n );\n}\n","import type React from \"react\";\nimport {\n MenuSection as AriaMenuSection,\n Header,\n} from \"react-aria-components\";\n\nexport interface MenuSectionProps {\n /** Optional section header — string renders as styled text, ReactNode for custom */\n header?: React.ReactNode;\n /** MenuItems within this section */\n children: React.ReactNode;\n /** Accessible label for the section group (useful when header is absent or non-textual) */\n \"aria-label\"?: string;\n className?: string;\n}\n\nexport function MenuSection({\n header,\n children,\n \"aria-label\": ariaLabel,\n className,\n}: MenuSectionProps) {\n return (\n <AriaMenuSection className={className} aria-label={ariaLabel}>\n {header && (\n <Header\n className={[\n \"px-3 py-1.5\",\n \"text-xs font-semibold\",\n \"text-muted-foreground\",\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-border my-1\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n}\n","import type React from \"react\";\nimport {\n DialogTrigger,\n Popover as AriaPopover,\n Button as AriaButton,\n type PopoverProps as AriaPopoverProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface PopoverProps {\n /** Controls open state (uncontrolled by default via DialogTrigger) */\n isOpen?: boolean;\n /** Called when open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n children: React.ReactNode;\n}\n\n/** Provides open/close state to a paired PopoverTrigger and PopoverContent. */\nexport function Popover({ children, isOpen, onOpenChange }: PopoverProps) {\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </DialogTrigger>\n );\n}\n\nexport interface PopoverTriggerProps {\n children: React.ReactNode;\n /** Additional CSS classes for the trigger wrapper */\n className?: string;\n}\n\n/** Wraps its child in an AriaButton so it can toggle the parent Popover. */\nexport function PopoverTrigger({ children, className }: PopoverTriggerProps) {\n const cx = `\n inline-flex items-center bg-transparent border-none p-0 outline-none cursor-pointer\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm\n `;\n\n return <AriaButton className={twMerge(cx, className)}>{children}</AriaButton>;\n}\n\nexport interface PopoverContentProps {\n placement?: AriaPopoverProps[\"placement\"];\n offset?: number;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Floating panel anchored to the trigger. Provides focus trap,\n * Escape-to-close, focus restore, and outside-click dismiss via RAC's\n * Popover (no Dialog wrapper needed for those behaviors).\n */\nexport function PopoverContent({\n placement = \"bottom\",\n offset: offsetPx = 8,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n const cx = `\n z-50\n bg-background\n border border-border\n rounded-md shadow-lg\n entering:animate-in entering:fade-in entering:duration-300\n exiting:animate-out exiting:fade-out exiting:duration-300\n entering:placement-top:slide-in-from-bottom-1\n entering:placement-bottom:slide-in-from-top-1\n entering:placement-left:slide-in-from-right-1\n entering:placement-right:slide-in-from-left-1\n `;\n return (\n <AriaPopover\n {...rest}\n placement={placement}\n offset={offsetPx}\n className={twMerge(cx, className)}\n >\n {children}\n </AriaPopover>\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n type TabsProps as AriaTabsProps,\n type TabListProps as AriaTabListProps,\n type TabProps as AriaTabProps,\n type TabPanelProps as AriaTabPanelProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type TabsVariant = \"underline\" | \"pills\" | \"unstyled\";\nexport type TabsSize = \"sm\" | \"md\" | \"lg\";\n\ninterface TabsContextValue {\n variant: TabsVariant;\n size: TabsSize;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: \"underline\",\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Style maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<TabsSize, string> = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-6 py-3 text-lg\",\n};\n\n// ---------------------------------------------------------------------------\n// Tabs (root)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps\n extends Omit<AriaTabsProps, \"className\" | \"orientation\"> {\n /** Visual style variant */\n variant?: TabsVariant;\n /** Size preset */\n size?: TabsSize;\n /** Layout orientation */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function Tabs({\n variant = \"underline\",\n size = \"md\",\n orientation = \"horizontal\",\n className,\n children,\n ...props\n}: TabsProps) {\n return (\n <TabsContext.Provider value={{ variant, size }}>\n <AriaTabs\n {...props}\n orientation={orientation}\n className={twMerge(\n orientation === \"vertical\" ? \"flex\" : \"\",\n className,\n )}\n >\n {children}\n </AriaTabs>\n </TabsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabList\n// ---------------------------------------------------------------------------\n\nexport interface TabListProps<T extends object>\n extends Omit<AriaTabListProps<T>, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabList<T extends object>({\n className,\n ...props\n}: TabListProps<T>) {\n const { variant } = useContext(TabsContext);\n\n const baseStyles =\n variant === \"unstyled\"\n ? \"flex items-center\"\n : variant === \"underline\"\n ? \"flex items-center border-b border-border\"\n : \"inline-flex items-center bg-muted rounded-lg p-1 gap-1\";\n\n // Vertical orientation overrides\n const verticalStyles =\n variant === \"unstyled\"\n ? \"flex-col\"\n : variant === \"underline\"\n ? \"flex-col border-b-0 border-r border-border\"\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-ring focus-visible:ring-offset-2\",\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n className,\n );\n }\n\n return twMerge(\n // Base\n \"cursor-pointer outline-none transition-colors\",\n \"font-medium\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n\n // Disabled\n isDisabled ? \"opacity-50 pointer-events-none\" : \"\",\n\n // Size\n sizeStyles[size],\n\n // Variant-specific styles\n ...getTabVariantStyles(variant, {\n isSelected,\n isHovered,\n isPressed,\n isDisabled,\n }),\n\n className,\n );\n }}\n />\n );\n}\n\nfunction getTabVariantStyles(\n variant: TabsVariant,\n state: {\n isSelected: boolean;\n isHovered: boolean;\n isPressed: boolean;\n isDisabled: boolean;\n },\n): string[] {\n if (variant === \"underline\") {\n return [\n // Shape\n \"relative rounded-t-(--border-radius-sm)\",\n\n // Color states\n state.isSelected\n ? [\n \"text-teal-700 font-semibold\",\n // Bottom indicator via pseudo-element\n \"after:absolute after:bottom-[-1px] after:left-0 after:right-0 after:h-0.5 after:bg-teal-600\",\n ].join(\" \")\n : state.isPressed\n ? \"text-foreground bg-muted\"\n : state.isHovered\n ? \"text-foreground bg-card\"\n : \"text-muted-foreground bg-transparent\",\n ];\n }\n\n // Pills variant\n return [\n // Shape\n \"rounded-md\",\n\n // Color states\n state.isSelected\n ? \"text-foreground font-semibold bg-background shadow-sm\"\n : state.isPressed\n ? \"text-foreground bg-card shadow-none\"\n : state.isHovered\n ? \"text-foreground bg-accent\"\n : \"text-muted-foreground bg-transparent\",\n ];\n}\n\n// ---------------------------------------------------------------------------\n// TabPanel\n// ---------------------------------------------------------------------------\n\nexport interface TabPanelProps extends Omit<AriaTabPanelProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function TabPanel({ className, ...props }: TabPanelProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <AriaTabPanel\n {...props}\n className={twMerge(\n variant === \"unstyled\" ? \"outline-none\" : \"mt-4 outline-none\",\n className,\n )}\n />\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n ToggleButtonGroup as AriaToggleButtonGroup,\n ToggleButton as AriaToggleButton,\n type ToggleButtonGroupProps as AriaToggleButtonGroupProps,\n type ToggleButtonProps as AriaToggleButtonProps,\n type Key,\n} from \"react-aria-components\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type SegmentedControlSize = \"sm\" | \"md\" | \"lg\";\nexport type SegmentedControlSelectionMode = \"single\" | \"none\";\n\ninterface SegmentedControlContextValue {\n size: SegmentedControlSize;\n}\n\nconst SegmentedControlContext = createContext<SegmentedControlContextValue>({\n size: \"md\",\n});\n\n// ---------------------------------------------------------------------------\n// Size maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles: Record<SegmentedControlSize, string> = {\n sm: \"px-2.5 py-1 text-xs\",\n md: \"px-3 py-1.5 text-sm\",\n lg: \"px-4 py-2 text-base\",\n};\n\n// ---------------------------------------------------------------------------\n// SegmentedControl (group)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlProps\n extends Omit<\n AriaToggleButtonGroupProps,\n \"className\" | \"selectionMode\" | \"selectedKeys\" | \"defaultSelectedKeys\" | \"onSelectionChange\"\n > {\n /** Size preset for all items */\n size?: SegmentedControlSize;\n /** Selection behavior: \"single\" keeps one item selected, \"none\" means buttons fire actions without staying selected */\n selectionMode?: SegmentedControlSelectionMode;\n /** The currently selected keys (controlled, only for selectionMode=\"single\") */\n selectedKeys?: Iterable<Key>;\n /** The initial selected keys (uncontrolled, only for selectionMode=\"single\") */\n defaultSelectedKeys?: Iterable<Key>;\n /** Called when selection changes (only for selectionMode=\"single\") */\n onSelectionChange?: (keys: Set<Key>) => void;\n /** Additional CSS classes */\n className?: string;\n children: ReactNode;\n}\n\nexport function SegmentedControl({\n size = \"md\",\n selectionMode = \"single\",\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n className,\n children,\n ...props\n}: SegmentedControlProps) {\n // For \"none\" mode: pass selectionMode=\"single\" to RAC but force selection to empty\n const isNoneMode = selectionMode === \"none\";\n\n return (\n <SegmentedControlContext.Provider value={{ size }}>\n <AriaToggleButtonGroup\n {...props}\n selectionMode=\"single\"\n selectedKeys={isNoneMode ? new Set<Key>() : selectedKeys}\n defaultSelectedKeys={isNoneMode ? undefined : defaultSelectedKeys}\n onSelectionChange={isNoneMode ? undefined : onSelectionChange}\n className={twMerge(\n \"inline-flex items-center rounded-lg border border-border bg-muted p-0.5 gap-0.5\",\n className,\n )}\n >\n {children}\n </AriaToggleButtonGroup>\n </SegmentedControlContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedControlItem (button)\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedControlItemProps\n extends Omit<AriaToggleButtonProps, \"className\"> {\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function SegmentedControlItem({\n className,\n ...props\n}: SegmentedControlItemProps) {\n const { size } = useContext(SegmentedControlContext);\n\n return (\n <AriaToggleButton\n {...props}\n className={({ isSelected, isHovered, isPressed, isDisabled }) =>\n twMerge(\n // Base layout\n \"inline-flex items-center justify-center\",\n \"rounded-md\",\n \"font-medium\",\n \"outline-none transition-colors cursor-pointer\",\n\n // Focus ring\n \"focus-visible:ring-2 focus-visible:ring-ring 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-background text-foreground shadow-sm font-semibold\"\n : isPressed\n ? \"bg-card text-foreground\"\n : isHovered\n ? \"bg-card text-foreground\"\n : \"bg-transparent text-muted-foreground\",\n\n className,\n )\n }\n />\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconValue } from \"../Icon\";\n\nexport type BadgeColor =\n | \"purple\"\n | \"teal\"\n | \"rose\"\n | \"slate\"\n | \"green\"\n | \"amber\";\n\nexport type BadgeSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface BadgeProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"color\"> {\n children?: React.ReactNode;\n color?: BadgeColor;\n size?: BadgeSize;\n icon?: IconValue;\n}\n\nconst colorStyles: Record<BadgeColor, string> = {\n purple:\n \"bg-badge-purple-bg text-badge-purple-text border-badge-purple-text/20\",\n teal: \"bg-badge-teal-bg text-badge-teal-text border-badge-teal-text/20\",\n rose: \"bg-badge-rose-bg text-badge-rose-text border-badge-rose-text/20\",\n slate: \"bg-badge-slate-bg text-badge-slate-text border-badge-slate-text/20\",\n green: \"bg-badge-green-bg text-badge-green-text border-badge-green-text/20\",\n amber: \"bg-badge-amber-bg text-badge-amber-text border-badge-amber-text/20\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-1 py-0 text-[10px]\",\n sm: \"px-1.5 py-0.5 text-xs\",\n md: \"px-2 py-0.5 text-xs\",\n lg: \"px-2.5 py-1 text-sm\",\n};\n\nexport function Badge({\n children,\n color = \"slate\",\n size = \"sm\",\n icon,\n className,\n ...rest\n}: BadgeProps) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 rounded-full border\",\n \"font-medium leading-tight tracking-wider tabular-nums\",\n colorStyles[color],\n sizeStyles[size],\n className,\n )}\n {...rest}\n >\n {icon && <Icon icon={icon} size=\"xs\" />}\n {children}\n </span>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface CardProps {\n /** Card body content */\n children: React.ReactNode;\n /** Optional header content (rendered with bottom border separator) */\n header?: React.ReactNode;\n /** Optional footer content (rendered with top border separator) */\n footer?: React.ReactNode;\n /** Merge override */\n className?: string;\n}\n\nexport function Card({ children, header, footer, className }: CardProps) {\n const cx = twMerge(\n `\n bg-card p-8\n border border-border\n rounded-lg\n shadow-sm\n `,\n className,\n );\n return (\n <div className={cx}>\n {header && <div className=\"border-b border-border\">{header}</div>}\n {children}\n {footer && <div className=\"border-t border-border\">{footer}</div>}\n </div>\n );\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-delta-increase-text\",\n decrease: \"text-delta-decrease-text\",\n flat: \"text-delta-flat-text\",\n};\n\nconst reverseDirectionColors: Record<Direction, string> = {\n increase: \"text-delta-decrease-text\",\n decrease: \"text-delta-increase-text\",\n flat: \"text-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-delta-increase-bg\",\n decrease: \"bg-delta-decrease-bg\",\n flat: \"bg-delta-flat-bg\",\n};\n\nexport function DeltaIndicator({\n current,\n previous,\n format = \"combined\",\n mode = \"inline\",\n label,\n reverseColor = false,\n unavailable = false,\n unavailableText = \"N/A\",\n className,\n}: DeltaIndicatorProps) {\n if (unavailable) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n \"text-muted-foreground\",\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-muted-foreground mr-1\">\n {label}\n </span>\n )}\n {unavailableText}\n </span>\n );\n }\n\n const diff = current - previous;\n const direction = getDirection(current, previous);\n const colorStyles = reverseColor\n ? reverseDirectionColors[direction]\n : directionColors[direction];\n const IconComponent = directionIcons[direction];\n\n const isNew = previous === 0 && current > 0;\n\n let valueText: string;\n if (format === \"currency\") {\n valueText = formatCurrency(diff);\n if (isNew) valueText = `${formatCurrency(diff)} (new)`;\n } else if (format === \"percentage\") {\n const pct = formatPercentage(current, previous);\n valueText = pct ?? formatCurrency(diff);\n if (isNew) valueText = \"New\";\n } else {\n // combined\n const pct = formatPercentage(current, previous);\n if (isNew) {\n valueText = `${formatCurrency(diff)} (new)`;\n } else if (pct) {\n valueText = `${formatCurrency(diff)} (${pct})`;\n } else {\n valueText = formatCurrency(diff);\n }\n }\n\n const isPill = mode === \"pill\";\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1 font-medium\",\n colorStyles,\n isPill && [\n \"rounded-full px-2 py-0.5\",\n \"text-xs\",\n directionBgColors[direction],\n ],\n className,\n )}\n >\n {label && (\n <span className=\"text-sm text-muted-foreground 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-progress-fill\",\n success: \"bg-progress-fill-success\",\n warning: \"bg-progress-fill-warning\",\n danger: \"bg-progress-fill-danger\",\n neutral: \"bg-muted-foreground\",\n};\n\nconst sizeStyles: Record<ProgressBarSize, string> = {\n sm: \"h-1.5\",\n md: \"h-3\",\n lg: \"h-4\",\n};\n\nexport function ProgressBar({\n value,\n label,\n description,\n variant = \"brand\",\n size = \"md\",\n showValue = true,\n className,\n}: ProgressBarProps) {\n const clampedValue = Math.min(100, Math.max(0, value));\n\n return (\n <div className={twMerge(\"w-full\", className)}>\n {(label || description || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n <span className=\"text-sm text-muted-foreground\">\n {description ?? (showValue ? `${clampedValue}%` : null)}\n </span>\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ?? \"Progress\"}\n className={twMerge(\n \"w-full rounded-full bg-progress-track\",\n sizeStyles[size],\n )}\n >\n <div\n className={twMerge(\n \"h-full rounded-full transition-all duration-300\",\n fillStyles[variant],\n )}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport {\n Info,\n AlertTriangle,\n AlertCircle,\n CheckCircle2,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconValue } from \"../Icon\";\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?: IconValue;\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-info-surface border-info-border text-info-surface-foreground\",\n iconClass: \"text-info\",\n role: \"status\",\n },\n warning: {\n icon: AlertTriangle,\n containerClass:\n \"bg-warning-surface border-warning-border text-warning-surface-foreground\",\n iconClass: \"text-warning\",\n role: \"alert\",\n },\n danger: {\n icon: AlertCircle,\n containerClass:\n \"bg-destructive-surface border-destructive-border text-destructive-surface-foreground\",\n iconClass: \"text-destructive\",\n role: \"alert\",\n },\n success: {\n icon: CheckCircle2,\n containerClass:\n \"bg-success-surface border-success-border text-success-surface-foreground\",\n iconClass: \"text-success\",\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 resolvedIcon = icon ?? config.icon;\n\n const handleDismiss = () => {\n setDismissed(true);\n onDismiss?.();\n };\n\n return (\n <div\n role={config.role}\n className={twMerge(\n \"flex items-start gap-3 rounded-lg border px-4 py-3\",\n \"text-sm\",\n config.containerClass,\n className,\n )}\n >\n <Icon\n icon={resolvedIcon}\n size=\"md\"\n className={twMerge(\"mt-0.5\", config.iconClass)}\n />\n <div className=\"flex-1\">\n {title && (\n <span className=\"font-medium\">\n {title}\n {\" \\u2014 \"}\n </span>\n )}\n {children}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n onClick={handleDismiss}\n className=\"shrink-0 rounded-sm p-0.5 opacity-70 hover:opacity-100 transition-opacity outline-none focus-visible:ring-2 focus-visible:ring-current\"\n aria-label=\"Dismiss\"\n >\n <Icon icon=\"X\" size=\"sm\" />\n </button>\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type MetricCardSize = \"sm\" | \"md\";\n\nexport interface MetricCardProps {\n /** Metric label (e.g., \"Total Spend\") */\n label: React.ReactNode;\n /** Primary value (formatted string or component) */\n value: React.ReactNode;\n /** Secondary content rendered below the value */\n secondary?: React.ReactNode;\n /** Makes the entire card a clickable link */\n href?: string;\n /** Size preset */\n size?: MetricCardSize;\n /** Merge override */\n className?: string;\n}\n\nconst sizeConfig: Record<\n MetricCardSize,\n { padding: string; labelClass: string; valueClass: string }\n> = {\n sm: {\n padding: \"p-3\",\n labelClass: \"text-xs\",\n valueClass: \"text-xl\",\n },\n md: {\n padding: \"p-4\",\n labelClass: \"text-sm\",\n valueClass: \"text-2xl\",\n },\n};\n\nexport function MetricCard({\n label,\n value,\n secondary,\n href,\n size = \"md\",\n className,\n}: MetricCardProps) {\n const config = sizeConfig[size];\n\n const containerClass = twMerge(\n \"bg-background border border-border rounded-lg shadow-sm\",\n config.padding,\n href &&\n \"block transition-shadow hover:shadow-md hover:border-ring focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 outline-none\",\n className,\n );\n\n const content = (\n <>\n <div className={twMerge(config.labelClass, \"text-muted-foreground\")}>\n {label}\n </div>\n <div\n className={twMerge(\n config.valueClass,\n \"font-semibold text-foreground 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 { forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Heading } from \"../Heading\";\nimport type { HeadingLevel } from \"../Heading\";\n\nexport interface SectionHeaderProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Section title rendered as a heading (default H2). Accepts ReactNode\n * so a Badge/pill can be composed inline, e.g.:\n * `title={<>{name} <Badge>{version}</Badge></>}` */\n title: React.ReactNode;\n /** Heading level for the title (default \"h2\") */\n as?: HeadingLevel;\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 a heading (default `<H2>`); any `children` are\n * placed in a flex container that aligns to the trailing edge.\n */\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n function SectionHeader(\n { title, as = \"h2\", children, className, ...rest },\n ref,\n ) {\n return (\n <div\n ref={ref}\n className={twMerge(\n \"flex flex-wrap items-center gap-3 pt-0 pb-4\",\n className,\n )}\n {...rest}\n >\n <Heading as={as}>{title}</Heading>\n {children && (\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {children}\n </div>\n )}\n </div>\n );\n },\n);\n","import { createContext, useContext } from \"react\";\nimport type React from \"react\";\nimport { Button as AriaButton } from \"react-aria-components\";\nimport { Tooltip } from \"../Tooltip\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type DescriptionListLayout = \"stacked\" | \"horizontal\";\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n /** Layout for all items: \"stacked\" (label above value) or \"horizontal\" (side by side) */\n layout?: DescriptionListLayout;\n className?: string;\n}\n\nexport interface DescriptionListItemProps {\n label: string;\n children: React.ReactNode;\n /** De-emphasize the value text */\n muted?: boolean;\n /** When set, wraps value in a Tooltip showing the full text (useful for truncated ETags etc.) */\n fullValue?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\nconst LayoutContext = createContext<DescriptionListLayout>(\"stacked\");\n\n/* ------------------------------------------------------------------ */\n/* DescriptionList */\n/* ------------------------------------------------------------------ */\n\nconst listGapStyles: Record<DescriptionListLayout, string> = {\n stacked: \"gap-4\",\n horizontal: \"gap-3\",\n};\n\nexport function DescriptionList({\n children,\n layout = \"stacked\",\n className,\n}: DescriptionListProps) {\n return (\n <LayoutContext.Provider value={layout}>\n <dl\n className={[\"flex flex-col\", listGapStyles[layout], className]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </dl>\n </LayoutContext.Provider>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* DescriptionList.Item */\n/* ------------------------------------------------------------------ */\n\nconst itemLayoutStyles: Record<DescriptionListLayout, string> = {\n stacked: \"flex flex-col gap-1\",\n horizontal:\n \"grid grid-cols-[140px_1fr] gap-x-(--spacing-4) items-baseline\",\n};\n\nconst labelClasses =\n \"text-sm font-medium text-foreground\";\n\nfunction DescriptionListItem({\n label,\n children,\n muted = false,\n fullValue,\n}: DescriptionListItemProps) {\n const layout = useContext(LayoutContext);\n\n const valueClasses = [\n \"text-sm m-0\",\n muted\n ? \"text-muted-foreground\"\n : \"text-foreground\",\n ].join(\" \");\n\n const valueContent = <dd className={valueClasses}>{children}</dd>;\n\n return (\n <div className={itemLayoutStyles[layout]}>\n <dt className={labelClasses}>{label}</dt>\n {fullValue ? (\n <Tooltip content={fullValue}>\n <AriaButton className=\"text-left outline-none cursor-default\">\n {valueContent}\n </AriaButton>\n </Tooltip>\n ) : (\n valueContent\n )}\n </div>\n );\n}\n\nDescriptionList.Item = DescriptionListItem;\n","import { twMerge } from \"tailwind-merge\";\nimport { Badge, type BadgeColor } from \"../Badge\";\n\nconst hashColors = [\n \"purple\",\n \"teal\",\n \"rose\",\n \"green\",\n \"amber\",\n] as const satisfies BadgeColor[];\n\nexport function pillColorFromName(name = \"\"): BadgeColor {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hashColors[Math.abs(hash) % hashColors.length];\n}\n\nexport interface PathPillProps {\n children: string;\n visibleCount?: number;\n colorFn?: (segment: string, index: number) => BadgeColor;\n className?: string;\n}\n\nexport function PathPill({\n children,\n visibleCount,\n colorFn,\n className,\n}: PathPillProps) {\n const segments = children.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) return null;\n\n const effectiveVisible = visibleCount ?? segments.length;\n const dotCount = Math.max(0, segments.length - effectiveVisible);\n const fullPath = segments.join(\" / \");\n\n return (\n <div\n className={twMerge(\"relative flex\", className)}\n aria-label={`Path: ${fullPath}`}\n >\n {segments.map((segment, i) => {\n const isCollapsed = i < dotCount;\n const isLast = i === segments.length - 1;\n const cx = twMerge(!isLast && \"pr-5 -mr-4\", isCollapsed && \"pr-3\");\n const color = colorFn ? colorFn(segment, i) : pillColorFromName(segment);\n return (\n <Badge\n key={`pill-${i}-${segment}`}\n className={cx}\n color={color}\n aria-hidden={isCollapsed || undefined}\n >\n {isCollapsed ? undefined : segment}\n </Badge>\n );\n })}\n </div>\n );\n}\n","import { createContext, useContext, useCallback, useMemo } from \"react\";\nimport type React from \"react\";\n\nexport interface FormWizardContextValue {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Whether the user can navigate backwards */\n canGoBack: boolean;\n /** Navigate to the previous step */\n goBack: () => void;\n /** Whether the current step is the last step */\n isLastStep: boolean;\n}\n\nconst FormWizardContext = createContext<FormWizardContextValue>({\n currentStep: 0,\n totalSteps: 1,\n canGoBack: false,\n goBack: () => {},\n isLastStep: true,\n});\n\nexport function useFormWizard(): FormWizardContextValue {\n return useContext(FormWizardContext);\n}\n\nexport interface FormWizardProps {\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Total number of steps in the wizard */\n totalSteps: number;\n /** Callback invoked when the step should change */\n onStepChange: (step: number) => void;\n /** Wizard content (step panels, progress indicator, navigation) */\n children: React.ReactNode;\n}\n\nexport function FormWizard({\n currentStep,\n totalSteps,\n onStepChange,\n children,\n}: FormWizardProps) {\n const canGoBack = currentStep > 0;\n const isLastStep = currentStep >= totalSteps - 1;\n\n const goBack = useCallback(() => {\n if (currentStep > 0) {\n onStepChange(currentStep - 1);\n }\n }, [currentStep, onStepChange]);\n\n const value = useMemo<FormWizardContextValue>(\n () => ({\n currentStep,\n totalSteps,\n canGoBack,\n goBack,\n isLastStep,\n }),\n [currentStep, totalSteps, canGoBack, goBack, isLastStep],\n );\n\n return (\n <FormWizardContext.Provider value={value}>\n {children}\n </FormWizardContext.Provider>\n );\n}\n","import { useFormWizard } from \"./FormWizard\";\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-primary-foreground\"\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-primary\"\n : \"bg-border\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n\n {/* Step circle */}\n <div\n className={[\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full\",\n \"text-sm font-medium\",\n \"transition-colors\",\n isCompleted\n ? \"bg-primary text-primary-foreground\"\n : \"\",\n isCurrent\n ? \"border-2 border-primary bg-background text-primary\"\n : \"\",\n isFuture\n ? \"border-2 border-border bg-background text-muted-foreground\"\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-primary\"\n : \"bg-border\",\n ].join(\" \")}\n />\n ) : (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Label */}\n <span\n className={[\n \"mt-2 text-center text-sm\",\n isCurrent\n ? \"font-semibold text-foreground\"\n : \"font-normal text-muted-foreground\",\n ].join(\" \")}\n >\n {label}\n </span>\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { Button } from \"../Button\";\nimport { useFormWizard } from \"./FormWizard\";\n\nexport interface FormWizardNavProps {\n /** Callback invoked when the user presses Next or Submit */\n onNext: () => void;\n /** Whether the form is currently submitting (shows loading state on the submit button) */\n isSubmitting?: boolean;\n /** Label for the submit button on the last step (defaults to \"Submit\") */\n submitLabel?: string;\n}\n\nexport function FormWizardNav({\n onNext,\n isSubmitting = false,\n submitLabel = \"Submit\",\n}: FormWizardNavProps) {\n const { canGoBack, goBack, isLastStep } = useFormWizard();\n\n return (\n <div className=\"flex items-center justify-end gap-3\">\n {canGoBack && (\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onPress={goBack}\n isDisabled={isSubmitting}\n >\n Back\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"lg\"\n onPress={onNext}\n isLoading={isSubmitting}\n >\n {isLastStep ? submitLabel : \"Next\"}\n </Button>\n </div>\n );\n}\n"],"mappings":"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","names":["twMerge","jsx","LinkedinIcon","forwardRef","jsx","GithubIcon","jsx","twMerge","jsx","twMerge","jsx","jsxs","twMerge","forwardRef","twMerge","jsx","sizeMap","Heading","Tag","H1","H2","H3","H4","H5","H6","forwardRef","twMerge","jsx","Prose","forwardRef","twMerge","jsx","sizeClasses","Description","jsx","jsxs","useRef","useRef","useState","useLayoutEffect","useState","startLen","endLen","useLayoutEffect","useState","jsx","jsxs","useRef","AriaButton","AriaLink","twMerge","jsx","twMerge","AriaButton","AriaLink","twMerge","jsx","jsxs","jsx","jsxs","twMerge","forwardRef","useState","Eye","EyeOff","twMerge","jsx","jsxs","forwardRef","InputPassword","useState","twMerge","EyeOff","Eye","Check","ChevronDown","Button","Text","twMerge","jsx","jsxs","twMerge","Button","ChevronDown","Text","Check","twMerge","jsx","jsxs","Table","Heading","X","Fragment","jsx","jsxs","sizeStyles","jsx","useCallback","useEffect","useRef","useState","createPortal","CheckCircle","XCircle","Info","X","jsx","jsxs","jsx","jsxs","Check","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","AriaLink","jsx","variantStyles","Link","ChevronRight","Fragment","jsx","jsxs","AriaToggleButton","twMerge","jsx","squareSizeStyles","variantStyles","AriaToggleButton","twMerge","Popover","twMerge","jsx","jsxs","Menu","Popover","twMerge","useCallback","useEffect","useRef","useState","AriaMenu","MenuTrigger","Popover","twMerge","jsx","jsxs","useState","useRef","useCallback","useEffect","MenuTrigger","Popover","twMerge","AriaMenu","AriaMenuItem","jsx","jsxs","AriaMenuItem","AriaMenuItem","Check","Fragment","jsx","jsxs","jsx","jsxs","Header","jsx","jsx","AriaButton","twMerge","jsx","Popover","createContext","useContext","twMerge","jsx","sizeStyles","Tabs","TabList","Tab","TabPanel","createContext","useContext","twMerge","AriaToggleButton","jsx","sizeStyles","twMerge","jsx","jsxs","sizeStyles","twMerge","twMerge","jsx","jsxs","ArrowUp","ArrowDown","Minus","twMerge","jsx","jsxs","colorStyles","twMerge","jsx","jsxs","sizeStyles","useState","Info","AlertTriangle","AlertCircle","CheckCircle2","twMerge","jsx","jsxs","variantConfig","Info","AlertTriangle","AlertCircle","CheckCircle2","useState","twMerge","twMerge","Fragment","jsx","jsxs","forwardRef","twMerge","jsx","jsxs","forwardRef","SectionHeader","twMerge","createContext","useContext","AriaButton","jsx","jsxs","createContext","useContext","AriaButton","twMerge","jsx","twMerge","createContext","useContext","useCallback","jsx","jsx","jsxs","jsx","jsxs"]}
|