@platned/ui 0.1.3 → 0.1.4

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.
@@ -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/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 { 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-text-default',\n signal: 'from-background-brand-tertiary to-cyan-50 text-text-brand',\n ember: 'from-amber-50 to-orange-50 text-text-danger',\n moss: 'from-emerald-50 to-lime-50 text-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-text-brand\">{eyebrow}</p>\n <h2 className=\"mt-2 text-2xl font-semibold text-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-background-brand border border-border-brand text-text-brand-on-brand',\n 'hover:bg-background-brand-hover',\n 'disabled:bg-background-disabled disabled:border-border-disabled disabled:text-text-disabled-on-disabled',\n ),\n neutral: clsx(\n 'bg-background-default border border-border-default text-text-default',\n 'hover:bg-background-default-hover',\n 'disabled:bg-background-disabled disabled:border-border-disabled disabled:text-text-disabled-on-disabled',\n ),\n subtle: clsx(\n 'bg-transparent text-text-neutral',\n 'hover:bg-background-neutral-tertiary',\n 'disabled:bg-background-disabled disabled:border disabled:border-border-disabled disabled:text-text-disabled-on-disabled',\n ),\n danger: clsx(\n 'bg-background-danger border border-border-danger-secondary text-text-danger-on-danger',\n 'hover:bg-background-danger-hover',\n 'disabled:bg-background-disabled disabled:border-border-disabled disabled:text-text-disabled-on-disabled',\n ),\n 'danger-subtle': clsx(\n 'bg-transparent text-text-danger',\n 'hover:bg-background-danger-tertiary',\n 'disabled:bg-background-disabled disabled:border disabled:border-border-disabled disabled:text-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-border-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, type ReactNode } 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 icon: ReactNode;\n}\n\nconst variantStyles: Record<IconButtonVariant, string> = {\n primary: clsx(\n 'bg-background-brand border border-border-brand text-text-brand-on-brand',\n 'hover:bg-background-brand-hover',\n 'disabled:bg-background-disabled disabled:border-border-disabled disabled:text-text-disabled-on-disabled',\n ),\n // Neutral uses secondary background (light gray) for visual weight without a text label\n neutral: clsx(\n 'bg-background-default-secondary border border-border-default text-text-default',\n 'hover:bg-background-default-secondary-hover',\n 'disabled:bg-background-disabled disabled:border-border-disabled disabled:text-text-disabled-on-disabled',\n ),\n subtle: clsx(\n 'bg-transparent text-text-neutral',\n 'hover:bg-background-neutral-tertiary',\n 'disabled:bg-background-disabled disabled:border disabled:border-border-disabled disabled:text-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 icon,\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-border-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed',\n variantStyles[variant],\n sizeStyles[size],\n className,\n )}\n {...props}\n >\n {icon}\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-background-neutral-tertiary p-1 rounded-2xl',\n neutral: 'bg-background-neutral-tertiary p-1 rounded-2xl',\n filter: 'bg-background-default border border-border-default p-1 rounded-xl',\n};\n\nconst selectedStyles: Record<ButtonGroupVariant, string> = {\n primary: clsx(\n 'bg-background-brand border border-border-brand text-text-brand-on-brand',\n 'hover:bg-background-brand-hover',\n ),\n neutral: clsx(\n 'bg-background-default border border-border-default text-text-default',\n 'hover:bg-background-default-hover',\n ),\n filter: clsx(\n 'bg-background-brand text-text-brand-on-brand',\n 'hover:bg-background-brand-hover',\n ),\n};\n\nconst unselectedStyles: Record<ButtonGroupVariant, string> = {\n primary: clsx('bg-transparent text-text-neutral', 'hover:bg-background-neutral-tertiary-hover'),\n neutral: clsx('bg-transparent text-text-neutral', 'hover:bg-background-neutral-tertiary-hover'),\n filter: clsx('text-text-default-secondary', 'hover:text-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-border-brand focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed disabled:text-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=8px (rounded-lg)\nconst shapeStyles: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: '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 shapeStyles[shape],\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-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-background-default-secondary text-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 { 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-background-brand text-text-brand-on-brand'\n : [\n 'border border-border-default bg-background-default text-text-default-secondary',\n 'hover:bg-background-brand-tertiary-hover hover:border-border-brand-tertiary hover:text-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-background-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-text-disabled' : 'text-text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-text-disabled' : 'text-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-background-default text-text-default',\n 'placeholder:text-text-default-tertiary',\n inputBase[size],\n leadingIcon && leadingPad[size],\n trailingIcon && trailingPad[size],\n disabled\n ? 'cursor-not-allowed bg-background-disabled border-border-disabled text-text-disabled placeholder:text-text-disabled'\n : hasError\n ? 'border-border-danger-secondary focus:border-border-danger-secondary focus:ring-1 focus:ring-border-danger-secondary'\n : 'border-border-default focus:border-border-brand-tertiary focus:ring-1 focus:ring-border-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-text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-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-text-disabled' : 'text-text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-text-disabled' : 'text-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-background-default text-text-default',\n 'placeholder:text-text-default-tertiary',\n textareaBase[size],\n disabled\n ? 'cursor-not-allowed bg-background-disabled border-border-disabled text-text-disabled placeholder:text-text-disabled resize-none'\n : hasError\n ? 'border-border-danger-secondary focus:border-border-danger-secondary focus:ring-1 focus:ring-border-danger-secondary'\n : 'border-border-default focus:border-border-brand-tertiary focus:ring-1 focus:ring-border-brand-tertiary',\n )}\n {...props}\n />\n {hasError && (\n <p className={clsx(labelText[size], 'text-text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-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-text-disabled' : 'text-text-default')}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={clsx(labelText[size], disabled ? 'text-text-disabled' : 'text-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-background-default text-text-default',\n selectBase[size],\n disabled\n ? 'cursor-not-allowed bg-background-disabled border-border-disabled text-text-disabled'\n : hasError\n ? 'border-border-danger-secondary focus:border-border-danger-secondary focus:ring-1 focus:ring-border-danger-secondary'\n : 'border-border-default focus:border-border-brand-tertiary focus:ring-1 focus:ring-border-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-text-danger')}>{error}</p>\n )}\n {!hasError && hint && (\n <p className={clsx(labelText[size], 'text-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-background-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-background-brand\" />\n </span>\n );\n }\n\n return (\n <span className=\"size-5 shrink-0 rounded-full border-2 border-border-disabled\" aria-hidden=\"true\" />\n );\n}\n\nfunction ChevronSeparator() {\n return <LuChevronRight className=\"mx-1 size-4 shrink-0 text-text-default-tertiary\" aria-hidden />;\n}\n\nconst labelClass: Record<StepStatus, string> = {\n complete: 'text-text-brand font-semibold',\n active: 'text-text-brand font-semibold',\n upcoming: 'text-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-border-brand focus-visible:ring-offset-1',\n selected\n ? 'border-border-brand bg-background-brand-tertiary'\n : 'border-border-default bg-background-default hover:border-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-background-brand' : 'bg-background-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-background-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-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-text-brand' : 'text-text-default',\n )}\n >\n {title}\n </p>\n {description && (\n <p className=\"mt-0.5 text-body-xs text-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-border-default bg-background-default',\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center bg-background-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-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-background-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-text-default leading-snug\">{primary}</span>\n {secondary && (\n <span className=\"text-body-xs font-normal text-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-text-default-secondary' : 'text-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-border-default bg-background-default-secondary px-2 py-0.5 text-body-tiny font-medium text-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-background-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-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-border-default bg-background-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-text-default-secondary whitespace-nowrap\">\n {label}\n </span>\n </div>\n <span className=\"text-heading font-semibold text-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-border-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-background-brand'\n : 'border border-border-default bg-background-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-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-border-brand focus-visible:ring-offset-1',\n isDragging\n ? 'border-border-brand bg-background-brand-tertiary'\n : 'border-border-default bg-background-default-secondary hover:border-border-brand hover:bg-background-brand-tertiary',\n className,\n )}\n >\n <span className={isDragging ? 'text-text-brand' : 'text-text-default-secondary'}>\n <LuUpload size={20} />\n </span>\n <span className=\"text-body-sm font-medium text-text-default\">Upload file</span>\n <span className=\"text-body-xs text-text-default-secondary text-center\">\n Drag &amp; 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-border-default bg-background-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-border-default px-7 py-6\">\n <h2 className=\"text-heading-sm font-semibold text-text-default leading-snug\">{title}</h2>\n {subtitle && (\n <p className=\"mt-1 text-body-xs text-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-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-background-default-secondary text-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-background-brand-tertiary\">\n <span className=\"text-body-tiny font-semibold text-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-text-default truncate\">{title}</span>\n <span className=\"shrink-0 rounded-md border border-border-default bg-background-default-secondary px-2 py-0.5 text-body-tiny font-medium text-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-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-border-default bg-background-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-text-default\">{fileName}</span>\n {fileSize && (\n <span className=\"text-body-xs text-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-text-brand hover:underline\"\n >\n Replace\n </button>\n <button\n type=\"button\"\n className=\"text-body-xs font-medium text-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-text-default\">{title}</h2>\n {subtitle && (\n <p className=\"mt-0.5 text-body-xs text-text-default-secondary\">{subtitle}</p>\n )}\n </div>\n <IconButton\n variant=\"subtle\"\n size=\"sm\"\n aria-label=\"Close dialog\"\n icon={<LuX size={16} />}\n onClick={onClose}\n />\n </div>\n\n <hr className=\"border-border-default\" />\n\n {/* Body */}\n <div className=\"px-6 py-5\">{children}</div>\n\n {/* Footer */}\n {footer && (\n <>\n <hr className=\"border-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-border-default hover:border-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-border-default bg-background-default-secondary px-1.5 py-0.5 text-body-tiny font-medium text-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-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-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-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-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-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-background-default-secondary\"\n onClick={() => select(opt.role)}\n >\n <RoleBadge role={opt.role} size=\"sm\" />\n <span className=\"text-body-xs text-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-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","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/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 &amp; 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"]}
package/dist/index.d.cts CHANGED
@@ -17,9 +17,8 @@ interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
17
17
  size?: ButtonSize;
