@platned/ui 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3211 -480
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1516 -105
- package/dist/index.d.ts +1516 -105
- package/dist/index.js +3109 -457
- package/dist/index.js.map +1 -1
- package/dist/sidebar.cjs +51 -125
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.d.cts +20 -1
- package/dist/sidebar.d.ts +20 -1
- package/dist/sidebar.js +78 -137
- package/dist/sidebar.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +7 -5
- package/tailwind-preset.cjs +240 -0
- package/tailwind-preset.js +0 -124
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/components/button.tsx","../src/components/icon-button.tsx","../src/components/button-group.tsx","../src/components/avatar.tsx","../src/components/avatar-group.tsx","../src/components/avatar-block.tsx","../src/components/nav-item.tsx","../src/components/input.tsx","../src/components/textarea.tsx","../src/components/select.tsx","../src/components/stepper.tsx","../src/components/multiselect-card.tsx","../src/components/data-table.tsx","../src/components/stat-tile.tsx","../src/components/toggle.tsx","../src/components/file-drop-zone.tsx","../src/components/form-card.tsx","../src/components/document-row.tsx","../src/components/modal.tsx","../src/components/role-badge.tsx","../src/components/role-combo-box.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport { Button } from './components/button';\nexport type { ButtonProps, ButtonVariant, ButtonSize } from './components/button';\n\nexport { IconButton } from './components/icon-button';\nexport type { IconButtonProps, IconButtonVariant } from './components/icon-button';\n\nexport { ButtonGroup } from './components/button-group';\nexport type { ButtonGroupProps, ButtonGroupItem, ButtonGroupVariant, ButtonGroupAlign } from './components/button-group';\n\nexport { Avatar } from './components/avatar';\nexport type { AvatarProps, AvatarInitialProps, AvatarImageProps, AvatarSize, AvatarShape } from './components/avatar';\n\nexport { AvatarGroup } from './components/avatar-group';\nexport type { AvatarGroupProps, AvatarGroupSpacing } from './components/avatar-group';\n\nexport { AvatarBlock } from './components/avatar-block';\nexport type { AvatarBlockProps } from './components/avatar-block';\n\nexport { NavItem } from './components/nav-item';\nexport type { NavItemProps } from './components/nav-item';\n\nexport { Input } from './components/input';\nexport type { InputProps, InputSize } from './components/input';\n\nexport { Textarea } from './components/textarea';\nexport type { TextareaProps } from './components/textarea';\n\nexport { Select } from './components/select';\nexport type { SelectProps, SelectOption } from './components/select';\n\nexport { Stepper } from './components/stepper';\nexport type { StepperProps, StepItem, StepStatus } from './components/stepper';\n\nexport { MultiSelectCard } from './components/multiselect-card';\nexport type { MultiSelectCardProps } from './components/multiselect-card';\n\nexport { DataTable, TableCellLeadText, TableCellText, TableCellBadge, TableCellStatusPill, TableCellProgress } from './components/data-table';\nexport type { ColumnDef } from './components/data-table';\n\nexport { StatTile } from './components/stat-tile';\nexport type { StatTileProps } from './components/stat-tile';\n\nexport { Toggle } from './components/toggle';\nexport type { ToggleProps } from './components/toggle';\n\nexport { FileDropZone } from './components/file-drop-zone';\nexport type { FileDropZoneProps } from './components/file-drop-zone';\n\nexport { FormCard, FormCardHeader, FormCardFooter } from './components/form-card';\nexport type { FormCardHeaderProps, FormCardFooterProps } from './components/form-card';\n\nexport { DocumentRow } from './components/document-row';\nexport type { DocumentRowProps, DocumentStatus } from './components/document-row';\n\nexport function Panel({\n children,\n className\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <section className={clsx('rounded-3xl border border-white/70 bg-white/90 p-6 shadow-panel backdrop-blur', className)}>\n {children}\n </section>\n );\n}\n\nexport function MetricCard({\n label,\n value,\n tone = 'default'\n}: {\n label: string;\n value: string | number;\n tone?: 'default' | 'signal' | 'ember' | 'moss';\n}) {\n const tones = {\n default: 'from-white to-slate-50 text-default',\n signal: 'from-brand-tertiary to-cyan-50 text-brand',\n ember: 'from-amber-50 to-orange-50 text-danger',\n moss: 'from-emerald-50 to-lime-50 text-positive'\n };\n\n return (\n <Panel className={clsx('bg-gradient-to-br', tones[tone])}>\n <p className=\"text-sm uppercase tracking-[0.2em] text-slate-500\">{label}</p>\n <p className=\"mt-3 text-3xl font-semibold\">{value}</p>\n </Panel>\n );\n}\n\nexport function SeverityBadge({ severity }: { severity?: string | null }) {\n const styles: Record<string, string> = {\n critical: 'bg-red-100 text-red-700',\n high: 'bg-orange-100 text-orange-700',\n medium: 'bg-amber-100 text-amber-700',\n low: 'bg-slate-100 text-slate-700'\n };\n\n return (\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide', styles[severity ?? 'low'])}>\n {severity ?? 'unknown'}\n </span>\n );\n}\n\nexport function SentimentBadge({ sentiment }: { sentiment?: string | null }) {\n const styles: Record<string, string> = {\n positive: 'bg-emerald-100 text-emerald-700',\n neutral: 'bg-slate-100 text-slate-700',\n negative: 'bg-rose-100 text-rose-700',\n concerning: 'bg-amber-100 text-amber-700'\n };\n\n return (\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold capitalize', styles[sentiment ?? 'neutral'] ?? styles.neutral)}>\n {sentiment ?? 'unknown'}\n </span>\n );\n}\n\nexport { Modal } from './components/modal';\nexport type { ModalProps } from './components/modal';\n\nexport { RoleBadge } from './components/role-badge';\nexport type { RoleBadgeProps } from './components/role-badge';\n\nexport { RoleComboBox, ROLE_COMBO_OPTIONS } from './components/role-combo-box';\nexport type { RoleComboBoxProps, RoleOption } from './components/role-combo-box';\n\nexport function SectionHeading({\n eyebrow,\n title,\n detail\n}: {\n eyebrow: string;\n title: string;\n detail?: string;\n}) {\n return (\n <div>\n <p className=\"text-xs uppercase tracking-[0.25em] text-brand\">{eyebrow}</p>\n <h2 className=\"mt-2 text-2xl font-semibold text-default\">{title}</h2>\n {detail ? <p className=\"mt-2 max-w-2xl text-sm text-slate-600\">{detail}</p> : null}\n </div>\n );\n}\n\n","import { type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type ButtonVariant = 'primary' | 'neutral' | 'subtle' | 'danger' | 'danger-subtle';\nexport type ButtonSize = 'lg' | 'md' | 'sm';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n}\n\nconst variantStyles: Record<ButtonVariant, string> = {\n primary: clsx(\n 'bg-brand border border-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n neutral: clsx(\n 'bg-default border border-default text-default',\n 'hover:bg-default-hover hover:text-brand',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n subtle: clsx(\n // border-transparent holds space so hover border doesn't shift layout\n 'bg-transparent border border-transparent text-neutral',\n 'hover:border-default hover:text-brand',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n danger: clsx(\n 'bg-danger border border-danger-secondary text-danger-on-danger',\n // border shifts from danger-secondary → danger-default on hover (Figma spec)\n 'hover:bg-danger-hover hover:border-danger',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n 'danger-subtle': clsx(\n // border-transparent base avoids layout shift when hover border appears\n 'bg-transparent border border-transparent text-danger',\n 'hover:bg-danger-tertiary-hover hover:border-danger',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n lg: 'h-12 px-3 gap-1 rounded-2xl text-body font-semibold [&_svg]:size-5',\n md: 'h-9 px-2 gap-0.5 rounded-lg text-body-sm font-semibold [&_svg]:size-5',\n sm: 'h-6 px-1.5 pt-0.5 gap-0 rounded-full text-body-tiny font-semibold [&_svg]:size-4',\n};\n\nexport function Button({\n variant = 'primary',\n size = 'md',\n leadingIcon,\n trailingIcon,\n children,\n className,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={clsx(\n 'inline-flex items-center justify-center whitespace-nowrap transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed',\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n {...props}\n >\n {leadingIcon}\n <div className='px-1'>{children}</div>\n {trailingIcon}\n </button>\n );\n}\n","import { type ButtonHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { type ButtonSize } from './button';\n\nexport type IconButtonVariant = 'primary' | 'neutral' | 'subtle';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: IconButtonVariant;\n size?: ButtonSize;\n /** Required for accessibility — no visible text label */\n 'aria-label': string;\n}\n\nconst variantStyles: Record<IconButtonVariant, string> = {\n primary: clsx(\n 'bg-brand border border-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n // Neutral uses secondary background (light gray) for visual weight without a text label\n neutral: clsx(\n 'bg-default-secondary border border-default text-default',\n // icon turns brand blue on hover (Figma spec)\n 'hover:bg-default-secondary-hover hover:text-brand',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n subtle: clsx(\n 'bg-transparent text-neutral',\n // hover uses background-default-default-hover (#f5f5f5), icon turns brand blue (Figma spec)\n 'hover:bg-default-hover hover:text-brand',\n // disabled needs explicit border since there is no base border\n 'disabled:bg-disabled disabled:border disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n lg: 'size-12 rounded-2xl [&_svg]:size-5',\n md: 'size-9 rounded-lg [&_svg]:size-5',\n sm: 'size-6 rounded-full [&_svg]:size-4',\n};\n\nexport function IconButton({\n variant = 'primary',\n size = 'md',\n children,\n className,\n ...props\n}: IconButtonProps) {\n return (\n <button\n className={clsx(\n 'inline-flex shrink-0 items-center justify-center transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed',\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { type ButtonSize } from './button';\n\nexport type ButtonGroupVariant = 'primary' | 'neutral' | 'filter';\nexport type ButtonGroupAlign = 'justify' | 'start' | 'end' | 'center' | 'stack';\n\nexport interface ButtonGroupItem {\n value: string;\n label: ReactNode;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface ButtonGroupProps {\n items: ButtonGroupItem[];\n value: string;\n onChange: (value: string) => void;\n variant?: ButtonGroupVariant;\n size?: ButtonSize;\n align?: ButtonGroupAlign;\n /** Forwarded to the container as aria-label */\n 'aria-label'?: string;\n className?: string;\n}\n\nconst containerStyles: Record<ButtonGroupVariant, string> = {\n primary: 'bg-neutral-tertiary p-1 rounded-2xl',\n neutral: 'bg-neutral-tertiary p-1 rounded-2xl',\n filter: 'bg-default border border-default p-1 rounded-xl',\n};\n\nconst selectedStyles: Record<ButtonGroupVariant, string> = {\n primary: clsx(\n 'bg-brand border border-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n ),\n neutral: clsx(\n 'bg-default border border-default text-default',\n 'hover:bg-default-hover',\n ),\n filter: clsx(\n 'bg-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n ),\n};\n\nconst unselectedStyles: Record<ButtonGroupVariant, string> = {\n primary: clsx('bg-transparent text-neutral', 'hover:bg-neutral-tertiary-hover'),\n neutral: clsx('bg-transparent text-neutral', 'hover:bg-neutral-tertiary-hover'),\n filter: clsx('text-default-secondary', 'hover:text-default'),\n};\n\nconst itemSizeStyles: Record<ButtonSize, string> = {\n lg: 'h-12 px-3 gap-1 rounded-2xl text-body font-semibold [&_svg]:size-5',\n md: 'h-9 px-2 gap-0.5 rounded-lg text-body-sm font-semibold [&_svg]:size-5',\n sm: 'h-6 px-1.5 pt-0.5 gap-0 rounded-full text-body-tiny font-semibold [&_svg]:size-4',\n};\n\nconst containerAlignStyles: Record<ButtonGroupAlign, string> = {\n justify: 'flex flex-row items-center',\n start: 'flex flex-row items-center justify-start',\n end: 'flex flex-row items-center justify-end',\n center: 'flex flex-row items-center justify-center',\n stack: 'flex flex-col items-center',\n};\n\nexport function ButtonGroup({\n items,\n value,\n onChange,\n variant = 'primary',\n size = 'md',\n align = 'start',\n className,\n 'aria-label': ariaLabel,\n}: ButtonGroupProps) {\n const isJustify = align === 'justify';\n const isStack = align === 'stack';\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={clsx(\n containerStyles[variant],\n containerAlignStyles[align],\n className,\n )}\n >\n {items.map((item) => {\n const isSelected = item.value === value;\n return (\n <div\n key={item.value}\n className={clsx(isJustify && 'flex-1 min-w-0', isStack && 'w-full')}\n >\n <button\n type=\"button\"\n aria-pressed={isSelected}\n disabled={item.disabled}\n onClick={() => onChange(item.value)}\n className={clsx(\n 'inline-flex items-center justify-center whitespace-nowrap transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed disabled:text-disabled',\n (isJustify || isStack) && 'w-full',\n itemSizeStyles[size],\n isSelected ? selectedStyles[variant] : unselectedStyles[variant],\n )}\n >\n {item.leadingIcon}\n <div className='px-1'>{item.label}</div>\n {item.trailingIcon}\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\n\nexport interface AvatarInitialProps {\n type?: 'initial';\n /** Single character — Figma spec: one letter only to avoid overflow */\n initial: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport interface AvatarImageProps {\n type: 'image';\n src: string;\n alt?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport type AvatarProps = AvatarInitialProps | AvatarImageProps;\n\n// Figma sizes: lg=40px, md=32px, sm=24px\nconst sizeStyles: Record<AvatarSize, string> = {\n lg: 'size-10',\n md: 'size-8',\n sm: 'size-6',\n};\n\n// Figma text sizes for initials: body-medium at lg, scales down proportionally\nconst initialTextStyles: Record<AvatarSize, string> = {\n lg: 'text-body font-semibold',\n md: 'text-body-xs font-semibold',\n sm: 'text-body-tiny font-semibold',\n};\n\n// Figma shape radii: circle=full, square: lg/md=8px (rounded-lg), sm=4px (rounded)\nfunction getShapeClass(shape: AvatarShape, size: AvatarSize): string {\n if (shape === 'circle') return 'rounded-full';\n return size === 'sm' ? 'rounded' : 'rounded-lg';\n}\n\nexport function Avatar(props: AvatarProps) {\n const { size = 'lg', shape = 'circle', className } = props;\n\n const base = clsx(\n 'shrink-0 overflow-hidden',\n sizeStyles[size],\n getShapeClass(shape, size),\n className,\n );\n\n if (props.type === 'image') {\n return (\n <div className={base}>\n <img\n src={props.src}\n alt={props.alt ?? ''}\n className=\"size-full object-cover\"\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(base, 'flex items-center justify-center')}\n style={{\n background:\n 'linear-gradient(135deg, var(--color-graphic-blue) 30%, var(--color-graphic-red) 100%)',\n }}\n >\n <span\n className={clsx(\n 'select-none leading-none text-brand-on-brand',\n initialTextStyles[size],\n )}\n >\n {props.initial.charAt(0).toUpperCase()}\n </span>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarGroupSpacing = 'spaced' | 'overlap';\n\nexport interface AvatarGroupProps {\n children: ReactNode;\n /** Number shown in the overflow badge — omit to hide the badge */\n overflow?: number;\n spacing?: AvatarGroupSpacing;\n className?: string;\n}\n\nexport function AvatarGroup({\n children,\n overflow,\n spacing = 'spaced',\n className,\n}: AvatarGroupProps) {\n return (\n <div\n className={clsx(\n 'flex items-center',\n spacing === 'spaced' ? 'gap-1' : '-space-x-2 isolate',\n className,\n )}\n >\n {children}\n {overflow !== undefined && (\n <div\n className={clsx(\n 'flex items-center justify-center',\n 'min-w-6 h-6 px-1 rounded-lg',\n 'bg-default-secondary text-default-secondary text-body-sm',\n spacing === 'overlap' && 'drop-shadow-sm',\n )}\n >\n +{overflow}\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport interface AvatarBlockProps {\n children: ReactNode;\n title: string;\n description?: string;\n className?: string;\n}\n\nexport function AvatarBlock({ children, title, description, className }: AvatarBlockProps) {\n return (\n <div className={clsx('flex items-start gap-3', className)}>\n <div className=\"shrink-0\">{children}</div>\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-body font-semibold leading-[1.4] text-default-secondary\">\n {title}\n </span>\n {description && (\n <span className=\"text-body leading-[1.4] text-default-tertiary\">\n {description}\n </span>\n )}\n </div>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport interface NavItemProps {\n icon?: ReactNode;\n label: string;\n isActive?: boolean;\n /** Red indicator dot at top-right corner (e.g. unread count) */\n indicator?: boolean;\n /** Collapsed mode — icon only, label hidden */\n collapsed?: boolean;\n className?: string;\n}\n\nexport function NavItem({\n icon,\n label,\n isActive = false,\n indicator = false,\n collapsed = false,\n className,\n}: NavItemProps) {\n return (\n <span\n className={clsx(\n 'relative flex h-11 w-full items-center gap-3 rounded-xl px-3.5 py-2.5 transition-colors',\n collapsed && 'justify-center',\n isActive\n ? 'bg-brand text-brand-on-brand'\n : [\n 'border border-default bg-default text-default-secondary',\n 'hover:bg-brand-tertiary-hover hover:border-brand-tertiary hover:text-brand',\n ],\n className,\n )}\n >\n {icon !== undefined && (\n <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>\n )}\n {!collapsed && (\n <span className=\"flex-1 min-w-0 truncate text-body-sm font-regular leading-snug\">\n {label}\n </span>\n )}\n {indicator && (\n <span className=\"absolute -right-px -top-px size-2 rounded-full bg-danger\" />\n )}\n </span>\n );\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type InputSize = 'lg' | 'md' | 'sm';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: string;\n description?: string;\n /** Red border + message shown below the input */\n error?: string;\n /** Neutral helper text shown below the input (hidden when error is set) */\n hint?: string;\n size?: InputSize;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n}\n\n// Figma sizes: lg=48px md=36px sm=24px\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2', // 8px\n md: 'gap-1', // 4px\n sm: 'gap-0.5', // 2px\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\nconst inputBase: Record<InputSize, string> = {\n lg: 'h-12 px-4 py-3.5 text-body',\n md: 'h-9 px-3 py-2.5 text-body-sm',\n sm: 'h-6 px-2 py-[5px] text-body-tiny',\n};\n\n// Extra left padding to clear the leading icon\nconst leadingPad: Record<InputSize, string> = {\n lg: 'pl-10',\n md: 'pl-8',\n sm: 'pl-6',\n};\n\n// Extra right padding to clear the trailing icon\nconst trailingPad: Record<InputSize, string> = {\n lg: 'pr-10',\n md: 'pr-8',\n sm: 'pr-6',\n};\n\n// Icon wrapper: absolutely positioned inside the input container\nconst iconWrap: Record<InputSize, { left: string; right: string; size: string }> = {\n lg: { left: 'left-4', right: 'right-4', size: 'size-5' },\n md: { left: 'left-3', right: 'right-3', size: 'size-4' },\n sm: { left: 'left-2', right: 'right-2', size: 'size-3' },\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { label, description, error, hint, size = 'md', leadingIcon, trailingIcon, className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n const iw = iconWrap[size];\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <div className=\"relative flex items-center\">\n {leadingIcon && (\n <span className={clsx('pointer-events-none absolute', iw.left, iw.size, 'flex items-center justify-center text-icon-default-secondary')}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n disabled={disabled}\n className={clsx(\n 'w-full rounded-lg border outline-none transition-colors',\n 'bg-default text-default',\n 'placeholder:text-default-tertiary',\n inputBase[size],\n leadingIcon && leadingPad[size],\n trailingIcon && trailingPad[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled placeholder:text-disabled'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-tertiary focus:ring-1 focus:ring-brand-tertiary',\n )}\n {...props}\n />\n {trailingIcon && (\n <span className={clsx('pointer-events-none absolute', iw.right, iw.size, 'flex items-center justify-center text-icon-default-secondary')}>\n {trailingIcon}\n </span>\n )}\n </div>\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default-secondary')}>{hint}</p>\n )}\n </div>\n );\n});\n","import { forwardRef, type TextareaHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { type InputSize } from './input';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n description?: string;\n error?: string;\n hint?: string;\n size?: InputSize;\n}\n\n// Figma sizes — min-heights derived from Figma textarea frame heights\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2',\n md: 'gap-1',\n sm: 'gap-0.5',\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\n// Figma: large textarea inner height ~80px, medium ~68px, small ~52px\nconst textareaBase: Record<InputSize, string> = {\n lg: 'min-h-20 px-4 py-3.5 text-body',\n md: 'min-h-[68px] px-3 py-2.5 text-body-sm',\n sm: 'min-h-[52px] px-2 py-[5px] text-body-tiny',\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, description, error, hint, size = 'md', className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <textarea\n ref={ref}\n id={id}\n disabled={disabled}\n className={clsx(\n 'w-full rounded-lg border outline-none transition-colors resize-y',\n 'bg-default text-default',\n 'placeholder:text-default-tertiary',\n textareaBase[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled placeholder:text-disabled resize-none'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-tertiary focus:ring-1 focus:ring-brand-tertiary',\n )}\n {...props}\n />\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default-secondary')}>{hint}</p>\n )}\n </div>\n );\n});\n","import { forwardRef, type SelectHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { type InputSize } from './input';\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: string;\n description?: string;\n error?: string;\n hint?: string;\n size?: InputSize;\n options: SelectOption[];\n placeholder?: string;\n}\n\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2',\n md: 'gap-1',\n sm: 'gap-0.5',\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\n// pr = chevron right-offset + chevron width (exact minimum to clear the icon)\nconst selectBase: Record<InputSize, string> = {\n lg: 'h-12 pl-4 pr-9 text-body', // right-4 (16) + size-5 (20) = 36px\n md: 'h-9 pl-3 pr-7 text-body-sm', // right-3 (12) + size-4 (16) = 28px\n sm: 'h-6 pl-2 pr-5 text-body-tiny', // right-2 (8) + size-3 (12) = 20px\n};\n\n// Chevron icon size + position per size\nconst chevronPos: Record<InputSize, { right: string; size: string }> = {\n lg: { right: 'right-4', size: 'size-5' },\n md: { right: 'right-3', size: 'size-4' },\n sm: { right: 'right-2', size: 'size-3' },\n};\n\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { label, description, error, hint, size = 'md', options, placeholder, className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n const cp = chevronPos[size];\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <div className=\"relative flex items-center\">\n <select\n ref={ref}\n id={id}\n disabled={disabled}\n className={clsx(\n 'w-full appearance-none rounded-lg border outline-none transition-colors pt-0.5',\n 'bg-default text-default',\n selectBase[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-tertiary focus:ring-1 focus:ring-brand-tertiary',\n )}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <span\n className={clsx(\n 'pointer-events-none absolute',\n cp.right, cp.size,\n 'flex items-center justify-center',\n disabled ? 'text-icon-disabled' : 'text-icon-default-secondary',\n )}\n >\n <LuChevronDown className=\"size-full\" />\n </span>\n </div>\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default-secondary')}>{hint}</p>\n )}\n </div>\n );\n});\n","import clsx from 'clsx';\nimport { LuCheck, LuChevronRight } from 'react-icons/lu';\n\nexport type StepStatus = 'complete' | 'active' | 'upcoming';\n\nexport interface StepItem {\n label: string;\n status: StepStatus;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n className?: string;\n}\n\nfunction StepIndicator({ status }: { status: StepStatus }) {\n if (status === 'complete') {\n return (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-brand text-white\">\n <LuCheck size={11} aria-hidden />\n </span>\n );\n }\n\n if (status === 'active') {\n return (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full border-2 border-background-brand\">\n <span className=\"size-2.5 rounded-full bg-brand\" />\n </span>\n );\n }\n\n return (\n <span className=\"size-5 shrink-0 rounded-full border-2 border-disabled\" aria-hidden=\"true\" />\n );\n}\n\nfunction ChevronSeparator() {\n return <LuChevronRight className=\"mx-1 size-4 shrink-0 text-default-tertiary\" aria-hidden />;\n}\n\nconst labelClass: Record<StepStatus, string> = {\n complete: 'text-brand font-semibold',\n active: 'text-brand font-semibold',\n upcoming: 'text-disabled font-regular',\n};\n\nexport function Stepper({ steps, className }: StepperProps) {\n return (\n <ol\n className={clsx('flex items-center overflow-x-auto', className)}\n aria-label=\"Progress\"\n >\n {steps.map((step, i) => (\n <li\n key={i}\n className=\"flex items-center\"\n aria-current={step.status === 'active' ? 'step' : undefined}\n >\n <span className=\"flex items-center gap-1.5\">\n <StepIndicator status={step.status} />\n <span className={clsx('text-body-xs whitespace-nowrap', labelClass[step.status])}>\n {step.label}\n </span>\n </span>\n {i < steps.length - 1 && <ChevronSeparator />}\n </li>\n ))}\n </ol>\n );\n}\n","import clsx from 'clsx';\nimport { type ReactNode } from 'react';\n\nexport interface MultiSelectCardProps {\n icon: ReactNode;\n title: string;\n description?: string;\n selected: boolean;\n onToggle: () => void;\n className?: string;\n}\n\nexport function MultiSelectCard({\n icon,\n title,\n description,\n selected,\n onToggle,\n className,\n}: MultiSelectCardProps) {\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n onClick={onToggle}\n className={clsx(\n 'relative w-full rounded-2xl border-2 p-4 text-left transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n selected\n ? 'border-brand bg-brand-tertiary'\n : 'border-default bg-default hover:border-default-secondary',\n className,\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <span\n className={clsx(\n 'flex size-10 shrink-0 items-center justify-center rounded-xl',\n selected ? 'bg-brand' : 'bg-brand-tertiary',\n )}\n >\n <span className={clsx('size-5', selected ? 'text-icon-brand-on-brand' : 'text-icon-brand')}>\n {icon}\n </span>\n </span>\n\n {selected ? (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-brand\">\n <svg width=\"11\" height=\"8\" viewBox=\"0 0 11 8\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1 4L3.9 7L10 1\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n ) : (\n <span\n className=\"size-5 shrink-0 rounded-full border-2 border-default\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n <div className=\"mt-3\">\n <p\n className={clsx(\n 'text-body-sm font-semibold',\n selected ? 'text-brand' : 'text-default',\n )}\n >\n {title}\n </p>\n {description && (\n <p className=\"mt-0.5 text-body-xs text-default-secondary\">{description}</p>\n )}\n </div>\n </button>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\n// ── Column definition ──────────────────────────────────────────────────────────\n\nexport interface ColumnDef<T> {\n key: string;\n header: string;\n /** CSS width value — e.g. \"320px\", \"10rem\". When grow is true, acts as min-width. */\n width: string;\n /** When true the column fills remaining row width; width becomes a min-width floor. */\n grow?: boolean;\n render: (row: T) => ReactNode;\n}\n\n// ── DataTable ──────────────────────────────────────────────────────────────────\n\nexport function DataTable<T,>({\n columns,\n rows,\n getRowKey,\n className,\n onRowClick,\n}: {\n columns: ColumnDef<T>[];\n rows: T[];\n getRowKey: (row: T, index: number) => React.Key;\n className?: string;\n onRowClick?: (row: T) => void;\n}) {\n return (\n <div\n className={clsx(\n 'overflow-hidden rounded-xl border border-default bg-default',\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center bg-default-secondary px-4 py-3\">\n {columns.map((col) => (\n <div key={col.key} className={clsx('overflow-hidden', col.grow ? 'flex-1 min-w-0' : 'shrink-0')} style={col.grow ? { minWidth: col.width } : { width: col.width }}>\n <span className=\"text-body-xs font-medium text-default-secondary whitespace-nowrap\">\n {col.header}\n </span>\n </div>\n ))}\n </div>\n\n {/* Rows */}\n <div>\n {rows.map((row, i) => (\n <div\n key={getRowKey(row, i)}\n className={clsx(\n 'flex items-center px-4 py-[14px] transition-colors hover:bg-default-secondary/50',\n i > 0 && 'border-t border-[#ececec]',\n onRowClick && 'cursor-pointer',\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((col) => (\n <div key={col.key} className={clsx('overflow-hidden', col.grow ? 'flex-1 min-w-0' : 'shrink-0')} style={col.grow ? { minWidth: col.width } : { width: col.width }}>\n {col.render(row)}\n </div>\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n// ── Cell components ────────────────────────────────────────────────────────────\n\n/** Primary bold text + optional muted subtitle — for lead entity/name cells */\nexport function TableCellLeadText({\n primary,\n secondary,\n}: {\n primary: string;\n secondary?: string;\n}) {\n return (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-body-sm font-medium text-default leading-snug\">{primary}</span>\n {secondary && (\n <span className=\"text-body-xs font-normal text-default-secondary leading-tight\">\n {secondary}\n </span>\n )}\n </div>\n );\n}\n\n/** Plain text cell — muted (secondary) by default, pass muted=false for primary colour */\nexport function TableCellText({\n children,\n muted = true,\n}: {\n children: ReactNode;\n muted?: boolean;\n}) {\n return (\n <span\n className={clsx(\n 'text-body-xs font-normal leading-snug whitespace-nowrap',\n muted ? 'text-default-secondary' : 'text-default',\n )}\n >\n {children}\n </span>\n );\n}\n\n/** Small outlined chip — Supplier / Customer, entity type labels etc. */\nexport function TableCellBadge({ label }: { label: string }) {\n return (\n <span className=\"inline-flex items-center rounded-md border border-default bg-default-secondary px-2 py-0.5 text-body-tiny font-medium text-default-secondary whitespace-nowrap\">\n {label}\n </span>\n );\n}\n\n/** Coloured pill with a leading dot — pass explicit colours for full design-system flexibility */\nexport function TableCellStatusPill({\n label,\n dotColor,\n backgroundColor,\n textColor,\n}: {\n label: string;\n dotColor: string;\n backgroundColor: string;\n textColor: string;\n}) {\n return (\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-body-xs font-medium leading-tight whitespace-nowrap\"\n style={{ backgroundColor, color: textColor }}\n >\n <span className=\"size-1.5 shrink-0 rounded-full\" style={{ backgroundColor: dotColor }} />\n {label}\n </span>\n );\n}\n\n/** Mini horizontal progress bar with a percentage label below */\nexport function TableCellProgress({\n percent,\n barColor,\n}: {\n percent: number;\n barColor?: string;\n}) {\n const color = barColor ?? '#0c2d58';\n const clamped = Math.min(100, Math.max(0, percent));\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"h-1.5 w-16 overflow-hidden rounded-full bg-default-secondary\">\n <div\n className=\"h-full rounded-full transition-all\"\n style={{ width: `${clamped}%`, backgroundColor: color }}\n />\n </div>\n <span className=\"text-body-tiny text-default-secondary leading-none\">{percent}%</span>\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport interface StatTileProps {\n label: string;\n value: string | number;\n dotColor?: string;\n className?: string;\n}\n\nexport function StatTile({ label, value, dotColor, className }: StatTileProps) {\n return (\n <div\n className={clsx(\n 'flex flex-col gap-2 rounded-xl border border-default bg-default p-4',\n className,\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n {dotColor && (\n <span className=\"size-2 shrink-0 rounded-full\" style={{ backgroundColor: dotColor }} />\n )}\n <span className=\"text-body-xs font-medium text-default-secondary whitespace-nowrap\">\n {label}\n </span>\n </div>\n <span className=\"text-heading font-semibold text-default leading-none\">{value}</span>\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport interface ToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label?: string;\n disabled?: boolean;\n}\n\nexport function Toggle({ checked, onChange, label, disabled = false }: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={clsx(\n 'flex items-center gap-2',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n <span\n className={clsx(\n 'relative inline-flex h-6 w-10 shrink-0 rounded-full transition-colors',\n checked\n ? 'bg-brand'\n : 'border border-default bg-neutral-tertiary',\n )}\n >\n <span\n className={clsx(\n 'absolute left-0.5 top-0.5 size-5 rounded-full bg-white shadow-sm transition-transform',\n checked ? 'translate-x-4' : 'translate-x-0',\n )}\n />\n </span>\n {label && (\n <span className=\"text-body-xs text-default\">{label}</span>\n )}\n </button>\n );\n}\n","import { useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport { LuUpload } from 'react-icons/lu';\n\nexport interface FileDropZoneProps {\n className?: string;\n}\n\n\nexport function FileDropZone({ className }: FileDropZoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\".pdf,.jpg,.jpeg,.png\"\n className=\"sr-only\"\n tabIndex={-1}\n />\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => inputRef.current?.click()}\n onKeyDown={(e) => (e.key === 'Enter' || e.key === ' ') && inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}\n onDragEnter={(e) => { e.preventDefault(); setIsDragging(true); }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={(e) => { e.preventDefault(); setIsDragging(false); }}\n className={clsx(\n 'flex flex-col items-center justify-center gap-1 rounded-lg border-2 border-dashed py-4 px-4 cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n isDragging\n ? 'border-brand bg-brand-tertiary'\n : 'border-default bg-default-secondary hover:border-brand hover:bg-brand-tertiary',\n className,\n )}\n >\n <span className={isDragging ? 'text-brand' : 'text-default-secondary'}>\n <LuUpload size={20} />\n </span>\n <span className=\"text-body-sm font-medium text-default\">Upload file</span>\n <span className=\"text-body-xs text-default-secondary text-center\">\n Drag & drop or browse · PDF, JPG, PNG · up to 10 MB\n </span>\n </div>\n </>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { LuArrowLeft, LuArrowRight } from 'react-icons/lu';\nimport { Button } from './button';\n\n// ── FormCard ───────────────────────────────────────────────────────────────────\n\nexport function FormCard({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={clsx(\n 'overflow-hidden rounded-xl border border-default bg-default',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n// ── FormCardHeader ─────────────────────────────────────────────────────────────\n\nexport interface FormCardHeaderProps {\n title: string;\n subtitle?: string;\n}\n\nexport function FormCardHeader({ title, subtitle }: FormCardHeaderProps) {\n return (\n <div className=\"border-b border-default px-7 py-6\">\n <h2 className=\"text-heading-sm font-semibold text-default leading-snug\">{title}</h2>\n {subtitle && (\n <p className=\"mt-1 text-body-xs text-default-secondary\">{subtitle}</p>\n )}\n </div>\n );\n}\n\n// ── FormCardFooter ─────────────────────────────────────────────────────────────\n\nexport interface FormCardFooterProps {\n onSaveDraft?: () => void;\n onBack?: () => void;\n onContinue?: () => void;\n continueLabel?: string;\n backDisabled?: boolean;\n}\n\nexport function FormCardFooter({\n onSaveDraft,\n onBack,\n onContinue,\n continueLabel = 'Continue',\n backDisabled = false,\n}: FormCardFooterProps) {\n return (\n <div className=\"flex items-center justify-between border-t border-default px-7 py-5\">\n <Button variant=\"neutral\" size=\"md\" onClick={onSaveDraft}>\n Save as draft\n </Button>\n <div className=\"flex items-center gap-2\">\n {!backDisabled && (\n <Button variant=\"neutral\" size=\"md\" leadingIcon={<LuArrowLeft size={16} />} onClick={onBack}>\n Back\n </Button>\n )}\n <Button variant=\"primary\" size=\"md\" trailingIcon={<LuArrowRight size={16} />} onClick={onContinue}>\n {continueLabel}\n </Button>\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { FileDropZone } from './file-drop-zone';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport type DocumentStatus =\n | 'uploaded'\n | 'under-review'\n | 'processing'\n | 'missing'\n | 'not-provided';\n\nexport interface DocumentRowProps {\n title: string;\n required: boolean;\n description: string;\n status: DocumentStatus;\n fileName?: string;\n fileSize?: string;\n fileType?: string;\n}\n\n// ── Status config ──────────────────────────────────────────────────────────────\n\nconst STATUS_CONFIG: Record<DocumentStatus, { label: string; style: string }> = {\n uploaded: { label: '✓ Uploaded', style: 'bg-[#e6f4ea] text-[#1f7a3d]' },\n 'under-review':{ label: '● Under review',style: 'bg-[#fbe6cf] text-[#9a6206]' },\n processing: { label: '● Processing', style: 'bg-[#e9eff7] text-[#0c2d58]' },\n missing: { label: 'Missing', style: 'bg-[#fee2e2] text-[#b91c1c]' },\n 'not-provided':{ label: 'Not provided', style: 'bg-default-secondary text-default-secondary' },\n};\n\n// ── File type badge ────────────────────────────────────────────────────────────\n\nfunction FileTypeBadge({ type }: { type: string }) {\n return (\n <div className=\"flex h-[34px] w-[34px] shrink-0 items-center justify-center rounded-md bg-brand-tertiary\">\n <span className=\"text-body-tiny font-semibold text-brand\">{type}</span>\n </div>\n );\n}\n\n// ── DocumentRow ────────────────────────────────────────────────────────────────\n\nexport function DocumentRow({\n title,\n required,\n description,\n status,\n fileName,\n fileSize,\n fileType = 'PDF',\n}: DocumentRowProps) {\n const hasFile =\n (status === 'uploaded' || status === 'under-review' || status === 'processing') && !!fileName;\n const cfg = STATUS_CONFIG[status];\n\n return (\n <div className=\"flex flex-col gap-3 py-4\">\n {/* Header row */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-body-sm font-semibold text-default truncate\">{title}</span>\n <span className=\"shrink-0 rounded-md border border-default bg-default-secondary px-2 py-0.5 text-body-tiny font-medium text-default-secondary\">\n {required ? 'Required' : 'Optional'}\n </span>\n </div>\n <span\n className={clsx(\n 'shrink-0 rounded-full px-2.5 py-0.5 text-body-tiny font-medium whitespace-nowrap',\n cfg.style,\n )}\n >\n {cfg.label}\n </span>\n </div>\n\n {/* Description */}\n <p className=\"text-body-xs text-default-secondary\">{description}</p>\n\n {/* File or drop zone */}\n {hasFile ? (\n <div className=\"flex items-center gap-3 rounded-lg border border-default bg-default px-3 py-2.5\">\n <FileTypeBadge type={fileType} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate text-body-sm font-medium text-default\">{fileName}</span>\n {fileSize && (\n <span className=\"text-body-xs text-default-secondary\">{fileSize}</span>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-4\">\n <button\n type=\"button\"\n className=\"text-body-xs font-medium text-brand hover:underline\"\n >\n Replace\n </button>\n <button\n type=\"button\"\n className=\"text-body-xs font-medium text-danger hover:underline\"\n >\n Remove\n </button>\n </div>\n </div>\n ) : (\n <FileDropZone />\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { LuX } from 'react-icons/lu';\nimport { IconButton } from './icon-button';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n subtitle?: string;\n children: ReactNode;\n footer?: ReactNode;\n maxWidth?: string;\n}\n\nexport function Modal({ isOpen, onClose, title, subtitle, children, footer, maxWidth = 'max-w-[540px]' }: ModalProps) {\n if (!isOpen) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80\"\n onClick={(e) => { if (e.target === e.currentTarget) onClose(); }}\n >\n <div className={clsx('w-full mx-4 rounded-2xl bg-white shadow-xl', maxWidth)}>\n {/* Header */}\n <div className=\"flex items-start justify-between px-6 py-5\">\n <div>\n <h2 className=\"text-heading-sm font-semibold text-default\">{title}</h2>\n {subtitle && (\n <p className=\"mt-0.5 text-body-xs text-default-secondary\">{subtitle}</p>\n )}\n </div>\n <IconButton\n variant=\"subtle\"\n size=\"sm\"\n aria-label=\"Close dialog\"\n onClick={onClose}\n >\n <LuX size={16} />\n </IconButton>\n </div>\n\n <hr className=\"border-default\" />\n\n {/* Body */}\n <div className=\"px-6 py-5\">{children}</div>\n\n {/* Footer */}\n {footer && (\n <>\n <hr className=\"border-default\" />\n <div className=\"flex items-center justify-end gap-2 px-6 py-4\">\n {footer}\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport interface RoleBadgeProps {\n role: string;\n size?: 'sm' | 'md';\n}\n\nconst ROLE_COLORS: Record<string, { bg: string; text: string }> = {\n 'Super Admin': { bg: '#e9eff7', text: '#0c2d58' },\n 'Admin': { bg: '#e9eff7', text: '#0c2d58' },\n 'Compliance Lead': { bg: '#ece6f7', text: '#5b3da8' },\n 'Reviewer': { bg: '#dbeafe', text: '#1d4ed8' },\n 'Requester': { bg: '#e6f4ea', text: '#1f7a3d' },\n 'Entity Manager': { bg: '#fbe6cf', text: '#9a6206' },\n 'Intelligence Analyst': { bg: '#fde2e7', text: '#a3284a' },\n 'Auditor': { bg: '#f5f5f5', text: '#757575' },\n 'Viewer': { bg: '#f5f5f5', text: '#757575' },\n 'User': { bg: '#e9eff7', text: '#0c2d58' },\n};\n\nconst FALLBACK = { bg: '#f5f5f5', text: '#757575' };\n\nexport function RoleBadge({ role, size = 'sm' }: RoleBadgeProps) {\n const colors = ROLE_COLORS[role] ?? FALLBACK;\n\n return (\n <span\n className={clsx(\n 'inline-flex items-center rounded-full font-medium whitespace-nowrap',\n size === 'sm' ? 'px-2 py-0.5 text-body-tiny' : 'px-3 py-1 text-body-xs',\n )}\n style={{ backgroundColor: colors.bg, color: colors.text }}\n >\n {role}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { RoleBadge } from './role-badge';\n\nexport interface RoleOption {\n role: string;\n description: string;\n}\n\nexport const ROLE_COMBO_OPTIONS: RoleOption[] = [\n { role: 'Reviewer', description: 'Reviews onboarding requests' },\n { role: 'Admin', description: 'Full org control' },\n { role: 'Compliance Lead', description: 'Owns compliance' },\n { role: 'Requester', description: 'Creates onboarding requests' },\n { role: 'Viewer', description: 'Read-only access' },\n { role: 'User', description: 'Default user access' },\n];\n\nexport interface RoleComboBoxProps {\n value: string;\n onChange: (role: string) => void;\n options?: RoleOption[];\n}\n\n\nexport function RoleComboBox({ value, onChange, options = ROLE_COMBO_OPTIONS }: RoleComboBoxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n setQuery('');\n }\n }\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }, [open]);\n\n function openDropdown() {\n setOpen(true);\n setQuery('');\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n\n function select(role: string) {\n onChange(role);\n setOpen(false);\n setQuery('');\n }\n\n const selectedEntry = options.find(o => o.role === value);\n const otherOptions = options.filter(\n o => o.role !== value && o.role.toLowerCase().includes(query.toLowerCase()),\n );\n\n return (\n <div className=\"relative\" ref={containerRef}>\n {/* Trigger */}\n <div\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n onClick={openDropdown}\n className={`flex h-11 cursor-pointer items-center gap-2 rounded-lg border-[1.5px] pl-2.5 pr-3 transition-colors ${\n open ? 'border-blue-500' : 'border-default hover:border-brand-tertiary'\n }`}\n >\n <div className=\"flex flex-1 min-w-0 items-center gap-1.5 overflow-hidden\">\n <RoleBadge role={value} size=\"sm\" />\n {value === 'User' && !open && (\n <span className=\"rounded border border-default bg-default-secondary px-1.5 py-0.5 text-body-tiny font-medium text-default-secondary\">\n DEFAULT\n </span>\n )}\n {open && (\n <>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onClick={e => e.stopPropagation()}\n className=\"min-w-0 flex-1 bg-transparent text-body-xs text-default outline-none\"\n aria-label=\"Search roles\"\n />\n <span className=\"mx-0.5 h-[18px] w-px shrink-0 bg-text-default\" aria-hidden />\n </>\n )}\n </div>\n <span className=\"shrink-0 text-default-secondary\">\n <LuChevronDown size={14} />\n </span>\n </div>\n\n {/* Dropdown */}\n {open && (\n <div\n role=\"listbox\"\n className=\"absolute left-0 right-0 top-full z-20 mt-1 flex max-h-64 flex-col gap-0.5 overflow-y-auto rounded-xl border border-default bg-white p-1.5 shadow-lg\"\n >\n {/* Currently selected */}\n {selectedEntry && (\n <div\n role=\"option\"\n aria-selected\n className=\"flex cursor-pointer items-center gap-2.5 rounded-md bg-blue-50 px-2.5 py-2\"\n onClick={() => select(selectedEntry.role)}\n >\n <RoleBadge role={selectedEntry.role} size=\"sm\" />\n <span className=\"flex-1 text-body-xs text-default-secondary\">\n {selectedEntry.description}\n </span>\n <span className=\"shrink-0 text-sm font-bold text-blue-600\">✓</span>\n </div>\n )}\n\n <div className=\"h-px bg-border-default\" />\n\n {/* Other roles */}\n {otherOptions.length > 0 && (\n <>\n <div className=\"px-2.5 pb-1 pt-1.5\">\n <span className=\"text-body-tiny font-semibold uppercase tracking-wide text-default-secondary\">\n Other roles\n </span>\n </div>\n {otherOptions.map(opt => (\n <div\n key={opt.role}\n role=\"option\"\n aria-selected={false}\n className=\"flex cursor-pointer items-center gap-2.5 rounded-md px-2.5 py-2 hover:bg-default-secondary\"\n onClick={() => select(opt.role)}\n >\n <RoleBadge role={opt.role} size=\"sm\" />\n <span className=\"text-body-xs text-default-secondary\">{opt.description}</span>\n </div>\n ))}\n </>\n )}\n\n {otherOptions.length === 0 && query && (\n <p className=\"px-2.5 py-2 text-body-xs text-default-secondary\">\n No roles match \"{query}\"\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["import_clsx","clsx","import_clsx","import_jsx_runtime","variantStyles","clsx","sizeStyles","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeStyles","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","Input","clsx","import_react","import_clsx","import_jsx_runtime","wrapGap","labelText","Textarea","clsx","import_react","import_clsx","import_jsx_runtime","wrapGap","labelText","Select","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_lu","import_jsx_runtime","import_jsx_runtime","clsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/components/forms/button.tsx","../src/components/forms/icon-button.tsx","../src/components/forms/button-group.tsx","../src/components/avatar/avatar.tsx","../src/components/avatar/avatar-group.tsx","../src/components/avatar/avatar-block.tsx","../src/components/forms/input.tsx","../src/components/forms/textarea.tsx","../src/components/forms/select.tsx","../src/components/forms/date-picker.tsx","../src/components/forms/stepper.tsx","../src/components/forms/multiselect-card.tsx","../src/components/forms/toggle.tsx","../src/components/forms/file-drop-zone.tsx","../src/components/forms/form-card.tsx","../src/components/status/badge.tsx","../src/components/status/role-badge.tsx","../src/components/forms/role-combo-box.tsx","../src/components/status/status-badge.tsx","../src/components/status/status-dot.tsx","../src/components/status/status-chip.tsx","../src/components/status/count-badge.tsx","../src/components/status/tag-pill.tsx","../src/components/status/trail-chip.tsx","../src/components/status/user-status-pill.tsx","../src/components/status/check-indicator.tsx","../src/components/status/entity-icon-badge.tsx","../src/components/forms/checkbox.tsx","../src/components/forms/segmented-control.tsx","../src/components/overlays/modal.tsx","../src/lib/cn.ts","../src/components/overlays/overlay.ts","../src/components/overlays/drawer.tsx","../src/components/overlays/confirm-dialog.tsx","../src/components/overlays/note-confirm-modal.tsx","../src/components/overlays/dropdown-menu.tsx","../src/components/cards/card.tsx","../src/components/chrome/page-heading.tsx","../src/components/chrome/page-toolbar.tsx","../src/components/chrome/filter-bar.tsx","../src/components/chrome/tabs.tsx","../src/components/chrome/nav-item.tsx","../src/components/chrome/eyebrow-label.tsx","../src/components/widgets/widget-header.tsx","../src/components/widgets/widget-title.tsx","../src/components/widgets/widget-footer.tsx","../src/components/stats/stat-tile.tsx","../src/components/stats/stat-number.tsx","../src/components/stats/score-value.tsx","../src/components/stats/tile-grid.tsx","../src/components/charts/chart-tone.ts","../src/components/charts/bar-chart.tsx","../src/components/charts/donut-chart.tsx","../src/components/charts/radial-gauge.tsx","../src/components/charts/sparkline.tsx","../src/components/charts/mini-bar-chart.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/legend-dot.tsx","../src/components/charts/trend-label.tsx","../src/components/lists/list-row.tsx","../src/components/lists/file-row.tsx","../src/components/lists/scored-row.tsx","../src/components/lists/ranked-row.tsx","../src/components/feedback/progress-bar.tsx","../src/components/lists/icon-text-row.tsx","../src/components/lists/checklist-row.tsx","../src/components/lists/numbered-steps-list.tsx","../src/components/lists/meta-field.tsx","../src/components/lists/checked-group-list.tsx","../src/components/lists/data-table.tsx","../src/components/feedback/inline-alert.tsx","../src/components/feedback/empty-state.tsx","../src/components/forms/password-input.tsx","../src/components/ai/ai-chat-bar.tsx","../src/components/ai/ai-suggestion-chip.tsx","../src/components/ai/quick-actions-bar.tsx","../src/components/decorative/aurora-backdrop.tsx","../src/components/icons/solid.tsx"],"sourcesContent":["export { Button } from './components/forms/button';\nexport type { ButtonProps, ButtonVariant, ButtonSize } from './components/forms/button';\n\nexport { IconButton } from './components/forms/icon-button';\nexport type { IconButtonProps, IconButtonVariant } from './components/forms/icon-button';\n\nexport { ButtonGroup } from './components/forms/button-group';\nexport type { ButtonGroupProps, ButtonGroupItem, ButtonGroupVariant, ButtonGroupAlign } from './components/forms/button-group';\n\nexport { Avatar } from './components/avatar/avatar';\nexport type { AvatarProps, AvatarInitialProps, AvatarImageProps, AvatarSize, AvatarShape } from './components/avatar/avatar';\n\nexport { AvatarGroup } from './components/avatar/avatar-group';\nexport type { AvatarGroupProps, AvatarGroupSpacing } from './components/avatar/avatar-group';\n\nexport { AvatarBlock } from './components/avatar/avatar-block';\nexport type { AvatarBlockProps } from './components/avatar/avatar-block';\n\n\nexport { Input } from './components/forms/input';\nexport type { InputProps, InputSize } from './components/forms/input';\n\nexport { Textarea } from './components/forms/textarea';\nexport type { TextareaProps } from './components/forms/textarea';\n\nexport { Select } from './components/forms/select';\nexport type { SelectProps, SelectOption } from './components/forms/select';\n\nexport { DatePicker } from './components/forms/date-picker';\nexport type { DatePickerProps } from './components/forms/date-picker';\n\nexport { Stepper } from './components/forms/stepper';\nexport type { StepperProps, StepItem, StepStatus } from './components/forms/stepper';\n\nexport { MultiSelectCard } from './components/forms/multiselect-card';\nexport type { MultiSelectCardProps } from './components/forms/multiselect-card';\n\nexport { Toggle } from './components/forms/toggle';\nexport type { ToggleProps, ToggleSize } from './components/forms/toggle';\n\nexport { FileDropZone } from './components/forms/file-drop-zone';\nexport type { FileDropZoneProps } from './components/forms/file-drop-zone';\n\nexport { FormCard, FormCardHeader, FormCardFooter } from './components/forms/form-card';\nexport type { FormCardHeaderProps, FormCardFooterProps } from './components/forms/form-card';\n\nexport { Badge } from './components/status/badge';\nexport type { BadgeProps, BadgeColor, BadgeSize, BadgeVariant } from './components/status/badge';\n\nexport { RoleBadge } from './components/status/role-badge';\nexport type { RoleBadgeProps } from './components/status/role-badge';\n\nexport { RoleComboBox, ROLE_COMBO_OPTIONS } from './components/forms/role-combo-box';\nexport type { RoleComboBoxProps, RoleOption } from './components/forms/role-combo-box';\n\n// ── Status & tags ──────────────────────────────────────────────────────────────\n\nexport { StatusBadge } from './components/status/status-badge';\nexport type { StatusBadgeProps, StatusTone, StatusBadgeSize } from './components/status/status-badge';\n\nexport { StatusDot } from './components/status/status-dot';\nexport type { StatusDotProps, StatusDotTone } from './components/status/status-dot';\n\nexport { StatusChip } from './components/status/status-chip';\nexport type { StatusChipProps } from './components/status/status-chip';\n\nexport { CountBadge } from './components/status/count-badge';\nexport type { CountBadgeProps } from './components/status/count-badge';\n\nexport { TagPill } from './components/status/tag-pill';\nexport type { TagPillProps, TagPillTone } from './components/status/tag-pill';\n\nexport { TrailChip } from './components/status/trail-chip';\nexport type { TrailChipProps } from './components/status/trail-chip';\n\nexport { UserStatusPill } from './components/status/user-status-pill';\nexport type { UserStatusPillProps, UserAccountStatus } from './components/status/user-status-pill';\n\nexport { CheckIndicator } from './components/status/check-indicator';\nexport type { CheckIndicatorProps, CheckIndicatorStatus } from './components/status/check-indicator';\n\nexport { EntityIconBadge } from './components/status/entity-icon-badge';\nexport type { EntityIconBadgeProps, EntityIconBadgeSize, EntityIconBadgeTone } from './components/status/entity-icon-badge';\n\n// ── Selection ──────────────────────────────────────────────────────────────────\n\nexport { Checkbox } from './components/forms/checkbox';\nexport type { CheckboxProps } from './components/forms/checkbox';\n\nexport { SegmentedControl } from './components/forms/segmented-control';\nexport type { SegmentedControlProps, SegmentedControlOption } from './components/forms/segmented-control';\n\n// ── Overlays ───────────────────────────────────────────────────────────────────\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalBody,\n ModalFooter,\n} from './components/overlays/modal';\nexport type {\n ModalProps,\n ModalSize,\n ModalTone,\n ModalFooterAlign,\n ModalHeaderProps,\n ModalTitleProps,\n ModalDescriptionProps,\n ModalBodyProps,\n ModalFooterProps,\n} from './components/overlays/modal';\n\nexport { Drawer } from './components/overlays/drawer';\nexport type { DrawerProps } from './components/overlays/drawer';\n\nexport { ConfirmDialog } from './components/overlays/confirm-dialog';\nexport type { ConfirmDialogProps } from './components/overlays/confirm-dialog';\n\nexport { NoteConfirmModal } from './components/overlays/note-confirm-modal';\nexport type { NoteConfirmModalProps } from './components/overlays/note-confirm-modal';\n\nexport { DropdownMenu } from './components/overlays/dropdown-menu';\nexport type { DropdownMenuProps, DropdownMenuItem } from './components/overlays/dropdown-menu';\n\n// ── Utilities ──────────────────────────────────────────────────────────────────\n\n/** Esc-to-close, Tab focus trap and focus restore — for building your own overlays. */\nexport { OVERLAY_SCRIM, useOverlayDismiss } from './components/overlays/overlay';\n\n/** `clsx` + `tailwind-merge` — for compositions where your className must win. */\nexport { cn } from './lib/cn';\n\n// ── Cards & containers ─────────────────────────────────────────────────────────\n\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardAction,\n CardBody,\n CardFooter,\n} from './components/cards/card';\nexport type {\n CardProps,\n CardSize,\n CardRadius,\n CardTone,\n CardFooterAlign,\n CardHeaderProps,\n CardTitleProps,\n CardDescriptionProps,\n CardActionProps,\n CardBodyProps,\n CardFooterProps,\n} from './components/cards/card';\n\n// ── Page chrome ────────────────────────────────────────────────────────────────\n\nexport { PageHeading } from './components/chrome/page-heading';\nexport type { PageHeadingProps, PageHeadingSize } from './components/chrome/page-heading';\n\nexport { PageToolbar } from './components/chrome/page-toolbar';\nexport type { PageToolbarProps, PageToolbarSize } from './components/chrome/page-toolbar';\n\nexport { FilterBar } from './components/chrome/filter-bar';\nexport type { FilterBarProps, FilterBarSize } from './components/chrome/filter-bar';\n\nexport { Tabs } from './components/chrome/tabs';\nexport type { TabsProps, TabItem, TabsVariant, TabsSize } from './components/chrome/tabs';\n\nexport { NavItem } from './components/chrome/nav-item';\nexport type { NavItemProps, NavItemSize } from './components/chrome/nav-item';\n\nexport { EyebrowLabel } from './components/chrome/eyebrow-label';\nexport type { EyebrowLabelProps, EyebrowLabelVariant } from './components/chrome/eyebrow-label';\n\n// ── Widgets ────────────────────────────────────────────────────────────────────\n\nexport { WidgetHeader } from './components/widgets/widget-header';\nexport type { WidgetHeaderProps, WidgetHeaderEyebrowVariant } from './components/widgets/widget-header';\n\nexport { WidgetTitle } from './components/widgets/widget-title';\nexport type { WidgetTitleProps, WidgetTitleSize } from './components/widgets/widget-title';\n\nexport { WidgetFooter } from './components/widgets/widget-footer';\nexport type { WidgetFooterProps } from './components/widgets/widget-footer';\n\n// ── Stats ──────────────────────────────────────────────────────────────────────\n\nexport { StatTile } from './components/stats/stat-tile';\nexport type { StatTileProps } from './components/stats/stat-tile';\n\nexport { StatNumber } from './components/stats/stat-number';\nexport type { StatNumberProps, StatNumberSize, StatNumberWeight } from './components/stats/stat-number';\n\nexport { ScoreValue, getScoreTone, DEFAULT_SCORE_THRESHOLDS } from './components/stats/score-value';\nexport type {\n ScoreValueProps,\n ScoreValueSize,\n ScoreValueWeight,\n ScoreValueTone,\n ScoreTone,\n ScoreRampTone,\n ScoreDirection,\n ScoreThresholds,\n} from './components/stats/score-value';\n\nexport { TileGrid } from './components/stats/tile-grid';\nexport type { TileGridProps, TileGridColumns, TileGridBreakpoint } from './components/stats/tile-grid';\n\n// ── Data visualisation ─────────────────────────────────────────────────────────\n\nexport { CHART_TONE, CHART_SEQUENCE, CHART_TRACK, resolveChartColor } from './components/charts/chart-tone';\nexport type { ChartTone } from './components/charts/chart-tone';\n\nexport { BarChart } from './components/charts/bar-chart';\nexport type {\n BarChartProps,\n BarChartSeries,\n BarChartOrientation,\n BarChartSize,\n} from './components/charts/bar-chart';\n\nexport { DonutChart } from './components/charts/donut-chart';\nexport type { DonutChartProps, DonutSegment, DonutChartSize } from './components/charts/donut-chart';\n\nexport { RadialGauge } from './components/charts/radial-gauge';\nexport type { RadialGaugeProps, RadialGaugeSize } from './components/charts/radial-gauge';\n\nexport { Sparkline } from './components/charts/sparkline';\nexport type { SparklineProps, SparklineVariant, SparklineSize } from './components/charts/sparkline';\n\nexport { MiniBarChart } from './components/charts/mini-bar-chart';\nexport type {\n MiniBarChartProps,\n MiniBarChartSize,\n MiniBarChartOrientation,\n} from './components/charts/mini-bar-chart';\n\nexport { ChartLegend } from './components/charts/chart-legend';\nexport type {\n ChartLegendProps,\n ChartLegendItem,\n ChartLegendOrientation,\n} from './components/charts/chart-legend';\n\nexport { LegendDot } from './components/charts/legend-dot';\nexport type { LegendDotProps, LegendDotSize, LegendDotShape } from './components/charts/legend-dot';\n\nexport { TrendLabel } from './components/charts/trend-label';\nexport type {\n TrendLabelProps,\n TrendLabelWeight,\n TrendLabelSize,\n TrendDirection,\n} from './components/charts/trend-label';\n\n// ── Lists & rows ───────────────────────────────────────────────────────────────\n\nexport { ListRow } from './components/lists/list-row';\nexport type { ListRowProps, ListRowDensity, ListRowDivider } from './components/lists/list-row';\n\nexport { FileRow } from './components/lists/file-row';\nexport type { FileRowProps } from './components/lists/file-row';\n\nexport { ScoredRow } from './components/lists/scored-row';\nexport type { ScoredRowProps, ScoredRowAlign, ScoredRowGap } from './components/lists/scored-row';\n\nexport { RankedRow } from './components/lists/ranked-row';\nexport type { RankedRowProps } from './components/lists/ranked-row';\n\nexport { IconTextRow } from './components/lists/icon-text-row';\nexport type { IconTextRowProps } from './components/lists/icon-text-row';\n\nexport { ChecklistRow } from './components/lists/checklist-row';\nexport type { ChecklistRowProps, ChecklistRowState } from './components/lists/checklist-row';\n\nexport { NumberedStepsList } from './components/lists/numbered-steps-list';\nexport type { NumberedStepsListProps } from './components/lists/numbered-steps-list';\n\nexport { MetaField, MetaFieldGrid } from './components/lists/meta-field';\nexport type { MetaFieldProps, MetaFieldLayout, MetaFieldGridProps } from './components/lists/meta-field';\n\nexport { CheckedGroupList } from './components/lists/checked-group-list';\nexport type {\n CheckedGroupListProps,\n CheckedGroupListColumns,\n CheckedGroup,\n} from './components/lists/checked-group-list';\n\n// ── Data table ─────────────────────────────────────────────────────────────────\n// Lives in components/lists/ but is documented on its own page.\n\nexport {\n DataTable,\n TableCellLeadText,\n TableCellText,\n TableCellBadge,\n TableCellProgress,\n} from './components/lists/data-table';\nexport type {\n DataTableProps,\n DataTableDensity,\n DataTableAlign,\n ColumnDef,\n TableCellSize,\n TableCellLeadTextProps,\n TableCellTextProps,\n TableCellBadgeProps,\n TableCellProgressProps,\n} from './components/lists/data-table';\n\n// ── Feedback ───────────────────────────────────────────────────────────────────\n\nexport { InlineAlert } from './components/feedback/inline-alert';\nexport type { InlineAlertProps, InlineAlertTone } from './components/feedback/inline-alert';\n\nexport { EmptyState } from './components/feedback/empty-state';\nexport type { EmptyStateProps, EmptyStateVariant, EmptyStateSize } from './components/feedback/empty-state';\n\nexport { ProgressBar } from './components/feedback/progress-bar';\nexport type { ProgressBarProps, ProgressBarTone, ProgressBarSize } from './components/feedback/progress-bar';\n\n// ── Forms ──────────────────────────────────────────────────────────────────────\n\nexport { PasswordInput } from './components/forms/password-input';\nexport type { PasswordInputProps } from './components/forms/password-input';\n\n// ── AI surfaces & decorative ───────────────────────────────────────────────────\n\nexport { AIChatBar } from './components/ai/ai-chat-bar';\nexport type { AIChatBarProps } from './components/ai/ai-chat-bar';\n\nexport { AISuggestionChip } from './components/ai/ai-suggestion-chip';\nexport type { AISuggestionChipProps } from './components/ai/ai-suggestion-chip';\n\nexport { QuickActionsBar } from './components/ai/quick-actions-bar';\nexport type { QuickActionsBarProps, QuickAction } from './components/ai/quick-actions-bar';\n\nexport { AuroraBackdrop } from './components/decorative/aurora-backdrop';\n\n// ── Solid icons ────────────────────────────────────────────────────────────────\n// Filled 20×20 marks. The stroked set comes from `react-icons/lu`.\n\nexport {\n SolidAlertTriangle,\n SolidShieldCheck,\n SolidGlobe,\n SolidMapPin,\n SolidClock,\n SolidArrowRight,\n SolidInfoCircle,\n SolidCheck,\n SolidChartBar,\n} from './components/icons/solid';\n\n","import { type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type ButtonVariant = 'primary' | 'neutral' | 'subtle' | 'danger' | 'danger-subtle';\nexport type ButtonSize = 'lg' | 'md' | 'sm';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n}\n\nconst variantStyles: Record<ButtonVariant, string> = {\n primary: clsx(\n 'bg-brand border border-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n neutral: clsx(\n 'bg-default border border-default text-default',\n 'hover:bg-default-hover hover:text-brand',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n subtle: clsx(\n // border-transparent holds space so hover border doesn't shift layout\n 'bg-transparent border border-transparent text-neutral',\n 'hover:border-default hover:text-brand',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n danger: clsx(\n 'bg-danger border border-danger-secondary text-danger-on-danger',\n // border shifts from danger-secondary → danger-default on hover (Figma spec)\n 'hover:bg-danger-hover hover:border-danger',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n 'danger-subtle': clsx(\n // border-transparent base avoids layout shift when hover border appears\n 'bg-transparent border border-transparent text-danger',\n 'hover:bg-danger-tertiary-hover hover:border-danger',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n lg: 'h-12 px-3 gap-1 rounded-2xl text-body font-semibold [&_svg]:size-5',\n md: 'h-9 px-2 gap-0.5 rounded-lg text-body-sm font-semibold [&_svg]:size-5',\n sm: 'h-6 px-1.5 pt-0.5 gap-0 rounded-full text-body-tiny font-semibold [&_svg]:size-4',\n};\n\nexport function Button({\n variant = 'primary',\n size = 'md',\n leadingIcon,\n trailingIcon,\n children,\n className,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={clsx(\n 'inline-flex items-center justify-center whitespace-nowrap transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed',\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n {...props}\n >\n {leadingIcon}\n <div className='px-1'>{children}</div>\n {trailingIcon}\n </button>\n );\n}\n","import { type ButtonHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { type ButtonSize } from './button';\n\nexport type IconButtonVariant = 'primary' | 'neutral' | 'subtle';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: IconButtonVariant;\n size?: ButtonSize;\n /** Required for accessibility — no visible text label */\n 'aria-label': string;\n}\n\nconst variantStyles: Record<IconButtonVariant, string> = {\n primary: clsx(\n 'bg-brand border border-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n // Neutral uses secondary background (light gray) for visual weight without a text label\n neutral: clsx(\n 'bg-default-secondary border border-default text-default',\n // icon turns brand blue on hover (Figma spec)\n 'hover:bg-default-secondary-hover hover:text-brand',\n 'disabled:bg-disabled disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n subtle: clsx(\n 'bg-transparent text-neutral',\n // hover uses background-default-default-hover (#f5f5f5), icon turns brand blue (Figma spec)\n 'hover:bg-default-hover hover:text-brand',\n // disabled needs explicit border since there is no base border\n 'disabled:bg-disabled disabled:border disabled:border-disabled disabled:text-disabled-on-disabled',\n ),\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n lg: 'size-12 rounded-2xl [&_svg]:size-5',\n md: 'size-9 rounded-lg [&_svg]:size-5',\n sm: 'size-6 rounded-full [&_svg]:size-4',\n};\n\nexport function IconButton({\n variant = 'primary',\n size = 'md',\n children,\n className,\n ...props\n}: IconButtonProps) {\n return (\n <button\n className={clsx(\n 'inline-flex shrink-0 items-center justify-center transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed',\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { type ButtonSize } from './button';\n\nexport type ButtonGroupVariant = 'primary' | 'neutral' | 'filter';\nexport type ButtonGroupAlign = 'justify' | 'start' | 'end' | 'center' | 'stack';\n\nexport interface ButtonGroupItem {\n value: string;\n label: ReactNode;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface ButtonGroupProps {\n items: ButtonGroupItem[];\n value: string;\n onChange: (value: string) => void;\n variant?: ButtonGroupVariant;\n size?: ButtonSize;\n align?: ButtonGroupAlign;\n /** Forwarded to the container as aria-label */\n 'aria-label'?: string;\n className?: string;\n}\n\nconst containerStyles: Record<ButtonGroupVariant, string> = {\n primary: 'bg-neutral-tertiary p-1 rounded-2xl',\n neutral: 'bg-neutral-tertiary p-1 rounded-2xl',\n filter: 'bg-default border border-default p-1 rounded-xl',\n};\n\nconst selectedStyles: Record<ButtonGroupVariant, string> = {\n primary: clsx(\n 'bg-brand border border-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n ),\n neutral: clsx(\n 'bg-default border border-default text-default',\n 'hover:bg-default-hover',\n ),\n filter: clsx(\n 'bg-brand text-brand-on-brand',\n 'hover:bg-brand-hover',\n ),\n};\n\nconst unselectedStyles: Record<ButtonGroupVariant, string> = {\n primary: clsx('bg-transparent text-neutral', 'hover:bg-neutral-tertiary-hover'),\n neutral: clsx('bg-transparent text-neutral', 'hover:bg-neutral-tertiary-hover'),\n filter: clsx('text-default-secondary', 'hover:text-default'),\n};\n\nconst itemSizeStyles: Record<ButtonSize, string> = {\n lg: 'h-12 px-3 gap-1 rounded-2xl text-body font-semibold [&_svg]:size-5',\n md: 'h-9 px-2 gap-0.5 rounded-lg text-body-sm font-semibold [&_svg]:size-5',\n sm: 'h-6 px-1.5 pt-0.5 gap-0 rounded-full text-body-tiny font-semibold [&_svg]:size-4',\n};\n\nconst containerAlignStyles: Record<ButtonGroupAlign, string> = {\n justify: 'flex flex-row items-center',\n start: 'flex flex-row items-center justify-start',\n end: 'flex flex-row items-center justify-end',\n center: 'flex flex-row items-center justify-center',\n stack: 'flex flex-col items-center',\n};\n\nexport function ButtonGroup({\n items,\n value,\n onChange,\n variant = 'primary',\n size = 'md',\n align = 'start',\n className,\n 'aria-label': ariaLabel,\n}: ButtonGroupProps) {\n const isJustify = align === 'justify';\n const isStack = align === 'stack';\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={clsx(\n containerStyles[variant],\n containerAlignStyles[align],\n className,\n )}\n >\n {items.map((item) => {\n const isSelected = item.value === value;\n return (\n <div\n key={item.value}\n className={clsx(isJustify && 'flex-1 min-w-0', isStack && 'w-full')}\n >\n <button\n type=\"button\"\n aria-pressed={isSelected}\n disabled={item.disabled}\n onClick={() => onChange(item.value)}\n className={clsx(\n 'inline-flex items-center justify-center whitespace-nowrap transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed disabled:text-disabled',\n (isJustify || isStack) && 'w-full',\n itemSizeStyles[size],\n isSelected ? selectedStyles[variant] : unselectedStyles[variant],\n )}\n >\n {item.leadingIcon}\n <div className='px-1'>{item.label}</div>\n {item.trailingIcon}\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\n\nexport interface AvatarInitialProps {\n type?: 'initial';\n /** Single character — Figma spec: one letter only to avoid overflow */\n initial: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport interface AvatarImageProps {\n type: 'image';\n src: string;\n alt?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport type AvatarProps = AvatarInitialProps | AvatarImageProps;\n\n// Figma sizes: lg=40px, md=32px, sm=24px\nconst sizeStyles: Record<AvatarSize, string> = {\n lg: 'size-10',\n md: 'size-8',\n sm: 'size-6',\n};\n\n// Figma text sizes for initials: body-medium at lg, scales down proportionally\nconst initialTextStyles: Record<AvatarSize, string> = {\n lg: 'text-body font-semibold',\n md: 'text-body-xs font-semibold',\n sm: 'text-body-tiny font-semibold',\n};\n\n// Figma shape radii: circle=full, square: lg/md=8px (rounded-lg), sm=4px (rounded)\nfunction getShapeClass(shape: AvatarShape, size: AvatarSize): string {\n if (shape === 'circle') return 'rounded-full';\n return size === 'sm' ? 'rounded' : 'rounded-lg';\n}\n\nexport function Avatar(props: AvatarProps) {\n const { size = 'lg', shape = 'circle', className } = props;\n\n const base = clsx(\n 'shrink-0 overflow-hidden',\n sizeStyles[size],\n getShapeClass(shape, size),\n className,\n );\n\n if (props.type === 'image') {\n return (\n <div className={base}>\n <img\n src={props.src}\n alt={props.alt ?? ''}\n className=\"size-full object-cover\"\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(base, 'flex items-center justify-center')}\n style={{\n background:\n 'linear-gradient(135deg, var(--color-graphic-blue) 30%, var(--color-graphic-red) 100%)',\n }}\n >\n <span\n className={clsx(\n 'select-none leading-none text-brand-on-brand',\n initialTextStyles[size],\n )}\n >\n {props.initial.charAt(0).toUpperCase()}\n </span>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarGroupSpacing = 'spaced' | 'overlap';\n\nexport interface AvatarGroupProps {\n children: ReactNode;\n /** Number shown in the overflow badge — omit to hide the badge */\n overflow?: number;\n spacing?: AvatarGroupSpacing;\n className?: string;\n}\n\nexport function AvatarGroup({\n children,\n overflow,\n spacing = 'spaced',\n className,\n}: AvatarGroupProps) {\n return (\n <div\n className={clsx(\n 'flex items-center',\n spacing === 'spaced' ? 'gap-1' : '-space-x-2 isolate',\n className,\n )}\n >\n {children}\n {overflow !== undefined && (\n <div\n className={clsx(\n 'flex items-center justify-center',\n 'min-w-6 h-6 px-1 rounded-lg',\n 'bg-default-secondary text-default-secondary text-body-sm',\n spacing === 'overlap' && 'drop-shadow-sm',\n )}\n >\n +{overflow}\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport interface AvatarBlockProps {\n children: ReactNode;\n title: string;\n description?: string;\n className?: string;\n}\n\nexport function AvatarBlock({ children, title, description, className }: AvatarBlockProps) {\n return (\n <div className={clsx('flex items-start gap-3', className)}>\n <div className=\"shrink-0\">{children}</div>\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-body font-semibold text-default-secondary\">\n {title}\n </span>\n {description && (\n <span className=\"text-body text-default-tertiary\">\n {description}\n </span>\n )}\n </div>\n </div>\n );\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type InputSize = 'lg' | 'md' | 'sm';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: string;\n description?: string;\n /** Red border + message shown below the input */\n error?: string;\n /** Neutral helper text shown below the input (hidden when error is set) */\n hint?: string;\n size?: InputSize;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n /** Interactive trailing slot (e.g. a show/hide password button) — unlike\n * `trailingIcon` it receives pointer events. */\n trailingAction?: ReactNode;\n}\n\n// Figma sizes: lg=48px md=36px sm=24px\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2', // 8px\n md: 'gap-1', // 4px\n sm: 'gap-0.5', // 2px\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\nconst inputBase: Record<InputSize, string> = {\n lg: 'h-12 px-5 py-3.5 text-body',\n md: 'h-9 px-4 py-2.5 text-body-sm',\n sm: 'h-6 px-3 py-[5px] text-body-tiny',\n};\n\n// Extra left padding to clear the leading icon\n// lg adds 8px for the explicit flex gap Figma uses on large; md/sm have no gap\nconst leadingPad: Record<InputSize, string> = {\n lg: 'pl-12',\n md: 'pl-8',\n sm: 'pl-6',\n};\n\n// Extra right padding to clear the trailing icon\nconst trailingPad: Record<InputSize, string> = {\n lg: 'pr-12',\n md: 'pr-8',\n sm: 'pr-6',\n};\n\n// Icon wrapper: absolutely positioned inside the input container\nconst iconWrap: Record<InputSize, { left: string; right: string; size: string }> = {\n lg: { left: 'left-4', right: 'right-4', size: 'size-5' },\n md: { left: 'left-3', right: 'right-3', size: 'size-4' },\n sm: { left: 'left-2', right: 'right-2', size: 'size-3' },\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { label, description, error, hint, size = 'md', leadingIcon, trailingIcon, trailingAction, className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n const iw = iconWrap[size];\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <div className=\"relative flex items-center\">\n {leadingIcon && (\n <span className={clsx('pointer-events-none absolute', iw.left, iw.size, 'flex items-center justify-center text-icon-default-secondary')}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n disabled={disabled}\n className={clsx(\n 'w-full rounded-lg border outline-none transition-colors',\n 'bg-default text-default',\n 'placeholder:text-default-tertiary',\n inputBase[size],\n leadingIcon && leadingPad[size],\n (trailingIcon || trailingAction) && trailingPad[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled placeholder:text-disabled'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-secondary focus:ring-1 focus:ring-brand-secondary',\n )}\n {...props}\n />\n {trailingIcon && !trailingAction && (\n <span className={clsx('pointer-events-none absolute', iw.right, iw.size, 'flex items-center justify-center text-icon-default-secondary')}>\n {trailingIcon}\n </span>\n )}\n {trailingAction && (\n <span className={clsx('absolute', iw.right, 'flex items-center justify-center text-icon-default-secondary')}>\n {trailingAction}\n </span>\n )}\n </div>\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default')}>{hint}</p>\n )}\n </div>\n );\n});\n","import { forwardRef, type TextareaHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { type InputSize } from './input';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n description?: string;\n error?: string;\n hint?: string;\n size?: InputSize;\n}\n\n// Figma sizes — min-heights derived from Figma textarea frame heights\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2',\n md: 'gap-1',\n sm: 'gap-0.5',\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\n// Figma: large textarea inner height ~80px, medium ~68px, small ~52px\nconst textareaBase: Record<InputSize, string> = {\n lg: 'min-h-20 px-4 py-3.5 text-body',\n md: 'min-h-[68px] px-3 py-2.5 text-body-sm',\n sm: 'min-h-[52px] px-2 py-[5px] text-body-tiny',\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, description, error, hint, size = 'md', className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <textarea\n ref={ref}\n id={id}\n disabled={disabled}\n className={clsx(\n 'w-full rounded-lg border outline-none transition-colors resize-y',\n 'bg-default text-default',\n 'placeholder:text-default-tertiary',\n textareaBase[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled placeholder:text-disabled resize-none'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-secondary focus:ring-1 focus:ring-brand-secondary',\n )}\n {...props}\n />\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default-secondary')}>{hint}</p>\n )}\n </div>\n );\n});\n","import { forwardRef, type SelectHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { type InputSize } from './input';\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: string;\n description?: string;\n error?: string;\n hint?: string;\n size?: InputSize;\n options: SelectOption[];\n placeholder?: string;\n}\n\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2',\n md: 'gap-1',\n sm: 'gap-0.5',\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\n// pr = chevron right-offset + chevron width (exact minimum to clear the icon)\nconst selectBase: Record<InputSize, string> = {\n lg: 'h-12 pl-4 pr-9 text-body', // right-4 (16) + size-5 (20) = 36px\n md: 'h-9 pl-3 pr-7 text-body-sm', // right-3 (12) + size-4 (16) = 28px\n sm: 'h-6 pl-2 pr-5 text-body-tiny', // right-2 (8) + size-3 (12) = 20px\n};\n\n// Chevron icon size + position per size\nconst chevronPos: Record<InputSize, { right: string; size: string }> = {\n lg: { right: 'right-4', size: 'size-5' },\n md: { right: 'right-3', size: 'size-4' },\n sm: { right: 'right-2', size: 'size-3' },\n};\n\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { label, description, error, hint, size = 'md', options, placeholder, className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n const cp = chevronPos[size];\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <div className=\"relative flex items-center\">\n <select\n ref={ref}\n id={id}\n disabled={disabled}\n className={clsx(\n 'w-full appearance-none rounded-lg border outline-none transition-colors pt-0.5',\n 'bg-default text-default',\n selectBase[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-secondary focus:ring-1 focus:ring-brand-secondary',\n )}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <span\n className={clsx(\n 'pointer-events-none absolute',\n cp.right, cp.size,\n 'flex items-center justify-center',\n disabled ? 'text-icon-disabled' : 'text-icon-default-secondary',\n )}\n >\n <LuChevronDown className=\"size-full\" />\n </span>\n </div>\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default-secondary')}>{hint}</p>\n )}\n </div>\n );\n});\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { LuCalendar } from 'react-icons/lu';\nimport { type InputSize } from './input';\n\nexport interface DatePickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n label?: string;\n description?: string;\n error?: string;\n hint?: string;\n size?: InputSize;\n}\n\nconst wrapGap: Record<InputSize, string> = {\n lg: 'gap-2',\n md: 'gap-1',\n sm: 'gap-0.5',\n};\n\nconst labelText: Record<InputSize, string> = {\n lg: 'text-body',\n md: 'text-body-sm',\n sm: 'text-body-tiny',\n};\n\nconst inputBase: Record<InputSize, string> = {\n lg: 'h-12 px-5 py-3.5 pr-12 text-body',\n md: 'h-9 px-4 py-2.5 pr-8 text-body-sm',\n sm: 'h-6 px-3 py-[5px] pr-6 text-body-tiny',\n};\n\nconst iconWrap: Record<InputSize, { right: string; size: string }> = {\n lg: { right: 'right-4', size: 'size-5' },\n md: { right: 'right-3', size: 'size-4' },\n sm: { right: 'right-2', size: 'size-3' },\n};\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(function DatePicker(\n { label, description, error, hint, size = 'md', className, disabled, id, ...props },\n ref,\n) {\n const hasError = !!error;\n const iw = iconWrap[size];\n\n return (\n <div className={clsx('flex flex-col', wrapGap[size], className)}>\n {label && (\n <label\n htmlFor={id}\n className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-disabled' : 'text-default-secondary')}>\n {description}\n </p>\n )}\n <div className=\"relative flex items-center\">\n <input\n ref={ref}\n id={id}\n type=\"date\"\n disabled={disabled}\n className={clsx(\n 'w-full rounded-lg border outline-none transition-colors',\n 'bg-default text-default',\n '[&::-webkit-calendar-picker-indicator]:opacity-0',\n '[&::-webkit-calendar-picker-indicator]:absolute',\n '[&::-webkit-calendar-picker-indicator]:right-0',\n '[&::-webkit-calendar-picker-indicator]:h-full',\n '[&::-webkit-calendar-picker-indicator]:w-10',\n '[&::-webkit-calendar-picker-indicator]:cursor-pointer',\n inputBase[size],\n disabled\n ? 'cursor-not-allowed bg-disabled border-disabled text-disabled'\n : hasError\n ? 'border-danger-secondary focus:border-danger-secondary focus:ring-1 focus:ring-danger-secondary'\n : 'border-default focus:border-brand-secondary focus:ring-1 focus:ring-brand-secondary',\n )}\n {...props}\n />\n <span\n className={clsx(\n 'pointer-events-none absolute',\n iw.right, iw.size,\n 'flex items-center justify-center',\n disabled ? 'text-icon-disabled' : 'text-icon-default-secondary',\n )}\n >\n <LuCalendar className=\"size-full\" />\n </span>\n </div>\n {hasError && (\n <p className={clsx(labelText[size], 'text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-default')}>{hint}</p>\n )}\n </div>\n );\n});\n","import clsx from 'clsx';\nimport { LuCheck, LuChevronRight } from 'react-icons/lu';\n\nexport type StepStatus = 'complete' | 'active' | 'upcoming';\n\nexport interface StepItem {\n label: string;\n status: StepStatus;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n className?: string;\n}\n\nfunction StepIndicator({ status }: { status: StepStatus }) {\n if (status === 'complete') {\n return (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-brand text-white\">\n <LuCheck size={11} aria-hidden />\n </span>\n );\n }\n\n if (status === 'active') {\n return (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full border-2 border-brand-emphasis\">\n <span className=\"size-2.5 rounded-full bg-brand\" />\n </span>\n );\n }\n\n return (\n <span className=\"size-5 shrink-0 rounded-full border-2 border-disabled\" aria-hidden=\"true\" />\n );\n}\n\nfunction ChevronSeparator() {\n return <LuChevronRight className=\"mx-1 size-4 shrink-0 text-default-tertiary\" aria-hidden />;\n}\n\nconst labelClass: Record<StepStatus, string> = {\n complete: 'text-brand font-semibold',\n active: 'text-brand font-semibold',\n upcoming: 'text-disabled font-regular',\n};\n\nexport function Stepper({ steps, className }: StepperProps) {\n return (\n <ol\n className={clsx('flex items-center overflow-x-auto', className)}\n aria-label=\"Progress\"\n >\n {steps.map((step, i) => (\n <li\n key={i}\n className=\"flex items-center\"\n aria-current={step.status === 'active' ? 'step' : undefined}\n >\n <span className=\"flex items-center gap-1.5\">\n <StepIndicator status={step.status} />\n <span className={clsx('text-body-xs whitespace-nowrap', labelClass[step.status])}>\n {step.label}\n </span>\n </span>\n {i < steps.length - 1 && <ChevronSeparator />}\n </li>\n ))}\n </ol>\n );\n}\n","import clsx from 'clsx';\nimport { type ReactNode } from 'react';\nimport { LuCheck } from 'react-icons/lu';\n\nexport interface MultiSelectCardProps {\n icon: ReactNode;\n title: string;\n description?: string;\n selected: boolean;\n onToggle: () => void;\n className?: string;\n}\n\nexport function MultiSelectCard({\n icon,\n title,\n description,\n selected,\n onToggle,\n className,\n}: MultiSelectCardProps) {\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n onClick={onToggle}\n className={clsx(\n 'relative w-full rounded-2xl border-2 p-4 text-left transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n selected\n ? 'border-brand bg-brand-tertiary'\n : 'border-default bg-default hover:border-default-secondary',\n className,\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <span\n className={clsx(\n 'flex size-10 shrink-0 items-center justify-center rounded-xl',\n selected ? 'bg-brand' : 'bg-brand-tertiary',\n )}\n >\n <span className={clsx('size-5', selected ? 'text-icon-brand-on-brand' : 'text-icon-brand')}>\n {icon}\n </span>\n </span>\n\n {selected ? (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-brand text-icon-brand-on-brand\">\n <LuCheck className=\"size-3\" strokeWidth={2.5} aria-hidden />\n </span>\n ) : (\n <span\n className=\"size-5 shrink-0 rounded-full border-2 border-default\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n <div className=\"mt-3\">\n <p\n className={clsx(\n 'text-body-sm font-semibold',\n selected ? 'text-brand' : 'text-default',\n )}\n >\n {title}\n </p>\n {description && (\n <p className=\"mt-0.5 text-body-xs text-default-secondary\">{description}</p>\n )}\n </div>\n </button>\n );\n}\n","import clsx from 'clsx';\n\nexport type ToggleSize = 'sm' | 'md';\n\nexport interface ToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n /** Visible text beside the switch. Doubles as the accessible name. */\n label?: string;\n /** Track size. `sm` is 36×20, `md` is 44×24. */\n size?: ToggleSize;\n disabled?: boolean;\n id?: string;\n /** Accessible name when there is no visible `label`. */\n 'aria-label'?: string;\n /** Points at the id of an existing visible label elsewhere on the page. */\n 'aria-labelledby'?: string;\n className?: string;\n}\n\n/**\n * Track / knob geometry, straight from the Figma `_Toggle base` component.\n * The knob sits on a 2px inset, so travel = track width − knob − (2 × inset).\n */\nconst SIZE: Record<ToggleSize, { track: string; knob: string; translate: string }> = {\n sm: { track: 'h-5 w-9', knob: 'size-4', translate: 'translate-x-4' },\n md: { track: 'h-6 w-11', knob: 'size-5', translate: 'translate-x-5' },\n};\n\nexport function Toggle({\n checked,\n onChange,\n label,\n size = 'md',\n disabled = false,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n className,\n}: ToggleProps) {\n const s = SIZE[size];\n return (\n <button\n type=\"button\"\n role=\"switch\"\n id={id}\n aria-checked={checked}\n // With no visible label the switch would otherwise ship with no accessible name.\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={ariaLabelledBy}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={clsx(\n 'group flex items-center gap-2',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n >\n <span\n className={clsx(\n 'relative inline-flex shrink-0 rounded-full transition-colors',\n s.track,\n // The unchecked track is borderless per the spec. A border here would also\n // shift the knob's rendered inset by 1px between states, since the knob is\n // positioned against the padding box.\n disabled\n ? 'bg-disabled'\n : checked\n ? 'bg-brand group-hover:bg-brand-hover'\n : 'bg-default-secondary group-hover:bg-default-secondary-hover',\n )}\n >\n <span\n className={clsx(\n 'absolute left-0.5 top-0.5 rounded-full bg-default shadow-sm transition-transform',\n s.knob,\n checked ? s.translate : 'translate-x-0',\n )}\n />\n </span>\n {label && <span className=\"text-body-xs text-default\">{label}</span>}\n </button>\n );\n}\n","import { useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport { LuUpload } from 'react-icons/lu';\n\nexport interface FileDropZoneProps {\n className?: string;\n /** Caption shown under \"Upload file\". Defaults to the generic document hint. */\n description?: string;\n accept?: string;\n /** Files above this size are rejected before any upload starts. */\n maxSizeBytes?: number;\n onFileSelected?: (file: File) => void;\n disabled?: boolean;\n}\n\nconst DEFAULT_ACCEPT = '.pdf,.jpg,.jpeg,.png';\nconst DEFAULT_MAX_SIZE_BYTES = 10 * 1024 * 1024;\n\nfunction formatSize(bytes: number): string {\n const mb = bytes / (1024 * 1024);\n return `${Number.isInteger(mb) ? mb : mb.toFixed(1)} MB`;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const extensions = accept\n .split(',')\n .map((part) => part.trim().toLowerCase())\n .filter((part) => part.startsWith('.'));\n if (extensions.length === 0) {\n return true;\n }\n return extensions.some((extension) => file.name.toLowerCase().endsWith(extension));\n}\n\nexport function FileDropZone({\n className,\n description = 'Drag & drop or browse · PDF, JPG, PNG · up to 10 MB',\n accept = DEFAULT_ACCEPT,\n maxSizeBytes = DEFAULT_MAX_SIZE_BYTES,\n onFileSelected,\n disabled = false,\n}: FileDropZoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n function handleFiles(files: FileList | null) {\n const file = files?.[0];\n if (!file) {\n return;\n }\n if (!matchesAccept(file, accept)) {\n setError(`Unsupported file type. Allowed: ${accept}.`);\n return;\n }\n if (file.size > maxSizeBytes) {\n setError(`That file is ${formatSize(file.size)}. The limit is ${formatSize(maxSizeBytes)}.`);\n return;\n }\n setError(null);\n onFileSelected?.(file);\n }\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"sr-only\"\n tabIndex={-1}\n disabled={disabled}\n onChange={(e) => {\n handleFiles(e.target.files);\n e.target.value = '';\n }}\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={() => { if (!disabled) inputRef.current?.click(); }}\n onKeyDown={(e) => {\n if (!disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragOver={(e) => { e.preventDefault(); if (!disabled) setIsDragging(true); }}\n onDragEnter={(e) => { e.preventDefault(); if (!disabled) setIsDragging(true); }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={(e) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled) handleFiles(e.dataTransfer.files);\n }}\n className={clsx(\n 'flex flex-col items-center justify-center gap-1 rounded-lg border-2 border-dashed py-4 px-4 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1',\n disabled\n ? 'cursor-not-allowed border-disabled bg-disabled'\n : clsx(\n 'cursor-pointer',\n isDragging\n ? 'border-brand bg-brand-tertiary'\n : 'border-default bg-default-secondary hover:border-brand hover:bg-brand-tertiary',\n ),\n className,\n )}\n >\n <span className={disabled ? 'text-disabled' : isDragging ? 'text-brand' : 'text-default-secondary'}>\n <LuUpload className=\"size-5\" />\n </span>\n <span className={clsx('text-body-sm font-medium', disabled ? 'text-disabled' : 'text-default')}>Upload file</span>\n <span className=\"text-body-xs text-default-secondary text-center\">\n {description}\n </span>\n </div>\n {error && (\n <span role=\"alert\" className=\"text-body-xs text-danger\">\n {error}\n </span>\n )}\n </>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { LuArrowLeft, LuArrowRight } from 'react-icons/lu';\nimport { Button } from './button';\n\n// ── FormCard ───────────────────────────────────────────────────────────────────\n\nexport function FormCard({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={clsx(\n 'overflow-hidden rounded-xl border border-default bg-default',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n// ── FormCardHeader ─────────────────────────────────────────────────────────────\n\nexport interface FormCardHeaderProps {\n title: string;\n subtitle?: string;\n}\n\nexport function FormCardHeader({ title, subtitle }: FormCardHeaderProps) {\n return (\n <div className=\"border-b border-default px-7 py-6\">\n <h2 className=\"text-heading-sm font-semibold text-default leading-snug\">{title}</h2>\n {subtitle && (\n <p className=\"mt-1 text-body-xs text-default-secondary\">{subtitle}</p>\n )}\n </div>\n );\n}\n\n// ── FormCardFooter ─────────────────────────────────────────────────────────────\n\nexport interface FormCardFooterProps {\n onSaveDraft?: () => void;\n onBack?: () => void;\n onContinue?: () => void;\n continueLabel?: string;\n backDisabled?: boolean;\n continueDisabled?: boolean;\n}\n\nexport function FormCardFooter({\n onSaveDraft,\n onBack,\n onContinue,\n continueLabel = 'Continue',\n backDisabled = false,\n continueDisabled = false,\n}: FormCardFooterProps) {\n return (\n <div className=\"flex items-center justify-between border-t border-default px-7 py-5\">\n {/* No handler means the host has nothing to save to — disable rather than no-op */}\n <Button variant=\"neutral\" size=\"md\" onClick={onSaveDraft} disabled={!onSaveDraft}>\n Save as draft\n </Button>\n <div className=\"flex items-center gap-2\">\n {!backDisabled && (\n <Button variant=\"neutral\" size=\"md\" leadingIcon={<LuArrowLeft size={16} />} onClick={onBack}>\n Back\n </Button>\n )}\n <Button variant=\"primary\" size=\"md\" trailingIcon={<LuArrowRight size={16} />} onClick={onContinue} disabled={continueDisabled}>\n {continueLabel}\n </Button>\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { LuX } from 'react-icons/lu';\n\nexport type BadgeColor = 'gray' | 'red' | 'yellow' | 'lime' | 'green' | 'teal' | 'blue' | 'pink' | 'slate';\nexport type BadgeSize = 'sm' | 'lg';\nexport type BadgeVariant = 'default' | 'subtle';\n\nexport interface BadgeProps {\n label: string;\n color?: BadgeColor;\n size?: BadgeSize;\n variant?: BadgeVariant;\n indicator?: boolean;\n onClose?: () => void;\n className?: string;\n}\n\nconst defaultClasses: Record<BadgeColor, string> = {\n gray: 'bg-badge-gray text-badge-gray',\n red: 'bg-badge-red text-badge-red',\n yellow: 'bg-badge-yellow text-badge-yellow',\n lime: 'bg-badge-lime text-badge-lime',\n green: 'bg-badge-green text-badge-green',\n teal: 'bg-badge-teal text-badge-teal',\n blue: 'bg-badge-blue text-badge-blue',\n pink: 'bg-badge-pink text-badge-pink',\n slate: 'bg-badge-slate text-badge-slate',\n};\n\nconst subtleClasses: Record<BadgeColor, string> = {\n gray: 'border border-badge-gray text-default-secondary',\n red: 'border border-badge-red text-default-secondary',\n yellow: 'border border-badge-yellow text-default-secondary',\n lime: 'border border-badge-lime text-default-secondary',\n green: 'border border-badge-green text-default-secondary',\n teal: 'border border-badge-teal text-default-secondary',\n blue: 'border border-badge-blue text-default-secondary',\n pink: 'border border-badge-pink text-default-secondary',\n slate: 'border border-badge-slate text-default-secondary',\n};\n\nexport function Badge({\n label,\n color = 'gray',\n size = 'sm',\n variant = 'default',\n indicator = false,\n onClose,\n className,\n}: BadgeProps) {\n const isDefault = variant === 'default';\n\n return (\n <span\n className={clsx(\n 'inline-flex items-center rounded-full px-2 py-0.5',\n size === 'sm' ? 'gap-1' : 'gap-1.5',\n isDefault ? defaultClasses[color] : subtleClasses[color],\n className,\n )}\n >\n {indicator && (\n <span\n className={clsx(\n 'shrink-0 rounded-full bg-current',\n size === 'sm' ? 'h-1.5 w-1.5' : 'h-2 w-2',\n )}\n />\n )}\n <span\n className={clsx(\n 'whitespace-nowrap',\n size === 'sm'\n ? clsx('text-body-tiny', isDefault && 'font-semibold')\n : 'text-body-xs',\n )}\n >\n {label}\n </span>\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n className={clsx(\n 'inline-flex shrink-0 items-center justify-center rounded-full opacity-60 transition-opacity hover:opacity-100',\n size === 'sm' ? 'h-3 w-3' : 'h-4 w-4',\n )}\n aria-label=\"Remove\"\n >\n <LuX className=\"h-full w-full\" strokeWidth={2.5} aria-hidden />\n </button>\n )}\n </span>\n );\n}\n","import clsx from 'clsx';\n\nexport interface RoleBadgeProps {\n role: string;\n size?: 'sm' | 'md';\n /**\n * Explicit role colour as a solid 6-digit hex (e.g. `#0c2d58`). When set it drives\n * the badge — text uses the hex and the background a light tint of it. Prefer this\n * over relying on the built-in name map, which only covers a fixed set of English\n * role names. Falls back to the name map, then grey.\n */\n color?: string | null;\n}\n\nconst ROLE_COLORS: Record<string, { bg: string; text: string }> = {\n 'Super Admin': { bg: '#e9eff7', text: '#0c2d58' },\n 'Admin': { bg: '#e9eff7', text: '#0c2d58' },\n 'Compliance Lead': { bg: '#ece6f7', text: '#5b3da8' },\n 'Reviewer': { bg: '#dbeafe', text: '#1d4ed8' },\n 'Requester': { bg: '#e6f4ea', text: '#1f7a3d' },\n 'Entity Manager': { bg: '#fbe6cf', text: '#9a6206' },\n 'Intelligence Analyst': { bg: '#fde2e7', text: '#a3284a' },\n 'Auditor': { bg: '#f5f5f5', text: '#757575' },\n 'Viewer': { bg: '#f5f5f5', text: '#757575' },\n 'User': { bg: '#e9eff7', text: '#0c2d58' },\n};\n\nconst FALLBACK = { bg: '#f5f5f5', text: '#757575' };\n\nconst HEX6 = /^#[0-9a-fA-F]{6}$/;\n\nfunction resolveColors(role: string, color?: string | null): { bg: string; text: string } {\n if (color && HEX6.test(color)) {\n // Light tint of the supplied hue for the background, full hue for the text.\n return { bg: `${color}1F`, text: color };\n }\n return ROLE_COLORS[role] ?? FALLBACK;\n}\n\nexport function RoleBadge({ role, size = 'sm', color }: RoleBadgeProps) {\n const colors = resolveColors(role, color);\n\n return (\n <span\n className={clsx(\n 'inline-flex items-center rounded-full font-medium whitespace-nowrap',\n size === 'sm' ? 'px-2 py-0.5 text-body-tiny' : 'px-3 py-1 text-body-xs',\n )}\n style={{ backgroundColor: colors.bg, color: colors.text }}\n >\n {role}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { RoleBadge } from '../status/role-badge';\n\nexport interface RoleOption {\n role: string;\n description: string;\n}\n\nexport const ROLE_COMBO_OPTIONS: RoleOption[] = [\n { role: 'Reviewer', description: 'Reviews onboarding requests' },\n { role: 'Admin', description: 'Full org control' },\n { role: 'Compliance Lead', description: 'Owns compliance' },\n { role: 'Requester', description: 'Creates onboarding requests' },\n { role: 'Viewer', description: 'Read-only access' },\n { role: 'User', description: 'Default user access' },\n];\n\nexport interface RoleComboBoxProps {\n value: string;\n onChange: (role: string) => void;\n options?: RoleOption[];\n}\n\n\nexport function RoleComboBox({ value, onChange, options = ROLE_COMBO_OPTIONS }: RoleComboBoxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n setQuery('');\n }\n }\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }, [open]);\n\n function openDropdown() {\n setOpen(true);\n setQuery('');\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n\n function select(role: string) {\n onChange(role);\n setOpen(false);\n setQuery('');\n }\n\n const selectedEntry = options.find(o => o.role === value);\n const otherOptions = options.filter(\n o => o.role !== value && o.role.toLowerCase().includes(query.toLowerCase()),\n );\n\n return (\n <div className=\"relative\" ref={containerRef}>\n {/* Trigger */}\n <div\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n onClick={openDropdown}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openDropdown(); }\n if (e.key === 'Escape') { setOpen(false); setQuery(''); }\n }}\n className={`flex h-11 cursor-pointer items-center gap-2 rounded-lg border-[1.5px] pl-2.5 pr-3 transition-colors ${\n open ? 'border-blue-500' : 'border-default hover:border-brand-tertiary'\n }`}\n >\n <div className=\"flex flex-1 min-w-0 items-center gap-1.5 overflow-hidden\">\n <RoleBadge role={value} size=\"sm\" />\n {value === 'User' && !open && (\n <span className=\"rounded border border-default bg-default-secondary px-1.5 py-0.5 text-body-tiny font-medium text-default-secondary\">\n DEFAULT\n </span>\n )}\n {open && (\n <>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onClick={e => e.stopPropagation()}\n className=\"min-w-0 flex-1 bg-transparent text-body-xs text-default outline-none\"\n aria-label=\"Search roles\"\n />\n <span className=\"mx-0.5 h-[18px] w-px shrink-0 bg-divider\" aria-hidden />\n </>\n )}\n </div>\n <span className=\"shrink-0 text-default-secondary\">\n <LuChevronDown size={14} />\n </span>\n </div>\n\n {/* Dropdown */}\n {open && (\n <div\n role=\"listbox\"\n className=\"absolute left-0 right-0 top-full z-20 mt-1 flex max-h-64 flex-col gap-0.5 overflow-y-auto rounded-xl border border-default bg-white p-1.5 shadow-lg\"\n >\n {/* Currently selected */}\n {selectedEntry && (\n <div\n role=\"option\"\n aria-selected\n className=\"flex cursor-pointer items-center gap-2.5 rounded-md bg-blue-50 px-2.5 py-2\"\n onClick={() => select(selectedEntry.role)}\n >\n <RoleBadge role={selectedEntry.role} size=\"sm\" />\n <span className=\"flex-1 text-body-xs text-default-secondary\">\n {selectedEntry.description}\n </span>\n <span className=\"shrink-0 text-sm font-bold text-blue-600\">✓</span>\n </div>\n )}\n\n <div className=\"h-px bg-divider\" />\n\n {/* Other roles */}\n {otherOptions.length > 0 && (\n <>\n <div className=\"px-2.5 pb-1 pt-1.5\">\n <span className=\"text-body-tiny font-semibold uppercase tracking-wide text-default-secondary\">\n Other roles\n </span>\n </div>\n {otherOptions.map(opt => (\n <div\n key={opt.role}\n role=\"option\"\n aria-selected={false}\n className=\"flex cursor-pointer items-center gap-2.5 rounded-md px-2.5 py-2 hover:bg-default-secondary\"\n onClick={() => select(opt.role)}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); select(opt.role); }\n }}\n >\n <RoleBadge role={opt.role} size=\"sm\" />\n <span className=\"text-body-xs text-default-secondary\">{opt.description}</span>\n </div>\n ))}\n </>\n )}\n\n {otherOptions.length === 0 && query && (\n <p className=\"px-2.5 py-2 text-body-xs text-default-secondary\">\n No roles match \"{query}\"\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\n/**\n * The six status tones from the Figma design system.\n * Values live in `src/app/styles/tokens/status.css`; see that file for why they do\n * not derive from the SDS semantic colour families.\n */\nexport type StatusTone =\n | 'neutral'\n | 'info'\n | 'warning'\n | 'caution'\n | 'accent'\n | 'positive'\n | 'danger';\n\nexport type StatusBadgeSize = 'sm' | 'md';\n\nconst TONE_STYLES: Record<StatusTone, string> = {\n neutral: 'bg-status-neutral text-status-neutral',\n info: 'bg-status-info text-status-info',\n warning: 'bg-status-warning text-status-warning',\n caution: 'bg-status-caution text-status-caution',\n accent: 'bg-status-accent text-status-accent',\n positive: 'bg-status-positive text-status-positive',\n danger: 'bg-status-danger text-status-danger',\n};\n\nconst DOT_STYLES: Record<StatusTone, string> = {\n neutral: 'bg-status-dot-neutral',\n info: 'bg-status-dot-info',\n warning: 'bg-status-dot-warning',\n caution: 'bg-status-dot-caution',\n accent: 'bg-status-dot-accent',\n positive: 'bg-status-dot-positive',\n danger: 'bg-status-dot-danger',\n};\n\nconst SIZE_STYLES: Record<StatusBadgeSize, string> = {\n sm: 'px-2 py-0.5 text-body-tiny',\n md: 'px-2.5 py-1 text-body-xs',\n};\n\nexport interface StatusBadgeProps {\n label: string;\n tone?: StatusTone;\n size?: StatusBadgeSize;\n /** Leading dot. On by default — the Figma status pills all carry one. */\n dot?: boolean;\n /**\n * Leading glyph, replacing the dot — e.g. `<LuCheck className=\"size-3\" />`.\n * Use for states a colour alone under-states, like verified or rejected.\n */\n icon?: ReactNode;\n className?: string;\n}\n\n/**\n * The status pill.\n *\n * Replaces thirteen inline re-implementations of the same markup plus five\n * competing hardcoded hex palettes. Generalises `TableCellStatusPill`, which had\n * this exact markup but required callers to pass raw hex strings.\n *\n * Note this is NOT `StatusChip` — that one renders a label *and a count* and is a\n * different component.\n */\nexport function StatusBadge({\n label,\n tone = 'neutral',\n size = 'md',\n dot = true,\n icon,\n className,\n}: StatusBadgeProps) {\n return (\n <span\n className={clsx(\n 'inline-flex items-center gap-1.5 rounded-full font-medium leading-tight whitespace-nowrap',\n SIZE_STYLES[size],\n TONE_STYLES[tone],\n className,\n )}\n >\n {icon ? (\n <span className=\"shrink-0\">{icon}</span>\n ) : (\n dot && <span className={clsx('size-1.5 shrink-0 rounded-full', DOT_STYLES[tone])} />\n )}\n {label}\n </span>\n );\n}\n","import clsx from 'clsx';\n\nexport type StatusDotTone = 'brand' | 'positive' | 'warning' | 'danger' | 'neutral' | 'default';\n\nexport interface StatusDotProps {\n tone?: StatusDotTone;\n /** @deprecated Bypasses the design tokens — pass `tone` instead. Raw hex color, overrides `tone` via inline style. Use when the exact source color doesn't match a design token. */\n color?: string;\n className?: string;\n}\n\nconst dotTones: Record<StatusDotTone, string> = {\n brand: 'bg-brand',\n positive:'bg-positive',\n warning: 'bg-warning',\n danger: 'bg-danger',\n neutral: 'bg-neutral',\n default: 'bg-default-tertiary',\n};\n\nexport function StatusDot({ tone = 'default', color, className }: StatusDotProps) {\n return (\n <span\n className={clsx('inline-block size-1.5 shrink-0 rounded-full', !color && dotTones[tone], className)}\n style={color ? { backgroundColor: color } : undefined}\n />\n );\n}\n","import clsx from 'clsx';\nimport { StatusDot } from './status-dot';\nimport type { StatusDotTone } from './status-dot';\n\nexport interface StatusChipProps {\n label: string;\n count: number | string;\n tone?: StatusDotTone;\n /** @deprecated Bypasses the design tokens — pass `tone` instead. Raw hex dot color, overrides `tone` via inline style. Use when the exact source color doesn't match a design token. */\n dotColor?: string;\n bg?: string;\n className?: string;\n}\n\nexport function StatusChip({ label, count, tone = 'default', dotColor, bg, className }: StatusChipProps) {\n return (\n <span\n className={clsx(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-1',\n !bg && 'bg-default-secondary',\n className,\n )}\n style={bg ? { backgroundColor: bg } : undefined}\n >\n <StatusDot tone={tone} color={dotColor} />\n <span className=\"text-body-xs font-medium text-default\">{count}</span>\n <span className=\"text-body-xs text-default-secondary\">{label}</span>\n </span>\n );\n}\n","import clsx from 'clsx';\nimport { StatusDot } from './status-dot';\nimport type { StatusDotTone } from './status-dot';\n\nexport interface CountBadgeProps {\n count: number | string;\n label?: string;\n tone?: StatusDotTone;\n className?: string;\n}\n\nexport function CountBadge({ count, label, tone = 'positive', className }: CountBadgeProps) {\n return (\n <span\n className={clsx(\n 'inline-flex items-center gap-1.5 rounded-full border border-default px-2.5 py-1 text-body-xs font-medium text-default',\n className,\n )}\n >\n <StatusDot tone={tone} />\n {count}\n {label && <span className=\"text-default-secondary\">{label}</span>}\n </span>\n );\n}\n","import clsx from 'clsx';\n\nexport type TagPillTone = 'default' | 'brand' | 'positive' | 'warning' | 'danger';\n\nexport interface TagPillProps {\n label: string;\n tone?: TagPillTone;\n /** @deprecated Bypasses the design tokens — pass `tone` instead. Raw hex bg/text pair, overrides `tone` via inline style. Use when the exact source colors don't match design tokens. */\n bg?: string;\n color?: string;\n className?: string;\n}\n\nconst toneStyles: Record<TagPillTone, string> = {\n default: 'bg-default-secondary text-default-secondary',\n brand: 'bg-brand-tertiary text-brand',\n positive:'bg-positive-tertiary text-positive',\n warning: 'bg-warning-tertiary text-warning',\n danger: 'bg-danger-tertiary text-danger',\n};\n\nexport function TagPill({ label, tone = 'default', bg, color, className }: TagPillProps) {\n return (\n <span\n className={clsx(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-body-xs font-medium',\n !bg && !color && toneStyles[tone],\n className,\n )}\n style={{\n ...(bg ? { backgroundColor: bg } : undefined),\n ...(color ? { color } : undefined),\n }}\n >\n {label}\n </span>\n );\n}\n","import clsx from 'clsx';\n\nimport type { StatusTone } from './status-badge';\n\nconst DOT: Record<StatusTone, string> = {\n neutral: 'bg-status-dot-neutral',\n info: 'bg-status-dot-info',\n warning: 'bg-status-dot-warning',\n caution: 'bg-status-dot-caution',\n accent: 'bg-status-dot-accent',\n positive: 'bg-status-dot-positive',\n danger: 'bg-status-dot-danger',\n};\n\nexport interface TrailChipProps {\n label: string;\n value: string;\n tone?: StatusTone;\n /**\n * Data-driven dot colour, overriding `tone`. The investigations trail mirrors the\n * severity accent of whichever tree node is selected, and those accents come from\n * the row data rather than the status palette — this is the escape hatch Phase 10\n * classifies as \"genuinely data-driven colour\", not a token bypass.\n */\n dotColor?: string;\n className?: string;\n}\n\n/**\n * Dot + small uppercase label + value, used for the drill-down breadcrumb trail on\n * the investigations page.\n *\n * Promoted from `pages/investigations`, where the dot colour was passed as a raw hex.\n */\nexport function TrailChip({ label, value, tone = 'info', dotColor, className }: TrailChipProps) {\n return (\n <div\n className={clsx(\n 'flex items-center gap-2 rounded-full border border-default bg-default px-3 py-1.5',\n className,\n )}\n >\n <span\n className={clsx('size-1.5 shrink-0 rounded-full', !dotColor && DOT[tone])}\n style={dotColor ? { backgroundColor: dotColor } : undefined}\n />\n <span className=\"text-body-tiny font-semibold uppercase tracking-wide text-default-secondary\">\n {label}\n </span>\n <span className=\"text-body-xs font-medium text-default\">{value}</span>\n </div>\n );\n}\n","import { StatusBadge, type StatusTone } from './status-badge';\n\nexport type UserAccountStatus = 'active' | 'pending' | 'deactivated';\n\nconst STATUS_META: Record<UserAccountStatus, { label: string; tone: StatusTone }> = {\n active: { label: 'Active', tone: 'positive' },\n // `caution` (pale yellow), not `warning` (orange) — Pending is one step below a\n // warning on the severity ramp, and reads as waiting rather than at risk.\n pending: { label: 'Pending', tone: 'caution' },\n deactivated: { label: 'Deactivated', tone: 'danger' },\n};\n\nexport interface UserStatusPillProps {\n status: UserAccountStatus;\n}\n\n/** Account-status pill. A thin wrapper over `StatusBadge`. */\nexport function UserStatusPill({ status }: UserStatusPillProps) {\n const { label, tone } = STATUS_META[status];\n return <StatusBadge label={label} tone={tone} />;\n}\n","import clsx from 'clsx';\nimport { LuCheck, LuCircleAlert, LuLoaderCircle, LuMinus, LuX } from 'react-icons/lu';\n\n/**\n * States of a compliance check.\n *\n * Union of the two previously-divergent local unions:\n * - `features/entity-detail` had passed | in_progress | pending | action_required\n * - `features/reviewer-detail` had passed | in-progress | failed | pending | waived\n *\n * Note `in_progress` (underscore) is canonical — entity-detail's spelling, which is\n * the one backed by the API. reviewer-detail used `in-progress` (hyphen) in mock data.\n */\nexport type CheckIndicatorStatus =\n | 'passed'\n | 'in_progress'\n | 'action_required'\n | 'failed'\n | 'pending'\n | 'waived';\n\n/**\n * `action_required` and `failed` share the Figma colours and differ only in glyph\n * (`!` vs `✕`); `waived` shares `pending`'s colours and adds a dash.\n */\nconst STATUS_STYLES: Record<CheckIndicatorStatus, string> = {\n passed: 'bg-status-check-passed border-status-check-passed text-status-check-passed',\n in_progress: 'bg-status-check-progress border-status-check-progress text-status-check-progress',\n action_required: 'bg-status-check-failed border-status-check-failed text-status-check-failed',\n failed: 'bg-status-check-failed border-status-check-failed text-status-check-failed',\n pending: 'bg-status-check-pending border-status-check-pending text-status-check-pending',\n waived: 'bg-status-check-pending border-status-check-pending text-status-check-pending',\n};\n\n/**\n * Glyphs — every one now comes from `react-icons/lu`, so the set is stroke-consistent.\n *\n * The two that used to be typographic: `◐` became `LuLoaderCircle` (lucide has no\n * half-filled circle, but a partial ring reads as in-progress and is a real icon), and\n * `!` became `LuCircleAlert`. Both are a small visual change from 0.2.0.\n */\nfunction StatusGlyph({ status }: { status: CheckIndicatorStatus }) {\n switch (status) {\n case 'passed':\n return <LuCheck className=\"size-3\" strokeWidth={3} aria-hidden />;\n case 'failed':\n return <LuX className=\"size-3\" strokeWidth={3} aria-hidden />;\n case 'waived':\n return <LuMinus className=\"size-3\" strokeWidth={3} aria-hidden />;\n case 'in_progress':\n return <LuLoaderCircle className=\"size-3\" strokeWidth={3} aria-hidden />;\n case 'action_required':\n return <LuCircleAlert className=\"size-3.5\" strokeWidth={2.5} aria-hidden />;\n case 'pending':\n return null;\n }\n}\n\nexport interface CheckIndicatorProps {\n status: CheckIndicatorStatus;\n /** Accessible label. Without one the indicator is decorative, which is correct when an adjacent text label already names the state. */\n label?: string;\n className?: string;\n}\n\n/**\n * The 22px outlined circle used for compliance-check state in entity and reviewer\n * detail. Ring and glyph share one colour; see the check tokens in\n * `src/app/styles/tokens/status.css`.\n */\nexport function CheckIndicator({ status, label, className }: CheckIndicatorProps) {\n return (\n <div\n className={clsx(\n 'flex size-[22px] shrink-0 items-center justify-center rounded-full border-[1.5px]',\n STATUS_STYLES[status],\n className,\n )}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n >\n <StatusGlyph status={status} />\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type EntityIconBadgeSize = 'sm' | 'md';\nexport type EntityIconBadgeTone = 'default' | 'brand' | 'positive' | 'warning' | 'danger' | 'neutral';\nexport type EntityIconBadgeShape = 'square' | 'circle';\n\nexport interface EntityIconBadgeProps {\n size?: EntityIconBadgeSize;\n tone?: EntityIconBadgeTone;\n /**\n * `square` is the rounded-rect used on entity rows. `circle` is the tinted glyph\n * circle used in modal headers. A prop rather than a `className` override, so it\n * does not depend on Tailwind's stylesheet emit order.\n */\n shape?: EntityIconBadgeShape;\n /** @deprecated Bypasses the design tokens — pass `tone` instead. Raw hex background, overrides `tone` via inline style. Use when the exact source color doesn't match a design token. */\n bg?: string;\n iconColor?: string;\n children: ReactNode;\n className?: string;\n}\n\nconst sizeStyles: Record<EntityIconBadgeSize, string> = {\n sm: 'size-8',\n md: 'size-10',\n};\n\nconst shapeStyles: Record<EntityIconBadgeShape, Record<EntityIconBadgeSize, string>> = {\n square: { sm: 'rounded-lg', md: 'rounded-xl' },\n circle: { sm: 'rounded-full', md: 'rounded-full' },\n};\n\nconst toneStyles: Record<EntityIconBadgeTone, string> = {\n default: 'bg-default-secondary text-icon-default',\n brand: 'bg-brand-tertiary text-icon-brand',\n positive:'bg-positive-tertiary text-icon-positive',\n warning: 'bg-warning-tertiary text-icon-warning',\n danger: 'bg-danger-tertiary text-icon-danger',\n neutral: 'bg-neutral-tertiary text-icon-neutral',\n};\n\nexport function EntityIconBadge({ size = 'sm', tone = 'default', shape = 'square', bg, iconColor, children, className }: EntityIconBadgeProps) {\n return (\n <span\n className={clsx(\n 'inline-flex shrink-0 items-center justify-center',\n sizeStyles[size],\n shapeStyles[shape][size],\n !bg && !iconColor && toneStyles[tone],\n className,\n )}\n style={{\n ...(bg ? { backgroundColor: bg } : undefined),\n ...(iconColor ? { color: iconColor } : undefined),\n }}\n >\n {children}\n </span>\n );\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { LuCheck, LuMinus } from 'react-icons/lu';\n\nexport interface CheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label?: ReactNode;\n disabled?: boolean;\n indeterminate?: boolean;\n className?: string;\n}\n\n/** Checkbox built on a real `<input type=\"checkbox\">` — the hand-rolled `<div onClick>` version\n * this replaces was not keyboard-reachable and exposed no checked state to assistive tech. */\nexport function Checkbox({\n checked,\n onChange,\n label,\n disabled = false,\n indeterminate = false,\n className,\n}: CheckboxProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) inputRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <label\n className={clsx(\n 'group inline-flex items-start gap-2.5',\n disabled ? 'cursor-not-allowed opacity-60' : 'cursor-pointer',\n className,\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n className=\"peer sr-only\"\n />\n <span\n aria-hidden\n className={clsx(\n 'mt-px flex size-[18px] shrink-0 items-center justify-center rounded-[4px] border-[1.5px] transition-colors',\n 'peer-focus-visible:ring-2 peer-focus-visible:ring-brand peer-focus-visible:ring-offset-1',\n checked || indeterminate\n ? 'border-brand-emphasis bg-brand text-brand-on-brand'\n : 'border-default-secondary bg-default',\n )}\n >\n {indeterminate ? (\n <LuMinus className=\"size-3\" strokeWidth={3} />\n ) : checked ? (\n <LuCheck className=\"size-3\" strokeWidth={3} />\n ) : null}\n </span>\n {label && <span className=\"text-body-xs text-default\">{label}</span>}\n </label>\n );\n}\n","import clsx from 'clsx';\n\nexport interface SegmentedControlOption {\n value: string;\n label: string;\n}\n\nexport interface SegmentedControlProps {\n options: SegmentedControlOption[];\n value: string;\n onChange?: (value: string) => void;\n className?: string;\n}\n\nexport function SegmentedControl({ options, value, onChange, className }: SegmentedControlProps) {\n return (\n <div\n className={clsx(\n 'inline-flex items-center rounded-xl border border-default bg-default-secondary p-0.5',\n className,\n )}\n >\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange?.(opt.value)}\n className={clsx(\n 'rounded-lg px-3.5 py-1.5 text-body-xs font-medium transition-colors',\n opt.value === value\n ? 'bg-default shadow-panel text-default'\n : 'text-default-secondary hover:text-default',\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { LuCircleCheckBig, LuInfo, LuOctagonAlert, LuTriangleAlert, LuX } from 'react-icons/lu';\nimport { cn } from '../../lib/cn';\nimport { EntityIconBadge, type EntityIconBadgeTone } from '../status/entity-icon-badge';\nimport { IconButton } from '../forms/icon-button';\nimport { OVERLAY_SCRIM, useOverlayDismiss } from './overlay';\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl';\n/**\n * Note `positive`, not `success` — every other tone union in the library\n * (`InlineAlertTone`, `TagPillTone`, `EntityIconBadgeTone`) and the token layer say\n * `positive`, and one vocabulary beats a familiar synonym.\n */\nexport type ModalTone = 'default' | 'info' | 'positive' | 'warning' | 'danger';\nexport type ModalFooterAlign = 'start' | 'between' | 'end';\n\n/**\n * The `sm:` prefix is mandatory, not cosmetic. In 0.2.0 `max-w-[540px]` was applied\n * unprefixed, so between 540px and the `sm` breakpoint (640px) the \"bottom sheet\" was\n * a 540px card floating in the middle of the viewport.\n */\nconst SIZE: Record<ModalSize, string> = {\n sm: 'sm:max-w-[420px]',\n md: 'sm:max-w-[540px]',\n lg: 'sm:max-w-[640px]',\n xl: 'sm:max-w-[800px]',\n};\n\n/**\n * `info` / `positive` / `warning` reuse `InlineAlert`'s glyphs, so one semantic has one\n * mark across the system. `danger` deliberately differs from `warning`: a dialog that\n * is about to destroy something should not be glyph-identical to one merely cautioning.\n */\nconst TONE_ICON: Record<Exclude<ModalTone, 'default'>, ReactNode> = {\n info: <LuInfo className=\"size-5\" />,\n positive: <LuCircleCheckBig className=\"size-5\" />,\n warning: <LuTriangleAlert className=\"size-5\" />,\n danger: <LuOctagonAlert className=\"size-5\" />,\n};\n\n/** Reuses EntityIconBadge's tone map — one token map for tinted icon circles. */\nconst TONE_BADGE: Record<Exclude<ModalTone, 'default'>, EntityIconBadgeTone> = {\n info: 'brand',\n positive: 'positive',\n warning: 'warning',\n danger: 'danger',\n};\n\nconst FOOTER_ALIGN: Record<ModalFooterAlign, string> = {\n start: 'justify-start',\n between: 'justify-between',\n end: 'justify-end',\n};\n\n// ── Modal ──────────────────────────────────────────────────────────────────────\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n /**\n * Accessible name for the dialog. Required, so a slot-composed modal can never ship\n * unnamed. Was `title` in 0.2.0, renamed because `title` is also an HTML attribute\n * that renders a tooltip.\n */\n label: string;\n children: ReactNode;\n size?: ModalSize;\n /** Renders the top-right close button. */\n showClose?: boolean;\n /** Applied to the panel. With `cn`, `className=\"sm:max-w-[560px]\"` beats `size`. */\n className?: string;\n}\n\n/**\n * A centred dialog above `sm`, a bottom sheet below it.\n *\n * Composed from `ModalHeader` / `ModalBody` / `ModalFooter`, mirroring the `Card`\n * parts — so a modal can take any layout a card can, including headerless. Tone lives\n * on `ModalHeader` (the part that draws the glyph); `ConfirmDialog` and\n * `NoteConfirmModal` accept `tone` at their top level and forward it.\n */\nexport function Modal(props: ModalProps) {\n if (!props.isOpen) return null;\n return <ModalShell {...props} />;\n}\n\n/**\n * Split out so the Esc / focus-trap hooks only mount while the dialog is open —\n * calling them in `Modal` itself would break the `if (!isOpen) return null` exit.\n */\nfunction ModalShell({\n onClose,\n label,\n children,\n size = 'md',\n showClose = true,\n className,\n}: Omit<ModalProps, 'isOpen'>) {\n const panelRef = useRef<HTMLDivElement>(null);\n useOverlayDismiss(onClose, panelRef);\n\n return (\n <div\n className={cn('fixed inset-0 z-50 flex items-end justify-center sm:items-center', OVERLAY_SCRIM)}\n // Self-target check, so a click on any child does not dismiss.\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n className={cn(\n 'relative max-h-[92dvh] w-full overflow-y-auto bg-default shadow-xl',\n 'rounded-t-2xl pb-[env(safe-area-inset-bottom)] sm:mx-4 sm:rounded-2xl sm:pb-0',\n SIZE[size],\n className,\n )}\n >\n {showClose && (\n <IconButton\n variant=\"subtle\"\n size=\"sm\"\n aria-label=\"Close dialog\"\n onClick={onClose}\n // Floating rather than inside the header, so a headerless modal is still\n // dismissible. right-6/top-5 reproduces 0.2.0's position exactly.\n className=\"absolute right-6 top-5 z-10\"\n >\n <LuX size={16} />\n </IconButton>\n )}\n {children}\n </div>\n </div>\n );\n}\n\n// ── ModalHeader ────────────────────────────────────────────────────────────────\n\nexport interface ModalHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Adds a tinted glyph circle. `default` renders none. */\n tone?: ModalTone;\n divider?: boolean;\n}\n\nexport function ModalHeader({\n children,\n tone = 'default',\n divider = true,\n className,\n ...rest\n}: ModalHeaderProps) {\n return (\n <div\n className={cn(\n // pr-14 reserves the floating close button's column (24px gutter + 24px\n // button + gap), which the old flex-between header used to hold open.\n 'flex items-start gap-3 px-6 py-5 pr-14',\n divider && 'border-b border-default',\n className,\n )}\n {...rest}\n >\n {tone !== 'default' && (\n <EntityIconBadge size=\"md\" shape=\"circle\" tone={TONE_BADGE[tone]}>\n {TONE_ICON[tone]}\n </EntityIconBadge>\n )}\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n\n// ── ModalTitle / ModalDescription / ModalBody / ModalFooter ────────────────────\n\nexport interface ModalTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n children: ReactNode;\n}\n\nexport function ModalTitle({ children, className, ...rest }: ModalTitleProps) {\n return (\n <h2 className={cn('text-heading-sm font-semibold text-default', className)} {...rest}>\n {children}\n </h2>\n );\n}\n\nexport interface ModalDescriptionProps extends HTMLAttributes<HTMLParagraphElement> {\n children: ReactNode;\n}\n\nexport function ModalDescription({ children, className, ...rest }: ModalDescriptionProps) {\n return (\n <p className={cn('mt-0.5 text-body-xs text-default-secondary', className)} {...rest}>\n {children}\n </p>\n );\n}\n\nexport interface ModalBodyProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\n/** Must not carry its own `overflow` — the panel is the scroll container. */\nexport function ModalBody({ children, className, ...rest }: ModalBodyProps) {\n return (\n <div className={cn('px-6 py-5', className)} {...rest}>\n {children}\n </div>\n );\n}\n\nexport interface ModalFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n align?: ModalFooterAlign;\n divider?: boolean;\n}\n\nexport function ModalFooter({\n children,\n align = 'end',\n divider = true,\n className,\n ...rest\n}: ModalFooterProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-2 px-6 py-4',\n FOOTER_ALIGN[align],\n divider && 'border-t border-default',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * `clsx` + `tailwind-merge`.\n *\n * Use this instead of bare `clsx` in any component whose `className` prop is meant to\n * *override* a base utility — the composable `Card*` and `Modal*` parts, and anything\n * else built to be reshaped by its caller.\n *\n * Why it is necessary: `clsx` only concatenates. When two conflicting Tailwind\n * utilities both end up in the attribute, the winner is decided by *stylesheet order*,\n * not attribute order. Tailwind emits `flex-row` before `flex-col` and `gap-3` before\n * `gap-4`, so under plain `clsx`:\n *\n * <CardBody className=\"flex-row gap-3\" /> // base is 'flex flex-col gap-4 p-4'\n *\n * silently stays a column with a 4-unit gap. `twMerge` drops the losing class instead,\n * so the caller's intent wins.\n *\n * Everywhere else in the library `className` is purely additive, and plain `clsx`\n * remains correct — and cheaper. Do not sweep it out of those files.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useEffect, type RefObject } from 'react';\n\n/** The one scrim for every overlay primitive.\n *\n * Modal and Drawer both reference this constant, so there is a single place to change\n * the dimming behind a dialog. Backed by `--color-background-utilities-overlay`. */\nexport const OVERLAY_SCRIM = 'bg-overlay';\n\nconst FOCUSABLE = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nfunction focusableWithin(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.offsetParent !== null || el === root,\n );\n}\n\n/** Esc-to-close, a Tab focus trap, and focus restore for a mounted overlay.\n *\n * None of the hand-rolled drawers/modals this replaces handled Esc or trapped focus —\n * they closed on scrim click only. Pass the ref of the panel element (not the scrim). */\nexport function useOverlayDismiss(\n onClose: () => void,\n panelRef: RefObject<HTMLElement | null>,\n): void {\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n const panel = panelRef.current;\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n return;\n }\n if (e.key !== 'Tab' || !panel) return;\n\n const items = focusableWithin(panel);\n if (items.length === 0) return;\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n\n if (e.shiftKey && (active === first || !panel.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [onClose, panelRef]);\n\n useEffect(() => {\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const panel = panelRef.current;\n if (panel) {\n const target = focusableWithin(panel)[0] ?? panel;\n target.focus({ preventScroll: true });\n }\n return () => previouslyFocused?.focus?.({ preventScroll: true });\n }, [panelRef]);\n}\n","import { useRef, type ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { LuX } from 'react-icons/lu';\n\nimport { IconButton } from '../forms/icon-button';\nimport { OVERLAY_SCRIM, useOverlayDismiss } from './overlay';\n\nexport interface DrawerProps {\n /** Required as of 0.3.0 — every overlay is now `isOpen` + `onClose`. */\n isOpen: boolean;\n onClose: () => void;\n /** Header content (left side). The copies this replaces differ only here — a status badge +\n * title in one, an avatar + title + category in another — so it is a slot, not props. */\n header: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n /** `between` when the footer has a left-aligned secondary action. */\n footerAlign?: 'end' | 'between';\n /** Panel width. Defaults to the `w-[440px] max-w-[90vw]` shared by every existing drawer. */\n width?: string;\n /** Accessible name for the dialog. */\n label?: string;\n className?: string;\n}\n\n/**\n * Right-hand side panel. Handles Esc, traps Tab focus, and restores focus to the\n * trigger on close.\n */\nexport function Drawer(props: DrawerProps) {\n if (!props.isOpen) return null;\n return <DrawerShell {...props} />;\n}\n\n/**\n * Split out for the same reason as `ModalShell`: the Esc handler and the focus trap\n * must not stay mounted behind a closed drawer, which is what would happen if\n * `useOverlayDismiss` ran above the `isOpen` early exit.\n */\nfunction DrawerShell({\n onClose,\n header,\n children,\n footer,\n footerAlign = 'end',\n width = 'w-[440px] max-w-[90vw]',\n label,\n className,\n}: Omit<DrawerProps, 'isOpen'>) {\n const panelRef = useRef<HTMLElement | null>(null);\n useOverlayDismiss(onClose, panelRef);\n\n return (\n <div\n className={clsx('fixed inset-0 z-50 flex justify-end', OVERLAY_SCRIM)}\n // Self-target check, matching Modal. 0.2.0 used a real <button> scrim, but it sat\n // outside the role=\"dialog\" element, so the focus trap made it unreachable — a\n // labelled control nobody could use.\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <aside\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n className={clsx('relative flex h-full flex-col bg-default shadow-2xl', width, className)}\n >\n <div className=\"flex items-start justify-between gap-3 border-b border-default p-6\">\n <div className=\"min-w-0\">{header}</div>\n <IconButton variant=\"subtle\" size=\"sm\" aria-label=\"Close\" onClick={onClose}>\n <LuX size={18} />\n </IconButton>\n </div>\n\n <div className=\"flex-1 space-y-6 overflow-y-auto p-6\">{children}</div>\n\n {footer && (\n <div\n className={clsx(\n 'flex items-center gap-2 border-t border-default px-6 py-4',\n footerAlign === 'between' ? 'justify-between' : 'justify-end',\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { Button } from '../forms/button';\nimport { Modal, ModalBody, ModalDescription, ModalFooter, ModalHeader, ModalTitle } from './modal';\nimport type { ModalSize, ModalTone } from './modal';\n\nexport interface ConfirmDialogProps {\n isOpen: boolean;\n title: string;\n subtitle?: string;\n /**\n * Adds a tinted glyph to the header. Defaults to `default` (no glyph) so existing\n * call sites look unchanged; opt in per dialog rather than deriving it from\n * `confirmVariant`, which would silently restyle every destructive confirm.\n */\n tone?: ModalTone;\n size?: ModalSize;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmVariant?: 'primary' | 'danger';\n /** Disables the confirm button and swaps its label — the double-submit guard. */\n isConfirming?: boolean;\n /** Label shown on the confirm button while `isConfirming`. */\n confirmingLabel?: string;\n /** Optional body — a warning callout, a consequences list, or a failed-attempt error. */\n children?: ReactNode;\n className?: string;\n onConfirm: () => void;\n /** Renamed from `onCancel` in 0.3.0 — every overlay now uses `isOpen` + `onClose`. */\n onClose: () => void;\n}\n\n/**\n * The in-app replacement for `window.confirm`: a title, an optional body, and a\n * cancel/confirm pair.\n *\n * Kept as a preset rather than folded into `Modal` because it carries *behaviour*, not\n * just layout — the `isConfirming` guard that disables the button and swaps its label\n * is the thing call sites get wrong when they hand-roll a confirm. For any other\n * shape, compose `Modal` and its parts directly.\n */\nexport function ConfirmDialog({\n isOpen,\n title,\n subtitle,\n tone = 'default',\n size = 'md',\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n confirmVariant = 'primary',\n isConfirming = false,\n confirmingLabel = 'Working…',\n children,\n className,\n onConfirm,\n onClose,\n}: ConfirmDialogProps) {\n return (\n <Modal isOpen={isOpen} onClose={onClose} label={title} size={size} className={className}>\n <ModalHeader tone={tone} divider={Boolean(children)}>\n <ModalTitle>{title}</ModalTitle>\n {subtitle && <ModalDescription>{subtitle}</ModalDescription>}\n </ModalHeader>\n {/* Guarded: 0.2.0 always rendered a body, so a childless confirm carried 40px of\n dead space plus a stray rule. */}\n {children && <ModalBody>{children}</ModalBody>}\n <ModalFooter>\n <Button variant=\"neutral\" size=\"md\" onClick={onClose}>\n {cancelLabel}\n </Button>\n <Button variant={confirmVariant} size=\"md\" disabled={isConfirming} onClick={onConfirm}>\n {isConfirming ? confirmingLabel : confirmLabel}\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n","import { useState } from 'react';\n\nimport { Button } from '../forms/button';\nimport { Textarea } from '../forms/textarea';\nimport { Modal, ModalBody, ModalDescription, ModalFooter, ModalHeader, ModalTitle } from './modal';\nimport type { ModalSize, ModalTone } from './modal';\n\nexport interface NoteConfirmModalProps {\n /** Required as of 0.3.0 — this is now a controlled overlay like every other. */\n isOpen: boolean;\n title: string;\n subtitle?: string;\n tone?: ModalTone;\n size?: ModalSize;\n confirmLabel: string;\n cancelLabel?: string;\n confirmVariant?: 'primary' | 'danger';\n /** Block confirmation until the note has content. */\n requireNote?: boolean;\n notePlaceholder?: string;\n submittingLabel?: string;\n isSubmitting?: boolean;\n className?: string;\n onClose: () => void;\n onConfirm: (note: string) => void;\n}\n\n/**\n * Confirm dialog that collects a free-text note — approvals, rejections, information\n * requests. The note is trimmed before it reaches `onConfirm`.\n *\n * Kept as a preset because it owns state, and a composition cannot.\n */\nexport function NoteConfirmModal({ isOpen, ...rest }: NoteConfirmModalProps) {\n // The shell split is what resets the note. Before 0.3.0 this component had no\n // `isOpen` and callers mounted it conditionally, so the typed note was discarded for\n // free. Now that it stays mounted, unmounting the shell is what clears it —\n // otherwise a rejection note would reappear the next time the dialog opened.\n if (!isOpen) return null;\n return <NoteConfirmModalShell {...rest} />;\n}\n\nfunction NoteConfirmModalShell({\n title,\n subtitle,\n tone = 'default',\n size = 'md',\n confirmLabel,\n cancelLabel = 'Cancel',\n confirmVariant = 'primary',\n requireNote = false,\n notePlaceholder = 'Add a note…',\n submittingLabel = 'Saving…',\n isSubmitting = false,\n className,\n onClose,\n onConfirm,\n}: Omit<NoteConfirmModalProps, 'isOpen'>) {\n const [note, setNote] = useState('');\n const disabled = isSubmitting || (requireNote && !note.trim());\n\n return (\n <Modal isOpen onClose={onClose} label={title} size={size} className={className}>\n <ModalHeader tone={tone}>\n <ModalTitle>{title}</ModalTitle>\n {subtitle && <ModalDescription>{subtitle}</ModalDescription>}\n </ModalHeader>\n <ModalBody>\n <Textarea\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={notePlaceholder}\n rows={4}\n />\n </ModalBody>\n <ModalFooter>\n <Button variant=\"neutral\" size=\"md\" onClick={onClose}>\n {cancelLabel}\n </Button>\n <Button variant={confirmVariant} size=\"md\" disabled={disabled} onClick={() => onConfirm(note.trim())}>\n {isSubmitting ? submittingLabel : confirmLabel}\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { LuEllipsis } from 'react-icons/lu';\n\nexport interface DropdownMenuItem {\n label: string;\n onSelect: () => void;\n tone?: 'default' | 'danger';\n disabled?: boolean;\n /** Draw a separator above this item. */\n separatorBefore?: boolean;\n}\n\nexport interface DropdownMenuProps {\n items: DropdownMenuItem[];\n /** Custom trigger content. Defaults to a `⋯` overflow button. */\n trigger?: ReactNode;\n /** Accessible name for the trigger, e.g. `Open actions for Admin`. */\n label: string;\n align?: 'left' | 'right';\n className?: string;\n}\n\n/** Overflow / row-actions menu.\n *\n * Keeps the outside-click dismissal and `aria-haspopup`/`aria-expanded` wiring from the\n * hand-rolled `RowMenu` it replaces, and adds Esc-to-close. `mousedown` is stopped at the\n * wrapper so the menu works inside clickable table rows. */\nexport function DropdownMenu({\n items,\n trigger,\n label,\n align = 'right',\n className,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n\n function handleOutside(e: MouseEvent) {\n const root = rootRef.current;\n if (root && !root.contains(e.target as Node)) setOpen(false);\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleOutside);\n document.addEventListener('keydown', handleKey);\n return () => {\n document.removeEventListener('mousedown', handleOutside);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open]);\n\n const visible = items.filter((item) => item.label);\n\n return (\n <div\n ref={rootRef}\n className={clsx('relative', className)}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(e) => {\n e.stopPropagation();\n setOpen((v) => !v);\n }}\n className={clsx(\n 'rounded-md border border-default bg-default text-body-xs font-medium leading-none text-default transition-colors hover:bg-default-secondary',\n trigger ? 'p-1.5' : 'px-2.5 py-1.5',\n )}\n >\n {trigger ?? <LuEllipsis className=\"size-4\" />}\n </button>\n\n {open && (\n <div\n role=\"menu\"\n className={clsx(\n 'absolute top-full z-20 mt-1 min-w-[148px] rounded-lg border border-default bg-default py-1 shadow-lg',\n align === 'right' ? 'right-0' : 'left-0',\n )}\n >\n {visible.map((item, i) => (\n <div key={item.label}>\n {item.separatorBefore && i > 0 && (\n <div className=\"my-1 h-px bg-divider\" />\n )}\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n className={clsx(\n 'flex w-full items-center px-3 py-2 text-left text-body-sm transition-colors',\n item.disabled && 'cursor-not-allowed opacity-50',\n item.tone === 'danger'\n ? 'text-danger hover:bg-danger-tertiary'\n : 'text-default hover:bg-default-secondary',\n )}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n item.onSelect();\n }}\n >\n {item.label}\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type CardSize = 'sm' | 'md' | 'lg';\nexport type CardRadius = 'lg' | 'xl' | '2xl';\nexport type CardTone = 'default' | 'brand' | 'positive' | 'warning' | 'danger';\nexport type CardFooterAlign = 'start' | 'between' | 'end';\n\nconst RADIUS: Record<CardRadius, string> = {\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n};\n\nconst TONE: Record<CardTone, string> = {\n default: 'border-default bg-default',\n brand: 'border-brand-tertiary bg-brand-tertiary',\n positive: 'border-positive-tertiary bg-positive-tertiary',\n warning: 'border-warning-tertiary bg-warning-tertiary',\n // The one asymmetry: danger keeps the strong `border-danger` rather than the\n // tertiary border, because it is the only tone that has to read as an alarm from\n // across a dashboard. Byte-identical to the deleted AlertCard's danger surface.\n danger: 'border-danger bg-danger-tertiary',\n};\n\n/** Header and footer share one padding ladder. */\nconst BOX: Record<CardSize, string> = {\n sm: 'px-3 py-2',\n md: 'px-4 py-3',\n lg: 'px-5 py-4',\n};\n\nconst BODY_BOX: Record<CardSize, string> = {\n sm: 'gap-3 p-3',\n md: 'gap-4 p-4',\n lg: 'gap-5 p-5',\n};\n\nconst TITLE_SIZE: Record<CardSize, string> = {\n sm: 'text-body-xs',\n md: 'text-body-sm',\n lg: 'text-subheading-sm',\n};\n\nconst FOOTER_ALIGN: Record<CardFooterAlign, string> = {\n start: 'justify-start',\n between: 'justify-between',\n end: 'justify-end',\n};\n\n// ── Card ───────────────────────────────────────────────────────────────────────\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** `2xl` suits detail pages, `xl` section panels, `lg` dense or nested cards. */\n radius?: CardRadius;\n /**\n * Surface tint. This is a prop rather than a `className` because a tone has to\n * un-set the base `border-default bg-default` pair, not add to it.\n */\n tone?: CardTone;\n}\n\n/**\n * The card shell. Composed from `CardHeader`, `CardBody` and `CardFooter` — or from\n * nothing at all, if you want content to bleed to the edges (drop `CardBody` and put\n * a `DataTable` straight inside).\n *\n * Replaces `SectionCard` and the two monolithic cards that shipped beside it,\n * `AlertCard` and `BenchmarkCard`. Both of those are now documented compositions; see\n * the Cards page. The vocabulary follows shadcn/ui so it is already familiar, with\n * `CardBody` in place of its `CardContent`.\n */\nexport function Card({ children, radius = '2xl', tone = 'default', className, ...rest }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n // `overflow-hidden` is load-bearing: it clips a header's border-b to the\n // rounded corner. Removing it leaves the rule poking past the radius.\n className={cn('flex flex-col overflow-hidden border', RADIUS[radius], TONE[tone], className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n// ── CardHeader ─────────────────────────────────────────────────────────────────\n\nexport interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: CardSize;\n /** Bottom rule separating the header from the body. */\n divider?: boolean;\n}\n\n/**\n * Header row. Holds `CardTitle`, `CardDescription` and an optional `CardAction`.\n *\n * The `has-[…]` selector switches to a two-column grid only when a `CardAction` is\n * present, which is what lets title, description and action share a header with no\n * wrapper div and no stray gap when the action is absent.\n */\nexport function CardHeader({\n children,\n size = 'md',\n divider = true,\n className,\n ...rest\n}: CardHeaderProps) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'grid auto-rows-min items-center gap-x-3 gap-y-0.5',\n 'has-[[data-slot=card-action]]:grid-cols-[1fr_auto]',\n BOX[size],\n divider && 'border-b border-default',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n// ── CardTitle / CardDescription / CardAction ───────────────────────────────────\n\nexport interface CardTitleProps extends HTMLAttributes<HTMLElement> {\n children: ReactNode;\n size?: CardSize;\n /** Heading level. Defaults to `p`; use h2/h3 where the page has a real hierarchy. */\n as?: 'h2' | 'h3' | 'h4' | 'p';\n}\n\nexport function CardTitle({ children, size = 'md', as: Tag = 'p', className, ...rest }: CardTitleProps) {\n return (\n <Tag\n data-slot=\"card-title\"\n // min-w-0 belongs here, not on the parent: a grid item defaults to\n // min-width:auto, so `truncate` on a title would not work without it.\n className={cn('min-w-0 font-semibold text-default', TITLE_SIZE[size], className)}\n {...rest}\n >\n {children}\n </Tag>\n );\n}\n\nexport interface CardDescriptionProps extends HTMLAttributes<HTMLParagraphElement> {\n children: ReactNode;\n}\n\nexport function CardDescription({ children, className, ...rest }: CardDescriptionProps) {\n return (\n <p\n data-slot=\"card-description\"\n className={cn('min-w-0 text-body-tiny text-default-secondary', className)}\n {...rest}\n >\n {children}\n </p>\n );\n}\n\nexport interface CardActionProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\n/** Right-hand slot in a `CardHeader` — a button, a count, a status badge, a menu. */\nexport function CardAction({ children, className, ...rest }: CardActionProps) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 shrink-0 self-center justify-self-end', className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n// ── CardBody ───────────────────────────────────────────────────────────────────\n\nexport interface CardBodyProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: CardSize;\n}\n\n/**\n * The content region. A vertical stack by default.\n *\n * Because this file uses `cn`, `className` genuinely overrides the base — so\n * `className=\"flex-row items-center\"` gives you a row, and\n * `className=\"grid grid-cols-3\"` a grid. That is what makes the `AlertCard` and\n * `BenchmarkCard` rebuilds possible without a `layout` prop.\n */\nexport function CardBody({ children, size = 'md', className, ...rest }: CardBodyProps) {\n return (\n <div data-slot=\"card-body\" className={cn('flex flex-col', BODY_BOX[size], className)} {...rest}>\n {children}\n </div>\n );\n}\n\n// ── CardFooter ─────────────────────────────────────────────────────────────────\n\nexport interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n size?: CardSize;\n divider?: boolean;\n align?: CardFooterAlign;\n}\n\n/** Action row at the foot of a card. Mirrors `ModalFooter` and `Drawer`'s footer. */\nexport function CardFooter({\n children,\n size = 'md',\n divider = true,\n align = 'end',\n className,\n ...rest\n}: CardFooterProps) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n 'flex items-center gap-2',\n BOX[size],\n FOOTER_ALIGN[align],\n divider && 'border-t border-default',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\n/**\n * Two genuinely different heading contexts, which the source markup distinguished:\n *\n * `page` 24px title / 14px subtitle — an in-body page heading (settings, users,\n * alerts), i.e. the old `text-2xl` + `mt-1 text-body-sm` block.\n * `toolbar` 20px title / 13px subtitle — inside a `PageToolbar`, where the bar is\n * only 72px tall. Flattening these into one size would have grown ten\n * toolbar titles by 4px.\n * `section` 18px — a panel or card heading.\n */\nexport type PageHeadingSize = 'page' | 'toolbar' | 'section';\n\nconst TITLE: Record<PageHeadingSize, string> = {\n page: 'text-2xl font-semibold text-default',\n toolbar: 'text-heading-sm font-semibold leading-snug text-default',\n section: 'text-lg font-semibold text-default',\n};\n\nconst SUBTITLE: Record<PageHeadingSize, string> = {\n page: 'mt-1 text-body-sm text-default-secondary',\n toolbar: 'text-body-xs text-default-secondary',\n section: 'mt-1 text-body-sm text-default-secondary',\n};\n\nexport interface PageHeadingProps {\n title: ReactNode;\n subtitle?: ReactNode;\n size?: PageHeadingSize;\n /** Heading level. Defaults to `h1` for page/toolbar and `h2` for section. */\n as?: 'h1' | 'h2' | 'h3';\n /** Right-aligned action cluster. When set, the heading becomes a flex row. */\n actions?: ReactNode;\n /** Clamp a long title to one line — needed when the title is user data, e.g. an article headline. */\n truncateTitle?: boolean;\n className?: string;\n}\n\n/**\n * Page or section title with an optional subtitle underneath.\n *\n * Replaces nine copies of the `<h1>` + `<p className=\"mt-1 …\">` block, plus the\n * heading halves of `SettingsTabs` and `my-account/tabs`.\n *\n * Emitting a real heading element matters: `reviewer-detail`,\n * `settings-audit-log`'s table area and `widget-gallery` render their titles as\n * `<p>`/`<div>` today, so `getByRole('heading')` finds nothing there — an\n * accessibility gap the e2e specs currently work around.\n */\nexport function PageHeading({\n title,\n subtitle,\n size = 'page',\n as,\n actions,\n truncateTitle,\n className,\n}: PageHeadingProps) {\n const Tag = as ?? (size === 'section' ? 'h2' : 'h1');\n\n const heading = (\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <Tag className={clsx(TITLE[size], truncateTitle && 'truncate')}>{title}</Tag>\n {subtitle && <p className={SUBTITLE[size]}>{subtitle}</p>}\n </div>\n );\n\n if (!actions) return className ? <div className={className}>{heading}</div> : heading;\n\n return (\n <div className={clsx('flex items-start justify-between gap-4', className)}>\n {heading}\n <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type PageToolbarSize = 'sm' | 'md';\n\nexport interface PageToolbarProps {\n children: ReactNode;\n /** Allow the row to wrap when the action cluster is wide (entity-detail has seven buttons). */\n wrap?: boolean;\n /** Bar height and padding. `sm` suits a secondary bar under the main toolbar. */\n size?: PageToolbarSize;\n className?: string;\n}\n\nconst SIZE: Record<PageToolbarSize, string> = {\n sm: 'min-h-[56px] px-4 py-2.5 md:px-7',\n md: 'min-h-[72px] px-4 py-4 md:px-7',\n};\n\n/**\n * The sticky top bar on a full-bleed detail or list screen: title block on the\n * left, actions on the right.\n *\n * Replaces ten copies of this class string. Three of those copies used the\n * responsive `px-4 py-4 md:px-7` and seven used a fixed `px-7 py-4`; the responsive\n * variant is adopted here, which is a deliberate improvement below `md` where the\n * fixed 28px padding was cramped.\n */\nexport function PageToolbar({ children, wrap, size = 'md', className }: PageToolbarProps) {\n return (\n <div\n className={clsx(\n 'flex shrink-0 items-center justify-between gap-4 border-b border-default bg-default',\n SIZE[size],\n wrap && 'flex-wrap gap-2',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type FilterBarSize = 'sm' | 'md';\n\nexport interface FilterBarProps {\n children: ReactNode;\n /** Right-aligned slot for a result count or a secondary action. */\n trailing?: ReactNode;\n /** Gap between controls. `sm` for a filter row inside a card or drawer. */\n size?: FilterBarSize;\n className?: string;\n}\n\nconst GAP: Record<FilterBarSize, string> = {\n sm: 'gap-2',\n md: 'gap-3',\n};\n\n/**\n * Row of search inputs and filter selects above a table.\n *\n * Replaces nine copies of `flex flex-wrap items-center gap-3`. Thin by design — the\n * value is that the spacing is decided once, not that it hides anything.\n */\nexport function FilterBar({ children, trailing, size = 'md', className }: FilterBarProps) {\n return (\n <div className={clsx('flex flex-wrap items-center', GAP[size], className)}>\n {children}\n {trailing && <div className=\"ml-auto flex items-center gap-2\">{trailing}</div>}\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport type TabsVariant = 'underline' | 'pill';\nexport type TabsSize = 'sm' | 'md';\n\nexport interface TabItem<K extends string = string> {\n key: K;\n label: string;\n /** Renders a count chip after the label. */\n count?: number;\n}\n\nexport interface TabsProps<K extends string = string> {\n items: TabItem<K>[];\n value: K;\n onChange: (key: K) => void;\n /**\n * `underline` is the detail-page form (entity detail, reviewer detail, role detail).\n * `pill` is the filter-style form used by the reviewer queue.\n */\n variant?: TabsVariant;\n /** `md` is the page-level strip; `sm` suits a tab strip inside a card or drawer. */\n size?: TabsSize;\n className?: string;\n}\n\n/**\n * Per-variant sizing. The two variants have genuinely different geometry — a pill has\n * a background to pad against, an underline only has a baseline — so this is a nested\n * map rather than one shared scale.\n */\nconst SIZE: Record<TabsVariant, Record<TabsSize, { strip: string; tab: string }>> = {\n underline: {\n sm: { strip: 'gap-4', tab: 'px-0.5 py-1.5 text-body-xs' },\n md: { strip: 'gap-6', tab: 'px-0.5 py-2.5 text-body-sm' },\n },\n pill: {\n sm: { strip: 'gap-1', tab: 'rounded-md px-2.5 py-1.5 text-body-tiny' },\n md: { strip: 'gap-1.5', tab: 'rounded-lg px-3.5 py-2 text-body-xs' },\n },\n};\n\n/**\n * State-driven tab strip.\n *\n * The `underline` active colour is `background-brand` (#0C2D58), which is what Figma\n * specifies. Two of the source copies also set `style={{ borderColor: '#0c2d58' }}`\n * redundantly next to the same Tailwind class — dropped here.\n */\nexport function Tabs<K extends string = string>({\n items,\n value,\n onChange,\n variant = 'underline',\n size = 'md',\n className,\n}: TabsProps<K>) {\n const isPill = variant === 'pill';\n const s = SIZE[variant][size];\n\n return (\n <div\n role=\"tablist\"\n className={clsx(\n 'flex shrink-0 overflow-x-auto',\n s.strip,\n !isPill && 'border-b border-default',\n className,\n )}\n >\n {items.map((tab) => {\n const active = tab.key === value;\n return (\n <button\n key={tab.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(tab.key)}\n className={clsx(\n 'flex shrink-0 items-center gap-1.5 whitespace-nowrap transition-colors',\n s.tab,\n isPill\n ? clsx(\n 'font-medium',\n active\n ? 'bg-brand text-brand-on-brand'\n : 'text-default-secondary hover:bg-default-secondary',\n )\n : clsx(\n 'leading-snug',\n active\n ? 'border-b-2 border-brand-emphasis font-semibold text-brand-emphasis'\n : 'font-normal text-default-secondary hover:text-default',\n ),\n )}\n >\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={clsx(\n 'rounded-md px-1.5 py-px text-body-tiny font-medium leading-snug',\n active && isPill\n ? 'bg-brand-hover text-brand-on-brand'\n : 'bg-default-secondary text-default-secondary',\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type NavItemSize = 'sm' | 'md';\n\nexport interface NavItemProps {\n icon?: ReactNode;\n label: string;\n isActive?: boolean;\n /** Red indicator dot at top-right corner (e.g. unread count) */\n indicator?: boolean;\n /** Collapsed mode — icon only, label hidden */\n collapsed?: boolean;\n /** Row height. `sm` suits a dense secondary nav or a nested group. */\n size?: NavItemSize;\n className?: string;\n}\n\nconst SIZE: Record<NavItemSize, { box: string; label: string }> = {\n sm: { box: 'h-9 gap-2 rounded-lg px-2.5 py-1.5', label: 'text-body-xs' },\n md: { box: 'h-11 gap-3 rounded-xl px-3.5 py-2.5', label: 'text-body-sm' },\n};\n\nexport function NavItem({\n icon,\n label,\n isActive = false,\n indicator = false,\n collapsed = false,\n size = 'md',\n className,\n}: NavItemProps) {\n const s = SIZE[size];\n return (\n <span\n className={clsx(\n 'relative flex w-full items-center transition-colors',\n s.box,\n collapsed && 'justify-center',\n isActive\n ? 'bg-brand text-brand-on-brand'\n : [\n 'border border-default bg-default text-default-secondary',\n 'hover:bg-brand-tertiary-hover hover:border-brand-tertiary hover:text-brand',\n ],\n className,\n )}\n >\n {icon !== undefined && (\n <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>\n )}\n {!collapsed && (\n <span className={clsx('min-w-0 flex-1 truncate font-regular leading-snug', s.label)}>\n {label}\n </span>\n )}\n {indicator && (\n <span className=\"absolute -right-px -top-px size-2 rounded-full bg-danger\" />\n )}\n </span>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type EyebrowLabelVariant = 'uppercase' | 'plain';\n\nexport interface EyebrowLabelProps {\n children: ReactNode;\n /**\n * `uppercase` is the dominant form (nine of twelve source copies).\n * `plain` covers the entity-detail / reviewer-detail variant, whose label text is\n * already capitalised in the source string.\n */\n variant?: EyebrowLabelVariant;\n className?: string;\n}\n\n/**\n * Small semibold label above a group of fields.\n *\n * Replaces twelve copies across three variants:\n * `mb-2 text-body-tiny font-semibold uppercase tracking-wide …` (×9)\n * `text-[11px] font-semibold … tracking-wide` (×5, entity/reviewer detail)\n * `text-body-tiny font-semibold uppercase tracking-wider` (×2, entity onboarding)\n *\n * `text-body-tiny` is 11px, so the `text-[11px]` variant collapses into it exactly.\n * The `tracking-wider` copies become `tracking-wide` — a 0.0125em difference at 11px,\n * i.e. sub-pixel.\n */\nexport function EyebrowLabel({ children, variant = 'uppercase', className }: EyebrowLabelProps) {\n return (\n <p\n className={clsx(\n 'text-body-tiny font-semibold tracking-wide text-default-secondary',\n variant === 'uppercase' && 'uppercase',\n className,\n )}\n >\n {children}\n </p>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { WidgetTitle } from './widget-title';\nimport type { WidgetTitleSize } from './widget-title';\n\nexport type WidgetHeaderEyebrowVariant = 'uppercase' | 'plain';\n\nexport interface WidgetHeaderProps {\n eyebrow?: string;\n eyebrowVariant?: WidgetHeaderEyebrowVariant;\n title: string;\n titleSize?: WidgetTitleSize;\n subtitle?: string;\n badge?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\n// uppercase: 11px/medium/tracked, matches Variation 2 mockups · plain: 13px/regular, matches Variation 1's small label line\nconst eyebrowStyles: Record<WidgetHeaderEyebrowVariant, string> = {\n uppercase: 'text-body-tiny font-medium uppercase tracking-[0.66px] text-default-secondary',\n plain: 'text-body-xs leading-[1.4] text-default-secondary',\n};\n\nexport function WidgetHeader({\n eyebrow,\n eyebrowVariant = 'uppercase',\n title,\n titleSize,\n subtitle,\n badge,\n action,\n className,\n}: WidgetHeaderProps) {\n return (\n <div className={clsx('flex items-start justify-between gap-2', className)}>\n <div className=\"min-w-0 flex-1\">\n {eyebrow && <p className={eyebrowStyles[eyebrowVariant]}>{eyebrow}</p>}\n <WidgetTitle size={titleSize}>{title}</WidgetTitle>\n {subtitle && (\n <p className=\"mt-1 text-body-xs text-default-secondary leading-snug\">{subtitle}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {badge}\n {action}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport type WidgetTitleSize = 'sm' | 'md' | 'lg';\n\nexport interface WidgetTitleProps {\n children: ReactNode;\n size?: WidgetTitleSize;\n className?: string;\n}\n\n// sm: 16px/semibold (default) · md: 18px/bold (Variation 2 mockups) · lg: 20px/semibold (Variation 1 mockups)\nconst sizeStyles: Record<WidgetTitleSize, string> = {\n sm: 'text-subheading-sm font-semibold leading-none',\n md: 'text-[18px] font-bold leading-normal',\n lg: 'text-subheading font-semibold leading-[1.2]',\n};\n\nexport function WidgetTitle({ children, size = 'sm', className }: WidgetTitleProps) {\n return (\n <h3 className={clsx(sizeStyles[size], 'text-default', className)}>\n {children}\n </h3>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport interface WidgetFooterProps {\n caption?: string;\n subcaption?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport function WidgetFooter({ caption, subcaption, action, className }: WidgetFooterProps) {\n return (\n <div className={clsx('flex items-center gap-3', className)}>\n {caption && (\n <div className=\"flex items-stretch gap-3 flex-1 min-w-0\">\n <div className=\"w-0.5 shrink-0 self-stretch rounded-full bg-brand\" />\n <div className=\"min-w-0\">\n <p className=\"text-body-sm font-medium text-default leading-snug\">\n {caption}\n </p>\n {subcaption && (\n <p className=\"mt-0.5 text-body-xs text-default-secondary\">{subcaption}</p>\n )}\n </div>\n </div>\n )}\n {action && <div className=\"ml-auto shrink-0\">{action}</div>}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { StatusTone } from '../status/status-badge';\n\nconst DOT_TONE: Record<StatusTone, string> = {\n neutral: 'bg-status-dot-neutral',\n info: 'bg-status-dot-info',\n warning: 'bg-status-dot-warning',\n caution: 'bg-status-dot-caution',\n accent: 'bg-status-dot-accent',\n positive: 'bg-status-dot-positive',\n danger: 'bg-status-dot-danger',\n};\n\nexport interface StatTileProps {\n label: string;\n value: string | number;\n /** Status tone for the leading dot. Prefer this over `dotColor`. */\n tone?: StatusTone;\n /**\n * @deprecated Pass `tone` instead. A raw colour here bypasses the token layer,\n * which is how competing status palettes drift apart.\n */\n dotColor?: string;\n className?: string;\n}\n\nexport function StatTile({ label, value, tone, dotColor, className }: StatTileProps) {\n const showDot = Boolean(tone || dotColor);\n\n return (\n <div\n className={clsx(\n 'flex flex-col gap-2 rounded-xl border border-default bg-default p-4',\n className,\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n {showDot && (\n <span\n className={clsx('size-2 shrink-0 rounded-full', tone && DOT_TONE[tone])}\n style={tone ? undefined : { backgroundColor: dotColor }}\n />\n )}\n <span className=\"text-body-xs font-medium text-default-secondary whitespace-nowrap\">\n {label}\n </span>\n </div>\n <span className=\"text-heading font-semibold text-default leading-none\">{value}</span>\n </div>\n );\n}\n","import clsx from 'clsx';\n\nexport type StatNumberSize = 'sm' | 'md' | 'lg';\n\nexport type StatNumberWeight = 'medium' | 'bold';\n\nexport interface StatNumberProps {\n value: string | number;\n unit?: string;\n size?: StatNumberSize;\n weight?: StatNumberWeight;\n /** @deprecated Bypasses the design tokens — pass `tone` instead. Raw hex color, overrides the default text color via inline style. Use when the exact source color doesn't match a design token. */\n color?: string;\n className?: string;\n}\n\n// 32 / 40 / 48px — the --typo-scale-07/08/09 steps. These read `text-scale-0*` until\n// 0.3.0, which the preset never defined, so every size emitted no font-size at all.\nconst sizeStyles: Record<StatNumberSize, string> = {\n sm: 'text-subtitle',\n md: 'text-subtitle-lg',\n lg: 'text-title',\n};\n\nconst weightStyles: Record<StatNumberWeight, string> = {\n medium: 'font-medium',\n bold: 'font-bold',\n};\n\nexport function StatNumber({ value, unit, size = 'md', weight = 'bold', color, className }: StatNumberProps) {\n return (\n <p\n className={clsx(sizeStyles[size], weightStyles[weight], 'leading-none', !color && 'text-default', className)}\n style={color ? { color } : undefined}\n >\n {value}\n {unit && (\n <span className=\"ml-1 text-subheading font-medium text-default-secondary\">{unit}</span>\n )}\n </p>\n );\n}\n","import clsx from 'clsx';\n\nexport type ScoreValueSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\nexport type ScoreValueWeight = 'normal' | 'semibold' | 'bold';\nexport type ScoreTone = 'brand' | 'positive' | 'warning' | 'danger' | 'neutral' | 'default';\nexport type ScoreValueTone = ScoreTone | 'auto';\n\n/**\n * The four tones the automatic ramp can produce.\n *\n * Narrower than `ScoreTone` on purpose: a ramp position is always one of these, so the\n * result is directly assignable to `ProgressBarTone` too — which is what lets a caller\n * tone a bar and its score from one `getScoreTone` call.\n */\nexport type ScoreRampTone = 'positive' | 'neutral' | 'warning' | 'danger';\n\n/** Which end of the scale is the bad end. */\nexport type ScoreDirection = 'higher-is-worse' | 'higher-is-better';\n\nexport interface ScoreThresholds {\n /** At or above this, the score is `danger`. */\n danger: number;\n /** At or above this, `warning`. */\n warning: number;\n /** At or above this, `neutral`. Below it, `positive`. */\n neutral: number;\n}\n\n/**\n * Default ramp, on a 0–100 scale read as \"higher is worse\" — the risk case.\n *\n * 0.2.0's ramp had only four stops and resolved 65–79 to `brand` (the blue brand\n * colour), which left `warning` and `positive` unreachable without passing `tone`\n * by hand. This is a real five-stop ramp.\n */\nexport const DEFAULT_SCORE_THRESHOLDS: ScoreThresholds = { danger: 80, warning: 65, neutral: 50 };\n\n/**\n * Resolve a numeric score to a tone.\n *\n * Was `getRiskTone` in 0.2.0, with the thresholds and the direction both hardcoded.\n */\nexport function getScoreTone(\n score: number,\n {\n direction = 'higher-is-worse',\n thresholds = DEFAULT_SCORE_THRESHOLDS,\n }: { direction?: ScoreDirection; thresholds?: ScoreThresholds } = {},\n): ScoreRampTone {\n // Flip the score, not the comparisons — one ramp, read from either end.\n const v = direction === 'higher-is-better' ? 100 - score : score;\n if (v >= thresholds.danger) return 'danger';\n if (v >= thresholds.warning) return 'warning';\n if (v >= thresholds.neutral) return 'neutral';\n return 'positive';\n}\n\n// 13 / 14 / 16 / 20 / 32px\nconst SIZE: Record<ScoreValueSize, string> = {\n sm: 'text-body-xs',\n md: 'text-body-sm',\n lg: 'text-subheading-sm',\n xl: 'text-subheading',\n '2xl': 'text-subtitle',\n};\n\nconst WEIGHT: Record<ScoreValueWeight, string> = {\n normal: 'font-normal',\n semibold: 'font-semibold',\n bold: 'font-bold',\n};\n\nconst TONE: Record<ScoreTone, string> = {\n brand: 'text-brand',\n positive: 'text-positive',\n warning: 'text-warning',\n danger: 'text-danger',\n neutral: 'text-default-secondary',\n default: 'text-default',\n};\n\nexport interface ScoreValueProps {\n value: string | number;\n /** Trailing caption — `/100`, `High`, `of target`. */\n label?: string;\n size?: ScoreValueSize;\n weight?: ScoreValueWeight;\n /** `auto` derives the tone from `value` via {@link getScoreTone}. */\n tone?: ScoreValueTone;\n direction?: ScoreDirection;\n thresholds?: ScoreThresholds;\n className?: string;\n}\n\n/**\n * A scored number with an optional caption and a tone that can track its value.\n *\n * Was `RiskScore`. Nothing about it was ever risk-specific except the name and the\n * direction of its ramp, so both are now parameters: use it for a risk score, a\n * compliance score, a match confidence, a utilisation percentage.\n *\n * Not to be confused with `StatNumber`, which is the *large display* number with a\n * unit (32–48px, for tiles and widget headlines). `ScoreValue` is the inline one with\n * a label and a tone ramp.\n */\nexport function ScoreValue({\n value,\n label,\n size = 'md',\n weight = 'bold',\n tone = 'auto',\n direction = 'higher-is-worse',\n thresholds = DEFAULT_SCORE_THRESHOLDS,\n className,\n}: ScoreValueProps) {\n // A numeric-looking string still resolves. In 0.2.0 `tone=\"auto\"` fell back to\n // `default` for any string, so callers passing `score=\"82\"` silently got no tone.\n const numeric = typeof value === 'number' ? value : Number(value);\n const resolved: ScoreTone =\n tone === 'auto'\n ? Number.isFinite(numeric)\n ? getScoreTone(numeric, { direction, thresholds })\n : 'default'\n : tone;\n\n return (\n <span className={clsx('inline-flex items-baseline gap-1', className)}>\n <span className={clsx(SIZE[size], WEIGHT[weight], TONE[resolved])}>{value}</span>\n {label && <span className=\"text-body-xs text-default-secondary whitespace-nowrap\">{label}</span>}\n </span>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type TileGridColumns = 2 | 3 | 4 | 5 | 6;\n\n/**\n * Responsive column counts. Every source copy started two-up on mobile and stepped\n * to its full count at one breakpoint.\n *\n * The twelve source grids disagreed on which: seven used `lg:`, three used `md:`.\n * Standardising on `lg:` matches eight of them byte-for-byte and is the safer choice\n * — five tiles at `md` (768px) was cramped. `alerts`, `settings-users` and\n * `settings-organization` therefore stay two-up slightly longer on tablets than\n * before; that is the one deliberate layout change here.\n *\n * Six keeps its intermediate `sm:grid-cols-3` step, matching entities-listing —\n * without it, six tiles would stack 2×3 on tablet instead of 3×2.\n */\nexport type TileGridBreakpoint = 'sm' | 'md' | 'lg';\n\nconst COLUMNS: Record<TileGridBreakpoint, Record<TileGridColumns, string>> = {\n sm: {\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 sm:grid-cols-4',\n 5: 'grid-cols-2 sm:grid-cols-5',\n 6: 'grid-cols-2 sm:grid-cols-6',\n },\n md: {\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 md:grid-cols-3',\n 4: 'grid-cols-2 md:grid-cols-4',\n 5: 'grid-cols-2 md:grid-cols-5',\n 6: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-6',\n },\n lg: {\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n 5: 'grid-cols-2 lg:grid-cols-5',\n 6: 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-6',\n },\n};\n\nexport interface TileGridProps {\n children: ReactNode;\n columns?: TileGridColumns;\n /**\n * Breakpoint at which the grid reaches its full column count. `lg` is the default\n * and correct for a full-width page. Narrow contexts — a stat row inside a panel,\n * as on the article detail page — legitimately need `sm`.\n */\n at?: TileGridBreakpoint;\n className?: string;\n}\n\n/**\n * A responsive grid of equal-width tiles.\n *\n * Was `StatTileGrid`, which read as a `StatTile`-specific component. It has never been\n * coupled to one: no context, no cloning, no constraint on `children`. It takes any\n * nodes — `StatTile`s, `Card`s, chart tiles — and only owns the column counts and the\n * `gap-3`. The rename says so.\n */\nexport function TileGrid({\n children,\n columns = 4,\n at = 'lg',\n className,\n}: TileGridProps) {\n return <div className={clsx('grid gap-3', COLUMNS[at][columns], className)}>{children}</div>;\n}\n","/**\n * Chart colour.\n *\n * SVG paints via the `stroke` / `fill` *attributes*, which cannot take a Tailwind\n * class — so charts resolve a `tone` to a CSS variable reference instead of a utility.\n * That keeps them on the token layer; 0.2.0's charts defaulted to raw hex (`#0c2d58`,\n * `rgba(140,155,176,0.5)`) and drifted from it.\n *\n * Every chart still accepts an explicit `color` string for genuinely data-driven\n * colour — a series whose colour comes from the data, not from semantics.\n */\nexport type ChartTone = 'brand' | 'info' | 'positive' | 'warning' | 'danger' | 'neutral';\n\nexport const CHART_TONE: Record<ChartTone, string> = {\n brand: 'var(--color-background-brand-default)',\n info: 'var(--status-info-dot)',\n positive: 'var(--color-background-positive-default)',\n warning: 'var(--color-background-warning-default)',\n danger: 'var(--color-background-danger-default)',\n neutral: 'var(--color-background-neutral-default)',\n};\n\n/** The muted track/rest colour behind a highlighted series. */\nexport const CHART_TRACK = 'var(--color-background-default-tertiary)';\n\n/**\n * Ordered sequence for multi-series charts, so two donuts in the same product never\n * assign different colours to the same first category. Semantic tones come first\n * because a chart with two or three series is usually still saying something.\n */\nexport const CHART_SEQUENCE: ChartTone[] = ['brand', 'info', 'positive', 'warning', 'danger', 'neutral'];\n\n/** Resolve an explicit colour, else a tone, else the sequence position. */\nexport function resolveChartColor(color: string | undefined, tone: ChartTone | undefined, index = 0): string {\n if (color) return color;\n if (tone) return CHART_TONE[tone];\n return CHART_TONE[CHART_SEQUENCE[index % CHART_SEQUENCE.length]];\n}\n","import clsx from 'clsx';\nimport { resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type BarChartOrientation = 'vertical' | 'horizontal';\nexport type BarChartSize = 'sm' | 'md' | 'lg';\n\n/** Thickness of one bar / one group slot, and the label type step. */\nconst SIZE: Record<BarChartSize, { band: number; gap: number; label: string }> = {\n sm: { band: 14, gap: 6, label: 'text-body-tiny' },\n md: { band: 20, gap: 8, label: 'text-body-xs' },\n lg: { band: 28, gap: 10, label: 'text-body-xs' },\n};\n\nexport interface BarChartSeries {\n label: string;\n /** One value per category. */\n values: number[];\n tone?: ChartTone;\n color?: string;\n}\n\nexport interface BarChartProps {\n /** Category names — the axis labels. */\n categories: string[];\n series: BarChartSeries[];\n orientation?: BarChartOrientation;\n /** Stack series on top of each other instead of placing them side by side. */\n stacked?: boolean;\n size?: BarChartSize;\n /** Overall length of the value axis, in px. */\n length?: number;\n /** Show the category labels along the axis. */\n showLabels?: boolean;\n /** Print each bar's value at the end of the bar. Horizontal orientation only. */\n showValues?: boolean;\n radius?: number;\n label?: string;\n className?: string;\n}\n\n/**\n * Grouped or stacked bars, in either orientation.\n *\n * Horizontal is the orientation the library was missing and the one that actually suits\n * category data, because long category names get a full line of width rather than being\n * rotated or truncated under a vertical bar.\n *\n * Deliberately axis-light: one baseline, no gridlines, no ticks. For anything needing\n * real axes or interaction, this is the wrong component.\n */\nexport function BarChart({\n categories,\n series,\n orientation = 'horizontal',\n stacked = false,\n size = 'md',\n length = 240,\n showLabels = true,\n showValues = false,\n radius = 3,\n label,\n className,\n}: BarChartProps) {\n const { band, gap, label: labelClass } = SIZE[size];\n if (categories.length === 0 || series.length === 0) return null;\n\n // Stacked bars share one band per category; grouped bars split it between series.\n const perCategory = stacked ? band : band * series.length + gap * (series.length - 1);\n\n const categoryTotals = categories.map((_, ci) =>\n stacked\n ? series.reduce((sum, s) => sum + Math.max(0, s.values[ci] ?? 0), 0)\n : Math.max(...series.map((s) => Math.max(0, s.values[ci] ?? 0))),\n );\n const max = Math.max(...categoryTotals, 1);\n\n const horizontal = orientation === 'horizontal';\n\n return (\n <div\n className={clsx('flex w-full min-w-0', horizontal ? 'flex-col gap-2' : 'flex-row items-end gap-3', className)}\n role={label ? 'img' : undefined}\n aria-label={label}\n >\n {categories.map((category, ci) => {\n const bars = series.map((s, si) => ({\n key: s.label,\n value: Math.max(0, s.values[ci] ?? 0),\n color: resolveChartColor(s.color, s.tone, si),\n }));\n\n return (\n <div\n key={category}\n className={clsx('flex min-w-0', horizontal ? 'flex-col gap-1' : 'h-full flex-col justify-end gap-1.5')}\n style={horizontal ? undefined : { width: perCategory }}\n >\n {showLabels && horizontal && (\n <span className={clsx('truncate text-default-secondary', labelClass)}>{category}</span>\n )}\n\n <div\n className={clsx('flex', horizontal ? 'items-center gap-2' : 'w-full flex-1 items-end justify-center')}\n style={horizontal ? undefined : { height: length }}\n >\n <div\n className={clsx('flex min-w-0', stacked ? 'gap-0' : '')}\n style={\n horizontal\n ? { width: length, flexDirection: stacked ? 'row' : 'column', gap: stacked ? 0 : gap }\n : {\n height: '100%',\n width: perCategory,\n flexDirection: stacked ? 'column-reverse' : 'row',\n alignItems: 'flex-end',\n gap: stacked ? 0 : gap,\n }\n }\n >\n {bars.map((bar) => {\n const extent = `${(bar.value / max) * 100}%`;\n return (\n <div\n key={bar.key}\n title={`${category} · ${bar.key}: ${bar.value}`}\n className=\"transition-all\"\n style={{\n backgroundColor: bar.color,\n borderRadius: radius,\n ...(horizontal\n ? { width: extent, height: stacked ? band : band }\n : { height: extent, width: stacked ? perCategory : band }),\n }}\n />\n );\n })}\n </div>\n {showValues && horizontal && (\n <span className={clsx('shrink-0 tabular-nums text-default-secondary', labelClass)}>\n {categoryTotals[ci]}\n </span>\n )}\n </div>\n\n {showLabels && !horizontal && (\n <span className={clsx('truncate text-center text-default-secondary', labelClass)}>{category}</span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { CHART_TRACK, resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type DonutChartSize = 'sm' | 'md' | 'lg';\n\n/** Diameter and default ring thickness, in px. */\nconst SIZE: Record<DonutChartSize, { box: number; thickness: number }> = {\n sm: { box: 88, thickness: 10 },\n md: { box: 128, thickness: 14 },\n lg: { box: 180, thickness: 20 },\n};\n\nexport interface DonutSegment {\n label: string;\n value: number;\n /** Token-backed colour. Falls back to the segment's position in the chart sequence. */\n tone?: ChartTone;\n /** Explicit colour, for data-driven series. */\n color?: string;\n}\n\nexport interface DonutChartProps {\n segments: DonutSegment[];\n size?: DonutChartSize;\n /** Ring thickness in px. Overrides the `size` preset. */\n thickness?: number;\n /** Large text at the centre — a total, a percentage. */\n centerValue?: ReactNode;\n /** Caption beneath `centerValue`. */\n centerLabel?: ReactNode;\n /** Gap between segments, in degrees. */\n gap?: number;\n /** Accessible description. */\n label?: string;\n className?: string;\n}\n\n/**\n * A proportional ring.\n *\n * Drawn with `stroke-dasharray` on circles rather than arc paths: one element per\n * segment, no trigonometry, and the segments stay crisp at any thickness.\n */\nexport function DonutChart({\n segments,\n size = 'md',\n thickness,\n centerValue,\n centerLabel,\n gap = 2,\n label,\n className,\n}: DonutChartProps) {\n const { box, thickness: presetThickness } = SIZE[size];\n const ring = thickness ?? presetThickness;\n const radius = (box - ring) / 2;\n const circumference = 2 * Math.PI * radius;\n const total = segments.reduce((sum, s) => sum + Math.max(0, s.value), 0);\n\n // A gap is only meaningful between two or more visible segments.\n const visible = segments.filter((s) => s.value > 0);\n const gapLength = visible.length > 1 ? (gap / 360) * circumference : 0;\n\n let offset = 0;\n\n return (\n <div className={clsx('relative inline-flex shrink-0 items-center justify-center', className)}>\n <svg\n width={box}\n height={box}\n viewBox={`0 0 ${box} ${box}`}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n // -90° so the first segment starts at twelve o'clock rather than three.\n className=\"block -rotate-90\"\n >\n <circle cx={box / 2} cy={box / 2} r={radius} fill=\"none\" stroke={CHART_TRACK} strokeWidth={ring} />\n {total > 0 &&\n segments.map((segment, i) => {\n const fraction = Math.max(0, segment.value) / total;\n const length = Math.max(0, fraction * circumference - gapLength);\n const dash = `${length} ${circumference - length}`;\n const thisOffset = offset;\n offset += fraction * circumference;\n if (segment.value <= 0) return null;\n return (\n <circle\n key={segment.label}\n cx={box / 2}\n cy={box / 2}\n r={radius}\n fill=\"none\"\n stroke={resolveChartColor(segment.color, segment.tone, i)}\n strokeWidth={ring}\n strokeDasharray={dash}\n strokeDashoffset={-thisOffset}\n strokeLinecap=\"butt\"\n />\n );\n })}\n </svg>\n {(centerValue != null || centerLabel != null) && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\n {centerValue != null && (\n <span className=\"text-subheading-sm font-bold leading-none text-default\">{centerValue}</span>\n )}\n {centerLabel != null && (\n <span className=\"mt-0.5 text-body-tiny text-default-secondary\">{centerLabel}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { CHART_TRACK, resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type RadialGaugeSize = 'sm' | 'md' | 'lg';\n\nconst SIZE: Record<RadialGaugeSize, { box: number; thickness: number; value: string }> = {\n sm: { box: 72, thickness: 8, value: 'text-body-sm' },\n md: { box: 104, thickness: 11, value: 'text-subheading-sm' },\n lg: { box: 148, thickness: 15, value: 'text-subheading' },\n};\n\nexport interface RadialGaugeProps {\n value: number;\n /** Top of the scale. */\n max?: number;\n size?: RadialGaugeSize;\n tone?: ChartTone;\n color?: string;\n /** Ring thickness in px. Overrides the `size` preset. */\n thickness?: number;\n /**\n * Sweep in degrees. 360 is a full ring; 270 leaves a gap at the bottom, which reads\n * more like a dial than a pie.\n */\n sweep?: number;\n /** Centre content. Defaults to the value; pass `null` for an empty ring. */\n children?: ReactNode;\n /** Caption beneath the centre value. */\n centerLabel?: ReactNode;\n label?: string;\n className?: string;\n}\n\n/**\n * A single-value arc — a score ring, a utilisation dial, a completion meter.\n *\n * The shape the library had no form for: `ProgressBar` covers linear progress and\n * `DonutChart` compares parts of a whole, but neither draws \"one number against its\n * ceiling\" in a round frame.\n */\nexport function RadialGauge({\n value,\n max = 100,\n size = 'md',\n tone = 'brand',\n color,\n thickness,\n sweep = 270,\n children,\n centerLabel,\n label,\n className,\n}: RadialGaugeProps) {\n const preset = SIZE[size];\n const box = preset.box;\n const ring = thickness ?? preset.thickness;\n const radius = (box - ring) / 2;\n const circumference = 2 * Math.PI * radius;\n\n const clampedSweep = Math.min(360, Math.max(1, sweep));\n const arc = (clampedSweep / 360) * circumference;\n const fraction = max > 0 ? Math.min(1, Math.max(0, value / max)) : 0;\n const stroke = resolveChartColor(color, tone);\n\n // Rotate so the arc is centred on twelve o'clock: -90° puts the start at the top,\n // then half the unswept remainder brings it back round.\n const rotation = -90 + (360 - clampedSweep) / 2;\n\n return (\n <div className={clsx('relative inline-flex shrink-0 items-center justify-center', className)}>\n <svg\n width={box}\n height={box}\n viewBox={`0 0 ${box} ${box}`}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className=\"block\"\n style={{ transform: `rotate(${rotation}deg)` }}\n >\n <circle\n cx={box / 2}\n cy={box / 2}\n r={radius}\n fill=\"none\"\n stroke={CHART_TRACK}\n strokeWidth={ring}\n strokeDasharray={`${arc} ${circumference - arc}`}\n strokeLinecap=\"round\"\n />\n <circle\n cx={box / 2}\n cy={box / 2}\n r={radius}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={ring}\n strokeDasharray={`${arc * fraction} ${circumference - arc * fraction}`}\n strokeLinecap=\"round\"\n className=\"transition-all\"\n />\n </svg>\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\n {children === undefined ? (\n <span className={clsx('font-bold leading-none text-default', preset.value)}>{value}</span>\n ) : (\n children\n )}\n {centerLabel != null && (\n <span className=\"mt-0.5 text-body-tiny text-default-secondary\">{centerLabel}</span>\n )}\n </div>\n </div>\n );\n}\n","import { useId } from 'react';\nimport clsx from 'clsx';\nimport { CHART_TONE, resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type SparklineVariant = 'line' | 'area';\nexport type SparklineSize = 'sm' | 'md' | 'lg';\n\n/** Size presets, so callers stop passing bare pixel pairs. */\nconst SIZE: Record<SparklineSize, { width: number; height: number }> = {\n sm: { width: 80, height: 24 },\n md: { width: 120, height: 36 },\n lg: { width: 200, height: 56 },\n};\n\nexport interface SparklineProps {\n data: number[];\n variant?: SparklineVariant;\n /** Token-backed colour. Ignored when `color` is set. */\n tone?: ChartTone;\n /** Explicit colour, for series whose colour comes from the data. */\n color?: string;\n size?: SparklineSize;\n /** Overrides the `size` preset. */\n width?: number;\n height?: number;\n strokeWidth?: number;\n /** Dot on the final point — useful when the line is the \"current value\". */\n showEndDot?: boolean;\n /** Accessible description. Omit to keep the chart decorative. */\n label?: string;\n className?: string;\n}\n\n/**\n * A compact trend line, with no axes and no interaction.\n *\n * `variant=\"area\"` adds the gradient fill beneath the line that 0.2.0 had no way to\n * draw, which is what makes a sparkline readable at `lg` where a bare 1.5px stroke\n * looks thin.\n */\nexport function Sparkline({\n data,\n variant = 'line',\n tone = 'brand',\n color,\n size = 'md',\n width,\n height,\n strokeWidth = 1.5,\n showEndDot = false,\n label,\n className,\n}: SparklineProps) {\n const gradientId = useId();\n if (data.length < 2) return null;\n\n const w = width ?? SIZE[size].width;\n const h = height ?? SIZE[size].height;\n const stroke = resolveChartColor(color, tone);\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n const pad = strokeWidth;\n const innerH = h - pad * 2;\n const innerW = w - pad * 2;\n\n const coords = data.map((v, i) => ({\n x: pad + (i / (data.length - 1)) * innerW,\n y: pad + innerH - ((v - min) / range) * innerH,\n }));\n const points = coords.map((p) => `${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ');\n // Close the path down to the baseline so the fill has something to fill.\n const areaPath = `M ${points.split(' ').join(' L ')} L ${coords[coords.length - 1].x.toFixed(2)},${h} L ${coords[0].x.toFixed(2)},${h} Z`;\n const last = coords[coords.length - 1];\n\n return (\n <svg\n width={w}\n height={h}\n viewBox={`0 0 ${w} ${h}`}\n fill=\"none\"\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={clsx('block shrink-0', className)}\n >\n {variant === 'area' && (\n <>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.24} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <path d={areaPath} fill={`url(#${gradientId})`} />\n </>\n )}\n <polyline\n points={points}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n {showEndDot && (\n <circle cx={last.x} cy={last.y} r={strokeWidth * 1.6} fill={stroke} stroke={CHART_TONE.neutral} strokeWidth={0} />\n )}\n </svg>\n );\n}\n","import clsx from 'clsx';\nimport { CHART_TRACK, resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type MiniBarChartSize = 'sm' | 'md' | 'lg';\nexport type MiniBarChartOrientation = 'vertical' | 'horizontal';\n\nconst SIZE: Record<MiniBarChartSize, { width: number; height: number; gap: number }> = {\n sm: { width: 80, height: 32, gap: 2 },\n md: { width: 120, height: 48, gap: 3 },\n lg: { width: 200, height: 72, gap: 4 },\n};\n\nexport interface MiniBarChartProps {\n bars: number[];\n /** Colour of the highlighted bars. */\n tone?: ChartTone;\n color?: string;\n /** Colour of the un-highlighted bars. Defaults to the muted track token. */\n restColor?: string;\n /**\n * Which bars are highlighted. A number or list of indices; negatives count from the\n * end, so `-1` is the last bar. Pass `[]` to highlight none.\n *\n * Replaces 0.2.0's `highlightLastBar` boolean, which could only ever mean `-1`.\n */\n highlight?: number | number[];\n size?: MiniBarChartSize;\n /** Overrides the `size` preset. */\n width?: number;\n height?: number;\n gap?: number;\n orientation?: MiniBarChartOrientation;\n radius?: number;\n label?: string;\n className?: string;\n}\n\n/** A compact bar series with no axes — a distribution or a per-period count. */\nexport function MiniBarChart({\n bars,\n tone = 'brand',\n color,\n restColor = CHART_TRACK,\n highlight = -1,\n size = 'md',\n width,\n height,\n gap,\n orientation = 'vertical',\n radius = 2,\n label,\n className,\n}: MiniBarChartProps) {\n if (bars.length === 0) return null;\n\n const preset = SIZE[size];\n const w = width ?? preset.width;\n const h = height ?? preset.height;\n const g = gap ?? preset.gap;\n const fill = resolveChartColor(color, tone);\n\n const highlighted = new Set(\n (Array.isArray(highlight) ? highlight : [highlight]).map((i) => (i < 0 ? bars.length + i : i)),\n );\n\n const max = Math.max(...bars) || 1;\n const vertical = orientation === 'vertical';\n // The cross-axis is divided between bars; the value axis carries the magnitude.\n const span = vertical ? w : h;\n const extent = vertical ? h : w;\n const barThickness = (span - g * (bars.length - 1)) / bars.length;\n\n return (\n <svg\n width={w}\n height={h}\n viewBox={`0 0 ${w} ${h}`}\n fill=\"none\"\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={clsx('block shrink-0', className)}\n >\n {bars.map((v, i) => {\n const magnitude = Math.max(2, (v / max) * extent);\n const offset = i * (barThickness + g);\n return (\n <rect\n key={i}\n x={(vertical ? offset : 0).toFixed(2)}\n // Vertical bars grow up from the baseline; horizontal ones out from the left.\n y={(vertical ? extent - magnitude : offset).toFixed(2)}\n width={(vertical ? barThickness : magnitude).toFixed(2)}\n height={(vertical ? magnitude : barThickness).toFixed(2)}\n fill={highlighted.has(i) ? fill : restColor}\n rx={radius}\n />\n );\n })}\n </svg>\n );\n}\n","import clsx from 'clsx';\nimport { LegendDot, type LegendDotShape, type LegendDotSize } from './legend-dot';\nimport { resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type ChartLegendOrientation = 'vertical' | 'horizontal';\n\nexport interface ChartLegendItem {\n label: string;\n /** Trailing value. Omit for a legend that only names the series. */\n count?: number | string;\n /** Token-backed colour. Falls back to the item's position in the chart sequence. */\n tone?: ChartTone;\n /** Explicit colour, for data-driven series. */\n color?: string;\n}\n\nexport interface ChartLegendProps {\n items: ChartLegendItem[];\n /**\n * `vertical` spreads each row to fill its container, so the counts align in a column\n * beside a donut. `horizontal` wraps inline, for a legend under a bar chart.\n */\n orientation?: ChartLegendOrientation;\n size?: LegendDotSize;\n shape?: LegendDotShape;\n className?: string;\n}\n\n/** Series names, swatches and optional values. */\nexport function ChartLegend({\n items,\n orientation = 'vertical',\n size = 'md',\n shape = 'dot',\n className,\n}: ChartLegendProps) {\n const horizontal = orientation === 'horizontal';\n\n return (\n <div\n className={clsx(\n horizontal ? 'flex flex-wrap items-center gap-x-4 gap-y-2' : 'flex flex-col gap-3',\n className,\n )}\n >\n {items.map((item, i) => (\n <div\n key={item.label}\n className={clsx('flex items-center gap-2', horizontal ? 'min-w-0' : 'justify-between')}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n {/* Resolved here, not in LegendDot, so the sequence fallback can use the\n item's position — matching how DonutChart colours its segments. */}\n <LegendDot color={resolveChartColor(item.color, item.tone, i)} size={size} shape={shape} />\n <span className=\"truncate text-body-xs text-default-secondary\">{item.label}</span>\n </div>\n {item.count != null && (\n <span className=\"shrink-0 text-body-xs font-semibold tabular-nums text-default\">{item.count}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { resolveChartColor, type ChartTone } from './chart-tone';\n\nexport type LegendDotSize = 'sm' | 'md';\n/** `line` is the swatch for a line series; `dot` and `square` for areas and bars. */\nexport type LegendDotShape = 'dot' | 'square' | 'line';\n\nconst SHAPE: Record<LegendDotShape, Record<LegendDotSize, string>> = {\n dot: { sm: 'size-1.5 rounded-full', md: 'size-2 rounded-full' },\n square: { sm: 'size-1.5 rounded-[2px]', md: 'size-2 rounded-[3px]' },\n line: { sm: 'h-0.5 w-3 rounded-full', md: 'h-0.5 w-4 rounded-full' },\n};\n\nexport interface LegendDotProps {\n /** Token-backed colour. Ignored when `color` is set. */\n tone?: ChartTone;\n /** Explicit colour, for data-driven series. */\n color?: string;\n size?: LegendDotSize;\n shape?: LegendDotShape;\n className?: string;\n}\n\n/** The colour swatch beside a series name. */\nexport function LegendDot({ tone, color, size = 'md', shape = 'dot', className }: LegendDotProps) {\n return (\n <span\n className={clsx('inline-block shrink-0', SHAPE[shape][size], className)}\n style={{ backgroundColor: resolveChartColor(color, tone) }}\n aria-hidden\n />\n );\n}\n","import clsx from 'clsx';\nimport { LuTrendingDown, LuTrendingUp } from 'react-icons/lu';\n\nexport type TrendLabelWeight = 'semibold' | 'bold';\nexport type TrendLabelSize = 'sm' | 'md' | 'lg';\n/**\n * Which direction is the good one.\n *\n * A delta component cannot infer this: +4% on-time delivery is good, +4% unit cost is\n * not. 0.2.0 had no such prop, so the only way to render a \"rising is bad\" delta was to\n * pass a raw hex — which is exactly what the deleted `BenchmarkCard` did, inverting its\n * own `positiveColor` default to red to compensate.\n */\nexport type TrendDirection = 'up-is-good' | 'up-is-bad';\n\nconst SIZE: Record<TrendLabelSize, string> = {\n sm: 'text-body-xs',\n md: 'text-body-sm',\n lg: 'text-subheading-sm',\n};\n\nconst ICON_SIZE: Record<TrendLabelSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\nconst weightBySize: Record<TrendLabelSize, TrendLabelWeight> = {\n sm: 'semibold',\n md: 'semibold',\n lg: 'bold',\n};\n\nconst WEIGHT: Record<TrendLabelWeight, string> = {\n semibold: 'font-semibold',\n bold: 'font-bold',\n};\n\nexport interface TrendLabelProps {\n value: number;\n suffix?: string;\n size?: TrendLabelSize;\n weight?: TrendLabelWeight;\n direction?: TrendDirection;\n /** Trend arrow. On by default — the docs described one long before there was one. */\n showArrow?: boolean;\n /** Explicit colour, for the rare data-driven case. Overrides the direction logic. */\n color?: string;\n className?: string;\n}\n\n/** A signed delta with a direction arrow, toned by whether the movement is good news. */\nexport function TrendLabel({\n value,\n suffix = '%',\n size = 'md',\n weight,\n direction = 'up-is-good',\n showArrow = true,\n color,\n className,\n}: TrendLabelProps) {\n const rising = value > 0;\n // Zero is neither good nor bad. 0.2.0 rendered it as a green \"+0%\".\n const flat = value === 0;\n const good = direction === 'up-is-good' ? rising : !rising;\n const Arrow = rising ? LuTrendingUp : LuTrendingDown;\n\n return (\n <span\n className={clsx(\n 'inline-flex items-center gap-1 whitespace-nowrap',\n SIZE[size],\n WEIGHT[weight ?? weightBySize[size]],\n !color && (flat ? 'text-default-secondary' : good ? 'text-positive' : 'text-danger'),\n className,\n )}\n style={color ? { color } : undefined}\n >\n {showArrow && !flat && <Arrow className={clsx('shrink-0', ICON_SIZE[size])} aria-hidden />}\n {rising ? '+' : ''}\n {value}\n {suffix}\n </span>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type ListRowDensity = 'default' | 'compact';\nexport type ListRowDivider = 'none' | 'top' | 'bottom';\n\nconst DENSITY: Record<ListRowDensity, { pad: string; gap: string; title: string; description: string }> = {\n default: {\n pad: 'py-4',\n gap: 'gap-3',\n title: 'text-body-sm font-semibold text-default',\n description: 'text-body-xs text-default-secondary',\n },\n compact: {\n pad: 'py-2.5',\n gap: 'gap-2',\n title: 'text-body-xs font-semibold text-default',\n description: 'text-body-tiny text-default-secondary',\n },\n};\n\nconst DIVIDER: Record<ListRowDivider, string> = {\n none: '',\n top: 'border-t border-default',\n bottom: 'border-b border-default',\n};\n\nexport interface ListRowProps {\n /** Left of the title, on the title line — an icon badge, avatar, checkbox, file chip. */\n leading?: ReactNode;\n title?: ReactNode;\n /** Inline after the title — a Required/Optional chip, a count, a tag. */\n titleMeta?: ReactNode;\n /** Muted line under the title. */\n description?: ReactNode;\n /** Right end of the title line — a `StatusBadge`, a score, a timestamp. */\n meta?: ReactNode;\n /** Right-hand column spanning the whole row, vertically centred — actions, a `Toggle`. */\n trailing?: ReactNode;\n /** Full-width block below the title line — a `FileRow`, a `FileDropZone`, an alert, a nested list. */\n footer?: ReactNode;\n density?: ListRowDensity;\n divider?: ListRowDivider;\n /** Render an `<li>` instead of a `<div>` — use inside a `<ul>`/`<ol>`. */\n as?: 'div' | 'li';\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * The generic list row: six slots and no opinion about what goes in them.\n *\n * Replaces `DocumentRow` and `DocumentChecklistRow`, which baked one product's\n * document-upload flow — its status vocabulary, its five raw-hex pills and its\n * unicode-glyph labels — into the library. Every feature of those rows is reachable by\n * composing this with `FileRow`, `FileDropZone` and `StatusBadge`; see the docs.\n */\nexport function ListRow({\n leading,\n title,\n titleMeta,\n description,\n meta,\n trailing,\n footer,\n density = 'default',\n divider = 'none',\n as: Tag = 'div',\n onClick,\n className,\n}: ListRowProps) {\n const d = DENSITY[density];\n const hasTitleLine = Boolean(leading || title != null || titleMeta || meta);\n\n return (\n <Tag\n className={clsx(\n 'flex w-full items-start',\n d.pad,\n DIVIDER[divider],\n onClick &&\n 'cursor-pointer rounded-lg transition-colors hover:bg-default-secondary/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand',\n className,\n )}\n onClick={onClick}\n // Unlike a <tr>, a div/li has no conflicting implicit role, so button is correct here.\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={\n onClick\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n <div className={clsx('flex min-w-0 flex-1 flex-col', d.gap)}>\n {hasTitleLine && (\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {leading}\n {title != null && <span className={clsx('truncate', d.title)}>{title}</span>}\n {titleMeta && <span className=\"shrink-0\">{titleMeta}</span>}\n </div>\n {meta && <span className=\"shrink-0\">{meta}</span>}\n </div>\n )}\n {description && <p className={d.description}>{description}</p>}\n {footer}\n </div>\n {trailing && <div className=\"ml-3 flex shrink-0 items-center self-center\">{trailing}</div>}\n </Tag>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport interface FileRowProps {\n name: string;\n /** Muted second line — size, upload date, uploader. */\n detail?: ReactNode;\n /** Leading chip showing the file extension, e.g. `\"PDF\"`. Ignored when `leading` is set. */\n fileType?: string;\n /** Custom leading node — overrides `fileType`. */\n leading?: ReactNode;\n /** The canonical action. Renders a text link before `actions`. */\n onDownload?: () => void;\n downloadLabel?: string;\n /** Everything else on the right — `Button`s, a `DropdownMenu`. */\n actions?: ReactNode;\n className?: string;\n}\n\n/** The extension chip. Lifted unchanged from the deleted `DocumentRow`. */\nfunction FileTypeBadge({ type }: { type: string }) {\n return (\n <span className=\"flex size-[34px] shrink-0 items-center justify-center rounded-md bg-brand-tertiary text-body-tiny font-semibold text-brand\">\n {type}\n </span>\n );\n}\n\n/**\n * One attached file: name, optional detail line, and actions.\n *\n * This strip was hardcoded inline inside both `DocumentRow` and\n * `DocumentChecklistRow`. Nothing about it is document-specific — it is the same row\n * for a generated export, an invoice or an evidence attachment.\n */\nexport function FileRow({\n name,\n detail,\n fileType,\n leading,\n onDownload,\n downloadLabel = 'Download',\n actions,\n className,\n}: FileRowProps) {\n const lead = leading ?? (fileType ? <FileTypeBadge type={fileType} /> : null);\n\n return (\n <div\n className={clsx(\n 'flex items-center gap-3 rounded-lg border border-default bg-default px-3 py-2.5',\n className,\n )}\n >\n {lead}\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate text-body-sm font-medium text-default\">{name}</span>\n {detail && <span className=\"text-body-xs text-default-secondary\">{detail}</span>}\n </div>\n {(onDownload || actions) && (\n <div className=\"flex shrink-0 items-center gap-3\">\n {onDownload && (\n <button\n type=\"button\"\n onClick={onDownload}\n className=\"text-body-xs font-medium text-brand hover:underline\"\n >\n {downloadLabel}\n </button>\n )}\n {actions}\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type ScoredRowAlign = 'center' | 'end';\n/** 8 / 12 / 20 / 48px — the four gaps the source mockups actually used. */\nexport type ScoredRowGap = 'sm' | 'md' | 'lg' | 'xl';\n\nconst GAP: Record<ScoredRowGap, string> = {\n sm: 'gap-2',\n md: 'gap-3',\n lg: 'gap-5',\n xl: 'gap-12',\n};\n\nconst ALIGN: Record<ScoredRowAlign, string> = {\n center: 'items-center',\n end: 'items-end',\n};\n\nexport interface ScoredRowProps {\n /** Leading visual — an `EntityIconBadge`, an `Avatar`, a rank number, or nothing. */\n leading?: ReactNode;\n title: ReactNode;\n subtitle?: ReactNode;\n /** Fixed-width column between the title block and the meter. */\n aside?: ReactNode;\n /** The bar. Put a `<ProgressBar>` here — the row does not choose one for you. */\n meter?: ReactNode;\n /** Right-hand value — a `<ScoreValue>`, a `<TrendLabel>`, a `<Badge>`, a button. */\n trailing?: ReactNode;\n /** CSS width values. Omit one and that slot flexes instead. */\n titleWidth?: string;\n asideWidth?: string;\n meterWidth?: string;\n trailingWidth?: string;\n gap?: ScoredRowGap;\n /** Gap between `leading` and the title block. Defaults to `gap`. */\n leadingGap?: ScoredRowGap;\n align?: ScoredRowAlign;\n className?: string;\n}\n\n/**\n * A row with a title block, an optional bar and a right-hand value.\n *\n * Was `EntityRow`. The rename is the smaller half of the change: the old component\n * hardcoded `RiskScore`, `WidgetProgressBar`, `TrendLabel` and `getRiskTone`, which\n * locked it to one scoring domain and forced 32 props — including four raw\n * `CSSProperties` escape hatches and a magic `nameWidth = '133px'` — to make it fit\n * anything else. The score and the bar are now slots, so the caller decides.\n */\nexport function ScoredRow({\n leading,\n title,\n subtitle,\n aside,\n meter,\n trailing,\n titleWidth,\n asideWidth,\n meterWidth,\n trailingWidth,\n gap = 'md',\n leadingGap,\n align = 'center',\n className,\n}: ScoredRowProps) {\n return (\n <div className={clsx('flex w-full', ALIGN[align], GAP[gap], className)}>\n <div\n className={clsx(\n 'flex min-w-0',\n ALIGN[align],\n GAP[leadingGap ?? gap],\n titleWidth ? 'shrink-0' : 'flex-1',\n )}\n style={titleWidth ? { width: titleWidth } : undefined}\n >\n {leading}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-body-sm font-medium leading-none text-default\">{title}</p>\n {subtitle && <p className=\"mt-0.5 truncate text-body-xs text-default-secondary\">{subtitle}</p>}\n </div>\n </div>\n\n {aside && (\n <div\n className={clsx('min-w-0', asideWidth ? 'shrink-0' : 'flex-1')}\n style={asideWidth ? { width: asideWidth } : undefined}\n >\n {aside}\n </div>\n )}\n\n {meter && (\n <div\n className={clsx('min-w-0', meterWidth ? 'shrink-0' : 'flex-1')}\n style={meterWidth ? { width: meterWidth } : undefined}\n >\n {meter}\n </div>\n )}\n\n {trailing && (\n <div className=\"shrink-0 text-right\" style={trailingWidth ? { width: trailingWidth } : undefined}>\n {trailing}\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { ProgressBar } from '../feedback/progress-bar';\nimport type { ProgressBarTone } from '../feedback/progress-bar';\nimport { ScoreValue, getScoreTone } from '../stats/score-value';\nimport type { ScoreDirection, ScoreValueSize, ScoreValueWeight } from '../stats/score-value';\n\nexport interface RankedRowProps {\n rank?: number;\n name: string;\n sublabel?: string;\n score: number;\n /** Bar and value colour. `auto` derives it from `score`. */\n tone?: ProgressBarTone | 'auto';\n /** Which end of the scale is bad, when `tone` is `auto`. */\n direction?: ScoreDirection;\n scoreSize?: ScoreValueSize;\n scoreWeight?: ScoreValueWeight;\n className?: string;\n}\n\n/**\n * A leaderboard row: rank, name, score, and a full-width bar underneath.\n *\n * Was `RankedListItem` — the only `…Item` in a folder of `…Row`s. Its three raw-hex\n * colour props (`scoreColor`, `barColor`, `barTrackColor`) are gone in favour of\n * `tone`, and its `gap` CSS string is now the `gap-1.5` it always resolved to.\n */\nexport function RankedRow({\n rank,\n name,\n sublabel,\n score,\n tone = 'auto',\n direction = 'higher-is-worse',\n scoreSize = 'md',\n scoreWeight = 'bold',\n className,\n}: RankedRowProps) {\n const resolved = tone === 'auto' ? getScoreTone(score, { direction }) : tone;\n\n return (\n <div className={clsx('flex w-full shrink-0 flex-col gap-1.5', className)}>\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {rank !== undefined && (\n <p className=\"w-[14px] shrink-0 text-body-xs font-bold text-default-secondary\">{rank}</p>\n )}\n <div className=\"flex min-w-0 flex-col gap-px\">\n <p className=\"truncate text-body-sm font-medium leading-none text-default\">{name}</p>\n {sublabel && <p className=\"text-body-tiny text-default-tertiary\">{sublabel}</p>}\n </div>\n </div>\n <ScoreValue\n value={score}\n size={scoreSize}\n weight={scoreWeight}\n tone={resolved}\n className=\"ml-2 shrink-0\"\n />\n </div>\n <ProgressBar value={score} tone={resolved} aria-label={`${name} score`} />\n </div>\n );\n}\n","import { cn } from '../../lib/cn';\n\nexport type ProgressBarTone = 'brand' | 'positive' | 'warning' | 'danger' | 'neutral';\nexport type ProgressBarSize = 'xs' | 'sm' | 'md' | 'lg';\n\n/** 4 / 6 / 8 / 12px. `sm` is 0.2.0's only height, and stays the default. */\nconst SIZE: Record<ProgressBarSize, string> = {\n xs: 'h-1',\n sm: 'h-1.5',\n md: 'h-2',\n lg: 'h-3',\n};\n\nconst FILL: Record<ProgressBarTone, string> = {\n brand: 'bg-brand',\n positive: 'bg-positive',\n warning: 'bg-warning',\n danger: 'bg-danger',\n neutral: 'bg-neutral',\n};\n\nexport interface ProgressBarProps {\n /** 0–100. Values outside the range are clamped. */\n value: number;\n tone?: ProgressBarTone;\n size?: ProgressBarSize;\n /** Caption above the bar. Also becomes the accessible name. */\n label?: string;\n /** Show the percentage at the right of the label row. */\n showValue?: boolean;\n /** CSS radius override, e.g. `'1px'` for a square-ended bar. Defaults to fully round. */\n radius?: string;\n /** Accessible name when there is no visible `label`. */\n 'aria-label'?: string;\n /**\n * Applied to the track. This is how you set a fixed width — `className=\"w-16\"`.\n * It genuinely overrides the base `w-full` because this file uses `cn`.\n */\n className?: string;\n}\n\n/**\n * A horizontal progress / proportion bar.\n *\n * Was `WidgetProgressBar` in 0.2.0, which fixed the height at 6px and lived under\n * `widgets/` despite being a general-purpose primitive — so `TableCellProgress`\n * hand-rolled a second copy rather than reuse it. It also had no ARIA at all.\n */\nexport function ProgressBar({\n value,\n tone = 'brand',\n size = 'sm',\n label,\n showValue = false,\n radius,\n 'aria-label': ariaLabel,\n className,\n}: ProgressBarProps) {\n const clamped = Math.min(100, Math.max(0, value));\n const rounded = radius ? undefined : 'rounded-full';\n\n const track = (\n <div\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ? undefined : ariaLabel}\n className={cn('w-full overflow-hidden bg-default-tertiary', SIZE[size], rounded, className)}\n style={radius ? { borderRadius: radius } : undefined}\n >\n <div\n className={cn('h-full transition-all', rounded, FILL[tone])}\n style={{ width: `${clamped}%`, ...(radius ? { borderRadius: radius } : undefined) }}\n />\n </div>\n );\n\n // No caption row means no wrapper — the bar must stay a direct child of whatever\n // laid it out, so a parent's `flex-1` or grid placement still applies to it.\n if (!label && !showValue) return track;\n\n return (\n <div>\n <div className=\"mb-1.5 flex items-center justify-between gap-2\">\n {label && <span className=\"text-body-xs text-default-secondary\">{label}</span>}\n {showValue && (\n <span className=\"ml-auto text-body-xs font-medium tabular-nums text-default\">\n {Math.round(clamped)}%\n </span>\n )}\n </div>\n {track}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport interface IconTextRowProps {\n icon: ReactNode;\n title: string;\n detail: string;\n className?: string;\n}\n\n/**\n * A circular icon badge, a title, and one line of detail.\n *\n * Feature lists, empty-state explanations, onboarding intros, \"what happens next\"\n * steps. Was `FeatureRow`, which named it after the one screen it was extracted from.\n */\nexport function IconTextRow({ icon, title, detail, className }: IconTextRowProps) {\n return (\n <div className={clsx('flex items-start gap-3', className)}>\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-brand-tertiary text-brand\">\n {icon}\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-body-sm font-semibold text-default\">{title}</p>\n <p className=\"mt-0.5 text-body-xs text-default-secondary\">{detail}</p>\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { LuCheck } from 'react-icons/lu';\n\nexport type ChecklistRowState = 'done' | 'active' | 'pending';\n\nexport interface ChecklistRowProps {\n label: string;\n state: ChecklistRowState;\n className?: string;\n}\n\n/**\n * One step in a progress checklist: a done tick, a spinning active ring, or an empty\n * pending ring.\n *\n * Shared by the event-onboarding \"building your dashboard\" screen and the\n * intelligence page's processing checklist. Both drove the same three states; only\n * the onboarding copy had the animated ring, which is the better treatment and is\n * adopted for both.\n *\n * Renders an `<li>` — callers must wrap it in a list, which is what both sources did.\n */\nexport function ChecklistRow({ label, state, className }: ChecklistRowProps) {\n return (\n <li className={clsx('flex items-center gap-3', className)}>\n <span className=\"flex size-5 shrink-0 items-center justify-center\">\n {state === 'done' ? (\n <LuCheck className=\"size-4 text-positive\" strokeWidth={2.5} aria-hidden />\n ) : (\n <span\n className={clsx(\n 'size-3.5 rounded-full border-2',\n state === 'active'\n ? 'animate-pulse border-brand-emphasis border-t-transparent'\n : 'border-disabled',\n )}\n />\n )}\n </span>\n <span\n className={clsx(\n 'text-body-sm',\n state === 'pending' ? 'text-default-tertiary' : 'font-semibold text-default',\n )}\n >\n {label}\n </span>\n </li>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport interface NumberedStepsListProps {\n steps: ReactNode[];\n className?: string;\n}\n\n/**\n * Ordered list with small filled number bullets.\n *\n * Promoted from entity-detail's \"what happens next\" panel. The panel's copy is\n * review-lifecycle business content and stays there; only the list chrome moves.\n *\n * The bullet was `bg-[#e7edfb] text-[#1d4ed8]` — a pale blue pair that is not in the\n * token set. It now uses the brand-tertiary background and brand text, which is the\n * documented treatment for a subtle brand-tinted chip.\n */\nexport function NumberedStepsList({ steps, className }: NumberedStepsListProps) {\n return (\n <ol className={clsx('flex flex-col gap-1.5', className)}>\n {steps.map((step, i) => (\n <li key={i} className=\"flex items-start gap-2 text-[12px] text-default\">\n <span className=\"mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full bg-brand-tertiary text-[9px] font-bold text-brand\">\n {i + 1}\n </span>\n {step}\n </li>\n ))}\n </ol>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type MetaFieldLayout = 'stacked' | 'inline';\n\nexport interface MetaFieldProps {\n label: string;\n value: ReactNode;\n /** Optional second line under the value (used by the onboarding review sections). */\n detail?: ReactNode;\n /**\n * `stacked` puts the label above the value (detail pages, onboarding review).\n * `inline` puts a fixed-width label beside it (drawer detail rows).\n */\n layout?: MetaFieldLayout;\n /** Fixed width for the `stacked` form, e.g. `sm:w-[262px]` on the overview grid. */\n className?: string;\n}\n\n/**\n * A label/value pair.\n *\n * Consolidates the same shape from six places: the entity-detail overview grid, the\n * reviewer-detail metric column, three `DetailRow` copies in drawers (queues,\n * filings, website-intel) and `ReviewMeta` in both onboarding wizards.\n *\n * An empty value renders an em dash, which is what every source copy did by hand.\n */\nexport function MetaField({\n label,\n value,\n detail,\n layout = 'stacked',\n className,\n}: MetaFieldProps) {\n const shown = value === null || value === undefined || value === '' ? '—' : value;\n\n if (layout === 'inline') {\n return (\n <div className={clsx('flex gap-3 text-body-xs', className)}>\n <span className=\"w-[120px] shrink-0 text-default-secondary\">{label}</span>\n <span className=\"min-w-0 flex-1 text-default\">{shown}</span>\n </div>\n );\n }\n\n return (\n <div className={clsx('flex flex-col gap-0.5', className)}>\n <p className=\"text-body-tiny font-medium text-default-secondary\">{label}</p>\n <p className=\"text-body-sm font-medium text-default\">{shown}</p>\n {detail && <p className=\"text-body-xs text-default-secondary\">{detail}</p>}\n </div>\n );\n}\n\nexport interface MetaFieldGridProps {\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Wrapper for a set of `MetaField`s that wrap into columns.\n *\n * Matches the entity-detail overview grid, which relies on each field carrying its\n * own width rather than on fixed grid columns — long values (aliases, legal names)\n * need to be able to occupy a full row on narrow viewports.\n */\nexport function MetaFieldGrid({ children, className }: MetaFieldGridProps) {\n return (\n <div className={clsx('flex flex-wrap gap-x-4 gap-y-3.5', className)}>{children}</div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { LuCheck } from 'react-icons/lu';\n\nexport type CheckedGroupListColumns = 1 | 2 | 3;\n\n/** One labelled group of ticked items. */\nexport interface CheckedGroup {\n label: string;\n items: string[];\n}\n\nexport interface CheckedGroupListProps {\n groups: CheckedGroup[];\n columns?: CheckedGroupListColumns;\n /** Leading glyph for every item. Defaults to a check; pass `null` for none. */\n icon?: ReactNode | null;\n emptyLabel?: string;\n className?: string;\n}\n\nconst COLUMNS: Record<CheckedGroupListColumns, string> = {\n 1: 'columns-1',\n 2: 'columns-2',\n 3: 'columns-3',\n};\n\n/**\n * A read-only, grouped list of ticked items in a balanced multi-column flow.\n *\n * Was `PermissionGrid` — RBAC-specific naming for a generic shape, and not a grid\n * either: groups pack tightly down each column rather than aligning to shared row\n * heights, so a tall group beside a short one leaves no ragged gap.\n * `break-inside-avoid` keeps each group whole within a column.\n *\n * Granted permissions, included plan features, completed requirements, matched\n * criteria — anything that is \"these labels, grouped, all ticked\".\n */\nexport function CheckedGroupList({\n groups,\n columns = 2,\n icon,\n emptyLabel = 'None.',\n className,\n}: CheckedGroupListProps) {\n if (groups.length === 0) {\n return <p className={clsx('text-body-xs text-default-secondary', className)}>{emptyLabel}</p>;\n }\n\n // `undefined` means \"not passed\" → default check. `null` means \"explicitly none\".\n const glyph = icon === undefined ? <LuCheck className=\"size-3.5\" strokeWidth={2.5} aria-hidden /> : icon;\n\n return (\n <div className={clsx(COLUMNS[columns], 'gap-x-6', className)}>\n {groups.map((group) => (\n <div key={group.label} className=\"mb-5 break-inside-avoid last:mb-0\">\n <p className=\"mb-2 text-body-tiny font-semibold uppercase tracking-wide text-default-secondary\">\n {group.label}\n </p>\n <ul className=\"space-y-1.5\">\n {group.items.map((item) => (\n <li key={item} className=\"flex items-center gap-2 text-body-xs text-default\">\n {glyph && <span className=\"shrink-0\">{glyph}</span>}\n {item}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { Key, ReactNode } from 'react';\nimport { ProgressBar } from '../feedback/progress-bar';\nimport type { ProgressBarTone } from '../feedback/progress-bar';\n\n// ── Column definition ──────────────────────────────────────────────────────────\n\nexport interface ColumnDef<T> {\n key: string;\n header: string;\n /**\n * CSS width value — e.g. `\"320px\"`, `\"10rem\"`. When `grow` is true this becomes the\n * column's floor: it counts toward the table's min-width, below which the wrapper\n * scrolls sideways rather than crushing the columns.\n */\n width: string;\n /**\n * When true the column absorbs the remaining table width.\n *\n * With no `grow` column, `table-fixed` distributes surplus width proportionally\n * across every column — the old flex layout left it blank on the right instead. Mark\n * whichever column should soak it up.\n */\n grow?: boolean;\n render: (row: T) => ReactNode;\n}\n\n// ── Density ────────────────────────────────────────────────────────────────────\n\nexport type DataTableDensity = 'default' | 'compact';\nexport type DataTableAlign = 'center' | 'top';\n\n/**\n * `default` is 0.2.0's spacing verbatim — ten call sites depend on it.\n *\n * `compact` is the audit / AI-widget density: an 11px semibold uppercase header over\n * 13px cells, which are `text-body-tiny` and `text-body-xs` exactly, so the type sizes\n * come across unchanged and only the padding really moves.\n */\nconst DENSITY: Record<DataTableDensity, { headerCell: string; headerText: string; bodyCell: string }> = {\n default: {\n headerCell: 'px-4 py-3',\n headerText: 'text-body-xs font-medium text-default-secondary whitespace-nowrap',\n bodyCell: 'px-4 py-[14px]',\n },\n compact: {\n headerCell: 'px-3 py-2',\n headerText:\n 'text-body-tiny font-semibold uppercase tracking-[0.4px] text-default-secondary whitespace-nowrap',\n bodyCell: 'px-3 py-2 text-body-xs text-default',\n },\n};\n\nconst ALIGN: Record<DataTableAlign, string> = {\n center: 'align-middle',\n top: 'align-top',\n};\n\n// ── DataTable ──────────────────────────────────────────────────────────────────\n\nexport interface DataTableProps<T> {\n columns: ColumnDef<T>[];\n rows: T[];\n getRowKey: (row: T, index: number) => Key;\n /** Row and header padding. `compact` also steps the header and cell type down. */\n density?: DataTableDensity;\n /** Vertical alignment of every body cell. Use `top` for multi-line or ragged cells. */\n align?: DataTableAlign;\n onRowClick?: (row: T) => void;\n /** Rendered as one full-width row when `rows` is empty. Omit to render nothing. */\n emptyLabel?: string;\n className?: string;\n}\n\n/**\n * A real `<table>` with `table-fixed` and a `<colgroup>`.\n *\n * 0.2.0 laid each row out as its own flex container sized `w-max`, so a `grow` column\n * sized itself per row and one long cell shunted that row's remaining columns out of\n * line with its neighbours. `table-fixed` resolves column widths once for the whole\n * table, which is the property the consuming app hand-rolled a separate audit table\n * to get.\n */\nexport function DataTable<T,>({\n columns,\n rows,\n getRowKey,\n density = 'default',\n align = 'center',\n onRowClick,\n emptyLabel,\n className,\n}: DataTableProps<T>) {\n const d = DENSITY[density];\n // Summed as a CSS expression rather than parsed as px, so any unit the caller used\n // (px, rem, ch) still yields a correct floor.\n const minWidth = columns.length ? `calc(${columns.map((c) => c.width).join(' + ')})` : undefined;\n\n return (\n <div className={clsx('overflow-x-auto rounded-xl border border-default bg-default', className)}>\n <table className=\"w-full table-fixed border-collapse text-left\" style={{ minWidth }}>\n <colgroup>\n {columns.map((col) => (\n // A grow column gets no width, so table-fixed hands it the leftover space.\n // Its floor is already counted in the table's min-width.\n <col key={col.key} style={col.grow ? undefined : { width: col.width }} />\n ))}\n </colgroup>\n <thead>\n <tr className=\"bg-default-secondary\">\n {columns.map((col) => (\n <th key={col.key} scope=\"col\" className={clsx('overflow-hidden', d.headerCell, d.headerText)}>\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0\n ? emptyLabel && (\n <tr>\n <td\n colSpan={columns.length}\n className={clsx(d.bodyCell, 'text-center text-body-sm text-default-secondary')}\n >\n {emptyLabel}\n </td>\n </tr>\n )\n : rows.map((row, i) => (\n <tr\n key={getRowKey(row, i)}\n className={clsx(\n 'transition-colors hover:bg-default-secondary/50',\n i > 0 && 'border-t border-default',\n // outline, not ring: `ring-*` compiles to box-shadow, which browsers\n // do not paint on a <tr> under border-collapse: collapse.\n onRowClick &&\n 'cursor-pointer outline-none focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-brand',\n )}\n // Deliberately no role=\"button\" — it would override the implicit\n // role=\"row\" and detach every row from the table's accessibility\n // tree. The <th scope>/<td> markup supplies the real roles for free.\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n onKeyDown={\n onRowClick\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onRowClick(row);\n }\n }\n : undefined\n }\n >\n {columns.map((col) => (\n <td key={col.key} className={clsx('overflow-hidden', d.bodyCell, ALIGN[align])}>\n {col.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ── Cell components ────────────────────────────────────────────────────────────\n\n/**\n * Cell type scale.\n *\n * Named `size`, not `density`, and deliberately *not* inherited from the table: the two\n * real compact tables disagree about the mapping — the audit table wants default\n * padding with small cell text — so inheritance could not express it anyway, and it\n * would make these render one size inside a table and another outside one.\n */\nexport type TableCellSize = 'sm' | 'md';\n\nexport interface TableCellLeadTextProps {\n primary: string;\n secondary?: string;\n size?: TableCellSize;\n className?: string;\n}\n\n/** Primary text plus an optional muted subtitle — for lead entity/name cells. */\nexport function TableCellLeadText({ primary, secondary, size = 'md', className }: TableCellLeadTextProps) {\n return (\n <div className={clsx('flex flex-col gap-0.5', className)}>\n <span\n className={clsx(\n 'font-medium leading-snug text-default',\n size === 'sm' ? 'text-body-xs' : 'text-body-sm',\n )}\n >\n {primary}\n </span>\n {secondary && (\n <span\n className={clsx(\n 'font-normal leading-tight text-default-secondary',\n size === 'sm' ? 'text-body-tiny' : 'text-body-xs',\n )}\n >\n {secondary}\n </span>\n )}\n </div>\n );\n}\n\nexport interface TableCellTextProps {\n children: ReactNode;\n /** Muted (secondary) by default; pass false for the primary colour. */\n muted?: boolean;\n size?: TableCellSize;\n /** Ellipsise instead of wrapping, so every row keeps the same height. */\n truncate?: boolean;\n className?: string;\n}\n\n/** Plain text cell. */\nexport function TableCellText({\n children,\n muted = true,\n size = 'md',\n truncate = false,\n className,\n}: TableCellTextProps) {\n return (\n <span\n className={clsx(\n 'font-normal leading-snug',\n size === 'sm' ? 'text-body-tiny' : 'text-body-xs',\n truncate ? 'block truncate' : 'whitespace-nowrap',\n muted ? 'text-default-secondary' : 'text-default',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nexport interface TableCellBadgeProps {\n label: string;\n className?: string;\n}\n\n/** Small outlined chip — entity type labels, categories. */\nexport function TableCellBadge({ label, className }: TableCellBadgeProps) {\n return (\n <span\n className={clsx(\n 'inline-flex items-center rounded-md border border-default bg-default-secondary px-2 py-0.5 text-body-tiny font-medium text-default-secondary whitespace-nowrap',\n className,\n )}\n >\n {label}\n </span>\n );\n}\n\nexport interface TableCellProgressProps {\n percent: number;\n /**\n * Bar colour. `brand` is 0.2.0's default and byte-identical to it — `bg-brand`\n * resolves to the same `--prim-brand-900` the old raw-hex default hardcoded.\n */\n tone?: ProgressBarTone;\n size?: TableCellSize;\n className?: string;\n}\n\n/** Mini progress bar with a percentage label below. */\nexport function TableCellProgress({\n percent,\n tone = 'brand',\n size = 'md',\n className,\n}: TableCellProgressProps) {\n const clamped = Math.min(100, Math.max(0, percent));\n return (\n <div className={clsx('flex flex-col gap-1', className)}>\n {/* Delegates to ProgressBar rather than hand-rolling a second bar, which is what\n 0.2.0 did — the two then disagreed on the track colour. */}\n <ProgressBar value={clamped} tone={tone} size=\"sm\" className=\"w-16\" aria-label={`${clamped}%`} />\n <span\n className={clsx(\n 'leading-none text-default-secondary',\n size === 'sm' ? 'text-[10px]' : 'text-body-tiny',\n )}\n >\n {percent}%\n </span>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { LuCircleCheckBig, LuInfo, LuTriangleAlert } from 'react-icons/lu';\n\nexport type InlineAlertTone = 'info' | 'warning' | 'danger' | 'positive';\n\nexport interface InlineAlertProps {\n tone: InlineAlertTone;\n children: ReactNode;\n /** Overrides the per-tone default glyph. Pass `null` for no icon. */\n icon?: ReactNode | null;\n className?: string;\n}\n\nconst toneStyles: Record<InlineAlertTone, string> = {\n info: 'border-brand-tertiary bg-brand-tertiary text-brand',\n warning: 'border-warning-tertiary bg-warning-tertiary text-warning',\n danger: 'border-danger-tertiary bg-danger-tertiary text-danger',\n positive: 'border-positive-tertiary bg-positive-tertiary text-positive',\n};\n\nconst toneIcons: Record<InlineAlertTone, ReactNode> = {\n info: <LuInfo className=\"size-4\" />,\n warning: <LuTriangleAlert className=\"size-4\" />,\n danger: <LuTriangleAlert className=\"size-4\" />,\n positive: <LuCircleCheckBig className=\"size-4\" />,\n};\n\n/** Banner for inline messaging — form errors, destructive-action warnings, success confirmations.\n *\n * Replaces four byte-identical raw-`amber-*` callouts, five competing error-text styles and a\n * standalone `Banner` component. `danger` renders as `role=\"alert\"`; the rest as `role=\"status\"`. */\nexport function InlineAlert({ tone, children, icon, className }: InlineAlertProps) {\n const glyph = icon === undefined ? toneIcons[tone] : icon;\n\n return (\n <div\n role={tone === 'danger' ? 'alert' : 'status'}\n className={clsx(\n 'flex items-start gap-2.5 rounded-xl border p-3.5 text-body-xs',\n toneStyles[tone],\n className,\n )}\n >\n {glyph && <span className=\"mt-px shrink-0\">{glyph}</span>}\n <div className=\"min-w-0\">{children}</div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type EmptyStateVariant = 'empty' | 'loading' | 'error';\nexport type EmptyStateSize = 'sm' | 'md' | 'lg';\n\n/**\n * Vertical padding. The eighteen source copies used `py-8`, with divergent siblings\n * at `py-10`, `py-12` and `py-16` — these three sizes absorb all four.\n */\nconst SIZES: Record<EmptyStateSize, string> = {\n sm: 'py-8',\n md: 'py-12',\n lg: 'py-16',\n};\n\nconst TONES: Record<EmptyStateVariant, string> = {\n empty: 'text-default-secondary',\n loading: 'text-default-secondary',\n error: 'text-danger',\n};\n\nexport interface EmptyStateProps {\n message: string;\n /** `error` is the only variant that changes colour; `loading` exists for intent. */\n variant?: EmptyStateVariant;\n size?: EmptyStateSize;\n icon?: ReactNode;\n /** A primary action, e.g. \"Add your first source\". */\n action?: ReactNode;\n className?: string;\n}\n\n/**\n * Centred placeholder for an empty list, a loading list, or a failed fetch.\n *\n * Replaces eighteen copies of `py-8 text-center text-body-sm\n * text-default-secondary` plus four divergent variants. Loading and empty were\n * always the same markup in this codebase, so they are one component with a\n * `variant` rather than two near-identical ones.\n *\n * `aria-live` is set for the loading and error variants so a screen reader announces\n * the state change instead of silently swapping list content.\n */\nexport function EmptyState({\n message,\n variant = 'empty',\n size = 'sm',\n icon,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={clsx(\n 'flex flex-col items-center justify-center gap-2 px-4 text-center text-body-sm',\n SIZES[size],\n TONES[variant],\n className,\n )}\n aria-live={variant === 'empty' ? undefined : 'polite'}\n >\n {icon && <span className=\"text-default-tertiary\">{icon}</span>}\n <p>{message}</p>\n {action}\n </div>\n );\n}\n","import { forwardRef, useState } from 'react';\nimport { LuEye, LuEyeOff } from 'react-icons/lu';\n\nimport { Input, type InputProps } from './input';\n\nexport type PasswordInputProps = Omit<InputProps, 'type' | 'trailingIcon' | 'trailingAction'>;\n\n/** Password field with a show/hide visibility toggle. */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(function PasswordInput(props, ref) {\n const [visible, setVisible] = useState(false);\n\n return (\n <Input\n ref={ref}\n {...props}\n type={visible ? 'text' : 'password'}\n trailingAction={\n <button\n type=\"button\"\n aria-label={visible ? 'Hide password' : 'Show password'}\n onClick={() => setVisible((v) => !v)}\n className=\"flex items-center justify-center rounded transition-colors hover:text-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand\"\n >\n {visible ? <LuEyeOff className=\"size-4\" /> : <LuEye className=\"size-4\" />}\n </button>\n }\n />\n );\n});\n","import clsx from 'clsx';\nimport { LuArrowRight, LuSearch } from 'react-icons/lu';\n\nexport interface AIChatBarProps {\n placeholder?: string;\n className?: string;\n}\n\nexport function AIChatBar({\n placeholder = 'Ask Intelligence about any entity, supplier, or risk…',\n className,\n}: AIChatBarProps) {\n return (\n <div\n className={clsx(\n 'flex h-16 items-center gap-3 rounded-2xl border border-default bg-default px-6 shadow-panel',\n className,\n )}\n >\n <span className=\"shrink-0 text-icon-default-secondary\">\n <LuSearch className=\"size-4\" />\n </span>\n <p className=\"flex-1 text-body-sm text-default-tertiary truncate\">{placeholder}</p>\n <button\n type=\"button\"\n className=\"inline-flex shrink-0 items-center gap-2 rounded-xl bg-brand px-4 py-3 text-body-sm font-semibold text-brand-on-brand hover:bg-brand-hover transition-colors\"\n >\n Ask\n <LuArrowRight className=\"size-4\" />\n </button>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { LuArrowRight, LuCpu } from 'react-icons/lu';\n\nexport interface AISuggestionChipProps {\n prompt: string;\n onClick?: () => void;\n className?: string;\n}\n\nexport function AISuggestionChip({ prompt, onClick, className }: AISuggestionChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={clsx(\n 'flex h-12 w-full items-center gap-3 rounded-xl border border-default bg-default px-3 text-left hover:bg-default-hover transition-colors',\n className,\n )}\n >\n <span className=\"shrink-0 text-icon-brand\">\n <LuCpu className=\"size-4\" />\n </span>\n <span className=\"flex-1 text-body-sm text-default truncate\">{prompt}</span>\n <span className=\"shrink-0 text-icon-default-secondary\">\n <LuArrowRight className=\"size-3.5\" strokeWidth={2.5} />\n </span>\n </button>\n );\n}\n","import clsx from 'clsx';\nimport { TagPill } from '../status/tag-pill';\n\nexport interface QuickAction {\n label: string;\n value: string;\n}\n\nexport interface QuickActionsBarProps {\n actions: QuickAction[];\n active?: string;\n onSelect?: (value: string) => void;\n className?: string;\n}\n\nexport function QuickActionsBar({ actions, active, onSelect, className }: QuickActionsBarProps) {\n return (\n <div className={clsx('flex items-center gap-3 flex-wrap', className)}>\n {actions.map((action) => (\n <button\n key={action.value}\n type=\"button\"\n onClick={() => onSelect?.(action.value)}\n className=\"focus:outline-none\"\n >\n <TagPill\n label={action.label}\n tone={active === action.value ? 'brand' : 'default'}\n />\n </button>\n ))}\n </div>\n );\n}\n","/** Soft aurora atmosphere used by the public-facing screens (auth, event\n * onboarding) — mirrors AuroraBackground in pages/intelligence. Blobs are\n * corner-anchored so the effect scales from phones to kiosk displays.\n * Render inside a `relative overflow-hidden` container; content goes on top\n * with `relative`. */\nexport function AuroraBackdrop() {\n return (\n <div className=\"pointer-events-none absolute inset-0\" aria-hidden>\n <div className=\"absolute -left-24 -top-28\" style={{ width: 380, height: 380, background: 'radial-gradient(ellipse, rgba(249,133,133,0.45) 0%, transparent 70%)' }} />\n <div className=\"absolute -top-24 right-[-4%]\" style={{ width: 320, height: 320, background: 'radial-gradient(ellipse, rgba(254,160,160,0.4) 0%, transparent 70%)' }} />\n <div className=\"absolute bottom-[-10%] right-[14%]\" style={{ width: 420, height: 420, background: 'radial-gradient(ellipse, rgba(196,181,253,0.3) 0%, transparent 70%)' }} />\n <div className=\"absolute bottom-[-6%] left-[4%]\" style={{ width: 280, height: 280, background: 'radial-gradient(ellipse, rgba(147,197,253,0.25) 0%, transparent 70%)' }} />\n <div className=\"absolute left-[20%] top-[30%]\" style={{ width: 240, height: 240, background: 'radial-gradient(ellipse, rgba(173,216,255,0.18) 0%, transparent 70%)' }} />\n </div>\n );\n}\n","/** Bespoke icon art with no equivalent in the stroked icon set.\n *\n * The library's icons come from `react-icons/lu`, which is a *stroked* set. What\n * lives here is the small set of *filled* 20×20 marks: swapping these for\n * `LuInfo`/`LuArrowRight`/etc. would turn a solid glyph into an outline — a visual\n * change, not a redraw. They keep their own `viewBox=\"0 0 20 20\"` and\n * `fill=\"currentColor\"`, and size via `className` (e.g. `className=\"size-5\"`).\n *\n * Do not add stroked icons here — import them from `react-icons/lu` instead.\n */\n\ninterface SolidIconProps {\n className?: string;\n}\n\nfunction solid(path: string, displayName: string) {\n const Component = ({ className }: SolidIconProps) => (\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className={className} aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d={path} clipRule=\"evenodd\" />\n </svg>\n );\n Component.displayName = displayName;\n return Component;\n}\n\nexport const SolidAlertTriangle = solid(\n 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n 'SolidAlertTriangle',\n);\n\nexport const SolidShieldCheck = solid(\n 'M10 1.944A11.954 11.954 0 012.166 5C2.056 5.649 2 6.319 2 7c0 5.225 3.34 9.67 8 11.317C14.66 16.67 18 12.225 18 7c0-.682-.057-1.35-.166-2.001A11.954 11.954 0 0110 1.944zm1.414 7.349a1 1 0 00-1.414-1.414L8.5 9.379l-.793-.793a1 1 0 00-1.414 1.414l1.5 1.5a1 1 0 001.414 0l2.207-2.207z',\n 'SolidShieldCheck',\n);\n\nexport const SolidGlobe = solid(\n 'M10 18a8 8 0 100-16 8 8 0 000 16zM4.332 8.027a6.012 6.012 0 011.912-2.706C6.512 5.73 6.974 6 7.5 6A1.5 1.5 0 019 7.5V8a2 2 0 004 0 2 2 0 011.523-1.943A5.977 5.977 0 0116 10c0 .34-.028.675-.083 1H15a2 2 0 00-2 2v2.197A5.973 5.973 0 0110 16v-2a2 2 0 00-2-2 2 2 0 01-2-2 2 2 0 00-1.668-1.973z',\n 'SolidGlobe',\n);\n\nexport const SolidMapPin = solid(\n 'M5.05 4.05a7 7 0 119.9 9.9L10 18.9l-4.95-4.95a7 7 0 010-9.9zM10 11a2 2 0 100-4 2 2 0 000 4z',\n 'SolidMapPin',\n);\n\nexport const SolidClock = solid(\n 'M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z',\n 'SolidClock',\n);\n\nexport const SolidArrowRight = solid(\n 'M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z',\n 'SolidArrowRight',\n);\n\nexport const SolidInfoCircle = solid(\n 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z',\n 'SolidInfoCircle',\n);\n\nexport const SolidCheck = solid(\n 'M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z',\n 'SolidCheck',\n);\n\n/** Chart bars — the one mark here without a `fillRule`/`clipRule` pair. */\nexport function SolidChartBar({ className }: SolidIconProps) {\n return (\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className={className} aria-hidden=\"true\">\n <path d=\"M2 11a1 1 0 011-1h2a1 1 0 011 1v5a1 1 0 01-1 1H3a1 1 0 01-1-1v-5zM8 7a1 1 0 011-1h2a1 1 0 011 1v9a1 1 0 01-1 1H9a1 1 0 01-1-1V7zM14 4a1 1 0 011-1h2a1 1 0 011 1v12a1 1 0 01-1 1h-2a1 1 0 01-1-1V4z\" />\n </svg>\n );\n}\n"],"mappings":"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","names":["clsx","import_clsx","import_jsx_runtime","variantStyles","clsx","sizeStyles","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeStyles","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","Input","clsx","import_react","import_clsx","import_jsx_runtime","wrapGap","labelText","Textarea","clsx","import_react","import_clsx","import_jsx_runtime","wrapGap","labelText","Select","clsx","import_react","import_clsx","import_lu","import_jsx_runtime","wrapGap","labelText","inputBase","iconWrap","DatePicker","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_lu","import_jsx_runtime","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_jsx_runtime","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeStyles","toneStyles","clsx","import_react","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_lu","import_clsx","import_react","import_jsx_runtime","SIZE","import_react","import_clsx","import_lu","import_jsx_runtime","clsx","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_clsx","import_lu","import_jsx_runtime","clsx","import_jsx_runtime","FOOTER_ALIGN","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","SIZE","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","SIZE","clsx","import_clsx","import_jsx_runtime","SIZE","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_clsx","import_jsx_runtime","sizeStyles","clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeStyles","clsx","import_clsx","import_jsx_runtime","SIZE","TONE","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","SIZE","labelClass","clsx","import_clsx","import_jsx_runtime","SIZE","clsx","import_clsx","import_jsx_runtime","SIZE","clsx","import_react","import_clsx","import_jsx_runtime","SIZE","clsx","import_clsx","import_jsx_runtime","SIZE","clsx","import_clsx","import_clsx","import_jsx_runtime","clsx","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","SIZE","WEIGHT","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","GAP","clsx","import_clsx","import_jsx_runtime","SIZE","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","COLUMNS","clsx","import_clsx","import_jsx_runtime","DENSITY","ALIGN","clsx","import_clsx","import_lu","import_jsx_runtime","toneStyles","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_lu","import_jsx_runtime","PasswordInput","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_lu","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_jsx_runtime","import_jsx_runtime"]}
|