@candidhealth/react-vitals 1.0.0-alpha.13 → 1.0.0-alpha.15
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.mts +751 -60
- package/dist/index.d.ts +751 -60
- package/dist/index.js +257 -423
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +247 -405
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../avatar/Avatar.tsx","../text/Text.tsx","../avatar/AvatarGroup.tsx","../popover/Popover.tsx","../twMerge.ts","../button/Button.tsx","../button/buttonStyles.ts","../button/ButtonGroup.tsx","../tooltip/Tooltip.tsx","../utils/useOverflowObserver.tsx","../avatar/AvatarWithName.tsx","../callout/Callout.tsx","../icon/Icon.tsx","../card/Card.tsx","../checkbox/Checkbox.tsx","../collapsible/Collapsible.tsx","../collapsible-section/CollapsibleSection.tsx","../utils/useToggle.tsx","../utils/create-context-helper.tsx","../copyable/Copyable.tsx","../copyable/use-copyable.ts","../date-picker/DatePickerRange.tsx","../date-picker/DatePickerHeader.tsx","../date-picker/shared.tsx","../date-picker/DatePickerInput.tsx","../date-picker/TimeInput.tsx","../input/InputBox.tsx","../input/inputBoxStyles.ts","../date-picker/DatePickerSingle.tsx","../date-picker/DatePicker.tsx","../divider/Divider.tsx","../error-text/ErrorText.tsx","../form/components/ControlledField.tsx","../form/hooks.ts","../form/components/UncontrolledField.tsx","../form/utils.ts","../form/components/form-item/index.tsx","../form/components/form-item/InlineFormItem.tsx","../form/components/form-item/FieldErrorTooltip.tsx","../form/components/form-item/NoneFormItem.tsx","../form/components/form-item/FieldDescription.tsx","../form/components/form-item/FieldErrorMessage.tsx","../overflow-tooltip/OverflowTooltip.tsx","../form/components/form-item/FieldLabelWithTooltip.tsx","../form/components/form-item/FieldLabel.tsx","../form/components/form-item/SideBySideFormItem.tsx","../form/components/form-item/StackedFormItem.tsx","../form/components/FormInput.tsx","../form/components/FormDollarInput.tsx","../utils/useSyncState.ts","../form/components/FormPercentInput.tsx","../form/components/FormCheckbox.tsx","../form/components/ControlledFormItem.tsx","../select/props.ts","../select/selectItem.ts","../select/useAsyncMultiSelect.ts","../select/AsyncMultiSelect.tsx","../dropdown-chevron/DropdownChevron.tsx","../select/SelectListItem.tsx","../select/AsyncSelect.tsx","../select/MultiSelect.tsx","../select/Select.tsx","../select/SelectWtihUnselect.tsx","../form/components/FormSelect.tsx","../form/components/FormMultiSelect.tsx","../form/components/FormTextArea.tsx","../textarea/TextArea.tsx","../form/components/FormSwitch.tsx","../switch/Switch.tsx","../radio-button-group/RadioButtonGroup.tsx","../radio-button-group/RadioButtonItem.tsx","../form/components/FormRadioButtonGroup.tsx","../form/components/FormDatePicker.tsx","../drawer/Drawer.tsx","../loaders/Spinner.tsx","../loaders/LoadingState.tsx","../loaders/LoadingBar.tsx","../loaders/TwoCirclesSpinner.tsx","../drawer/drawerState.ts","../drawer/useDrawerResize.ts","../drawer/DrawerHeader.tsx","../skeleton/Skeleton.tsx","../skeleton/TabsSkeleton/TabsSkeleton.tsx","../skeleton/TableSkeleton/TableSkeleton.tsx","../skeleton/TableSkeleton/TableCheckboxSkeleton.tsx","../empty-state/EmptyState.tsx","../header-tile/HeaderTile.tsx","../header-tile/HeaderTileGroup.tsx","../label/Label.tsx","../label/labelStyles.ts","../layouts/PageContainer.tsx","../menu/Menu.tsx","../modal/components/ModalActions.tsx","../modal/components/ModalBody.tsx","../modal/components/ModalCloseButton.tsx","../modal/components/ModalContent.tsx","../modal/components/ModalDescription.tsx","../modal/components/ModalErrorCallout.tsx","../modal/components/ModalRoot.tsx","../modal/components/ModalTitle.tsx","../modal/components/ModalCloseX.tsx","../modal/components/ModalTriggerButton.tsx","../modal/Modal.tsx","../modal/FullscreenModal.tsx","../modal/FullscreenModalHeader.tsx","../modal/AlertModal.tsx","../phone-number/PhoneNumber.tsx","../stepper/Stepper.tsx","../table/Table.tsx","../utils/useIntersectionObserver.ts","../table/TableBody.tsx","../table/TableRow.tsx","../table/utils.ts","../table/TableHeader.tsx","../table/VirtualizedTable.tsx","../table/useTable.ts","../table/useColumnResizing.ts","../tab-group/TabGroup.tsx","../tabs/Tabs.tsx","../tabs/Trigger.tsx","../tabs/ScrollTabsLayout.tsx","../tabs/ComposableTabs.tsx","../tag/Tag.tsx","../utils/useIsHovered.ts"],"sourcesContent":["import { ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Text } from \"@/core/text\";\n\nexport type AvatarVariant = \"active\" | \"inactive\";\nexport type AvatarSize = \"sm\" | \"md\";\n\nconst getInitials = (name: string): string => {\n\tconst trimmed = name.trim();\n\tif (trimmed.includes(\" \")) {\n\t\tconst parts = trimmed.split(\" \");\n\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\treturn (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n\t}\n\treturn trimmed.slice(0, 2).toUpperCase();\n};\n\nexport type AvatarProps = ComponentPropsWithoutRef<\"div\"> & {\n\tname: string;\n\tvariant?: AvatarVariant;\n\tsize?: AvatarSize;\n};\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n\t({ name, variant = \"active\", size = \"md\", className, ...props }, ref) => {\n\t\tconst initials = getInitials(name);\n\t\tconst isActive = variant === \"active\";\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"flex items-center justify-center rounded-full border border-indigo-200\",\n\t\t\t\t\tisActive ? \"bg-indigo-100\" : \"bg-indigo-50\",\n\t\t\t\t\tsize == \"md\" && \"size-8.5\",\n\t\t\t\t\tsize == \"sm\" && \"size-7\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<Text className={twJoin(\"font-semibold text-muted\", !isActive && \"opacity-50\")}>{initials}</Text>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { forwardRef, type ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport type TextTagElementMap = {\n\th1: HTMLHeadingElement;\n\th2: HTMLHeadingElement;\n\th3: HTMLHeadingElement;\n\th4: HTMLHeadingElement;\n\th5: HTMLHeadingElement;\n\th6: HTMLHeadingElement;\n\tp: HTMLParagraphElement;\n\tspan: HTMLSpanElement;\n\tlabel: HTMLLabelElement;\n};\n\nexport type TextTag = keyof TextTagElementMap;\n\nconst VARIANT_STYLES = {\n\t\"marketing-headline\": \"text-marketing-headline\",\n\t\"headline-1\": \"text-headline-1\",\n\t\"headline-2\": \"text-headline-2\",\n\t\"headline-3\": \"text-headline-3\",\n\t\"headline-4\": \"text-headline-4\",\n\t\"title-1\": \"text-title-1\",\n\t\"title-2\": \"text-title-2\",\n\t\"title-3\": \"text-title-3\",\n\t\"body-1\": \"text-body-1\",\n\t\"body-2\": \"text-body-2\",\n\tlabel: \"text-label\",\n\tfootnote: \"text-footnote\",\n\tsmallcaps: \"text-smallcaps uppercase\",\n} as const;\n\nexport type TextVariant =\n\t| \"marketing-headline\"\n\t| \"headline-1\"\n\t| \"headline-2\"\n\t| \"headline-3\"\n\t| \"headline-4\"\n\t| \"title-1\"\n\t| \"title-2\"\n\t| \"title-3\"\n\t| \"body-1\"\n\t| \"body-2\"\n\t| \"label\"\n\t| \"footnote\"\n\t| \"smallcaps\";\n\n/**\n * Props specific to Text component (excluding native HTML props)\n */\nexport type TextOwnProps<T extends TextTag = \"p\"> = {\n\t/**\n\t * The HTML tag to render\n\t * @default \"p\"\n\t */\n\tas?: T;\n\t/**\n\t * Typography variant to apply\n\t * @default \"body-1\"\n\t */\n\tvariant?: TextVariant;\n\t/**\n\t * Content to render\n\t */\n\tchildren: ReactNode;\n};\n\n/**\n * Full component props combining Text-specific props with native HTML element props\n */\nexport type TextProps<T extends TextTag = \"p\"> = TextOwnProps<T> & Omit<JSX.IntrinsicElements[T], keyof TextOwnProps>;\n\n/**\n * @summary A typography component for rendering styled text with semantic HTML tags.\n *\n * @description This component provides a consistent way to render text with proper semantic HTML\n * while maintaining design system typography. It is extendable but closed for modification.\n * The component is fully type-safe and provides proper autocompletion for all native HTML\n * attributes based on the selected tag.\n *\n * @example Basic Usage (defaults to <p> tag)\n * <Text>Default paragraph text</Text>\n *\n * @example With Custom Tags (fully typed)\n * <Text as=\"h1\">Heading Text</Text>\n * <Text as=\"span\">Inline Text</Text>\n *\n * @example Type Safety - Native Props\n * // ✓ Valid: span supports onClick\n * <Text as=\"span\" onClick={() => console.log('clicked')}>\n * Clickable text\n * </Text>\n *\n * // ✓ Valid: h1 supports id\n * <Text as=\"h1\" id=\"page-title\">\n * Page Title\n * </Text>\n *\n * @example Extendable with className\n * <Text className=\"text-blue-500 font-bold\">\n * Custom styled text\n * </Text>\n *\n * @example With Variants\n * <Text variant=\"headline-1\">Large Heading</Text>\n * <Text variant=\"body-1\">Body text</Text>\n * <Text variant=\"footnote\">Label text</Text>\n */\nconst TextInner = <T extends TextTag = \"p\">(\n\t{ as, variant = \"body-1\", children, className, ...props }: TextProps<T>,\n\tref: React.ForwardedRef<TextTagElementMap[T]>,\n) => {\n\tconst Tag = as ?? \"p\";\n\n\treturn (\n\t\t<Tag {...(props as any)} className={twJoin(VARIANT_STYLES[variant], className)} ref={ref}>\n\t\t\t{children}\n\t\t</Tag>\n\t);\n};\n\nexport const Text = forwardRef(TextInner) as <T extends TextTag = \"p\">(\n\tprops: TextProps<T> & { ref?: React.ForwardedRef<TextTagElementMap[T]> },\n) => React.ReactElement;\n","import React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Popover } from \"@/core/popover\";\nimport { Text } from \"@/core/text\";\nimport { Tooltip } from \"@/core/tooltip\";\n\nimport { Avatar, AvatarSize, AvatarVariant } from \"./Avatar\";\nimport { AvatarWithName } from \"./AvatarWithName\";\n\nexport type AvatarGroupItem = {\n\tname: string;\n\tvariant?: AvatarVariant;\n\ttooltipContent?: React.ReactNode;\n};\n\nexport type AvatarGroupProps = {\n\titems: AvatarGroupItem[];\n\tmaxVisible?: number;\n\toverflowTitle?: string;\n\tsize?: AvatarSize;\n};\n\nexport const AvatarGroup = ({ items, maxVisible = 3, overflowTitle, size = \"md\" }: AvatarGroupProps) => {\n\tconst visibleItems = items.slice(0, maxVisible);\n\tconst overflowItems = items.slice(maxVisible);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={twJoin(\"flex\", size === \"md\" && \"-space-x-2\", size === \"sm\" && \"-space-x-1.5\")}\n\t\t\tfs-id=\"FSRecentViewers\"\n\t\t>\n\t\t\t{visibleItems.map((item, i) => (\n\t\t\t\t<Tooltip\n\t\t\t\t\tkey={`${item.name}-${i}`}\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<span className=\"relative\" style={{ zIndex: visibleItems.length - i }}>\n\t\t\t\t\t\t\t<Avatar name={item.name} variant={item.variant} size={size} />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t\tcontent={item.tooltipContent}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t<Popover\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center rounded-full border border-surface-neutral bg-surface-neutral\",\n\t\t\t\t\t\t\t\tsize === \"md\" && \"size-8.5\",\n\t\t\t\t\t\t\t\tsize === \"sm\" && \"size-7\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tfs-id=\"FSRecentViewersOverflowTrigger\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text className=\"font-semibold text-muted\">+{overflowItems.length}</Text>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t\tcontentClassName={twJoin(size === \"md\" && \"p-3\", size === \"sm\" && \"p-2\")}\n\t\t\t\t>\n\t\t\t\t\t{overflowTitle && <Text className=\"mb-2 font-semibold text-muted\">{overflowTitle}</Text>}\n\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t{overflowItems.map((item, i) => (\n\t\t\t\t\t\t\t<AvatarWithName key={`${item.name}-${i}`} name={item.name} variant={item.variant} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</Popover>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import * as RadixPopover from \"@radix-ui/react-popover\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Button, ButtonProps } from \"../button\";\n\nexport type Align = \"start\" | \"center\" | \"end\";\nexport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport type PopoverProps = {\n\ttriggerClassName?: string;\n\ttrigger: React.ReactNode;\n\topen?: boolean;\n\tdisabled?: boolean;\n\talignContent?: Align;\n\tside?: Side;\n\tarrowClassName?: string;\n\tcontentClassName?: string;\n\tchildren: React.ReactNode;\n\n\tonOpenChange?: (open: boolean) => void;\n};\n\nexport const Popover = ({\n\topen,\n\ttrigger,\n\ttriggerClassName,\n\tchildren,\n\tarrowClassName,\n\tcontentClassName,\n\tdisabled,\n\tonOpenChange,\n\talignContent,\n\tcontainer,\n\t...props\n}: PopoverProps & PopoverBodyProps) => (\n\t<RadixPopover.Root open={open} onOpenChange={onOpenChange}>\n\t\t<RadixPopover.Trigger asChild disabled={disabled} className={triggerClassName}>\n\t\t\t{trigger}\n\t\t</RadixPopover.Trigger>\n\t\t<PopoverBody\n\t\t\talign={alignContent}\n\t\t\t{...props}\n\t\t\tcontentClassName={contentClassName}\n\t\t\tarrowClassName={arrowClassName}\n\t\t\tcontainer={container}\n\t\t>\n\t\t\t{children}\n\t\t</PopoverBody>\n\t</RadixPopover.Root>\n);\n\nexport type PopoverBodyProps = {\n\talign?: Align;\n\tside?: Side;\n\tarrowClassName?: string;\n\tcontentClassName?: string;\n\tchildren: React.ReactNode;\n\tcontainer?: Element;\n};\nconst PopoverBody = ({ children, arrowClassName, contentClassName, container, ...props }: PopoverBodyProps) => {\n\treturn (\n\t\t<RadixPopover.Portal container={container}>\n\t\t\t<RadixPopover.Content\n\t\t\t\t{...props}\n\t\t\t\tclassName={twMerge(\"isolate z-50 rounded-lg bg-white shadow-lg focus:outline-hidden\", contentClassName)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<RadixPopover.Arrow className={twMerge(\"fill-white\", arrowClassName)} offset={8} />\n\t\t\t</RadixPopover.Content>\n\t\t</RadixPopover.Portal>\n\t);\n};\n\nPopover.Root = (props: RadixPopover.PopoverProps) => <RadixPopover.Root {...props} />;\nPopover.Trigger = (props: ButtonProps) => (\n\t<RadixPopover.Trigger asChild>\n\t\t<Button {...props} />\n\t</RadixPopover.Trigger>\n);\nPopover.Body = PopoverBody;\nPopover.Close = (props: RadixPopover.PopoverCloseProps) => <RadixPopover.Close asChild {...props} />;\n","import { extendTailwindMerge } from \"tailwind-merge\";\n\nexport const twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t\"text-marketing-headline\",\n\t\t\t\t\"text-headline-1\",\n\t\t\t\t\"text-headline-2\",\n\t\t\t\t\"text-headline-3\",\n\t\t\t\t\"text-headline-4\",\n\t\t\t\t\"text-title-1\",\n\t\t\t\t\"text-title-2\",\n\t\t\t\t\"text-title-3\",\n\t\t\t\t\"text-body-1\",\n\t\t\t\t\"text-body-2\",\n\t\t\t\t\"text-label\",\n\t\t\t\t\"text-footnote\",\n\t\t\t\t\"text-smallcaps\",\n\t\t\t],\n\t\t\t\"text-color\": [\n\t\t\t\t\"text-dark\",\n\t\t\t\t\"text-neutral\",\n\t\t\t\t\"text-muted\",\n\t\t\t\t\"text-disabled\",\n\t\t\t\t\"text-placeholder\",\n\t\t\t\t\"text-primary\",\n\t\t\t\t\"text-warning\",\n\t\t\t\t\"text-success\",\n\t\t\t\t\"text-danger\",\n\t\t\t],\n\t\t\t\"bg-color\": [\n\t\t\t\t\"bg-surface-dark\",\n\t\t\t\t\"bg-surface-primary\",\n\t\t\t\t\"bg-surface-neutral\",\n\t\t\t\t\"bg-surface-light\",\n\t\t\t\t\"bg-surface-success\",\n\t\t\t\t\"bg-surface-danger\",\n\t\t\t\t\"bg-surface-warning\",\n\t\t\t\t\"bg-button-white\",\n\t\t\t\t\"bg-button-white-hover\",\n\t\t\t\t\"bg-button-white-pressed\",\n\t\t\t\t\"bg-button-white-disabled\",\n\t\t\t\t\"bg-button-primary\",\n\t\t\t\t\"bg-button-primary-hover\",\n\t\t\t\t\"bg-button-primary-pressed\",\n\t\t\t\t\"bg-button-primary-disabled\",\n\t\t\t\t\"bg-button-danger\",\n\t\t\t\t\"bg-button-danger-hover\",\n\t\t\t\t\"bg-button-danger-pressed\",\n\t\t\t\t\"bg-button-danger-disabled\",\n\t\t\t],\n\t\t\tanimate: [\n\t\t\t\t\"animate-quick-spin\",\n\t\t\t\t\"animate-fade-in\",\n\t\t\t\t\"animate-fade-in-custom-easing\",\n\t\t\t\t\"animate-fade-in-subtle-movement\",\n\t\t\t\t\"animate-skeleton-pulse\",\n\t\t\t\t\"animate-loading-pulse\",\n\t\t\t\t\"animate-collapsible-up\",\n\t\t\t\t\"animate-collapsible-down\",\n\t\t\t\t\"animate-loading-slide\",\n\t\t\t\t\"animate-orbit-large\",\n\t\t\t\t\"animate-orbit-small\",\n\t\t\t],\n\t\t},\n\t},\n});\n","import * as React from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ButtonStyleProps, buttonStyles } from \"./buttonStyles\";\n\nexport type ButtonProps = Simplify<ButtonStyleProps & React.ComponentPropsWithoutRef<\"button\">>;\n\nconst ButtonImpl = (\n\t{\n\t\tfullWidth,\n\t\tsize,\n\t\tintent,\n\t\tvariant,\n\t\tdisabled,\n\t\tloading,\n\t\tsoften,\n\t\troundedness,\n\t\tclassName,\n\t\tchildren,\n\t\t...rest\n\t}: ButtonProps,\n\tref: React.ForwardedRef<HTMLButtonElement>,\n) => {\n\treturn (\n\t\t<button\n\t\t\t// these props can be overridden by {...rest}\n\t\t\ttype=\"button\"\n\t\t\tclassName={twMerge(buttonStyles({ fullWidth, size, intent, variant, loading, soften, roundedness }), className)}\n\t\t\t// spread in props that can be used as-is\n\t\t\t{...rest}\n\t\t\t// these props won't be overridden as they come after {...rest}\n\t\t\tref={ref}\n\t\t\tdisabled={disabled || loading}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n};\n\nexport const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>> =\n\tReact.forwardRef(ButtonImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Intent, Size, Soften, Variant } from \"../variants\";\n\nexport const linkStyles =\n\t\"text-indigo-600 hover:underline active:text-indigo-400 focus:outline-indigo-400 focus:outline-offset-2\";\n\nexport type ButtonSize = Extract<Size, \"xs\" | \"sm\" | \"md\" | \"lg\">;\nexport type ButtonIntent = Extract<Intent, \"primary\" | \"default\" | \"danger\"> | \"error\";\nexport type ButtonRoundedness = \"default\" | \"large\";\n\nexport type ButtonStyleProps = {\n\tfullWidth?: boolean;\n\tsize?: ButtonSize;\n\tintent?: ButtonIntent;\n\tvariant?: Variant;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tsoften?: Soften;\n\troundedness?: ButtonRoundedness;\n};\n\nconst roundedMdStyles: Record<Soften, string> = {\n\tnone: \"\",\n\tright: \"rounded-r-md\",\n\tleft: \"rounded-l-md\",\n\tboth: \"rounded-md\",\n};\nconst roundedLgStyles: Record<Soften, string> = {\n\tnone: \"\",\n\tright: \"rounded-r-lg\",\n\tleft: \"rounded-l-lg\",\n\tboth: \"rounded-lg\",\n};\nconst roundedXlStyles: Record<Soften, string> = {\n\tnone: \"\",\n\tright: \"rounded-r-xl\",\n\tleft: \"rounded-l-xl\",\n\tboth: \"rounded-xl\",\n};\nconst borderRadiusStyles: Record<ButtonRoundedness, Record<ButtonSize, Record<Soften, string>>> = {\n\tdefault: {\n\t\txs: roundedMdStyles,\n\t\tsm: roundedMdStyles,\n\t\tmd: roundedMdStyles,\n\t\tlg: roundedLgStyles,\n\t},\n\tlarge: {\n\t\txs: roundedLgStyles,\n\t\tsm: roundedLgStyles,\n\t\tmd: roundedLgStyles,\n\t\tlg: roundedXlStyles,\n\t},\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n\txs: \"h-xs gap-1 px-2 text-body-2\",\n\tsm: \"h-sm gap-1 px-2 text-body-2\",\n\tmd: \"h-md gap-1.5 px-3 text-body-1\",\n\tlg: \"h-lg gap-2 px-4 text-title-2\",\n};\n\nconst colorStyles: Record<Variant, Record<ButtonIntent, string>> = {\n\tdefault: {\n\t\tprimary:\n\t\t\t\"bg-button-primary hover:bg-button-primary-hover data-[state='open']:bg-button-primary-hover border border-button-primary hover:border-button-primary-hover text-white\",\n\t\tdefault:\n\t\t\t\"bg-button-white hover:bg-button-white-hover data-[state='open']:bg-button-white-hover border border-button-white text-neutral\",\n\t\tdanger:\n\t\t\t\"bg-button-danger hover:bg-button-danger-hover data-[state='open']:bg-button-danger-hover border border-button-danger text-white\",\n\t\terror: \"bg-white hover:bg-red-50 data-[state='open']:bg-red-50 text-red-500 border border-red-300\",\n\t},\n\ttransparent: {\n\t\tprimary: \"bg-indigo-900/0 hover:bg-indigo-900/10 data-[state='open']:bg-indigo-900/10 text-indigo-700\",\n\t\tdefault: \"bg-gray-900/0 hover:bg-gray-900/10 data-[state='open']:bg-gray-900/10 text-neutral\",\n\t\tdanger: \"bg-red-900/0 hover:bg-red-900/10 data-[state='open']:bg-red-900/10 text-red-700\",\n\t\terror: \"bg-red-900/0 hover:bg-red-900/10 data-[state='open']:bg-red-900/10 text-red-500\",\n\t},\n\tdark: {\n\t\tprimary:\n\t\t\t\"bg-indigo-600 hover:bg-indigo-700 data-[state='open']:bg-indigo-700 border border-button-primary text-white\",\n\t\tdefault: \"bg-gray-900 hover:bg-gray-600 data-[state='open']:bg-gray-600 text-white\",\n\t\tdanger: \"bg-button-danger hover:bg-button-danger-hover data-[state='open']:bg-button-danger-hover text-white\",\n\t\terror: \"bg-white hover:bg-red-50 data-[state='open']:bg-red-50 text-red-500\",\n\t},\n};\n\nexport const buttonStyles = ({\n\tfullWidth = false,\n\tsize = \"md\",\n\tintent = \"default\",\n\tvariant = \"default\",\n\tsoften = \"both\",\n\tloading,\n\troundedness = \"default\",\n}: Omit<ButtonStyleProps, \"disabled\">) => {\n\treturn twJoin(\n\t\t\"flex items-center justify-center whitespace-nowrap focus-visible:ring-2 focus-visible:ring-indigo-400 focus-visible:ring-inset disabled:pointer-events-none disabled:opacity-50\",\n\t\tfullWidth && \"w-full\",\n\t\tborderRadiusStyles[roundedness][size][soften],\n\t\tsizeStyles[size],\n\t\tcolorStyles[variant][intent],\n\t\tloading && \"animate-loading-pulse\",\n\t);\n};\n","import { Button, ButtonProps } from \"./Button\";\n\nexport type ButtonGroupProps<TValue extends string | number> = {\n\tsize?: ButtonProps[\"size\"];\n\tvalue: TValue;\n\tonChange: (value: TValue) => void;\n\tbuttons: readonly {\n\t\tcontent: React.ReactNode;\n\t\tvalue: TValue;\n\t}[];\n};\n\nexport const ButtonGroup = <TValue extends string | number>({\n\tsize,\n\tvalue,\n\tonChange,\n\tbuttons,\n}: ButtonGroupProps<TValue>) => (\n\t<div className=\"flex\">\n\t\t{buttons.map((button, i) => (\n\t\t\t<Button\n\t\t\t\tsize={size}\n\t\t\t\tkey={button.value}\n\t\t\t\tonClick={() => onChange(button.value)}\n\t\t\t\tsoften={i === 0 ? \"left\" : i === buttons.length - 1 ? \"right\" : \"none\"}\n\t\t\t\tintent={value === button.value ? \"primary\" : undefined}\n\t\t\t>\n\t\t\t\t{button.content}\n\t\t\t</Button>\n\t\t))}\n\t</div>\n);\n","import * as RadixTooltip from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { useOverflowObserver } from \"@/core/utils/useOverflowObserver\";\n\nexport type TooltipContentProps = Pick<RadixTooltip.TooltipContentProps, \"side\"> & {\n\tchildren: React.ReactNode;\n\tvariant?: \"dark\" | \"light\";\n};\nconst TooltipContent = ({ children, variant = \"dark\", ...rest }: TooltipContentProps) => {\n\treturn (\n\t\t<RadixTooltip.Portal>\n\t\t\t<RadixTooltip.Content\n\t\t\t\t{...rest}\n\t\t\t\thideWhenDetached\n\t\t\t\tsideOffset={6}\n\t\t\t\t// TODO: remove z-index once z-index wars settle down\n\t\t\t\t// currently modal bg in /app is z-100\n\t\t\t\tclassName={`z-9000000000 max-w-prose rounded-lg px-5 py-3 text-sm wrap-break-word shadow-lg ${\n\t\t\t\t\tvariant === \"dark\" ? \"bg-gray-900 text-white\" : \"bg-white text-gray-600\"\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<RadixTooltip.Arrow className={variant === \"dark\" ? \"fill-gray-900\" : \"fill-white\"} offset={8} />\n\t\t\t</RadixTooltip.Content>\n\t\t</RadixTooltip.Portal>\n\t);\n};\nTooltipContent.displayName = RadixTooltip.Content.displayName;\n\nexport type OverflowTriggerProps<TElement extends HTMLElement> = Omit<RadixTooltip.TooltipTriggerProps, \"children\"> & {\n\t/** The `elementRef` render prop should attach to a measurable DOM element.\n\t *\n\t * @example\n\t * element={elementRef => (\n\t * <span ref={elementRef} className=\"truncate ...\">\n\t * {text}\n\t * </span>\n\t * )}\n\t */\n\telement: (elementRef: React.RefObject<TElement>) => React.ReactElement;\n};\nconst OverflowTrigger = <TElement extends HTMLElement = HTMLDivElement>({\n\telement,\n\t...rest\n}: OverflowTriggerProps<TElement>) => {\n\tconst { elementRef, hasOverflow } = useOverflowObserver<TElement>();\n\n\tif (!hasOverflow) {\n\t\treturn element(elementRef);\n\t}\n\treturn (\n\t\t<RadixTooltip.Trigger asChild {...rest}>\n\t\t\t{element(elementRef)}\n\t\t</RadixTooltip.Trigger>\n\t);\n};\n\nconst TooltipTrigger = (props: RadixTooltip.TooltipTriggerProps) => <RadixTooltip.Trigger asChild {...props} />;\n\nconst TooltipProvider = (props: RadixTooltip.TooltipProviderProps) => (\n\t<RadixTooltip.Provider disableHoverableContent delayDuration={0} {...props} />\n);\n\nconst TooltipRoot = (props: RadixTooltip.TooltipProps) => <RadixTooltip.Root {...props} />;\n\nexport type TooltipProps = Simplify<\n\tOmit<RadixTooltip.TooltipProps, \"children\"> &\n\t\tOmit<TooltipContentProps, \"children\"> & {\n\t\t\ttrigger?: React.ReactNode;\n\t\t\tcontent?: React.ReactNode;\n\t\t}\n>;\n/**\n * @example\n * <Tooltip\n * trigger={<Button>Cool action</Button>}\n * \tcontent={<p className=\"text-xs\">This is the tooltip content</p>}\n * />\n */\nexport const Tooltip = ({ trigger, content, variant, side, ...rest }: TooltipProps) => {\n\treturn (\n\t\t<Tooltip.Root {...rest}>\n\t\t\t<Tooltip.Trigger>{trigger}</Tooltip.Trigger>\n\t\t\t{content && (\n\t\t\t\t<Tooltip.Content side={side} variant={variant}>\n\t\t\t\t\t{content}\n\t\t\t\t</Tooltip.Content>\n\t\t\t)}\n\t\t</Tooltip.Root>\n\t);\n};\n\nTooltip.Provider = TooltipProvider;\nTooltip.Root = TooltipRoot;\nTooltip.Trigger = TooltipTrigger;\nTooltip.OverflowTrigger = OverflowTrigger;\nTooltip.Content = TooltipContent;\n","import * as React from \"react\";\n\nexport const useOverflowObserver = <T extends HTMLElement>() => {\n\tconst [hasOverflow, setHasOverflow] = React.useState(false);\n\tconst elementRef = React.useRef<T>(null);\n\n\t// React.useLayoutEffect can hurt perf as advised by React docs,\n\t// so useEffect until it becomes obvious to React.useLayoutEffect.\n\t// eslint-disable-next-line no-restricted-syntax\n\tReact.useEffect(() => {\n\t\tif (elementRef.current == null) return;\n\n\t\tconst resizeObserver = new ResizeObserver(([entry]) => {\n\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\tconst element = entry?.target as T;\n\n\t\t\t\tconst hasOverflowWidth = element.offsetWidth < element.scrollWidth;\n\t\t\t\tconst hasOverflowHeight = element.offsetHeight < element.scrollHeight;\n\t\t\t\tconst calcHasOverflow = hasOverflowWidth || hasOverflowHeight;\n\t\t\t\t// setting state will cause re-render, so only set if actually changed\n\t\t\t\tif (calcHasOverflow !== hasOverflow) {\n\t\t\t\t\tsetHasOverflow(calcHasOverflow);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tresizeObserver.observe(elementRef.current);\n\n\t\treturn () => resizeObserver.disconnect();\n\t}, [hasOverflow]);\n\n\treturn { elementRef, hasOverflow };\n};\n","import { Text } from \"@/core/text\";\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Avatar, AvatarVariant } from \"./Avatar\";\n\nexport type AvatarWithNameProps = {\n\tname: string;\n\tvariant?: AvatarVariant;\n\tclassName?: string;\n};\n\nexport const AvatarWithName = ({ name, variant, className }: AvatarWithNameProps) => (\n\t<div className={twMerge(\"flex items-center gap-2\", className)}>\n\t\t<Avatar name={name} variant={variant} />\n\t\t<Text>{name}</Text>\n\t</div>\n);\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { faCircle, faDiamond, faExclamationTriangle, faInfoCircle } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\nimport { Intent } from \"../variants\";\n\nexport type CalloutIntent = Extract<Intent, \"default\" | \"warning\" | \"primary\" | \"danger\">;\n\nexport type CalloutProps = {\n\tintent?: CalloutIntent;\n\ttitle?: React.ReactNode;\n\trightSlot?: React.ReactNode;\n\tchildren?: React.ReactNode;\n\tcustomIcon?: IconDefinition;\n\tisAttachedAtBottom?: boolean;\n\tisCentered?: boolean;\n};\n\nconst calloutBackgroundStyles: Record<CalloutIntent, string> = {\n\tdefault: \"bg-surface-neutral\",\n\twarning: \"bg-yellow-50\",\n\tprimary: \"bg-surface-primary\",\n\tdanger: \"bg-red-50\",\n};\n\nconst calloutIconStyles: Record<CalloutIntent, string> = {\n\tdefault: \"text-muted\",\n\twarning: \"text-warning\",\n\tprimary: \"text-indigo-500\",\n\tdanger: \"text-red-800\",\n};\n\nconst calloutBorderStyles: Record<CalloutIntent, string> = {\n\tdefault: \"border-[1px] border-surface-neutral\",\n\tprimary: \"border-[1px] border-surface-primary\",\n\twarning: \"border-[1px] border-surface-warning\",\n\tdanger: \"border-[1px] border-red-100\",\n};\n\nconst calloutIcons: Record<CalloutIntent, IconDefinition> = {\n\tdefault: faInfoCircle,\n\twarning: faExclamationTriangle,\n\tprimary: faDiamond,\n\tdanger: faCircle,\n};\n\nexport const Callout = ({\n\ttitle,\n\tintent = \"default\",\n\trightSlot,\n\tchildren,\n\tcustomIcon,\n\tisAttachedAtBottom,\n\tisCentered,\n}: CalloutProps) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex w-full justify-between rounded-lg p-2.5\",\n\t\t\tcalloutBackgroundStyles[intent],\n\t\t\tcalloutBorderStyles[intent],\n\t\t\tisAttachedAtBottom ? \"rounded-b-none\" : \"rounded-b-lg\",\n\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t)}\n\t>\n\t\t<div className=\"flex gap-2\">\n\t\t\t<div className={twJoin(\"text-sm\", title ? \"leading-xs\" : \"leading-5\", calloutIconStyles[intent])}>\n\t\t\t\t<Icon icon={customIcon ?? calloutIcons[intent]} />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-1 flex-col gap-1\">\n\t\t\t\t{title && <div className=\"leading-xs font-medium whitespace-pre-line text-neutral\">{title}</div>}\n\t\t\t\t{children && <div className=\"text-sm/5 text-muted\">{children}</div>}\n\t\t\t</div>\n\t\t</div>\n\t\t{rightSlot}\n\t</div>\n);\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport type IconProps = {\n\ticon: IconDefinition;\n};\n\nexport const Icon = ({ icon }: IconProps) => <FontAwesomeIcon icon={icon} />;\n","import React from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ChildrenProps, ClassNameProps } from \"../types\";\n\nexport type CardProps = { onClick?: React.MouseEventHandler<HTMLDivElement> } & ClassNameProps & ChildrenProps;\n\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(({ className, children, onClick }, ref) => (\n\t<div\n\t\tref={ref}\n\t\tclassName={twMerge(\n\t\t\t\"mb-4 rounded-lg border-solid border-surface-neutral bg-white shadow\",\n\t\t\tonClick != null && \"cursor-pointer transition-shadow duration-150 hover:shadow-md\",\n\t\t\tclassName,\n\t\t)}\n\t\tonClick={onClick}\n\t>\n\t\t{children}\n\t</div>\n));\n","import { forwardRef, InputHTMLAttributes, useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { ErrorProps } from \"../types\";\n\nexport type CheckboxProps = InputHTMLAttributes<HTMLInputElement> & ErrorProps;\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(({ className, hasError, ...rest }, ref) => (\n\t<input\n\t\ttype=\"checkbox\"\n\t\tclassName={twJoin(\n\t\t\tclassName,\n\t\t\t\"block rounded-sm text-indigo-600 checked:bg-indigo-600 indeterminate:bg-indigo-600 focus:ring-0 focus:ring-offset-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-400 disabled:cursor-not-allowed disabled:bg-surface-dark disabled:hover:bg-surface-dark\",\n\t\t\thasError\n\t\t\t\t? \"border-red-300 text-red-900 placeholder-red-300\"\n\t\t\t\t: \"border-surface-neutral disabled:border-surface-neutral\",\n\t\t)}\n\t\t{...rest}\n\t\tref={ref}\n\t/>\n));\n\nexport const IndeterminateCheckbox = ({\n\tindeterminate = false,\n\t...rest\n}: { indeterminate?: boolean } & CheckboxProps) => {\n\tconst ref = useRef<HTMLInputElement>(null);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.indeterminate = indeterminate;\n\t\t}\n\t}, [indeterminate]);\n\n\treturn <Checkbox ref={ref} {...rest} />;\n};\n","import { faChevronDown, faChevronRight } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Content, Root, Trigger } from \"@radix-ui/react-collapsible\";\nimport * as React from \"react\";\nimport { useState } from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Icon } from \"../icon\";\n\nexport type CollapsibleProps = {\n\ttitle: React.ReactNode;\n\tchildren: React.ReactNode;\n\tdefaultOpen?: boolean;\n\ticonPosition?: \"left\" | \"right\" | undefined;\n\thideIcon?: boolean;\n\topen?: boolean;\n\tsetOpen?: (open: boolean) => void;\n\ttriggerClassName?: string;\n};\n\nexport const Collapsible = ({\n\ttitle,\n\tchildren,\n\tdefaultOpen = false,\n\ticonPosition = \"left\",\n\thideIcon,\n\topen: controlledOpen,\n\tsetOpen: controlledSetOpen,\n\ttriggerClassName,\n}: CollapsibleProps) => {\n\tconst isControlled = controlledOpen !== undefined && controlledSetOpen !== undefined;\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\n\tconst isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst setIsOpen = isControlled ? controlledSetOpen : setUncontrolledOpen;\n\n\treturn (\n\t\t<Root className=\"flex flex-col gap-2\" open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t<Trigger\n\t\t\t\tasChild\n\t\t\t\tclassName={twMerge(\"flex cursor-pointer items-center gap-2 font-medium text-muted\", triggerClassName)}\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t{!hideIcon && iconPosition === \"left\" && (\n\t\t\t\t\t\t<div className=\"min-w-3.5\">\n\t\t\t\t\t\t\t<Icon icon={isOpen ? faChevronDown : faChevronRight} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{title}\n\t\t\t\t\t{!hideIcon && iconPosition === \"right\" && (\n\t\t\t\t\t\t<div className=\"min-w-3.5\">\n\t\t\t\t\t\t\t<Icon icon={isOpen ? faChevronDown : faChevronRight} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Trigger>\n\t\t\t<Content className=\"overflow-y-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">{children}</div>\n\t\t\t</Content>\n\t\t</Root>\n\t);\n};\n","import { faChevronDown } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Button, ButtonProps } from \"@/core/button\";\nimport { Icon } from \"@/core/icon\";\nimport { IsVisibleProvider, useIsVisible } from \"@/core/utils/useToggle\";\n\nexport type ToggleButtonProps = ButtonProps;\nconst ToggleButton = ({ children, ...rest }: ToggleButtonProps) => {\n\tconst { state: isVisible, toggle } = useIsVisible();\n\n\treturn (\n\t\t<Slot onClick={toggle}>\n\t\t\t<Button variant=\"transparent\" size=\"xs\" {...rest}>\n\t\t\t\t<span className={twJoin(\"transition-transform\", !isVisible && \"-rotate-90\")}>\n\t\t\t\t\t<Icon icon={faChevronDown} />\n\t\t\t\t</span>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t</Slot>\n\t);\n};\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n\tconst { state: isVisible } = useIsVisible();\n\n\tif (isVisible) return children;\n\treturn null;\n};\n\nexport type CollapsibleSectionProps = {\n\tchildren: React.ReactNode;\n\tdefaultOpen?: boolean;\n};\nexport const CollapsibleSection = ({ children, defaultOpen }: CollapsibleSectionProps) => {\n\treturn <IsVisibleProvider state={defaultOpen}>{children}</IsVisibleProvider>;\n};\n\nCollapsibleSection.ToggleButton = ToggleButton;\nCollapsibleSection.Content = Content;\n","import * as React from \"react\";\n\nimport { createContextHelper } from \"./create-context-helper\";\n\ntype ToggleContext = ReturnType<typeof useToggle>;\nconst [ToggleProvider, useToggleHook] = createContextHelper<ToggleContext>({\n\tstate: false,\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\tupdate: () => {},\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\ttoggle: () => {},\n});\n/**\n * @example\n * const defaultState = false; // optional as false is the default\n * const [Provider, useToggle] = createToggleContextHelper(defaultState);\n *\n * const {\n * \tstate,\t// boolean\n * \tupdate,\t// (state: boolean) => void\n * \ttoggle\t// () => void\n * } = useToggle();\n */\nexport const createToggleContextHelper = (defaultState = false) => {\n\tconst Provider = ({ children, state: initState }: { children: React.ReactNode; state?: boolean }) => {\n\t\tconst hook = useToggle(initState ?? defaultState);\n\t\treturn <ToggleProvider {...hook}>{children}</ToggleProvider>;\n\t};\n\n\tProvider.displayName = \"ToggleProvider\";\n\treturn [Provider, useToggleHook] as const;\n};\n\n// -----------------------------------------------------\n// provider and hook combos\n// -----------------------------------------------------\n/**\n * @example\n * const defaultState = true;\n * const { state, update, toggle } = useIsVisible(defaultState);\n */\nexport const [IsVisibleProvider, useIsVisible] = createToggleContextHelper(true);\n/**\n * @example\n * const defaultState = false;\n * const { state, update, toggle } = useIsEditing(defaultState);\n */\nexport const [IsEditingProvider, useIsEditing] = createToggleContextHelper(false);\n\n// -----------------------------------------------------\n// hooks like you know and love\n// -----------------------------------------------------\n/**\n * @example\n * const defaultState = false; // optional as false is the default\n * const { state, update, toggle } = useToggle(defaultState);\n */\nexport const useToggle = (initState?: boolean) => {\n\tconst [state, update] = React.useState(initState ?? false);\n\tconst toggle = React.useCallback(() => update((state) => !state), []);\n\treturn { state, update, toggle };\n};\n","import * as React from \"react\";\n\n/**\n * @example\n * type FooContextValue = { foo: string };\n * const [FooProvider, useFoo] = createContextHelper<FooContextValue>({ foo: \"bar\" });\n */\nexport const createContextHelper = <ContextValue extends object | null>(defaultContext?: ContextValue) => {\n\tconst Context = React.createContext<ContextValue | undefined>(defaultContext);\n\n\tconst Provider = ({ children, ...rest }: ContextValue & { children: React.ReactNode }) => {\n\t\t// Only re-memoize when prop values change\n\t\t// eslint-disable-next-line react-compiler/react-compiler\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\tconst value = React.useMemo(() => rest, Object.values(rest)) as ContextValue;\n\t\treturn <Context.Provider value={value}>{children}</Context.Provider>;\n\t};\n\n\tconst useContext = () => {\n\t\tconst context = React.useContext(Context);\n\t\tif (context) {\n\t\t\treturn context;\n\t\t}\n\t\tif (defaultContext !== undefined) {\n\t\t\treturn defaultContext;\n\t\t}\n\t\t// if a defaultContext wasn't specified, it's a required context.\n\t\tthrow new Error(\"Required context: useContext likely outside of a Provider\");\n\t};\n\n\treturn [Provider, useContext] as const;\n};\n","import { faCheck, faCopy } from \"@fortawesome/sharp-solid-svg-icons\";\nimport * as RadixTooltip from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\nimport { Tooltip } from \"../tooltip\";\nimport { useCopyable } from \"./use-copyable\";\n\nexport type CopyEasyProps = {\n\tchildren: React.ReactNode;\n\tvalue: string | undefined;\n\ttooltip?: React.ReactNode;\n\tonClick?: () => void;\n\tasChild?: boolean;\n\tclassName?: string;\n};\n\nexport const Copyable = ({ children, value, tooltip, onClick, asChild, className }: CopyEasyProps) => {\n\tconst { state, copy } = useCopyable();\n\tconst handleCopy = async (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\tawait copy(value, onClick);\n\t};\n\n\tif (!value && tooltip) {\n\t\treturn <Tooltip trigger={children} content={tooltip} />;\n\t}\n\tif (!value) {\n\t\treturn children;\n\t}\n\treturn (\n\t\t<RadixTooltip.Root open={state === \"copied\" ? true : undefined} delayDuration={150}>\n\t\t\t<RadixTooltip.Trigger\n\t\t\t\tasChild\n\t\t\t\tonClick={handleCopy}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"w-fit cursor-pointer rounded-xs\",\n\t\t\t\t\tstate !== \"copied\" && \"hover:bg-[#E8E8EB] hover:shadow-[0_0_0_2px_#E8E8EB] active:opacity-60\",\n\t\t\t\t\tstate === \"copying\" && \"opacity-60\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{asChild ? children : <span>{children}</span>}\n\t\t\t</RadixTooltip.Trigger>\n\t\t\t{tooltip && state === \"idle\" && <Tooltip.Content side=\"bottom\">{tooltip}</Tooltip.Content>}\n\t\t\t<RadixTooltip.Portal>\n\t\t\t\t<RadixTooltip.Content\n\t\t\t\t\tsideOffset={6}\n\t\t\t\t\tside=\"right\"\n\t\t\t\t\t// TODO: remove z-index once z-index wars settle down\n\t\t\t\t\t// currently modal bg in /app is z-100\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"z-101 grid h-6 w-6 place-items-center rounded-sm bg-white shadow-lg\",\n\t\t\t\t\t\tstate !== \"copying\" && \"animate-fade-in\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className={state === \"copied\" ? \"text-green-500\" : \"text-muted\"}>\n\t\t\t\t\t\t<Icon icon={state === \"copied\" ? faCheck : faCopy} />\n\t\t\t\t\t</div>\n\t\t\t\t</RadixTooltip.Content>\n\t\t\t</RadixTooltip.Portal>\n\t\t</RadixTooltip.Root>\n\t);\n};\n","import * as React from \"react\";\n\nconst waitMs = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst oldSchoolCopy = (text: string) => {\n\tconst tempTextArea = document.createElement(\"textarea\");\n\ttempTextArea.value = text;\n\tdocument.body.appendChild(tempTextArea);\n\ttempTextArea.select();\n\tdocument.execCommand(\"copy\");\n\tdocument.body.removeChild(tempTextArea);\n};\n\nexport const copyToClipboard = async (value: string) => {\n\ttry {\n\t\tif (navigator?.clipboard?.writeText) {\n\t\t\tawait navigator.clipboard.writeText(value);\n\t\t} else {\n\t\t\tthrow new Error(\"writeText not supported\");\n\t\t}\n\t} catch {\n\t\toldSchoolCopy(value);\n\t}\n};\n\nexport const useCopyable = () => {\n\tconst [state, setState] = React.useState<\"idle\" | \"copying\" | \"copied\">(\"idle\");\n\n\tconst copy = React.useCallback(async (value: string | undefined, onClick?: () => void) => {\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tsetState(\"copying\");\n\t\tawait Promise.all([copyToClipboard(value), waitMs(350)]);\n\t\tonClick?.();\n\n\t\tsetState(\"copied\");\n\t\t// give user a chance to grok the copy has succeeded\n\t\tawait waitMs(1750);\n\t\tsetState(\"idle\");\n\t}, []);\n\n\treturn { state, copy };\n};\n","import { useCallback } from \"react\";\nimport DatePickerLib from \"react-datepicker\";\n\nimport { DatePickerHeader } from \"./DatePickerHeader\";\nimport { customInputFieldFactory, DatePickerSharedProps } from \"./shared\";\nimport { TimeInput } from \"./TimeInput\";\n\nexport type DatePickerRangeProps = DatePickerSharedProps & {\n\tvalue: [Date | undefined, Date | undefined];\n\trange: true;\n\n\tonChange?: (newDate: [Date | undefined, Date | undefined]) => void;\n};\n\nexport const DatePickerRange = ({\n\tvalue = [undefined, undefined],\n\terrorNode,\n\thasError,\n\tinputProps,\n\tplaceholder,\n\tonChange,\n\tposition = \"bottom-start\",\n\t...props\n}: DatePickerRangeProps) => {\n\tconst handleChange = useCallback(\n\t\t(date: [Date | null, Date | null]) => onChange?.([date[0] || undefined, date[1] || undefined]),\n\t\t[onChange],\n\t);\n\n\tconst clearDatePicker = useCallback(\n\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\te.preventDefault();\n\t\t\tonChange?.([undefined, undefined]);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<DatePickerLib\n\t\t\t{...props}\n\t\t\tclassName=\"placeholder:text-placeholder\"\n\t\t\tselected={value[0]}\n\t\t\tonChange={handleChange}\n\t\t\tstartDate={value[0]}\n\t\t\tendDate={value[1]}\n\t\t\tdateFormat={props.showTimeInput ? \"MM/dd/yyyy h:mm aa\" : \"MM/dd/yyyy\"}\n\t\t\tselectsRange\n\t\t\tpopperPlacement={position}\n\t\t\tplaceholderText={placeholder}\n\t\t\tcustomInput={\n\t\t\t\t!props.inline\n\t\t\t\t\t? customInputFieldFactory({\n\t\t\t\t\t\t\tinputProps,\n\t\t\t\t\t\t\tisEmpty: value[0] == null && value[1] == null,\n\t\t\t\t\t\t\tdisabled: props.disabled,\n\t\t\t\t\t\t\terrorNode,\n\t\t\t\t\t\t\thasError,\n\t\t\t\t\t\t\tonClearInput: clearDatePicker,\n\t\t\t\t\t\t})\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tcustomTimeInput={<TimeInput />}\n\t\t\trenderCustomHeader={DatePickerHeader}\n\t\t/>\n\t);\n};\n","import { faChevronLeft, faChevronRight } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { getMonth, getYear } from \"date-fns\";\nimport { range } from \"lodash-es\";\nimport { ReactDatePickerCustomHeaderProps } from \"react-datepicker\";\n\nimport { Button, Icon, Select } from \"@/core\";\n\n// Allow year selection from 1920 to 5 years in the future\nconst years = range(1920, getYear(new Date()) + 6, 1).sort((a, b) => b - a);\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nexport const DatePickerHeader = ({\n\tdate,\n\tdecreaseMonth,\n\tincreaseMonth,\n\tchangeMonth,\n\tchangeYear,\n\tprevMonthButtonDisabled,\n\tnextMonthButtonDisabled,\n}: ReactDatePickerCustomHeaderProps) => {\n\tconst datePickerContainer = document.querySelector(\".react-datepicker\") ?? undefined;\n\treturn (\n\t\t<div className=\"space-y-2 p-2\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Button onClick={decreaseMonth} disabled={prevMonthButtonDisabled} variant=\"transparent\" size=\"sm\">\n\t\t\t\t\t<Icon icon={faChevronLeft} />\n\t\t\t\t</Button>\n\t\t\t\t<Select\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tpopover={{\n\t\t\t\t\t\tcontainer: datePickerContainer,\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={months[getMonth(date)]}\n\t\t\t\t\tonChange={(value) => changeMonth(months.indexOf(value))}\n\t\t\t\t\titems={months.map((month) => ({ label: month, value: month }))}\n\t\t\t\t/>\n\t\t\t\t<Select\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tpopover={{\n\t\t\t\t\t\tcontainer: datePickerContainer,\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={getYear(date).toString()}\n\t\t\t\t\tonChange={(value) => changeYear(parseInt(value))}\n\t\t\t\t\titems={years.map((year) => ({ label: year.toString(), value: year.toString() }))}\n\t\t\t\t/>\n\t\t\t\t<Button onClick={increaseMonth} disabled={nextMonthButtonDisabled} variant=\"transparent\" size=\"sm\">\n\t\t\t\t\t<Icon icon={faChevronRight} />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { type Placement } from \"@floating-ui/react\";\nimport { faCalendar, faXmark } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { DatePickerProps } from \"react-datepicker\";\n\nimport { Button, Icon } from \"@/core\";\n\nimport { ErrorProps } from \"../types\";\nimport { DatePickerInput, DatePickerInputProps } from \"./DatePickerInput\";\n\nexport type DatePickerSharedProps = Pick<\n\tDatePickerProps,\n\t\"inline\" | \"autoFocus\" | \"showTimeInput\" | \"preventOpenOnFocus\" | \"minDate\" | \"maxDate\" | \"disabled\"\n> & {\n\tinputProps?: DatePickerInputProps;\n\tplaceholder?: string;\n\tposition?: Placement;\n} & ErrorProps;\n\n// This is a factory that creates components, rather than a component itself because\n// of the way that react-datepicker uses refs for the input field. While it may be possible,\n// I couldn't figure out how to forward the ref correctly such that the date picker popup appeared\n// when selecting the input.\nexport const customInputFieldFactory = ({\n\tinputProps,\n\terrorNode,\n\thasError,\n\tisEmpty,\n\tdisabled,\n\tonClearInput,\n}: {\n\tinputProps?: DatePickerInputProps;\n\tisEmpty: boolean;\n\tdisabled?: boolean;\n\tplaceholder?: string;\n\tonClearInput: (event: React.MouseEvent<HTMLButtonElement>) => void;\n} & ErrorProps) => (\n\t<DatePickerInput\n\t\tinputProps={inputProps}\n\t\terrorNode={errorNode}\n\t\thasError={hasError}\n\t\trightAction={\n\t\t\tisEmpty ? (\n\t\t\t\t<span className=\"text-disabled\">\n\t\t\t\t\t<Icon icon={faCalendar} />\n\t\t\t\t</span>\n\t\t\t) : !disabled ? (\n\t\t\t\t<Button size=\"xs\" onClick={onClearInput} variant=\"transparent\">\n\t\t\t\t\t<span className=\"text-muted\">\n\t\t\t\t\t\t<Icon icon={faXmark} />\n\t\t\t\t\t</span>\n\t\t\t\t</Button>\n\t\t\t) : null\n\t\t}\n\t/>\n);\n","import { forwardRef, InputHTMLAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ErrorProps } from \"../types\";\n\nexport type DatePickerInputProps = InputHTMLAttributes<HTMLInputElement>;\n\ntype DatePickerInputInternalProps = {\n\tinputProps?: DatePickerInputProps;\n\trightAction?: React.ReactNode;\n\tdisabled?: boolean;\n} & ErrorProps;\n\nexport const DatePickerInput = forwardRef<HTMLInputElement, DatePickerInputInternalProps & DatePickerInputProps>(\n\t({ inputProps, errorNode, hasError, rightAction, disabled, className, ...rest }, ref) => {\n\t\tconst ringClassName = disabled\n\t\t\t? \"focus:outline-hidden focus:ring-0\"\n\t\t\t: hasError\n\t\t\t\t? \"focus:outline-hidden focus:ring-red-500 focus:border-red-500\"\n\t\t\t\t: \"focus:ring-2 focus:ring-indigo-200\";\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"relative block w-full rounded-md shadow-sm\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t{...inputProps}\n\t\t\t\t\t\tclassName={twMerge(\n\t\t\t\t\t\t\t\"block w-full rounded-md disabled:bg-surface-neutral\",\n\t\t\t\t\t\t\trightAction && \"pr-8\",\n\t\t\t\t\t\t\thasError ? \"border-red-300 text-red-900 placeholder-red-300\" : \"border-surface-neutral\",\n\t\t\t\t\t\t\tringClassName,\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\tinputProps?.className,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t/>\n\t\t\t\t\t{rightAction && (\n\t\t\t\t\t\t<div className={twJoin(\"absolute inset-y-0 right-0 flex items-center pr-3\", disabled && \"cursor-auto\")}>\n\t\t\t\t\t\t\t{rightAction}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{hasError != null && errorNode != null && (\n\t\t\t\t\t<p className=\"mt-2 max-h-[100px] overflow-auto text-sm text-danger\">{errorNode}</p>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t},\n);\n","import { InputHTMLAttributes, useCallback, useState } from \"react\";\n\nimport { Input } from \"../input\";\n\nexport const TimeInput = ({\n\tvalue: inputValue,\n\tonChange,\n}: Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\"> & { onChange?: (newDate: string | undefined) => void }) => {\n\tconst [value, setValue] = useState<string | undefined>(inputValue?.toString());\n\n\tconst handleUpdateTime = useCallback(() => {\n\t\tonChange?.(value);\n\t}, [value, onChange]);\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\thandleUpdateTime();\n\t\t}\n\t};\n\n\treturn (\n\t\t<Input\n\t\t\tvalue={value}\n\t\t\tonChange={(e) => setValue(e.target.value)}\n\t\t\tonBlur={handleUpdateTime}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\ttype=\"time\"\n\t\t\trequired\n\t\t/>\n\t);\n};\n","import * as React from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { InputBoxStyleProps, inputBoxStyles, inputStyles } from \"./inputBoxStyles\";\n\nexport type InputBoxProps = InputBoxStyleProps & {\n\tchildren: React.ReactNode;\n};\n\nexport type InputBaseProps = React.ComponentPropsWithoutRef<\"input\">;\n\nconst NestedInputImpl = (props: InputBaseProps, ref: React.ForwardedRef<HTMLInputElement>) => {\n\treturn (\n\t\t<input\n\t\t\t// these props can be overridden by {...props}\n\t\t\ttype=\"text\"\n\t\t\tclassName={`${inputStyles} border-none bg-transparent p-0 focus:ring-0 focus:outline-hidden`}\n\t\t\tautoComplete=\"off\"\n\t\t\t// spread in props that can be used as-is\n\t\t\t{...props}\n\t\t\t// these props won't be overridden as they come after {...props}\n\t\t\tref={ref}\n\t\t/>\n\t);\n};\n\nconst NestedInput = forwardRef(NestedInputImpl);\n\nconst InputBoxImpl = ({ children, ...style }: InputBoxProps, ref: React.ForwardedRef<HTMLLabelElement>) => (\n\t// Styling text to propagate stateful text color inheritance for the children of InputBox\n\t// (think Icons, other non-input elements). Avoids style collisions when Input is used solo.\n\t<label\n\t\tref={ref}\n\t\tclassName={`${style.hasError ? \"text-red-300\" : style.hasSuccess ? \"text-green-300\" : \"text-placeholder\"} ${inputBoxStyles(style)}`}\n\t>\n\t\t{children}\n\t</label>\n);\n\ntype CompoundInputBox = React.ForwardRefExoticComponent<InputBoxProps & React.RefAttributes<HTMLLabelElement>> & {\n\tInput: typeof NestedInput;\n};\nexport const InputBox = React.forwardRef(InputBoxImpl) as CompoundInputBox;\n\nInputBox.Input = NestedInput;\n\nexport type InputProps = InputBoxStyleProps & InputBaseProps;\nconst InputImpl = (\n\t{ size, variant, hasError, hasWarning, hasSuccess, prefix, ...rest }: InputProps,\n\tref: React.ForwardedRef<HTMLInputElement>,\n) => {\n\treturn prefix ? (\n\t\t<div className=\"flex flex-row items-center\">\n\t\t\t<label className=\"p-1 text-muted\">{prefix}</label>\n\t\t\t<input\n\t\t\t\t// these props can be overridden by {...props}\n\t\t\t\ttype=\"text\"\n\t\t\t\tclassName={`${inputStyles} ${inputBoxStyles({ size, variant, hasError, hasWarning, hasSuccess })}`}\n\t\t\t\tautoComplete=\"off\"\n\t\t\t\t// spread in props that can be used as-is\n\t\t\t\t{...rest}\n\t\t\t\t// these props won't be overridden as they come after {...props}\n\t\t\t\tref={ref}\n\t\t\t/>\n\t\t</div>\n\t) : (\n\t\t<input\n\t\t\t// these props can be overridden by {...props}\n\t\t\ttype=\"text\"\n\t\t\tclassName={`${inputStyles} ${inputBoxStyles({ size, variant, hasError, hasWarning, hasSuccess })}`}\n\t\t\tautoComplete=\"off\"\n\t\t\t// spread in props that can be used as-is\n\t\t\t{...rest}\n\t\t\t// these props won't be overridden as they come after {...props}\n\t\t\tref={ref}\n\t\t/>\n\t);\n};\n\nexport const Input = forwardRef(InputImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Size } from \"../variants\";\n\nexport type InputSize = Extract<Size, \"sm\" | \"md\" | \"lg\">;\ntype InputBoxStates = \"default\" | \"error\" | \"warning\" | \"success\";\nexport type InputVariants = \"default\" | \"transparent\";\n\nexport type InputBoxStyleProps = {\n\tsize?: InputSize;\n\tvariant?: InputVariants;\n\thasError?: boolean;\n\thasWarning?: boolean;\n\thasSuccess?: boolean;\n};\n\nconst sizeStyles: Record<InputSize, string> = {\n\tsm: \"h-sm gap-1 px-2 text-sm [&>input]:text-sm\",\n\tmd: \"h-md gap-2 px-2.5 text-base [&>input]:text-base\",\n\tlg: \"h-lg gap-2.5 px-3 text-lg [&>input]:text-lg\",\n};\n\nconst defaultVariantStyles =\n\t\"rounded-md border bg-white focus-within:outline focus:outline focus-within:outline-offset-0 focus:outline-offset-0 focus-within:outline-2 focus:outline-2\";\nconst transparentVariantStyles = \"border-none bg-transparent focus-within:outline-hidden focus:outline-hidden\";\n\nconst variantStyles: Record<InputVariants, Record<InputBoxStates, string>> = {\n\tdefault: {\n\t\tdefault: `${defaultVariantStyles} disabled:bg-surface-neutral disabled:text-placeholder border-surface-neutral focus-within:border-indigo-400 focus-within:outline-indigo-200 focus:border-indigo-400 focus:outline-indigo-200`,\n\t\terror: `${defaultVariantStyles} border-red-300 focus-within:border-red-300 focus-within:outline-red-200 focus:border-red-300 focus:outline-red-200`,\n\t\twarning: `${defaultVariantStyles} border-yellow-300 focus-within:border-yellow-300 focus-within:outline-yellow-200 focus:border-yellow-300 focus:outline-yellow-200`,\n\t\tsuccess: `${defaultVariantStyles} border-green-300 focus-within:border-green-300 focus-within:outline-green-200 focus:border-green-300 focus:outline-green-200`,\n\t},\n\ttransparent: {\n\t\tdefault: `${transparentVariantStyles} disabled:bg-surface-neutral disabled:text-placeholder`,\n\t\terror: transparentVariantStyles,\n\t\twarning: transparentVariantStyles,\n\t\tsuccess: transparentVariantStyles,\n\t},\n};\n\nexport const inputBoxStyles = ({\n\tsize = \"md\",\n\tvariant = \"default\",\n\thasError,\n\thasWarning,\n\thasSuccess,\n}: InputBoxStyleProps) =>\n\ttwJoin(\n\t\t\"flex w-full items-center focus-within:ring-0 focus:ring-0 has-disabled:bg-surface-neutral has-disabled:text-placeholder\",\n\t\tsizeStyles[size],\n\t\t// eslint-disable-next-line better-tailwindcss/no-unknown-classes\n\t\tvariantStyles[variant][hasError ? \"error\" : hasWarning ? \"warning\" : hasSuccess ? \"success\" : \"default\"],\n\t);\n\nexport const inputStyles = \"w-full text-gray-800 placeholder:text-placeholder disabled:text-placeholder\";\n","import { useCallback } from \"react\";\nimport DatePickerLib from \"react-datepicker\";\n\nimport { DatePickerHeader } from \"./DatePickerHeader\";\nimport { customInputFieldFactory, DatePickerSharedProps } from \"./shared\";\nimport { TimeInput } from \"./TimeInput\";\n\nexport type DatePickerSingleProps = DatePickerSharedProps & {\n\tvalue: Date | undefined;\n\trange?: false;\n\tonChange?: (newDate: Date | undefined) => void;\n};\n\nexport const DatePickerSingle = ({\n\tvalue,\n\terrorNode,\n\thasError,\n\tinputProps,\n\tplaceholder,\n\tonChange,\n\tposition = \"bottom-start\",\n\tpreventOpenOnFocus = true,\n\t...props\n}: DatePickerSingleProps) => {\n\tconst handleChange = useCallback((date: Date | null) => onChange?.(date ?? undefined), [onChange]);\n\n\tconst clearDatePicker = useCallback(\n\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\te.preventDefault();\n\t\t\tonChange?.(undefined);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<DatePickerLib\n\t\t\t{...props}\n\t\t\tclassName=\"placeholder:text-placeholder\"\n\t\t\tpreventOpenOnFocus={preventOpenOnFocus}\n\t\t\tselected={value}\n\t\t\tonChange={handleChange}\n\t\t\ttimeInputLabel=\"\"\n\t\t\tdateFormat={props.showTimeInput ? \"MM/dd/yyyy h:mm aa\" : \"MM/dd/yyyy\"}\n\t\t\tplaceholderText={placeholder}\n\t\t\tcustomInput={\n\t\t\t\t!props.inline\n\t\t\t\t\t? customInputFieldFactory({\n\t\t\t\t\t\t\tinputProps,\n\t\t\t\t\t\t\tisEmpty: value == null,\n\t\t\t\t\t\t\tdisabled: props.disabled,\n\t\t\t\t\t\t\terrorNode,\n\t\t\t\t\t\t\thasError,\n\t\t\t\t\t\t\tonClearInput: clearDatePicker,\n\t\t\t\t\t\t})\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tcustomTimeInput={<TimeInput />}\n\t\t\trenderCustomHeader={DatePickerHeader}\n\t\t\tpopperPlacement={position}\n\t\t/>\n\t);\n};\n","import \"./DatePicker.css\";\n\nimport { DatePickerRange, DatePickerRangeProps } from \"./DatePickerRange\";\nimport { DatePickerSingle, DatePickerSingleProps } from \"./DatePickerSingle\";\n\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\nexport const DatePicker = (props: DatePickerProps) =>\n\tprops.range ? <DatePickerRange {...props} /> : <DatePickerSingle {...props} />;\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\nimport { ClassNameProps } from \"@/core/types\";\n\nexport type DividerProps = ClassNameProps;\n\nexport const Divider = ({ className }: DividerProps) => (\n\t<div className={twMerge(\"h-px w-full border-b border-surface-neutral\", className)} />\n);\n","import React, { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\ntype ErrorTextProps = React.ComponentPropsWithoutRef<\"p\"> & { className?: string };\n\nconst ErrorTextImpl = ({ className, ...props }: ErrorTextProps, ref: React.ForwardedRef<HTMLParagraphElement>) => {\n\tif (!props.children) {\n\t\treturn null;\n\t}\n\treturn <p {...props} ref={ref} className={twJoin(\"text-danger\", className)} />;\n};\n/** ErrorText will return `null` if `children` is falsy */\nexport const ErrorText = forwardRef(ErrorTextImpl);\n","import { createContext, PropsWithChildren, useContext, useMemo } from \"react\";\n\nimport { FormFieldNameProps, useControlledFormField } from \"../hooks\";\n\nconst ControlledFieldContext = createContext<ReturnType<typeof useControlledFormField> | undefined>(undefined);\n\nexport const ControlledFieldProvider = ({ children, ...restField }: FormFieldNameProps & PropsWithChildren) => {\n\tconst field = useControlledFormField(restField);\n\tconst value = useMemo(() => field, [field]);\n\treturn <ControlledFieldContext.Provider value={value}>{children}</ControlledFieldContext.Provider>;\n};\n\nControlledFieldProvider.displayName = \"ControlledFieldProvider\";\n\nexport const useControlledField = () => {\n\tconst context = useContext(ControlledFieldContext);\n\tif (context) {\n\t\treturn context;\n\t}\n\t// if a defaultContext wasn't specified, it's a required context.\n\tthrow new Error(\"useControlledField must be used within ControlledFieldProvider\");\n};\n\nuseControlledField.displayName = \"useControlledField\";\n\nexport type ControlledFieldProps = FormFieldNameProps & {\n\trender: (props: ReturnType<typeof useControlledFormField>) => React.ReactNode;\n};\nexport const ControlledField = ({ render, ...restField }: ControlledFieldProps) => {\n\treturn <>{render(useControlledFormField(restField))}</>;\n};\n\nControlledField.displayName = \"ControlledField\";\n","// eslint-disable-next-line import/no-internal-modules\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as React from \"react\";\nimport type { DefaultValues, UseFormProps } from \"react-hook-form\";\nimport { useController, useForm as _useForm, useFormContext, useFormState } from \"react-hook-form\";\nimport type { z } from \"zod\";\n\nimport type { EventFor, FormSchema, NonEmpty } from \"./types\";\n\nexport type FormFieldNameProps = {\n\tname: string;\n};\n\nexport type UncontrolledFormFieldProps = FormFieldNameProps & {\n\tonChange?: (e: EventFor<\"input\" | \"textarea\", \"onChange\">) => void;\n\tonBlur?: (e: EventFor<\"input\" | \"textarea\", \"onBlur\">) => void;\n};\n\nexport type UseFormOptions<TSchema extends FormSchema, TDefaults extends object> = Pick<\n\tUseFormProps<z.infer<TSchema>>,\n\t\"shouldUnregister\" | \"values\" | \"reValidateMode\" | \"mode\"\n> & {\n\tdefaultValues?: NonEmpty<TDefaults>;\n};\n\nexport const useForm = <T extends FormSchema, TDefaults extends DefaultValues<z.infer<T>> = DefaultValues<z.infer<T>>>(\n\tschema: T,\n\toptions?: UseFormOptions<T, TDefaults>,\n) => {\n\treturn _useForm({\n\t\t...(options as UseFormProps<z.infer<T>>), // Type assertion needed here for RHF internals\n\t\tresolver: zodResolver(schema),\n\t});\n};\n\nuseForm.displayName = \"useForm\";\n\nexport const useControlledFormField = ({ name: fieldName }: FormFieldNameProps) => {\n\tconst { field, fieldState } = useController({ name: fieldName });\n\tconst { error } = fieldState;\n\n\treturn { ...field, error };\n};\n\nuseControlledFormField.displayName = \"useControlledFormField\";\n\nexport const useUncontrolledFormField = ({ name: fieldName, ...changeHandlers }: UncontrolledFormFieldProps) => {\n\tconst { register, getFieldState } = useFormContext();\n\tconst formState = useFormState();\n\n\tconst memoizedRegister = React.useCallback(() => {\n\t\tif (!changeHandlers) {\n\t\t\treturn register(fieldName);\n\t\t}\n\n\t\tconst { onChange, onBlur, ...restRegister } = register(fieldName);\n\n\t\tconst handleOnChange = async (event: EventFor<\"input\" | \"textarea\", \"onChange\">) => {\n\t\t\tawait onChange(event);\n\t\t\tchangeHandlers?.onChange?.(event);\n\t\t};\n\t\tconst handleOnBlur = async (event: EventFor<\"input\" | \"textarea\", \"onBlur\">) => {\n\t\t\tawait onBlur(event);\n\t\t\tchangeHandlers?.onBlur?.(event);\n\t\t};\n\n\t\treturn {\n\t\t\t// TODO: add id to register for easier linking with labels\n\t\t\t// id: register().name,\n\t\t\t...restRegister,\n\t\t\tonChange: changeHandlers?.onChange ? handleOnChange : onChange,\n\t\t\tonBlur: changeHandlers?.onBlur ? handleOnBlur : onBlur,\n\t\t};\n\t}, [changeHandlers, register, fieldName]);\n\n\tconst { error } = getFieldState(fieldName, formState);\n\n\treturn { register: memoizedRegister, error };\n};\n\nuseUncontrolledFormField.displayName = \"useUncontrolledFormField\";\n","import { createContext, PropsWithChildren, useContext, useMemo } from \"react\";\n\nimport { UncontrolledFormFieldProps, useUncontrolledFormField } from \"../hooks\";\n\nconst UncontrolledFieldContext = createContext<ReturnType<typeof useUncontrolledFormField> | undefined>(undefined);\n\nexport const UncontrolledFieldProvider = ({\n\tchildren,\n\t...restField\n}: UncontrolledFormFieldProps & PropsWithChildren) => {\n\tconst field = useUncontrolledFormField(restField);\n\tconst value = useMemo(() => field, [field]);\n\treturn <UncontrolledFieldContext.Provider value={value}>{children}</UncontrolledFieldContext.Provider>;\n};\n\nUncontrolledFieldProvider.displayName = \"UncontrolledFieldProvider\";\n\nexport const useUncontrolledField = () => {\n\tconst context = useContext(UncontrolledFieldContext);\n\tif (context) {\n\t\treturn context;\n\t}\n\t// if a defaultContext wasn't specified, it's a required context.\n\tthrow new Error(\"useUncontrolledField must be used within UncontrolledFieldProvider\");\n};\n\nuseUncontrolledField.displayName = \"useUncontrolledField\";\n\nexport type UncontrolledFieldProps = UncontrolledFormFieldProps & {\n\trender: (props: ReturnType<typeof useUncontrolledFormField>) => React.ReactNode;\n};\nexport const UncontrolledField = ({ render, ...restField }: UncontrolledFieldProps) => {\n\treturn <>{render(useUncontrolledFormField(restField))}</>;\n};\n\nUncontrolledField.displayName = \"UncontrolledField\";\n","import type { FieldError, FieldErrors, FieldPath, FieldValues } from \"react-hook-form\";\nimport { get } from \"react-hook-form\";\n\nexport const getFieldError = <TFieldValues extends FieldValues>(\n\terrors: FieldErrors<TFieldValues> | undefined,\n\tname: FieldPath<TFieldValues> | undefined,\n) => {\n\tif (name == null || errors == null) {\n\t\treturn undefined;\n\t}\n\t// React Hook Form's `get` func returns `any`, so the assertion is needed for consumers to have completion\n\treturn get(errors, name) as FieldError | undefined;\n};\n","import { forwardRef } from \"react\";\n\nimport { InlineFormItem } from \"./InlineFormItem\";\nimport { NoneFormItem } from \"./NoneFormItem\";\nimport { SideBySideFormItem } from \"./SideBySideFormItem\";\nimport { StackedFormItem } from \"./StackedFormItem\";\nimport { FormItemVariants, InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\ntype FormItemProps = InternalFormItemProps & SharedFormItemProps & { layout?: FormItemVariants };\n\nexport const FormItem = forwardRef<HTMLDivElement, FormItemProps>(({ layout = \"stacked\", ...rest }, ref) => {\n\tswitch (layout) {\n\t\tcase \"inline\":\n\t\t\treturn <InlineFormItem {...rest} ref={ref} />;\n\t\tcase \"side-by-side\":\n\t\t\treturn <SideBySideFormItem {...rest} ref={ref} />;\n\t\tcase \"stacked\":\n\t\t\treturn <StackedFormItem {...rest} ref={ref} />;\n\t\tcase \"none\":\n\t\t\treturn <NoneFormItem {...rest} ref={ref} />;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown form item layout: ${layout}`);\n\t}\n});\n\nexport type { FormItemVariants, SharedFormItemProps };\n","import { forwardRef } from \"react\";\n\nimport { FieldErrorTooltip } from \"./FieldErrorTooltip\";\nimport { InternalFormItemProps } from \"./types\";\n\nexport const InlineFormItem = forwardRef<HTMLSpanElement, InternalFormItemProps>(({ error, render }, ref) => {\n\treturn (\n\t\t<FieldErrorTooltip error={error}>\n\t\t\t<span ref={ref}>{render}</span>\n\t\t</FieldErrorTooltip>\n\t);\n});\n","import { FieldError } from \"react-hook-form\";\n\nimport { ErrorText } from \"@/core/error-text/ErrorText\";\nimport { Tooltip } from \"@/core/tooltip\";\n\ntype FieldErrorTooltipProps = {\n\terror: FieldError | undefined;\n\tchildren: React.ReactNode;\n};\n\nexport const FieldErrorTooltip = ({ error, children }: FieldErrorTooltipProps) => {\n\treturn (\n\t\t<Tooltip\n\t\t\tvariant=\"light\"\n\t\t\t// if there's an error, undefined allows normal Tooltip behavior\n\t\t\t// otherwise, open is false, which disables the Tooltip\n\t\t\topen={error?.message ? undefined : false}\n\t\t\ttrigger={children}\n\t\t\tcontent={<ErrorText>{error?.message}</ErrorText>}\n\t\t/>\n\t);\n};\n","import React, { forwardRef } from \"react\";\n\nimport { FieldDescription } from \"./FieldDescription\";\nimport { FieldErrorMessage } from \"./FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./FieldLabelWithTooltip\";\nimport { InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\nconst NoneFormItemImpl = (\n\t{ htmlFor, label, options, render, error }: InternalFormItemProps & SharedFormItemProps,\n\tref: React.ForwardedRef<HTMLDivElement>,\n) => (\n\t<>\n\t\t<div>\n\t\t\t<FieldLabelWithTooltip htmlFor={htmlFor} label={label} options={options} />\n\t\t\t<FieldDescription styles=\"pt-0.5\">{options?.description}</FieldDescription>\n\t\t</div>\n\t\t<div ref={ref}>\n\t\t\t{render}\n\t\t\t<FieldErrorMessage error={error} />\n\t\t\t{options?.bottomSlot}\n\t\t</div>\n\t</>\n);\n\nexport const NoneFormItem = forwardRef(NoneFormItemImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { StylesProps } from \"@/core/types\";\n\ntype FieldDescriptionProps = StylesProps & {\n\tchildren: React.ReactNode;\n};\n\nexport const FieldDescription = ({ styles, children }: FieldDescriptionProps) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn <p className={twJoin(\"text-sm text-muted\", styles)}>{children}</p>;\n};\n","import { faExclamationCircle } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { FieldError } from \"react-hook-form\";\n\nimport { ErrorText } from \"@/core/error-text/ErrorText\";\nimport { Icon } from \"@/core/icon\";\nimport { OverflowTooltip } from \"@/core/overflow-tooltip/OverflowTooltip\";\n\nfunction handleErrorOrErrorArrayMessage(error: FieldError | FieldError[]) {\n\tif (!Array.isArray(error)) {\n\t\treturn error.message;\n\t}\n\tif (error.length === 1) {\n\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\treturn error[0].message;\n\t}\n\treturn error.map((err: FieldError, index) => `Item ${index + 1}: ${err.message}`).join(\", \");\n}\n\ntype FieldErrorMessageProps = {\n\terror: FieldError | undefined;\n};\n\nexport const FieldErrorMessage = ({ error }: FieldErrorMessageProps) => {\n\tif (error == null) {\n\t\treturn null;\n\t}\n\tconst message = handleErrorOrErrorArrayMessage(error);\n\n\treturn (\n\t\t<div className=\"flex h-4.5 items-center gap-x-1 pt-0.5 text-sm\">\n\t\t\t<span className=\"text-red-400\">\n\t\t\t\t<Icon icon={faExclamationCircle} />\n\t\t\t</span>\n\t\t\t<OverflowTooltip\n\t\t\t\ttooltip={message}\n\t\t\t\telement={(ref) => (\n\t\t\t\t\t<ErrorText ref={ref} className=\"line-clamp-1 cursor-default break-all\">\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</ErrorText>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import React from \"react\";\n\nimport { Tooltip } from \"../tooltip\";\n\nexport type OverflowTooltipProps = Pick<React.ComponentPropsWithoutRef<typeof Tooltip>, \"side\" | \"variant\" | \"open\"> & {\n\ttooltip: React.ReactNode;\n\t/** The `elementRef` render prop should attach to a measurable DOM element.\n\t *\n\t * @example\n\t * element={elementRef => (\n\t * \t<span ref={elementRef} className=\"truncate ...\">\n\t * \t\t{text}\n\t * \t</span>\n\t * )}\n\t */\n\telement: (elementRef: React.RefObject<HTMLElement & HTMLDivElement>) => React.ReactElement;\n};\n\nexport const OverflowTooltip = ({ element, tooltip, side, variant, ...props }: OverflowTooltipProps) => {\n\treturn (\n\t\t<Tooltip.Root {...props}>\n\t\t\t<Tooltip.OverflowTrigger element={element} />\n\t\t\t<Tooltip.Content side={side} variant={variant}>\n\t\t\t\t{tooltip}\n\t\t\t</Tooltip.Content>\n\t\t</Tooltip.Root>\n\t);\n};\n","import { faQuestionCircle } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Tooltip } from \"@/core/tooltip\";\nimport { StylesProps } from \"@/core/types\";\n\nimport { FieldLabel } from \"./FieldLabel\";\nimport { SharedFormItemProps } from \"./types\";\n\nexport const FieldLabelWithTooltip = ({ styles, htmlFor, label, options }: StylesProps & SharedFormItemProps) => {\n\tif (label == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<FieldLabel htmlFor={htmlFor} styles={twJoin(\"space-x-1\", styles)}>\n\t\t\t<span>{label}</span>\n\t\t\t{options?.optionalLabel && <span className=\"text-placeholder\">(Optional)</span>}\n\t\t\t{options?.tooltip && (\n\t\t\t\t<Tooltip\n\t\t\t\t\tcontent={options?.tooltip}\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<span className=\"inline-flex items-baseline space-x-1\">\n\t\t\t\t\t\t\t<span className=\"leading-none\">\n\t\t\t\t\t\t\t\t{options.tooltipIcon ? (\n\t\t\t\t\t\t\t\t\toptions.tooltipIcon\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted\">\n\t\t\t\t\t\t\t\t\t\t<Icon icon={faQuestionCircle} />\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{options?.tooltipLabel && <span className=\"font-normal text-muted\">{options?.tooltipLabel}</span>}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{options?.inlineLabelEndSlot}\n\t\t</FieldLabel>\n\t);\n};\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Text } from \"@/core\";\nimport { StylesProps } from \"@/core/types\";\n\ntype FieldLabelProps = StylesProps & {\n\thtmlFor?: string;\n\tchildren: React.ReactNode;\n};\n\nexport const FieldLabel = ({ styles, htmlFor, children }: FieldLabelProps) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Text as=\"label\" htmlFor={htmlFor} variant=\"body-2\" className={twJoin(\"block text-muted\", styles)}>\n\t\t\t{children}\n\t\t</Text>\n\t);\n};\n","import { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { FieldDescription } from \"./FieldDescription\";\nimport { FieldErrorMessage } from \"./FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./FieldLabelWithTooltip\";\nimport { InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\nexport const SideBySideFormItem = forwardRef<HTMLDivElement, InternalFormItemProps & SharedFormItemProps>(\n\t({ styles, htmlFor, label, options, render, error }, ref) => (\n\t\t<div className={twJoin(\"grid grid-cols-[minmax(0,2fr)_minmax(0,3fr)] gap-x-1\", styles)} ref={ref}>\n\t\t\t<div className=\"pt-2.5\">\n\t\t\t\t<FieldLabelWithTooltip htmlFor={htmlFor} label={label} options={options} />\n\t\t\t\t<FieldDescription styles=\"pt-0.5\">{options?.description}</FieldDescription>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t{render}\n\t\t\t\t<FieldErrorMessage error={error} />\n\t\t\t\t{options?.bottomSlot}\n\t\t\t</div>\n\t\t</div>\n\t),\n);\n","import { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { FieldDescription } from \"./FieldDescription\";\nimport { FieldErrorMessage } from \"./FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./FieldLabelWithTooltip\";\nimport { InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\nexport const StackedFormItem = forwardRef<HTMLDivElement, InternalFormItemProps & SharedFormItemProps>(\n\t({ styles, htmlFor, label, options, render, error }, ref) => (\n\t\t<div className={styles || undefined} ref={ref}>\n\t\t\t<FieldLabelWithTooltip\n\t\t\t\tstyles={twJoin(\"flex items-baseline\", options?.description == null && \"pb-1\")}\n\t\t\t\thtmlFor={htmlFor}\n\t\t\t\tlabel={label}\n\t\t\t\toptions={options}\n\t\t\t/>\n\t\t\t<FieldDescription styles=\"pb-1\">{options?.description}</FieldDescription>\n\t\t\t{render}\n\t\t\t<FieldErrorMessage error={error} />\n\t\t\t{options?.bottomSlot}\n\t\t</div>\n\t),\n);\n","import { UncontrolledField, UncontrolledFormFieldProps } from \"@/core/form\";\nimport { Input, InputProps } from \"@/core/input\";\n\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormInputProps = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<UncontrolledFormFieldProps, \"onChange\" | \"onBlur\"> &\n\tPick<InputProps, \"placeholder\" | \"variant\" | \"prefix\" | \"type\" | \"step\" | \"autoFocus\" | \"min\" | \"max\">;\n\nexport const FormInput = ({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tonChange,\n\tonBlur,\n\tdisabled,\n\t...rest\n}: FormInputProps) => (\n\t<UncontrolledField\n\t\tname={name}\n\t\tonChange={onChange}\n\t\tonBlur={onBlur}\n\t\trender={({ error, register }) => (\n\t\t\t<FormItem\n\t\t\t\tlayout={layout}\n\t\t\t\tstyles={styles}\n\t\t\t\thtmlFor={name}\n\t\t\t\tlabel={label}\n\t\t\t\toptions={options}\n\t\t\t\trender={\n\t\t\t\t\t<Input\n\t\t\t\t\t\tid={name}\n\t\t\t\t\t\t{...register()}\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasError={!disabled && (!!error || undefined)}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\terror={error}\n\t\t\t/>\n\t\t)}\n\t/>\n);\n","import {\n\tfaCheckCircle,\n\tfaDollarSign,\n\tfaExclamationCircle,\n\tfaExclamationTriangle,\n} from \"@fortawesome/sharp-solid-svg-icons\";\nimport { ChangeEvent, forwardRef, ForwardRefExoticComponent, RefAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Input } from \"@/core/input\";\nimport { Text } from \"@/core/text/Text\";\nimport { useSyncState } from \"@/core/utils/useSyncState\";\n\nimport { ControlledField } from \"./ControlledField\";\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type DollarInputProps = {\n\tvalue: number | null | undefined; // amount in cents\n\tonChange?: (cents: number | null | undefined) => void;\n\tdisabled?: boolean;\n\tautoFocus?: boolean;\n\thasError?: boolean;\n\thasWarning?: boolean;\n\thasSuccess?: boolean;\n\tmessage?: string;\n};\n\nconst twoDecimalFormatter = Intl.NumberFormat(\"en-US\", {\n\tminimumFractionDigits: 2,\n\tmaximumFractionDigits: 2,\n});\n\n// Remove non-numeric characters except for commas, periods, and negative signs.\nconst formatInput = (value: string) => {\n\treturn value.replaceAll(/[^0-9.,-]/g, \"\");\n};\n\nconst roundToTwoDecimalPlaces = (value: number): number => {\n\t// Number.EPSILON is used to avoid floating point precision issues (without it 1.255 would round to 1.25 instead of 1.26 for example).\n\treturn Math.round((value + Number.EPSILON) * 100) / 100;\n};\n\n/**\n * DollarInput component for displaying and editing a monetary value.\n *\n * Exposes `cents` to consuming components, which is the value in cents.\n */\nexport const DollarInput = forwardRef<HTMLInputElement, DollarInputProps>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tdisabled = false,\n\t\t\tautoFocus = false,\n\t\t\thasError = false,\n\t\t\thasWarning = false,\n\t\t\thasSuccess = false,\n\t\t\tmessage,\n\t\t},\n\t\tref,\n\t) => {\n\t\t/**\n\t\t * Implementation notes:\n\t\t * - Internally, this component stores the value as a string to allow for better formatting and user input handling.\n\t\t * Externally, however, the value in this field is exposed as a number in cents.\n\t\t *\n\t\t * - onChange is also only called when the field is blurred. This is to allow a user to type any values, but only format once\n\t\t * they are done editing.\n\t\t */\n\t\tconst [strValue, setStrValue] = useSyncState<string>(value == null ? \"\" : twoDecimalFormatter.format(value / 100));\n\n\t\tconst handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = formatInput(event.target.value);\n\n\t\t\t// Handle empty input (i.e., user clears the input)\n\t\t\tif (!inputValue) {\n\t\t\t\tsetStrValue(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Allow prefixing negative numbers or decimal points\n\t\t\tif (inputValue === \"-\" || inputValue === \".\") {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent typing more than two decimal places\n\t\t\tif ((inputValue.split(\".\")?.[1]?.length ?? 0) > 2) return;\n\n\t\t\tconst parsedValue = parseFloat(inputValue);\n\t\t\tif (!isNaN(parsedValue)) {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t}\n\t\t};\n\n\t\tconst handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tconst pastedData = formatInput(event.clipboardData.getData(\"text\"));\n\t\t\tconst parsedAmount = parseFloat(pastedData);\n\n\t\t\tif (!isNaN(parsedAmount)) {\n\t\t\t\tsetStrValue(twoDecimalFormatter.format(parsedAmount));\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedAmount * 100));\n\t\t\t}\n\t\t};\n\n\t\tconst handleBlur = () => {\n\t\t\tconst parsedValue = parseFloat(strValue.replaceAll(\",\", \"\"));\n\t\t\tif (isNaN(parsedValue)) {\n\t\t\t\tonChange?.(null);\n\t\t\t} else {\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedValue * 100));\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"flex h-md w-full items-center rounded-sm py-2.5 text-base [&>input]:rounded-l-none! [&>input]:rounded-r-md! [&>input]:border-l-0!\",\n\t\t\t\t\t\tdisabled &&\n\t\t\t\t\t\t\t\"cursor-not-allowed [&>input]:cursor-not-allowed [&>input]:bg-surface-light! [&>input]:text-muted!\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"flex h-md w-md items-center justify-center rounded-l-md border-y border-l px-2.5 text-sm text-muted\",\n\t\t\t\t\t\t\thasError\n\t\t\t\t\t\t\t\t? \"border-red-300 bg-red-200 text-red-700\"\n\t\t\t\t\t\t\t\t: hasWarning\n\t\t\t\t\t\t\t\t\t? \"border-yellow-300 bg-surface-warning text-warning\"\n\t\t\t\t\t\t\t\t\t: hasSuccess\n\t\t\t\t\t\t\t\t\t\t? \"border-green-300 bg-surface-success text-success\"\n\t\t\t\t\t\t\t\t\t\t: \"border-surface-neutral bg-surface-neutral\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon icon={faDollarSign} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t\tvalue={strValue}\n\t\t\t\t\t\thasError={hasError}\n\t\t\t\t\t\thasWarning={hasWarning}\n\t\t\t\t\t\thasSuccess={hasSuccess}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tplaceholder=\"0.00\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{hasWarning && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-warning\">\n\t\t\t\t\t\t<Icon icon={faExclamationTriangle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasError && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-red-700\">\n\t\t\t\t\t\t<Icon icon={faExclamationCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasSuccess && message && (\n\t\t\t\t\t<div className=\"flex items-center gap-1 text-sm font-normal text-success\">\n\t\t\t\t\t\t<Icon icon={faCheckCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nexport type FormDollarInputProps = SharedFormControlProps &\n\tSharedFormItemProps & { onChange?: (cents: number | null | undefined) => void } & Pick<\n\t\tDollarInputProps,\n\t\t\"autoFocus\" | \"hasWarning\" | \"hasSuccess\" | \"message\"\n\t>;\n\nexport const FormDollarInput: ForwardRefExoticComponent<FormDollarInputProps & RefAttributes<HTMLInputElement>> =\n\tforwardRef<HTMLInputElement, FormDollarInputProps>(\n\t\t(\n\t\t\t{ name, layout, label, onChange, disabled, autoFocus, hasWarning = false, hasSuccess = false, message, options },\n\t\t\tref,\n\t\t) => (\n\t\t\t<ControlledField\n\t\t\t\tname={name}\n\t\t\t\trender={(field) => (\n\t\t\t\t\t<FormItem\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\toptions={options}\n\t\t\t\t\t\terror={field.error}\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<DollarInput\n\t\t\t\t\t\t\t\tonChange={(cents: number | null | undefined) => {\n\t\t\t\t\t\t\t\t\tfield.onChange(cents);\n\t\t\t\t\t\t\t\t\tonChange?.(cents);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={field.value as number | undefined}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t\t\t\thasError={!disabled && (!!field.error || undefined)}\n\t\t\t\t\t\t\t\thasWarning={!disabled && hasWarning}\n\t\t\t\t\t\t\t\thasSuccess={!disabled && hasSuccess}\n\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t),\n\t);\n","import { useState } from \"react\";\n\nexport const useSyncState = <T>(upstream: T) => {\n\tconst [prevUpstream, setPrevUpstream] = useState(upstream);\n\tconst [state, setState] = useState(upstream);\n\n\tif (prevUpstream !== upstream) {\n\t\tsetState(upstream);\n\t\tsetPrevUpstream(upstream);\n\t}\n\n\treturn [state, setState] as const;\n};\n","import {\n\tfaCheckCircle,\n\tfaExclamationCircle,\n\tfaExclamationTriangle,\n\tfaPercent,\n} from \"@fortawesome/sharp-solid-svg-icons\";\nimport { ChangeEvent, forwardRef, ForwardRefExoticComponent, RefAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Input } from \"@/core/input\";\nimport { Text } from \"@/core/text/Text\";\nimport { useSyncState } from \"@/core/utils/useSyncState\";\n\nimport { ControlledField } from \"./ControlledField\";\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type PercentInputProps = {\n\tvalue: number | null | undefined; // percentage value (0-100)\n\tonChange?: (percent: number | null | undefined) => void;\n\tdisabled?: boolean;\n\thasError?: boolean;\n\thasWarning?: boolean;\n\thasSuccess?: boolean;\n\tmessage?: string;\n};\n\nconst twoDecimalFormatter = Intl.NumberFormat(\"en-US\", {\n\tminimumFractionDigits: 0,\n\tmaximumFractionDigits: 2,\n});\n\n// Remove non-numeric characters except for commas, periods.\nconst formatInput = (value: string) => {\n\treturn value.replaceAll(/[^0-9.,]/g, \"\");\n};\n\nconst roundToTwoDecimalPlaces = (value: number): number => {\n\treturn Math.round((value + Number.EPSILON) * 100) / 100;\n};\n\n/**\n * PercentInput component for displaying and editing a percentage value.\n *\n * Exposes `percent` to consuming components, which is the value as a number (0-100).\n */\nexport const PercentInput = forwardRef<HTMLInputElement, PercentInputProps>(\n\t({ value, onChange, disabled = false, hasError = false, hasWarning = false, hasSuccess = false, message }, ref) => {\n\t\tconst [strValue, setStrValue] = useSyncState<string>(value == null ? \"\" : twoDecimalFormatter.format(value));\n\n\t\tconst handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = formatInput(event.target.value);\n\n\t\t\t// Handle empty input (i.e., user clears the input)\n\t\t\tif (!inputValue) {\n\t\t\t\tsetStrValue(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Allow prefixing decimal points\n\t\t\tif (inputValue === \".\") {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent typing more than two decimal places\n\t\t\tif ((inputValue.split(\".\")?.[1]?.length ?? 0) > 2) return;\n\n\t\t\tconst parsedValue = parseFloat(inputValue);\n\t\t\tif (!isNaN(parsedValue)) {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t}\n\t\t};\n\n\t\tconst handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tconst pastedData = formatInput(event.clipboardData.getData(\"text\"));\n\t\t\tconst parsedAmount = parseFloat(pastedData);\n\n\t\t\tif (!isNaN(parsedAmount)) {\n\t\t\t\tsetStrValue(twoDecimalFormatter.format(parsedAmount));\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedAmount));\n\t\t\t}\n\t\t};\n\n\t\tconst handleBlur = () => {\n\t\t\tconst parsedValue = parseFloat(strValue.replaceAll(\",\", \"\"));\n\t\t\tif (isNaN(parsedValue)) {\n\t\t\t\tonChange?.(null);\n\t\t\t} else {\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedValue));\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"flex h-md w-full items-center rounded-sm py-2.5 text-base [&>input]:rounded-l-none! [&>input]:rounded-r-md! [&>input]:border-l-0!\",\n\t\t\t\t\t\tdisabled &&\n\t\t\t\t\t\t\t\"cursor-not-allowed [&>input]:cursor-not-allowed [&>input]:bg-surface-light! [&>input]:text-muted!\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"flex h-md w-md items-center justify-center rounded-l-md border-y border-l px-2.5 text-sm text-muted\",\n\t\t\t\t\t\t\thasError\n\t\t\t\t\t\t\t\t? \"border-red-300 bg-red-200 text-red-700\"\n\t\t\t\t\t\t\t\t: hasWarning\n\t\t\t\t\t\t\t\t\t? \"border-yellow-300 bg-surface-warning text-warning\"\n\t\t\t\t\t\t\t\t\t: hasSuccess\n\t\t\t\t\t\t\t\t\t\t? \"border-green-300 bg-surface-success text-success\"\n\t\t\t\t\t\t\t\t\t\t: \"border-surface-neutral bg-surface-neutral\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon icon={faPercent} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tvalue={strValue}\n\t\t\t\t\t\thasError={hasError}\n\t\t\t\t\t\thasWarning={hasWarning}\n\t\t\t\t\t\thasSuccess={hasSuccess}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{hasWarning && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-warning\">\n\t\t\t\t\t\t<Icon icon={faExclamationTriangle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasError && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-red-700\">\n\t\t\t\t\t\t<Icon icon={faExclamationCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasSuccess && message && (\n\t\t\t\t\t<div className=\"flex items-center gap-1 text-sm font-normal text-success\">\n\t\t\t\t\t\t<Icon icon={faCheckCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nexport type FormPercentInputProps = SharedFormControlProps &\n\tSharedFormItemProps & { onChange?: (percent: number | null | undefined) => void } & Pick<\n\t\tPercentInputProps,\n\t\t\"hasWarning\" | \"hasSuccess\" | \"message\"\n\t>;\n\nexport const FormPercentInput: ForwardRefExoticComponent<FormPercentInputProps & RefAttributes<HTMLInputElement>> =\n\tforwardRef<HTMLInputElement, FormPercentInputProps>(\n\t\t({ name, layout, label, onChange, disabled, hasWarning = false, hasSuccess = false, message, options }, ref) => (\n\t\t\t<ControlledField\n\t\t\t\tname={name}\n\t\t\t\trender={(field) => (\n\t\t\t\t\t<FormItem\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\toptions={options}\n\t\t\t\t\t\terror={field.error}\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<PercentInput\n\t\t\t\t\t\t\t\tonChange={(percent: number | null | undefined) => {\n\t\t\t\t\t\t\t\t\tfield.onChange(percent);\n\t\t\t\t\t\t\t\t\tonChange?.(percent);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={field.value as number | undefined}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\thasError={!disabled && (!!field.error || undefined)}\n\t\t\t\t\t\t\t\thasWarning={!disabled && hasWarning}\n\t\t\t\t\t\t\t\thasSuccess={!disabled && hasSuccess}\n\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t),\n\t);\n","import { Checkbox } from \"@/core/checkbox\";\nimport { ControlledFieldProvider, useControlledField, useControlledFormField } from \"@/core/form\";\nimport { FieldLabel } from \"@/core/form/components/form-item/FieldLabel\";\nimport { EventFor } from \"@/core/form/types\";\n\nimport { FieldErrorMessage } from \"./form-item/FieldErrorMessage\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormCheckboxProps = Pick<SharedFormControlProps, \"name\" | \"disabled\"> & {\n\tchildren?: React.ReactNode;\n\tonChange?: (checked: boolean) => void;\n};\n\nexport const FormCheckbox = ({ name, disabled, onChange: propsOnChange, children }: FormCheckboxProps) => {\n\tconst {\n\t\tonChange,\n\t\terror,\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tvalue,\n\t\t...field\n\t} = useControlledFormField({ name });\n\n\tconst handleChange = (e: EventFor<\"input\", \"onChange\">) => {\n\t\tconst { checked } = e.target;\n\t\tonChange(checked);\n\t\tpropsOnChange?.(checked);\n\t};\n\n\tif (children == null) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Checkbox\n\t\t\t\t\t{...field}\n\t\t\t\t\tid={name}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tchecked={!!value}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\thasError={!!error}\n\t\t\t\t/>\n\t\t\t\t<FieldErrorMessage error={error} />\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ControlledFieldProvider name={name}>\n\t\t\t{children}\n\t\t\t<FieldErrorMessage error={error} />\n\t\t</ControlledFieldProvider>\n\t);\n};\n\nfunction CheckboxImpl({ onChange: propsOnChange }: { onChange?: (checked: boolean) => void }) {\n\tconst {\n\t\tname,\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tvalue,\n\t\tonChange,\n\t\terror,\n\t\t...field\n\t} = useControlledField();\n\n\tconst handleChange = (e: EventFor<\"input\", \"onChange\">) => {\n\t\tconst { checked } = e.target;\n\t\tonChange(checked);\n\t\tpropsOnChange?.(checked);\n\t};\n\n\treturn <Checkbox {...field} id={name} checked={!!value} onChange={handleChange} hasError={!!error} />;\n}\n\nfunction LabelImpl({ children, className }: { children: React.ReactNode; className?: string }) {\n\tconst { name } = useControlledField();\n\n\treturn (\n\t\t<FieldLabel htmlFor={name} styles={className}>\n\t\t\t{children}\n\t\t</FieldLabel>\n\t);\n}\n\nFormCheckbox.Label = LabelImpl;\nFormCheckbox.Checkbox = CheckboxImpl;\n","import { ControllerRenderProps, FieldError } from \"react-hook-form\";\n\nimport { FormItem, SharedFormItemProps } from \"@/core/form/components/form-item\";\nimport { SharedFormControlProps } from \"@/core/form/components/types\";\nimport { useControlledFormField } from \"@/core/form/hooks\";\n\ntype FormItemRender<T> = Simplify<Omit<ControllerRenderProps, \"value\"> & { value: T; error?: FieldError }>;\n\ntype ControlledFormItemProps<T = string> = Simplify<\n\tSharedFormControlProps &\n\t\tSharedFormItemProps & {\n\t\t\trender: (field: FormItemRender<T>) => React.ReactNode;\n\t\t}\n>;\nexport const ControlledFormItem = <T = string>({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\trender,\n}: ControlledFormItemProps<T>) => {\n\tconst field = useControlledFormField({ name });\n\n\treturn (\n\t\t<FormItem\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={render(field)}\n\t\t\terror={field.error}\n\t\t/>\n\t);\n};\n","import { SelectItem, SelectValue } from \"./selectItem\";\n\nexport const DEFAULT_NUM_VALUES_TO_SHOW = 2;\n\n/**\n * Props to control the loading and error states of an AsyncSelect component.\n */\nexport type LoadProps = {\n\tisLoading: boolean;\n\tisError: boolean;\n\tcanLoadMore: boolean;\n\tonLoadMore: () => void;\n};\n\n/**\n * Props for the AsyncMultiSelect component, the most unopinionated of the Select components and the base\n * of all the others.\n */\nexport type AsyncMultiSelectProps<T extends SelectValue> = {\n\tvalue?: T[];\n\tonChange?: (value: T[]) => void;\n\tdisabled?: boolean;\n\ttriggerPlaceholder?: string;\n\tvariant?: \"default\" | \"simple\";\n\t/**\n\t * Number of selected values to show by default. If more than this number are selected, the select will\n\t * render a button to expand the list. Defaults to {@link DEFAULT_NUM_VALUES_TO_SHOW}.\n\t */\n\tnumValuesToShow?: number;\n\t/**\n\t * If true, this select will strictly enforce ordering of the items. Items added first will\n\t * be displayed first, and the user can reorder items by dragging them. Defaults to false.\n\t */\n\tordered?: boolean;\n\t/**\n\t * Hide the search field. Defaults to false. Recommended only for Selects with a small number of items.\n\t */\n\thideSearch?: boolean;\n\tsearchPlaceholder?: string;\n\t/**\n\t * Callback when the user types in the input field.\n\t */\n\tonSearchChange?: (query: string) => void;\n\t/**\n\t * All items that the Select knows about, for both selected and unselected values.\n\t *\n\t * This list should eventually include items for ALL values that are selected,\n\t * including custom values. *The component will render a loading state until then.*\n\t *\n\t * This list may not necessarily include all available items, e.g., if the user\n\t * is searching or if the list is paginated.\n\t */\n\titems: SelectItem<T>[];\n\t/**\n\t * Optional props to control the loading and error states of the AsyncMultiSelect, which can add item(s)\n\t * to the bottom of the dropdown that convey and control this state.\n\t */\n\tloadProps?: LoadProps;\n\t/**\n\t * Min number of items that must be selected. Defaults to 0. If 1, the user cannot\n\t * unselect the last item.\n\t */\n\tminSelection?: 0 | 1;\n\t/**\n\t * Max number of items that can be selected. Defaults to unlimited.\n\t */\n\tmaxSelection?: number | \"unlimited\";\n\t/**\n\t * If true, the user can enter custom values. Defaults to false.\n\t * Can only be true if T is string.\n\t */\n\tallowCustomValues?: T extends string ? boolean : false;\n\tisValidCustomValue?: (value: string) => boolean;\n\t/**\n\t * What to do when \"Select all\" is clicked (only shown if there are no items selected).\n\t * If not provided, no \"Select all\" button will be shown.\n\t */\n\tonSelectAll?: () => void;\n\thasError?: boolean;\n\tpopover?: {\n\t\tcustomTrigger?: React.ReactNode;\n\t\tcontentClassName?: string;\n\t\ttriggerClassName?: string;\n\t\tcontainer?: Element;\n\t};\n\temptyState?: React.ReactNode;\n\tsize?: \"sm\" | \"md\" | \"lg\";\n};\n\n/**\n * Props for the AsyncSelect component, which is a wrapper around AsyncMultiSelect that only allows\n * a single item to be selected.\n */\nexport type UnselectableProps<T extends SelectValue> = {\n\tvalue?: T;\n\tonChange?: (value: T | undefined) => void;\n\tallowUnselect: boolean;\n};\nexport type NotUnselectableProps<T extends SelectValue> = {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tallowUnselect?: false;\n};\nexport type AsyncSelectProps<T extends SelectValue> = Simplify<\n\t(UnselectableProps<T> | NotUnselectableProps<T>) &\n\t\tOmit<AsyncMultiSelectProps<T>, \"value\" | \"onChange\" | \"minSelection\" | \"maxSelection\" | \"onSelectAll\">\n>;\n\n/**\n * Props for the MultiSelect component, which is a wrapper around AsyncMultiSelect that does not\n * require async loading (and assumes that all options are always available).\n */\nexport type MultiSelectProps<T extends SelectValue> = {\n\t/**\n\t * A function for creating a select option given a custom value. This is used to render\n\t * the selected items both in the trigger and in the dropdown.\n\t */\n\tcustomValueToOption?: string extends T ? (value: string) => SelectItem<T> : never;\n} & Omit<AsyncMultiSelectProps<T>, \"debounceMs\">;\n\n/**\n * Props for the Select component, which is a wrapper around MultiSelect that only allows\n * a single item to be selected.\n */\nexport type SelectProps<T extends SelectValue> = (UnselectableProps<T> | NotUnselectableProps<T>) &\n\tOmit<MultiSelectProps<T>, \"value\" | \"onChange\" | \"minSelection\" | \"maxSelection\" | \"onSelectAll\">;\n\nexport type SelectWithUnselectProps<T extends SelectValue> = Omit<UnselectableProps<T>, \"allowUnselect\"> &\n\tOmit<MultiSelectProps<T>, \"value\" | \"onChange\" | \"minSelection\" | \"maxSelection\" | \"onSelectAll\">;\n\n/**\n * Helper type for async single-select components with enriched object callback.\n * Makes it easy to define custom select component props.\n */\nexport type AsyncSelectControlledProps<TValue extends SelectValue, TObj> = {\n\tvalue: TValue | undefined;\n\tonChange: (value: TValue | undefined, obj: TObj | undefined) => void;\n};\n\n/**\n * Helper type for async multi-select components with enriched object callback.\n * Makes it easy to define custom multi-select component props.\n */\nexport type AsyncMultiSelectControlledProps<TValue extends SelectValue, TObj> = {\n\tvalue: TValue[];\n\tonChange: (value: TValue[] | undefined, objs: TObj[]) => void;\n};\n","export type SelectValue = string | number;\n\n/**\n * An item in a Select component. This could represent an available option, or a selected value.\n */\nexport type SelectItem<TValue extends SelectValue = string> = {\n\t/**\n\t * The value of the option. Must be unique and extend either string or number.\n\t */\n\tvalue: TValue;\n\t/**\n\t * Label to show in the select dropdown and trigger.\n\t */\n\tlabel: string;\n\t/**\n\t * Optional unique key for React rendering. Use when value may not be unique.\n\t * Falls back to value if not provided.\n\t */\n\treactKey?: string;\n\t/**\n\t * Optional React node to show in the select dropdown, but not in the trigger.\n\t */\n\tdisplay?: React.ReactNode;\n\ticon?: React.ReactNode;\n\tdisabled?: boolean;\n\t/**\n\t * Predicate to determine if the option matches a query.\n\t * Default is to match if the lowercase label contains the lowercase query.\n\t * @param query search query\n\t * @returns whether the option matches the query\n\t */\n\tisMatch?: (query: string) => boolean;\n};\n\n/**\n * Returns true if the option matches the query.\n * @param option\n * @param query\n * @returns\n */\nexport function doesSelectItemMatch<T extends SelectValue>(option: SelectItem<T>, query: string | undefined): boolean {\n\tif (!query) {\n\t\treturn true;\n\t}\n\tif (option.isMatch) {\n\t\treturn option.isMatch(query);\n\t}\n\treturn option.label.toLowerCase().includes(query.toLowerCase());\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { LoadProps } from \"./props\";\nimport { SelectItem, SelectValue } from \"./selectItem\";\n\nexport function useDebounce<T>(value: T, delay: number) {\n\tconst [debouncedValue, setDebouncedValue] = useState(value);\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst handler = setTimeout(() => {\n\t\t\tsetDebouncedValue(value);\n\t\t}, delay);\n\t\treturn () => {\n\t\t\tclearTimeout(handler);\n\t\t};\n\t}, [value, delay]);\n\treturn debouncedValue;\n}\n\nexport type ErrorOr<T> = { error: true } | { error: false; value: T };\n\nexport type UseAsyncMultiSelectArgs<TValue extends SelectValue, TObj, TPage> = {\n\tvalue: TValue[];\n\t/**\n\t * Fetch objects associated with the selected values.\n\t *\n\t * If the select allows custom values, then some values may not resolve to a\n\t * corresponding object (determined by objToItem). In this case, these values\n\t * will be converted to items using customValueToItem.\n\t * @param values current selected items\n\t * @returns list of objects corresponding to the selected values\n\t */\n\tfetchValues: (values: TValue[]) => Promise<ErrorOr<TObj[]>>;\n\t/**\n\t * Fetch objects matching a search term and page token. This is used to render\n\t * available options in the dropdown.\n\t * @param query query the user has searched\n\t * @param page page token\n\t * @returns the results and the next page token, if any\n\t */\n\tfetchOptions: (\n\t\tquery: string,\n\t\tpage: TPage | undefined,\n\t) => Promise<\n\t\tErrorOr<{\n\t\t\tresults: TObj[];\n\t\t\tnextPage?: TPage;\n\t\t}>\n\t>;\n\t/**\n\t * Convert an object returned from a query to a select item.\n\t * @param obj\n\t * @returns\n\t */\n\tobjToItem: (obj: TObj) => SelectItem<TValue>;\n\t/**\n\t * Convert a custom value to a select item. *Only provide this if the select\n\t * accepts custom values.*\n\t *\n\t * If this is not provided, the select will render a loading state until all\n\t * values have been resolved to objects by fetchValues.\n\t *\n\t * TODO: how to handle cases where custom values are disallowed, but a value\n\t * previously entered by the user is no longer present on the backend?\n\t * @param value\n\t * @returns\n\t */\n\tcustomValueToItem?: (value: TValue) => SelectItem<TValue>;\n\tqueryKeyPrefix: string | string[] | readonly string[];\n};\n\n/**\n * Utility hook for fetching data and getting props for AsyncMultiSelect.\n */\nexport function useAsyncMultiSelect<TValue extends SelectValue, TObj, TPage>({\n\tvalue,\n\tfetchValues,\n\tfetchOptions,\n\tobjToItem,\n\tcustomValueToItem,\n\tqueryKeyPrefix,\n}: UseAsyncMultiSelectArgs<TValue, TObj, TPage>) {\n\tconst [query, setQuery] = useState(\"\");\n\tconst [page, setPage] = useState<TPage | undefined>(undefined);\n\tconst debouncedSearchTerm = useDebounce(query, 500);\n\n\tconst key = Array.isArray(queryKeyPrefix) ? queryKeyPrefix : [queryKeyPrefix];\n\n\t// loading is handled by the select component - it renders a loading state\n\t// if any of the values are not resolved by this query (and no customValueToItem) is provided\n\t// TODO: handle error state\n\tconst { data: fetchedValues } = useQuery({\n\t\tqueryKey: [...key, \"values\", value],\n\t\tqueryFn: () => fetchValues(value),\n\t\tenabled: !!value,\n\t});\n\n\tconst {\n\t\tdata: fetchedOptions,\n\t\tisLoading: isLoadingOptions,\n\t\terror: optionsError,\n\t} = useQuery({\n\t\tqueryKey: [...key, \"options\", debouncedSearchTerm, page],\n\t\tqueryFn: () => fetchOptions(debouncedSearchTerm, page),\n\t});\n\n\tconst selectItems = useMemo(() => {\n\t\tconst fetchedValueItems = fetchedValues?.error === false ? fetchedValues.value.map(objToItem) : [];\n\t\tconst customItems = customValueToItem\n\t\t\t? value.filter((v) => !fetchedValueItems.some((i) => i.value === v)).map((v) => customValueToItem(v))\n\t\t\t: [];\n\t\tconst fetchedOptionItems = fetchedOptions?.error === false ? fetchedOptions.value.results.map(objToItem) : [];\n\n\t\treturn [...fetchedValueItems, ...customItems, ...fetchedOptionItems];\n\t}, [objToItem, value, fetchedValues, fetchedOptions, customValueToItem]);\n\n\tconst loadProps: LoadProps = {\n\t\tisLoading: isLoadingOptions,\n\t\tisError: !!(optionsError || !fetchedOptions || fetchedOptions.error),\n\t\tcanLoadMore: !fetchedOptions?.error ? !!fetchedOptions?.value?.nextPage : false,\n\t\tonLoadMore: () => {\n\t\t\tif (!fetchedOptions?.error) {\n\t\t\t\tsetPage(fetchedOptions?.value?.nextPage);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn {\n\t\tquery,\n\t\tsetQuery,\n\t\tselectItems,\n\t\tloadProps,\n\t\tqueriedObjects: [\n\t\t\t...(fetchedValues?.error === false ? fetchedValues.value : []),\n\t\t\t...(fetchedOptions?.error === false ? fetchedOptions.value.results : []),\n\t\t],\n\t};\n}\n\nexport type UseAsyncSelectArgs<TValue extends SelectValue, TObj, TPage> = {\n\tvalue: TValue | undefined;\n\tfetchValue: (value: TValue) => Promise<ErrorOr<TObj | undefined>>;\n} & Omit<UseAsyncMultiSelectArgs<TValue, TObj, TPage>, \"value\" | \"fetchValues\">;\n\n/**\n * Utility hook for fetching data and getting props for AsyncSelect.\n */\nexport const useAsyncSelect = <TValue extends SelectValue, TObj, TPage>({\n\tvalue,\n\tfetchValue,\n\t...rest\n}: UseAsyncSelectArgs<TValue, TObj, TPage>) =>\n\tuseAsyncMultiSelect({\n\t\tvalue: value ? [value] : [],\n\t\tfetchValues: async (values) => {\n\t\t\tif (!values[0]) {\n\t\t\t\treturn {\n\t\t\t\t\terror: false,\n\t\t\t\t\tvalue: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = await fetchValue(values[0]);\n\t\t\tif (result.error) return result;\n\t\t\treturn {\n\t\t\t\terror: false,\n\t\t\t\tvalue: result.value ? [result.value] : [],\n\t\t\t};\n\t\t},\n\t\t...rest,\n\t});\n","import { DndContext, DragEndEvent, PointerSensor, useSensor, useSensors } from \"@dnd-kit/core\";\nimport { SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport { faArrowTurnDownLeft, faCheck, faSearch, faTimes } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { useMemo, useRef, useState } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { DropdownChevron } from \"../dropdown-chevron\";\nimport { Icon } from \"../icon\";\nimport { InputBox } from \"../input\";\nimport { inputBoxStyles } from \"../input/inputBoxStyles\";\nimport { Popover } from \"../popover\";\nimport { Text } from \"../text\";\nimport { AsyncMultiSelectProps, DEFAULT_NUM_VALUES_TO_SHOW } from \"./props\";\nimport { doesSelectItemMatch, SelectItem } from \"./selectItem\";\nimport { SelectListItem, SelectListItemProps } from \"./SelectListItem\";\n\n/**\n * The most unopinionated of the family of Select components, the base for all the others.\n * Supports asynchronous loading (and does not assume that all available options are provided\n * in the `options` prop).\n */\nexport const AsyncMultiSelect = <TValue extends string | number>({\n\tvalue = [],\n\tonChange,\n\tdisabled = false,\n\tordered,\n\tvariant,\n\ttriggerPlaceholder,\n\thideSearch = false,\n\tsearchPlaceholder = \"Search...\",\n\titems,\n\tloadProps,\n\tonSearchChange,\n\tminSelection = 0,\n\tmaxSelection = \"unlimited\",\n\tallowCustomValues,\n\thasError,\n\tpopover,\n\tisValidCustomValue = () => true,\n\tonSelectAll,\n\tnumValuesToShow,\n\temptyState,\n\tsize,\n}: AsyncMultiSelectProps<TValue>) => {\n\tconst [open, setOpen] = useState(false);\n\tconst [search, setSearch] = useState(\"\");\n\tconst [focusIndex, setFocusIndex] = useState(0);\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tconst unselectedOptions = useMemo(() => items.filter((item) => !value.includes(item.value)), [items, value]);\n\n\tconst resetSearch = () => {\n\t\tsetSearch(\"\");\n\t\tonSearchChange?.(\"\");\n\t};\n\n\tconst handleClose = () => {\n\t\tsetOpen(false);\n\t\tresetSearch();\n\t\tsetFocusIndex(0);\n\t};\n\n\tconst searchMatchesExistingOption =\n\t\tvalue.some((v) => v.toString().toLowerCase() === search.toLowerCase()) ||\n\t\tunselectedOptions.find((opt) => opt.value?.toString().toLowerCase() === search.toLowerCase());\n\tconst showCustomItem =\n\t\tallowCustomValues &&\n\t\t!!search &&\n\t\t!loadProps?.isLoading &&\n\t\t!searchMatchesExistingOption &&\n\t\tisValidCustomValue(search);\n\n\tconst isCustomValueSelected = useMemo(\n\t\t() => allowCustomValues && value.some((v) => !items.map((item) => item.value).includes(v)),\n\t\t[allowCustomValues, items, value],\n\t);\n\tconst showCustomValue = isCustomValueSelected && !loadProps?.isLoading;\n\n\tconst handleAddCustomItem = () => {\n\t\tif (maxSelection === 1) {\n\t\t\tsetOpen(false);\n\t\t\tonChange?.([search as TValue]);\n\t\t} else {\n\t\t\tonChange?.([...value, search as TValue]);\n\t\t}\n\t\tresetSearch();\n\t};\n\n\tconst handleOptionSelected = (val: TValue) => {\n\t\tif (maxSelection === 1) {\n\t\t\tonChange?.([val]);\n\t\t\thandleClose();\n\t\t} else {\n\t\t\tlet items = ordered ? [...value, val] : [val, ...value];\n\t\t\tif (maxSelection !== \"unlimited\") {\n\t\t\t\titems = items.slice(0, maxSelection);\n\t\t\t}\n\n\t\t\tonChange?.(items);\n\t\t}\n\t\tif (inputRef.current) {\n\t\t\tinputRef.current.select();\n\t\t}\n\t};\n\n\tconst totalNumItems = unselectedOptions.length + (showCustomItem ? 1 : 0);\n\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\tsetFocusIndex((prev) => (prev + 1) % totalNumItems);\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\tsetFocusIndex((prev) => Math.max(prev - 1, 0));\n\t\t} else if (e.key === \"Enter\") {\n\t\t\te.preventDefault();\n\t\t\tif (focusIndex === 0 && showCustomItem) {\n\t\t\t\thandleAddCustomItem();\n\t\t\t} else if (totalNumItems > focusIndex) {\n\t\t\t\tconst unselectedOptionsIndex = focusIndex - (showCustomItem ? 1 : 0);\n\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\tif (!unselectedOptions[unselectedOptionsIndex].disabled) {\n\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\thandleOptionSelected(unselectedOptions[unselectedOptionsIndex].value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (e.key === \"Tab\") {\n\t\t\te.preventDefault();\n\t\t\tsetOpen(false);\n\t\t}\n\t};\n\n\tconst handleSearchTermChange = (val: string) => {\n\t\tsetSearch(val);\n\t\tsetFocusIndex(0);\n\t\tonSearchChange?.(val);\n\t};\n\n\t// If a user types while the select menu is focused but not open,\n\t// open the menu and start searching with the key that was pressed.\n\tconst handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (!hideSearch && e.key.length === 1) {\n\t\t\tsetOpen(true);\n\t\t\thandleSearchTermChange(e.key);\n\t\t}\n\t};\n\n\tconst valueToOptionMap = useMemo(() => {\n\t\tconst map = new Map<TValue, SelectItem<TValue>>();\n\t\titems.forEach((item) => map.set(item.value, item));\n\t\treturn map;\n\t}, [items]);\n\n\tconst allValuesHaveOptions = useMemo(\n\t\t() => value.every((val) => valueToOptionMap.has(val)) || showCustomValue,\n\t\t[value, valueToOptionMap, showCustomValue],\n\t);\n\n\tconst triggerText = useMemo(() => {\n\t\tif (value.length === 0) {\n\t\t\treturn (\n\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t{triggerPlaceholder ?? `Select ${maxSelection === 1 ? \"an item...\" : \"items...\"}`}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\n\t\tif (!allValuesHaveOptions) {\n\t\t\t// all values must eventually have associated options, but if they don't yet, show a loading state\n\t\t\treturn <span className=\"line-clamp-1\">Loading...</span>;\n\t\t}\n\n\t\tconst optionMatchingFirstVal =\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tvalueToOptionMap.get(value[0]) ||\n\t\t\t({\n\t\t\t\tlabel: value[0],\n\t\t\t\ticon: undefined,\n\t\t\t} as SelectItem<TValue>);\n\t\tconst firstValText = optionMatchingFirstVal ? optionMatchingFirstVal.label : value[0];\n\t\tconst icon = value.length === 1 ? optionMatchingFirstVal?.icon : undefined;\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{icon && <span className=\"mr-1 inline-flex items-center\">{icon}</span>}\n\t\t\t\t<span className=\"line-clamp-1 text-left\">{`${firstValText}${value.length > 1 ? \",\" : \"\"}`}</span>\n\t\t\t\t{value.length > 1 && <span className=\"whitespace-nowrap\">{`+${value.length - 1} more`}</span>}\n\t\t\t</>\n\t\t);\n\t}, [maxSelection, valueToOptionMap, triggerPlaceholder, value, allValuesHaveOptions]);\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open && !disabled}\n\t\t\tonOpenChange={(val) => {\n\t\t\t\tif (val) {\n\t\t\t\t\tsetOpen(true);\n\t\t\t\t} else {\n\t\t\t\t\thandleClose();\n\t\t\t\t}\n\t\t\t}}\n\t\t\talignContent=\"start\"\n\t\t\tdisabled={disabled}\n\t\t\ttriggerClassName={popover?.triggerClassName}\n\t\t\tcontentClassName={popover?.contentClassName}\n\t\t\tcontainer={popover?.container}\n\t\t\ttrigger={\n\t\t\t\tpopover?.customTrigger ??\n\t\t\t\t(variant === \"simple\" ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tonKeyDown={handleTriggerKeyDown}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"-mx-2 -my-1.5 flex cursor-pointer items-center justify-between gap-1.5 rounded-md px-2 py-1.5 transition-all duration-150\",\n\t\t\t\t\t\t\t!disabled && \"cursor-pointer hover:bg-surface-neutral\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\t\"line-clamp-1 flex flex-1 items-center\",\n\t\t\t\t\t\t\t\tvalue.length !== 0 ? \"text-inherit\" : \"text-muted\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{triggerText}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!disabled && <DropdownChevron />}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<button onKeyDown={handleTriggerKeyDown} className={twJoin(\"w-full\", inputBoxStyles({ hasError, size }))}>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`mr-auto line-clamp-1 flex items-center space-x-1 text-left text-base ${\n\t\t\t\t\t\t\t\tvalue.length === 0 ? \"text-placeholder\" : \"text-gray-800\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{triggerText}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<DropdownChevron />\n\t\t\t\t\t</button>\n\t\t\t\t))\n\t\t\t}\n\t\t>\n\t\t\t<div className=\"w-72\">\n\t\t\t\t{(!hideSearch || allowCustomValues) && (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<InputBox variant=\"transparent\">\n\t\t\t\t\t\t\t<div className=\"w-3 text-sm text-placeholder\">\n\t\t\t\t\t\t\t\t<Icon icon={faSearch} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<InputBox.Input\n\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\tonChange={(e) => handleSearchTermChange(e.target.value)}\n\t\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\t\tonBlur={(e) => e.target.focus()}\n\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</InputBox>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<ul className=\"max-h-72 space-y-1 overflow-y-auto p-1\">\n\t\t\t\t\t{!allValuesHaveOptions ? (\n\t\t\t\t\t\t<SelectListItem disabled>Loading...</SelectListItem>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<SelectedItems\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\tsearch={search}\n\t\t\t\t\t\t\tvalueToOptionMap={valueToOptionMap}\n\t\t\t\t\t\t\tonSelectAll={onSelectAll}\n\t\t\t\t\t\t\tminSelection={minSelection}\n\t\t\t\t\t\t\tordered={ordered}\n\t\t\t\t\t\t\tnumValuesToShow={numValuesToShow}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{showCustomItem && (\n\t\t\t\t\t\t<SelectOption onClick={handleAddCustomItem} focused={showCustomItem && focusIndex === 0}>\n\t\t\t\t\t\t\t<span>{`\"${search}\"`}</span>\n\t\t\t\t\t\t</SelectOption>\n\t\t\t\t\t)}\n\t\t\t\t\t{unselectedOptions.map((item, i) => (\n\t\t\t\t\t\t<SelectOption\n\t\t\t\t\t\t\tkey={item.reactKey ?? item.value}\n\t\t\t\t\t\t\tonClick={() => handleOptionSelected(item.value)}\n\t\t\t\t\t\t\tfocused={focusIndex === (showCustomItem ? i + 1 : i)}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.display ?? item.label}\n\t\t\t\t\t\t</SelectOption>\n\t\t\t\t\t))}\n\t\t\t\t\t{!loadProps ? (\n\t\t\t\t\t\t// no asynchronous loading\n\t\t\t\t\t\tunselectedOptions.length === 0 && (emptyState || <SelectListItem disabled>No results</SelectListItem>)\n\t\t\t\t\t) : loadProps.isLoading ? (\n\t\t\t\t\t\t<SelectListItem disabled>Loading...</SelectListItem>\n\t\t\t\t\t) : loadProps.isError ? (\n\t\t\t\t\t\t<SelectListItem disabled>An error occurred</SelectListItem>\n\t\t\t\t\t) : unselectedOptions.length === 0 ? (\n\t\t\t\t\t\temptyState || <SelectListItem disabled>No results</SelectListItem>\n\t\t\t\t\t) : loadProps.canLoadMore ? (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\tvariant=\"label\"\n\t\t\t\t\t\t\tonClick={loadProps.onLoadMore}\n\t\t\t\t\t\t\tclassName=\"cursor-pointer px-2 py-1 text-indigo-600\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more...\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : null}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</Popover>\n\t);\n};\n\nconst SelectOption = ({ children, focused, ...rest }: SelectListItemProps) => (\n\t<SelectListItem focused={focused} {...rest}>\n\t\t{children}\n\t\t{focused && !rest.disabled && (\n\t\t\t<span className=\"w-3 text-sm text-muted\">\n\t\t\t\t<Icon icon={faArrowTurnDownLeft} />\n\t\t\t</span>\n\t\t)}\n\t</SelectListItem>\n);\n\ntype SelectedItemsProps<TValue extends string | number> = Pick<\n\tAsyncMultiSelectProps<TValue>,\n\t\"value\" | \"onChange\" | \"onSelectAll\" | \"minSelection\" | \"ordered\" | \"numValuesToShow\"\n> & {\n\tsearch: string;\n\tvalueToOptionMap: Map<TValue, SelectItem<TValue>>;\n};\nconst SelectedItems = <TValue extends string | number>({\n\tvalue = [],\n\tonChange,\n\tonSelectAll,\n\tminSelection,\n\tsearch,\n\tvalueToOptionMap,\n\tordered,\n\tnumValuesToShow = DEFAULT_NUM_VALUES_TO_SHOW,\n}: SelectedItemsProps<TValue>) => {\n\tconst [showAllValues, setShowAllValues] = useState(false);\n\n\tconst filteredSelectedValues = useMemo(() => {\n\t\treturn value.filter((v) => {\n\t\t\tif (!search) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst option = valueToOptionMap.get(v);\n\t\t\tif (!option) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn doesSelectItemMatch(option, search);\n\t\t});\n\t}, [value, search, valueToOptionMap]);\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 8,\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst onDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event;\n\t\tif (over && active.id !== over.id) {\n\t\t\tconst newOrder = [...value];\n\t\t\tconst activeIndex = newOrder.indexOf(active.id as TValue);\n\t\t\tconst overIndex = newOrder.indexOf(over.id as TValue);\n\t\t\tnewOrder.splice(activeIndex, 1);\n\t\t\tnewOrder.splice(overIndex, 0, active.id as TValue);\n\t\t\tonChange?.(newOrder);\n\t\t}\n\t};\n\n\treturn (\n\t\t<DndContext sensors={sensors} onDragEnd={onDragEnd}>\n\t\t\t<SortableContext\n\t\t\t\tdisabled={!ordered}\n\t\t\t\titems={filteredSelectedValues.map((v) => ({ id: v, value: v }))}\n\t\t\t\tstrategy={verticalListSortingStrategy}\n\t\t\t>\n\t\t\t\t{(filteredSelectedValues.length > numValuesToShow || onSelectAll) && (\n\t\t\t\t\t<div className=\"flex justify-between px-2 pt-1.5 pb-px text-sm\">\n\t\t\t\t\t\t<span className=\"font-medium text-muted\">\n\t\t\t\t\t\t\t{value.length} selected\n\t\t\t\t\t\t\t{filteredSelectedValues.length < value.length ? ` (showing ${filteredSelectedValues.length})` : \"\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{value.length > 0 ? (\n\t\t\t\t\t\t\t<span className=\"cursor-pointer text-danger hover:underline\" onClick={() => onChange?.([])}>\n\t\t\t\t\t\t\t\tClear\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : onSelectAll ? (\n\t\t\t\t\t\t\t<span className=\"cursor-pointer text-indigo-700 hover:underline\" onClick={onSelectAll}>\n\t\t\t\t\t\t\t\tSelect all\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{filteredSelectedValues.length > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{filteredSelectedValues.slice(0, showAllValues ? value.length : numValuesToShow).map((val) => {\n\t\t\t\t\t\t\tconst item = valueToOptionMap.get(val);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<SelectListItem\n\t\t\t\t\t\t\t\t\tsortableId={ordered ? val : undefined}\n\t\t\t\t\t\t\t\t\tkey={val}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tconst canRemove = minSelection === 0 || value.length !== 1;\n\t\t\t\t\t\t\t\t\t\tif (canRemove) {\n\t\t\t\t\t\t\t\t\t\t\tonChange?.(value.filter((v) => v !== val));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{!item\n\t\t\t\t\t\t\t\t\t\t? val\n\t\t\t\t\t\t\t\t\t\t: (item.display ?? (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{item.icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t<div className=\"flex w-3 justify-center text-sm text-muted\">\n\t\t\t\t\t\t\t\t\t\t<Icon icon={minSelection === 1 ? faCheck : faTimes} />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</SelectListItem>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{filteredSelectedValues.length > numValuesToShow && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\t\tvariant=\"label\"\n\t\t\t\t\t\t\t\tonClick={() => setShowAllValues((prev) => !prev)}\n\t\t\t\t\t\t\t\tclassName=\"cursor-pointer px-2 py-1 text-indigo-600\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{showAllValues ? \"Show less\" : `Show ${filteredSelectedValues.length - numValuesToShow} more selected`}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{(filteredSelectedValues.length > 0 || onSelectAll) && (\n\t\t\t\t\t<li className=\"py-0.5\">\n\t\t\t\t\t\t<hr className=\"h-px bg-surface-dark\" />\n\t\t\t\t\t</li>\n\t\t\t\t)}\n\t\t\t</SortableContext>\n\t\t</DndContext>\n\t);\n};\n","import { faChevronDown } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\n\nexport const DropdownChevron = () => {\n\treturn (\n\t\t<div className={twJoin(\"w-3 text-sm text-muted\")}>\n\t\t\t<Icon icon={faChevronDown} />\n\t\t</div>\n\t);\n};\n","import { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { faGripDotsVertical } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\n\nexport type SelectListItemProps = {\n\tsortableId?: string | number;\n\tchildren?: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tfocused?: boolean;\n};\n\n/**\n * An item rendered in a Select dropdown. Does not necessarily correspond to an option.\n * @param param0\n * @returns\n */\nexport const SelectListItem = ({\n\tsortableId,\n\tchildren,\n\tonClick,\n\tdisabled = false,\n\tfocused = false,\n}: SelectListItemProps) => {\n\tconst { setNodeRef, listeners, attributes, transform, transition } = useSortable({ id: sortableId ?? \"\" });\n\n\tconst containerRef = useRef<HTMLLIElement | null>(null);\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\t// scroll into view when focused\n\t\t// ensures that if the user uses the keyboard to navigate the dropdown, the selected item is always visible\n\t\tif (focused && containerRef.current) {\n\t\t\tcontainerRef.current.scrollIntoView({ block: \"nearest\", inline: \"nearest\", behavior: \"smooth\" });\n\t\t}\n\t}, [focused]);\n\n\treturn (\n\t\t<li\n\t\t\tref={(ref) => {\n\t\t\t\tsetNodeRef(ref);\n\t\t\t\tcontainerRef.current = ref;\n\t\t\t}}\n\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"flex w-full items-center gap-2 rounded-lg px-2 py-1.5\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"cursor-not-allowed text-placeholder\"\n\t\t\t\t\t: \"cursor-pointer transition-colors duration-150 hover:bg-surface-neutral\",\n\t\t\t\tfocused && \"bg-surface-neutral\",\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\ttransform: CSS.Transform.toString(transform),\n\t\t\t\ttransition,\n\t\t\t}}\n\t\t\t{...attributes}\n\t\t>\n\t\t\t{sortableId && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"cursor-grab font-medium active:cursor-grabbing\"\n\t\t\t\t\t{...listeners}\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\t\tlisteners?.onClick(e);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Icon icon={faGripDotsVertical} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"flex w-full flex-1 items-center justify-between\">{children}</div>\n\t\t</li>\n\t);\n};\n","import { AsyncMultiSelect } from \"./AsyncMultiSelect\";\nimport { AsyncSelectProps } from \"./props\";\n\n/**\n * Thin wrapper around AsyncMultiSelect that only allows a single value to be selected.\n */\nexport const AsyncSelect = <T extends string | number>({\n\tvalue,\n\tonChange,\n\tallowUnselect = false,\n\t...rest\n}: AsyncSelectProps<T>) => {\n\tconst multiValue = value ? [value] : [];\n\treturn (\n\t\t<AsyncMultiSelect\n\t\t\tminSelection={allowUnselect ? 0 : 1}\n\t\t\tmaxSelection={1}\n\t\t\tvalue={multiValue}\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tonChange={(val) => onChange?.(val[0])}\n\t\t\t{...rest}\n\t\t/>\n\t);\n};\n","import { useMemo, useState } from \"react\";\n\nimport { AsyncMultiSelect } from \"./AsyncMultiSelect\";\nimport { MultiSelectProps } from \"./props\";\nimport { doesSelectItemMatch } from \"./selectItem\";\n\n/**\n * Thin wrapper around AsyncMultiSelect that does not support asynchronous loading, and\n * assumes all available options are provided in the `options` prop.\n */\nexport const MultiSelect = <T extends string | number>({\n\tvalue,\n\titems: options,\n\tonSearchChange,\n\tcustomValueToOption,\n\t...rest\n}: MultiSelectProps<T>) => {\n\tconst [query, setQuery] = useState(\"\");\n\tconst optionsForValues = useMemo(\n\t\t() =>\n\t\t\tvalue?.map((val) => {\n\t\t\t\tconst option = options.find((opt) => opt.value === val);\n\t\t\t\tif (option) return option;\n\t\t\t\tif (!customValueToOption) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: val,\n\t\t\t\t\t\tlabel: val.toString(),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn customValueToOption(val as string);\n\t\t\t}) ?? [],\n\t\t[customValueToOption, options, value],\n\t);\n\tconst optionsMatchingQuery = useMemo(\n\t\t() => options.filter((option) => doesSelectItemMatch(option, query)),\n\t\t[query, options],\n\t);\n\n\treturn (\n\t\t<AsyncMultiSelect\n\t\t\tvalue={value}\n\t\t\titems={[...optionsForValues, ...optionsMatchingQuery]}\n\t\t\tonSearchChange={(q) => {\n\t\t\t\tsetQuery(q);\n\t\t\t\tonSearchChange?.(q);\n\t\t\t}}\n\t\t\t{...rest}\n\t\t/>\n\t);\n};\n","import { MultiSelect } from \"./MultiSelect\";\nimport { SelectProps } from \"./props\";\n\n/**\n * Thin wrapper around MultiSelect that only allows a single value to be selected.\n */\nexport function Select<T extends string | number>({ value, onChange, allowUnselect, ...rest }: SelectProps<T>) {\n\t// Specifically allowing 0 as a valid value here\n\tconst multivalue = value || value === 0 ? [value] : [];\n\treturn (\n\t\t<MultiSelect\n\t\t\tvalue={multivalue}\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tonChange={(val) => onChange?.(val[0])}\n\t\t\tminSelection={allowUnselect ? 0 : 1}\n\t\t\tmaxSelection={1}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n","import { MultiSelect } from \"./MultiSelect\";\nimport { SelectWithUnselectProps } from \"./props\";\n\n/**\n * Thin wrapper around MultiSelect that only allows a single value to be selected.\n */\nexport function SelectWithUnselect<T extends string | number>({\n\tvalue,\n\tonChange,\n\t...rest\n}: SelectWithUnselectProps<T>) {\n\t// Specifically allowing 0 as a valid value here\n\tconst multivalue = value || value === 0 ? [value] : [];\n\treturn (\n\t\t<MultiSelect\n\t\t\tvalue={multivalue}\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tonChange={(val) => onChange?.(val[0] ?? null)}\n\t\t\tminSelection={0}\n\t\t\tmaxSelection={1}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n","import { ControlledFormItem } from \"@/core/form/components/ControlledFormItem\";\nimport { Select, SelectProps, SelectValue } from \"@/core/select\";\n\nimport { SharedFormItemProps } from \"./form-item\";\nimport { CommonSelectProps, SharedFormControlProps } from \"./types\";\n\nexport type FormSelectProps<TValue extends SelectValue> = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<SelectProps<TValue>, CommonSelectProps | \"loadProps\" | \"triggerPlaceholder\">;\n\nexport const FormSelect = <TValue extends SelectValue>({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tonChange,\n\t...rest\n}: FormSelectProps<TValue>) => {\n\treturn (\n\t\t<ControlledFormItem<TValue>\n\t\t\tname={name}\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={(field) => (\n\t\t\t\t<Select\n\t\t\t\t\t{...rest}\n\t\t\t\t\tvalue={field.value}\n\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\tonChange?.(value);\n\t\t\t\t\t}}\n\t\t\t\t\thasError={!!field.error}\n\t\t\t\t/>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { ControlledFormItem } from \"@/core/form/components/ControlledFormItem\";\nimport { MultiSelect, MultiSelectProps, SelectValue } from \"@/core/select\";\n\nimport { SharedFormItemProps } from \"./form-item\";\nimport { CommonSelectProps, SharedFormControlProps } from \"./types\";\n\nexport type FormMultiSelectProps<TValue extends SelectValue> = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<MultiSelectProps<TValue>, CommonSelectProps | \"allowCustomValues\" | \"minSelection\" | \"maxSelection\">;\n\nexport const FormMultiSelect = <TValue extends SelectValue>({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tonChange,\n\t...rest\n}: FormMultiSelectProps<TValue>) => {\n\treturn (\n\t\t<ControlledFormItem<TValue[]>\n\t\t\tname={name}\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={(field) => (\n\t\t\t\t<MultiSelect\n\t\t\t\t\t{...rest}\n\t\t\t\t\tvalue={field.value}\n\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\tonChange?.(value);\n\t\t\t\t\t}}\n\t\t\t\t\thasError={!!field.error}\n\t\t\t\t/>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { debounce } from \"lodash-es\";\n\nimport { UncontrolledField } from \"@/core/form\";\nimport { TextArea, TextAreaProps } from \"@/core/textarea/TextArea\";\n\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormTextAreaProps = SharedFormControlProps & SharedFormItemProps & TextAreaProps & { debounce?: number };\n\nexport const FormTextArea = ({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tdebounce: debounceInterval,\n\t...rest\n}: FormTextAreaProps) => (\n\t<UncontrolledField\n\t\tname={name}\n\t\trender={({ error, register }) => {\n\t\t\tconst controlFields = register();\n\t\t\treturn (\n\t\t\t\t<FormItem\n\t\t\t\t\tlayout={layout}\n\t\t\t\t\tstyles={styles}\n\t\t\t\t\tlabel={label}\n\t\t\t\t\toptions={options}\n\t\t\t\t\trender={\n\t\t\t\t\t\t<TextArea\n\t\t\t\t\t\t\t{...controlFields}\n\t\t\t\t\t\t\thasError={!!error || undefined}\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\tonChange={debounceInterval ? debounce(controlFields.onChange, debounceInterval) : controlFields.onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\terror={error}\n\t\t\t\t/>\n\t\t\t);\n\t\t}}\n\t/>\n);\n","import { forwardRef, TextareaHTMLAttributes } from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ErrorText } from \"../error-text/ErrorText\";\nimport { ErrorProps } from \"../types\";\n\nexport type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & Simplify<ErrorProps>;\n\nexport const TextAreaComp = forwardRef<HTMLTextAreaElement, TextAreaProps>(({ className, hasError, ...rest }, ref) => {\n\tconst ringClassName = rest.disabled\n\t\t? \"focus:outline-hidden focus:ring-0\"\n\t\t: hasError\n\t\t\t? \"focus:outline-hidden focus:ring-red-500 focus:border-red-500\"\n\t\t\t: \"focus:ring-2 focus:ring-indigo-200\";\n\n\treturn (\n\t\t<textarea\n\t\t\t{...rest}\n\t\t\tclassName={twMerge(\n\t\t\t\t\"block w-full resize-none rounded-md shadow-sm disabled:bg-surface-neutral\",\n\t\t\t\thasError\n\t\t\t\t\t? \"border-red-300 text-red-900 placeholder-red-300\"\n\t\t\t\t\t: \"border-surface-neutral placeholder-gray-400 focus:border-indigo-400\",\n\t\t\t\tringClassName,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tref={ref}\n\t\t/>\n\t);\n});\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(({ hasError, errorNode, ...rest }, ref) => (\n\t<>\n\t\t<TextAreaComp {...rest} hasError={hasError} ref={ref} />\n\t\t{hasError && <ErrorText className=\"mt-2 text-sm\">{errorNode}</ErrorText>}\n\t</>\n));\n","import { twJoin } from \"tailwind-merge\";\n\nimport { ControlledField } from \"@/core/form\";\nimport { ControlledFormItem } from \"@/core/form/components/ControlledFormItem\";\nimport { Switch } from \"@/core/switch\";\n\nimport { SharedFormItemProps } from \"./form-item\";\nimport { FieldDescription } from \"./form-item/FieldDescription\";\nimport { FieldErrorMessage } from \"./form-item/FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./form-item/FieldLabelWithTooltip\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormSwitchProps = SharedFormControlProps & SharedFormItemProps & { onChange?: (value: boolean) => void };\n\nexport const FormSwitch = ({ name, styles, layout, label, options, onChange, ...props }: FormSwitchProps) => {\n\tif (layout === \"side-by-side\") {\n\t\treturn (\n\t\t\t<ControlledField\n\t\t\t\tname={name}\n\t\t\t\trender={(field) => (\n\t\t\t\t\t<div className={twJoin(\"flex items-start gap-x-2\", styles)}>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tchecked={!!field.value}\n\t\t\t\t\t\t\t\tonCheckedChange={(value) => {\n\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\tonChange?.(value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"pt-1\">\n\t\t\t\t\t\t\t<FieldLabelWithTooltip label={label} options={options} />\n\t\t\t\t\t\t\t<FieldDescription styles=\"pt-0.5\">{options?.description}</FieldDescription>\n\t\t\t\t\t\t\t<FieldErrorMessage error={field.error} />\n\t\t\t\t\t\t\t{options?.bottomSlot}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ControlledFormItem<boolean>\n\t\t\tname={name}\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={(field) => <Switch {...props} checked={!!field.value} onCheckedChange={field.onChange} />}\n\t\t/>\n\t);\n};\n","import * as RadixSwitch from \"@radix-ui/react-switch\";\nimport * as React from \"react\";\n\nexport type SwitchIdValue = string | undefined;\n\nconst SwitchIdContext = React.createContext<SwitchIdValue>(undefined);\nexport const useSwitchId = () => React.useContext(SwitchIdContext);\n\nconst SwitchControl = (props: Simplify<RadixSwitch.SwitchProps>) => {\n\tconst id = useSwitchId();\n\treturn (\n\t\t<RadixSwitch.Root\n\t\t\t{...props}\n\t\t\tid={id}\n\t\t\tclassName=\"flex h-5 w-9 shrink-0 items-center rounded-full bg-surface-dark focus:outline-hidden focus-visible:ring-2 focus-visible:ring-indigo-400 focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:bg-surface-neutral data-[state=checked]:bg-indigo-700\"\n\t\t>\n\t\t\t<RadixSwitch.Thumb className=\"block h-4 w-4 translate-x-0.5 rounded-full bg-white duration-100 data-disabled:shadow-none data-[state=checked]:translate-x-[18px]\" />\n\t\t</RadixSwitch.Root>\n\t);\n};\n\nconst SwitchLabel = (props: React.ComponentPropsWithoutRef<\"label\">) => {\n\tconst id = useSwitchId();\n\treturn <label {...props} htmlFor={id} />;\n};\n\nexport const Switch = ({ children, className, ...rest }: Simplify<Omit<RadixSwitch.SwitchProps, \"id\">>) => {\n\tconst autoId = React.useId();\n\n\tif (children == null) {\n\t\treturn <SwitchControl {...rest} />;\n\t}\n\treturn (\n\t\t<SwitchIdContext.Provider value={autoId}>\n\t\t\t<span className={className}>{children}</span>\n\t\t</SwitchIdContext.Provider>\n\t);\n};\n\nSwitch.Control = SwitchControl;\nSwitch.Label = SwitchLabel;\n","import { forwardRef } from \"react\";\n\nimport { PropsWithClassName } from \"@/core/types\";\n\nimport { RadioButtonGroupItem, RadioButtonItem } from \"./RadioButtonItem\";\n\nexport type RadioButtonGroupProps = PropsWithClassName<{\n\titems: RadioButtonGroupItem[];\n\n\tvalue?: string | undefined;\n\tonChange?: (newValue: string) => void;\n\n\tasCards?: boolean; // Display the radio button inputs as cards\n}>;\n\nexport const RadioButtonGroup = forwardRef<HTMLFieldSetElement, RadioButtonGroupProps>(\n\t({ className, items, onChange, value, asCards = false }, ref) => (\n\t\t<fieldset ref={ref} className={className}>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{items.map(\n\t\t\t\t\t(\n\t\t\t\t\t\t{ value: itemValue, displayValue, description, expandedContents, expandedContentsStyle, disabled },\n\t\t\t\t\t\tindex,\n\t\t\t\t\t) => (\n\t\t\t\t\t\t<RadioButtonItem\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\t\tisChecked={value === itemValue}\n\t\t\t\t\t\t\tvalue={itemValue}\n\t\t\t\t\t\t\tdisplayValue={displayValue}\n\t\t\t\t\t\t\tdescription={description}\n\t\t\t\t\t\t\texpandedContents={expandedContents}\n\t\t\t\t\t\t\texpandedContentsStyle={expandedContentsStyle}\n\t\t\t\t\t\t\tasCard={asCards}\n\t\t\t\t\t\t/>\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</fieldset>\n\t),\n);\n","import { twJoin } from \"tailwind-merge\";\n\nexport type RadioButtonGroupItem = {\n\tvalue: string;\n\tdisplayValue: string;\n\tdescription?: string | React.ReactNode;\n\texpandedContents?: (isDisabled: boolean) => React.ReactNode;\n\texpandedContentsStyle?: \"inline\" | \"block\";\n\tdisabled?: boolean;\n};\n\nexport type RadioButtonItemProps = RadioButtonGroupItem & {\n\tisChecked: boolean;\n\tonSelect?: (value: string) => void;\n\tasCard?: boolean;\n};\n\nexport const RadioButtonItem = ({\n\tvalue,\n\tdisplayValue,\n\tdescription,\n\texpandedContents,\n\texpandedContentsStyle,\n\tdisabled,\n\tisChecked,\n\tonSelect,\n\tasCard = false,\n}: RadioButtonItemProps) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex flex-col gap-2\",\n\t\t\tasCard && \"rounded-md border px-3 py-2\",\n\t\t\tasCard && !isChecked && \"border-surface-neutral\",\n\t\t\tasCard && isChecked && \"border-indigo-500\",\n\t\t)}\n\t>\n\t\t<div\n\t\t\tclassName={twJoin(\n\t\t\t\t\"relative flex gap-2\",\n\t\t\t\tdisabled && \"cursor-not-allowed opacity-30 *:cursor-not-allowed\",\n\t\t\t\texpandedContentsStyle === \"inline\" ? \"items-center\" : \"items-start\",\n\t\t\t)}\n\t\t>\n\t\t\t<input\n\t\t\t\tonChange={(evt) => onSelect?.(evt.target.value)}\n\t\t\t\tid={value}\n\t\t\t\tvalue={value}\n\t\t\t\tchecked={isChecked}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttype=\"radio\"\n\t\t\t\tclassName=\"mt-px border-surface-neutral p-2 text-indigo-700 ring-0 ring-indigo-700\"\n\t\t\t/>\n\t\t\t{expandedContentsStyle === \"inline\" ? (\n\t\t\t\t<label htmlFor={value} className=\"flex w-full flex-row gap-2.5\">\n\t\t\t\t\t<div className=\"flex w-9/12 items-center gap-2\">\n\t\t\t\t\t\t<div className=\"font-medium\">{displayValue}</div>\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<div id={`${value}-description`} className=\"text-muted\">\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex w-3/12 items-center\">{expandedContents?.(!isChecked || !!disabled)}</div>\n\t\t\t\t</label>\n\t\t\t) : (\n\t\t\t\t<label htmlFor={value} className=\"flex flex-col gap-2\">\n\t\t\t\t\t<div className=\"font-medium\">{displayValue}</div>\n\t\t\t\t</label>\n\t\t\t)}\n\t\t</div>\n\t\t{expandedContentsStyle !== \"inline\" && (\n\t\t\t<>\n\t\t\t\t{description && (\n\t\t\t\t\t<div id={`${value}-description`} className=\"text-muted\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{expandedContents?.(!isChecked || !!disabled)}\n\t\t\t</>\n\t\t)}\n\t</div>\n);\n","import { ControlledField } from \"@/core/form\";\nimport { RadioButtonGroup, RadioButtonGroupProps } from \"@/core/radio-button-group\";\n\nimport { FieldErrorMessage } from \"./form-item/FieldErrorMessage\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormRadioButtonGroupProps = Simplify<\n\tPick<SharedFormControlProps, \"name\"> & Pick<RadioButtonGroupProps, \"items\" | \"onChange\" | \"className\" | \"asCards\">\n>;\n\nexport const FormRadioButtonGroup = ({\n\tname,\n\titems,\n\tonChange,\n\tasCards = false,\n\tclassName,\n}: FormRadioButtonGroupProps) => (\n\t<ControlledField\n\t\tname={name}\n\t\trender={(field) => (\n\t\t\t<>\n\t\t\t\t<RadioButtonGroup\n\t\t\t\t\t{...field}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\titems={items}\n\t\t\t\t\tonChange={(newValue) => {\n\t\t\t\t\t\tfield.onChange(newValue);\n\t\t\t\t\t\tonChange?.(newValue);\n\t\t\t\t\t}}\n\t\t\t\t\tasCards={asCards}\n\t\t\t\t/>\n\t\t\t\t<FieldErrorMessage error={field.error} />\n\t\t\t</>\n\t\t)}\n\t/>\n);\n","import { useCallback } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { DatePicker, DatePickerProps } from \"@/core/date-picker/DatePicker\";\nimport { useControlledFormField } from \"@/core/form\";\n\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormDatePickerProps = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<DatePickerProps, \"placeholder\" | \"minDate\" | \"range\" | \"onChange\" | \"maxDate\" | \"showTimeInput\"> & {\n\t\tcontainerRef?: React.RefObject<HTMLDivElement>;\n\t};\n\nexport const FormDatePicker = ({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\tonChange,\n\toptions,\n\tcontainerRef,\n\tdisabled,\n\t...rest\n}: FormDatePickerProps) => {\n\tconst {\n\t\tonChange: onChangeInternal,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tvalue,\n\t\terror,\n\t} = useControlledFormField({ name });\n\n\t// TODO: This is a hack to get around the fact that the date picker doesn't support null values\n\tconst handleChange = useCallback(\n\t\t(newValue: any) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tonChange?.(newValue ?? null);\n\t\t\tonChangeInternal(newValue ?? null);\n\t\t},\n\t\t[onChangeInternal, onChange],\n\t);\n\n\treturn (\n\t\t<FormItem\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\tref={containerRef}\n\t\t\trender={\n\t\t\t\t<div className={twJoin(disabled && \"text-muted\")}>\n\t\t\t\t\t<DatePicker\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\thasError={!!error}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\terror={error}\n\t\t/>\n\t);\n};\n","import { forwardRef, Suspense, useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { LoadingState } from \"../loaders\";\nimport { DrawerStateContext } from \"./drawerState\";\nimport { PersistDrawerWidth, useDrawerResize } from \"./useDrawerResize\";\n\nconst useKeypress = (key: string, action: () => void) => {\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst onKeyup = (e: KeyboardEvent) => {\n\t\t\tif (e.key === key) action();\n\t\t};\n\t\tdocument.addEventListener(\"keyup\", onKeyup);\n\t\treturn () => document.removeEventListener(\"keyup\", onKeyup);\n\t}, [action, key]);\n};\n\nexport const drawerSizes = {\n\tsm: 1 / 2,\n\tmd: 3 / 4,\n\tlg: 5 / 6,\n};\n\nexport type DrawerProps = {\n\tisOpen: boolean;\n\tonClose?: () => void;\n\tonClickOutside?: () => void;\n\tblurredOverlay?: boolean;\n\twidth?: keyof typeof drawerSizes;\n\tpersistWidth?: PersistDrawerWidth;\n\tchildren: React.ReactNode;\n};\n\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(\n\t({ isOpen, onClose, onClickOutside, blurredOverlay, children, width = \"md\", persistWidth }, ref) => {\n\t\tconst slider = useRef<HTMLDivElement>(null);\n\t\tconst drawer = useRef<HTMLDivElement>(null);\n\t\tuseDrawerResize({\n\t\t\tslider,\n\t\t\tdrawer,\n\t\t\tisOpen,\n\t\t\tdefaultSizePct: drawerSizes[width],\n\t\t\tpersistWidth,\n\t\t});\n\n\t\tuseKeypress(\"Escape\", () => {\n\t\t\tonClose?.();\n\t\t});\n\n\t\treturn (\n\t\t\t<DrawerStateContext.Provider\n\t\t\t\tvalue={{\n\t\t\t\t\tisOpen,\n\t\t\t\t\tonClose: () => onClose?.(),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"absolute inset-0 z-30 transition-all\",\n\t\t\t\t\t\tisOpen && blurredOverlay && \"bg-surface-light/10 backdrop-blur-sm\",\n\t\t\t\t\t\t// If the drawer is open, and the blurredOverlay prop is given, stop the user from clicking through the overlay\n\t\t\t\t\t\tisOpen && blurredOverlay ? \"pointer-events-auto\" : \"pointer-events-none\",\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={onClickOutside}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tref={slider}\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"group absolute top-0 bottom-0 z-50 h-screen w-4 translate-x-1/2 cursor-col-resize\",\n\t\t\t\t\t\tisOpen ? \"block\" : \"hidden\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"absolute top-0 right-1.5 bottom-0 left-1.5 bg-indigo-700 opacity-0 transition-opacity group-hover:opacity-100\" />\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\t// width transition div\n\t\t\t\t\tclassName=\"absolute top-0 right-0 bottom-0 z-drawer flex flex-col overflow-y-hidden bg-surface-light shadow\"\n\t\t\t\t\tref={drawer}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t// delayed opacity transition div\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"relative flex w-full flex-1 flex-col overflow-hidden bg-white transition-all delay-100 duration-100 ease-in-out\",\n\t\t\t\t\t\t\tisOpen ? \"opacity-100\" : \"opacity-0\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isOpen ? <Suspense fallback={<LoadingState />}>{children}</Suspense> : undefined}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DrawerStateContext.Provider>\n\t\t);\n\t},\n);\n","import { SizeProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinnerThird } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport type LoaderProps = {\n\tclassName?: string;\n\tsize?: SizeProp;\n};\n\nexport const Spinner = ({ className, ...props }: LoaderProps) => (\n\t<FontAwesomeIcon {...props} className={twJoin(\"animate-spin text-muted\", className)} icon={faSpinnerThird} />\n);\n","import { SizeProp } from \"@fortawesome/fontawesome-svg-core\";\n\nimport { Text } from \"@/core/text/Text\";\n\nimport { Spinner } from \"./Spinner\";\n\nexport type LoadingStateProps = {\n\tsize?: SizeProp;\n\ttitle?: React.ReactNode;\n\tdescription?: React.ReactNode;\n};\n\nconst LoadingStateTemplate = ({ children }: { children?: React.ReactNode }) => (\n\t<div className=\"inset-0 z-10 flex h-full items-center justify-center\">{children}</div>\n);\n\nexport const LoadingState = ({ size = \"2x\", title, description }: LoadingStateProps) => (\n\t<LoadingStateTemplate>\n\t\t<div className=\"flex flex-col items-center justify-center gap-3\">\n\t\t\t<Spinner size={size} />\n\t\t\t{(title || description) && (\n\t\t\t\t<div className=\"flex max-w-prose flex-col text-center\">\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<Text variant=\"title-3\" className=\"text-muted\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{description && (\n\t\t\t\t\t\t<Text variant=\"footnote\" className=\"leading-5 text-muted\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t</LoadingStateTemplate>\n);\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type LoadingBarProps = {\n\tclassName?: string;\n};\n\nexport const LoadingBar = ({ className }: LoadingBarProps) => (\n\t<div className={twMerge(\"relative h-3 w-full overflow-hidden rounded-full bg-surface-neutral\", className)}>\n\t\t<div\n\t\t\tclassName=\"absolute inset-0 w-full animate-loading-slide bg-linear-to-r from-transparent via-indigo-400/60 to-transparent\"\n\t\t\tstyle={{ width: \"50%\" }}\n\t\t/>\n\t</div>\n);\n","import { Text } from \"@/core/text/Text\";\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type TwoCirclesSpinnerProps = {\n\tclassName?: string;\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n\ttitle?: React.ReactNode;\n\tdescription?: React.ReactNode;\n};\n\nconst sizeConfig = {\n\tsm: { className: \"w-[30px] h-[30px]\", strokeWidth: 8 },\n\tmd: { className: \"w-[50px] h-[50px]\", strokeWidth: 5 },\n\tlg: { className: \"w-[100px] h-[100px]\", strokeWidth: 3 },\n\txl: { className: \"w-[200px] h-[200px]\", strokeWidth: 2 },\n};\n\nconst SpinnerSvg = ({ size = \"md\" }: { size?: TwoCirclesSpinnerProps[\"size\"] }) => {\n\tconst { className: sizeClass, strokeWidth } = sizeConfig[size];\n\n\treturn (\n\t\t<div className={twMerge(\"relative\", sizeClass)}>\n\t\t\t<svg className=\"absolute inset-0 animate-orbit-large\" viewBox=\"0 0 100 100\" fill=\"none\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M 95 50 A 45 45 0 0 1 5 50\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName=\"text-indigo-600\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t<svg className=\"absolute inset-0 animate-orbit-small\" viewBox=\"0 0 100 100\" fill=\"none\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M 75 50 A 25 25 0 0 1 25 50\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName=\"text-gray-200\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t);\n};\n\nexport const TwoCirclesSpinner = ({ className, size = \"md\", title, description }: TwoCirclesSpinnerProps) => (\n\t<div className={twMerge(\"flex flex-col items-center justify-center gap-3\", className)}>\n\t\t<SpinnerSvg size={size} />\n\t\t{(title || description) && (\n\t\t\t<div className=\"flex max-w-prose flex-col text-center\">\n\t\t\t\t{title && (\n\t\t\t\t\t<Text variant=\"title-3\" className=\"text-muted\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{description && (\n\t\t\t\t\t<Text variant=\"footnote\" className=\"leading-5 text-muted\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)}\n\t</div>\n);\n","import { createContext, useContext } from \"react\";\n\nexport type DrawerState = {\n\tisOpen: boolean;\n\tonClose: () => void;\n};\n\nexport const DrawerStateContext = createContext<DrawerState>({\n\tisOpen: false,\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\tonClose: () => {},\n});\n\nexport const useDrawer = () => {\n\tconst context = useContext(DrawerStateContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\"useDrawer must be used within a DrawerStateContext\");\n\t}\n\treturn context;\n};\n","import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nconst MIN_LEFT_SPACE = 240; // minimum space the drawer should allow on the left side of the screen, should be at least as big as sidebar\nconst MIN_WIDTH_PCT = 0.5;\nconst MIN_WIDTH_PX = 500;\n\nexport type UseDrawerResizeParams = {\n\tslider: RefObject<HTMLDivElement>;\n\tdrawer: RefObject<HTMLDivElement>;\n\tisOpen: boolean;\n\tdefaultSizePct: number;\n\tpersistWidth?: PersistDrawerWidth;\n};\n\nexport type PersistDrawerWidth = {\n\tload: () => number | undefined;\n\tsave: (widthPct: number) => void;\n};\n\nconst constraintPct = (val: number) => Math.min(1, Math.max(0, val));\nexport const localStoragePersist = (key: string): PersistDrawerWidth => ({\n\tload: () => {\n\t\ttry {\n\t\t\tconst val = localStorage.getItem(key);\n\t\t\tif (val && !Number.isNaN(Number(val))) {\n\t\t\t\treturn constraintPct(Number(val));\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t},\n\tsave: (size: number) => {\n\t\ttry {\n\t\t\tlocalStorage.setItem(key, constraintPct(size).toString());\n\t\t} catch {\n\t\t\t// do nothing\n\t\t}\n\t},\n});\n\nconst computeWidth = (pct: number) => window.innerWidth * pct;\nconst computePct = (widthPx: number) => widthPx / window.innerWidth;\n\nconst constrainedWidth = (width: number) => {\n\tconst minWidth = Math.max(window.innerWidth * MIN_WIDTH_PCT, MIN_WIDTH_PX);\n\tconst maxWidth = window.innerWidth - MIN_LEFT_SPACE;\n\treturn Math.min(Math.max(width, minWidth), maxWidth);\n};\n\nexport const useDrawerResize = ({ slider, drawer, isOpen, defaultSizePct, persistWidth }: UseDrawerResizeParams) => {\n\tconst widthPx = useRef(computeWidth(defaultSizePct));\n\n\tconst toggleOpen = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (slider.current && drawer.current) {\n\t\t\t\tdrawer.current.style.transition = `right 200ms ease-out, opacity 200ms`;\n\t\t\t\tslider.current.style.right = open ? `${widthPx.current}px` : \"0\";\n\t\t\t\tdrawer.current.style.right = open ? \"0\" : `-200px`;\n\t\t\t\tdrawer.current.style.opacity = open ? \"1\" : \"0\";\n\t\t\t\tdrawer.current.style.pointerEvents = open ? \"auto\" : \"none\";\n\t\t\t}\n\t\t},\n\t\t[drawer, slider],\n\t);\n\tconst setWidth = useCallback(\n\t\t(width: number) => {\n\t\t\twidthPx.current = width;\n\t\t\tif (slider.current && drawer.current) {\n\t\t\t\t// eslint-disable-next-line react-compiler/react-compiler\n\t\t\t\tdrawer.current.style.transition = \"none\";\n\t\t\t\tslider.current.style.right = `${width}px`;\n\t\t\t\tdrawer.current.style.width = `${width}px`;\n\t\t\t}\n\t\t\tif (width !== 0) {\n\t\t\t\tpersistWidth?.save?.(computePct(width));\n\t\t\t}\n\t\t},\n\t\t[drawer, persistWidth, slider],\n\t);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (slider.current) {\n\t\t\tconst onPointerDown = (e: PointerEvent) => {\n\t\t\t\tdocument.body.style.userSelect = \"none\";\n\t\t\t\tconst startX = e.clientX;\n\t\t\t\tconst startWidth = widthPx.current;\n\t\t\t\tconst onPointerMove = (evt: PointerEvent) => {\n\t\t\t\t\tconst newWidth = startWidth + (startX - evt.clientX);\n\t\t\t\t\tsetWidth(constrainedWidth(newWidth));\n\t\t\t\t};\n\t\t\t\tconst onPointerUp = () => {\n\t\t\t\t\tdocument.body.style.userSelect = \"auto\";\n\t\t\t\t\twindow.removeEventListener(\"pointermove\", onPointerMove);\n\t\t\t\t\twindow.removeEventListener(\"pointerup\", onPointerUp);\n\t\t\t\t};\n\t\t\t\twindow.addEventListener(\"pointermove\", onPointerMove);\n\t\t\t\twindow.addEventListener(\"pointerup\", onPointerUp);\n\t\t\t};\n\t\t\tconst sliderNode = slider.current;\n\t\t\tsliderNode.addEventListener(\"pointerdown\", onPointerDown);\n\t\t\treturn () => {\n\t\t\t\tsliderNode.removeEventListener(\"pointerdown\", onPointerDown);\n\t\t\t};\n\t\t}\n\t}, [setWidth, slider]);\n\n\tconst loadWidth = useCallback(() => {\n\t\tif (!isOpen) {\n\t\t\ttoggleOpen(false);\n\t\t} else {\n\t\t\tconst savedWidthPct = persistWidth?.load?.();\n\t\t\tconst width = savedWidthPct ? constrainedWidth(computeWidth(savedWidthPct)) : computeWidth(defaultSizePct);\n\t\t\tsetWidth(width);\n\t\t\ttoggleOpen(true);\n\t\t}\n\t}, [defaultSizePct, isOpen, toggleOpen, persistWidth, setWidth]);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (slider.current && drawer.current) {\n\t\t\tloadWidth();\n\t\t}\n\t}, [slider, drawer, loadWidth]);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\twindow.addEventListener(\"resize\", loadWidth);\n\t\treturn () => window.removeEventListener(\"resize\", loadWidth);\n\t}, [loadWidth]);\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { faBookmark, faChevronDown, faChevronUp, faClose } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Text } from \"@/core/text\";\n\nimport { Button } from \"../button\";\nimport { Icon } from \"../icon\";\nimport { Skeleton } from \"../skeleton\";\nimport { useDrawer } from \"./drawerState\";\n\nexport type DrawerHeaderProps = {\n\tresource?: {\n\t\ticon?: IconDefinition;\n\t\tname: string;\n\t};\n\tpagination?: {\n\t\thasNext: boolean;\n\t\thasPrevious: boolean;\n\t\tonNext: () => void;\n\t\tonPrevious: () => void;\n\t\textra?: React.ReactNode;\n\t};\n\ttitle: React.ReactNode;\n\tsubtitle?: React.ReactNode;\n\tactions?: React.ReactNode;\n\tlabel?: React.ReactNode;\n\tcloseAction?: React.ReactNode;\n};\n\nexport const DrawerHeader = ({\n\tresource,\n\tpagination,\n\ttitle,\n\tsubtitle,\n\tactions,\n\tcloseAction,\n\tlabel,\n}: DrawerHeaderProps) => {\n\tconst { onClose } = useDrawer();\n\treturn (\n\t\t<div className=\"z-1 flex w-full flex-col items-stretch shadow\">\n\t\t\t<div className=\"flex justify-between px-8 py-1 shadow-sm\">\n\t\t\t\t<div className=\"flex items-center gap-1.5 text-base text-muted\">\n\t\t\t\t\t{resource && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Icon icon={resource.icon || faBookmark} />\n\t\t\t\t\t\t\t<div>{resource.name}</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{pagination && (\n\t\t\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t\t\t{pagination.extra}\n\t\t\t\t\t\t\t<Button size=\"sm\" onClick={pagination.onPrevious} disabled={!pagination.hasPrevious}>\n\t\t\t\t\t\t\t\t<Icon icon={faChevronUp} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button size=\"sm\" onClick={pagination.onNext} disabled={!pagination.hasNext}>\n\t\t\t\t\t\t\t\t<Icon icon={faChevronDown} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{closeAction ?? (\n\t\t\t\t\t\t<Button size=\"xs\" variant=\"transparent\" onClick={onClose}>\n\t\t\t\t\t\t\t<span className=\"text-xl text-muted\">\n\t\t\t\t\t\t\t\t<Icon icon={faClose} />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-2 px-8 py-2\">\n\t\t\t\t<div className=\"flex min-w-0 shrink grow flex-col\">\n\t\t\t\t\t<Text variant=\"title-1\" className={twJoin(typeof title === \"string\" && \"truncate\")}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{subtitle && <div className=\"text-base font-light\">{subtitle}</div>}\n\t\t\t\t</div>\n\t\t\t\t{label && <div className=\"flex items-center gap-2\">{label}</div>}\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-2\">{actions}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport const DrawerHeaderSkeleton = () => (\n\t<div className=\"space-y-2 px-8 py-2\">\n\t\t<div className=\"flex justify-between\">\n\t\t\t<Skeleton className=\"h-6 w-36\" />\n\t\t\t<Skeleton className=\"h-6 w-16\" />\n\t\t</div>\n\t\t<Skeleton className=\"h-8 w-28\" />\n\t</div>\n);\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type SkeletonProps = {\n\tclassName?: string;\n};\n\nexport const Skeleton = ({ className }: SkeletonProps) => (\n\t<div className={twMerge(\"animate-skeleton-pulse rounded-lg bg-surface-dark\", className)} />\n);\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Skeleton } from \"../Skeleton\";\n\nexport type TabsSkeletonProps = {\n\tnumTabs?: number;\n\tclassName?: string;\n\ttabClassName?: string;\n};\n\n// Composes several base skeleton components into a row to represent a tab group\nexport const TabsSkeleton = ({ numTabs = 3, className, tabClassName = \"h-8 w-32\" }: TabsSkeletonProps) => {\n\treturn (\n\t\t<div className={twMerge(\"flex gap-4\", className)}>\n\t\t\t{Array.from({ length: numTabs }).map((_, index) => (\n\t\t\t\t<Skeleton key={index} className={tabClassName} />\n\t\t\t))}\n\t\t</div>\n\t);\n};\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Skeleton } from \"../Skeleton\";\n\nexport type TableSkeletonProps = {\n\tnumTableCols?: number;\n\tnumTableRows?: number;\n\tclassName?: string;\n\trowHeight?: number;\n\thasBorder?: boolean;\n};\n\n// Composes base skeleton components into a loose table layout\nexport const TableSkeleton = ({\n\tnumTableCols = 4,\n\tnumTableRows = 3,\n\tclassName,\n\trowHeight,\n\thasBorder = false,\n}: TableSkeletonProps) => {\n\treturn (\n\t\t<table className={twJoin(\"flex w-full flex-col gap-4\", className)}>\n\t\t\t<tbody className={twJoin(\"flex flex-col\", rowHeight === undefined && \"gap-4\")}>\n\t\t\t\t{Array.from({ length: numTableRows }).map((_, index) => (\n\t\t\t\t\t<tr\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName={twJoin(\"flex gap-4\", hasBorder && \"px-2 not-last:border-b\")}\n\t\t\t\t\t\tstyle={rowHeight ? { height: rowHeight } : undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t{Array.from({ length: numTableCols }).map((_, index) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<td key={index} className=\"flex grow items-center px-1\">\n\t\t\t\t\t\t\t\t\t<Skeleton key={index} className={twJoin(\"w-full\", rowHeight ? \"h-3\" : \"h-6\")} />\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</tr>\n\t\t\t\t))}\n\t\t\t</tbody>\n\t\t</table>\n\t);\n};\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Skeleton } from \"../Skeleton\";\n\nexport type TableCheckboxSkeletonProps = {\n\tnumTableRows?: number;\n\tclassName?: string;\n\trowHeight?: number;\n\thasBorder?: boolean;\n};\n\n// Composes base skeleton components into a checkbox column layout\n// for tables that enable selection\nexport const TableCheckboxSkeleton = ({\n\tnumTableRows = 3,\n\tclassName,\n\trowHeight,\n\thasBorder = false,\n}: TableCheckboxSkeletonProps) => {\n\treturn (\n\t\t<table className={twJoin(\"flex w-full flex-col gap-4\", className)}>\n\t\t\t<tbody className={twJoin(\"flex flex-col\", rowHeight === undefined && \"gap-4\")}>\n\t\t\t\t{Array.from({ length: numTableRows }).map((_, index) => (\n\t\t\t\t\t<tr\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName={twJoin(\"flex gap-4\", hasBorder && \"px-2 not-last:border-b\")}\n\t\t\t\t\t\tstyle={rowHeight ? { height: rowHeight } : undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t<td key={index} className=\"flex grow items-center px-1\">\n\t\t\t\t\t\t\t<Skeleton key={index} className={twJoin(\"w-full rounded-none\", rowHeight ? \"h-3\" : \"h-6\")} />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t))}\n\t\t\t</tbody>\n\t\t</table>\n\t);\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCircleDashed } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { forwardRef } from \"react\";\n\nimport { Text } from \"../text\";\n\nexport type EmptyStateProps = {\n\ticon?: IconDefinition;\n\ttitle: React.ReactNode;\n\tdescription?: React.ReactNode;\n};\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n\t({ icon = faCircleDashed, title, description }, ref) => (\n\t\t<div className=\"flex flex-col items-center justify-center gap-3 p-4\" ref={ref}>\n\t\t\t{/* Note that we add the `ring-transparent` class name because if the icon name used\n\t\t\tis \"life ring\" then the \"ring\" class name is interpreted poorly by tailwind. */}\n\t\t\t<FontAwesomeIcon className=\"text-muted ring-transparent\" icon={icon} size=\"2x\" />\n\n\t\t\t<div className=\"flex max-w-prose flex-col text-center\">\n\t\t\t\t{title && (\n\t\t\t\t\t<Text variant=\"title-3\" className=\"text-muted\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{description && (\n\t\t\t\t\t<Text variant=\"footnote\" className=\"leading-5 text-muted\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t),\n);\n","import { ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Popover } from \"@/core/popover\";\nimport { Text } from \"@/core/text\";\n\nexport type HeaderTileProps = {\n\ttitle: string;\n\tcontent: string | ReactNode;\n\tpopover?: ReactNode;\n\tclassName?: string;\n\tgrouped?: boolean;\n};\n\nconst HeaderTileSimple = ({ title, content, className, grouped }: Omit<HeaderTileProps, \"popover\">) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex h-18.5 w-fit flex-col items-start justify-between px-3 py-1.5\",\n\t\t\t!grouped && \"rounded-md border border-surface-neutral\",\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t<Text variant=\"label\" className=\"text-neutral\">\n\t\t\t{title}\n\t\t</Text>\n\t\t{typeof content === \"string\" ? <Text className=\"text-neutral\">{content}</Text> : content}\n\t</div>\n);\n\nconst HeaderTileWithPopover = ({ title, content, popover, className, grouped }: HeaderTileProps) => (\n\t<div className=\"w-fit\">\n\t\t<Popover.Root>\n\t\t\t<Popover.Trigger\n\t\t\t\tvariant=\"transparent\"\n\t\t\t\tsoften=\"none\"\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"flex h-18.5! w-fit justify-start px-3 py-1.5 transition-all duration-150 ease-in-out hover:shadow-md\",\n\t\t\t\t\t!grouped && \"rounded-md border border-surface-neutral\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-start justify-between\">\n\t\t\t\t\t<Text variant=\"label\" as=\"span\" className=\"text-neutral\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{typeof content === \"string\" ? (\n\t\t\t\t\t\t<Text as=\"span\" className=\"text-neutral\">\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tcontent\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Popover.Trigger>\n\t\t\t{popover && <Popover.Body contentClassName=\"max-w-150 min-w-60 p-3\">{popover}</Popover.Body>}\n\t\t</Popover.Root>\n\t</div>\n);\n\nexport const HeaderTile = (props: HeaderTileProps) => {\n\tif (props.popover) {\n\t\treturn <HeaderTileWithPopover {...props} />;\n\t}\n\treturn <HeaderTileSimple {...props} />;\n};\n","import { ComponentProps, ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { HeaderTile } from \"./HeaderTile\";\n\nexport type HeaderTileGroupProps = {\n\tchildren: ReactNode;\n\tclassName?: string;\n};\n\nexport const HeaderTileGroup = ({ children, className }: HeaderTileGroupProps) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex w-fit items-center divide-x divide-surface-neutral rounded-md border border-surface-neutral\",\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t{children}\n\t</div>\n);\n\nHeaderTileGroup.Tile = (props: ComponentProps<typeof HeaderTile>) => <HeaderTile {...props} grouped />;\n","import * as React from \"react\";\n\nimport { LabelStyleProps, labelStyles } from \"./labelStyles\";\n\nexport type LabelProps = {\n\tchildren: React.ReactNode;\n} & LabelStyleProps;\n\nconst LabelImpl = (\n\t{ children, intent, size, variant, ...rest }: LabelProps,\n\tref: React.ForwardedRef<HTMLSpanElement>,\n) => {\n\treturn (\n\t\t<span ref={ref} className={labelStyles({ intent, size, variant })} {...rest}>\n\t\t\t{children}\n\t\t</span>\n\t);\n};\n\nexport const Label = React.forwardRef(LabelImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Intent, Size } from \"../variants\";\n\nexport type LabelIntent = Intent | \"disabled\";\nexport type LabelVariant = \"default\" | \"dark\";\n\nexport type LabelStyleProps = {\n\tvariant?: LabelVariant;\n\tintent?: LabelIntent;\n\tsize?: Size;\n};\n\nconst sizeStyles: Record<Size, string> = {\n\txs: \"px-1 text-xs gap-0.5 h-4 rounded-md\",\n\tsm: \"h-5 gap-0.5 px-1 text-sm rounded-md\",\n\tmd: \"h-6 gap-1 px-2 text-base rounded-lg\",\n\tlg: \"h-7 gap-1 px-2 text-lg rounded-lg\",\n};\n\nconst colorStyles: Record<LabelVariant, Partial<Record<LabelIntent, string>>> = {\n\tdefault: {\n\t\tdefault: \"bg-surface-neutral text-neutral border border-surface-neutral\",\n\t\tprimary: \"bg-indigo-100 text-indigo-700 border border-indigo-200\",\n\t\tsuccess: \"bg-surface-success text-success border border-surface-success\",\n\t\twarning: \"bg-surface-warning text-warning border border-surface-warning\",\n\t\tdanger: \"bg-surface-danger text-red-700 border border-surface-danger\",\n\t\tdisabled: \"bg-surface-neutral text-placeholder border border-surface-neutral\",\n\t},\n\tdark: {\n\t\tdefault: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\t/**\n\t\t * Note(Stephen): We don't yet have tokens for all `intent` values for the dark variant.\n\t\t * Making them the same as default for now rather than wrestle with types as they are unused.\n\t\t */\n\t\tprimary: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\tsuccess: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\twarning: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\tdanger: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\tdisabled: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t},\n};\n\nexport const labelStyles = ({ intent = \"default\", size = \"sm\", variant = \"default\" }: LabelStyleProps) =>\n\ttwJoin(\n\t\t\"inline-flex w-fit shrink-0 items-center justify-center truncate font-normal break-all\",\n\t\tsizeStyles[size],\n\t\tcolorStyles[variant][intent],\n\t);\n","import { forwardRef } from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\nimport { ChildrenProps, ClassNameProps } from \"@/core/types\";\n\nexport const RESPONSIVE_PADDING = \"px-4 md:px-8 lg:px-12 xl:px-16\";\n\n/**\n\tThe content container used across the app to get content centered, use consistent padding, and get whole page\n\tscrolling to work cohesively.\n*/\nexport const PageContainer = forwardRef<HTMLDivElement, ClassNameProps & ChildrenProps>(\n\t({ children, className }, ref) => (\n\t\t<div ref={ref} className={twMerge(\"h-full w-full overflow-y-auto pt-8\", className, RESPONSIVE_PADDING)}>\n\t\t\t{children}\n\t\t</div>\n\t),\n);\n\nexport const ScreenHeightPageContainer = forwardRef<HTMLDivElement, ClassNameProps & ChildrenProps>(\n\t({ children, className }, ref) => (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={twMerge(\"flex h-screen w-full flex-col overflow-y-hidden\", className, RESPONSIVE_PADDING)}\n\t\t>\n\t\t\t<div className=\"flex h-screen w-full flex-1 flex-col overflow-y-hidden pt-8 pb-4\">{children}</div>\n\t\t</div>\n\t),\n);\n","import { faEllipsis } from \"@fortawesome/sharp-solid-svg-icons\";\nimport {\n\tContent,\n\tDropdownMenuContentProps,\n\tDropdownMenuItemProps as RadixMenuItemProps,\n\tDropdownMenuProps,\n\tItem,\n\tPortal,\n\tRoot,\n\tSeparator,\n\tTrigger,\n} from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Button, ButtonProps } from \"@/core/button\";\nimport { DropdownChevron } from \"@/core/dropdown-chevron\";\nimport { Icon } from \"@/core/icon\";\nimport { Tooltip } from \"@/core/tooltip\";\n\nconst MenuTrigger = ({ children, ...rest }: ButtonProps) => {\n\tif (children == null) {\n\t\treturn (\n\t\t\t<Trigger asChild>\n\t\t\t\t<Button {...rest}>\n\t\t\t\t\t<Icon icon={faEllipsis} />\n\t\t\t\t</Button>\n\t\t\t</Trigger>\n\t\t);\n\t}\n\tif (typeof children === \"string\") {\n\t\treturn (\n\t\t\t<Trigger asChild>\n\t\t\t\t<Button {...rest}>\n\t\t\t\t\t<span>{children}</span>\n\t\t\t\t\t<DropdownChevron />\n\t\t\t\t</Button>\n\t\t\t</Trigger>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Trigger asChild>\n\t\t\t<Button {...rest}>{children}</Button>\n\t\t</Trigger>\n\t);\n};\n\nexport type MenuContentProps = DropdownMenuContentProps & { unrestrictedHeight?: boolean };\nconst MenuContent = ({ children, unrestrictedHeight = false, ...props }: MenuContentProps) => (\n\t<Portal>\n\t\t<Content\n\t\t\tcollisionPadding={8}\n\t\t\tsideOffset={4}\n\t\t\talign=\"end\"\n\t\t\tclassName=\"z-100 min-w-48 rounded-lg bg-white p-1.5 shadow-lg\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className={twJoin(\"overflow-y-auto\", !unrestrictedHeight && \"max-h-[252px]\")}>{children}</div>\n\t\t</Content>\n\t</Portal>\n);\n\nexport type MenuItemProps = Pick<RadixMenuItemProps, \"asChild\" | \"children\" | \"disabled\" | \"textValue\" | \"onSelect\"> & {\n\tloading?: boolean;\n\tsize?: \"default\" | \"lg\";\n};\nconst MenuItem = ({ loading, disabled, size = \"default\", ...rest }: MenuItemProps) => (\n\t<Item\n\t\tdata-loading={loading || undefined}\n\t\tdisabled={loading || disabled}\n\t\tclassName={twJoin(\n\t\t\t\"on-menu-item-active group flex w-full cursor-pointer items-center rounded-md p-2 text-neutral outline-hidden select-none data-disabled:cursor-not-allowed data-disabled:text-placeholder data-highlighted:bg-surface-neutral data-loading:bg-transparent data-loading:text-placeholder\",\n\t\t\tsize === \"default\" ? \"gap-1.5 text-sm\" : \"gap-2 text-base\",\n\t\t)}\n\t\t{...rest}\n\t/>\n);\n\nexport type MenuItemWithToolTipProps = MenuItemProps & {\n\t/**\n\t * tooltip Content\n\t */\n\ttooltip?: React.ReactNode;\n};\n\nconst MenuItemWithDisabledTooltip = ({ tooltip, onSelect, ...props }: MenuItemWithToolTipProps) => {\n\tif (!props.disabled || !tooltip) {\n\t\treturn <MenuItem {...props} onSelect={onSelect} />;\n\t}\n\treturn (\n\t\t<Tooltip\n\t\t\ttrigger={\n\t\t\t\t<span>\n\t\t\t\t\t<MenuItem {...props} />\n\t\t\t\t</span>\n\t\t\t}\n\t\t\tcontent={tooltip}\n\t\t\tside=\"left\"\n\t\t/>\n\t);\n};\n\nconst MenuRoot = (props: DropdownMenuProps) => <Root modal={false} {...props} />;\nconst MenuSeparator = () => <Separator className=\"my-[5px] h-px bg-surface-dark\" />;\n\nexport type MenuProps = DropdownMenuProps &\n\tPick<DropdownMenuContentProps, \"align\"> & {\n\t\ttrigger?: React.ReactNode;\n\t\ttriggerSize?: ButtonProps[\"size\"];\n\t\tvariant?: \"default\" | \"minimal\";\n\t} & Pick<ButtonProps, \"disabled\">;\n/**\n * @example\n * <Menu trigger=\"Actions\">\n * \t<Menu.Item>Transform object...</Menu.Item>\n * \t<Menu.Item>Edit</Menu.Item>\n * </Menu>\n * // use default trigger!\n * <Menu>\n * \t<Menu.Item onSelect={() => ...}>Transform object...</Menu.Item>\n * \t<Menu.Item>Edit</Menu.Item>\n * </Menu>\n */\nexport const Menu = ({ children, trigger, align, variant = \"default\", triggerSize, ...rest }: MenuProps) => {\n\tswitch (variant) {\n\t\tcase \"minimal\":\n\t\t\treturn (\n\t\t\t\t<MenuRoot {...rest}>\n\t\t\t\t\t<MenuTrigger {...rest} size={triggerSize || \"xs\"} variant=\"transparent\">\n\t\t\t\t\t\t{trigger}\n\t\t\t\t\t</MenuTrigger>\n\t\t\t\t\t<MenuContent align={align}>{children}</MenuContent>\n\t\t\t\t</MenuRoot>\n\t\t\t);\n\t\tcase \"default\":\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<MenuRoot {...rest}>\n\t\t\t\t\t<MenuTrigger size={triggerSize} {...rest}>\n\t\t\t\t\t\t{trigger}\n\t\t\t\t\t</MenuTrigger>\n\t\t\t\t\t<MenuContent align={align}>{children}</MenuContent>\n\t\t\t\t</MenuRoot>\n\t\t\t);\n\t}\n};\n\nMenu.Root = MenuRoot;\nMenu.Trigger = MenuTrigger;\nMenu.RawTrigger = Trigger;\nMenu.Content = MenuContent;\nMenu.Item = MenuItem;\nMenu.ItemWithDisabledToolTip = MenuItemWithDisabledTooltip;\nMenu.Separator = MenuSeparator;\n","export const ModalActions = ({ children }: { children: React.ReactNode }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"sticky bottom-0 z-2 flex items-center justify-end gap-x-2 overflow-clip rounded-b-xl bg-white/80 px-8 pt-2 pb-6 backdrop-blur-sm\">\n\t\t\t{children}\n\t\t</div>\n\t);\n};\n","export const ModalBody = ({ children }: { children: React.ReactNode }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn <div className=\"px-8 py-1.5\">{children}</div>;\n};\n","import { Close } from \"@radix-ui/react-dialog\";\n\nimport { Button, ButtonProps } from \"../../button\";\n\nexport const ModalCloseButton = (props: ButtonProps) => (\n\t<Close asChild>\n\t\t<Button {...props} />\n\t</Close>\n);\n","import { Content, DialogContentProps, Overlay, Portal } from \"@radix-ui/react-dialog\";\nimport { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nconst preventDismiss = (e: Event) => e.preventDefault();\n\nconst handleDismiss = (dismissible?: boolean) => {\n\tif (dismissible) {\n\t\treturn;\n\t}\n\treturn preventDismiss;\n};\n\nexport type ModalContentBaseProps = Pick<DialogContentProps, \"children\" | \"onOpenAutoFocus\" | \"onCloseAutoFocus\">;\n\nexport type SoftDismissProps =\n\t| { dismissible?: never; onDismiss?: (e: Event) => void }\n\t| { dismissible?: boolean; onDismiss?: never };\nexport type ModalContentProps = SoftDismissProps & {\n\tmaxWidthClassName?: `max-w-${string}`;\n\toverflowYClassName?: `overflow-y-${string}`;\n};\n\ntype FullscreenModalContentProps = {\n\tfullscreen?: boolean;\n};\n\nexport const ModalContent = forwardRef<\n\tHTMLDivElement,\n\tModalContentBaseProps & ModalContentProps & FullscreenModalContentProps\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tmaxWidthClassName = \"max-w-prose\",\n\t\t\toverflowYClassName = \"overflow-y-auto\",\n\t\t\tonDismiss,\n\t\t\tdismissible = true,\n\t\t\tfullscreen,\n\t\t\t...rest\n\t\t},\n\t\tref,\n\t) => (\n\t\t<Portal>\n\t\t\t<Overlay\n\t\t\t\t// TODO: remove z-index once the z-index wars in /app are over\n\t\t\t\tclassName=\"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-fade-in-custom-easing\"\n\t\t\t>\n\t\t\t\t<Content\n\t\t\t\t\t{...rest}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\tfullscreen\n\t\t\t\t\t\t\t? \"h-[calc(100vh-1rem)] w-[calc(100vw-1rem)]\"\n\t\t\t\t\t\t\t: `max-h-[calc(100vh-2rem)] w-[clamp(100vw-2rem,100%,100vw-2rem)] ${maxWidthClassName}`,\n\t\t\t\t\t\t`fixed top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 flex-col rounded-xl bg-white shadow-lg focus:outline-hidden data-[state=open]:animate-fade-in-subtle-movement ${overflowYClassName}`,\n\t\t\t\t\t)}\n\t\t\t\t\tonPointerDownOutside={fullscreen ? handleDismiss() : (onDismiss ?? handleDismiss(dismissible))}\n\t\t\t\t\tonEscapeKeyDown={fullscreen ? handleDismiss() : (onDismiss ?? handleDismiss(dismissible))}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"relative flex h-full min-w-0 flex-1 flex-col\">{children}</div>\n\t\t\t\t</Content>\n\t\t\t</Overlay>\n\t\t</Portal>\n\t),\n);\n","import { Description } from \"@radix-ui/react-dialog\";\n\nexport const ModalDescription = ({ children }: { children: React.ReactNode }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn <Description className=\"pb-3 text-base/6 font-normal text-neutral\">{children}</Description>;\n};\n","import * as React from \"react\";\n\nimport { Callout } from \"@/core/callout\";\n\nexport const ModalErrorCallout = ({ children }: { children: React.ReactNode }) => {\n\tif (!children) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"sticky top-14 z-10 px-5\">\n\t\t\t<Callout intent=\"danger\">{children}</Callout>\n\t\t</div>\n\t);\n};\n","import { DialogProps, Root } from \"@radix-ui/react-dialog\";\n\nexport type ModalRootProps = Pick<DialogProps, \"children\" | \"open\" | \"onOpenChange\">;\nexport const ModalRoot = (props: ModalRootProps) => {\n\treturn <Root {...props} />;\n};\n","import { Title } from \"@radix-ui/react-dialog\";\n\nimport { ModalCloseX } from \"./ModalCloseX\";\n\nexport const ModalTitle = ({ children, showX = true }: { children: React.ReactNode; showX?: boolean }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"sticky top-0 z-2 overflow-clip rounded-t-xl bg-white/80 px-8 pt-8 pb-1.5 backdrop-blur-sm\">\n\t\t\t<Title className=\"text-xl font-semibold text-dark\">{children}</Title>\n\t\t\t{showX && <ModalCloseX />}\n\t\t</div>\n\t);\n};\n","import { faClose } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Close } from \"@radix-ui/react-dialog\";\n\nimport { Button } from \"../../button\";\nimport { Icon } from \"../../icon\";\n\nexport const ModalCloseX = () => (\n\t<span className=\"absolute top-2.5 right-2.5\">\n\t\t<Close asChild aria-label=\"Close\">\n\t\t\t<Button variant=\"transparent\">\n\t\t\t\t<span className=\"px-0.5 text-xl text-muted\">\n\t\t\t\t\t<Icon icon={faClose} />\n\t\t\t\t</span>\n\t\t\t</Button>\n\t\t</Close>\n\t</span>\n);\n","import { Trigger } from \"@radix-ui/react-dialog\";\n\n/**\n * This needs to import the button folder directly from core in order to\n * prevent a dependency issue which causes the FullscreenModal to throw\n * an erorr when rendering in storybook.\n */\nimport { Button, ButtonProps } from \"@/core/button\";\n\nexport const ModalTriggerButton = (props: ButtonProps) => (\n\t<Trigger asChild>\n\t\t<Button {...props} />\n\t</Trigger>\n);\n","import * as React from \"react\";\n\nimport { ChildrenProps } from \"../types\";\nimport { ModalActions } from \"./components/ModalActions\";\nimport { ModalBody } from \"./components/ModalBody\";\nimport { ModalCloseButton } from \"./components/ModalCloseButton\";\nimport { ModalContent, ModalContentBaseProps, ModalContentProps } from \"./components/ModalContent\";\nimport { ModalDescription } from \"./components/ModalDescription\";\nimport { ModalErrorCallout } from \"./components/ModalErrorCallout\";\nimport { ModalRoot } from \"./components/ModalRoot\";\nimport { ModalTitle } from \"./components/ModalTitle\";\nimport { ModalTriggerButton } from \"./components/ModalTriggerButton\";\n\nexport type ModalBodyImplProps = {\n\ttitle?: React.ReactNode;\n\terror?: React.ReactNode;\n\tdescription?: React.ReactNode;\n\tactions?: React.ReactNode;\n\tshowX?: boolean;\n};\n\nconst ModalBodyImpl = ({\n\tchildren,\n\ttitle,\n\terror,\n\tdescription,\n\tactions,\n\tshowX = true,\n}: ModalBodyImplProps & ChildrenProps) => (\n\t<>\n\t\t<ModalTitle showX={showX}>{title}</ModalTitle>\n\t\t<ModalErrorCallout>{error}</ModalErrorCallout>\n\t\t{(description || children) && (\n\t\t\t<ModalBody>\n\t\t\t\t{/* Modal description could be wordy, so we're grouping it with the body to ensure it scrolls under the sticky header when there is overflow on ModalBody. */}\n\t\t\t\t<ModalDescription>{description}</ModalDescription>\n\t\t\t\t{children}\n\t\t\t</ModalBody>\n\t\t)}\n\t\t<ModalActions>{actions}</ModalActions>\n\t</>\n);\n\nexport type SharedModalProps = React.PropsWithChildren & {\n\tisOpen?: boolean;\n\tonClose?: () => void;\n};\n\n/**\n * If using `trigger`, the modal will control its own visibility state though you can observe changes with onOpenChange\n * Otherwise, pass `isOpen` and `onClose` to control modal state yourself.\n */\nexport type DiscriminatedVisibilityProps =\n\t| { isOpen: boolean; onClose: () => void; trigger?: never; onOpenChange?: never }\n\t| { isOpen?: never; onClose?: never; trigger: React.ReactNode; onOpenChange?: (open: boolean) => void };\n\ntype DiscriminatedContentProps =\n\t| {\n\t\t\tchildren?: React.ReactNode;\n\t\t\tcontent?: never;\n\t\t\ttitle?: never;\n\t\t\terror?: never;\n\t\t\tdescription?: never;\n\t\t\tactions?: never;\n\t }\n\t| (ModalBodyImplProps & {\n\t\t\tchildren?: never;\n\t\t\tcontent?: React.ReactNode;\n\t });\n\nexport type ModalProps = DiscriminatedVisibilityProps &\n\tModalContentBaseProps &\n\tModalContentProps &\n\tDiscriminatedContentProps & { trigger?: React.ReactNode };\nexport const Modal = ({\n\tchildren,\n\ttrigger,\n\tisOpen,\n\tonClose,\n\tonOpenChange,\n\tcontent,\n\ttitle,\n\terror,\n\tdescription,\n\tactions,\n\t...rest\n}: ModalProps) => (\n\t<ModalRoot\n\t\topen={isOpen}\n\t\tonOpenChange={(open) => {\n\t\t\tif (trigger) {\n\t\t\t\tonOpenChange?.(open);\n\t\t\t} else if (open === false) {\n\t\t\t\tonClose?.();\n\t\t\t}\n\t\t}}\n\t>\n\t\t{trigger}\n\t\t<ModalContent aria-describedby={description || undefined} {...rest}>\n\t\t\t{children !== undefined ? (\n\t\t\t\tchildren\n\t\t\t) : (\n\t\t\t\t<ModalBodyImpl title={title} error={error} description={description} actions={actions}>\n\t\t\t\t\t{content}\n\t\t\t\t</ModalBodyImpl>\n\t\t\t)}\n\t\t</ModalContent>\n\t</ModalRoot>\n);\n\nModal.Body = ModalBodyImpl;\nModal.TriggerButton = ModalTriggerButton;\nModal.CloseButton = ModalCloseButton;\n","import * as React from \"react\";\n\nimport { ModalCloseButton } from \"./components/ModalCloseButton\";\nimport { ModalContent, ModalContentBaseProps } from \"./components/ModalContent\";\nimport { ModalRoot } from \"./components/ModalRoot\";\nimport { ModalTriggerButton } from \"./components/ModalTriggerButton\";\nimport { FullscreenModalHeader } from \"./FullscreenModalHeader\";\nimport { DiscriminatedVisibilityProps, Modal } from \"./Modal\";\n\nexport type FullscreenModalProps = DiscriminatedVisibilityProps &\n\tModalContentBaseProps & {\n\t\ttrigger?: React.ReactNode;\n\t\tfullscreen?: boolean;\n\t\ttitle?: React.ReactNode;\n\t\tshowX?: boolean;\n\t};\n\nconst FullscreenModal = React.forwardRef<HTMLDivElement, FullscreenModalProps>(\n\t({ children, trigger, isOpen, onClose, onOpenChange, fullscreen = true, showX = false, title, ...rest }, ref) => (\n\t\t<ModalRoot\n\t\t\topen={isOpen}\n\t\t\tonOpenChange={(open) => {\n\t\t\t\tif (trigger) {\n\t\t\t\t\tonOpenChange?.(open);\n\t\t\t\t} else if (open === false) {\n\t\t\t\t\tonClose?.();\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t{trigger}\n\t\t\t<ModalContent fullscreen={fullscreen} {...rest} ref={ref}>\n\t\t\t\t{title ? (\n\t\t\t\t\t<Modal.Body title={title} showX={showX}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Modal.Body>\n\t\t\t\t) : (\n\t\t\t\t\tchildren\n\t\t\t\t)}\n\t\t\t</ModalContent>\n\t\t</ModalRoot>\n\t),\n);\n\n// Need to use Object.assign because FullscreenModal forwards ref\nconst FullscreenModalNamespace = Object.assign(FullscreenModal, {\n\tTriggerButton: ModalTriggerButton,\n\tCloseButton: ModalCloseButton,\n\tHeader: FullscreenModalHeader,\n});\n\nexport { FullscreenModalNamespace as FullscreenModal };\n","import { Title } from \"@radix-ui/react-dialog\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport type FullscreenModalHeaderProps = {\n\ttitle: React.ReactNode;\n\tdescription?: React.ReactNode;\n\tleftSlot?: React.ReactNode;\n\trightSlot?: React.ReactNode;\n\tclassName?: string;\n};\n\nexport const FullscreenModalHeader = ({\n\tclassName,\n\ttitle,\n\tdescription,\n\tleftSlot,\n\trightSlot,\n}: FullscreenModalHeaderProps) => {\n\treturn (\n\t\t<div className={twJoin(\"flex items-center justify-between gap-4\", className)}>\n\t\t\t<div className=\"flex flex-1 items-center gap-4\">\n\t\t\t\t{leftSlot}\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t<Title className=\"text-2xl font-medium text-neutral\">{title}</Title>\n\t\t\t\t\t{description && <div className=\"text-base/6 text-muted\">{description}</div>}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-2\">{rightSlot}</div>\n\t\t</div>\n\t);\n};\n","import * as React from \"react\";\n\nimport { ChildrenProps } from \"../types\";\nimport { ModalActions } from \"./components/ModalActions\";\nimport { ModalBody } from \"./components/ModalBody\";\nimport { ModalCloseButton } from \"./components/ModalCloseButton\";\nimport { ModalContent, ModalContentProps } from \"./components/ModalContent\";\nimport { ModalDescription } from \"./components/ModalDescription\";\nimport { ModalErrorCallout } from \"./components/ModalErrorCallout\";\nimport { ModalRoot } from \"./components/ModalRoot\";\nimport { ModalTitle } from \"./components/ModalTitle\";\nimport { ModalTriggerButton } from \"./components/ModalTriggerButton\";\nimport { DiscriminatedVisibilityProps } from \"./Modal\";\n\nexport type AlertModalBodyProps = {\n\ttitle?: React.ReactNode;\n\terror?: React.ReactNode;\n\tdescription?: React.ReactNode;\n\tactions?: React.ReactNode;\n};\n\nconst ModalBodyImpl = ({ children, title, error, description, actions }: AlertModalBodyProps & ChildrenProps) => (\n\t<>\n\t\t<ModalTitle showX={false}>{title}</ModalTitle>\n\t\t<ModalErrorCallout>{error}</ModalErrorCallout>\n\t\t{(description || children) && (\n\t\t\t<ModalBody>\n\t\t\t\t{/* Modal description could be wordy, so we're grouping it with the body to ensure it scrolls under the sticky header when there is overflow on ModalBody. */}\n\t\t\t\t<ModalDescription>{description}</ModalDescription>\n\t\t\t\t{children}\n\t\t\t</ModalBody>\n\t\t)}\n\t\t<ModalActions>{actions}</ModalActions>\n\t</>\n);\n\ntype DiscriminatedContentProps =\n\t| {\n\t\t\tchildren?: React.ReactNode;\n\t\t\tcontent?: never;\n\t\t\ttitle?: never;\n\t\t\terror?: never;\n\t\t\tdescription?: never;\n\t\t\tactions?: never;\n\t }\n\t| (AlertModalBodyProps & {\n\t\t\tchildren?: never;\n\t\t\tcontent?: React.ReactNode;\n\t });\nexport type AlertModalProps = Simplify<\n\tDiscriminatedVisibilityProps &\n\t\tPick<ModalContentProps, \"maxWidthClassName\"> &\n\t\tDiscriminatedContentProps & { trigger?: React.ReactNode }\n>;\nexport const AlertModal = ({\n\tchildren,\n\ttrigger,\n\tisOpen,\n\tonOpenChange,\n\tonClose,\n\tcontent,\n\ttitle,\n\terror,\n\tdescription,\n\tactions,\n\t...rest\n}: AlertModalProps) => (\n\t<ModalRoot\n\t\topen={isOpen}\n\t\tonOpenChange={(open) => {\n\t\t\tif (trigger) {\n\t\t\t\tonOpenChange?.(open);\n\t\t\t} else if (open === false) {\n\t\t\t\tonClose?.();\n\t\t\t}\n\t\t}}\n\t>\n\t\t{trigger}\n\t\t<ModalContent {...rest} dismissible={false}>\n\t\t\t{children !== undefined ? (\n\t\t\t\tchildren\n\t\t\t) : (\n\t\t\t\t<ModalBodyImpl title={title} error={error} description={description} actions={actions}>\n\t\t\t\t\t{content}\n\t\t\t\t</ModalBodyImpl>\n\t\t\t)}\n\t\t</ModalContent>\n\t</ModalRoot>\n);\n\nAlertModal.Body = ModalBodyImpl;\nAlertModal.TriggerButton = ModalTriggerButton;\nAlertModal.CloseButton = ModalCloseButton;\n","import \"react-international-phone/style.css\"; // Import the styles for react-international-phone\nimport \"./styles.css\";\n\nimport React from \"react\";\nimport { PhoneInput, PhoneInputProps } from \"react-international-phone\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport const PhoneNumber: React.FC<PhoneInputProps & { hasError?: boolean; onChange: (value?: string) => void }> = ({\n\thasError,\n\tonChange,\n\t...props\n}) => {\n\treturn (\n\t\t<PhoneInput\n\t\t\tdefaultCountry={props.defaultCountry ?? \"us\"}\n\t\t\tdisableDialCodeAndPrefix\n\t\t\tshowDisabledDialCodeAndPrefix\n\t\t\tinputClassName={twJoin(\n\t\t\t\t\"flex-1 placeholder:text-placeholder\",\n\t\t\t\thasError ? \"border-red-300!\" : \"border-surface-neutral!\",\n\t\t\t)}\n\t\t\tcountrySelectorStyleProps={{ className: \"border-surface-neutral!\" }}\n\t\t\tonChange={(value, meta) => onChange(meta.inputValue ? value : undefined)}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n","import { twJoin } from \"tailwind-merge\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Text } from \"../text/Text\";\n\nexport type StepperProps = {\n\tsteps: string[];\n\tcurrentStep: number;\n\tclassName?: string;\n};\n\ntype StepItemProps = {\n\tlabel: string;\n\tstep: number;\n\tisActive: boolean;\n};\n\nconst StepItem = ({ label, step, isActive }: StepItemProps) => (\n\t<div className=\"flex items-center gap-3\">\n\t\t<div\n\t\t\tclassName={twJoin(\n\t\t\t\t\"flex size-6 items-center justify-center rounded-full\",\n\t\t\t\tisActive ? \"bg-button-primary\" : \"bg-button-primary-disabled\",\n\t\t\t)}\n\t\t>\n\t\t\t<Text className=\"text-white\">{step}</Text>\n\t\t</div>\n\t\t<Text variant=\"body-1\" className={isActive ? \"text-primary\" : \"text-indigo-200\"}>\n\t\t\t{label}\n\t\t</Text>\n\t</div>\n);\n\nexport const Stepper = ({ steps, currentStep, className }: StepperProps) => (\n\t<div className={twMerge(\"flex items-center justify-center gap-5\", className)}>\n\t\t{steps.map((label, index) => (\n\t\t\t<StepItem key={label} label={label} step={index + 1} isActive={index === currentStep} />\n\t\t))}\n\t</div>\n);\n","import type { Table as ReactTable } from \"@tanstack/react-table\";\nimport { useEffect } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { LoadingBar } from \"@/core/loaders/LoadingBar\";\nimport { Skeleton } from \"@/core/skeleton\";\n\nimport { useIntersectionObserver } from \"../utils/useIntersectionObserver\";\nimport { TableBody } from \"./TableBody\";\nimport { TableHeader } from \"./TableHeader\";\n\nexport const tableVariants = {\n\tdefault: \"default\",\n\tseamless: \"seamless\",\n\ttransparent: \"transparent\",\n\tsubtable: \"subtable\",\n} as const;\nexport type TableVariant = (typeof tableVariants)[keyof typeof tableVariants];\nexport type ConfigClassNames = { rootClassName?: string; rowClassName?: string; cellClassName?: string };\n\nexport const headerClassNames = (variant: TableVariant): ConfigClassNames => {\n\tswitch (variant) {\n\t\tcase tableVariants.transparent:\n\t\t\treturn {\n\t\t\t\tcellClassName: \"text-left text-sm font-medium text-muted whitespace-nowrap px-2.5 py-3\",\n\t\t\t};\n\t\tcase tableVariants.subtable:\n\t\t\treturn {\n\t\t\t\trowClassName: \"divide-x divide-gray-200\",\n\t\t\t\tcellClassName:\n\t\t\t\t\t\"text-left text-sm font-medium text-muted whitespace-nowrap sticky top-0 z-1 border-b bg-surface-neutral px-2 py-1.5\",\n\t\t\t};\n\t\tcase tableVariants.seamless:\n\t\t\treturn {\n\t\t\t\tcellClassName:\n\t\t\t\t\t\"text-left text-sm font-medium text-muted whitespace-nowrap sticky top-0 z-1 border-b bg-surface-light px-2 py-1.5 group data-[clickable]:cursor-pointer data-[clickable]:select-none data-[clickable]:hover:text-gray-800\",\n\t\t\t};\n\t\tcase tableVariants.default:\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tcellClassName:\n\t\t\t\t\t\"text-left text-sm font-medium text-muted whitespace-nowrap sticky top-0 z-1 border-b bg-surface-neutral px-2 py-1.5 group data-[clickable]:cursor-pointer data-[clickable]:select-none data-[clickable]:hover:text-gray-800\",\n\t\t\t};\n\t}\n};\n\nexport const bodyClassNames = (variant: TableVariant): ConfigClassNames => {\n\tswitch (variant) {\n\t\tcase tableVariants.seamless:\n\t\t\treturn {\n\t\t\t\trowClassName: \"[&:not(:last-child)_td]:border-surface-neutral\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap h-fit\",\n\t\t\t};\n\t\tcase tableVariants.transparent:\n\t\t\treturn {\n\t\t\t\trootClassName: \"rounded-lg bg-white outline outline-1 outline-gray-200\",\n\t\t\t\trowClassName:\n\t\t\t\t\t\"[&:not(:last-child)_td]:border-b [&:not(:last-child)_td]:border-surface-neutral [&:first-child_td:first-child]:rounded-tl-lg [&:first-child_td:last-child]:rounded-tr-lg [&:last-child_td:first-child]:rounded-bl-lg [&:last-child_td:last-child]:rounded-br-lg\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap p-2.5 py-1.5\",\n\t\t\t};\n\t\tcase tableVariants.subtable:\n\t\t\treturn {\n\t\t\t\trowClassName:\n\t\t\t\t\t\"[&:not(:last-child)_td]:border-b [&:not(:last-child)_td]:border-surface-neutral divide-x divide-gray-200\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap p-2\",\n\t\t\t};\n\t\tcase tableVariants.default:\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\trowClassName:\n\t\t\t\t\t\"[&:not(:last-child)_td]:border-b [&:not(:last-child)_td]:border-surface-neutral data-[depth='0']:bg-surface-light\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap p-2\",\n\t\t\t};\n\t}\n};\n\nexport type TableProps<T> = { table: ReactTable<T>; variant?: TableVariant; loading?: boolean };\nexport const Table = <T,>({ variant = \"default\", loading: loadingProp, ...props }: TableProps<T>) => {\n\tconst loading = loadingProp ?? props.table.options.meta?.isLoading;\n\tconst fetching = loadingProp ?? props.table.options.meta?.isFetching;\n\tconst uiLoading = loading ? \"loading\" : undefined;\n\tconst coreRows = props.table.getCoreRowModel().rows;\n\tconst showLoadingBar = fetching && coreRows.length > 0;\n\tconst resizeStyle = props.table.options.enableColumnResizing\n\t\t? ({ width: props.table.getCenterTotalSize(), tableLayout: \"fixed\" } as const)\n\t\t: undefined;\n\tconst tableElementRef = props.table.options.meta?.tableElementRef ?? null;\n\n\tswitch (variant) {\n\t\tcase tableVariants.transparent:\n\t\t\treturn (\n\t\t\t\t<div className=\"relative mb-auto min-w-full\">\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableElementRef}\n\t\t\t\t\t\tdata-ui={uiLoading}\n\t\t\t\t\t\tstyle={resizeStyle}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader {...props} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t\t\t<TableBody {...props} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase tableVariants.subtable:\n\t\t\treturn (\n\t\t\t\t<div className=\"relative mb-auto min-w-full\">\n\t\t\t\t\t{showLoadingBar && <LoadingBar className=\"absolute top-0 right-0 left-0 z-10 h-1 rounded-none\" />}\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableElementRef}\n\t\t\t\t\t\tdata-ui={uiLoading}\n\t\t\t\t\t\tstyle={resizeStyle}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader {...props} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t\t\t<TableBody {...props} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase tableVariants.seamless:\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"relative mb-auto rounded-md border bg-white\",\n\t\t\t\t\t\tloading && coreRows.length === 0 ? \"overflow-hidden\" : \"overflow-auto\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableElementRef}\n\t\t\t\t\t\tdata-ui={uiLoading}\n\t\t\t\t\t\tstyle={resizeStyle}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"relative min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader {...props} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t\t\t<TableBody {...props} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase tableVariants.default:\n\t\tdefault:\n\t\t\treturn <DefaultTable {...props} loading={loading} fetching={fetching} />;\n\t}\n};\n\ntype DefaultTableProps<T> = {\n\ttable: ReactTable<T>;\n\tloading?: boolean;\n\tfetching?: boolean;\n};\n\nconst DefaultTable = <T,>({ table, loading, fetching }: DefaultTableProps<T>) => {\n\tconst [sentinelRef, entry] = useIntersectionObserver<HTMLTableRowElement>();\n\n\tconst infiniteScroll = table.options.meta?.infiniteScroll;\n\tconst coreRows = table.getCoreRowModel().rows;\n\tconst colCount = table.getAllLeafColumns().length;\n\tconst uiLoading = loading ? \"loading\" : undefined;\n\tconst showLoadingBar = fetching && coreRows.length > 0;\n\tconst resizeStyle = table.options.enableColumnResizing\n\t\t? ({ width: table.getCenterTotalSize(), tableLayout: \"fixed\" } as const)\n\t\t: undefined;\n\tconst tableElementRef = table.options.meta?.tableElementRef ?? null;\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (entry?.isIntersecting && infiniteScroll?.hasNextPage && !infiniteScroll.isFetchingNextPage) {\n\t\t\tinfiniteScroll.fetchNextPage();\n\t\t}\n\t}, [entry?.isIntersecting, infiniteScroll]);\n\n\tconst skeletonRows = infiniteScroll?.hasNextPage\n\t\t? Array.from({ length: 3 }).map((_, i) => (\n\t\t\t\t<tr key={`skeleton-${i}`} className=\"[&:not(:last-child)>td]:border-b [&:not(:last-child)>td]:border-gray-200\">\n\t\t\t\t\t{Array.from({ length: colCount }).map((_, j) => (\n\t\t\t\t\t\t<td key={j} className=\"p-2\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-full\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))\n\t\t: null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={twJoin(\n\t\t\t\t\"relative mb-auto rounded-md border bg-white\",\n\t\t\t\tcoreRows.length === 0\n\t\t\t\t\t? twJoin(\"h-full min-h-0\", loading ? \"overflow-hidden\" : \"overflow-auto\")\n\t\t\t\t\t: \"max-h-full min-h-0 overflow-auto\",\n\t\t\t)}\n\t\t>\n\t\t\t{showLoadingBar && <LoadingBar className=\"sticky top-0 right-0 left-0 z-10 -mb-1 h-1 rounded-none\" />}\n\t\t\t<table\n\t\t\t\tref={tableElementRef}\n\t\t\t\tdata-ui={uiLoading}\n\t\t\t\tstyle={resizeStyle}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"relative min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\tcoreRows.length === 0 && !loading && \"h-full\",\n\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<TableHeader table={table} variant=\"default\" {...headerClassNames(\"default\")} />\n\t\t\t\t<TableBody\n\t\t\t\t\ttable={table}\n\t\t\t\t\t{...bodyClassNames(\"default\")}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tafterRows={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{infiniteScroll?.hasNextPage && (\n\t\t\t\t\t\t\t\t<tr ref={sentinelRef} aria-hidden=\"true\" style={{ height: 0, border: \"none\", padding: 0 }}>\n\t\t\t\t\t\t\t\t\t<td colSpan={colCount} style={{ height: 0, border: \"none\", padding: 0 }} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{skeletonRows}\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</table>\n\t\t</div>\n\t);\n};\n","import { useCallback, useRef, useState } from \"react\";\n\nexport const useIntersectionObserver = <T extends Element>(\n\toptions: IntersectionObserverInit = {},\n): [React.RefCallback<T>, IntersectionObserverEntry | null] => {\n\tconst { threshold = 1, root = null, rootMargin = \"0px\" } = options;\n\n\tconst [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n\n\tconst previousObserver = useRef<IntersectionObserver | null>(null);\n\n\tconst customRef = useCallback(\n\t\t(node: T | null) => {\n\t\t\tif (previousObserver.current) {\n\t\t\t\tpreviousObserver.current.disconnect();\n\t\t\t\tpreviousObserver.current = null;\n\t\t\t}\n\n\t\t\tif (node?.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst observer = new IntersectionObserver(\n\t\t\t\t\t([entry]) => {\n\t\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\t\tsetEntry(entry);\n\t\t\t\t\t},\n\t\t\t\t\t{ threshold, root, rootMargin },\n\t\t\t\t);\n\n\t\t\t\tobserver.observe(node);\n\t\t\t\tpreviousObserver.current = observer;\n\t\t\t}\n\t\t},\n\t\t[threshold, root, rootMargin],\n\t);\n\n\treturn [customRef, entry];\n};\n","import { faTable } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Table } from \"@tanstack/react-table\";\nimport * as React from \"react\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Skeleton } from \"@/core/skeleton\";\n\nimport { TableRow } from \"./TableRow\";\n\nexport type TableBodyProps<T> = {\n\ttable: Table<T>;\n\tloading?: boolean;\n\trootClassName?: string;\n\trowClassName?: string;\n\tcellClassName?: string;\n\tafterRows?: React.ReactNode;\n};\nexport const TableBody = <T,>({ table, loading, rootClassName, afterRows, ...props }: TableBodyProps<T>) => {\n\tconst { rows } = table.getRowModel();\n\tif (rows.length === 0) {\n\t\tif (loading) {\n\t\t\tconst colCount = table.getAllLeafColumns().length;\n\t\t\treturn (\n\t\t\t\t<tbody className={rootClassName}>\n\t\t\t\t\t{Array.from({ length: 20 }).map((_, i) => (\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\tkey={`skeleton-${i}`}\n\t\t\t\t\t\t\tclassName=\"[&:not(:last-child)>td]:border-b [&:not(:last-child)>td]:border-gray-200\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Array.from({ length: colCount }).map((_, j) => (\n\t\t\t\t\t\t\t\t<td key={j} className=\"p-2\">\n\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-full\" />\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t))}\n\t\t\t\t</tbody>\n\t\t\t);\n\t\t}\n\t\treturn (\n\t\t\t<tbody className={rootClassName}>\n\t\t\t\t<tr>\n\t\t\t\t\t<EmptyRowsTd colSpan={table.getAllLeafColumns().length} emptyText={table.options.meta?.emptyText} />\n\t\t\t\t</tr>\n\t\t\t\t{afterRows}\n\t\t\t</tbody>\n\t\t);\n\t}\n\treturn (\n\t\t<tbody className={rootClassName}>\n\t\t\t{rows.map((row) => (\n\t\t\t\t<TableRow key={row.id} {...props} table={table} row={row} />\n\t\t\t))}\n\t\t\t{afterRows}\n\t\t</tbody>\n\t);\n};\n\ntype EmptyRowsTdProps = {\n\tcolSpan: number;\n\temptyText?: React.ReactNode;\n};\nexport const EmptyRowsTd = ({ emptyText = \"No rows found\", ...props }: EmptyRowsTdProps) => (\n\t<td {...props} className=\"h-full\">\n\t\t<p className=\"flex h-full min-h-12 w-full items-center justify-center gap-2 text-2xl/none text-placeholder\">\n\t\t\t<span>\n\t\t\t\t<Icon icon={faTable} />\n\t\t\t</span>\n\t\t\t<span className=\"text-base/none font-medium\">{emptyText}</span>\n\t\t</p>\n\t</td>\n);\n","import { Row } from \"@tanstack/react-table\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { TableBodyProps } from \"./TableBody\";\nimport { handleCellStyle, renderCell } from \"./utils\";\n\ntype TableRowProps<T> = Omit<TableBodyProps<T>, \"rootClassName\"> & { row: Row<T> };\n\nexport const TableRow = <T,>({ table, rowClassName, cellClassName, row }: TableRowProps<T>) => {\n\tconst hasRowClick = !!table.options.meta?.onRowClick;\n\tconst isStaticSubRow = !!table.options.meta?.staticSubRows;\n\n\tconst onRowClick = (ev: React.MouseEvent<HTMLTableCellElement>, row: Row<T>) => {\n\t\t// Since we're putting the handler on the td, we can check if the target and currentTarget\n\t\t// are the same element. If a button was clicked _inside_ the td, this would be false.\n\t\t// This prevents the rowClick from firing on a nested event handler firing.\n\t\tif (ev.target === ev.currentTarget) {\n\t\t\ttable.options.meta?.onRowClick?.(row, ev);\n\t\t}\n\t};\n\tconst cells = row.getVisibleCells();\n\n\treturn (\n\t\t<tr\n\t\t\tdata-active={table.options.meta?.activeRowId === row.id ? \"\" : undefined}\n\t\t\tdata-clickable={!isStaticSubRow && (hasRowClick || row.getCanExpand()) ? \"\" : undefined}\n\t\t\tdata-depth={isStaticSubRow ? row.depth : undefined}\n\t\t\tonClick={!isStaticSubRow && row.getCanExpand() ? row.getToggleExpandedHandler() : undefined}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"data-active:bg-indigo-100 data-clickable:hover:cursor-pointer data-clickable:hover:bg-surface-primary data-active:data-clickable:hover:bg-indigo-200\",\n\t\t\t\trowClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{cells.map((cell) => (\n\t\t\t\t<td\n\t\t\t\t\tkey={cell.id}\n\t\t\t\t\tonClickCapture={hasRowClick ? (ev) => onRowClick(ev, row) : undefined}\n\t\t\t\t\tclassName={cellClassName}\n\t\t\t\t\tstyle={handleCellStyle(cell)}\n\t\t\t\t>\n\t\t\t\t\t{renderCell(cell)}\n\t\t\t\t</td>\n\t\t\t))}\n\t\t</tr>\n\t);\n};\n","import { Cell, Column, flexRender, Header } from \"@tanstack/react-table\";\n\ntype HeaderOrCell<T> = Header<T, unknown> | Cell<T, unknown>;\n\nexport const isValidCell = <T>(cell: Cell<T, unknown>) => {\n\tif (!(cell.column.columnDef.cell instanceof Function)) {\n\t\treturn null;\n\t}\n\treturn cell.column.columnDef.cell(cell.getContext()) as T;\n};\n\nexport const renderHeader = <T>(header: Header<T, unknown>) => {\n\tif (header.isPlaceholder) {\n\t\treturn null;\n\t}\n\treturn flexRender(header.column.columnDef.header, header.getContext());\n};\n\nexport const renderFooter = <T>(header: Header<T, unknown>) => {\n\tif (header.isPlaceholder) {\n\t\treturn null;\n\t}\n\treturn flexRender(header.column.columnDef.footer, header.getContext());\n};\n\nexport const renderCell = <T>(cell: Cell<T, unknown>) => {\n\tif (isValidCell<T>(cell) == null) {\n\t\treturn null;\n\t}\n\treturn flexRender(cell.column.columnDef.cell, cell.getContext());\n};\n\nconst sumOffset = <T>(offset: number, { getSize }: Column<T, unknown>) => getSize() + offset;\nconst getCols = <T>(item: HeaderOrCell<T>) => {\n\tconst cols = item.getContext().table.getAllColumns();\n\tconst index = cols.findIndex(({ id }) => id === item.column.id);\n\n\treturn { cols, index };\n};\n\nconst getLeftStickyOffset = <T>(item: HeaderOrCell<T>) => {\n\tconst { cols, index } = getCols(item);\n\tif (index === 0) {\n\t\treturn 0;\n\t}\n\treturn cols.slice(0, index).reduce(sumOffset, 0);\n};\n\nconst getRightStickyOffset = <T>(item: HeaderOrCell<T>) => {\n\tconst { cols, index } = getCols(item);\n\tif (index === cols.length - 1) {\n\t\treturn 0;\n\t}\n\treturn cols.slice(0, index).reduceRight(sumOffset, 0);\n};\n\nexport const handleSize = <T>(item: HeaderOrCell<T>) => {\n\tconst size = item.column.getSize();\n\tif (!size) {\n\t\treturn;\n\t}\n\n\treturn { width: size, minWidth: size };\n};\n\nexport const handleStyle = <T>(item: HeaderOrCell<T>, _style?: React.CSSProperties) => {\n\tconst style: React.CSSProperties = _style ? { ..._style } : {};\n\n\tif (item.column.columnDef.meta?.unPadded) {\n\t\tstyle.padding = 0;\n\t\tstyle.paddingTop = 0;\n\t\tstyle.paddingRight = 0;\n\t\tstyle.paddingBottom = 0;\n\t\tstyle.paddingLeft = 0;\n\t}\n\n\tif (item.column.columnDef.meta?.verticalAlign) {\n\t\tstyle.verticalAlign = item.column.columnDef.meta.verticalAlign;\n\t}\n\n\tconst size = item.column.getSize();\n\tif (!size) {\n\t\treturn style;\n\t}\n\n\tconst table = item.getContext().table;\n\tconst isResizable = table.options.enableColumnResizing;\n\tconst isLastVisible = isResizable && table.getVisibleLeafColumns().at(-1)?.id === item.column.id;\n\n\tstyle.minWidth = size;\n\tif (!isLastVisible) {\n\t\tstyle.width = size;\n\t}\n\tif (isResizable) {\n\t\tstyle.overflow = \"hidden\";\n\t\tstyle.textOverflow = \"ellipsis\";\n\t}\n\n\tif (item.column.columnDef.meta?.sticky === \"left\") {\n\t\tstyle.position = \"sticky\";\n\t\tstyle.left = getLeftStickyOffset(item);\n\t}\n\tif (item.column.columnDef.meta?.sticky === \"right\") {\n\t\tstyle.position = \"sticky\";\n\t\tstyle.right = getRightStickyOffset(item);\n\t}\n\n\treturn style;\n};\n\nexport const handleHeaderStyle = handleStyle;\nexport const handleCellStyle = handleStyle;\n","import { faArrowDownWideShort, faArrowUpWideShort } from \"@fortawesome/sharp-solid-svg-icons\";\nimport type { Header, SortDirection, Table } from \"@tanstack/react-table\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\nimport { handleHeaderStyle, renderHeader } from \"./utils\";\n\ntype TableHeaderProps<T> = {\n\ttable: Table<T>;\n\tvariant?: string;\n\trootClassName?: string;\n\trowClassName?: string;\n\tcellClassName?: string;\n};\nexport const TableHeader = <T,>({\n\ttable,\n\tvariant,\n\trootClassName,\n\trowClassName,\n\tcellClassName,\n}: TableHeaderProps<T>) => {\n\treturn (\n\t\t<thead className={rootClassName}>\n\t\t\t{table.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t<tr key={headerGroup.id} className={rowClassName}>\n\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t<Th\n\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\tcolSpan={header.colSpan}\n\t\t\t\t\t\t\tclassName={cellClassName}\n\t\t\t\t\t\t\tstyle={handleHeaderStyle(header)}\n\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{renderHeader(header)}\n\t\t\t\t\t\t</Th>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))}\n\t\t</thead>\n\t);\n};\n\nconst Th = <T,>({\n\theader,\n\tvariant,\n\tchildren,\n\t...props\n}: { header: Header<T, unknown>; variant?: string } & React.ComponentPropsWithoutRef<\"th\">) => {\n\tconst isLastInRow = header.index === header.headerGroup.headers.length - 1;\n\tconst canResize =\n\t\t!isLastInRow && !!header.getContext().table.options.columnResizeMode && header.column.getCanResize();\n\tconst isSubtable = variant === \"subtable\";\n\tconst resizeHandle = canResize && (\n\t\t<div\n\t\t\tonMouseDown={header.getResizeHandler()}\n\t\t\tonTouchStart={header.getResizeHandler()}\n\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\tdata-resizing={header.column.getIsResizing() ? \"\" : undefined}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"absolute top-0 right-0 bottom-0 z-10 w-1 cursor-col-resize touch-none select-none\",\n\t\t\t\t\"after:pointer-events-none after:absolute after:top-0 after:right-0 after:h-screen after:w-0.5 after:transition-colors after:duration-150 after:content-['']\",\n\t\t\t\tisSubtable\n\t\t\t\t\t? \"hover:after:bg-indigo-600 data-resizing:after:bg-indigo-600\"\n\t\t\t\t\t: \"group-hover:after:bg-gray-200 hover:after:bg-indigo-600 data-resizing:after:bg-indigo-600\",\n\t\t\t)}\n\t\t/>\n\t);\n\n\tif (header.column.getIsSorted()) {\n\t\treturn (\n\t\t\t<th\n\t\t\t\t{...props}\n\t\t\t\tdata-clickable=\"ok\"\n\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\tclassName={twJoin(props.className, canResize && \"group relative\")}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<span className=\"ml-1.5\">\n\t\t\t\t\t<SortIcon dir={header.column.getIsSorted()} />\n\t\t\t\t</span>\n\t\t\t\t{resizeHandle}\n\t\t\t</th>\n\t\t);\n\t}\n\tif (header.column.getCanSort()) {\n\t\treturn (\n\t\t\t<th\n\t\t\t\t{...props}\n\t\t\t\tdata-clickable=\"ok\"\n\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\tclassName={twJoin(props.className, canResize && \"group relative\")}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<span className=\"invisible ml-1.5 group-hover:visible\">\n\t\t\t\t\t<SortIcon dir={header.column.getNextSortingOrder()} />\n\t\t\t\t</span>\n\t\t\t\t{resizeHandle}\n\t\t\t</th>\n\t\t);\n\t}\n\treturn (\n\t\t<th {...props} className={twJoin(props.className, canResize && \"group relative\")}>\n\t\t\t{children}\n\t\t\t{resizeHandle}\n\t\t</th>\n\t);\n};\n\ntype SortIconProps = {\n\tdir: false | SortDirection;\n};\nexport const SortIcon = ({ dir }: SortIconProps) => {\n\tif (dir === \"asc\") {\n\t\treturn <Icon icon={faArrowUpWideShort} />;\n\t}\n\tif (dir === \"desc\") {\n\t\treturn <Icon icon={faArrowDownWideShort} />;\n\t}\n\treturn null;\n};\n","import type { Table as ReactTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { LoadingBar } from \"@/core/loaders/LoadingBar\";\nimport { Skeleton } from \"@/core/skeleton\";\n\nimport { bodyClassNames, headerClassNames, type TableVariant } from \"./Table\";\nimport { TableBody } from \"./TableBody\";\nimport { TableHeader } from \"./TableHeader\";\nimport { TableRow } from \"./TableRow\";\n\nconst DEFAULT_ROW_HEIGHT = 37;\nconst DEFAULT_OVERSCAN = 5;\n\nexport type VirtualizedTableProps<T> = {\n\ttable: ReactTable<T>;\n\tvariant?: Extract<TableVariant, \"default\" | \"subtable\">;\n\tloading?: boolean;\n\trowHeight?: number;\n\toverscan?: number;\n};\n\nexport const VirtualizedTable = <T,>({\n\ttable,\n\tvariant = \"default\",\n\tloading: loadingProp,\n\trowHeight = DEFAULT_ROW_HEIGHT,\n\toverscan = DEFAULT_OVERSCAN,\n}: VirtualizedTableProps<T>) => {\n\tconst loading = loadingProp ?? table.options.meta?.isLoading;\n\tconst fetching = loadingProp ?? table.options.meta?.isFetching;\n\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\tconst isSubtable = variant === \"subtable\";\n\n\tconst infiniteScroll = table.options.meta?.infiniteScroll;\n\tconst colCount = table.getVisibleLeafColumns().length;\n\tconst coreRows = table.getCoreRowModel().rows;\n\tconst rows = table.getRowModel().rows;\n\tconst uiLoading = loading ? \"loading\" : undefined;\n\tconst showLoadingBar = fetching && coreRows.length > 0;\n\tconst resizeStyle = table.options.enableColumnResizing\n\t\t? ({ width: table.getCenterTotalSize(), tableLayout: \"fixed\" } as const)\n\t\t: undefined;\n\tconst tableElementRef = table.options.meta?.tableElementRef ?? null;\n\n\tconst rowVirtualizer = useVirtualizer({\n\t\tcount: rows.length,\n\t\tgetScrollElement: () => scrollRef.current,\n\t\testimateSize: () => rowHeight,\n\t\toverscan,\n\t});\n\tconst virtualRows = rowVirtualizer.getVirtualItems();\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst lastItem = virtualRows.at(-1);\n\t\tif (!lastItem) return;\n\t\tif (lastItem.index >= rows.length - 1 && infiniteScroll?.hasNextPage && !infiniteScroll.isFetchingNextPage) {\n\t\t\tinfiniteScroll.fetchNextPage();\n\t\t}\n\t}, [virtualRows, rows.length, infiniteScroll]);\n\n\tconst skeletonRows = infiniteScroll?.hasNextPage\n\t\t? Array.from({ length: 3 }).map((_, i) => (\n\t\t\t\t<tr key={`skeleton-${i}`} className=\"[&:not(:last-child)>td]:border-b [&:not(:last-child)>td]:border-gray-200\">\n\t\t\t\t\t{Array.from({ length: colCount }).map((_, j) => (\n\t\t\t\t\t\t<td key={j} className=\"p-2\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-full\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))\n\t\t: null;\n\n\tconst paddingTop = virtualRows.length > 0 ? (virtualRows[0]?.start ?? 0) : 0;\n\tconst paddingBottom = virtualRows.length > 0 ? rowVirtualizer.getTotalSize() - (virtualRows.at(-1)?.end ?? 0) : 0;\n\n\tconst { rootClassName: bodyRootClassName, ...bodyRowCellClassNames } = bodyClassNames(variant);\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRef}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"relative mb-auto\",\n\t\t\t\tisSubtable\n\t\t\t\t\t? \"min-w-full\"\n\t\t\t\t\t: twJoin(\n\t\t\t\t\t\t\t\"rounded-md border bg-white\",\n\t\t\t\t\t\t\tcoreRows.length === 0\n\t\t\t\t\t\t\t\t? twJoin(\"h-full\", loading ? \"overflow-hidden\" : \"overflow-auto overscroll-none\")\n\t\t\t\t\t\t\t\t: \"max-h-full min-h-0 overflow-auto overscroll-none\",\n\t\t\t\t\t\t),\n\t\t\t)}\n\t\t>\n\t\t\t{showLoadingBar && (\n\t\t\t\t<LoadingBar\n\t\t\t\t\tclassName={twJoin(\"top-0 right-0 left-0 z-10 h-1 rounded-none\", isSubtable ? \"absolute\" : \"sticky -mb-1\")}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<table\n\t\t\t\tref={tableElementRef}\n\t\t\t\tdata-ui={uiLoading}\n\t\t\t\tstyle={resizeStyle}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"relative min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t!isSubtable && coreRows.length === 0 && !loading && \"h-full\",\n\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<TableHeader table={table} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t{rows.length === 0 ? (\n\t\t\t\t\t<TableBody table={table} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t) : (\n\t\t\t\t\t<tbody className={bodyRootClassName}>\n\t\t\t\t\t\t{paddingTop > 0 && (\n\t\t\t\t\t\t\t<tr aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<td colSpan={colCount} style={{ height: paddingTop, padding: 0, border: \"none\" }} />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{virtualRows.map((virtualRow) => {\n\t\t\t\t\t\t\tconst row = rows[virtualRow.index];\n\t\t\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\t\t\treturn <TableRow key={row.id} table={table} row={row} {...bodyRowCellClassNames} />;\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{paddingBottom > 0 && (\n\t\t\t\t\t\t\t<tr aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<td colSpan={colCount} style={{ height: paddingBottom, padding: 0, border: \"none\" }} />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{skeletonRows}\n\t\t\t\t\t</tbody>\n\t\t\t\t)}\n\t\t\t</table>\n\t\t</div>\n\t);\n};\n","import { ColumnSort, getCoreRowModel, Table, TableMeta, TableOptions, useReactTable } from \"@tanstack/react-table\";\nimport { useLayoutEffect } from \"react\";\nimport { useEffectEvent } from \"use-effect-event\";\n\nimport { AllAsNever } from \"@/core/types\";\n\nexport type SortOptions = {\n\tsort: string | undefined;\n\tonSortColumn?: (newSort: ColumnSort | undefined) => void;\n};\n\nexport type DiscriminatedSortOptions = SortOptions | AllAsNever<SortOptions>;\nexport type CustomTableOptions<T> = Simplify<\n\tOmit<TableOptions<T>, \"getCoreRowModel\"> &\n\t\tDiscriminatedSortOptions &\n\t\tTableMeta<T> & {\n\t\t\ttableRef?: (table: Table<T>) => void;\n\t\t}\n>;\n\nexport const useTable = <T>({ tableRef, ...options }: CustomTableOptions<T>) => {\n\t// This helps avoid specifying `enableSorting` on every column def when\n\t// nothing in the table is sortable\n\tconst enableSorting = !!options.state?.sorting && !!options.onSortingChange;\n\n\tconst table = useReactTable<T>({\n\t\t...options,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t// This is a hack to allow the columns to flex by default,\n\t\t// and, then when size is overridden, they become fixed\n\t\tdefaultColumn: {\n\t\t\t...options.defaultColumn,\n\t\t\tminSize: options.columnResizeMode ? (options.defaultColumn?.minSize ?? 50) : 0,\n\t\t\tsize: options.defaultColumn?.size ?? 0,\n\t\t},\n\t\tmeta: {\n\t\t\tisLoading: options.isLoading,\n\t\t\tisFetching: options.isFetching,\n\t\t\temptyText: options.emptyText,\n\t\t\tactiveRowId: options.activeRowId,\n\t\t\tonRowClick: options.onRowClick,\n\t\t\tstaticSubRows: options.staticSubRows,\n\t\t\ttableElementRef: options.tableElementRef,\n\t\t\tinfiniteScroll: options.infiniteScroll,\n\t\t},\n\t\tmanualSorting: true,\n\t\tenableMultiSort: false,\n\t\tenableSorting,\n\t\tenableColumnResizing: !!options.columnResizeMode,\n\t});\n\n\tconst syncTableRef = useEffectEvent(() => {\n\t\ttableRef?.(table);\n\t});\n\n\tuseLayoutEffect(() => {\n\t\tsyncTableRef();\n\t}, [table]);\n\n\treturn table;\n};\n","import { ColumnSizingInfoState, ColumnSizingState, Table } from \"@tanstack/react-table\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\n\nimport type { CustomTableOptions } from \"./useTable\";\n\nconst defaultSizingInfo: ColumnSizingInfoState = {\n\tstartOffset: null,\n\tstartSize: null,\n\tdeltaOffset: null,\n\tdeltaPercentage: null,\n\tisResizingColumn: false,\n\tcolumnSizingStart: [],\n};\n\nexport const useColumnResizing = <T>(options: CustomTableOptions<T>) => {\n\tconst defaultMinSize = options.defaultColumn?.minSize ?? 50;\n\n\tconst [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\tconst [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>(defaultSizingInfo);\n\tconst sizingInfoRef = useRef<ColumnSizingInfoState>(defaultSizingInfo);\n\tconst tableRef = useRef<Table<T> | null>(null);\n\tconst tableElementRef = useRef<HTMLTableElement>(null);\n\tconst startSizesRef = useRef<[string, number, number][]>([]);\n\tconst excessRef = useRef(0);\n\tconst resizingColRef = useRef<string | false>(false);\n\tconst prevVisibleIdsRef = useRef(\"\");\n\n\t/* eslint-disable react-compiler/react-compiler -- intentionally runs every render; all inputs are refs */\n\t/* eslint-disable react-hooks/exhaustive-deps */\n\tuseLayoutEffect(() => {\n\t\tconst table = tableRef.current;\n\t\tconst tableEl = tableElementRef.current;\n\t\tif (!table || !tableEl || !prevVisibleIdsRef.current) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst visibleCols = table.getVisibleLeafColumns();\n\t\tconst visibleIds = visibleCols.map((c) => c.id).join(\",\");\n\n\t\tif (visibleIds === prevVisibleIdsRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tprevVisibleIdsRef.current = visibleIds;\n\n\t\tif (sizingInfoRef.current.isResizingColumn || visibleCols.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst tableWidth = tableEl.offsetWidth;\n\t\tif (!tableWidth) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTotal = visibleCols.reduce((sum, col) => sum + col.getSize(), 0);\n\t\tif (currentTotal <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scale = tableWidth / currentTotal;\n\t\tconst scaledSizes = visibleCols.map((col) => Math.round(col.getSize() * scale));\n\t\tconst usedByOthers = scaledSizes.slice(0, -1).reduce((sum, s) => sum + s, 0);\n\n\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\tconst next: ColumnSizingState = Object.fromEntries(\n\t\t\tvisibleCols.map((col, i) => [col.id, i === visibleCols.length - 1 ? tableWidth - usedByOthers : scaledSizes[i]]),\n\t\t);\n\n\t\tsetColumnSizing(next);\n\t});\n\t/* eslint-enable react-compiler/react-compiler */\n\t/* eslint-enable react-hooks/exhaustive-deps */\n\n\treturn {\n\t\t...options,\n\t\tcolumnResizeMode: options.columnResizeMode ?? (\"onChange\" as const),\n\t\ttableElementRef,\n\t\ttableRef: (table: Table<T>) => {\n\t\t\ttableRef.current = table;\n\t\t\tif (!prevVisibleIdsRef.current) {\n\t\t\t\tprevVisibleIdsRef.current = table\n\t\t\t\t\t.getVisibleLeafColumns()\n\t\t\t\t\t.map((c) => c.id)\n\t\t\t\t\t.join(\",\");\n\t\t\t}\n\t\t},\n\t\tdefaultColumn: {\n\t\t\tsize: 150,\n\t\t\t...options.defaultColumn,\n\t\t},\n\t\tstate: {\n\t\t\t...options.state,\n\t\t\tcolumnSizing,\n\t\t\tcolumnSizingInfo,\n\t\t},\n\t\tonColumnSizingInfoChange: (\n\t\t\tupdater: Parameters<Exclude<CustomTableOptions<T>[\"onColumnSizingInfoChange\"], undefined>>[0],\n\t\t) => {\n\t\t\tconst prev = sizingInfoRef.current;\n\t\t\tconst next = typeof updater === \"function\" ? updater(prev) : updater;\n\n\t\t\t// TanStack only snapshots the resized column's leaf headers in columnSizingStart.\n\t\t\t// We need ALL visible columns to find and compensate the neighbor.\n\t\t\tif (next.isResizingColumn && !prev.isResizingColumn && tableRef.current) {\n\t\t\t\tconst cols = tableRef.current.getVisibleLeafColumns();\n\t\t\t\tconst tableWidth = tableElementRef.current?.offsetWidth;\n\t\t\t\tconst lastIdx = cols.length - 1;\n\t\t\t\tconst nonLastSum = cols.slice(0, lastIdx).reduce((sum, col) => sum + col.getSize(), 0);\n\t\t\t\tstartSizesRef.current = cols.map((col, i) => [\n\t\t\t\t\tcol.id,\n\t\t\t\t\ti === lastIdx && tableWidth ? tableWidth - nonLastSum : col.getSize(),\n\t\t\t\t\tcol.columnDef.minSize ?? defaultMinSize,\n\t\t\t\t]);\n\t\t\t\texcessRef.current = 0;\n\t\t\t\tresizingColRef.current = next.isResizingColumn;\n\t\t\t}\n\n\t\t\tsizingInfoRef.current = next;\n\t\t\tsetColumnSizingInfo(next);\n\t\t},\n\t\tonColumnSizingChange: (\n\t\t\tupdater: Parameters<Exclude<CustomTableOptions<T>[\"onColumnSizingChange\"], undefined>>[0],\n\t\t) => {\n\t\t\t// Capture excess before setColumnSizing so strict mode double-invocation reads the same value\n\t\t\tconst currentExcess = excessRef.current;\n\t\t\tconst resizingCol = sizingInfoRef.current.isResizingColumn || resizingColRef.current;\n\n\t\t\tsetColumnSizing((prev) => {\n\t\t\t\tconst next = typeof updater === \"function\" ? updater(prev) : updater;\n\n\t\t\t\tif (!resizingCol || !startSizesRef.current.length) return next;\n\n\t\t\t\tconst entries = startSizesRef.current;\n\t\t\t\tconst idx = entries.findIndex(([id]) => id === resizingCol);\n\t\t\t\tif (idx === -1 || idx >= entries.length - 1) return next;\n\n\t\t\t\t// noUncheckedIndexAccess - this should be fixed\n\t\t\t\tconst [colId, colStart, colMinSize] = entries[idx]!;\n\t\t\t\t// noUncheckedIndexAccess - this should be fixed\n\t\t\t\tconst [nextId, nextStart, nextMinSize] = entries[idx + 1]!;\n\n\t\t\t\tconst rawNewSize = next[colId] ?? colStart;\n\t\t\t\tconst correctedNewSize = rawNewSize - currentExcess;\n\t\t\t\tconst delta = correctedNewSize - colStart;\n\t\t\t\tconst nextNewSize = Math.max(nextMinSize, nextStart - delta);\n\t\t\t\tconst effectiveDelta = nextStart - nextNewSize;\n\t\t\t\tconst clampedColSize = Math.max(colMinSize, colStart + effectiveDelta);\n\t\t\t\tconst actualDelta = clampedColSize - colStart;\n\n\t\t\t\t// Update refs inside the updater so they're set during React's batch flush\n\t\t\t\tif (sizingInfoRef.current.isResizingColumn) {\n\t\t\t\t\texcessRef.current = rawNewSize - clampedColSize;\n\t\t\t\t} else {\n\t\t\t\t\texcessRef.current = 0;\n\t\t\t\t\tresizingColRef.current = false;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...next,\n\t\t\t\t\t[colId]: clampedColSize,\n\t\t\t\t\t[nextId]: nextStart - actualDelta,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t};\n};\n","import { ToggleGroup, ToggleGroupItem } from \"@radix-ui/react-toggle-group\";\nimport { motion } from \"motion/react\";\nimport { Fragment, useId } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { TabDefinition } from \"../tabs\";\n\nexport type TabGroupProps<TabId extends string> = {\n\ttabs: TabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tsetCurrentTab: (id: TabId) => void;\n\tsize?: \"sm\" | \"md\";\n};\n\nexport const TabGroup = <TabId extends string>({\n\ttabs,\n\tcurrentTab,\n\tsetCurrentTab,\n\tsize = \"md\",\n}: TabGroupProps<TabId>) => {\n\tconst layoutId = useId();\n\n\treturn (\n\t\t<ToggleGroup\n\t\t\ttype=\"single\"\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value: TabId) => {\n\t\t\t\tif (value) setCurrentTab(value);\n\t\t\t}}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"flex w-full justify-between gap-1 rounded-lg border border-surface-neutral bg-surface-light\",\n\t\t\t\tsize === \"sm\" ? \"p-1\" : \"p-0.5\",\n\t\t\t)}\n\t\t>\n\t\t\t{tabs.map(({ id, label, disabled }, index) => (\n\t\t\t\t<Fragment key={id}>\n\t\t\t\t\t<ToggleGroupItem\n\t\t\t\t\t\tvalue={id}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"relative flex w-full items-center justify-center rounded-md border transition-colors\",\n\t\t\t\t\t\t\tdisabled && \"cursor-not-allowed opacity-50\",\n\t\t\t\t\t\t\t!disabled && \"focus-visible:border-indigo-700 focus-visible:outline-none\",\n\t\t\t\t\t\t\tid !== currentTab && \"border-transparent\",\n\t\t\t\t\t\t\tid !== currentTab && !disabled && \"hover:border-indigo-200\",\n\t\t\t\t\t\t\tid === currentTab && !disabled && \"border-indigo-400 bg-surface-neutral\",\n\t\t\t\t\t\t\tsize === \"sm\" ? \"px-1.5 py-1\" : \"px-2 py-1\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{id === currentTab && !disabled && (\n\t\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t\t\t\tclassName=\"absolute inset-0 rounded-md bg-button-white ring-2 ring-indigo-100\"\n\t\t\t\t\t\t\t\ttransition={{ type: \"spring\", stiffness: 500, damping: 40 }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<span className=\"relative z-1\">{label}</span>\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t{index !== tabs.length - 1 && <div className=\"z-2 my-1 flex w-px bg-gray-300\" />}\n\t\t\t\t</Fragment>\n\t\t\t))}\n\t\t</ToggleGroup>\n\t);\n};\n","import { Content, List, Root, TabsContentProps } from \"@radix-ui/react-tabs\";\nimport { PropsWithChildren, useId } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { createContextHelper } from \"@/core/utils/create-context-helper\";\n\nimport { TabsTrigger } from \"./Trigger\";\n\nexport type TabDefinition<TabId extends string> = {\n\tid: TabId;\n\tlabel: React.ReactNode;\n\tdisabled?: boolean;\n\tfsId?: string;\n};\n\nexport type TabsProps<TabId extends string> = PropsWithChildren & {\n\ttabs: readonly TabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tsetCurrentTab: (id: TabId) => void;\n\tclassName?: string;\n\ttabsListClassName?: string;\n\ttabsListContainerClassName?: string;\n\ttabsListTriggerClassName?: string;\n\textraNode?: React.ReactNode;\n};\n\ntype TabsContext = {\n\tcurrentTab: string;\n};\nconst [Provider, useContext] = createContextHelper<TabsContext>();\n\nexport const Tabs = <TabId extends string>({\n\ttabs,\n\tclassName,\n\ttabsListClassName,\n\ttabsListContainerClassName,\n\ttabsListTriggerClassName,\n\tcurrentTab,\n\tsetCurrentTab,\n\tchildren,\n\textraNode,\n}: TabsProps<TabId>) => {\n\t// layoutId is used to animate the underline sliding between tabs\n\tconst layoutId = useId();\n\n\treturn (\n\t\t<Provider currentTab={currentTab}>\n\t\t\t<Root className={className} value={currentTab} onValueChange={(id) => setCurrentTab(id as TabId)}>\n\t\t\t\t<div className={twJoin(\"flex gap-4\", tabsListContainerClassName)}>\n\t\t\t\t\t<List className={twJoin(\"flex space-x-4 overflow-x-auto pb-0.5\", tabsListClassName)}>\n\t\t\t\t\t\t{tabs.map(({ id, label, disabled, fsId }) => (\n\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tclassName={tabsListTriggerClassName}\n\t\t\t\t\t\t\t\tfsId={fsId}\n\t\t\t\t\t\t\t\tisActive={currentTab === id}\n\t\t\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</List>\n\t\t\t\t\t{extraNode}\n\t\t\t\t</div>\n\t\t\t\t{children}\n\t\t\t</Root>\n\t\t</Provider>\n\t);\n};\n\nexport type TabContentProps<TabId = string> = {\n\tid: TabId;\n} & Omit<TabsContentProps, \"value\">;\nconst TabContent = <TabId extends string>({ id, ...rest }: TabContentProps<TabId>) => {\n\treturn <Content value={id} {...rest} />;\n};\n\n/**\n * Tab content that's never unmounted, only hidden.\n */\nconst AlwaysMountedTabContent = <TabId extends string>({\n\tid,\n\tvisibleClassName,\n\tclassName,\n\tchildren,\n}: TabContentProps<TabId> & {\n\tvisibleClassName?: string;\n}) => {\n\tconst { currentTab } = useContext();\n\tconst visible = id === currentTab;\n\treturn <div className={twJoin(visible ? visibleClassName : \"hidden\", className)}>{children}</div>;\n};\nTabs.TabContent = TabContent;\nTabs.AlwaysMountedTabContent = AlwaysMountedTabContent;\n","import { Trigger } from \"@radix-ui/react-tabs\";\nimport { motion } from \"motion/react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type TabsTriggerProps<TabId extends string> = {\n\tid: TabId;\n\tlabel: React.ReactNode;\n\tdisabled?: boolean;\n\tfsId?: string;\n\textra?: React.ReactNode;\n\tclassName?: string;\n\tisActive: boolean;\n\tlayoutId?: string;\n};\n\nexport const TabsTrigger = <TabId extends string>({\n\tid,\n\tlabel,\n\tdisabled,\n\tfsId,\n\textra,\n\tclassName,\n\tisActive,\n\tlayoutId,\n}: TabsTriggerProps<TabId>) => (\n\t<Trigger\n\t\tclassName={twMerge(\n\t\t\t\"relative h-full border-b-2 border-transparent px-1 py-1 font-medium whitespace-nowrap transition-colors duration-150 data-[state='active']:text-indigo-700 data-[state='inactive']:text-muted data-[state='inactive']:hover:border-surface-neutral data-[state='inactive']:hover:text-neutral\",\n\t\t\tclassName,\n\t\t)}\n\t\tvalue={id}\n\t\tdisabled={disabled}\n\t\tfs-id={fsId}\n\t>\n\t\t{label}\n\t\t{extra && <span>{extra}</span>}\n\t\t{isActive && (\n\t\t\t<motion.span\n\t\t\t\tlayoutId={layoutId}\n\t\t\t\tclassName=\"absolute right-0 -bottom-0.5 left-0 h-0.5 bg-current\"\n\t\t\t\ttransition={{ type: \"spring\", stiffness: 500, damping: 40 }}\n\t\t\t/>\n\t\t)}\n\t</Trigger>\n);\n","import { ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Tabs } from \"./Tabs\";\n\nexport type ScrollTab = {\n\ttabName: string;\n\tcontent: ReactNode;\n};\n\nexport type ScrollTabsProps = {\n\ttabs: ScrollTab[];\n\tonSelectTab?: (tabId: string) => void;\n\tsectionClassName?: string;\n};\n\n/**\n * Reusable component for creating a page layout with a set of tabs which scroll to different\n * sections of the page. The layout will automatically keep track of scroll position and update\n * the selected tab accordingly.\n */\nexport const ScrollTabsLayout = ({ tabs, onSelectTab, sectionClassName }: ScrollTabsProps) => {\n\t// @ts-expect-error noUncheckedIndexedAccess\n\tconst [selectedTabName, setSelectedTabName] = useState<string>(tabs[0].tabName);\n\tconst scrollContainerRef = useRef<HTMLDivElement | null>(null);\n\tconst tabRefs = useRef<Record<string, HTMLElement>>({});\n\n\tconst handleSelectTab = useCallback(\n\t\t(tabId: string) => {\n\t\t\tscrollContainerRef.current?.scrollTo({\n\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\ttop: tabRefs.current[tabId].offsetTop,\n\t\t\t\tbehavior: \"smooth\",\n\t\t\t});\n\t\t\tsetSelectedTabName(tabId);\n\t\t\tonSelectTab?.(tabId);\n\t\t},\n\t\t[onSelectTab],\n\t);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst scrollContainer = scrollContainerRef.current;\n\t\tconst handleScroll: EventListener = (e) => {\n\t\t\tObject.entries(tabRefs.current).forEach(([tabName, tabRef]) => {\n\t\t\t\t// @ts-expect-error scrollTop doesn't exist on EventTarget\n\t\t\t\tif (e.currentTarget?.scrollTop >= tabRef.offsetTop) {\n\t\t\t\t\tsetSelectedTabName(tabName);\n\t\t\t\t\tonSelectTab?.(tabName);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tscrollContainer?.addEventListener(\"scroll\", handleScroll);\n\n\t\treturn () => {\n\t\t\tscrollContainer?.removeEventListener(\"scroll\", handleScroll);\n\t\t};\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<Tabs\n\t\t\t\tcurrentTab={selectedTabName}\n\t\t\t\tsetCurrentTab={handleSelectTab}\n\t\t\t\ttabs={tabs.map((tab) => ({ id: tab.tabName, label: tab.tabName }))}\n\t\t\t/>\n\t\t\t<hr />\n\t\t\t<div ref={scrollContainerRef} className=\"relative h-screen overflow-y-auto\">\n\t\t\t\t{tabs.map((tab) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={tab.tabName}\n\t\t\t\t\t\tref={(el) => (el ? (tabRefs.current[tab.tabName] = el) : undefined)}\n\t\t\t\t\t\tclassName={twJoin(\"first:pt-4\", sectionClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tab.content}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t\t{/* This empty screen-height div forces the scroll container to always be scrollable */}\n\t\t\t\t<div className=\"h-screen\" />\n\t\t\t</div>\n\t\t</>\n\t);\n};\n","import { Content, List, Root, TabsContentProps } from \"@radix-ui/react-tabs\";\nimport { PropsWithChildren, useId } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { createContextHelper } from \"@/core/utils/create-context-helper\";\n\nimport { TabsTrigger } from \"./Trigger\";\n\nexport type ComposableTabDefinition<TabId extends string> = {\n\tid: TabId;\n\tlabel: React.ReactNode;\n\tdisabled?: boolean;\n};\n\ntype ComposableTabsContextValue<TabId extends string = string> = {\n\ttabs: readonly ComposableTabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tlayoutId: string;\n};\n\nconst [TabsProvider, useTabsContext] = createContextHelper<ComposableTabsContextValue>();\n\nexport type ComposableTabsListProps = {\n\tclassName?: string;\n\tcontainerClassName?: string;\n\textraNode?: React.ReactNode;\n};\n\nconst ComposableTabsList = ({ className, containerClassName, extraNode }: ComposableTabsListProps) => {\n\tconst { tabs, currentTab, layoutId } = useTabsContext();\n\n\treturn (\n\t\t<div className={twJoin(\"flex gap-4\", containerClassName)}>\n\t\t\t<List className={twJoin(\"flex space-x-4 overflow-x-auto\", className)}>\n\t\t\t\t{tabs.map(({ id, label, disabled }) => (\n\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisActive={currentTab === id}\n\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</List>\n\t\t\t{extraNode}\n\t\t</div>\n\t);\n};\n\nexport type ComposableTabContentProps<TabId = string> = {\n\tid: TabId;\n} & Omit<TabsContentProps, \"value\">;\n\nconst ComposableTabContent = <TabId extends string>({ id, ...rest }: ComposableTabContentProps<TabId>) => {\n\treturn <Content value={id} {...rest} />;\n};\n\nconst ComposableAlwaysMountedTabContent = <TabId extends string>({\n\tid,\n\tvisibleClassName,\n\tclassName,\n\tchildren,\n}: ComposableTabContentProps<TabId> & { visibleClassName?: string }) => {\n\tconst { currentTab } = useTabsContext();\n\tconst visible = id === currentTab;\n\treturn <div className={twJoin(visible ? visibleClassName : \"hidden\", className)}>{children}</div>;\n};\n\nexport type ComposableTabsProps<TabId extends string> = PropsWithChildren & {\n\ttabs: readonly ComposableTabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tsetCurrentTab: (id: TabId) => void;\n\tclassName?: string;\n};\n\nconst ComposableTabsRoot = <TabId extends string>({\n\ttabs,\n\tcurrentTab,\n\tsetCurrentTab,\n\tclassName,\n\tchildren,\n}: ComposableTabsProps<TabId>) => {\n\t// layoutId is used to animate the underline sliding between tabs\n\tconst layoutId = useId();\n\n\treturn (\n\t\t<TabsProvider tabs={tabs} currentTab={currentTab} layoutId={layoutId}>\n\t\t\t<Root className={className} value={currentTab} onValueChange={(id) => setCurrentTab(id as TabId)}>\n\t\t\t\t{children}\n\t\t\t</Root>\n\t\t</TabsProvider>\n\t);\n};\n\n// Use ComposableTabs when you want to use Tabs but have the list of tab controls and tab content in seperate parts of the UI\nexport const ComposableTabs = {\n\tRoot: ComposableTabsRoot,\n\tList: ComposableTabsList,\n\tTabContent: ComposableTabContent,\n\tAlwaysMountedTabContent: ComposableAlwaysMountedTabContent,\n};\n","import { faClose } from \"@fortawesome/sharp-solid-svg-icons\";\nimport * as React from \"react\";\n\nimport { Icon } from \"../icon\";\nimport { Label } from \"../label\";\nimport { Tooltip } from \"../tooltip\";\nimport { Intent } from \"../variants\";\n\nexport type TagLabelProps = {\n\tchildren: React.ReactNode;\n\tremovable?: boolean;\n\tonRemove?: () => void;\n\tintent?: Intent;\n};\n\nconst TagLabel = (\n\t{ children, removable, onRemove, intent = \"default\", ...rest }: TagLabelProps,\n\tref: React.ForwardedRef<HTMLSpanElement>,\n) => (\n\t<Label {...rest} ref={ref} intent={intent}>\n\t\t{children}\n\t\t{removable && (\n\t\t\t<button\n\t\t\t\tclassName=\"ml-1 inline-flex h-xs items-center px-1 text-muted hover:text-neutral focus:outline-hidden\"\n\t\t\t\tonClick={onRemove}\n\t\t\t>\n\t\t\t\t<Icon icon={faClose} />\n\t\t\t</button>\n\t\t)}\n\t</Label>\n);\n\nconst TagImpl = React.forwardRef(TagLabel);\n\nexport type TagProps = TagLabelProps & {\n\ttooltip?: string;\n};\nexport const Tag = ({ tooltip, ...rest }: TagProps) => {\n\tif (!tooltip) {\n\t\treturn <TagImpl {...rest} />;\n\t}\n\treturn <Tooltip trigger={<TagImpl {...rest} />} content={<p className=\"text-sm\">{tooltip}</p>} />;\n};\n","import { useEffect, useState } from \"react\";\n\n/**\n * I've found managing hover state with onMouseOver and onMouseOut events can be unreliable\n * when moving the mouse quickly over small targets. So this hook uses an event listener to more reliably track\n * mouse movement.\n */\nexport const useIsHovered = (ref: React.RefObject<HTMLElement>) => {\n\tconst [isHovered, setIsHovered] = useState(false);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst handleMouseMove = () => {\n\t\t\tif (ref.current?.matches(\":hover\")) {\n\t\t\t\tsetIsHovered(true);\n\t\t\t} else {\n\t\t\t\tsetIsHovered(false);\n\t\t\t}\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\tif (isHovered) {\n\t\t\t\tsetIsHovered(false);\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\"mousemove\", handleMouseMove);\n\n\t\t// remove hover on scroll event since underlying element moved without moving mouse\n\t\tif (isHovered) {\n\t\t\twindow.addEventListener(\"scroll\", handleScroll, true);\n\t\t}\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"mousemove\", handleMouseMove);\n\t\t\twindow.removeEventListener(\"scroll\", handleScroll, true);\n\t\t};\n\t}, [ref, isHovered]);\n\n\treturn isHovered;\n};\n"],"mappings":"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","names":["forwardRef","twJoin","Tag","jsx","forwardRef","twJoin","twJoin","twJoin","twJoin","jsx","jsx","jsx","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","twJoin","twJoin","jsx","jsx","jsxs","twJoin","React","jsx","React","forwardRef","useEffect","useRef","twJoin","jsx","Content","Root","Trigger","useState","jsx","jsxs","useState","Root","Trigger","Content","faChevronDown","twJoin","React","React","jsx","Provider","useContext","jsx","Provider","state","jsx","jsxs","twJoin","faChevronDown","Content","RadixTooltip","twJoin","React","jsx","jsxs","twJoin","useCallback","faChevronRight","jsx","jsxs","faChevronRight","forwardRef","twJoin","jsx","jsxs","forwardRef","twJoin","jsx","useCallback","useState","React","forwardRef","twJoin","sizeStyles","jsx","jsxs","forwardRef","jsx","useState","useCallback","jsx","useCallback","useCallback","DatePickerLib","jsx","useCallback","DatePickerLib","jsx","jsx","forwardRef","twJoin","jsx","createContext","useContext","useMemo","React","Fragment","jsx","createContext","useMemo","useContext","createContext","useContext","useMemo","Fragment","jsx","createContext","useMemo","useContext","forwardRef","forwardRef","jsx","jsx","forwardRef","forwardRef","twJoin","jsx","jsx","jsxs","jsx","jsxs","twJoin","twJoin","jsx","twJoin","jsx","jsxs","twJoin","Fragment","jsx","jsxs","forwardRef","forwardRef","twJoin","jsx","jsxs","forwardRef","twJoin","forwardRef","twJoin","jsx","jsxs","forwardRef","twJoin","jsx","forwardRef","jsx","faExclamationCircle","faExclamationTriangle","forwardRef","twJoin","useState","jsx","jsxs","forwardRef","twJoin","faExclamationTriangle","faExclamationCircle","faCheckCircle","faExclamationCircle","faExclamationTriangle","forwardRef","twJoin","jsx","jsxs","twoDecimalFormatter","formatInput","roundToTwoDecimalPlaces","forwardRef","twJoin","faExclamationTriangle","faExclamationCircle","faCheckCircle","Fragment","jsx","jsxs","jsx","useEffect","useMemo","useState","faCheck","useMemo","useRef","useState","twJoin","faChevronDown","twJoin","jsx","twJoin","faChevronDown","useEffect","useRef","twJoin","jsx","jsxs","useRef","useEffect","twJoin","Fragment","jsx","jsxs","useState","useRef","useMemo","items","twJoin","faCheck","jsx","useMemo","useState","jsx","useState","useMemo","jsx","jsx","jsx","jsx","forwardRef","Fragment","jsx","jsxs","forwardRef","jsx","twJoin","React","jsx","jsx","jsxs","twJoin","forwardRef","twJoin","Fragment","jsx","jsxs","jsx","forwardRef","Fragment","jsx","jsxs","useCallback","twJoin","jsx","useCallback","twJoin","forwardRef","useEffect","useRef","twJoin","FontAwesomeIcon","twJoin","jsx","jsx","jsxs","jsx","jsx","jsxs","createContext","useContext","useCallback","useEffect","useRef","useRef","useCallback","useEffect","jsx","jsxs","useEffect","forwardRef","useRef","twJoin","faChevronDown","twJoin","jsx","jsx","twJoin","jsx","twJoin","_","index","twJoin","jsx","twJoin","Fragment","jsx","jsxs","faChevronDown","twJoin","FontAwesomeIcon","forwardRef","jsx","jsxs","forwardRef","FontAwesomeIcon","twJoin","jsx","jsxs","twJoin","twJoin","jsx","twJoin","React","twJoin","sizeStyles","colorStyles","jsx","LabelImpl","forwardRef","jsx","forwardRef","Content","Portal","Root","Trigger","twJoin","jsx","jsxs","Trigger","Portal","Content","twJoin","Root","jsx","jsx","Close","jsx","Close","Content","Portal","forwardRef","twJoin","jsx","jsx","jsx","Root","jsx","faClose","Close","jsx","Close","faClose","jsx","jsxs","Trigger","jsx","Trigger","Fragment","jsx","jsxs","React","Title","twJoin","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","ModalBodyImpl","twJoin","jsx","twJoin","jsx","jsxs","twJoin","useEffect","twJoin","useCallback","useRef","useState","entry","twJoin","jsx","row","twJoin","jsx","jsxs","_","twJoin","jsx","jsxs","twJoin","Fragment","jsx","jsxs","twJoin","useEffect","_","useEffect","useRef","twJoin","jsx","jsxs","useRef","useEffect","_","twJoin","useLayoutEffect","useRef","useState","Fragment","useId","twJoin","jsx","jsxs","Content","Root","useId","twJoin","Trigger","motion","jsx","jsxs","Trigger","motion","jsx","jsxs","Provider","useContext","useId","Root","twJoin","Content","useCallback","useEffect","useRef","useState","twJoin","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","twJoin","Content","List","Root","useId","twJoin","jsx","jsxs","twJoin","List","Content","useId","Root","faClose","React","jsx","jsxs","faClose","useEffect","useState"]}
|
|
1
|
+
{"version":3,"sources":["../avatar/Avatar.tsx","../text/Text.tsx","../avatar/AvatarGroup.tsx","../popover/Popover.tsx","../twMerge.ts","../button/Button.tsx","../button/buttonStyles.ts","../button/ButtonGroup.tsx","../tooltip/Tooltip.tsx","../utils/useOverflowObserver.tsx","../avatar/AvatarWithName.tsx","../callout/Callout.tsx","../icon/Icon.tsx","../card/Card.tsx","../checkbox/Checkbox.tsx","../collapsible/Collapsible.tsx","../collapsible-section/CollapsibleSection.tsx","../utils/useToggle.tsx","../utils/create-context-helper.tsx","../copyable/Copyable.tsx","../copyable/use-copyable.ts","../date-picker/DatePickerRange.tsx","../date-picker/DatePickerHeader.tsx","../date-picker/shared.tsx","../date-picker/DatePickerInput.tsx","../date-picker/TimeInput.tsx","../input/InputBox.tsx","../input/inputBoxStyles.ts","../date-picker/DatePickerSingle.tsx","../date-picker/DatePicker.tsx","../divider/Divider.tsx","../error-text/ErrorText.tsx","../form/components/ControlledField.tsx","../form/hooks.ts","../form/components/UncontrolledField.tsx","../form/utils.ts","../form/components/form-item/index.tsx","../form/components/form-item/InlineFormItem.tsx","../form/components/form-item/FieldErrorTooltip.tsx","../form/components/form-item/NoneFormItem.tsx","../form/components/form-item/FieldDescription.tsx","../form/components/form-item/FieldErrorMessage.tsx","../overflow-tooltip/OverflowTooltip.tsx","../form/components/form-item/FieldLabelWithTooltip.tsx","../form/components/form-item/FieldLabel.tsx","../form/components/form-item/SideBySideFormItem.tsx","../form/components/form-item/StackedFormItem.tsx","../form/components/FormInput.tsx","../form/components/FormDollarInput.tsx","../utils/useSyncState.ts","../form/components/FormPercentInput.tsx","../form/components/FormCheckbox.tsx","../form/components/ControlledFormItem.tsx","../select/props.ts","../select/selectItem.ts","../select/useAsyncMultiSelect.ts","../select/AsyncMultiSelect.tsx","../dropdown-chevron/DropdownChevron.tsx","../select/SelectListItem.tsx","../select/AsyncSelect.tsx","../select/MultiSelect.tsx","../select/Select.tsx","../select/SelectWtihUnselect.tsx","../form/components/FormSelect.tsx","../form/components/FormMultiSelect.tsx","../form/components/FormTextArea.tsx","../textarea/TextArea.tsx","../form/components/FormSwitch.tsx","../switch/Switch.tsx","../radio-button-group/RadioButtonGroup.tsx","../radio-button-group/RadioButtonItem.tsx","../form/components/FormRadioButtonGroup.tsx","../form/components/FormDatePicker.tsx","../drawer/Drawer.tsx","../loaders/Spinner.tsx","../loaders/LoadingState.tsx","../loaders/LoadingBar.tsx","../loaders/TwoCirclesSpinner.tsx","../drawer/drawerState.ts","../drawer/useDrawerResize.ts","../drawer/DrawerHeader.tsx","../skeleton/Skeleton.tsx","../empty-state/EmptyState.tsx","../header-tile/HeaderTile.tsx","../header-tile/HeaderTileGroup.tsx","../label/Label.tsx","../label/labelStyles.ts","../layouts/PageContainer.tsx","../menu/Menu.tsx","../modal/components/ModalActions.tsx","../modal/components/ModalBody.tsx","../modal/components/ModalCloseButton.tsx","../modal/components/ModalContent.tsx","../modal/components/ModalDescription.tsx","../modal/components/ModalErrorCallout.tsx","../modal/components/ModalRoot.tsx","../modal/components/ModalTitle.tsx","../modal/components/ModalCloseX.tsx","../modal/components/ModalTriggerButton.tsx","../modal/Modal.tsx","../modal/FullscreenModal.tsx","../modal/FullscreenModalHeader.tsx","../modal/AlertModal.tsx","../phone-number/PhoneNumber.tsx","../stepper/Stepper.tsx","../table/Table.tsx","../utils/useIntersectionObserver.ts","../table/TableBody.tsx","../table/TableRow.tsx","../table/utils.ts","../table/TableHeader.tsx","../table/VirtualizedTable.tsx","../table/useTable.ts","../table/useColumnResizing.ts","../tab-group/TabGroup.tsx","../tabs/Tabs.tsx","../tabs/Trigger.tsx","../tabs/ComposableTabs.tsx","../tag/Tag.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Text } from \"@/core/text\";\n\nexport type AvatarVariant = \"active\" | \"inactive\";\nexport type AvatarSize = \"sm\" | \"md\";\n\n/**\n * Derives up-to-two uppercase initials from a name.\n *\n * Uses the first letter of the first and last whitespace-separated words; for a single word, the\n * first two characters.\n *\n * @example\n * getInitials(\"Ada Lovelace\"); // \"AL\"\n * getInitials(\"cher\"); // \"CH\"\n */\nconst getInitials = (name: string): string => {\n\tconst trimmed = name.trim();\n\tif (trimmed.includes(\" \")) {\n\t\tconst parts = trimmed.split(\" \");\n\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\treturn (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n\t}\n\treturn trimmed.slice(0, 2).toUpperCase();\n};\n\n/**\n * Props for {@link Avatar}: the custom props below plus all native `<div>` attributes\n * (`onClick`, `title`, `aria-*`, …), which are forwarded to the root element.\n */\nexport type AvatarProps = ComponentPropsWithoutRef<\"div\"> & {\n\t/** Full name used to derive the displayed initials. */\n\tname: string;\n\t/**\n\t * Visual emphasis. `inactive` dims the avatar.\n\t * @default active\n\t */\n\tvariant?: AvatarVariant;\n\t/**\n\t * Avatar diameter.\n\t * @default md\n\t */\n\tsize?: AvatarSize;\n};\n\n/**\n * A circular avatar showing a person's initials.\n *\n * Initials are derived from `name`. The `ref` and native `<div>` props are\n * forwarded to the root element. For stacks of avatars or an avatar paired with a name label, see\n * the `AvatarGroup` and `AvatarWithName` components in this module.\n *\n * @example\n * <Avatar name=\"Ada Lovelace\" />\n *\n * @example\n * <Avatar name=\"Grace Hopper\" variant=\"inactive\" size=\"sm\" />\n */\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n\t({ name, variant = \"active\", size = \"md\", className, ...props }, ref) => {\n\t\tconst initials = getInitials(name);\n\t\tconst isActive = variant === \"active\";\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"flex items-center justify-center rounded-full border border-indigo-200\",\n\t\t\t\t\tisActive ? \"bg-indigo-100\" : \"bg-indigo-50\",\n\t\t\t\t\tsize == \"md\" && \"size-8.5\",\n\t\t\t\t\tsize == \"sm\" && \"size-7\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<Text className={twJoin(\"font-semibold text-muted\", !isActive && \"opacity-50\")}>{initials}</Text>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { forwardRef, type ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport type TextTagElementMap = {\n\th1: HTMLHeadingElement;\n\th2: HTMLHeadingElement;\n\th3: HTMLHeadingElement;\n\th4: HTMLHeadingElement;\n\th5: HTMLHeadingElement;\n\th6: HTMLHeadingElement;\n\tp: HTMLParagraphElement;\n\tspan: HTMLSpanElement;\n\tlabel: HTMLLabelElement;\n};\n\nexport type TextTag = keyof TextTagElementMap;\n\nconst VARIANT_STYLES = {\n\t\"marketing-headline\": \"text-marketing-headline\",\n\t\"headline-1\": \"text-headline-1\",\n\t\"headline-2\": \"text-headline-2\",\n\t\"headline-3\": \"text-headline-3\",\n\t\"headline-4\": \"text-headline-4\",\n\t\"title-1\": \"text-title-1\",\n\t\"title-2\": \"text-title-2\",\n\t\"title-3\": \"text-title-3\",\n\t\"body-1\": \"text-body-1\",\n\t\"body-2\": \"text-body-2\",\n\tlabel: \"text-label\",\n\tfootnote: \"text-footnote\",\n\tsmallcaps: \"text-smallcaps uppercase\",\n} as const;\n\nexport type TextVariant =\n\t| \"marketing-headline\"\n\t| \"headline-1\"\n\t| \"headline-2\"\n\t| \"headline-3\"\n\t| \"headline-4\"\n\t| \"title-1\"\n\t| \"title-2\"\n\t| \"title-3\"\n\t| \"body-1\"\n\t| \"body-2\"\n\t| \"label\"\n\t| \"footnote\"\n\t| \"smallcaps\";\n\n/**\n * Props specific to Text component (excluding native HTML props)\n */\nexport type TextOwnProps<T extends TextTag = \"p\"> = {\n\t/**\n\t * The HTML tag to render\n\t * @default p\n\t */\n\tas?: T;\n\t/**\n\t * Typography variant to apply\n\t * @default body-1\n\t */\n\tvariant?: TextVariant;\n\t/**\n\t * Content to render\n\t */\n\tchildren: ReactNode;\n};\n\n/**\n * Full component props combining Text-specific props with native HTML element props\n */\nexport type TextProps<T extends TextTag = \"p\"> = TextOwnProps<T> & Omit<JSX.IntrinsicElements[T], keyof TextOwnProps>;\n\nconst TextInner = <T extends TextTag = \"p\">(\n\t{ as, variant = \"body-1\", children, className, ...props }: TextProps<T>,\n\tref: React.ForwardedRef<TextTagElementMap[T]>,\n) => {\n\tconst Tag = as ?? \"p\";\n\n\treturn (\n\t\t<Tag {...(props as any)} className={twJoin(VARIANT_STYLES[variant], className)} ref={ref}>\n\t\t\t{children}\n\t\t</Tag>\n\t);\n};\n\n/**\n * Renders text with design-system typography on a semantic HTML element.\n *\n * Choose the rendered tag with `as` (defaults to `<p>`) and the typography style with `variant`.\n * Props are fully typed against the chosen tag, so native attributes (`onClick`, `id`, `htmlFor`,\n * …) are type-checked and forwarded, and the `ref` points at the corresponding element. `className`\n * is merged after the variant styles, so it can override them.\n *\n * @example\n * <Text>Body copy</Text>\n *\n * @example Semantic tag with a typography variant\n * <Text as=\"h1\" variant=\"headline-1\">\n * Page title\n * </Text>\n */\nexport const Text = forwardRef(TextInner) as <T extends TextTag = \"p\">(\n\tprops: TextProps<T> & { ref?: React.ForwardedRef<TextTagElementMap[T]> },\n) => React.ReactElement;\n","import React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Popover } from \"@/core/popover\";\nimport { Text } from \"@/core/text\";\nimport { Tooltip } from \"@/core/tooltip\";\n\nimport { Avatar, AvatarSize, AvatarVariant } from \"./Avatar\";\nimport { AvatarWithName } from \"./AvatarWithName\";\n\nexport type AvatarGroupItem = {\n\tname: string;\n\tvariant?: AvatarVariant;\n\ttooltipContent?: React.ReactNode;\n};\n\nexport type AvatarGroupProps = {\n\titems: AvatarGroupItem[];\n\tmaxVisible?: number;\n\toverflowTitle?: string;\n\tsize?: AvatarSize;\n};\n\nexport const AvatarGroup = ({ items, maxVisible = 3, overflowTitle, size = \"md\" }: AvatarGroupProps) => {\n\tconst visibleItems = items.slice(0, maxVisible);\n\tconst overflowItems = items.slice(maxVisible);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={twJoin(\"flex\", size === \"md\" && \"-space-x-2\", size === \"sm\" && \"-space-x-1.5\")}\n\t\t\tfs-id=\"FSRecentViewers\"\n\t\t>\n\t\t\t{visibleItems.map((item, i) => (\n\t\t\t\t<Tooltip\n\t\t\t\t\tkey={`${item.name}-${i}`}\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<span className=\"relative\" style={{ zIndex: visibleItems.length - i }}>\n\t\t\t\t\t\t\t<Avatar name={item.name} variant={item.variant} size={size} />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t\tcontent={item.tooltipContent}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t<Popover\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center rounded-full border border-surface-neutral bg-surface-neutral\",\n\t\t\t\t\t\t\t\tsize === \"md\" && \"size-8.5\",\n\t\t\t\t\t\t\t\tsize === \"sm\" && \"size-7\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tfs-id=\"FSRecentViewersOverflowTrigger\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text className=\"font-semibold text-muted\">+{overflowItems.length}</Text>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t\tcontentClassName={twJoin(size === \"md\" && \"p-3\", size === \"sm\" && \"p-2\")}\n\t\t\t\t>\n\t\t\t\t\t{overflowTitle && <Text className=\"mb-2 font-semibold text-muted\">{overflowTitle}</Text>}\n\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t{overflowItems.map((item, i) => (\n\t\t\t\t\t\t\t<AvatarWithName key={`${item.name}-${i}`} name={item.name} variant={item.variant} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</Popover>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import * as RadixPopover from \"@radix-ui/react-popover\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Button, ButtonProps } from \"../button\";\n\nexport type Align = \"start\" | \"center\" | \"end\";\nexport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport type PopoverProps = {\n\t/** Class name applied to the trigger wrapper. */\n\ttriggerClassName?: string;\n\t/** Element that opens the popover. Rendered via Radix `asChild`. */\n\ttrigger: React.ReactNode;\n\t/** Controls open state. Omit to let the popover manage its own. */\n\topen?: boolean;\n\t/** Disables the trigger. */\n\tdisabled?: boolean;\n\t/** Alignment of the content relative to the trigger. */\n\talignContent?: Align;\n\t/** Side of the trigger the content appears on. */\n\tside?: Side;\n\t/** Class name for the arrow element. */\n\tarrowClassName?: string;\n\t/** Class name for the content container. */\n\tcontentClassName?: string;\n\t/** Popover content. */\n\tchildren: React.ReactNode;\n\n\t/** Called when the open state changes (controlled or uncontrolled). */\n\tonOpenChange?: (open: boolean) => void;\n};\n\n/**\n * A floating content panel anchored to a trigger element, built on Radix `Popover`.\n *\n * The all-in-one form takes a `trigger` and `children` and renders a portaled, shadowed card with\n * an arrow. For finer control over composition, use the compound parts: {@link Popover.Root},\n * {@link Popover.Trigger} (a styled {@link Button}), {@link Popover.Body}, and {@link Popover.Close}.\n *\n * @example\n * <Popover trigger={<Button>Options</Button>} side=\"bottom\" alignContent=\"start\">\n * <Menu />\n * </Popover>\n *\n * @example Compound form\n * <Popover.Root>\n * <Popover.Trigger>Options</Popover.Trigger>\n * <Popover.Body>\n * <Menu />\n * <Popover.Close><Button>Done</Button></Popover.Close>\n * </Popover.Body>\n * </Popover.Root>\n */\nexport const Popover = ({\n\topen,\n\ttrigger,\n\ttriggerClassName,\n\tchildren,\n\tarrowClassName,\n\tcontentClassName,\n\tdisabled,\n\tonOpenChange,\n\talignContent,\n\tcontainer,\n\t...props\n}: PopoverProps & PopoverBodyProps) => (\n\t<RadixPopover.Root open={open} onOpenChange={onOpenChange}>\n\t\t<RadixPopover.Trigger asChild disabled={disabled} className={triggerClassName}>\n\t\t\t{trigger}\n\t\t</RadixPopover.Trigger>\n\t\t<PopoverBody\n\t\t\talign={alignContent}\n\t\t\t{...props}\n\t\t\tcontentClassName={contentClassName}\n\t\t\tarrowClassName={arrowClassName}\n\t\t\tcontainer={container}\n\t\t>\n\t\t\t{children}\n\t\t</PopoverBody>\n\t</RadixPopover.Root>\n);\n\nexport type PopoverBodyProps = {\n\talign?: Align;\n\tside?: Side;\n\tarrowClassName?: string;\n\tcontentClassName?: string;\n\tchildren: React.ReactNode;\n\tcontainer?: Element;\n};\nconst PopoverBody = ({ children, arrowClassName, contentClassName, container, ...props }: PopoverBodyProps) => {\n\treturn (\n\t\t<RadixPopover.Portal container={container}>\n\t\t\t<RadixPopover.Content\n\t\t\t\t{...props}\n\t\t\t\tclassName={twMerge(\"isolate z-50 rounded-lg bg-white shadow-lg focus:outline-hidden\", contentClassName)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<RadixPopover.Arrow className={twMerge(\"fill-white\", arrowClassName)} offset={8} />\n\t\t\t</RadixPopover.Content>\n\t\t</RadixPopover.Portal>\n\t);\n};\n\nPopover.Root = (props: RadixPopover.PopoverProps) => <RadixPopover.Root {...props} />;\nPopover.Trigger = (props: ButtonProps) => (\n\t<RadixPopover.Trigger asChild>\n\t\t<Button {...props} />\n\t</RadixPopover.Trigger>\n);\nPopover.Body = PopoverBody;\nPopover.Close = (props: RadixPopover.PopoverCloseProps) => <RadixPopover.Close asChild {...props} />;\n","import { extendTailwindMerge } from \"tailwind-merge\";\n\nexport const twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t\"text-marketing-headline\",\n\t\t\t\t\"text-headline-1\",\n\t\t\t\t\"text-headline-2\",\n\t\t\t\t\"text-headline-3\",\n\t\t\t\t\"text-headline-4\",\n\t\t\t\t\"text-title-1\",\n\t\t\t\t\"text-title-2\",\n\t\t\t\t\"text-title-3\",\n\t\t\t\t\"text-body-1\",\n\t\t\t\t\"text-body-2\",\n\t\t\t\t\"text-label\",\n\t\t\t\t\"text-footnote\",\n\t\t\t\t\"text-smallcaps\",\n\t\t\t],\n\t\t\t\"text-color\": [\n\t\t\t\t\"text-dark\",\n\t\t\t\t\"text-neutral\",\n\t\t\t\t\"text-muted\",\n\t\t\t\t\"text-disabled\",\n\t\t\t\t\"text-placeholder\",\n\t\t\t\t\"text-primary\",\n\t\t\t\t\"text-warning\",\n\t\t\t\t\"text-success\",\n\t\t\t\t\"text-danger\",\n\t\t\t],\n\t\t\t\"bg-color\": [\n\t\t\t\t\"bg-surface-dark\",\n\t\t\t\t\"bg-surface-primary\",\n\t\t\t\t\"bg-surface-neutral\",\n\t\t\t\t\"bg-surface-light\",\n\t\t\t\t\"bg-surface-success\",\n\t\t\t\t\"bg-surface-danger\",\n\t\t\t\t\"bg-surface-warning\",\n\t\t\t\t\"bg-button-white\",\n\t\t\t\t\"bg-button-white-hover\",\n\t\t\t\t\"bg-button-white-pressed\",\n\t\t\t\t\"bg-button-white-disabled\",\n\t\t\t\t\"bg-button-primary\",\n\t\t\t\t\"bg-button-primary-hover\",\n\t\t\t\t\"bg-button-primary-pressed\",\n\t\t\t\t\"bg-button-primary-disabled\",\n\t\t\t\t\"bg-button-danger\",\n\t\t\t\t\"bg-button-danger-hover\",\n\t\t\t\t\"bg-button-danger-pressed\",\n\t\t\t\t\"bg-button-danger-disabled\",\n\t\t\t],\n\t\t\tanimate: [\n\t\t\t\t\"animate-quick-spin\",\n\t\t\t\t\"animate-fade-in\",\n\t\t\t\t\"animate-fade-in-custom-easing\",\n\t\t\t\t\"animate-fade-in-subtle-movement\",\n\t\t\t\t\"animate-skeleton-pulse\",\n\t\t\t\t\"animate-loading-pulse\",\n\t\t\t\t\"animate-collapsible-up\",\n\t\t\t\t\"animate-collapsible-down\",\n\t\t\t\t\"animate-loading-slide\",\n\t\t\t\t\"animate-orbit-large\",\n\t\t\t\t\"animate-orbit-small\",\n\t\t\t],\n\t\t},\n\t},\n});\n","import * as React from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ButtonStyleProps, buttonStyles } from \"./buttonStyles\";\n\n/**\n * Props for {@link Button}: the design-system style variants merged with all native\n * `<button>` attributes. Any prop not listed below (`onClick`, `type`, `aria-*`, etc.)\n * is a standard button attribute and is forwarded to the underlying element.\n */\nexport type ButtonProps = Simplify<ButtonStyleProps & React.ComponentPropsWithoutRef<\"button\">>;\n\nconst ButtonImpl = (\n\t{\n\t\tfullWidth,\n\t\tsize,\n\t\tintent,\n\t\tvariant,\n\t\tdisabled,\n\t\tloading,\n\t\tsoften,\n\t\troundedness,\n\t\tclassName,\n\t\tchildren,\n\t\t...rest\n\t}: ButtonProps,\n\tref: React.ForwardedRef<HTMLButtonElement>,\n) => {\n\treturn (\n\t\t<button\n\t\t\t// these props can be overridden by {...rest}\n\t\t\ttype=\"button\"\n\t\t\tclassName={twMerge(buttonStyles({ fullWidth, size, intent, variant, loading, soften, roundedness }), className)}\n\t\t\t// spread in props that can be used as-is\n\t\t\t{...rest}\n\t\t\t// these props won't be overridden as they come after {...rest}\n\t\t\tref={ref}\n\t\t\tdisabled={disabled || loading}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n};\n\n/**\n * The primary clickable button of the design system.\n *\n * Renders a native `<button>` styled by the `intent`/`variant`/`size` style props.\n *\n * @example\n * <Button intent=\"primary\" onClick={handleSave}>\n * Save\n * </Button>\n *\n * @example Loading\n * <Button intent=\"primary\" loading={isSaving}>\n * Save\n * </Button>\n */\nexport const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>> =\n\tReact.forwardRef(ButtonImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Intent, Size, Soften, Variant } from \"../variants\";\n\nexport const linkStyles =\n\t\"text-indigo-600 hover:underline active:text-indigo-400 focus:outline-indigo-400 focus:outline-offset-2\";\n\nexport type ButtonSize = Extract<Size, \"xs\" | \"sm\" | \"md\" | \"lg\">;\nexport type ButtonIntent = Extract<Intent, \"primary\" | \"default\" | \"danger\"> | \"error\";\nexport type ButtonRoundedness = \"default\" | \"large\";\n\nexport type ButtonStyleProps = {\n\tfullWidth?: boolean;\n\tsize?: ButtonSize;\n\tintent?: ButtonIntent;\n\tvariant?: Variant;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tsoften?: Soften;\n\troundedness?: ButtonRoundedness;\n};\n\nconst roundedMdStyles: Record<Soften, string> = {\n\tnone: \"\",\n\tright: \"rounded-r-md\",\n\tleft: \"rounded-l-md\",\n\tboth: \"rounded-md\",\n};\nconst roundedLgStyles: Record<Soften, string> = {\n\tnone: \"\",\n\tright: \"rounded-r-lg\",\n\tleft: \"rounded-l-lg\",\n\tboth: \"rounded-lg\",\n};\nconst roundedXlStyles: Record<Soften, string> = {\n\tnone: \"\",\n\tright: \"rounded-r-xl\",\n\tleft: \"rounded-l-xl\",\n\tboth: \"rounded-xl\",\n};\nconst borderRadiusStyles: Record<ButtonRoundedness, Record<ButtonSize, Record<Soften, string>>> = {\n\tdefault: {\n\t\txs: roundedMdStyles,\n\t\tsm: roundedMdStyles,\n\t\tmd: roundedMdStyles,\n\t\tlg: roundedLgStyles,\n\t},\n\tlarge: {\n\t\txs: roundedLgStyles,\n\t\tsm: roundedLgStyles,\n\t\tmd: roundedLgStyles,\n\t\tlg: roundedXlStyles,\n\t},\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n\txs: \"h-xs gap-1 px-2 text-body-2\",\n\tsm: \"h-sm gap-1 px-2 text-body-2\",\n\tmd: \"h-md gap-1.5 px-3 text-body-1\",\n\tlg: \"h-lg gap-2 px-4 text-title-2\",\n};\n\nconst colorStyles: Record<Variant, Record<ButtonIntent, string>> = {\n\tdefault: {\n\t\tprimary:\n\t\t\t\"bg-button-primary hover:bg-button-primary-hover data-[state='open']:bg-button-primary-hover border border-button-primary hover:border-button-primary-hover text-white\",\n\t\tdefault:\n\t\t\t\"bg-button-white hover:bg-button-white-hover data-[state='open']:bg-button-white-hover border border-button-white text-neutral\",\n\t\tdanger:\n\t\t\t\"bg-button-danger hover:bg-button-danger-hover data-[state='open']:bg-button-danger-hover border border-button-danger text-white\",\n\t\terror: \"bg-white hover:bg-red-50 data-[state='open']:bg-red-50 text-red-500 border border-red-300\",\n\t},\n\ttransparent: {\n\t\tprimary: \"bg-indigo-900/0 hover:bg-indigo-900/10 data-[state='open']:bg-indigo-900/10 text-indigo-700\",\n\t\tdefault: \"bg-gray-900/0 hover:bg-gray-900/10 data-[state='open']:bg-gray-900/10 text-neutral\",\n\t\tdanger: \"bg-red-900/0 hover:bg-red-900/10 data-[state='open']:bg-red-900/10 text-red-700\",\n\t\terror: \"bg-red-900/0 hover:bg-red-900/10 data-[state='open']:bg-red-900/10 text-red-500\",\n\t},\n\tdark: {\n\t\tprimary:\n\t\t\t\"bg-indigo-600 hover:bg-indigo-700 data-[state='open']:bg-indigo-700 border border-button-primary text-white\",\n\t\tdefault: \"bg-gray-900 hover:bg-gray-600 data-[state='open']:bg-gray-600 text-white\",\n\t\tdanger: \"bg-button-danger hover:bg-button-danger-hover data-[state='open']:bg-button-danger-hover text-white\",\n\t\terror: \"bg-white hover:bg-red-50 data-[state='open']:bg-red-50 text-red-500\",\n\t},\n};\n\nexport const buttonStyles = ({\n\tfullWidth = false,\n\tsize = \"md\",\n\tintent = \"default\",\n\tvariant = \"default\",\n\tsoften = \"both\",\n\tloading,\n\troundedness = \"default\",\n}: Omit<ButtonStyleProps, \"disabled\">) => {\n\treturn twJoin(\n\t\t\"flex items-center justify-center whitespace-nowrap focus-visible:ring-2 focus-visible:ring-indigo-400 focus-visible:ring-inset disabled:pointer-events-none disabled:opacity-50\",\n\t\tfullWidth && \"w-full\",\n\t\tborderRadiusStyles[roundedness][size][soften],\n\t\tsizeStyles[size],\n\t\tcolorStyles[variant][intent],\n\t\tloading && \"animate-loading-pulse\",\n\t);\n};\n","import { Button, ButtonProps } from \"./Button\";\n\nexport type ButtonGroupProps<TValue extends string | number> = {\n\tsize?: ButtonProps[\"size\"];\n\tvalue: TValue;\n\tonChange: (value: TValue) => void;\n\tbuttons: readonly {\n\t\tcontent: React.ReactNode;\n\t\tvalue: TValue;\n\t}[];\n};\n\nexport const ButtonGroup = <TValue extends string | number>({\n\tsize,\n\tvalue,\n\tonChange,\n\tbuttons,\n}: ButtonGroupProps<TValue>) => (\n\t<div className=\"flex\">\n\t\t{buttons.map((button, i) => (\n\t\t\t<Button\n\t\t\t\tsize={size}\n\t\t\t\tkey={button.value}\n\t\t\t\tonClick={() => onChange(button.value)}\n\t\t\t\tsoften={i === 0 ? \"left\" : i === buttons.length - 1 ? \"right\" : \"none\"}\n\t\t\t\tintent={value === button.value ? \"primary\" : undefined}\n\t\t\t>\n\t\t\t\t{button.content}\n\t\t\t</Button>\n\t\t))}\n\t</div>\n);\n","import * as RadixTooltip from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { useOverflowObserver } from \"@/core/utils/useOverflowObserver\";\n\nexport type TooltipContentProps = Pick<RadixTooltip.TooltipContentProps, \"side\"> & {\n\tchildren: React.ReactNode;\n\tvariant?: \"dark\" | \"light\";\n};\nconst TooltipContent = ({ children, variant = \"dark\", ...rest }: TooltipContentProps) => {\n\treturn (\n\t\t<RadixTooltip.Portal>\n\t\t\t<RadixTooltip.Content\n\t\t\t\t{...rest}\n\t\t\t\thideWhenDetached\n\t\t\t\tsideOffset={6}\n\t\t\t\t// TODO: remove z-index once z-index wars settle down\n\t\t\t\t// currently modal bg in /app is z-100\n\t\t\t\tclassName={`z-9000000000 max-w-prose rounded-lg px-5 py-3 text-sm wrap-break-word shadow-lg ${\n\t\t\t\t\tvariant === \"dark\" ? \"bg-gray-900 text-white\" : \"bg-white text-gray-600\"\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<RadixTooltip.Arrow className={variant === \"dark\" ? \"fill-gray-900\" : \"fill-white\"} offset={8} />\n\t\t\t</RadixTooltip.Content>\n\t\t</RadixTooltip.Portal>\n\t);\n};\nTooltipContent.displayName = RadixTooltip.Content.displayName;\n\nexport type OverflowTriggerProps<TElement extends HTMLElement> = Omit<RadixTooltip.TooltipTriggerProps, \"children\"> & {\n\t/** The `elementRef` render prop should attach to a measurable DOM element.\n\t *\n\t * @example\n\t * element={elementRef => (\n\t * <span ref={elementRef} className=\"truncate ...\">\n\t * {text}\n\t * </span>\n\t * )}\n\t */\n\telement: (elementRef: React.RefObject<TElement>) => React.ReactElement;\n};\nconst OverflowTrigger = <TElement extends HTMLElement = HTMLDivElement>({\n\telement,\n\t...rest\n}: OverflowTriggerProps<TElement>) => {\n\tconst { elementRef, hasOverflow } = useOverflowObserver<TElement>();\n\n\tif (!hasOverflow) {\n\t\treturn element(elementRef);\n\t}\n\treturn (\n\t\t<RadixTooltip.Trigger asChild {...rest}>\n\t\t\t{element(elementRef)}\n\t\t</RadixTooltip.Trigger>\n\t);\n};\n\nconst TooltipTrigger = (props: RadixTooltip.TooltipTriggerProps) => <RadixTooltip.Trigger asChild {...props} />;\n\nconst TooltipProvider = (props: RadixTooltip.TooltipProviderProps) => (\n\t<RadixTooltip.Provider disableHoverableContent delayDuration={0} {...props} />\n);\n\nconst TooltipRoot = (props: RadixTooltip.TooltipProps) => <RadixTooltip.Root {...props} />;\n\nexport type TooltipProps = Simplify<\n\tOmit<RadixTooltip.TooltipProps, \"children\"> &\n\t\tOmit<TooltipContentProps, \"children\"> & {\n\t\t\ttrigger?: React.ReactNode;\n\t\t\tcontent?: React.ReactNode;\n\t\t}\n>;\n/**\n * @example\n * <Tooltip\n * trigger={<Button>Cool action</Button>}\n * \tcontent={<p className=\"text-xs\">This is the tooltip content</p>}\n * />\n */\nexport const Tooltip = ({ trigger, content, variant, side, ...rest }: TooltipProps) => {\n\treturn (\n\t\t<Tooltip.Root {...rest}>\n\t\t\t<Tooltip.Trigger>{trigger}</Tooltip.Trigger>\n\t\t\t{content && (\n\t\t\t\t<Tooltip.Content side={side} variant={variant}>\n\t\t\t\t\t{content}\n\t\t\t\t</Tooltip.Content>\n\t\t\t)}\n\t\t</Tooltip.Root>\n\t);\n};\n\nTooltip.Provider = TooltipProvider;\nTooltip.Root = TooltipRoot;\nTooltip.Trigger = TooltipTrigger;\nTooltip.OverflowTrigger = OverflowTrigger;\nTooltip.Content = TooltipContent;\n","import * as React from \"react\";\n\nexport const useOverflowObserver = <T extends HTMLElement>() => {\n\tconst [hasOverflow, setHasOverflow] = React.useState(false);\n\tconst elementRef = React.useRef<T>(null);\n\n\t// React.useLayoutEffect can hurt perf as advised by React docs,\n\t// so useEffect until it becomes obvious to React.useLayoutEffect.\n\t// eslint-disable-next-line no-restricted-syntax\n\tReact.useEffect(() => {\n\t\tif (elementRef.current == null) return;\n\n\t\tconst resizeObserver = new ResizeObserver(([entry]) => {\n\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\tconst element = entry?.target as T;\n\n\t\t\t\tconst hasOverflowWidth = element.offsetWidth < element.scrollWidth;\n\t\t\t\tconst hasOverflowHeight = element.offsetHeight < element.scrollHeight;\n\t\t\t\tconst calcHasOverflow = hasOverflowWidth || hasOverflowHeight;\n\t\t\t\t// setting state will cause re-render, so only set if actually changed\n\t\t\t\tif (calcHasOverflow !== hasOverflow) {\n\t\t\t\t\tsetHasOverflow(calcHasOverflow);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tresizeObserver.observe(elementRef.current);\n\n\t\treturn () => resizeObserver.disconnect();\n\t}, [hasOverflow]);\n\n\treturn { elementRef, hasOverflow };\n};\n","import { Text } from \"@/core/text\";\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Avatar, AvatarVariant } from \"./Avatar\";\n\nexport type AvatarWithNameProps = {\n\tname: string;\n\tvariant?: AvatarVariant;\n\tclassName?: string;\n};\n\nexport const AvatarWithName = ({ name, variant, className }: AvatarWithNameProps) => (\n\t<div className={twMerge(\"flex items-center gap-2\", className)}>\n\t\t<Avatar name={name} variant={variant} />\n\t\t<Text>{name}</Text>\n\t</div>\n);\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { faCircle, faDiamond, faExclamationTriangle, faInfoCircle } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\nimport { Intent } from \"../variants\";\n\nexport type CalloutIntent = Extract<Intent, \"default\" | \"warning\" | \"primary\" | \"danger\">;\n\nexport type CalloutProps = {\n\t/**\n\t * Semantic intent driving the background, border, and default leading icon.\n\t * @default default\n\t */\n\tintent?: CalloutIntent;\n\t/** Bold heading shown above the body. */\n\ttitle?: React.ReactNode;\n\t/** Content rendered at the trailing edge, e.g. a dismiss button or action link. */\n\trightSlot?: React.ReactNode;\n\t/** Body content of the callout. */\n\tchildren?: React.ReactNode;\n\t/** Overrides the intent's default leading icon. */\n\tcustomIcon?: IconDefinition;\n\t/**\n\t * Squares off the bottom corners so the callout can sit flush against the element below it.\n\t * @default false\n\t */\n\tisAttachedAtBottom?: boolean;\n\t/**\n\t * Vertically centers the icon with the content instead of top-aligning it.\n\t * @default false\n\t */\n\tisCentered?: boolean;\n};\n\nconst calloutBackgroundStyles: Record<CalloutIntent, string> = {\n\tdefault: \"bg-surface-neutral\",\n\twarning: \"bg-yellow-50\",\n\tprimary: \"bg-surface-primary\",\n\tdanger: \"bg-red-50\",\n};\n\nconst calloutIconStyles: Record<CalloutIntent, string> = {\n\tdefault: \"text-muted\",\n\twarning: \"text-warning\",\n\tprimary: \"text-indigo-500\",\n\tdanger: \"text-red-800\",\n};\n\nconst calloutBorderStyles: Record<CalloutIntent, string> = {\n\tdefault: \"border-[1px] border-surface-neutral\",\n\tprimary: \"border-[1px] border-surface-primary\",\n\twarning: \"border-[1px] border-surface-warning\",\n\tdanger: \"border-[1px] border-red-100\",\n};\n\nconst calloutIcons: Record<CalloutIntent, IconDefinition> = {\n\tdefault: faInfoCircle,\n\twarning: faExclamationTriangle,\n\tprimary: faDiamond,\n\tdanger: faCircle,\n};\n\n/**\n * A boxed, color-coded message for drawing attention to information, warnings, or errors.\n *\n * The `intent` sets the background, border, and a default leading icon (override with `customIcon`).\n * Provide a `title`, body `children`, or both, plus an optional `rightSlot` for a trailing action.\n *\n * @example\n * <Callout intent=\"warning\" title=\"Heads up\">\n * Saving will overwrite the existing draft.\n * </Callout>\n */\nexport const Callout = ({\n\ttitle,\n\tintent = \"default\",\n\trightSlot,\n\tchildren,\n\tcustomIcon,\n\tisAttachedAtBottom,\n\tisCentered,\n}: CalloutProps) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex w-full justify-between rounded-lg p-2.5\",\n\t\t\tcalloutBackgroundStyles[intent],\n\t\t\tcalloutBorderStyles[intent],\n\t\t\tisAttachedAtBottom ? \"rounded-b-none\" : \"rounded-b-lg\",\n\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t)}\n\t>\n\t\t<div className=\"flex gap-2\">\n\t\t\t<div className={twJoin(\"text-sm\", title ? \"leading-xs\" : \"leading-5\", calloutIconStyles[intent])}>\n\t\t\t\t<Icon icon={customIcon ?? calloutIcons[intent]} />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-1 flex-col gap-1\">\n\t\t\t\t{title && <div className=\"leading-xs font-medium whitespace-pre-line text-neutral\">{title}</div>}\n\t\t\t\t{children && <div className=\"text-sm/5 text-muted\">{children}</div>}\n\t\t\t</div>\n\t\t</div>\n\t\t{rightSlot}\n\t</div>\n);\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport type IconProps = {\n\t/** A Font Awesome icon definition, imported from one of the `@fortawesome/*-svg-icons` packages. */\n\ticon: IconDefinition;\n};\n\n/**\n * Renders a Font Awesome SVG icon.\n *\n * A thin wrapper over `FontAwesomeIcon` that constrains the API to a single `icon` prop, keeping\n * icon usage consistent across the design system. Color and size are inherited from the surrounding\n * text (`font-size` / `color`).\n *\n * @example\n * import { faCircleInfo } from \"@fortawesome/sharp-solid-svg-icons\";\n *\n * <Icon icon={faCircleInfo} />\n */\nexport const Icon = ({ icon }: IconProps) => <FontAwesomeIcon icon={icon} />;\n","import React from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ChildrenProps, ClassNameProps } from \"../types\";\n\nexport type CardProps = {\n\t/**\n\t * Click handler. When provided, the card gains a pointer cursor and a hover elevation to signal\n\t * that it is interactive.\n\t */\n\tonClick?: React.MouseEventHandler<HTMLDivElement>;\n} & ClassNameProps &\n\tChildrenProps;\n\n/**\n * A rounded, elevated surface that groups related content.\n *\n * Renders a white container with a border and shadow; the `ref` forwards to the root `<div>`.\n * Supplying `onClick` makes it interactive (cursor + hover elevation). Use `className` to adjust\n * padding, width, or margins.\n *\n * @example\n * <Card className=\"p-4\" onClick={() => openDetails(id)}>\n * <Text variant=\"title-2\">Summary</Text>\n * </Card>\n */\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(({ className, children, onClick }, ref) => (\n\t<div\n\t\tref={ref}\n\t\tclassName={twMerge(\n\t\t\t\"mb-4 rounded-lg border-solid border-surface-neutral bg-white shadow\",\n\t\t\tonClick != null && \"cursor-pointer transition-shadow duration-150 hover:shadow-md\",\n\t\t\tclassName,\n\t\t)}\n\t\tonClick={onClick}\n\t>\n\t\t{children}\n\t</div>\n));\n","import { forwardRef, InputHTMLAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { ErrorProps } from \"../types\";\n\n/**\n * Props for {@link Checkbox}: all native `<input>` attributes (`checked`, `onChange`, `disabled`,\n * `name`, …) plus the design-system error props.\n */\nexport type CheckboxProps = InputHTMLAttributes<HTMLInputElement> & ErrorProps;\n\n/**\n * A styled checkbox input.\n *\n * Renders a native `<input type=\"checkbox\">` with design-system styling and forwards its `ref` and\n * all native attributes, so it works controlled (`checked` + `onChange`) or uncontrolled\n * (`defaultChecked`). Set `hasError` for the error appearance. For the tri-state \"some selected\"\n * look, use `IndeterminateCheckbox`.\n *\n * @example\n * <Checkbox checked={agreed} onChange={(e) => setAgreed(e.target.checked)} />\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(({ className, hasError, ...rest }, ref) => (\n\t<input\n\t\ttype=\"checkbox\"\n\t\tclassName={twJoin(\n\t\t\tclassName,\n\t\t\t\"block rounded-sm text-indigo-600 checked:bg-indigo-600 indeterminate:bg-indigo-600 focus:ring-0 focus:ring-offset-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-400 disabled:cursor-not-allowed disabled:bg-surface-dark disabled:hover:bg-surface-dark\",\n\t\t\thasError\n\t\t\t\t? \"border-red-300 text-red-900 placeholder-red-300\"\n\t\t\t\t: \"border-surface-neutral disabled:border-surface-neutral\",\n\t\t)}\n\t\t{...rest}\n\t\tref={ref}\n\t/>\n));\n","import { faChevronDown, faChevronRight } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Content, Root, Trigger } from \"@radix-ui/react-collapsible\";\nimport * as React from \"react\";\nimport { useState } from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Icon } from \"../icon\";\n\nexport type CollapsibleProps = {\n\t/** Always-visible header that toggles the content when clicked. */\n\ttitle: React.ReactNode;\n\t/** Content shown while expanded. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Initial open state when uncontrolled.\n\t * @default false\n\t */\n\tdefaultOpen?: boolean;\n\t/**\n\t * Which side of the title the chevron sits on.\n\t * @default left\n\t */\n\ticonPosition?: \"left\" | \"right\" | undefined;\n\t/** Hides the chevron entirely. */\n\thideIcon?: boolean;\n\t/** Controlled open state. Pass together with `setOpen`. */\n\topen?: boolean;\n\t/** Setter for controlled open state. Pass together with `open`. */\n\tsetOpen?: (open: boolean) => void;\n\t/** Class name for the clickable trigger row. */\n\ttriggerClassName?: string;\n};\n\n/**\n * A title row that expands and collapses to reveal its content, built on Radix `Collapsible`.\n *\n * Works uncontrolled (`defaultOpen`) or controlled (pass both `open` and `setOpen`). A chevron\n * reflects the open state; position it with `iconPosition` or remove it with `hideIcon`.\n *\n * @example\n * <Collapsible title=\"Advanced options\">\n * <Options />\n * </Collapsible>\n */\nexport const Collapsible = ({\n\ttitle,\n\tchildren,\n\tdefaultOpen = false,\n\ticonPosition = \"left\",\n\thideIcon,\n\topen: controlledOpen,\n\tsetOpen: controlledSetOpen,\n\ttriggerClassName,\n}: CollapsibleProps) => {\n\tconst isControlled = controlledOpen !== undefined && controlledSetOpen !== undefined;\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\n\tconst isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst setIsOpen = isControlled ? controlledSetOpen : setUncontrolledOpen;\n\n\treturn (\n\t\t<Root className=\"flex flex-col gap-2\" open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t<Trigger\n\t\t\t\tasChild\n\t\t\t\tclassName={twMerge(\"flex cursor-pointer items-center gap-2 font-medium text-muted\", triggerClassName)}\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t{!hideIcon && iconPosition === \"left\" && (\n\t\t\t\t\t\t<div className=\"min-w-3.5\">\n\t\t\t\t\t\t\t<Icon icon={isOpen ? faChevronDown : faChevronRight} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{title}\n\t\t\t\t\t{!hideIcon && iconPosition === \"right\" && (\n\t\t\t\t\t\t<div className=\"min-w-3.5\">\n\t\t\t\t\t\t\t<Icon icon={isOpen ? faChevronDown : faChevronRight} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Trigger>\n\t\t\t<Content className=\"overflow-y-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">{children}</div>\n\t\t\t</Content>\n\t\t</Root>\n\t);\n};\n","import { faChevronDown } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Button, ButtonProps } from \"@/core/button\";\nimport { Icon } from \"@/core/icon\";\nimport { IsVisibleProvider, useIsVisible } from \"@/core/utils/useToggle\";\n\nexport type ToggleButtonProps = ButtonProps;\nconst ToggleButton = ({ children, ...rest }: ToggleButtonProps) => {\n\tconst { state: isVisible, toggle } = useIsVisible();\n\n\treturn (\n\t\t<Slot onClick={toggle}>\n\t\t\t<Button variant=\"transparent\" size=\"xs\" {...rest}>\n\t\t\t\t<span className={twJoin(\"transition-transform\", !isVisible && \"-rotate-90\")}>\n\t\t\t\t\t<Icon icon={faChevronDown} />\n\t\t\t\t</span>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t</Slot>\n\t);\n};\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n\tconst { state: isVisible } = useIsVisible();\n\n\tif (isVisible) return children;\n\treturn null;\n};\n\nexport type CollapsibleSectionProps = {\n\t/** The section, typically containing a {@link CollapsibleSection.ToggleButton} and {@link CollapsibleSection.Content}. */\n\tchildren: React.ReactNode;\n\t/** Whether the section starts expanded. */\n\tdefaultOpen?: boolean;\n};\n\n/**\n * A collapsible region whose toggle and content can live anywhere within it.\n *\n * Unlike {@link Collapsible} (a single title-over-content unit), this shares open state via context,\n * so {@link CollapsibleSection.ToggleButton} and {@link CollapsibleSection.Content} can be placed\n * independently in the layout. The toggle is a transparent {@link Button} with a rotating chevron.\n *\n * @example\n * <CollapsibleSection defaultOpen>\n * <CollapsibleSection.ToggleButton>Details</CollapsibleSection.ToggleButton>\n * <CollapsibleSection.Content>\n * <Details />\n * </CollapsibleSection.Content>\n * </CollapsibleSection>\n */\nexport const CollapsibleSection = ({ children, defaultOpen }: CollapsibleSectionProps) => {\n\treturn <IsVisibleProvider state={defaultOpen}>{children}</IsVisibleProvider>;\n};\n\nCollapsibleSection.ToggleButton = ToggleButton;\nCollapsibleSection.Content = Content;\n","import * as React from \"react\";\n\nimport { createContextHelper } from \"./create-context-helper\";\n\ntype ToggleContext = ReturnType<typeof useToggle>;\nconst [ToggleProvider, useToggleHook] = createContextHelper<ToggleContext>({\n\tstate: false,\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\tupdate: () => {},\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\ttoggle: () => {},\n});\n/**\n * @example\n * const defaultState = false; // optional as false is the default\n * const [Provider, useToggle] = createToggleContextHelper(defaultState);\n *\n * const {\n * \tstate,\t// boolean\n * \tupdate,\t// (state: boolean) => void\n * \ttoggle\t// () => void\n * } = useToggle();\n */\nexport const createToggleContextHelper = (defaultState = false) => {\n\tconst Provider = ({ children, state: initState }: { children: React.ReactNode; state?: boolean }) => {\n\t\tconst hook = useToggle(initState ?? defaultState);\n\t\treturn <ToggleProvider {...hook}>{children}</ToggleProvider>;\n\t};\n\n\tProvider.displayName = \"ToggleProvider\";\n\treturn [Provider, useToggleHook] as const;\n};\n\n// -----------------------------------------------------\n// provider and hook combos\n// -----------------------------------------------------\n/**\n * @example\n * const defaultState = true;\n * const { state, update, toggle } = useIsVisible(defaultState);\n */\nexport const [IsVisibleProvider, useIsVisible] = createToggleContextHelper(true);\n/**\n * @example\n * const defaultState = false;\n * const { state, update, toggle } = useIsEditing(defaultState);\n */\nexport const [IsEditingProvider, useIsEditing] = createToggleContextHelper(false);\n\n// -----------------------------------------------------\n// hooks like you know and love\n// -----------------------------------------------------\n/**\n * @example\n * const defaultState = false; // optional as false is the default\n * const { state, update, toggle } = useToggle(defaultState);\n */\nexport const useToggle = (initState?: boolean) => {\n\tconst [state, update] = React.useState(initState ?? false);\n\tconst toggle = React.useCallback(() => update((state) => !state), []);\n\treturn { state, update, toggle };\n};\n","import * as React from \"react\";\n\n/**\n * @example\n * type FooContextValue = { foo: string };\n * const [FooProvider, useFoo] = createContextHelper<FooContextValue>({ foo: \"bar\" });\n */\nexport const createContextHelper = <ContextValue extends object | null>(defaultContext?: ContextValue) => {\n\tconst Context = React.createContext<ContextValue | undefined>(defaultContext);\n\n\tconst Provider = ({ children, ...rest }: ContextValue & { children: React.ReactNode }) => {\n\t\t// Only re-memoize when prop values change\n\t\t// eslint-disable-next-line react-compiler/react-compiler\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\tconst value = React.useMemo(() => rest, Object.values(rest)) as ContextValue;\n\t\treturn <Context.Provider value={value}>{children}</Context.Provider>;\n\t};\n\n\tconst useContext = () => {\n\t\tconst context = React.useContext(Context);\n\t\tif (context) {\n\t\t\treturn context;\n\t\t}\n\t\tif (defaultContext !== undefined) {\n\t\t\treturn defaultContext;\n\t\t}\n\t\t// if a defaultContext wasn't specified, it's a required context.\n\t\tthrow new Error(\"Required context: useContext likely outside of a Provider\");\n\t};\n\n\treturn [Provider, useContext] as const;\n};\n","import { faCheck, faCopy } from \"@fortawesome/sharp-solid-svg-icons\";\nimport * as RadixTooltip from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\nimport { Tooltip } from \"../tooltip\";\nimport { useCopyable } from \"./use-copyable\";\n\nexport type CopyEasyProps = {\n\t/** The element the user clicks to copy. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Text copied to the clipboard on click. When falsy, nothing is copyable: the children render\n\t * as-is (wrapped in a tooltip if `tooltip` is provided).\n\t */\n\tvalue: string | undefined;\n\t/** Optional hover tooltip describing the copy action. */\n\ttooltip?: React.ReactNode;\n\t/** Extra callback invoked after a successful copy. */\n\tonClick?: () => void;\n\t/**\n\t * Render children directly as the trigger instead of wrapping them in a `<span>`. Use when the\n\t * child already forwards a ref and props.\n\t */\n\tasChild?: boolean;\n\t/** Class name for the trigger. */\n\tclassName?: string;\n};\n\n/**\n * Makes its children click-to-copy, with a popover that confirms the copy.\n *\n * Clicking copies `value` to the clipboard and briefly shows a checkmark. If `value` is empty the\n * content is non-interactive (shown plainly, or inside a tooltip when `tooltip` is set). The click\n * is stopped from propagating, so it is safe to nest inside clickable rows.\n *\n * @example\n * <Copyable value={patient.id} tooltip=\"Copy patient ID\">\n * {patient.id}\n * </Copyable>\n */\nexport const Copyable = ({ children, value, tooltip, onClick, asChild, className }: CopyEasyProps) => {\n\tconst { state, copy } = useCopyable();\n\tconst handleCopy = async (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\tawait copy(value, onClick);\n\t};\n\n\tif (!value && tooltip) {\n\t\treturn <Tooltip trigger={children} content={tooltip} />;\n\t}\n\tif (!value) {\n\t\treturn children;\n\t}\n\treturn (\n\t\t<RadixTooltip.Root open={state === \"copied\" ? true : undefined} delayDuration={150}>\n\t\t\t<RadixTooltip.Trigger\n\t\t\t\tasChild\n\t\t\t\tonClick={handleCopy}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"w-fit cursor-pointer rounded-xs\",\n\t\t\t\t\tstate !== \"copied\" && \"hover:bg-[#E8E8EB] hover:shadow-[0_0_0_2px_#E8E8EB] active:opacity-60\",\n\t\t\t\t\tstate === \"copying\" && \"opacity-60\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{asChild ? children : <span>{children}</span>}\n\t\t\t</RadixTooltip.Trigger>\n\t\t\t{tooltip && state === \"idle\" && <Tooltip.Content side=\"bottom\">{tooltip}</Tooltip.Content>}\n\t\t\t<RadixTooltip.Portal>\n\t\t\t\t<RadixTooltip.Content\n\t\t\t\t\tsideOffset={6}\n\t\t\t\t\tside=\"right\"\n\t\t\t\t\t// TODO: remove z-index once z-index wars settle down\n\t\t\t\t\t// currently modal bg in /app is z-100\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"z-101 grid h-6 w-6 place-items-center rounded-sm bg-white shadow-lg\",\n\t\t\t\t\t\tstate !== \"copying\" && \"animate-fade-in\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className={state === \"copied\" ? \"text-green-500\" : \"text-muted\"}>\n\t\t\t\t\t\t<Icon icon={state === \"copied\" ? faCheck : faCopy} />\n\t\t\t\t\t</div>\n\t\t\t\t</RadixTooltip.Content>\n\t\t\t</RadixTooltip.Portal>\n\t\t</RadixTooltip.Root>\n\t);\n};\n","import * as React from \"react\";\n\nconst waitMs = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst oldSchoolCopy = (text: string) => {\n\tconst tempTextArea = document.createElement(\"textarea\");\n\ttempTextArea.value = text;\n\tdocument.body.appendChild(tempTextArea);\n\ttempTextArea.select();\n\tdocument.execCommand(\"copy\");\n\tdocument.body.removeChild(tempTextArea);\n};\n\nexport const copyToClipboard = async (value: string) => {\n\ttry {\n\t\tif (navigator?.clipboard?.writeText) {\n\t\t\tawait navigator.clipboard.writeText(value);\n\t\t} else {\n\t\t\tthrow new Error(\"writeText not supported\");\n\t\t}\n\t} catch {\n\t\toldSchoolCopy(value);\n\t}\n};\n\nexport const useCopyable = () => {\n\tconst [state, setState] = React.useState<\"idle\" | \"copying\" | \"copied\">(\"idle\");\n\n\tconst copy = React.useCallback(async (value: string | undefined, onClick?: () => void) => {\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tsetState(\"copying\");\n\t\tawait Promise.all([copyToClipboard(value), waitMs(350)]);\n\t\tonClick?.();\n\n\t\tsetState(\"copied\");\n\t\t// give user a chance to grok the copy has succeeded\n\t\tawait waitMs(1750);\n\t\tsetState(\"idle\");\n\t}, []);\n\n\treturn { state, copy };\n};\n","import { useCallback } from \"react\";\nimport DatePickerLib from \"react-datepicker\";\n\nimport { DatePickerHeader } from \"./DatePickerHeader\";\nimport { customInputFieldFactory, DatePickerSharedProps } from \"./shared\";\nimport { TimeInput } from \"./TimeInput\";\n\nexport type DatePickerRangeProps = DatePickerSharedProps & {\n\tvalue: [Date | undefined, Date | undefined];\n\trange: true;\n\n\tonChange?: (newDate: [Date | undefined, Date | undefined]) => void;\n};\n\nexport const DatePickerRange = ({\n\tvalue = [undefined, undefined],\n\terrorNode,\n\thasError,\n\tinputProps,\n\tplaceholder,\n\tonChange,\n\tposition = \"bottom-start\",\n\t...props\n}: DatePickerRangeProps) => {\n\tconst handleChange = useCallback(\n\t\t(date: [Date | null, Date | null]) => onChange?.([date[0] || undefined, date[1] || undefined]),\n\t\t[onChange],\n\t);\n\n\tconst clearDatePicker = useCallback(\n\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\te.preventDefault();\n\t\t\tonChange?.([undefined, undefined]);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<DatePickerLib\n\t\t\t{...props}\n\t\t\tclassName=\"placeholder:text-placeholder\"\n\t\t\tselected={value[0]}\n\t\t\tonChange={handleChange}\n\t\t\tstartDate={value[0]}\n\t\t\tendDate={value[1]}\n\t\t\tdateFormat={props.showTimeInput ? \"MM/dd/yyyy h:mm aa\" : \"MM/dd/yyyy\"}\n\t\t\tselectsRange\n\t\t\tpopperPlacement={position}\n\t\t\tplaceholderText={placeholder}\n\t\t\tcustomInput={\n\t\t\t\t!props.inline\n\t\t\t\t\t? customInputFieldFactory({\n\t\t\t\t\t\t\tinputProps,\n\t\t\t\t\t\t\tisEmpty: value[0] == null && value[1] == null,\n\t\t\t\t\t\t\tdisabled: props.disabled,\n\t\t\t\t\t\t\terrorNode,\n\t\t\t\t\t\t\thasError,\n\t\t\t\t\t\t\tonClearInput: clearDatePicker,\n\t\t\t\t\t\t})\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tcustomTimeInput={<TimeInput />}\n\t\t\trenderCustomHeader={DatePickerHeader}\n\t\t/>\n\t);\n};\n","import { faChevronLeft, faChevronRight } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { getMonth, getYear } from \"date-fns\";\nimport { range } from \"lodash-es\";\nimport { ReactDatePickerCustomHeaderProps } from \"react-datepicker\";\n\nimport { Button, Icon, Select } from \"@/core\";\n\n// Allow year selection from 1920 to 5 years in the future\nconst years = range(1920, getYear(new Date()) + 6, 1).sort((a, b) => b - a);\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nexport const DatePickerHeader = ({\n\tdate,\n\tdecreaseMonth,\n\tincreaseMonth,\n\tchangeMonth,\n\tchangeYear,\n\tprevMonthButtonDisabled,\n\tnextMonthButtonDisabled,\n}: ReactDatePickerCustomHeaderProps) => {\n\tconst datePickerContainer = document.querySelector(\".react-datepicker\") ?? undefined;\n\treturn (\n\t\t<div className=\"space-y-2 p-2\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Button onClick={decreaseMonth} disabled={prevMonthButtonDisabled} variant=\"transparent\" size=\"sm\">\n\t\t\t\t\t<Icon icon={faChevronLeft} />\n\t\t\t\t</Button>\n\t\t\t\t<Select\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tpopover={{\n\t\t\t\t\t\tcontainer: datePickerContainer,\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={months[getMonth(date)]}\n\t\t\t\t\tonChange={(value) => changeMonth(months.indexOf(value))}\n\t\t\t\t\titems={months.map((month) => ({ label: month, value: month }))}\n\t\t\t\t/>\n\t\t\t\t<Select\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tpopover={{\n\t\t\t\t\t\tcontainer: datePickerContainer,\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={getYear(date).toString()}\n\t\t\t\t\tonChange={(value) => changeYear(parseInt(value))}\n\t\t\t\t\titems={years.map((year) => ({ label: year.toString(), value: year.toString() }))}\n\t\t\t\t/>\n\t\t\t\t<Button onClick={increaseMonth} disabled={nextMonthButtonDisabled} variant=\"transparent\" size=\"sm\">\n\t\t\t\t\t<Icon icon={faChevronRight} />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { type Placement } from \"@floating-ui/react\";\nimport { faCalendar, faXmark } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { DatePickerProps } from \"react-datepicker\";\n\nimport { Button, Icon } from \"@/core\";\n\nimport { ErrorProps } from \"../types\";\nimport { DatePickerInput, DatePickerInputProps } from \"./DatePickerInput\";\n\nexport type DatePickerSharedProps = Pick<\n\tDatePickerProps,\n\t\"inline\" | \"autoFocus\" | \"showTimeInput\" | \"preventOpenOnFocus\" | \"minDate\" | \"maxDate\" | \"disabled\"\n> & {\n\tinputProps?: DatePickerInputProps;\n\tplaceholder?: string;\n\tposition?: Placement;\n} & ErrorProps;\n\n// This is a factory that creates components, rather than a component itself because\n// of the way that react-datepicker uses refs for the input field. While it may be possible,\n// I couldn't figure out how to forward the ref correctly such that the date picker popup appeared\n// when selecting the input.\nexport const customInputFieldFactory = ({\n\tinputProps,\n\terrorNode,\n\thasError,\n\tisEmpty,\n\tdisabled,\n\tonClearInput,\n}: {\n\tinputProps?: DatePickerInputProps;\n\tisEmpty: boolean;\n\tdisabled?: boolean;\n\tplaceholder?: string;\n\tonClearInput: (event: React.MouseEvent<HTMLButtonElement>) => void;\n} & ErrorProps) => (\n\t<DatePickerInput\n\t\tinputProps={inputProps}\n\t\terrorNode={errorNode}\n\t\thasError={hasError}\n\t\trightAction={\n\t\t\tisEmpty ? (\n\t\t\t\t<span className=\"text-disabled\">\n\t\t\t\t\t<Icon icon={faCalendar} />\n\t\t\t\t</span>\n\t\t\t) : !disabled ? (\n\t\t\t\t<Button size=\"xs\" onClick={onClearInput} variant=\"transparent\">\n\t\t\t\t\t<span className=\"text-muted\">\n\t\t\t\t\t\t<Icon icon={faXmark} />\n\t\t\t\t\t</span>\n\t\t\t\t</Button>\n\t\t\t) : null\n\t\t}\n\t/>\n);\n","import { forwardRef, InputHTMLAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ErrorProps } from \"../types\";\n\nexport type DatePickerInputProps = InputHTMLAttributes<HTMLInputElement>;\n\ntype DatePickerInputInternalProps = {\n\tinputProps?: DatePickerInputProps;\n\trightAction?: React.ReactNode;\n\tdisabled?: boolean;\n} & ErrorProps;\n\nexport const DatePickerInput = forwardRef<HTMLInputElement, DatePickerInputInternalProps & DatePickerInputProps>(\n\t({ inputProps, errorNode, hasError, rightAction, disabled, className, ...rest }, ref) => {\n\t\tconst ringClassName = disabled\n\t\t\t? \"focus:outline-hidden focus:ring-0\"\n\t\t\t: hasError\n\t\t\t\t? \"focus:outline-hidden focus:ring-red-500 focus:border-red-500\"\n\t\t\t\t: \"focus:ring-2 focus:ring-indigo-200\";\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"relative block w-full rounded-md shadow-sm\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t{...inputProps}\n\t\t\t\t\t\tclassName={twMerge(\n\t\t\t\t\t\t\t\"block w-full rounded-md disabled:bg-surface-neutral\",\n\t\t\t\t\t\t\trightAction && \"pr-8\",\n\t\t\t\t\t\t\thasError ? \"border-red-300 text-red-900 placeholder-red-300\" : \"border-surface-neutral\",\n\t\t\t\t\t\t\tringClassName,\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\tinputProps?.className,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t/>\n\t\t\t\t\t{rightAction && (\n\t\t\t\t\t\t<div className={twJoin(\"absolute inset-y-0 right-0 flex items-center pr-3\", disabled && \"cursor-auto\")}>\n\t\t\t\t\t\t\t{rightAction}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{hasError != null && errorNode != null && (\n\t\t\t\t\t<p className=\"mt-2 max-h-[100px] overflow-auto text-sm text-danger\">{errorNode}</p>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t},\n);\n","import { InputHTMLAttributes, useCallback, useState } from \"react\";\n\nimport { Input } from \"../input\";\n\nexport const TimeInput = ({\n\tvalue: inputValue,\n\tonChange,\n}: Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\"> & { onChange?: (newDate: string | undefined) => void }) => {\n\tconst [value, setValue] = useState<string | undefined>(inputValue?.toString());\n\n\tconst handleUpdateTime = useCallback(() => {\n\t\tonChange?.(value);\n\t}, [value, onChange]);\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\thandleUpdateTime();\n\t\t}\n\t};\n\n\treturn (\n\t\t<Input\n\t\t\tvalue={value}\n\t\t\tonChange={(e) => setValue(e.target.value)}\n\t\t\tonBlur={handleUpdateTime}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\ttype=\"time\"\n\t\t\trequired\n\t\t/>\n\t);\n};\n","import * as React from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { InputBoxStyleProps, inputBoxStyles, inputStyles } from \"./inputBoxStyles\";\n\nexport type InputBoxProps = InputBoxStyleProps & {\n\t/**\n\t * Contents of the box — typically `<InputBox.Input />` alongside adornments such as icons,\n\t * a prefix, or a clear button.\n\t */\n\tchildren: React.ReactNode;\n};\n\nexport type InputBaseProps = React.ComponentPropsWithoutRef<\"input\">;\n\nconst NestedInputImpl = (props: InputBaseProps, ref: React.ForwardedRef<HTMLInputElement>) => {\n\treturn (\n\t\t<input\n\t\t\t// these props can be overridden by {...props}\n\t\t\ttype=\"text\"\n\t\t\tclassName={`${inputStyles} border-none bg-transparent p-0 focus:ring-0 focus:outline-hidden`}\n\t\t\tautoComplete=\"off\"\n\t\t\t// spread in props that can be used as-is\n\t\t\t{...props}\n\t\t\t// these props won't be overridden as they come after {...props}\n\t\t\tref={ref}\n\t\t/>\n\t);\n};\n\nconst NestedInput = forwardRef(NestedInputImpl);\n\n/**\n * A styled text-field container that wraps an input together with adornments.\n *\n * Use the compound `InputBox.Input` for the editable field and place icons, a prefix, or buttons\n * beside it as `children`; the box renders a `<label>` so clicking anywhere focuses the nested\n * input. State styling (`hasError` / `hasSuccess`) is applied to the box and inherited by adornments.\n * For a plain bordered field with no surrounding adornments, use the standalone {@link Input}.\n *\n * @example\n * <InputBox hasError={hasError}>\n * <Icon icon={faMagnifyingGlass} />\n * <InputBox.Input value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"Search\" />\n * </InputBox>\n */\nconst InputBoxImpl = ({ children, ...style }: InputBoxProps, ref: React.ForwardedRef<HTMLLabelElement>) => (\n\t// Styling text to propagate stateful text color inheritance for the children of InputBox\n\t// (think Icons, other non-input elements). Avoids style collisions when Input is used solo.\n\t<label\n\t\tref={ref}\n\t\tclassName={`${style.hasError ? \"text-red-300\" : style.hasSuccess ? \"text-green-300\" : \"text-placeholder\"} ${inputBoxStyles(style)}`}\n\t>\n\t\t{children}\n\t</label>\n);\n\ntype CompoundInputBox = React.ForwardRefExoticComponent<InputBoxProps & React.RefAttributes<HTMLLabelElement>> & {\n\tInput: typeof NestedInput;\n};\nexport const InputBox = React.forwardRef(InputBoxImpl) as CompoundInputBox;\n\nInputBox.Input = NestedInput;\n\n/**\n * Props for {@link Input}: the design-system style/state props (`size`, `variant`, `hasError`,\n * `hasWarning`, `hasSuccess`, `prefix`) plus all native `<input>` attributes, which pass through.\n */\nexport type InputProps = InputBoxStyleProps & InputBaseProps;\n\n/**\n * A standalone styled text input.\n *\n * Renders a bordered `<input>` with design-system styling and state variants; the `ref` and native\n * attributes are forwarded, so it works controlled or uncontrolled. An optional `prefix` renders a\n * static adornment before the field. For an input combined with icons or buttons in a shared box,\n * use {@link InputBox} instead.\n *\n * @example\n * <Input value={name} onChange={(e) => setName(e.target.value)} hasError={hasError} />\n */\nconst InputImpl = (\n\t{ size, variant, hasError, hasWarning, hasSuccess, prefix, ...rest }: InputProps,\n\tref: React.ForwardedRef<HTMLInputElement>,\n) => {\n\treturn prefix ? (\n\t\t<div className=\"flex flex-row items-center\">\n\t\t\t<label className=\"p-1 text-muted\">{prefix}</label>\n\t\t\t<input\n\t\t\t\t// these props can be overridden by {...props}\n\t\t\t\ttype=\"text\"\n\t\t\t\tclassName={`${inputStyles} ${inputBoxStyles({ size, variant, hasError, hasWarning, hasSuccess })}`}\n\t\t\t\tautoComplete=\"off\"\n\t\t\t\t// spread in props that can be used as-is\n\t\t\t\t{...rest}\n\t\t\t\t// these props won't be overridden as they come after {...props}\n\t\t\t\tref={ref}\n\t\t\t/>\n\t\t</div>\n\t) : (\n\t\t<input\n\t\t\t// these props can be overridden by {...props}\n\t\t\ttype=\"text\"\n\t\t\tclassName={`${inputStyles} ${inputBoxStyles({ size, variant, hasError, hasWarning, hasSuccess })}`}\n\t\t\tautoComplete=\"off\"\n\t\t\t// spread in props that can be used as-is\n\t\t\t{...rest}\n\t\t\t// these props won't be overridden as they come after {...props}\n\t\t\tref={ref}\n\t\t/>\n\t);\n};\n\nexport const Input = forwardRef(InputImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Size } from \"../variants\";\n\nexport type InputSize = Extract<Size, \"sm\" | \"md\" | \"lg\">;\ntype InputBoxStates = \"default\" | \"error\" | \"warning\" | \"success\";\nexport type InputVariants = \"default\" | \"transparent\";\n\nexport type InputBoxStyleProps = {\n\tsize?: InputSize;\n\tvariant?: InputVariants;\n\thasError?: boolean;\n\thasWarning?: boolean;\n\thasSuccess?: boolean;\n};\n\nconst sizeStyles: Record<InputSize, string> = {\n\tsm: \"h-sm gap-1 px-2 text-sm [&>input]:text-sm\",\n\tmd: \"h-md gap-2 px-2.5 text-base [&>input]:text-base\",\n\tlg: \"h-lg gap-2.5 px-3 text-lg [&>input]:text-lg\",\n};\n\nconst defaultVariantStyles =\n\t\"rounded-md border bg-white focus-within:outline focus:outline focus-within:outline-offset-0 focus:outline-offset-0 focus-within:outline-2 focus:outline-2\";\nconst transparentVariantStyles = \"border-none bg-transparent focus-within:outline-hidden focus:outline-hidden\";\n\nconst variantStyles: Record<InputVariants, Record<InputBoxStates, string>> = {\n\tdefault: {\n\t\tdefault: `${defaultVariantStyles} disabled:bg-surface-neutral disabled:text-placeholder border-surface-neutral focus-within:border-indigo-400 focus-within:outline-indigo-200 focus:border-indigo-400 focus:outline-indigo-200`,\n\t\terror: `${defaultVariantStyles} border-red-300 focus-within:border-red-300 focus-within:outline-red-200 focus:border-red-300 focus:outline-red-200`,\n\t\twarning: `${defaultVariantStyles} border-yellow-300 focus-within:border-yellow-300 focus-within:outline-yellow-200 focus:border-yellow-300 focus:outline-yellow-200`,\n\t\tsuccess: `${defaultVariantStyles} border-green-300 focus-within:border-green-300 focus-within:outline-green-200 focus:border-green-300 focus:outline-green-200`,\n\t},\n\ttransparent: {\n\t\tdefault: `${transparentVariantStyles} disabled:bg-surface-neutral disabled:text-placeholder`,\n\t\terror: transparentVariantStyles,\n\t\twarning: transparentVariantStyles,\n\t\tsuccess: transparentVariantStyles,\n\t},\n};\n\nexport const inputBoxStyles = ({\n\tsize = \"md\",\n\tvariant = \"default\",\n\thasError,\n\thasWarning,\n\thasSuccess,\n}: InputBoxStyleProps) =>\n\ttwJoin(\n\t\t\"flex w-full items-center focus-within:ring-0 focus:ring-0 has-disabled:bg-surface-neutral has-disabled:text-placeholder\",\n\t\tsizeStyles[size],\n\t\t// eslint-disable-next-line better-tailwindcss/no-unknown-classes\n\t\tvariantStyles[variant][hasError ? \"error\" : hasWarning ? \"warning\" : hasSuccess ? \"success\" : \"default\"],\n\t);\n\nexport const inputStyles = \"w-full text-gray-800 placeholder:text-placeholder disabled:text-placeholder\";\n","import { useCallback } from \"react\";\nimport DatePickerLib from \"react-datepicker\";\n\nimport { DatePickerHeader } from \"./DatePickerHeader\";\nimport { customInputFieldFactory, DatePickerSharedProps } from \"./shared\";\nimport { TimeInput } from \"./TimeInput\";\n\nexport type DatePickerSingleProps = DatePickerSharedProps & {\n\tvalue: Date | undefined;\n\trange?: false;\n\tonChange?: (newDate: Date | undefined) => void;\n};\n\nexport const DatePickerSingle = ({\n\tvalue,\n\terrorNode,\n\thasError,\n\tinputProps,\n\tplaceholder,\n\tonChange,\n\tposition = \"bottom-start\",\n\tpreventOpenOnFocus = true,\n\t...props\n}: DatePickerSingleProps) => {\n\tconst handleChange = useCallback((date: Date | null) => onChange?.(date ?? undefined), [onChange]);\n\n\tconst clearDatePicker = useCallback(\n\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\te.preventDefault();\n\t\t\tonChange?.(undefined);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<DatePickerLib\n\t\t\t{...props}\n\t\t\tclassName=\"placeholder:text-placeholder\"\n\t\t\tpreventOpenOnFocus={preventOpenOnFocus}\n\t\t\tselected={value}\n\t\t\tonChange={handleChange}\n\t\t\ttimeInputLabel=\"\"\n\t\t\tdateFormat={props.showTimeInput ? \"MM/dd/yyyy h:mm aa\" : \"MM/dd/yyyy\"}\n\t\t\tplaceholderText={placeholder}\n\t\t\tcustomInput={\n\t\t\t\t!props.inline\n\t\t\t\t\t? customInputFieldFactory({\n\t\t\t\t\t\t\tinputProps,\n\t\t\t\t\t\t\tisEmpty: value == null,\n\t\t\t\t\t\t\tdisabled: props.disabled,\n\t\t\t\t\t\t\terrorNode,\n\t\t\t\t\t\t\thasError,\n\t\t\t\t\t\t\tonClearInput: clearDatePicker,\n\t\t\t\t\t\t})\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tcustomTimeInput={<TimeInput />}\n\t\t\trenderCustomHeader={DatePickerHeader}\n\t\t\tpopperPlacement={position}\n\t\t/>\n\t);\n};\n","import \"./DatePicker.css\";\n\nimport { DatePickerRange, DatePickerRangeProps } from \"./DatePickerRange\";\nimport { DatePickerSingle, DatePickerSingleProps } from \"./DatePickerSingle\";\n\n/**\n * Props for {@link DatePicker}, discriminated by `range`:\n * - `range` omitted/`false` → single-date mode: `value: Date | undefined` and\n * `onChange(date: Date | undefined)`.\n * - `range: true` → range mode: `value: [start, end]` and `onChange([start, end])`.\n *\n * Both modes also accept the shared options (placeholder, error state, popper `position`,\n * `showTimeInput`, `inline`, native `inputProps`, etc.).\n */\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n/**\n * A date input with a calendar popover, in either single-date or date-range mode.\n *\n * Set `range` to switch modes; this changes the types of `value` and `onChange` accordingly (see\n * {@link DatePickerProps}). Controlled — supply `value` and handle `onChange`. Clearing the input\n * emits `undefined` (single) or `[undefined, undefined]` (range).\n *\n * @example Single date\n * <DatePicker value={date} onChange={setDate} placeholder=\"Select a date\" />\n *\n * @example Date range\n * <DatePicker range value={[start, end]} onChange={([s, e]) => setRange([s, e])} />\n */\nexport const DatePicker = (props: DatePickerProps) =>\n\tprops.range ? <DatePickerRange {...props} /> : <DatePickerSingle {...props} />;\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\nimport { ClassNameProps } from \"@/core/types\";\n\n/** Props for {@link Divider}. `className` is merged in, e.g. to add vertical margin. */\nexport type DividerProps = ClassNameProps;\n\n/**\n * A thin horizontal rule that spans the full width of its container.\n *\n * Use it to separate sections of content. Pass `className` to adjust spacing or color.\n *\n * @example\n * <Divider className=\"my-4\" />\n */\nexport const Divider = ({ className }: DividerProps) => (\n\t<div className={twMerge(\"h-px w-full border-b border-surface-neutral\", className)} />\n);\n","import React, { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\ntype ErrorTextProps = React.ComponentPropsWithoutRef<\"p\"> & { className?: string };\n\nconst ErrorTextImpl = ({ className, ...props }: ErrorTextProps, ref: React.ForwardedRef<HTMLParagraphElement>) => {\n\tif (!props.children) {\n\t\treturn null;\n\t}\n\treturn <p {...props} ref={ref} className={twJoin(\"text-danger\", className)} />;\n};\n/** ErrorText will return `null` if `children` is falsy */\nexport const ErrorText = forwardRef(ErrorTextImpl);\n","import { createContext, PropsWithChildren, useContext, useMemo } from \"react\";\n\nimport { FormFieldNameProps, useControlledFormField } from \"../hooks\";\n\nconst ControlledFieldContext = createContext<ReturnType<typeof useControlledFormField> | undefined>(undefined);\n\n/**\n * Binds a named, controlled form field and exposes its state to descendants via context.\n *\n * Resolves the field for the given `name` (value, change/blur handlers, error, etc.) and provides it\n * to children, which read it with {@link useControlledField}. Use this when several pieces of UI\n * need the same field's state; for a single input prefer the {@link ControlledField} render prop.\n *\n * @example\n * <ControlledFieldProvider name=\"email\">\n * <EmailInput />\n * <EmailHint />\n * </ControlledFieldProvider>\n */\nexport const ControlledFieldProvider = ({ children, ...restField }: FormFieldNameProps & PropsWithChildren) => {\n\tconst field = useControlledFormField(restField);\n\tconst value = useMemo(() => field, [field]);\n\treturn <ControlledFieldContext.Provider value={value}>{children}</ControlledFieldContext.Provider>;\n};\n\nControlledFieldProvider.displayName = \"ControlledFieldProvider\";\n\n/**\n * Reads the controlled field provided by the nearest {@link ControlledFieldProvider}.\n *\n * @throws if called outside a {@link ControlledFieldProvider}.\n */\nexport const useControlledField = () => {\n\tconst context = useContext(ControlledFieldContext);\n\tif (context) {\n\t\treturn context;\n\t}\n\t// if a defaultContext wasn't specified, it's a required context.\n\tthrow new Error(\"useControlledField must be used within ControlledFieldProvider\");\n};\n\nuseControlledField.displayName = \"useControlledField\";\n\nexport type ControlledFieldProps = FormFieldNameProps & {\n\t/** Render prop receiving the resolved field state (value, handlers, error, …). */\n\trender: (props: ReturnType<typeof useControlledFormField>) => React.ReactNode;\n};\n\n/**\n * Binds a named, controlled form field and hands its state to a render prop.\n *\n * The lightweight alternative to {@link ControlledFieldProvider} for a single consumer: wire the\n * field's value and handlers straight into your input.\n *\n * @example\n * <ControlledField\n * name=\"email\"\n * render={({ value, onChange, error }) => (\n * <Input value={value} onChange={onChange} hasError={!!error} />\n * )}\n * />\n */\nexport const ControlledField = ({ render, ...restField }: ControlledFieldProps) => {\n\treturn <>{render(useControlledFormField(restField))}</>;\n};\n\nControlledField.displayName = \"ControlledField\";\n","// eslint-disable-next-line import/no-internal-modules\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as React from \"react\";\nimport type { DefaultValues, UseFormProps } from \"react-hook-form\";\nimport { useController, useForm as _useForm, useFormContext, useFormState } from \"react-hook-form\";\nimport type { z } from \"zod\";\n\nimport type { EventFor, FormSchema, NonEmpty } from \"./types\";\n\nexport type FormFieldNameProps = {\n\tname: string;\n};\n\nexport type UncontrolledFormFieldProps = FormFieldNameProps & {\n\tonChange?: (e: EventFor<\"input\" | \"textarea\", \"onChange\">) => void;\n\tonBlur?: (e: EventFor<\"input\" | \"textarea\", \"onBlur\">) => void;\n};\n\nexport type UseFormOptions<TSchema extends FormSchema, TDefaults extends object> = Pick<\n\tUseFormProps<z.infer<TSchema>>,\n\t\"shouldUnregister\" | \"values\" | \"reValidateMode\" | \"mode\"\n> & {\n\tdefaultValues?: NonEmpty<TDefaults>;\n};\n\nexport const useForm = <T extends FormSchema, TDefaults extends DefaultValues<z.infer<T>> = DefaultValues<z.infer<T>>>(\n\tschema: T,\n\toptions?: UseFormOptions<T, TDefaults>,\n) => {\n\treturn _useForm({\n\t\t...(options as UseFormProps<z.infer<T>>), // Type assertion needed here for RHF internals\n\t\tresolver: zodResolver(schema),\n\t});\n};\n\nuseForm.displayName = \"useForm\";\n\nexport const useControlledFormField = ({ name: fieldName }: FormFieldNameProps) => {\n\tconst { field, fieldState } = useController({ name: fieldName });\n\tconst { error } = fieldState;\n\n\treturn { ...field, error };\n};\n\nuseControlledFormField.displayName = \"useControlledFormField\";\n\nexport const useUncontrolledFormField = ({ name: fieldName, ...changeHandlers }: UncontrolledFormFieldProps) => {\n\tconst { register, getFieldState } = useFormContext();\n\tconst formState = useFormState();\n\n\tconst memoizedRegister = React.useCallback(() => {\n\t\tif (!changeHandlers) {\n\t\t\treturn register(fieldName);\n\t\t}\n\n\t\tconst { onChange, onBlur, ...restRegister } = register(fieldName);\n\n\t\tconst handleOnChange = async (event: EventFor<\"input\" | \"textarea\", \"onChange\">) => {\n\t\t\tawait onChange(event);\n\t\t\tchangeHandlers?.onChange?.(event);\n\t\t};\n\t\tconst handleOnBlur = async (event: EventFor<\"input\" | \"textarea\", \"onBlur\">) => {\n\t\t\tawait onBlur(event);\n\t\t\tchangeHandlers?.onBlur?.(event);\n\t\t};\n\n\t\treturn {\n\t\t\t// TODO: add id to register for easier linking with labels\n\t\t\t// id: register().name,\n\t\t\t...restRegister,\n\t\t\tonChange: changeHandlers?.onChange ? handleOnChange : onChange,\n\t\t\tonBlur: changeHandlers?.onBlur ? handleOnBlur : onBlur,\n\t\t};\n\t}, [changeHandlers, register, fieldName]);\n\n\tconst { error } = getFieldState(fieldName, formState);\n\n\treturn { register: memoizedRegister, error };\n};\n\nuseUncontrolledFormField.displayName = \"useUncontrolledFormField\";\n","import { createContext, PropsWithChildren, useContext, useMemo } from \"react\";\n\nimport { UncontrolledFormFieldProps, useUncontrolledFormField } from \"../hooks\";\n\nconst UncontrolledFieldContext = createContext<ReturnType<typeof useUncontrolledFormField> | undefined>(undefined);\n\n/**\n * Registers a named, uncontrolled form field and exposes it to descendants via context.\n *\n * The uncontrolled counterpart to {@link ControlledFieldProvider}: the field registers with the\n * form (ref-based) rather than tracking value in React state. Children read it with\n * {@link useUncontrolledField}; for a single input prefer the {@link UncontrolledField} render prop.\n *\n * @example\n * <UncontrolledFieldProvider name=\"title\">\n * <TitleInput />\n * </UncontrolledFieldProvider>\n */\nexport const UncontrolledFieldProvider = ({\n\tchildren,\n\t...restField\n}: UncontrolledFormFieldProps & PropsWithChildren) => {\n\tconst field = useUncontrolledFormField(restField);\n\tconst value = useMemo(() => field, [field]);\n\treturn <UncontrolledFieldContext.Provider value={value}>{children}</UncontrolledFieldContext.Provider>;\n};\n\nUncontrolledFieldProvider.displayName = \"UncontrolledFieldProvider\";\n\n/**\n * Reads the uncontrolled field provided by the nearest {@link UncontrolledFieldProvider}.\n *\n * @throws if called outside an {@link UncontrolledFieldProvider}.\n */\nexport const useUncontrolledField = () => {\n\tconst context = useContext(UncontrolledFieldContext);\n\tif (context) {\n\t\treturn context;\n\t}\n\t// if a defaultContext wasn't specified, it's a required context.\n\tthrow new Error(\"useUncontrolledField must be used within UncontrolledFieldProvider\");\n};\n\nuseUncontrolledField.displayName = \"useUncontrolledField\";\n\nexport type UncontrolledFieldProps = UncontrolledFormFieldProps & {\n\t/** Render prop receiving the registered field (ref, name, error, …) to spread onto an input. */\n\trender: (props: ReturnType<typeof useUncontrolledFormField>) => React.ReactNode;\n};\n\n/**\n * Registers a named, uncontrolled form field and hands it to a render prop.\n *\n * The lightweight alternative to {@link UncontrolledFieldProvider} for a single consumer: spread the\n * provided registration props onto your input.\n *\n * @example\n * <UncontrolledField\n * name=\"title\"\n * render={(field) => <Input {...field} />}\n * />\n */\nexport const UncontrolledField = ({ render, ...restField }: UncontrolledFieldProps) => {\n\treturn <>{render(useUncontrolledFormField(restField))}</>;\n};\n\nUncontrolledField.displayName = \"UncontrolledField\";\n","import type { FieldError, FieldErrors, FieldPath, FieldValues } from \"react-hook-form\";\nimport { get } from \"react-hook-form\";\n\nexport const getFieldError = <TFieldValues extends FieldValues>(\n\terrors: FieldErrors<TFieldValues> | undefined,\n\tname: FieldPath<TFieldValues> | undefined,\n) => {\n\tif (name == null || errors == null) {\n\t\treturn undefined;\n\t}\n\t// React Hook Form's `get` func returns `any`, so the assertion is needed for consumers to have completion\n\treturn get(errors, name) as FieldError | undefined;\n};\n","import { forwardRef } from \"react\";\n\nimport { InlineFormItem } from \"./InlineFormItem\";\nimport { NoneFormItem } from \"./NoneFormItem\";\nimport { SideBySideFormItem } from \"./SideBySideFormItem\";\nimport { StackedFormItem } from \"./StackedFormItem\";\nimport { FormItemVariants, InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\ntype FormItemProps = InternalFormItemProps & SharedFormItemProps & { layout?: FormItemVariants };\n\nexport const FormItem = forwardRef<HTMLDivElement, FormItemProps>(({ layout = \"stacked\", ...rest }, ref) => {\n\tswitch (layout) {\n\t\tcase \"inline\":\n\t\t\treturn <InlineFormItem {...rest} ref={ref} />;\n\t\tcase \"side-by-side\":\n\t\t\treturn <SideBySideFormItem {...rest} ref={ref} />;\n\t\tcase \"stacked\":\n\t\t\treturn <StackedFormItem {...rest} ref={ref} />;\n\t\tcase \"none\":\n\t\t\treturn <NoneFormItem {...rest} ref={ref} />;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown form item layout: ${layout}`);\n\t}\n});\n\nexport type { FormItemVariants, SharedFormItemProps };\n","import { forwardRef } from \"react\";\n\nimport { FieldErrorTooltip } from \"./FieldErrorTooltip\";\nimport { InternalFormItemProps } from \"./types\";\n\nexport const InlineFormItem = forwardRef<HTMLSpanElement, InternalFormItemProps>(({ error, render }, ref) => {\n\treturn (\n\t\t<FieldErrorTooltip error={error}>\n\t\t\t<span ref={ref}>{render}</span>\n\t\t</FieldErrorTooltip>\n\t);\n});\n","import { FieldError } from \"react-hook-form\";\n\nimport { ErrorText } from \"@/core/error-text/ErrorText\";\nimport { Tooltip } from \"@/core/tooltip\";\n\ntype FieldErrorTooltipProps = {\n\terror: FieldError | undefined;\n\tchildren: React.ReactNode;\n};\n\nexport const FieldErrorTooltip = ({ error, children }: FieldErrorTooltipProps) => {\n\treturn (\n\t\t<Tooltip\n\t\t\tvariant=\"light\"\n\t\t\t// if there's an error, undefined allows normal Tooltip behavior\n\t\t\t// otherwise, open is false, which disables the Tooltip\n\t\t\topen={error?.message ? undefined : false}\n\t\t\ttrigger={children}\n\t\t\tcontent={<ErrorText>{error?.message}</ErrorText>}\n\t\t/>\n\t);\n};\n","import React, { forwardRef } from \"react\";\n\nimport { FieldDescription } from \"./FieldDescription\";\nimport { FieldErrorMessage } from \"./FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./FieldLabelWithTooltip\";\nimport { InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\nconst NoneFormItemImpl = (\n\t{ htmlFor, label, options, render, error }: InternalFormItemProps & SharedFormItemProps,\n\tref: React.ForwardedRef<HTMLDivElement>,\n) => (\n\t<>\n\t\t<div>\n\t\t\t<FieldLabelWithTooltip htmlFor={htmlFor} label={label} options={options} />\n\t\t\t<FieldDescription styles=\"pt-0.5\">{options?.description}</FieldDescription>\n\t\t</div>\n\t\t<div ref={ref}>\n\t\t\t{render}\n\t\t\t<FieldErrorMessage error={error} />\n\t\t\t{options?.bottomSlot}\n\t\t</div>\n\t</>\n);\n\nexport const NoneFormItem = forwardRef(NoneFormItemImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { StylesProps } from \"@/core/types\";\n\ntype FieldDescriptionProps = StylesProps & {\n\tchildren: React.ReactNode;\n};\n\nexport const FieldDescription = ({ styles, children }: FieldDescriptionProps) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn <p className={twJoin(\"text-sm text-muted\", styles)}>{children}</p>;\n};\n","import { faExclamationCircle } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { FieldError } from \"react-hook-form\";\n\nimport { ErrorText } from \"@/core/error-text/ErrorText\";\nimport { Icon } from \"@/core/icon\";\nimport { OverflowTooltip } from \"@/core/overflow-tooltip/OverflowTooltip\";\n\nfunction handleErrorOrErrorArrayMessage(error: FieldError | FieldError[]) {\n\tif (!Array.isArray(error)) {\n\t\treturn error.message;\n\t}\n\tif (error.length === 1) {\n\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\treturn error[0].message;\n\t}\n\treturn error.map((err: FieldError, index) => `Item ${index + 1}: ${err.message}`).join(\", \");\n}\n\ntype FieldErrorMessageProps = {\n\terror: FieldError | undefined;\n};\n\nexport const FieldErrorMessage = ({ error }: FieldErrorMessageProps) => {\n\tif (error == null) {\n\t\treturn null;\n\t}\n\tconst message = handleErrorOrErrorArrayMessage(error);\n\n\treturn (\n\t\t<div className=\"flex h-4.5 items-center gap-x-1 pt-0.5 text-sm\">\n\t\t\t<span className=\"text-red-400\">\n\t\t\t\t<Icon icon={faExclamationCircle} />\n\t\t\t</span>\n\t\t\t<OverflowTooltip\n\t\t\t\ttooltip={message}\n\t\t\t\telement={(ref) => (\n\t\t\t\t\t<ErrorText ref={ref} className=\"line-clamp-1 cursor-default break-all\">\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</ErrorText>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import React from \"react\";\n\nimport { Tooltip } from \"../tooltip\";\n\nexport type OverflowTooltipProps = Pick<React.ComponentPropsWithoutRef<typeof Tooltip>, \"side\" | \"variant\" | \"open\"> & {\n\ttooltip: React.ReactNode;\n\t/** The `elementRef` render prop should attach to a measurable DOM element.\n\t *\n\t * @example\n\t * element={elementRef => (\n\t * \t<span ref={elementRef} className=\"truncate ...\">\n\t * \t\t{text}\n\t * \t</span>\n\t * )}\n\t */\n\telement: (elementRef: React.RefObject<HTMLElement & HTMLDivElement>) => React.ReactElement;\n};\n\nexport const OverflowTooltip = ({ element, tooltip, side, variant, ...props }: OverflowTooltipProps) => {\n\treturn (\n\t\t<Tooltip.Root {...props}>\n\t\t\t<Tooltip.OverflowTrigger element={element} />\n\t\t\t<Tooltip.Content side={side} variant={variant}>\n\t\t\t\t{tooltip}\n\t\t\t</Tooltip.Content>\n\t\t</Tooltip.Root>\n\t);\n};\n","import { faQuestionCircle } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Tooltip } from \"@/core/tooltip\";\nimport { StylesProps } from \"@/core/types\";\n\nimport { FieldLabel } from \"./FieldLabel\";\nimport { SharedFormItemProps } from \"./types\";\n\nexport const FieldLabelWithTooltip = ({ styles, htmlFor, label, options }: StylesProps & SharedFormItemProps) => {\n\tif (label == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<FieldLabel htmlFor={htmlFor} styles={twJoin(\"space-x-1\", styles)}>\n\t\t\t<span>{label}</span>\n\t\t\t{options?.optionalLabel && <span className=\"text-placeholder\">(Optional)</span>}\n\t\t\t{options?.tooltip && (\n\t\t\t\t<Tooltip\n\t\t\t\t\tcontent={options?.tooltip}\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<span className=\"inline-flex items-baseline space-x-1\">\n\t\t\t\t\t\t\t<span className=\"leading-none\">\n\t\t\t\t\t\t\t\t{options.tooltipIcon ? (\n\t\t\t\t\t\t\t\t\toptions.tooltipIcon\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted\">\n\t\t\t\t\t\t\t\t\t\t<Icon icon={faQuestionCircle} />\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{options?.tooltipLabel && <span className=\"font-normal text-muted\">{options?.tooltipLabel}</span>}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{options?.inlineLabelEndSlot}\n\t\t</FieldLabel>\n\t);\n};\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Text } from \"@/core\";\nimport { StylesProps } from \"@/core/types\";\n\ntype FieldLabelProps = StylesProps & {\n\thtmlFor?: string;\n\tchildren: React.ReactNode;\n};\n\nexport const FieldLabel = ({ styles, htmlFor, children }: FieldLabelProps) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Text as=\"label\" htmlFor={htmlFor} variant=\"body-2\" className={twJoin(\"block text-muted\", styles)}>\n\t\t\t{children}\n\t\t</Text>\n\t);\n};\n","import { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { FieldDescription } from \"./FieldDescription\";\nimport { FieldErrorMessage } from \"./FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./FieldLabelWithTooltip\";\nimport { InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\nexport const SideBySideFormItem = forwardRef<HTMLDivElement, InternalFormItemProps & SharedFormItemProps>(\n\t({ styles, htmlFor, label, options, render, error }, ref) => (\n\t\t<div className={twJoin(\"grid grid-cols-[minmax(0,2fr)_minmax(0,3fr)] gap-x-1\", styles)} ref={ref}>\n\t\t\t<div className=\"pt-2.5\">\n\t\t\t\t<FieldLabelWithTooltip htmlFor={htmlFor} label={label} options={options} />\n\t\t\t\t<FieldDescription styles=\"pt-0.5\">{options?.description}</FieldDescription>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t{render}\n\t\t\t\t<FieldErrorMessage error={error} />\n\t\t\t\t{options?.bottomSlot}\n\t\t\t</div>\n\t\t</div>\n\t),\n);\n","import { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { FieldDescription } from \"./FieldDescription\";\nimport { FieldErrorMessage } from \"./FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./FieldLabelWithTooltip\";\nimport { InternalFormItemProps, SharedFormItemProps } from \"./types\";\n\nexport const StackedFormItem = forwardRef<HTMLDivElement, InternalFormItemProps & SharedFormItemProps>(\n\t({ styles, htmlFor, label, options, render, error }, ref) => (\n\t\t<div className={styles || undefined} ref={ref}>\n\t\t\t<FieldLabelWithTooltip\n\t\t\t\tstyles={twJoin(\"flex items-baseline\", options?.description == null && \"pb-1\")}\n\t\t\t\thtmlFor={htmlFor}\n\t\t\t\tlabel={label}\n\t\t\t\toptions={options}\n\t\t\t/>\n\t\t\t<FieldDescription styles=\"pb-1\">{options?.description}</FieldDescription>\n\t\t\t{render}\n\t\t\t<FieldErrorMessage error={error} />\n\t\t\t{options?.bottomSlot}\n\t\t</div>\n\t),\n);\n","import { UncontrolledField, UncontrolledFormFieldProps } from \"@/core/form\";\nimport { Input, InputProps } from \"@/core/input\";\n\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormInputProps = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<UncontrolledFormFieldProps, \"onChange\" | \"onBlur\"> &\n\tPick<InputProps, \"placeholder\" | \"variant\" | \"prefix\" | \"type\" | \"step\" | \"autoFocus\" | \"min\" | \"max\">;\n\n/**\n * Text input bound to a named field of the surrounding form.\n *\n * Registers an uncontrolled field and surfaces its validation error. Forwards input-level props such\n * as `placeholder`, `variant`, `prefix`, and `type` to the underlying {@link Input}.\n */\nexport const FormInput = ({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tonChange,\n\tonBlur,\n\tdisabled,\n\t...rest\n}: FormInputProps) => (\n\t<UncontrolledField\n\t\tname={name}\n\t\tonChange={onChange}\n\t\tonBlur={onBlur}\n\t\trender={({ error, register }) => (\n\t\t\t<FormItem\n\t\t\t\tlayout={layout}\n\t\t\t\tstyles={styles}\n\t\t\t\thtmlFor={name}\n\t\t\t\tlabel={label}\n\t\t\t\toptions={options}\n\t\t\t\trender={\n\t\t\t\t\t<Input\n\t\t\t\t\t\tid={name}\n\t\t\t\t\t\t{...register()}\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasError={!disabled && (!!error || undefined)}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\terror={error}\n\t\t\t/>\n\t\t)}\n\t/>\n);\n","import {\n\tfaCheckCircle,\n\tfaDollarSign,\n\tfaExclamationCircle,\n\tfaExclamationTriangle,\n} from \"@fortawesome/sharp-solid-svg-icons\";\nimport { ChangeEvent, forwardRef, ForwardRefExoticComponent, RefAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Input } from \"@/core/input\";\nimport { Text } from \"@/core/text/Text\";\nimport { useSyncState } from \"@/core/utils/useSyncState\";\n\nimport { ControlledField } from \"./ControlledField\";\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type DollarInputProps = {\n\tvalue: number | null | undefined; // amount in cents\n\tonChange?: (cents: number | null | undefined) => void;\n\tdisabled?: boolean;\n\tautoFocus?: boolean;\n\thasError?: boolean;\n\thasWarning?: boolean;\n\thasSuccess?: boolean;\n\tmessage?: string;\n};\n\nconst twoDecimalFormatter = Intl.NumberFormat(\"en-US\", {\n\tminimumFractionDigits: 2,\n\tmaximumFractionDigits: 2,\n});\n\n// Remove non-numeric characters except for commas, periods, and negative signs.\nconst formatInput = (value: string) => {\n\treturn value.replaceAll(/[^0-9.,-]/g, \"\");\n};\n\nconst roundToTwoDecimalPlaces = (value: number): number => {\n\t// Number.EPSILON is used to avoid floating point precision issues (without it 1.255 would round to 1.25 instead of 1.26 for example).\n\treturn Math.round((value + Number.EPSILON) * 100) / 100;\n};\n\n/**\n * DollarInput component for displaying and editing a monetary value.\n *\n * Exposes `cents` to consuming components, which is the value in cents.\n */\nexport const DollarInput = forwardRef<HTMLInputElement, DollarInputProps>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tdisabled = false,\n\t\t\tautoFocus = false,\n\t\t\thasError = false,\n\t\t\thasWarning = false,\n\t\t\thasSuccess = false,\n\t\t\tmessage,\n\t\t},\n\t\tref,\n\t) => {\n\t\t/**\n\t\t * Implementation notes:\n\t\t * - Internally, this component stores the value as a string to allow for better formatting and user input handling.\n\t\t * Externally, however, the value in this field is exposed as a number in cents.\n\t\t *\n\t\t * - onChange is also only called when the field is blurred. This is to allow a user to type any values, but only format once\n\t\t * they are done editing.\n\t\t */\n\t\tconst [strValue, setStrValue] = useSyncState<string>(value == null ? \"\" : twoDecimalFormatter.format(value / 100));\n\n\t\tconst handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = formatInput(event.target.value);\n\n\t\t\t// Handle empty input (i.e., user clears the input)\n\t\t\tif (!inputValue) {\n\t\t\t\tsetStrValue(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Allow prefixing negative numbers or decimal points\n\t\t\tif (inputValue === \"-\" || inputValue === \".\") {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent typing more than two decimal places\n\t\t\tif ((inputValue.split(\".\")?.[1]?.length ?? 0) > 2) return;\n\n\t\t\tconst parsedValue = parseFloat(inputValue);\n\t\t\tif (!isNaN(parsedValue)) {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t}\n\t\t};\n\n\t\tconst handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tconst pastedData = formatInput(event.clipboardData.getData(\"text\"));\n\t\t\tconst parsedAmount = parseFloat(pastedData);\n\n\t\t\tif (!isNaN(parsedAmount)) {\n\t\t\t\tsetStrValue(twoDecimalFormatter.format(parsedAmount));\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedAmount * 100));\n\t\t\t}\n\t\t};\n\n\t\tconst handleBlur = () => {\n\t\t\tconst parsedValue = parseFloat(strValue.replaceAll(\",\", \"\"));\n\t\t\tif (isNaN(parsedValue)) {\n\t\t\t\tonChange?.(null);\n\t\t\t} else {\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedValue * 100));\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"flex h-md w-full items-center rounded-sm py-2.5 text-base [&>input]:rounded-l-none! [&>input]:rounded-r-md! [&>input]:border-l-0!\",\n\t\t\t\t\t\tdisabled &&\n\t\t\t\t\t\t\t\"cursor-not-allowed [&>input]:cursor-not-allowed [&>input]:bg-surface-light! [&>input]:text-muted!\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"flex h-md w-md items-center justify-center rounded-l-md border-y border-l px-2.5 text-sm text-muted\",\n\t\t\t\t\t\t\thasError\n\t\t\t\t\t\t\t\t? \"border-red-300 bg-red-200 text-red-700\"\n\t\t\t\t\t\t\t\t: hasWarning\n\t\t\t\t\t\t\t\t\t? \"border-yellow-300 bg-surface-warning text-warning\"\n\t\t\t\t\t\t\t\t\t: hasSuccess\n\t\t\t\t\t\t\t\t\t\t? \"border-green-300 bg-surface-success text-success\"\n\t\t\t\t\t\t\t\t\t\t: \"border-surface-neutral bg-surface-neutral\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon icon={faDollarSign} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t\tvalue={strValue}\n\t\t\t\t\t\thasError={hasError}\n\t\t\t\t\t\thasWarning={hasWarning}\n\t\t\t\t\t\thasSuccess={hasSuccess}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tplaceholder=\"0.00\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{hasWarning && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-warning\">\n\t\t\t\t\t\t<Icon icon={faExclamationTriangle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasError && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-red-700\">\n\t\t\t\t\t\t<Icon icon={faExclamationCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasSuccess && message && (\n\t\t\t\t\t<div className=\"flex items-center gap-1 text-sm font-normal text-success\">\n\t\t\t\t\t\t<Icon icon={faCheckCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nexport type FormDollarInputProps = SharedFormControlProps &\n\tSharedFormItemProps & { onChange?: (cents: number | null | undefined) => void } & Pick<\n\t\tDollarInputProps,\n\t\t\"autoFocus\" | \"hasWarning\" | \"hasSuccess\" | \"message\"\n\t>;\n\nexport const FormDollarInput: ForwardRefExoticComponent<FormDollarInputProps & RefAttributes<HTMLInputElement>> =\n\tforwardRef<HTMLInputElement, FormDollarInputProps>(\n\t\t(\n\t\t\t{ name, layout, label, onChange, disabled, autoFocus, hasWarning = false, hasSuccess = false, message, options },\n\t\t\tref,\n\t\t) => (\n\t\t\t<ControlledField\n\t\t\t\tname={name}\n\t\t\t\trender={(field) => (\n\t\t\t\t\t<FormItem\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\toptions={options}\n\t\t\t\t\t\terror={field.error}\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<DollarInput\n\t\t\t\t\t\t\t\tonChange={(cents: number | null | undefined) => {\n\t\t\t\t\t\t\t\t\tfield.onChange(cents);\n\t\t\t\t\t\t\t\t\tonChange?.(cents);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={field.value as number | undefined}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t\t\t\thasError={!disabled && (!!field.error || undefined)}\n\t\t\t\t\t\t\t\thasWarning={!disabled && hasWarning}\n\t\t\t\t\t\t\t\thasSuccess={!disabled && hasSuccess}\n\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t),\n\t);\n","import { useState } from \"react\";\n\nexport const useSyncState = <T>(upstream: T) => {\n\tconst [prevUpstream, setPrevUpstream] = useState(upstream);\n\tconst [state, setState] = useState(upstream);\n\n\tif (prevUpstream !== upstream) {\n\t\tsetState(upstream);\n\t\tsetPrevUpstream(upstream);\n\t}\n\n\treturn [state, setState] as const;\n};\n","import {\n\tfaCheckCircle,\n\tfaExclamationCircle,\n\tfaExclamationTriangle,\n\tfaPercent,\n} from \"@fortawesome/sharp-solid-svg-icons\";\nimport { ChangeEvent, forwardRef, ForwardRefExoticComponent, RefAttributes } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Input } from \"@/core/input\";\nimport { Text } from \"@/core/text/Text\";\nimport { useSyncState } from \"@/core/utils/useSyncState\";\n\nimport { ControlledField } from \"./ControlledField\";\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type PercentInputProps = {\n\tvalue: number | null | undefined; // percentage value (0-100)\n\tonChange?: (percent: number | null | undefined) => void;\n\tdisabled?: boolean;\n\thasError?: boolean;\n\thasWarning?: boolean;\n\thasSuccess?: boolean;\n\tmessage?: string;\n};\n\nconst twoDecimalFormatter = Intl.NumberFormat(\"en-US\", {\n\tminimumFractionDigits: 0,\n\tmaximumFractionDigits: 2,\n});\n\n// Remove non-numeric characters except for commas, periods.\nconst formatInput = (value: string) => {\n\treturn value.replaceAll(/[^0-9.,]/g, \"\");\n};\n\nconst roundToTwoDecimalPlaces = (value: number): number => {\n\treturn Math.round((value + Number.EPSILON) * 100) / 100;\n};\n\n/**\n * PercentInput component for displaying and editing a percentage value.\n *\n * Exposes `percent` to consuming components, which is the value as a number (0-100).\n */\nexport const PercentInput = forwardRef<HTMLInputElement, PercentInputProps>(\n\t({ value, onChange, disabled = false, hasError = false, hasWarning = false, hasSuccess = false, message }, ref) => {\n\t\tconst [strValue, setStrValue] = useSyncState<string>(value == null ? \"\" : twoDecimalFormatter.format(value));\n\n\t\tconst handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst inputValue = formatInput(event.target.value);\n\n\t\t\t// Handle empty input (i.e., user clears the input)\n\t\t\tif (!inputValue) {\n\t\t\t\tsetStrValue(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Allow prefixing decimal points\n\t\t\tif (inputValue === \".\") {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent typing more than two decimal places\n\t\t\tif ((inputValue.split(\".\")?.[1]?.length ?? 0) > 2) return;\n\n\t\t\tconst parsedValue = parseFloat(inputValue);\n\t\t\tif (!isNaN(parsedValue)) {\n\t\t\t\tsetStrValue(inputValue);\n\t\t\t}\n\t\t};\n\n\t\tconst handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tconst pastedData = formatInput(event.clipboardData.getData(\"text\"));\n\t\t\tconst parsedAmount = parseFloat(pastedData);\n\n\t\t\tif (!isNaN(parsedAmount)) {\n\t\t\t\tsetStrValue(twoDecimalFormatter.format(parsedAmount));\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedAmount));\n\t\t\t}\n\t\t};\n\n\t\tconst handleBlur = () => {\n\t\t\tconst parsedValue = parseFloat(strValue.replaceAll(\",\", \"\"));\n\t\t\tif (isNaN(parsedValue)) {\n\t\t\t\tonChange?.(null);\n\t\t\t} else {\n\t\t\t\tonChange?.(roundToTwoDecimalPlaces(parsedValue));\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"flex h-md w-full items-center rounded-sm py-2.5 text-base [&>input]:rounded-l-none! [&>input]:rounded-r-md! [&>input]:border-l-0!\",\n\t\t\t\t\t\tdisabled &&\n\t\t\t\t\t\t\t\"cursor-not-allowed [&>input]:cursor-not-allowed [&>input]:bg-surface-light! [&>input]:text-muted!\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"flex h-md w-md items-center justify-center rounded-l-md border-y border-l px-2.5 text-sm text-muted\",\n\t\t\t\t\t\t\thasError\n\t\t\t\t\t\t\t\t? \"border-red-300 bg-red-200 text-red-700\"\n\t\t\t\t\t\t\t\t: hasWarning\n\t\t\t\t\t\t\t\t\t? \"border-yellow-300 bg-surface-warning text-warning\"\n\t\t\t\t\t\t\t\t\t: hasSuccess\n\t\t\t\t\t\t\t\t\t\t? \"border-green-300 bg-surface-success text-success\"\n\t\t\t\t\t\t\t\t\t\t: \"border-surface-neutral bg-surface-neutral\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon icon={faPercent} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tvalue={strValue}\n\t\t\t\t\t\thasError={hasError}\n\t\t\t\t\t\thasWarning={hasWarning}\n\t\t\t\t\t\thasSuccess={hasSuccess}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{hasWarning && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-warning\">\n\t\t\t\t\t\t<Icon icon={faExclamationTriangle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasError && message && (\n\t\t\t\t\t<Text as=\"span\" variant=\"body-2\" className=\"flex items-center gap-1 text-red-700\">\n\t\t\t\t\t\t<Icon icon={faExclamationCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{hasSuccess && message && (\n\t\t\t\t\t<div className=\"flex items-center gap-1 text-sm font-normal text-success\">\n\t\t\t\t\t\t<Icon icon={faCheckCircle} />\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nexport type FormPercentInputProps = SharedFormControlProps &\n\tSharedFormItemProps & { onChange?: (percent: number | null | undefined) => void } & Pick<\n\t\tPercentInputProps,\n\t\t\"hasWarning\" | \"hasSuccess\" | \"message\"\n\t>;\n\nexport const FormPercentInput: ForwardRefExoticComponent<FormPercentInputProps & RefAttributes<HTMLInputElement>> =\n\tforwardRef<HTMLInputElement, FormPercentInputProps>(\n\t\t({ name, layout, label, onChange, disabled, hasWarning = false, hasSuccess = false, message, options }, ref) => (\n\t\t\t<ControlledField\n\t\t\t\tname={name}\n\t\t\t\trender={(field) => (\n\t\t\t\t\t<FormItem\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\toptions={options}\n\t\t\t\t\t\terror={field.error}\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<PercentInput\n\t\t\t\t\t\t\t\tonChange={(percent: number | null | undefined) => {\n\t\t\t\t\t\t\t\t\tfield.onChange(percent);\n\t\t\t\t\t\t\t\t\tonChange?.(percent);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={field.value as number | undefined}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\thasError={!disabled && (!!field.error || undefined)}\n\t\t\t\t\t\t\t\thasWarning={!disabled && hasWarning}\n\t\t\t\t\t\t\t\thasSuccess={!disabled && hasSuccess}\n\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t),\n\t);\n","import { Checkbox } from \"@/core/checkbox\";\nimport { ControlledFieldProvider, useControlledField, useControlledFormField } from \"@/core/form\";\nimport { FieldLabel } from \"@/core/form/components/form-item/FieldLabel\";\nimport { EventFor } from \"@/core/form/types\";\n\nimport { FieldErrorMessage } from \"./form-item/FieldErrorMessage\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormCheckboxProps = Pick<SharedFormControlProps, \"name\" | \"disabled\"> & {\n\t/**\n\t * Optional content to render in place of the default checkbox. When provided, compose the field\n\t * yourself with {@link FormCheckbox.Checkbox} and {@link FormCheckbox.Label}; when omitted, a\n\t * standalone {@link Checkbox} is rendered.\n\t */\n\tchildren?: React.ReactNode;\n\t/** Called with the new checked state whenever the checkbox is toggled. */\n\tonChange?: (checked: boolean) => void;\n};\n\n/**\n * Checkbox bound to a named field of the surrounding form.\n *\n * Reads and writes the field's boolean value and surfaces its validation error. Used without\n * `children` it renders a standalone {@link Checkbox}; with `children` it provides the field via\n * context so it can be composed with the {@link FormCheckbox.Checkbox} and {@link FormCheckbox.Label}\n * subcomponents.\n */\nexport const FormCheckbox = ({ name, disabled, onChange: propsOnChange, children }: FormCheckboxProps) => {\n\tconst {\n\t\tonChange,\n\t\terror,\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tvalue,\n\t\t...field\n\t} = useControlledFormField({ name });\n\n\tconst handleChange = (e: EventFor<\"input\", \"onChange\">) => {\n\t\tconst { checked } = e.target;\n\t\tonChange(checked);\n\t\tpropsOnChange?.(checked);\n\t};\n\n\tif (children == null) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Checkbox\n\t\t\t\t\t{...field}\n\t\t\t\t\tid={name}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tchecked={!!value}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\thasError={!!error}\n\t\t\t\t/>\n\t\t\t\t<FieldErrorMessage error={error} />\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ControlledFieldProvider name={name}>\n\t\t\t{children}\n\t\t\t<FieldErrorMessage error={error} />\n\t\t</ControlledFieldProvider>\n\t);\n};\n\nfunction CheckboxImpl({ onChange: propsOnChange }: { onChange?: (checked: boolean) => void }) {\n\tconst {\n\t\tname,\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tvalue,\n\t\tonChange,\n\t\terror,\n\t\t...field\n\t} = useControlledField();\n\n\tconst handleChange = (e: EventFor<\"input\", \"onChange\">) => {\n\t\tconst { checked } = e.target;\n\t\tonChange(checked);\n\t\tpropsOnChange?.(checked);\n\t};\n\n\treturn <Checkbox {...field} id={name} checked={!!value} onChange={handleChange} hasError={!!error} />;\n}\n\nfunction LabelImpl({ children, className }: { children: React.ReactNode; className?: string }) {\n\tconst { name } = useControlledField();\n\n\treturn (\n\t\t<FieldLabel htmlFor={name} styles={className}>\n\t\t\t{children}\n\t\t</FieldLabel>\n\t);\n}\n\nFormCheckbox.Label = LabelImpl;\nFormCheckbox.Checkbox = CheckboxImpl;\n","import { ControllerRenderProps, FieldError } from \"react-hook-form\";\n\nimport { FormItem, SharedFormItemProps } from \"@/core/form/components/form-item\";\nimport { SharedFormControlProps } from \"@/core/form/components/types\";\nimport { useControlledFormField } from \"@/core/form/hooks\";\n\ntype FormItemRender<T> = Simplify<Omit<ControllerRenderProps, \"value\"> & { value: T; error?: FieldError }>;\n\ntype ControlledFormItemProps<T = string> = Simplify<\n\tSharedFormControlProps &\n\t\tSharedFormItemProps & {\n\t\t\trender: (field: FormItemRender<T>) => React.ReactNode;\n\t\t}\n>;\nexport const ControlledFormItem = <T = string>({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\trender,\n}: ControlledFormItemProps<T>) => {\n\tconst field = useControlledFormField({ name });\n\n\treturn (\n\t\t<FormItem\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={render(field)}\n\t\t\terror={field.error}\n\t\t/>\n\t);\n};\n","import { SelectItem, SelectValue } from \"./selectItem\";\n\nexport const DEFAULT_NUM_VALUES_TO_SHOW = 2;\n\n/**\n * Props to control the loading and error states of an AsyncSelect component.\n */\nexport type LoadProps = {\n\tisLoading: boolean;\n\tisError: boolean;\n\tcanLoadMore: boolean;\n\tonLoadMore: () => void;\n};\n\n/**\n * Props for the AsyncMultiSelect component, the most unopinionated of the Select components and the base\n * of all the others.\n */\nexport type AsyncMultiSelectProps<T extends SelectValue> = {\n\tvalue?: T[];\n\tonChange?: (value: T[]) => void;\n\tdisabled?: boolean;\n\ttriggerPlaceholder?: string;\n\tvariant?: \"default\" | \"simple\";\n\t/**\n\t * Number of selected values to show by default. If more than this number are selected, the select will\n\t * render a button to expand the list. Defaults to {@link DEFAULT_NUM_VALUES_TO_SHOW}.\n\t */\n\tnumValuesToShow?: number;\n\t/**\n\t * If true, this select will strictly enforce ordering of the items. Items added first will\n\t * be displayed first, and the user can reorder items by dragging them. Defaults to false.\n\t */\n\tordered?: boolean;\n\t/**\n\t * Hide the search field. Defaults to false. Recommended only for Selects with a small number of items.\n\t */\n\thideSearch?: boolean;\n\tsearchPlaceholder?: string;\n\t/**\n\t * Callback when the user types in the input field.\n\t */\n\tonSearchChange?: (query: string) => void;\n\t/**\n\t * All items that the Select knows about, for both selected and unselected values.\n\t *\n\t * This list should eventually include items for ALL values that are selected,\n\t * including custom values. *The component will render a loading state until then.*\n\t *\n\t * This list may not necessarily include all available items, e.g., if the user\n\t * is searching or if the list is paginated.\n\t */\n\titems: SelectItem<T>[];\n\t/**\n\t * Optional props to control the loading and error states of the AsyncMultiSelect, which can add item(s)\n\t * to the bottom of the dropdown that convey and control this state.\n\t */\n\tloadProps?: LoadProps;\n\t/**\n\t * Min number of items that must be selected. Defaults to 0. If 1, the user cannot\n\t * unselect the last item.\n\t */\n\tminSelection?: 0 | 1;\n\t/**\n\t * Max number of items that can be selected. Defaults to unlimited.\n\t */\n\tmaxSelection?: number | \"unlimited\";\n\t/**\n\t * If true, the user can enter custom values. Defaults to false.\n\t * Can only be true if T is string.\n\t */\n\tallowCustomValues?: T extends string ? boolean : false;\n\tisValidCustomValue?: (value: string) => boolean;\n\t/**\n\t * What to do when \"Select all\" is clicked (only shown if there are no items selected).\n\t * If not provided, no \"Select all\" button will be shown.\n\t */\n\tonSelectAll?: () => void;\n\thasError?: boolean;\n\tpopover?: {\n\t\tcustomTrigger?: React.ReactNode;\n\t\tcontentClassName?: string;\n\t\ttriggerClassName?: string;\n\t\tcontainer?: Element;\n\t};\n\temptyState?: React.ReactNode;\n\tsize?: \"sm\" | \"md\" | \"lg\";\n};\n\n/**\n * Props for the AsyncSelect component, which is a wrapper around AsyncMultiSelect that only allows\n * a single item to be selected.\n */\nexport type UnselectableProps<T extends SelectValue> = {\n\tvalue?: T;\n\tonChange?: (value: T | undefined) => void;\n\tallowUnselect: boolean;\n};\nexport type NotUnselectableProps<T extends SelectValue> = {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tallowUnselect?: false;\n};\nexport type AsyncSelectProps<T extends SelectValue> = Simplify<\n\t(UnselectableProps<T> | NotUnselectableProps<T>) &\n\t\tOmit<AsyncMultiSelectProps<T>, \"value\" | \"onChange\" | \"minSelection\" | \"maxSelection\" | \"onSelectAll\">\n>;\n\n/**\n * Props for the MultiSelect component, which is a wrapper around AsyncMultiSelect that does not\n * require async loading (and assumes that all options are always available).\n */\nexport type MultiSelectProps<T extends SelectValue> = {\n\t/**\n\t * A function for creating a select option given a custom value. This is used to render\n\t * the selected items both in the trigger and in the dropdown.\n\t */\n\tcustomValueToOption?: string extends T ? (value: string) => SelectItem<T> : never;\n} & Omit<AsyncMultiSelectProps<T>, \"debounceMs\">;\n\n/**\n * Props for the Select component, which is a wrapper around MultiSelect that only allows\n * a single item to be selected.\n */\nexport type SelectProps<T extends SelectValue> = (UnselectableProps<T> | NotUnselectableProps<T>) &\n\tOmit<MultiSelectProps<T>, \"value\" | \"onChange\" | \"minSelection\" | \"maxSelection\" | \"onSelectAll\">;\n\nexport type SelectWithUnselectProps<T extends SelectValue> = Omit<UnselectableProps<T>, \"allowUnselect\"> &\n\tOmit<MultiSelectProps<T>, \"value\" | \"onChange\" | \"minSelection\" | \"maxSelection\" | \"onSelectAll\">;\n\n/**\n * Helper type for async single-select components with enriched object callback.\n * Makes it easy to define custom select component props.\n */\nexport type AsyncSelectControlledProps<TValue extends SelectValue, TObj> = {\n\tvalue: TValue | undefined;\n\tonChange: (value: TValue | undefined, obj: TObj | undefined) => void;\n};\n\n/**\n * Helper type for async multi-select components with enriched object callback.\n * Makes it easy to define custom multi-select component props.\n */\nexport type AsyncMultiSelectControlledProps<TValue extends SelectValue, TObj> = {\n\tvalue: TValue[];\n\tonChange: (value: TValue[] | undefined, objs: TObj[]) => void;\n};\n","export type SelectValue = string | number;\n\n/**\n * An item in a Select component. This could represent an available option, or a selected value.\n */\nexport type SelectItem<TValue extends SelectValue = string> = {\n\t/**\n\t * The value of the option. Must be unique and extend either string or number.\n\t */\n\tvalue: TValue;\n\t/**\n\t * Label to show in the select dropdown and trigger.\n\t */\n\tlabel: string;\n\t/**\n\t * Optional unique key for React rendering. Use when value may not be unique.\n\t * Falls back to value if not provided.\n\t */\n\treactKey?: string;\n\t/**\n\t * Optional React node to show in the select dropdown, but not in the trigger.\n\t */\n\tdisplay?: React.ReactNode;\n\ticon?: React.ReactNode;\n\tdisabled?: boolean;\n\t/**\n\t * Predicate to determine if the option matches a query.\n\t * Default is to match if the lowercase label contains the lowercase query.\n\t * @param query search query\n\t * @returns whether the option matches the query\n\t */\n\tisMatch?: (query: string) => boolean;\n};\n\n/**\n * Returns true if the option matches the query.\n * @param option\n * @param query\n * @returns\n */\nexport function doesSelectItemMatch<T extends SelectValue>(option: SelectItem<T>, query: string | undefined): boolean {\n\tif (!query) {\n\t\treturn true;\n\t}\n\tif (option.isMatch) {\n\t\treturn option.isMatch(query);\n\t}\n\treturn option.label.toLowerCase().includes(query.toLowerCase());\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { LoadProps } from \"./props\";\nimport { SelectItem, SelectValue } from \"./selectItem\";\n\nexport function useDebounce<T>(value: T, delay: number) {\n\tconst [debouncedValue, setDebouncedValue] = useState(value);\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst handler = setTimeout(() => {\n\t\t\tsetDebouncedValue(value);\n\t\t}, delay);\n\t\treturn () => {\n\t\t\tclearTimeout(handler);\n\t\t};\n\t}, [value, delay]);\n\treturn debouncedValue;\n}\n\nexport type ErrorOr<T> = { error: true } | { error: false; value: T };\n\nexport type UseAsyncMultiSelectArgs<TValue extends SelectValue, TObj, TPage> = {\n\tvalue: TValue[];\n\t/**\n\t * Fetch objects associated with the selected values.\n\t *\n\t * If the select allows custom values, then some values may not resolve to a\n\t * corresponding object (determined by objToItem). In this case, these values\n\t * will be converted to items using customValueToItem.\n\t * @param values current selected items\n\t * @returns list of objects corresponding to the selected values\n\t */\n\tfetchValues: (values: TValue[]) => Promise<ErrorOr<TObj[]>>;\n\t/**\n\t * Fetch objects matching a search term and page token. This is used to render\n\t * available options in the dropdown.\n\t * @param query query the user has searched\n\t * @param page page token\n\t * @returns the results and the next page token, if any\n\t */\n\tfetchOptions: (\n\t\tquery: string,\n\t\tpage: TPage | undefined,\n\t) => Promise<\n\t\tErrorOr<{\n\t\t\tresults: TObj[];\n\t\t\tnextPage?: TPage;\n\t\t}>\n\t>;\n\t/**\n\t * Convert an object returned from a query to a select item.\n\t * @param obj\n\t * @returns\n\t */\n\tobjToItem: (obj: TObj) => SelectItem<TValue>;\n\t/**\n\t * Convert a custom value to a select item. *Only provide this if the select\n\t * accepts custom values.*\n\t *\n\t * If this is not provided, the select will render a loading state until all\n\t * values have been resolved to objects by fetchValues.\n\t *\n\t * TODO: how to handle cases where custom values are disallowed, but a value\n\t * previously entered by the user is no longer present on the backend?\n\t * @param value\n\t * @returns\n\t */\n\tcustomValueToItem?: (value: TValue) => SelectItem<TValue>;\n\tqueryKeyPrefix: string | string[] | readonly string[];\n};\n\n/**\n * Utility hook for fetching data and getting props for AsyncMultiSelect.\n */\nexport function useAsyncMultiSelect<TValue extends SelectValue, TObj, TPage>({\n\tvalue,\n\tfetchValues,\n\tfetchOptions,\n\tobjToItem,\n\tcustomValueToItem,\n\tqueryKeyPrefix,\n}: UseAsyncMultiSelectArgs<TValue, TObj, TPage>) {\n\tconst [query, setQuery] = useState(\"\");\n\tconst [page, setPage] = useState<TPage | undefined>(undefined);\n\tconst debouncedSearchTerm = useDebounce(query, 500);\n\n\tconst key = Array.isArray(queryKeyPrefix) ? queryKeyPrefix : [queryKeyPrefix];\n\n\t// loading is handled by the select component - it renders a loading state\n\t// if any of the values are not resolved by this query (and no customValueToItem) is provided\n\t// TODO: handle error state\n\tconst { data: fetchedValues } = useQuery({\n\t\tqueryKey: [...key, \"values\", value],\n\t\tqueryFn: () => fetchValues(value),\n\t\tenabled: !!value,\n\t});\n\n\tconst {\n\t\tdata: fetchedOptions,\n\t\tisLoading: isLoadingOptions,\n\t\terror: optionsError,\n\t} = useQuery({\n\t\tqueryKey: [...key, \"options\", debouncedSearchTerm, page],\n\t\tqueryFn: () => fetchOptions(debouncedSearchTerm, page),\n\t});\n\n\tconst selectItems = useMemo(() => {\n\t\tconst fetchedValueItems = fetchedValues?.error === false ? fetchedValues.value.map(objToItem) : [];\n\t\tconst customItems = customValueToItem\n\t\t\t? value.filter((v) => !fetchedValueItems.some((i) => i.value === v)).map((v) => customValueToItem(v))\n\t\t\t: [];\n\t\tconst fetchedOptionItems = fetchedOptions?.error === false ? fetchedOptions.value.results.map(objToItem) : [];\n\n\t\treturn [...fetchedValueItems, ...customItems, ...fetchedOptionItems];\n\t}, [objToItem, value, fetchedValues, fetchedOptions, customValueToItem]);\n\n\tconst loadProps: LoadProps = {\n\t\tisLoading: isLoadingOptions,\n\t\tisError: !!(optionsError || !fetchedOptions || fetchedOptions.error),\n\t\tcanLoadMore: !fetchedOptions?.error ? !!fetchedOptions?.value?.nextPage : false,\n\t\tonLoadMore: () => {\n\t\t\tif (!fetchedOptions?.error) {\n\t\t\t\tsetPage(fetchedOptions?.value?.nextPage);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn {\n\t\tquery,\n\t\tsetQuery,\n\t\tselectItems,\n\t\tloadProps,\n\t\tqueriedObjects: [\n\t\t\t...(fetchedValues?.error === false ? fetchedValues.value : []),\n\t\t\t...(fetchedOptions?.error === false ? fetchedOptions.value.results : []),\n\t\t],\n\t};\n}\n\nexport type UseAsyncSelectArgs<TValue extends SelectValue, TObj, TPage> = {\n\tvalue: TValue | undefined;\n\tfetchValue: (value: TValue) => Promise<ErrorOr<TObj | undefined>>;\n} & Omit<UseAsyncMultiSelectArgs<TValue, TObj, TPage>, \"value\" | \"fetchValues\">;\n\n/**\n * Utility hook for fetching data and getting props for AsyncSelect.\n */\nexport const useAsyncSelect = <TValue extends SelectValue, TObj, TPage>({\n\tvalue,\n\tfetchValue,\n\t...rest\n}: UseAsyncSelectArgs<TValue, TObj, TPage>) =>\n\tuseAsyncMultiSelect({\n\t\tvalue: value ? [value] : [],\n\t\tfetchValues: async (values) => {\n\t\t\tif (!values[0]) {\n\t\t\t\treturn {\n\t\t\t\t\terror: false,\n\t\t\t\t\tvalue: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = await fetchValue(values[0]);\n\t\t\tif (result.error) return result;\n\t\t\treturn {\n\t\t\t\terror: false,\n\t\t\t\tvalue: result.value ? [result.value] : [],\n\t\t\t};\n\t\t},\n\t\t...rest,\n\t});\n","import { DndContext, DragEndEvent, PointerSensor, useSensor, useSensors } from \"@dnd-kit/core\";\nimport { SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport { faArrowTurnDownLeft, faCheck, faSearch, faTimes } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { useMemo, useRef, useState } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { DropdownChevron } from \"../dropdown-chevron\";\nimport { Icon } from \"../icon\";\nimport { InputBox } from \"../input\";\nimport { inputBoxStyles } from \"../input/inputBoxStyles\";\nimport { Popover } from \"../popover\";\nimport { Text } from \"../text\";\nimport { AsyncMultiSelectProps, DEFAULT_NUM_VALUES_TO_SHOW } from \"./props\";\nimport { doesSelectItemMatch, SelectItem } from \"./selectItem\";\nimport { SelectListItem, SelectListItemProps } from \"./SelectListItem\";\n\n/**\n * The most unopinionated of the family of Select components, the base for all the others.\n * Supports asynchronous loading (and does not assume that all available options are provided\n * in the `options` prop).\n */\nexport const AsyncMultiSelect = <TValue extends string | number>({\n\tvalue = [],\n\tonChange,\n\tdisabled = false,\n\tordered,\n\tvariant,\n\ttriggerPlaceholder,\n\thideSearch = false,\n\tsearchPlaceholder = \"Search...\",\n\titems,\n\tloadProps,\n\tonSearchChange,\n\tminSelection = 0,\n\tmaxSelection = \"unlimited\",\n\tallowCustomValues,\n\thasError,\n\tpopover,\n\tisValidCustomValue = () => true,\n\tonSelectAll,\n\tnumValuesToShow,\n\temptyState,\n\tsize,\n}: AsyncMultiSelectProps<TValue>) => {\n\tconst [open, setOpen] = useState(false);\n\tconst [search, setSearch] = useState(\"\");\n\tconst [focusIndex, setFocusIndex] = useState(0);\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tconst unselectedOptions = useMemo(() => items.filter((item) => !value.includes(item.value)), [items, value]);\n\n\tconst resetSearch = () => {\n\t\tsetSearch(\"\");\n\t\tonSearchChange?.(\"\");\n\t};\n\n\tconst handleClose = () => {\n\t\tsetOpen(false);\n\t\tresetSearch();\n\t\tsetFocusIndex(0);\n\t};\n\n\tconst searchMatchesExistingOption =\n\t\tvalue.some((v) => v.toString().toLowerCase() === search.toLowerCase()) ||\n\t\tunselectedOptions.find((opt) => opt.value?.toString().toLowerCase() === search.toLowerCase());\n\tconst showCustomItem =\n\t\tallowCustomValues &&\n\t\t!!search &&\n\t\t!loadProps?.isLoading &&\n\t\t!searchMatchesExistingOption &&\n\t\tisValidCustomValue(search);\n\n\tconst isCustomValueSelected = useMemo(\n\t\t() => allowCustomValues && value.some((v) => !items.map((item) => item.value).includes(v)),\n\t\t[allowCustomValues, items, value],\n\t);\n\tconst showCustomValue = isCustomValueSelected && !loadProps?.isLoading;\n\n\tconst handleAddCustomItem = () => {\n\t\tif (maxSelection === 1) {\n\t\t\tsetOpen(false);\n\t\t\tonChange?.([search as TValue]);\n\t\t} else {\n\t\t\tonChange?.([...value, search as TValue]);\n\t\t}\n\t\tresetSearch();\n\t};\n\n\tconst handleOptionSelected = (val: TValue) => {\n\t\tif (maxSelection === 1) {\n\t\t\tonChange?.([val]);\n\t\t\thandleClose();\n\t\t} else {\n\t\t\tlet items = ordered ? [...value, val] : [val, ...value];\n\t\t\tif (maxSelection !== \"unlimited\") {\n\t\t\t\titems = items.slice(0, maxSelection);\n\t\t\t}\n\n\t\t\tonChange?.(items);\n\t\t}\n\t\tif (inputRef.current) {\n\t\t\tinputRef.current.select();\n\t\t}\n\t};\n\n\tconst totalNumItems = unselectedOptions.length + (showCustomItem ? 1 : 0);\n\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\tsetFocusIndex((prev) => (prev + 1) % totalNumItems);\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\tsetFocusIndex((prev) => Math.max(prev - 1, 0));\n\t\t} else if (e.key === \"Enter\") {\n\t\t\te.preventDefault();\n\t\t\tif (focusIndex === 0 && showCustomItem) {\n\t\t\t\thandleAddCustomItem();\n\t\t\t} else if (totalNumItems > focusIndex) {\n\t\t\t\tconst unselectedOptionsIndex = focusIndex - (showCustomItem ? 1 : 0);\n\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\tif (!unselectedOptions[unselectedOptionsIndex].disabled) {\n\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\thandleOptionSelected(unselectedOptions[unselectedOptionsIndex].value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (e.key === \"Tab\") {\n\t\t\te.preventDefault();\n\t\t\tsetOpen(false);\n\t\t}\n\t};\n\n\tconst handleSearchTermChange = (val: string) => {\n\t\tsetSearch(val);\n\t\tsetFocusIndex(0);\n\t\tonSearchChange?.(val);\n\t};\n\n\t// If a user types while the select menu is focused but not open,\n\t// open the menu and start searching with the key that was pressed.\n\tconst handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (!hideSearch && e.key.length === 1) {\n\t\t\tsetOpen(true);\n\t\t\thandleSearchTermChange(e.key);\n\t\t}\n\t};\n\n\tconst valueToOptionMap = useMemo(() => {\n\t\tconst map = new Map<TValue, SelectItem<TValue>>();\n\t\titems.forEach((item) => map.set(item.value, item));\n\t\treturn map;\n\t}, [items]);\n\n\tconst allValuesHaveOptions = useMemo(\n\t\t() => value.every((val) => valueToOptionMap.has(val)) || showCustomValue,\n\t\t[value, valueToOptionMap, showCustomValue],\n\t);\n\n\tconst triggerText = useMemo(() => {\n\t\tif (value.length === 0) {\n\t\t\treturn (\n\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t{triggerPlaceholder ?? `Select ${maxSelection === 1 ? \"an item...\" : \"items...\"}`}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\n\t\tif (!allValuesHaveOptions) {\n\t\t\t// all values must eventually have associated options, but if they don't yet, show a loading state\n\t\t\treturn <span className=\"line-clamp-1\">Loading...</span>;\n\t\t}\n\n\t\tconst optionMatchingFirstVal =\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tvalueToOptionMap.get(value[0]) ||\n\t\t\t({\n\t\t\t\tlabel: value[0],\n\t\t\t\ticon: undefined,\n\t\t\t} as SelectItem<TValue>);\n\t\tconst firstValText = optionMatchingFirstVal ? optionMatchingFirstVal.label : value[0];\n\t\tconst icon = value.length === 1 ? optionMatchingFirstVal?.icon : undefined;\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{icon && <span className=\"mr-1 inline-flex items-center\">{icon}</span>}\n\t\t\t\t<span className=\"line-clamp-1 text-left\">{`${firstValText}${value.length > 1 ? \",\" : \"\"}`}</span>\n\t\t\t\t{value.length > 1 && <span className=\"whitespace-nowrap\">{`+${value.length - 1} more`}</span>}\n\t\t\t</>\n\t\t);\n\t}, [maxSelection, valueToOptionMap, triggerPlaceholder, value, allValuesHaveOptions]);\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open && !disabled}\n\t\t\tonOpenChange={(val) => {\n\t\t\t\tif (val) {\n\t\t\t\t\tsetOpen(true);\n\t\t\t\t} else {\n\t\t\t\t\thandleClose();\n\t\t\t\t}\n\t\t\t}}\n\t\t\talignContent=\"start\"\n\t\t\tdisabled={disabled}\n\t\t\ttriggerClassName={popover?.triggerClassName}\n\t\t\tcontentClassName={popover?.contentClassName}\n\t\t\tcontainer={popover?.container}\n\t\t\ttrigger={\n\t\t\t\tpopover?.customTrigger ??\n\t\t\t\t(variant === \"simple\" ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tonKeyDown={handleTriggerKeyDown}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"-mx-2 -my-1.5 flex cursor-pointer items-center justify-between gap-1.5 rounded-md px-2 py-1.5 transition-all duration-150\",\n\t\t\t\t\t\t\t!disabled && \"cursor-pointer hover:bg-surface-neutral\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\t\"line-clamp-1 flex flex-1 items-center\",\n\t\t\t\t\t\t\t\tvalue.length !== 0 ? \"text-inherit\" : \"text-muted\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{triggerText}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!disabled && <DropdownChevron />}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<button onKeyDown={handleTriggerKeyDown} className={twJoin(\"w-full\", inputBoxStyles({ hasError, size }))}>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`mr-auto line-clamp-1 flex items-center space-x-1 text-left text-base ${\n\t\t\t\t\t\t\t\tvalue.length === 0 ? \"text-placeholder\" : \"text-gray-800\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{triggerText}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<DropdownChevron />\n\t\t\t\t\t</button>\n\t\t\t\t))\n\t\t\t}\n\t\t>\n\t\t\t<div className=\"w-72\">\n\t\t\t\t{(!hideSearch || allowCustomValues) && (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<InputBox variant=\"transparent\">\n\t\t\t\t\t\t\t<div className=\"w-3 text-sm text-placeholder\">\n\t\t\t\t\t\t\t\t<Icon icon={faSearch} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<InputBox.Input\n\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\tonChange={(e) => handleSearchTermChange(e.target.value)}\n\t\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\t\tonBlur={(e) => e.target.focus()}\n\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</InputBox>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<ul className=\"max-h-72 space-y-1 overflow-y-auto p-1\">\n\t\t\t\t\t{!allValuesHaveOptions ? (\n\t\t\t\t\t\t<SelectListItem disabled>Loading...</SelectListItem>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<SelectedItems\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\tsearch={search}\n\t\t\t\t\t\t\tvalueToOptionMap={valueToOptionMap}\n\t\t\t\t\t\t\tonSelectAll={onSelectAll}\n\t\t\t\t\t\t\tminSelection={minSelection}\n\t\t\t\t\t\t\tordered={ordered}\n\t\t\t\t\t\t\tnumValuesToShow={numValuesToShow}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{showCustomItem && (\n\t\t\t\t\t\t<SelectOption onClick={handleAddCustomItem} focused={showCustomItem && focusIndex === 0}>\n\t\t\t\t\t\t\t<span>{`\"${search}\"`}</span>\n\t\t\t\t\t\t</SelectOption>\n\t\t\t\t\t)}\n\t\t\t\t\t{unselectedOptions.map((item, i) => (\n\t\t\t\t\t\t<SelectOption\n\t\t\t\t\t\t\tkey={item.reactKey ?? item.value}\n\t\t\t\t\t\t\tonClick={() => handleOptionSelected(item.value)}\n\t\t\t\t\t\t\tfocused={focusIndex === (showCustomItem ? i + 1 : i)}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.display ?? item.label}\n\t\t\t\t\t\t</SelectOption>\n\t\t\t\t\t))}\n\t\t\t\t\t{!loadProps ? (\n\t\t\t\t\t\t// no asynchronous loading\n\t\t\t\t\t\tunselectedOptions.length === 0 && (emptyState || <SelectListItem disabled>No results</SelectListItem>)\n\t\t\t\t\t) : loadProps.isLoading ? (\n\t\t\t\t\t\t<SelectListItem disabled>Loading...</SelectListItem>\n\t\t\t\t\t) : loadProps.isError ? (\n\t\t\t\t\t\t<SelectListItem disabled>An error occurred</SelectListItem>\n\t\t\t\t\t) : unselectedOptions.length === 0 ? (\n\t\t\t\t\t\temptyState || <SelectListItem disabled>No results</SelectListItem>\n\t\t\t\t\t) : loadProps.canLoadMore ? (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\tvariant=\"label\"\n\t\t\t\t\t\t\tonClick={loadProps.onLoadMore}\n\t\t\t\t\t\t\tclassName=\"cursor-pointer px-2 py-1 text-indigo-600\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more...\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : null}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</Popover>\n\t);\n};\n\nconst SelectOption = ({ children, focused, ...rest }: SelectListItemProps) => (\n\t<SelectListItem focused={focused} {...rest}>\n\t\t{children}\n\t\t{focused && !rest.disabled && (\n\t\t\t<span className=\"w-3 text-sm text-muted\">\n\t\t\t\t<Icon icon={faArrowTurnDownLeft} />\n\t\t\t</span>\n\t\t)}\n\t</SelectListItem>\n);\n\ntype SelectedItemsProps<TValue extends string | number> = Pick<\n\tAsyncMultiSelectProps<TValue>,\n\t\"value\" | \"onChange\" | \"onSelectAll\" | \"minSelection\" | \"ordered\" | \"numValuesToShow\"\n> & {\n\tsearch: string;\n\tvalueToOptionMap: Map<TValue, SelectItem<TValue>>;\n};\nconst SelectedItems = <TValue extends string | number>({\n\tvalue = [],\n\tonChange,\n\tonSelectAll,\n\tminSelection,\n\tsearch,\n\tvalueToOptionMap,\n\tordered,\n\tnumValuesToShow = DEFAULT_NUM_VALUES_TO_SHOW,\n}: SelectedItemsProps<TValue>) => {\n\tconst [showAllValues, setShowAllValues] = useState(false);\n\n\tconst filteredSelectedValues = useMemo(() => {\n\t\treturn value.filter((v) => {\n\t\t\tif (!search) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst option = valueToOptionMap.get(v);\n\t\t\tif (!option) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn doesSelectItemMatch(option, search);\n\t\t});\n\t}, [value, search, valueToOptionMap]);\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 8,\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst onDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event;\n\t\tif (over && active.id !== over.id) {\n\t\t\tconst newOrder = [...value];\n\t\t\tconst activeIndex = newOrder.indexOf(active.id as TValue);\n\t\t\tconst overIndex = newOrder.indexOf(over.id as TValue);\n\t\t\tnewOrder.splice(activeIndex, 1);\n\t\t\tnewOrder.splice(overIndex, 0, active.id as TValue);\n\t\t\tonChange?.(newOrder);\n\t\t}\n\t};\n\n\treturn (\n\t\t<DndContext sensors={sensors} onDragEnd={onDragEnd}>\n\t\t\t<SortableContext\n\t\t\t\tdisabled={!ordered}\n\t\t\t\titems={filteredSelectedValues.map((v) => ({ id: v, value: v }))}\n\t\t\t\tstrategy={verticalListSortingStrategy}\n\t\t\t>\n\t\t\t\t{(filteredSelectedValues.length > numValuesToShow || onSelectAll) && (\n\t\t\t\t\t<div className=\"flex justify-between px-2 pt-1.5 pb-px text-sm\">\n\t\t\t\t\t\t<span className=\"font-medium text-muted\">\n\t\t\t\t\t\t\t{value.length} selected\n\t\t\t\t\t\t\t{filteredSelectedValues.length < value.length ? ` (showing ${filteredSelectedValues.length})` : \"\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{value.length > 0 ? (\n\t\t\t\t\t\t\t<span className=\"cursor-pointer text-danger hover:underline\" onClick={() => onChange?.([])}>\n\t\t\t\t\t\t\t\tClear\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : onSelectAll ? (\n\t\t\t\t\t\t\t<span className=\"cursor-pointer text-indigo-700 hover:underline\" onClick={onSelectAll}>\n\t\t\t\t\t\t\t\tSelect all\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{filteredSelectedValues.length > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{filteredSelectedValues.slice(0, showAllValues ? value.length : numValuesToShow).map((val) => {\n\t\t\t\t\t\t\tconst item = valueToOptionMap.get(val);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<SelectListItem\n\t\t\t\t\t\t\t\t\tsortableId={ordered ? val : undefined}\n\t\t\t\t\t\t\t\t\tkey={val}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tconst canRemove = minSelection === 0 || value.length !== 1;\n\t\t\t\t\t\t\t\t\t\tif (canRemove) {\n\t\t\t\t\t\t\t\t\t\t\tonChange?.(value.filter((v) => v !== val));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{!item\n\t\t\t\t\t\t\t\t\t\t? val\n\t\t\t\t\t\t\t\t\t\t: (item.display ?? (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{item.icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t<div className=\"flex w-3 justify-center text-sm text-muted\">\n\t\t\t\t\t\t\t\t\t\t<Icon icon={minSelection === 1 ? faCheck : faTimes} />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</SelectListItem>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{filteredSelectedValues.length > numValuesToShow && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\t\tvariant=\"label\"\n\t\t\t\t\t\t\t\tonClick={() => setShowAllValues((prev) => !prev)}\n\t\t\t\t\t\t\t\tclassName=\"cursor-pointer px-2 py-1 text-indigo-600\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{showAllValues ? \"Show less\" : `Show ${filteredSelectedValues.length - numValuesToShow} more selected`}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{(filteredSelectedValues.length > 0 || onSelectAll) && (\n\t\t\t\t\t<li className=\"py-0.5\">\n\t\t\t\t\t\t<hr className=\"h-px bg-surface-dark\" />\n\t\t\t\t\t</li>\n\t\t\t\t)}\n\t\t\t</SortableContext>\n\t\t</DndContext>\n\t);\n};\n","import { faChevronDown } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"@/core/icon\";\n\n/**\n * The small downward chevron used to mark dropdown/select triggers.\n *\n * A fixed-size, muted decorative icon with no props — place it inside a custom trigger to match the\n * design system's dropdown affordance.\n *\n * @example\n * <button className=\"flex items-center gap-1\">\n * {label}\n * <DropdownChevron />\n * </button>\n */\nexport const DropdownChevron = () => {\n\treturn (\n\t\t<div className={twJoin(\"w-3 text-sm text-muted\")}>\n\t\t\t<Icon icon={faChevronDown} />\n\t\t</div>\n\t);\n};\n","import { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { faGripDotsVertical } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\n\nexport type SelectListItemProps = {\n\tsortableId?: string | number;\n\tchildren?: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tfocused?: boolean;\n};\n\n/**\n * An item rendered in a Select dropdown. Does not necessarily correspond to an option.\n * @param param0\n * @returns\n */\nexport const SelectListItem = ({\n\tsortableId,\n\tchildren,\n\tonClick,\n\tdisabled = false,\n\tfocused = false,\n}: SelectListItemProps) => {\n\tconst { setNodeRef, listeners, attributes, transform, transition } = useSortable({ id: sortableId ?? \"\" });\n\n\tconst containerRef = useRef<HTMLLIElement | null>(null);\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\t// scroll into view when focused\n\t\t// ensures that if the user uses the keyboard to navigate the dropdown, the selected item is always visible\n\t\tif (focused && containerRef.current) {\n\t\t\tcontainerRef.current.scrollIntoView({ block: \"nearest\", inline: \"nearest\", behavior: \"smooth\" });\n\t\t}\n\t}, [focused]);\n\n\treturn (\n\t\t<li\n\t\t\tref={(ref) => {\n\t\t\t\tsetNodeRef(ref);\n\t\t\t\tcontainerRef.current = ref;\n\t\t\t}}\n\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"flex w-full items-center gap-2 rounded-lg px-2 py-1.5\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"cursor-not-allowed text-placeholder\"\n\t\t\t\t\t: \"cursor-pointer transition-colors duration-150 hover:bg-surface-neutral\",\n\t\t\t\tfocused && \"bg-surface-neutral\",\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\ttransform: CSS.Transform.toString(transform),\n\t\t\t\ttransition,\n\t\t\t}}\n\t\t\t{...attributes}\n\t\t>\n\t\t\t{sortableId && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"cursor-grab font-medium active:cursor-grabbing\"\n\t\t\t\t\t{...listeners}\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\t\tlisteners?.onClick(e);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Icon icon={faGripDotsVertical} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"flex w-full flex-1 items-center justify-between\">{children}</div>\n\t\t</li>\n\t);\n};\n","import { AsyncMultiSelect } from \"./AsyncMultiSelect\";\nimport { AsyncSelectProps } from \"./props\";\n\n/**\n * Thin wrapper around AsyncMultiSelect that only allows a single value to be selected.\n */\nexport const AsyncSelect = <T extends string | number>({\n\tvalue,\n\tonChange,\n\tallowUnselect = false,\n\t...rest\n}: AsyncSelectProps<T>) => {\n\tconst multiValue = value ? [value] : [];\n\treturn (\n\t\t<AsyncMultiSelect\n\t\t\tminSelection={allowUnselect ? 0 : 1}\n\t\t\tmaxSelection={1}\n\t\t\tvalue={multiValue}\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tonChange={(val) => onChange?.(val[0])}\n\t\t\t{...rest}\n\t\t/>\n\t);\n};\n","import { useMemo, useState } from \"react\";\n\nimport { AsyncMultiSelect } from \"./AsyncMultiSelect\";\nimport { MultiSelectProps } from \"./props\";\nimport { doesSelectItemMatch } from \"./selectItem\";\n\n/**\n * Thin wrapper around AsyncMultiSelect that does not support asynchronous loading, and\n * assumes all available options are provided in the `options` prop.\n */\nexport const MultiSelect = <T extends string | number>({\n\tvalue,\n\titems: options,\n\tonSearchChange,\n\tcustomValueToOption,\n\t...rest\n}: MultiSelectProps<T>) => {\n\tconst [query, setQuery] = useState(\"\");\n\tconst optionsForValues = useMemo(\n\t\t() =>\n\t\t\tvalue?.map((val) => {\n\t\t\t\tconst option = options.find((opt) => opt.value === val);\n\t\t\t\tif (option) return option;\n\t\t\t\tif (!customValueToOption) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: val,\n\t\t\t\t\t\tlabel: val.toString(),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn customValueToOption(val as string);\n\t\t\t}) ?? [],\n\t\t[customValueToOption, options, value],\n\t);\n\tconst optionsMatchingQuery = useMemo(\n\t\t() => options.filter((option) => doesSelectItemMatch(option, query)),\n\t\t[query, options],\n\t);\n\n\treturn (\n\t\t<AsyncMultiSelect\n\t\t\tvalue={value}\n\t\t\titems={[...optionsForValues, ...optionsMatchingQuery]}\n\t\t\tonSearchChange={(q) => {\n\t\t\t\tsetQuery(q);\n\t\t\t\tonSearchChange?.(q);\n\t\t\t}}\n\t\t\t{...rest}\n\t\t/>\n\t);\n};\n","import { MultiSelect } from \"./MultiSelect\";\nimport { SelectProps } from \"./props\";\n\n/**\n * Thin wrapper around MultiSelect that only allows a single value to be selected.\n */\nexport function Select<T extends string | number>({ value, onChange, allowUnselect, ...rest }: SelectProps<T>) {\n\t// Specifically allowing 0 as a valid value here\n\tconst multivalue = value || value === 0 ? [value] : [];\n\treturn (\n\t\t<MultiSelect\n\t\t\tvalue={multivalue}\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tonChange={(val) => onChange?.(val[0])}\n\t\t\tminSelection={allowUnselect ? 0 : 1}\n\t\t\tmaxSelection={1}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n","import { MultiSelect } from \"./MultiSelect\";\nimport { SelectWithUnselectProps } from \"./props\";\n\n/**\n * Thin wrapper around MultiSelect that only allows a single value to be selected.\n */\nexport function SelectWithUnselect<T extends string | number>({\n\tvalue,\n\tonChange,\n\t...rest\n}: SelectWithUnselectProps<T>) {\n\t// Specifically allowing 0 as a valid value here\n\tconst multivalue = value || value === 0 ? [value] : [];\n\treturn (\n\t\t<MultiSelect\n\t\t\tvalue={multivalue}\n\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\tonChange={(val) => onChange?.(val[0] ?? null)}\n\t\t\tminSelection={0}\n\t\t\tmaxSelection={1}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n","import { ControlledFormItem } from \"@/core/form/components/ControlledFormItem\";\nimport { Select, SelectProps, SelectValue } from \"@/core/select\";\n\nimport { SharedFormItemProps } from \"./form-item\";\nimport { CommonSelectProps, SharedFormControlProps } from \"./types\";\n\nexport type FormSelectProps<TValue extends SelectValue> = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<SelectProps<TValue>, CommonSelectProps | \"loadProps\" | \"triggerPlaceholder\">;\n\n/**\n * Single-select bound to a named field of the surrounding form.\n *\n * Reads and writes the field's selected value and surfaces its validation error. Forwards\n * select-level props such as `loadProps` and `triggerPlaceholder` to the underlying {@link Select}.\n */\nexport const FormSelect = <TValue extends SelectValue>({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tonChange,\n\t...rest\n}: FormSelectProps<TValue>) => {\n\treturn (\n\t\t<ControlledFormItem<TValue>\n\t\t\tname={name}\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={(field) => (\n\t\t\t\t<Select\n\t\t\t\t\t{...rest}\n\t\t\t\t\tvalue={field.value}\n\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\tonChange?.(value);\n\t\t\t\t\t}}\n\t\t\t\t\thasError={!!field.error}\n\t\t\t\t/>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { ControlledFormItem } from \"@/core/form/components/ControlledFormItem\";\nimport { MultiSelect, MultiSelectProps, SelectValue } from \"@/core/select\";\n\nimport { SharedFormItemProps } from \"./form-item\";\nimport { CommonSelectProps, SharedFormControlProps } from \"./types\";\n\nexport type FormMultiSelectProps<TValue extends SelectValue> = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<MultiSelectProps<TValue>, CommonSelectProps | \"allowCustomValues\" | \"minSelection\" | \"maxSelection\">;\n\n/**\n * Multi-select bound to a named field of the surrounding form.\n *\n * Reads and writes the field's array of selected values and surfaces its validation error. Forwards\n * select-level props such as `allowCustomValues`, `minSelection`, and `maxSelection` to the\n * underlying {@link MultiSelect}.\n */\nexport const FormMultiSelect = <TValue extends SelectValue>({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tonChange,\n\t...rest\n}: FormMultiSelectProps<TValue>) => {\n\treturn (\n\t\t<ControlledFormItem<TValue[]>\n\t\t\tname={name}\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={(field) => (\n\t\t\t\t<MultiSelect\n\t\t\t\t\t{...rest}\n\t\t\t\t\tvalue={field.value}\n\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\tonChange?.(value);\n\t\t\t\t\t}}\n\t\t\t\t\thasError={!!field.error}\n\t\t\t\t/>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { debounce } from \"lodash-es\";\n\nimport { UncontrolledField } from \"@/core/form\";\nimport { TextArea, TextAreaProps } from \"@/core/textarea/TextArea\";\n\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormTextAreaProps = SharedFormControlProps &\n\tSharedFormItemProps &\n\tTextAreaProps & {\n\t\t/** Debounce interval in milliseconds for change events. When set, `onChange` fires at most once per interval. */\n\t\tdebounce?: number;\n\t};\n\n/**\n * Multi-line text input bound to a named field of the surrounding form.\n *\n * Registers an uncontrolled field and surfaces its validation error. When `debounce` is set, change\n * events written back to the field are debounced by that many milliseconds.\n */\nexport const FormTextArea = ({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\toptions,\n\tdebounce: debounceInterval,\n\t...rest\n}: FormTextAreaProps) => (\n\t<UncontrolledField\n\t\tname={name}\n\t\trender={({ error, register }) => {\n\t\t\tconst controlFields = register();\n\t\t\treturn (\n\t\t\t\t<FormItem\n\t\t\t\t\tlayout={layout}\n\t\t\t\t\tstyles={styles}\n\t\t\t\t\tlabel={label}\n\t\t\t\t\toptions={options}\n\t\t\t\t\trender={\n\t\t\t\t\t\t<TextArea\n\t\t\t\t\t\t\t{...controlFields}\n\t\t\t\t\t\t\thasError={!!error || undefined}\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\tonChange={debounceInterval ? debounce(controlFields.onChange, debounceInterval) : controlFields.onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\terror={error}\n\t\t\t\t/>\n\t\t\t);\n\t\t}}\n\t/>\n);\n","import { forwardRef, TextareaHTMLAttributes } from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { ErrorText } from \"../error-text/ErrorText\";\nimport { ErrorProps } from \"../types\";\n\n/**\n * Props for {@link TextArea}: all native `<textarea>` attributes (`value`, `onChange`, `rows`,\n * `disabled`, …) plus the design-system error props (`hasError`, `errorNode`).\n */\nexport type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & Simplify<ErrorProps>;\n\n/**\n * The styled `<textarea>` on its own, without the error-text affordance.\n *\n * Prefer {@link TextArea} in forms; reach for this when you render error messaging yourself.\n */\nexport const TextAreaComp = forwardRef<HTMLTextAreaElement, TextAreaProps>(({ className, hasError, ...rest }, ref) => {\n\tconst ringClassName = rest.disabled\n\t\t? \"focus:outline-hidden focus:ring-0\"\n\t\t: hasError\n\t\t\t? \"focus:outline-hidden focus:ring-red-500 focus:border-red-500\"\n\t\t\t: \"focus:ring-2 focus:ring-indigo-200\";\n\n\treturn (\n\t\t<textarea\n\t\t\t{...rest}\n\t\t\tclassName={twMerge(\n\t\t\t\t\"block w-full resize-none rounded-md shadow-sm disabled:bg-surface-neutral\",\n\t\t\t\thasError\n\t\t\t\t\t? \"border-red-300 text-red-900 placeholder-red-300\"\n\t\t\t\t\t: \"border-surface-neutral placeholder-gray-400 focus:border-indigo-400\",\n\t\t\t\tringClassName,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tref={ref}\n\t\t/>\n\t);\n});\n\n/**\n * A multi-line text input with built-in error messaging.\n *\n * Renders a styled `<textarea>` (controlled or uncontrolled via native props) and, when `hasError`\n * is set, displays `errorNode` beneath it. The `ref` forwards to the textarea element.\n *\n * @example\n * <TextArea\n * value={notes}\n * onChange={(e) => setNotes(e.target.value)}\n * hasError={!!error}\n * errorNode={error}\n * />\n */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(({ hasError, errorNode, ...rest }, ref) => (\n\t<>\n\t\t<TextAreaComp {...rest} hasError={hasError} ref={ref} />\n\t\t{hasError && <ErrorText className=\"mt-2 text-sm\">{errorNode}</ErrorText>}\n\t</>\n));\n","import { twJoin } from \"tailwind-merge\";\n\nimport { ControlledField } from \"@/core/form\";\nimport { ControlledFormItem } from \"@/core/form/components/ControlledFormItem\";\nimport { Switch } from \"@/core/switch\";\n\nimport { SharedFormItemProps } from \"./form-item\";\nimport { FieldDescription } from \"./form-item/FieldDescription\";\nimport { FieldErrorMessage } from \"./form-item/FieldErrorMessage\";\nimport { FieldLabelWithTooltip } from \"./form-item/FieldLabelWithTooltip\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormSwitchProps = SharedFormControlProps & SharedFormItemProps & { onChange?: (value: boolean) => void };\n\n/**\n * Toggle switch bound to a named field of the surrounding form.\n *\n * Reads and writes the field's boolean value and surfaces its validation error. With the\n * `side-by-side` layout the switch sits inline beside its label, description, and error; otherwise it\n * renders within a standard form item.\n */\nexport const FormSwitch = ({ name, styles, layout, label, options, onChange, ...props }: FormSwitchProps) => {\n\tif (layout === \"side-by-side\") {\n\t\treturn (\n\t\t\t<ControlledField\n\t\t\t\tname={name}\n\t\t\t\trender={(field) => (\n\t\t\t\t\t<div className={twJoin(\"flex items-start gap-x-2\", styles)}>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tchecked={!!field.value}\n\t\t\t\t\t\t\t\tonCheckedChange={(value) => {\n\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\tonChange?.(value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"pt-1\">\n\t\t\t\t\t\t\t<FieldLabelWithTooltip label={label} options={options} />\n\t\t\t\t\t\t\t<FieldDescription styles=\"pt-0.5\">{options?.description}</FieldDescription>\n\t\t\t\t\t\t\t<FieldErrorMessage error={field.error} />\n\t\t\t\t\t\t\t{options?.bottomSlot}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ControlledFormItem<boolean>\n\t\t\tname={name}\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\trender={(field) => <Switch {...props} checked={!!field.value} onCheckedChange={field.onChange} />}\n\t\t/>\n\t);\n};\n","import * as RadixSwitch from \"@radix-ui/react-switch\";\nimport * as React from \"react\";\n\nexport type SwitchIdValue = string | undefined;\n\nconst SwitchIdContext = React.createContext<SwitchIdValue>(undefined);\nexport const useSwitchId = () => React.useContext(SwitchIdContext);\n\nconst SwitchControl = (props: Simplify<RadixSwitch.SwitchProps>) => {\n\tconst id = useSwitchId();\n\treturn (\n\t\t<RadixSwitch.Root\n\t\t\t{...props}\n\t\t\tid={id}\n\t\t\tclassName=\"flex h-5 w-9 shrink-0 items-center rounded-full bg-surface-dark focus:outline-hidden focus-visible:ring-2 focus-visible:ring-indigo-400 focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:bg-surface-neutral data-[state=checked]:bg-indigo-700\"\n\t\t>\n\t\t\t<RadixSwitch.Thumb className=\"block h-4 w-4 translate-x-0.5 rounded-full bg-white duration-100 data-disabled:shadow-none data-[state=checked]:translate-x-[18px]\" />\n\t\t</RadixSwitch.Root>\n\t);\n};\n\nconst SwitchLabel = (props: React.ComponentPropsWithoutRef<\"label\">) => {\n\tconst id = useSwitchId();\n\treturn <label {...props} htmlFor={id} />;\n};\n\n/**\n * A toggle switch, built on Radix `Switch`.\n *\n * Controlled via `checked` + `onCheckedChange` (or uncontrolled via `defaultChecked`). Render it\n * with no `children` for a bare control, or pass `children` containing {@link Switch.Control} and\n * {@link Switch.Label} to get an accessible label wired to the control automatically (a shared `id`\n * is generated and linked via `htmlFor`).\n *\n * @example Bare control\n * <Switch checked={enabled} onCheckedChange={setEnabled} />\n *\n * @example With a linked label\n * <Switch checked={enabled} onCheckedChange={setEnabled}>\n * <Switch.Control />\n * <Switch.Label>Enable notifications</Switch.Label>\n * </Switch>\n */\nexport const Switch = ({ children, className, ...rest }: Simplify<Omit<RadixSwitch.SwitchProps, \"id\">>) => {\n\tconst autoId = React.useId();\n\n\tif (children == null) {\n\t\treturn <SwitchControl {...rest} />;\n\t}\n\treturn (\n\t\t<SwitchIdContext.Provider value={autoId}>\n\t\t\t<span className={className}>{children}</span>\n\t\t</SwitchIdContext.Provider>\n\t);\n};\n\nSwitch.Control = SwitchControl;\nSwitch.Label = SwitchLabel;\n","import { forwardRef } from \"react\";\n\nimport { PropsWithClassName } from \"@/core/types\";\n\nimport { RadioButtonGroupItem, RadioButtonItem } from \"./RadioButtonItem\";\n\nexport type RadioButtonGroupProps = PropsWithClassName<{\n\t/**\n\t * The selectable options. Each item supplies its `value`, `displayValue`, and optional\n\t * `description` / `expandedContents` shown when selected.\n\t */\n\titems: RadioButtonGroupItem[];\n\n\t/** The `value` of the currently selected item (controlled). */\n\tvalue?: string | undefined;\n\t/** Called with the newly selected item's `value`. */\n\tonChange?: (newValue: string) => void;\n\n\t/**\n\t * Render each option as a bordered card instead of a plain radio row.\n\t * @default false\n\t */\n\tasCards?: boolean;\n}>;\n\n/**\n * A single-select group of radio buttons rendered inside a `<fieldset>`.\n *\n * Controlled: the selected option is whichever item's `value` matches `value`, and `onChange` fires\n * with the newly selected `value`. Options come from `items`; set `asCards` to render them as\n * bordered cards (useful when items have descriptions or expanded content).\n *\n * @example\n * <RadioButtonGroup\n * value={plan}\n * onChange={setPlan}\n * items={[\n * { value: \"monthly\", displayValue: \"Monthly\" },\n * { value: \"annual\", displayValue: \"Annual\", description: \"Save 20%\" },\n * ]}\n * />\n */\nexport const RadioButtonGroup = forwardRef<HTMLFieldSetElement, RadioButtonGroupProps>(\n\t({ className, items, onChange, value, asCards = false }, ref) => (\n\t\t<fieldset ref={ref} className={className}>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{items.map(\n\t\t\t\t\t(\n\t\t\t\t\t\t{ value: itemValue, displayValue, description, expandedContents, expandedContentsStyle, disabled },\n\t\t\t\t\t\tindex,\n\t\t\t\t\t) => (\n\t\t\t\t\t\t<RadioButtonItem\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\t\tisChecked={value === itemValue}\n\t\t\t\t\t\t\tvalue={itemValue}\n\t\t\t\t\t\t\tdisplayValue={displayValue}\n\t\t\t\t\t\t\tdescription={description}\n\t\t\t\t\t\t\texpandedContents={expandedContents}\n\t\t\t\t\t\t\texpandedContentsStyle={expandedContentsStyle}\n\t\t\t\t\t\t\tasCard={asCards}\n\t\t\t\t\t\t/>\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</fieldset>\n\t),\n);\n","import { twJoin } from \"tailwind-merge\";\n\nexport type RadioButtonGroupItem = {\n\tvalue: string;\n\tdisplayValue: string;\n\tdescription?: string | React.ReactNode;\n\texpandedContents?: (isDisabled: boolean) => React.ReactNode;\n\texpandedContentsStyle?: \"inline\" | \"block\";\n\tdisabled?: boolean;\n};\n\nexport type RadioButtonItemProps = RadioButtonGroupItem & {\n\tisChecked: boolean;\n\tonSelect?: (value: string) => void;\n\tasCard?: boolean;\n};\n\nexport const RadioButtonItem = ({\n\tvalue,\n\tdisplayValue,\n\tdescription,\n\texpandedContents,\n\texpandedContentsStyle,\n\tdisabled,\n\tisChecked,\n\tonSelect,\n\tasCard = false,\n}: RadioButtonItemProps) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex flex-col gap-2\",\n\t\t\tasCard && \"rounded-md border px-3 py-2\",\n\t\t\tasCard && !isChecked && \"border-surface-neutral\",\n\t\t\tasCard && isChecked && \"border-indigo-500\",\n\t\t)}\n\t>\n\t\t<div\n\t\t\tclassName={twJoin(\n\t\t\t\t\"relative flex gap-2\",\n\t\t\t\tdisabled && \"cursor-not-allowed opacity-30 *:cursor-not-allowed\",\n\t\t\t\texpandedContentsStyle === \"inline\" ? \"items-center\" : \"items-start\",\n\t\t\t)}\n\t\t>\n\t\t\t<input\n\t\t\t\tonChange={(evt) => onSelect?.(evt.target.value)}\n\t\t\t\tid={value}\n\t\t\t\tvalue={value}\n\t\t\t\tchecked={isChecked}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttype=\"radio\"\n\t\t\t\tclassName=\"mt-px border-surface-neutral p-2 text-indigo-700 ring-0 ring-indigo-700\"\n\t\t\t/>\n\t\t\t{expandedContentsStyle === \"inline\" ? (\n\t\t\t\t<label htmlFor={value} className=\"flex w-full flex-row gap-2.5\">\n\t\t\t\t\t<div className=\"flex w-9/12 items-center gap-2\">\n\t\t\t\t\t\t<div className=\"font-medium\">{displayValue}</div>\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<div id={`${value}-description`} className=\"text-muted\">\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex w-3/12 items-center\">{expandedContents?.(!isChecked || !!disabled)}</div>\n\t\t\t\t</label>\n\t\t\t) : (\n\t\t\t\t<label htmlFor={value} className=\"flex flex-col gap-2\">\n\t\t\t\t\t<div className=\"font-medium\">{displayValue}</div>\n\t\t\t\t</label>\n\t\t\t)}\n\t\t</div>\n\t\t{expandedContentsStyle !== \"inline\" && (\n\t\t\t<>\n\t\t\t\t{description && (\n\t\t\t\t\t<div id={`${value}-description`} className=\"text-muted\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{expandedContents?.(!isChecked || !!disabled)}\n\t\t\t</>\n\t\t)}\n\t</div>\n);\n","import { ControlledField } from \"@/core/form\";\nimport { RadioButtonGroup, RadioButtonGroupProps } from \"@/core/radio-button-group\";\n\nimport { FieldErrorMessage } from \"./form-item/FieldErrorMessage\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormRadioButtonGroupProps = Simplify<\n\tPick<SharedFormControlProps, \"name\"> & Pick<RadioButtonGroupProps, \"items\" | \"onChange\" | \"className\" | \"asCards\">\n>;\n\n/**\n * Radio button group bound to a named field of the surrounding form.\n *\n * Reads and writes the field's selected value and surfaces its validation error. Forwards\n * group-level props such as `items`, `className`, and `asCards` to the underlying\n * {@link RadioButtonGroup}.\n */\nexport const FormRadioButtonGroup = ({\n\tname,\n\titems,\n\tonChange,\n\tasCards = false,\n\tclassName,\n}: FormRadioButtonGroupProps) => (\n\t<ControlledField\n\t\tname={name}\n\t\trender={(field) => (\n\t\t\t<>\n\t\t\t\t<RadioButtonGroup\n\t\t\t\t\t{...field}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\titems={items}\n\t\t\t\t\tonChange={(newValue) => {\n\t\t\t\t\t\tfield.onChange(newValue);\n\t\t\t\t\t\tonChange?.(newValue);\n\t\t\t\t\t}}\n\t\t\t\t\tasCards={asCards}\n\t\t\t\t/>\n\t\t\t\t<FieldErrorMessage error={field.error} />\n\t\t\t</>\n\t\t)}\n\t/>\n);\n","import { useCallback } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { DatePicker, DatePickerProps } from \"@/core/date-picker/DatePicker\";\nimport { useControlledFormField } from \"@/core/form\";\n\nimport { FormItem, SharedFormItemProps } from \"./form-item\";\nimport { SharedFormControlProps } from \"./types\";\n\nexport type FormDatePickerProps = SharedFormControlProps &\n\tSharedFormItemProps &\n\tPick<DatePickerProps, \"placeholder\" | \"minDate\" | \"range\" | \"onChange\" | \"maxDate\" | \"showTimeInput\"> & {\n\t\t/** Ref forwarded to the field's container element. */\n\t\tcontainerRef?: React.RefObject<HTMLDivElement>;\n\t};\n\n/**\n * Date picker bound to a named field of the surrounding form.\n *\n * Reads and writes the field's date value and surfaces its validation error. An empty selection is\n * normalised to `null` before being written back to the field.\n */\nexport const FormDatePicker = ({\n\tname,\n\tstyles,\n\tlayout,\n\tlabel,\n\tonChange,\n\toptions,\n\tcontainerRef,\n\tdisabled,\n\t...rest\n}: FormDatePickerProps) => {\n\tconst {\n\t\tonChange: onChangeInternal,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tvalue,\n\t\terror,\n\t} = useControlledFormField({ name });\n\n\t// TODO: This is a hack to get around the fact that the date picker doesn't support null values\n\tconst handleChange = useCallback(\n\t\t(newValue: any) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tonChange?.(newValue ?? null);\n\t\t\tonChangeInternal(newValue ?? null);\n\t\t},\n\t\t[onChangeInternal, onChange],\n\t);\n\n\treturn (\n\t\t<FormItem\n\t\t\tlayout={layout}\n\t\t\tstyles={styles}\n\t\t\tlabel={label}\n\t\t\toptions={options}\n\t\t\tref={containerRef}\n\t\t\trender={\n\t\t\t\t<div className={twJoin(disabled && \"text-muted\")}>\n\t\t\t\t\t<DatePicker\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\thasError={!!error}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\terror={error}\n\t\t/>\n\t);\n};\n","import { forwardRef, Suspense, useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { LoadingState } from \"../loaders\";\nimport { DrawerStateContext } from \"./drawerState\";\nimport { PersistDrawerWidth, useDrawerResize } from \"./useDrawerResize\";\n\nconst useKeypress = (key: string, action: () => void) => {\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst onKeyup = (e: KeyboardEvent) => {\n\t\t\tif (e.key === key) action();\n\t\t};\n\t\tdocument.addEventListener(\"keyup\", onKeyup);\n\t\treturn () => document.removeEventListener(\"keyup\", onKeyup);\n\t}, [action, key]);\n};\n\nexport const drawerSizes = {\n\tsm: 1 / 2,\n\tmd: 3 / 4,\n\tlg: 5 / 6,\n};\n\nexport type DrawerProps = {\n\t/** Whether the drawer is open. Controlled — the drawer never closes itself. */\n\tisOpen: boolean;\n\t/** Called when the user requests close (pressing `Escape`). */\n\tonClose?: () => void;\n\t/** Called when the user clicks the overlay outside the drawer. */\n\tonClickOutside?: () => void;\n\t/** Renders a blurred, click-blocking overlay behind the drawer while open. */\n\tblurredOverlay?: boolean;\n\t/**\n\t * Initial drawer width as a fraction of the viewport: `sm` (½), `md` (¾), `lg` (⅚).\n\t * The user can drag the left edge to resize.\n\t * @default md\n\t */\n\twidth?: keyof typeof drawerSizes;\n\t/** Persist the user's resized width (e.g. to localStorage) across opens. */\n\tpersistWidth?: PersistDrawerWidth;\n\t/** Drawer contents. Rendered lazily (inside `Suspense`) only while open. */\n\tchildren: React.ReactNode;\n};\n\n/**\n * A resizable panel that slides in from the right edge of its positioned container.\n *\n * Controlled via `isOpen`; closing is up to the caller (`onClose` fires on `Escape`,\n * `onClickOutside` on overlay clicks). The user can drag the left edge to resize, and\n * `persistWidth` remembers that choice. Children mount lazily under `Suspense` (with a loading\n * fallback) and only while open, so heavy content isn't rendered when the drawer is closed.\n *\n * @example\n * <Drawer isOpen={isOpen} onClose={close} onClickOutside={close} width=\"lg\" blurredOverlay>\n * <DrawerContents />\n * </Drawer>\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(\n\t({ isOpen, onClose, onClickOutside, blurredOverlay, children, width = \"md\", persistWidth }, ref) => {\n\t\tconst slider = useRef<HTMLDivElement>(null);\n\t\tconst drawer = useRef<HTMLDivElement>(null);\n\t\tuseDrawerResize({\n\t\t\tslider,\n\t\t\tdrawer,\n\t\t\tisOpen,\n\t\t\tdefaultSizePct: drawerSizes[width],\n\t\t\tpersistWidth,\n\t\t});\n\n\t\tuseKeypress(\"Escape\", () => {\n\t\t\tonClose?.();\n\t\t});\n\n\t\treturn (\n\t\t\t<DrawerStateContext.Provider\n\t\t\t\tvalue={{\n\t\t\t\t\tisOpen,\n\t\t\t\t\tonClose: () => onClose?.(),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"absolute inset-0 z-30 transition-all\",\n\t\t\t\t\t\tisOpen && blurredOverlay && \"bg-surface-light/10 backdrop-blur-sm\",\n\t\t\t\t\t\t// If the drawer is open, and the blurredOverlay prop is given, stop the user from clicking through the overlay\n\t\t\t\t\t\tisOpen && blurredOverlay ? \"pointer-events-auto\" : \"pointer-events-none\",\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={onClickOutside}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tref={slider}\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"group absolute top-0 bottom-0 z-50 h-screen w-4 translate-x-1/2 cursor-col-resize\",\n\t\t\t\t\t\tisOpen ? \"block\" : \"hidden\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"absolute top-0 right-1.5 bottom-0 left-1.5 bg-indigo-700 opacity-0 transition-opacity group-hover:opacity-100\" />\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\t// width transition div\n\t\t\t\t\tclassName=\"absolute top-0 right-0 bottom-0 z-drawer flex flex-col overflow-y-hidden bg-surface-light shadow\"\n\t\t\t\t\tref={drawer}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t// delayed opacity transition div\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"relative flex w-full flex-1 flex-col overflow-hidden bg-white transition-all delay-100 duration-100 ease-in-out\",\n\t\t\t\t\t\t\tisOpen ? \"opacity-100\" : \"opacity-0\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isOpen ? <Suspense fallback={<LoadingState />}>{children}</Suspense> : undefined}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DrawerStateContext.Provider>\n\t\t);\n\t},\n);\n","import { SizeProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinnerThird } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport type LoaderProps = {\n\t/** Additional classes, e.g. to override the color. */\n\tclassName?: string;\n\t/** Font Awesome size token (e.g. `\"sm\"`, `\"lg\"`, `\"2x\"`). */\n\tsize?: SizeProp;\n};\n\n/**\n * A simple spinning loading indicator (a rotating Font Awesome spinner icon).\n *\n * Inline by default; size it with `size`. For a centered spinner with\n * optional text, use {@link LoadingState}.\n *\n * @example\n * <Spinner size=\"lg\" />\n */\nexport const Spinner = ({ className, ...props }: LoaderProps) => (\n\t<FontAwesomeIcon {...props} className={twJoin(\"animate-spin text-muted\", className)} icon={faSpinnerThird} />\n);\n","import { SizeProp } from \"@fortawesome/fontawesome-svg-core\";\n\nimport { Text } from \"@/core/text/Text\";\n\nimport { Spinner } from \"./Spinner\";\n\nexport type LoadingStateProps = {\n\t/**\n\t * Spinner size (Font Awesome token).\n\t * @default 2x\n\t */\n\tsize?: SizeProp;\n\t/** Optional heading shown beneath the spinner. */\n\ttitle?: React.ReactNode;\n\t/** Optional supporting text shown beneath the title. */\n\tdescription?: React.ReactNode;\n};\n\nconst LoadingStateTemplate = ({ children }: { children?: React.ReactNode }) => (\n\t<div className=\"inset-0 z-10 flex h-full items-center justify-center\">{children}</div>\n);\n\n/**\n * A centered spinner with optional title/description that fills its container.\n *\n * The standard \"loading a whole view/section\" indicator (e.g. as a `Suspense` fallback or while a\n * page's primary query loads). For an inline spinner alone, use {@link Spinner}.\n *\n * @example\n * <Suspense fallback={<LoadingState title=\"Loading patients…\" />}>\n * <PatientList />\n * </Suspense>\n */\nexport const LoadingState = ({ size = \"2x\", title, description }: LoadingStateProps) => (\n\t<LoadingStateTemplate>\n\t\t<div className=\"flex flex-col items-center justify-center gap-3\">\n\t\t\t<Spinner size={size} />\n\t\t\t{(title || description) && (\n\t\t\t\t<div className=\"flex max-w-prose flex-col text-center\">\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<Text variant=\"title-3\" className=\"text-muted\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{description && (\n\t\t\t\t\t\t<Text variant=\"footnote\" className=\"leading-5 text-muted\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t</LoadingStateTemplate>\n);\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type LoadingBarProps = {\n\t/** Class name for the bar track, e.g. to set height or position. */\n\tclassName?: string;\n};\n\n/**\n * An indeterminate progress bar — a shimmer sliding across a full-width track.\n *\n * Use it to signal background activity of unknown duration (e.g. refetching a table). For a\n * blocking, centered loading view use {@link LoadingState}.\n *\n * @example\n * {isFetching && <LoadingBar className=\"h-1\" />}\n */\nexport const LoadingBar = ({ className }: LoadingBarProps) => (\n\t<div className={twMerge(\"relative h-3 w-full overflow-hidden rounded-full bg-surface-neutral\", className)}>\n\t\t<div\n\t\t\tclassName=\"absolute inset-0 w-full animate-loading-slide bg-linear-to-r from-transparent via-indigo-400/60 to-transparent\"\n\t\t\tstyle={{ width: \"50%\" }}\n\t\t/>\n\t</div>\n);\n","import { Text } from \"@/core/text/Text\";\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type TwoCirclesSpinnerProps = {\n\t/** Class name for the wrapper. */\n\tclassName?: string;\n\t/**\n\t * Spinner diameter.\n\t * @default md\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/** Optional heading shown beneath the spinner. */\n\ttitle?: React.ReactNode;\n\t/** Optional supporting text shown beneath the title. */\n\tdescription?: React.ReactNode;\n};\n\nconst sizeConfig = {\n\tsm: { className: \"w-[30px] h-[30px]\", strokeWidth: 8 },\n\tmd: { className: \"w-[50px] h-[50px]\", strokeWidth: 5 },\n\tlg: { className: \"w-[100px] h-[100px]\", strokeWidth: 3 },\n\txl: { className: \"w-[200px] h-[200px]\", strokeWidth: 2 },\n};\n\nconst SpinnerSvg = ({ size = \"md\" }: { size?: TwoCirclesSpinnerProps[\"size\"] }) => {\n\tconst { className: sizeClass, strokeWidth } = sizeConfig[size];\n\n\treturn (\n\t\t<div className={twMerge(\"relative\", sizeClass)}>\n\t\t\t<svg className=\"absolute inset-0 animate-orbit-large\" viewBox=\"0 0 100 100\" fill=\"none\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M 95 50 A 45 45 0 0 1 5 50\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName=\"text-indigo-600\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t<svg className=\"absolute inset-0 animate-orbit-small\" viewBox=\"0 0 100 100\" fill=\"none\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M 75 50 A 25 25 0 0 1 25 50\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName=\"text-gray-200\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t);\n};\n\n/**\n * A two-ring orbital loading animation with optional title/description.\n *\n * A more prominent, branded alternative to {@link LoadingState} for full-screen or marketing-style\n * loading moments. Two concentric arcs counter-rotate; `size` scales the whole indicator.\n *\n * @example\n * <TwoCirclesSpinner size=\"lg\" title=\"Setting things up…\" />\n */\nexport const TwoCirclesSpinner = ({ className, size = \"md\", title, description }: TwoCirclesSpinnerProps) => (\n\t<div className={twMerge(\"flex flex-col items-center justify-center gap-3\", className)}>\n\t\t<SpinnerSvg size={size} />\n\t\t{(title || description) && (\n\t\t\t<div className=\"flex max-w-prose flex-col text-center\">\n\t\t\t\t{title && (\n\t\t\t\t\t<Text variant=\"title-3\" className=\"text-muted\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{description && (\n\t\t\t\t\t<Text variant=\"footnote\" className=\"leading-5 text-muted\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)}\n\t</div>\n);\n","import { createContext, useContext } from \"react\";\n\nexport type DrawerState = {\n\tisOpen: boolean;\n\tonClose: () => void;\n};\n\nexport const DrawerStateContext = createContext<DrawerState>({\n\tisOpen: false,\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\tonClose: () => {},\n});\n\nexport const useDrawer = () => {\n\tconst context = useContext(DrawerStateContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\"useDrawer must be used within a DrawerStateContext\");\n\t}\n\treturn context;\n};\n","import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nconst MIN_LEFT_SPACE = 240; // minimum space the drawer should allow on the left side of the screen, should be at least as big as sidebar\nconst MIN_WIDTH_PCT = 0.5;\nconst MIN_WIDTH_PX = 500;\n\nexport type UseDrawerResizeParams = {\n\tslider: RefObject<HTMLDivElement>;\n\tdrawer: RefObject<HTMLDivElement>;\n\tisOpen: boolean;\n\tdefaultSizePct: number;\n\tpersistWidth?: PersistDrawerWidth;\n};\n\nexport type PersistDrawerWidth = {\n\tload: () => number | undefined;\n\tsave: (widthPct: number) => void;\n};\n\nconst constraintPct = (val: number) => Math.min(1, Math.max(0, val));\nexport const localStoragePersist = (key: string): PersistDrawerWidth => ({\n\tload: () => {\n\t\ttry {\n\t\t\tconst val = localStorage.getItem(key);\n\t\t\tif (val && !Number.isNaN(Number(val))) {\n\t\t\t\treturn constraintPct(Number(val));\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t},\n\tsave: (size: number) => {\n\t\ttry {\n\t\t\tlocalStorage.setItem(key, constraintPct(size).toString());\n\t\t} catch {\n\t\t\t// do nothing\n\t\t}\n\t},\n});\n\nconst computeWidth = (pct: number) => window.innerWidth * pct;\nconst computePct = (widthPx: number) => widthPx / window.innerWidth;\n\nconst constrainedWidth = (width: number) => {\n\tconst minWidth = Math.max(window.innerWidth * MIN_WIDTH_PCT, MIN_WIDTH_PX);\n\tconst maxWidth = window.innerWidth - MIN_LEFT_SPACE;\n\treturn Math.min(Math.max(width, minWidth), maxWidth);\n};\n\nexport const useDrawerResize = ({ slider, drawer, isOpen, defaultSizePct, persistWidth }: UseDrawerResizeParams) => {\n\tconst widthPx = useRef(computeWidth(defaultSizePct));\n\n\tconst toggleOpen = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (slider.current && drawer.current) {\n\t\t\t\tdrawer.current.style.transition = `right 200ms ease-out, opacity 200ms`;\n\t\t\t\tslider.current.style.right = open ? `${widthPx.current}px` : \"0\";\n\t\t\t\tdrawer.current.style.right = open ? \"0\" : `-200px`;\n\t\t\t\tdrawer.current.style.opacity = open ? \"1\" : \"0\";\n\t\t\t\tdrawer.current.style.pointerEvents = open ? \"auto\" : \"none\";\n\t\t\t}\n\t\t},\n\t\t[drawer, slider],\n\t);\n\tconst setWidth = useCallback(\n\t\t(width: number) => {\n\t\t\twidthPx.current = width;\n\t\t\tif (slider.current && drawer.current) {\n\t\t\t\t// eslint-disable-next-line react-compiler/react-compiler\n\t\t\t\tdrawer.current.style.transition = \"none\";\n\t\t\t\tslider.current.style.right = `${width}px`;\n\t\t\t\tdrawer.current.style.width = `${width}px`;\n\t\t\t}\n\t\t\tif (width !== 0) {\n\t\t\t\tpersistWidth?.save?.(computePct(width));\n\t\t\t}\n\t\t},\n\t\t[drawer, persistWidth, slider],\n\t);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (slider.current) {\n\t\t\tconst onPointerDown = (e: PointerEvent) => {\n\t\t\t\tdocument.body.style.userSelect = \"none\";\n\t\t\t\tconst startX = e.clientX;\n\t\t\t\tconst startWidth = widthPx.current;\n\t\t\t\tconst onPointerMove = (evt: PointerEvent) => {\n\t\t\t\t\tconst newWidth = startWidth + (startX - evt.clientX);\n\t\t\t\t\tsetWidth(constrainedWidth(newWidth));\n\t\t\t\t};\n\t\t\t\tconst onPointerUp = () => {\n\t\t\t\t\tdocument.body.style.userSelect = \"auto\";\n\t\t\t\t\twindow.removeEventListener(\"pointermove\", onPointerMove);\n\t\t\t\t\twindow.removeEventListener(\"pointerup\", onPointerUp);\n\t\t\t\t};\n\t\t\t\twindow.addEventListener(\"pointermove\", onPointerMove);\n\t\t\t\twindow.addEventListener(\"pointerup\", onPointerUp);\n\t\t\t};\n\t\t\tconst sliderNode = slider.current;\n\t\t\tsliderNode.addEventListener(\"pointerdown\", onPointerDown);\n\t\t\treturn () => {\n\t\t\t\tsliderNode.removeEventListener(\"pointerdown\", onPointerDown);\n\t\t\t};\n\t\t}\n\t}, [setWidth, slider]);\n\n\tconst loadWidth = useCallback(() => {\n\t\tif (!isOpen) {\n\t\t\ttoggleOpen(false);\n\t\t} else {\n\t\t\tconst savedWidthPct = persistWidth?.load?.();\n\t\t\tconst width = savedWidthPct ? constrainedWidth(computeWidth(savedWidthPct)) : computeWidth(defaultSizePct);\n\t\t\tsetWidth(width);\n\t\t\ttoggleOpen(true);\n\t\t}\n\t}, [defaultSizePct, isOpen, toggleOpen, persistWidth, setWidth]);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (slider.current && drawer.current) {\n\t\t\tloadWidth();\n\t\t}\n\t}, [slider, drawer, loadWidth]);\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\twindow.addEventListener(\"resize\", loadWidth);\n\t\treturn () => window.removeEventListener(\"resize\", loadWidth);\n\t}, [loadWidth]);\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { faBookmark, faChevronDown, faChevronUp, faClose } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Text } from \"@/core/text\";\n\nimport { Button } from \"../button\";\nimport { Icon } from \"../icon\";\nimport { Skeleton } from \"../skeleton\";\nimport { useDrawer } from \"./drawerState\";\n\nexport type DrawerHeaderProps = {\n\tresource?: {\n\t\ticon?: IconDefinition;\n\t\tname: string;\n\t};\n\tpagination?: {\n\t\thasNext: boolean;\n\t\thasPrevious: boolean;\n\t\tonNext: () => void;\n\t\tonPrevious: () => void;\n\t\textra?: React.ReactNode;\n\t};\n\ttitle: React.ReactNode;\n\tsubtitle?: React.ReactNode;\n\tactions?: React.ReactNode;\n\tlabel?: React.ReactNode;\n\tcloseAction?: React.ReactNode;\n};\n\nexport const DrawerHeader = ({\n\tresource,\n\tpagination,\n\ttitle,\n\tsubtitle,\n\tactions,\n\tcloseAction,\n\tlabel,\n}: DrawerHeaderProps) => {\n\tconst { onClose } = useDrawer();\n\treturn (\n\t\t<div className=\"z-1 flex w-full flex-col items-stretch shadow\">\n\t\t\t<div className=\"flex justify-between px-8 py-1 shadow-sm\">\n\t\t\t\t<div className=\"flex items-center gap-1.5 text-base text-muted\">\n\t\t\t\t\t{resource && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Icon icon={resource.icon || faBookmark} />\n\t\t\t\t\t\t\t<div>{resource.name}</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{pagination && (\n\t\t\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t\t\t{pagination.extra}\n\t\t\t\t\t\t\t<Button size=\"sm\" onClick={pagination.onPrevious} disabled={!pagination.hasPrevious}>\n\t\t\t\t\t\t\t\t<Icon icon={faChevronUp} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button size=\"sm\" onClick={pagination.onNext} disabled={!pagination.hasNext}>\n\t\t\t\t\t\t\t\t<Icon icon={faChevronDown} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{closeAction ?? (\n\t\t\t\t\t\t<Button size=\"xs\" variant=\"transparent\" onClick={onClose}>\n\t\t\t\t\t\t\t<span className=\"text-xl text-muted\">\n\t\t\t\t\t\t\t\t<Icon icon={faClose} />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-2 px-8 py-2\">\n\t\t\t\t<div className=\"flex min-w-0 shrink grow flex-col\">\n\t\t\t\t\t<Text variant=\"title-1\" className={twJoin(typeof title === \"string\" && \"truncate\")}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{subtitle && <div className=\"text-base font-light\">{subtitle}</div>}\n\t\t\t\t</div>\n\t\t\t\t{label && <div className=\"flex items-center gap-2\">{label}</div>}\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-2\">{actions}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport const DrawerHeaderSkeleton = () => (\n\t<div className=\"space-y-2 px-8 py-2\">\n\t\t<div className=\"flex justify-between\">\n\t\t\t<Skeleton className=\"h-6 w-36\" />\n\t\t\t<Skeleton className=\"h-6 w-16\" />\n\t\t</div>\n\t\t<Skeleton className=\"h-8 w-28\" />\n\t</div>\n);\n","// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type SkeletonProps = {\n\t/** Sizing/shape classes for the placeholder (e.g. `\"h-4 w-32\"`). */\n\tclassName?: string;\n};\n\n/**\n * An animated grey placeholder shown while content loads.\n *\n * Size and shape come entirely from `className`; render one per piece of content you're awaiting to\n * preserve layout and reduce shift.\n *\n * @example\n * {isLoading ? <Skeleton className=\"h-4 w-32\" /> : <Text>{name}</Text>}\n */\nexport const Skeleton = ({ className }: SkeletonProps) => (\n\t<div className={twMerge(\"animate-skeleton-pulse rounded-lg bg-surface-dark\", className)} />\n);\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCircleDashed } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { forwardRef } from \"react\";\n\nimport { Text } from \"../text\";\n\nexport type EmptyStateProps = {\n\t/**\n\t * Icon shown above the text.\n\t * @default faCircleDashed\n\t */\n\ticon?: IconDefinition;\n\t/** Primary message explaining why there's nothing to show. */\n\ttitle: React.ReactNode;\n\t/** Optional supporting text, e.g. a hint on how to add data. */\n\tdescription?: React.ReactNode;\n};\n\n/**\n * A centered placeholder for when a list, table, or view has no content.\n *\n * Renders an icon, a `title`, and an optional `description`. The `ref` forwards to the root element.\n *\n * @example\n * <EmptyState\n * icon={faInbox}\n * title=\"No messages\"\n * description=\"New messages will appear here.\"\n * />\n */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n\t({ icon = faCircleDashed, title, description }, ref) => (\n\t\t<div className=\"flex flex-col items-center justify-center gap-3 p-4\" ref={ref}>\n\t\t\t{/* Note that we add the `ring-transparent` class name because if the icon name used\n\t\t\tis \"life ring\" then the \"ring\" class name is interpreted poorly by tailwind. */}\n\t\t\t<FontAwesomeIcon className=\"text-muted ring-transparent\" icon={icon} size=\"2x\" />\n\n\t\t\t<div className=\"flex max-w-prose flex-col text-center\">\n\t\t\t\t{title && (\n\t\t\t\t\t<Text variant=\"title-3\" className=\"text-muted\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{description && (\n\t\t\t\t\t<Text variant=\"footnote\" className=\"leading-5 text-muted\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t),\n);\n","import { ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Popover } from \"@/core/popover\";\nimport { Text } from \"@/core/text\";\n\nexport type HeaderTileProps = {\n\t/** Small label shown above the content. */\n\ttitle: string;\n\t/** Main value of the tile; a string is rendered as styled text, otherwise rendered as-is. */\n\tcontent: string | ReactNode;\n\t/** When provided, the tile becomes a button that opens this content in a popover. */\n\tpopover?: ReactNode;\n\t/** Class name for the tile container. */\n\tclassName?: string;\n\t/** Drops the tile's own border/rounding for use inside a grouped row of tiles. */\n\tgrouped?: boolean;\n};\n\nconst HeaderTileSimple = ({ title, content, className, grouped }: Omit<HeaderTileProps, \"popover\">) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex h-18.5 w-fit flex-col items-start justify-between px-3 py-1.5\",\n\t\t\t!grouped && \"rounded-md border border-surface-neutral\",\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t<Text variant=\"label\" className=\"text-neutral\">\n\t\t\t{title}\n\t\t</Text>\n\t\t{typeof content === \"string\" ? <Text className=\"text-neutral\">{content}</Text> : content}\n\t</div>\n);\n\nconst HeaderTileWithPopover = ({ title, content, popover, className, grouped }: HeaderTileProps) => (\n\t<div className=\"w-fit\">\n\t\t<Popover.Root>\n\t\t\t<Popover.Trigger\n\t\t\t\tvariant=\"transparent\"\n\t\t\t\tsoften=\"none\"\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"flex h-18.5! w-fit justify-start px-3 py-1.5 transition-all duration-150 ease-in-out hover:shadow-md\",\n\t\t\t\t\t!grouped && \"rounded-md border border-surface-neutral\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-start justify-between\">\n\t\t\t\t\t<Text variant=\"label\" as=\"span\" className=\"text-neutral\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{typeof content === \"string\" ? (\n\t\t\t\t\t\t<Text as=\"span\" className=\"text-neutral\">\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tcontent\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Popover.Trigger>\n\t\t\t{popover && <Popover.Body contentClassName=\"max-w-150 min-w-60 p-3\">{popover}</Popover.Body>}\n\t\t</Popover.Root>\n\t</div>\n);\n\n/**\n * A compact labeled stat tile for page headers (a `title` over a `content` value).\n *\n * When `popover` is provided the tile becomes an interactive button that reveals that content on\n * click; otherwise it's a static tile. Set `grouped` to drop the border when placing several tiles\n * side by side.\n *\n * @example\n * <HeaderTile title=\"Balance\" content=\"$1,240.00\" />\n *\n * @example With a popover\n * <HeaderTile title=\"Status\" content=\"In review\" popover={<StatusHistory />} />\n */\nexport const HeaderTile = (props: HeaderTileProps) => {\n\tif (props.popover) {\n\t\treturn <HeaderTileWithPopover {...props} />;\n\t}\n\treturn <HeaderTileSimple {...props} />;\n};\n","import { ComponentProps, ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { HeaderTile } from \"./HeaderTile\";\n\nexport type HeaderTileGroupProps = {\n\tchildren: ReactNode;\n\tclassName?: string;\n};\n\nexport const HeaderTileGroup = ({ children, className }: HeaderTileGroupProps) => (\n\t<div\n\t\tclassName={twJoin(\n\t\t\t\"flex w-fit items-center divide-x divide-surface-neutral rounded-md border border-surface-neutral\",\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t{children}\n\t</div>\n);\n\nHeaderTileGroup.Tile = (props: ComponentProps<typeof HeaderTile>) => <HeaderTile {...props} grouped />;\n","import * as React from \"react\";\n\nimport { LabelStyleProps, labelStyles } from \"./labelStyles\";\n\n/**\n * Props for {@link Label}: the content plus the style variants (`intent`, `size`, `variant`).\n * Remaining native `<span>` attributes are forwarded to the element.\n */\nexport type LabelProps = {\n\t/** Label content. */\n\tchildren: React.ReactNode;\n} & LabelStyleProps;\n\nconst LabelImpl = (\n\t{ children, intent, size, variant, ...rest }: LabelProps,\n\tref: React.ForwardedRef<HTMLSpanElement>,\n) => {\n\treturn (\n\t\t<span ref={ref} className={labelStyles({ intent, size, variant })} {...rest}>\n\t\t\t{children}\n\t\t</span>\n\t);\n};\n\n/**\n * A small inline text label/badge with design-system styling.\n *\n * Renders a `<span>` styled by `intent` (color), `size`, and `variant`, with the `ref` and any\n * extra native attributes forwarded. Used on its own for status badges and as the visual base for\n * {@link Tag}.\n *\n * @example\n * <Label intent=\"success\">Active</Label>\n */\nexport const Label = React.forwardRef(LabelImpl);\n","import { twJoin } from \"tailwind-merge\";\n\nimport { Intent, Size } from \"../variants\";\n\nexport type LabelIntent = Intent | \"disabled\";\nexport type LabelVariant = \"default\" | \"dark\";\n\nexport type LabelStyleProps = {\n\tvariant?: LabelVariant;\n\tintent?: LabelIntent;\n\tsize?: Size;\n};\n\nconst sizeStyles: Record<Size, string> = {\n\txs: \"px-1 text-xs gap-0.5 h-4 rounded-md\",\n\tsm: \"h-5 gap-0.5 px-1 text-sm rounded-md\",\n\tmd: \"h-6 gap-1 px-2 text-base rounded-lg\",\n\tlg: \"h-7 gap-1 px-2 text-lg rounded-lg\",\n};\n\nconst colorStyles: Record<LabelVariant, Partial<Record<LabelIntent, string>>> = {\n\tdefault: {\n\t\tdefault: \"bg-surface-neutral text-neutral border border-surface-neutral\",\n\t\tprimary: \"bg-indigo-100 text-indigo-700 border border-indigo-200\",\n\t\tsuccess: \"bg-surface-success text-success border border-surface-success\",\n\t\twarning: \"bg-surface-warning text-warning border border-surface-warning\",\n\t\tdanger: \"bg-surface-danger text-red-700 border border-surface-danger\",\n\t\tdisabled: \"bg-surface-neutral text-placeholder border border-surface-neutral\",\n\t},\n\tdark: {\n\t\tdefault: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\t/**\n\t\t * Note(Stephen): We don't yet have tokens for all `intent` values for the dark variant.\n\t\t * Making them the same as default for now rather than wrestle with types as they are unused.\n\t\t */\n\t\tprimary: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\tsuccess: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\twarning: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\tdanger: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t\tdisabled: \"bg-gray-700 text-gray-50 border border-gray-600\",\n\t},\n};\n\nexport const labelStyles = ({ intent = \"default\", size = \"sm\", variant = \"default\" }: LabelStyleProps) =>\n\ttwJoin(\n\t\t\"inline-flex w-fit shrink-0 items-center justify-center truncate font-normal break-all\",\n\t\tsizeStyles[size],\n\t\tcolorStyles[variant][intent],\n\t);\n","import { forwardRef } from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\nimport { ChildrenProps, ClassNameProps } from \"@/core/types\";\n\nexport const RESPONSIVE_PADDING = \"px-4 md:px-8 lg:px-12 xl:px-16\";\n\n/**\n\tThe content container used across the app to get content centered, use consistent padding, and get whole page\n\tscrolling to work cohesively.\n*/\nexport const PageContainer = forwardRef<HTMLDivElement, ClassNameProps & ChildrenProps>(\n\t({ children, className }, ref) => (\n\t\t<div ref={ref} className={twMerge(\"h-full w-full overflow-y-auto pt-8\", className, RESPONSIVE_PADDING)}>\n\t\t\t{children}\n\t\t</div>\n\t),\n);\n\nexport const ScreenHeightPageContainer = forwardRef<HTMLDivElement, ClassNameProps & ChildrenProps>(\n\t({ children, className }, ref) => (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={twMerge(\"flex h-screen w-full flex-col overflow-y-hidden\", className, RESPONSIVE_PADDING)}\n\t\t>\n\t\t\t<div className=\"flex h-screen w-full flex-1 flex-col overflow-y-hidden pt-8 pb-4\">{children}</div>\n\t\t</div>\n\t),\n);\n","import { faEllipsis } from \"@fortawesome/sharp-solid-svg-icons\";\nimport {\n\tContent,\n\tDropdownMenuContentProps,\n\tDropdownMenuItemProps as RadixMenuItemProps,\n\tDropdownMenuProps,\n\tItem,\n\tPortal,\n\tRoot,\n\tSeparator,\n\tTrigger,\n} from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Button, ButtonProps } from \"@/core/button\";\nimport { DropdownChevron } from \"@/core/dropdown-chevron\";\nimport { Icon } from \"@/core/icon\";\nimport { Tooltip } from \"@/core/tooltip\";\n\nconst MenuTrigger = ({ children, ...rest }: ButtonProps) => {\n\tif (children == null) {\n\t\treturn (\n\t\t\t<Trigger asChild>\n\t\t\t\t<Button {...rest}>\n\t\t\t\t\t<Icon icon={faEllipsis} />\n\t\t\t\t</Button>\n\t\t\t</Trigger>\n\t\t);\n\t}\n\tif (typeof children === \"string\") {\n\t\treturn (\n\t\t\t<Trigger asChild>\n\t\t\t\t<Button {...rest}>\n\t\t\t\t\t<span>{children}</span>\n\t\t\t\t\t<DropdownChevron />\n\t\t\t\t</Button>\n\t\t\t</Trigger>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Trigger asChild>\n\t\t\t<Button {...rest}>{children}</Button>\n\t\t</Trigger>\n\t);\n};\n\nexport type MenuContentProps = DropdownMenuContentProps & { unrestrictedHeight?: boolean };\nconst MenuContent = ({ children, unrestrictedHeight = false, ...props }: MenuContentProps) => (\n\t<Portal>\n\t\t<Content\n\t\t\tcollisionPadding={8}\n\t\t\tsideOffset={4}\n\t\t\talign=\"end\"\n\t\t\tclassName=\"z-100 min-w-48 rounded-lg bg-white p-1.5 shadow-lg\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className={twJoin(\"overflow-y-auto\", !unrestrictedHeight && \"max-h-[252px]\")}>{children}</div>\n\t\t</Content>\n\t</Portal>\n);\n\nexport type MenuItemProps = Pick<RadixMenuItemProps, \"asChild\" | \"children\" | \"disabled\" | \"textValue\" | \"onSelect\"> & {\n\tloading?: boolean;\n\tsize?: \"default\" | \"lg\";\n};\nconst MenuItem = ({ loading, disabled, size = \"default\", ...rest }: MenuItemProps) => (\n\t<Item\n\t\tdata-loading={loading || undefined}\n\t\tdisabled={loading || disabled}\n\t\tclassName={twJoin(\n\t\t\t\"on-menu-item-active group flex w-full cursor-pointer items-center rounded-md p-2 text-neutral outline-hidden select-none data-disabled:cursor-not-allowed data-disabled:text-placeholder data-highlighted:bg-surface-neutral data-loading:bg-transparent data-loading:text-placeholder\",\n\t\t\tsize === \"default\" ? \"gap-1.5 text-sm\" : \"gap-2 text-base\",\n\t\t)}\n\t\t{...rest}\n\t/>\n);\n\nexport type MenuItemWithToolTipProps = MenuItemProps & {\n\t/**\n\t * tooltip Content\n\t */\n\ttooltip?: React.ReactNode;\n};\n\nconst MenuItemWithDisabledTooltip = ({ tooltip, onSelect, ...props }: MenuItemWithToolTipProps) => {\n\tif (!props.disabled || !tooltip) {\n\t\treturn <MenuItem {...props} onSelect={onSelect} />;\n\t}\n\treturn (\n\t\t<Tooltip\n\t\t\ttrigger={\n\t\t\t\t<span>\n\t\t\t\t\t<MenuItem {...props} />\n\t\t\t\t</span>\n\t\t\t}\n\t\t\tcontent={tooltip}\n\t\t\tside=\"left\"\n\t\t/>\n\t);\n};\n\nconst MenuRoot = (props: DropdownMenuProps) => <Root modal={false} {...props} />;\nconst MenuSeparator = () => <Separator className=\"my-[5px] h-px bg-surface-dark\" />;\n\nexport type MenuProps = DropdownMenuProps &\n\tPick<DropdownMenuContentProps, \"align\"> & {\n\t\ttrigger?: React.ReactNode;\n\t\ttriggerSize?: ButtonProps[\"size\"];\n\t\tvariant?: \"default\" | \"minimal\";\n\t} & Pick<ButtonProps, \"disabled\">;\n/**\n * @example\n * <Menu trigger=\"Actions\">\n * \t<Menu.Item>Transform object...</Menu.Item>\n * \t<Menu.Item>Edit</Menu.Item>\n * </Menu>\n * // use default trigger!\n * <Menu>\n * \t<Menu.Item onSelect={() => ...}>Transform object...</Menu.Item>\n * \t<Menu.Item>Edit</Menu.Item>\n * </Menu>\n */\nexport const Menu = ({ children, trigger, align, variant = \"default\", triggerSize, ...rest }: MenuProps) => {\n\tswitch (variant) {\n\t\tcase \"minimal\":\n\t\t\treturn (\n\t\t\t\t<MenuRoot {...rest}>\n\t\t\t\t\t<MenuTrigger {...rest} size={triggerSize || \"xs\"} variant=\"transparent\">\n\t\t\t\t\t\t{trigger}\n\t\t\t\t\t</MenuTrigger>\n\t\t\t\t\t<MenuContent align={align}>{children}</MenuContent>\n\t\t\t\t</MenuRoot>\n\t\t\t);\n\t\tcase \"default\":\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<MenuRoot {...rest}>\n\t\t\t\t\t<MenuTrigger size={triggerSize} {...rest}>\n\t\t\t\t\t\t{trigger}\n\t\t\t\t\t</MenuTrigger>\n\t\t\t\t\t<MenuContent align={align}>{children}</MenuContent>\n\t\t\t\t</MenuRoot>\n\t\t\t);\n\t}\n};\n\nMenu.Root = MenuRoot;\nMenu.Trigger = MenuTrigger;\nMenu.RawTrigger = Trigger;\nMenu.Content = MenuContent;\nMenu.Item = MenuItem;\nMenu.ItemWithDisabledToolTip = MenuItemWithDisabledTooltip;\nMenu.Separator = MenuSeparator;\n","export const ModalActions = ({ children }: { children: React.ReactNode }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"sticky bottom-0 z-2 flex items-center justify-end gap-x-2 overflow-clip rounded-b-xl bg-white/80 px-8 pt-2 pb-6 backdrop-blur-sm\">\n\t\t\t{children}\n\t\t</div>\n\t);\n};\n","export const ModalBody = ({ children }: { children: React.ReactNode }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn <div className=\"px-8 py-1.5\">{children}</div>;\n};\n","import { Close } from \"@radix-ui/react-dialog\";\n\nimport { Button, ButtonProps } from \"../../button\";\n\nexport const ModalCloseButton = (props: ButtonProps) => (\n\t<Close asChild>\n\t\t<Button {...props} />\n\t</Close>\n);\n","import { Content, DialogContentProps, Overlay, Portal } from \"@radix-ui/react-dialog\";\nimport { forwardRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nconst preventDismiss = (e: Event) => e.preventDefault();\n\nconst handleDismiss = (dismissible?: boolean) => {\n\tif (dismissible) {\n\t\treturn;\n\t}\n\treturn preventDismiss;\n};\n\nexport type ModalContentBaseProps = Pick<DialogContentProps, \"children\" | \"onOpenAutoFocus\" | \"onCloseAutoFocus\">;\n\nexport type SoftDismissProps =\n\t| { dismissible?: never; onDismiss?: (e: Event) => void }\n\t| { dismissible?: boolean; onDismiss?: never };\nexport type ModalContentProps = SoftDismissProps & {\n\tmaxWidthClassName?: `max-w-${string}`;\n\toverflowYClassName?: `overflow-y-${string}`;\n};\n\ntype FullscreenModalContentProps = {\n\tfullscreen?: boolean;\n};\n\nexport const ModalContent = forwardRef<\n\tHTMLDivElement,\n\tModalContentBaseProps & ModalContentProps & FullscreenModalContentProps\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tmaxWidthClassName = \"max-w-prose\",\n\t\t\toverflowYClassName = \"overflow-y-auto\",\n\t\t\tonDismiss,\n\t\t\tdismissible = true,\n\t\t\tfullscreen,\n\t\t\t...rest\n\t\t},\n\t\tref,\n\t) => (\n\t\t<Portal>\n\t\t\t<Overlay\n\t\t\t\t// TODO: remove z-index once the z-index wars in /app are over\n\t\t\t\tclassName=\"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-fade-in-custom-easing\"\n\t\t\t>\n\t\t\t\t<Content\n\t\t\t\t\t{...rest}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\tfullscreen\n\t\t\t\t\t\t\t? \"h-[calc(100vh-1rem)] w-[calc(100vw-1rem)]\"\n\t\t\t\t\t\t\t: `max-h-[calc(100vh-2rem)] w-[clamp(100vw-2rem,100%,100vw-2rem)] ${maxWidthClassName}`,\n\t\t\t\t\t\t`fixed top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 flex-col rounded-xl bg-white shadow-lg focus:outline-hidden data-[state=open]:animate-fade-in-subtle-movement ${overflowYClassName}`,\n\t\t\t\t\t)}\n\t\t\t\t\tonPointerDownOutside={fullscreen ? handleDismiss() : (onDismiss ?? handleDismiss(dismissible))}\n\t\t\t\t\tonEscapeKeyDown={fullscreen ? handleDismiss() : (onDismiss ?? handleDismiss(dismissible))}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"relative flex h-full min-w-0 flex-1 flex-col\">{children}</div>\n\t\t\t\t</Content>\n\t\t\t</Overlay>\n\t\t</Portal>\n\t),\n);\n","import { Description } from \"@radix-ui/react-dialog\";\n\nexport const ModalDescription = ({ children }: { children: React.ReactNode }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn <Description className=\"pb-3 text-base/6 font-normal text-neutral\">{children}</Description>;\n};\n","import * as React from \"react\";\n\nimport { Callout } from \"@/core/callout\";\n\nexport const ModalErrorCallout = ({ children }: { children: React.ReactNode }) => {\n\tif (!children) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"sticky top-14 z-10 px-5\">\n\t\t\t<Callout intent=\"danger\">{children}</Callout>\n\t\t</div>\n\t);\n};\n","import { DialogProps, Root } from \"@radix-ui/react-dialog\";\n\nexport type ModalRootProps = Pick<DialogProps, \"children\" | \"open\" | \"onOpenChange\">;\nexport const ModalRoot = (props: ModalRootProps) => {\n\treturn <Root {...props} />;\n};\n","import { Title } from \"@radix-ui/react-dialog\";\n\nimport { ModalCloseX } from \"./ModalCloseX\";\n\nexport const ModalTitle = ({ children, showX = true }: { children: React.ReactNode; showX?: boolean }) => {\n\tif (children == null) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"sticky top-0 z-2 overflow-clip rounded-t-xl bg-white/80 px-8 pt-8 pb-1.5 backdrop-blur-sm\">\n\t\t\t<Title className=\"text-xl font-semibold text-dark\">{children}</Title>\n\t\t\t{showX && <ModalCloseX />}\n\t\t</div>\n\t);\n};\n","import { faClose } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Close } from \"@radix-ui/react-dialog\";\n\nimport { Button } from \"../../button\";\nimport { Icon } from \"../../icon\";\n\nexport const ModalCloseX = () => (\n\t<span className=\"absolute top-2.5 right-2.5\">\n\t\t<Close asChild aria-label=\"Close\">\n\t\t\t<Button variant=\"transparent\">\n\t\t\t\t<span className=\"px-0.5 text-xl text-muted\">\n\t\t\t\t\t<Icon icon={faClose} />\n\t\t\t\t</span>\n\t\t\t</Button>\n\t\t</Close>\n\t</span>\n);\n","import { Trigger } from \"@radix-ui/react-dialog\";\n\n/**\n * This needs to import the button folder directly from core in order to\n * prevent a dependency issue which causes the FullscreenModal to throw\n * an erorr when rendering in storybook.\n */\nimport { Button, ButtonProps } from \"@/core/button\";\n\nexport const ModalTriggerButton = (props: ButtonProps) => (\n\t<Trigger asChild>\n\t\t<Button {...props} />\n\t</Trigger>\n);\n","import * as React from \"react\";\n\nimport { ChildrenProps } from \"../types\";\nimport { ModalActions } from \"./components/ModalActions\";\nimport { ModalBody } from \"./components/ModalBody\";\nimport { ModalCloseButton } from \"./components/ModalCloseButton\";\nimport { ModalContent, ModalContentBaseProps, ModalContentProps } from \"./components/ModalContent\";\nimport { ModalDescription } from \"./components/ModalDescription\";\nimport { ModalErrorCallout } from \"./components/ModalErrorCallout\";\nimport { ModalRoot } from \"./components/ModalRoot\";\nimport { ModalTitle } from \"./components/ModalTitle\";\nimport { ModalTriggerButton } from \"./components/ModalTriggerButton\";\n\nexport type ModalBodyImplProps = {\n\ttitle?: React.ReactNode;\n\terror?: React.ReactNode;\n\tdescription?: React.ReactNode;\n\tactions?: React.ReactNode;\n\tshowX?: boolean;\n};\n\nconst ModalBodyImpl = ({\n\tchildren,\n\ttitle,\n\terror,\n\tdescription,\n\tactions,\n\tshowX = true,\n}: ModalBodyImplProps & ChildrenProps) => (\n\t<>\n\t\t<ModalTitle showX={showX}>{title}</ModalTitle>\n\t\t<ModalErrorCallout>{error}</ModalErrorCallout>\n\t\t{(description || children) && (\n\t\t\t<ModalBody>\n\t\t\t\t{/* Modal description could be wordy, so we're grouping it with the body to ensure it scrolls under the sticky header when there is overflow on ModalBody. */}\n\t\t\t\t<ModalDescription>{description}</ModalDescription>\n\t\t\t\t{children}\n\t\t\t</ModalBody>\n\t\t)}\n\t\t<ModalActions>{actions}</ModalActions>\n\t</>\n);\n\nexport type SharedModalProps = React.PropsWithChildren & {\n\tisOpen?: boolean;\n\tonClose?: () => void;\n};\n\n/**\n * If using `trigger`, the modal will control its own visibility state though you can observe changes with onOpenChange\n * Otherwise, pass `isOpen` and `onClose` to control modal state yourself.\n */\nexport type DiscriminatedVisibilityProps =\n\t| { isOpen: boolean; onClose: () => void; trigger?: never; onOpenChange?: never }\n\t| { isOpen?: never; onClose?: never; trigger: React.ReactNode; onOpenChange?: (open: boolean) => void };\n\ntype DiscriminatedContentProps =\n\t| {\n\t\t\tchildren?: React.ReactNode;\n\t\t\tcontent?: never;\n\t\t\ttitle?: never;\n\t\t\terror?: never;\n\t\t\tdescription?: never;\n\t\t\tactions?: never;\n\t }\n\t| (ModalBodyImplProps & {\n\t\t\tchildren?: never;\n\t\t\tcontent?: React.ReactNode;\n\t });\n\nexport type ModalProps = DiscriminatedVisibilityProps &\n\tModalContentBaseProps &\n\tModalContentProps &\n\tDiscriminatedContentProps & { trigger?: React.ReactNode };\n\n/**\n * A dialog overlay with two interchangeable modes for both visibility and content.\n *\n * **Visibility** is either controlled or self-managed (see {@link DiscriminatedVisibilityProps}):\n * pass `isOpen` + `onClose` to drive it yourself, or pass a `trigger` element to let the modal own\n * its open state (observe changes via `onOpenChange`). The two sets are mutually exclusive.\n *\n * **Content** is either fully custom or structured: pass `children` to render the body yourself, or\n * pass `content` together with `title` / `description` / `error` / `actions` to use the standard\n * layout (title bar, scrollable body, sticky actions). These two sets are also mutually exclusive.\n *\n * Sub-components: {@link Modal.Body} (the structured layout, also usable directly),\n * {@link Modal.TriggerButton}, and {@link Modal.CloseButton}.\n *\n * @example Controlled\n * <Modal isOpen={isOpen} onClose={close} title=\"Delete item\" actions={<Button>Delete</Button>}>\n * This action cannot be undone.\n * </Modal>\n *\n * @example Self-managed via a trigger\n * <Modal trigger={<Modal.TriggerButton>Open</Modal.TriggerButton>} title=\"Settings\">\n * <SettingsForm />\n * </Modal>\n */\nexport const Modal = ({\n\tchildren,\n\ttrigger,\n\tisOpen,\n\tonClose,\n\tonOpenChange,\n\tcontent,\n\ttitle,\n\terror,\n\tdescription,\n\tactions,\n\t...rest\n}: ModalProps) => (\n\t<ModalRoot\n\t\topen={isOpen}\n\t\tonOpenChange={(open) => {\n\t\t\tif (trigger) {\n\t\t\t\tonOpenChange?.(open);\n\t\t\t} else if (open === false) {\n\t\t\t\tonClose?.();\n\t\t\t}\n\t\t}}\n\t>\n\t\t{trigger}\n\t\t<ModalContent aria-describedby={description || undefined} {...rest}>\n\t\t\t{children !== undefined ? (\n\t\t\t\tchildren\n\t\t\t) : (\n\t\t\t\t<ModalBodyImpl title={title} error={error} description={description} actions={actions}>\n\t\t\t\t\t{content}\n\t\t\t\t</ModalBodyImpl>\n\t\t\t)}\n\t\t</ModalContent>\n\t</ModalRoot>\n);\n\nModal.Body = ModalBodyImpl;\nModal.TriggerButton = ModalTriggerButton;\nModal.CloseButton = ModalCloseButton;\n","import * as React from \"react\";\n\nimport { ModalCloseButton } from \"./components/ModalCloseButton\";\nimport { ModalContent, ModalContentBaseProps } from \"./components/ModalContent\";\nimport { ModalRoot } from \"./components/ModalRoot\";\nimport { ModalTriggerButton } from \"./components/ModalTriggerButton\";\nimport { FullscreenModalHeader } from \"./FullscreenModalHeader\";\nimport { DiscriminatedVisibilityProps, Modal } from \"./Modal\";\n\nexport type FullscreenModalProps = DiscriminatedVisibilityProps &\n\tModalContentBaseProps & {\n\t\ttrigger?: React.ReactNode;\n\t\tfullscreen?: boolean;\n\t\ttitle?: React.ReactNode;\n\t\tshowX?: boolean;\n\t};\n\nconst FullscreenModal = React.forwardRef<HTMLDivElement, FullscreenModalProps>(\n\t({ children, trigger, isOpen, onClose, onOpenChange, fullscreen = true, showX = false, title, ...rest }, ref) => (\n\t\t<ModalRoot\n\t\t\topen={isOpen}\n\t\t\tonOpenChange={(open) => {\n\t\t\t\tif (trigger) {\n\t\t\t\t\tonOpenChange?.(open);\n\t\t\t\t} else if (open === false) {\n\t\t\t\t\tonClose?.();\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t{trigger}\n\t\t\t<ModalContent fullscreen={fullscreen} {...rest} ref={ref}>\n\t\t\t\t{title ? (\n\t\t\t\t\t<Modal.Body title={title} showX={showX}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Modal.Body>\n\t\t\t\t) : (\n\t\t\t\t\tchildren\n\t\t\t\t)}\n\t\t\t</ModalContent>\n\t\t</ModalRoot>\n\t),\n);\n\n// Need to use Object.assign because FullscreenModal forwards ref\nconst FullscreenModalNamespace = Object.assign(FullscreenModal, {\n\tTriggerButton: ModalTriggerButton,\n\tCloseButton: ModalCloseButton,\n\tHeader: FullscreenModalHeader,\n});\n\nexport { FullscreenModalNamespace as FullscreenModal };\n","import { Title } from \"@radix-ui/react-dialog\";\nimport { twJoin } from \"tailwind-merge\";\n\nexport type FullscreenModalHeaderProps = {\n\ttitle: React.ReactNode;\n\tdescription?: React.ReactNode;\n\tleftSlot?: React.ReactNode;\n\trightSlot?: React.ReactNode;\n\tclassName?: string;\n};\n\nexport const FullscreenModalHeader = ({\n\tclassName,\n\ttitle,\n\tdescription,\n\tleftSlot,\n\trightSlot,\n}: FullscreenModalHeaderProps) => {\n\treturn (\n\t\t<div className={twJoin(\"flex items-center justify-between gap-4\", className)}>\n\t\t\t<div className=\"flex flex-1 items-center gap-4\">\n\t\t\t\t{leftSlot}\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t<Title className=\"text-2xl font-medium text-neutral\">{title}</Title>\n\t\t\t\t\t{description && <div className=\"text-base/6 text-muted\">{description}</div>}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-2\">{rightSlot}</div>\n\t\t</div>\n\t);\n};\n","import * as React from \"react\";\n\nimport { ChildrenProps } from \"../types\";\nimport { ModalActions } from \"./components/ModalActions\";\nimport { ModalBody } from \"./components/ModalBody\";\nimport { ModalCloseButton } from \"./components/ModalCloseButton\";\nimport { ModalContent, ModalContentProps } from \"./components/ModalContent\";\nimport { ModalDescription } from \"./components/ModalDescription\";\nimport { ModalErrorCallout } from \"./components/ModalErrorCallout\";\nimport { ModalRoot } from \"./components/ModalRoot\";\nimport { ModalTitle } from \"./components/ModalTitle\";\nimport { ModalTriggerButton } from \"./components/ModalTriggerButton\";\nimport { DiscriminatedVisibilityProps } from \"./Modal\";\n\nexport type AlertModalBodyProps = {\n\ttitle?: React.ReactNode;\n\terror?: React.ReactNode;\n\tdescription?: React.ReactNode;\n\tactions?: React.ReactNode;\n};\n\nconst ModalBodyImpl = ({ children, title, error, description, actions }: AlertModalBodyProps & ChildrenProps) => (\n\t<>\n\t\t<ModalTitle showX={false}>{title}</ModalTitle>\n\t\t<ModalErrorCallout>{error}</ModalErrorCallout>\n\t\t{(description || children) && (\n\t\t\t<ModalBody>\n\t\t\t\t{/* Modal description could be wordy, so we're grouping it with the body to ensure it scrolls under the sticky header when there is overflow on ModalBody. */}\n\t\t\t\t<ModalDescription>{description}</ModalDescription>\n\t\t\t\t{children}\n\t\t\t</ModalBody>\n\t\t)}\n\t\t<ModalActions>{actions}</ModalActions>\n\t</>\n);\n\ntype DiscriminatedContentProps =\n\t| {\n\t\t\tchildren?: React.ReactNode;\n\t\t\tcontent?: never;\n\t\t\ttitle?: never;\n\t\t\terror?: never;\n\t\t\tdescription?: never;\n\t\t\tactions?: never;\n\t }\n\t| (AlertModalBodyProps & {\n\t\t\tchildren?: never;\n\t\t\tcontent?: React.ReactNode;\n\t });\nexport type AlertModalProps = Simplify<\n\tDiscriminatedVisibilityProps &\n\t\tPick<ModalContentProps, \"maxWidthClassName\"> &\n\t\tDiscriminatedContentProps & { trigger?: React.ReactNode }\n>;\nexport const AlertModal = ({\n\tchildren,\n\ttrigger,\n\tisOpen,\n\tonOpenChange,\n\tonClose,\n\tcontent,\n\ttitle,\n\terror,\n\tdescription,\n\tactions,\n\t...rest\n}: AlertModalProps) => (\n\t<ModalRoot\n\t\topen={isOpen}\n\t\tonOpenChange={(open) => {\n\t\t\tif (trigger) {\n\t\t\t\tonOpenChange?.(open);\n\t\t\t} else if (open === false) {\n\t\t\t\tonClose?.();\n\t\t\t}\n\t\t}}\n\t>\n\t\t{trigger}\n\t\t<ModalContent {...rest} dismissible={false}>\n\t\t\t{children !== undefined ? (\n\t\t\t\tchildren\n\t\t\t) : (\n\t\t\t\t<ModalBodyImpl title={title} error={error} description={description} actions={actions}>\n\t\t\t\t\t{content}\n\t\t\t\t</ModalBodyImpl>\n\t\t\t)}\n\t\t</ModalContent>\n\t</ModalRoot>\n);\n\nAlertModal.Body = ModalBodyImpl;\nAlertModal.TriggerButton = ModalTriggerButton;\nAlertModal.CloseButton = ModalCloseButton;\n","import \"react-international-phone/style.css\"; // Import the styles for react-international-phone\nimport \"./styles.css\";\n\nimport React from \"react\";\nimport { PhoneInput, PhoneInputProps } from \"react-international-phone\";\nimport { twJoin } from \"tailwind-merge\";\n\n/**\n * An international phone-number input with a country selector, built on `react-international-phone`.\n *\n * Controlled: `onChange` receives the E.164 value (e.g. `\"+12025550123\"`), or `undefined` when the\n * field is cleared. Defaults to the US country. Set `hasError` for error styling. All other\n * `react-international-phone` `PhoneInput` props pass through.\n *\n * @example\n * <PhoneNumber value={phone} onChange={(v) => setPhone(v)} hasError={!!error} />\n */\nexport const PhoneNumber: React.FC<PhoneInputProps & { hasError?: boolean; onChange: (value?: string) => void }> = ({\n\thasError,\n\tonChange,\n\t...props\n}) => {\n\treturn (\n\t\t<PhoneInput\n\t\t\tdefaultCountry={props.defaultCountry ?? \"us\"}\n\t\t\tdisableDialCodeAndPrefix\n\t\t\tshowDisabledDialCodeAndPrefix\n\t\t\tinputClassName={twJoin(\n\t\t\t\t\"flex-1 placeholder:text-placeholder\",\n\t\t\t\thasError ? \"border-red-300!\" : \"border-surface-neutral!\",\n\t\t\t)}\n\t\t\tcountrySelectorStyleProps={{ className: \"border-surface-neutral!\" }}\n\t\t\tonChange={(value, meta) => onChange(meta.inputValue ? value : undefined)}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n","import { twJoin } from \"tailwind-merge\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nimport { Text } from \"../text/Text\";\n\nexport type StepperProps = {\n\t/** Ordered step labels; each renders a numbered circle (1-based) with its label. */\n\tsteps: string[];\n\t/** Zero-based index of the active step. */\n\tcurrentStep: number;\n\t/** Class name for the row container. */\n\tclassName?: string;\n};\n\ntype StepItemProps = {\n\tlabel: string;\n\tstep: number;\n\tisActive: boolean;\n};\n\nconst StepItem = ({ label, step, isActive }: StepItemProps) => (\n\t<div className=\"flex items-center gap-3\">\n\t\t<div\n\t\t\tclassName={twJoin(\n\t\t\t\t\"flex size-6 items-center justify-center rounded-full\",\n\t\t\t\tisActive ? \"bg-button-primary\" : \"bg-button-primary-disabled\",\n\t\t\t)}\n\t\t>\n\t\t\t<Text className=\"text-white\">{step}</Text>\n\t\t</div>\n\t\t<Text variant=\"body-1\" className={isActive ? \"text-primary\" : \"text-indigo-200\"}>\n\t\t\t{label}\n\t\t</Text>\n\t</div>\n);\n\n/**\n * A horizontal progress indicator for multi-step flows.\n *\n * Renders each label in `steps` as a numbered circle; the step at `currentStep` (zero-based) is\n * highlighted as active.\n *\n * @example\n * <Stepper steps={[\"Details\", \"Payment\", \"Review\"]} currentStep={1} />\n */\nexport const Stepper = ({ steps, currentStep, className }: StepperProps) => (\n\t<div className={twMerge(\"flex items-center justify-center gap-5\", className)}>\n\t\t{steps.map((label, index) => (\n\t\t\t<StepItem key={label} label={label} step={index + 1} isActive={index === currentStep} />\n\t\t))}\n\t</div>\n);\n","import type { Table as ReactTable } from \"@tanstack/react-table\";\nimport { useEffect } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { LoadingBar } from \"@/core/loaders/LoadingBar\";\nimport { Skeleton } from \"@/core/skeleton\";\n\nimport { useIntersectionObserver } from \"../utils/useIntersectionObserver\";\nimport { TableBody } from \"./TableBody\";\nimport { TableHeader } from \"./TableHeader\";\n\nexport const tableVariants = {\n\tdefault: \"default\",\n\tseamless: \"seamless\",\n\ttransparent: \"transparent\",\n\tsubtable: \"subtable\",\n} as const;\nexport type TableVariant = (typeof tableVariants)[keyof typeof tableVariants];\nexport type ConfigClassNames = { rootClassName?: string; rowClassName?: string; cellClassName?: string };\n\nexport const headerClassNames = (variant: TableVariant): ConfigClassNames => {\n\tswitch (variant) {\n\t\tcase tableVariants.transparent:\n\t\t\treturn {\n\t\t\t\tcellClassName: \"text-left text-sm font-medium text-muted whitespace-nowrap px-2.5 py-3\",\n\t\t\t};\n\t\tcase tableVariants.subtable:\n\t\t\treturn {\n\t\t\t\trowClassName: \"divide-x divide-gray-200\",\n\t\t\t\tcellClassName:\n\t\t\t\t\t\"text-left text-sm font-medium text-muted whitespace-nowrap sticky top-0 z-1 border-b bg-surface-neutral px-2 py-1.5\",\n\t\t\t};\n\t\tcase tableVariants.seamless:\n\t\t\treturn {\n\t\t\t\tcellClassName:\n\t\t\t\t\t\"text-left text-sm font-medium text-muted whitespace-nowrap sticky top-0 z-1 border-b bg-surface-light px-2 py-1.5 group data-[clickable]:cursor-pointer data-[clickable]:select-none data-[clickable]:hover:text-gray-800\",\n\t\t\t};\n\t\tcase tableVariants.default:\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tcellClassName:\n\t\t\t\t\t\"text-left text-sm font-medium text-muted whitespace-nowrap sticky top-0 z-1 border-b bg-surface-neutral px-2 py-1.5 group data-[clickable]:cursor-pointer data-[clickable]:select-none data-[clickable]:hover:text-gray-800\",\n\t\t\t};\n\t}\n};\n\nexport const bodyClassNames = (variant: TableVariant): ConfigClassNames => {\n\tswitch (variant) {\n\t\tcase tableVariants.seamless:\n\t\t\treturn {\n\t\t\t\trowClassName: \"[&:not(:last-child)_td]:border-surface-neutral\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap h-fit\",\n\t\t\t};\n\t\tcase tableVariants.transparent:\n\t\t\treturn {\n\t\t\t\trootClassName: \"rounded-lg bg-white outline outline-1 outline-gray-200\",\n\t\t\t\trowClassName:\n\t\t\t\t\t\"[&:not(:last-child)_td]:border-b [&:not(:last-child)_td]:border-surface-neutral [&:first-child_td:first-child]:rounded-tl-lg [&:first-child_td:last-child]:rounded-tr-lg [&:last-child_td:first-child]:rounded-bl-lg [&:last-child_td:last-child]:rounded-br-lg\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap p-2.5 py-1.5\",\n\t\t\t};\n\t\tcase tableVariants.subtable:\n\t\t\treturn {\n\t\t\t\trowClassName:\n\t\t\t\t\t\"[&:not(:last-child)_td]:border-b [&:not(:last-child)_td]:border-surface-neutral divide-x divide-gray-200\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap p-2\",\n\t\t\t};\n\t\tcase tableVariants.default:\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\trowClassName:\n\t\t\t\t\t\"[&:not(:last-child)_td]:border-b [&:not(:last-child)_td]:border-surface-neutral data-[depth='0']:bg-surface-light\",\n\t\t\t\tcellClassName: \"text-sm text-neutral whitespace-nowrap p-2\",\n\t\t\t};\n\t}\n};\n\nexport type TableProps<T> = {\n\t/**\n\t * A TanStack `react-table` instance. The table reads its data, columns, and behavior\n\t * (sorting, resizing, infinite scroll) from this instance's options and `meta`.\n\t */\n\ttable: ReactTable<T>;\n\t/**\n\t * Visual treatment of the table chrome (borders, background, spacing).\n\t * @default default\n\t */\n\tvariant?: TableVariant;\n\t/**\n\t * Forces the loading state (skeleton rows / dimmed UI). When omitted, the table falls back\n\t * to `table.options.meta.isLoading` / `isFetching`.\n\t */\n\tloading?: boolean;\n};\n\n/**\n * Renders a TanStack `react-table` instance as a styled table.\n *\n * Pass a configured `table` instance and pick a `variant` for the chrome. Loading and fetching\n * states come from `loading` or, if unset, from the table's `meta`; `default` and `seamless`\n * variants also support infinite scroll via `meta.infiniteScroll` (a sentinel row fetches the next\n * page as it scrolls into view).\n *\n * @example\n * const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel() });\n *\n * <Table table={table} variant=\"seamless\" loading={isLoading} />\n */\nexport const Table = <T,>({ variant = \"default\", loading: loadingProp, ...props }: TableProps<T>) => {\n\tconst loading = loadingProp ?? props.table.options.meta?.isLoading;\n\tconst fetching = loadingProp ?? props.table.options.meta?.isFetching;\n\tconst uiLoading = loading ? \"loading\" : undefined;\n\tconst coreRows = props.table.getCoreRowModel().rows;\n\tconst showLoadingBar = fetching && coreRows.length > 0;\n\tconst resizeStyle = props.table.options.enableColumnResizing\n\t\t? ({ width: props.table.getCenterTotalSize(), tableLayout: \"fixed\" } as const)\n\t\t: undefined;\n\tconst tableElementRef = props.table.options.meta?.tableElementRef ?? null;\n\n\tswitch (variant) {\n\t\tcase tableVariants.transparent:\n\t\t\treturn (\n\t\t\t\t<div className=\"relative mb-auto min-w-full\">\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableElementRef}\n\t\t\t\t\t\tdata-ui={uiLoading}\n\t\t\t\t\t\tstyle={resizeStyle}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader {...props} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t\t\t<TableBody {...props} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase tableVariants.subtable:\n\t\t\treturn (\n\t\t\t\t<div className=\"relative mb-auto min-w-full\">\n\t\t\t\t\t{showLoadingBar && <LoadingBar className=\"absolute top-0 right-0 left-0 z-10 h-1 rounded-none\" />}\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableElementRef}\n\t\t\t\t\t\tdata-ui={uiLoading}\n\t\t\t\t\t\tstyle={resizeStyle}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader {...props} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t\t\t<TableBody {...props} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase tableVariants.seamless:\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\"relative mb-auto rounded-md border bg-white\",\n\t\t\t\t\t\tloading && coreRows.length === 0 ? \"overflow-hidden\" : \"overflow-auto\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableElementRef}\n\t\t\t\t\t\tdata-ui={uiLoading}\n\t\t\t\t\t\tstyle={resizeStyle}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"relative min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader {...props} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t\t\t<TableBody {...props} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase tableVariants.default:\n\t\tdefault:\n\t\t\treturn <DefaultTable {...props} loading={loading} fetching={fetching} />;\n\t}\n};\n\ntype DefaultTableProps<T> = {\n\ttable: ReactTable<T>;\n\tloading?: boolean;\n\tfetching?: boolean;\n};\n\nconst DefaultTable = <T,>({ table, loading, fetching }: DefaultTableProps<T>) => {\n\tconst [sentinelRef, entry] = useIntersectionObserver<HTMLTableRowElement>();\n\n\tconst infiniteScroll = table.options.meta?.infiniteScroll;\n\tconst coreRows = table.getCoreRowModel().rows;\n\tconst colCount = table.getAllLeafColumns().length;\n\tconst uiLoading = loading ? \"loading\" : undefined;\n\tconst showLoadingBar = fetching && coreRows.length > 0;\n\tconst resizeStyle = table.options.enableColumnResizing\n\t\t? ({ width: table.getCenterTotalSize(), tableLayout: \"fixed\" } as const)\n\t\t: undefined;\n\tconst tableElementRef = table.options.meta?.tableElementRef ?? null;\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tif (entry?.isIntersecting && infiniteScroll?.hasNextPage && !infiniteScroll.isFetchingNextPage) {\n\t\t\tinfiniteScroll.fetchNextPage();\n\t\t}\n\t}, [entry?.isIntersecting, infiniteScroll]);\n\n\tconst skeletonRows = infiniteScroll?.hasNextPage\n\t\t? Array.from({ length: 3 }).map((_, i) => (\n\t\t\t\t<tr key={`skeleton-${i}`} className=\"[&:not(:last-child)>td]:border-b [&:not(:last-child)>td]:border-gray-200\">\n\t\t\t\t\t{Array.from({ length: colCount }).map((_, j) => (\n\t\t\t\t\t\t<td key={j} className=\"p-2\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-full\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))\n\t\t: null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={twJoin(\n\t\t\t\t\"relative mb-auto rounded-md border bg-white\",\n\t\t\t\tcoreRows.length === 0\n\t\t\t\t\t? twJoin(\"h-full min-h-0\", loading ? \"overflow-hidden\" : \"overflow-auto\")\n\t\t\t\t\t: \"max-h-full min-h-0 overflow-auto\",\n\t\t\t)}\n\t\t>\n\t\t\t{showLoadingBar && <LoadingBar className=\"sticky top-0 right-0 left-0 z-10 -mb-1 h-1 rounded-none\" />}\n\t\t\t<table\n\t\t\t\tref={tableElementRef}\n\t\t\t\tdata-ui={uiLoading}\n\t\t\t\tstyle={resizeStyle}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"relative min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\tcoreRows.length === 0 && !loading && \"h-full\",\n\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<TableHeader table={table} variant=\"default\" {...headerClassNames(\"default\")} />\n\t\t\t\t<TableBody\n\t\t\t\t\ttable={table}\n\t\t\t\t\t{...bodyClassNames(\"default\")}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tafterRows={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{infiniteScroll?.hasNextPage && (\n\t\t\t\t\t\t\t\t<tr ref={sentinelRef} aria-hidden=\"true\" style={{ height: 0, border: \"none\", padding: 0 }}>\n\t\t\t\t\t\t\t\t\t<td colSpan={colCount} style={{ height: 0, border: \"none\", padding: 0 }} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{skeletonRows}\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</table>\n\t\t</div>\n\t);\n};\n","import { useCallback, useRef, useState } from \"react\";\n\nexport const useIntersectionObserver = <T extends Element>(\n\toptions: IntersectionObserverInit = {},\n): [React.RefCallback<T>, IntersectionObserverEntry | null] => {\n\tconst { threshold = 1, root = null, rootMargin = \"0px\" } = options;\n\n\tconst [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n\n\tconst previousObserver = useRef<IntersectionObserver | null>(null);\n\n\tconst customRef = useCallback(\n\t\t(node: T | null) => {\n\t\t\tif (previousObserver.current) {\n\t\t\t\tpreviousObserver.current.disconnect();\n\t\t\t\tpreviousObserver.current = null;\n\t\t\t}\n\n\t\t\tif (node?.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst observer = new IntersectionObserver(\n\t\t\t\t\t([entry]) => {\n\t\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\t\tsetEntry(entry);\n\t\t\t\t\t},\n\t\t\t\t\t{ threshold, root, rootMargin },\n\t\t\t\t);\n\n\t\t\t\tobserver.observe(node);\n\t\t\t\tpreviousObserver.current = observer;\n\t\t\t}\n\t\t},\n\t\t[threshold, root, rootMargin],\n\t);\n\n\treturn [customRef, entry];\n};\n","import { faTable } from \"@fortawesome/sharp-solid-svg-icons\";\nimport { Table } from \"@tanstack/react-table\";\nimport * as React from \"react\";\n\nimport { Icon } from \"@/core/icon\";\nimport { Skeleton } from \"@/core/skeleton\";\n\nimport { TableRow } from \"./TableRow\";\n\nexport type TableBodyProps<T> = {\n\ttable: Table<T>;\n\tloading?: boolean;\n\trootClassName?: string;\n\trowClassName?: string;\n\tcellClassName?: string;\n\tafterRows?: React.ReactNode;\n};\nexport const TableBody = <T,>({ table, loading, rootClassName, afterRows, ...props }: TableBodyProps<T>) => {\n\tconst { rows } = table.getRowModel();\n\tif (rows.length === 0) {\n\t\tif (loading) {\n\t\t\tconst colCount = table.getAllLeafColumns().length;\n\t\t\treturn (\n\t\t\t\t<tbody className={rootClassName}>\n\t\t\t\t\t{Array.from({ length: 20 }).map((_, i) => (\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\tkey={`skeleton-${i}`}\n\t\t\t\t\t\t\tclassName=\"[&:not(:last-child)>td]:border-b [&:not(:last-child)>td]:border-gray-200\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Array.from({ length: colCount }).map((_, j) => (\n\t\t\t\t\t\t\t\t<td key={j} className=\"p-2\">\n\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-full\" />\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t))}\n\t\t\t\t</tbody>\n\t\t\t);\n\t\t}\n\t\treturn (\n\t\t\t<tbody className={rootClassName}>\n\t\t\t\t<tr>\n\t\t\t\t\t<EmptyRowsTd colSpan={table.getAllLeafColumns().length} emptyText={table.options.meta?.emptyText} />\n\t\t\t\t</tr>\n\t\t\t\t{afterRows}\n\t\t\t</tbody>\n\t\t);\n\t}\n\treturn (\n\t\t<tbody className={rootClassName}>\n\t\t\t{rows.map((row) => (\n\t\t\t\t<TableRow key={row.id} {...props} table={table} row={row} />\n\t\t\t))}\n\t\t\t{afterRows}\n\t\t</tbody>\n\t);\n};\n\ntype EmptyRowsTdProps = {\n\tcolSpan: number;\n\temptyText?: React.ReactNode;\n};\nexport const EmptyRowsTd = ({ emptyText = \"No rows found\", ...props }: EmptyRowsTdProps) => (\n\t<td {...props} className=\"h-full\">\n\t\t<p className=\"flex h-full min-h-12 w-full items-center justify-center gap-2 text-2xl/none text-placeholder\">\n\t\t\t<span>\n\t\t\t\t<Icon icon={faTable} />\n\t\t\t</span>\n\t\t\t<span className=\"text-base/none font-medium\">{emptyText}</span>\n\t\t</p>\n\t</td>\n);\n","import { Row } from \"@tanstack/react-table\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { TableBodyProps } from \"./TableBody\";\nimport { handleCellStyle, renderCell } from \"./utils\";\n\ntype TableRowProps<T> = Omit<TableBodyProps<T>, \"rootClassName\"> & { row: Row<T> };\n\nexport const TableRow = <T,>({ table, rowClassName, cellClassName, row }: TableRowProps<T>) => {\n\tconst hasRowClick = !!table.options.meta?.onRowClick;\n\tconst isStaticSubRow = !!table.options.meta?.staticSubRows;\n\n\tconst onRowClick = (ev: React.MouseEvent<HTMLTableCellElement>, row: Row<T>) => {\n\t\t// Since we're putting the handler on the td, we can check if the target and currentTarget\n\t\t// are the same element. If a button was clicked _inside_ the td, this would be false.\n\t\t// This prevents the rowClick from firing on a nested event handler firing.\n\t\tif (ev.target === ev.currentTarget) {\n\t\t\ttable.options.meta?.onRowClick?.(row, ev);\n\t\t}\n\t};\n\tconst cells = row.getVisibleCells();\n\n\treturn (\n\t\t<tr\n\t\t\tdata-active={table.options.meta?.activeRowId === row.id ? \"\" : undefined}\n\t\t\tdata-clickable={!isStaticSubRow && (hasRowClick || row.getCanExpand()) ? \"\" : undefined}\n\t\t\tdata-depth={isStaticSubRow ? row.depth : undefined}\n\t\t\tonClick={!isStaticSubRow && row.getCanExpand() ? row.getToggleExpandedHandler() : undefined}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"data-active:bg-indigo-100 data-clickable:hover:cursor-pointer data-clickable:hover:bg-surface-primary data-active:data-clickable:hover:bg-indigo-200\",\n\t\t\t\trowClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{cells.map((cell) => (\n\t\t\t\t<td\n\t\t\t\t\tkey={cell.id}\n\t\t\t\t\tonClickCapture={hasRowClick ? (ev) => onRowClick(ev, row) : undefined}\n\t\t\t\t\tclassName={cellClassName}\n\t\t\t\t\tstyle={handleCellStyle(cell)}\n\t\t\t\t>\n\t\t\t\t\t{renderCell(cell)}\n\t\t\t\t</td>\n\t\t\t))}\n\t\t</tr>\n\t);\n};\n","import { Cell, Column, flexRender, Header } from \"@tanstack/react-table\";\n\ntype HeaderOrCell<T> = Header<T, unknown> | Cell<T, unknown>;\n\nexport const isValidCell = <T>(cell: Cell<T, unknown>) => {\n\tif (!(cell.column.columnDef.cell instanceof Function)) {\n\t\treturn null;\n\t}\n\treturn cell.column.columnDef.cell(cell.getContext()) as T;\n};\n\nexport const renderHeader = <T>(header: Header<T, unknown>) => {\n\tif (header.isPlaceholder) {\n\t\treturn null;\n\t}\n\treturn flexRender(header.column.columnDef.header, header.getContext());\n};\n\nexport const renderFooter = <T>(header: Header<T, unknown>) => {\n\tif (header.isPlaceholder) {\n\t\treturn null;\n\t}\n\treturn flexRender(header.column.columnDef.footer, header.getContext());\n};\n\nexport const renderCell = <T>(cell: Cell<T, unknown>) => {\n\tif (isValidCell<T>(cell) == null) {\n\t\treturn null;\n\t}\n\treturn flexRender(cell.column.columnDef.cell, cell.getContext());\n};\n\nconst sumOffset = <T>(offset: number, { getSize }: Column<T, unknown>) => getSize() + offset;\nconst getCols = <T>(item: HeaderOrCell<T>) => {\n\tconst cols = item.getContext().table.getAllColumns();\n\tconst index = cols.findIndex(({ id }) => id === item.column.id);\n\n\treturn { cols, index };\n};\n\nconst getLeftStickyOffset = <T>(item: HeaderOrCell<T>) => {\n\tconst { cols, index } = getCols(item);\n\tif (index === 0) {\n\t\treturn 0;\n\t}\n\treturn cols.slice(0, index).reduce(sumOffset, 0);\n};\n\nconst getRightStickyOffset = <T>(item: HeaderOrCell<T>) => {\n\tconst { cols, index } = getCols(item);\n\tif (index === cols.length - 1) {\n\t\treturn 0;\n\t}\n\treturn cols.slice(0, index).reduceRight(sumOffset, 0);\n};\n\nexport const handleSize = <T>(item: HeaderOrCell<T>) => {\n\tconst size = item.column.getSize();\n\tif (!size) {\n\t\treturn;\n\t}\n\n\treturn { width: size, minWidth: size };\n};\n\nexport const handleStyle = <T>(item: HeaderOrCell<T>, _style?: React.CSSProperties) => {\n\tconst style: React.CSSProperties = _style ? { ..._style } : {};\n\n\tif (item.column.columnDef.meta?.unPadded) {\n\t\tstyle.padding = 0;\n\t\tstyle.paddingTop = 0;\n\t\tstyle.paddingRight = 0;\n\t\tstyle.paddingBottom = 0;\n\t\tstyle.paddingLeft = 0;\n\t}\n\n\tif (item.column.columnDef.meta?.verticalAlign) {\n\t\tstyle.verticalAlign = item.column.columnDef.meta.verticalAlign;\n\t}\n\n\tconst size = item.column.getSize();\n\tif (!size) {\n\t\treturn style;\n\t}\n\n\tconst table = item.getContext().table;\n\tconst isResizable = table.options.enableColumnResizing;\n\tconst isLastVisible = isResizable && table.getVisibleLeafColumns().at(-1)?.id === item.column.id;\n\n\tstyle.minWidth = size;\n\tif (!isLastVisible) {\n\t\tstyle.width = size;\n\t}\n\tif (isResizable) {\n\t\tstyle.overflow = \"hidden\";\n\t\tstyle.textOverflow = \"ellipsis\";\n\t}\n\n\tif (item.column.columnDef.meta?.sticky === \"left\") {\n\t\tstyle.position = \"sticky\";\n\t\tstyle.left = getLeftStickyOffset(item);\n\t}\n\tif (item.column.columnDef.meta?.sticky === \"right\") {\n\t\tstyle.position = \"sticky\";\n\t\tstyle.right = getRightStickyOffset(item);\n\t}\n\n\treturn style;\n};\n\nexport const handleHeaderStyle = handleStyle;\nexport const handleCellStyle = handleStyle;\n","import { faArrowDownWideShort, faArrowUpWideShort } from \"@fortawesome/sharp-solid-svg-icons\";\nimport type { Header, SortDirection, Table } from \"@tanstack/react-table\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { Icon } from \"../icon\";\nimport { handleHeaderStyle, renderHeader } from \"./utils\";\n\ntype TableHeaderProps<T> = {\n\ttable: Table<T>;\n\tvariant?: string;\n\trootClassName?: string;\n\trowClassName?: string;\n\tcellClassName?: string;\n};\nexport const TableHeader = <T,>({\n\ttable,\n\tvariant,\n\trootClassName,\n\trowClassName,\n\tcellClassName,\n}: TableHeaderProps<T>) => {\n\treturn (\n\t\t<thead className={rootClassName}>\n\t\t\t{table.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t<tr key={headerGroup.id} className={rowClassName}>\n\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t<Th\n\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\tcolSpan={header.colSpan}\n\t\t\t\t\t\t\tclassName={cellClassName}\n\t\t\t\t\t\t\tstyle={handleHeaderStyle(header)}\n\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{renderHeader(header)}\n\t\t\t\t\t\t</Th>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))}\n\t\t</thead>\n\t);\n};\n\nconst Th = <T,>({\n\theader,\n\tvariant,\n\tchildren,\n\t...props\n}: { header: Header<T, unknown>; variant?: string } & React.ComponentPropsWithoutRef<\"th\">) => {\n\tconst isLastInRow = header.index === header.headerGroup.headers.length - 1;\n\tconst canResize =\n\t\t!isLastInRow && !!header.getContext().table.options.columnResizeMode && header.column.getCanResize();\n\tconst isSubtable = variant === \"subtable\";\n\tconst resizeHandle = canResize && (\n\t\t<div\n\t\t\tonMouseDown={header.getResizeHandler()}\n\t\t\tonTouchStart={header.getResizeHandler()}\n\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\tdata-resizing={header.column.getIsResizing() ? \"\" : undefined}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"absolute top-0 right-0 bottom-0 z-10 w-1 cursor-col-resize touch-none select-none\",\n\t\t\t\t\"after:pointer-events-none after:absolute after:top-0 after:right-0 after:h-screen after:w-0.5 after:transition-colors after:duration-150 after:content-['']\",\n\t\t\t\tisSubtable\n\t\t\t\t\t? \"hover:after:bg-indigo-600 data-resizing:after:bg-indigo-600\"\n\t\t\t\t\t: \"group-hover:after:bg-gray-200 hover:after:bg-indigo-600 data-resizing:after:bg-indigo-600\",\n\t\t\t)}\n\t\t/>\n\t);\n\n\tif (header.column.getIsSorted()) {\n\t\treturn (\n\t\t\t<th\n\t\t\t\t{...props}\n\t\t\t\tdata-clickable=\"ok\"\n\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\tclassName={twJoin(props.className, canResize && \"group relative\")}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<span className=\"ml-1.5\">\n\t\t\t\t\t<SortIcon dir={header.column.getIsSorted()} />\n\t\t\t\t</span>\n\t\t\t\t{resizeHandle}\n\t\t\t</th>\n\t\t);\n\t}\n\tif (header.column.getCanSort()) {\n\t\treturn (\n\t\t\t<th\n\t\t\t\t{...props}\n\t\t\t\tdata-clickable=\"ok\"\n\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\tclassName={twJoin(props.className, canResize && \"group relative\")}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<span className=\"invisible ml-1.5 group-hover:visible\">\n\t\t\t\t\t<SortIcon dir={header.column.getNextSortingOrder()} />\n\t\t\t\t</span>\n\t\t\t\t{resizeHandle}\n\t\t\t</th>\n\t\t);\n\t}\n\treturn (\n\t\t<th {...props} className={twJoin(props.className, canResize && \"group relative\")}>\n\t\t\t{children}\n\t\t\t{resizeHandle}\n\t\t</th>\n\t);\n};\n\ntype SortIconProps = {\n\tdir: false | SortDirection;\n};\nexport const SortIcon = ({ dir }: SortIconProps) => {\n\tif (dir === \"asc\") {\n\t\treturn <Icon icon={faArrowUpWideShort} />;\n\t}\n\tif (dir === \"desc\") {\n\t\treturn <Icon icon={faArrowDownWideShort} />;\n\t}\n\treturn null;\n};\n","import type { Table as ReactTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useEffect, useRef } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { LoadingBar } from \"@/core/loaders/LoadingBar\";\nimport { Skeleton } from \"@/core/skeleton\";\n\nimport { bodyClassNames, headerClassNames, type TableVariant } from \"./Table\";\nimport { TableBody } from \"./TableBody\";\nimport { TableHeader } from \"./TableHeader\";\nimport { TableRow } from \"./TableRow\";\n\nconst DEFAULT_ROW_HEIGHT = 37;\nconst DEFAULT_OVERSCAN = 5;\n\nexport type VirtualizedTableProps<T> = {\n\t/** The TanStack table instance to render. */\n\ttable: ReactTable<T>;\n\t/** Visual style of the table. Defaults to `default`. */\n\tvariant?: Extract<TableVariant, \"default\" | \"subtable\">;\n\t/** Whether to show the loading state. Falls back to the table's `meta.isLoading` when omitted. */\n\tloading?: boolean;\n\t/** Estimated height in pixels of each row, used to size the virtualizer. Defaults to 37. */\n\trowHeight?: number;\n\t/** Number of rows to render beyond the visible window. Defaults to 5. */\n\toverscan?: number;\n};\n\n/**\n * Table that renders only the rows in (and near) the viewport using row virtualization, so large\n * datasets stay performant.\n *\n * Supports infinite scroll via the table's `meta.infiniteScroll`: the next page is fetched as the\n * user nears the end, with skeleton rows shown while more pages remain.\n */\nexport const VirtualizedTable = <T,>({\n\ttable,\n\tvariant = \"default\",\n\tloading: loadingProp,\n\trowHeight = DEFAULT_ROW_HEIGHT,\n\toverscan = DEFAULT_OVERSCAN,\n}: VirtualizedTableProps<T>) => {\n\tconst loading = loadingProp ?? table.options.meta?.isLoading;\n\tconst fetching = loadingProp ?? table.options.meta?.isFetching;\n\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\tconst isSubtable = variant === \"subtable\";\n\n\tconst infiniteScroll = table.options.meta?.infiniteScroll;\n\tconst colCount = table.getVisibleLeafColumns().length;\n\tconst coreRows = table.getCoreRowModel().rows;\n\tconst rows = table.getRowModel().rows;\n\tconst uiLoading = loading ? \"loading\" : undefined;\n\tconst showLoadingBar = fetching && coreRows.length > 0;\n\tconst resizeStyle = table.options.enableColumnResizing\n\t\t? ({ width: table.getCenterTotalSize(), tableLayout: \"fixed\" } as const)\n\t\t: undefined;\n\tconst tableElementRef = table.options.meta?.tableElementRef ?? null;\n\n\tconst rowVirtualizer = useVirtualizer({\n\t\tcount: rows.length,\n\t\tgetScrollElement: () => scrollRef.current,\n\t\testimateSize: () => rowHeight,\n\t\toverscan,\n\t});\n\tconst virtualRows = rowVirtualizer.getVirtualItems();\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tuseEffect(() => {\n\t\tconst lastItem = virtualRows.at(-1);\n\t\tif (!lastItem) return;\n\t\tif (lastItem.index >= rows.length - 1 && infiniteScroll?.hasNextPage && !infiniteScroll.isFetchingNextPage) {\n\t\t\tinfiniteScroll.fetchNextPage();\n\t\t}\n\t}, [virtualRows, rows.length, infiniteScroll]);\n\n\tconst skeletonRows = infiniteScroll?.hasNextPage\n\t\t? Array.from({ length: 3 }).map((_, i) => (\n\t\t\t\t<tr key={`skeleton-${i}`} className=\"[&:not(:last-child)>td]:border-b [&:not(:last-child)>td]:border-gray-200\">\n\t\t\t\t\t{Array.from({ length: colCount }).map((_, j) => (\n\t\t\t\t\t\t<td key={j} className=\"p-2\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-full\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))\n\t\t: null;\n\n\tconst paddingTop = virtualRows.length > 0 ? (virtualRows[0]?.start ?? 0) : 0;\n\tconst paddingBottom = virtualRows.length > 0 ? rowVirtualizer.getTotalSize() - (virtualRows.at(-1)?.end ?? 0) : 0;\n\n\tconst { rootClassName: bodyRootClassName, ...bodyRowCellClassNames } = bodyClassNames(variant);\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRef}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"relative mb-auto\",\n\t\t\t\tisSubtable\n\t\t\t\t\t? \"min-w-full\"\n\t\t\t\t\t: twJoin(\n\t\t\t\t\t\t\t\"rounded-md border bg-white\",\n\t\t\t\t\t\t\tcoreRows.length === 0\n\t\t\t\t\t\t\t\t? twJoin(\"h-full\", loading ? \"overflow-hidden\" : \"overflow-auto overscroll-none\")\n\t\t\t\t\t\t\t\t: \"max-h-full min-h-0 overflow-auto overscroll-none\",\n\t\t\t\t\t\t),\n\t\t\t)}\n\t\t>\n\t\t\t{showLoadingBar && (\n\t\t\t\t<LoadingBar\n\t\t\t\t\tclassName={twJoin(\"inset-x-0 top-0 z-10 h-1 rounded-none\", isSubtable ? \"absolute\" : \"sticky -mb-1\")}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<table\n\t\t\t\tref={tableElementRef}\n\t\t\t\tdata-ui={uiLoading}\n\t\t\t\tstyle={resizeStyle}\n\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\"relative min-w-full border-separate border-spacing-0 data-[ui=loading]:pointer-events-none\",\n\t\t\t\t\t!isSubtable && coreRows.length === 0 && !loading && \"h-full\",\n\t\t\t\t\tresizeStyle && \"overflow-clip\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<TableHeader table={table} variant={variant} {...headerClassNames(variant)} />\n\t\t\t\t{rows.length === 0 ? (\n\t\t\t\t\t<TableBody table={table} {...bodyClassNames(variant)} loading={loading} />\n\t\t\t\t) : (\n\t\t\t\t\t<tbody className={bodyRootClassName}>\n\t\t\t\t\t\t{paddingTop > 0 && (\n\t\t\t\t\t\t\t<tr aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<td colSpan={colCount} style={{ height: paddingTop, padding: 0, border: \"none\" }} />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{virtualRows.map((virtualRow) => {\n\t\t\t\t\t\t\tconst row = rows[virtualRow.index];\n\t\t\t\t\t\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\t\t\t\t\t\treturn <TableRow key={row.id} table={table} row={row} {...bodyRowCellClassNames} />;\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{paddingBottom > 0 && (\n\t\t\t\t\t\t\t<tr aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<td colSpan={colCount} style={{ height: paddingBottom, padding: 0, border: \"none\" }} />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{skeletonRows}\n\t\t\t\t\t</tbody>\n\t\t\t\t)}\n\t\t\t</table>\n\t\t</div>\n\t);\n};\n","import { ColumnSort, getCoreRowModel, Table, TableMeta, TableOptions, useReactTable } from \"@tanstack/react-table\";\nimport { useLayoutEffect } from \"react\";\nimport { useEffectEvent } from \"use-effect-event\";\n\nimport { AllAsNever } from \"@/core/types\";\n\nexport type SortOptions = {\n\tsort: string | undefined;\n\tonSortColumn?: (newSort: ColumnSort | undefined) => void;\n};\n\nexport type DiscriminatedSortOptions = SortOptions | AllAsNever<SortOptions>;\nexport type CustomTableOptions<T> = Simplify<\n\tOmit<TableOptions<T>, \"getCoreRowModel\"> &\n\t\tDiscriminatedSortOptions &\n\t\tTableMeta<T> & {\n\t\t\ttableRef?: (table: Table<T>) => void;\n\t\t}\n>;\n\nexport const useTable = <T>({ tableRef, ...options }: CustomTableOptions<T>) => {\n\t// This helps avoid specifying `enableSorting` on every column def when\n\t// nothing in the table is sortable\n\tconst enableSorting = !!options.state?.sorting && !!options.onSortingChange;\n\n\tconst table = useReactTable<T>({\n\t\t...options,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t// This is a hack to allow the columns to flex by default,\n\t\t// and, then when size is overridden, they become fixed\n\t\tdefaultColumn: {\n\t\t\t...options.defaultColumn,\n\t\t\tminSize: options.columnResizeMode ? (options.defaultColumn?.minSize ?? 50) : 0,\n\t\t\tsize: options.defaultColumn?.size ?? 0,\n\t\t},\n\t\tmeta: {\n\t\t\tisLoading: options.isLoading,\n\t\t\tisFetching: options.isFetching,\n\t\t\temptyText: options.emptyText,\n\t\t\tactiveRowId: options.activeRowId,\n\t\t\tonRowClick: options.onRowClick,\n\t\t\tstaticSubRows: options.staticSubRows,\n\t\t\ttableElementRef: options.tableElementRef,\n\t\t\tinfiniteScroll: options.infiniteScroll,\n\t\t},\n\t\tmanualSorting: true,\n\t\tenableMultiSort: false,\n\t\tenableSorting,\n\t\tenableColumnResizing: !!options.columnResizeMode,\n\t});\n\n\tconst syncTableRef = useEffectEvent(() => {\n\t\ttableRef?.(table);\n\t});\n\n\tuseLayoutEffect(() => {\n\t\tsyncTableRef();\n\t}, [table]);\n\n\treturn table;\n};\n","import { ColumnSizingInfoState, ColumnSizingState, Table } from \"@tanstack/react-table\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\n\nimport type { CustomTableOptions } from \"./useTable\";\n\nconst defaultSizingInfo: ColumnSizingInfoState = {\n\tstartOffset: null,\n\tstartSize: null,\n\tdeltaOffset: null,\n\tdeltaPercentage: null,\n\tisResizingColumn: false,\n\tcolumnSizingStart: [],\n};\n\nexport const useColumnResizing = <T>(options: CustomTableOptions<T>) => {\n\tconst defaultMinSize = options.defaultColumn?.minSize ?? 50;\n\n\tconst [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\tconst [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>(defaultSizingInfo);\n\tconst sizingInfoRef = useRef<ColumnSizingInfoState>(defaultSizingInfo);\n\tconst tableRef = useRef<Table<T> | null>(null);\n\tconst tableElementRef = useRef<HTMLTableElement>(null);\n\tconst startSizesRef = useRef<[string, number, number][]>([]);\n\tconst excessRef = useRef(0);\n\tconst resizingColRef = useRef<string | false>(false);\n\tconst prevVisibleIdsRef = useRef(\"\");\n\n\t/* eslint-disable react-compiler/react-compiler -- intentionally runs every render; all inputs are refs */\n\t/* eslint-disable react-hooks/exhaustive-deps */\n\tuseLayoutEffect(() => {\n\t\tconst table = tableRef.current;\n\t\tconst tableEl = tableElementRef.current;\n\t\tif (!table || !tableEl || !prevVisibleIdsRef.current) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst visibleCols = table.getVisibleLeafColumns();\n\t\tconst visibleIds = visibleCols.map((c) => c.id).join(\",\");\n\n\t\tif (visibleIds === prevVisibleIdsRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tprevVisibleIdsRef.current = visibleIds;\n\n\t\tif (sizingInfoRef.current.isResizingColumn || visibleCols.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst tableWidth = tableEl.offsetWidth;\n\t\tif (!tableWidth) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTotal = visibleCols.reduce((sum, col) => sum + col.getSize(), 0);\n\t\tif (currentTotal <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scale = tableWidth / currentTotal;\n\t\tconst scaledSizes = visibleCols.map((col) => Math.round(col.getSize() * scale));\n\t\tconst usedByOthers = scaledSizes.slice(0, -1).reduce((sum, s) => sum + s, 0);\n\n\t\t// @ts-expect-error noUncheckedIndexedAccess\n\t\tconst next: ColumnSizingState = Object.fromEntries(\n\t\t\tvisibleCols.map((col, i) => [col.id, i === visibleCols.length - 1 ? tableWidth - usedByOthers : scaledSizes[i]]),\n\t\t);\n\n\t\tsetColumnSizing(next);\n\t});\n\t/* eslint-enable react-compiler/react-compiler */\n\t/* eslint-enable react-hooks/exhaustive-deps */\n\n\treturn {\n\t\t...options,\n\t\tcolumnResizeMode: options.columnResizeMode ?? (\"onChange\" as const),\n\t\ttableElementRef,\n\t\ttableRef: (table: Table<T>) => {\n\t\t\ttableRef.current = table;\n\t\t\tif (!prevVisibleIdsRef.current) {\n\t\t\t\tprevVisibleIdsRef.current = table\n\t\t\t\t\t.getVisibleLeafColumns()\n\t\t\t\t\t.map((c) => c.id)\n\t\t\t\t\t.join(\",\");\n\t\t\t}\n\t\t},\n\t\tdefaultColumn: {\n\t\t\tsize: 150,\n\t\t\t...options.defaultColumn,\n\t\t},\n\t\tstate: {\n\t\t\t...options.state,\n\t\t\tcolumnSizing,\n\t\t\tcolumnSizingInfo,\n\t\t},\n\t\tonColumnSizingInfoChange: (\n\t\t\tupdater: Parameters<Exclude<CustomTableOptions<T>[\"onColumnSizingInfoChange\"], undefined>>[0],\n\t\t) => {\n\t\t\tconst prev = sizingInfoRef.current;\n\t\t\tconst next = typeof updater === \"function\" ? updater(prev) : updater;\n\n\t\t\t// TanStack only snapshots the resized column's leaf headers in columnSizingStart.\n\t\t\t// We need ALL visible columns to find and compensate the neighbor.\n\t\t\tif (next.isResizingColumn && !prev.isResizingColumn && tableRef.current) {\n\t\t\t\tconst cols = tableRef.current.getVisibleLeafColumns();\n\t\t\t\tconst tableWidth = tableElementRef.current?.offsetWidth;\n\t\t\t\tconst lastIdx = cols.length - 1;\n\t\t\t\tconst nonLastSum = cols.slice(0, lastIdx).reduce((sum, col) => sum + col.getSize(), 0);\n\t\t\t\tstartSizesRef.current = cols.map((col, i) => [\n\t\t\t\t\tcol.id,\n\t\t\t\t\ti === lastIdx && tableWidth ? tableWidth - nonLastSum : col.getSize(),\n\t\t\t\t\tcol.columnDef.minSize ?? defaultMinSize,\n\t\t\t\t]);\n\t\t\t\texcessRef.current = 0;\n\t\t\t\tresizingColRef.current = next.isResizingColumn;\n\t\t\t}\n\n\t\t\tsizingInfoRef.current = next;\n\t\t\tsetColumnSizingInfo(next);\n\t\t},\n\t\tonColumnSizingChange: (\n\t\t\tupdater: Parameters<Exclude<CustomTableOptions<T>[\"onColumnSizingChange\"], undefined>>[0],\n\t\t) => {\n\t\t\t// Capture excess before setColumnSizing so strict mode double-invocation reads the same value\n\t\t\tconst currentExcess = excessRef.current;\n\t\t\tconst resizingCol = sizingInfoRef.current.isResizingColumn || resizingColRef.current;\n\n\t\t\tsetColumnSizing((prev) => {\n\t\t\t\tconst next = typeof updater === \"function\" ? updater(prev) : updater;\n\n\t\t\t\tif (!resizingCol || !startSizesRef.current.length) return next;\n\n\t\t\t\tconst entries = startSizesRef.current;\n\t\t\t\tconst idx = entries.findIndex(([id]) => id === resizingCol);\n\t\t\t\tif (idx === -1 || idx >= entries.length - 1) return next;\n\n\t\t\t\t// noUncheckedIndexAccess - this should be fixed\n\t\t\t\tconst [colId, colStart, colMinSize] = entries[idx]!;\n\t\t\t\t// noUncheckedIndexAccess - this should be fixed\n\t\t\t\tconst [nextId, nextStart, nextMinSize] = entries[idx + 1]!;\n\n\t\t\t\tconst rawNewSize = next[colId] ?? colStart;\n\t\t\t\tconst correctedNewSize = rawNewSize - currentExcess;\n\t\t\t\tconst delta = correctedNewSize - colStart;\n\t\t\t\tconst nextNewSize = Math.max(nextMinSize, nextStart - delta);\n\t\t\t\tconst effectiveDelta = nextStart - nextNewSize;\n\t\t\t\tconst clampedColSize = Math.max(colMinSize, colStart + effectiveDelta);\n\t\t\t\tconst actualDelta = clampedColSize - colStart;\n\n\t\t\t\t// Update refs inside the updater so they're set during React's batch flush\n\t\t\t\tif (sizingInfoRef.current.isResizingColumn) {\n\t\t\t\t\texcessRef.current = rawNewSize - clampedColSize;\n\t\t\t\t} else {\n\t\t\t\t\texcessRef.current = 0;\n\t\t\t\t\tresizingColRef.current = false;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...next,\n\t\t\t\t\t[colId]: clampedColSize,\n\t\t\t\t\t[nextId]: nextStart - actualDelta,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t};\n};\n","import { ToggleGroup, ToggleGroupItem } from \"@radix-ui/react-toggle-group\";\nimport { motion } from \"motion/react\";\nimport { Fragment, useId } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { TabDefinition } from \"../tabs\";\n\nexport type TabGroupProps<TabId extends string> = {\n\t/** The selectable tabs; each supplies an `id`, `label`, and optional `disabled`. */\n\ttabs: TabDefinition<TabId>[];\n\t/** `id` of the currently selected tab (controlled). */\n\tcurrentTab: TabId;\n\t/** Called with the newly selected tab's `id`. */\n\tsetCurrentTab: (id: TabId) => void;\n\t/**\n\t * Control density.\n\t * @default md\n\t */\n\tsize?: \"sm\" | \"md\";\n};\n\n/**\n * A segmented control for switching between a small set of mutually exclusive tabs.\n *\n * Controlled single-select: the tab whose `id` matches `currentTab` is active, and `setCurrentTab`\n * fires on change. An animated pill slides to the active tab. Use this for a compact, bordered\n * toggle; for full page-level tab panels use the `Tabs` component instead.\n *\n * @example\n * <TabGroup\n * tabs={[{ id: \"all\", label: \"All\" }, { id: \"mine\", label: \"Mine\" }]}\n * currentTab={tab}\n * setCurrentTab={setTab}\n * />\n */\nexport const TabGroup = <TabId extends string>({\n\ttabs,\n\tcurrentTab,\n\tsetCurrentTab,\n\tsize = \"md\",\n}: TabGroupProps<TabId>) => {\n\tconst layoutId = useId();\n\n\treturn (\n\t\t<ToggleGroup\n\t\t\ttype=\"single\"\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value: TabId) => {\n\t\t\t\tif (value) setCurrentTab(value);\n\t\t\t}}\n\t\t\tclassName={twJoin(\n\t\t\t\t\"flex w-full justify-between gap-1 rounded-lg border border-surface-neutral bg-surface-light\",\n\t\t\t\tsize === \"sm\" ? \"p-1\" : \"p-0.5\",\n\t\t\t)}\n\t\t>\n\t\t\t{tabs.map(({ id, label, disabled }, index) => (\n\t\t\t\t<Fragment key={id}>\n\t\t\t\t\t<ToggleGroupItem\n\t\t\t\t\t\tvalue={id}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={twJoin(\n\t\t\t\t\t\t\t\"relative flex w-full items-center justify-center rounded-md border transition-colors\",\n\t\t\t\t\t\t\tdisabled && \"cursor-not-allowed opacity-50\",\n\t\t\t\t\t\t\t!disabled && \"focus-visible:border-indigo-700 focus-visible:outline-none\",\n\t\t\t\t\t\t\tid !== currentTab && \"border-transparent\",\n\t\t\t\t\t\t\tid !== currentTab && !disabled && \"hover:border-indigo-200\",\n\t\t\t\t\t\t\tid === currentTab && !disabled && \"border-indigo-400 bg-surface-neutral\",\n\t\t\t\t\t\t\tsize === \"sm\" ? \"px-1.5 py-1\" : \"px-2 py-1\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{id === currentTab && !disabled && (\n\t\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t\t\t\tclassName=\"absolute inset-0 rounded-md bg-button-white ring-2 ring-indigo-100\"\n\t\t\t\t\t\t\t\ttransition={{ type: \"spring\", stiffness: 500, damping: 40 }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<span className=\"relative z-1\">{label}</span>\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t{index !== tabs.length - 1 && <div className=\"z-2 my-1 flex w-px bg-gray-300\" />}\n\t\t\t\t</Fragment>\n\t\t\t))}\n\t\t</ToggleGroup>\n\t);\n};\n","import { Content, List, Root, TabsContentProps } from \"@radix-ui/react-tabs\";\nimport { PropsWithChildren, useId } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { createContextHelper } from \"@/core/utils/create-context-helper\";\n\nimport { TabsTrigger } from \"./Trigger\";\n\nexport type TabDefinition<TabId extends string> = {\n\tid: TabId;\n\tlabel: React.ReactNode;\n\tdisabled?: boolean;\n\tfsId?: string;\n};\n\nexport type TabsProps<TabId extends string> = PropsWithChildren & {\n\ttabs: readonly TabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tsetCurrentTab: (id: TabId) => void;\n\tclassName?: string;\n\ttabsListClassName?: string;\n\ttabsListContainerClassName?: string;\n\ttabsListTriggerClassName?: string;\n\textraNode?: React.ReactNode;\n};\n\ntype TabsContext = {\n\tcurrentTab: string;\n};\nconst [Provider, useContext] = createContextHelper<TabsContext>();\n\nexport const Tabs = <TabId extends string>({\n\ttabs,\n\tclassName,\n\ttabsListClassName,\n\ttabsListContainerClassName,\n\ttabsListTriggerClassName,\n\tcurrentTab,\n\tsetCurrentTab,\n\tchildren,\n\textraNode,\n}: TabsProps<TabId>) => {\n\t// layoutId is used to animate the underline sliding between tabs\n\tconst layoutId = useId();\n\n\treturn (\n\t\t<Provider currentTab={currentTab}>\n\t\t\t<Root className={className} value={currentTab} onValueChange={(id) => setCurrentTab(id as TabId)}>\n\t\t\t\t<div className={twJoin(\"flex gap-4\", tabsListContainerClassName)}>\n\t\t\t\t\t<List className={twJoin(\"flex space-x-4 overflow-x-auto pb-0.5\", tabsListClassName)}>\n\t\t\t\t\t\t{tabs.map(({ id, label, disabled, fsId }) => (\n\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tclassName={tabsListTriggerClassName}\n\t\t\t\t\t\t\t\tfsId={fsId}\n\t\t\t\t\t\t\t\tisActive={currentTab === id}\n\t\t\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</List>\n\t\t\t\t\t{extraNode}\n\t\t\t\t</div>\n\t\t\t\t{children}\n\t\t\t</Root>\n\t\t</Provider>\n\t);\n};\n\nexport type TabContentProps<TabId = string> = {\n\tid: TabId;\n} & Omit<TabsContentProps, \"value\">;\nconst TabContent = <TabId extends string>({ id, ...rest }: TabContentProps<TabId>) => {\n\treturn <Content value={id} {...rest} />;\n};\n\n/**\n * Tab content that's never unmounted, only hidden.\n */\nconst AlwaysMountedTabContent = <TabId extends string>({\n\tid,\n\tvisibleClassName,\n\tclassName,\n\tchildren,\n}: TabContentProps<TabId> & {\n\tvisibleClassName?: string;\n}) => {\n\tconst { currentTab } = useContext();\n\tconst visible = id === currentTab;\n\treturn <div className={twJoin(visible ? visibleClassName : \"hidden\", className)}>{children}</div>;\n};\nTabs.TabContent = TabContent;\nTabs.AlwaysMountedTabContent = AlwaysMountedTabContent;\n","import { Trigger } from \"@radix-ui/react-tabs\";\nimport { motion } from \"motion/react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { twMerge } from \"@/core/twMerge\";\n\nexport type TabsTriggerProps<TabId extends string> = {\n\tid: TabId;\n\tlabel: React.ReactNode;\n\tdisabled?: boolean;\n\tfsId?: string;\n\textra?: React.ReactNode;\n\tclassName?: string;\n\tisActive: boolean;\n\tlayoutId?: string;\n};\n\nexport const TabsTrigger = <TabId extends string>({\n\tid,\n\tlabel,\n\tdisabled,\n\tfsId,\n\textra,\n\tclassName,\n\tisActive,\n\tlayoutId,\n}: TabsTriggerProps<TabId>) => (\n\t<Trigger\n\t\tclassName={twMerge(\n\t\t\t\"relative h-full border-b-2 border-transparent px-1 py-1 font-medium whitespace-nowrap transition-colors duration-150 data-[state='active']:text-indigo-700 data-[state='inactive']:text-muted data-[state='inactive']:hover:border-surface-neutral data-[state='inactive']:hover:text-neutral\",\n\t\t\tclassName,\n\t\t)}\n\t\tvalue={id}\n\t\tdisabled={disabled}\n\t\tfs-id={fsId}\n\t>\n\t\t{label}\n\t\t{extra && <span>{extra}</span>}\n\t\t{isActive && (\n\t\t\t<motion.span\n\t\t\t\tlayoutId={layoutId}\n\t\t\t\tclassName=\"absolute right-0 -bottom-0.5 left-0 h-0.5 bg-current\"\n\t\t\t\ttransition={{ type: \"spring\", stiffness: 500, damping: 40 }}\n\t\t\t/>\n\t\t)}\n\t</Trigger>\n);\n","import { Content, List, Root, TabsContentProps } from \"@radix-ui/react-tabs\";\nimport { PropsWithChildren, useId } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\nimport { createContextHelper } from \"@/core/utils/create-context-helper\";\n\nimport { TabsTrigger } from \"./Trigger\";\n\nexport type ComposableTabDefinition<TabId extends string> = {\n\tid: TabId;\n\tlabel: React.ReactNode;\n\tdisabled?: boolean;\n};\n\ntype ComposableTabsContextValue<TabId extends string = string> = {\n\ttabs: readonly ComposableTabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tlayoutId: string;\n};\n\nconst [TabsProvider, useTabsContext] = createContextHelper<ComposableTabsContextValue>();\n\nexport type ComposableTabsListProps = {\n\tclassName?: string;\n\tcontainerClassName?: string;\n\textraNode?: React.ReactNode;\n};\n\nconst ComposableTabsList = ({ className, containerClassName, extraNode }: ComposableTabsListProps) => {\n\tconst { tabs, currentTab, layoutId } = useTabsContext();\n\n\treturn (\n\t\t<div className={twJoin(\"flex gap-4\", containerClassName)}>\n\t\t\t<List className={twJoin(\"flex space-x-4 overflow-x-auto\", className)}>\n\t\t\t\t{tabs.map(({ id, label, disabled }) => (\n\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisActive={currentTab === id}\n\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</List>\n\t\t\t{extraNode}\n\t\t</div>\n\t);\n};\n\nexport type ComposableTabContentProps<TabId = string> = {\n\tid: TabId;\n} & Omit<TabsContentProps, \"value\">;\n\nconst ComposableTabContent = <TabId extends string>({ id, ...rest }: ComposableTabContentProps<TabId>) => {\n\treturn <Content value={id} {...rest} />;\n};\n\nconst ComposableAlwaysMountedTabContent = <TabId extends string>({\n\tid,\n\tvisibleClassName,\n\tclassName,\n\tchildren,\n}: ComposableTabContentProps<TabId> & { visibleClassName?: string }) => {\n\tconst { currentTab } = useTabsContext();\n\tconst visible = id === currentTab;\n\treturn <div className={twJoin(visible ? visibleClassName : \"hidden\", className)}>{children}</div>;\n};\n\nexport type ComposableTabsProps<TabId extends string> = PropsWithChildren & {\n\ttabs: readonly ComposableTabDefinition<TabId>[];\n\tcurrentTab: TabId;\n\tsetCurrentTab: (id: TabId) => void;\n\tclassName?: string;\n};\n\nconst ComposableTabsRoot = <TabId extends string>({\n\ttabs,\n\tcurrentTab,\n\tsetCurrentTab,\n\tclassName,\n\tchildren,\n}: ComposableTabsProps<TabId>) => {\n\t// layoutId is used to animate the underline sliding between tabs\n\tconst layoutId = useId();\n\n\treturn (\n\t\t<TabsProvider tabs={tabs} currentTab={currentTab} layoutId={layoutId}>\n\t\t\t<Root className={className} value={currentTab} onValueChange={(id) => setCurrentTab(id as TabId)}>\n\t\t\t\t{children}\n\t\t\t</Root>\n\t\t</TabsProvider>\n\t);\n};\n\n// Use ComposableTabs when you want to use Tabs but have the list of tab controls and tab content in seperate parts of the UI\nexport const ComposableTabs = {\n\tRoot: ComposableTabsRoot,\n\tList: ComposableTabsList,\n\tTabContent: ComposableTabContent,\n\tAlwaysMountedTabContent: ComposableAlwaysMountedTabContent,\n};\n","import { faClose } from \"@fortawesome/sharp-solid-svg-icons\";\nimport * as React from \"react\";\n\nimport { Icon } from \"../icon\";\nimport { Label } from \"../label\";\nimport { Tooltip } from \"../tooltip\";\nimport { Intent } from \"../variants\";\n\nexport type TagLabelProps = {\n\t/** Tag content. */\n\tchildren: React.ReactNode;\n\t/** When `true`, renders a trailing close button that calls `onRemove`. */\n\tremovable?: boolean;\n\t/** Called when the remove button is clicked (only relevant with `removable`). */\n\tonRemove?: () => void;\n\t/**\n\t * Color intent of the tag.\n\t * @default default\n\t */\n\tintent?: Intent;\n};\n\nconst TagLabel = (\n\t{ children, removable, onRemove, intent = \"default\", ...rest }: TagLabelProps,\n\tref: React.ForwardedRef<HTMLSpanElement>,\n) => (\n\t<Label {...rest} ref={ref} intent={intent}>\n\t\t{children}\n\t\t{removable && (\n\t\t\t<button\n\t\t\t\tclassName=\"ml-1 inline-flex h-xs items-center px-1 text-muted hover:text-neutral focus:outline-hidden\"\n\t\t\t\tonClick={onRemove}\n\t\t\t>\n\t\t\t\t<Icon icon={faClose} />\n\t\t\t</button>\n\t\t)}\n\t</Label>\n);\n\nconst TagImpl = React.forwardRef(TagLabel);\n\nexport type TagProps = TagLabelProps & {\n\t/** Optional tooltip shown on hover; when set, the tag is wrapped in a {@link Tooltip}. */\n\ttooltip?: string;\n};\n\n/**\n * A compact, color-coded chip — e.g. for categories, statuses, or selected filter values.\n *\n * Built on {@link Label}, with optional removability (`removable` + `onRemove` render a close\n * button) and an optional hover `tooltip`. Set `intent` to control the color.\n *\n * @example\n * <Tag intent=\"primary\" removable onRemove={() => remove(id)}>\n * In progress\n * </Tag>\n */\nexport const Tag = ({ tooltip, ...rest }: TagProps) => {\n\tif (!tooltip) {\n\t\treturn <TagImpl {...rest} />;\n\t}\n\treturn <Tooltip trigger={<TagImpl {...rest} />} content={<p className=\"text-sm\">{tooltip}</p>} />;\n};\n"],"mappings":"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","names":["forwardRef","twJoin","Tag","jsx","forwardRef","twJoin","twJoin","twJoin","twJoin","jsx","jsx","jsx","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","twJoin","twJoin","jsx","jsx","jsxs","twJoin","React","jsx","React","forwardRef","twJoin","jsx","Content","Root","Trigger","useState","jsx","jsxs","useState","Root","Trigger","Content","faChevronDown","twJoin","React","React","jsx","Provider","useContext","jsx","Provider","state","jsx","jsxs","twJoin","faChevronDown","Content","RadixTooltip","twJoin","React","jsx","jsxs","twJoin","useCallback","faChevronRight","jsx","jsxs","faChevronRight","forwardRef","twJoin","jsx","jsxs","forwardRef","twJoin","jsx","useCallback","useState","React","forwardRef","twJoin","sizeStyles","jsx","jsxs","forwardRef","jsx","useState","useCallback","jsx","useCallback","useCallback","DatePickerLib","jsx","useCallback","DatePickerLib","jsx","jsx","forwardRef","twJoin","jsx","createContext","useContext","useMemo","React","Fragment","jsx","createContext","useMemo","useContext","createContext","useContext","useMemo","Fragment","jsx","createContext","useMemo","useContext","forwardRef","forwardRef","jsx","jsx","forwardRef","forwardRef","twJoin","jsx","jsx","jsxs","jsx","jsxs","twJoin","twJoin","jsx","twJoin","jsx","jsxs","twJoin","Fragment","jsx","jsxs","forwardRef","forwardRef","twJoin","jsx","jsxs","forwardRef","twJoin","forwardRef","twJoin","jsx","jsxs","forwardRef","twJoin","jsx","forwardRef","jsx","faExclamationCircle","faExclamationTriangle","forwardRef","twJoin","useState","jsx","jsxs","forwardRef","twJoin","faExclamationTriangle","faExclamationCircle","faCheckCircle","faExclamationCircle","faExclamationTriangle","forwardRef","twJoin","jsx","jsxs","twoDecimalFormatter","formatInput","roundToTwoDecimalPlaces","forwardRef","twJoin","faExclamationTriangle","faExclamationCircle","faCheckCircle","Fragment","jsx","jsxs","jsx","useEffect","useMemo","useState","faCheck","useMemo","useRef","useState","twJoin","faChevronDown","twJoin","jsx","twJoin","faChevronDown","useEffect","useRef","twJoin","jsx","jsxs","useRef","useEffect","twJoin","Fragment","jsx","jsxs","useState","useRef","useMemo","items","twJoin","faCheck","jsx","useMemo","useState","jsx","useState","useMemo","jsx","jsx","jsx","jsx","forwardRef","Fragment","jsx","jsxs","forwardRef","jsx","twJoin","React","jsx","jsx","jsxs","twJoin","forwardRef","twJoin","Fragment","jsx","jsxs","jsx","forwardRef","Fragment","jsx","jsxs","useCallback","twJoin","jsx","useCallback","twJoin","forwardRef","useEffect","useRef","twJoin","FontAwesomeIcon","twJoin","jsx","jsx","jsxs","jsx","jsx","jsxs","createContext","useContext","useCallback","useEffect","useRef","useRef","useCallback","useEffect","jsx","jsxs","useEffect","forwardRef","useRef","twJoin","faChevronDown","twJoin","jsx","Fragment","jsx","jsxs","faChevronDown","twJoin","FontAwesomeIcon","forwardRef","jsx","jsxs","forwardRef","FontAwesomeIcon","twJoin","jsx","jsxs","twJoin","twJoin","jsx","twJoin","React","twJoin","sizeStyles","colorStyles","jsx","LabelImpl","forwardRef","jsx","forwardRef","Content","Portal","Root","Trigger","twJoin","jsx","jsxs","Trigger","Portal","Content","twJoin","Root","jsx","jsx","Close","jsx","Close","Content","Portal","forwardRef","twJoin","jsx","jsx","jsx","Root","jsx","faClose","Close","jsx","Close","faClose","jsx","jsxs","Trigger","jsx","Trigger","Fragment","jsx","jsxs","React","Title","twJoin","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","ModalBodyImpl","twJoin","jsx","twJoin","jsx","jsxs","twJoin","useEffect","twJoin","useCallback","useRef","useState","entry","twJoin","jsx","row","twJoin","jsx","jsxs","_","twJoin","jsx","jsxs","twJoin","Fragment","jsx","jsxs","twJoin","useEffect","_","useEffect","useRef","twJoin","jsx","jsxs","useRef","useEffect","_","twJoin","useLayoutEffect","useRef","useState","Fragment","useId","twJoin","jsx","jsxs","Content","Root","useId","twJoin","Trigger","motion","jsx","jsxs","Trigger","motion","jsx","jsxs","Provider","useContext","useId","Root","twJoin","Content","Content","List","Root","useId","twJoin","jsx","jsxs","twJoin","List","Content","useId","Root","faClose","React","jsx","jsxs","faClose"]}
|