18
18
  /** Required for accessibility — no visible text label */
19
19
  'aria-label': string;
20
- icon: ReactNode;
21
20
  }
22
- declare function IconButton({ variant, size, icon, className, ...props }: IconButtonProps): react.JSX.Element;
21
+ declare function IconButton({ variant, size, children, className, ...props }: IconButtonProps): react.JSX.Element;
23
22
 
24
23
  type ButtonGroupVariant = 'primary' | 'neutral' | 'filter';
25
24
  type ButtonGroupAlign = 'justify' | 'start' | 'end' | 'center' | 'stack';
@@ -74,6 +73,14 @@ interface AvatarGroupProps {
74
73
  }
75
74
  declare function AvatarGroup({ children, overflow, spacing, className, }: AvatarGroupProps): react.JSX.Element;
76
75
 
76
+ interface AvatarBlockProps {
77
+ children: ReactNode;
78
+ title: string;
79
+ description?: string;
80
+ className?: string;
81
+ }
82
+ declare function AvatarBlock({ children, title, description, className }: AvatarBlockProps): react.JSX.Element;
83
+
77
84
  interface NavItemProps {
78
85
  icon?: ReactNode;
79
86
  label: string;
@@ -290,4 +297,4 @@ declare function SectionHeading({ eyebrow, title, detail }: {
290
297
  detail?: string;
291
298
  }): react.JSX.Element;
292
299
 
293
- export { Avatar, AvatarGroup, type AvatarGroupProps, type AvatarGroupSpacing, type AvatarImageProps, type AvatarInitialProps, type AvatarProps, type AvatarShape, type AvatarSize, Button, ButtonGroup, type ButtonGroupAlign, type ButtonGroupItem, type ButtonGroupProps, type ButtonGroupVariant, type ButtonProps, type ButtonSize, type ButtonVariant, type ColumnDef, DataTable, DocumentRow, type DocumentRowProps, type DocumentStatus, FileDropZone, type FileDropZoneProps, FormCard, FormCardFooter, type FormCardFooterProps, FormCardHeader, type FormCardHeaderProps, IconButton, type IconButtonProps, type IconButtonVariant, Input, type InputProps, type InputSize, MetricCard, Modal, type ModalProps, MultiSelectCard, type MultiSelectCardProps, NavItem, type NavItemProps, Panel, ROLE_COMBO_OPTIONS, RoleBadge, type RoleBadgeProps, RoleComboBox, type RoleComboBoxProps, type RoleOption, SectionHeading, Select, type SelectOption, type SelectProps, SentimentBadge, SeverityBadge, StatTile, type StatTileProps, type StepItem, type StepStatus, Stepper, type StepperProps, TableCellBadge, TableCellLeadText, TableCellProgress, TableCellStatusPill, TableCellText, Textarea, type TextareaProps, Toggle, type ToggleProps };
300
+ export { Avatar, AvatarBlock, type AvatarBlockProps, AvatarGroup, type AvatarGroupProps, type AvatarGroupSpacing, type AvatarImageProps, type AvatarInitialProps, type AvatarProps, type AvatarShape, type AvatarSize, Button, ButtonGroup, type ButtonGroupAlign, type ButtonGroupItem, type ButtonGroupProps, type ButtonGroupVariant, type ButtonProps, type ButtonSize, type ButtonVariant, type ColumnDef, DataTable, DocumentRow, type DocumentRowProps, type DocumentStatus, FileDropZone, type FileDropZoneProps, FormCard, FormCardFooter, type FormCardFooterProps, FormCardHeader, type FormCardHeaderProps, IconButton, type IconButtonProps, type IconButtonVariant, Input, type InputProps, type InputSize, MetricCard, Modal, type ModalProps, MultiSelectCard, type MultiSelectCardProps, NavItem, type NavItemProps, Panel, ROLE_COMBO_OPTIONS, RoleBadge, type RoleBadgeProps, RoleComboBox, type RoleComboBoxProps, type RoleOption, SectionHeading, Select, type SelectOption, type SelectProps, SentimentBadge, SeverityBadge, StatTile, type StatTileProps, type StepItem, type StepStatus, Stepper, type StepperProps, TableCellBadge, TableCellLeadText, TableCellProgress, TableCellStatusPill, TableCellText, Textarea, type TextareaProps, Toggle, type ToggleProps };
package/dist/index.d.ts CHANGED
@@ -17,9 +17,8 @@ interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
17
17
  size?: ButtonSize;
18
18
  /** Required for accessibility — no visible text label */
19
19
  'aria-label': string;
20
- icon: ReactNode;
21
20
  }
