@opencxh/ui-kit 3.113.1 → 3.114.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/cn.ts","../src/meeting/MeetingGrid.tsx","../src/meeting/ParticipantTile.tsx","../src/meeting/VideoSurface.tsx","../src/action/Button.tsx","../src/action/ButtonGroup.tsx","../src/content/Icon.tsx","../src/action/FilterChip.tsx","../src/action/Link.tsx","../src/action/SegmentedToggle.tsx","../src/utils/useAnchoredPosition.ts","../src/overlays/Popover.tsx","../src/action/SplitButton.tsx","../src/input/Checkbox.tsx","../src/input/DatePicker.tsx","../src/input/Select.tsx","../src/input/TextField.tsx","../src/input/FolderSelect.tsx","../src/input/SearchableTextField.tsx","../src/input/Switch.tsx","../src/feedback/ContentLoading.tsx","../src/overlays/Dropdown.tsx","../src/content/Table.tsx","../src/navigation/Tabs.tsx","../src/overlays/Modal.tsx","../src/typography/Text.tsx","../src/input/StorageInput.tsx","../src/input/TextArea.tsx","../src/forms/Form.tsx","../src/overlays/ConfirmDialog.tsx","../src/feedback/Badge.tsx","../src/feedback/EmptyState.tsx","../src/feedback/Kbd.tsx","../src/feedback/ProgressBar.tsx","../src/feedback/Spinner.tsx","../src/feedback/StatusDot.tsx","../src/feedback/StepIndicator.tsx","../src/content/AssistantCard.tsx","../src/content/Avatar.tsx","../src/content/AvatarStack.tsx","../src/content/ChannelBadge.tsx","../src/content/Image.tsx","../src/content/List.tsx","../src/content/MessageBubble.tsx","../src/content/KpiCard.tsx","../src/content/PageHeader.tsx","../src/content/PageToolbar.tsx","../src/content/SectionDivider.tsx","../src/content/SettingsRow.tsx","../src/content/SourceChip.tsx","../src/content/View.tsx","../src/navigation/Sidebar.tsx","../src/typography/Heading.tsx","../src/command-palette/CommandPalette.tsx","../src/primitives/Box.tsx","../src/primitives/Card.tsx","../src/federated-resource/index.tsx","../src/error-boundary/index.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\n\n/**\n * Utility function for combining class names\n * Combines clsx for conditional classes with Tailwind merge for deduplication\n */\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n\n/**\n * Utility for creating variant-based class combinations\n */\nexport function createVariants<T extends Record<string, Record<string, string>>>(\n variants: T\n) {\n return (variant: keyof T, value: keyof T[keyof T]) => {\n return variants[variant]?.[value] || '';\n };\n}\n\n/**\n * Utility for creating size-based class combinations\n */\nexport function createSizes<T extends Record<string, string>>(sizes: T) {\n return (size: keyof T) => sizes[size] || '';\n} ","import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface MeetingGridProps {\n tiles: ReactNode[];\n pinned?: ReactNode;\n className?: string;\n}\n\n/**\n * Layout primitive for meeting views. When `pinned` is provided it gets the\n * dominant area and remaining tiles render in a sidebar/strip. Otherwise tiles\n * flow in an auto-sized grid.\n */\nexport function MeetingGrid({ tiles, pinned, className }: MeetingGridProps) {\n if (pinned) {\n return (\n <div className={cn(\"flex flex-col md:flex-row gap-2 h-full min-h-0\", className)}>\n <div className=\"flex-1 min-h-0\">{pinned}</div>\n {tiles.length > 0 && (\n <div className=\"flex md:flex-col gap-2 md:w-48 overflow-auto\">\n {tiles.map((t, i) => (\n <div key={i} className=\"min-w-40 md:min-w-0\">{t}</div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n const cols = tiles.length <= 1 ? \"grid-cols-1\"\n : tiles.length <= 4 ? \"grid-cols-2\"\n : tiles.length <= 9 ? \"grid-cols-3\"\n : \"grid-cols-4\";\n\n return (\n <div className={cn(\"grid gap-2 h-full\", cols, className)}>\n {tiles.map((t, i) => (\n <div key={i}>{t}</div>\n ))}\n </div>\n );\n}\n","import { Mic, MicOff, User, VideoOff } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ParticipantTileProps {\n name: string;\n avatarUrl?: string;\n muted?: boolean;\n speaking?: boolean;\n hasVideo?: boolean;\n videoSlot?: ReactNode;\n className?: string;\n /**\n * Fill the parent box (height + width) instead of keeping a 16:9 aspect\n * ratio. Use for a pinned/main tile inside a bounded container so it fits the\n * available space without deriving its height from its width (which would\n * overflow a wide surface). Grid thumbnails keep the default aspect ratio.\n */\n fill?: boolean;\n}\n\n/**\n * Provider-agnostic participant tile. Shows avatar + name when no video is\n * available; otherwise renders the `videoSlot` passed by the caller (typically\n * a <VideoSurface /> wired to a provider-specific stream renderer).\n */\nexport function ParticipantTile({\n name,\n avatarUrl,\n muted,\n speaking,\n hasVideo,\n videoSlot,\n className,\n fill,\n}: ParticipantTileProps) {\n return (\n <div\n className={cn(\n \"relative rounded-lg overflow-hidden bg-video-surface flex items-center justify-center\",\n fill ? \"h-full w-full\" : \"aspect-video\",\n speaking && \"ring-2 ring-speaking\",\n className,\n )}\n >\n {hasVideo && videoSlot ? (\n <div className=\"absolute inset-0\">{videoSlot}</div>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-gray-300\">\n {avatarUrl ? (\n <img src={avatarUrl} alt={name} className=\"w-16 h-16 rounded-full object-cover\" />\n ) : (\n <div className=\"w-16 h-16 rounded-full bg-video-surface-strong flex items-center justify-center\">\n {hasVideo ? <VideoOff className=\"w-8 h-8\" /> : <User className=\"w-8 h-8\" />}\n </div>\n )}\n </div>\n )}\n\n <div className=\"absolute bottom-2 left-2 flex items-center gap-1.5 px-2 py-1 rounded bg-video-overlay text-white text-xs\">\n {muted ? <MicOff className=\"w-3 h-3\" /> : <Mic className=\"w-3 h-3\" />}\n <span className=\"truncate max-w-35\">{name}</span>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface VideoSurfaceProps {\n /**\n * Provider-specific mount callback. Receives the container element so\n * provider SDKs (Azure, Zoom, etc.) can attach their own video renderer.\n * Return an optional cleanup function.\n */\n attach: (el: HTMLDivElement) => void | (() => void);\n active?: boolean;\n mirrored?: boolean;\n className?: string;\n}\n\n/**\n * Provider-agnostic video tile surface. Owns the DOM slot; the caller wires\n * their SDK's renderer to it via `attach`.\n */\nexport function VideoSurface({ attach, active = true, mirrored = false, className }: VideoSurfaceProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!active || !ref.current) return;\n const cleanup = attach(ref.current);\n return () => {\n if (typeof cleanup === \"function\") cleanup();\n if (ref.current) ref.current.innerHTML = \"\";\n };\n }, [attach, active]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"w-full h-full bg-video-surface-strong overflow-hidden\",\n mirrored && \"[&>*]:scale-x-[-1]\",\n className,\n )}\n />\n );\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * The visual style variant of the button\n */\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'success' | 'warning' | 'danger-solid';\n\n /**\n * The size of the button\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';\n\n /**\n * Whether the button should take the full width of its container\n */\n fullWidth?: boolean;\n\n /**\n * Whether the button is in a loading state\n */\n loading?: boolean;\n\n /**\n * Icon to display before the button text\n */\n leftIcon?: React.ReactNode;\n\n /**\n * Icon to display after the button text\n */\n rightIcon?: React.ReactNode;\n\n /**\n * Whether the button should only display an icon (no text)\n */\n iconOnly?: boolean;\n\n /** `circle` is for a control that is only ever an icon: call answer/reject. */\n shape?: 'default' | 'circle';\n}\n\n/**\n * Variant styles — semantic tokens only, so dark mode needs no extra classes.\n * One primary button per view; everything else is secondary, ghost or a Link.\n */\nconst buttonVariants = {\n primary: 'bg-accent text-accent-fg hover:bg-accent-hover',\n secondary: 'border border-border bg-surface text-text hover:bg-surface-hover',\n outline: 'border border-accent-border text-accent hover:bg-accent-soft',\n ghost: 'text-text-muted hover:bg-surface-hover hover:text-text',\n destructive:\n 'border border-danger-border bg-danger-soft text-danger-fg hover:border-danger',\n // Solid status fills. Reserved for a control whose colour IS the answer —\n // an RSVP, answering or rejecting a call — not for ordinary emphasis.\n success: 'bg-success text-text-inverse hover:opacity-90',\n warning: 'bg-warning text-text-inverse hover:opacity-90',\n 'danger-solid': 'bg-danger text-text-inverse hover:opacity-90',\n};\n\n/** Height comes from the shared control tokens so buttons line up with inputs. */\nconst buttonSizes = {\n xs: 'h-control-xs px-2 text-xs',\n sm: 'h-control-sm px-3 text-sm',\n md: 'h-control-md px-4 text-sm',\n lg: 'h-control-lg px-4 text-sm',\n xl: 'h-control-xl px-6 text-base',\n '2xl': 'h-control-2xl px-6 text-base',\n full: 'h-control-md px-4 text-sm',\n};\n\nconst iconOnlySizes = {\n xs: 'h-control-xs w-6',\n sm: 'h-control-sm w-7',\n md: 'h-control-md w-8',\n lg: 'h-control-lg w-9',\n xl: 'h-control-xl w-10',\n '2xl': 'h-control-2xl w-12',\n full: 'h-control-md w-8',\n};\n\n/**\n * Button component with theme integration and multiple variants\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">Click me</Button>\n * <Button variant=\"outline\" leftIcon={<Icon name={Plus} />}>Add item</Button>\n * <Button iconOnly variant=\"ghost\" size=\"sm\" aria-label=\"Zoeken\">\n * <Icon name={Search} />\n * </Button>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n loading = false,\n leftIcon,\n rightIcon,\n iconOnly = false,\n shape = 'default',\n className,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'inline-flex shrink-0 items-center justify-center gap-2 cursor-pointer font-semibold',\n shape === 'circle' ? 'rounded-full' : 'rounded-md',\n 'transition-colors duration-fast ease-out',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:border-border-subtle',\n 'disabled:bg-surface-hover disabled:text-text-disabled',\n\n buttonVariants[variant],\n iconOnly ? iconOnlySizes[size] : buttonSizes[size],\n\n (fullWidth || size === 'full') && 'w-full',\n loading && 'cursor-wait',\n\n className\n )}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n {...props}\n >\n {loading && (\n <span\n aria-hidden\n className=\"size-icon-md shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent\"\n />\n )}\n\n {!loading && leftIcon && <span className=\"shrink-0\">{leftIcon}</span>}\n\n {!iconOnly && children}\n\n {!loading && rightIcon && <span className=\"shrink-0\">{rightIcon}</span>}\n\n {iconOnly && !loading && !leftIcon && !rightIcon && children}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ButtonGroupProps {\n /** Child buttons to group */\n children: React.ReactNode;\n /** Size of the button group */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Orientation of the button group */\n orientation?: 'horizontal' | 'vertical';\n /** Whether buttons should be attached (no gap) */\n attached?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * ButtonGroup component for grouping related buttons\n */\nexport const ButtonGroup: React.FC<ButtonGroupProps> = ({\n children,\n size = 'md',\n orientation = 'horizontal',\n attached = true,\n className,\n}) => {\n const baseClasses = cn(\n 'inline-flex',\n {\n // Orientation\n 'flex-row': orientation === 'horizontal',\n 'flex-col': orientation === 'vertical',\n \n // Attached styling\n '[&>*:not(:first-child):not(:last-child)]:rounded-none': attached,\n '[&>*:first-child]:rounded-r-none': attached && orientation === 'horizontal',\n '[&>*:last-child]:rounded-l-none': attached && orientation === 'horizontal',\n '[&>*:first-child]:rounded-b-none': attached && orientation === 'vertical',\n '[&>*:last-child]:rounded-t-none': attached && orientation === 'vertical',\n \n // Borders for attached buttons\n '[&>*:not(:first-child)]:-ml-px': attached && orientation === 'horizontal',\n '[&>*:not(:first-child)]:-mt-px': attached && orientation === 'vertical',\n \n // Spacing for non-attached buttons\n 'gap-1': !attached && size === 'xs',\n 'gap-2': !attached && (size === 'sm' || size === 'md'),\n 'gap-3': !attached && (size === 'lg' || size === 'xl'),\n },\n className\n );\n\n return (\n <div className={baseClasses} role=\"group\">\n {children}\n </div>\n );\n}; ","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface IconProps {\n /** Icon component from lucide-react or custom icon */\n icon: React.ComponentType<any>;\n /** Icon size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number;\n /** Icon color */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current';\n /** Whether the icon should be clickable */\n clickable?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional CSS classes */\n className?: string;\n /** Accessibility label */\n 'aria-label'?: string;\n}\n\n/**\n * Icon — the only way icons enter the product. Always a lucide-react component;\n * never a unicode glyph, an emoji or an inline <svg> in feature code.\n *\n * Sizes follow the icon tokens: xs 12 · sm 14 (default in controls) · md 16 ·\n * lg 20 · xl 24.\n */\nconst colorMap: Record<NonNullable<IconProps['color']>, string> = {\n primary: 'text-text',\n secondary: 'text-text-muted',\n accent: 'text-accent',\n success: 'text-success-fg',\n warning: 'text-warning-fg',\n error: 'text-danger-fg',\n info: 'text-info-fg',\n neutral: 'text-text-subtle',\n current: 'text-current',\n};\n\nexport const Icon: React.FC<IconProps> = ({\n icon: IconComponent,\n size = 'md',\n color = 'current',\n clickable = false,\n onClick,\n className,\n 'aria-label': ariaLabel,\n ...props\n}) => {\n const sizeValue = typeof size === 'number' ? size : getSizeValue(size);\n\n const iconClasses = cn(\n 'inline-block shrink-0',\n colorMap[color],\n clickable && [\n 'cursor-pointer rounded-sm transition-opacity duration-fast ease-out hover:opacity-80',\n 'focus-visible:outline-none focus-visible:focus-ring',\n ],\n className\n );\n\n const iconProps = {\n size: sizeValue,\n strokeWidth: 2,\n className: iconClasses,\n onClick: clickable ? onClick : undefined,\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaLabel ? undefined : true,\n role: clickable ? 'button' : undefined,\n tabIndex: clickable ? 0 : undefined,\n onKeyDown: clickable\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined,\n ...props,\n };\n\n return <IconComponent {...iconProps} />;\n};\n\nfunction getSizeValue(size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'): number {\n const sizeMap = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n };\n\n return sizeMap[size];\n}\n","import { ChevronDown, X } from \"lucide-react\";\nimport React from \"react\";\nimport { Icon } from \"../content/Icon\";\nimport { cn } from \"../utils/cn\";\n\nexport interface FilterChipProps {\n /** Chip text (e.g. \"Status\", or \"Status: Open\" when a value is set). */\n label: React.ReactNode;\n /** Leading icon, before the label. */\n icon?: React.ReactNode;\n /**\n * Meaning carried by the chip's own value — a priority, a state. Applies to\n * the resting chip; `active` still wins, because \"you picked this\" outranks\n * \"this is urgent\".\n */\n tone?: \"default\" | \"muted\" | \"warning\" | \"danger\";\n /**\n * `pill` is the filter-bar shape. `rect` is for a chip that labels a property\n * rather than a filter, where a softer corner sits better next to inputs.\n */\n shape?: \"pill\" | \"rect\";\n /** `md` is the default control height; `sm` for a dense toolbar. */\n size?: \"sm\" | \"md\";\n /** Selected/active — renders the filled dark treatment. */\n active?: boolean;\n /** Show a trailing caret (opens a menu the consumer wires with Dropdown/Popover). */\n caret?: boolean;\n /** Open a value clear affordance (✕) — only shown when `active`. */\n onClear?: () => void;\n /** Accessible name for the clear affordance. */\n clearLabel?: string;\n onClick?: () => void;\n /** Native tooltip, for a chip whose label is truncated or abbreviated. */\n title?: string;\n className?: string;\n}\n\nconst tones: Record<NonNullable<FilterChipProps[\"tone\"]>, string> = {\n default: \"border-border text-text-muted hover:bg-surface-hover hover:text-text\",\n muted: \"border-border text-text-subtle hover:bg-surface-hover hover:text-text\",\n warning: \"border-warning-border bg-warning-soft text-warning-fg hover:bg-surface-hover\",\n danger: \"border-danger-border bg-danger-soft text-danger-fg hover:bg-surface-hover\",\n};\n\n/**\n * Filter chip — the inbox filter bar and the thread priority/assign/inbox/tags\n * menus. Presentational: it renders the chip (active = filled accent, inactive =\n * outlined) with an optional caret + clear; the consumer wires the actual menu\n * with the existing `Dropdown` / `Popover`.\n *\n * @example\n * ```tsx\n * <FilterChip label={status ? `Status: ${status}` : \"Status\"} caret\n * active={!!status} onClick={openMenu} onClear={() => setStatus(null)} />\n * ```\n */\nexport function FilterChip({\n label,\n icon,\n tone = \"default\",\n shape = \"pill\",\n size = \"md\",\n active = false,\n caret = false,\n onClear,\n clearLabel = \"Filter wissen\",\n onClick,\n title,\n className,\n}: FilterChipProps) {\n const showClear = active && Boolean(onClear);\n\n // The chip and its clear affordance are two separate controls, so the shell is\n // a plain span: a <button> may not contain another <button>. Without a clear,\n // there is only one control and the shell collapses onto it.\n const radius = shape === \"pill\" ? \"rounded-full\" : \"rounded-md\";\n\n const shell = cn(\n // A button's default cursor is an arrow, so it has to be asked for.\n \"inline-flex cursor-pointer select-none items-center text-sm font-semibold\",\n size === \"sm\" ? \"h-control-sm\" : \"h-control-md\",\n \"transition-colors duration-fast ease-out\",\n radius,\n // Picking a value outranks whatever the value happens to mean.\n active ? \"bg-accent text-accent-fg\" : cn(\"border\", tones[tone]),\n className,\n );\n\n const body = (\n <>\n {icon}\n {label}\n {caret && <Icon icon={ChevronDown} size=\"xs\" />}\n </>\n );\n\n const bodyClasses = cn(\n \"inline-flex items-center gap-1.5 pl-3\",\n radius,\n showClear ? \"pr-1.5\" : \"pr-3\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n );\n\n if (!showClear) {\n return (\n <button type=\"button\" title={title} onClick={onClick} className={cn(shell, bodyClasses)}>\n {body}\n </button>\n );\n }\n\n return (\n <span className={shell} title={title}>\n <button type=\"button\" onClick={onClick} className={bodyClasses}>\n {body}\n </button>\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={onClear}\n className={cn(\"inline-flex h-full items-center pr-3 focus-visible:outline-none focus-visible:focus-ring\", radius)}\n >\n <Icon icon={X} size=\"xs\" />\n </button>\n </span>\n );\n}\n","import React from 'react';\nimport { ExternalLink } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Link variant */\n variant?: 'default' | 'subtle' | 'underline' | 'button';\n /** Link size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Color theme */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral';\n /** Whether the link is disabled */\n disabled?: boolean;\n /** Whether to show external link icon */\n external?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Child content */\n children: React.ReactNode;\n}\n\n/** Same steps as Text: xs 11 · sm 12 · md 13 · lg 14 · xl 16. */\nconst sizeMap: Record<NonNullable<LinkProps['size']>, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n xl: 'text-lg',\n};\n\nconst colorMap: Record<NonNullable<LinkProps['color']>, string> = {\n primary: 'text-text hover:text-info-fg hover:underline',\n info: 'text-info-fg hover:underline',\n secondary: 'text-text-muted hover:text-text',\n neutral: 'text-text-muted hover:text-text',\n accent: 'text-accent hover:underline',\n success: 'text-success-fg hover:underline',\n warning: 'text-warning-fg hover:underline',\n error: 'text-danger-fg hover:underline',\n};\n\n/** `variant=\"button\"` uses the soft surface of the matching status token. */\nconst buttonBackgroundMap: Record<NonNullable<LinkProps['color']>, string> = {\n primary: 'bg-accent-soft',\n accent: 'bg-accent-soft',\n secondary: 'bg-surface-hover',\n neutral: 'bg-surface-hover',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n error: 'bg-danger-soft',\n info: 'bg-info-soft',\n};\n\n/**\n * Link component with theme integration and accessibility features.\n * Use for navigation; use Button for actions.\n */\nexport const Link: React.FC<LinkProps> = ({\n variant = 'default',\n size = 'md',\n color = 'primary',\n disabled = false,\n external = false,\n className,\n children,\n href,\n target,\n rel,\n ...props\n}) => {\n const isExternal =\n external || (href && (href.startsWith('http') || href.startsWith('mailto:')));\n\n const baseClasses = cn(\n 'inline-flex items-center gap-1 underline-offset-2',\n 'transition-colors duration-fast ease-out',\n 'focus-visible:outline-none focus-visible:focus-ring',\n\n sizeMap[size],\n !disabled && colorMap[color],\n\n variant === 'subtle' && 'no-underline opacity-70 hover:opacity-100',\n variant === 'underline' && 'underline decoration-1 hover:decoration-2',\n variant === 'button' && [\n 'h-control-md rounded-md px-3 font-semibold no-underline hover:no-underline',\n buttonBackgroundMap[color],\n ],\n\n disabled && 'pointer-events-none cursor-not-allowed text-text-disabled opacity-50',\n\n className\n );\n\n const linkProps = {\n ...props,\n href: disabled ? undefined : href,\n target: isExternal ? '_blank' : target,\n rel: isExternal ? 'noopener noreferrer' : rel,\n 'aria-disabled': disabled || undefined,\n };\n\n return (\n <a className={baseClasses} {...linkProps}>\n {children}\n {isExternal && <ExternalLink className=\"size-icon-sm shrink-0\" aria-hidden />}\n </a>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SegmentedOption<T extends string> {\n value: T;\n label: React.ReactNode;\n}\n\nexport interface SegmentedToggleProps<T extends string> {\n options: SegmentedOption<T>[];\n value: T;\n onChange: (value: T) => void;\n /** Control height. */\n size?: \"sm\" | \"md\";\n className?: string;\n /** Accessible group label. */\n \"aria-label\"?: string;\n}\n\n/** Track height stays one step below the equivalent Button so it nests in toolbars. */\nconst sizes = {\n sm: \"h-control-sm px-3 text-sm\",\n md: \"h-control-md px-3 text-sm\",\n};\n\n/**\n * Segmented pill toggle (focus \"Feed / Eén tegelijk\", settings \"Persoonlijk /\n * Bedrijf\"). Track = surface-hover, active segment = surface. No shadow.\n *\n * @example\n * ```tsx\n * <SegmentedToggle\n * value={layout}\n * onChange={setLayout}\n * options={[{ value: \"feed\", label: \"Feed\" }, { value: \"one\", label: \"Eén tegelijk\" }]}\n * />\n * ```\n */\nexport function SegmentedToggle<T extends string>({\n options,\n value,\n onChange,\n size = \"sm\",\n className,\n \"aria-label\": ariaLabel,\n}: SegmentedToggleProps<T>) {\n return (\n <div\n role=\"tablist\"\n aria-label={ariaLabel}\n className={cn(\"inline-flex gap-0.5 rounded-md bg-surface-hover p-0.5\", className)}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n role=\"tab\"\n aria-selected={active}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"inline-flex items-center justify-center rounded-sm\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n sizes[size],\n active ? \"bg-surface text-text font-semibold\" : \"text-text-muted hover:text-text\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\n\nexport interface AnchoredPositionOptions {\n /** Gap between the anchor and the panel, in px. */\n gap?: number;\n /** Match the panel's width to the anchor — what a select wants, a menu does not. */\n matchWidth?: boolean;\n /** Preferred side. Flips automatically when there is no room. */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n}\n\n/**\n * Position a floating panel against its trigger, in viewport coordinates.\n *\n * Two problems this solves, both of which a plain `absolute` panel has:\n * an ancestor with `overflow-hidden` (a bordered form panel, a scroll area)\n * clips the panel, and a trigger near the bottom of the window opens a panel\n * that runs off-screen. Fixed coordinates escape every ancestor, and the\n * placement flips upward when the space below is too small.\n *\n * Recomputes on scroll and resize while open, so the panel tracks its trigger\n * instead of detaching when the page moves under it.\n */\nexport function useAnchoredPosition(\n open: boolean,\n anchorRef: RefObject<HTMLElement | null>,\n { gap = 6, matchWidth = false, placement = \"bottom-start\" }: AnchoredPositionOptions = {}\n): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n // Layout effect, not effect: measure and place before the browser paints,\n // otherwise the panel is visible at the wrong spot for a frame.\n useLayoutEffect(() => {\n if (!open) return;\n\n const place = () => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const rect = anchor.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n // Flip up only when below genuinely cannot hold a usable panel and above\n // has more room — flipping into an equally cramped space helps nobody.\n const wantsTop = placement.startsWith(\"top\");\n const flip = wantsTop\n ? spaceAbove < 200 && spaceBelow > spaceAbove\n : spaceBelow < 200 && spaceAbove > spaceBelow;\n const onTop = wantsTop !== flip;\n\n const next: CSSProperties = { position: \"fixed\" };\n\n if (onTop) {\n next.bottom = window.innerHeight - rect.top + gap;\n next.maxHeight = Math.max(120, spaceAbove - gap * 2);\n } else {\n next.top = rect.bottom + gap;\n next.maxHeight = Math.max(120, spaceBelow - gap * 2);\n }\n\n if (placement.endsWith(\"end\")) next.right = window.innerWidth - rect.right;\n else next.left = rect.left;\n\n if (matchWidth) next.width = rect.width;\n\n setStyle(next);\n };\n\n place();\n // `true` captures scrolls on any ancestor, not just the window.\n window.addEventListener(\"scroll\", place, true);\n window.addEventListener(\"resize\", place);\n return () => {\n window.removeEventListener(\"scroll\", place, true);\n window.removeEventListener(\"resize\", place);\n };\n }, [open, anchorRef, gap, matchWidth, placement]);\n\n return style;\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useAnchoredPosition } from \"../utils/useAnchoredPosition\";\n\nexport interface PopoverProps {\n /** Element that toggles the popover */\n trigger: React.ReactNode;\n /**\n * Panel content. Pass a function to receive a `close` callback so rows can\n * dismiss the popover after acting.\n */\n children: React.ReactNode | ((close: () => void) => React.ReactNode);\n /** Panel placement relative to the trigger. Flips when there is no room. */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Additional CSS classes for the panel */\n className?: string;\n /**\n * Layout classes for the wrapper around the trigger. Needed when the trigger\n * has to fill a positioned box — a calendar event in a week grid, say —\n * because the wrapper is `inline-flex` by default.\n */\n rootClassName?: string;\n /** Layout classes for the trigger button itself. */\n triggerClassName?: string;\n /** Whether the trigger is disabled */\n disabled?: boolean;\n /**\n * Accessible name for the trigger button. Needed when the trigger is\n * icon-only, since the panel content is not announced by the trigger.\n */\n triggerLabel?: string;\n}\n\n/**\n * Generic popover with click-outside / Escape dismissal. The panel is\n * `position: fixed` (computed from the trigger) so it escapes any\n * overflow-hidden or rounded-card ancestor instead of being clipped.\n */\nexport const Popover: React.FC<PopoverProps> = ({\n trigger,\n children,\n placement = \"bottom-start\",\n className,\n rootClassName,\n triggerClassName,\n disabled = false,\n triggerLabel,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n // Shared with Select, DatePicker and Dropdown: flips up when the trigger sits\n // near the bottom, caps the height to the space available, and re-measures on\n // scroll so the panel keeps tracking its trigger.\n const panelStyle = useAnchoredPosition(isOpen, triggerRef, { placement });\n\n useEffect(() => {\n if (!isOpen) return;\n const onDown = (event: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n const onEsc = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onEsc);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onEsc);\n };\n }, [isOpen]);\n\n const handleToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n if (disabled) return;\n setIsOpen((open) => !open);\n };\n\n const close = () => setIsOpen(false);\n\n return (\n <div ref={rootRef} className={cn(\"relative inline-flex\", rootClassName)}>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n aria-label={triggerLabel}\n aria-expanded={isOpen}\n className={cn(\n \"inline-flex items-center\",\n disabled && \"cursor-not-allowed opacity-50\",\n triggerClassName,\n )}\n >\n {trigger}\n </button>\n\n {isOpen && (\n <div\n className={cn(\n // overflow-y-auto pairs with the hook's max-height: without it a\n // panel taller than the space available is simply cut off.\n \"fixed z-overlay overflow-y-auto rounded-lg border border-border bg-surface shadow-overlay\",\n className,\n )}\n style={panelStyle}\n >\n {typeof children === \"function\" ? children(close) : children}\n </div>\n )}\n </div>\n );\n};\n","import { ChevronDown } from \"lucide-react\";\nimport React from \"react\";\nimport { Popover } from \"../overlays/Popover\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./Button\";\n\nexport interface SplitButtonOption {\n id: string;\n label: string;\n onClick: () => void;\n variant?: \"default\" | \"destructive\";\n /** Optioneel icoon vóór het label in het menu. */\n icon?: React.ReactNode;\n}\n\nexport interface SplitButtonProps {\n label: string;\n onClick: () => void;\n variant?: \"primary\" | \"secondary\" | \"outline\";\n size?: \"sm\" | \"md\";\n icon?: React.ReactNode;\n options: SplitButtonOption[];\n disabled?: boolean;\n /** Spinner in de primaire helft; blokkeert beide helften. */\n loading?: boolean;\n /**\n * Waar het optie-menu opent. Gebruik een `top-*` placement wanneer de knop\n * onderaan zijn container staat (bv. een sticky verzendbalk).\n */\n menuPlacement?: \"bottom-end\" | \"bottom-start\" | \"top-end\" | \"top-start\";\n /** Accessible naam voor de chevron-knop. */\n menuLabel?: string;\n}\n\n/** Zelfde varianttokens als Button, zodat beide helften één knop lijken. */\nconst variantStyles = {\n primary: \"bg-accent text-accent-fg hover:bg-accent-hover\",\n secondary: \"border border-border bg-surface text-text hover:bg-surface-hover\",\n outline: \"border border-accent-border text-accent hover:bg-accent-soft\",\n};\n\nconst chevronSizes = {\n sm: \"h-control-sm w-7\",\n md: \"h-control-md w-8\",\n};\n\n/**\n * Knop met een primaire actie plus een chevron-menu voor varianten daarvan.\n * De primaire helft is een gewone `Button` (zelfde varianten/loading-gedrag);\n * het menu loopt via `Popover`, dus het is `position: fixed` en wordt niet\n * geklipt door een scrollende of overflow-hidden voorouder.\n *\n * Zonder opties rendert dit precies een `Button` — geen chevron.\n */\nexport function SplitButton({\n label,\n onClick,\n variant = \"primary\",\n size = \"md\",\n icon,\n options,\n disabled = false,\n loading = false,\n menuPlacement = \"bottom-end\",\n menuLabel = \"More options\",\n}: SplitButtonProps) {\n const isDisabled = disabled || loading;\n const hasMenu = options.length > 0;\n\n return (\n <div className=\"inline-flex items-center gap-px\">\n <Button\n variant={variant}\n size={size}\n onClick={onClick}\n disabled={disabled}\n loading={loading}\n leftIcon={icon}\n className={cn(hasMenu && \"rounded-r-none\")}\n >\n {label}\n </Button>\n {hasMenu && (\n <Popover\n placement={menuPlacement}\n disabled={isDisabled}\n triggerLabel={menuLabel}\n className=\"min-w-menu py-1\"\n trigger={\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex items-center justify-center rounded-md rounded-l-none\",\n \"transition-colors duration-fast ease-out\",\n variantStyles[variant],\n chevronSizes[size],\n isDisabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n <ChevronDown className=\"size-icon-md\" />\n </span>\n }\n >\n {(close) => (\n <>\n {options.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n onClick={() => {\n option.onClick();\n close();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n option.variant === \"destructive\"\n ? \"text-danger-fg hover:bg-danger-soft\"\n : \"text-text hover:bg-surface-hover\",\n )}\n >\n {option.icon && (\n <span className=\"shrink-0\">{option.icon}</span>\n )}\n {option.label}\n </button>\n ))}\n </>\n )}\n </Popover>\n )}\n </div>\n );\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /**\n * The label for the checkbox\n */\n label?: string;\n\n /**\n * Helper text to display below the checkbox\n */\n helperText?: string;\n\n /**\n * Error message to display when the checkbox is invalid\n */\n error?: string;\n\n /**\n * The size of the checkbox\n */\n size?: 'sm' | 'md' | 'lg' | 'full';\n\n /**\n * Whether the checkbox is in an indeterminate state\n */\n indeterminate?: boolean;\n\n /**\n * `circle` marks a completion tick — a task, a subtask — as opposed to the\n * square used for selecting rows. The shape is the whole signal, so a user\n * can tell \"done\" from \"selected\" at a glance.\n */\n shape?: \"square\" | \"circle\";\n\n /**\n * Additional class name for the container\n */\n containerClassName?: string;\n\n /**\n * Additional class name for the label\n */\n labelClassName?: string;\n}\n\n/** The box grows with the field size, so a checkbox row reads as the same\n * weight as the inputs beside it instead of a small mark floating next to them. */\nconst checkboxSizes = {\n sm: 'size-checkbox-sm',\n md: 'size-checkbox',\n lg: 'size-checkbox-lg',\n full: 'size-checkbox',\n};\n\n/** Row height matches the control tokens so a checkbox lines up in a form. */\nconst rowSizes = {\n sm: 'min-h-control-sm',\n md: 'min-h-control-md',\n lg: 'min-h-control-lg',\n full: 'min-h-control-md',\n};\n\nconst labelSizes = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n full: 'text-md',\n};\n\n/**\n * Checkbox component with theme integration.\n *\n * Uses the native input with `accent-color`, so the checked fill is the accent\n * token and dark mode needs no extra classes.\n *\n * @example\n * ```tsx\n * <Checkbox label=\"Voorwaarden accepteren\" />\n * <Checkbox label=\"Alles selecteren\" indeterminate />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n helperText,\n error,\n size = 'md',\n indeterminate = false,\n shape = 'square',\n containerClassName,\n labelClassName,\n className,\n id,\n ...props\n },\n ref\n ) => {\n const reactId = React.useId();\n const checkboxId = id || `checkbox-${reactId}`;\n const hasError = Boolean(error);\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n\n // Keep the forwarded ref and the internal one in sync so `indeterminate`\n // works whether or not the consumer passes a ref.\n const setRefs = React.useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [ref]\n );\n\n React.useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <div className={cn('flex flex-col', containerClassName)}>\n <div className={cn('flex items-center gap-3', rowSizes[size])}>\n <input\n ref={setRefs}\n id={checkboxId}\n type=\"checkbox\"\n aria-invalid={hasError || undefined}\n className={cn(\n 'shrink-0 border bg-surface-input accent-accent',\n shape === 'circle' ? 'rounded-full' : 'rounded-sm',\n 'transition-colors duration-fast ease-out',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover',\n\n checkboxSizes[size],\n hasError ? 'border-danger-border' : 'border-border-strong',\n\n className\n )}\n {...props}\n />\n\n {label && (\n <div className=\"flex-1\">\n <label\n htmlFor={checkboxId}\n className={cn(\n 'cursor-pointer',\n hasError ? 'text-danger-fg' : 'text-text',\n labelSizes[size],\n labelClassName\n )}\n >\n {label}\n </label>\n\n {helperText && !error && (\n <p className=\"mt-0.5 text-xs text-text-subtle\">{helperText}</p>\n )}\n </div>\n )}\n </div>\n\n {error && <p className=\"mt-1 text-xs text-danger-fg\">{error}</p>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Calendar, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport { useAnchoredPosition } from '../utils/useAnchoredPosition';\nimport { Icon } from '../content/Icon';\n\nexport interface DatePickerProps {\n /** Current date value */\n value?: Date | null;\n /** Change handler */\n onChange?: (date: Date | null) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether the input is required */\n required?: boolean;\n /** Input size */\n size?: 'sm' | 'md' | 'lg' | 'full';\n /** Additional CSS classes */\n className?: string;\n /** Minimum selectable date */\n minDate?: Date;\n /** Maximum selectable date */\n maxDate?: Date;\n /** Date format for display */\n format?: 'MM/dd/yyyy' | 'dd/MM/yyyy' | 'yyyy-MM-dd';\n /**\n * Also pick a time. The display gains `HH:mm`, the panel gains a time field,\n * and choosing a day keeps the time already on the value instead of resetting\n * it to midnight. Replaces a native `datetime-local`.\n */\n withTime?: boolean;\n}\n\nconst CalendarIcon = () => <Icon icon={Calendar} size=\"md\" color=\"current\" />;\nconst ChevronLeftIcon = () => <Icon icon={ChevronLeft} size=\"md\" color=\"current\" />;\nconst ChevronRightIcon = () => <Icon icon={ChevronRight} size=\"md\" color=\"current\" />;\n\n/**\n * DatePicker component with calendar popup\n */\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(({\n value,\n onChange,\n placeholder = 'Select date',\n disabled = false,\n required = false,\n size = 'md',\n className,\n minDate,\n maxDate,\n format = 'MM/dd/yyyy',\n withTime = false,\n}, ref) => {\n const [isOpen, setIsOpen] = useState(false);\n const [currentMonth, setCurrentMonth] = useState(() => value || new Date());\n const containerRef = useRef<HTMLDivElement>(null);\n const fieldRef = useRef<HTMLDivElement>(null);\n // Fixed against the field: an absolute panel is clipped by the form panel's\n // overflow and opens below the fold when the field sits near the bottom.\n //\n // Anchored on the field, not on containerRef — the panel is a child of the\n // container, so on the first open (before the fixed position lands) it counted\n // towards the container's own height and the panel placed itself a panel's\n // length too low. Closing and reopening looked fine because the measurement\n // from the previous open was still in state.\n const panelStyle = useAnchoredPosition(isOpen, fieldRef);\n\n // Close calendar when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // Format date for display\n const formatDate = (date: Date | null): string => {\n if (!date) return '';\n\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n\n const datePart =\n format === 'dd/MM/yyyy' ? `${day}/${month}/${year}`\n : format === 'yyyy-MM-dd' ? `${year}-${month}-${day}`\n : `${month}/${day}/${year}`;\n\n return withTime ? `${datePart} ${formatTime(date)}` : datePart;\n };\n\n /** `HH:mm`, the value shape a native time input expects. */\n const formatTime = (date: Date) =>\n `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n\n const handleTimeChange = (next: string) => {\n const [hours, minutes] = next.split(':').map(Number);\n if (Number.isNaN(hours) || Number.isNaN(minutes)) return;\n // Time can be set before a day is picked; fall back to today.\n const base = value ? new Date(value) : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.(base);\n };\n\n // Get calendar days for current month\n const getCalendarDays = () => {\n const year = currentMonth.getFullYear();\n const month = currentMonth.getMonth();\n\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const startDate = new Date(firstDay);\n startDate.setDate(startDate.getDate() - firstDay.getDay());\n\n const days = [];\n const current = new Date(startDate);\n\n for (let i = 0; i < 42; i++) {\n days.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n\n return days;\n };\n\n const handleDateSelect = (date: Date) => {\n const isInCurrentMonth = date.getMonth() === currentMonth.getMonth();\n if (!isInCurrentMonth) return;\n\n // Check min/max constraints\n if (minDate && date < minDate) return;\n if (maxDate && date > maxDate) return;\n\n if (withTime) {\n // Carry the time across, otherwise picking a day silently resets it to 00:00.\n const picked = new Date(date);\n picked.setHours(value?.getHours() ?? 0, value?.getMinutes() ?? 0, 0, 0);\n onChange?.(picked);\n // Stay open: the time still has to be set.\n return;\n }\n\n onChange?.(date);\n setIsOpen(false);\n };\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1));\n };\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1));\n };\n\n const handleClear = () => {\n onChange?.(null);\n setIsOpen(false);\n };\n\n const inputClasses = cn(\n 'w-full border border-border rounded-md transition-colors duration-fast',\n 'bg-surface text-text',\n 'placeholder:text-text-muted',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled',\n {\n 'h-control-sm px-3 text-sm': size === 'sm',\n 'h-control-md px-3 text-base': size === 'md',\n 'h-control-lg px-3 text-base': size === 'lg',\n 'h-control-md w-full px-3 text-base': size === 'full',\n },\n className\n );\n\n const calendarDays = getCalendarDays();\n const monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Input */}\n <div ref={fieldRef} className=\"relative\">\n <input\n ref={ref}\n type=\"text\"\n value={formatDate(value ?? null)}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className={cn(inputClasses, 'pr-10 cursor-pointer')}\n />\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-text-muted hover:text-text-muted\"\n >\n <CalendarIcon />\n </button>\n </div>\n\n {/* Calendar Popup */}\n {isOpen && (\n <div style={panelStyle} className=\"fixed z-overlay overflow-auto rounded-lg border border-border bg-surface p-4 shadow-overlay min-w-panel\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-1 hover:bg-surface-hover rounded\"\n >\n <ChevronLeftIcon />\n </button>\n <h3 className=\"text-sm font-medium text-text\">\n {monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h3>\n <button\n onClick={handleNextMonth}\n className=\"p-1 hover:bg-surface-hover rounded\"\n >\n <ChevronRightIcon />\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map((day) => (\n <div key={day} className=\"text-xs font-medium text-text-muted text-center py-1\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n const isCurrentMonth = date.getMonth() === currentMonth.getMonth();\n const isSelected = value && date.toDateString() === value.toDateString();\n const isToday = date.toDateString() === new Date().toDateString();\n const isDisabled =\n !isCurrentMonth ||\n (minDate && date < minDate) ||\n (maxDate && date > maxDate);\n\n return (\n <button\n key={index}\n onClick={() => !isDisabled && handleDateSelect(date)}\n disabled={isDisabled}\n className={cn(\n 'w-8 h-8 text-sm rounded transition-colors duration-fast',\n {\n 'text-text hover:bg-surface-hover':\n isCurrentMonth && !isSelected && !isDisabled,\n 'bg-accent text-accent-fg': isSelected,\n 'bg-surface-hover text-text': isToday && !isSelected,\n 'text-text-muted cursor-not-allowed': isDisabled,\n }\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {withTime && (\n <div className=\"mt-3 flex items-center gap-2 border-t border-border pt-3\">\n <label htmlFor=\"datepicker-time\" className=\"text-sm text-text-muted\">\n Tijd\n </label>\n <input\n id=\"datepicker-time\"\n type=\"time\"\n value={value ? formatTime(value) : ''}\n onChange={(e) => handleTimeChange(e.target.value)}\n className=\"h-control-sm rounded-md border border-border bg-surface-input px-2 text-sm text-text focus-visible:outline-none focus-visible:focus-ring\"\n />\n </div>\n )}\n\n {/* Footer */}\n <div className=\"flex justify-between items-center mt-4 pt-3 border-t border-border\">\n <button\n onClick={handleClear}\n className=\"text-sm text-text-muted hover:text-text\"\n >\n Clear\n </button>\n <button\n onClick={() => setIsOpen(false)}\n className=\"text-sm text-info-fg hover:underline\"\n >\n Close\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}); ","import { ChevronDownIcon } from \"lucide-react\";\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useAnchoredPosition } from \"../utils/useAnchoredPosition\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string | string[];\n onChange?: (value: string | string[]) => void;\n label?: string;\n helperText?: string;\n error?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n fullWidth?: boolean;\n options: SelectOption[];\n placeholder?: string;\n containerClassName?: string;\n labelClassName?: string;\n searchable?: boolean;\n multiple?: boolean;\n\n /** Vrije invoer toestaan (Enter of klik op “Voeg toe…”) */\n allowCreate?: boolean;\n\n /** Optioneel: zelf bepalen hoe een nieuwe optie eruit ziet */\n onCreateOption?: (label: string) => SelectOption;\n}\n\nconst selectSizes = {\n sm: \"h-control-sm px-3 text-sm\",\n md: \"h-control-md px-3 text-sm\",\n lg: \"h-control-lg px-3 text-base\",\n full: \"h-control-md w-full px-3 text-sm\",\n};\n\nconst norm = (s: string) => s.trim().toLowerCase();\n\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n label,\n helperText,\n error,\n size = \"md\",\n fullWidth = false,\n options,\n placeholder,\n containerClassName,\n labelClassName,\n className,\n id,\n searchable,\n multiple,\n value,\n onChange,\n allowCreate,\n onCreateOption,\n ...props\n },\n ref\n ) => {\n const selectId = id || `select-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\n const [isOpen, setIsOpen] = React.useState(false);\n const [searchTerm, setSearchTerm] = React.useState(\"\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n // Anchored to the control itself, not the container — the container also\n // holds the label, which would push the panel down by its height.\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n // Fixed, not absolute: an absolute panel is clipped by the form panel's\n // overflow and runs off-screen when the field sits near the bottom.\n const panelStyle = useAnchoredPosition(isOpen, triggerRef, { matchWidth: true });\n\n // Lokale kopie van opties, waarin we ook vrije waarden kunnen bijmengen\n const [localOptions, setLocalOptions] =\n React.useState<SelectOption[]>(options);\n\n React.useImperativeHandle(ref, () => containerRef.current!);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Helper: check of optie (op value/label) al bestaat\n const includesOption = React.useCallback(\n (opts: SelectOption[], needle: string) =>\n opts.some(\n (o) =>\n norm(o.value) === norm(needle) || norm(o.label) === norm(needle)\n ),\n []\n );\n\n // Voeg ontbrekende current value(s) toe aan de opties\n const ensureValuesInOptions = React.useCallback(\n (baseOptions: SelectOption[], currentValue?: string | string[]) => {\n const out = [...baseOptions];\n\n const addIfMissing = (v?: string) => {\n const val = (v ?? \"\").trim();\n if (!val) return;\n if (!includesOption(out, val)) {\n out.push({ value: val, label: val });\n }\n };\n\n if (Array.isArray(currentValue)) {\n currentValue.forEach(addIfMissing);\n } else {\n addIfMissing(currentValue);\n }\n\n return out;\n },\n [includesOption]\n );\n\n // Wanneer \"options\" verandert, merge + zorg dat de huidige value(s) erin staan\n React.useEffect(() => {\n setLocalOptions((prev) => {\n // Start vanuit de nieuwe options prop\n const next = [...options];\n\n // Ook eerder lokaal aangemaakte opties behouden (zonder duplicates)\n prev.forEach((opt) => {\n if (\n !includesOption(next, opt.value) &&\n !includesOption(next, opt.label)\n ) {\n next.push(opt);\n }\n });\n\n // En zorg dat de actuele value(s) aanwezig zijn\n return ensureValuesInOptions(next, value);\n });\n }, [options, value, ensureValuesInOptions, includesOption]);\n\n const handleSelect = (optionValue: string) => {\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : [];\n const newValues = currentValues.includes(optionValue)\n ? currentValues.filter((v) => v !== optionValue)\n : [...currentValues, optionValue];\n onChange?.(newValues);\n } else {\n onChange?.(optionValue);\n setIsOpen(false);\n setSearchTerm(\"\");\n }\n };\n\n const selectedOption = multiple\n ? null\n : localOptions.find((o) => o.value === value);\n\n const selectedOptions = multiple\n ? localOptions.filter(\n (o) => Array.isArray(value) && value.includes(o.value)\n )\n : [];\n\n const filteredOptions =\n searchable && searchTerm\n ? localOptions.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase())\n )\n : localOptions;\n\n const canCreate =\n Boolean(allowCreate) &&\n Boolean(searchable) &&\n Boolean(searchTerm.trim()) &&\n !includesOption(localOptions, searchTerm);\n\n const createOption = (labelToCreate: string) => {\n const clean = labelToCreate.trim();\n if (!clean) return;\n\n const newOption: SelectOption = onCreateOption?.(clean) ?? {\n value: clean,\n label: clean,\n };\n\n if (\n includesOption(localOptions, newOption.value) ||\n includesOption(localOptions, newOption.label)\n ) {\n // al aanwezig; selecteer hem gewoon\n handleSelect(newOption.value);\n setSearchTerm(\"\");\n if (!multiple) setIsOpen(false);\n return;\n }\n\n setLocalOptions((prev) => [...prev, newOption]);\n handleSelect(newOption.value);\n\n setSearchTerm(\"\");\n if (!multiple) setIsOpen(false);\n };\n\n const getDisplayValue = () => {\n if (multiple) {\n if (selectedOptions.length > 0) {\n return selectedOptions.map((o) => o.label).join(\", \");\n }\n return placeholder || \"Select options\";\n }\n return selectedOption?.label || placeholder || \"Select an option\";\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative flex flex-col\",\n fullWidth && \"w-full\",\n containerClassName\n )}\n {...props}\n >\n {label && (\n <label\n htmlFor={selectId}\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"block text-xs font-semibold uppercase tracking-label mb-1.5\",\n hasError\n ? \"text-danger-fg\"\n : \"text-text-muted\",\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <button\n ref={triggerRef}\n type=\"button\"\n id={selectId}\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-md border transition-colors duration-fast text-left\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n \"disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled\",\n \"bg-surface\",\n selectSizes[size],\n hasError\n ? \"border-danger-border text-danger-fg focus-visible:focus-ring\"\n : \"border-border text-text\",\n className\n )}\n >\n <span className=\"truncate flex-1 min-w-0\">{getDisplayValue()}</span>\n <ChevronDownIcon\n size={16}\n className={cn(\n \"shrink-0 opacity-60 transition-transform duration-fast\",\n isOpen && \"rotate-180\"\n )}\n />\n </button>\n\n {isOpen && (\n <div style={panelStyle} className=\"fixed z-overlay flex flex-col overflow-hidden rounded-lg border border-border bg-surface shadow-overlay\">\n {searchable && (\n <div className=\"p-2\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && canCreate) {\n e.preventDefault();\n createOption(searchTerm);\n }\n }}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded-md border\",\n \"text-text border-border focus-visible:outline-none focus-visible:focus-ring\"\n )}\n />\n </div>\n )}\n\n {canCreate && (\n <div\n className={cn(\n \"cursor-pointer px-3 py-1.5 text-sm\",\n \"text-info-fg hover:bg-surface-hover\"\n )}\n onClick={() => createOption(searchTerm)}\n >\n +: “{searchTerm.trim()}”\n </div>\n )}\n\n <ul className=\"min-h-0 flex-1 overflow-auto py-1\">\n {placeholder && !multiple && (\n <li\n className=\"cursor-pointer px-3 py-1.5 text-sm text-text-muted hover:bg-surface-hover\"\n onClick={() => {\n onChange?.(\"\");\n setIsOpen(false);\n }}\n >\n {placeholder}\n </li>\n )}\n {filteredOptions.map((option) => {\n const isSelected = multiple\n ? Array.isArray(value) && value.includes(option.value)\n : value === option.value;\n return (\n <li\n key={option.value}\n onClick={() =>\n !option.disabled && handleSelect(option.value)\n }\n className={cn(\n \"cursor-pointer px-3 py-1.5 text-sm\",\n \"text-text\",\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:bg-surface-hover\",\n isSelected && \"bg-accent-soft text-accent font-semibold\"\n )}\n >\n <div className=\"flex items-center\">\n {multiple && (\n <input\n type=\"checkbox\"\n checked={isSelected}\n readOnly\n className=\"mr-3 h-4 w-4 rounded border-border [&:not(:checked)]:bg-surface-input text-accent \"\n />\n )}\n <span>{option.label}</span>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n className={cn(\n \"mt-1 text-xs\",\n hasError ? \"text-danger-fg\" : \"text-text-muted\"\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = \"Select\";\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TextFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /**\n * The label for the input field\n */\n label?: string;\n\n /**\n * Helper text to display below the input\n */\n helperText?: string;\n\n /**\n * Error message to display when the input is invalid\n */\n error?: string;\n\n /**\n * The size of the input field\n */\n size?: 'sm' | 'md' | 'lg' | 'full';\n\n /**\n * Whether the input should take the full width of its container\n */\n fullWidth?: boolean;\n\n /**\n * Icon to display at the start of the input\n */\n startIcon?: React.ReactNode;\n\n /**\n * Icon to display at the end of the input\n */\n endIcon?: React.ReactNode;\n\n /**\n * Whether the input is in a loading state\n */\n loading?: boolean;\n\n /**\n * Additional class name for the container\n */\n containerClassName?: string;\n\n /**\n * Additional class name for the label\n */\n labelClassName?: string;\n}\n\n/** Heights come from the control tokens — inputs, buttons and selects align. */\nconst inputSizes = {\n sm: 'h-control-sm px-3 text-sm',\n md: 'h-control-md px-3 text-base',\n lg: 'h-control-lg px-3 text-base',\n full: 'h-control-md px-3 text-base',\n};\n\n/** Shared with TextArea / Select / DatePicker: uppercase section label. */\nexport const fieldLabelClasses =\n 'mb-1.5 block text-xs font-semibold uppercase tracking-label';\n\n/**\n * TextField component with theme integration and validation states\n *\n * @example\n * ```tsx\n * <TextField label=\"E-mail\" type=\"email\" placeholder=\"naam@bedrijf.nl\" />\n * <TextField label=\"Zoeken\" startIcon={<Icon icon={Search} />} />\n * <TextField label=\"Wachtwoord\" type=\"password\" error=\"Verplicht veld\" />\n * ```\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n label,\n helperText,\n error,\n size = 'md',\n fullWidth = false,\n startIcon,\n endIcon,\n loading = false,\n containerClassName,\n labelClassName,\n className,\n id,\n ...props\n },\n ref\n ) => {\n const reactId = React.useId();\n const inputId = id || `textfield-${reactId}`;\n const hasError = Boolean(error);\n const describedBy = error || helperText ? `${inputId}-description` : undefined;\n\n return (\n <div className={cn('flex flex-col', fullWidth && 'w-full', containerClassName)}>\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n fieldLabelClasses,\n hasError ? 'text-danger-fg' : 'text-text-subtle',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n {startIcon && (\n <span className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-text-muted\">\n {startIcon}\n </span>\n )}\n\n <input\n ref={ref}\n id={inputId}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn(\n 'block w-full rounded-md border bg-surface-input text-text',\n 'transition-colors duration-fast ease-out',\n 'placeholder:text-text-subtle',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled',\n\n inputSizes[size],\n\n startIcon && 'pl-9',\n (endIcon || loading) && 'pr-9',\n\n hasError\n ? 'border-danger-border bg-danger-soft'\n : 'border-border hover:border-border-strong',\n\n className\n )}\n {...props}\n />\n\n {(endIcon || loading) && (\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-text-muted\">\n {loading ? (\n <span\n aria-hidden\n className=\"size-icon-md animate-spin rounded-full border-2 border-border border-t-transparent\"\n />\n ) : (\n endIcon\n )}\n </span>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n id={describedBy}\n className={cn('mt-1 text-xs', hasError ? 'text-danger-fg' : 'text-text-subtle')}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = 'TextField';\n","import { VirtualMount } from \"@opencxh/domain\";\nimport { useEffect, useState } from \"react\";\nimport { Select } from \"./Select\";\nimport { TextField } from \"./TextField\";\n\nexport interface FolderDestination {\n /** Storage folder (mount) id. */\n folderId?: string;\n /** Optional sub-path template, e.g. \"{yyyy}/{mm}/{dd}\". */\n pathTemplate?: string;\n}\n\nexport interface FolderSelectProps {\n value?: FolderDestination;\n onChange?: (value: FolderDestination) => void;\n /** Loads the selectable storage folders (the shell wires this to storage.mount). */\n onListFolders?: () => Promise<{ data: VirtualMount[] }> | undefined;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n placeholder?: string;\n templatePlaceholder?: string;\n /** Show the sub-path template input (default true). */\n showTemplate?: boolean;\n}\n\n/**\n * Destination picker for a storage folder (+ optional sub-path template).\n * Unlike StorageInput (which picks/uploads a file), this selects *where* things\n * should be written. Used by the `type: \"folder\"` form field.\n */\nexport function FolderSelect({\n value,\n onChange,\n onListFolders,\n disabled,\n size = \"md\",\n placeholder,\n templatePlaceholder,\n showTemplate = true,\n}: FolderSelectProps) {\n const [folders, setFolders] = useState<VirtualMount[]>([]);\n\n useEffect(() => {\n let active = true;\n Promise.resolve(onListFolders?.())\n .then((res) => {\n if (active && res) setFolders(res.data ?? []);\n })\n .catch(() => {\n /* folder list unavailable */\n });\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const v = value ?? {};\n\n return (\n <div className=\"flex flex-col gap-2\">\n <Select\n size={size}\n fullWidth\n value={v.folderId ?? \"\"}\n options={folders.map((f) => ({ value: f.id, label: f.name }))}\n placeholder={placeholder ?? \"Select a folder\"}\n onChange={(val) => onChange?.({ ...v, folderId: val as string })}\n />\n {showTemplate && (\n <TextField\n size={size}\n disabled={disabled ?? false}\n value={v.pathTemplate ?? \"\"}\n placeholder={templatePlaceholder ?? \"Sub-path e.g. {yyyy}/{mm}/{dd} (optional)\"}\n onChange={(e) => onChange?.({ ...v, pathTemplate: e.target.value })}\n />\n )}\n </div>\n );\n}\n","import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ChevronDown, Loader2, Search } from \"lucide-react\";\n\nconst cn = (...classes: string[]) => classes.filter(Boolean).join(\" \");\n\nconst SearchIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <Search {...props} strokeWidth={1.5} aria-hidden />\n);\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <ChevronDown {...props} strokeWidth={1.5} aria-hidden />\n);\n\nconst inputSizes = {\n sm: \"h-control-sm px-3 text-sm\",\n md: \"h-control-md px-3 text-base\",\n lg: \"h-control-lg px-3 text-base\",\n full: \"h-control-md w-full px-3 text-base\",\n};\n\nconst iconSizes = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n full: \"h-6 w-6\",\n};\n\nexport interface SearchableTextFieldOption {\n value: string;\n label: string;\n}\n\nexport interface SearchableTextFieldProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"onSelect\"\n > {\n label?: string;\n helperText?: string;\n error?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n fullWidth?: boolean;\n startIcon?: React.ReactNode;\n loading?: boolean;\n containerClassName?: string;\n labelClassName?: string;\n\n options: SearchableTextFieldOption[];\n onRemoteSearch?: (searchTerm: string) => Promise<void>;\n\n onSelect?: (value: string) => void;\n debounceTime?: number;\n /**\n * Selector-modus: toon bij openen (focus/chevron) álle opties, ook wanneer de\n * huidige waarde een reeds geselecteerde optie is. Pas zodra de gebruiker zelf\n * typt wordt er gefilterd. Handig wanneer het veld eerder een keuzelijst is dan\n * een vrije zoekopdracht (bv. een afzender-selector).\n */\n showAllOnOpen?: boolean;\n}\n\nexport const SearchableTextField = forwardRef<\n HTMLInputElement,\n SearchableTextFieldProps\n>(\n (\n {\n label,\n helperText,\n error,\n size = \"md\",\n fullWidth = false,\n startIcon = <SearchIcon />,\n loading: externalLoading = false,\n containerClassName,\n labelClassName,\n className,\n id,\n options,\n onRemoteSearch,\n onSelect,\n debounceTime = 500,\n showAllOnOpen = false,\n value: propValue,\n onChange,\n ...props\n },\n ref\n ) => {\n const inputId =\n id || `searchfield-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\n const containerRef = useRef(null);\n const inputRef = useRef(null);\n\n const [inputValue, setInputValue] = useState(propValue || \"\");\n const [isOpen, setIsOpen] = useState(false);\n const [isSearchingRemote, setIsSearchingRemote] = useState(false);\n // In selector-modus: is er sinds het openen daadwerkelijk getypt? Zo niet,\n // dan tonen we de volledige lijst i.p.v. te filteren op de gekozen waarde.\n const [typedSinceOpen, setTypedSinceOpen] = useState(false);\n\n useEffect(() => {\n if (propValue !== undefined) {\n setInputValue(propValue);\n }\n }, [propValue]);\n\n const filteredOptions = useMemo(() => {\n if (showAllOnOpen && !typedSinceOpen) return options;\n if (!inputValue) return options;\n const lowerCaseInput = String(inputValue).toLowerCase();\n return options.filter((option) =>\n String(option.label).toLowerCase().includes(lowerCaseInput)\n );\n }, [inputValue, options, showAllOnOpen, typedSinceOpen]);\n\n useEffect(() => {\n if (!onRemoteSearch || !inputValue) {\n setIsSearchingRemote(false);\n return;\n }\n\n const handler = setTimeout(async () => {\n setIsSearchingRemote(true);\n try {\n await onRemoteSearch(String(inputValue));\n } catch (e) {\n console.error(\"Remote search failed:\", e);\n } finally {\n setIsSearchingRemote(false);\n }\n }, debounceTime);\n\n return () => {\n clearTimeout(handler);\n setIsSearchingRemote(false);\n };\n }, [inputValue, debounceTime, onRemoteSearch]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !(containerRef.current as HTMLElement).contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setIsOpen(true);\n setTypedSinceOpen(true);\n if (onChange) {\n onChange(e);\n }\n };\n\n const handleSelect = (option: SearchableTextFieldOption) => {\n setInputValue(option.label);\n setIsOpen(false);\n setTypedSinceOpen(false);\n if (onSelect) {\n onSelect(option.value);\n }\n };\n\n const handleFocus = () => {\n // Open dropdown alleen als er opties zijn of remote search beschikbaar is\n if (options.length > 0 || onRemoteSearch) {\n setIsOpen(true);\n setTypedSinceOpen(false);\n }\n };\n\n const loading = externalLoading || isSearchingRemote;\n\n const showDropdown = isOpen && (filteredOptions.length > 0 || loading);\n\n const resolvedRef = useMemo(() => ref || inputRef, [ref]);\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n fullWidth ? \"w-full\" : \"\",\n containerClassName || \"\",\n \"relative\"\n )}\n ref={containerRef}\n >\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"block text-sm font-medium mb-1\",\n hasError ? \"text-danger-fg\" : \"text-text\",\n labelClassName || \"\"\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n {startIcon && (\n <div className=\"absolute left-0 pl-3 flex items-center pointer-events-none h-full\">\n <span className={cn(\"text-text-muted\", iconSizes[size])}>\n {startIcon}\n </span>\n </div>\n )}\n\n <input\n ref={resolvedRef}\n id={inputId}\n value={inputValue}\n onChange={handleChange}\n onFocus={handleFocus}\n className={cn(\n // Base styles\n \"block w-full rounded-md border bg-surface-input transition-colors duration-fast ease-out\",\n \"placeholder:text-text-subtle focus-visible:outline-none focus-visible:focus-ring\",\n \"disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled\",\n\n // Size styles\n inputSizes[size],\n\n // Icon padding\n startIcon ? \"pl-10\" : \"\",\n \"pr-10\", // Altijd padding rechts voor de dropdown/loading icon\n\n // State styles\n hasError\n ? \"border-danger-border text-danger-fg focus-visible:focus-ring\"\n : \"border-border text-text\",\n\n className || \"\"\n )}\n {...props}\n />\n\n {/* END ICON (Laden/Dropdown) */}\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center\">\n {loading || externalLoading ? (\n // Loading Spinner\n <Loader2\n className={cn(\"animate-spin text-info-fg\", iconSizes[size])}\n aria-hidden\n />\n ) : (\n // Dropdown Chevron\n <ChevronDownIcon\n className={cn(\n \"text-text-muted cursor-pointer transition-transform\",\n iconSizes[size],\n isOpen ? \"rotate-180\" : \"rotate-0\"\n )}\n onClick={() => {\n setIsOpen((prev) => {\n if (!prev) setTypedSinceOpen(false);\n return !prev;\n });\n }}\n />\n )}\n </div>\n </div>\n\n {/* DROPDOWN LIJST */}\n {showDropdown && (\n <ul\n className=\"absolute z-10 mt-1 w-full bg-surface border border-border rounded-lg shadow-lg max-h-60 overflow-auto top-full\"\n role=\"listbox\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option: SearchableTextFieldOption) => (\n <li\n key={option.value}\n className=\"px-4 py-2 cursor-pointer text-text hover:bg-accent-soft hover:text-accent transition-colors\"\n onClick={() => handleSelect(option)}\n role=\"option\"\n aria-selected={inputValue === option.label}\n >\n {option.label}\n </li>\n ))\n ) : (\n <li className=\"px-4 py-2 text-text-muted\">\n {loading || externalLoading\n ? \"Zoeken op afstand...\"\n : \"Geen resultaten gevonden.\"}\n </li>\n )}\n </ul>\n )}\n\n {/* HELPER/ERROR TEKST */}\n {(error || helperText) && (\n <p\n className={cn(\n \"mt-1 text-xs\",\n hasError ? \"text-danger-fg\" : \"text-text-muted\"\n )}\n >\n {error || helperText}\n </p>\n )}\n\n {/* Eenvoudig voorbeeld van de huidige status voor demo */}\n {onRemoteSearch && (\n <p className=\"mt-2 text-xs text-success-fg\">\n Huidige zoekterm (niet-gedebounced): {String(inputValue)}\n </p>\n )}\n </div>\n );\n }\n);\n\nSearchableTextField.displayName = \"SearchableTextField\";\n","import React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"checked\" | \"onChange\"> {\n /**\n * Current state. Deliberately required and never held internally: several\n * call sites drive this from an optimistic update that rolls back on a failed\n * request, and internal state would silently swallow the rollback.\n */\n checked: boolean;\n onChange: (checked: boolean) => void;\n /** Text beside the switch. Omit it and pass `aria-label` instead. */\n label?: React.ReactNode;\n disabled?: boolean;\n}\n\n/**\n * On/off switch for a setting that applies immediately.\n *\n * Use `Checkbox` instead when the value is part of a form the user submits —\n * a switch says \"this is now on\", a checkbox says \"include this when I save\".\n *\n * @example\n * ```tsx\n * <Switch checked={syncEnabled} onChange={setSyncEnabled} label=\"Agenda synchroniseren\" />\n * ```\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ checked, onChange, label, disabled = false, className, ...props }, ref) => {\n const track = (\n <span\n aria-hidden\n className={cn(\n \"relative inline-flex size-switch-track shrink-0 items-center rounded-full\",\n \"transition-colors duration-fast ease-out\",\n checked ? \"bg-accent\" : \"bg-surface-hover\",\n disabled && \"opacity-50\"\n )}\n >\n <span\n className={cn(\n \"absolute left-0.5 size-switch-knob rounded-full bg-surface shadow-overlay\",\n \"transition-transform duration-fast ease-out\",\n checked && \"translate-switch\"\n )}\n />\n </span>\n );\n\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-2\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n className\n )}\n >\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n disabled={disabled}\n onChange={(event) => onChange(event.target.checked)}\n className=\"peer sr-only\"\n {...props}\n />\n {/* The ring lives on the track, since the input itself is visually hidden. */}\n <span className=\"inline-flex rounded-full peer-focus-visible:focus-ring\">{track}</span>\n {label && <span className=\"text-sm text-text\">{label}</span>}\n </label>\n );\n }\n);\n\nSwitch.displayName = \"Switch\";\n","import { ReactNode } from 'react';\n\nexport interface ContentLoadingProps {\n /**\n * `page` (default) fills the route with its own `<main>` shell and padding.\n * `inline` drops both, so the skeleton can sit inside an existing panel,\n * card or scroll container without nesting a second `<main>` landmark.\n */\n variant?: \"page\" | \"inline\";\n\n /**\n * Optional custom skeleton content (overrides default)\n */\n children?: ReactNode;\n\n /**\n * If true, renders a table-style skeleton\n */\n showTableSkeleton?: boolean;\n\n /**\n * Number of table columns (default: 6)\n */\n tableColumns?: number;\n\n /**\n * Number of table rows (default: 8)\n */\n tableRows?: number;\n}\n\nexport function ContentLoading({\n variant = \"page\",\n children,\n showTableSkeleton = false,\n tableColumns = 6,\n tableRows = 8,\n}: ContentLoadingProps) {\n // `inline` renders the skeleton bare; `page` wraps it in the route shell.\n const Shell = ({ children: inner }: { children: ReactNode }) =>\n variant === \"inline\" ? (\n <>{inner}</>\n ) : (\n <main className=\"flex-1 bg-surface p-6\">{inner}</main>\n );\n\n if (children) {\n return (\n <Shell>\n <div className=\"w-full max-w-6xl mx-auto animate-pulse\">\n {children}\n </div>\n </Shell>\n );\n }\n\n return (\n <Shell>\n <div className=\"w-full mx-auto space-y-6 animate-pulse\">\n\n {/* Title Bar */}\n {!showTableSkeleton && (\n <>\n <div className=\"h-6 w-1/4 rounded-sm bg-surface-hover\" />\n\n {/* Description Lines */}\n <div className=\"space-y-2\">\n <div className=\"h-4 w-3/4 rounded-sm bg-surface-hover\" />\n <div className=\"h-4 w-1/2 rounded-sm bg-surface-hover\" />\n </div>\n </>\n )}\n\n {/* Optional Table Skeleton */}\n {showTableSkeleton && (\n <div className=\"rounded-lg overflow-hidden\">\n {/* Table header */}\n <div className=\"grid gap-2 bg-surface-hover p-3\"\n style={{ gridTemplateColumns: `repeat(${tableColumns}, minmax(0, 1fr))` }}>\n {Array.from({ length: tableColumns }).map((_, idx) => (\n <div\n key={`header-${idx}`}\n className=\"h-4 w-2/3 rounded-sm bg-border-strong\"\n />\n ))}\n </div>\n\n {/* Table rows */}\n {Array.from({ length: tableRows }).map((_, rowIdx) => (\n <div\n key={`row-${rowIdx}`}\n className=\"grid gap-2 border-t border-border-subtle p-3\"\n style={{ gridTemplateColumns: `repeat(${tableColumns}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: tableColumns }).map((_, colIdx) => (\n <div\n key={`cell-${rowIdx}-${colIdx}`}\n className=\"h-4 w-full rounded-sm bg-surface-hover\"\n />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n </Shell>\n );\n}\n","import { Check } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useAnchoredPosition } from \"../utils/useAnchoredPosition\";\n\nexport interface DropdownOption {\n /** Option value */\n value: string;\n /** Option label */\n label: string;\n /** Option icon */\n icon?: React.ReactNode;\n /** Whether option is disabled */\n disabled?: boolean;\n /** Whether option is a divider */\n divider?: boolean;\n /** Optional description for the option */\n description?: string;\n /** Nested sub-options */\n children?: DropdownOption[];\n}\n\nexport interface DropdownProps {\n /** Dropdown trigger element */\n trigger: React.ReactNode;\n /** Dropdown options */\n options: DropdownOption[];\n /** Selected value */\n value?: string | Record<string, string | string[]>;\n /** Change handler */\n onSelect?: (value: string, parentValue?: string) => void;\n /** Dropdown placement */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Whether dropdown is disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Show check mark for selected option */\n showCheck?: boolean;\n /** Header text for the dropdown */\n header?: string | React.ReactNode;\n}\n\n/**\n * Dropdown component for menus and select-like interfaces\n */\nexport const Dropdown: React.FC<DropdownProps> = ({\n trigger,\n options,\n value,\n onSelect,\n placement = \"bottom-start\",\n disabled = false,\n className,\n showCheck = true,\n header,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredOption, setHoveredOption] = useState<\n string | Record<string, string | string[]> | null\n >(null);\n const [submenuPosition, setSubmenuPosition] = useState({ top: 0, left: 0 });\n // Menu is position:fixed (computed from the trigger) so it escapes any\n // overflow-hidden / rounded-card ancestor instead of being clipped.\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const submenuRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuPos = useAnchoredPosition(isOpen, triggerRef, { placement });\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n /** Enabled option buttons in the open menu, in DOM order. */\n const menuItems = () =>\n Array.from(\n menuRef.current?.querySelectorAll<HTMLButtonElement>(\"button[data-option-value]:not(:disabled)\") ?? []\n );\n\n // Move focus into the menu when it opens, so the keyboard lands somewhere\n // useful instead of on the page behind it.\n useEffect(() => {\n if (isOpen) menuItems()[0]?.focus();\n }, [isOpen]);\n\n /** Roving focus: ↓/↑ wrap through the options, Home/End jump to the ends. */\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n\n const items = menuItems();\n if (items.length === 0) return;\n event.preventDefault();\n\n const current = items.indexOf(document.activeElement as HTMLButtonElement);\n const next =\n event.key === \"Home\" ? 0\n : event.key === \"End\" ? items.length - 1\n : event.key === \"ArrowDown\" ? (current + 1) % items.length\n : (current - 1 + items.length) % items.length;\n\n items[next]?.focus();\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n (!dropdownRef.current.contains(event.target as Node) ||\n (submenuRef.current &&\n !submenuRef.current.contains(event.target as Node)))\n ) {\n setIsOpen(false);\n setHoveredOption(null);\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n\n // Close dropdown on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n setHoveredOption(null);\n // Hand focus back to the trigger; otherwise it falls to <body> and the\n // keyboard user loses their place.\n triggerRef.current?.focus();\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen]);\n\n // Calculate submenu position when hovering over an option with children\n useEffect(() => {\n if (hoveredOption && dropdownRef.current) {\n const hoveredElement = dropdownRef.current.querySelector(\n `[data-option-value=\"${hoveredOption}\"]`\n );\n if (hoveredElement) {\n const rect = hoveredElement.getBoundingClientRect();\n setSubmenuPosition({\n top: rect.top,\n left: rect.right + 8,\n });\n }\n }\n }, [hoveredOption]);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n const handleTriggerClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n if (disabled) return;\n setIsOpen(!isOpen);\n setHoveredOption(null);\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n };\n\n const handleOptionClick = (\n event: React.MouseEvent<HTMLButtonElement>,\n option: DropdownOption,\n parentValue?: string\n ) => {\n event.stopPropagation();\n if (!option.disabled && !option.divider) {\n // Only close dropdown if option has no children\n if (!option.children || option.children.length === 0) {\n onSelect?.(option.value, parentValue);\n setIsOpen(false);\n setHoveredOption(null);\n }\n }\n };\n\n const handleOptionHover = (option: DropdownOption) => {\n // Clear any existing timeout\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n\n if (option.children && option.children.length > 0) {\n setHoveredOption(option.value);\n } else {\n setHoveredOption(null);\n }\n };\n\n const handleOptionLeave = (option: DropdownOption) => {\n // Only hide if the option has children, and add a small delay\n if (option.children && option.children.length > 0) {\n hideTimeoutRef.current = setTimeout(() => {\n setHoveredOption(null);\n }, 150); // 150ms delay\n } else {\n setHoveredOption(null);\n }\n };\n\n const handleSubmenuOptionClick = (\n event: React.MouseEvent<HTMLButtonElement>,\n option: DropdownOption,\n parentValue?: string\n ) => {\n event.stopPropagation();\n if (!option.disabled && !option.divider) {\n onSelect?.(option.value, parentValue);\n setIsOpen(false);\n setHoveredOption(null);\n }\n };\n\n const dropdownClasses = cn(\n \"fixed z-overlay min-w-menu bg-surface rounded-lg shadow-overlay border border-border\",\n \"max-h-60 overflow-auto\"\n );\n\n const submenuClasses = cn(\n \"fixed z-overlay min-w-menu bg-surface rounded-lg shadow-overlay border border-border\",\n \"max-h-60 overflow-auto\"\n );\n\n return (\n <div\n ref={dropdownRef}\n className={cn(\n \"relative flex flex-row items-center justify-center rounded-lg hover:bg-surface-hover\",\n className\n )}\n >\n {/* Trigger */}\n <button\n ref={triggerRef}\n onClick={handleTriggerClick}\n disabled={disabled}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n className={cn(\"inline-flex items-center justify-center\", {\n \"opacity-50 cursor-not-allowed\": disabled,\n })}\n >\n {trigger}\n </button>\n\n {/* Dropdown menu */}\n {isOpen && (\n <div ref={menuRef} className={dropdownClasses} style={menuPos} onKeyDown={handleMenuKeyDown}>\n <div className=\"p-2\" role=\"menu\">\n {/* Header */}\n {header && (\n typeof header === \"string\" ? (\n <div className=\"text-xs font-medium text-text-muted uppercase tracking-label px-3 py-2\">\n {header}\n </div>\n ) : (\n header\n )\n )}\n\n {options.map((option, index) => {\n if (option.divider) {\n return (\n <div\n key={`divider-${index}`}\n className=\"border-t border-border my-2\"\n />\n );\n }\n\n const hasChildren = option.children && option.children.length > 0;\n const isHovered = hoveredOption === option.value;\n\n return (\n <div key={option.value} className=\"relative group\">\n <button\n data-option-value={option.value}\n role=\"menuitem\"\n aria-haspopup={hasChildren ? \"menu\" : undefined}\n onClick={(event) => handleOptionClick(event, option)}\n onMouseEnter={() => handleOptionHover(option)}\n onMouseLeave={() => handleOptionLeave(option)}\n disabled={option.disabled}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-3 py-1.5 text-sm text-text transition-colors duration-fast ease-out hover:bg-surface-hover focus-visible:outline-none focus-visible:focus-ring\",\n {\n \"opacity-50 cursor-not-allowed\": option.disabled,\n \"bg-surface-hover\":\n isHovered && hasChildren,\n }\n )}\n >\n <div className=\"flex items-center space-x-2 min-w-0\">\n {option.icon && (\n <span className=\"flex-shrink-0\">{option.icon}</span>\n )}\n <div className=\"flex flex-col items-start min-w-0\">\n <span className=\"font-base truncate\">\n {option.label}\n </span>\n {option.description && (\n <span className=\"text-xs text-text-muted\">\n {option.description}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n {showCheck && value === option.value && (\n <Check className=\"size-icon-md shrink-0 text-success-fg\" aria-hidden />\n )}\n {hasChildren && (\n <span className=\"text-text-muted text-xs\">\n ▶\n </span>\n )}\n </div>\n </button>\n\n {/* Nested submenu */}\n {hasChildren && isHovered && (\n <div\n ref={submenuRef}\n className={submenuClasses}\n style={{\n top: `${submenuPosition.top}px`,\n left: `${submenuPosition.left}px`,\n }}\n onMouseEnter={() => {\n // Clear any pending hide timeout\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n setHoveredOption(option.value);\n }}\n onMouseLeave={() => {\n // Add a small delay before hiding\n hideTimeoutRef.current = setTimeout(() => {\n setHoveredOption(null);\n }, 150);\n }}\n >\n <div className=\"p-2\">\n {option.children!.map((childOption, childIndex) => {\n if (childOption.divider) {\n return (\n <div\n key={`divider-${childIndex}`}\n className=\"border-t border-border my-2\"\n />\n );\n }\n\n const isSelected =\n (typeof value === \"object\" &&\n value[option.value] &&\n value[option.value].includes(\n childOption.value\n )) ||\n value === childOption.value;\n\n return (\n <button\n key={childOption.value}\n onClick={(event) =>\n handleSubmenuOptionClick(\n event,\n childOption,\n option.value\n )\n }\n disabled={childOption.disabled}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-3 py-1.5 text-sm text-text transition-colors duration-fast ease-out hover:bg-surface-hover\",\n {\n \"opacity-50 cursor-not-allowed\":\n childOption.disabled,\n }\n )}\n >\n <div className=\"flex items-center space-x-2 min-w-0\">\n {childOption.icon && (\n <span className=\"flex-shrink-0\">\n {childOption.icon}\n </span>\n )}\n <div className=\"flex flex-col items-start min-w-0\">\n <span className=\"font-base truncate\">\n {childOption.label}\n </span>\n {childOption.description && (\n <span className=\"text-xs text-text-muted\">\n {childOption.description}\n </span>\n )}\n </div>\n </div>\n\n {showCheck && isSelected && (\n <Check className=\"size-icon-md shrink-0 text-success-fg\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n })}\n\n {/* Footer with count */}\n {(() => {\n const totalOptions = options.reduce((count, option) => {\n if (option.divider) return count;\n const childCount = option.children\n ? option.children.filter((child) => !child.divider).length\n : 0;\n return count + 1 + childCount;\n }, 0);\n\n return (\n totalOptions > 1 && (\n <div className=\"border-t border-border mt-2 pt-2\">\n <div className=\"text-xs text-text-muted px-3 py-1\">\n {totalOptions} options available\n </div>\n </div>\n )\n );\n })()}\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, ChevronsLeft, ChevronsRight, Search } from \"lucide-react\";\nimport { Button } from \"../action/Button\";\nimport { Icon } from \"./Icon\";\nimport { ContentLoading } from \"../feedback/ContentLoading\";\nimport { DatePicker } from \"../input/DatePicker\";\nimport { TextField } from \"../input/TextField\";\nimport { Dropdown } from \"../overlays/Dropdown\";\nimport { cn } from \"../utils/cn\";\n\nexport interface TableColumn<T = any> {\n /** Unique column identifier */\n id: string;\n /** Column header text */\n header: string;\n /** Data accessor - can be string key or function */\n accessor: keyof T | ((row: T) => any);\n /** Custom cell renderer */\n cell?: (value: any, row: T, index: number) => React.ReactNode;\n /** Column width */\n width?: string | number;\n /** Whether column is sortable */\n sortable?: boolean;\n /** Whether column is searchable */\n searchable?: boolean;\n /** Column alignment */\n align?: \"left\" | \"center\" | \"right\";\n /** Whether column is sticky */\n sticky?: \"left\" | \"right\";\n /** Custom header renderer */\n headerCell?: () => React.ReactNode;\n}\n\nexport interface TableAction<T = any> {\n /** Action identifier */\n id: string;\n /** Action label */\n label: string;\n /** Action icon */\n icon?: React.ReactNode;\n /** Action handler */\n onClick: (row: T, index: number) => void;\n /** Whether action is disabled for this row */\n disabled?: (row: T) => boolean;\n /** Action variant */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\";\n}\n\nexport interface TableFilter {\n /** Filter identifier */\n id: string;\n /** Filter label */\n label: string;\n /** Filter type */\n type?: \"select\" | \"date\" | \"dateRange\";\n /** Filter options (for select type) */\n options?: Array<{ value: string; label: string }>;\n /** Current filter value */\n value?: string | Date | null | string[];\n /** Filter change handler */\n onChange: (value: string | Date | null | string[]) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether filter is multi-select */\n multiSelect?: boolean;\n}\n\nexport interface TableProps<T = any> {\n /** Table data */\n data: T[];\n /** Column definitions */\n columns: TableColumn<T>[];\n /** Loading state */\n loading?: boolean;\n /** Whether table is searchable */\n searchable?: boolean;\n /** Search placeholder text */\n searchPlaceholder?: string;\n /** Table filters */\n filters?: TableFilter[];\n /** Whether table has pagination */\n paginated?: boolean;\n /** Page size options */\n pageSizeOptions?: number[];\n /** Default page size */\n defaultPageSize?: number;\n /** Row actions */\n actions?: TableAction<T>[];\n /** Row click handler */\n onRowClick?: (row: T, index: number) => void;\n /** Row selection */\n selectable?: boolean;\n /** Selected rows */\n selectedRows?: T[];\n /** Selection change handler */\n onSelectionChange?: (selectedRows: T[]) => void;\n /** Row key accessor */\n getRowKey?: (row: T, index: number) => string | number;\n /** Empty state content */\n emptyContent?: React.ReactNode;\n /** Table size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether to show row hover */\n hoverable?: boolean;\n /** Whether to show row borders */\n bordered?: boolean;\n /** Whether to stripe rows */\n striped?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Custom row className */\n rowClassName?: (row: T, index: number) => string;\n}\n\ninterface SortState {\n column: string | null;\n direction: \"asc\" | \"desc\" | null;\n}\n\ninterface PaginationState {\n page: number;\n pageSize: number;\n}\n\n// Icons — lucide via the kit Icon component; `active` dims an inactive sort arrow.\nconst SearchIcon = () => <Icon icon={Search} size=\"md\" color=\"current\" />;\nconst ChevronUpIcon = ({ active }: { active?: boolean }) => (\n <Icon icon={ChevronUp} size=\"sm\" className={active ? \"text-text\" : \"text-text-subtle\"} />\n);\nconst ChevronDownIcon = ({ active }: { active?: boolean }) => (\n <Icon icon={ChevronDown} size=\"sm\" className={active ? \"text-text\" : \"text-text-subtle\"} />\n);\nconst ChevronLeftIcon = () => <Icon icon={ChevronLeft} size=\"md\" color=\"current\" />;\nconst ChevronRightIcon = () => <Icon icon={ChevronRight} size=\"md\" color=\"current\" />;\nconst ChevronsLeftIcon = () => <Icon icon={ChevronsLeft} size=\"md\" color=\"current\" />;\nconst ChevronsRightIcon = () => <Icon icon={ChevronsRight} size=\"md\" color=\"current\" />;\nconst ChevronDownSmallIcon = () => <Icon icon={ChevronDown} size=\"md\" color=\"current\" />;\n\n\nconst FilterDropdown = (props: TableFilter) => {\n const isSelected = (value: string) => {\n if (props.multiSelect && Array.isArray(props.value)) {\n return props.value?.includes(value);\n }\n return props.value === value;\n };\n\n const handleChange = (value: string | null | string[]) => {\n if (props.multiSelect && Array.isArray(props.value)) {\n props.onChange(props.value.filter((v) => v !== value));\n } else {\n props.onChange(value);\n }\n };\n\n if (props.type === \"date\") {\n return (\n <div className=\"flex items-center space-x-1 max-w-40\">\n <DatePicker\n size=\"sm\"\n value={props.value as Date | null}\n onChange={(date) => props.onChange(date)}\n placeholder={\n props.placeholder || `Select ${props.label.toLowerCase()}`\n }\n className=\"min-w-40 border border-border bg-surface text-text hover:bg-surface-hover\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center space-x-1 max-w-60\">\n <div className=\"relative\">\n <details className=\"group\">\n <summary className=\"flex h-control-md cursor-pointer items-center gap-2 rounded-full border border-border bg-surface px-3 text-sm font-semibold text-text hover:bg-surface-hover\">\n <span>{props.label}</span>\n <span className=\"text-text\">\n {props.multiSelect && Array.isArray(props.value)\n ? props.value\n ?.map(\n (v) =>\n props.options?.find((option) => option.value === v)\n ?.label\n )\n .join(\", \")\n : props.options?.find((option) => option.value === props.value)\n ?.label}\n </span>\n <span className=\"text-text-muted text-sm group-open:rotate-180 transition-transform\">\n <ChevronDownSmallIcon />\n </span>\n </summary>\n <div className=\"absolute z-10 left-0 mt-1 bg-surface border border-border rounded-lg shadow-overlay p-2 w-48\">\n {props.options?.map((option) => (\n <button\n key={option.value}\n className=\"w-full text-left px-3 py-2 rounded-md hover:bg-surface-hover text-sm text-text flex items-center space-x-2\"\n onClick={() => handleChange(option.value)}\n >\n <span\n className={cn(isSelected(option.value) && \"text-accent\")}\n >\n {option.label}\n </span>\n </button>\n ))}\n {props.value && (\n <button\n className=\"w-full text-left px-3 py-2 rounded-md hover:bg-surface-hover text-sm text-text flex items-center space-x-2 mt-2\"\n onClick={() => handleChange(null)}\n >\n <span className=\"text-text-muted\">\n Clear filter\n </span>\n </button>\n )}\n </div>\n </details>\n </div>\n </div>\n );\n};\n\n/**\n * High-performance Table component with sorting, pagination, search, and custom renderers\n */\nexport const Table = <T extends Record<string, any>>({\n data,\n columns,\n loading = false,\n searchable = false,\n searchPlaceholder = \"Search...\",\n filters = [],\n paginated = false,\n pageSizeOptions = [10, 25, 50, 100],\n defaultPageSize = 10,\n actions = [],\n onRowClick,\n selectable = false,\n selectedRows = [],\n onSelectionChange,\n getRowKey = (row, index) => index,\n emptyContent,\n hoverable = true,\n bordered = false,\n striped = false,\n className,\n rowClassName,\n}: TableProps<T>) => {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [sortState, setSortState] = useState<SortState>({\n column: null,\n direction: null,\n });\n const [pagination, setPagination] = useState<PaginationState>({\n page: 0,\n pageSize: defaultPageSize,\n });\n\n const tableRef = useRef<HTMLTableElement>(null);\n\n // Memoized filtered data\n const filteredData = useMemo(() => {\n let result = data;\n\n // Apply search filter\n if (searchable && searchTerm.trim()) {\n const searchableColumns = columns.filter(\n (col) => col.searchable !== false\n );\n const lowerSearchTerm = searchTerm.toLowerCase();\n\n result = result.filter((row) => {\n return searchableColumns.some((column) => {\n const value =\n typeof column.accessor === \"function\"\n ? column.accessor(row)\n : row[column.accessor];\n\n return String(value || \"\")\n .toLowerCase()\n .includes(lowerSearchTerm);\n });\n });\n }\n\n // Apply column filters\n filters.forEach((filter) => {\n if (filter.value && filter.value !== \"all\") {\n result = result.filter((row) => {\n const column = columns.find((col) => col.id === filter.id);\n if (!column) return true;\n\n const value =\n typeof column.accessor === \"function\"\n ? column.accessor(row)\n : row[column.accessor];\n\n return String(value || \"\") === filter.value;\n });\n }\n });\n\n return result;\n }, [data, searchTerm, columns, searchable, filters]);\n\n // Memoized sorted data\n const sortedData = useMemo(() => {\n if (!sortState.column || !sortState.direction) return filteredData;\n\n const column = columns.find((col) => col.id === sortState.column);\n if (!column) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n const aValue =\n typeof column.accessor === \"function\"\n ? column.accessor(a)\n : a[column.accessor];\n const bValue =\n typeof column.accessor === \"function\"\n ? column.accessor(b)\n : b[column.accessor];\n\n let comparison = 0;\n\n if (aValue < bValue) comparison = -1;\n else if (aValue > bValue) comparison = 1;\n\n return sortState.direction === \"desc\" ? -comparison : comparison;\n });\n }, [filteredData, sortState, columns]);\n\n // Memoized paginated data\n const paginatedData = useMemo(() => {\n if (!paginated) return sortedData;\n\n const startIndex = pagination.page * pagination.pageSize;\n const endIndex = startIndex + pagination.pageSize;\n return sortedData.slice(startIndex, endIndex);\n }, [sortedData, pagination, paginated]);\n\n // Handle sorting\n const handleSort = useCallback(\n (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column?.sortable) return;\n\n setSortState((prev) => {\n if (prev.column !== columnId) {\n return { column: columnId, direction: \"asc\" };\n }\n if (prev.direction === \"asc\") {\n return { column: columnId, direction: \"desc\" };\n }\n return { column: null, direction: null };\n });\n },\n [columns]\n );\n\n // Handle pagination\n const handlePageChange = useCallback((newPage: number) => {\n setPagination((prev) => ({ ...prev, page: newPage }));\n }, []);\n\n const handlePageSizeChange = useCallback((newPageSize: number) => {\n setPagination({ page: 0, pageSize: newPageSize });\n }, []);\n\n // Handle selection\n const handleRowSelection = useCallback(\n (row: T, checked: boolean) => {\n if (!onSelectionChange) return;\n\n const rowKey = getRowKey(row, 0);\n const currentKeys = selectedRows.map((r, i) => getRowKey(r, i));\n\n if (checked) {\n onSelectionChange([...selectedRows, row]);\n } else {\n onSelectionChange(\n selectedRows.filter(\n (_, i) => getRowKey(selectedRows[i], i) !== rowKey\n )\n );\n }\n },\n [selectedRows, onSelectionChange, getRowKey]\n );\n\n const handleSelectAll = useCallback(\n (checked: boolean) => {\n if (!onSelectionChange) return;\n onSelectionChange(checked ? [...paginatedData] : []);\n },\n [paginatedData, onSelectionChange]\n );\n\n // Reset pagination when data changes\n useEffect(() => {\n setPagination((prev) => ({ ...prev, page: 0 }));\n }, [searchTerm, sortState]);\n\n // Separate effect for filters to avoid infinite loops\n useEffect(() => {\n setPagination((prev) => ({ ...prev, page: 0 }));\n }, [filters.map((f) => f.value).join(\",\")]);\n\n // Calculate pagination info\n const totalItems = sortedData.length;\n const totalPages = Math.ceil(totalItems / pagination.pageSize);\n const startItem = pagination.page * pagination.pageSize + 1;\n const endItem = Math.min(startItem + pagination.pageSize - 1, totalItems);\n\n // Check if all visible rows are selected\n const allVisibleSelected =\n paginatedData.length > 0 &&\n paginatedData.every((row) => {\n const rowKey = getRowKey(row, 0);\n return selectedRows.some(\n (selectedRow, i) => getRowKey(selectedRow, i) === rowKey\n );\n });\n\n const someVisibleSelected = paginatedData.some((row) => {\n const rowKey = getRowKey(row, 0);\n return selectedRows.some(\n (selectedRow, i) => getRowKey(selectedRow, i) === rowKey\n );\n });\n\n const tableClasses = cn(\n \"w-full text-sm leading-5 text-text border-collapse\",\n className\n );\n\n const headerClasses = cn(\"bg-surface\");\n\n const cellClasses = cn(\n \"text-text p-3 border-b border-border\"\n );\n\n const rowClasses = cn(\"h-row-lg\", {\n \"hover:bg-surface-sunk\": hoverable,\n \"cursor-pointer\": onRowClick,\n });\n\n return (\n <div className=\"space-y-4\">\n {/* Search and Filters Bar */}\n {(searchable || filters.length > 0) && (\n <div className=\"pt-4 pb-2\">\n <div className=\"flex flex-wrap gap-4 items-start\">\n {filters.map((filter) => (\n <FilterDropdown key={filter.id} {...filter} />\n ))}\n\n <div className=\"w-full sm:w-auto sm:ml-auto min-w-menu\">\n {/* TODO: Add search bar here */}\n <TextField\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n startIcon={<SearchIcon />}\n className=\"max-w-sm\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Table Container */}\n <div className=\"relative w-full overflow-x-auto min-h-100\">\n {loading && (\n <div className=\"flex items-center justify-center z-10\">\n <ContentLoading\n showTableSkeleton\n tableRows={10}\n tableColumns={columns.length}\n />\n </div>\n )}\n\n <table ref={tableRef} className={cn(tableClasses, \"min-w-full\")}>\n <thead className={headerClasses}>\n <tr>\n {/* Selection Column */}\n {selectable && (\n <th className={cn(cellClasses, \"w-12\")}>\n <input\n type=\"checkbox\"\n checked={allVisibleSelected}\n ref={(el) => {\n if (el)\n el.indeterminate =\n someVisibleSelected && !allVisibleSelected;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"rounded border-border [&:not(:checked)]:bg-surface-input text-accent\"\n />\n </th>\n )}\n\n {/* Data Columns */}\n {!loading &&\n columns.map((column) => (\n <th\n key={column.id}\n className={cn(\n cellClasses,\n \"font-semibold text-xs text-text-muted uppercase tracking-label\",\n \"group\",\n {\n \"text-left\": column.align === \"left\" || !column.align,\n \"text-center\": column.align === \"center\",\n \"text-right\": column.align === \"right\",\n \"cursor-pointer select-none\": column.sortable,\n \"sticky left-0 bg-surface\":\n column.sticky === \"left\",\n \"sticky right-0 bg-surface\":\n column.sticky === \"right\",\n }\n )}\n style={{ width: column.width }}\n onClick={() => column.sortable && handleSort(column.id)}\n >\n <div className=\"flex items-center gap-2\">\n {column.headerCell ? column.headerCell() : column.header}\n {column.sortable && (\n <div\n className={cn(\n \"flex flex-col opacity-0 group-hover:opacity-100 transition-opacity\",\n sortState.column === column.id && \"opacity-100\"\n )}\n >\n <ChevronUpIcon\n active={\n sortState.column === column.id &&\n sortState.direction === \"asc\"\n }\n />\n <ChevronDownIcon\n active={\n sortState.column === column.id &&\n sortState.direction === \"desc\"\n }\n />\n </div>\n )}\n </div>\n </th>\n ))}\n\n {/* Actions Column */}\n {actions.length > 0 && (\n <th className={cn(cellClasses, \"w-20\")}>\n <span className=\"sr-only\">Actions</span>\n </th>\n )}\n </tr>\n </thead>\n\n <tbody>\n {paginatedData.length === 0 || loading\n ? !loading && (\n <tr>\n <td\n colSpan={\n columns.length +\n (selectable ? 1 : 0) +\n (actions.length > 0 ? 1 : 0)\n }\n className={cn(\n cellClasses,\n \"text-center py-8 text-text-muted\"\n )}\n >\n {emptyContent || \"No data available\"}\n </td>\n </tr>\n )\n : paginatedData.map((row, index) => {\n const rowKey = getRowKey(row, index);\n const isSelected = selectedRows.some(\n (selectedRow, i) => getRowKey(selectedRow, i) === rowKey\n );\n\n return (\n <tr\n key={rowKey}\n className={cn(\n rowClasses,\n { \"bg-accent-soft\": isSelected },\n rowClassName?.(row, index)\n )}\n onClick={(e) => {\n e.stopPropagation();\n onRowClick?.(row, index);\n }}\n >\n {/* Selection Cell */}\n {selectable && (\n <td className={cellClasses}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation();\n handleRowSelection(row, e.target.checked);\n }}\n className=\"rounded border-border [&:not(:checked)]:bg-surface-input text-accent\"\n />\n </td>\n )}\n\n {/* Data Cells */}\n {columns.map((column) => {\n const value =\n typeof column.accessor === \"function\"\n ? column.accessor(row)\n : row[column.accessor];\n\n return (\n <td\n key={column.id}\n className={cn(cellClasses, {\n \"text-left\":\n column.align === \"left\" || !column.align,\n \"text-center\": column.align === \"center\",\n \"text-right\": column.align === \"right\",\n \"sticky left-0 bg-surface\":\n column.sticky === \"left\",\n \"sticky right-0 bg-surface\":\n column.sticky === \"right\",\n })}\n >\n {column.cell\n ? column.cell(value, row, index)\n : String(value || \"\")}\n </td>\n );\n })}\n\n {/* Actions Cell */}\n {actions.length > 0 && (\n <td className={cellClasses}>\n <Dropdown\n trigger={\n <div className=\"inline-flex items-center gap-1 px-2 py-1 text-sm text-text-muted hover:text-text\">\n <span>Options</span>\n <ChevronDownSmallIcon />\n </div>\n }\n options={actions.map((action) => ({\n value: action.id,\n label: action.label,\n icon: action.icon,\n disabled: action.disabled?.(row),\n }))}\n onSelect={(actionId) => {\n const action = actions.find(\n (a) => a.id === actionId\n );\n if (action) {\n action.onClick(row, index);\n }\n }}\n placement=\"bottom-end\"\n />\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {paginated && totalItems > 0 && (\n <div className=\"flex items-center justify-between px-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-sm text-text-muted\">\n Showing {startItem} to {endItem} of {totalItems} results\n </span>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-muted\">\n Rows per page:\n </span>\n <select\n value={pagination.pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n className=\"h-control-sm w-16 rounded-md border border-border bg-surface-input px-2 text-sm text-text\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(0)}\n disabled={pagination.page === 0}\n iconOnly\n >\n <ChevronsLeftIcon />\n </Button>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(pagination.page - 1)}\n disabled={pagination.page === 0}\n iconOnly\n >\n <ChevronLeftIcon />\n </Button>\n\n <span className=\"px-3 py-1 text-sm text-text-muted\">\n Page {pagination.page + 1} of {totalPages}\n </span>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(pagination.page + 1)}\n disabled={pagination.page >= totalPages - 1}\n iconOnly\n >\n <ChevronRightIcon />\n </Button>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(totalPages - 1)}\n disabled={pagination.page >= totalPages - 1}\n iconOnly\n >\n <ChevronsRightIcon />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, { createContext, useContext, useState } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TabItem {\n /** Tab identifier */\n id: string;\n /** Tab label */\n label: string;\n /** Tab content */\n content?: React.ReactNode;\n /** Whether tab is disabled */\n disabled?: boolean;\n /** Badge/count to show next to label */\n badge?: string | number;\n}\n\nexport interface TabsProps {\n /** Tab items */\n items: TabItem[];\n /** Default active tab */\n defaultTab?: string;\n /** Active tab (controlled) */\n activeTab?: string;\n /** Tab change handler */\n onTabChange?: (tabId: string) => void;\n /** Tabs variant */\n variant?: 'default' | 'pills' | 'underline';\n /** Tabs size */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface TabBarProps {\n /** Tab items (simplified for bar style) */\n items: Array<{\n id: string;\n label: string;\n badge?: string | number;\n disabled?: boolean;\n }>;\n /** Active tab */\n activeTab?: string;\n /** Tab change handler */\n onTabChange?: (tabId: string) => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst TabsContext = createContext<{\n activeTab: string;\n setActiveTab: (tab: string) => void;\n} | null>(null);\n\n/**\n * TabBar component for simple tab navigation (like in the screenshot)\n */\nexport const TabBar: React.FC<TabBarProps> = ({\n items,\n activeTab,\n onTabChange,\n className,\n}) => {\n const [internalActiveTab, setInternalActiveTab] = useState(items[0]?.id || '');\n const currentActiveTab = activeTab || internalActiveTab;\n\n const handleTabClick = (tabId: string) => {\n if (onTabChange) {\n onTabChange(tabId);\n } else {\n setInternalActiveTab(tabId);\n }\n };\n\n return (\n <div className={cn('border-b border-border', className)}>\n <nav className=\"-mb-px flex space-x-8\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => !item.disabled && handleTabClick(item.id)}\n disabled={item.disabled}\n className={cn(\n 'border-b-2 py-2 px-1 text-sm font-medium transition-colors duration-fast',\n {\n 'border-accent-border text-text': currentActiveTab === item.id,\n 'border-transparent text-text-muted hover:text-text':\n currentActiveTab !== item.id && !item.disabled,\n 'border-transparent text-disabled cursor-not-allowed': item.disabled,\n }\n )}\n >\n <span className=\"flex items-center gap-2\">\n {item.label}\n {item.badge && (\n <span className={cn(\n 'inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium',\n currentActiveTab === item.id\n ? 'bg-accent-soft text-accent'\n : 'bg-surface-hover text-text-muted'\n )}>\n {item.badge}\n </span>\n )}\n </span>\n </button>\n ))}\n </nav>\n </div>\n );\n};\n\n/**\n * Full Tabs component with content panels\n */\nexport const Tabs: React.FC<TabsProps> = ({\n items,\n defaultTab,\n activeTab,\n onTabChange,\n variant = 'default',\n size = 'md',\n className,\n}) => {\n const [internalActiveTab, setInternalActiveTab] = useState(\n defaultTab || activeTab || items[0]?.id || ''\n );\n\n const currentActiveTab = activeTab || internalActiveTab;\n\n const handleTabChange = (tabId: string) => {\n if (onTabChange) {\n onTabChange(tabId);\n } else {\n setInternalActiveTab(tabId);\n }\n };\n\n const contextValue = {\n activeTab: currentActiveTab,\n setActiveTab: handleTabChange,\n };\n\n const activeTabItem = items.find(item => item.id === currentActiveTab);\n\n const tabListClasses = cn(\n 'flex',\n {\n 'border-b border-border px-2': variant === 'default' || variant === 'underline',\n 'bg-surface-hover p-1 rounded-lg': variant === 'pills',\n 'space-x-1': variant === 'pills',\n 'space-x-8': variant === 'default' || variant === 'underline',\n },\n className\n );\n\n const tabClasses = (item: TabItem, isActive: boolean) => {\n const baseClasses = 'transition-colors duration-fast font-medium';\n\n const sizeClasses = {\n 'text-xs px-2 py-1': size === 'sm',\n 'text-sm px-3 py-2': size === 'md',\n 'text-base px-4 py-3': size === 'lg',\n };\n\n const variantClasses = {\n // Default variant\n 'border-b-2 -mb-px': variant === 'default',\n // Pills variant\n 'rounded-md': variant === 'pills',\n // Underline variant\n 'border-b-2 pb-2': variant === 'underline',\n };\n\n const stateClasses = {\n 'opacity-50 cursor-not-allowed': item.disabled,\n 'cursor-pointer': !item.disabled,\n };\n\n // Active state classes\n const activeClasses = isActive ? {\n 'border-accent-border text-text': variant === 'default' || variant === 'underline',\n 'bg-surface text-text shadow-none': variant === 'pills',\n } : {};\n\n // Non-active, non-disabled state classes\n const inactiveClasses = !isActive && !item.disabled ? {\n 'border-transparent text-text-muted hover:text-text': variant === 'default',\n 'text-text-muted hover:text-text': variant === 'pills',\n 'border-transparent text-text-muted hover:text-text hover:border-border': variant === 'underline',\n } : {};\n\n return cn(baseClasses, sizeClasses, variantClasses, stateClasses, activeClasses, inactiveClasses);\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div>\n {/* Tab List */}\n <div className={tabListClasses} role=\"tablist\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={currentActiveTab === item.id}\n aria-controls={`tabpanel-${item.id}`}\n disabled={item.disabled}\n onClick={() => !item.disabled && handleTabChange(item.id)}\n className={tabClasses(item, currentActiveTab === item.id)}\n >\n <span className=\"flex items-center gap-2\">\n {item.label}\n {item.badge && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-surface-hover text-text-muted\">\n {item.badge}\n </span>\n )}\n </span>\n </button>\n ))}\n </div>\n\n {/* Tab Content */}\n {activeTabItem?.content && (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${currentActiveTab}`}\n aria-labelledby={`tab-${currentActiveTab}`}\n className=\"mt-4\"\n >\n {activeTabItem.content}\n </div>\n )}\n </div>\n </TabsContext.Provider>\n );\n};\n\n/**\n * Hook to access tab context\n */\nexport const useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component');\n }\n return context;\n}; ","import React, { useEffect, useRef } from 'react';\nimport { X } from \"lucide-react\";\nimport { Icon } from \"../content/Icon\";\nimport { cn } from '../utils/cn';\n\nexport interface ModalProps {\n /**\n * Whether the modal is open\n */\n open: boolean;\n \n /**\n * Callback fired when the modal should be closed\n */\n onClose: () => void;\n \n /**\n * The title of the modal\n */\n title?: string;\n \n /**\n * The size of the modal\n */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n \n /**\n * Whether clicking the backdrop should close the modal\n */\n closeOnBackdropClick?: boolean;\n \n /**\n * Whether pressing escape should close the modal\n */\n closeOnEscape?: boolean;\n \n /**\n * Additional class name for the modal content\n */\n className?: string;\n \n /**\n * Additional class name for the modal backdrop\n */\n backdropClassName?: string;\n \n /**\n * The content of the modal\n */\n children: React.ReactNode;\n \n /**\n * Footer content for the modal\n */\n footer?: React.ReactNode;\n \n /**\n * Whether to show the close button\n */\n showCloseButton?: boolean;\n}\n\nconst modalSizes = {\n sm: 'max-w-md',\n md: 'max-w-lg',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n full: 'max-w-full mx-4',\n};\n\n/**\n * Modal component with theme integration and accessibility features\n * \n * @example\n * ```tsx\n * <Modal\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Confirm Action\"\n * size=\"md\"\n * >\n * <p>Are you sure you want to delete this item?</p>\n * </Modal>\n * \n * <Modal\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Settings\"\n * size=\"lg\"\n * footer={\n * <div className=\"flex justify-end space-x-2\">\n * <Button variant=\"outline\" onClick={() => setIsOpen(false)}>\n * Cancel\n * </Button>\n * <Button onClick={handleSave}>\n * Save\n * </Button>\n * </div>\n * }\n * >\n * <SettingsForm />\n * </Modal>\n * ```\n */\nexport function Modal({\n open,\n onClose,\n title,\n size = 'md',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n className,\n backdropClassName,\n children,\n footer,\n showCloseButton = true,\n}: ModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Handle escape key\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [open, closeOnEscape, onClose]);\n\n // Handle focus management\n useEffect(() => {\n if (open) {\n // Store the currently focused element\n previousActiveElement.current = document.activeElement as HTMLElement;\n \n // Focus the modal\n if (modalRef.current) {\n modalRef.current.focus();\n }\n \n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n } else {\n // Restore focus to the previously focused element\n if (previousActiveElement.current) {\n previousActiveElement.current.focus();\n }\n \n // Restore body scroll\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // Handle backdrop click\n const handleBackdropClick = (event: React.MouseEvent) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n };\n\n if (!open) return null;\n\n return (\n <div\n className={cn(\n 'fixed inset-0 z-modal flex items-center justify-center p-4',\n 'bg-scrim',\n // 'animate-fade-in',\n backdropClassName\n )}\n onClick={handleBackdropClick}\n >\n <div\n ref={modalRef}\n className={cn(\n 'relative w-full bg-surface rounded-lg shadow-modal',\n // 'animate-scale-in',\n 'focus:outline-none',\n modalSizes[size],\n className\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n tabIndex={-1}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 pb-0\">\n {title && (\n <span\n id=\"modal-title\"\n className=\"text-lg font-semibold text-text\"\n >\n {title}\n </span>\n )}\n \n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-muted hover:text-text transition-colors\"\n aria-label=\"Close modal\"\n >\n <Icon icon={X} size=\"lg\" color=\"current\" />\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-6\">\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"px-6 py-4\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n} ","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TextProps {\n /** Text variant */\n variant?: 'body' | 'caption' | 'label' | 'code';\n /** Text size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Font weight */\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n /** Text color */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current' | 'muted';\n /** Text alignment */\n align?: 'left' | 'center' | 'right' | 'justify';\n /** Whether to truncate text with ellipsis */\n truncate?: boolean;\n /** Whether text should be italic */\n italic?: boolean;\n /** Whether text should be underlined */\n underline?: boolean;\n /** Line height */\n lineHeight?: 'tight' | 'normal' | 'relaxed';\n /** HTML element to render */\n as?: 'p' | 'span' | 'div' | 'code' | 'pre';\n /** Additional CSS classes */\n className?: string;\n /** Child content */\n children: React.ReactNode;\n}\n\n/**\n * Text — every copy string in the product goes through this component.\n *\n * Size maps onto the token type scale (tokens.css):\n * xs 11 · sm 12 · md 13 (body) · lg 14 (long-form) · xl 16\n * Anything above 16px is a Heading, not Text.\n */\nconst sizeMap: Record<NonNullable<TextProps['size']>, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n xl: 'text-lg',\n};\n\nconst weightMap: Record<NonNullable<TextProps['weight']>, string> = {\n light: 'font-normal',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n};\n\n/** Semantic colour tokens — these flip in dark mode, so no `dark:` variants. */\nconst colorMap: Record<NonNullable<TextProps['color']>, string> = {\n primary: 'text-text',\n secondary: 'text-text-muted',\n accent: 'text-accent',\n success: 'text-success-fg',\n warning: 'text-warning-fg',\n error: 'text-danger-fg',\n info: 'text-info-fg',\n neutral: 'text-text',\n current: 'text-current',\n muted: 'text-text-subtle',\n};\n\nconst alignMap: Record<NonNullable<TextProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n};\n\nconst lineHeightMap: Record<NonNullable<TextProps['lineHeight']>, string> = {\n tight: 'leading-tight',\n normal: 'leading-normal',\n relaxed: 'leading-relaxed',\n};\n\nexport const Text: React.FC<TextProps> = ({\n variant = 'body',\n size = 'md',\n weight = 'normal',\n color = 'current',\n align = 'left',\n truncate = false,\n italic = false,\n underline = false,\n lineHeight = 'normal',\n as,\n className,\n children,\n ...props\n}) => {\n const Tag = (as || getDefaultElement(variant)) as keyof React.JSX.IntrinsicElements;\n\n const isCaption = variant === 'caption';\n const isLabel = variant === 'label';\n const isCode = variant === 'code';\n\n const textClasses = cn(\n 'font-sans',\n\n // Variant — caption and label pin their own size/weight\n isCaption && 'text-xs text-text-subtle',\n isLabel && 'text-xs font-semibold uppercase tracking-label text-text-subtle',\n isCode && 'font-mono text-sm rounded-sm bg-surface-hover px-1 py-0.5',\n\n // Size — only where the variant does not pin it\n !isCaption && !isLabel && !isCode && sizeMap[size],\n\n // Weight — label owns its weight\n !isLabel && weightMap[weight],\n\n colorMap[color],\n alignMap[align],\n\n // Line height only overrides the body variant\n variant === 'body' && lineHeightMap[lineHeight],\n\n italic && 'italic',\n underline && 'underline',\n truncate && 'truncate',\n\n className\n );\n\n return (\n <Tag className={textClasses} {...props}>\n {children}\n </Tag>\n );\n};\n\nfunction getDefaultElement(variant: TextProps['variant']): string {\n const elementMap: Record<NonNullable<TextProps['variant']>, string> = {\n body: 'p',\n caption: 'span',\n label: 'span',\n code: 'code',\n };\n\n return elementMap[variant!] || 'p';\n}\n","import { FilePointer, VirtualMount } from '@opencxh/domain';\nimport { ArrowLeft, FileText, Folder, FolderPlus, HardDrive, Search, Upload, X } from 'lucide-react';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Button } from '../action/Button';\nimport { Icon } from '../content/Icon';\nimport { Table, TableColumn } from '../content/Table';\nimport { Tabs } from '../navigation/Tabs';\nimport { Modal } from '../overlays/Modal';\nimport { Text } from '../typography/Text';\nimport { cn } from '../utils/cn';\nimport { TextField } from './TextField';\n\nexport interface StorageInputProps {\n value?: string | FilePointer;\n onChange: (value: FilePointer | null, content?: Uint8Array) => void;\n label?: string;\n placeholder?: string;\n error?: string;\n disabled?: boolean;\n accept?: string;\n onListFiles?: (filters?: { name?: string; mimeType?: string; mountId?: string, path?: string }) => Promise<{ data: FilePointer[] }> | undefined;\n onListMounts?: () => Promise<{ data: VirtualMount[] }> | undefined;\n onUploadFile?: (payload: { file: Uint8Array; filename: string; mimeType: string; mountId?: string; path?: string }) => Promise<{ data: FilePointer }> | undefined;\n onDownloadFile?: (fileId: string) => Promise<Uint8Array> | undefined;\n onRegisterFile?: (payload: Omit<FilePointer, 'id'>) => Promise<{ data: FilePointer }> | undefined;\n}\n\nexport const StorageInput: React.FC<StorageInputProps> = ({\n value,\n onChange,\n label,\n placeholder = \"Select or upload a file\",\n error,\n disabled,\n accept,\n onListFiles,\n onListMounts,\n onUploadFile,\n onDownloadFile,\n onRegisterFile,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [mounts, setMounts] = useState<VirtualMount[]>([]);\n const [selectedMount, setSelectedMount] = useState<VirtualMount | null>(null);\n const [currentPath, setCurrentPath] = useState<string>(\"/\");\n const [remoteFiles, setRemoteFiles] = useState<FilePointer[]>([]);\n const [loading, setLoading] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [selectedPointer, setSelectedPointer] = useState<FilePointer | null>(\n typeof value === 'object' ? value : null\n );\n const [isCreatingFolder, setIsCreatingFolder] = useState(false);\n const [newFolderName, setNewFolderName] = useState(\"\");\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Load mounts when modal opens\n useEffect(() => {\n if (isModalOpen) {\n loadMounts();\n }\n }, [isModalOpen]);\n\n // Load files when a mount is selected or search term changes\n useEffect(() => {\n if (isModalOpen && selectedMount) {\n loadFiles();\n }\n }, [isModalOpen, selectedMount, currentPath, searchTerm]);\n\n const loadMounts = async () => {\n setLoading(true);\n try {\n const resp = await onListMounts?.();\n if (resp?.data) {\n setMounts(resp.data);\n }\n } catch (err) {\n console.error(\"Failed to load mounts\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const loadFiles = async () => {\n if (!selectedMount) return;\n setLoading(true);\n try {\n const resp = await onListFiles?.({ mountId: selectedMount.id, name: searchTerm, path: currentPath });\n if (resp?.data) {\n setRemoteFiles(resp.data);\n }\n } catch (err) {\n console.error(\"Failed to load files\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleLocalOnlySelection = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n setLoading(true);\n try {\n const buffer = await file.arrayBuffer();\n const content = new Uint8Array(buffer);\n\n const virtualPointer: FilePointer = {\n id: `local-${Date.now()}`,\n name: file.name,\n type: 'file',\n path: '/',\n mimeType: file.type || 'application/octet-stream',\n size: file.size,\n mountId: 'local',\n providerKey: file.name,\n ownerId: 'me',\n };\n\n setSelectedPointer(virtualPointer);\n onChange(virtualPointer, content);\n setIsModalOpen(false);\n } catch (err) {\n console.error(\"Local file selection failed\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleUploadToStorage = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !selectedMount) return;\n\n setLoading(true);\n try {\n const buffer = await file.arrayBuffer();\n const resp = await onUploadFile?.({\n file: new Uint8Array(buffer),\n filename: file.name,\n mimeType: file.type || 'application/octet-stream',\n mountId: selectedMount.id,\n path: currentPath,\n });\n\n if (resp?.data) {\n const pointer = resp.data;\n setSelectedPointer(pointer);\n onChange(pointer, new Uint8Array(buffer));\n setIsModalOpen(false);\n }\n } catch (err) {\n console.error(\"Upload failed\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCreateFolder = async () => {\n if (!newFolderName || !selectedMount) return;\n\n setLoading(true);\n try {\n const fullPath = `${currentPath}${newFolderName}/`;\n\n if (onRegisterFile) {\n await onRegisterFile({\n name: newFolderName,\n type: 'folder',\n path: currentPath,\n mimeType: 'application/x-directory',\n size: 0,\n mountId: selectedMount.id,\n providerKey: fullPath,\n ownerId: 'me',\n });\n await loadFiles();\n }\n\n setIsCreatingFolder(false);\n setNewFolderName(\"\");\n } catch (err) {\n console.error(\"Failed to create folder\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSelectRemote = async (pointer: FilePointer) => {\n setLoading(true);\n try {\n const content = await onDownloadFile?.(pointer.id);\n setSelectedPointer(pointer);\n onChange(pointer, content);\n setIsModalOpen(false);\n } catch (err) {\n console.error(\"Failed to download file\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setSelectedPointer(null);\n onChange(null);\n };\n\n // Folder & File calculation logic\n const explorerItems = useMemo(() => {\n const folders = new Set<string>();\n const files: FilePointer[] = [];\n\n remoteFiles.forEach(file => {\n if (file.type === 'folder') {\n if (file.path === currentPath) {\n folders.add(file.name);\n }\n return;\n }\n\n const path = file.providerKey || file.name;\n const relativePath = currentPath ? path.substring(currentPath.length) : path;\n const parts = relativePath.split('/').filter(p => p !== \"\");\n\n if (parts.length > 1) {\n folders.add(parts[0]);\n } else if (parts.length === 1) {\n files.push(file);\n }\n });\n\n return {\n folders: Array.from(folders).sort(),\n files: files.sort((a, b) => a.name.localeCompare(b.name))\n };\n }, [remoteFiles, currentPath]);\n\n const handleFolderClick = (folderName: string) => {\n setCurrentPath(prev => `${prev}${folderName}/`);\n };\n\n const handleGoBack = () => {\n const parts = currentPath.split('/').filter(p => p !== \"\");\n parts.pop();\n if (parts.length === 0) {\n setCurrentPath(\"/\");\n } else {\n setCurrentPath(`${parts.join('/')}/`);\n }\n };\n\n const tableData = useMemo(() => {\n const data: any[] = explorerItems.folders.map(f => ({\n id: `folder-${f}`,\n name: f,\n type: 'folder'\n }));\n\n explorerItems.files.forEach(f => {\n data.push({\n ...f,\n type: 'file'\n });\n });\n\n return data;\n }, [explorerItems]);\n\n const explorerColumns: TableColumn<any>[] = [\n {\n id: 'name',\n header: 'Name',\n accessor: 'name',\n cell: (val, row) => (\n <div className=\"flex items-center gap-2\">\n <Icon\n icon={row.type === 'folder' ? Folder : FileText}\n size=\"sm\"\n color={row.type === 'folder' ? \"warning\" : \"secondary\"}\n />\n <span className={cn(row.type === 'folder' && \"font-medium\")}>{val}</span>\n </div>\n )\n },\n {\n id: 'type',\n header: 'Type',\n accessor: (row) => row.type === 'folder' ? 'Folder' : row.mimeType,\n },\n {\n id: 'size',\n header: 'Size',\n accessor: (row) => row.type === 'file' ? `${(row.size / 1024).toFixed(1)} KB` : '-',\n },\n {\n id: 'actions',\n header: '',\n accessor: 'id',\n align: 'right',\n cell: (_, row) => (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={(e) => {\n e.stopPropagation();\n row.type === 'folder' ? handleFolderClick(row.name) : handleSelectRemote(row);\n }}\n loading={loading && row.type === 'file' && selectedPointer?.id === row.id}\n >\n {row.type === 'folder' ? 'Open' : 'Select'}\n </Button>\n )\n }\n ];\n\n const mountColumns: TableColumn<VirtualMount>[] = [\n {\n id: 'name',\n header: 'Mount Name',\n accessor: 'name',\n cell: (val) => (\n <div className=\"flex items-center gap-2 font-medium\">\n <Icon icon={HardDrive} size=\"sm\" color=\"primary\" />\n <span>{val}</span>\n </div>\n )\n },\n {\n id: 'actions',\n header: '',\n accessor: 'id',\n align: 'right',\n cell: (_, row) => (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSelectedMount(row)}>\n Open\n </Button>\n )\n }\n ];\n\n return (\n <div className=\"space-y-1\">\n {label && (\n <Text variant=\"label\" size=\"sm\" weight=\"medium\">\n {label}\n </Text>\n )}\n\n <div\n onClick={() => !disabled && setIsModalOpen(true)}\n className={cn(\n \"flex items-center gap-3 px-3 py-2 border rounded-lg cursor-pointer transition-colors\",\n \"hover:border-border-strong bg-surface\",\n error ? \"border-danger-border\" : \"border-border\",\n disabled && \"opacity-50 cursor-not-allowed bg-surface-sunk\"\n )}\n >\n <div className=\"flex-shrink-0\">\n <Icon icon={selectedPointer ? FileText : HardDrive} color={selectedPointer ? \"primary\" : \"secondary\"} />\n </div>\n\n <div className=\"flex-grow truncate\">\n {selectedPointer ? (\n <span className=\"text-sm text-text font-medium\">{selectedPointer.name}</span>\n ) : (\n <span className=\"text-sm text-text-muted\">{placeholder}</span>\n )}\n </div>\n\n {selectedPointer && !disabled && (\n <button\n onClick={handleClear}\n className=\"p-1 hover:bg-surface-hover rounded\"\n >\n <Icon icon={X} size=\"xs\" />\n </button>\n )}\n </div>\n\n {error && (\n <Text variant=\"body\" size=\"xs\" className=\"text-danger-fg\">\n {error}\n </Text>\n )}\n\n <Modal\n open={isModalOpen}\n onClose={() => {\n setIsModalOpen(false);\n setSelectedMount(null);\n setCurrentPath(\"/\");\n setIsCreatingFolder(false);\n }}\n title={selectedMount ? `Explorer: ${selectedMount.name}` : \"Select Storage Mount\"}\n size=\"lg\"\n >\n <Tabs\n variant=\"pills\"\n items={[\n {\n id: 'remote',\n label: 'Platform Storage',\n content: (\n <div className=\"space-y-4\">\n {selectedMount ? (\n <>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n if (currentPath && currentPath !== \"/\") {\n handleGoBack();\n } else {\n setSelectedMount(null);\n }\n }}\n leftIcon={<Icon icon={ArrowLeft} size=\"xs\" />}\n >\n {currentPath ? \"Back\" : \"Back to Mounts\"}\n </Button>\n\n <div className=\"flex items-center gap-1 text-xs text-text-muted overflow-hidden bg-surface-hover px-2 py-1 rounded\">\n <span className=\"truncate\">{currentPath}</span>\n </div>\n\n <div className=\"flex-grow min-w-40\">\n <TextField\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n startIcon={<Search size={14} />}\n fullWidth\n size=\"sm\"\n />\n </div>\n\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsCreatingFolder(true)}\n leftIcon={<Icon icon={FolderPlus} size=\"xs\" />}\n >\n New Folder\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => fileInputRef.current?.click()}\n leftIcon={<Icon icon={Upload} size=\"xs\" />}\n loading={loading}\n >\n Upload\n </Button>\n <input\n type=\"file\"\n className=\"hidden\"\n ref={fileInputRef}\n onChange={handleUploadToStorage}\n accept={accept}\n />\n </div>\n </div>\n\n {isCreatingFolder && (\n <div className=\"flex items-center gap-2 p-3 bg-surface-sunk rounded-lg border border-border\">\n <Icon icon={Folder} size=\"sm\" color=\"warning\" />\n <TextField\n size=\"sm\"\n placeholder=\"Folder name\"\n value={newFolderName}\n onChange={(e) => setNewFolderName(e.target.value)}\n autoFocus\n />\n <Button size=\"sm\" onClick={handleCreateFolder} loading={loading}>Create</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setIsCreatingFolder(false)}>Cancel</Button>\n </div>\n )}\n\n <div className=\"max-h-100 overflow-auto rounded-lg border border-border\">\n <Table\n data={tableData}\n columns={explorerColumns}\n loading={loading}\n emptyContent=\"This folder is empty\"\n onRowClick={(row) => row.type === 'folder' ? handleFolderClick(row.name) : handleSelectRemote(row)}\n />\n </div>\n </>\n ) : (\n <div className=\"max-h-100 overflow-auto rounded-lg border border-border\">\n <Table\n data={mounts}\n columns={mountColumns}\n loading={loading}\n emptyContent=\"No storage mounts configured\"\n onRowClick={(row) => setSelectedMount(row)}\n />\n </div>\n )}\n </div>\n )\n },\n {\n id: 'local',\n label: 'Local File',\n content: (\n <div className=\"space-y-6\">\n <div className=\"flex flex-col items-center justify-center py-12 border-2 border-dashed border-border rounded-xl bg-surface-sunk/50\">\n <div className=\"p-4 bg-accent-soft rounded-full mb-4\">\n <Icon icon={FileText} size=\"xl\" color=\"primary\" />\n </div>\n <Text variant=\"label\" size=\"lg\" weight=\"semibold\">\n Select a file from your computer\n </Text>\n <Text variant=\"body\" size=\"sm\" className=\"text-text-muted mt-1 mb-6 text-center max-w-xs\">\n This file will be used directly in the form and will <strong>not</strong> be uploaded to platform storage.\n </Text>\n\n <label className=\"cursor-pointer\">\n <Button variant=\"primary\" size=\"lg\" loading={loading} className=\"pointer-events-none\">\n Browse Local File\n </Button>\n <input\n type=\"file\"\n className=\"hidden\"\n onChange={handleLocalOnlySelection}\n accept={accept}\n disabled={loading}\n />\n </label>\n </div>\n </div>\n )\n }\n ]}\n />\n </Modal>\n </div>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\nimport { fieldLabelClasses } from './TextField';\n\nexport interface TextAreaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /**\n * The label for the textarea field\n */\n label?: string;\n\n /**\n * Helper text to display below the textarea\n */\n helperText?: string;\n\n /**\n * Error message to display when the textarea is invalid\n */\n error?: string;\n\n /**\n * The size of the textarea field\n */\n size?: 'sm' | 'md' | 'lg' | 'full';\n\n /**\n * Whether the textarea should take the full width of its container\n */\n fullWidth?: boolean;\n\n /**\n * Whether the textarea is in a loading state\n */\n loading?: boolean;\n\n /**\n * Additional class name for the container\n */\n containerClassName?: string;\n\n /**\n * Additional class name for the label\n */\n labelClassName?: string;\n}\n\nconst textareaSizes = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2 text-base',\n lg: 'px-3 py-2 text-md',\n full: 'px-3 py-2 text-md',\n};\n\n/**\n * TextArea component with theme integration and validation states\n */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n helperText,\n error,\n size = 'md',\n fullWidth = false,\n loading = false,\n containerClassName,\n labelClassName,\n className,\n id,\n rows = 4,\n ...props\n },\n ref\n ) => {\n const reactId = React.useId();\n const textareaId = id || `textarea-${reactId}`;\n const hasError = Boolean(error);\n const describedBy = error || helperText ? `${textareaId}-description` : undefined;\n\n return (\n <div className={cn('flex flex-col', fullWidth && 'w-full', containerClassName)}>\n {label && (\n <label\n htmlFor={textareaId}\n className={cn(\n fieldLabelClasses,\n hasError ? 'text-danger-fg' : 'text-text-subtle',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn(\n 'block w-full resize-y rounded-md border bg-surface-input text-text',\n 'transition-colors duration-fast ease-out',\n 'placeholder:text-text-subtle',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled',\n\n textareaSizes[size],\n\n hasError\n ? 'border-danger-border bg-danger-soft'\n : 'border-border hover:border-border-strong',\n\n className\n )}\n {...props}\n />\n\n {loading && (\n <span\n aria-hidden\n className=\"absolute top-2 right-3 size-icon-md animate-spin rounded-full border-2 border-border border-t-transparent\"\n />\n )}\n </div>\n\n {(error || helperText) && (\n <p\n id={describedBy}\n className={cn('mt-1 text-xs', hasError ? 'text-danger-fg' : 'text-text-subtle')}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n","import { FilePointer, InternalSDK, VirtualMount } from \"@opencxh/domain\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../action/Button\";\nimport { Checkbox } from \"../input/Checkbox\";\nimport { DatePicker } from \"../input/DatePicker\";\nimport { FolderSelect, type FolderDestination } from \"../input/FolderSelect\";\nimport { Select } from \"../input/Select\";\nimport { StorageInput } from \"../input/StorageInput\";\nimport { TextArea } from \"../input/TextArea\";\nimport { TextField } from \"../input/TextField\";\nimport { cn } from \"../utils/cn\";\n\nexport type FormFieldType =\n | \"text\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"radio\"\n | \"date\"\n | \"file\"\n | \"folder\"\n | \"custom\"\n | \"array\";\n\ntype NestedKeys<T> = {\n [K in keyof T]: T[K] extends object\n ? `${K & string}.${NestedKeys<T[K]>}`\n : K & string;\n}[keyof T];\n\nfunction getValueByPath<T>(obj: T, path: string): unknown {\n return path\n .split(\".\")\n .reduce(\n (acc, key) =>\n acc && typeof acc === \"object\" && key in acc\n ? (acc as any)[key]\n : undefined,\n obj\n );\n}\n\nfunction setValueByPath<T extends object>(obj: T, path: string, value: any): T {\n const keys = path.split(\".\");\n const clone: any = Array.isArray(obj)\n ? [...(obj as any)]\n : { ...(obj as any) };\n let cur: any = clone;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n const prev = cur[k];\n cur[k] =\n prev && typeof prev === \"object\"\n ? Array.isArray(prev)\n ? [...prev]\n : { ...prev }\n : {};\n cur = cur[k];\n }\n cur[keys[keys.length - 1]] = value;\n return clone;\n}\n\nfunction unsetByPath<T extends object>(obj: T, path: string): T {\n const keys = path.split(\".\");\n const clone: any = Array.isArray(obj)\n ? [...(obj as any)]\n : { ...(obj as any) };\n let cur: any = clone;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (!cur[k] || typeof cur[k] !== \"object\") return clone; // niets te doen\n cur[k] = Array.isArray(cur[k]) ? [...cur[k]] : { ...cur[k] };\n cur = cur[k];\n }\n delete cur[keys[keys.length - 1]];\n return clone;\n}\n\nexport interface FormGroupItem<T = any> {\n /** Field name (key in form data) */\n name: NestedKeys<T>;\n /** Field label */\n label: string;\n /** Field type */\n type: FormFieldType;\n /** Text input type (when type is 'text') */\n textType?: \"text\" | \"email\" | \"password\" | \"number\" | \"tel\" | \"url\";\n /** Field width (CSS width value or grid columns) */\n width?: string | number;\n /** Placeholder text */\n placeholder?: string;\n /** Autocomplete attribute */\n autocomplete?: string;\n /** Options for select/radio/checkbox types */\n options?: Array<{\n value: string | number;\n label: string;\n disabled?: boolean;\n }>;\n /** Validation function */\n validator?: (value: any, formData: T) => string | null;\n /** Conditional function to show/hide field */\n conditional?: (formData: T) => boolean;\n /** Whether field can be empty */\n allowEmpty?: boolean;\n /** Remove field from form data when empty */\n removeIfEmpty?: boolean;\n /** Whether field is hidden */\n hidden?: boolean;\n /** Whether field is required */\n required?: boolean;\n /** Whether field is disabled */\n disabled?: boolean;\n /** Custom component renderer */\n customComponent?: (props: {\n value: any;\n onChange: (value: any) => void;\n error?: string;\n disabled?: boolean;\n }) => React.ReactNode;\n /** Additional props to pass to the field component */\n fieldProps?: Record<string, any>;\n\n /** For 'array' type, defines the fields for each item in the array */\n arrayFields?: FormGroupItem<any>[];\n\n /** For 'select' type, whether the select should be searchable */\n searchable?: boolean;\n\n /** For 'select' type, whether the select should be multiple */\n multiple?: boolean;\n\n allowCreate?: boolean;\n\n // todo: add support for array of objects\n}\n\nexport interface FormGroup<T = any> {\n /** Group identifier */\n id: string;\n /** Group title */\n title: string;\n /** Group description */\n description?: string;\n /** Group items */\n items: FormGroupItem<T>[];\n /** Conditional function to show/hide group */\n conditional?: (formData: T) => boolean;\n /** Group layout */\n layout?: \"grid\" | \"flex\";\n /** Number of columns for grid layout */\n columns?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface FormButtonProps {\n /** Button label */\n label: string;\n /** Button variant */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\";\n /** Button size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether button is disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface FormProps<T = Record<string, any>> {\n /** Form groups */\n groups: FormGroup<T>[];\n /** Initial form data */\n data?: Partial<T>;\n /** Form submit handler */\n onSubmit?: (data: T, transformedData?: any) => void | Promise<void>;\n /** Form cancel handler */\n onCancel?: () => void;\n /** Form change handler */\n onChange?: (data: Partial<T>, changedField?: keyof T) => void;\n /** Data transformation function (called before submit) */\n transform?: (data: T) => any;\n /** Form validation function */\n validate?: (data: T) => Record<keyof T, string> | null;\n /** Submit button props */\n submitButton?: FormButtonProps;\n /** Cancel button props */\n cancelButton?: FormButtonProps;\n /** Whether to show buttons */\n showButtons?: boolean;\n /** Form layout */\n layout?: \"vertical\" | \"horizontal\";\n /** Form size */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** Whether form is loading */\n loading?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Form ref */\n ref?: React.RefObject<HTMLFormElement>;\n /** SDK instance */\n sdk?: InternalSDK<any>;\n}\n\n/**\n * Generic Form component with groups, validation, and conditional rendering\n */\nexport const Form = <T extends Record<string, any>>({\n groups,\n data: externalData,\n onSubmit,\n onCancel,\n onChange,\n transform,\n validate,\n submitButton = { label: \"Submit\", variant: \"primary\" },\n cancelButton = { label: \"Cancel\", variant: \"outline\" },\n showButtons = true,\n layout = \"vertical\",\n size = \"md\",\n loading = false,\n className,\n ref,\n sdk,\n}: FormProps<T>) => {\n const [formData, setFormData] = useState<Partial<T>>(externalData || {});\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n // Update internal data when external data changes\n useEffect(() => {\n if (externalData) {\n setFormData({ ...externalData });\n }\n }, [externalData]);\n\n // Validate a single field\n const validateField = useCallback(\n (name: keyof T, value: any, currentData: Partial<T>) => {\n const field = groups\n .flatMap((group) => group.items)\n .find((item) => item.name === name);\n\n if (!field) return null;\n\n // Required validation\n if (\n field.required &&\n (value === undefined || value === null || value === \"\")\n ) {\n return `${field.label} is required`;\n }\n\n if (field.type === \"array\") {\n if (field.required && (!value || value.length === 0)) {\n return `${field.label} cannot be empty.`;\n }\n if (value && !Array.isArray(value)) {\n return `${field.label} must be an array.`;\n }\n\n if (Array.isArray(value) && field.arrayFields) {\n const arrayErrors: Record<string, any>[] = [];\n let hasErrors = false;\n value.forEach((row, index) => {\n const rowErrors: Record<string, string> = {};\n for (const subField of field.arrayFields!) {\n const subFieldValue = row?.[subField.name];\n if (\n subField.required &&\n (subFieldValue === undefined ||\n subFieldValue === null ||\n subFieldValue === \"\")\n ) {\n rowErrors[\n subField.name as string\n ] = `${subField.label} is required`;\n hasErrors = true;\n } else if (subField.validator) {\n const error = subField.validator(subFieldValue, row);\n if (error) {\n rowErrors[subField.name as string] = error;\n hasErrors = true;\n }\n }\n }\n arrayErrors[index] = rowErrors;\n });\n\n if (hasErrors) {\n return JSON.stringify(arrayErrors);\n }\n }\n }\n\n // Custom validation\n if (field.validator) {\n return field.validator(value, currentData as T);\n }\n\n return null;\n },\n [groups]\n );\n\n // Handle field change\n const handleFieldChange = useCallback(\n (name: keyof T, value: any) => {\n let newData = setValueByPath(\n formData as object,\n name as string,\n value\n ) as Partial<T>;\n\n // Handle removeIfEmpty\n const field = groups.flatMap((g) => g.items).find((i) => i.name === name);\n if (\n field?.removeIfEmpty &&\n (value === undefined || value === null || value === \"\")\n ) {\n newData = unsetByPath(newData as object, name as string) as Partial<T>;\n }\n\n setFormData(newData);\n setTouched((prev) => ({ ...prev, [name]: true }));\n\n // Validate field\n const error = validateField(name, value, newData);\n setErrors((prev) => ({\n ...prev,\n [name]: error || \"\",\n }));\n\n // Call onChange callback\n onChange?.(newData, name);\n },\n [formData, groups, validateField, onChange]\n );\n\n // Handle form submission\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (loading) return;\n\n // Validate all fields\n const newErrors: Record<string, string> = {};\n const allFields = groups.flatMap((group) => group.items);\n\n for (const field of allFields) {\n // Skip hidden or conditional fields\n if (\n field.hidden ||\n (field.conditional && !field.conditional(formData as T))\n ) {\n continue;\n }\n\n const error = validateField(\n field.name,\n getValueByPath<Partial<T>>(formData, field.name),\n formData\n );\n if (error) {\n newErrors[field.name as string] = error;\n }\n }\n\n // Run form-level validation\n if (validate) {\n const formErrors = validate(formData as T);\n if (formErrors) {\n Object.assign(newErrors, formErrors);\n }\n }\n\n setErrors(newErrors);\n\n // If there are errors, don't submit\n if (Object.keys(newErrors).some((key) => newErrors[key])) {\n return;\n }\n\n // Transform data if needed\n const finalData = transform ? transform(formData as T) : formData;\n\n // Submit form\n await onSubmit?.(formData as T, finalData);\n },\n [formData, groups, validateField, validate, transform, onSubmit, loading]\n );\n\n // Render field based on type\n const renderField = useCallback(\n (item: FormGroupItem<T>) => {\n const value = getValueByPath<Partial<T>>(formData, item.name) as\n | string\n | undefined;\n const error = touched[item.name as string]\n ? errors[item.name as string]\n : undefined;\n const isDisabled = item.disabled || loading;\n\n const commonProps = {\n value: value || \"\",\n disabled: isDisabled,\n required: item.required,\n placeholder: item.placeholder,\n ...item.fieldProps,\n };\n\n switch (item.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"number\":\n case \"tel\":\n case \"url\":\n return (\n <TextField\n {...commonProps}\n onChange={(e) => handleFieldChange(item.name, e.target.value)}\n type={item.textType || item.type}\n autoComplete={item.autocomplete}\n error={error}\n size={size}\n />\n );\n\n case \"textarea\":\n return (\n <TextArea\n {...commonProps}\n onChange={(e) => handleFieldChange(item.name, e.target.value)}\n rows={4}\n error={error}\n size={size}\n />\n );\n\n case \"select\":\n return (\n <Select\n {...commonProps}\n onChange={(e) => handleFieldChange(item.name, e)}\n options={(item.options || []).map((option) => ({\n ...option,\n value: String(option.value),\n }))}\n searchable={item.searchable}\n multiple={item.multiple}\n allowCreate={item.allowCreate}\n error={error}\n size={size}\n />\n );\n\n case \"checkbox\":\n return (\n <Checkbox\n {...commonProps}\n checked={Boolean(value)}\n onChange={(e) => handleFieldChange(item.name, e.target.checked)}\n size={size}\n />\n );\n\n case \"radio\":\n return (\n <div className=\"flex flex-col gap-2\">\n {item.options?.map((option) => (\n <label\n key={option.value}\n className=\"flex cursor-pointer items-center gap-2 text-base text-text\"\n >\n <input\n type=\"radio\"\n name={item.name as string}\n value={option.value}\n checked={value === option.value}\n onChange={() => handleFieldChange(item.name, option.value)}\n disabled={isDisabled || option.disabled}\n className=\"size-checkbox shrink-0 border border-border-strong bg-surface-input accent-accent focus-visible:outline-none focus-visible:focus-ring\"\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n\n case \"date\":\n return (\n <DatePicker\n {...commonProps}\n value={value ? new Date(value) : null}\n onChange={(date) => handleFieldChange(item.name, date)}\n size={size}\n />\n );\n\n case \"file\":\n return (\n <StorageInput\n {...commonProps}\n value={value}\n onChange={(pointer) => handleFieldChange(item.name, pointer)}\n error={error}\n onListFiles={(filters) => sdk?.http.invoke<{ data: FilePointer[] }>({\n method: \"POST\",\n action: \"storage.file.list\",\n body: filters,\n })}\n onListMounts={() => sdk?.http.invoke<{ data: VirtualMount[] }>({\n method: \"GET\",\n action: \"storage.mount\",\n })}\n onUploadFile={(payload) => sdk?.http.invoke<{ data: FilePointer }>({\n method: \"POST\",\n action: \"storage.file.upload\",\n body: payload,\n })}\n onDownloadFile={(fileId) => sdk?.http.invoke<Uint8Array>({\n method: \"GET\",\n action: `storage.file.${fileId}.download`,\n })}\n onRegisterFile={(payload) => sdk?.http.invoke<{ data: FilePointer }>({\n method: \"POST\",\n action: \"storage.file.folder\",\n body: payload,\n })}\n />\n );\n\n case \"folder\":\n return (\n <FolderSelect\n value={(value as unknown as FolderDestination) || {}}\n onChange={(v) => handleFieldChange(item.name, v)}\n onListFolders={() => sdk?.http.invoke<{ data: VirtualMount[] }>({\n method: \"GET\",\n action: \"storage.mount\",\n })}\n disabled={isDisabled}\n size={size}\n placeholder={item.placeholder}\n />\n );\n\n case \"custom\":\n return item.customComponent?.({\n value,\n onChange: (newValue) => handleFieldChange(item.name, newValue),\n error,\n disabled: isDisabled,\n });\n\n case \"array\": {\n const arrayValue = (value || []) as any[];\n let arrayErrors: Record<string, string>[] = [];\n if (typeof error === \"string\" && error.startsWith(\"[\")) {\n try {\n arrayErrors = JSON.parse(error);\n } catch (e) {\n // ignore parse error\n }\n }\n\n const handleAddItem = () => {\n handleFieldChange(item.name, [...arrayValue, {}]);\n };\n\n const handleRemoveItem = (index: number) => {\n handleFieldChange(\n item.name,\n arrayValue.filter((_, i) => i !== index)\n );\n };\n\n const handleSubFieldChange = (\n index: number,\n fieldName: string,\n fieldValue: any\n ) => {\n const newArray = [...arrayValue];\n newArray[index] = {\n ...newArray[index],\n [fieldName]: fieldValue,\n };\n handleFieldChange(item.name, newArray);\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arrayValue.map((row, index) => (\n <div key={index} className=\"flex items-start gap-2\">\n <div className=\"grid flex-1 gap-2 sm:grid-cols-2\">\n {item.arrayFields?.map((subField) => {\n const subFieldError =\n arrayErrors?.[index]?.[subField.name as string];\n return (\n <div\n key={subField.name as string}\n className=\"flex flex-col gap-1\"\n >\n {index === 0 && (\n <label className=\"block text-xs font-semibold uppercase tracking-label text-text-subtle\">\n {subField.label}\n {subField.required && (\n <span className=\"ml-1 text-danger-fg\">*</span>\n )}\n </label>\n )}\n {/* Note: Duplicating field rendering logic here. Could be refactored. */}\n {(() => {\n const commonSubFieldProps = {\n value: row?.[subField.name] || \"\",\n disabled: isDisabled,\n required: subField.required,\n placeholder: subField.placeholder,\n ...subField.fieldProps,\n };\n switch (subField.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"number\":\n case \"tel\":\n case \"url\":\n return (\n <TextField\n {...commonSubFieldProps}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e.target.value\n )\n }\n type={subField.textType || subField.type}\n autoComplete={subField.autocomplete}\n error={subFieldError}\n size={size}\n />\n );\n case \"textarea\":\n return (\n <TextArea\n {...commonSubFieldProps}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e.target.value\n )\n }\n rows={4}\n error={subFieldError}\n size={size}\n />\n );\n case \"select\":\n return (\n <Select\n {...commonSubFieldProps}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e\n )\n }\n options={(subField.options || []).map(\n (option) => ({\n ...option,\n value: String(option.value),\n })\n )}\n searchable={subField.searchable}\n multiple={subField.multiple}\n allowCreate={subField.allowCreate}\n error={subFieldError}\n size={size}\n />\n );\n case \"checkbox\":\n return (\n <Checkbox\n {...commonSubFieldProps}\n checked={Boolean(row?.[subField.name])}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e.target.checked\n )\n }\n size={size}\n />\n );\n case \"radio\":\n return (\n <div className=\"flex flex-col gap-2\">\n {subField.options?.map((option) => (\n <label\n key={option.value}\n className=\"flex cursor-pointer items-center gap-2 text-base text-text\"\n >\n <input\n type=\"radio\"\n name={`${item.name as string\n }.${index}.${subField.name as string\n }`}\n value={option.value}\n checked={\n row?.[subField.name] ===\n option.value\n }\n onChange={() =>\n handleSubFieldChange(\n index,\n subField.name as string,\n option.value\n )\n }\n disabled={\n isDisabled || option.disabled\n }\n className=\"size-checkbox shrink-0 border border-border-strong bg-surface-input accent-accent focus-visible:outline-none focus-visible:focus-ring\"\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n case \"date\": {\n const dateValue = row?.[subField.name];\n return (\n <DatePicker\n {...commonSubFieldProps}\n value={\n dateValue ? new Date(dateValue) : null\n }\n onChange={(date) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n date\n )\n }\n size={size}\n />\n );\n }\n case \"custom\":\n return subField.customComponent?.({\n value: row?.[subField.name],\n onChange: (newValue) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n newValue\n ),\n error: subFieldError,\n disabled: isDisabled,\n });\n // Add other field types here as needed\n default:\n return (\n <p>\n Unsupported field type in array:{\" \"}\n {subField.type}\n </p>\n );\n }\n })()}\n {subFieldError && (\n <p className=\"text-xs text-danger-fg\">{subFieldError}</p>\n )}\n </div>\n );\n })}\n </div>\n <Button\n type=\"button\"\n iconOnly\n variant=\"ghost\"\n size=\"md\"\n aria-label={`${item.label} verwijderen`}\n onClick={() => handleRemoveItem(index)}\n disabled={isDisabled}\n className={cn(\"shrink-0\", index === 0 && \"mt-5\")}\n >\n <Trash2 className=\"size-icon-md\" />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={<Plus className=\"size-icon-sm\" />}\n onClick={handleAddItem}\n disabled={isDisabled}\n >\n {item.label} toevoegen\n </Button>\n </div>\n );\n }\n\n default:\n return null;\n }\n },\n [formData, touched, errors, loading, size, handleFieldChange]\n );\n\n // Render form group\n const renderGroup = useCallback(\n (group: FormGroup<T>) => {\n // Check group conditional\n if (group.conditional && !group.conditional(formData as T)) {\n return null;\n }\n\n const visibleItems = group.items.filter((item) => {\n if (item.hidden) return false;\n if (item.conditional && !item.conditional(formData as T)) return false;\n return true;\n });\n\n if (visibleItems.length === 0) return null;\n\n const groupClasses = cn(\n group.layout === \"flex\" ? \"flex flex-wrap gap-3\" : \"grid gap-3\",\n group.layout !== \"flex\" && {\n \"grid-cols-1\": !group.columns || group.columns === 1,\n \"grid-cols-2\": group.columns === 2,\n \"grid-cols-3\": group.columns === 3,\n \"grid-cols-4\": group.columns === 4,\n },\n group.className\n );\n\n return (\n <div\n key={group.id}\n className=\"flex flex-col gap-4 px-5 py-4 not-first:border-t not-first:border-border-subtle sm:flex-row sm:gap-5\"\n >\n {/* Group Header — fixed label column, like every section in the kit */}\n <div className=\"w-full shrink-0 sm:w-form-label\">\n <span className=\"text-sm font-semibold text-text\">{group.title}</span>\n {group.description && (\n <p className=\"mt-1 text-xs leading-4 text-text-subtle\">\n {group.description}\n </p>\n )}\n </div>\n\n {/* Group Items */}\n <div className=\"min-w-0 flex-1\">\n <div className={groupClasses}>\n {visibleItems.map((item) => {\n const fieldError = touched[item.name as string]\n ? errors[item.name as string]\n : undefined;\n\n return (\n <div\n key={item.name as string}\n className={cn(\n \"flex min-w-0 flex-col gap-1.5\",\n item.type === \"checkbox\" && \"justify-center\"\n )}\n style={{\n width: typeof item.width === \"string\" ? item.width : undefined,\n gridColumn:\n typeof item.width === \"number\"\n ? `span ${item.width} / span ${item.width}`\n : undefined,\n }}\n >\n {/* Field Label — checkbox carries its own label on the right */}\n {item.type !== \"custom\" && item.type !== \"checkbox\" && (\n <label className=\"block text-xs font-semibold uppercase tracking-label text-text-subtle\">\n {item.label}\n {item.required && (\n <span className=\"ml-1 text-danger-fg\">*</span>\n )}\n </label>\n )}\n\n {/* Field Input */}\n {renderField(item)}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n [formData, touched, errors, renderField]\n );\n\n const formClasses = cn(\n \"overflow-hidden rounded-lg border border-border bg-surface\",\n {\n \"max-w-md\": size === \"sm\",\n \"max-w-2xl\": size === \"md\",\n \"max-w-4xl\": size === \"lg\",\n \"max-w-full\": size === \"full\",\n },\n className\n );\n\n const buttonSize = size === \"full\" ? \"md\" : size;\n\n return (\n <form ref={ref} onSubmit={handleSubmit} className={formClasses}>\n {/* Form Groups — sections in one panel, separated by a hairline */}\n <div className=\"flex flex-col\">{groups.map(renderGroup)}</div>\n\n {/* Footer — actions, or the autosave line when showButtons is false */}\n <div className=\"flex items-center gap-2 border-t border-border-subtle bg-surface-sunk px-5 py-3\">\n {showButtons && (\n <>\n <div className=\"ml-auto\" />\n {onCancel && (\n <Button\n type=\"button\"\n variant={cancelButton.variant ?? \"ghost\"}\n size={cancelButton.size || buttonSize}\n disabled={cancelButton.disabled || loading}\n onClick={onCancel}\n className={cancelButton.className}\n >\n {cancelButton.label}\n </Button>\n )}\n\n <Button\n type=\"submit\"\n variant={submitButton.variant}\n size={submitButton.size || buttonSize}\n disabled={submitButton.disabled || loading}\n loading={loading}\n className={submitButton.className}\n >\n {submitButton.label}\n </Button>\n </>\n )}\n </div>\n </form>\n );\n};\n","import React from \"react\";\nimport { Button } from \"../action/Button\";\nimport { Text } from \"../typography/Text\";\nimport { Modal } from \"./Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n /** What is about to happen, and what it costs if it is wrong. */\n description?: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n /** `danger` for anything that destroys or detaches something. */\n tone?: \"default\" | \"danger\";\n /** Disables both buttons and puts the confirm button in its loading state. */\n loading?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * Confirmation before a destructive or irreversible action.\n *\n * Replaces `window.confirm`, which blocks the main thread, cannot be styled,\n * cannot be translated, and is suppressed outright in some embedded contexts.\n * Note the shape difference: `confirm()` returns a boolean inline, so callers\n * written as `if (!confirm(...)) return;` have to split into a request step\n * and a confirm step.\n *\n * @example\n * ```tsx\n * <ConfirmDialog\n * open={pendingDelete !== null}\n * tone=\"danger\"\n * title={t(\"channel_delete_title\")}\n * description={t(\"channel_delete_description\")}\n * confirmLabel={t(\"delete\")}\n * onConfirm={() => remove(pendingDelete!)}\n * onCancel={() => setPendingDelete(null)}\n * />\n * ```\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Bevestigen\",\n cancelLabel = \"Annuleren\",\n tone = \"default\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <div className=\"flex w-full items-center justify-end gap-2\">\n <Button variant=\"ghost\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button\n variant={tone === \"danger\" ? \"destructive\" : \"primary\"}\n onClick={onConfirm}\n loading={loading}\n >\n {confirmLabel}\n </Button>\n </div>\n }\n >\n {description && <Text color=\"secondary\">{description}</Text>}\n </Modal>\n );\n}\n","import React from 'react';\nimport { X } from \"lucide-react\";\nimport { Icon } from \"../content/Icon\";\nimport { cn } from '../utils/cn';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * The visual variant of the badge\n */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info' | 'note';\n \n /**\n * The size of the badge\n */\n size?: 'sm' | 'md' | 'lg';\n \n /**\n * Whether the badge should have a dot indicator\n */\n dot?: boolean;\n \n /**\n * Icon to display in the badge\n */\n icon?: React.ReactNode;\n \n /**\n * Whether the badge can be dismissed\n */\n dismissible?: boolean;\n \n /**\n * Callback fired when the badge is dismissed\n */\n onDismiss?: () => void;\n}\n\n// Semantic, token-driven (mode-aware via CSS custom properties — no dark: overrides needed)\nconst badgeVariants = {\n default: 'bg-surface-hover text-text',\n primary: 'bg-accent-soft text-accent',\n secondary: 'bg-surface-hover text-text-muted',\n success: 'bg-success-soft text-success-fg',\n warning: 'bg-warning-soft text-warning-fg',\n error: 'bg-danger-soft text-danger-fg',\n info: 'bg-info-soft text-info-fg',\n // Internal-note amber. Never for customer-visible content.\n note: 'bg-note-soft text-note',\n};\n\nconst badgeSizes = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n};\n\nconst dotColors = {\n default: 'bg-surface-hover',\n primary: 'bg-accent',\n secondary: 'bg-surface-hover',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-danger',\n info: 'bg-info',\n note: 'bg-note',\n};\n\n/**\n * Badge component for displaying status indicators and labels\n * \n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * \n * <Badge variant=\"warning\" dot>\n * Pending\n * </Badge>\n * \n * <Badge variant=\"error\" dismissible onDismiss={() => console.log('dismissed')}>\n * Error\n * </Badge>\n * \n * <Badge variant=\"primary\" icon={<StarIcon />}>\n * Featured\n * </Badge>\n * ```\n */\nexport function Badge({\n variant = 'default',\n size = 'md',\n dot = false,\n icon,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n // Base styles\n 'inline-flex items-center font-medium rounded-full',\n \n // Variant styles\n badgeVariants[variant],\n \n // Size styles\n badgeSizes[size],\n \n className\n )}\n {...props}\n >\n {dot && (\n <span\n className={cn(\n 'w-2 h-2 rounded-full mr-1.5',\n dotColors[variant]\n )}\n />\n )}\n \n {icon && (\n <span className={cn('flex-shrink-0', children && 'mr-1')}>\n {icon}\n </span>\n )}\n \n {children}\n \n {dismissible && onDismiss && (\n <button\n onClick={onDismiss}\n className=\"ml-1.5 flex-shrink-0 hover:opacity-70 transition-opacity\"\n aria-label=\"Remove badge\"\n >\n <Icon icon={X} size=\"xs\" color=\"current\" />\n </button>\n )}\n </span>\n );\n} ","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Leading glyph or icon (e.g. a check for the focus \"queue empty\" state). */\n icon?: React.ReactNode;\n /** Tint of the icon disc. */\n tone?: \"neutral\" | \"success\";\n /** Headline. */\n title: React.ReactNode;\n /** Supporting copy. */\n description?: React.ReactNode;\n /** Action buttons row. */\n actions?: React.ReactNode;\n /** Render inside a raised card (focus \"done\" state) vs. plain centered block. */\n card?: boolean;\n}\n\nconst toneDisc: Record<NonNullable<EmptyStateProps[\"tone\"]>, string> = {\n neutral: \"bg-surface-hover text-text-muted\",\n success: \"bg-success-soft text-success-fg\",\n};\n\n/**\n * Centered empty / completion state (focus queue done, no-results lists).\n *\n * @example\n * ```tsx\n * <EmptyState card tone=\"success\" icon={<Icon icon={Check} size=\"lg\" />}\n * title=\"Wachtrij leeg — 7 afgehandeld\"\n * description=\"Nieuwe gesprekken verschijnen hier vanzelf.\"\n * actions={<Button>Terug naar Mijn dag</Button>} />\n * ```\n */\nexport function EmptyState({\n icon,\n tone = \"neutral\",\n title,\n description,\n actions,\n card = false,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center gap-2.5 text-center\",\n card && \"rounded-lg border border-border bg-surface px-11 py-9 shadow-overlay\",\n className,\n )}\n {...props}\n >\n {icon != null && (\n <span className={cn(\"flex size-disc items-center justify-center rounded-full text-2xl\", toneDisc[tone])}>\n {icon}\n </span>\n )}\n <div className=\"text-lg font-semibold text-text\">{title}</div>\n {description && <div className=\"max-w-sm text-sm leading-relaxed text-text-muted\">{description}</div>}\n {actions && <div className=\"flex gap-2 pt-1.5\">{actions}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n /** Key label, e.g. \"⌘K\", \"E\", \"↵\". */\n children: React.ReactNode;\n}\n\n/**\n * Keyboard-shortcut chip (the `⌘K` / `E` / `↵` hints in the redesign).\n *\n * @example\n * ```tsx\n * Zoeken <Kbd>⌘K</Kbd>\n * ```\n */\nexport function Kbd({ children, className, ...props }: KbdProps) {\n return (\n <kbd\n className={cn(\n \"inline-flex items-center rounded border border-border px-1.5 py-px text-xs font-medium leading-none text-text-muted\",\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Completion 0–100 (clamped). */\n value: number;\n /** Fill tone. */\n variant?: \"accent\" | \"success\";\n /** Track height. */\n size?: \"sm\" | \"md\";\n}\n\nconst trackSizes: Record<NonNullable<ProgressBarProps[\"size\"]>, string> = {\n sm: \"h-1\",\n md: \"h-1.5\",\n};\n\nconst fillVariants: Record<NonNullable<ProgressBarProps[\"variant\"]>, string> = {\n accent: \"bg-accent\",\n success: \"bg-success\",\n};\n\n/**\n * Slim determinate progress bar (focus queue progress, subtask completion).\n * Token-driven and mode-aware.\n *\n * @example\n * ```tsx\n * <ProgressBar value={40} />\n * <ProgressBar value={3 / 7 * 100} variant=\"success\" size=\"sm\" />\n * ```\n */\nexport function ProgressBar({ value, variant = \"accent\", size = \"md\", className, ...props }: ProgressBarProps) {\n const pct = Math.max(0, Math.min(100, value));\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n className={cn(\"w-full overflow-hidden rounded-full bg-surface-hover\", trackSizes[size], className)}\n {...props}\n >\n <div\n className={cn(\"h-full rounded-full transition-[width] duration-300 ease-out\", fillVariants[variant])}\n style={{ width: `${pct}%` }}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The size of the spinner\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n \n /**\n * The color variant of the spinner\n */\n variant?: 'primary' | 'secondary' | 'white' | 'current';\n \n /**\n * Optional label for accessibility\n */\n label?: string;\n \n /**\n * Whether to show the spinner with a label\n */\n showLabel?: boolean;\n}\n\nconst spinnerSizes = {\n xs: 'h-3 w-3',\n sm: 'h-4 w-4',\n md: 'h-6 w-6',\n lg: 'h-8 w-8',\n xl: 'h-12 w-12',\n};\n\nconst spinnerColors = {\n primary: 'text-accent',\n secondary: 'text-text-muted',\n white: 'text-white',\n current: 'text-current',\n};\n\nconst labelSizes = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n};\n\n/**\n * Spinner component for loading states\n * \n * @example\n * ```tsx\n * <Spinner size=\"md\" variant=\"primary\" />\n * \n * <Spinner size=\"lg\" variant=\"primary\" showLabel label=\"Loading...\" />\n * \n * <Spinner size=\"sm\" variant=\"white\" />\n * ```\n */\nexport function Spinner({\n size = 'md',\n variant = 'primary',\n label = 'Loading...',\n showLabel = false,\n className,\n ...props\n}: SpinnerProps) {\n return (\n <div\n className={cn(\n 'inline-flex items-center',\n showLabel ? 'flex-col space-y-2' : '',\n className\n )}\n {...props}\n >\n <svg\n className={cn(\n 'animate-spin',\n spinnerSizes[size],\n spinnerColors[variant]\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden={!showLabel}\n role={showLabel ? 'status' : undefined}\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n \n {showLabel && (\n <span\n className={cn(\n 'text-text-muted',\n labelSizes[size]\n )}\n >\n {label}\n </span>\n )}\n \n {/* Screen reader only text when label is not shown */}\n {!showLabel && (\n <span className=\"sr-only\">{label}</span>\n )}\n </div>\n );\n} ","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface StatusDotProps {\n /**\n * Meaning, not colour. `neutral` is the off/idle state; `accent` marks\n * unread; the rest follow the status tokens.\n */\n tone?:\n | \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"note\"\n /** Identity without status — an inbox, a speaker. See --color-cat-*. */\n | \"cat-1\" | \"cat-2\" | \"cat-3\" | \"cat-4\" | \"cat-5\";\n /** Square instead of round — the marker style used for inbox identity. */\n shape?: \"round\" | \"square\";\n /** Slow pulse for something live: an active call, a running recording. */\n pulse?: boolean;\n /**\n * Accessible name. Without one the dot is decorative and hidden from\n * assistive tech, which is right when adjacent text already says the state.\n */\n label?: string;\n className?: string;\n}\n\nconst tones: Record<NonNullable<StatusDotProps[\"tone\"]>, string> = {\n neutral: \"bg-text-disabled\",\n accent: \"bg-accent\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-danger\",\n info: \"bg-info\",\n note: \"bg-note\",\n \"cat-1\": \"bg-cat-1\",\n \"cat-2\": \"bg-cat-2\",\n \"cat-3\": \"bg-cat-3\",\n \"cat-4\": \"bg-cat-4\",\n \"cat-5\": \"bg-cat-5\",\n};\n\n/**\n * Small state marker: presence, session state, unread, live recording.\n *\n * Replaces a scatter of hand-rolled `h-2 w-2 rounded-full bg-green-500` spans\n * that used raw palette colours and disagreed on size (8px vs 10px).\n *\n * @example\n * ```tsx\n * <StatusDot tone=\"success\" label=\"Online\" />\n * <StatusDot tone=\"danger\" pulse label=\"Opname loopt\" />\n * ```\n */\nexport function StatusDot({\n tone = \"neutral\",\n shape = \"round\",\n pulse = false,\n label,\n className,\n}: StatusDotProps) {\n return (\n <span\n role={label ? \"img\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn(\n \"inline-block size-dot shrink-0\",\n shape === \"round\" ? \"rounded-full\" : \"rounded-sm\",\n tones[tone],\n pulse && \"animate-pulse\",\n className\n )}\n />\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface StepIndicatorProps {\n /** Step ids in order. Only the position matters; the ids identify `current`. */\n steps: string[];\n /** Id of the step being shown. Unknown ids render as \"not started\". */\n current: string;\n /**\n * `numbered` draws counted circles joined by a rule — use it when the user\n * needs to know how many steps are left. `dots` is the quieter bar, for a\n * flow whose heading already says where you are.\n */\n variant?: \"numbered\" | \"dots\";\n /**\n * Accessible name. Without one the indicator is treated as decorative, which\n * is right when a heading beside it already announces the current step.\n */\n label?: string;\n className?: string;\n}\n\n/**\n * Progress through a short, linear flow.\n *\n * @example\n * ```tsx\n * <StepIndicator steps={[\"provider\", \"channel\", \"owner\"]} current={step} />\n * <StepIndicator steps={[\"intent\", \"channel\", \"address\"]} current={step} variant=\"dots\" />\n * ```\n */\nexport function StepIndicator({\n steps,\n current,\n variant = \"numbered\",\n label,\n className,\n}: StepIndicatorProps) {\n const activeIndex = steps.indexOf(current);\n const shared = { role: label ? \"group\" : undefined, \"aria-label\": label, \"aria-hidden\": label ? undefined : true };\n\n if (variant === \"dots\") {\n return (\n <div {...shared} className={cn(\"flex items-center gap-1.5\", className)}>\n {steps.map((step, i) => (\n <span\n key={step}\n className={cn(\n \"h-step-bar rounded-full transition-all duration-fast ease-out\",\n i === activeIndex ? \"w-5 bg-accent\" : \"w-3.5\",\n i < activeIndex && \"bg-border-strong\",\n i > activeIndex && \"bg-border\"\n )}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div {...shared} className={cn(\"flex items-center gap-2\", className)}>\n {steps.map((step, i) => (\n <div key={step} className=\"flex items-center gap-2\">\n <span\n aria-current={i === activeIndex ? \"step\" : undefined}\n className={cn(\n \"flex size-tile-sm items-center justify-center rounded-full text-xs font-medium\",\n i === activeIndex && \"bg-accent text-accent-fg\",\n i < activeIndex && \"bg-accent-soft text-accent\",\n i > activeIndex && \"bg-surface-hover text-text-muted\"\n )}\n >\n {i + 1}\n </span>\n {i < steps.length - 1 && <span className=\"h-px w-8 bg-border-strong\" />}\n </div>\n ))}\n </div>\n );\n}\n","import { Sparkles } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface AssistantCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Card heading (e.g. \"Briefing van je assistent\", \"Voorstel van de assistent\"). */\n title: React.ReactNode;\n /** Leading icon; defaults to the lucide Sparkles icon. */\n icon?: React.ReactNode;\n /** Optional action rendered on the header's right (e.g. a \"Gebruiken\" button). */\n action?: React.ReactNode;\n /** Body content. */\n children?: React.ReactNode;\n}\n\n/**\n * AI-assistant card shell — the tinted \"Briefing / Voorstel van de assistent\"\n * surface used on Mijn dag and in the Focus queue. Uses the `--assistant-*`\n * design-system tokens so the tint is mode-aware.\n *\n * @example\n * ```tsx\n * <AssistantCard title=\"Voorstel van de assistent\" action={<Button size=\"xs\">Gebruiken</Button>}>\n * Marc wacht 12 min op WhatsApp — concept staat klaar.\n * </AssistantCard>\n * ```\n */\nexport function AssistantCard({ title, icon = <Sparkles className=\"size-icon-md\" aria-hidden />, action, children, className, ...props }: AssistantCardProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-2 rounded-xl border p-4\",\n \"border-assistant-border bg-assistant-soft\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2 text-assistant\">\n <span aria-hidden>{icon}</span>\n <span className=\"text-sm font-semibold\">{title}</span>\n {action && <span className=\"ml-auto\">{action}</span>}\n </div>\n {children && <div className=\"text-sm leading-relaxed text-text\">{children}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface AvatarProps {\n /** Full name; used for the initials fallback and alt/title text */\n name?: string;\n /** Optional image URL; falls back to initials when absent or on load error */\n src?: string;\n /** Size preset */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Additional CSS classes */\n className?: string;\n /** Override the title attribute (defaults to `name`) */\n title?: string;\n}\n\nconst sizeClasses: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\n xs: \"w-5 h-5 text-xs\",\n sm: \"w-6 h-6 text-xs\",\n md: \"w-7 h-7 text-base\",\n lg: \"w-9 h-9 text-sm\",\n};\n\nfunction initials(name?: string): string {\n if (!name) return \"?\";\n // Split op alles wat geen letter/cijfer is (spatie, @, ., -, _, …) zodat\n // adressen als \"mail-team@x.nl\" schone initialen geven (\"MT\"), niet \"M-\".\n const parts = name.trim().split(/[^\\p{L}\\p{N}]+/u).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return \"?\";\n}\n\n/**\n * Circular avatar: renders the photo when `src` is set (falling back to\n * initials on error), otherwise a monogram derived from `name`.\n */\nexport const Avatar: React.FC<AvatarProps> = ({ name, src, size = \"sm\", className, title }) => {\n const [errored, setErrored] = React.useState(false);\n const base = cn(\n \"inline-flex items-center justify-center rounded-full overflow-hidden shrink-0 font-semibold select-none bg-surface-hover-border-emphasis text-text\",\n sizeClasses[size],\n className,\n );\n\n if (src && !errored) {\n return (\n <img\n src={src}\n alt={name ?? \"\"}\n title={title ?? name}\n className={cn(base, \"object-cover\")}\n onError={() => setErrored(true)}\n />\n );\n }\n\n return (\n <span className={base} title={title ?? name} aria-label={name}>\n {initials(name)}\n </span>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Avatar, type AvatarProps } from \"./Avatar\";\n\nexport interface AvatarStackPerson {\n id?: string;\n name?: string;\n src?: string;\n /** Owner / assignee — rendered with an accent ring */\n owner?: boolean;\n /** Whether this person has seen the item; unseen renders dimmed */\n seen?: boolean;\n}\n\nexport interface AvatarStackProps {\n people: AvatarStackPerson[];\n /** Max avatars to show before collapsing the rest into a \"+N\" chip */\n max?: number;\n size?: AvatarProps[\"size\"];\n className?: string;\n}\n\n// Panel-coloured ring so overlapping avatars stay visually separated; the\n// owner gets an extra accent halo on top of it.\nconst RING = \"ring-surface\";\nconst OWNER_RING = \"ring-surface-accent\";\n\n/**\n * Overlapping row of avatars with an optional \"+N\" overflow chip. Unseen\n * people are dimmed; the owner carries an accent ring.\n */\nexport const AvatarStack: React.FC<AvatarStackProps> = ({ people, max = 4, size = \"sm\", className }) => {\n if (people.length === 0) return null;\n const shown = people.slice(0, max);\n const overflow = people.length - shown.length;\n\n return (\n <span className={cn(\"inline-flex items-center\", className)}>\n {shown.map((p, i) => (\n <Avatar\n key={p.id ?? `${p.name}-${i}`}\n name={p.name}\n src={p.src}\n size={size}\n title={p.name ? (p.seen === false ? `${p.name} — nog niet gelezen` : p.name) : undefined}\n className={cn(\n i > 0 && \"-ml-2\",\n p.owner ? OWNER_RING : RING,\n p.seen === false && \"opacity-40\",\n )}\n />\n ))}\n {overflow > 0 && (\n <span\n className={cn(\n \"inline-flex items-center justify-center rounded-full shrink-0 -ml-2 font-semibold bg-surface-hover text-text-muted\",\n size === \"xs\" ? \"w-5 h-5 text-xs\" : size === \"md\" ? \"w-7 h-7 text-xs\" : size === \"lg\" ? \"w-9 h-9 text-xs\" : \"w-6 h-6 text-xs\",\n RING,\n )}\n >\n +{overflow}\n </span>\n )}\n </span>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\n/** Communication channel keys the redesign colour-codes. */\nexport type ChannelKey = \"mail\" | \"wa\" | \"chat\" | \"tel\" | \"note\";\n\nexport interface ChannelBadgeProps {\n /** Channel — drives the colour. Unknown/undefined falls back to the neutral \"note\" tone. */\n channel?: ChannelKey | string;\n /** Glyph or short label inside the tile (e.g. an icon, or an initial). */\n children?: React.ReactNode;\n /** Tile size. */\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n title?: string;\n}\n\n/**\n * Channel key → semantic token pair. The keys are the redesign's shorthand\n * (`wa`, `tel`); the tokens spell the channel out (`whatsapp`, `phone`).\n * Written as whole class names so Tailwind can find them.\n */\nconst CH: Record<ChannelKey, { fg: string; bg: string }> = {\n mail: { fg: \"text-channel-mail-fg\", bg: \"bg-channel-mail-soft\" },\n wa: { fg: \"text-channel-whatsapp-fg\", bg: \"bg-channel-whatsapp-soft\" },\n chat: { fg: \"text-channel-chat-fg\", bg: \"bg-channel-chat-soft\" },\n tel: { fg: \"text-channel-phone-fg\", bg: \"bg-channel-phone-soft\" },\n note: { fg: \"text-channel-note-fg\", bg: \"bg-channel-note-soft\" },\n};\n\nconst sizes: Record<NonNullable<ChannelBadgeProps[\"size\"]>, string> = {\n sm: \"size-avatar-xs rounded-sm text-xs\",\n md: \"size-avatar-sm rounded-md text-xs\",\n lg: \"size-avatar-lg rounded-md text-base\",\n};\n\n/**\n * Coloured channel tile (the glyph-in-rounded-square used across inbox rows,\n * the focus queue, the attention list and Recent tabs). Colours come from the\n * `--color-channel-*` design-system tokens, so it is mode-aware.\n *\n * @example\n * ```tsx\n * <ChannelBadge channel=\"wa\">W</ChannelBadge>\n * <ChannelBadge channel=\"mail\" size=\"lg\"><MailIcon /></ChannelBadge>\n * ```\n */\nexport function ChannelBadge({ channel, children, size = \"md\", className, title }: ChannelBadgeProps) {\n const tone = CH[(channel as ChannelKey) in CH ? (channel as ChannelKey) : \"note\"];\n return (\n <span\n title={title}\n className={cn(\n \"inline-flex shrink-0 items-center justify-center font-bold\",\n sizes[size],\n tone.fg,\n tone.bg,\n className,\n )}\n >\n {children}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport { ImageOff } from \"lucide-react\";\nimport { Icon } from \"./Icon\";\nimport { cn } from '../utils/cn';\n\nexport interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Image source URL */\n src: string;\n /** Alt text for accessibility */\n alt: string;\n /** Image size preset */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** Aspect ratio */\n aspectRatio?: 'square' | 'video' | 'portrait' | 'landscape' | 'auto';\n /** Border radius */\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** Whether to show loading state */\n showLoading?: boolean;\n /** Whether to show error state */\n showError?: boolean;\n /** Fallback image URL */\n fallback?: string;\n /** Loading placeholder content */\n loadingContent?: React.ReactNode;\n /** Error placeholder content */\n errorContent?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Image component with loading states, error handling, and theme integration\n */\nexport const Image: React.FC<ImageProps> = ({\n src,\n alt,\n size = 'md',\n aspectRatio = 'auto',\n radius = 'md',\n showLoading = true,\n showError = true,\n fallback,\n loadingContent,\n errorContent,\n className,\n onLoad,\n onError,\n ...props\n}) => {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [currentSrc, setCurrentSrc] = useState(src);\n\n const handleLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setIsLoading(false);\n setHasError(false);\n onLoad?.(event);\n };\n\n const handleError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setIsLoading(false);\n setHasError(true);\n \n // Try fallback if available and not already using it\n if (fallback && currentSrc !== fallback) {\n setCurrentSrc(fallback);\n setHasError(false);\n setIsLoading(true);\n return;\n }\n \n onError?.(event);\n };\n\n const containerClasses = cn(\n 'relative overflow-hidden bg-surface-hover',\n \n // Size variants\n {\n 'w-8 h-8': size === 'xs',\n 'w-12 h-12': size === 'sm',\n 'w-16 h-16': size === 'md',\n 'w-24 h-24': size === 'lg',\n 'w-32 h-32': size === 'xl',\n 'w-full h-full': size === 'full',\n },\n \n // Aspect ratio variants\n {\n 'aspect-square': aspectRatio === 'square',\n 'aspect-video': aspectRatio === 'video',\n 'aspect-portrait': aspectRatio === 'portrait',\n 'aspect-landscape': aspectRatio === 'landscape',\n },\n \n // Border radius variants\n {\n 'rounded-none': radius === 'none',\n 'rounded-sm': radius === 'sm',\n 'rounded-md': radius === 'md',\n 'rounded-lg': radius === 'lg',\n 'rounded-xl': radius === 'xl',\n 'rounded-full': radius === 'full',\n },\n \n className\n );\n\n const imageClasses = cn(\n 'w-full h-full object-cover transition-opacity duration-fast',\n {\n 'opacity-0': isLoading || hasError,\n 'opacity-100': !isLoading && !hasError,\n }\n );\n\n const placeholderClasses = cn(\n 'absolute inset-0 flex items-center justify-center',\n 'text-text-muted'\n );\n\n const defaultLoadingContent = (\n <div className=\"animate-pulse\">\n <div className=\"w-6 h-6 bg-surface-hover rounded\"></div>\n </div>\n );\n\n const defaultErrorContent = (\n <div className=\"text-center\">\n <Icon icon={ImageOff} size=\"lg\" className=\"mx-auto mb-1\" />\n <span className=\"text-xs\">Failed to load</span>\n </div>\n );\n\n return (\n <div className={containerClasses}>\n <img\n {...props}\n src={currentSrc}\n alt={alt}\n className={imageClasses}\n onLoad={handleLoad}\n onError={handleError}\n />\n \n {/* Loading state */}\n {isLoading && showLoading && (\n <div className={placeholderClasses}>\n {loadingContent || defaultLoadingContent}\n </div>\n )}\n \n {/* Error state */}\n {hasError && showError && (\n <div className={placeholderClasses}>\n {errorContent || defaultErrorContent}\n </div>\n )}\n </div>\n );\n}; ","import { ChevronRight } from \"lucide-react\";\nimport React from \"react\";\nimport { Checkbox } from \"../input/Checkbox\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ListGroup {\n /** Group key — must match what `groupBy` returns */\n id: string;\n /** Header label; defaults to `id` */\n title?: string;\n /** Override the row count shown on the right */\n count?: number;\n /** Start collapsed (only with `collapsible`) */\n defaultCollapsed?: boolean;\n}\n\nexport interface ListProps<T> {\n /** Rows to render */\n items: T[];\n /** Stable key per row */\n getRowKey?: (item: T, index: number) => string | number;\n /** Row separation */\n variant?: \"plain\" | \"divided\" | \"bulleted\";\n /** Leading slot — channel tile, avatar, status dot */\n leading?: (item: T, index: number) => React.ReactNode;\n /** Main content; defaults to `String(item)` */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** Trailing slot — timestamp, badge, counter */\n trailing?: (item: T, index: number) => React.ReactNode;\n /** Row click */\n onSelect?: (item: T, index: number) => void;\n /**\n * Fired when keyboard focus lands on a row. Lets a consumer mirror the\n * roving focus into its own \"active\" state (what a hand-rolled `useArrowNav`\n * used to provide) without owning the key handling.\n */\n onActiveIndexChange?: (index: number) => void;\n /** Highlighted row (accent wash) */\n isActive?: (item: T, index: number) => boolean;\n /** Bold + accent dot */\n unread?: (item: T, index: number) => boolean;\n /** Deprioritised noise (opacity) */\n dimmed?: (item: T, index: number) => boolean;\n\n /** Group rows under headers. Return the group id for each row. */\n groupBy?: (item: T, index: number) => string;\n /**\n * Group order and labels. Groups missing here are appended in order of first\n * appearance; groups listed here but empty are skipped.\n */\n groups?: ListGroup[];\n /** Header renderer; defaults to label + count */\n renderGroupHeader?: (group: ListGroup, items: T[]) => React.ReactNode;\n /** Headers stick to the top of the scroll container */\n stickyGroupHeaders?: boolean;\n /** Headers become a toggle that folds the group */\n collapsibleGroups?: boolean;\n /** Hide the count on the right of the header */\n hideGroupCount?: boolean;\n\n /** Checkbox column + bulk bar */\n selectable?: boolean;\n /** Selected rows (controlled) */\n selectedItems?: T[];\n /** Selection handler */\n onSelectionChange?: (selected: T[]) => void;\n /** Actions shown in the bulk bar when a selection exists */\n bulkActions?: React.ReactNode;\n\n /**\n * Column-label strip above the rows (\"Van · Gesprek · tijd\"), like the inbox.\n * Align it with the row by reusing the same widths as `renderItem`.\n */\n header?: React.ReactNode;\n /** Keep the column-label strip visible while scrolling */\n stickyHeader?: boolean;\n\n /** Wrap the list in a bordered container */\n bordered?: boolean;\n /** Empty state content */\n emptyContent?: React.ReactNode;\n /** Loading state */\n loading?: boolean;\n /** Number of skeleton rows while loading */\n loadingRows?: number;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * List — one row is one object you open, with content of varying length\n * (inbox conversations, notifications, search results). No column headers:\n * hierarchy lives inside the row.\n *\n * Use `Table` instead when you compare values between rows (sortable columns,\n * aligned amounts, select-all in a header).\n *\n * Grouped, like the inbox and task views:\n *\n * @example\n * ```tsx\n * <List\n * items={tasks}\n * getRowKey={(t) => t.id}\n * bordered\n * groupBy={(t) => t.bucket} // \"today\" | \"tomorrow\" | \"later\"\n * groups={[\n * { id: \"today\", title: \"Vandaag\" },\n * { id: \"tomorrow\", title: \"Morgen\" },\n * { id: \"later\", title: \"Later\" },\n * ]}\n * stickyGroupHeaders\n * collapsibleGroups\n * leading={(t) => <ChannelBadge channel={t.channel} size=\"sm\" />}\n * renderItem={(t) => <span className=\"truncate\">{t.title}</span>}\n * trailing={(t) => t.due}\n * unread={(t) => !t.read}\n * />\n * ```\n */\nexport function List<T>({\n items,\n getRowKey,\n variant = \"divided\",\n leading,\n renderItem,\n trailing,\n onSelect,\n onActiveIndexChange,\n isActive,\n unread,\n dimmed,\n groupBy,\n groups,\n renderGroupHeader,\n stickyGroupHeaders = false,\n collapsibleGroups = false,\n hideGroupCount = false,\n selectable = false,\n selectedItems = [],\n onSelectionChange,\n bulkActions,\n header,\n stickyHeader = false,\n bordered = false,\n emptyContent,\n loading = false,\n loadingRows = 4,\n className,\n \"aria-label\": ariaLabel,\n}: ListProps<T>) {\n const [collapsed, setCollapsed] = React.useState<Record<string, boolean>>(() =>\n Object.fromEntries(\n (groups ?? [])\n .filter((g) => g.defaultCollapsed)\n .map((g) => [g.id, true])\n )\n );\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n /**\n * Roving focus across the rows. Rows are focusable in DOM order, so this walks\n * them directly rather than tracking an index — grouping and collapsing cannot\n * put it out of sync that way.\n */\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n\n const rows = Array.from(\n rootRef.current?.querySelectorAll<HTMLLIElement>(\"li[data-list-row]\") ?? []\n );\n if (rows.length === 0) return;\n event.preventDefault();\n\n const current = rows.indexOf(document.activeElement as HTMLLIElement);\n const next =\n event.key === \"Home\" ? 0\n : event.key === \"End\" ? rows.length - 1\n : event.key === \"ArrowDown\" ? (current + 1) % rows.length\n : (current - 1 + rows.length) % rows.length;\n\n rows[next]?.focus();\n };\n\n const keyOf = (item: T, index: number) =>\n getRowKey ? getRowKey(item, index) : index;\n\n const isSelected = (item: T) => selectedItems.includes(item);\n\n const toggle = (item: T, checked: boolean) => {\n if (!onSelectionChange) return;\n onSelectionChange(\n checked ? [...selectedItems, item] : selectedItems.filter((i) => i !== item)\n );\n };\n\n const toggleAll = (checked: boolean) =>\n onSelectionChange?.(checked ? [...items] : []);\n\n const container = cn(\n \"flex flex-col\",\n bordered && \"overflow-hidden rounded-lg border border-border-subtle\",\n className\n );\n\n if (loading) {\n return (\n <div className={container}>\n {Array.from({ length: loadingRows }).map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className={cn(\n \"flex animate-pulse items-center gap-3 px-4 py-2\",\n variant === \"divided\" && i > 0 && \"border-t border-border-subtle\"\n )}\n >\n <span className=\"size-tile-sm shrink-0 rounded-md bg-surface-hover\" />\n <span className=\"h-3 w-30 shrink-0 rounded-sm bg-surface-hover\" />\n <span className=\"h-3 flex-1 rounded-sm bg-surface-hover\" />\n <span className=\"h-3 w-8 shrink-0 rounded-sm bg-surface-hover\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (items.length === 0 && emptyContent) {\n return <div className={container}>{emptyContent}</div>;\n }\n\n const allSelected = items.length > 0 && selectedItems.length === items.length;\n const someSelected = selectedItems.length > 0 && !allSelected;\n\n // ---- rows, in one flat pass so `index` keeps pointing at the source item ----\n const renderRow = (item: T, index: number, firstInBlock: boolean) => {\n const active = isActive?.(item, index) ?? false;\n const isUnread = unread?.(item, index) ?? false;\n const isDimmed = dimmed?.(item, index) ?? false;\n const selected = selectable && isSelected(item);\n\n return (\n <li\n key={keyOf(item, index)}\n // A clickable row cannot be a <button>: it holds a checkbox and may hold\n // trailing actions, and buttons may not nest. Button semantics are put on\n // the row instead, so it is reachable, operable and announced correctly.\n {...(onSelect\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n \"data-list-row\": \"\",\n \"aria-current\": active || undefined,\n onClick: () => onSelect(item, index),\n onFocus: () => onActiveIndexChange?.(index),\n onKeyDown: (event: React.KeyboardEvent<HTMLLIElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n // Space scrolls the page by default.\n event.preventDefault();\n onSelect(item, index);\n },\n }\n : {})}\n className={cn(\n \"flex items-center gap-3 px-4 py-2 text-base\",\n \"transition-colors duration-fast ease-out\",\n variant === \"divided\" && !firstInBlock && \"border-t border-border-subtle\",\n onSelect && \"cursor-pointer focus-visible:outline-none focus-visible:focus-ring\",\n active || selected\n ? \"bg-accent-soft text-text\"\n : onSelect && \"hover:bg-surface-hover\",\n isUnread && \"font-bold\",\n isDimmed && \"opacity-55\"\n )}\n >\n {selectable && (\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n checked={isSelected(item)}\n onChange={(e) => toggle(item, e.target.checked)}\n aria-label=\"Rij selecteren\"\n />\n </span>\n )}\n\n {variant === \"bulleted\" && (\n <span\n aria-hidden\n className=\"mt-2 size-1.5 shrink-0 self-start rounded-full bg-border-strong\"\n />\n )}\n\n {leading && <span className=\"shrink-0\">{leading(item, index)}</span>}\n\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {renderItem ? renderItem(item, index) : String(item)}\n </div>\n\n {trailing && (\n <span className=\"shrink-0 text-xs text-text-subtle\">\n {trailing(item, index)}\n </span>\n )}\n </li>\n );\n };\n\n const body = (() => {\n if (!groupBy) {\n return items.map((item, index) => renderRow(item, index, index === 0));\n }\n\n // group id -> [{ item, index }], first-appearance order\n const buckets = new Map<string, { item: T; index: number }[]>();\n items.forEach((item, index) => {\n const id = groupBy(item, index);\n if (!buckets.has(id)) buckets.set(id, []);\n buckets.get(id)!.push({ item, index });\n });\n\n const declared = groups ?? [];\n const order: ListGroup[] = [\n ...declared.filter((g) => buckets.has(g.id)),\n ...[...buckets.keys()]\n .filter((id) => !declared.some((g) => g.id === id))\n .map((id) => ({ id })),\n ];\n\n return order.flatMap((group, groupIndex) => {\n const rows = buckets.get(group.id) ?? [];\n const isCollapsed = collapsibleGroups && collapsed[group.id];\n const label = group.title ?? group.id;\n const count = group.count ?? rows.length;\n\n const header = (\n <li\n key={`group-${group.id}`}\n onClick={\n collapsibleGroups\n ? () =>\n setCollapsed((prev) => ({ ...prev, [group.id]: !prev[group.id] }))\n : undefined\n }\n className={cn(\n \"flex items-center gap-2 bg-surface-sunk px-4 py-1.5\",\n \"text-xs font-semibold uppercase tracking-label text-text-subtle\",\n \"border-border-subtle\",\n groupIndex > 0 && \"border-t\",\n \"border-b\",\n stickyGroupHeaders && \"sticky z-10\",\n collapsibleGroups && \"cursor-pointer select-none hover:text-text\"\n )}\n aria-expanded={collapsibleGroups ? !isCollapsed : undefined}\n // the column strip is 28px tall, so grouped headers park underneath it\n style={stickyGroupHeaders ? { top: stickyHeader ? 28 : 0 } : undefined}\n >\n {renderGroupHeader ? (\n renderGroupHeader(group, rows.map((r) => r.item))\n ) : (\n <>\n {collapsibleGroups && (\n <ChevronRight\n aria-hidden\n className={cn(\n \"size-icon-sm shrink-0 transition-transform duration-fast ease-out\",\n !isCollapsed && \"rotate-90\"\n )}\n />\n )}\n <span>{label}</span>\n {!hideGroupCount && (\n <span className=\"ml-auto font-normal tabular-nums\">{count}</span>\n )}\n </>\n )}\n </li>\n );\n\n if (isCollapsed) return [header];\n\n return [\n header,\n ...rows.map(({ item, index }, rowIndex) =>\n renderRow(item, index, rowIndex === 0)\n ),\n ];\n });\n })();\n\n return (\n <div ref={rootRef} className={container} onKeyDown={onSelect ? handleKeyDown : undefined}>\n {selectable && selectedItems.length > 0 && (\n <div className=\"flex items-center gap-3 border-b border-border-subtle bg-surface-sunk px-4 py-2\">\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => toggleAll(e.target.checked)}\n aria-label=\"Alles selecteren\"\n />\n <span className=\"text-xs text-text-subtle\">\n {selectedItems.length} geselecteerd\n </span>\n {bulkActions && <div className=\"ml-auto flex gap-2\">{bulkActions}</div>}\n </div>\n )}\n\n {header && (\n <div\n className={cn(\n \"flex items-center gap-3 border-b border-border-subtle px-4 py-1.5\",\n \"text-xs font-semibold uppercase tracking-label text-text-subtle\",\n stickyHeader && \"sticky top-0 z-20\"\n )}\n >\n {header}\n </div>\n )}\n\n <ul aria-label={ariaLabel} className=\"flex flex-col\">\n {body}\n </ul>\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface MessageBubbleProps {\n /** Direction. `in` is received, `out` is sent by us. */\n side: \"in\" | \"out\";\n /**\n * Part of a run from the same sender. The bubble keeps its shape; callers use\n * this to drop the repeated header and avatar.\n */\n continued?: boolean;\n /**\n * `warning` for a message that is not settled yet, e.g. a pending draft.\n * `note` is the internal-note surface — amber, never customer-visible.\n */\n tone?: \"default\" | \"warning\" | \"note\";\n /**\n * Layout only — padding, flex behaviour, margins.\n *\n * Not width: the bubble caps its own, because `cn` is plain clsx with no\n * tailwind-merge, so a `max-w-*` passed here would not reliably beat the\n * default — both land in the class list and CSS order decides. A message\n * that runs the full width of the thread stops reading as a message.\n */\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * A single message in a conversation: chat, email and call transcript all use\n * the same shape.\n *\n * The corner facing the sender is tight (`rounded-sm`) and the other three are\n * `rounded-lg`, which is what makes direction readable without a tail. Sent\n * messages sit on `bg-bubble-out-soft`, a 4% ink wash — deliberately lighter than\n * `accent-soft`, which reads as heavy on every message you have ever sent.\n *\n * @example\n * ```tsx\n * <MessageBubble side=\"out\" className=\"max-w-bubble px-4 py-3\">\n * <Text>{body}</Text>\n * </MessageBubble>\n * ```\n */\nexport function MessageBubble({\n side,\n continued = false,\n tone = \"default\",\n className,\n children,\n}: MessageBubbleProps) {\n return (\n <div\n className={cn(\n // A bubble never spans the whole column; it narrows further from md,\n // where the thread itself is wide enough for the difference to matter.\n \"min-w-0 max-w-bubble border md:max-w-bubble-md\",\n tone === \"warning\" && \"border-warning-border\",\n tone === \"note\" && \"border-note-border\",\n tone === \"default\" && \"border-border\",\n // The tight corner points back at the sender.\n side === \"out\" ? \"rounded-lg rounded-tr-sm\" : \"rounded-lg rounded-tl-sm\",\n tone === \"note\"\n ? \"bg-note-soft\"\n : side === \"out\"\n ? \"bg-bubble-out-soft\"\n : \"bg-surface\",\n continued && \"mt-1\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface KpiCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The big number / metric. */\n value: React.ReactNode;\n /** Caption under the value. */\n label: React.ReactNode;\n /** Tone — `urgent` tints the number + border, `success` tints the number. */\n tone?: \"default\" | \"urgent\" | \"success\";\n}\n\nconst valueTone: Record<NonNullable<KpiCardProps[\"tone\"]>, string> = {\n default: \"text-text\",\n urgent: \"text-danger-fg\",\n success: \"text-success-fg\",\n};\n\nconst cardTone: Record<NonNullable<KpiCardProps[\"tone\"]>, string> = {\n default: \"border-border\",\n urgent: \"border-danger-border\",\n success: \"border-border\",\n};\n\n/**\n * KPI / stat card (the Mijn dag metric row). Token-driven, mode-aware.\n *\n * @example\n * ```tsx\n * <KpiCard value={3} label=\"wachten op jou · gem. 1u12\" />\n * <KpiCard value={1} label=\"dreigt SLA te missen\" tone=\"urgent\" />\n * ```\n */\nexport function KpiCard({ value, label, tone = \"default\", className, ...props }: KpiCardProps) {\n return (\n <div className={cn(\"rounded-xl border bg-surface px-4 py-3.5\", cardTone[tone], className)} {...props}>\n <div className={cn(\"text-2xl font-semibold\", valueTone[tone])}>{value}</div>\n <div className=\"pt-0.5 text-xs text-text-muted\">{label}</div>\n </div>\n );\n}\n","import { ArrowLeft, ChevronLeft, Pencil } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Button, type ButtonProps } from \"../action/Button\";\nimport { SplitButton, type SplitButtonOption } from \"../action/SplitButton\";\nimport { cn } from \"../utils/cn\";\nimport { Icon } from \"./Icon\";\n\nexport interface PageHeaderAction {\n /** Action identifier */\n id: string;\n /** Action label */\n label: string;\n /** Action icon */\n icon?: React.ReactNode;\n /** Action handler */\n onClick: () => void;\n /** Action variant. Tracks Button, so the two cannot drift apart. */\n variant?: ButtonProps[\"variant\"];\n /** Whether action is disabled */\n disabled?: boolean;\n /** Dropdown options for split button */\n splitOptions?: SplitButtonOption[];\n /**\n * Render this action yourself instead of as a Button — a filter chip, a\n * segmented toggle, an avatar stack. Position follows the array, so put it\n * before the buttons to have it sit to their left. When set, every other\n * field except `id` is ignored.\n */\n render?: () => React.ReactNode;\n}\n\nexport interface PageHeaderProps {\n /**\n * `plain` sits directly on the page. `surface` is the app-bar treatment:\n * its own background, full-bleed, closed off with a bottom border.\n */\n surface?: boolean;\n /** Page title */\n title: string;\n /** Page subtitle/description. Sits beside the title. */\n subtitle?: string;\n /**\n * Meta line under the title — a contact, a channel, a timestamp. Distinct\n * from `subtitle`, which sits beside the title, and from `children`, which\n * is the full-width row at the bottom of the header.\n */\n meta?: React.ReactNode;\n /** Breadcrumb items */\n breadcrumbs?: Array<{ label: string; href?: string }>;\n /** Action buttons */\n actions?: PageHeaderAction[];\n /** Additional content to render in the header */\n children?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Back button label */\n backLabel?: string;\n /** Back button handler */\n onBack?: () => void;\n /** Back button class name */\n backClassName?: string;\n /** Whether the title is editable */\n editable?: boolean;\n /** Callback when title is changed */\n onTitleChange?: (newTitle: string) => void;\n}\n\nexport const ChevronLeftIcon = () => <Icon icon={ChevronLeft} size=\"md\" color=\"current\" />;\n\n/**\n * PageHeader component for consistent page layouts with title, actions, and breadcrumbs\n */\nexport const PageHeader: React.FC<PageHeaderProps> = ({\n surface = false,\n title,\n subtitle,\n meta,\n actions = [],\n children,\n className,\n backLabel = \"Back\",\n backClassName,\n onBack,\n editable = false,\n onTitleChange,\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(title);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Update editValue when title prop changes\n useEffect(() => {\n setEditValue(title);\n }, [title]);\n\n // Focus input when editing starts\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n const handleTitleClick = () => {\n if (editable) {\n setIsEditing(true);\n }\n };\n\n const handleBlur = () => {\n setIsEditing(false);\n if (editValue.trim() !== \"\" && editValue !== title && onTitleChange) {\n onTitleChange(editValue.trim());\n } else {\n // Reset to original title if empty or unchanged\n setEditValue(title);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n setEditValue(title);\n setIsEditing(false);\n }\n };\n\n return (\n <div\n className={cn(\n \"p-5 pb-3\",\n // App-bar treatment: own background, full-bleed, closed with a rule.\n surface && \"bg-surface border-b border-border\",\n className\n )}\n >\n {/* Header Title + Actions */}\n <div className=\"flex flex-row sm:items-start sm:justify-between items-center gap-4\">\n {/* Title + Subtitle */}\n <div className=\"min-w-0 flex-1\">\n {/* Back sits beside the title block, not above the meta line, so the\n meta line starts under the title rather than under the button. */}\n <div className=\"flex items-start gap-2 text-text\">\n {onBack && (\n <Button variant=\"secondary\" onClick={onBack} leftIcon={<Icon icon={ArrowLeft} size=\"sm\" />} iconOnly />\n )}\n\n <div className=\"min-w-0 flex-1\">\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className=\"text-1xl font-semibold bg-transparent border-b-1 border-border rounded-lg outline-none focus:border-none px-1 -mx-1 min-w-0 w-full\"\n />\n ) : (\n <div className=\"group flex items-baseline gap-2.5 min-w-0\">\n <h2\n onClick={handleTitleClick}\n className={cn(\n \"text-2xl font-semibold truncate\",\n editable && \"cursor-pointer\"\n )}\n title={editable ? \"Klik om te bewerken\" : undefined}\n >\n {title}\n </h2>\n {subtitle && (\n <span className=\"shrink-0 text-base text-text-muted truncate\">{subtitle}</span>\n )}\n {editable && (\n <Pencil\n size={15}\n onClick={handleTitleClick}\n className=\"shrink-0 cursor-pointer text-text-muted opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n )}\n </div>\n )}\n\n {meta && (\n <div className=\"mt-0.5 truncate text-xs text-text-muted\">{meta}</div>\n )}\n </div>\n </div>\n </div>\n\n {/* Actions */}\n {actions.length > 0 && (\n <div className=\"flex flex-wrap sm:flex-nowrap gap-2 sm:gap-3\">\n {actions.map((action) =>\n action.render ? (\n <React.Fragment key={action.id}>{action.render()}</React.Fragment>\n ) : action.splitOptions && action.splitOptions.length > 0 ? (\n <SplitButton\n key={action.id}\n label={action.label}\n onClick={action.onClick}\n icon={action.icon}\n variant={action.variant === \"primary\" ? \"primary\" : \"secondary\"}\n options={action.splitOptions}\n disabled={action.disabled}\n />\n ) : (\n <Button\n key={action.id}\n variant={action.variant ?? \"secondary\"}\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n leftIcon={action.icon}\n >\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n\n {/* Custom Slot Content */}\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n );\n};\n","import { ArrowLeft } from \"lucide-react\";\nimport React from \"react\";\nimport { Button } from \"../action/Button\";\nimport { SplitButton } from \"../action/SplitButton\";\nimport { cn } from \"../utils/cn\";\nimport type { PageHeaderAction } from \"./PageHeader\";\n\nexport interface PageToolbarProps {\n /** Right-aligned action buttons */\n actions?: PageHeaderAction[];\n /** Renders a ghost back button on the left */\n onBack?: () => void;\n /** Back button label (visually hidden on small screens) */\n backLabel?: string;\n /** Additional CSS classes */\n className?: string;\n /** Optional extra content placed between back button and actions */\n children?: React.ReactNode;\n}\n\n/**\n * Thin action-bar for views that already have a host header (e.g. settings\n * overlay). Renders an optional back button on the left and action buttons on\n * the right. Use `PageHeader` when the view needs its own title/breadcrumbs.\n */\nexport const PageToolbar: React.FC<PageToolbarProps> = ({\n actions = [],\n onBack,\n backLabel = \"Back\",\n className,\n children,\n}) => {\n return (\n <div className={cn(\"flex items-center gap-2 mb-3\", className)}>\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack} leftIcon={<ArrowLeft size={14} />}>\n {backLabel}\n </Button>\n )}\n\n {children && <div className=\"flex-1 min-w-0\">{children}</div>}\n\n {actions.length > 0 && (\n <div className={cn(\"flex flex-wrap gap-2\", !children && \"ml-auto\")}>\n {actions.map((action) =>\n action.splitOptions && action.splitOptions.length > 0 ? (\n <SplitButton\n key={action.id}\n label={action.label}\n onClick={action.onClick}\n icon={action.icon}\n variant={action.variant === \"primary\" ? \"primary\" : \"secondary\"}\n options={action.splitOptions}\n disabled={action.disabled}\n />\n ) : (\n <Button\n key={action.id}\n variant={action.variant ?? \"secondary\"}\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n leftIcon={action.icon}\n >\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SectionDividerProps {\n /** Centred label. Without one the divider is a plain rule. */\n label?: React.ReactNode;\n /** Right-aligned slot after the rule, e.g. a count or a status. */\n trailing?: React.ReactNode;\n /** Push the label to the start instead of centring it. */\n align?: \"center\" | \"start\";\n className?: string;\n}\n\n/**\n * A hairline that separates two runs of content, optionally naming the run that\n * follows: day separators in a feed, group headings in search results.\n *\n * @example\n * ```tsx\n * <SectionDivider label=\"Gisteren\" />\n * <SectionDivider label=\"Gesprekken\" align=\"start\" trailing={<Badge>12</Badge>} />\n * ```\n */\nexport function SectionDivider({ label, trailing, align = \"center\", className }: SectionDividerProps) {\n const rule = <span className=\"h-px flex-1 bg-border-subtle\" aria-hidden />;\n\n if (!label && !trailing) {\n return <div className={cn(\"flex items-center py-2\", className)}>{rule}</div>;\n }\n\n return (\n <div className={cn(\"flex items-center gap-3 py-2\", className)}>\n {align === \"center\" && rule}\n <span className=\"shrink-0 text-xs font-medium text-text-muted\">{label}</span>\n {rule}\n {trailing && <span className=\"shrink-0\">{trailing}</span>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Icon } from \"./Icon\";\n\nexport interface SettingsRowProps {\n /** What the setting is called. */\n label: React.ReactNode;\n /** One line on what it does or what turning it on means. */\n description?: React.ReactNode;\n /** The control itself — a `Switch`, `Select`, `Button`… */\n control: React.ReactNode;\n /**\n * Draw the row as a bordered pill. Use it for a flat list of independent\n * toggles; leave it off inside a `SettingsSection`, which already groups.\n */\n bordered?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * One setting: label (+ description) on the left, its control on the right.\n *\n * @example\n * ```tsx\n * <SettingsRow\n * label=\"Agenda synchroniseren\"\n * description=\"Afspraken uit dit account verschijnen in je agenda.\"\n * control={<Switch checked={on} onChange={setOn} aria-label=\"Agenda synchroniseren\" />}\n * />\n * ```\n */\nexport function SettingsRow({\n label,\n description,\n control,\n bordered = false,\n disabled = false,\n className,\n}: SettingsRowProps) {\n return (\n <div\n className={cn(\n \"flex items-center justify-between gap-4 py-2\",\n bordered && \"rounded-lg border border-border px-3\",\n disabled && \"opacity-50\",\n className\n )}\n >\n <div className=\"min-w-0\">\n <div className=\"text-sm text-text\">{label}</div>\n {description && (\n <div className=\"text-xs text-text-muted\">{description}</div>\n )}\n </div>\n <div className=\"shrink-0\">{control}</div>\n </div>\n );\n}\n\nexport interface SettingsSectionProps {\n /** Lucide icon component, rendered in the section heading. */\n icon?: React.ComponentType<Record<string, unknown>>;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Right-aligned slot in the heading, e.g. a \"Reset\" button. */\n actions?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * A titled group of `SettingsRow`s. The body is indented to line up under the\n * title text rather than the icon.\n */\nexport function SettingsSection({\n icon,\n title,\n description,\n actions,\n children,\n className,\n}: SettingsSectionProps) {\n return (\n <section className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex items-start gap-2\">\n {icon && <Icon icon={icon} size=\"md\" color=\"secondary\" className=\"mt-0.5\" />}\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text\">{title}</h3>\n {description && (\n <p className=\"text-xs text-text-muted\">{description}</p>\n )}\n </div>\n {actions && <div className=\"shrink-0\">{actions}</div>}\n </div>\n <div className={cn(\"flex flex-col\", icon && \"pl-6\")}>{children}</div>\n </section>\n );\n}\n","import React from \"react\";\nimport { ArrowUpRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { Icon } from \"./Icon\";\n\nexport interface SourceChipProps {\n /** Label — the linked conversation subject. */\n label: React.ReactNode;\n /** Optional leading dot colour (a `--color-cat-*` or channel CSS var). */\n dotColor?: string;\n /** Click opens the linked conversation. */\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * Source-conversation chip — the \"open brongesprek / gekoppeld gesprek ↗\" pill\n * that links a task or focus item back to its conversation.\n *\n * @example\n * ```tsx\n * <SourceChip label=\"Vraag over factuur maart\" dotColor=\"var(--color-cat-2)\" onClick={openThread} />\n * ```\n */\nexport function SourceChip({ label, dotColor, onClick, className }: SourceChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"inline-flex max-w-full items-center gap-1.5 rounded-full bg-surface-sunk px-2.5 py-1 text-xs text-text-muted transition-colors duration-fast ease-out hover:bg-surface-hover hover:text-text\",\n className,\n )}\n >\n {dotColor && (\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full\" style={{ backgroundColor: dotColor }} aria-hidden />\n )}\n <span className=\"min-w-0 truncate\">{label}</span>\n <Icon icon={ArrowUpRight} size=\"xs\" className=\"opacity-70\" />\n </button>\n );\n}\n","import React, { useCallback } from \"react\";\nimport { Text } from \"../typography/Text\";\nimport { cn } from \"../utils/cn\";\n\nexport type ViewFieldType =\n | \"text\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"radio\"\n | \"date\"\n | \"custom\"\n | \"array\";\n\ntype NestedKeys<T> = {\n [K in keyof T]: T[K] extends object\n ? `${K & string}.${NestedKeys<T[K]>}`\n : K & string;\n}[keyof T];\n\nfunction getValueByPath<T>(obj: T, path: string): unknown {\n return path\n .split(\".\")\n .reduce(\n (acc, key) =>\n acc && typeof acc === \"object\" && key in acc\n ? (acc as any)[key]\n : undefined,\n obj\n );\n}\n\nexport interface ViewGroupItem<T = any> {\n /** Field name (key in data) */\n name: NestedKeys<T>;\n /** Field label */\n label: string;\n /** Field type */\n type: ViewFieldType;\n /** Field width (CSS width value or grid columns) */\n width?: string | number;\n /** Options for select/radio/checkbox types */\n options?: Array<{\n value: string | number;\n label: string;\n }>;\n /** Conditional function to show/hide field */\n conditional?: (data: T) => boolean;\n /** Whether field is hidden */\n hidden?: boolean;\n /** Custom component renderer */\n customComponent?: (props: { value: any }) => React.ReactNode;\n /** Format function for display value */\n format?: (value: any, data: T) => string | React.ReactNode;\n\n /** For 'array' type, defines the fields for each item in the array */\n arrayFields?: ViewGroupItem<any>[];\n}\n\nexport interface ViewGroup<T = any> {\n /** Group identifier */\n id: string;\n /** Group title */\n title: string;\n /** Group description */\n description?: string;\n /** Group items */\n items: ViewGroupItem<T>[];\n /** Conditional function to show/hide group */\n conditional?: (data: T) => boolean;\n /** Group layout */\n layout?: \"grid\" | \"flex\";\n /** Number of columns for grid layout */\n columns?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface ViewProps<T = Record<string, any>> {\n /** View groups */\n groups: ViewGroup<T>[];\n /** Data to display */\n data: T;\n /** View size */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Generic View component with groups and conditional rendering\n * Displays data in a read-only format matching the Form component layout\n */\nexport const View = <T extends Record<string, any>>({\n groups,\n data,\n size = \"md\",\n className,\n}: ViewProps<T>) => {\n // Format date for display\n const formatDate = (value: any): string => {\n if (!value) return \"-\";\n try {\n const date = new Date(value);\n return date.toLocaleDateString(\"nl-NL\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n } catch {\n return String(value);\n }\n };\n\n // Format checkbox value\n const formatCheckbox = (value: any): string => {\n return value ? \"Ja\" : \"Nee\";\n };\n\n // Get display value for select/radio options\n const getOptionLabel = (\n value: any,\n options?: Array<{ value: string | number; label: string }>\n ): string => {\n if (!options) return String(value || \"-\");\n const option = options.find((opt) => opt.value === value);\n return option ? option.label : String(value || \"-\");\n };\n\n // Render a single field\n const renderField = useCallback(\n (item: ViewGroupItem<T>) => {\n const value = getValueByPath(data, item.name as string);\n\n // Handle array type\n if (item.type === \"array\") {\n const arrayValue = value as any[] | undefined;\n if (!arrayValue || arrayValue.length === 0) {\n return (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text-muted\"\n >\n Geen items\n </Text>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n {arrayValue.map((row, index) => (\n <div\n key={index}\n className=\"p-4 border border-border rounded-xl space-y-3\"\n >\n <div className=\"flex items-center justify-between\">\n <Text\n variant=\"label\"\n size=\"sm\"\n weight=\"medium\"\n className=\"text-text-muted\"\n >\n {item.label} {index + 1}\n </Text>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n {item.arrayFields?.map((subField) => {\n const subValue = row?.[subField.name];\n let displayValue: React.ReactNode = \"-\";\n\n switch (subField.type) {\n case \"text\":\n case \"email\":\n case \"number\":\n case \"tel\":\n case \"url\":\n case \"textarea\":\n displayValue = subValue || \"-\";\n break;\n case \"select\":\n case \"radio\":\n displayValue = getOptionLabel(\n subValue,\n subField.options\n );\n break;\n case \"checkbox\":\n displayValue = formatCheckbox(subValue);\n break;\n case \"date\":\n displayValue = formatDate(subValue);\n break;\n case \"custom\":\n displayValue = subField.customComponent?.({\n value: subValue,\n });\n break;\n default:\n displayValue = String(subValue || \"-\");\n }\n\n if (subField.format) {\n displayValue = subField.format(subValue, row);\n }\n\n return (\n <div key={subField.name as string} className=\"space-y-1\">\n <Text\n variant=\"label\"\n size=\"xs\"\n className=\"text-text-muted\"\n >\n {subField.label}\n </Text>\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text\"\n >\n {displayValue}\n </Text>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n // Handle custom component\n if (item.type === \"custom\" && item.customComponent) {\n return item.customComponent({ value });\n }\n\n // Handle format function\n if (item.format) {\n const formatted = item.format(value, data);\n return (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text\"\n >\n {formatted}\n </Text>\n );\n }\n\n // Default rendering based on type\n let displayValue: React.ReactNode = \"-\";\n\n switch (item.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"number\":\n case \"tel\":\n case \"url\":\n displayValue = value ? String(value) : \"-\";\n break;\n\n case \"textarea\":\n displayValue = value ? (\n <div className=\"whitespace-pre-wrap\">{String(value || \"-\")}</div>\n ) : (\n \"-\"\n );\n break;\n\n case \"select\":\n case \"radio\":\n displayValue = getOptionLabel(value, item.options);\n break;\n\n case \"checkbox\":\n displayValue = formatCheckbox(value);\n break;\n\n case \"date\":\n displayValue = formatDate(value);\n break;\n\n default:\n displayValue = value ? String(value) : \"-\";\n }\n\n return (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text\"\n >\n {displayValue}\n </Text>\n );\n },\n [data]\n );\n\n // Render view group\n const renderGroup = useCallback(\n (group: ViewGroup<T>) => {\n // Check group conditional\n if (group.conditional && !group.conditional(data)) {\n return null;\n }\n\n const visibleItems = group.items.filter((item) => {\n if (item.hidden) return false;\n if (item.conditional && !item.conditional(data)) return false;\n return true;\n });\n\n if (visibleItems.length === 0) return null;\n\n const groupClasses = cn(\n \"space-y-4\",\n {\n \"grid gap-4\": group.layout === \"grid\",\n \"flex flex-wrap gap-4\": group.layout === \"flex\",\n },\n group.layout === \"grid\" && {\n \"grid-cols-1\": !group.columns || group.columns === 1,\n \"grid-cols-2\": group.columns === 2,\n \"grid-cols-3\": group.columns === 3,\n \"grid-cols-4\": group.columns === 4,\n },\n group.className\n );\n\n return (\n <div\n key={group.id}\n className=\"grid grid-cols-1 md:grid-cols-3 gap-8 p-6 border border-border rounded-xl\"\n >\n {/* Group Header */}\n <div className=\"md:col-span-1\">\n <Text\n variant=\"label\"\n size=\"lg\"\n weight=\"semibold\"\n className=\"text-text\"\n >\n {group.title}\n </Text>\n {group.description && (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text-muted mt-1\"\n >\n {group.description}\n </Text>\n )}\n </div>\n\n {/* Group Items */}\n <div className=\"md:col-span-2\">\n <div className={groupClasses}>\n {visibleItems.map((item) => {\n return (\n <div\n key={item.name as string}\n className=\"space-y-1\"\n // Inline, not `w-[…]`/`col-span-…`: those are built at runtime,\n // so Tailwind never sees them and `width` silently did nothing.\n // Same fix Form.tsx already carries.\n style={{\n width: typeof item.width === \"string\" ? item.width : undefined,\n gridColumn:\n typeof item.width === \"number\"\n ? `span ${item.width} / span ${item.width}`\n : undefined,\n }}\n >\n {/* Field Label */}\n {item.type !== \"custom\" && (\n <Text\n variant=\"label\"\n size=\"sm\"\n className=\"font-medium text-text-muted\"\n >\n {item.label}\n </Text>\n )}\n\n {/* Field Value */}\n {renderField(item)}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n [data, renderField]\n );\n\n const viewClasses = cn(\n \"space-y-6\",\n {\n \"max-w-md\": size === \"sm\",\n \"max-w-2xl\": size === \"md\",\n \"max-w-4xl\": size === \"lg\",\n \"max-w-full\": size === \"full\",\n },\n className\n );\n\n return (\n <div className={viewClasses}>\n {/* View Groups */}\n <div className=\"space-y-8\">{groups.map(renderGroup)}</div>\n </div>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface MenuItem {\n icon?: React.ReactNode;\n label: string;\n count?: number;\n children?: MenuItem[];\n path?: string;\n /**\n * @deprecated Groepen klappen niet meer in — een sectie met children rendert\n * als kop met zijn items eronder. Blijft bestaan zodat bestaande call-sites\n * blijven compileren; de waarde wordt genegeerd.\n */\n defaultCollapsed?: boolean;\n}\n\ninterface SidebarMenuProps {\n title: string;\n actionIcons?: React.ReactNode[];\n items: MenuItem[];\n isSelectedHandler: (path: string | undefined) => boolean;\n onClick?: (path: string | undefined) => void;\n preMenuItemsComponent?: React.ReactNode;\n}\n\ntype SelectedHandler = (path: string | undefined) => boolean;\ntype ClickHandler = (path: string | undefined) => void;\n\nconst SidebarMenuItem: React.FC<{\n item: MenuItem;\n isSelectedHandler: SelectedHandler;\n onClick?: ClickHandler;\n depth?: number;\n}> = ({ item, isSelectedHandler, onClick, depth = 0 }) => {\n const hasChildren = Boolean(item.children && item.children.length > 0);\n const isSelected = isSelectedHandler ? isSelectedHandler(item.path) : false;\n\n // Een item met children is een sectie, geen bestemming: geen hover, geen\n // cursor, geen selectie — alleen een kop boven zijn items.\n if (hasChildren) {\n return (\n <li>\n <div\n className={cn(\n \"flex items-center gap-2 px-2 pt-4 pb-1 text-xs font-semibold uppercase tracking-label text-text-subtle\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.count !== undefined && item.count > 0 && (\n <span className=\"font-normal tabular-nums\">{item.count}</span>\n )}\n </div>\n <ul className=\"flex flex-col gap-0.5\">\n {item.children?.map((child, index) => (\n <SidebarMenuItem\n key={index}\n item={child}\n isSelectedHandler={isSelectedHandler}\n onClick={onClick}\n depth={depth + 1}\n />\n ))}\n </ul>\n </li>\n );\n }\n\n return (\n <li>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => item.path && onClick?.(item.path)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n item.path && onClick?.(item.path);\n }\n }}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-base no-underline\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n isSelected\n ? \"bg-accent-soft font-semibold text-accent\"\n : \"text-text-muted hover:bg-surface-hover hover:text-text\",\n )}\n >\n {item.icon && (\n <span className=\"flex w-5 shrink-0 items-center justify-center\">{item.icon}</span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.count !== undefined && item.count > 0 && (\n <span\n className={cn(\n \"shrink-0 text-xs tabular-nums\",\n isSelected\n ? \"rounded-full bg-accent px-2 font-semibold text-accent-fg\"\n : \"text-text-subtle\"\n )}\n >\n {item.count}\n </span>\n )}\n </div>\n </li>\n );\n};\n\n/**\n * Sidebar — appnaam met optioneel één icon-actie rechts, daarboven/onder een\n * vrije slot (zoek), dan de nav-items. Secties met children zijn koppen, geen\n * knoppen. Geen workspace-switcher en geen gebruikersvoet: accountzaken staan\n * in de topbar.\n */\nexport const SidebarMenu: React.FC<SidebarMenuProps> = ({\n title,\n actionIcons,\n items,\n isSelectedHandler,\n onClick,\n preMenuItemsComponent,\n}) => {\n return (\n <nav className=\"flex h-full shrink-0 flex-col p-3 pt-4\">\n <div className=\"flex items-center gap-2 px-2 pb-3\">\n <span className=\"min-w-0 flex-1 truncate text-lg font-semibold text-text\">\n {title}\n </span>\n {actionIcons && actionIcons.length > 0 && (\n <div className=\"flex shrink-0 items-center gap-1\">\n {actionIcons.map((icon, index) => (\n <span\n key={index}\n className={cn(\n \"flex h-control-sm w-7 cursor-pointer items-center justify-center rounded-md text-text-strong\",\n \"transition-colors duration-fast ease-out hover:bg-surface-hover hover:text-text-strong\",\n \"focus-visible:outline-none focus-visible:focus-ring\"\n )}\n >\n {icon}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {preMenuItemsComponent && <div className=\"px-1 pb-3\">{preMenuItemsComponent}</div>}\n\n <ul className=\"flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto\">\n {items.map((item, index) =>\n !item.path && !item.label && !item.children ? (\n <li key={index} aria-hidden className=\"h-4\" />\n ) : (\n <SidebarMenuItem\n key={index}\n item={item}\n isSelectedHandler={isSelectedHandler}\n onClick={onClick}\n />\n )\n )}\n </ul>\n </nav>\n );\n};\n\nexport default SidebarMenu;\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface HeadingProps {\n /** Heading level */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** Visual size (can be different from semantic level) */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n /** Font weight */\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n /** Text color */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current';\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n /** Whether to truncate text with ellipsis */\n truncate?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Child content */\n children: React.ReactNode;\n}\n\n/**\n * Heading — semantic level, visual size from the token scale.\n *\n * md 13 · lg 16 (section head) · xl 20 (detail title)\n * 2xl 24 (page title) · 3xl / 4xl 30 (display)\n *\n * Default weight is semibold: the system has no 700 headings.\n */\nconst sizeMap: Record<NonNullable<HeadingProps['size']>, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-3xl',\n};\n\nconst weightMap: Record<NonNullable<HeadingProps['weight']>, string> = {\n light: 'font-normal',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n};\n\nconst colorMap: Record<NonNullable<HeadingProps['color']>, string> = {\n primary: 'text-text',\n secondary: 'text-text-muted',\n accent: 'text-accent',\n success: 'text-success-fg',\n warning: 'text-warning-fg',\n error: 'text-danger-fg',\n info: 'text-info-fg',\n neutral: 'text-text',\n current: 'text-current',\n};\n\nconst alignMap: Record<NonNullable<HeadingProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n};\n\nexport const Heading: React.FC<HeadingProps> = ({\n level = 1,\n size,\n weight = 'semibold',\n color = 'current',\n align = 'left',\n truncate = false,\n className,\n children,\n ...props\n}) => {\n const Tag = `h${level}` as keyof React.JSX.IntrinsicElements;\n\n const headingClasses = cn(\n 'font-sans text-pretty',\n sizeMap[size || getDefaultSize(level)!],\n weightMap[weight],\n colorMap[color],\n alignMap[align],\n truncate && 'truncate',\n className\n );\n\n return (\n <Tag className={headingClasses} {...props}>\n {children}\n </Tag>\n );\n};\n\nfunction getDefaultSize(level: number): HeadingProps['size'] {\n const sizeMap: Record<number, HeadingProps['size']> = {\n 1: '2xl',\n 2: 'xl',\n 3: 'lg',\n 4: 'lg',\n 5: 'md',\n 6: 'md',\n };\n\n return sizeMap[level] || 'md';\n}\n","import { ChevronRight, Search } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\n// Define the types for the command palette\nexport interface Command {\n id: string;\n label: string;\n action?: () => void;\n subCommands?: Command[];\n icon?: React.ReactNode;\n}\n\nexport interface CommandPaletteProps {\n commands: Command[];\n isOpen: boolean;\n onClose: () => void;\n labels?: {\n searchPlaceholder?: string;\n navigate?: string;\n select?: string;\n close?: string;\n noCommandsFound?: string;\n };\n initialCommandPath?: string[];\n initialActiveIndex?: number;\n}\n\nconst CommandPalette: React.FC<CommandPaletteProps> = ({\n commands,\n isOpen,\n onClose,\n labels,\n initialCommandPath,\n initialActiveIndex,\n}) => {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [activeCommandPath, setActiveCommandPath] = useState<string[]>(initialCommandPath || []);\n const [activeIndex, setActiveIndex] = useState(initialActiveIndex || 0);\n const paletteRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const currentCommands = activeCommandPath.length\n ? commands.find((c) => c.id === activeCommandPath[0])?.subCommands || []\n : commands;\n\n const filteredCommands = currentCommands.filter((command) =>\n command.label.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n // Reset state when the palette is closed\n useEffect(() => {\n if (!isOpen) {\n setSearchTerm(\"\");\n setActiveCommandPath(initialCommandPath || []);\n setActiveIndex(initialActiveIndex || 0);\n }\n }, [isOpen]);\n\n // Handle keyboard navigation\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n if (event.key === \"Escape\") {\n onClose();\n } else if (event.key === \"ArrowUp\") {\n setActiveIndex((prevIndex) =>\n prevIndex > 0 ? prevIndex - 1 : filteredCommands.length - 1\n );\n } else if (event.key === \"ArrowDown\") {\n setActiveIndex((prevIndex) =>\n prevIndex < filteredCommands.length - 1 ? prevIndex + 1 : 0\n );\n } else if (event.key === \"Enter\") {\n const command = filteredCommands[activeIndex];\n if (command) {\n if (command.subCommands) {\n setActiveCommandPath([...activeCommandPath, command.id]);\n setActiveIndex(0);\n } else if (command.action) {\n command.action();\n onClose();\n }\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, onClose, filteredCommands, activeIndex, activeCommandPath]);\n\n // Handle clicks outside the palette to close it\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n paletteRef.current &&\n !paletteRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen, onClose]);\n\n // Keep active item visible while scrolling via keyboard\n useEffect(() => {\n if (!isOpen) return;\n const el = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${activeIndex}\"]`);\n el?.scrollIntoView({ block: \"nearest\" });\n }, [activeIndex, isOpen]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-modal flex items-center justify-center bg-scrim\">\n <div\n className=\"flex flex-col w-full max-w-lg max-h-dialog p-2 mx-auto rounded-lg border border-border shadow-modal bg-surface\"\n ref={paletteRef}\n >\n <div className=\"flex items-center gap-2 px-3 flex-shrink-0\">\n <Search className=\"w-4 h-4 text-text-muted shrink-0\" />\n <input\n type=\"text\"\n autoFocus\n placeholder={labels?.searchPlaceholder || \"Search commands...\"}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"w-full border-0 bg-transparent py-2 text-text focus:outline-none\"\n />\n </div>\n <div\n ref={listRef}\n className=\"mt-2 pt-2 text-sm border-t border-border max-h-dialog-list overflow-y-auto\"\n >\n {filteredCommands.length === 0 && (\n <div className=\"text-text-muted text-center text-sm\">\n {labels?.noCommandsFound || \"No commands found\"}\n </div>\n )}\n {filteredCommands.map((command, index) => (\n <div\n key={command.id}\n data-index={index}\n className={`flex items-center p-2 cursor-pointer rounded-md ${index === activeIndex ? \"bg-accent-soft text-accent\" : \"text-text\"\n }`}\n onClick={() => {\n if (command.subCommands) {\n setActiveCommandPath([...activeCommandPath, command.id]);\n setActiveIndex(0);\n } else if (command.action) {\n command.action();\n onClose();\n }\n }}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {command.icon && <span className=\"mr-3\">{command.icon}</span>}\n <span className=\"flex-grow\">{command.label}</span>\n {command.subCommands && (\n <span className=\"text-text-muted\">\n <ChevronRight className=\"w-4 h-4\" />\n </span>\n )}\n </div>\n ))}\n </div>\n <div className=\"flex items-center gap-4 px-3 pt-2 mt-2 text-xs text-text-muted border-t border-border\">\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-5 px-1 py-0.5 rounded border border-border bg-surface-sunk text-xs font-medium not-italic\">↑↓</kbd>\n {labels?.navigate || \"to navigate\"}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-5 px-1 py-0.5 rounded border border-border bg-surface-sunk text-xs font-medium not-italic\">↵</kbd>\n {labels?.select || \"to select\"}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-5 px-1 py-0.5 rounded border border-border bg-surface-sunk text-xs font-medium not-italic\">Esc</kbd>\n {labels?.close || \"to close\"}\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CommandPalette;\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface BoxProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Padding size\n */\n padding?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n /**\n * Margin size\n */\n margin?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n /**\n * Background color\n */\n background?: 'none' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'white' | 'module' | 'module-subtle' | 'backdrop' | 'editor' | 'input';\n\n /**\n * Border radius\n */\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n /**\n * Shadow size\n */\n shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n /**\n * Border width\n */\n border?: 'none' | 'sm' | 'md' | 'lg';\n\n /**\n * Border color\n */\n borderColor?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'white';\n}\n\n/** 4px spacing scale only. */\nconst paddingMap = {\n none: 'p-0',\n xs: 'p-1',\n sm: 'p-2',\n md: 'p-4',\n lg: 'p-6',\n xl: 'p-8',\n '2xl': 'p-12',\n};\n\nconst marginMap = {\n none: 'm-0',\n xs: 'm-1',\n sm: 'm-2',\n md: 'm-4',\n lg: 'm-6',\n xl: 'm-8',\n '2xl': 'm-12',\n};\n\n/** Semantic surfaces — the legacy `module` names stay as aliases. */\nconst backgroundMap = {\n none: '',\n primary: 'bg-accent text-accent-fg',\n secondary: 'bg-surface-hover',\n accent: 'bg-accent-soft',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n error: 'bg-danger-soft',\n info: 'bg-info-soft',\n neutral: 'bg-surface-hover',\n white: 'bg-surface',\n module: 'bg-surface',\n 'module-subtle': 'bg-surface-sunk',\n backdrop: 'bg-page',\n editor: 'bg-surface',\n input: 'bg-surface-input',\n};\n\nconst radiusMap = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n full: 'rounded-full',\n};\n\n/**\n * Elevation: cards are defined by their border, not a shadow — `sm` is\n * intentionally flat. Shadows only mean \"this floats above the page\".\n */\nconst shadowMap = {\n none: 'shadow-none',\n sm: 'shadow-none',\n md: 'shadow-overlay',\n lg: 'shadow-overlay',\n xl: 'shadow-modal',\n '2xl': 'shadow-modal',\n};\n\nconst borderMap = {\n none: 'border-0',\n sm: 'border',\n md: 'border-2',\n lg: 'border-4',\n};\n\nconst borderColorMap = {\n primary: 'border-accent-border',\n secondary: 'border-border',\n accent: 'border-accent-border',\n success: 'border-success-border',\n warning: 'border-warning-border',\n error: 'border-danger-border',\n info: 'border-info-border',\n neutral: 'border-border-subtle',\n white: 'border-border-subtle',\n};\n\n/**\n * Box primitive component for layout and styling\n *\n * @example\n * ```tsx\n * <Box padding=\"md\" background=\"module\" radius=\"lg\" border=\"sm\" borderColor=\"neutral\">\n * Content\n * </Box>\n * ```\n */\nexport const Box = forwardRef<HTMLDivElement, BoxProps>(\n (\n {\n padding,\n margin,\n background,\n radius,\n shadow,\n border,\n borderColor,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n padding && paddingMap[padding],\n margin && marginMap[margin],\n background && backgroundMap[background],\n radius && radiusMap[radius],\n shadow && shadowMap[shadow],\n border && borderMap[border],\n borderColor && borderColorMap[borderColor],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nBox.displayName = 'Box';\n","import { Box, BoxProps } from \"./Box\";\n\nexport interface CardProps extends BoxProps {\n children: React.ReactNode;\n title?: string;\n}\n\n/**\n * Card — panel on a page background. Border, never a shadow (radius-lg = 12px).\n */\nexport const Card = ({ children, title, ...props }: CardProps) => {\n return (\n <Box\n background=\"module\"\n radius=\"lg\"\n shadow=\"none\"\n border=\"sm\"\n borderColor=\"neutral\"\n {...props}\n >\n {title && (\n <span className=\"mb-2 block text-sm font-semibold text-text\">{title}</span>\n )}\n {children}\n </Box>\n );\n};\n","import React, { useEffect, useRef, useState } from \"react\";\n\ninterface FederatedResourceProps {\n identifier: string;\n resourceLoader: () => Promise<any>;\n framework?: 'react' | 'svelte' | 'vanilla';\n fallback?: React.ReactNode;\n componentProps?: Record<string, any>;\n className?: string;\n}\n\nexport function FederatedResource({\n identifier,\n resourceLoader,\n framework = 'react',\n fallback,\n componentProps,\n className,\n}: FederatedResourceProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [ExternalComponent, setExternalComponent] = useState<any>(null);\n\n const svelteInstanceRef = useRef<any>(null);\n const vanillaCleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadResource = async () => {\n setIsLoading(true);\n try {\n const module = await resourceLoader();\n if (!isMounted) return;\n\n const Component = module.component || module.default || module;\n\n if (framework === 'react') {\n setExternalComponent(() => Component);\n } else {\n setExternalComponent(() => module);\n }\n } catch (err) {\n console.error(`[FederatedResource] Load failed: ${identifier}`, err);\n } finally {\n if (isMounted) setIsLoading(false);\n }\n };\n\n loadResource();\n return () => { isMounted = false; };\n }, [identifier, resourceLoader]);\n\n useEffect(() => {\n if (isLoading || !ExternalComponent || framework === 'react') return;\n\n const target = containerRef.current;\n if (!target) return;\n\n if (framework === 'svelte') {\n const Component = ExternalComponent.default || ExternalComponent;\n const instance = new Component({ target, props: componentProps || {} });\n svelteInstanceRef.current = instance;\n return () => instance.$destroy();\n }\n\n if (ExternalComponent.mount) {\n const cleanup = ExternalComponent.mount({ container: target, props: componentProps || {} });\n return () => {\n if (typeof cleanup === 'function') cleanup();\n else ExternalComponent.unmount?.(target);\n };\n }\n }, [ExternalComponent, framework, isLoading]);\n\n useEffect(() => {\n if (framework === 'svelte' && svelteInstanceRef.current) {\n svelteInstanceRef.current.$set?.(componentProps);\n }\n }, [componentProps, framework]);\n\n return (\n <div ref={containerRef} className={className} style={{ display: 'contents' }}>\n {isLoading && fallback}\n\n {framework === 'react' && ExternalComponent && (\n <ExternalComponent {...componentProps} />\n )}\n </div>\n );\n}","import type { ErrorInfo, ReactNode } from \"react\";\nimport { Component } from \"react\";\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n name?: string;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n error: null,\n };\n\n public static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(`[ErrorBoundary] Error in ${this.props.name || 'Component'}:`, error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-4 m-4 border border-danger-border bg-danger-soft rounded-lg\">\n <h2 className=\"text-lg font-semibold text-danger-fg\">Something went wrong</h2>\n <p className=\"text-sm text-danger-fg mt-1\">\n {this.props.name ? `Error in ${this.props.name}` : 'The component failed to render.'}\n </p>\n <button\n className=\"mt-4 px-4 py-2 bg-danger text-on-error rounded hover:opacity-90 transition-opacity text-sm\"\n onClick={() => this.setState({ hasError: false, error: null })}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"names":["cn","inputs","clsx","createVariants","variants","variant","value","createSizes","sizes","size","MeetingGrid","tiles","pinned","className","jsx","t","i","cols","ParticipantTile","name","avatarUrl","muted","speaking","hasVideo","videoSlot","fill","jsxs","VideoOff","User","MicOff","Mic","VideoSurface","attach","active","mirrored","ref","useRef","useEffect","cleanup","buttonVariants","buttonSizes","iconOnlySizes","Button","forwardRef","fullWidth","loading","leftIcon","rightIcon","iconOnly","shape","children","disabled","props","isDisabled","ButtonGroup","orientation","attached","baseClasses","colorMap","Icon","IconComponent","color","clickable","onClick","ariaLabel","sizeValue","getSizeValue","iconClasses","iconProps","e","tones","FilterChip","label","icon","tone","caret","onClear","clearLabel","title","showClear","radius","shell","body","Fragment","ChevronDown","bodyClasses","X","sizeMap","buttonBackgroundMap","Link","external","href","target","rel","isExternal","linkProps","ExternalLink","SegmentedToggle","options","onChange","opt","useAnchoredPosition","open","anchorRef","gap","matchWidth","placement","style","setStyle","useState","useLayoutEffect","place","anchor","rect","spaceBelow","spaceAbove","wantsTop","flip","onTop","next","Popover","trigger","rootClassName","triggerClassName","triggerLabel","isOpen","setIsOpen","rootRef","triggerRef","panelStyle","onDown","event","onEsc","handleToggle","close","variantStyles","chevronSizes","SplitButton","menuPlacement","menuLabel","hasMenu","option","checkboxSizes","rowSizes","labelSizes","Checkbox","helperText","error","indeterminate","containerClassName","labelClassName","id","reactId","React","checkboxId","hasError","innerRef","setRefs","node","CalendarIcon","Calendar","ChevronLeftIcon","ChevronLeft","ChevronRightIcon","ChevronRight","DatePicker","placeholder","required","minDate","maxDate","format","withTime","currentMonth","setCurrentMonth","containerRef","fieldRef","handleClickOutside","formatDate","date","day","month","year","datePart","formatTime","handleTimeChange","hours","minutes","base","getCalendarDays","firstDay","startDate","days","current","handleDateSelect","picked","handlePrevMonth","handleNextMonth","handleClear","inputClasses","calendarDays","monthNames","index","isCurrentMonth","isSelected","isToday","selectSizes","norm","s","Select","searchable","multiple","allowCreate","onCreateOption","selectId","searchTerm","setSearchTerm","localOptions","setLocalOptions","includesOption","opts","needle","o","ensureValuesInOptions","baseOptions","currentValue","out","addIfMissing","v","val","prev","handleSelect","optionValue","currentValues","newValues","selectedOption","selectedOptions","filteredOptions","canCreate","createOption","labelToCreate","clean","newOption","getDisplayValue","ChevronDownIcon","inputSizes","fieldLabelClasses","TextField","startIcon","endIcon","inputId","describedBy","FolderSelect","onListFolders","templatePlaceholder","showTemplate","folders","setFolders","res","f","classes","SearchIcon","Search","iconSizes","SearchableTextField","externalLoading","onRemoteSearch","onSelect","debounceTime","showAllOnOpen","propValue","inputRef","inputValue","setInputValue","isSearchingRemote","setIsSearchingRemote","typedSinceOpen","setTypedSinceOpen","useMemo","lowerCaseInput","handler","handleChange","newValue","handleFocus","showDropdown","resolvedRef","Loader2","Switch","checked","track","ContentLoading","showTableSkeleton","tableColumns","tableRows","Shell","inner","_","idx","rowIdx","colIdx","Dropdown","showCheck","header","hoveredOption","setHoveredOption","submenuPosition","setSubmenuPosition","dropdownRef","submenuRef","menuRef","menuPos","hideTimeoutRef","menuItems","handleMenuKeyDown","items","handleEscape","hoveredElement","handleTriggerClick","handleOptionClick","parentValue","handleOptionHover","handleOptionLeave","handleSubmenuOptionClick","dropdownClasses","submenuClasses","hasChildren","isHovered","Check","childOption","childIndex","totalOptions","count","childCount","child","ChevronUpIcon","ChevronUp","ChevronsLeftIcon","ChevronsLeft","ChevronsRightIcon","ChevronsRight","ChevronDownSmallIcon","FilterDropdown","Table","data","columns","searchPlaceholder","filters","paginated","pageSizeOptions","defaultPageSize","actions","onRowClick","selectable","selectedRows","onSelectionChange","getRowKey","row","emptyContent","hoverable","bordered","striped","rowClassName","sortState","setSortState","pagination","setPagination","tableRef","filteredData","result","searchableColumns","col","lowerSearchTerm","column","filter","sortedData","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSort","useCallback","columnId","handlePageChange","newPage","handlePageSizeChange","newPageSize","handleRowSelection","rowKey","r","handleSelectAll","totalItems","totalPages","startItem","endItem","allVisibleSelected","selectedRow","someVisibleSelected","tableClasses","headerClasses","cellClasses","rowClasses","el","action","actionId","TabsContext","createContext","TabBar","activeTab","onTabChange","internalActiveTab","setInternalActiveTab","currentActiveTab","handleTabClick","tabId","item","Tabs","defaultTab","handleTabChange","contextValue","activeTabItem","tabListClasses","tabClasses","isActive","sizeClasses","variantClasses","stateClasses","activeClasses","inactiveClasses","modalSizes","Modal","onClose","closeOnBackdropClick","closeOnEscape","backdropClassName","footer","showCloseButton","modalRef","previousActiveElement","handleBackdropClick","weightMap","alignMap","lineHeightMap","Text","weight","align","truncate","italic","underline","lineHeight","as","Tag","getDefaultElement","isCaption","isLabel","isCode","textClasses","StorageInput","accept","onListFiles","onListMounts","onUploadFile","onDownloadFile","onRegisterFile","isModalOpen","setIsModalOpen","mounts","setMounts","selectedMount","setSelectedMount","currentPath","setCurrentPath","remoteFiles","setRemoteFiles","setLoading","selectedPointer","setSelectedPointer","isCreatingFolder","setIsCreatingFolder","newFolderName","setNewFolderName","fileInputRef","loadMounts","loadFiles","resp","err","handleLocalOnlySelection","file","buffer","content","virtualPointer","handleUploadToStorage","pointer","handleCreateFolder","fullPath","handleSelectRemote","explorerItems","files","path","parts","p","handleFolderClick","folderName","handleGoBack","tableData","explorerColumns","Folder","FileText","mountColumns","HardDrive","ArrowLeft","FolderPlus","Upload","textareaSizes","TextArea","rows","textareaId","getValueByPath","obj","acc","key","setValueByPath","keys","clone","cur","k","unsetByPath","Form","groups","externalData","onSubmit","onCancel","transform","validate","submitButton","cancelButton","showButtons","layout","sdk","formData","setFormData","errors","setErrors","touched","setTouched","validateField","currentData","field","group","arrayErrors","hasErrors","rowErrors","subField","subFieldValue","handleFieldChange","newData","g","handleSubmit","newErrors","allFields","formErrors","finalData","renderField","commonProps","payload","fileId","arrayValue","handleAddItem","handleRemoveItem","handleSubFieldChange","fieldName","fieldValue","newArray","subFieldError","commonSubFieldProps","dateValue","Trash2","Plus","renderGroup","visibleItems","groupClasses","formClasses","buttonSize","ConfirmDialog","description","confirmLabel","cancelLabel","onConfirm","badgeVariants","badgeSizes","dotColors","Badge","dot","dismissible","onDismiss","toneDisc","EmptyState","card","Kbd","trackSizes","fillVariants","ProgressBar","pct","spinnerSizes","spinnerColors","Spinner","showLabel","StatusDot","pulse","StepIndicator","steps","activeIndex","shared","step","AssistantCard","Sparkles","initials","Avatar","src","errored","setErrored","RING","OWNER_RING","AvatarStack","people","max","shown","overflow","CH","ChannelBadge","channel","Image","alt","aspectRatio","showLoading","showError","fallback","loadingContent","errorContent","onLoad","onError","isLoading","setIsLoading","setHasError","currentSrc","setCurrentSrc","handleLoad","handleError","containerClasses","imageClasses","placeholderClasses","defaultLoadingContent","defaultErrorContent","ImageOff","List","leading","renderItem","trailing","onActiveIndexChange","unread","dimmed","groupBy","renderGroupHeader","stickyGroupHeaders","collapsibleGroups","hideGroupCount","selectedItems","bulkActions","stickyHeader","loadingRows","collapsed","setCollapsed","handleKeyDown","keyOf","toggle","toggleAll","container","allSelected","someSelected","renderRow","firstInBlock","isUnread","isDimmed","selected","buckets","declared","groupIndex","isCollapsed","rowIndex","MessageBubble","side","continued","valueTone","cardTone","KpiCard","PageHeader","surface","subtitle","meta","backLabel","backClassName","onBack","editable","onTitleChange","isEditing","setIsEditing","editValue","setEditValue","handleTitleClick","handleBlur","Pencil","PageToolbar","SectionDivider","rule","SettingsRow","control","SettingsSection","SourceChip","dotColor","ArrowUpRight","View","formatCheckbox","getOptionLabel","subValue","displayValue","formatted","viewClasses","SidebarMenuItem","isSelectedHandler","depth","SidebarMenu","actionIcons","preMenuItemsComponent","Heading","level","headingClasses","getDefaultSize","CommandPalette","commands","labels","initialCommandPath","initialActiveIndex","activeCommandPath","setActiveCommandPath","setActiveIndex","paletteRef","listRef","filteredCommands","c","command","prevIndex","paddingMap","marginMap","backgroundMap","radiusMap","shadowMap","borderMap","borderColorMap","Box","padding","margin","background","shadow","border","borderColor","Card","FederatedResource","identifier","resourceLoader","framework","componentProps","ExternalComponent","setExternalComponent","svelteInstanceRef","isMounted","module","Component","instance","ErrorBoundary","errorInfo"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/cn.ts","../src/meeting/MeetingGrid.tsx","../src/meeting/ParticipantTile.tsx","../src/meeting/VideoSurface.tsx","../src/action/Button.tsx","../src/action/ButtonGroup.tsx","../src/content/Icon.tsx","../src/action/FilterChip.tsx","../src/action/Link.tsx","../src/action/SegmentedToggle.tsx","../src/utils/useAnchoredPosition.ts","../src/overlays/Popover.tsx","../src/action/SplitButton.tsx","../src/input/Checkbox.tsx","../src/input/DatePicker.tsx","../src/input/Select.tsx","../src/input/TextField.tsx","../src/input/FolderSelect.tsx","../src/input/SearchableTextField.tsx","../src/input/Switch.tsx","../src/feedback/ContentLoading.tsx","../src/overlays/Dropdown.tsx","../src/content/Table.tsx","../src/navigation/Tabs.tsx","../src/overlays/Modal.tsx","../src/typography/Text.tsx","../src/input/StorageInput.tsx","../src/input/TextArea.tsx","../src/forms/Form.tsx","../src/overlays/ConfirmDialog.tsx","../src/feedback/Badge.tsx","../src/feedback/EmptyState.tsx","../src/feedback/Kbd.tsx","../src/feedback/ProgressBar.tsx","../src/feedback/Spinner.tsx","../src/feedback/StatusDot.tsx","../src/feedback/StepIndicator.tsx","../src/content/AssistantCard.tsx","../src/content/Avatar.tsx","../src/content/AvatarStack.tsx","../src/content/ChannelBadge.tsx","../src/content/Image.tsx","../src/content/List.tsx","../src/content/MessageBubble.tsx","../src/content/KpiCard.tsx","../src/content/PageHeader.tsx","../src/content/PageToolbar.tsx","../src/content/SectionDivider.tsx","../src/content/SettingsRow.tsx","../src/content/SourceChip.tsx","../src/content/View.tsx","../src/navigation/Sidebar.tsx","../src/typography/Heading.tsx","../src/command-palette/CommandPalette.tsx","../src/primitives/Box.tsx","../src/primitives/Card.tsx","../src/federated-resource/index.tsx","../src/error-boundary/index.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\n\n/**\n * Utility function for combining class names\n * Combines clsx for conditional classes with Tailwind merge for deduplication\n */\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n\n/**\n * Utility for creating variant-based class combinations\n */\nexport function createVariants<T extends Record<string, Record<string, string>>>(\n variants: T\n) {\n return (variant: keyof T, value: keyof T[keyof T]) => {\n return variants[variant]?.[value] || '';\n };\n}\n\n/**\n * Utility for creating size-based class combinations\n */\nexport function createSizes<T extends Record<string, string>>(sizes: T) {\n return (size: keyof T) => sizes[size] || '';\n} ","import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface MeetingGridProps {\n tiles: ReactNode[];\n pinned?: ReactNode;\n className?: string;\n}\n\n/**\n * Layout primitive for meeting views. When `pinned` is provided it gets the\n * dominant area and remaining tiles render in a sidebar/strip. Otherwise tiles\n * flow in an auto-sized grid.\n */\nexport function MeetingGrid({ tiles, pinned, className }: MeetingGridProps) {\n if (pinned) {\n return (\n <div className={cn(\"flex flex-col md:flex-row gap-2 h-full min-h-0\", className)}>\n <div className=\"flex-1 min-h-0\">{pinned}</div>\n {tiles.length > 0 && (\n <div className=\"flex md:flex-col gap-2 md:w-48 overflow-auto\">\n {tiles.map((t, i) => (\n <div key={i} className=\"min-w-40 md:min-w-0\">{t}</div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n const cols = tiles.length <= 1 ? \"grid-cols-1\"\n : tiles.length <= 4 ? \"grid-cols-2\"\n : tiles.length <= 9 ? \"grid-cols-3\"\n : \"grid-cols-4\";\n\n return (\n <div className={cn(\"grid gap-2 h-full\", cols, className)}>\n {tiles.map((t, i) => (\n <div key={i}>{t}</div>\n ))}\n </div>\n );\n}\n","import { Mic, MicOff, User, VideoOff } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ParticipantTileProps {\n name: string;\n avatarUrl?: string;\n muted?: boolean;\n speaking?: boolean;\n hasVideo?: boolean;\n videoSlot?: ReactNode;\n className?: string;\n /**\n * Fill the parent box (height + width) instead of keeping a 16:9 aspect\n * ratio. Use for a pinned/main tile inside a bounded container so it fits the\n * available space without deriving its height from its width (which would\n * overflow a wide surface). Grid thumbnails keep the default aspect ratio.\n */\n fill?: boolean;\n}\n\n/**\n * Provider-agnostic participant tile. Shows avatar + name when no video is\n * available; otherwise renders the `videoSlot` passed by the caller (typically\n * a <VideoSurface /> wired to a provider-specific stream renderer).\n */\nexport function ParticipantTile({\n name,\n avatarUrl,\n muted,\n speaking,\n hasVideo,\n videoSlot,\n className,\n fill,\n}: ParticipantTileProps) {\n return (\n <div\n className={cn(\n \"relative rounded-lg overflow-hidden bg-video-surface flex items-center justify-center\",\n fill ? \"h-full w-full\" : \"aspect-video\",\n speaking && \"ring-2 ring-speaking\",\n className,\n )}\n >\n {hasVideo && videoSlot ? (\n <div className=\"absolute inset-0\">{videoSlot}</div>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-gray-300\">\n {avatarUrl ? (\n <img src={avatarUrl} alt={name} className=\"w-16 h-16 rounded-full object-cover\" />\n ) : (\n <div className=\"w-16 h-16 rounded-full bg-video-surface-strong flex items-center justify-center\">\n {hasVideo ? <VideoOff className=\"w-8 h-8\" /> : <User className=\"w-8 h-8\" />}\n </div>\n )}\n </div>\n )}\n\n <div className=\"absolute bottom-2 left-2 flex items-center gap-1.5 px-2 py-1 rounded bg-video-overlay text-white text-xs\">\n {muted ? <MicOff className=\"w-3 h-3\" /> : <Mic className=\"w-3 h-3\" />}\n <span className=\"truncate max-w-35\">{name}</span>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface VideoSurfaceProps {\n /**\n * Provider-specific mount callback. Receives the container element so\n * provider SDKs (Azure, Zoom, etc.) can attach their own video renderer.\n * Return an optional cleanup function.\n */\n attach: (el: HTMLDivElement) => void | (() => void);\n active?: boolean;\n mirrored?: boolean;\n className?: string;\n}\n\n/**\n * Provider-agnostic video tile surface. Owns the DOM slot; the caller wires\n * their SDK's renderer to it via `attach`.\n */\nexport function VideoSurface({ attach, active = true, mirrored = false, className }: VideoSurfaceProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!active || !ref.current) return;\n const cleanup = attach(ref.current);\n return () => {\n if (typeof cleanup === \"function\") cleanup();\n if (ref.current) ref.current.innerHTML = \"\";\n };\n }, [attach, active]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"w-full h-full bg-video-surface-strong overflow-hidden\",\n mirrored && \"[&>*]:scale-x-[-1]\",\n className,\n )}\n />\n );\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * The visual style variant of the button\n */\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'success' | 'warning' | 'danger-solid';\n\n /**\n * The size of the button\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';\n\n /**\n * Whether the button should take the full width of its container\n */\n fullWidth?: boolean;\n\n /**\n * Whether the button is in a loading state\n */\n loading?: boolean;\n\n /**\n * Icon to display before the button text\n */\n leftIcon?: React.ReactNode;\n\n /**\n * Icon to display after the button text\n */\n rightIcon?: React.ReactNode;\n\n /**\n * Whether the button should only display an icon (no text)\n */\n iconOnly?: boolean;\n\n /** `circle` is for a control that is only ever an icon: call answer/reject. */\n shape?: 'default' | 'circle';\n}\n\n/**\n * Variant styles — semantic tokens only, so dark mode needs no extra classes.\n * One primary button per view; everything else is secondary, ghost or a Link.\n */\nconst buttonVariants = {\n primary: 'bg-accent text-accent-fg hover:bg-accent-hover disabled:bg-surface-hover',\n secondary: 'border border-border bg-surface text-text hover:bg-surface-hover disabled:bg-surface-hover',\n // No resting fill, so no disabled fill either — a greyed-out plate where\n // there was nothing reads as a different control, not as a disabled one.\n outline: 'border border-accent-border text-accent hover:bg-accent-soft',\n ghost: 'text-text-muted hover:bg-surface-hover hover:text-text',\n destructive:\n 'border border-danger-border bg-danger-soft text-danger-fg hover:border-danger disabled:bg-surface-hover',\n // Solid status fills. Reserved for a control whose colour IS the answer —\n // an RSVP, answering or rejecting a call — not for ordinary emphasis.\n success: 'bg-success text-text-inverse hover:opacity-90 disabled:bg-surface-hover',\n warning: 'bg-warning text-text-inverse hover:opacity-90 disabled:bg-surface-hover',\n 'danger-solid': 'bg-danger text-text-inverse hover:opacity-90 disabled:bg-surface-hover',\n};\n\n/** Height comes from the shared control tokens so buttons line up with inputs. */\nconst buttonSizes = {\n xs: 'h-control-xs px-2 text-xs',\n sm: 'h-control-sm px-3 text-sm',\n md: 'h-control-md px-4 text-sm',\n lg: 'h-control-lg px-4 text-sm',\n xl: 'h-control-xl px-6 text-base',\n '2xl': 'h-control-2xl px-6 text-base',\n full: 'h-control-md px-4 text-sm',\n};\n\nconst iconOnlySizes = {\n xs: 'h-control-xs w-6',\n sm: 'h-control-sm w-7',\n md: 'h-control-md w-8',\n lg: 'h-control-lg w-9',\n xl: 'h-control-xl w-10',\n '2xl': 'h-control-2xl w-12',\n full: 'h-control-md w-8',\n};\n\n/**\n * Button component with theme integration and multiple variants\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">Click me</Button>\n * <Button variant=\"outline\" leftIcon={<Icon name={Plus} />}>Add item</Button>\n * <Button iconOnly variant=\"ghost\" size=\"sm\" aria-label=\"Zoeken\">\n * <Icon name={Search} />\n * </Button>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n loading = false,\n leftIcon,\n rightIcon,\n iconOnly = false,\n shape = 'default',\n className,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'inline-flex shrink-0 items-center justify-center gap-2 cursor-pointer font-semibold',\n shape === 'circle' ? 'rounded-full' : 'rounded-md',\n 'transition-colors duration-fast ease-out',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:border-border-subtle',\n 'disabled:text-text-disabled',\n\n buttonVariants[variant],\n iconOnly ? iconOnlySizes[size] : buttonSizes[size],\n\n (fullWidth || size === 'full') && 'w-full',\n loading && 'cursor-wait',\n\n className\n )}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n {...props}\n >\n {loading && (\n <span\n aria-hidden\n className=\"size-icon-md shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent\"\n />\n )}\n\n {!loading && leftIcon && <span className=\"shrink-0\">{leftIcon}</span>}\n\n {!iconOnly && children}\n\n {!loading && rightIcon && <span className=\"shrink-0\">{rightIcon}</span>}\n\n {iconOnly && !loading && !leftIcon && !rightIcon && children}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ButtonGroupProps {\n /** Child buttons to group */\n children: React.ReactNode;\n /** Size of the button group */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Orientation of the button group */\n orientation?: 'horizontal' | 'vertical';\n /** Whether buttons should be attached (no gap) */\n attached?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * ButtonGroup component for grouping related buttons\n */\nexport const ButtonGroup: React.FC<ButtonGroupProps> = ({\n children,\n size = 'md',\n orientation = 'horizontal',\n attached = true,\n className,\n}) => {\n const baseClasses = cn(\n 'inline-flex',\n {\n // Orientation\n 'flex-row': orientation === 'horizontal',\n 'flex-col': orientation === 'vertical',\n \n // Attached styling\n '[&>*:not(:first-child):not(:last-child)]:rounded-none': attached,\n '[&>*:first-child]:rounded-r-none': attached && orientation === 'horizontal',\n '[&>*:last-child]:rounded-l-none': attached && orientation === 'horizontal',\n '[&>*:first-child]:rounded-b-none': attached && orientation === 'vertical',\n '[&>*:last-child]:rounded-t-none': attached && orientation === 'vertical',\n \n // Borders for attached buttons\n '[&>*:not(:first-child)]:-ml-px': attached && orientation === 'horizontal',\n '[&>*:not(:first-child)]:-mt-px': attached && orientation === 'vertical',\n \n // Spacing for non-attached buttons\n 'gap-1': !attached && size === 'xs',\n 'gap-2': !attached && (size === 'sm' || size === 'md'),\n 'gap-3': !attached && (size === 'lg' || size === 'xl'),\n },\n className\n );\n\n return (\n <div className={baseClasses} role=\"group\">\n {children}\n </div>\n );\n}; ","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface IconProps {\n /** Icon component from lucide-react or custom icon */\n icon: React.ComponentType<any>;\n /** Icon size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number;\n /** Icon color */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current';\n /** Whether the icon should be clickable */\n clickable?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional CSS classes */\n className?: string;\n /** Accessibility label */\n 'aria-label'?: string;\n}\n\n/**\n * Icon — the only way icons enter the product. Always a lucide-react component;\n * never a unicode glyph, an emoji or an inline <svg> in feature code.\n *\n * Sizes follow the icon tokens: xs 12 · sm 14 (default in controls) · md 16 ·\n * lg 20 · xl 24.\n */\nconst colorMap: Record<NonNullable<IconProps['color']>, string> = {\n primary: 'text-text',\n secondary: 'text-text-muted',\n accent: 'text-accent',\n success: 'text-success-fg',\n warning: 'text-warning-fg',\n error: 'text-danger-fg',\n info: 'text-info-fg',\n neutral: 'text-text-subtle',\n current: 'text-current',\n};\n\nexport const Icon: React.FC<IconProps> = ({\n icon: IconComponent,\n size = 'md',\n color = 'current',\n clickable = false,\n onClick,\n className,\n 'aria-label': ariaLabel,\n ...props\n}) => {\n const sizeValue = typeof size === 'number' ? size : getSizeValue(size);\n\n const iconClasses = cn(\n 'inline-block shrink-0',\n colorMap[color],\n clickable && [\n 'cursor-pointer rounded-sm transition-opacity duration-fast ease-out hover:opacity-80',\n 'focus-visible:outline-none focus-visible:focus-ring',\n ],\n className\n );\n\n const iconProps = {\n size: sizeValue,\n strokeWidth: 2,\n className: iconClasses,\n onClick: clickable ? onClick : undefined,\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaLabel ? undefined : true,\n role: clickable ? 'button' : undefined,\n tabIndex: clickable ? 0 : undefined,\n onKeyDown: clickable\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined,\n ...props,\n };\n\n return <IconComponent {...iconProps} />;\n};\n\nfunction getSizeValue(size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'): number {\n const sizeMap = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n };\n\n return sizeMap[size];\n}\n","import { ChevronDown, X } from \"lucide-react\";\nimport React from \"react\";\nimport { Icon } from \"../content/Icon\";\nimport { cn } from \"../utils/cn\";\n\nexport interface FilterChipProps {\n /** Chip text (e.g. \"Status\", or \"Status: Open\" when a value is set). */\n label: React.ReactNode;\n /** Leading icon, before the label. */\n icon?: React.ReactNode;\n /**\n * Meaning carried by the chip's own value — a priority, a state. Applies to\n * the resting chip; `active` still wins, because \"you picked this\" outranks\n * \"this is urgent\".\n */\n tone?: \"default\" | \"muted\" | \"warning\" | \"danger\";\n /**\n * `pill` is the filter-bar shape. `rect` is for a chip that labels a property\n * rather than a filter, where a softer corner sits better next to inputs.\n */\n shape?: \"pill\" | \"rect\";\n /** `md` is the default control height; `sm` for a dense toolbar. */\n size?: \"sm\" | \"md\";\n /** Selected/active — renders the filled dark treatment. */\n active?: boolean;\n /** Show a trailing caret (opens a menu the consumer wires with Dropdown/Popover). */\n caret?: boolean;\n /** Open a value clear affordance (✕) — only shown when `active`. */\n onClear?: () => void;\n /** Accessible name for the clear affordance. */\n clearLabel?: string;\n onClick?: () => void;\n /** Native tooltip, for a chip whose label is truncated or abbreviated. */\n title?: string;\n className?: string;\n}\n\nconst tones: Record<NonNullable<FilterChipProps[\"tone\"]>, string> = {\n default: \"border-border text-text-muted hover:bg-surface-hover hover:text-text\",\n muted: \"border-border text-text-subtle hover:bg-surface-hover hover:text-text\",\n warning: \"border-warning-border bg-warning-soft text-warning-fg hover:bg-surface-hover\",\n danger: \"border-danger-border bg-danger-soft text-danger-fg hover:bg-surface-hover\",\n};\n\n/**\n * Filter chip — the inbox filter bar and the thread priority/assign/inbox/tags\n * menus. Presentational: it renders the chip (active = filled accent, inactive =\n * outlined) with an optional caret + clear; the consumer wires the actual menu\n * with the existing `Dropdown` / `Popover`.\n *\n * @example\n * ```tsx\n * <FilterChip label={status ? `Status: ${status}` : \"Status\"} caret\n * active={!!status} onClick={openMenu} onClear={() => setStatus(null)} />\n * ```\n */\nexport function FilterChip({\n label,\n icon,\n tone = \"default\",\n shape = \"pill\",\n size = \"md\",\n active = false,\n caret = false,\n onClear,\n clearLabel = \"Filter wissen\",\n onClick,\n title,\n className,\n}: FilterChipProps) {\n const showClear = active && Boolean(onClear);\n\n // The chip and its clear affordance are two separate controls, so the shell is\n // a plain span: a <button> may not contain another <button>. Without a clear,\n // there is only one control and the shell collapses onto it.\n const radius = shape === \"pill\" ? \"rounded-full\" : \"rounded-md\";\n\n const shell = cn(\n // A button's default cursor is an arrow, so it has to be asked for.\n \"inline-flex cursor-pointer select-none items-center text-sm font-semibold\",\n size === \"sm\" ? \"h-control-sm\" : \"h-control-md\",\n \"transition-colors duration-fast ease-out\",\n radius,\n // Picking a value outranks whatever the value happens to mean.\n active ? \"bg-accent text-accent-fg\" : cn(\"border\", tones[tone]),\n className,\n );\n\n const body = (\n <>\n {icon}\n {label}\n {caret && <Icon icon={ChevronDown} size=\"xs\" />}\n </>\n );\n\n const bodyClasses = cn(\n \"inline-flex items-center gap-1.5 pl-3\",\n radius,\n showClear ? \"pr-1.5\" : \"pr-3\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n );\n\n if (!showClear) {\n return (\n <button type=\"button\" title={title} onClick={onClick} className={cn(shell, bodyClasses)}>\n {body}\n </button>\n );\n }\n\n return (\n <span className={shell} title={title}>\n <button type=\"button\" onClick={onClick} className={bodyClasses}>\n {body}\n </button>\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={onClear}\n className={cn(\"inline-flex h-full items-center pr-3 focus-visible:outline-none focus-visible:focus-ring\", radius)}\n >\n <Icon icon={X} size=\"xs\" />\n </button>\n </span>\n );\n}\n","import React from 'react';\nimport { ExternalLink } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Link variant */\n variant?: 'default' | 'subtle' | 'underline' | 'button';\n /** Link size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Color theme */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral';\n /** Whether the link is disabled */\n disabled?: boolean;\n /** Whether to show external link icon */\n external?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Child content */\n children: React.ReactNode;\n}\n\n/** Same steps as Text: xs 11 · sm 12 · md 13 · lg 14 · xl 16. */\nconst sizeMap: Record<NonNullable<LinkProps['size']>, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n xl: 'text-lg',\n};\n\nconst colorMap: Record<NonNullable<LinkProps['color']>, string> = {\n primary: 'text-text hover:text-info-fg hover:underline',\n info: 'text-info-fg hover:underline',\n secondary: 'text-text-muted hover:text-text',\n neutral: 'text-text-muted hover:text-text',\n accent: 'text-accent hover:underline',\n success: 'text-success-fg hover:underline',\n warning: 'text-warning-fg hover:underline',\n error: 'text-danger-fg hover:underline',\n};\n\n/** `variant=\"button\"` uses the soft surface of the matching status token. */\nconst buttonBackgroundMap: Record<NonNullable<LinkProps['color']>, string> = {\n primary: 'bg-accent-soft',\n accent: 'bg-accent-soft',\n secondary: 'bg-surface-hover',\n neutral: 'bg-surface-hover',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n error: 'bg-danger-soft',\n info: 'bg-info-soft',\n};\n\n/**\n * Link component with theme integration and accessibility features.\n * Use for navigation; use Button for actions.\n */\nexport const Link: React.FC<LinkProps> = ({\n variant = 'default',\n size = 'md',\n color = 'primary',\n disabled = false,\n external = false,\n className,\n children,\n href,\n target,\n rel,\n ...props\n}) => {\n const isExternal =\n external || (href && (href.startsWith('http') || href.startsWith('mailto:')));\n\n const baseClasses = cn(\n 'inline-flex items-center gap-1 underline-offset-2',\n 'transition-colors duration-fast ease-out',\n 'focus-visible:outline-none focus-visible:focus-ring',\n\n sizeMap[size],\n !disabled && colorMap[color],\n\n variant === 'subtle' && 'no-underline opacity-70 hover:opacity-100',\n variant === 'underline' && 'underline decoration-1 hover:decoration-2',\n variant === 'button' && [\n 'h-control-md rounded-md px-3 font-semibold no-underline hover:no-underline',\n buttonBackgroundMap[color],\n ],\n\n disabled && 'pointer-events-none cursor-not-allowed text-text-disabled opacity-50',\n\n className\n );\n\n const linkProps = {\n ...props,\n href: disabled ? undefined : href,\n target: isExternal ? '_blank' : target,\n rel: isExternal ? 'noopener noreferrer' : rel,\n 'aria-disabled': disabled || undefined,\n };\n\n return (\n <a className={baseClasses} {...linkProps}>\n {children}\n {isExternal && <ExternalLink className=\"size-icon-sm shrink-0\" aria-hidden />}\n </a>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SegmentedOption<T extends string> {\n value: T;\n label: React.ReactNode;\n}\n\nexport interface SegmentedToggleProps<T extends string> {\n options: SegmentedOption<T>[];\n value: T;\n onChange: (value: T) => void;\n /** Control height. */\n size?: \"sm\" | \"md\";\n className?: string;\n /** Accessible group label. */\n \"aria-label\"?: string;\n}\n\n/** Track height stays one step below the equivalent Button so it nests in toolbars. */\nconst sizes = {\n sm: \"h-control-sm px-3 text-sm\",\n md: \"h-control-md px-3 text-sm\",\n};\n\n/**\n * Segmented pill toggle (focus \"Feed / Eén tegelijk\", settings \"Persoonlijk /\n * Bedrijf\"). Track = surface-hover, active segment = surface. No shadow.\n *\n * @example\n * ```tsx\n * <SegmentedToggle\n * value={layout}\n * onChange={setLayout}\n * options={[{ value: \"feed\", label: \"Feed\" }, { value: \"one\", label: \"Eén tegelijk\" }]}\n * />\n * ```\n */\nexport function SegmentedToggle<T extends string>({\n options,\n value,\n onChange,\n size = \"sm\",\n className,\n \"aria-label\": ariaLabel,\n}: SegmentedToggleProps<T>) {\n return (\n <div\n role=\"tablist\"\n aria-label={ariaLabel}\n className={cn(\"inline-flex gap-0.5 rounded-md bg-surface-hover p-0.5\", className)}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n role=\"tab\"\n aria-selected={active}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"inline-flex items-center justify-center rounded-sm\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n sizes[size],\n active ? \"bg-surface text-text font-semibold\" : \"text-text-muted hover:text-text\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\n\nexport interface AnchoredPositionOptions {\n /** Gap between the anchor and the panel, in px. */\n gap?: number;\n /** Match the panel's width to the anchor — what a select wants, a menu does not. */\n matchWidth?: boolean;\n /** Preferred side. Flips automatically when there is no room. */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n}\n\n/**\n * Position a floating panel against its trigger, in viewport coordinates.\n *\n * Two problems this solves, both of which a plain `absolute` panel has:\n * an ancestor with `overflow-hidden` (a bordered form panel, a scroll area)\n * clips the panel, and a trigger near the bottom of the window opens a panel\n * that runs off-screen. Fixed coordinates escape every ancestor, and the\n * placement flips upward when the space below is too small.\n *\n * Recomputes on scroll and resize while open, so the panel tracks its trigger\n * instead of detaching when the page moves under it.\n */\nexport function useAnchoredPosition(\n open: boolean,\n anchorRef: RefObject<HTMLElement | null>,\n { gap = 6, matchWidth = false, placement = \"bottom-start\" }: AnchoredPositionOptions = {}\n): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n // Layout effect, not effect: measure and place before the browser paints,\n // otherwise the panel is visible at the wrong spot for a frame.\n useLayoutEffect(() => {\n if (!open) return;\n\n const place = () => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const rect = anchor.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n // Flip up only when below genuinely cannot hold a usable panel and above\n // has more room — flipping into an equally cramped space helps nobody.\n const wantsTop = placement.startsWith(\"top\");\n const flip = wantsTop\n ? spaceAbove < 200 && spaceBelow > spaceAbove\n : spaceBelow < 200 && spaceAbove > spaceBelow;\n const onTop = wantsTop !== flip;\n\n const next: CSSProperties = { position: \"fixed\" };\n\n if (onTop) {\n next.bottom = window.innerHeight - rect.top + gap;\n next.maxHeight = Math.max(120, spaceAbove - gap * 2);\n } else {\n next.top = rect.bottom + gap;\n next.maxHeight = Math.max(120, spaceBelow - gap * 2);\n }\n\n if (placement.endsWith(\"end\")) next.right = window.innerWidth - rect.right;\n else next.left = rect.left;\n\n if (matchWidth) next.width = rect.width;\n\n setStyle(next);\n };\n\n place();\n // `true` captures scrolls on any ancestor, not just the window.\n window.addEventListener(\"scroll\", place, true);\n window.addEventListener(\"resize\", place);\n return () => {\n window.removeEventListener(\"scroll\", place, true);\n window.removeEventListener(\"resize\", place);\n };\n }, [open, anchorRef, gap, matchWidth, placement]);\n\n return style;\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useAnchoredPosition } from \"../utils/useAnchoredPosition\";\n\nexport interface PopoverProps {\n /** Element that toggles the popover */\n trigger: React.ReactNode;\n /**\n * Panel content. Pass a function to receive a `close` callback so rows can\n * dismiss the popover after acting.\n */\n children: React.ReactNode | ((close: () => void) => React.ReactNode);\n /** Panel placement relative to the trigger. Flips when there is no room. */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Additional CSS classes for the panel */\n className?: string;\n /**\n * Layout classes for the wrapper around the trigger. Needed when the trigger\n * has to fill a positioned box — a calendar event in a week grid, say —\n * because the wrapper is `inline-flex` by default.\n */\n rootClassName?: string;\n /** Layout classes for the trigger button itself. */\n triggerClassName?: string;\n /** Whether the trigger is disabled */\n disabled?: boolean;\n /**\n * Accessible name for the trigger button. Needed when the trigger is\n * icon-only, since the panel content is not announced by the trigger.\n */\n triggerLabel?: string;\n}\n\n/**\n * Generic popover with click-outside / Escape dismissal. The panel is\n * `position: fixed` (computed from the trigger) so it escapes any\n * overflow-hidden or rounded-card ancestor instead of being clipped.\n */\nexport const Popover: React.FC<PopoverProps> = ({\n trigger,\n children,\n placement = \"bottom-start\",\n className,\n rootClassName,\n triggerClassName,\n disabled = false,\n triggerLabel,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n // Shared with Select, DatePicker and Dropdown: flips up when the trigger sits\n // near the bottom, caps the height to the space available, and re-measures on\n // scroll so the panel keeps tracking its trigger.\n const panelStyle = useAnchoredPosition(isOpen, triggerRef, { placement });\n\n useEffect(() => {\n if (!isOpen) return;\n const onDown = (event: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n const onEsc = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onEsc);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onEsc);\n };\n }, [isOpen]);\n\n const handleToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n if (disabled) return;\n setIsOpen((open) => !open);\n };\n\n const close = () => setIsOpen(false);\n\n return (\n <div ref={rootRef} className={cn(\"relative inline-flex\", rootClassName)}>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={handleToggle}\n disabled={disabled}\n aria-label={triggerLabel}\n aria-expanded={isOpen}\n className={cn(\n \"inline-flex items-center\",\n disabled && \"cursor-not-allowed opacity-50\",\n triggerClassName,\n )}\n >\n {trigger}\n </button>\n\n {isOpen && (\n <div\n className={cn(\n // overflow-y-auto pairs with the hook's max-height: without it a\n // panel taller than the space available is simply cut off.\n \"fixed z-overlay overflow-y-auto rounded-lg border border-border bg-surface shadow-overlay\",\n className,\n )}\n style={panelStyle}\n >\n {typeof children === \"function\" ? children(close) : children}\n </div>\n )}\n </div>\n );\n};\n","import { ChevronDown } from \"lucide-react\";\nimport React from \"react\";\nimport { Popover } from \"../overlays/Popover\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./Button\";\n\nexport interface SplitButtonOption {\n id: string;\n label: string;\n onClick: () => void;\n variant?: \"default\" | \"destructive\";\n /** Optioneel icoon vóór het label in het menu. */\n icon?: React.ReactNode;\n}\n\nexport interface SplitButtonProps {\n label: string;\n onClick: () => void;\n variant?: \"primary\" | \"secondary\" | \"outline\";\n size?: \"sm\" | \"md\";\n icon?: React.ReactNode;\n options: SplitButtonOption[];\n disabled?: boolean;\n /** Spinner in de primaire helft; blokkeert beide helften. */\n loading?: boolean;\n /**\n * Waar het optie-menu opent. Gebruik een `top-*` placement wanneer de knop\n * onderaan zijn container staat (bv. een sticky verzendbalk).\n */\n menuPlacement?: \"bottom-end\" | \"bottom-start\" | \"top-end\" | \"top-start\";\n /** Accessible naam voor de chevron-knop. */\n menuLabel?: string;\n}\n\n/** Zelfde varianttokens als Button, zodat beide helften één knop lijken. */\nconst variantStyles = {\n primary: \"bg-accent text-accent-fg hover:bg-accent-hover\",\n secondary: \"border border-border bg-surface text-text hover:bg-surface-hover\",\n outline: \"border border-accent-border text-accent hover:bg-accent-soft\",\n};\n\nconst chevronSizes = {\n sm: \"h-control-sm w-7\",\n md: \"h-control-md w-8\",\n};\n\n/**\n * Knop met een primaire actie plus een chevron-menu voor varianten daarvan.\n * De primaire helft is een gewone `Button` (zelfde varianten/loading-gedrag);\n * het menu loopt via `Popover`, dus het is `position: fixed` en wordt niet\n * geklipt door een scrollende of overflow-hidden voorouder.\n *\n * Zonder opties rendert dit precies een `Button` — geen chevron.\n */\nexport function SplitButton({\n label,\n onClick,\n variant = \"primary\",\n size = \"md\",\n icon,\n options,\n disabled = false,\n loading = false,\n menuPlacement = \"bottom-end\",\n menuLabel = \"More options\",\n}: SplitButtonProps) {\n const isDisabled = disabled || loading;\n const hasMenu = options.length > 0;\n\n return (\n <div className=\"inline-flex items-center gap-px\">\n <Button\n variant={variant}\n size={size}\n onClick={onClick}\n disabled={disabled}\n loading={loading}\n leftIcon={icon}\n className={cn(hasMenu && \"rounded-r-none\")}\n >\n {label}\n </Button>\n {hasMenu && (\n <Popover\n placement={menuPlacement}\n disabled={isDisabled}\n triggerLabel={menuLabel}\n className=\"min-w-menu py-1\"\n trigger={\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex items-center justify-center rounded-md rounded-l-none\",\n \"transition-colors duration-fast ease-out\",\n variantStyles[variant],\n chevronSizes[size],\n isDisabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n <ChevronDown className=\"size-icon-md\" />\n </span>\n }\n >\n {(close) => (\n <>\n {options.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n onClick={() => {\n option.onClick();\n close();\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n option.variant === \"destructive\"\n ? \"text-danger-fg hover:bg-danger-soft\"\n : \"text-text hover:bg-surface-hover\",\n )}\n >\n {option.icon && (\n <span className=\"shrink-0\">{option.icon}</span>\n )}\n {option.label}\n </button>\n ))}\n </>\n )}\n </Popover>\n )}\n </div>\n );\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /**\n * The label for the checkbox\n */\n label?: string;\n\n /**\n * Helper text to display below the checkbox\n */\n helperText?: string;\n\n /**\n * Error message to display when the checkbox is invalid\n */\n error?: string;\n\n /**\n * The size of the checkbox\n */\n size?: 'sm' | 'md' | 'lg' | 'full';\n\n /**\n * Whether the checkbox is in an indeterminate state\n */\n indeterminate?: boolean;\n\n /**\n * Additional class name for the container\n */\n containerClassName?: string;\n\n /**\n * Additional class name for the label\n */\n labelClassName?: string;\n}\n\n/** The box grows with the field size, so a checkbox row reads as the same\n * weight as the inputs beside it instead of a small mark floating next to them. */\nconst checkboxSizes = {\n sm: 'size-checkbox-sm',\n md: 'size-checkbox',\n lg: 'size-checkbox-lg',\n full: 'size-checkbox',\n};\n\n/** Row height matches the control tokens so a checkbox lines up in a form. */\nconst rowSizes = {\n sm: 'min-h-control-sm',\n md: 'min-h-control-md',\n lg: 'min-h-control-lg',\n full: 'min-h-control-md',\n};\n\nconst labelSizes = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n full: 'text-md',\n};\n\n/**\n * Checkbox component with theme integration.\n *\n * Uses the native input with `accent-color`, so the checked fill is the accent\n * token and dark mode needs no extra classes.\n *\n * @example\n * ```tsx\n * <Checkbox label=\"Voorwaarden accepteren\" />\n * <Checkbox label=\"Alles selecteren\" indeterminate />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n helperText,\n error,\n size = 'md',\n indeterminate = false,\n containerClassName,\n labelClassName,\n className,\n id,\n ...props\n },\n ref\n ) => {\n const reactId = React.useId();\n const checkboxId = id || `checkbox-${reactId}`;\n const hasError = Boolean(error);\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n\n // Keep the forwarded ref and the internal one in sync so `indeterminate`\n // works whether or not the consumer passes a ref.\n const setRefs = React.useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [ref]\n );\n\n React.useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n return (\n <div className={cn('flex flex-col', containerClassName)}>\n <div className={cn('flex items-center gap-3', rowSizes[size])}>\n <input\n ref={setRefs}\n id={checkboxId}\n type=\"checkbox\"\n aria-invalid={hasError || undefined}\n className={cn(\n // rounded-md, not rounded-sm: at 16px a 4px corner reads as a\n // hard square, and the box is the one thing you aim at in a list.\n 'shrink-0 rounded-md border bg-surface-input accent-accent',\n 'transition-colors duration-fast ease-out',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover',\n\n checkboxSizes[size],\n hasError ? 'border-danger-border' : 'border-border-strong',\n\n className\n )}\n {...props}\n />\n\n {label && (\n <div className=\"flex-1\">\n <label\n htmlFor={checkboxId}\n className={cn(\n 'cursor-pointer',\n hasError ? 'text-danger-fg' : 'text-text',\n labelSizes[size],\n labelClassName\n )}\n >\n {label}\n </label>\n\n {helperText && !error && (\n <p className=\"mt-0.5 text-xs text-text-subtle\">{helperText}</p>\n )}\n </div>\n )}\n </div>\n\n {error && <p className=\"mt-1 text-xs text-danger-fg\">{error}</p>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Calendar, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport { useAnchoredPosition } from '../utils/useAnchoredPosition';\nimport { Icon } from '../content/Icon';\n\nexport interface DatePickerProps {\n /** Current date value */\n value?: Date | null;\n /** Change handler */\n onChange?: (date: Date | null) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether the input is required */\n required?: boolean;\n /** Input size */\n size?: 'sm' | 'md' | 'lg' | 'full';\n /** Additional CSS classes */\n className?: string;\n /** Minimum selectable date */\n minDate?: Date;\n /** Maximum selectable date */\n maxDate?: Date;\n /** Date format for display */\n format?: 'MM/dd/yyyy' | 'dd/MM/yyyy' | 'yyyy-MM-dd';\n /**\n * Also pick a time. The display gains `HH:mm`, the panel gains a time field,\n * and choosing a day keeps the time already on the value instead of resetting\n * it to midnight. Replaces a native `datetime-local`.\n */\n withTime?: boolean;\n}\n\nconst CalendarIcon = () => <Icon icon={Calendar} size=\"md\" color=\"current\" />;\nconst ChevronLeftIcon = () => <Icon icon={ChevronLeft} size=\"md\" color=\"current\" />;\nconst ChevronRightIcon = () => <Icon icon={ChevronRight} size=\"md\" color=\"current\" />;\n\n/**\n * DatePicker component with calendar popup\n */\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(({\n value,\n onChange,\n placeholder = 'Select date',\n disabled = false,\n required = false,\n size = 'md',\n className,\n minDate,\n maxDate,\n format = 'MM/dd/yyyy',\n withTime = false,\n}, ref) => {\n const [isOpen, setIsOpen] = useState(false);\n const [currentMonth, setCurrentMonth] = useState(() => value || new Date());\n const containerRef = useRef<HTMLDivElement>(null);\n const fieldRef = useRef<HTMLDivElement>(null);\n // Fixed against the field: an absolute panel is clipped by the form panel's\n // overflow and opens below the fold when the field sits near the bottom.\n //\n // Anchored on the field, not on containerRef — the panel is a child of the\n // container, so on the first open (before the fixed position lands) it counted\n // towards the container's own height and the panel placed itself a panel's\n // length too low. Closing and reopening looked fine because the measurement\n // from the previous open was still in state.\n const panelStyle = useAnchoredPosition(isOpen, fieldRef);\n\n // Close calendar when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // Format date for display\n const formatDate = (date: Date | null): string => {\n if (!date) return '';\n\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n\n const datePart =\n format === 'dd/MM/yyyy' ? `${day}/${month}/${year}`\n : format === 'yyyy-MM-dd' ? `${year}-${month}-${day}`\n : `${month}/${day}/${year}`;\n\n return withTime ? `${datePart} ${formatTime(date)}` : datePart;\n };\n\n /** `HH:mm`, the value shape a native time input expects. */\n const formatTime = (date: Date) =>\n `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n\n const handleTimeChange = (next: string) => {\n const [hours, minutes] = next.split(':').map(Number);\n if (Number.isNaN(hours) || Number.isNaN(minutes)) return;\n // Time can be set before a day is picked; fall back to today.\n const base = value ? new Date(value) : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.(base);\n };\n\n // Get calendar days for current month\n const getCalendarDays = () => {\n const year = currentMonth.getFullYear();\n const month = currentMonth.getMonth();\n\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const startDate = new Date(firstDay);\n startDate.setDate(startDate.getDate() - firstDay.getDay());\n\n const days = [];\n const current = new Date(startDate);\n\n for (let i = 0; i < 42; i++) {\n days.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n\n return days;\n };\n\n const handleDateSelect = (date: Date) => {\n const isInCurrentMonth = date.getMonth() === currentMonth.getMonth();\n if (!isInCurrentMonth) return;\n\n // Check min/max constraints\n if (minDate && date < minDate) return;\n if (maxDate && date > maxDate) return;\n\n if (withTime) {\n // Carry the time across, otherwise picking a day silently resets it to 00:00.\n const picked = new Date(date);\n picked.setHours(value?.getHours() ?? 0, value?.getMinutes() ?? 0, 0, 0);\n onChange?.(picked);\n // Stay open: the time still has to be set.\n return;\n }\n\n onChange?.(date);\n setIsOpen(false);\n };\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1));\n };\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1));\n };\n\n const handleClear = () => {\n onChange?.(null);\n setIsOpen(false);\n };\n\n const inputClasses = cn(\n 'w-full border border-border rounded-md transition-colors duration-fast',\n 'bg-surface text-text',\n 'placeholder:text-text-muted',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled',\n {\n 'h-control-sm px-3 text-sm': size === 'sm',\n 'h-control-md px-3 text-base': size === 'md',\n 'h-control-lg px-3 text-base': size === 'lg',\n 'h-control-md w-full px-3 text-base': size === 'full',\n },\n className\n );\n\n const calendarDays = getCalendarDays();\n const monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Input */}\n <div ref={fieldRef} className=\"relative\">\n <input\n ref={ref}\n type=\"text\"\n value={formatDate(value ?? null)}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className={cn(inputClasses, 'pr-10 cursor-pointer')}\n />\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-text-muted hover:text-text-muted\"\n >\n <CalendarIcon />\n </button>\n </div>\n\n {/* Calendar Popup */}\n {isOpen && (\n <div style={panelStyle} className=\"fixed z-overlay overflow-auto rounded-lg border border-border bg-surface p-4 shadow-overlay min-w-panel\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-1 hover:bg-surface-hover rounded\"\n >\n <ChevronLeftIcon />\n </button>\n <h3 className=\"text-sm font-medium text-text\">\n {monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h3>\n <button\n onClick={handleNextMonth}\n className=\"p-1 hover:bg-surface-hover rounded\"\n >\n <ChevronRightIcon />\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map((day) => (\n <div key={day} className=\"text-xs font-medium text-text-muted text-center py-1\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n const isCurrentMonth = date.getMonth() === currentMonth.getMonth();\n const isSelected = value && date.toDateString() === value.toDateString();\n const isToday = date.toDateString() === new Date().toDateString();\n const isDisabled =\n !isCurrentMonth ||\n (minDate && date < minDate) ||\n (maxDate && date > maxDate);\n\n return (\n <button\n key={index}\n onClick={() => !isDisabled && handleDateSelect(date)}\n disabled={isDisabled}\n className={cn(\n 'w-8 h-8 text-sm rounded transition-colors duration-fast',\n {\n 'text-text hover:bg-surface-hover':\n isCurrentMonth && !isSelected && !isDisabled,\n 'bg-accent text-accent-fg': isSelected,\n 'bg-surface-hover text-text': isToday && !isSelected,\n 'text-text-muted cursor-not-allowed': isDisabled,\n }\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {withTime && (\n <div className=\"mt-3 flex items-center gap-2 border-t border-border pt-3\">\n <label htmlFor=\"datepicker-time\" className=\"text-sm text-text-muted\">\n Tijd\n </label>\n <input\n id=\"datepicker-time\"\n type=\"time\"\n value={value ? formatTime(value) : ''}\n onChange={(e) => handleTimeChange(e.target.value)}\n className=\"h-control-sm rounded-md border border-border bg-surface-input px-2 text-sm text-text focus-visible:outline-none focus-visible:focus-ring\"\n />\n </div>\n )}\n\n {/* Footer */}\n <div className=\"flex justify-between items-center mt-4 pt-3 border-t border-border\">\n <button\n onClick={handleClear}\n className=\"text-sm text-text-muted hover:text-text\"\n >\n Clear\n </button>\n <button\n onClick={() => setIsOpen(false)}\n className=\"text-sm text-info-fg hover:underline\"\n >\n Close\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}); ","import { ChevronDownIcon } from \"lucide-react\";\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useAnchoredPosition } from \"../utils/useAnchoredPosition\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string | string[];\n onChange?: (value: string | string[]) => void;\n label?: string;\n helperText?: string;\n error?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n fullWidth?: boolean;\n options: SelectOption[];\n placeholder?: string;\n containerClassName?: string;\n labelClassName?: string;\n searchable?: boolean;\n multiple?: boolean;\n\n /** Vrije invoer toestaan (Enter of klik op “Voeg toe…”) */\n allowCreate?: boolean;\n\n /** Optioneel: zelf bepalen hoe een nieuwe optie eruit ziet */\n onCreateOption?: (label: string) => SelectOption;\n}\n\nconst selectSizes = {\n sm: \"h-control-sm px-3 text-sm\",\n md: \"h-control-md px-3 text-sm\",\n lg: \"h-control-lg px-3 text-base\",\n full: \"h-control-md w-full px-3 text-sm\",\n};\n\nconst norm = (s: string) => s.trim().toLowerCase();\n\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n label,\n helperText,\n error,\n size = \"md\",\n fullWidth = false,\n options,\n placeholder,\n containerClassName,\n labelClassName,\n className,\n id,\n searchable,\n multiple,\n value,\n onChange,\n allowCreate,\n onCreateOption,\n ...props\n },\n ref\n ) => {\n const selectId = id || `select-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\n const [isOpen, setIsOpen] = React.useState(false);\n const [searchTerm, setSearchTerm] = React.useState(\"\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n // Anchored to the control itself, not the container — the container also\n // holds the label, which would push the panel down by its height.\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n // Fixed, not absolute: an absolute panel is clipped by the form panel's\n // overflow and runs off-screen when the field sits near the bottom.\n const panelStyle = useAnchoredPosition(isOpen, triggerRef, { matchWidth: true });\n\n // Lokale kopie van opties, waarin we ook vrije waarden kunnen bijmengen\n const [localOptions, setLocalOptions] =\n React.useState<SelectOption[]>(options);\n\n React.useImperativeHandle(ref, () => containerRef.current!);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Helper: check of optie (op value/label) al bestaat\n const includesOption = React.useCallback(\n (opts: SelectOption[], needle: string) =>\n opts.some(\n (o) =>\n norm(o.value) === norm(needle) || norm(o.label) === norm(needle)\n ),\n []\n );\n\n // Voeg ontbrekende current value(s) toe aan de opties\n const ensureValuesInOptions = React.useCallback(\n (baseOptions: SelectOption[], currentValue?: string | string[]) => {\n const out = [...baseOptions];\n\n const addIfMissing = (v?: string) => {\n const val = (v ?? \"\").trim();\n if (!val) return;\n if (!includesOption(out, val)) {\n out.push({ value: val, label: val });\n }\n };\n\n if (Array.isArray(currentValue)) {\n currentValue.forEach(addIfMissing);\n } else {\n addIfMissing(currentValue);\n }\n\n return out;\n },\n [includesOption]\n );\n\n // Wanneer \"options\" verandert, merge + zorg dat de huidige value(s) erin staan\n React.useEffect(() => {\n setLocalOptions((prev) => {\n // Start vanuit de nieuwe options prop\n const next = [...options];\n\n // Ook eerder lokaal aangemaakte opties behouden (zonder duplicates)\n prev.forEach((opt) => {\n if (\n !includesOption(next, opt.value) &&\n !includesOption(next, opt.label)\n ) {\n next.push(opt);\n }\n });\n\n // En zorg dat de actuele value(s) aanwezig zijn\n return ensureValuesInOptions(next, value);\n });\n }, [options, value, ensureValuesInOptions, includesOption]);\n\n const handleSelect = (optionValue: string) => {\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : [];\n const newValues = currentValues.includes(optionValue)\n ? currentValues.filter((v) => v !== optionValue)\n : [...currentValues, optionValue];\n onChange?.(newValues);\n } else {\n onChange?.(optionValue);\n setIsOpen(false);\n setSearchTerm(\"\");\n }\n };\n\n const selectedOption = multiple\n ? null\n : localOptions.find((o) => o.value === value);\n\n const selectedOptions = multiple\n ? localOptions.filter(\n (o) => Array.isArray(value) && value.includes(o.value)\n )\n : [];\n\n const filteredOptions =\n searchable && searchTerm\n ? localOptions.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase())\n )\n : localOptions;\n\n const canCreate =\n Boolean(allowCreate) &&\n Boolean(searchable) &&\n Boolean(searchTerm.trim()) &&\n !includesOption(localOptions, searchTerm);\n\n const createOption = (labelToCreate: string) => {\n const clean = labelToCreate.trim();\n if (!clean) return;\n\n const newOption: SelectOption = onCreateOption?.(clean) ?? {\n value: clean,\n label: clean,\n };\n\n if (\n includesOption(localOptions, newOption.value) ||\n includesOption(localOptions, newOption.label)\n ) {\n // al aanwezig; selecteer hem gewoon\n handleSelect(newOption.value);\n setSearchTerm(\"\");\n if (!multiple) setIsOpen(false);\n return;\n }\n\n setLocalOptions((prev) => [...prev, newOption]);\n handleSelect(newOption.value);\n\n setSearchTerm(\"\");\n if (!multiple) setIsOpen(false);\n };\n\n const getDisplayValue = () => {\n if (multiple) {\n if (selectedOptions.length > 0) {\n return selectedOptions.map((o) => o.label).join(\", \");\n }\n return placeholder || \"Select options\";\n }\n return selectedOption?.label || placeholder || \"Select an option\";\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative flex flex-col\",\n fullWidth && \"w-full\",\n containerClassName\n )}\n {...props}\n >\n {label && (\n <label\n htmlFor={selectId}\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"block text-xs font-semibold uppercase tracking-label mb-1.5\",\n hasError\n ? \"text-danger-fg\"\n : \"text-text-muted\",\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <button\n ref={triggerRef}\n type=\"button\"\n id={selectId}\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-md border transition-colors duration-fast text-left\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n \"disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled\",\n \"bg-surface\",\n selectSizes[size],\n hasError\n ? \"border-danger-border text-danger-fg focus-visible:focus-ring\"\n : \"border-border text-text\",\n className\n )}\n >\n <span className=\"truncate flex-1 min-w-0\">{getDisplayValue()}</span>\n <ChevronDownIcon\n size={16}\n className={cn(\n \"shrink-0 opacity-60 transition-transform duration-fast\",\n isOpen && \"rotate-180\"\n )}\n />\n </button>\n\n {isOpen && (\n <div style={panelStyle} className=\"fixed z-overlay flex flex-col overflow-hidden rounded-lg border border-border bg-surface shadow-overlay\">\n {searchable && (\n <div className=\"p-2\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && canCreate) {\n e.preventDefault();\n createOption(searchTerm);\n }\n }}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded-md border\",\n \"text-text border-border focus-visible:outline-none focus-visible:focus-ring\"\n )}\n />\n </div>\n )}\n\n {canCreate && (\n <div\n className={cn(\n \"cursor-pointer px-3 py-1.5 text-sm\",\n \"text-info-fg hover:bg-surface-hover\"\n )}\n onClick={() => createOption(searchTerm)}\n >\n +: “{searchTerm.trim()}”\n </div>\n )}\n\n <ul className=\"min-h-0 flex-1 overflow-auto py-1\">\n {placeholder && !multiple && (\n <li\n className=\"cursor-pointer px-3 py-1.5 text-sm text-text-muted hover:bg-surface-hover\"\n onClick={() => {\n onChange?.(\"\");\n setIsOpen(false);\n }}\n >\n {placeholder}\n </li>\n )}\n {filteredOptions.map((option) => {\n const isSelected = multiple\n ? Array.isArray(value) && value.includes(option.value)\n : value === option.value;\n return (\n <li\n key={option.value}\n onClick={() =>\n !option.disabled && handleSelect(option.value)\n }\n className={cn(\n \"cursor-pointer px-3 py-1.5 text-sm\",\n \"text-text\",\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:bg-surface-hover\",\n isSelected && \"bg-accent-soft text-accent font-semibold\"\n )}\n >\n <div className=\"flex items-center\">\n {multiple && (\n <input\n type=\"checkbox\"\n checked={isSelected}\n readOnly\n className=\"mr-3 h-4 w-4 rounded border-border [&:not(:checked)]:bg-surface-input text-accent \"\n />\n )}\n <span>{option.label}</span>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n className={cn(\n \"mt-1 text-xs\",\n hasError ? \"text-danger-fg\" : \"text-text-muted\"\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = \"Select\";\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TextFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /**\n * The label for the input field\n */\n label?: string;\n\n /**\n * Helper text to display below the input\n */\n helperText?: string;\n\n /**\n * Error message to display when the input is invalid\n */\n error?: string;\n\n /**\n * The size of the input field\n */\n size?: 'sm' | 'md' | 'lg' | 'full';\n\n /**\n * Whether the input should take the full width of its container\n */\n fullWidth?: boolean;\n\n /**\n * Icon to display at the start of the input\n */\n startIcon?: React.ReactNode;\n\n /**\n * Icon to display at the end of the input\n */\n endIcon?: React.ReactNode;\n\n /**\n * Whether the input is in a loading state\n */\n loading?: boolean;\n\n /**\n * Additional class name for the container\n */\n containerClassName?: string;\n\n /**\n * Additional class name for the label\n */\n labelClassName?: string;\n}\n\n/** Heights come from the control tokens — inputs, buttons and selects align. */\nconst inputSizes = {\n sm: 'h-control-sm px-3 text-sm',\n md: 'h-control-md px-3 text-base',\n lg: 'h-control-lg px-3 text-base',\n full: 'h-control-md px-3 text-base',\n};\n\n/** Shared with TextArea / Select / DatePicker: uppercase section label. */\nexport const fieldLabelClasses =\n 'mb-1.5 block text-xs font-semibold uppercase tracking-label';\n\n/**\n * TextField component with theme integration and validation states\n *\n * @example\n * ```tsx\n * <TextField label=\"E-mail\" type=\"email\" placeholder=\"naam@bedrijf.nl\" />\n * <TextField label=\"Zoeken\" startIcon={<Icon icon={Search} />} />\n * <TextField label=\"Wachtwoord\" type=\"password\" error=\"Verplicht veld\" />\n * ```\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n label,\n helperText,\n error,\n size = 'md',\n fullWidth = false,\n startIcon,\n endIcon,\n loading = false,\n containerClassName,\n labelClassName,\n className,\n id,\n ...props\n },\n ref\n ) => {\n const reactId = React.useId();\n const inputId = id || `textfield-${reactId}`;\n const hasError = Boolean(error);\n const describedBy = error || helperText ? `${inputId}-description` : undefined;\n\n return (\n <div className={cn('flex flex-col', fullWidth && 'w-full', containerClassName)}>\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n fieldLabelClasses,\n hasError ? 'text-danger-fg' : 'text-text-subtle',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n {startIcon && (\n <span className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-text-muted\">\n {startIcon}\n </span>\n )}\n\n <input\n ref={ref}\n id={inputId}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn(\n 'block w-full rounded-md border bg-surface-input text-text',\n 'transition-colors duration-fast ease-out',\n 'placeholder:text-text-subtle',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled',\n\n inputSizes[size],\n\n startIcon && 'pl-9',\n (endIcon || loading) && 'pr-9',\n\n hasError\n ? 'border-danger-border bg-danger-soft'\n : 'border-border hover:border-border-strong',\n\n className\n )}\n {...props}\n />\n\n {(endIcon || loading) && (\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-text-muted\">\n {loading ? (\n <span\n aria-hidden\n className=\"size-icon-md animate-spin rounded-full border-2 border-border border-t-transparent\"\n />\n ) : (\n endIcon\n )}\n </span>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n id={describedBy}\n className={cn('mt-1 text-xs', hasError ? 'text-danger-fg' : 'text-text-subtle')}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = 'TextField';\n","import { VirtualMount } from \"@opencxh/domain\";\nimport { useEffect, useState } from \"react\";\nimport { Select } from \"./Select\";\nimport { TextField } from \"./TextField\";\n\nexport interface FolderDestination {\n /** Storage folder (mount) id. */\n folderId?: string;\n /** Optional sub-path template, e.g. \"{yyyy}/{mm}/{dd}\". */\n pathTemplate?: string;\n}\n\nexport interface FolderSelectProps {\n value?: FolderDestination;\n onChange?: (value: FolderDestination) => void;\n /** Loads the selectable storage folders (the shell wires this to storage.mount). */\n onListFolders?: () => Promise<{ data: VirtualMount[] }> | undefined;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n placeholder?: string;\n templatePlaceholder?: string;\n /** Show the sub-path template input (default true). */\n showTemplate?: boolean;\n}\n\n/**\n * Destination picker for a storage folder (+ optional sub-path template).\n * Unlike StorageInput (which picks/uploads a file), this selects *where* things\n * should be written. Used by the `type: \"folder\"` form field.\n */\nexport function FolderSelect({\n value,\n onChange,\n onListFolders,\n disabled,\n size = \"md\",\n placeholder,\n templatePlaceholder,\n showTemplate = true,\n}: FolderSelectProps) {\n const [folders, setFolders] = useState<VirtualMount[]>([]);\n\n useEffect(() => {\n let active = true;\n Promise.resolve(onListFolders?.())\n .then((res) => {\n if (active && res) setFolders(res.data ?? []);\n })\n .catch(() => {\n /* folder list unavailable */\n });\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const v = value ?? {};\n\n return (\n <div className=\"flex flex-col gap-2\">\n <Select\n size={size}\n fullWidth\n value={v.folderId ?? \"\"}\n options={folders.map((f) => ({ value: f.id, label: f.name }))}\n placeholder={placeholder ?? \"Select a folder\"}\n onChange={(val) => onChange?.({ ...v, folderId: val as string })}\n />\n {showTemplate && (\n <TextField\n size={size}\n disabled={disabled ?? false}\n value={v.pathTemplate ?? \"\"}\n placeholder={templatePlaceholder ?? \"Sub-path e.g. {yyyy}/{mm}/{dd} (optional)\"}\n onChange={(e) => onChange?.({ ...v, pathTemplate: e.target.value })}\n />\n )}\n </div>\n );\n}\n","import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ChevronDown, Loader2, Search } from \"lucide-react\";\n\nconst cn = (...classes: string[]) => classes.filter(Boolean).join(\" \");\n\nconst SearchIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <Search {...props} strokeWidth={1.5} aria-hidden />\n);\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <ChevronDown {...props} strokeWidth={1.5} aria-hidden />\n);\n\nconst inputSizes = {\n sm: \"h-control-sm px-3 text-sm\",\n md: \"h-control-md px-3 text-base\",\n lg: \"h-control-lg px-3 text-base\",\n full: \"h-control-md w-full px-3 text-base\",\n};\n\nconst iconSizes = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n full: \"h-6 w-6\",\n};\n\nexport interface SearchableTextFieldOption {\n value: string;\n label: string;\n}\n\nexport interface SearchableTextFieldProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"onSelect\"\n > {\n label?: string;\n helperText?: string;\n error?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n fullWidth?: boolean;\n startIcon?: React.ReactNode;\n loading?: boolean;\n containerClassName?: string;\n labelClassName?: string;\n\n options: SearchableTextFieldOption[];\n onRemoteSearch?: (searchTerm: string) => Promise<void>;\n\n onSelect?: (value: string) => void;\n debounceTime?: number;\n /**\n * Selector-modus: toon bij openen (focus/chevron) álle opties, ook wanneer de\n * huidige waarde een reeds geselecteerde optie is. Pas zodra de gebruiker zelf\n * typt wordt er gefilterd. Handig wanneer het veld eerder een keuzelijst is dan\n * een vrije zoekopdracht (bv. een afzender-selector).\n */\n showAllOnOpen?: boolean;\n}\n\nexport const SearchableTextField = forwardRef<\n HTMLInputElement,\n SearchableTextFieldProps\n>(\n (\n {\n label,\n helperText,\n error,\n size = \"md\",\n fullWidth = false,\n startIcon = <SearchIcon />,\n loading: externalLoading = false,\n containerClassName,\n labelClassName,\n className,\n id,\n options,\n onRemoteSearch,\n onSelect,\n debounceTime = 500,\n showAllOnOpen = false,\n value: propValue,\n onChange,\n ...props\n },\n ref\n ) => {\n const inputId =\n id || `searchfield-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\n const containerRef = useRef(null);\n const inputRef = useRef(null);\n\n const [inputValue, setInputValue] = useState(propValue || \"\");\n const [isOpen, setIsOpen] = useState(false);\n const [isSearchingRemote, setIsSearchingRemote] = useState(false);\n // In selector-modus: is er sinds het openen daadwerkelijk getypt? Zo niet,\n // dan tonen we de volledige lijst i.p.v. te filteren op de gekozen waarde.\n const [typedSinceOpen, setTypedSinceOpen] = useState(false);\n\n useEffect(() => {\n if (propValue !== undefined) {\n setInputValue(propValue);\n }\n }, [propValue]);\n\n const filteredOptions = useMemo(() => {\n if (showAllOnOpen && !typedSinceOpen) return options;\n if (!inputValue) return options;\n const lowerCaseInput = String(inputValue).toLowerCase();\n return options.filter((option) =>\n String(option.label).toLowerCase().includes(lowerCaseInput)\n );\n }, [inputValue, options, showAllOnOpen, typedSinceOpen]);\n\n useEffect(() => {\n if (!onRemoteSearch || !inputValue) {\n setIsSearchingRemote(false);\n return;\n }\n\n const handler = setTimeout(async () => {\n setIsSearchingRemote(true);\n try {\n await onRemoteSearch(String(inputValue));\n } catch (e) {\n console.error(\"Remote search failed:\", e);\n } finally {\n setIsSearchingRemote(false);\n }\n }, debounceTime);\n\n return () => {\n clearTimeout(handler);\n setIsSearchingRemote(false);\n };\n }, [inputValue, debounceTime, onRemoteSearch]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !(containerRef.current as HTMLElement).contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setIsOpen(true);\n setTypedSinceOpen(true);\n if (onChange) {\n onChange(e);\n }\n };\n\n const handleSelect = (option: SearchableTextFieldOption) => {\n setInputValue(option.label);\n setIsOpen(false);\n setTypedSinceOpen(false);\n if (onSelect) {\n onSelect(option.value);\n }\n };\n\n const handleFocus = () => {\n // Open dropdown alleen als er opties zijn of remote search beschikbaar is\n if (options.length > 0 || onRemoteSearch) {\n setIsOpen(true);\n setTypedSinceOpen(false);\n }\n };\n\n const loading = externalLoading || isSearchingRemote;\n\n const showDropdown = isOpen && (filteredOptions.length > 0 || loading);\n\n const resolvedRef = useMemo(() => ref || inputRef, [ref]);\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n fullWidth ? \"w-full\" : \"\",\n containerClassName || \"\",\n \"relative\"\n )}\n ref={containerRef}\n >\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"block text-sm font-medium mb-1\",\n hasError ? \"text-danger-fg\" : \"text-text\",\n labelClassName || \"\"\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n {startIcon && (\n <div className=\"absolute left-0 pl-3 flex items-center pointer-events-none h-full\">\n <span className={cn(\"text-text-muted\", iconSizes[size])}>\n {startIcon}\n </span>\n </div>\n )}\n\n <input\n ref={resolvedRef}\n id={inputId}\n value={inputValue}\n onChange={handleChange}\n onFocus={handleFocus}\n className={cn(\n // Base styles\n \"block w-full rounded-md border bg-surface-input transition-colors duration-fast ease-out\",\n \"placeholder:text-text-subtle focus-visible:outline-none focus-visible:focus-ring\",\n \"disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled\",\n\n // Size styles\n inputSizes[size],\n\n // Icon padding\n startIcon ? \"pl-10\" : \"\",\n \"pr-10\", // Altijd padding rechts voor de dropdown/loading icon\n\n // State styles\n hasError\n ? \"border-danger-border text-danger-fg focus-visible:focus-ring\"\n : \"border-border text-text\",\n\n className || \"\"\n )}\n {...props}\n />\n\n {/* END ICON (Laden/Dropdown) */}\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center\">\n {loading || externalLoading ? (\n // Loading Spinner\n <Loader2\n className={cn(\"animate-spin text-info-fg\", iconSizes[size])}\n aria-hidden\n />\n ) : (\n // Dropdown Chevron\n <ChevronDownIcon\n className={cn(\n \"text-text-muted cursor-pointer transition-transform\",\n iconSizes[size],\n isOpen ? \"rotate-180\" : \"rotate-0\"\n )}\n onClick={() => {\n setIsOpen((prev) => {\n if (!prev) setTypedSinceOpen(false);\n return !prev;\n });\n }}\n />\n )}\n </div>\n </div>\n\n {/* DROPDOWN LIJST */}\n {showDropdown && (\n <ul\n className=\"absolute z-10 mt-1 w-full bg-surface border border-border rounded-lg shadow-lg max-h-60 overflow-auto top-full\"\n role=\"listbox\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option: SearchableTextFieldOption) => (\n <li\n key={option.value}\n className=\"px-4 py-2 cursor-pointer text-text hover:bg-accent-soft hover:text-accent transition-colors\"\n onClick={() => handleSelect(option)}\n role=\"option\"\n aria-selected={inputValue === option.label}\n >\n {option.label}\n </li>\n ))\n ) : (\n <li className=\"px-4 py-2 text-text-muted\">\n {loading || externalLoading\n ? \"Zoeken op afstand...\"\n : \"Geen resultaten gevonden.\"}\n </li>\n )}\n </ul>\n )}\n\n {/* HELPER/ERROR TEKST */}\n {(error || helperText) && (\n <p\n className={cn(\n \"mt-1 text-xs\",\n hasError ? \"text-danger-fg\" : \"text-text-muted\"\n )}\n >\n {error || helperText}\n </p>\n )}\n\n {/* Eenvoudig voorbeeld van de huidige status voor demo */}\n {onRemoteSearch && (\n <p className=\"mt-2 text-xs text-success-fg\">\n Huidige zoekterm (niet-gedebounced): {String(inputValue)}\n </p>\n )}\n </div>\n );\n }\n);\n\nSearchableTextField.displayName = \"SearchableTextField\";\n","import React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"checked\" | \"onChange\"> {\n /**\n * Current state. Deliberately required and never held internally: several\n * call sites drive this from an optimistic update that rolls back on a failed\n * request, and internal state would silently swallow the rollback.\n */\n checked: boolean;\n onChange: (checked: boolean) => void;\n /** Text beside the switch. Omit it and pass `aria-label` instead. */\n label?: React.ReactNode;\n disabled?: boolean;\n}\n\n/**\n * On/off switch for a setting that applies immediately.\n *\n * Use `Checkbox` instead when the value is part of a form the user submits —\n * a switch says \"this is now on\", a checkbox says \"include this when I save\".\n *\n * @example\n * ```tsx\n * <Switch checked={syncEnabled} onChange={setSyncEnabled} label=\"Agenda synchroniseren\" />\n * ```\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ checked, onChange, label, disabled = false, className, ...props }, ref) => {\n const track = (\n <span\n aria-hidden\n className={cn(\n \"relative inline-flex size-switch-track shrink-0 items-center rounded-full\",\n \"transition-colors duration-fast ease-out\",\n checked ? \"bg-accent\" : \"bg-surface-hover\",\n disabled && \"opacity-50\"\n )}\n >\n <span\n className={cn(\n \"absolute left-0.5 size-switch-knob rounded-full bg-surface shadow-overlay\",\n \"transition-transform duration-fast ease-out\",\n checked && \"translate-switch\"\n )}\n />\n </span>\n );\n\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-2\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n className\n )}\n >\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n disabled={disabled}\n onChange={(event) => onChange(event.target.checked)}\n className=\"peer sr-only\"\n {...props}\n />\n {/* The ring lives on the track, since the input itself is visually hidden. */}\n <span className=\"inline-flex rounded-full peer-focus-visible:focus-ring\">{track}</span>\n {label && <span className=\"text-sm text-text\">{label}</span>}\n </label>\n );\n }\n);\n\nSwitch.displayName = \"Switch\";\n","import { ReactNode } from 'react';\n\nexport interface ContentLoadingProps {\n /**\n * `page` (default) fills the route with its own `<main>` shell and padding.\n * `inline` drops both, so the skeleton can sit inside an existing panel,\n * card or scroll container without nesting a second `<main>` landmark.\n */\n variant?: \"page\" | \"inline\";\n\n /**\n * Optional custom skeleton content (overrides default)\n */\n children?: ReactNode;\n\n /**\n * If true, renders a table-style skeleton\n */\n showTableSkeleton?: boolean;\n\n /**\n * Number of table columns (default: 6)\n */\n tableColumns?: number;\n\n /**\n * Number of table rows (default: 8)\n */\n tableRows?: number;\n}\n\nexport function ContentLoading({\n variant = \"page\",\n children,\n showTableSkeleton = false,\n tableColumns = 6,\n tableRows = 8,\n}: ContentLoadingProps) {\n // `inline` renders the skeleton bare; `page` wraps it in the route shell.\n const Shell = ({ children: inner }: { children: ReactNode }) =>\n variant === \"inline\" ? (\n <>{inner}</>\n ) : (\n <main className=\"flex-1 bg-surface p-6\">{inner}</main>\n );\n\n if (children) {\n return (\n <Shell>\n <div className=\"w-full max-w-6xl mx-auto animate-pulse\">\n {children}\n </div>\n </Shell>\n );\n }\n\n return (\n <Shell>\n <div className=\"w-full mx-auto space-y-6 animate-pulse\">\n\n {/* Title Bar */}\n {!showTableSkeleton && (\n <>\n <div className=\"h-6 w-1/4 rounded-sm bg-surface-hover\" />\n\n {/* Description Lines */}\n <div className=\"space-y-2\">\n <div className=\"h-4 w-3/4 rounded-sm bg-surface-hover\" />\n <div className=\"h-4 w-1/2 rounded-sm bg-surface-hover\" />\n </div>\n </>\n )}\n\n {/* Optional Table Skeleton */}\n {showTableSkeleton && (\n <div className=\"rounded-lg overflow-hidden\">\n {/* Table header */}\n <div className=\"grid gap-2 bg-surface-hover p-3\"\n style={{ gridTemplateColumns: `repeat(${tableColumns}, minmax(0, 1fr))` }}>\n {Array.from({ length: tableColumns }).map((_, idx) => (\n <div\n key={`header-${idx}`}\n className=\"h-4 w-2/3 rounded-sm bg-border-strong\"\n />\n ))}\n </div>\n\n {/* Table rows */}\n {Array.from({ length: tableRows }).map((_, rowIdx) => (\n <div\n key={`row-${rowIdx}`}\n className=\"grid gap-2 border-t border-border-subtle p-3\"\n style={{ gridTemplateColumns: `repeat(${tableColumns}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: tableColumns }).map((_, colIdx) => (\n <div\n key={`cell-${rowIdx}-${colIdx}`}\n className=\"h-4 w-full rounded-sm bg-surface-hover\"\n />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n </Shell>\n );\n}\n","import { Check } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useAnchoredPosition } from \"../utils/useAnchoredPosition\";\n\nexport interface DropdownOption {\n /** Option value */\n value: string;\n /** Option label */\n label: string;\n /** Option icon */\n icon?: React.ReactNode;\n /** Whether option is disabled */\n disabled?: boolean;\n /** Whether option is a divider */\n divider?: boolean;\n /** Optional description for the option */\n description?: string;\n /** Nested sub-options */\n children?: DropdownOption[];\n}\n\nexport interface DropdownProps {\n /** Dropdown trigger element */\n trigger: React.ReactNode;\n /** Dropdown options */\n options: DropdownOption[];\n /** Selected value */\n value?: string | Record<string, string | string[]>;\n /** Change handler */\n onSelect?: (value: string, parentValue?: string) => void;\n /** Dropdown placement */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Whether dropdown is disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Show check mark for selected option */\n showCheck?: boolean;\n /** Header text for the dropdown */\n header?: string | React.ReactNode;\n}\n\n/**\n * Dropdown component for menus and select-like interfaces\n */\nexport const Dropdown: React.FC<DropdownProps> = ({\n trigger,\n options,\n value,\n onSelect,\n placement = \"bottom-start\",\n disabled = false,\n className,\n showCheck = true,\n header,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredOption, setHoveredOption] = useState<\n string | Record<string, string | string[]> | null\n >(null);\n const [submenuPosition, setSubmenuPosition] = useState({ top: 0, left: 0 });\n // Menu is position:fixed (computed from the trigger) so it escapes any\n // overflow-hidden / rounded-card ancestor instead of being clipped.\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const submenuRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuPos = useAnchoredPosition(isOpen, triggerRef, { placement });\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n /** Enabled option buttons in the open menu, in DOM order. */\n const menuItems = () =>\n Array.from(\n menuRef.current?.querySelectorAll<HTMLButtonElement>(\"button[data-option-value]:not(:disabled)\") ?? []\n );\n\n // Move focus into the menu when it opens, so the keyboard lands somewhere\n // useful instead of on the page behind it.\n useEffect(() => {\n if (isOpen) menuItems()[0]?.focus();\n }, [isOpen]);\n\n /** Roving focus: ↓/↑ wrap through the options, Home/End jump to the ends. */\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n\n const items = menuItems();\n if (items.length === 0) return;\n event.preventDefault();\n\n const current = items.indexOf(document.activeElement as HTMLButtonElement);\n const next =\n event.key === \"Home\" ? 0\n : event.key === \"End\" ? items.length - 1\n : event.key === \"ArrowDown\" ? (current + 1) % items.length\n : (current - 1 + items.length) % items.length;\n\n items[next]?.focus();\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n (!dropdownRef.current.contains(event.target as Node) ||\n (submenuRef.current &&\n !submenuRef.current.contains(event.target as Node)))\n ) {\n setIsOpen(false);\n setHoveredOption(null);\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n\n // Close dropdown on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n setHoveredOption(null);\n // Hand focus back to the trigger; otherwise it falls to <body> and the\n // keyboard user loses their place.\n triggerRef.current?.focus();\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen]);\n\n // Calculate submenu position when hovering over an option with children\n useEffect(() => {\n if (hoveredOption && dropdownRef.current) {\n const hoveredElement = dropdownRef.current.querySelector(\n `[data-option-value=\"${hoveredOption}\"]`\n );\n if (hoveredElement) {\n const rect = hoveredElement.getBoundingClientRect();\n setSubmenuPosition({\n top: rect.top,\n left: rect.right + 8,\n });\n }\n }\n }, [hoveredOption]);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n const handleTriggerClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n if (disabled) return;\n setIsOpen(!isOpen);\n setHoveredOption(null);\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n };\n\n const handleOptionClick = (\n event: React.MouseEvent<HTMLButtonElement>,\n option: DropdownOption,\n parentValue?: string\n ) => {\n event.stopPropagation();\n if (!option.disabled && !option.divider) {\n // Only close dropdown if option has no children\n if (!option.children || option.children.length === 0) {\n onSelect?.(option.value, parentValue);\n setIsOpen(false);\n setHoveredOption(null);\n }\n }\n };\n\n const handleOptionHover = (option: DropdownOption) => {\n // Clear any existing timeout\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n\n if (option.children && option.children.length > 0) {\n setHoveredOption(option.value);\n } else {\n setHoveredOption(null);\n }\n };\n\n const handleOptionLeave = (option: DropdownOption) => {\n // Only hide if the option has children, and add a small delay\n if (option.children && option.children.length > 0) {\n hideTimeoutRef.current = setTimeout(() => {\n setHoveredOption(null);\n }, 150); // 150ms delay\n } else {\n setHoveredOption(null);\n }\n };\n\n const handleSubmenuOptionClick = (\n event: React.MouseEvent<HTMLButtonElement>,\n option: DropdownOption,\n parentValue?: string\n ) => {\n event.stopPropagation();\n if (!option.disabled && !option.divider) {\n onSelect?.(option.value, parentValue);\n setIsOpen(false);\n setHoveredOption(null);\n }\n };\n\n const dropdownClasses = cn(\n \"fixed z-overlay min-w-menu bg-surface rounded-lg shadow-overlay border border-border\",\n \"max-h-60 overflow-auto\"\n );\n\n const submenuClasses = cn(\n \"fixed z-overlay min-w-menu bg-surface rounded-lg shadow-overlay border border-border\",\n \"max-h-60 overflow-auto\"\n );\n\n return (\n <div\n ref={dropdownRef}\n className={cn(\n \"relative flex flex-row items-center justify-center rounded-lg hover:bg-surface-hover\",\n className\n )}\n >\n {/* Trigger */}\n <button\n ref={triggerRef}\n onClick={handleTriggerClick}\n disabled={disabled}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n className={cn(\"inline-flex items-center justify-center\", {\n \"opacity-50 cursor-not-allowed\": disabled,\n })}\n >\n {trigger}\n </button>\n\n {/* Dropdown menu */}\n {isOpen && (\n <div ref={menuRef} className={dropdownClasses} style={menuPos} onKeyDown={handleMenuKeyDown}>\n <div className=\"p-2\" role=\"menu\">\n {/* Header */}\n {header && (\n typeof header === \"string\" ? (\n <div className=\"text-xs font-medium text-text-muted uppercase tracking-label px-3 py-2\">\n {header}\n </div>\n ) : (\n header\n )\n )}\n\n {options.map((option, index) => {\n if (option.divider) {\n return (\n <div\n key={`divider-${index}`}\n className=\"border-t border-border my-2\"\n />\n );\n }\n\n const hasChildren = option.children && option.children.length > 0;\n const isHovered = hoveredOption === option.value;\n\n return (\n <div key={option.value} className=\"relative group\">\n <button\n data-option-value={option.value}\n role=\"menuitem\"\n aria-haspopup={hasChildren ? \"menu\" : undefined}\n onClick={(event) => handleOptionClick(event, option)}\n onMouseEnter={() => handleOptionHover(option)}\n onMouseLeave={() => handleOptionLeave(option)}\n disabled={option.disabled}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-3 py-1.5 text-sm text-text transition-colors duration-fast ease-out hover:bg-surface-hover focus-visible:outline-none focus-visible:focus-ring\",\n {\n \"opacity-50 cursor-not-allowed\": option.disabled,\n \"bg-surface-hover\":\n isHovered && hasChildren,\n }\n )}\n >\n <div className=\"flex items-center space-x-2 min-w-0\">\n {option.icon && (\n <span className=\"flex-shrink-0\">{option.icon}</span>\n )}\n <div className=\"flex flex-col items-start min-w-0\">\n <span className=\"font-base truncate\">\n {option.label}\n </span>\n {option.description && (\n <span className=\"text-xs text-text-muted\">\n {option.description}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n {showCheck && value === option.value && (\n <Check className=\"size-icon-md shrink-0 text-success-fg\" aria-hidden />\n )}\n {hasChildren && (\n <span className=\"text-text-muted text-xs\">\n ▶\n </span>\n )}\n </div>\n </button>\n\n {/* Nested submenu */}\n {hasChildren && isHovered && (\n <div\n ref={submenuRef}\n className={submenuClasses}\n style={{\n top: `${submenuPosition.top}px`,\n left: `${submenuPosition.left}px`,\n }}\n onMouseEnter={() => {\n // Clear any pending hide timeout\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n setHoveredOption(option.value);\n }}\n onMouseLeave={() => {\n // Add a small delay before hiding\n hideTimeoutRef.current = setTimeout(() => {\n setHoveredOption(null);\n }, 150);\n }}\n >\n <div className=\"p-2\">\n {option.children!.map((childOption, childIndex) => {\n if (childOption.divider) {\n return (\n <div\n key={`divider-${childIndex}`}\n className=\"border-t border-border my-2\"\n />\n );\n }\n\n const isSelected =\n (typeof value === \"object\" &&\n value[option.value] &&\n value[option.value].includes(\n childOption.value\n )) ||\n value === childOption.value;\n\n return (\n <button\n key={childOption.value}\n onClick={(event) =>\n handleSubmenuOptionClick(\n event,\n childOption,\n option.value\n )\n }\n disabled={childOption.disabled}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-3 py-1.5 text-sm text-text transition-colors duration-fast ease-out hover:bg-surface-hover\",\n {\n \"opacity-50 cursor-not-allowed\":\n childOption.disabled,\n }\n )}\n >\n <div className=\"flex items-center space-x-2 min-w-0\">\n {childOption.icon && (\n <span className=\"flex-shrink-0\">\n {childOption.icon}\n </span>\n )}\n <div className=\"flex flex-col items-start min-w-0\">\n <span className=\"font-base truncate\">\n {childOption.label}\n </span>\n {childOption.description && (\n <span className=\"text-xs text-text-muted\">\n {childOption.description}\n </span>\n )}\n </div>\n </div>\n\n {showCheck && isSelected && (\n <Check className=\"size-icon-md shrink-0 text-success-fg\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n })}\n\n {/* Footer with count */}\n {(() => {\n const totalOptions = options.reduce((count, option) => {\n if (option.divider) return count;\n const childCount = option.children\n ? option.children.filter((child) => !child.divider).length\n : 0;\n return count + 1 + childCount;\n }, 0);\n\n return (\n totalOptions > 1 && (\n <div className=\"border-t border-border mt-2 pt-2\">\n <div className=\"text-xs text-text-muted px-3 py-1\">\n {totalOptions} options available\n </div>\n </div>\n )\n );\n })()}\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, ChevronsLeft, ChevronsRight, Search } from \"lucide-react\";\nimport { Button } from \"../action/Button\";\nimport { Icon } from \"./Icon\";\nimport { ContentLoading } from \"../feedback/ContentLoading\";\nimport { DatePicker } from \"../input/DatePicker\";\nimport { TextField } from \"../input/TextField\";\nimport { Dropdown } from \"../overlays/Dropdown\";\nimport { cn } from \"../utils/cn\";\n\nexport interface TableColumn<T = any> {\n /** Unique column identifier */\n id: string;\n /** Column header text */\n header: string;\n /** Data accessor - can be string key or function */\n accessor: keyof T | ((row: T) => any);\n /** Custom cell renderer */\n cell?: (value: any, row: T, index: number) => React.ReactNode;\n /** Column width */\n width?: string | number;\n /** Whether column is sortable */\n sortable?: boolean;\n /** Whether column is searchable */\n searchable?: boolean;\n /** Column alignment */\n align?: \"left\" | \"center\" | \"right\";\n /** Whether column is sticky */\n sticky?: \"left\" | \"right\";\n /** Custom header renderer */\n headerCell?: () => React.ReactNode;\n}\n\nexport interface TableAction<T = any> {\n /** Action identifier */\n id: string;\n /** Action label */\n label: string;\n /** Action icon */\n icon?: React.ReactNode;\n /** Action handler */\n onClick: (row: T, index: number) => void;\n /** Whether action is disabled for this row */\n disabled?: (row: T) => boolean;\n /** Action variant */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\";\n}\n\nexport interface TableFilter {\n /** Filter identifier */\n id: string;\n /** Filter label */\n label: string;\n /** Filter type */\n type?: \"select\" | \"date\" | \"dateRange\";\n /** Filter options (for select type) */\n options?: Array<{ value: string; label: string }>;\n /** Current filter value */\n value?: string | Date | null | string[];\n /** Filter change handler */\n onChange: (value: string | Date | null | string[]) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether filter is multi-select */\n multiSelect?: boolean;\n}\n\nexport interface TableProps<T = any> {\n /** Table data */\n data: T[];\n /** Column definitions */\n columns: TableColumn<T>[];\n /** Loading state */\n loading?: boolean;\n /** Whether table is searchable */\n searchable?: boolean;\n /** Search placeholder text */\n searchPlaceholder?: string;\n /** Table filters */\n filters?: TableFilter[];\n /** Whether table has pagination */\n paginated?: boolean;\n /** Page size options */\n pageSizeOptions?: number[];\n /** Default page size */\n defaultPageSize?: number;\n /** Row actions */\n actions?: TableAction<T>[];\n /** Row click handler */\n onRowClick?: (row: T, index: number) => void;\n /** Row selection */\n selectable?: boolean;\n /** Selected rows */\n selectedRows?: T[];\n /** Selection change handler */\n onSelectionChange?: (selectedRows: T[]) => void;\n /** Row key accessor */\n getRowKey?: (row: T, index: number) => string | number;\n /** Empty state content */\n emptyContent?: React.ReactNode;\n /** Table size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether to show row hover */\n hoverable?: boolean;\n /** Whether to show row borders */\n bordered?: boolean;\n /** Whether to stripe rows */\n striped?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Custom row className */\n rowClassName?: (row: T, index: number) => string;\n}\n\ninterface SortState {\n column: string | null;\n direction: \"asc\" | \"desc\" | null;\n}\n\ninterface PaginationState {\n page: number;\n pageSize: number;\n}\n\n// Icons — lucide via the kit Icon component; `active` dims an inactive sort arrow.\nconst SearchIcon = () => <Icon icon={Search} size=\"md\" color=\"current\" />;\nconst ChevronUpIcon = ({ active }: { active?: boolean }) => (\n <Icon icon={ChevronUp} size=\"sm\" className={active ? \"text-text\" : \"text-text-subtle\"} />\n);\nconst ChevronDownIcon = ({ active }: { active?: boolean }) => (\n <Icon icon={ChevronDown} size=\"sm\" className={active ? \"text-text\" : \"text-text-subtle\"} />\n);\nconst ChevronLeftIcon = () => <Icon icon={ChevronLeft} size=\"md\" color=\"current\" />;\nconst ChevronRightIcon = () => <Icon icon={ChevronRight} size=\"md\" color=\"current\" />;\nconst ChevronsLeftIcon = () => <Icon icon={ChevronsLeft} size=\"md\" color=\"current\" />;\nconst ChevronsRightIcon = () => <Icon icon={ChevronsRight} size=\"md\" color=\"current\" />;\nconst ChevronDownSmallIcon = () => <Icon icon={ChevronDown} size=\"md\" color=\"current\" />;\n\n\nconst FilterDropdown = (props: TableFilter) => {\n const isSelected = (value: string) => {\n if (props.multiSelect && Array.isArray(props.value)) {\n return props.value?.includes(value);\n }\n return props.value === value;\n };\n\n const handleChange = (value: string | null | string[]) => {\n if (props.multiSelect && Array.isArray(props.value)) {\n props.onChange(props.value.filter((v) => v !== value));\n } else {\n props.onChange(value);\n }\n };\n\n if (props.type === \"date\") {\n return (\n <div className=\"flex items-center space-x-1 max-w-40\">\n <DatePicker\n size=\"sm\"\n value={props.value as Date | null}\n onChange={(date) => props.onChange(date)}\n placeholder={\n props.placeholder || `Select ${props.label.toLowerCase()}`\n }\n className=\"min-w-40 border border-border bg-surface text-text hover:bg-surface-hover\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center space-x-1 max-w-60\">\n <div className=\"relative\">\n <details className=\"group\">\n <summary className=\"flex h-control-md cursor-pointer items-center gap-2 rounded-full border border-border bg-surface px-3 text-sm font-semibold text-text hover:bg-surface-hover\">\n <span>{props.label}</span>\n <span className=\"text-text\">\n {props.multiSelect && Array.isArray(props.value)\n ? props.value\n ?.map(\n (v) =>\n props.options?.find((option) => option.value === v)\n ?.label\n )\n .join(\", \")\n : props.options?.find((option) => option.value === props.value)\n ?.label}\n </span>\n <span className=\"text-text-muted text-sm group-open:rotate-180 transition-transform\">\n <ChevronDownSmallIcon />\n </span>\n </summary>\n <div className=\"absolute z-10 left-0 mt-1 bg-surface border border-border rounded-lg shadow-overlay p-2 w-48\">\n {props.options?.map((option) => (\n <button\n key={option.value}\n className=\"w-full text-left px-3 py-2 rounded-md hover:bg-surface-hover text-sm text-text flex items-center space-x-2\"\n onClick={() => handleChange(option.value)}\n >\n <span\n className={cn(isSelected(option.value) && \"text-accent\")}\n >\n {option.label}\n </span>\n </button>\n ))}\n {props.value && (\n <button\n className=\"w-full text-left px-3 py-2 rounded-md hover:bg-surface-hover text-sm text-text flex items-center space-x-2 mt-2\"\n onClick={() => handleChange(null)}\n >\n <span className=\"text-text-muted\">\n Clear filter\n </span>\n </button>\n )}\n </div>\n </details>\n </div>\n </div>\n );\n};\n\n/**\n * High-performance Table component with sorting, pagination, search, and custom renderers\n */\nexport const Table = <T extends Record<string, any>>({\n data,\n columns,\n loading = false,\n searchable = false,\n searchPlaceholder = \"Search...\",\n filters = [],\n paginated = false,\n pageSizeOptions = [10, 25, 50, 100],\n defaultPageSize = 10,\n actions = [],\n onRowClick,\n selectable = false,\n selectedRows = [],\n onSelectionChange,\n getRowKey = (row, index) => index,\n emptyContent,\n hoverable = true,\n bordered = false,\n striped = false,\n className,\n rowClassName,\n}: TableProps<T>) => {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [sortState, setSortState] = useState<SortState>({\n column: null,\n direction: null,\n });\n const [pagination, setPagination] = useState<PaginationState>({\n page: 0,\n pageSize: defaultPageSize,\n });\n\n const tableRef = useRef<HTMLTableElement>(null);\n\n // Memoized filtered data\n const filteredData = useMemo(() => {\n let result = data;\n\n // Apply search filter\n if (searchable && searchTerm.trim()) {\n const searchableColumns = columns.filter(\n (col) => col.searchable !== false\n );\n const lowerSearchTerm = searchTerm.toLowerCase();\n\n result = result.filter((row) => {\n return searchableColumns.some((column) => {\n const value =\n typeof column.accessor === \"function\"\n ? column.accessor(row)\n : row[column.accessor];\n\n return String(value || \"\")\n .toLowerCase()\n .includes(lowerSearchTerm);\n });\n });\n }\n\n // Apply column filters\n filters.forEach((filter) => {\n if (filter.value && filter.value !== \"all\") {\n result = result.filter((row) => {\n const column = columns.find((col) => col.id === filter.id);\n if (!column) return true;\n\n const value =\n typeof column.accessor === \"function\"\n ? column.accessor(row)\n : row[column.accessor];\n\n return String(value || \"\") === filter.value;\n });\n }\n });\n\n return result;\n }, [data, searchTerm, columns, searchable, filters]);\n\n // Memoized sorted data\n const sortedData = useMemo(() => {\n if (!sortState.column || !sortState.direction) return filteredData;\n\n const column = columns.find((col) => col.id === sortState.column);\n if (!column) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n const aValue =\n typeof column.accessor === \"function\"\n ? column.accessor(a)\n : a[column.accessor];\n const bValue =\n typeof column.accessor === \"function\"\n ? column.accessor(b)\n : b[column.accessor];\n\n let comparison = 0;\n\n if (aValue < bValue) comparison = -1;\n else if (aValue > bValue) comparison = 1;\n\n return sortState.direction === \"desc\" ? -comparison : comparison;\n });\n }, [filteredData, sortState, columns]);\n\n // Memoized paginated data\n const paginatedData = useMemo(() => {\n if (!paginated) return sortedData;\n\n const startIndex = pagination.page * pagination.pageSize;\n const endIndex = startIndex + pagination.pageSize;\n return sortedData.slice(startIndex, endIndex);\n }, [sortedData, pagination, paginated]);\n\n // Handle sorting\n const handleSort = useCallback(\n (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column?.sortable) return;\n\n setSortState((prev) => {\n if (prev.column !== columnId) {\n return { column: columnId, direction: \"asc\" };\n }\n if (prev.direction === \"asc\") {\n return { column: columnId, direction: \"desc\" };\n }\n return { column: null, direction: null };\n });\n },\n [columns]\n );\n\n // Handle pagination\n const handlePageChange = useCallback((newPage: number) => {\n setPagination((prev) => ({ ...prev, page: newPage }));\n }, []);\n\n const handlePageSizeChange = useCallback((newPageSize: number) => {\n setPagination({ page: 0, pageSize: newPageSize });\n }, []);\n\n // Handle selection\n const handleRowSelection = useCallback(\n (row: T, checked: boolean) => {\n if (!onSelectionChange) return;\n\n const rowKey = getRowKey(row, 0);\n const currentKeys = selectedRows.map((r, i) => getRowKey(r, i));\n\n if (checked) {\n onSelectionChange([...selectedRows, row]);\n } else {\n onSelectionChange(\n selectedRows.filter(\n (_, i) => getRowKey(selectedRows[i], i) !== rowKey\n )\n );\n }\n },\n [selectedRows, onSelectionChange, getRowKey]\n );\n\n const handleSelectAll = useCallback(\n (checked: boolean) => {\n if (!onSelectionChange) return;\n onSelectionChange(checked ? [...paginatedData] : []);\n },\n [paginatedData, onSelectionChange]\n );\n\n // Reset pagination when data changes\n useEffect(() => {\n setPagination((prev) => ({ ...prev, page: 0 }));\n }, [searchTerm, sortState]);\n\n // Separate effect for filters to avoid infinite loops\n useEffect(() => {\n setPagination((prev) => ({ ...prev, page: 0 }));\n }, [filters.map((f) => f.value).join(\",\")]);\n\n // Calculate pagination info\n const totalItems = sortedData.length;\n const totalPages = Math.ceil(totalItems / pagination.pageSize);\n const startItem = pagination.page * pagination.pageSize + 1;\n const endItem = Math.min(startItem + pagination.pageSize - 1, totalItems);\n\n // Check if all visible rows are selected\n const allVisibleSelected =\n paginatedData.length > 0 &&\n paginatedData.every((row) => {\n const rowKey = getRowKey(row, 0);\n return selectedRows.some(\n (selectedRow, i) => getRowKey(selectedRow, i) === rowKey\n );\n });\n\n const someVisibleSelected = paginatedData.some((row) => {\n const rowKey = getRowKey(row, 0);\n return selectedRows.some(\n (selectedRow, i) => getRowKey(selectedRow, i) === rowKey\n );\n });\n\n const tableClasses = cn(\n \"w-full text-sm leading-5 text-text border-collapse\",\n className\n );\n\n const headerClasses = cn(\"bg-surface\");\n\n const cellClasses = cn(\n \"text-text p-3 border-b border-border\"\n );\n\n const rowClasses = cn(\"h-row-lg\", {\n \"hover:bg-surface-sunk\": hoverable,\n \"cursor-pointer\": onRowClick,\n });\n\n return (\n <div className=\"space-y-4\">\n {/* Search and Filters Bar */}\n {(searchable || filters.length > 0) && (\n <div className=\"pt-4 pb-2\">\n <div className=\"flex flex-wrap gap-4 items-start\">\n {filters.map((filter) => (\n <FilterDropdown key={filter.id} {...filter} />\n ))}\n\n <div className=\"w-full sm:w-auto sm:ml-auto min-w-menu\">\n {/* TODO: Add search bar here */}\n <TextField\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n startIcon={<SearchIcon />}\n className=\"max-w-sm\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Table Container */}\n <div className=\"relative w-full overflow-x-auto min-h-100\">\n {loading && (\n <div className=\"flex items-center justify-center z-10\">\n <ContentLoading\n showTableSkeleton\n tableRows={10}\n tableColumns={columns.length}\n />\n </div>\n )}\n\n <table ref={tableRef} className={cn(tableClasses, \"min-w-full\")}>\n <thead className={headerClasses}>\n <tr>\n {/* Selection Column */}\n {selectable && (\n <th className={cn(cellClasses, \"w-12\")}>\n <input\n type=\"checkbox\"\n checked={allVisibleSelected}\n ref={(el) => {\n if (el)\n el.indeterminate =\n someVisibleSelected && !allVisibleSelected;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"rounded border-border [&:not(:checked)]:bg-surface-input text-accent\"\n />\n </th>\n )}\n\n {/* Data Columns */}\n {!loading &&\n columns.map((column) => (\n <th\n key={column.id}\n className={cn(\n cellClasses,\n \"font-semibold text-xs text-text-muted uppercase tracking-label\",\n \"group\",\n {\n \"text-left\": column.align === \"left\" || !column.align,\n \"text-center\": column.align === \"center\",\n \"text-right\": column.align === \"right\",\n \"cursor-pointer select-none\": column.sortable,\n \"sticky left-0 bg-surface\":\n column.sticky === \"left\",\n \"sticky right-0 bg-surface\":\n column.sticky === \"right\",\n }\n )}\n style={{ width: column.width }}\n onClick={() => column.sortable && handleSort(column.id)}\n >\n <div className=\"flex items-center gap-2\">\n {column.headerCell ? column.headerCell() : column.header}\n {column.sortable && (\n <div\n className={cn(\n \"flex flex-col opacity-0 group-hover:opacity-100 transition-opacity\",\n sortState.column === column.id && \"opacity-100\"\n )}\n >\n <ChevronUpIcon\n active={\n sortState.column === column.id &&\n sortState.direction === \"asc\"\n }\n />\n <ChevronDownIcon\n active={\n sortState.column === column.id &&\n sortState.direction === \"desc\"\n }\n />\n </div>\n )}\n </div>\n </th>\n ))}\n\n {/* Actions Column */}\n {actions.length > 0 && (\n <th className={cn(cellClasses, \"w-20\")}>\n <span className=\"sr-only\">Actions</span>\n </th>\n )}\n </tr>\n </thead>\n\n <tbody>\n {paginatedData.length === 0 || loading\n ? !loading && (\n <tr>\n <td\n colSpan={\n columns.length +\n (selectable ? 1 : 0) +\n (actions.length > 0 ? 1 : 0)\n }\n className={cn(\n cellClasses,\n \"text-center py-8 text-text-muted\"\n )}\n >\n {emptyContent || \"No data available\"}\n </td>\n </tr>\n )\n : paginatedData.map((row, index) => {\n const rowKey = getRowKey(row, index);\n const isSelected = selectedRows.some(\n (selectedRow, i) => getRowKey(selectedRow, i) === rowKey\n );\n\n return (\n <tr\n key={rowKey}\n className={cn(\n rowClasses,\n { \"bg-accent-soft\": isSelected },\n rowClassName?.(row, index)\n )}\n onClick={(e) => {\n e.stopPropagation();\n onRowClick?.(row, index);\n }}\n >\n {/* Selection Cell */}\n {selectable && (\n <td className={cellClasses}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation();\n handleRowSelection(row, e.target.checked);\n }}\n className=\"rounded border-border [&:not(:checked)]:bg-surface-input text-accent\"\n />\n </td>\n )}\n\n {/* Data Cells */}\n {columns.map((column) => {\n const value =\n typeof column.accessor === \"function\"\n ? column.accessor(row)\n : row[column.accessor];\n\n return (\n <td\n key={column.id}\n className={cn(cellClasses, {\n \"text-left\":\n column.align === \"left\" || !column.align,\n \"text-center\": column.align === \"center\",\n \"text-right\": column.align === \"right\",\n \"sticky left-0 bg-surface\":\n column.sticky === \"left\",\n \"sticky right-0 bg-surface\":\n column.sticky === \"right\",\n })}\n >\n {column.cell\n ? column.cell(value, row, index)\n : String(value || \"\")}\n </td>\n );\n })}\n\n {/* Actions Cell */}\n {actions.length > 0 && (\n <td className={cellClasses}>\n <Dropdown\n trigger={\n <div className=\"inline-flex items-center gap-1 px-2 py-1 text-sm text-text-muted hover:text-text\">\n <span>Options</span>\n <ChevronDownSmallIcon />\n </div>\n }\n options={actions.map((action) => ({\n value: action.id,\n label: action.label,\n icon: action.icon,\n disabled: action.disabled?.(row),\n }))}\n onSelect={(actionId) => {\n const action = actions.find(\n (a) => a.id === actionId\n );\n if (action) {\n action.onClick(row, index);\n }\n }}\n placement=\"bottom-end\"\n />\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {paginated && totalItems > 0 && (\n <div className=\"flex items-center justify-between px-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-sm text-text-muted\">\n Showing {startItem} to {endItem} of {totalItems} results\n </span>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-muted\">\n Rows per page:\n </span>\n <select\n value={pagination.pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n className=\"h-control-sm w-16 rounded-md border border-border bg-surface-input px-2 text-sm text-text\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(0)}\n disabled={pagination.page === 0}\n iconOnly\n >\n <ChevronsLeftIcon />\n </Button>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(pagination.page - 1)}\n disabled={pagination.page === 0}\n iconOnly\n >\n <ChevronLeftIcon />\n </Button>\n\n <span className=\"px-3 py-1 text-sm text-text-muted\">\n Page {pagination.page + 1} of {totalPages}\n </span>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(pagination.page + 1)}\n disabled={pagination.page >= totalPages - 1}\n iconOnly\n >\n <ChevronRightIcon />\n </Button>\n\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => handlePageChange(totalPages - 1)}\n disabled={pagination.page >= totalPages - 1}\n iconOnly\n >\n <ChevronsRightIcon />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, { createContext, useContext, useState } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TabItem {\n /** Tab identifier */\n id: string;\n /** Tab label */\n label: string;\n /** Tab content */\n content?: React.ReactNode;\n /** Whether tab is disabled */\n disabled?: boolean;\n /** Badge/count to show next to label */\n badge?: string | number;\n}\n\nexport interface TabsProps {\n /** Tab items */\n items: TabItem[];\n /** Default active tab */\n defaultTab?: string;\n /** Active tab (controlled) */\n activeTab?: string;\n /** Tab change handler */\n onTabChange?: (tabId: string) => void;\n /** Tabs variant */\n variant?: 'default' | 'pills' | 'underline';\n /** Tabs size */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface TabBarProps {\n /** Tab items (simplified for bar style) */\n items: Array<{\n id: string;\n label: string;\n badge?: string | number;\n disabled?: boolean;\n }>;\n /** Active tab */\n activeTab?: string;\n /** Tab change handler */\n onTabChange?: (tabId: string) => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst TabsContext = createContext<{\n activeTab: string;\n setActiveTab: (tab: string) => void;\n} | null>(null);\n\n/**\n * TabBar component for simple tab navigation (like in the screenshot)\n */\nexport const TabBar: React.FC<TabBarProps> = ({\n items,\n activeTab,\n onTabChange,\n className,\n}) => {\n const [internalActiveTab, setInternalActiveTab] = useState(items[0]?.id || '');\n const currentActiveTab = activeTab || internalActiveTab;\n\n const handleTabClick = (tabId: string) => {\n if (onTabChange) {\n onTabChange(tabId);\n } else {\n setInternalActiveTab(tabId);\n }\n };\n\n return (\n <div className={cn('border-b border-border', className)}>\n <nav className=\"-mb-px flex space-x-8\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => !item.disabled && handleTabClick(item.id)}\n disabled={item.disabled}\n className={cn(\n 'border-b-2 py-2 px-1 text-sm font-medium transition-colors duration-fast',\n {\n 'border-accent-border text-text': currentActiveTab === item.id,\n 'border-transparent text-text-muted hover:text-text':\n currentActiveTab !== item.id && !item.disabled,\n 'border-transparent text-disabled cursor-not-allowed': item.disabled,\n }\n )}\n >\n <span className=\"flex items-center gap-2\">\n {item.label}\n {item.badge && (\n <span className={cn(\n 'inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium',\n currentActiveTab === item.id\n ? 'bg-accent-soft text-accent'\n : 'bg-surface-hover text-text-muted'\n )}>\n {item.badge}\n </span>\n )}\n </span>\n </button>\n ))}\n </nav>\n </div>\n );\n};\n\n/**\n * Full Tabs component with content panels\n */\nexport const Tabs: React.FC<TabsProps> = ({\n items,\n defaultTab,\n activeTab,\n onTabChange,\n variant = 'default',\n size = 'md',\n className,\n}) => {\n const [internalActiveTab, setInternalActiveTab] = useState(\n defaultTab || activeTab || items[0]?.id || ''\n );\n\n const currentActiveTab = activeTab || internalActiveTab;\n\n const handleTabChange = (tabId: string) => {\n if (onTabChange) {\n onTabChange(tabId);\n } else {\n setInternalActiveTab(tabId);\n }\n };\n\n const contextValue = {\n activeTab: currentActiveTab,\n setActiveTab: handleTabChange,\n };\n\n const activeTabItem = items.find(item => item.id === currentActiveTab);\n\n const tabListClasses = cn(\n 'flex',\n {\n 'border-b border-border px-2': variant === 'default' || variant === 'underline',\n 'bg-surface-hover p-1 rounded-lg': variant === 'pills',\n 'space-x-1': variant === 'pills',\n 'space-x-8': variant === 'default' || variant === 'underline',\n },\n className\n );\n\n const tabClasses = (item: TabItem, isActive: boolean) => {\n const baseClasses = 'transition-colors duration-fast font-medium';\n\n const sizeClasses = {\n 'text-xs px-2 py-1': size === 'sm',\n 'text-sm px-3 py-2': size === 'md',\n 'text-base px-4 py-3': size === 'lg',\n };\n\n const variantClasses = {\n // Default variant\n 'border-b-2 -mb-px': variant === 'default',\n // Pills variant\n 'rounded-md': variant === 'pills',\n // Underline variant\n 'border-b-2 pb-2': variant === 'underline',\n };\n\n const stateClasses = {\n 'opacity-50 cursor-not-allowed': item.disabled,\n 'cursor-pointer': !item.disabled,\n };\n\n // Active state classes\n const activeClasses = isActive ? {\n 'border-accent-border text-text': variant === 'default' || variant === 'underline',\n 'bg-surface text-text shadow-none': variant === 'pills',\n } : {};\n\n // Non-active, non-disabled state classes\n const inactiveClasses = !isActive && !item.disabled ? {\n 'border-transparent text-text-muted hover:text-text': variant === 'default',\n 'text-text-muted hover:text-text': variant === 'pills',\n 'border-transparent text-text-muted hover:text-text hover:border-border': variant === 'underline',\n } : {};\n\n return cn(baseClasses, sizeClasses, variantClasses, stateClasses, activeClasses, inactiveClasses);\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div>\n {/* Tab List */}\n <div className={tabListClasses} role=\"tablist\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={currentActiveTab === item.id}\n aria-controls={`tabpanel-${item.id}`}\n disabled={item.disabled}\n onClick={() => !item.disabled && handleTabChange(item.id)}\n className={tabClasses(item, currentActiveTab === item.id)}\n >\n <span className=\"flex items-center gap-2\">\n {item.label}\n {item.badge && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-surface-hover text-text-muted\">\n {item.badge}\n </span>\n )}\n </span>\n </button>\n ))}\n </div>\n\n {/* Tab Content */}\n {activeTabItem?.content && (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${currentActiveTab}`}\n aria-labelledby={`tab-${currentActiveTab}`}\n className=\"mt-4\"\n >\n {activeTabItem.content}\n </div>\n )}\n </div>\n </TabsContext.Provider>\n );\n};\n\n/**\n * Hook to access tab context\n */\nexport const useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component');\n }\n return context;\n}; ","import React, { useEffect, useRef } from 'react';\nimport { X } from \"lucide-react\";\nimport { Icon } from \"../content/Icon\";\nimport { cn } from '../utils/cn';\n\nexport interface ModalProps {\n /**\n * Whether the modal is open\n */\n open: boolean;\n \n /**\n * Callback fired when the modal should be closed\n */\n onClose: () => void;\n \n /**\n * The title of the modal\n */\n title?: string;\n \n /**\n * The size of the modal\n */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n \n /**\n * Whether clicking the backdrop should close the modal\n */\n closeOnBackdropClick?: boolean;\n \n /**\n * Whether pressing escape should close the modal\n */\n closeOnEscape?: boolean;\n \n /**\n * Additional class name for the modal content\n */\n className?: string;\n \n /**\n * Additional class name for the modal backdrop\n */\n backdropClassName?: string;\n \n /**\n * The content of the modal\n */\n children: React.ReactNode;\n \n /**\n * Footer content for the modal\n */\n footer?: React.ReactNode;\n \n /**\n * Whether to show the close button\n */\n showCloseButton?: boolean;\n}\n\nconst modalSizes = {\n sm: 'max-w-md',\n md: 'max-w-lg',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n full: 'max-w-full mx-4',\n};\n\n/**\n * Modal component with theme integration and accessibility features\n * \n * @example\n * ```tsx\n * <Modal\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Confirm Action\"\n * size=\"md\"\n * >\n * <p>Are you sure you want to delete this item?</p>\n * </Modal>\n * \n * <Modal\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Settings\"\n * size=\"lg\"\n * footer={\n * <div className=\"flex justify-end space-x-2\">\n * <Button variant=\"outline\" onClick={() => setIsOpen(false)}>\n * Cancel\n * </Button>\n * <Button onClick={handleSave}>\n * Save\n * </Button>\n * </div>\n * }\n * >\n * <SettingsForm />\n * </Modal>\n * ```\n */\nexport function Modal({\n open,\n onClose,\n title,\n size = 'md',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n className,\n backdropClassName,\n children,\n footer,\n showCloseButton = true,\n}: ModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Handle escape key\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [open, closeOnEscape, onClose]);\n\n // Handle focus management\n useEffect(() => {\n if (open) {\n // Store the currently focused element\n previousActiveElement.current = document.activeElement as HTMLElement;\n \n // Focus the modal\n if (modalRef.current) {\n modalRef.current.focus();\n }\n \n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n } else {\n // Restore focus to the previously focused element\n if (previousActiveElement.current) {\n previousActiveElement.current.focus();\n }\n \n // Restore body scroll\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // Handle backdrop click\n const handleBackdropClick = (event: React.MouseEvent) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n };\n\n if (!open) return null;\n\n return (\n <div\n className={cn(\n 'fixed inset-0 z-modal flex items-center justify-center p-4',\n 'bg-scrim',\n // 'animate-fade-in',\n backdropClassName\n )}\n onClick={handleBackdropClick}\n >\n <div\n ref={modalRef}\n className={cn(\n 'relative w-full bg-surface rounded-lg shadow-modal',\n // 'animate-scale-in',\n 'focus:outline-none',\n modalSizes[size],\n className\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n tabIndex={-1}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 pb-0\">\n {title && (\n <span\n id=\"modal-title\"\n className=\"text-lg font-semibold text-text\"\n >\n {title}\n </span>\n )}\n \n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-muted hover:text-text transition-colors\"\n aria-label=\"Close modal\"\n >\n <Icon icon={X} size=\"lg\" color=\"current\" />\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-6\">\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"px-6 py-4\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n} ","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TextProps {\n /** Text variant */\n variant?: 'body' | 'caption' | 'label' | 'code';\n /** Text size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Font weight */\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n /** Text color */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current' | 'muted';\n /** Text alignment */\n align?: 'left' | 'center' | 'right' | 'justify';\n /** Whether to truncate text with ellipsis */\n truncate?: boolean;\n /** Whether text should be italic */\n italic?: boolean;\n /** Whether text should be underlined */\n underline?: boolean;\n /** Line height */\n lineHeight?: 'tight' | 'normal' | 'relaxed';\n /** HTML element to render */\n as?: 'p' | 'span' | 'div' | 'code' | 'pre';\n /** Additional CSS classes */\n className?: string;\n /** Child content */\n children: React.ReactNode;\n}\n\n/**\n * Text — every copy string in the product goes through this component.\n *\n * Size maps onto the token type scale (tokens.css):\n * xs 11 · sm 12 · md 13 (body) · lg 14 (long-form) · xl 16\n * Anything above 16px is a Heading, not Text.\n */\nconst sizeMap: Record<NonNullable<TextProps['size']>, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n xl: 'text-lg',\n};\n\nconst weightMap: Record<NonNullable<TextProps['weight']>, string> = {\n light: 'font-normal',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n};\n\n/** Semantic colour tokens — these flip in dark mode, so no `dark:` variants. */\nconst colorMap: Record<NonNullable<TextProps['color']>, string> = {\n primary: 'text-text',\n secondary: 'text-text-muted',\n accent: 'text-accent',\n success: 'text-success-fg',\n warning: 'text-warning-fg',\n error: 'text-danger-fg',\n info: 'text-info-fg',\n neutral: 'text-text',\n current: 'text-current',\n muted: 'text-text-subtle',\n};\n\nconst alignMap: Record<NonNullable<TextProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n};\n\nconst lineHeightMap: Record<NonNullable<TextProps['lineHeight']>, string> = {\n tight: 'leading-tight',\n normal: 'leading-normal',\n relaxed: 'leading-relaxed',\n};\n\nexport const Text: React.FC<TextProps> = ({\n variant = 'body',\n size = 'md',\n weight = 'normal',\n color = 'current',\n align = 'left',\n truncate = false,\n italic = false,\n underline = false,\n lineHeight = 'normal',\n as,\n className,\n children,\n ...props\n}) => {\n const Tag = (as || getDefaultElement(variant)) as keyof React.JSX.IntrinsicElements;\n\n const isCaption = variant === 'caption';\n const isLabel = variant === 'label';\n const isCode = variant === 'code';\n\n const textClasses = cn(\n 'font-sans',\n\n // Variant — caption and label pin their own size/weight\n isCaption && 'text-xs text-text-subtle',\n isLabel && 'text-xs font-semibold uppercase tracking-label text-text-subtle',\n isCode && 'font-mono text-sm rounded-sm bg-surface-hover px-1 py-0.5',\n\n // Size — only where the variant does not pin it\n !isCaption && !isLabel && !isCode && sizeMap[size],\n\n // Weight — label owns its weight\n !isLabel && weightMap[weight],\n\n colorMap[color],\n alignMap[align],\n\n // Line height only overrides the body variant\n variant === 'body' && lineHeightMap[lineHeight],\n\n italic && 'italic',\n underline && 'underline',\n truncate && 'truncate',\n\n className\n );\n\n return (\n <Tag className={textClasses} {...props}>\n {children}\n </Tag>\n );\n};\n\nfunction getDefaultElement(variant: TextProps['variant']): string {\n const elementMap: Record<NonNullable<TextProps['variant']>, string> = {\n body: 'p',\n caption: 'span',\n label: 'span',\n code: 'code',\n };\n\n return elementMap[variant!] || 'p';\n}\n","import { FilePointer, VirtualMount } from '@opencxh/domain';\nimport { ArrowLeft, FileText, Folder, FolderPlus, HardDrive, Search, Upload, X } from 'lucide-react';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Button } from '../action/Button';\nimport { Icon } from '../content/Icon';\nimport { Table, TableColumn } from '../content/Table';\nimport { Tabs } from '../navigation/Tabs';\nimport { Modal } from '../overlays/Modal';\nimport { Text } from '../typography/Text';\nimport { cn } from '../utils/cn';\nimport { TextField } from './TextField';\n\nexport interface StorageInputProps {\n value?: string | FilePointer;\n onChange: (value: FilePointer | null, content?: Uint8Array) => void;\n label?: string;\n placeholder?: string;\n error?: string;\n disabled?: boolean;\n accept?: string;\n onListFiles?: (filters?: { name?: string; mimeType?: string; mountId?: string, path?: string }) => Promise<{ data: FilePointer[] }> | undefined;\n onListMounts?: () => Promise<{ data: VirtualMount[] }> | undefined;\n onUploadFile?: (payload: { file: Uint8Array; filename: string; mimeType: string; mountId?: string; path?: string }) => Promise<{ data: FilePointer }> | undefined;\n onDownloadFile?: (fileId: string) => Promise<Uint8Array> | undefined;\n onRegisterFile?: (payload: Omit<FilePointer, 'id'>) => Promise<{ data: FilePointer }> | undefined;\n}\n\nexport const StorageInput: React.FC<StorageInputProps> = ({\n value,\n onChange,\n label,\n placeholder = \"Select or upload a file\",\n error,\n disabled,\n accept,\n onListFiles,\n onListMounts,\n onUploadFile,\n onDownloadFile,\n onRegisterFile,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [mounts, setMounts] = useState<VirtualMount[]>([]);\n const [selectedMount, setSelectedMount] = useState<VirtualMount | null>(null);\n const [currentPath, setCurrentPath] = useState<string>(\"/\");\n const [remoteFiles, setRemoteFiles] = useState<FilePointer[]>([]);\n const [loading, setLoading] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [selectedPointer, setSelectedPointer] = useState<FilePointer | null>(\n typeof value === 'object' ? value : null\n );\n const [isCreatingFolder, setIsCreatingFolder] = useState(false);\n const [newFolderName, setNewFolderName] = useState(\"\");\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Load mounts when modal opens\n useEffect(() => {\n if (isModalOpen) {\n loadMounts();\n }\n }, [isModalOpen]);\n\n // Load files when a mount is selected or search term changes\n useEffect(() => {\n if (isModalOpen && selectedMount) {\n loadFiles();\n }\n }, [isModalOpen, selectedMount, currentPath, searchTerm]);\n\n const loadMounts = async () => {\n setLoading(true);\n try {\n const resp = await onListMounts?.();\n if (resp?.data) {\n setMounts(resp.data);\n }\n } catch (err) {\n console.error(\"Failed to load mounts\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const loadFiles = async () => {\n if (!selectedMount) return;\n setLoading(true);\n try {\n const resp = await onListFiles?.({ mountId: selectedMount.id, name: searchTerm, path: currentPath });\n if (resp?.data) {\n setRemoteFiles(resp.data);\n }\n } catch (err) {\n console.error(\"Failed to load files\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleLocalOnlySelection = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n setLoading(true);\n try {\n const buffer = await file.arrayBuffer();\n const content = new Uint8Array(buffer);\n\n const virtualPointer: FilePointer = {\n id: `local-${Date.now()}`,\n name: file.name,\n type: 'file',\n path: '/',\n mimeType: file.type || 'application/octet-stream',\n size: file.size,\n mountId: 'local',\n providerKey: file.name,\n ownerId: 'me',\n };\n\n setSelectedPointer(virtualPointer);\n onChange(virtualPointer, content);\n setIsModalOpen(false);\n } catch (err) {\n console.error(\"Local file selection failed\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleUploadToStorage = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !selectedMount) return;\n\n setLoading(true);\n try {\n const buffer = await file.arrayBuffer();\n const resp = await onUploadFile?.({\n file: new Uint8Array(buffer),\n filename: file.name,\n mimeType: file.type || 'application/octet-stream',\n mountId: selectedMount.id,\n path: currentPath,\n });\n\n if (resp?.data) {\n const pointer = resp.data;\n setSelectedPointer(pointer);\n onChange(pointer, new Uint8Array(buffer));\n setIsModalOpen(false);\n }\n } catch (err) {\n console.error(\"Upload failed\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCreateFolder = async () => {\n if (!newFolderName || !selectedMount) return;\n\n setLoading(true);\n try {\n const fullPath = `${currentPath}${newFolderName}/`;\n\n if (onRegisterFile) {\n await onRegisterFile({\n name: newFolderName,\n type: 'folder',\n path: currentPath,\n mimeType: 'application/x-directory',\n size: 0,\n mountId: selectedMount.id,\n providerKey: fullPath,\n ownerId: 'me',\n });\n await loadFiles();\n }\n\n setIsCreatingFolder(false);\n setNewFolderName(\"\");\n } catch (err) {\n console.error(\"Failed to create folder\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSelectRemote = async (pointer: FilePointer) => {\n setLoading(true);\n try {\n const content = await onDownloadFile?.(pointer.id);\n setSelectedPointer(pointer);\n onChange(pointer, content);\n setIsModalOpen(false);\n } catch (err) {\n console.error(\"Failed to download file\", err);\n } finally {\n setLoading(false);\n }\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setSelectedPointer(null);\n onChange(null);\n };\n\n // Folder & File calculation logic\n const explorerItems = useMemo(() => {\n const folders = new Set<string>();\n const files: FilePointer[] = [];\n\n remoteFiles.forEach(file => {\n if (file.type === 'folder') {\n if (file.path === currentPath) {\n folders.add(file.name);\n }\n return;\n }\n\n const path = file.providerKey || file.name;\n const relativePath = currentPath ? path.substring(currentPath.length) : path;\n const parts = relativePath.split('/').filter(p => p !== \"\");\n\n if (parts.length > 1) {\n folders.add(parts[0]);\n } else if (parts.length === 1) {\n files.push(file);\n }\n });\n\n return {\n folders: Array.from(folders).sort(),\n files: files.sort((a, b) => a.name.localeCompare(b.name))\n };\n }, [remoteFiles, currentPath]);\n\n const handleFolderClick = (folderName: string) => {\n setCurrentPath(prev => `${prev}${folderName}/`);\n };\n\n const handleGoBack = () => {\n const parts = currentPath.split('/').filter(p => p !== \"\");\n parts.pop();\n if (parts.length === 0) {\n setCurrentPath(\"/\");\n } else {\n setCurrentPath(`${parts.join('/')}/`);\n }\n };\n\n const tableData = useMemo(() => {\n const data: any[] = explorerItems.folders.map(f => ({\n id: `folder-${f}`,\n name: f,\n type: 'folder'\n }));\n\n explorerItems.files.forEach(f => {\n data.push({\n ...f,\n type: 'file'\n });\n });\n\n return data;\n }, [explorerItems]);\n\n const explorerColumns: TableColumn<any>[] = [\n {\n id: 'name',\n header: 'Name',\n accessor: 'name',\n cell: (val, row) => (\n <div className=\"flex items-center gap-2\">\n <Icon\n icon={row.type === 'folder' ? Folder : FileText}\n size=\"sm\"\n color={row.type === 'folder' ? \"warning\" : \"secondary\"}\n />\n <span className={cn(row.type === 'folder' && \"font-medium\")}>{val}</span>\n </div>\n )\n },\n {\n id: 'type',\n header: 'Type',\n accessor: (row) => row.type === 'folder' ? 'Folder' : row.mimeType,\n },\n {\n id: 'size',\n header: 'Size',\n accessor: (row) => row.type === 'file' ? `${(row.size / 1024).toFixed(1)} KB` : '-',\n },\n {\n id: 'actions',\n header: '',\n accessor: 'id',\n align: 'right',\n cell: (_, row) => (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={(e) => {\n e.stopPropagation();\n row.type === 'folder' ? handleFolderClick(row.name) : handleSelectRemote(row);\n }}\n loading={loading && row.type === 'file' && selectedPointer?.id === row.id}\n >\n {row.type === 'folder' ? 'Open' : 'Select'}\n </Button>\n )\n }\n ];\n\n const mountColumns: TableColumn<VirtualMount>[] = [\n {\n id: 'name',\n header: 'Mount Name',\n accessor: 'name',\n cell: (val) => (\n <div className=\"flex items-center gap-2 font-medium\">\n <Icon icon={HardDrive} size=\"sm\" color=\"primary\" />\n <span>{val}</span>\n </div>\n )\n },\n {\n id: 'actions',\n header: '',\n accessor: 'id',\n align: 'right',\n cell: (_, row) => (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSelectedMount(row)}>\n Open\n </Button>\n )\n }\n ];\n\n return (\n <div className=\"space-y-1\">\n {label && (\n <Text variant=\"label\" size=\"sm\" weight=\"medium\">\n {label}\n </Text>\n )}\n\n <div\n onClick={() => !disabled && setIsModalOpen(true)}\n className={cn(\n \"flex items-center gap-3 px-3 py-2 border rounded-lg cursor-pointer transition-colors\",\n \"hover:border-border-strong bg-surface\",\n error ? \"border-danger-border\" : \"border-border\",\n disabled && \"opacity-50 cursor-not-allowed bg-surface-sunk\"\n )}\n >\n <div className=\"flex-shrink-0\">\n <Icon icon={selectedPointer ? FileText : HardDrive} color={selectedPointer ? \"primary\" : \"secondary\"} />\n </div>\n\n <div className=\"flex-grow truncate\">\n {selectedPointer ? (\n <span className=\"text-sm text-text font-medium\">{selectedPointer.name}</span>\n ) : (\n <span className=\"text-sm text-text-muted\">{placeholder}</span>\n )}\n </div>\n\n {selectedPointer && !disabled && (\n <button\n onClick={handleClear}\n className=\"p-1 hover:bg-surface-hover rounded\"\n >\n <Icon icon={X} size=\"xs\" />\n </button>\n )}\n </div>\n\n {error && (\n <Text variant=\"body\" size=\"xs\" className=\"text-danger-fg\">\n {error}\n </Text>\n )}\n\n <Modal\n open={isModalOpen}\n onClose={() => {\n setIsModalOpen(false);\n setSelectedMount(null);\n setCurrentPath(\"/\");\n setIsCreatingFolder(false);\n }}\n title={selectedMount ? `Explorer: ${selectedMount.name}` : \"Select Storage Mount\"}\n size=\"lg\"\n >\n <Tabs\n variant=\"pills\"\n items={[\n {\n id: 'remote',\n label: 'Platform Storage',\n content: (\n <div className=\"space-y-4\">\n {selectedMount ? (\n <>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n if (currentPath && currentPath !== \"/\") {\n handleGoBack();\n } else {\n setSelectedMount(null);\n }\n }}\n leftIcon={<Icon icon={ArrowLeft} size=\"xs\" />}\n >\n {currentPath ? \"Back\" : \"Back to Mounts\"}\n </Button>\n\n <div className=\"flex items-center gap-1 text-xs text-text-muted overflow-hidden bg-surface-hover px-2 py-1 rounded\">\n <span className=\"truncate\">{currentPath}</span>\n </div>\n\n <div className=\"flex-grow min-w-40\">\n <TextField\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n startIcon={<Search size={14} />}\n fullWidth\n size=\"sm\"\n />\n </div>\n\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsCreatingFolder(true)}\n leftIcon={<Icon icon={FolderPlus} size=\"xs\" />}\n >\n New Folder\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => fileInputRef.current?.click()}\n leftIcon={<Icon icon={Upload} size=\"xs\" />}\n loading={loading}\n >\n Upload\n </Button>\n <input\n type=\"file\"\n className=\"hidden\"\n ref={fileInputRef}\n onChange={handleUploadToStorage}\n accept={accept}\n />\n </div>\n </div>\n\n {isCreatingFolder && (\n <div className=\"flex items-center gap-2 p-3 bg-surface-sunk rounded-lg border border-border\">\n <Icon icon={Folder} size=\"sm\" color=\"warning\" />\n <TextField\n size=\"sm\"\n placeholder=\"Folder name\"\n value={newFolderName}\n onChange={(e) => setNewFolderName(e.target.value)}\n autoFocus\n />\n <Button size=\"sm\" onClick={handleCreateFolder} loading={loading}>Create</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setIsCreatingFolder(false)}>Cancel</Button>\n </div>\n )}\n\n <div className=\"max-h-100 overflow-auto rounded-lg border border-border\">\n <Table\n data={tableData}\n columns={explorerColumns}\n loading={loading}\n emptyContent=\"This folder is empty\"\n onRowClick={(row) => row.type === 'folder' ? handleFolderClick(row.name) : handleSelectRemote(row)}\n />\n </div>\n </>\n ) : (\n <div className=\"max-h-100 overflow-auto rounded-lg border border-border\">\n <Table\n data={mounts}\n columns={mountColumns}\n loading={loading}\n emptyContent=\"No storage mounts configured\"\n onRowClick={(row) => setSelectedMount(row)}\n />\n </div>\n )}\n </div>\n )\n },\n {\n id: 'local',\n label: 'Local File',\n content: (\n <div className=\"space-y-6\">\n <div className=\"flex flex-col items-center justify-center py-12 border-2 border-dashed border-border rounded-xl bg-surface-sunk/50\">\n <div className=\"p-4 bg-accent-soft rounded-full mb-4\">\n <Icon icon={FileText} size=\"xl\" color=\"primary\" />\n </div>\n <Text variant=\"label\" size=\"lg\" weight=\"semibold\">\n Select a file from your computer\n </Text>\n <Text variant=\"body\" size=\"sm\" className=\"text-text-muted mt-1 mb-6 text-center max-w-xs\">\n This file will be used directly in the form and will <strong>not</strong> be uploaded to platform storage.\n </Text>\n\n <label className=\"cursor-pointer\">\n <Button variant=\"primary\" size=\"lg\" loading={loading} className=\"pointer-events-none\">\n Browse Local File\n </Button>\n <input\n type=\"file\"\n className=\"hidden\"\n onChange={handleLocalOnlySelection}\n accept={accept}\n disabled={loading}\n />\n </label>\n </div>\n </div>\n )\n }\n ]}\n />\n </Modal>\n </div>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\nimport { fieldLabelClasses } from './TextField';\n\nexport interface TextAreaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /**\n * The label for the textarea field\n */\n label?: string;\n\n /**\n * Helper text to display below the textarea\n */\n helperText?: string;\n\n /**\n * Error message to display when the textarea is invalid\n */\n error?: string;\n\n /**\n * The size of the textarea field\n */\n size?: 'sm' | 'md' | 'lg' | 'full';\n\n /**\n * Whether the textarea should take the full width of its container\n */\n fullWidth?: boolean;\n\n /**\n * Whether the textarea is in a loading state\n */\n loading?: boolean;\n\n /**\n * Additional class name for the container\n */\n containerClassName?: string;\n\n /**\n * Additional class name for the label\n */\n labelClassName?: string;\n}\n\nconst textareaSizes = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2 text-base',\n lg: 'px-3 py-2 text-md',\n full: 'px-3 py-2 text-md',\n};\n\n/**\n * TextArea component with theme integration and validation states\n */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n helperText,\n error,\n size = 'md',\n fullWidth = false,\n loading = false,\n containerClassName,\n labelClassName,\n className,\n id,\n rows = 4,\n ...props\n },\n ref\n ) => {\n const reactId = React.useId();\n const textareaId = id || `textarea-${reactId}`;\n const hasError = Boolean(error);\n const describedBy = error || helperText ? `${textareaId}-description` : undefined;\n\n return (\n <div className={cn('flex flex-col', fullWidth && 'w-full', containerClassName)}>\n {label && (\n <label\n htmlFor={textareaId}\n className={cn(\n fieldLabelClasses,\n hasError ? 'text-danger-fg' : 'text-text-subtle',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn(\n 'block w-full resize-y rounded-md border bg-surface-input text-text',\n 'transition-colors duration-fast ease-out',\n 'placeholder:text-text-subtle',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:bg-surface-hover disabled:text-text-disabled',\n\n textareaSizes[size],\n\n hasError\n ? 'border-danger-border bg-danger-soft'\n : 'border-border hover:border-border-strong',\n\n className\n )}\n {...props}\n />\n\n {loading && (\n <span\n aria-hidden\n className=\"absolute top-2 right-3 size-icon-md animate-spin rounded-full border-2 border-border border-t-transparent\"\n />\n )}\n </div>\n\n {(error || helperText) && (\n <p\n id={describedBy}\n className={cn('mt-1 text-xs', hasError ? 'text-danger-fg' : 'text-text-subtle')}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n","import { FilePointer, InternalSDK, VirtualMount } from \"@opencxh/domain\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../action/Button\";\nimport { Checkbox } from \"../input/Checkbox\";\nimport { DatePicker } from \"../input/DatePicker\";\nimport { FolderSelect, type FolderDestination } from \"../input/FolderSelect\";\nimport { Select } from \"../input/Select\";\nimport { StorageInput } from \"../input/StorageInput\";\nimport { TextArea } from \"../input/TextArea\";\nimport { TextField } from \"../input/TextField\";\nimport { cn } from \"../utils/cn\";\n\nexport type FormFieldType =\n | \"text\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"radio\"\n | \"date\"\n | \"file\"\n | \"folder\"\n | \"custom\"\n | \"array\";\n\ntype NestedKeys<T> = {\n [K in keyof T]: T[K] extends object\n ? `${K & string}.${NestedKeys<T[K]>}`\n : K & string;\n}[keyof T];\n\nfunction getValueByPath<T>(obj: T, path: string): unknown {\n return path\n .split(\".\")\n .reduce(\n (acc, key) =>\n acc && typeof acc === \"object\" && key in acc\n ? (acc as any)[key]\n : undefined,\n obj\n );\n}\n\nfunction setValueByPath<T extends object>(obj: T, path: string, value: any): T {\n const keys = path.split(\".\");\n const clone: any = Array.isArray(obj)\n ? [...(obj as any)]\n : { ...(obj as any) };\n let cur: any = clone;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n const prev = cur[k];\n cur[k] =\n prev && typeof prev === \"object\"\n ? Array.isArray(prev)\n ? [...prev]\n : { ...prev }\n : {};\n cur = cur[k];\n }\n cur[keys[keys.length - 1]] = value;\n return clone;\n}\n\nfunction unsetByPath<T extends object>(obj: T, path: string): T {\n const keys = path.split(\".\");\n const clone: any = Array.isArray(obj)\n ? [...(obj as any)]\n : { ...(obj as any) };\n let cur: any = clone;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (!cur[k] || typeof cur[k] !== \"object\") return clone; // niets te doen\n cur[k] = Array.isArray(cur[k]) ? [...cur[k]] : { ...cur[k] };\n cur = cur[k];\n }\n delete cur[keys[keys.length - 1]];\n return clone;\n}\n\nexport interface FormGroupItem<T = any> {\n /** Field name (key in form data) */\n name: NestedKeys<T>;\n /** Field label */\n label: string;\n /** Field type */\n type: FormFieldType;\n /** Text input type (when type is 'text') */\n textType?: \"text\" | \"email\" | \"password\" | \"number\" | \"tel\" | \"url\";\n /** Field width (CSS width value or grid columns) */\n width?: string | number;\n /** Placeholder text */\n placeholder?: string;\n /** Autocomplete attribute */\n autocomplete?: string;\n /** Options for select/radio/checkbox types */\n options?: Array<{\n value: string | number;\n label: string;\n disabled?: boolean;\n }>;\n /** Validation function */\n validator?: (value: any, formData: T) => string | null;\n /** Conditional function to show/hide field */\n conditional?: (formData: T) => boolean;\n /** Whether field can be empty */\n allowEmpty?: boolean;\n /** Remove field from form data when empty */\n removeIfEmpty?: boolean;\n /** Whether field is hidden */\n hidden?: boolean;\n /** Whether field is required */\n required?: boolean;\n /** Whether field is disabled */\n disabled?: boolean;\n /** Custom component renderer */\n customComponent?: (props: {\n value: any;\n onChange: (value: any) => void;\n error?: string;\n disabled?: boolean;\n }) => React.ReactNode;\n /** Additional props to pass to the field component */\n fieldProps?: Record<string, any>;\n\n /** For 'array' type, defines the fields for each item in the array */\n arrayFields?: FormGroupItem<any>[];\n\n /** For 'select' type, whether the select should be searchable */\n searchable?: boolean;\n\n /** For 'select' type, whether the select should be multiple */\n multiple?: boolean;\n\n allowCreate?: boolean;\n\n // todo: add support for array of objects\n}\n\nexport interface FormGroup<T = any> {\n /** Group identifier */\n id: string;\n /** Group title */\n title: string;\n /** Group description */\n description?: string;\n /** Group items */\n items: FormGroupItem<T>[];\n /** Conditional function to show/hide group */\n conditional?: (formData: T) => boolean;\n /** Group layout */\n layout?: \"grid\" | \"flex\";\n /** Number of columns for grid layout */\n columns?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface FormButtonProps {\n /** Button label */\n label: string;\n /** Button variant */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\";\n /** Button size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether button is disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface FormProps<T = Record<string, any>> {\n /** Form groups */\n groups: FormGroup<T>[];\n /** Initial form data */\n data?: Partial<T>;\n /** Form submit handler */\n onSubmit?: (data: T, transformedData?: any) => void | Promise<void>;\n /** Form cancel handler */\n onCancel?: () => void;\n /** Form change handler */\n onChange?: (data: Partial<T>, changedField?: keyof T) => void;\n /** Data transformation function (called before submit) */\n transform?: (data: T) => any;\n /** Form validation function */\n validate?: (data: T) => Record<keyof T, string> | null;\n /** Submit button props */\n submitButton?: FormButtonProps;\n /** Cancel button props */\n cancelButton?: FormButtonProps;\n /** Whether to show buttons */\n showButtons?: boolean;\n /** Form layout */\n layout?: \"vertical\" | \"horizontal\";\n /** Form size */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** Whether form is loading */\n loading?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Form ref */\n ref?: React.RefObject<HTMLFormElement>;\n /** SDK instance */\n sdk?: InternalSDK<any>;\n}\n\n/**\n * Generic Form component with groups, validation, and conditional rendering\n */\nexport const Form = <T extends Record<string, any>>({\n groups,\n data: externalData,\n onSubmit,\n onCancel,\n onChange,\n transform,\n validate,\n submitButton = { label: \"Submit\", variant: \"primary\" },\n cancelButton = { label: \"Cancel\", variant: \"outline\" },\n showButtons = true,\n layout = \"vertical\",\n size = \"md\",\n loading = false,\n className,\n ref,\n sdk,\n}: FormProps<T>) => {\n const [formData, setFormData] = useState<Partial<T>>(externalData || {});\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n // Update internal data when external data changes\n useEffect(() => {\n if (externalData) {\n setFormData({ ...externalData });\n }\n }, [externalData]);\n\n // Validate a single field\n const validateField = useCallback(\n (name: keyof T, value: any, currentData: Partial<T>) => {\n const field = groups\n .flatMap((group) => group.items)\n .find((item) => item.name === name);\n\n if (!field) return null;\n\n // Required validation\n if (\n field.required &&\n (value === undefined || value === null || value === \"\")\n ) {\n return `${field.label} is required`;\n }\n\n if (field.type === \"array\") {\n if (field.required && (!value || value.length === 0)) {\n return `${field.label} cannot be empty.`;\n }\n if (value && !Array.isArray(value)) {\n return `${field.label} must be an array.`;\n }\n\n if (Array.isArray(value) && field.arrayFields) {\n const arrayErrors: Record<string, any>[] = [];\n let hasErrors = false;\n value.forEach((row, index) => {\n const rowErrors: Record<string, string> = {};\n for (const subField of field.arrayFields!) {\n const subFieldValue = row?.[subField.name];\n if (\n subField.required &&\n (subFieldValue === undefined ||\n subFieldValue === null ||\n subFieldValue === \"\")\n ) {\n rowErrors[\n subField.name as string\n ] = `${subField.label} is required`;\n hasErrors = true;\n } else if (subField.validator) {\n const error = subField.validator(subFieldValue, row);\n if (error) {\n rowErrors[subField.name as string] = error;\n hasErrors = true;\n }\n }\n }\n arrayErrors[index] = rowErrors;\n });\n\n if (hasErrors) {\n return JSON.stringify(arrayErrors);\n }\n }\n }\n\n // Custom validation\n if (field.validator) {\n return field.validator(value, currentData as T);\n }\n\n return null;\n },\n [groups]\n );\n\n // Handle field change\n const handleFieldChange = useCallback(\n (name: keyof T, value: any) => {\n let newData = setValueByPath(\n formData as object,\n name as string,\n value\n ) as Partial<T>;\n\n // Handle removeIfEmpty\n const field = groups.flatMap((g) => g.items).find((i) => i.name === name);\n if (\n field?.removeIfEmpty &&\n (value === undefined || value === null || value === \"\")\n ) {\n newData = unsetByPath(newData as object, name as string) as Partial<T>;\n }\n\n setFormData(newData);\n setTouched((prev) => ({ ...prev, [name]: true }));\n\n // Validate field\n const error = validateField(name, value, newData);\n setErrors((prev) => ({\n ...prev,\n [name]: error || \"\",\n }));\n\n // Call onChange callback\n onChange?.(newData, name);\n },\n [formData, groups, validateField, onChange]\n );\n\n // Handle form submission\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (loading) return;\n\n // Validate all fields\n const newErrors: Record<string, string> = {};\n const allFields = groups.flatMap((group) => group.items);\n\n for (const field of allFields) {\n // Skip hidden or conditional fields\n if (\n field.hidden ||\n (field.conditional && !field.conditional(formData as T))\n ) {\n continue;\n }\n\n const error = validateField(\n field.name,\n getValueByPath<Partial<T>>(formData, field.name),\n formData\n );\n if (error) {\n newErrors[field.name as string] = error;\n }\n }\n\n // Run form-level validation\n if (validate) {\n const formErrors = validate(formData as T);\n if (formErrors) {\n Object.assign(newErrors, formErrors);\n }\n }\n\n setErrors(newErrors);\n\n // If there are errors, don't submit\n if (Object.keys(newErrors).some((key) => newErrors[key])) {\n return;\n }\n\n // Transform data if needed\n const finalData = transform ? transform(formData as T) : formData;\n\n // Submit form\n await onSubmit?.(formData as T, finalData);\n },\n [formData, groups, validateField, validate, transform, onSubmit, loading]\n );\n\n // Render field based on type\n const renderField = useCallback(\n (item: FormGroupItem<T>) => {\n const value = getValueByPath<Partial<T>>(formData, item.name) as\n | string\n | undefined;\n const error = touched[item.name as string]\n ? errors[item.name as string]\n : undefined;\n const isDisabled = item.disabled || loading;\n\n const commonProps = {\n value: value || \"\",\n disabled: isDisabled,\n required: item.required,\n placeholder: item.placeholder,\n ...item.fieldProps,\n };\n\n switch (item.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"number\":\n case \"tel\":\n case \"url\":\n return (\n <TextField\n {...commonProps}\n onChange={(e) => handleFieldChange(item.name, e.target.value)}\n type={item.textType || item.type}\n autoComplete={item.autocomplete}\n error={error}\n size={size}\n />\n );\n\n case \"textarea\":\n return (\n <TextArea\n {...commonProps}\n onChange={(e) => handleFieldChange(item.name, e.target.value)}\n rows={4}\n error={error}\n size={size}\n />\n );\n\n case \"select\":\n return (\n <Select\n {...commonProps}\n onChange={(e) => handleFieldChange(item.name, e)}\n options={(item.options || []).map((option) => ({\n ...option,\n value: String(option.value),\n }))}\n searchable={item.searchable}\n multiple={item.multiple}\n allowCreate={item.allowCreate}\n error={error}\n size={size}\n />\n );\n\n case \"checkbox\":\n return (\n <Checkbox\n {...commonProps}\n checked={Boolean(value)}\n onChange={(e) => handleFieldChange(item.name, e.target.checked)}\n size={size}\n />\n );\n\n case \"radio\":\n return (\n <div className=\"flex flex-col gap-2\">\n {item.options?.map((option) => (\n <label\n key={option.value}\n className=\"flex cursor-pointer items-center gap-2 text-base text-text\"\n >\n <input\n type=\"radio\"\n name={item.name as string}\n value={option.value}\n checked={value === option.value}\n onChange={() => handleFieldChange(item.name, option.value)}\n disabled={isDisabled || option.disabled}\n className=\"size-checkbox shrink-0 border border-border-strong bg-surface-input accent-accent focus-visible:outline-none focus-visible:focus-ring\"\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n\n case \"date\":\n return (\n <DatePicker\n {...commonProps}\n value={value ? new Date(value) : null}\n onChange={(date) => handleFieldChange(item.name, date)}\n size={size}\n />\n );\n\n case \"file\":\n return (\n <StorageInput\n {...commonProps}\n value={value}\n onChange={(pointer) => handleFieldChange(item.name, pointer)}\n error={error}\n onListFiles={(filters) => sdk?.http.invoke<{ data: FilePointer[] }>({\n method: \"POST\",\n action: \"storage.file.list\",\n body: filters,\n })}\n onListMounts={() => sdk?.http.invoke<{ data: VirtualMount[] }>({\n method: \"GET\",\n action: \"storage.mount\",\n })}\n onUploadFile={(payload) => sdk?.http.invoke<{ data: FilePointer }>({\n method: \"POST\",\n action: \"storage.file.upload\",\n body: payload,\n })}\n onDownloadFile={(fileId) => sdk?.http.invoke<Uint8Array>({\n method: \"GET\",\n action: `storage.file.${fileId}.download`,\n })}\n onRegisterFile={(payload) => sdk?.http.invoke<{ data: FilePointer }>({\n method: \"POST\",\n action: \"storage.file.folder\",\n body: payload,\n })}\n />\n );\n\n case \"folder\":\n return (\n <FolderSelect\n value={(value as unknown as FolderDestination) || {}}\n onChange={(v) => handleFieldChange(item.name, v)}\n onListFolders={() => sdk?.http.invoke<{ data: VirtualMount[] }>({\n method: \"GET\",\n action: \"storage.mount\",\n })}\n disabled={isDisabled}\n size={size}\n placeholder={item.placeholder}\n />\n );\n\n case \"custom\":\n return item.customComponent?.({\n value,\n onChange: (newValue) => handleFieldChange(item.name, newValue),\n error,\n disabled: isDisabled,\n });\n\n case \"array\": {\n const arrayValue = (value || []) as any[];\n let arrayErrors: Record<string, string>[] = [];\n if (typeof error === \"string\" && error.startsWith(\"[\")) {\n try {\n arrayErrors = JSON.parse(error);\n } catch (e) {\n // ignore parse error\n }\n }\n\n const handleAddItem = () => {\n handleFieldChange(item.name, [...arrayValue, {}]);\n };\n\n const handleRemoveItem = (index: number) => {\n handleFieldChange(\n item.name,\n arrayValue.filter((_, i) => i !== index)\n );\n };\n\n const handleSubFieldChange = (\n index: number,\n fieldName: string,\n fieldValue: any\n ) => {\n const newArray = [...arrayValue];\n newArray[index] = {\n ...newArray[index],\n [fieldName]: fieldValue,\n };\n handleFieldChange(item.name, newArray);\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arrayValue.map((row, index) => (\n <div key={index} className=\"flex items-start gap-2\">\n <div className=\"grid flex-1 gap-2 sm:grid-cols-2\">\n {item.arrayFields?.map((subField) => {\n const subFieldError =\n arrayErrors?.[index]?.[subField.name as string];\n return (\n <div\n key={subField.name as string}\n className=\"flex flex-col gap-1\"\n >\n {index === 0 && (\n <label className=\"block text-xs font-semibold uppercase tracking-label text-text-subtle\">\n {subField.label}\n {subField.required && (\n <span className=\"ml-1 text-danger-fg\">*</span>\n )}\n </label>\n )}\n {/* Note: Duplicating field rendering logic here. Could be refactored. */}\n {(() => {\n const commonSubFieldProps = {\n value: row?.[subField.name] || \"\",\n disabled: isDisabled,\n required: subField.required,\n placeholder: subField.placeholder,\n ...subField.fieldProps,\n };\n switch (subField.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"number\":\n case \"tel\":\n case \"url\":\n return (\n <TextField\n {...commonSubFieldProps}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e.target.value\n )\n }\n type={subField.textType || subField.type}\n autoComplete={subField.autocomplete}\n error={subFieldError}\n size={size}\n />\n );\n case \"textarea\":\n return (\n <TextArea\n {...commonSubFieldProps}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e.target.value\n )\n }\n rows={4}\n error={subFieldError}\n size={size}\n />\n );\n case \"select\":\n return (\n <Select\n {...commonSubFieldProps}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e\n )\n }\n options={(subField.options || []).map(\n (option) => ({\n ...option,\n value: String(option.value),\n })\n )}\n searchable={subField.searchable}\n multiple={subField.multiple}\n allowCreate={subField.allowCreate}\n error={subFieldError}\n size={size}\n />\n );\n case \"checkbox\":\n return (\n <Checkbox\n {...commonSubFieldProps}\n checked={Boolean(row?.[subField.name])}\n onChange={(e) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n e.target.checked\n )\n }\n size={size}\n />\n );\n case \"radio\":\n return (\n <div className=\"flex flex-col gap-2\">\n {subField.options?.map((option) => (\n <label\n key={option.value}\n className=\"flex cursor-pointer items-center gap-2 text-base text-text\"\n >\n <input\n type=\"radio\"\n name={`${item.name as string\n }.${index}.${subField.name as string\n }`}\n value={option.value}\n checked={\n row?.[subField.name] ===\n option.value\n }\n onChange={() =>\n handleSubFieldChange(\n index,\n subField.name as string,\n option.value\n )\n }\n disabled={\n isDisabled || option.disabled\n }\n className=\"size-checkbox shrink-0 border border-border-strong bg-surface-input accent-accent focus-visible:outline-none focus-visible:focus-ring\"\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n case \"date\": {\n const dateValue = row?.[subField.name];\n return (\n <DatePicker\n {...commonSubFieldProps}\n value={\n dateValue ? new Date(dateValue) : null\n }\n onChange={(date) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n date\n )\n }\n size={size}\n />\n );\n }\n case \"custom\":\n return subField.customComponent?.({\n value: row?.[subField.name],\n onChange: (newValue) =>\n handleSubFieldChange(\n index,\n subField.name as string,\n newValue\n ),\n error: subFieldError,\n disabled: isDisabled,\n });\n // Add other field types here as needed\n default:\n return (\n <p>\n Unsupported field type in array:{\" \"}\n {subField.type}\n </p>\n );\n }\n })()}\n {subFieldError && (\n <p className=\"text-xs text-danger-fg\">{subFieldError}</p>\n )}\n </div>\n );\n })}\n </div>\n <Button\n type=\"button\"\n iconOnly\n variant=\"ghost\"\n size=\"md\"\n aria-label={`${item.label} verwijderen`}\n onClick={() => handleRemoveItem(index)}\n disabled={isDisabled}\n className={cn(\"shrink-0\", index === 0 && \"mt-5\")}\n >\n <Trash2 className=\"size-icon-md\" />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={<Plus className=\"size-icon-sm\" />}\n onClick={handleAddItem}\n disabled={isDisabled}\n >\n {item.label} toevoegen\n </Button>\n </div>\n );\n }\n\n default:\n return null;\n }\n },\n [formData, touched, errors, loading, size, handleFieldChange]\n );\n\n // Render form group\n const renderGroup = useCallback(\n (group: FormGroup<T>) => {\n // Check group conditional\n if (group.conditional && !group.conditional(formData as T)) {\n return null;\n }\n\n const visibleItems = group.items.filter((item) => {\n if (item.hidden) return false;\n if (item.conditional && !item.conditional(formData as T)) return false;\n return true;\n });\n\n if (visibleItems.length === 0) return null;\n\n const groupClasses = cn(\n group.layout === \"flex\" ? \"flex flex-wrap gap-3\" : \"grid gap-3\",\n group.layout !== \"flex\" && {\n \"grid-cols-1\": !group.columns || group.columns === 1,\n \"grid-cols-2\": group.columns === 2,\n \"grid-cols-3\": group.columns === 3,\n \"grid-cols-4\": group.columns === 4,\n },\n group.className\n );\n\n return (\n <div\n key={group.id}\n className=\"flex flex-col gap-4 px-5 py-4 not-first:border-t not-first:border-border-subtle sm:flex-row sm:gap-5\"\n >\n {/* Group Header — fixed label column, like every section in the kit */}\n <div className=\"w-full shrink-0 sm:w-form-label\">\n <span className=\"text-sm font-semibold text-text\">{group.title}</span>\n {group.description && (\n <p className=\"mt-1 text-xs leading-4 text-text-subtle\">\n {group.description}\n </p>\n )}\n </div>\n\n {/* Group Items */}\n <div className=\"min-w-0 flex-1\">\n <div className={groupClasses}>\n {visibleItems.map((item) => {\n const fieldError = touched[item.name as string]\n ? errors[item.name as string]\n : undefined;\n\n return (\n <div\n key={item.name as string}\n className={cn(\n \"flex min-w-0 flex-col gap-1.5\",\n item.type === \"checkbox\" && \"justify-center\"\n )}\n style={{\n width: typeof item.width === \"string\" ? item.width : undefined,\n gridColumn:\n typeof item.width === \"number\"\n ? `span ${item.width} / span ${item.width}`\n : undefined,\n }}\n >\n {/* Field Label — checkbox carries its own label on the right */}\n {item.type !== \"custom\" && item.type !== \"checkbox\" && (\n <label className=\"block text-xs font-semibold uppercase tracking-label text-text-subtle\">\n {item.label}\n {item.required && (\n <span className=\"ml-1 text-danger-fg\">*</span>\n )}\n </label>\n )}\n\n {/* Field Input */}\n {renderField(item)}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n [formData, touched, errors, renderField]\n );\n\n const formClasses = cn(\n \"overflow-hidden rounded-lg border border-border bg-surface\",\n {\n \"max-w-md\": size === \"sm\",\n \"max-w-2xl\": size === \"md\",\n \"max-w-4xl\": size === \"lg\",\n \"max-w-full\": size === \"full\",\n },\n className\n );\n\n const buttonSize = size === \"full\" ? \"md\" : size;\n\n return (\n <form ref={ref} onSubmit={handleSubmit} className={formClasses}>\n {/* Implicit submission. A form with several fields and no submit button\n inside it ignores Enter entirely — which is what happens whenever the\n save button lives in a page header (showButtons={false}). This hidden\n button is the form's default button, so Enter in a text field submits\n the way it does everywhere else. */}\n {!showButtons && <button type=\"submit\" className=\"hidden\" tabIndex={-1} aria-hidden />}\n\n {/* Form Groups — sections in one panel, separated by a hairline */}\n <div className=\"flex flex-col\">{groups.map(renderGroup)}</div>\n\n {/* Footer — actions, or the autosave line when showButtons is false */}\n <div className=\"flex items-center gap-2 border-t border-border-subtle bg-surface-sunk px-5 py-3\">\n {showButtons && (\n <>\n <div className=\"ml-auto\" />\n {onCancel && (\n <Button\n type=\"button\"\n variant={cancelButton.variant ?? \"ghost\"}\n size={cancelButton.size || buttonSize}\n disabled={cancelButton.disabled || loading}\n onClick={onCancel}\n className={cancelButton.className}\n >\n {cancelButton.label}\n </Button>\n )}\n\n <Button\n type=\"submit\"\n variant={submitButton.variant}\n size={submitButton.size || buttonSize}\n disabled={submitButton.disabled || loading}\n loading={loading}\n className={submitButton.className}\n >\n {submitButton.label}\n </Button>\n </>\n )}\n </div>\n </form>\n );\n};\n","import React from \"react\";\nimport { Button } from \"../action/Button\";\nimport { Text } from \"../typography/Text\";\nimport { Modal } from \"./Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n /** What is about to happen, and what it costs if it is wrong. */\n description?: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n /** `danger` for anything that destroys or detaches something. */\n tone?: \"default\" | \"danger\";\n /** Disables both buttons and puts the confirm button in its loading state. */\n loading?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * Confirmation before a destructive or irreversible action.\n *\n * Replaces `window.confirm`, which blocks the main thread, cannot be styled,\n * cannot be translated, and is suppressed outright in some embedded contexts.\n * Note the shape difference: `confirm()` returns a boolean inline, so callers\n * written as `if (!confirm(...)) return;` have to split into a request step\n * and a confirm step.\n *\n * @example\n * ```tsx\n * <ConfirmDialog\n * open={pendingDelete !== null}\n * tone=\"danger\"\n * title={t(\"channel_delete_title\")}\n * description={t(\"channel_delete_description\")}\n * confirmLabel={t(\"delete\")}\n * onConfirm={() => remove(pendingDelete!)}\n * onCancel={() => setPendingDelete(null)}\n * />\n * ```\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Bevestigen\",\n cancelLabel = \"Annuleren\",\n tone = \"default\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <div className=\"flex w-full items-center justify-end gap-2\">\n <Button variant=\"ghost\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button\n variant={tone === \"danger\" ? \"destructive\" : \"primary\"}\n onClick={onConfirm}\n loading={loading}\n >\n {confirmLabel}\n </Button>\n </div>\n }\n >\n {description && <Text color=\"secondary\">{description}</Text>}\n </Modal>\n );\n}\n","import React from 'react';\nimport { X } from \"lucide-react\";\nimport { Icon } from \"../content/Icon\";\nimport { cn } from '../utils/cn';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * The visual variant of the badge\n */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info' | 'note';\n \n /**\n * The size of the badge\n */\n size?: 'sm' | 'md' | 'lg';\n \n /**\n * Whether the badge should have a dot indicator\n */\n dot?: boolean;\n \n /**\n * Icon to display in the badge\n */\n icon?: React.ReactNode;\n \n /**\n * Whether the badge can be dismissed\n */\n dismissible?: boolean;\n \n /**\n * Callback fired when the badge is dismissed\n */\n onDismiss?: () => void;\n}\n\n// Semantic, token-driven (mode-aware via CSS custom properties — no dark: overrides needed)\nconst badgeVariants = {\n default: 'bg-surface-hover text-text',\n primary: 'bg-accent-soft text-accent',\n secondary: 'bg-surface-hover text-text-muted',\n success: 'bg-success-soft text-success-fg',\n warning: 'bg-warning-soft text-warning-fg',\n error: 'bg-danger-soft text-danger-fg',\n info: 'bg-info-soft text-info-fg',\n // Internal-note amber. Never for customer-visible content.\n note: 'bg-note-soft text-note',\n};\n\nconst badgeSizes = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n};\n\nconst dotColors = {\n default: 'bg-surface-hover',\n primary: 'bg-accent',\n secondary: 'bg-surface-hover',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-danger',\n info: 'bg-info',\n note: 'bg-note',\n};\n\n/**\n * Badge component for displaying status indicators and labels\n * \n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * \n * <Badge variant=\"warning\" dot>\n * Pending\n * </Badge>\n * \n * <Badge variant=\"error\" dismissible onDismiss={() => console.log('dismissed')}>\n * Error\n * </Badge>\n * \n * <Badge variant=\"primary\" icon={<StarIcon />}>\n * Featured\n * </Badge>\n * ```\n */\nexport function Badge({\n variant = 'default',\n size = 'md',\n dot = false,\n icon,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n // Base styles\n 'inline-flex items-center font-medium rounded-full',\n \n // Variant styles\n badgeVariants[variant],\n \n // Size styles\n badgeSizes[size],\n \n className\n )}\n {...props}\n >\n {dot && (\n <span\n className={cn(\n 'w-2 h-2 rounded-full mr-1.5',\n dotColors[variant]\n )}\n />\n )}\n \n {icon && (\n <span className={cn('flex-shrink-0', children && 'mr-1')}>\n {icon}\n </span>\n )}\n \n {children}\n \n {dismissible && onDismiss && (\n <button\n onClick={onDismiss}\n className=\"ml-1.5 flex-shrink-0 hover:opacity-70 transition-opacity\"\n aria-label=\"Remove badge\"\n >\n <Icon icon={X} size=\"xs\" color=\"current\" />\n </button>\n )}\n </span>\n );\n} ","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Leading glyph or icon (e.g. a check for the focus \"queue empty\" state). */\n icon?: React.ReactNode;\n /** Tint of the icon disc. */\n tone?: \"neutral\" | \"success\";\n /** Headline. */\n title: React.ReactNode;\n /** Supporting copy. */\n description?: React.ReactNode;\n /** Action buttons row. */\n actions?: React.ReactNode;\n /** Render inside a raised card (focus \"done\" state) vs. plain centered block. */\n card?: boolean;\n}\n\nconst toneDisc: Record<NonNullable<EmptyStateProps[\"tone\"]>, string> = {\n neutral: \"bg-surface-hover text-text-muted\",\n success: \"bg-success-soft text-success-fg\",\n};\n\n/**\n * Centered empty / completion state (focus queue done, no-results lists).\n *\n * @example\n * ```tsx\n * <EmptyState card tone=\"success\" icon={<Icon icon={Check} size=\"lg\" />}\n * title=\"Wachtrij leeg — 7 afgehandeld\"\n * description=\"Nieuwe gesprekken verschijnen hier vanzelf.\"\n * actions={<Button>Terug naar Mijn dag</Button>} />\n * ```\n */\nexport function EmptyState({\n icon,\n tone = \"neutral\",\n title,\n description,\n actions,\n card = false,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center gap-2.5 text-center\",\n card && \"rounded-lg border border-border bg-surface px-11 py-9 shadow-overlay\",\n className,\n )}\n {...props}\n >\n {icon != null && (\n <span className={cn(\"flex size-disc items-center justify-center rounded-full text-2xl\", toneDisc[tone])}>\n {icon}\n </span>\n )}\n <div className=\"text-lg font-semibold text-text\">{title}</div>\n {description && <div className=\"max-w-sm text-sm leading-relaxed text-text-muted\">{description}</div>}\n {actions && <div className=\"flex gap-2 pt-1.5\">{actions}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n /** Key label, e.g. \"⌘K\", \"E\", \"↵\". */\n children: React.ReactNode;\n}\n\n/**\n * Keyboard-shortcut chip (the `⌘K` / `E` / `↵` hints in the redesign).\n *\n * @example\n * ```tsx\n * Zoeken <Kbd>⌘K</Kbd>\n * ```\n */\nexport function Kbd({ children, className, ...props }: KbdProps) {\n return (\n <kbd\n className={cn(\n \"inline-flex items-center rounded border border-border px-1.5 py-px text-xs font-medium leading-none text-text-muted\",\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Completion 0–100 (clamped). */\n value: number;\n /** Fill tone. */\n variant?: \"accent\" | \"success\";\n /** Track height. */\n size?: \"sm\" | \"md\";\n}\n\nconst trackSizes: Record<NonNullable<ProgressBarProps[\"size\"]>, string> = {\n sm: \"h-1\",\n md: \"h-1.5\",\n};\n\nconst fillVariants: Record<NonNullable<ProgressBarProps[\"variant\"]>, string> = {\n accent: \"bg-accent\",\n success: \"bg-success\",\n};\n\n/**\n * Slim determinate progress bar (focus queue progress, subtask completion).\n * Token-driven and mode-aware.\n *\n * @example\n * ```tsx\n * <ProgressBar value={40} />\n * <ProgressBar value={3 / 7 * 100} variant=\"success\" size=\"sm\" />\n * ```\n */\nexport function ProgressBar({ value, variant = \"accent\", size = \"md\", className, ...props }: ProgressBarProps) {\n const pct = Math.max(0, Math.min(100, value));\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n className={cn(\"w-full overflow-hidden rounded-full bg-surface-hover\", trackSizes[size], className)}\n {...props}\n >\n <div\n className={cn(\"h-full rounded-full transition-[width] duration-300 ease-out\", fillVariants[variant])}\n style={{ width: `${pct}%` }}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The size of the spinner\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n \n /**\n * The color variant of the spinner\n */\n variant?: 'primary' | 'secondary' | 'white' | 'current';\n \n /**\n * Optional label for accessibility\n */\n label?: string;\n \n /**\n * Whether to show the spinner with a label\n */\n showLabel?: boolean;\n}\n\nconst spinnerSizes = {\n xs: 'h-3 w-3',\n sm: 'h-4 w-4',\n md: 'h-6 w-6',\n lg: 'h-8 w-8',\n xl: 'h-12 w-12',\n};\n\nconst spinnerColors = {\n primary: 'text-accent',\n secondary: 'text-text-muted',\n white: 'text-white',\n current: 'text-current',\n};\n\nconst labelSizes = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n};\n\n/**\n * Spinner component for loading states\n * \n * @example\n * ```tsx\n * <Spinner size=\"md\" variant=\"primary\" />\n * \n * <Spinner size=\"lg\" variant=\"primary\" showLabel label=\"Loading...\" />\n * \n * <Spinner size=\"sm\" variant=\"white\" />\n * ```\n */\nexport function Spinner({\n size = 'md',\n variant = 'primary',\n label = 'Loading...',\n showLabel = false,\n className,\n ...props\n}: SpinnerProps) {\n return (\n <div\n className={cn(\n 'inline-flex items-center',\n showLabel ? 'flex-col space-y-2' : '',\n className\n )}\n {...props}\n >\n <svg\n className={cn(\n 'animate-spin',\n spinnerSizes[size],\n spinnerColors[variant]\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden={!showLabel}\n role={showLabel ? 'status' : undefined}\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n \n {showLabel && (\n <span\n className={cn(\n 'text-text-muted',\n labelSizes[size]\n )}\n >\n {label}\n </span>\n )}\n \n {/* Screen reader only text when label is not shown */}\n {!showLabel && (\n <span className=\"sr-only\">{label}</span>\n )}\n </div>\n );\n} ","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface StatusDotProps {\n /**\n * Meaning, not colour. `neutral` is the off/idle state; `accent` marks\n * unread; the rest follow the status tokens.\n */\n tone?:\n | \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"note\"\n /** Identity without status — an inbox, a speaker. See --color-cat-*. */\n | \"cat-1\" | \"cat-2\" | \"cat-3\" | \"cat-4\" | \"cat-5\";\n /** Square instead of round — the marker style used for inbox identity. */\n shape?: \"round\" | \"square\";\n /** Slow pulse for something live: an active call, a running recording. */\n pulse?: boolean;\n /**\n * Accessible name. Without one the dot is decorative and hidden from\n * assistive tech, which is right when adjacent text already says the state.\n */\n label?: string;\n className?: string;\n}\n\nconst tones: Record<NonNullable<StatusDotProps[\"tone\"]>, string> = {\n neutral: \"bg-text-disabled\",\n accent: \"bg-accent\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-danger\",\n info: \"bg-info\",\n note: \"bg-note\",\n \"cat-1\": \"bg-cat-1\",\n \"cat-2\": \"bg-cat-2\",\n \"cat-3\": \"bg-cat-3\",\n \"cat-4\": \"bg-cat-4\",\n \"cat-5\": \"bg-cat-5\",\n};\n\n/**\n * Small state marker: presence, session state, unread, live recording.\n *\n * Replaces a scatter of hand-rolled `h-2 w-2 rounded-full bg-green-500` spans\n * that used raw palette colours and disagreed on size (8px vs 10px).\n *\n * @example\n * ```tsx\n * <StatusDot tone=\"success\" label=\"Online\" />\n * <StatusDot tone=\"danger\" pulse label=\"Opname loopt\" />\n * ```\n */\nexport function StatusDot({\n tone = \"neutral\",\n shape = \"round\",\n pulse = false,\n label,\n className,\n}: StatusDotProps) {\n return (\n <span\n role={label ? \"img\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn(\n \"inline-block size-dot shrink-0\",\n shape === \"round\" ? \"rounded-full\" : \"rounded-sm\",\n tones[tone],\n pulse && \"animate-pulse\",\n className\n )}\n />\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface StepIndicatorProps {\n /** Step ids in order. Only the position matters; the ids identify `current`. */\n steps: string[];\n /** Id of the step being shown. Unknown ids render as \"not started\". */\n current: string;\n /**\n * `numbered` draws counted circles joined by a rule — use it when the user\n * needs to know how many steps are left. `dots` is the quieter bar, for a\n * flow whose heading already says where you are.\n */\n variant?: \"numbered\" | \"dots\";\n /**\n * Accessible name. Without one the indicator is treated as decorative, which\n * is right when a heading beside it already announces the current step.\n */\n label?: string;\n className?: string;\n}\n\n/**\n * Progress through a short, linear flow.\n *\n * @example\n * ```tsx\n * <StepIndicator steps={[\"provider\", \"channel\", \"owner\"]} current={step} />\n * <StepIndicator steps={[\"intent\", \"channel\", \"address\"]} current={step} variant=\"dots\" />\n * ```\n */\nexport function StepIndicator({\n steps,\n current,\n variant = \"numbered\",\n label,\n className,\n}: StepIndicatorProps) {\n const activeIndex = steps.indexOf(current);\n const shared = { role: label ? \"group\" : undefined, \"aria-label\": label, \"aria-hidden\": label ? undefined : true };\n\n if (variant === \"dots\") {\n return (\n <div {...shared} className={cn(\"flex items-center gap-1.5\", className)}>\n {steps.map((step, i) => (\n <span\n key={step}\n className={cn(\n \"h-step-bar rounded-full transition-all duration-fast ease-out\",\n i === activeIndex ? \"w-5 bg-accent\" : \"w-3.5\",\n i < activeIndex && \"bg-border-strong\",\n i > activeIndex && \"bg-border\"\n )}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div {...shared} className={cn(\"flex items-center gap-2\", className)}>\n {steps.map((step, i) => (\n <div key={step} className=\"flex items-center gap-2\">\n <span\n aria-current={i === activeIndex ? \"step\" : undefined}\n className={cn(\n \"flex size-tile-sm items-center justify-center rounded-full text-xs font-medium\",\n i === activeIndex && \"bg-accent text-accent-fg\",\n i < activeIndex && \"bg-accent-soft text-accent\",\n i > activeIndex && \"bg-surface-hover text-text-muted\"\n )}\n >\n {i + 1}\n </span>\n {i < steps.length - 1 && <span className=\"h-px w-8 bg-border-strong\" />}\n </div>\n ))}\n </div>\n );\n}\n","import { Sparkles } from \"lucide-react\";\nimport React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface AssistantCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Card heading (e.g. \"Briefing van je assistent\", \"Voorstel van de assistent\"). */\n title: React.ReactNode;\n /** Leading icon; defaults to the lucide Sparkles icon. */\n icon?: React.ReactNode;\n /** Optional action rendered on the header's right (e.g. a \"Gebruiken\" button). */\n action?: React.ReactNode;\n /** Body content. */\n children?: React.ReactNode;\n}\n\n/**\n * AI-assistant card shell — the tinted \"Briefing / Voorstel van de assistent\"\n * surface used on Mijn dag and in the Focus queue. Uses the `--assistant-*`\n * design-system tokens so the tint is mode-aware.\n *\n * @example\n * ```tsx\n * <AssistantCard title=\"Voorstel van de assistent\" action={<Button size=\"xs\">Gebruiken</Button>}>\n * Marc wacht 12 min op WhatsApp — concept staat klaar.\n * </AssistantCard>\n * ```\n */\nexport function AssistantCard({ title, icon = <Sparkles className=\"size-icon-md\" aria-hidden />, action, children, className, ...props }: AssistantCardProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-2 rounded-xl border p-4\",\n \"border-assistant-border bg-assistant-soft\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2 text-assistant\">\n <span aria-hidden>{icon}</span>\n <span className=\"text-sm font-semibold\">{title}</span>\n {action && <span className=\"ml-auto\">{action}</span>}\n </div>\n {children && <div className=\"text-sm leading-relaxed text-text\">{children}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface AvatarProps {\n /** Full name; used for the initials fallback and alt/title text */\n name?: string;\n /** Optional image URL; falls back to initials when absent or on load error */\n src?: string;\n /** Size preset */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Additional CSS classes */\n className?: string;\n /** Override the title attribute (defaults to `name`) */\n title?: string;\n}\n\nconst sizeClasses: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\n xs: \"w-5 h-5 text-xs\",\n sm: \"w-6 h-6 text-xs\",\n md: \"w-7 h-7 text-base\",\n lg: \"w-9 h-9 text-sm\",\n};\n\nfunction initials(name?: string): string {\n if (!name) return \"?\";\n // Split op alles wat geen letter/cijfer is (spatie, @, ., -, _, …) zodat\n // adressen als \"mail-team@x.nl\" schone initialen geven (\"MT\"), niet \"M-\".\n const parts = name.trim().split(/[^\\p{L}\\p{N}]+/u).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return \"?\";\n}\n\n/**\n * Circular avatar: renders the photo when `src` is set (falling back to\n * initials on error), otherwise a monogram derived from `name`.\n */\nexport const Avatar: React.FC<AvatarProps> = ({ name, src, size = \"sm\", className, title }) => {\n const [errored, setErrored] = React.useState(false);\n const base = cn(\n \"inline-flex items-center justify-center rounded-full overflow-hidden shrink-0 font-semibold select-none bg-surface-hover text-text\",\n sizeClasses[size],\n className,\n );\n\n if (src && !errored) {\n return (\n <img\n src={src}\n alt={name ?? \"\"}\n title={title ?? name}\n className={cn(base, \"object-cover\")}\n onError={() => setErrored(true)}\n />\n );\n }\n\n return (\n <span className={base} title={title ?? name} aria-label={name}>\n {initials(name)}\n </span>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Avatar, type AvatarProps } from \"./Avatar\";\n\nexport interface AvatarStackPerson {\n id?: string;\n name?: string;\n src?: string;\n /** Owner / assignee — rendered with an accent ring */\n owner?: boolean;\n /** Whether this person has seen the item; unseen renders dimmed */\n seen?: boolean;\n}\n\nexport interface AvatarStackProps {\n people: AvatarStackPerson[];\n /** Max avatars to show before collapsing the rest into a \"+N\" chip */\n max?: number;\n size?: AvatarProps[\"size\"];\n className?: string;\n}\n\n// Panel-coloured ring so overlapping avatars stay visually separated; the\n// owner gets an extra accent halo on top of it.\nconst RING = \"ring-surface\";\nconst OWNER_RING = \"ring-surface-accent\";\n\n/**\n * Overlapping row of avatars with an optional \"+N\" overflow chip. Unseen\n * people are dimmed; the owner carries an accent ring.\n */\nexport const AvatarStack: React.FC<AvatarStackProps> = ({ people, max = 4, size = \"sm\", className }) => {\n if (people.length === 0) return null;\n const shown = people.slice(0, max);\n const overflow = people.length - shown.length;\n\n return (\n <span className={cn(\"inline-flex items-center\", className)}>\n {shown.map((p, i) => (\n <Avatar\n key={p.id ?? `${p.name}-${i}`}\n name={p.name}\n src={p.src}\n size={size}\n title={p.name ? (p.seen === false ? `${p.name} — nog niet gelezen` : p.name) : undefined}\n className={cn(\n i > 0 && \"-ml-2\",\n p.owner ? OWNER_RING : RING,\n p.seen === false && \"opacity-40\",\n )}\n />\n ))}\n {overflow > 0 && (\n <span\n className={cn(\n \"inline-flex items-center justify-center rounded-full shrink-0 -ml-2 font-semibold bg-surface-hover text-text-muted\",\n size === \"xs\" ? \"w-5 h-5 text-xs\" : size === \"md\" ? \"w-7 h-7 text-xs\" : size === \"lg\" ? \"w-9 h-9 text-xs\" : \"w-6 h-6 text-xs\",\n RING,\n )}\n >\n +{overflow}\n </span>\n )}\n </span>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\n/** Communication channel keys the redesign colour-codes. */\nexport type ChannelKey = \"mail\" | \"wa\" | \"chat\" | \"tel\" | \"note\";\n\nexport interface ChannelBadgeProps {\n /** Channel — drives the colour. Unknown/undefined falls back to the neutral \"note\" tone. */\n channel?: ChannelKey | string;\n /** Glyph or short label inside the tile (e.g. an icon, or an initial). */\n children?: React.ReactNode;\n /** Tile size. */\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n title?: string;\n}\n\n/**\n * Channel key → semantic token pair. The keys are the redesign's shorthand\n * (`wa`, `tel`); the tokens spell the channel out (`whatsapp`, `phone`).\n * Written as whole class names so Tailwind can find them.\n */\nconst CH: Record<ChannelKey, { fg: string; bg: string }> = {\n mail: { fg: \"text-channel-mail-fg\", bg: \"bg-channel-mail-soft\" },\n wa: { fg: \"text-channel-whatsapp-fg\", bg: \"bg-channel-whatsapp-soft\" },\n chat: { fg: \"text-channel-chat-fg\", bg: \"bg-channel-chat-soft\" },\n tel: { fg: \"text-channel-phone-fg\", bg: \"bg-channel-phone-soft\" },\n note: { fg: \"text-channel-note-fg\", bg: \"bg-channel-note-soft\" },\n};\n\nconst sizes: Record<NonNullable<ChannelBadgeProps[\"size\"]>, string> = {\n sm: \"size-avatar-xs rounded-sm text-xs\",\n md: \"size-avatar-sm rounded-md text-xs\",\n lg: \"size-avatar-lg rounded-md text-base\",\n};\n\n/**\n * Coloured channel tile (the glyph-in-rounded-square used across inbox rows,\n * the focus queue, the attention list and Recent tabs). Colours come from the\n * `--color-channel-*` design-system tokens, so it is mode-aware.\n *\n * @example\n * ```tsx\n * <ChannelBadge channel=\"wa\">W</ChannelBadge>\n * <ChannelBadge channel=\"mail\" size=\"lg\"><MailIcon /></ChannelBadge>\n * ```\n */\nexport function ChannelBadge({ channel, children, size = \"md\", className, title }: ChannelBadgeProps) {\n const tone = CH[(channel as ChannelKey) in CH ? (channel as ChannelKey) : \"note\"];\n return (\n <span\n title={title}\n className={cn(\n \"inline-flex shrink-0 items-center justify-center font-bold\",\n sizes[size],\n tone.fg,\n tone.bg,\n className,\n )}\n >\n {children}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport { ImageOff } from \"lucide-react\";\nimport { Icon } from \"./Icon\";\nimport { cn } from '../utils/cn';\n\nexport interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Image source URL */\n src: string;\n /** Alt text for accessibility */\n alt: string;\n /** Image size preset */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** Aspect ratio */\n aspectRatio?: 'square' | 'video' | 'portrait' | 'landscape' | 'auto';\n /** Border radius */\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** Whether to show loading state */\n showLoading?: boolean;\n /** Whether to show error state */\n showError?: boolean;\n /** Fallback image URL */\n fallback?: string;\n /** Loading placeholder content */\n loadingContent?: React.ReactNode;\n /** Error placeholder content */\n errorContent?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Image component with loading states, error handling, and theme integration\n */\nexport const Image: React.FC<ImageProps> = ({\n src,\n alt,\n size = 'md',\n aspectRatio = 'auto',\n radius = 'md',\n showLoading = true,\n showError = true,\n fallback,\n loadingContent,\n errorContent,\n className,\n onLoad,\n onError,\n ...props\n}) => {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [currentSrc, setCurrentSrc] = useState(src);\n\n const handleLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setIsLoading(false);\n setHasError(false);\n onLoad?.(event);\n };\n\n const handleError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setIsLoading(false);\n setHasError(true);\n \n // Try fallback if available and not already using it\n if (fallback && currentSrc !== fallback) {\n setCurrentSrc(fallback);\n setHasError(false);\n setIsLoading(true);\n return;\n }\n \n onError?.(event);\n };\n\n const containerClasses = cn(\n 'relative overflow-hidden bg-surface-hover',\n \n // Size variants\n {\n 'w-8 h-8': size === 'xs',\n 'w-12 h-12': size === 'sm',\n 'w-16 h-16': size === 'md',\n 'w-24 h-24': size === 'lg',\n 'w-32 h-32': size === 'xl',\n 'w-full h-full': size === 'full',\n },\n \n // Aspect ratio variants\n {\n 'aspect-square': aspectRatio === 'square',\n 'aspect-video': aspectRatio === 'video',\n 'aspect-portrait': aspectRatio === 'portrait',\n 'aspect-landscape': aspectRatio === 'landscape',\n },\n \n // Border radius variants\n {\n 'rounded-none': radius === 'none',\n 'rounded-sm': radius === 'sm',\n 'rounded-md': radius === 'md',\n 'rounded-lg': radius === 'lg',\n 'rounded-xl': radius === 'xl',\n 'rounded-full': radius === 'full',\n },\n \n className\n );\n\n const imageClasses = cn(\n 'w-full h-full object-cover transition-opacity duration-fast',\n {\n 'opacity-0': isLoading || hasError,\n 'opacity-100': !isLoading && !hasError,\n }\n );\n\n const placeholderClasses = cn(\n 'absolute inset-0 flex items-center justify-center',\n 'text-text-muted'\n );\n\n const defaultLoadingContent = (\n <div className=\"animate-pulse\">\n <div className=\"w-6 h-6 bg-surface-hover rounded\"></div>\n </div>\n );\n\n const defaultErrorContent = (\n <div className=\"text-center\">\n <Icon icon={ImageOff} size=\"lg\" className=\"mx-auto mb-1\" />\n <span className=\"text-xs\">Failed to load</span>\n </div>\n );\n\n return (\n <div className={containerClasses}>\n <img\n {...props}\n src={currentSrc}\n alt={alt}\n className={imageClasses}\n onLoad={handleLoad}\n onError={handleError}\n />\n \n {/* Loading state */}\n {isLoading && showLoading && (\n <div className={placeholderClasses}>\n {loadingContent || defaultLoadingContent}\n </div>\n )}\n \n {/* Error state */}\n {hasError && showError && (\n <div className={placeholderClasses}>\n {errorContent || defaultErrorContent}\n </div>\n )}\n </div>\n );\n}; ","import { ChevronRight } from \"lucide-react\";\nimport React from \"react\";\nimport { Checkbox } from \"../input/Checkbox\";\nimport { cn } from \"../utils/cn\";\n\nexport interface ListGroup {\n /** Group key — must match what `groupBy` returns */\n id: string;\n /** Header label; defaults to `id` */\n title?: string;\n /** Override the row count shown on the right */\n count?: number;\n /** Start collapsed (only with `collapsible`) */\n defaultCollapsed?: boolean;\n}\n\nexport interface ListProps<T> {\n /** Rows to render */\n items: T[];\n /** Stable key per row */\n getRowKey?: (item: T, index: number) => string | number;\n /** Row separation */\n variant?: \"plain\" | \"divided\" | \"bulleted\";\n /** Leading slot — channel tile, avatar, status dot */\n leading?: (item: T, index: number) => React.ReactNode;\n /** Main content; defaults to `String(item)` */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** Trailing slot — timestamp, badge, counter */\n trailing?: (item: T, index: number) => React.ReactNode;\n /** Row click */\n onSelect?: (item: T, index: number) => void;\n /**\n * Fired when keyboard focus lands on a row. Lets a consumer mirror the\n * roving focus into its own \"active\" state (what a hand-rolled `useArrowNav`\n * used to provide) without owning the key handling.\n */\n onActiveIndexChange?: (index: number) => void;\n /** Highlighted row (accent wash) */\n isActive?: (item: T, index: number) => boolean;\n /** Bold + accent dot */\n unread?: (item: T, index: number) => boolean;\n /** Deprioritised noise (opacity) */\n dimmed?: (item: T, index: number) => boolean;\n\n /** Group rows under headers. Return the group id for each row. */\n groupBy?: (item: T, index: number) => string;\n /**\n * Group order and labels. Groups missing here are appended in order of first\n * appearance; groups listed here but empty are skipped.\n */\n groups?: ListGroup[];\n /** Header renderer; defaults to label + count */\n renderGroupHeader?: (group: ListGroup, items: T[]) => React.ReactNode;\n /** Headers stick to the top of the scroll container */\n stickyGroupHeaders?: boolean;\n /** Headers become a toggle that folds the group */\n collapsibleGroups?: boolean;\n /** Hide the count on the right of the header */\n hideGroupCount?: boolean;\n\n /** Checkbox column + bulk bar */\n selectable?: boolean;\n /** Selected rows (controlled) */\n selectedItems?: T[];\n /** Selection handler */\n onSelectionChange?: (selected: T[]) => void;\n /** Actions shown in the bulk bar when a selection exists */\n bulkActions?: React.ReactNode;\n\n /**\n * Column-label strip above the rows (\"Van · Gesprek · tijd\"), like the inbox.\n * Align it with the row by reusing the same widths as `renderItem`.\n */\n header?: React.ReactNode;\n /** Keep the column-label strip visible while scrolling */\n stickyHeader?: boolean;\n\n /** Wrap the list in a bordered container */\n bordered?: boolean;\n /** Empty state content */\n emptyContent?: React.ReactNode;\n /** Loading state */\n loading?: boolean;\n /** Number of skeleton rows while loading */\n loadingRows?: number;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * List — one row is one object you open, with content of varying length\n * (inbox conversations, notifications, search results). No column headers:\n * hierarchy lives inside the row.\n *\n * Use `Table` instead when you compare values between rows (sortable columns,\n * aligned amounts, select-all in a header).\n *\n * Grouped, like the inbox and task views:\n *\n * @example\n * ```tsx\n * <List\n * items={tasks}\n * getRowKey={(t) => t.id}\n * bordered\n * groupBy={(t) => t.bucket} // \"today\" | \"tomorrow\" | \"later\"\n * groups={[\n * { id: \"today\", title: \"Vandaag\" },\n * { id: \"tomorrow\", title: \"Morgen\" },\n * { id: \"later\", title: \"Later\" },\n * ]}\n * stickyGroupHeaders\n * collapsibleGroups\n * leading={(t) => <ChannelBadge channel={t.channel} size=\"sm\" />}\n * renderItem={(t) => <span className=\"truncate\">{t.title}</span>}\n * trailing={(t) => t.due}\n * unread={(t) => !t.read}\n * />\n * ```\n */\nexport function List<T>({\n items,\n getRowKey,\n variant = \"divided\",\n leading,\n renderItem,\n trailing,\n onSelect,\n onActiveIndexChange,\n isActive,\n unread,\n dimmed,\n groupBy,\n groups,\n renderGroupHeader,\n stickyGroupHeaders = false,\n collapsibleGroups = false,\n hideGroupCount = false,\n selectable = false,\n selectedItems = [],\n onSelectionChange,\n bulkActions,\n header,\n stickyHeader = false,\n bordered = false,\n emptyContent,\n loading = false,\n loadingRows = 4,\n className,\n \"aria-label\": ariaLabel,\n}: ListProps<T>) {\n const [collapsed, setCollapsed] = React.useState<Record<string, boolean>>(() =>\n Object.fromEntries(\n (groups ?? [])\n .filter((g) => g.defaultCollapsed)\n .map((g) => [g.id, true])\n )\n );\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n /**\n * Roving focus across the rows. Rows are focusable in DOM order, so this walks\n * them directly rather than tracking an index — grouping and collapsing cannot\n * put it out of sync that way.\n */\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n\n const rows = Array.from(\n rootRef.current?.querySelectorAll<HTMLLIElement>(\"li[data-list-row]\") ?? []\n );\n if (rows.length === 0) return;\n event.preventDefault();\n\n const current = rows.indexOf(document.activeElement as HTMLLIElement);\n const next =\n event.key === \"Home\" ? 0\n : event.key === \"End\" ? rows.length - 1\n : event.key === \"ArrowDown\" ? (current + 1) % rows.length\n : (current - 1 + rows.length) % rows.length;\n\n rows[next]?.focus();\n };\n\n const keyOf = (item: T, index: number) =>\n getRowKey ? getRowKey(item, index) : index;\n\n const isSelected = (item: T) => selectedItems.includes(item);\n\n const toggle = (item: T, checked: boolean) => {\n if (!onSelectionChange) return;\n onSelectionChange(\n checked ? [...selectedItems, item] : selectedItems.filter((i) => i !== item)\n );\n };\n\n const toggleAll = (checked: boolean) =>\n onSelectionChange?.(checked ? [...items] : []);\n\n const container = cn(\n \"flex flex-col\",\n bordered && \"overflow-hidden rounded-lg border border-border-subtle\",\n className\n );\n\n if (loading) {\n return (\n <div className={container}>\n {Array.from({ length: loadingRows }).map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className={cn(\n \"flex animate-pulse items-center gap-3 px-4 py-2\",\n variant === \"divided\" && i > 0 && \"border-t border-border-subtle\"\n )}\n >\n <span className=\"size-tile-sm shrink-0 rounded-md bg-surface-hover\" />\n <span className=\"h-3 w-30 shrink-0 rounded-sm bg-surface-hover\" />\n <span className=\"h-3 flex-1 rounded-sm bg-surface-hover\" />\n <span className=\"h-3 w-8 shrink-0 rounded-sm bg-surface-hover\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (items.length === 0 && emptyContent) {\n return <div className={container}>{emptyContent}</div>;\n }\n\n const allSelected = items.length > 0 && selectedItems.length === items.length;\n const someSelected = selectedItems.length > 0 && !allSelected;\n\n // ---- rows, in one flat pass so `index` keeps pointing at the source item ----\n const renderRow = (item: T, index: number, firstInBlock: boolean) => {\n const active = isActive?.(item, index) ?? false;\n const isUnread = unread?.(item, index) ?? false;\n const isDimmed = dimmed?.(item, index) ?? false;\n const selected = selectable && isSelected(item);\n\n return (\n <li\n key={keyOf(item, index)}\n // A clickable row cannot be a <button>: it holds a checkbox and may hold\n // trailing actions, and buttons may not nest. Button semantics are put on\n // the row instead, so it is reachable, operable and announced correctly.\n {...(onSelect\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n \"data-list-row\": \"\",\n \"aria-current\": active || undefined,\n onClick: () => onSelect(item, index),\n onFocus: () => onActiveIndexChange?.(index),\n onKeyDown: (event: React.KeyboardEvent<HTMLLIElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n // Space scrolls the page by default.\n event.preventDefault();\n onSelect(item, index);\n },\n }\n : {})}\n className={cn(\n \"flex items-center gap-3 px-4 py-2 text-base\",\n \"transition-colors duration-fast ease-out\",\n variant === \"divided\" && !firstInBlock && \"border-t border-border-subtle\",\n onSelect && \"cursor-pointer focus-visible:outline-none focus-visible:focus-ring\",\n active || selected\n ? \"bg-accent-soft text-text\"\n : onSelect && \"hover:bg-surface-hover\",\n isUnread && \"font-bold\",\n isDimmed && \"opacity-55\"\n )}\n >\n {selectable && (\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n checked={isSelected(item)}\n onChange={(e) => toggle(item, e.target.checked)}\n aria-label=\"Rij selecteren\"\n />\n </span>\n )}\n\n {variant === \"bulleted\" && (\n <span\n aria-hidden\n className=\"mt-2 size-1.5 shrink-0 self-start rounded-full bg-border-strong\"\n />\n )}\n\n {leading && <span className=\"shrink-0\">{leading(item, index)}</span>}\n\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {renderItem ? renderItem(item, index) : String(item)}\n </div>\n\n {trailing && (\n <span className=\"shrink-0 text-xs text-text-subtle\">\n {trailing(item, index)}\n </span>\n )}\n </li>\n );\n };\n\n const body = (() => {\n if (!groupBy) {\n return items.map((item, index) => renderRow(item, index, index === 0));\n }\n\n // group id -> [{ item, index }], first-appearance order\n const buckets = new Map<string, { item: T; index: number }[]>();\n items.forEach((item, index) => {\n const id = groupBy(item, index);\n if (!buckets.has(id)) buckets.set(id, []);\n buckets.get(id)!.push({ item, index });\n });\n\n const declared = groups ?? [];\n const order: ListGroup[] = [\n ...declared.filter((g) => buckets.has(g.id)),\n ...[...buckets.keys()]\n .filter((id) => !declared.some((g) => g.id === id))\n .map((id) => ({ id })),\n ];\n\n return order.flatMap((group, groupIndex) => {\n const rows = buckets.get(group.id) ?? [];\n const isCollapsed = collapsibleGroups && collapsed[group.id];\n const label = group.title ?? group.id;\n const count = group.count ?? rows.length;\n\n const header = (\n <li\n key={`group-${group.id}`}\n onClick={\n collapsibleGroups\n ? () =>\n setCollapsed((prev) => ({ ...prev, [group.id]: !prev[group.id] }))\n : undefined\n }\n className={cn(\n \"flex items-center gap-2 bg-surface-sunk px-4 py-1.5\",\n \"text-xs font-semibold uppercase tracking-label text-text-subtle\",\n \"border-border-subtle\",\n groupIndex > 0 && \"border-t\",\n \"border-b\",\n stickyGroupHeaders && \"sticky z-10\",\n collapsibleGroups && \"cursor-pointer select-none hover:text-text\"\n )}\n aria-expanded={collapsibleGroups ? !isCollapsed : undefined}\n // the column strip is 28px tall, so grouped headers park underneath it\n style={stickyGroupHeaders ? { top: stickyHeader ? 28 : 0 } : undefined}\n >\n {renderGroupHeader ? (\n renderGroupHeader(group, rows.map((r) => r.item))\n ) : (\n <>\n {collapsibleGroups && (\n <ChevronRight\n aria-hidden\n className={cn(\n \"size-icon-sm shrink-0 transition-transform duration-fast ease-out\",\n !isCollapsed && \"rotate-90\"\n )}\n />\n )}\n <span>{label}</span>\n {!hideGroupCount && (\n <span className=\"ml-auto font-normal tabular-nums\">{count}</span>\n )}\n </>\n )}\n </li>\n );\n\n if (isCollapsed) return [header];\n\n return [\n header,\n ...rows.map(({ item, index }, rowIndex) =>\n renderRow(item, index, rowIndex === 0)\n ),\n ];\n });\n })();\n\n return (\n <div ref={rootRef} className={container} onKeyDown={onSelect ? handleKeyDown : undefined}>\n {selectable && selectedItems.length > 0 && (\n <div className=\"flex items-center gap-3 border-b border-border-subtle bg-surface-sunk px-4 py-2\">\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => toggleAll(e.target.checked)}\n aria-label=\"Alles selecteren\"\n />\n <span className=\"text-xs text-text-subtle\">\n {selectedItems.length} geselecteerd\n </span>\n {bulkActions && <div className=\"ml-auto flex gap-2\">{bulkActions}</div>}\n </div>\n )}\n\n {header && (\n <div\n className={cn(\n \"flex items-center gap-3 border-b border-border-subtle px-4 py-1.5\",\n \"text-xs font-semibold uppercase tracking-label text-text-subtle\",\n stickyHeader && \"sticky top-0 z-20\"\n )}\n >\n {header}\n </div>\n )}\n\n <ul aria-label={ariaLabel} className=\"flex flex-col\">\n {body}\n </ul>\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface MessageBubbleProps {\n /** Direction. `in` is received, `out` is sent by us. */\n side: \"in\" | \"out\";\n /**\n * Part of a run from the same sender. The bubble keeps its shape; callers use\n * this to drop the repeated header and avatar.\n */\n continued?: boolean;\n /**\n * `warning` for a message that is not settled yet, e.g. a pending draft.\n * `note` is the internal-note surface — amber, never customer-visible.\n */\n tone?: \"default\" | \"warning\" | \"note\";\n /**\n * Layout only — padding, flex behaviour, margins.\n *\n * Not width: the bubble caps its own, because `cn` is plain clsx with no\n * tailwind-merge, so a `max-w-*` passed here would not reliably beat the\n * default — both land in the class list and CSS order decides. A message\n * that runs the full width of the thread stops reading as a message.\n */\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * A single message in a conversation: chat, email and call transcript all use\n * the same shape.\n *\n * The corner facing the sender is tight (`rounded-sm`) and the other three are\n * `rounded-lg`, which is what makes direction readable without a tail. Sent\n * messages sit on `bg-bubble-out-soft`, a 4% ink wash — deliberately lighter than\n * `accent-soft`, which reads as heavy on every message you have ever sent.\n *\n * @example\n * ```tsx\n * <MessageBubble side=\"out\" className=\"max-w-bubble px-4 py-3\">\n * <Text>{body}</Text>\n * </MessageBubble>\n * ```\n */\nexport function MessageBubble({\n side,\n continued = false,\n tone = \"default\",\n className,\n children,\n}: MessageBubbleProps) {\n return (\n <div\n className={cn(\n // A bubble never spans the whole column; it narrows further from md,\n // where the thread itself is wide enough for the difference to matter.\n \"min-w-0 max-w-bubble border md:max-w-bubble-md\",\n tone === \"warning\" && \"border-warning-border\",\n tone === \"note\" && \"border-note-border\",\n tone === \"default\" && \"border-border\",\n // The tight corner points back at the sender.\n side === \"out\" ? \"rounded-lg rounded-tr-sm\" : \"rounded-lg rounded-tl-sm\",\n tone === \"note\"\n ? \"bg-note-soft\"\n : side === \"out\"\n ? \"bg-bubble-out-soft\"\n : \"bg-surface\",\n continued && \"mt-1\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface KpiCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The big number / metric. */\n value: React.ReactNode;\n /** Caption under the value. */\n label: React.ReactNode;\n /** Tone — `urgent` tints the number + border, `success` tints the number. */\n tone?: \"default\" | \"urgent\" | \"success\";\n}\n\nconst valueTone: Record<NonNullable<KpiCardProps[\"tone\"]>, string> = {\n default: \"text-text\",\n urgent: \"text-danger-fg\",\n success: \"text-success-fg\",\n};\n\nconst cardTone: Record<NonNullable<KpiCardProps[\"tone\"]>, string> = {\n default: \"border-border\",\n urgent: \"border-danger-border\",\n success: \"border-border\",\n};\n\n/**\n * KPI / stat card (the Mijn dag metric row). Token-driven, mode-aware.\n *\n * @example\n * ```tsx\n * <KpiCard value={3} label=\"wachten op jou · gem. 1u12\" />\n * <KpiCard value={1} label=\"dreigt SLA te missen\" tone=\"urgent\" />\n * ```\n */\nexport function KpiCard({ value, label, tone = \"default\", className, ...props }: KpiCardProps) {\n return (\n <div className={cn(\"rounded-xl border bg-surface px-4 py-3.5\", cardTone[tone], className)} {...props}>\n <div className={cn(\"text-2xl font-semibold\", valueTone[tone])}>{value}</div>\n <div className=\"pt-0.5 text-xs text-text-muted\">{label}</div>\n </div>\n );\n}\n","import { ArrowLeft, ChevronLeft, Pencil } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Button, type ButtonProps } from \"../action/Button\";\nimport { SplitButton, type SplitButtonOption } from \"../action/SplitButton\";\nimport { cn } from \"../utils/cn\";\nimport { Icon } from \"./Icon\";\n\nexport interface PageHeaderAction {\n /** Action identifier */\n id: string;\n /** Action label */\n label: string;\n /** Action icon */\n icon?: React.ReactNode;\n /** Action handler */\n onClick: () => void;\n /** Action variant. Tracks Button, so the two cannot drift apart. */\n variant?: ButtonProps[\"variant\"];\n /** Whether action is disabled */\n disabled?: boolean;\n /** Dropdown options for split button */\n splitOptions?: SplitButtonOption[];\n /**\n * Render this action yourself instead of as a Button — a filter chip, a\n * segmented toggle, an avatar stack. Position follows the array, so put it\n * before the buttons to have it sit to their left. When set, every other\n * field except `id` is ignored.\n */\n render?: () => React.ReactNode;\n}\n\nexport interface PageHeaderProps {\n /**\n * `plain` sits directly on the page. `surface` is the app-bar treatment:\n * its own background, full-bleed, closed off with a bottom border.\n */\n surface?: boolean;\n /** Page title */\n title: string;\n /** Page subtitle/description. Sits beside the title. */\n subtitle?: string;\n /**\n * Meta line under the title — a contact, a channel, a timestamp. Distinct\n * from `subtitle`, which sits beside the title, and from `children`, which\n * is the full-width row at the bottom of the header.\n */\n meta?: React.ReactNode;\n /** Breadcrumb items */\n breadcrumbs?: Array<{ label: string; href?: string }>;\n /** Action buttons */\n actions?: PageHeaderAction[];\n /** Additional content to render in the header */\n children?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Back button label */\n backLabel?: string;\n /** Back button handler */\n onBack?: () => void;\n /** Back button class name */\n backClassName?: string;\n /** Whether the title is editable */\n editable?: boolean;\n /** Callback when title is changed */\n onTitleChange?: (newTitle: string) => void;\n}\n\nexport const ChevronLeftIcon = () => <Icon icon={ChevronLeft} size=\"md\" color=\"current\" />;\n\n/**\n * PageHeader component for consistent page layouts with title, actions, and breadcrumbs\n */\nexport const PageHeader: React.FC<PageHeaderProps> = ({\n surface = false,\n title,\n subtitle,\n meta,\n actions = [],\n children,\n className,\n backLabel = \"Back\",\n backClassName,\n onBack,\n editable = false,\n onTitleChange,\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(title);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Update editValue when title prop changes\n useEffect(() => {\n setEditValue(title);\n }, [title]);\n\n // Focus input when editing starts\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n const handleTitleClick = () => {\n if (editable) {\n setIsEditing(true);\n }\n };\n\n const handleBlur = () => {\n setIsEditing(false);\n if (editValue.trim() !== \"\" && editValue !== title && onTitleChange) {\n onTitleChange(editValue.trim());\n } else {\n // Reset to original title if empty or unchanged\n setEditValue(title);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n setEditValue(title);\n setIsEditing(false);\n }\n };\n\n return (\n <div\n className={cn(\n \"p-5 pb-3\",\n // App-bar treatment: own background, full-bleed, closed with a rule.\n surface && \"bg-surface border-b border-border\",\n className\n )}\n >\n {/* Header Title + Actions */}\n <div className=\"flex flex-row sm:items-start sm:justify-between items-center gap-4\">\n {/* Title + Subtitle */}\n <div className=\"min-w-0 flex-1\">\n {/* Back sits beside the title block, not above the meta line, so the\n meta line starts under the title rather than under the button. */}\n <div className=\"flex items-start gap-2 text-text\">\n {onBack && (\n <Button variant=\"secondary\" onClick={onBack} leftIcon={<Icon icon={ArrowLeft} size=\"sm\" />} iconOnly />\n )}\n\n <div className=\"min-w-0 flex-1\">\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className=\"text-1xl font-semibold bg-transparent border-b-1 border-border rounded-lg outline-none focus:border-none px-1 -mx-1 min-w-0 w-full\"\n />\n ) : (\n <div className=\"group flex items-baseline gap-2.5 min-w-0\">\n <h2\n onClick={handleTitleClick}\n className={cn(\n \"text-2xl font-semibold truncate\",\n editable && \"cursor-pointer\"\n )}\n title={editable ? \"Klik om te bewerken\" : undefined}\n >\n {title}\n </h2>\n {subtitle && (\n <span className=\"shrink-0 text-base text-text-muted truncate\">{subtitle}</span>\n )}\n {editable && (\n <Pencil\n size={15}\n onClick={handleTitleClick}\n className=\"shrink-0 cursor-pointer text-text-muted opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n )}\n </div>\n )}\n\n {meta && (\n <div className=\"mt-0.5 truncate text-xs text-text-muted\">{meta}</div>\n )}\n </div>\n </div>\n </div>\n\n {/* Actions */}\n {actions.length > 0 && (\n <div className=\"flex flex-wrap sm:flex-nowrap gap-2 sm:gap-3\">\n {actions.map((action) =>\n action.render ? (\n <React.Fragment key={action.id}>{action.render()}</React.Fragment>\n ) : action.splitOptions && action.splitOptions.length > 0 ? (\n <SplitButton\n key={action.id}\n label={action.label}\n onClick={action.onClick}\n icon={action.icon}\n variant={action.variant === \"primary\" ? \"primary\" : \"secondary\"}\n options={action.splitOptions}\n disabled={action.disabled}\n />\n ) : (\n <Button\n key={action.id}\n variant={action.variant ?? \"secondary\"}\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n leftIcon={action.icon}\n >\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n\n {/* Custom Slot Content */}\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n );\n};\n","import { ArrowLeft } from \"lucide-react\";\nimport React from \"react\";\nimport { Button } from \"../action/Button\";\nimport { SplitButton } from \"../action/SplitButton\";\nimport { cn } from \"../utils/cn\";\nimport type { PageHeaderAction } from \"./PageHeader\";\n\nexport interface PageToolbarProps {\n /** Right-aligned action buttons */\n actions?: PageHeaderAction[];\n /** Renders a ghost back button on the left */\n onBack?: () => void;\n /** Back button label (visually hidden on small screens) */\n backLabel?: string;\n /** Additional CSS classes */\n className?: string;\n /** Optional extra content placed between back button and actions */\n children?: React.ReactNode;\n}\n\n/**\n * Thin action-bar for views that already have a host header (e.g. settings\n * overlay). Renders an optional back button on the left and action buttons on\n * the right. Use `PageHeader` when the view needs its own title/breadcrumbs.\n */\nexport const PageToolbar: React.FC<PageToolbarProps> = ({\n actions = [],\n onBack,\n backLabel = \"Back\",\n className,\n children,\n}) => {\n return (\n <div className={cn(\"flex items-center gap-2 mb-3\", className)}>\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack} leftIcon={<ArrowLeft size={14} />}>\n {backLabel}\n </Button>\n )}\n\n {children && <div className=\"flex-1 min-w-0\">{children}</div>}\n\n {actions.length > 0 && (\n <div className={cn(\"flex flex-wrap gap-2\", !children && \"ml-auto\")}>\n {actions.map((action) =>\n action.splitOptions && action.splitOptions.length > 0 ? (\n <SplitButton\n key={action.id}\n label={action.label}\n onClick={action.onClick}\n icon={action.icon}\n variant={action.variant === \"primary\" ? \"primary\" : \"secondary\"}\n options={action.splitOptions}\n disabled={action.disabled}\n />\n ) : (\n <Button\n key={action.id}\n variant={action.variant ?? \"secondary\"}\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n leftIcon={action.icon}\n >\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SectionDividerProps {\n /** Centred label. Without one the divider is a plain rule. */\n label?: React.ReactNode;\n /** Right-aligned slot after the rule, e.g. a count or a status. */\n trailing?: React.ReactNode;\n /** Push the label to the start instead of centring it. */\n align?: \"center\" | \"start\";\n className?: string;\n}\n\n/**\n * A hairline that separates two runs of content, optionally naming the run that\n * follows: day separators in a feed, group headings in search results.\n *\n * @example\n * ```tsx\n * <SectionDivider label=\"Gisteren\" />\n * <SectionDivider label=\"Gesprekken\" align=\"start\" trailing={<Badge>12</Badge>} />\n * ```\n */\nexport function SectionDivider({ label, trailing, align = \"center\", className }: SectionDividerProps) {\n const rule = <span className=\"h-px flex-1 bg-border-subtle\" aria-hidden />;\n\n if (!label && !trailing) {\n return <div className={cn(\"flex items-center py-2\", className)}>{rule}</div>;\n }\n\n return (\n <div className={cn(\"flex items-center gap-3 py-2\", className)}>\n {align === \"center\" && rule}\n <span className=\"shrink-0 text-xs font-medium text-text-muted\">{label}</span>\n {rule}\n {trailing && <span className=\"shrink-0\">{trailing}</span>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Icon } from \"./Icon\";\n\nexport interface SettingsRowProps {\n /** What the setting is called. */\n label: React.ReactNode;\n /** One line on what it does or what turning it on means. */\n description?: React.ReactNode;\n /** The control itself — a `Switch`, `Select`, `Button`… */\n control: React.ReactNode;\n /**\n * Draw the row as a bordered pill. Use it for a flat list of independent\n * toggles; leave it off inside a `SettingsSection`, which already groups.\n */\n bordered?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * One setting: label (+ description) on the left, its control on the right.\n *\n * @example\n * ```tsx\n * <SettingsRow\n * label=\"Agenda synchroniseren\"\n * description=\"Afspraken uit dit account verschijnen in je agenda.\"\n * control={<Switch checked={on} onChange={setOn} aria-label=\"Agenda synchroniseren\" />}\n * />\n * ```\n */\nexport function SettingsRow({\n label,\n description,\n control,\n bordered = false,\n disabled = false,\n className,\n}: SettingsRowProps) {\n return (\n <div\n className={cn(\n \"flex items-center justify-between gap-4 py-2\",\n bordered && \"rounded-lg border border-border px-3\",\n disabled && \"opacity-50\",\n className\n )}\n >\n <div className=\"min-w-0\">\n <div className=\"text-sm text-text\">{label}</div>\n {description && (\n <div className=\"text-xs text-text-muted\">{description}</div>\n )}\n </div>\n <div className=\"shrink-0\">{control}</div>\n </div>\n );\n}\n\nexport interface SettingsSectionProps {\n /** Lucide icon component, rendered in the section heading. */\n icon?: React.ComponentType<Record<string, unknown>>;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Right-aligned slot in the heading, e.g. a \"Reset\" button. */\n actions?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * A titled group of `SettingsRow`s. The body is indented to line up under the\n * title text rather than the icon.\n */\nexport function SettingsSection({\n icon,\n title,\n description,\n actions,\n children,\n className,\n}: SettingsSectionProps) {\n return (\n <section className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex items-start gap-2\">\n {icon && <Icon icon={icon} size=\"md\" color=\"secondary\" className=\"mt-0.5\" />}\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text\">{title}</h3>\n {description && (\n <p className=\"text-xs text-text-muted\">{description}</p>\n )}\n </div>\n {actions && <div className=\"shrink-0\">{actions}</div>}\n </div>\n <div className={cn(\"flex flex-col\", icon && \"pl-6\")}>{children}</div>\n </section>\n );\n}\n","import React from \"react\";\nimport { ArrowUpRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { Icon } from \"./Icon\";\n\nexport interface SourceChipProps {\n /** Label — the linked conversation subject. */\n label: React.ReactNode;\n /** Optional leading dot colour (a `--color-cat-*` or channel CSS var). */\n dotColor?: string;\n /** Click opens the linked conversation. */\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * Source-conversation chip — the \"open brongesprek / gekoppeld gesprek ↗\" pill\n * that links a task or focus item back to its conversation.\n *\n * @example\n * ```tsx\n * <SourceChip label=\"Vraag over factuur maart\" dotColor=\"var(--color-cat-2)\" onClick={openThread} />\n * ```\n */\nexport function SourceChip({ label, dotColor, onClick, className }: SourceChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"inline-flex max-w-full items-center gap-1.5 rounded-full bg-surface-sunk px-2.5 py-1 text-xs text-text-muted transition-colors duration-fast ease-out hover:bg-surface-hover hover:text-text\",\n className,\n )}\n >\n {dotColor && (\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full\" style={{ backgroundColor: dotColor }} aria-hidden />\n )}\n <span className=\"min-w-0 truncate\">{label}</span>\n <Icon icon={ArrowUpRight} size=\"xs\" className=\"opacity-70\" />\n </button>\n );\n}\n","import React, { useCallback } from \"react\";\nimport { Text } from \"../typography/Text\";\nimport { cn } from \"../utils/cn\";\n\nexport type ViewFieldType =\n | \"text\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"radio\"\n | \"date\"\n | \"custom\"\n | \"array\";\n\ntype NestedKeys<T> = {\n [K in keyof T]: T[K] extends object\n ? `${K & string}.${NestedKeys<T[K]>}`\n : K & string;\n}[keyof T];\n\nfunction getValueByPath<T>(obj: T, path: string): unknown {\n return path\n .split(\".\")\n .reduce(\n (acc, key) =>\n acc && typeof acc === \"object\" && key in acc\n ? (acc as any)[key]\n : undefined,\n obj\n );\n}\n\nexport interface ViewGroupItem<T = any> {\n /** Field name (key in data) */\n name: NestedKeys<T>;\n /** Field label */\n label: string;\n /** Field type */\n type: ViewFieldType;\n /** Field width (CSS width value or grid columns) */\n width?: string | number;\n /** Options for select/radio/checkbox types */\n options?: Array<{\n value: string | number;\n label: string;\n }>;\n /** Conditional function to show/hide field */\n conditional?: (data: T) => boolean;\n /** Whether field is hidden */\n hidden?: boolean;\n /** Custom component renderer */\n customComponent?: (props: { value: any }) => React.ReactNode;\n /** Format function for display value */\n format?: (value: any, data: T) => string | React.ReactNode;\n\n /** For 'array' type, defines the fields for each item in the array */\n arrayFields?: ViewGroupItem<any>[];\n}\n\nexport interface ViewGroup<T = any> {\n /** Group identifier */\n id: string;\n /** Group title */\n title: string;\n /** Group description */\n description?: string;\n /** Group items */\n items: ViewGroupItem<T>[];\n /** Conditional function to show/hide group */\n conditional?: (data: T) => boolean;\n /** Group layout */\n layout?: \"grid\" | \"flex\";\n /** Number of columns for grid layout */\n columns?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface ViewProps<T = Record<string, any>> {\n /** View groups */\n groups: ViewGroup<T>[];\n /** Data to display */\n data: T;\n /** View size */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Generic View component with groups and conditional rendering\n * Displays data in a read-only format matching the Form component layout\n */\nexport const View = <T extends Record<string, any>>({\n groups,\n data,\n size = \"md\",\n className,\n}: ViewProps<T>) => {\n // Format date for display\n const formatDate = (value: any): string => {\n if (!value) return \"-\";\n try {\n const date = new Date(value);\n return date.toLocaleDateString(\"nl-NL\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n } catch {\n return String(value);\n }\n };\n\n // Format checkbox value\n const formatCheckbox = (value: any): string => {\n return value ? \"Ja\" : \"Nee\";\n };\n\n // Get display value for select/radio options\n const getOptionLabel = (\n value: any,\n options?: Array<{ value: string | number; label: string }>\n ): string => {\n if (!options) return String(value || \"-\");\n const option = options.find((opt) => opt.value === value);\n return option ? option.label : String(value || \"-\");\n };\n\n // Render a single field\n const renderField = useCallback(\n (item: ViewGroupItem<T>) => {\n const value = getValueByPath(data, item.name as string);\n\n // Handle array type\n if (item.type === \"array\") {\n const arrayValue = value as any[] | undefined;\n if (!arrayValue || arrayValue.length === 0) {\n return (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text-muted\"\n >\n Geen items\n </Text>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n {arrayValue.map((row, index) => (\n <div\n key={index}\n className=\"p-4 border border-border rounded-xl space-y-3\"\n >\n <div className=\"flex items-center justify-between\">\n <Text\n variant=\"label\"\n size=\"sm\"\n weight=\"medium\"\n className=\"text-text-muted\"\n >\n {item.label} {index + 1}\n </Text>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n {item.arrayFields?.map((subField) => {\n const subValue = row?.[subField.name];\n let displayValue: React.ReactNode = \"-\";\n\n switch (subField.type) {\n case \"text\":\n case \"email\":\n case \"number\":\n case \"tel\":\n case \"url\":\n case \"textarea\":\n displayValue = subValue || \"-\";\n break;\n case \"select\":\n case \"radio\":\n displayValue = getOptionLabel(\n subValue,\n subField.options\n );\n break;\n case \"checkbox\":\n displayValue = formatCheckbox(subValue);\n break;\n case \"date\":\n displayValue = formatDate(subValue);\n break;\n case \"custom\":\n displayValue = subField.customComponent?.({\n value: subValue,\n });\n break;\n default:\n displayValue = String(subValue || \"-\");\n }\n\n if (subField.format) {\n displayValue = subField.format(subValue, row);\n }\n\n return (\n <div key={subField.name as string} className=\"space-y-1\">\n <Text\n variant=\"label\"\n size=\"xs\"\n className=\"text-text-muted\"\n >\n {subField.label}\n </Text>\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text\"\n >\n {displayValue}\n </Text>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n // Handle custom component\n if (item.type === \"custom\" && item.customComponent) {\n return item.customComponent({ value });\n }\n\n // Handle format function\n if (item.format) {\n const formatted = item.format(value, data);\n return (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text\"\n >\n {formatted}\n </Text>\n );\n }\n\n // Default rendering based on type\n let displayValue: React.ReactNode = \"-\";\n\n switch (item.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"number\":\n case \"tel\":\n case \"url\":\n displayValue = value ? String(value) : \"-\";\n break;\n\n case \"textarea\":\n displayValue = value ? (\n <div className=\"whitespace-pre-wrap\">{String(value || \"-\")}</div>\n ) : (\n \"-\"\n );\n break;\n\n case \"select\":\n case \"radio\":\n displayValue = getOptionLabel(value, item.options);\n break;\n\n case \"checkbox\":\n displayValue = formatCheckbox(value);\n break;\n\n case \"date\":\n displayValue = formatDate(value);\n break;\n\n default:\n displayValue = value ? String(value) : \"-\";\n }\n\n return (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text\"\n >\n {displayValue}\n </Text>\n );\n },\n [data]\n );\n\n // Render view group\n const renderGroup = useCallback(\n (group: ViewGroup<T>) => {\n // Check group conditional\n if (group.conditional && !group.conditional(data)) {\n return null;\n }\n\n const visibleItems = group.items.filter((item) => {\n if (item.hidden) return false;\n if (item.conditional && !item.conditional(data)) return false;\n return true;\n });\n\n if (visibleItems.length === 0) return null;\n\n const groupClasses = cn(\n \"space-y-4\",\n {\n \"grid gap-4\": group.layout === \"grid\",\n \"flex flex-wrap gap-4\": group.layout === \"flex\",\n },\n group.layout === \"grid\" && {\n \"grid-cols-1\": !group.columns || group.columns === 1,\n \"grid-cols-2\": group.columns === 2,\n \"grid-cols-3\": group.columns === 3,\n \"grid-cols-4\": group.columns === 4,\n },\n group.className\n );\n\n return (\n <div\n key={group.id}\n className=\"grid grid-cols-1 md:grid-cols-3 gap-8 p-6 border border-border rounded-xl\"\n >\n {/* Group Header */}\n <div className=\"md:col-span-1\">\n <Text\n variant=\"label\"\n size=\"lg\"\n weight=\"semibold\"\n className=\"text-text\"\n >\n {group.title}\n </Text>\n {group.description && (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-text-muted mt-1\"\n >\n {group.description}\n </Text>\n )}\n </div>\n\n {/* Group Items */}\n <div className=\"md:col-span-2\">\n <div className={groupClasses}>\n {visibleItems.map((item) => {\n return (\n <div\n key={item.name as string}\n className=\"space-y-1\"\n // Inline, not `w-[…]`/`col-span-…`: those are built at runtime,\n // so Tailwind never sees them and `width` silently did nothing.\n // Same fix Form.tsx already carries.\n style={{\n width: typeof item.width === \"string\" ? item.width : undefined,\n gridColumn:\n typeof item.width === \"number\"\n ? `span ${item.width} / span ${item.width}`\n : undefined,\n }}\n >\n {/* Field Label */}\n {item.type !== \"custom\" && (\n <Text\n variant=\"label\"\n size=\"sm\"\n className=\"font-medium text-text-muted\"\n >\n {item.label}\n </Text>\n )}\n\n {/* Field Value */}\n {renderField(item)}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n [data, renderField]\n );\n\n const viewClasses = cn(\n \"space-y-6\",\n {\n \"max-w-md\": size === \"sm\",\n \"max-w-2xl\": size === \"md\",\n \"max-w-4xl\": size === \"lg\",\n \"max-w-full\": size === \"full\",\n },\n className\n );\n\n return (\n <div className={viewClasses}>\n {/* View Groups */}\n <div className=\"space-y-8\">{groups.map(renderGroup)}</div>\n </div>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface MenuItem {\n icon?: React.ReactNode;\n label: string;\n count?: number;\n children?: MenuItem[];\n path?: string;\n /**\n * @deprecated Groepen klappen niet meer in — een sectie met children rendert\n * als kop met zijn items eronder. Blijft bestaan zodat bestaande call-sites\n * blijven compileren; de waarde wordt genegeerd.\n */\n defaultCollapsed?: boolean;\n}\n\ninterface SidebarMenuProps {\n title: string;\n actionIcons?: React.ReactNode[];\n items: MenuItem[];\n isSelectedHandler: (path: string | undefined) => boolean;\n onClick?: (path: string | undefined) => void;\n preMenuItemsComponent?: React.ReactNode;\n}\n\ntype SelectedHandler = (path: string | undefined) => boolean;\ntype ClickHandler = (path: string | undefined) => void;\n\nconst SidebarMenuItem: React.FC<{\n item: MenuItem;\n isSelectedHandler: SelectedHandler;\n onClick?: ClickHandler;\n depth?: number;\n}> = ({ item, isSelectedHandler, onClick, depth = 0 }) => {\n const hasChildren = Boolean(item.children && item.children.length > 0);\n const isSelected = isSelectedHandler ? isSelectedHandler(item.path) : false;\n\n // Een item met children is een sectie, geen bestemming: geen hover, geen\n // cursor, geen selectie — alleen een kop boven zijn items.\n if (hasChildren) {\n return (\n <li>\n <div\n className={cn(\n \"flex items-center gap-2 px-2 pt-4 pb-1 text-xs font-semibold uppercase tracking-label text-text-subtle\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.count !== undefined && item.count > 0 && (\n <span className=\"font-normal tabular-nums\">{item.count}</span>\n )}\n </div>\n <ul className=\"flex flex-col gap-0.5\">\n {item.children?.map((child, index) => (\n <SidebarMenuItem\n key={index}\n item={child}\n isSelectedHandler={isSelectedHandler}\n onClick={onClick}\n depth={depth + 1}\n />\n ))}\n </ul>\n </li>\n );\n }\n\n return (\n <li>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => item.path && onClick?.(item.path)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n item.path && onClick?.(item.path);\n }\n }}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-base no-underline\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-none focus-visible:focus-ring\",\n isSelected\n ? \"bg-accent-soft font-semibold text-accent\"\n : \"text-text-muted hover:bg-surface-hover hover:text-text\",\n )}\n >\n {item.icon && (\n <span className=\"flex w-5 shrink-0 items-center justify-center\">{item.icon}</span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.count !== undefined && item.count > 0 && (\n <span\n className={cn(\n \"shrink-0 text-xs tabular-nums\",\n isSelected\n ? \"rounded-full bg-accent px-2 font-semibold text-accent-fg\"\n : \"text-text-subtle\"\n )}\n >\n {item.count}\n </span>\n )}\n </div>\n </li>\n );\n};\n\n/**\n * Sidebar — appnaam met optioneel één icon-actie rechts, daarboven/onder een\n * vrije slot (zoek), dan de nav-items. Secties met children zijn koppen, geen\n * knoppen. Geen workspace-switcher en geen gebruikersvoet: accountzaken staan\n * in de topbar.\n */\nexport const SidebarMenu: React.FC<SidebarMenuProps> = ({\n title,\n actionIcons,\n items,\n isSelectedHandler,\n onClick,\n preMenuItemsComponent,\n}) => {\n return (\n <nav className=\"flex h-full shrink-0 flex-col p-3 pt-4\">\n <div className=\"flex items-center gap-2 px-2 pb-3\">\n <span className=\"min-w-0 flex-1 truncate text-lg font-semibold text-text\">\n {title}\n </span>\n {actionIcons && actionIcons.length > 0 && (\n <div className=\"flex shrink-0 items-center gap-1\">\n {actionIcons.map((icon, index) => (\n <span\n key={index}\n className={cn(\n \"flex h-control-sm w-7 cursor-pointer items-center justify-center rounded-md text-text-strong\",\n \"transition-colors duration-fast ease-out hover:bg-surface-hover hover:text-text-strong\",\n \"focus-visible:outline-none focus-visible:focus-ring\"\n )}\n >\n {icon}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {preMenuItemsComponent && <div className=\"px-1 pb-3\">{preMenuItemsComponent}</div>}\n\n <ul className=\"flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto\">\n {items.map((item, index) =>\n !item.path && !item.label && !item.children ? (\n <li key={index} aria-hidden className=\"h-4\" />\n ) : (\n <SidebarMenuItem\n key={index}\n item={item}\n isSelectedHandler={isSelectedHandler}\n onClick={onClick}\n />\n )\n )}\n </ul>\n </nav>\n );\n};\n\nexport default SidebarMenu;\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface HeadingProps {\n /** Heading level */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** Visual size (can be different from semantic level) */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n /** Font weight */\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n /** Text color */\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current';\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n /** Whether to truncate text with ellipsis */\n truncate?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Child content */\n children: React.ReactNode;\n}\n\n/**\n * Heading — semantic level, visual size from the token scale.\n *\n * md 13 · lg 16 (section head) · xl 20 (detail title)\n * 2xl 24 (page title) · 3xl / 4xl 30 (display)\n *\n * Default weight is semibold: the system has no 700 headings.\n */\nconst sizeMap: Record<NonNullable<HeadingProps['size']>, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-3xl',\n};\n\nconst weightMap: Record<NonNullable<HeadingProps['weight']>, string> = {\n light: 'font-normal',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n};\n\nconst colorMap: Record<NonNullable<HeadingProps['color']>, string> = {\n primary: 'text-text',\n secondary: 'text-text-muted',\n accent: 'text-accent',\n success: 'text-success-fg',\n warning: 'text-warning-fg',\n error: 'text-danger-fg',\n info: 'text-info-fg',\n neutral: 'text-text',\n current: 'text-current',\n};\n\nconst alignMap: Record<NonNullable<HeadingProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n};\n\nexport const Heading: React.FC<HeadingProps> = ({\n level = 1,\n size,\n weight = 'semibold',\n color = 'current',\n align = 'left',\n truncate = false,\n className,\n children,\n ...props\n}) => {\n const Tag = `h${level}` as keyof React.JSX.IntrinsicElements;\n\n const headingClasses = cn(\n 'font-sans text-pretty',\n sizeMap[size || getDefaultSize(level)!],\n weightMap[weight],\n colorMap[color],\n alignMap[align],\n truncate && 'truncate',\n className\n );\n\n return (\n <Tag className={headingClasses} {...props}>\n {children}\n </Tag>\n );\n};\n\nfunction getDefaultSize(level: number): HeadingProps['size'] {\n const sizeMap: Record<number, HeadingProps['size']> = {\n 1: '2xl',\n 2: 'xl',\n 3: 'lg',\n 4: 'lg',\n 5: 'md',\n 6: 'md',\n };\n\n return sizeMap[level] || 'md';\n}\n","import { ChevronRight, Search } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\n// Define the types for the command palette\nexport interface Command {\n id: string;\n label: string;\n action?: () => void;\n subCommands?: Command[];\n icon?: React.ReactNode;\n}\n\nexport interface CommandPaletteProps {\n commands: Command[];\n isOpen: boolean;\n onClose: () => void;\n labels?: {\n searchPlaceholder?: string;\n navigate?: string;\n select?: string;\n close?: string;\n noCommandsFound?: string;\n };\n initialCommandPath?: string[];\n initialActiveIndex?: number;\n}\n\nconst CommandPalette: React.FC<CommandPaletteProps> = ({\n commands,\n isOpen,\n onClose,\n labels,\n initialCommandPath,\n initialActiveIndex,\n}) => {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [activeCommandPath, setActiveCommandPath] = useState<string[]>(initialCommandPath || []);\n const [activeIndex, setActiveIndex] = useState(initialActiveIndex || 0);\n const paletteRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const currentCommands = activeCommandPath.length\n ? commands.find((c) => c.id === activeCommandPath[0])?.subCommands || []\n : commands;\n\n const filteredCommands = currentCommands.filter((command) =>\n command.label.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n // Reset state when the palette is closed\n useEffect(() => {\n if (!isOpen) {\n setSearchTerm(\"\");\n setActiveCommandPath(initialCommandPath || []);\n setActiveIndex(initialActiveIndex || 0);\n }\n }, [isOpen]);\n\n // Handle keyboard navigation\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n if (event.key === \"Escape\") {\n onClose();\n } else if (event.key === \"ArrowUp\") {\n setActiveIndex((prevIndex) =>\n prevIndex > 0 ? prevIndex - 1 : filteredCommands.length - 1\n );\n } else if (event.key === \"ArrowDown\") {\n setActiveIndex((prevIndex) =>\n prevIndex < filteredCommands.length - 1 ? prevIndex + 1 : 0\n );\n } else if (event.key === \"Enter\") {\n const command = filteredCommands[activeIndex];\n if (command) {\n if (command.subCommands) {\n setActiveCommandPath([...activeCommandPath, command.id]);\n setActiveIndex(0);\n } else if (command.action) {\n command.action();\n onClose();\n }\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, onClose, filteredCommands, activeIndex, activeCommandPath]);\n\n // Handle clicks outside the palette to close it\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n paletteRef.current &&\n !paletteRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen, onClose]);\n\n // Keep active item visible while scrolling via keyboard\n useEffect(() => {\n if (!isOpen) return;\n const el = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${activeIndex}\"]`);\n el?.scrollIntoView({ block: \"nearest\" });\n }, [activeIndex, isOpen]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className=\"fixed inset-0 z-modal flex items-center justify-center bg-scrim\">\n <div\n className=\"flex flex-col w-full max-w-lg max-h-dialog p-2 mx-auto rounded-lg border border-border shadow-modal bg-surface\"\n ref={paletteRef}\n >\n <div className=\"flex items-center gap-2 px-3 flex-shrink-0\">\n <Search className=\"w-4 h-4 text-text-muted shrink-0\" />\n <input\n type=\"text\"\n autoFocus\n placeholder={labels?.searchPlaceholder || \"Search commands...\"}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"w-full border-0 bg-transparent py-2 text-text focus:outline-none\"\n />\n </div>\n <div\n ref={listRef}\n className=\"mt-2 pt-2 text-sm border-t border-border max-h-dialog-list overflow-y-auto\"\n >\n {filteredCommands.length === 0 && (\n <div className=\"text-text-muted text-center text-sm\">\n {labels?.noCommandsFound || \"No commands found\"}\n </div>\n )}\n {filteredCommands.map((command, index) => (\n <div\n key={command.id}\n data-index={index}\n className={`flex items-center p-2 cursor-pointer rounded-md ${index === activeIndex ? \"bg-accent-soft text-accent\" : \"text-text\"\n }`}\n onClick={() => {\n if (command.subCommands) {\n setActiveCommandPath([...activeCommandPath, command.id]);\n setActiveIndex(0);\n } else if (command.action) {\n command.action();\n onClose();\n }\n }}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {command.icon && <span className=\"mr-3\">{command.icon}</span>}\n <span className=\"flex-grow\">{command.label}</span>\n {command.subCommands && (\n <span className=\"text-text-muted\">\n <ChevronRight className=\"w-4 h-4\" />\n </span>\n )}\n </div>\n ))}\n </div>\n <div className=\"flex items-center gap-4 px-3 pt-2 mt-2 text-xs text-text-muted border-t border-border\">\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-5 px-1 py-0.5 rounded border border-border bg-surface-sunk text-xs font-medium not-italic\">↑↓</kbd>\n {labels?.navigate || \"to navigate\"}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-5 px-1 py-0.5 rounded border border-border bg-surface-sunk text-xs font-medium not-italic\">↵</kbd>\n {labels?.select || \"to select\"}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-5 px-1 py-0.5 rounded border border-border bg-surface-sunk text-xs font-medium not-italic\">Esc</kbd>\n {labels?.close || \"to close\"}\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CommandPalette;\n","import React, { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface BoxProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Padding size\n */\n padding?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n /**\n * Margin size\n */\n margin?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n /**\n * Background color\n */\n background?: 'none' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'white' | 'module' | 'module-subtle' | 'backdrop' | 'editor' | 'input';\n\n /**\n * Border radius\n */\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n /**\n * Shadow size\n */\n shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n /**\n * Border width\n */\n border?: 'none' | 'sm' | 'md' | 'lg';\n\n /**\n * Border color\n */\n borderColor?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'white';\n}\n\n/** 4px spacing scale only. */\nconst paddingMap = {\n none: 'p-0',\n xs: 'p-1',\n sm: 'p-2',\n md: 'p-4',\n lg: 'p-6',\n xl: 'p-8',\n '2xl': 'p-12',\n};\n\nconst marginMap = {\n none: 'm-0',\n xs: 'm-1',\n sm: 'm-2',\n md: 'm-4',\n lg: 'm-6',\n xl: 'm-8',\n '2xl': 'm-12',\n};\n\n/** Semantic surfaces — the legacy `module` names stay as aliases. */\nconst backgroundMap = {\n none: '',\n primary: 'bg-accent text-accent-fg',\n secondary: 'bg-surface-hover',\n accent: 'bg-accent-soft',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n error: 'bg-danger-soft',\n info: 'bg-info-soft',\n neutral: 'bg-surface-hover',\n white: 'bg-surface',\n module: 'bg-surface',\n 'module-subtle': 'bg-surface-sunk',\n backdrop: 'bg-page',\n editor: 'bg-surface',\n input: 'bg-surface-input',\n};\n\nconst radiusMap = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n full: 'rounded-full',\n};\n\n/**\n * Elevation: cards are defined by their border, not a shadow — `sm` is\n * intentionally flat. Shadows only mean \"this floats above the page\".\n */\nconst shadowMap = {\n none: 'shadow-none',\n sm: 'shadow-none',\n md: 'shadow-overlay',\n lg: 'shadow-overlay',\n xl: 'shadow-modal',\n '2xl': 'shadow-modal',\n};\n\nconst borderMap = {\n none: 'border-0',\n sm: 'border',\n md: 'border-2',\n lg: 'border-4',\n};\n\nconst borderColorMap = {\n primary: 'border-accent-border',\n secondary: 'border-border',\n accent: 'border-accent-border',\n success: 'border-success-border',\n warning: 'border-warning-border',\n error: 'border-danger-border',\n info: 'border-info-border',\n neutral: 'border-border-subtle',\n white: 'border-border-subtle',\n};\n\n/**\n * Box primitive component for layout and styling\n *\n * @example\n * ```tsx\n * <Box padding=\"md\" background=\"module\" radius=\"lg\" border=\"sm\" borderColor=\"neutral\">\n * Content\n * </Box>\n * ```\n */\nexport const Box = forwardRef<HTMLDivElement, BoxProps>(\n (\n {\n padding,\n margin,\n background,\n radius,\n shadow,\n border,\n borderColor,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n padding && paddingMap[padding],\n margin && marginMap[margin],\n background && backgroundMap[background],\n radius && radiusMap[radius],\n shadow && shadowMap[shadow],\n border && borderMap[border],\n borderColor && borderColorMap[borderColor],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nBox.displayName = 'Box';\n","import { Box, BoxProps } from \"./Box\";\n\nexport interface CardProps extends BoxProps {\n children: React.ReactNode;\n title?: string;\n}\n\n/**\n * Card — panel on a page background. Border, never a shadow (radius-lg = 12px).\n */\nexport const Card = ({ children, title, ...props }: CardProps) => {\n return (\n <Box\n background=\"module\"\n radius=\"lg\"\n shadow=\"none\"\n border=\"sm\"\n borderColor=\"neutral\"\n {...props}\n >\n {title && (\n <span className=\"mb-2 block text-sm font-semibold text-text\">{title}</span>\n )}\n {children}\n </Box>\n );\n};\n","import React, { useEffect, useRef, useState } from \"react\";\n\ninterface FederatedResourceProps {\n identifier: string;\n resourceLoader: () => Promise<any>;\n framework?: 'react' | 'svelte' | 'vanilla';\n fallback?: React.ReactNode;\n componentProps?: Record<string, any>;\n className?: string;\n}\n\nexport function FederatedResource({\n identifier,\n resourceLoader,\n framework = 'react',\n fallback,\n componentProps,\n className,\n}: FederatedResourceProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [ExternalComponent, setExternalComponent] = useState<any>(null);\n\n const svelteInstanceRef = useRef<any>(null);\n const vanillaCleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadResource = async () => {\n setIsLoading(true);\n try {\n const module = await resourceLoader();\n if (!isMounted) return;\n\n const Component = module.component || module.default || module;\n\n if (framework === 'react') {\n setExternalComponent(() => Component);\n } else {\n setExternalComponent(() => module);\n }\n } catch (err) {\n console.error(`[FederatedResource] Load failed: ${identifier}`, err);\n } finally {\n if (isMounted) setIsLoading(false);\n }\n };\n\n loadResource();\n return () => { isMounted = false; };\n }, [identifier, resourceLoader]);\n\n useEffect(() => {\n if (isLoading || !ExternalComponent || framework === 'react') return;\n\n const target = containerRef.current;\n if (!target) return;\n\n if (framework === 'svelte') {\n const Component = ExternalComponent.default || ExternalComponent;\n const instance = new Component({ target, props: componentProps || {} });\n svelteInstanceRef.current = instance;\n return () => instance.$destroy();\n }\n\n if (ExternalComponent.mount) {\n const cleanup = ExternalComponent.mount({ container: target, props: componentProps || {} });\n return () => {\n if (typeof cleanup === 'function') cleanup();\n else ExternalComponent.unmount?.(target);\n };\n }\n }, [ExternalComponent, framework, isLoading]);\n\n useEffect(() => {\n if (framework === 'svelte' && svelteInstanceRef.current) {\n svelteInstanceRef.current.$set?.(componentProps);\n }\n }, [componentProps, framework]);\n\n return (\n <div ref={containerRef} className={className} style={{ display: 'contents' }}>\n {isLoading && fallback}\n\n {framework === 'react' && ExternalComponent && (\n <ExternalComponent {...componentProps} />\n )}\n </div>\n );\n}","import type { ErrorInfo, ReactNode } from \"react\";\nimport { Component } from \"react\";\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n name?: string;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n error: null,\n };\n\n public static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(`[ErrorBoundary] Error in ${this.props.name || 'Component'}:`, error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-4 m-4 border border-danger-border bg-danger-soft rounded-lg\">\n <h2 className=\"text-lg font-semibold text-danger-fg\">Something went wrong</h2>\n <p className=\"text-sm text-danger-fg mt-1\">\n {this.props.name ? `Error in ${this.props.name}` : 'The component failed to render.'}\n </p>\n <button\n className=\"mt-4 px-4 py-2 bg-danger text-on-error rounded hover:opacity-90 transition-opacity text-sm\"\n onClick={() => this.setState({ hasError: false, error: null })}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"names":["cn","inputs","clsx","createVariants","variants","variant","value","createSizes","sizes","size","MeetingGrid","tiles","pinned","className","jsx","t","i","cols","ParticipantTile","name","avatarUrl","muted","speaking","hasVideo","videoSlot","fill","jsxs","VideoOff","User","MicOff","Mic","VideoSurface","attach","active","mirrored","ref","useRef","useEffect","cleanup","buttonVariants","buttonSizes","iconOnlySizes","Button","forwardRef","fullWidth","loading","leftIcon","rightIcon","iconOnly","shape","children","disabled","props","isDisabled","ButtonGroup","orientation","attached","baseClasses","colorMap","Icon","IconComponent","color","clickable","onClick","ariaLabel","sizeValue","getSizeValue","iconClasses","iconProps","e","tones","FilterChip","label","icon","tone","caret","onClear","clearLabel","title","showClear","radius","shell","body","Fragment","ChevronDown","bodyClasses","X","sizeMap","buttonBackgroundMap","Link","external","href","target","rel","isExternal","linkProps","ExternalLink","SegmentedToggle","options","onChange","opt","useAnchoredPosition","open","anchorRef","gap","matchWidth","placement","style","setStyle","useState","useLayoutEffect","place","anchor","rect","spaceBelow","spaceAbove","wantsTop","flip","onTop","next","Popover","trigger","rootClassName","triggerClassName","triggerLabel","isOpen","setIsOpen","rootRef","triggerRef","panelStyle","onDown","event","onEsc","handleToggle","close","variantStyles","chevronSizes","SplitButton","menuPlacement","menuLabel","hasMenu","option","checkboxSizes","rowSizes","labelSizes","Checkbox","helperText","error","indeterminate","containerClassName","labelClassName","id","reactId","React","checkboxId","hasError","innerRef","setRefs","node","CalendarIcon","Calendar","ChevronLeftIcon","ChevronLeft","ChevronRightIcon","ChevronRight","DatePicker","placeholder","required","minDate","maxDate","format","withTime","currentMonth","setCurrentMonth","containerRef","fieldRef","handleClickOutside","formatDate","date","day","month","year","datePart","formatTime","handleTimeChange","hours","minutes","base","getCalendarDays","firstDay","startDate","days","current","handleDateSelect","picked","handlePrevMonth","handleNextMonth","handleClear","inputClasses","calendarDays","monthNames","index","isCurrentMonth","isSelected","isToday","selectSizes","norm","s","Select","searchable","multiple","allowCreate","onCreateOption","selectId","searchTerm","setSearchTerm","localOptions","setLocalOptions","includesOption","opts","needle","o","ensureValuesInOptions","baseOptions","currentValue","out","addIfMissing","v","val","prev","handleSelect","optionValue","currentValues","newValues","selectedOption","selectedOptions","filteredOptions","canCreate","createOption","labelToCreate","clean","newOption","getDisplayValue","ChevronDownIcon","inputSizes","fieldLabelClasses","TextField","startIcon","endIcon","inputId","describedBy","FolderSelect","onListFolders","templatePlaceholder","showTemplate","folders","setFolders","res","f","classes","SearchIcon","Search","iconSizes","SearchableTextField","externalLoading","onRemoteSearch","onSelect","debounceTime","showAllOnOpen","propValue","inputRef","inputValue","setInputValue","isSearchingRemote","setIsSearchingRemote","typedSinceOpen","setTypedSinceOpen","useMemo","lowerCaseInput","handler","handleChange","newValue","handleFocus","showDropdown","resolvedRef","Loader2","Switch","checked","track","ContentLoading","showTableSkeleton","tableColumns","tableRows","Shell","inner","_","idx","rowIdx","colIdx","Dropdown","showCheck","header","hoveredOption","setHoveredOption","submenuPosition","setSubmenuPosition","dropdownRef","submenuRef","menuRef","menuPos","hideTimeoutRef","menuItems","handleMenuKeyDown","items","handleEscape","hoveredElement","handleTriggerClick","handleOptionClick","parentValue","handleOptionHover","handleOptionLeave","handleSubmenuOptionClick","dropdownClasses","submenuClasses","hasChildren","isHovered","Check","childOption","childIndex","totalOptions","count","childCount","child","ChevronUpIcon","ChevronUp","ChevronsLeftIcon","ChevronsLeft","ChevronsRightIcon","ChevronsRight","ChevronDownSmallIcon","FilterDropdown","Table","data","columns","searchPlaceholder","filters","paginated","pageSizeOptions","defaultPageSize","actions","onRowClick","selectable","selectedRows","onSelectionChange","getRowKey","row","emptyContent","hoverable","bordered","striped","rowClassName","sortState","setSortState","pagination","setPagination","tableRef","filteredData","result","searchableColumns","col","lowerSearchTerm","column","filter","sortedData","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSort","useCallback","columnId","handlePageChange","newPage","handlePageSizeChange","newPageSize","handleRowSelection","rowKey","r","handleSelectAll","totalItems","totalPages","startItem","endItem","allVisibleSelected","selectedRow","someVisibleSelected","tableClasses","headerClasses","cellClasses","rowClasses","el","action","actionId","TabsContext","createContext","TabBar","activeTab","onTabChange","internalActiveTab","setInternalActiveTab","currentActiveTab","handleTabClick","tabId","item","Tabs","defaultTab","handleTabChange","contextValue","activeTabItem","tabListClasses","tabClasses","isActive","sizeClasses","variantClasses","stateClasses","activeClasses","inactiveClasses","modalSizes","Modal","onClose","closeOnBackdropClick","closeOnEscape","backdropClassName","footer","showCloseButton","modalRef","previousActiveElement","handleBackdropClick","weightMap","alignMap","lineHeightMap","Text","weight","align","truncate","italic","underline","lineHeight","as","Tag","getDefaultElement","isCaption","isLabel","isCode","textClasses","StorageInput","accept","onListFiles","onListMounts","onUploadFile","onDownloadFile","onRegisterFile","isModalOpen","setIsModalOpen","mounts","setMounts","selectedMount","setSelectedMount","currentPath","setCurrentPath","remoteFiles","setRemoteFiles","setLoading","selectedPointer","setSelectedPointer","isCreatingFolder","setIsCreatingFolder","newFolderName","setNewFolderName","fileInputRef","loadMounts","loadFiles","resp","err","handleLocalOnlySelection","file","buffer","content","virtualPointer","handleUploadToStorage","pointer","handleCreateFolder","fullPath","handleSelectRemote","explorerItems","files","path","parts","p","handleFolderClick","folderName","handleGoBack","tableData","explorerColumns","Folder","FileText","mountColumns","HardDrive","ArrowLeft","FolderPlus","Upload","textareaSizes","TextArea","rows","textareaId","getValueByPath","obj","acc","key","setValueByPath","keys","clone","cur","k","unsetByPath","Form","groups","externalData","onSubmit","onCancel","transform","validate","submitButton","cancelButton","showButtons","layout","sdk","formData","setFormData","errors","setErrors","touched","setTouched","validateField","currentData","field","group","arrayErrors","hasErrors","rowErrors","subField","subFieldValue","handleFieldChange","newData","g","handleSubmit","newErrors","allFields","formErrors","finalData","renderField","commonProps","payload","fileId","arrayValue","handleAddItem","handleRemoveItem","handleSubFieldChange","fieldName","fieldValue","newArray","subFieldError","commonSubFieldProps","dateValue","Trash2","Plus","renderGroup","visibleItems","groupClasses","formClasses","buttonSize","ConfirmDialog","description","confirmLabel","cancelLabel","onConfirm","badgeVariants","badgeSizes","dotColors","Badge","dot","dismissible","onDismiss","toneDisc","EmptyState","card","Kbd","trackSizes","fillVariants","ProgressBar","pct","spinnerSizes","spinnerColors","Spinner","showLabel","StatusDot","pulse","StepIndicator","steps","activeIndex","shared","step","AssistantCard","Sparkles","initials","Avatar","src","errored","setErrored","RING","OWNER_RING","AvatarStack","people","max","shown","overflow","CH","ChannelBadge","channel","Image","alt","aspectRatio","showLoading","showError","fallback","loadingContent","errorContent","onLoad","onError","isLoading","setIsLoading","setHasError","currentSrc","setCurrentSrc","handleLoad","handleError","containerClasses","imageClasses","placeholderClasses","defaultLoadingContent","defaultErrorContent","ImageOff","List","leading","renderItem","trailing","onActiveIndexChange","unread","dimmed","groupBy","renderGroupHeader","stickyGroupHeaders","collapsibleGroups","hideGroupCount","selectedItems","bulkActions","stickyHeader","loadingRows","collapsed","setCollapsed","handleKeyDown","keyOf","toggle","toggleAll","container","allSelected","someSelected","renderRow","firstInBlock","isUnread","isDimmed","selected","buckets","declared","groupIndex","isCollapsed","rowIndex","MessageBubble","side","continued","valueTone","cardTone","KpiCard","PageHeader","surface","subtitle","meta","backLabel","backClassName","onBack","editable","onTitleChange","isEditing","setIsEditing","editValue","setEditValue","handleTitleClick","handleBlur","Pencil","PageToolbar","SectionDivider","rule","SettingsRow","control","SettingsSection","SourceChip","dotColor","ArrowUpRight","View","formatCheckbox","getOptionLabel","subValue","displayValue","formatted","viewClasses","SidebarMenuItem","isSelectedHandler","depth","SidebarMenu","actionIcons","preMenuItemsComponent","Heading","level","headingClasses","getDefaultSize","CommandPalette","commands","labels","initialCommandPath","initialActiveIndex","activeCommandPath","setActiveCommandPath","setActiveIndex","paletteRef","listRef","filteredCommands","c","command","prevIndex","paddingMap","marginMap","backgroundMap","radiusMap","shadowMap","borderMap","borderColorMap","Box","padding","margin","background","shadow","border","borderColor","Card","FederatedResource","identifier","resourceLoader","framework","componentProps","ExternalComponent","setExternalComponent","svelteInstanceRef","isMounted","module","Component","instance","ErrorBoundary","errorInfo"],"mappings":"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"}