22
- declare function IconButton({ variant, size, icon, className, ...props }: IconButtonProps): react.JSX.Element;
21
+ declare function IconButton({ variant, size, children, className, ...props }: IconButtonProps): react.JSX.Element;
23
22
 
24
23
  type ButtonGroupVariant = 'primary' | 'neutral' | 'filter';
25
24
  type ButtonGroupAlign = 'justify' | 'start' | 'end' | 'center' | 'stack';
@@ -74,6 +73,14 @@ interface AvatarGroupProps {
74
73
  }
75
74
  declare function AvatarGroup({ children, overflow, spacing, className, }: AvatarGroupProps): react.JSX.Element;
76
75
 
76
+ interface AvatarBlockProps {
77
+ children: ReactNode;
78
+ title: string;
79
+ description?: string;
80
+ className?: string;
81
+ }
82
+ declare function AvatarBlock({ children, title, description, className }: AvatarBlockProps): react.JSX.Element;
83
+
77
84
  interface NavItemProps {
78
85
  icon?: ReactNode;
79
86
  label: string;
@@ -290,4 +297,4 @@ declare function SectionHeading({ eyebrow, title, detail }: {
290
297
  detail?: string;
291
298
  }): react.JSX.Element;
292
299
 
293
- export { Avatar, AvatarGroup, type AvatarGroupProps, type AvatarGroupSpacing, type AvatarImageProps, type AvatarInitialProps, type AvatarProps, type AvatarShape, type AvatarSize, Button, ButtonGroup, type ButtonGroupAlign, type ButtonGroupItem, type ButtonGroupProps, type ButtonGroupVariant, type ButtonProps, type ButtonSize, type ButtonVariant, type ColumnDef, DataTable, DocumentRow, type DocumentRowProps, type DocumentStatus, FileDropZone, type FileDropZoneProps, FormCard, FormCardFooter, type FormCardFooterProps, FormCardHeader, type FormCardHeaderProps, IconButton, type IconButtonProps, type IconButtonVariant, Input, type InputProps, type InputSize, MetricCard, Modal, type ModalProps, MultiSelectCard, type MultiSelectCardProps, NavItem, type NavItemProps, Panel, ROLE_COMBO_OPTIONS, RoleBadge, type RoleBadgeProps, RoleComboBox, type RoleComboBoxProps, type RoleOption, SectionHeading, Select, type SelectOption, type SelectProps, SentimentBadge, SeverityBadge, StatTile, type StatTileProps, type StepItem, type StepStatus, Stepper, type StepperProps, TableCellBadge, TableCellLeadText, TableCellProgress, TableCellStatusPill, TableCellText, Textarea, type TextareaProps, Toggle, type ToggleProps };
300
+ export { Avatar, AvatarBlock, type AvatarBlockProps, AvatarGroup, type AvatarGroupProps, type AvatarGroupSpacing, type AvatarImageProps, type AvatarInitialProps, type AvatarProps, type AvatarShape, type AvatarSize, Button, ButtonGroup, type ButtonGroupAlign, type ButtonGroupItem, type ButtonGroupProps, type ButtonGroupVariant, type ButtonProps, type ButtonSize, type ButtonVariant, type ColumnDef, DataTable, DocumentRow, type DocumentRowProps, type DocumentStatus, FileDropZone, type FileDropZoneProps, FormCard, FormCardFooter, type FormCardFooterProps, FormCardHeader, type FormCardHeaderProps, IconButton, type IconButtonProps, type IconButtonVariant, Input, type InputProps, type InputSize, MetricCard, Modal, type ModalProps, MultiSelectCard, type MultiSelectCardProps, NavItem, type NavItemProps, Panel, ROLE_COMBO_OPTIONS, RoleBadge, type RoleBadgeProps, RoleComboBox, type RoleComboBoxProps, type RoleOption, SectionHeading, Select, type SelectOption, type SelectProps, SentimentBadge, SeverityBadge, StatTile, type StatTileProps, type StepItem, type StepStatus, Stepper, type StepperProps, TableCellBadge, TableCellLeadText, TableCellProgress, TableCellStatusPill, TableCellText, Textarea, type TextareaProps, Toggle, type ToggleProps };