@opencxh/ui-kit 3.98.0 → 3.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1622 -1412
- package/dist/index.js.map +1 -1
- package/dist/src/action/FilterChip.d.ts +26 -0
- package/dist/src/action/SegmentedToggle.d.ts +29 -0
- package/dist/src/content/AssistantCard.d.ts +24 -0
- package/dist/src/content/ChannelBadge.d.ts +25 -0
- package/dist/src/content/KpiCard.d.ts +19 -0
- package/dist/src/content/SourceChip.d.ts +20 -0
- package/dist/src/feedback/EmptyState.d.ts +27 -0
- package/dist/src/feedback/Kbd.d.ts +14 -0
- package/dist/src/feedback/ProgressBar.d.ts +20 -0
- package/dist/src/index.d.ts +9 -0
- package/package.json +1 -1
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/action/Link.tsx","../src/overlays/Popover.tsx","../src/action/SplitButton.tsx","../src/input/Checkbox.tsx","../src/input/DatePicker.tsx","../src/input/SearchableTextField.tsx","../src/input/Select.tsx","../src/input/TextArea.tsx","../src/input/TextField.tsx","../src/content/Icon.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/FolderSelect.tsx","../src/forms/Form.tsx","../src/feedback/Badge.tsx","../src/feedback/Spinner.tsx","../src/content/Avatar.tsx","../src/content/AvatarStack.tsx","../src/content/Image.tsx","../src/content/PageHeader.tsx","../src/content/PageToolbar.tsx","../src/content/View.tsx","../src/navigation/Sidebar.tsx","../src/typography/Heading.tsx","../src/typography/List.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-[160px] 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-gray-800 flex items-center justify-center\",\n fill ? \"h-full w-full\" : \"aspect-video\",\n speaking && \"ring-2 ring-emerald-400\",\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-gray-700 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-black/50 text-white text-xs\">\n {muted ? <MicOff className=\"w-3 h-3\" /> : <Mic className=\"w-3 h-3\" />}\n <span className=\"truncate max-w-[140px]\">{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-gray-900 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';\n\n /**\n * The size of the button\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '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\nconst buttonVariants = {\n primary: 'btn o__primary',\n secondary: 'btn o__secondary',\n outline: 'btn o__secondary',\n ghost: 'btn o__tertiary',\n destructive: 'btn o__destructive',\n};\n\nconst buttonSizes = {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-6 py-3 text-base',\n xl: 'px-8 py-4 text-lg',\n full: 'px-4 py-3 text-base',\n};\n\nconst iconOnlySizes = {\n xs: 'p-1',\n sm: 'p-1.5',\n md: 'p-2',\n lg: 'p-3',\n xl: 'p-4',\n full: 'p-4',\n};\n\n/**\n * Button component with theme integration and multiple variants\n * \n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">\n * Click me\n * </Button>\n * \n * <Button variant=\"outline\" leftIcon={<PlusIcon />}>\n * Add item\n * </Button>\n * \n * <Button iconOnly variant=\"ghost\" size=\"sm\">\n * <SearchIcon />\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 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 // Base styles — radius/focus/colors come from the token-driven `.btn o__*` CSS\n 'inline-flex items-center justify-center transition-colors duration-200',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Variant styles\n buttonVariants[variant],\n\n // Size styles\n iconOnly ? iconOnlySizes[size] : buttonSizes[size],\n\n // Full width\n fullWidth && 'w-full',\n\n // Loading state\n loading && 'cursor-wait',\n\n className\n )}\n disabled={isDisabled}\n {...props}\n >\n {loading && (\n <svg\n className={cn(\n 'animate-spin',\n iconOnly ? 'h-4 w-4' : 'h-4 w-4 mr-2'\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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\n {!loading && leftIcon && (\n <span className={cn('flex-shrink-0', !iconOnly && 'mr-2')}>\n {leftIcon}\n </span>\n )}\n\n {!iconOnly && children}\n\n {!loading && rightIcon && (\n <span className={cn('flex-shrink-0', !iconOnly && 'ml-2')}>\n {rightIcon}\n </span>\n )}\n\n {iconOnly && !loading && !leftIcon && !rightIcon && children}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button'; ","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 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/**\n * Link component with theme integration and accessibility features\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 // Auto-detect external links\n const isExternal = external || (href && (href.startsWith('http') || href.startsWith('mailto:')));\n \n const baseClasses = cn(\n // Base styles\n 'inline-flex items-center gap-1 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2',\n \n // Size variants\n {\n 'text-xs': size === 'xs',\n 'text-sm': size === 'sm',\n 'text-base': size === 'md',\n 'text-lg': size === 'lg',\n 'text-xl': size === 'xl',\n },\n \n // Color variants\n {\n // Primary\n 'text-primary hover:text-primary/80 focus:ring-primary/20': color === 'primary' && !disabled,\n // Secondary\n 'text-secondary hover:text-secondary/80 focus:ring-secondary/20': color === 'secondary' && !disabled,\n // Accent\n 'text-accent hover:text-accent/80 focus:ring-accent/20': color === 'accent' && !disabled,\n // Success\n 'text-success hover:text-success/80 focus:ring-success/20': color === 'success' && !disabled,\n // Warning\n 'text-warning hover:text-warning/80 focus:ring-warning/20': color === 'warning' && !disabled,\n // Error\n 'text-error hover:text-error/80 focus:ring-error/20': color === 'error' && !disabled,\n // Info\n 'text-info hover:text-info/80 focus:ring-info/20': color === 'info' && !disabled,\n // Neutral\n 'text-neutral hover:text-neutral/80 focus:ring-neutral/20': color === 'neutral' && !disabled,\n },\n \n // Variant styles\n {\n // Default - just colored text\n '': variant === 'default',\n \n // Subtle - muted colors\n 'text-opacity-70 hover:text-opacity-100': variant === 'subtle',\n \n // Underline - always underlined\n 'underline underline-offset-2 decoration-1 hover:decoration-2': variant === 'underline',\n \n // Button - looks like a button\n 'px-3 py-1.5 rounded-md bg-opacity-10 hover:bg-opacity-20': variant === 'button',\n 'bg-primary': variant === 'button' && color === 'primary',\n 'bg-secondary': variant === 'button' && color === 'secondary',\n 'bg-accent': variant === 'button' && color === 'accent',\n 'bg-success': variant === 'button' && color === 'success',\n 'bg-warning': variant === 'button' && color === 'warning',\n 'bg-error': variant === 'button' && color === 'error',\n 'bg-info': variant === 'button' && color === 'info',\n 'bg-neutral': variant === 'button' && color === 'neutral',\n },\n \n // Disabled state\n {\n 'opacity-50 cursor-not-allowed pointer-events-none': disabled,\n },\n \n className\n );\n\n // Handle external link props\n const linkProps = {\n ...props,\n href: disabled ? undefined : href,\n target: isExternal ? '_blank' : target,\n rel: isExternal ? 'noopener noreferrer' : rel,\n };\n\n return (\n <a className={baseClasses} {...linkProps}>\n {children}\n {isExternal && (\n <svg\n className=\"w-3 h-3 ml-1\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n </a>\n );\n}; ","import React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\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 */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Additional CSS classes for the panel */\n className?: 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 disabled = false,\n triggerLabel,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [panelPos, setPanelPos] = useState<React.CSSProperties>({});\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\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 if (!isOpen) {\n const r = triggerRef.current?.getBoundingClientRect();\n if (r) {\n const gap = 6;\n const pos: React.CSSProperties = {};\n if (placement.startsWith(\"bottom\")) pos.top = r.bottom + gap;\n else pos.bottom = window.innerHeight - r.top + gap;\n if (placement.endsWith(\"start\")) pos.left = r.left;\n else pos.right = window.innerWidth - r.right;\n setPanelPos(pos);\n }\n }\n setIsOpen((open) => !open);\n };\n\n const close = () => setIsOpen(false);\n\n return (\n <div ref={rootRef} className=\"relative inline-flex\">\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(\"inline-flex items-center\", disabled && \"opacity-50 cursor-not-allowed\")}\n >\n {trigger}\n </button>\n\n {isOpen && (\n <div\n className={cn(\n \"fixed z-[60] bg-module rounded-lg shadow-lg border border-neutral\",\n className,\n )}\n style={panelPos}\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\nconst variantStyles = {\n primary: \"btn o__primary\",\n secondary: \"btn o__secondary\",\n outline: \"btn o__secondary\",\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-[200px] py-1\"\n trigger={\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex items-center justify-center transition-colors duration-200\",\n variantStyles[variant],\n size === \"sm\" ? \"px-1.5 py-1.5\" : \"px-2 py-2\",\n \"!rounded-l-none\",\n )}\n >\n <ChevronDown className=\"h-4 w-4\" />\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-2 text-left text-sm transition-colors\",\n option.variant === \"destructive\"\n ? \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900\"\n : \"text-default hover:bg-neutral-container\",\n )}\n >\n {option.icon && (\n <span className=\"flex-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\nconst checkboxSizes = {\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\nconst labelSizes = {\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n full: 'text-base',\n};\n\n/**\n * Checkbox component with theme integration\n * \n * @example\n * ```tsx\n * <Checkbox label=\"Accept terms and conditions\" />\n * \n * <Checkbox \n * label=\"Subscribe to newsletter\" \n * helperText=\"You can unsubscribe at any time\"\n * />\n * \n * <Checkbox \n * label=\"Required field\" \n * error=\"This field is required\"\n * />\n * \n * <Checkbox \n * label=\"Select all\" \n * indeterminate={true}\n * />\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 checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\n\n // Handle indeterminate state\n React.useEffect(() => {\n if (ref && typeof ref === 'object' && ref.current) {\n ref.current.indeterminate = indeterminate;\n }\n }, [indeterminate, ref]);\n\n return (\n <div className={cn('flex flex-col', containerClassName)}>\n <div className=\"flex items-start\">\n <div className=\"flex items-center h-5\">\n <input\n ref={ref}\n id={checkboxId}\n type=\"checkbox\"\n className={cn(\n // Base styles\n 'rounded border transition-colors duration-200',\n 'focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Size styles\n checkboxSizes[size],\n\n // State styles — bg-input keeps the unchecked box mode-aware; the\n // checked fill is the forms-plugin `currentColor`. The plugin's\n // check glyph is white, so the fill must stay dark in both modes\n // (accent-fill would invert to near-white in dark → invisible check).\n hasError\n ? 'border-error [&:not(:checked)]:bg-[var(--base-input)] text-error focus:border-error focus:ring-error'\n : 'border-neutral [&:not(:checked)]:bg-[var(--base-input)] text-[#1a1a1a] focus:border-primary focus:ring-primary',\n\n className\n )}\n {...props}\n />\n </div>\n\n {label && (\n <div className=\"ml-3 flex-1\">\n <label\n htmlFor={checkboxId}\n className={cn(\n 'font-medium cursor-pointer',\n hasError ? 'text-error' : 'text-default',\n labelSizes[size],\n labelClassName\n )}\n >\n {label}\n </label>\n\n {helperText && !error && (\n <p className=\"mt-1 text-xs text-muted\">\n {helperText}\n </p>\n )}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-xs text-error\">\n {error}\n </p>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox'; ","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { cn } from '../utils/cn';\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\nconst CalendarIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n);\n\nconst ChevronLeftIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"m15 18-6-6 6-6\" />\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"m9 18 6-6-6-6\" />\n </svg>\n);\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}, ref) => {\n const [isOpen, setIsOpen] = useState(false);\n const [currentMonth, setCurrentMonth] = useState(() => value || new Date());\n const containerRef = useRef<HTMLDivElement>(null);\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 switch (format) {\n case 'dd/MM/yyyy':\n return `${day}/${month}/${year}`;\n case 'yyyy-MM-dd':\n return `${year}-${month}-${day}`;\n case 'MM/dd/yyyy':\n default:\n return `${month}/${day}/${year}`;\n }\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 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-neutral rounded-md transition-colors duration-200',\n 'bg-module text-default',\n 'placeholder:text-default dark:placeholder:text-muted',\n 'focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary',\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-module-subtle',\n {\n 'px-3 py-2 text-sm': size === 'sm',\n 'px-3 py-2 text-base': size === 'md',\n 'px-4 py-3 text-lg': size === 'lg',\n 'px-4 py-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 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-muted hover:text-muted\"\n >\n <CalendarIcon />\n </button>\n </div>\n\n {/* Calendar Popup */}\n {isOpen && (\n <div className=\"absolute z-50 mt-1 bg-module border border-neutral rounded-md shadow-lg p-4 min-w-[280px]\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-1 hover:bg-neutral-container rounded\"\n >\n <ChevronLeftIcon />\n </button>\n <h3 className=\"text-sm font-medium text-default\">\n {monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h3>\n <button\n onClick={handleNextMonth}\n className=\"p-1 hover:bg-neutral-container 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-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-200',\n {\n 'text-default hover:bg-neutral-container':\n isCurrentMonth && !isSelected && !isDisabled,\n 'bg-primary text-white': isSelected,\n 'bg-neutral-container text-default': isToday && !isSelected,\n 'text-muted cursor-not-allowed': isDisabled,\n }\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-between items-center mt-4 pt-3 border-t border-neutral\">\n <button\n onClick={handleClear}\n className=\"text-sm text-muted hover:text-default\"\n >\n Clear\n </button>\n <button\n onClick={() => setIsOpen(false)}\n className=\"text-sm text-primary hover:text-primary/80\"\n >\n Close\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}); ","import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst cn = (...classes: string[]) => classes.filter(Boolean).join(\" \");\n\nconst SearchIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.197 5.197a7.5 7.5 0 0 0 10.606 10.606Z\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"\n />\n </svg>\n);\n\nconst inputSizes = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-3 py-2 text-sm\",\n full: \"px-3 py-2 text-sm\",\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-error\" : \"text-default\",\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-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-lg border transition-colors duration-200 bg-input\",\n \"placeholder:text-[var(--text-muted)] focus:outline-none\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\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-red-500 text-error focus:border-red-500 focus:ring-red-500\"\n : \"border-neutral text-default\",\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 <svg\n className={cn(\"animate-spin text-link\", iconSizes[size])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 // Dropdown Chevron\n <ChevronDownIcon\n className={cn(\n \"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-module border border-neutral 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-default hover:bg-accent-container 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-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-error\" : \"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 dark:text-success\">\n Huidige zoekterm (niet-gedebounced): {String(inputValue)}\n </p>\n )}\n </div>\n );\n }\n);\n\nSearchableTextField.displayName = \"SearchableTextField\";\n","import { ChevronDownIcon } from \"lucide-react\";\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/cn\";\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: \"px-3 py-1.5 text-sm\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-3 py-2 text-sm\",\n full: \"px-3 py-2 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\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-sm font-medium mb-1\",\n hasError\n ? \"text-error\"\n : \"text-default\",\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <button\n type=\"button\"\n id={selectId}\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-lg border transition-colors duration-200 text-left\",\n \"focus:outline-none focus:ring-0 focus:ring-offset-0\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"bg-module\",\n selectSizes[size],\n hasError\n ? \"border-error text-error focus:border-error focus:ring-error\"\n : \"border-neutral text-default\",\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-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </button>\n\n {isOpen && (\n <div className=\"absolute z-10 mt-1 w-full rounded-md bg-module shadow-lg border border-neutral\">\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-default border-neutral focus:outline-none focus:ring-0\"\n )}\n />\n </div>\n )}\n\n {canCreate && (\n <div\n className={cn(\n \"px-4 py-2 text-sm cursor-pointer\",\n \"text-primary hover:bg-neutral-container\"\n )}\n onClick={() => createOption(searchTerm)}\n >\n +: “{searchTerm.trim()}”\n </div>\n )}\n\n <ul className=\"max-h-60 overflow-auto py-1\">\n {placeholder && !multiple && (\n <li\n className=\"px-4 py-2 text-sm text-muted cursor-pointer hover:bg-neutral-container\"\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 \"px-4 py-2 text-sm cursor-pointer\",\n \"text-default\",\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:bg-neutral-container\",\n isSelected && \"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-neutral [&:not(:checked)]:bg-[var(--base-input)] text-[#1a1a1a] focus:ring-primary\"\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-error\" : \"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 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-sm',\n lg: 'px-4 py-3 text-base',\n full: 'px-4 py-3 text-base',\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 textareaId = id || `textarea-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\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 'block text-sm font-medium mb-1',\n hasError ? 'text-error' : 'text-default',\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 className={cn(\n // Base styles\n 'block w-full rounded-lg border transition-colors duration-200 resize-vertical bg-input',\n 'placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-0',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Size styles\n textareaSizes[size],\n\n // State styles\n hasError\n ? 'border-error text-error focus:border-error focus:ring-error'\n : 'border-neutral text-default',\n\n className\n )}\n {...props}\n />\n\n {loading && (\n <div className=\"absolute top-3 right-3\">\n <svg\n className=\"animate-spin h-4 w-4 text-muted\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n className={cn(\n 'mt-1 text-xs',\n hasError ? 'text-error' : 'text-muted'\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea'; ","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\nconst inputSizes = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2 text-sm',\n lg: 'px-3 py-2 text-sm',\n full: 'px-3 py-2 text-sm',\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\n/**\n * TextField component with theme integration and validation states\n * \n * @example\n * ```tsx\n * <TextField\n * label=\"Email\"\n * placeholder=\"Enter your email\"\n * type=\"email\"\n * />\n * \n * <TextField\n * label=\"Search\"\n * startIcon={<SearchIcon />}\n * placeholder=\"Search...\"\n * />\n * \n * <TextField\n * label=\"Password\"\n * type=\"password\"\n * error=\"Password is required\"\n * />\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 inputId = id || `textfield-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\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 'block text-sm font-medium mb-1',\n hasError ? 'text-error' : 'text-default',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n {startIcon && (\n // Todo fix inset not showing correctly on different sizes\n <div className=\"absolute left-0 pl-3 flex items-center pointer-events-none h-full\">\n <span className={cn('text-muted', iconSizes[size])}>\n {startIcon}\n </span>\n </div>\n )}\n\n <input\n ref={ref}\n id={inputId}\n className={cn(\n // Base styles\n 'block w-full rounded-lg border transition-colors duration-200 bg-input',\n 'placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-offset-0',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Size styles\n inputSizes[size],\n\n // Icon padding\n startIcon && 'pl-10',\n endIcon && 'pr-10',\n\n // State styles\n hasError\n ? 'border-error text-error focus:border-error focus:ring-error'\n : 'border-neutral text-default focus:border-primary focus:ring-primary',\n\n className\n )}\n {...props}\n />\n\n {(endIcon || loading) && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center\">\n {loading ? (\n <svg\n className={cn('animate-spin text-muted', iconSizes[size])}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 endIcon && (\n <span className={cn('text-muted', iconSizes[size])}>\n {endIcon}\n </span>\n )\n )}\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n className={cn(\n 'mt-1 text-xs',\n hasError ? 'text-error' : 'text-muted'\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = 'TextField'; ","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 component that works with Lucide React icons and provides theme integration\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',\n \n // Color variants\n {\n 'text-primary': color === 'primary',\n 'text-secondary': color === 'secondary',\n 'text-accent': color === 'accent',\n 'text-success': color === 'success',\n 'text-warning': color === 'warning',\n 'text-error': color === 'error',\n 'text-info': color === 'info',\n 'text-neutral': color === 'neutral',\n 'text-current': color === 'current',\n },\n \n // Clickable styles\n {\n 'cursor-pointer hover:opacity-80 transition-opacity duration-200': clickable,\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary/20 rounded': clickable,\n },\n \n className\n );\n\n const iconProps = {\n size: sizeValue,\n className: iconClasses,\n onClick: clickable ? onClick : undefined,\n 'aria-label': ariaLabel,\n role: clickable ? 'button' : undefined,\n tabIndex: clickable ? 0 : undefined,\n onKeyDown: clickable ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\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: 16,\n md: 20,\n lg: 24,\n xl: 32,\n };\n \n return sizeMap[size];\n} ","import { ReactNode } from 'react';\n\ninterface ContentLoadingProps {\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 children,\n showTableSkeleton = false,\n tableColumns = 6,\n tableRows = 8,\n}: ContentLoadingProps) {\n if (children) {\n return (\n <main className=\"flex-1 bg-module p-6\">\n <div className=\"w-full max-w-6xl mx-auto animate-pulse\">\n {children}\n </div>\n </main>\n );\n }\n\n return (\n <main className=\"flex-1 bg-module p-6\">\n <div className=\"w-full mx-auto space-y-6 animate-pulse\">\n\n {/* Title Bar */}\n {!showTableSkeleton && (\n <>\n <div className=\"h-6 bg-neutral-container-emphasis rounded w-1/4\" />\n\n {/* Description Lines */}\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-neutral-container-emphasis rounded w-3/4\" />\n <div className=\"h-4 bg-neutral-container-emphasis rounded w-1/2\" />\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 grid-cols-${tableColumns} gap-2 bg-neutral-container p-3`}>\n {Array.from({ length: tableColumns }).map((_, idx) => (\n <div\n key={`header-${idx}`}\n className=\"h-4 bg-neutral-border-emphasis rounded w-2/3\"\n />\n ))}\n </div>\n\n {/* Table rows */}\n {Array.from({ length: tableRows }).map((_, rowIdx) => (\n <div\n key={`row-${rowIdx}`}\n className={`grid grid-cols-${tableColumns} gap-2 p-3 border-t border-neutral`}\n >\n {Array.from({ length: tableColumns }).map((_, colIdx) => (\n <div\n key={`cell-${rowIdx}-${colIdx}`}\n className=\"h-4 bg-neutral-container-emphasis rounded w-full\"\n />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n </main>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\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 [menuPos, setMenuPos] = useState<React.CSSProperties>({});\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const submenuRef = useRef<HTMLDivElement>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\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 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 if (!isOpen) {\n const r = triggerRef.current?.getBoundingClientRect();\n if (r) {\n const gap = 6;\n const pos: React.CSSProperties = {};\n if (placement.startsWith(\"bottom\")) pos.top = r.bottom + gap;\n else pos.bottom = window.innerHeight - r.top + gap;\n if (placement.endsWith(\"start\")) pos.left = r.left;\n else pos.right = window.innerWidth - r.right;\n setMenuPos(pos);\n }\n }\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-[60] min-w-[200px] bg-module rounded-md shadow-lg border border-neutral\",\n \"max-h-60 overflow-auto\"\n );\n\n const submenuClasses = cn(\n \"fixed z-[60] min-w-[200px] bg-module rounded-md shadow-lg border border-neutral\",\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-neutral-container\",\n className\n )}\n >\n {/* Trigger */}\n <button\n ref={triggerRef}\n onClick={handleTriggerClick}\n disabled={disabled}\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 className={dropdownClasses} style={menuPos}>\n <div className=\"p-2\">\n {/* Header */}\n {header && (\n typeof header === \"string\" ? (\n <div className=\"text-xs font-medium text-muted uppercase tracking-wider 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-neutral 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 onClick={(event) => handleOptionClick(event, option)}\n onMouseEnter={() => handleOptionHover(option)}\n onMouseLeave={() => handleOptionLeave(option)}\n disabled={option.disabled}\n className={cn(\n \"w-full flex items-center justify-between px-3 py-2 text-sm text-default hover:bg-neutral-container rounded-md transition-colors\",\n {\n \"opacity-50 cursor-not-allowed\": option.disabled,\n \"bg-neutral-container\":\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-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 <span className=\"h-4 w-4 text-success flex-shrink-0 text-sm font-bold\">\n ✓\n </span>\n )}\n {hasChildren && (\n <span className=\"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-neutral 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 \"w-full flex items-center justify-between px-3 py-2 text-sm text-default hover:bg-neutral-container rounded-md transition-colors\",\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-muted\">\n {childOption.description}\n </span>\n )}\n </div>\n </div>\n\n {showCheck && isSelected && (\n <span className=\"h-4 w-4 text-success flex-shrink-0 text-sm font-bold\">\n ✓\n </span>\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-neutral mt-2 pt-2\">\n <div className=\"text-xs 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 { Button } from \"../action/Button\";\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// Icon components as inline SVG\nconst SearchIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m21 21-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n);\n\nconst ChevronUpIcon = ({ active }: { active?: boolean }) => (\n <svg\n className={cn(\n \"h-3 w-3\",\n active ? \"text-default\" : \"text-muted\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m18 15-6-6-6 6\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = ({ active }: { active?: boolean }) => (\n <svg\n className={cn(\n \"h-3 w-3\",\n active ? \"text-default\" : \"text-muted\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m6 9 6 6 6-6\"\n />\n </svg>\n);\n\nconst ChevronLeftIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m15 18-6-6 6-6\"\n />\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m9 18 6-6-6-6\"\n />\n </svg>\n);\n\nconst ChevronsLeftIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m11 17-5-5 5-5m6 10-5-5 5-5\"\n />\n </svg>\n);\n\nconst ChevronsRightIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m7 17 5-5-5-5m6 10 5-5-5-5\"\n />\n </svg>\n);\n\nconst ChevronDownSmallIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m6 9 6 6 6-6\"\n />\n </svg>\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-[160px]\">\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-[160px] btn btn o__secondary\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center space-x-1 max-w-[240px]\">\n <div className=\"relative\">\n <details className=\"group\">\n <summary className=\"flex items-center space-x-2 cursor-pointer rounded-full px-3 py-2 text-sm btn btn o__secondary\">\n <span>{props.label}</span>\n <span className=\"text-default\">\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-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-module border border-neutral rounded-lg shadow-lvl-0 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-module-subtle text-sm text-default flex items-center space-x-2\"\n onClick={() => handleChange(option.value)}\n >\n <span\n className={cn(isSelected(option.value) && \"text-primary-500\")}\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-module-subtle text-sm text-default flex items-center space-x-2 mt-2\"\n onClick={() => handleChange(null)}\n >\n <span className=\"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-[var(--text-default)] border-collapse\",\n className\n );\n\n const headerClasses = cn(\"bg-[var(--base-module)]\");\n\n const cellClasses = cn(\n \"text-[var(--text-default)] p-3 border-b border-[var(--neutral-border)]\"\n );\n\n const rowClasses = cn(\"h-12\", {\n \"hover:bg-[var(--neutral-container)] dark:hover:bg-[var(--neutral-container-emphasis)]\":\n 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-[200px]\">\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-[400px]\">\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-neutral [&:not(:checked)]:bg-[var(--base-input)] text-[#1a1a1a]\"\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-[var(--text-muted)] dark:text-[var(--text-muted)] uppercase tracking-wider\",\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-module\":\n column.sticky === \"left\",\n \"sticky right-0 bg-module\":\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-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-container\": 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-neutral [&:not(:checked)]:bg-[var(--base-input)] text-[#1a1a1a]\"\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-module\":\n column.sticky === \"left\",\n \"sticky right-0 bg-module\":\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-muted hover:text-default\">\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-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-muted\">\n Rows per page:\n </span>\n <select\n value={pagination.pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n className=\"border border-[var(--neutral-border)] text-[var(--text-default)] rounded-md px-2 py-1 text-sm bg-[var(--base-input)] w-16\"\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-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-neutral-200 dark:border-neutral-700', 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-200',\n {\n 'border-primary text-primary': currentActiveTab === item.id,\n 'border-transparent text-neutral-500 hover:text-neutral-700 dark:text-neutral-400 dark:hover:text-neutral-300':\n currentActiveTab !== item.id && !item.disabled,\n 'border-transparent text-neutral-300 cursor-not-allowed dark:text-neutral-600': 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-primary/10 text-primary'\n : 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400'\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-neutral-200 dark:border-neutral-700 px-2': variant === 'default' || variant === 'underline',\n 'bg-neutral-100 dark:bg-neutral-800 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-200 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-primary text-primary': variant === 'default' || variant === 'underline',\n 'bg-white dark:bg-neutral-700 text-neutral-900 dark:text-neutral-100 shadow-sm': variant === 'pills',\n } : {};\n\n // Non-active, non-disabled state classes\n const inactiveClasses = !isActive && !item.disabled ? {\n 'border-transparent text-neutral-600 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-neutral-100': variant === 'default',\n 'text-neutral-600 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-neutral-100': variant === 'pills',\n 'border-transparent text-neutral-600 hover:text-neutral-900 hover:border-neutral-300 dark:text-neutral-400 dark:hover:text-neutral-100': 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-neutral-200 text-neutral-700 dark:bg-neutral-700 dark:text-neutral-300\">\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 { 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-50 flex items-center justify-center p-4',\n 'bg-black/20',\n // 'animate-fade-in',\n backdropClassName\n )}\n onClick={handleBackdropClick}\n >\n <div\n ref={modalRef}\n className={cn(\n 'relative w-full bg-module rounded-modal shadow-modal rounded-md',\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-default\"\n >\n {title}\n </span>\n )}\n \n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-muted hover:text-muted transition-colors\"\n aria-label=\"Close modal\"\n >\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\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 component with theme integration and typography variants\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 // Default element based on variant\n const defaultElement = as || getDefaultElement(variant);\n \n const textClasses = cn(\n // Base styles\n 'font-primary',\n \n // Variant styles\n {\n 'leading-relaxed': variant === 'body',\n 'text-sm leading-tight': variant === 'caption',\n 'text-sm font-medium leading-none': variant === 'label',\n 'font-mono text-sm bg-neutral-100 dark:bg-neutral-800 px-1 py-0.5 rounded': variant === 'code',\n },\n \n // Size variants (override variant sizes)\n variant !== 'code' && {\n 'text-xs': size === 'xs',\n 'text-sm': size === 'sm',\n 'text-base': size === 'md',\n 'text-lg': size === 'lg',\n 'text-xl': size === 'xl',\n },\n \n // Weight variants\n variant !== 'label' && {\n 'font-light': weight === 'light',\n 'font-normal': weight === 'normal',\n 'font-medium': weight === 'medium',\n 'font-semibold': weight === 'semibold',\n 'font-bold': weight === 'bold',\n },\n \n // Color variants. Tekst-tonen lopen via de semantische `--text-*` tokens\n // (gedefinieerd voor light én dark in global.css) zodat ze matchen met de\n // rest van de interface (zelfde tokens als bv. Table). De `--text-*` vars\n // worden in `.dark` overschreven, dus geen aparte `dark:`-varianten nodig.\n {\n 'text-primary': color === 'primary',\n 'text-secondary': color === 'secondary',\n 'text-[var(--text-accent)]': color === 'accent',\n 'text-[var(--text-success)]': color === 'success',\n 'text-warning': color === 'warning',\n 'text-[var(--text-error)]': color === 'error',\n 'text-info': color === 'info',\n 'text-[var(--text-default)]': color === 'neutral',\n 'text-current': color === 'current',\n 'text-[var(--text-muted)]': color === 'muted',\n },\n \n // Alignment\n {\n 'text-left': align === 'left',\n 'text-center': align === 'center',\n 'text-right': align === 'right',\n 'text-justify': align === 'justify',\n },\n \n // Line height (override variant line heights)\n variant === 'body' && {\n 'leading-tight': lineHeight === 'tight',\n 'leading-normal': lineHeight === 'normal',\n 'leading-relaxed': lineHeight === 'relaxed',\n },\n \n // Text decorations\n {\n 'italic': italic,\n 'underline': underline,\n 'truncate': truncate,\n },\n \n className\n );\n\n const Tag = defaultElement as keyof React.JSX.IntrinsicElements;\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} ","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-primary-400 bg-module\",\n error ? \"border-error\" : \"border-neutral\",\n disabled && \"opacity-50 cursor-not-allowed bg-module-subtle\"\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-default font-medium\">{selectedPointer.name}</span>\n ) : (\n <span className=\"text-sm text-muted\">{placeholder}</span>\n )}\n </div>\n\n {selectedPointer && !disabled && (\n <button\n onClick={handleClear}\n className=\"p-1 hover:bg-neutral-container rounded\"\n >\n <Icon icon={X} size=\"xs\" />\n </button>\n )}\n </div>\n\n {error && (\n <Text variant=\"body\" size=\"xs\" className=\"text-error\">\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-muted overflow-hidden bg-neutral-container px-2 py-1 rounded\">\n <span className=\"truncate\">{currentPath}</span>\n </div>\n\n <div className=\"flex-grow min-w-[150px]\">\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-module-subtle rounded-lg border border-neutral\">\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-[400px] overflow-auto rounded-lg border border-neutral\">\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-[400px] overflow-auto rounded-lg border border-neutral\">\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-neutral rounded-xl bg-module-subtle/50\">\n <div className=\"p-4 bg-primary/10 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-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 <div className={cn(\n \"inline-flex items-center justify-center font-medium rounded-lg transition-colors duration-200 px-6 py-3 text-base bg-primary text-white hover:bg-primary-600\",\n loading && \"opacity-50 cursor-wait\"\n )}>\n {loading && (\n <svg className=\"animate-spin h-4 w-4 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" 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 </svg>\n )}\n Browse Local File\n </div>\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 { 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 { FilePointer, InternalSDK, VirtualMount } from \"@opencxh/domain\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../action/Button\";\nimport { Checkbox } from \"../input/Checkbox\";\nimport { DatePicker } from \"../input/DatePicker\";\nimport { Select } from \"../input/Select\";\nimport { FolderSelect, type FolderDestination } from \"../input/FolderSelect\";\nimport { StorageInput } from \"../input/StorageInput\";\nimport { TextArea } from \"../input/TextArea\";\nimport { TextField } from \"../input/TextField\";\nimport { Text } from \"../typography/Text\";\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 console.log(\"handleSubmit\");\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 console.log(\"newErrors\", 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=\"space-y-1\">\n {item.options?.map((option) => (\n <label key={option.value} className=\"flex items-center gap-2\">\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=\"rounded-full border-neutral-100 dark:border-neutral-600\"\n />\n <Text variant=\"label\" size=\"sm\">\n {option.label}\n </Text>\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=\"space-y-2\">\n {arrayValue.map((row, index) => (\n <div\n key={index}\n className=\"p-4 border rounded-md dark:border-neutral-700 space-y-2 relative\"\n >\n <div className=\"absolute top-2 right-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleRemoveItem(index)}\n disabled={isDisabled}\n >\n Remove\n </Button>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\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=\"space-y-1\"\n >\n <label className=\"block\">\n <Text\n variant=\"label\"\n size=\"sm\"\n className=\"font-semibold text-neutral-700 dark:text-neutral-300\"\n >\n {subField.label}\n {subField.required && (\n <span className=\"text-red-500 ml-1\">*</span>\n )}\n </Text>\n </label>\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=\"space-y-1\">\n {subField.options?.map((option) => (\n <label\n key={option.value}\n className=\"flex items-center gap-2\"\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=\"rounded-full border-neutral-100 dark:border-neutral-600\"\n />\n <Text variant=\"label\" size=\"sm\">\n {option.label}\n </Text>\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 <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-red-600 dark:text-red-400\"\n >\n {subFieldError}\n </Text>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleAddItem}\n disabled={isDisabled}\n >\n Add {item.label}\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 \"space-y-2\",\n {\n \"grid gap-2\": group.layout === \"grid\",\n \"flex flex-wrap gap-2\": 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-neutral dark:border-neutral-700 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-neutral-900 dark:text-neutral-100\"\n >\n {group.title}\n </Text>\n {group.description && (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-neutral-600 dark:text-neutral-400 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 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 \"space-y-1\",\n item.width &&\n typeof item.width === \"string\" &&\n `w-[${item.width}]`,\n item.width &&\n typeof item.width === \"number\" &&\n `col-span-${item.width}`\n )}\n >\n {/* Field Label */}\n {item.type !== \"custom\" && (\n <label className=\"block\">\n <Text\n variant=\"label\"\n size=\"sm\"\n className=\"font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {item.label}\n {item.required && (\n <span className=\"text-red-500 ml-1\">*</span>\n )}\n </Text>\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 \"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 <form ref={ref} onSubmit={handleSubmit} className={formClasses}>\n {/* Form Groups */}\n <div className=\"space-y-8\">{groups.map(renderGroup)}</div>\n\n {/* Form Buttons */}\n {showButtons && (\n <div className={cn(\"flex gap-3 justify-end pt-8\")}>\n {onCancel && (\n <Button\n type=\"button\"\n variant={cancelButton.variant}\n size={cancelButton.size || size}\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 || size}\n disabled={submitButton.disabled || loading}\n loading={loading}\n className={submitButton.className}\n >\n {submitButton.label}\n </Button>\n </div>\n )}\n </form>\n );\n};\n","import React from 'react';\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';\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-neutral-container text-default',\n primary: 'bg-accent-container text-accent',\n secondary: 'bg-neutral-container text-muted',\n success: 'bg-success-container text-success',\n warning: 'bg-notice-container text-on-notice',\n error: 'bg-error-container text-error',\n info: 'bg-beta-container text-link',\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-neutral-fill',\n primary: 'bg-accent-fill',\n secondary: 'bg-neutral-fill',\n success: 'bg-success-fill',\n warning: 'bg-notice-fill',\n error: 'bg-error-fill',\n info: 'bg-beta-fill',\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 <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n )}\n </span>\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-primary',\n secondary: 'text-secondary-600',\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-secondary-600 dark:text-secondary-400',\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 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-[10px]\",\n sm: \"w-6 h-6 text-xs\",\n md: \"w-7 h-7 text-[13px]\",\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-neutral-border-emphasis text-default\",\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 = \"shadow-[0_0_0_2px_var(--base-module)]\";\nconst OWNER_RING = \"shadow-[0_0_0_2px_var(--base-module),0_0_0_3.5px_var(--accent-border)]\";\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-neutral-container text-muted\",\n size === \"xs\" ? \"w-5 h-5 text-[10px]\" : size === \"md\" ? \"w-7 h-7 text-[11px]\" : size === \"lg\" ? \"w-9 h-9 text-xs\" : \"w-6 h-6 text-[10px]\",\n RING,\n )}\n >\n +{overflow}\n </span>\n )}\n </span>\n );\n};\n","import React, { useState } from 'react';\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-neutral-100 dark:bg-neutral-800',\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-[3/4]': aspectRatio === 'portrait',\n 'aspect-[4/3]': 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-200',\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-neutral-400 dark:text-neutral-500'\n );\n\n const defaultLoadingContent = (\n <div className=\"animate-pulse\">\n <div className=\"w-6 h-6 bg-neutral-300 dark:bg-neutral-600 rounded\"></div>\n </div>\n );\n\n const defaultErrorContent = (\n <div className=\"text-center\">\n <svg\n className=\"w-6 h-6 mx-auto mb-1\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\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 { ArrowLeft, Pencil } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { SplitButton, type SplitButtonOption } from \"../action/SplitButton\";\nimport { cn } from \"../utils/cn\";\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 */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\";\n /** Whether action is disabled */\n disabled?: boolean;\n /** Dropdown options for split button */\n splitOptions?: SplitButtonOption[];\n}\n\nexport interface PageHeaderProps {\n /** Page title */\n title: string;\n /** Page subtitle/description */\n subtitle?: string;\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 = () => {\n return (\n <svg className=\"w-4 h-4 rotate-180\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n};\n\n/**\n * PageHeader component for consistent page layouts with title, actions, and breadcrumbs\n */\nexport const PageHeader: React.FC<PageHeaderProps> = ({\n title,\n subtitle,\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 border-b border-neutral\",\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 <div className=\"flex items-center gap-2 text-default\">\n {onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className={cn(\n \"flex items-center text-sm cursor-pointer transition\",\n backClassName\n )}\n >\n <ArrowLeft size={16} color=\"currentColor\" />\n </button>\n )}\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-neutral rounded-lg outline-none focus:border-none px-1 -mx-1 min-w-0 flex-1\"\n />\n ) : (\n <div className=\"group flex items-center gap-1.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 {editable && (\n <Pencil\n size={15}\n onClick={handleTitleClick}\n className=\"shrink-0 cursor-pointer text-muted opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n )}\n </div>\n )}\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.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 type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n className={cn(\"btn\", {\n o__primary: action.variant === \"primary\",\n o__secondary:\n action.variant === \"secondary\" ||\n action.variant === \"outline\",\n o__ghost: action.variant === \"ghost\",\n o__destructive: action.variant === \"destructive\",\n })}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\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 { 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\n type=\"button\"\n onClick={onBack}\n className=\"flex items-center gap-1 text-sm text-neutral-700 dark:text-neutral-300 hover:text-neutral-900 dark:hover:text-neutral-100 cursor-pointer transition px-2 py-1 rounded\"\n >\n <ArrowLeft size={16} />\n <span>{backLabel}</span>\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 type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n className={cn(\"btn\", {\n o__primary: action.variant === \"primary\",\n o__secondary:\n action.variant === \"secondary\" ||\n action.variant === \"outline\",\n o__ghost: action.variant === \"ghost\",\n o__destructive: action.variant === \"destructive\",\n })}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </button>\n )\n )}\n </div>\n )}\n </div>\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-neutral-500 dark:text-neutral-400\"\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-neutral-200 dark:border-neutral-700 rounded-lg 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-neutral-700 dark:text-neutral-300\"\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-neutral-600 dark:text-neutral-400\"\n >\n {subField.label}\n </Text>\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-neutral-900 dark:text-neutral-100\"\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-neutral-900 dark:text-neutral-100\"\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-neutral-900 dark:text-neutral-100\"\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-neutral dark:border-neutral-700 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-neutral-900 dark:text-neutral-100\"\n >\n {group.title}\n </Text>\n {group.description && (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-neutral-600 dark:text-neutral-400 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={cn(\n \"space-y-1\",\n item.width &&\n typeof item.width === \"string\" &&\n `w-[${item.width}]`,\n item.width &&\n typeof item.width === \"number\" &&\n `col-span-${item.width}`\n )}\n >\n {/* Field Label */}\n {item.type !== \"custom\" && (\n <Text\n variant=\"label\"\n size=\"sm\"\n className=\"font-medium text-neutral-700 dark:text-neutral-300\"\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 { ChevronDownIcon } from \"lucide-react\";\nimport React, { useState } 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 /** Start ingeklapt (alleen relevant als er children zijn). Default false. */\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 [isCollapsed, setIsCollapsed] = useState(item.defaultCollapsed ?? false);\n const hasChildren = item.children && item.children.length > 0;\n // Alleen top-level groepen (bv. teams) krijgen bold. Geneste groepen met\n // children (bv. mailbox-mappen) blijven normaal gewicht — anders wordt de\n // hele folder-boom zwart/bold.\n const isTopLevelParent = hasChildren && depth === 0;\n\n const toggleCollapse = () => {\n if (hasChildren) {\n setIsCollapsed(!isCollapsed);\n }\n };\n\n const isSelected = isSelectedHandler ? isSelectedHandler(item.path) : false;\n\n return (\n <li>\n <div\n className={cn(\n \"flex flex-row w-full py-1 rounded-lg items-center h-8 transition-colors cursor-pointer px-3 pr-1 no-underline text-sm\",\n {\n \"active-nav-item\": isSelected && !hasChildren,\n \"shadow-lvl-0\": isSelected && !hasChildren,\n \"font-semibold\": isSelected || isTopLevelParent,\n }\n )}\n onClick={() => {\n if (hasChildren) {\n toggleCollapse();\n } else if (item.path) {\n onClick?.(item.path);\n }\n }}\n >\n {item.icon && <span className=\"mr-2 shrink-0\">{item.icon}</span>}\n <span className=\"flex-1 min-w-0 truncate\">{item.label}</span>\n {item.count !== undefined && item.count > 0 && (\n <span className=\"ml-2 mr-1.5\">{item.count}</span>\n )}\n {hasChildren && (\n <span className={`${isCollapsed ? \"collapsed\" : \"\"}`}>\n <ChevronDownIcon className=\"w-4 h-4 text-muted\" />\n </span>\n )}\n </div>\n {hasChildren && !isCollapsed && (\n <ul className=\"sidebar-menu-nested-items mb-1\">\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 )}\n </li>\n );\n};\n\nexport const SidebarMenu: React.FC<SidebarMenuProps> = ({\n title,\n actionIcons,\n items,\n isSelectedHandler,\n onClick,\n preMenuItemsComponent,\n}) => {\n return (\n <div className=\"flex flex-col h-screen mb-6\">\n <div className=\"sidebar-menu-header\">\n <span className=\"text-xl font-semibold text-default mb-2\">\n {title}\n </span>\n <div className=\"sidebar-menu-actions\">\n {actionIcons?.map((icon, index) => (\n <span key={index} className=\"sidebar-menu-action-icon\">\n {icon}\n </span>\n ))}\n </div>\n </div>\n {preMenuItemsComponent && (\n <div className=\"sidebar-menu-pre-items mb-4\">\n {preMenuItemsComponent}\n </div>\n )}\n <ul>\n {items.map((item, index) =>\n !item.path && !item.label && !item.children ? (\n <span key={index} className=\"flex w-full h-4\" />\n ) : (\n <SidebarMenuItem\n key={index}\n item={item}\n isSelectedHandler={isSelectedHandler}\n onClick={onClick}\n />\n )\n )}\n </ul>\n </div>\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 component with semantic HTML and theme integration\n */\nexport const Heading: React.FC<HeadingProps> = ({\n level = 1,\n size,\n weight = 'bold',\n color = 'current',\n align = 'left',\n truncate = false,\n className,\n children,\n ...props\n}) => {\n // Default size based on level if not specified\n const defaultSize = size || getDefaultSize(level);\n \n const headingClasses = cn(\n 'font-primary',\n \n // Size variants\n {\n 'text-xs': defaultSize === 'xs',\n 'text-sm': defaultSize === 'sm',\n 'text-base': defaultSize === 'md',\n 'text-lg': defaultSize === 'lg',\n 'text-xl': defaultSize === 'xl',\n 'text-2xl': defaultSize === '2xl',\n 'text-3xl': defaultSize === '3xl',\n 'text-4xl': defaultSize === '4xl',\n },\n \n // Weight variants\n {\n 'font-light': weight === 'light',\n 'font-normal': weight === 'normal',\n 'font-medium': weight === 'medium',\n 'font-semibold': weight === 'semibold',\n 'font-bold': weight === 'bold',\n },\n \n // Color variants — semantische `--text-*` tokens (light+dark) net als Text/Table.\n {\n 'text-primary': color === 'primary',\n 'text-secondary': color === 'secondary',\n 'text-[var(--text-accent)]': color === 'accent',\n 'text-[var(--text-success)]': color === 'success',\n 'text-warning': color === 'warning',\n 'text-[var(--text-error)]': color === 'error',\n 'text-info': color === 'info',\n 'text-[var(--text-default)]': color === 'neutral',\n 'text-current': color === 'current',\n },\n \n // Alignment\n {\n 'text-left': align === 'left',\n 'text-center': align === 'center',\n 'text-right': align === 'right',\n },\n \n // Truncation\n {\n 'truncate': truncate,\n },\n \n className\n );\n\n const Tag = `h${level}` as keyof React.JSX.IntrinsicElements;\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: '4xl',\n 2: '3xl',\n 3: '2xl',\n 4: 'xl',\n 5: 'lg',\n 6: 'md',\n };\n \n return sizeMap[level] || 'md';\n} ","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ListItem {\n /** Unique identifier */\n id?: string;\n /** List item content */\n content: React.ReactNode;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Click handler for interactive lists */\n onClick?: () => void;\n}\n\nexport interface ListProps {\n /** List items */\n items: ListItem[];\n /** List type */\n type?: 'unordered' | 'ordered' | 'description';\n /** List variant */\n variant?: 'default' | 'flush' | 'bordered' | 'divided';\n /** List size */\n size?: 'sm' | 'md' | 'lg';\n /** Whether list items are interactive */\n interactive?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Additional CSS classes for list items */\n itemClassName?: string;\n}\n\n/**\n * List component with theme integration and multiple variants\n */\nexport const List: React.FC<ListProps> = ({\n items,\n type = 'unordered',\n variant = 'default',\n size = 'md',\n interactive = false,\n className,\n itemClassName,\n}) => {\n const listClasses = cn(\n // Base styles\n 'space-y-1',\n \n // Variant styles\n {\n // Default - basic spacing\n '': variant === 'default',\n \n // Flush - no padding\n 'space-y-0': variant === 'flush',\n \n // Bordered - border around entire list\n 'border border-neutral-200 dark:border-neutral-700 rounded-lg overflow-hidden': variant === 'bordered',\n \n // Divided - borders between items\n 'divide-y divide-neutral-200 dark:divide-neutral-700': variant === 'divided',\n },\n \n // Size variants\n {\n 'text-sm': size === 'sm',\n 'text-base': size === 'md',\n 'text-lg': size === 'lg',\n },\n \n className\n );\n\n const getItemClasses = (item: ListItem, index: number) => cn(\n // Base item styles\n 'transition-colors duration-200',\n \n // Size-based padding\n {\n 'py-1 px-2': size === 'sm' && (variant === 'bordered' || variant === 'divided'),\n 'py-2 px-3': size === 'md' && (variant === 'bordered' || variant === 'divided'),\n 'py-3 px-4': size === 'lg' && (variant === 'bordered' || variant === 'divided'),\n },\n \n // Interactive styles\n interactive && !item.disabled && {\n 'cursor-pointer hover:bg-neutral-50 dark:hover:bg-neutral-800': true,\n 'focus:outline-none focus:bg-neutral-100 dark:focus:bg-neutral-700': true,\n },\n \n // Disabled styles\n item.disabled && {\n 'opacity-50 cursor-not-allowed': true,\n },\n \n itemClassName\n );\n\n const handleItemClick = (item: ListItem) => {\n if (interactive && !item.disabled && item.onClick) {\n item.onClick();\n }\n };\n\n const handleItemKeyDown = (e: React.KeyboardEvent, item: ListItem) => {\n if (interactive && !item.disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n item.onClick?.();\n }\n };\n\n if (type === 'ordered') {\n return (\n <ol className={listClasses}>\n {items.map((item, index) => (\n <li\n key={item.id || index}\n className={getItemClasses(item, index)}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => handleItemKeyDown(e, item)}\n tabIndex={interactive && !item.disabled ? 0 : undefined}\n role={interactive ? 'button' : undefined}\n >\n {item.content}\n </li>\n ))}\n </ol>\n );\n }\n\n if (type === 'description') {\n return (\n <dl className={listClasses}>\n {items.map((item, index) => (\n <div\n key={item.id || index}\n className={getItemClasses(item, index)}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => handleItemKeyDown(e, item)}\n tabIndex={interactive && !item.disabled ? 0 : undefined}\n role={interactive ? 'button' : undefined}\n >\n {item.content}\n </div>\n ))}\n </dl>\n );\n }\n\n // Default to unordered list\n return (\n <ul className={listClasses}>\n {items.map((item, index) => (\n <li\n key={item.id || index}\n className={getItemClasses(item, index)}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => handleItemKeyDown(e, item)}\n tabIndex={interactive && !item.disabled ? 0 : undefined}\n role={interactive ? 'button' : undefined}\n >\n {item.content}\n </li>\n ))}\n </ul>\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-50 flex items-center justify-center shadow-lvl-0\">\n <div\n className=\"flex flex-col w-full max-w-lg max-h-[80vh] p-2 mx-auto rounded-xl border border-neutral shadow-lg bg-module\"\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-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 py-2 text-default border-0 focus:outline-none focus:ring-0 focus:border-0 focus:shadow-none bg-transparent\"\n />\n </div>\n <div\n ref={listRef}\n className=\"mt-2 pt-2 text-sm border-t border-neutral max-h-[50vh] overflow-y-auto\"\n >\n {filteredCommands.length === 0 && (\n <div className=\"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 text-default ${index === activeIndex ? \"bg-neutral-container\" : \"\"\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-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-muted border-t border-neutral\">\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-[1.25rem] px-1 py-0.5 rounded border border-neutral bg-module-subtle text-[10px] 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-[1.25rem] px-1 py-0.5 rounded border border-neutral bg-module-subtle text-[10px] 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-[1.25rem] px-1 py-0.5 rounded border border-neutral bg-module-subtle text-[10px] 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\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\nconst backgroundMap = {\n none: '',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n accent: 'bg-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-error',\n info: 'bg-info',\n neutral: 'bg-neutral',\n white: 'bg-white',\n module: 'bg-module',\n 'module-subtle': 'bg-module-subtle',\n backdrop: 'bg-backdrop',\n editor: 'bg-editor',\n input: 'bg-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\nconst shadowMap = {\n none: 'shadow-none',\n sm: 'shadow-sm shadow-lvl-0',\n md: 'shadow-md shadow-lvl-0',\n lg: 'shadow-lg shadow-lvl-0',\n xl: 'shadow-xl shadow-lvl-0',\n '2xl': 'shadow-2xl shadow-lvl-0',\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-primary',\n secondary: 'border-secondary',\n accent: 'border-accent',\n success: 'border-success',\n warning: 'border-warning',\n error: 'border-error',\n info: 'border-info',\n neutral: 'border-neutral',\n white: 'border-white',\n};\n\n/**\n * Box primitive component for layout and styling\n * \n * @example\n * ```tsx\n * <Box padding=\"md\" background=\"primary\" radius=\"lg\">\n * Content\n * </Box>\n * \n * <Box as=\"section\" padding=\"lg\" shadow=\"md\">\n * <h2>Section Title</h2>\n * <p>Section content</p>\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'; ","import { Box, BoxProps } from \"./Box\";\n\nexport interface CardProps extends BoxProps {\n children: React.ReactNode;\n title?: string;\n}\n\nexport const Card = ({ children, title, ...props }: CardProps) => {\n return (\n <Box background='module' radius='xl' shadow='sm' {...props}>\n {title && <span className=\"text-base font-medium text-default mb-2\">{title}</span>}\n {children}\n </Box>\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-red-200 bg-red-50 rounded-lg\">\n <h2 className=\"text-lg font-semibold text-red-800\">Something went wrong</h2>\n <p className=\"text-sm text-red-600 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-red-100 text-red-800 rounded hover:bg-red-200 transition-colors 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","children","disabled","props","isDisabled","ButtonGroup","orientation","attached","baseClasses","Link","color","external","href","target","rel","isExternal","linkProps","Popover","trigger","placement","triggerLabel","isOpen","setIsOpen","useState","panelPos","setPanelPos","rootRef","triggerRef","onDown","event","onEsc","handleToggle","r","pos","open","close","variantStyles","SplitButton","label","onClick","icon","options","menuPlacement","menuLabel","hasMenu","ChevronDown","Fragment","option","checkboxSizes","labelSizes","Checkbox","helperText","error","indeterminate","containerClassName","labelClassName","id","checkboxId","hasError","React","CalendarIcon","ChevronLeftIcon","ChevronRightIcon","DatePicker","onChange","placeholder","required","minDate","maxDate","format","currentMonth","setCurrentMonth","containerRef","handleClickOutside","formatDate","date","day","month","year","getCalendarDays","firstDay","startDate","days","current","handleDateSelect","handlePrevMonth","handleNextMonth","handleClear","inputClasses","calendarDays","monthNames","index","isCurrentMonth","isSelected","isToday","classes","SearchIcon","ChevronDownIcon","inputSizes","iconSizes","SearchableTextField","startIcon","externalLoading","onRemoteSearch","onSelect","debounceTime","showAllOnOpen","propValue","inputId","inputRef","inputValue","setInputValue","isSearchingRemote","setIsSearchingRemote","typedSinceOpen","setTypedSinceOpen","filteredOptions","useMemo","lowerCaseInput","handler","e","handleChange","newValue","handleSelect","handleFocus","showDropdown","resolvedRef","prev","selectSizes","norm","s","Select","searchable","multiple","allowCreate","onCreateOption","selectId","searchTerm","setSearchTerm","localOptions","setLocalOptions","includesOption","opts","needle","o","ensureValuesInOptions","baseOptions","currentValue","out","addIfMissing","v","val","next","opt","optionValue","currentValues","newValues","selectedOption","selectedOptions","canCreate","createOption","labelToCreate","clean","newOption","getDisplayValue","textareaSizes","TextArea","rows","textareaId","TextField","endIcon","Icon","IconComponent","clickable","ariaLabel","sizeValue","getSizeValue","iconClasses","iconProps","ContentLoading","showTableSkeleton","tableColumns","tableRows","_","idx","rowIdx","colIdx","Dropdown","showCheck","header","hoveredOption","setHoveredOption","submenuPosition","setSubmenuPosition","menuPos","setMenuPos","dropdownRef","submenuRef","hideTimeoutRef","handleEscape","hoveredElement","rect","handleTriggerClick","handleOptionClick","parentValue","handleOptionHover","handleOptionLeave","handleSubmenuOptionClick","dropdownClasses","submenuClasses","hasChildren","isHovered","childOption","childIndex","totalOptions","count","childCount","child","ChevronUpIcon","ChevronsLeftIcon","ChevronsRightIcon","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","checked","rowKey","handleSelectAll","f","totalItems","totalPages","startItem","endItem","allVisibleSelected","selectedRow","someVisibleSelected","tableClasses","headerClasses","cellClasses","rowClasses","el","action","actionId","TabsContext","createContext","TabBar","items","activeTab","onTabChange","internalActiveTab","setInternalActiveTab","currentActiveTab","handleTabClick","tabId","item","Tabs","defaultTab","handleTabChange","contextValue","activeTabItem","tabListClasses","tabClasses","isActive","sizeClasses","variantClasses","stateClasses","activeClasses","inactiveClasses","modalSizes","Modal","onClose","title","closeOnBackdropClick","closeOnEscape","backdropClassName","footer","showCloseButton","modalRef","previousActiveElement","handleBackdropClick","Text","weight","align","truncate","italic","underline","lineHeight","as","defaultElement","getDefaultElement","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","folders","files","path","parts","p","handleFolderClick","folderName","handleGoBack","tableData","explorerColumns","Folder","FileText","mountColumns","HardDrive","X","ArrowLeft","Search","FolderPlus","Upload","FolderSelect","onListFolders","templatePlaceholder","showTemplate","setFolders","res","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","renderGroup","visibleItems","groupClasses","formClasses","badgeVariants","badgeSizes","dotColors","Badge","dot","dismissible","onDismiss","spinnerSizes","spinnerColors","Spinner","showLabel","initials","Avatar","src","errored","setErrored","base","RING","OWNER_RING","AvatarStack","people","max","shown","overflow","Image","alt","aspectRatio","radius","showLoading","showError","fallback","loadingContent","errorContent","onLoad","onError","isLoading","setIsLoading","setHasError","currentSrc","setCurrentSrc","handleLoad","handleError","containerClasses","imageClasses","placeholderClasses","defaultLoadingContent","defaultErrorContent","PageHeader","subtitle","backLabel","backClassName","onBack","editable","onTitleChange","isEditing","setIsEditing","editValue","setEditValue","handleTitleClick","handleBlur","handleKeyDown","Pencil","PageToolbar","View","formatCheckbox","getOptionLabel","subValue","displayValue","formatted","viewClasses","SidebarMenuItem","isSelectedHandler","depth","isCollapsed","setIsCollapsed","isTopLevelParent","toggleCollapse","SidebarMenu","actionIcons","preMenuItemsComponent","Heading","level","defaultSize","getDefaultSize","headingClasses","Tag","List","type","interactive","itemClassName","listClasses","getItemClasses","handleItemClick","handleItemKeyDown","CommandPalette","commands","labels","initialCommandPath","initialActiveIndex","activeCommandPath","setActiveCommandPath","activeIndex","setActiveIndex","paletteRef","listRef","filteredCommands","c","command","prevIndex","ChevronRight","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/action/FilterChip.tsx","../src/action/Link.tsx","../src/action/SegmentedToggle.tsx","../src/overlays/Popover.tsx","../src/action/SplitButton.tsx","../src/input/Checkbox.tsx","../src/input/DatePicker.tsx","../src/input/SearchableTextField.tsx","../src/input/Select.tsx","../src/input/TextArea.tsx","../src/input/TextField.tsx","../src/content/Icon.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/FolderSelect.tsx","../src/forms/Form.tsx","../src/feedback/Badge.tsx","../src/feedback/EmptyState.tsx","../src/feedback/Kbd.tsx","../src/feedback/ProgressBar.tsx","../src/feedback/Spinner.tsx","../src/content/AssistantCard.tsx","../src/content/Avatar.tsx","../src/content/AvatarStack.tsx","../src/content/ChannelBadge.tsx","../src/content/KpiCard.tsx","../src/content/SourceChip.tsx","../src/content/Image.tsx","../src/content/PageHeader.tsx","../src/content/PageToolbar.tsx","../src/content/View.tsx","../src/navigation/Sidebar.tsx","../src/typography/Heading.tsx","../src/typography/List.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-[160px] 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-gray-800 flex items-center justify-center\",\n fill ? \"h-full w-full\" : \"aspect-video\",\n speaking && \"ring-2 ring-emerald-400\",\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-gray-700 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-black/50 text-white text-xs\">\n {muted ? <MicOff className=\"w-3 h-3\" /> : <Mic className=\"w-3 h-3\" />}\n <span className=\"truncate max-w-[140px]\">{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-gray-900 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';\n\n /**\n * The size of the button\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '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\nconst buttonVariants = {\n primary: 'btn o__primary',\n secondary: 'btn o__secondary',\n outline: 'btn o__secondary',\n ghost: 'btn o__tertiary',\n destructive: 'btn o__destructive',\n};\n\nconst buttonSizes = {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-6 py-3 text-base',\n xl: 'px-8 py-4 text-lg',\n full: 'px-4 py-3 text-base',\n};\n\nconst iconOnlySizes = {\n xs: 'p-1',\n sm: 'p-1.5',\n md: 'p-2',\n lg: 'p-3',\n xl: 'p-4',\n full: 'p-4',\n};\n\n/**\n * Button component with theme integration and multiple variants\n * \n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">\n * Click me\n * </Button>\n * \n * <Button variant=\"outline\" leftIcon={<PlusIcon />}>\n * Add item\n * </Button>\n * \n * <Button iconOnly variant=\"ghost\" size=\"sm\">\n * <SearchIcon />\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 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 // Base styles — radius/focus/colors come from the token-driven `.btn o__*` CSS\n 'inline-flex items-center justify-center transition-colors duration-200',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Variant styles\n buttonVariants[variant],\n\n // Size styles\n iconOnly ? iconOnlySizes[size] : buttonSizes[size],\n\n // Full width\n fullWidth && 'w-full',\n\n // Loading state\n loading && 'cursor-wait',\n\n className\n )}\n disabled={isDisabled}\n {...props}\n >\n {loading && (\n <svg\n className={cn(\n 'animate-spin',\n iconOnly ? 'h-4 w-4' : 'h-4 w-4 mr-2'\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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\n {!loading && leftIcon && (\n <span className={cn('flex-shrink-0', !iconOnly && 'mr-2')}>\n {leftIcon}\n </span>\n )}\n\n {!iconOnly && children}\n\n {!loading && rightIcon && (\n <span className={cn('flex-shrink-0', !iconOnly && 'ml-2')}>\n {rightIcon}\n </span>\n )}\n\n {iconOnly && !loading && !leftIcon && !rightIcon && children}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button'; ","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 FilterChipProps {\n /** Chip text (e.g. \"Status\", or \"Status: Open\" when a value is set). */\n label: React.ReactNode;\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 onClick?: () => void;\n className?: string;\n}\n\nfunction Chevron() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\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 dark, 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({ label, active = false, caret = false, onClear, onClick, className }: FilterChipProps) {\n return (\n <span\n onClick={onClick}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium transition-colors\",\n active\n ? \"bg-accent-fill text-on-accent\"\n : \"border border-neutral-emphasis text-muted hover:bg-neutral-container\",\n className,\n )}\n >\n {label}\n {caret && <Chevron />}\n {active && onClear && (\n <button\n type=\"button\"\n aria-label=\"Filter wissen\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n className=\"ml-0.5 text-[10px] leading-none opacity-80 hover:opacity-100\"\n >\n ✕\n </button>\n )}\n </span>\n );\n}\n","import React from '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/**\n * Link component with theme integration and accessibility features\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 // Auto-detect external links\n const isExternal = external || (href && (href.startsWith('http') || href.startsWith('mailto:')));\n \n const baseClasses = cn(\n // Base styles\n 'inline-flex items-center gap-1 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2',\n \n // Size variants\n {\n 'text-xs': size === 'xs',\n 'text-sm': size === 'sm',\n 'text-base': size === 'md',\n 'text-lg': size === 'lg',\n 'text-xl': size === 'xl',\n },\n \n // Color variants (token-driven, mode-aware)\n {\n 'text-link hover:underline': (color === 'primary' || color === 'info') && !disabled,\n 'text-muted hover:text-default': (color === 'secondary' || color === 'neutral') && !disabled,\n 'text-accent hover:underline': color === 'accent' && !disabled,\n 'text-success hover:underline': color === 'success' && !disabled,\n 'text-[var(--notice-fill)] hover:underline': color === 'warning' && !disabled,\n 'text-error hover:underline': color === 'error' && !disabled,\n },\n \n // Variant styles\n {\n // Default - just colored text\n '': variant === 'default',\n \n // Subtle - muted colors\n 'text-opacity-70 hover:text-opacity-100': variant === 'subtle',\n \n // Underline - always underlined\n 'underline underline-offset-2 decoration-1 hover:decoration-2': variant === 'underline',\n \n // Button - looks like a button (tinted container surface)\n 'px-3 py-1.5 rounded-lg': variant === 'button',\n 'bg-accent-container': variant === 'button' && (color === 'primary' || color === 'accent'),\n 'bg-neutral-container': variant === 'button' && (color === 'secondary' || color === 'neutral'),\n 'bg-success-container': variant === 'button' && color === 'success',\n 'bg-notice-container': variant === 'button' && color === 'warning',\n 'bg-error-container': variant === 'button' && color === 'error',\n 'bg-beta-container': variant === 'button' && color === 'info',\n },\n \n // Disabled state\n {\n 'opacity-50 cursor-not-allowed pointer-events-none': disabled,\n },\n \n className\n );\n\n // Handle external link props\n const linkProps = {\n ...props,\n href: disabled ? undefined : href,\n target: isExternal ? '_blank' : target,\n rel: isExternal ? 'noopener noreferrer' : rel,\n };\n\n return (\n <a className={baseClasses} {...linkProps}>\n {children}\n {isExternal && (\n <svg\n className=\"w-3 h-3 ml-1\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n </a>\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\nconst sizes = {\n sm: \"text-xs px-2.5 py-1\",\n md: \"text-sm px-3 py-1.5\",\n};\n\n/**\n * Segmented pill toggle (focus \"Feed / Eén tegelijk\", settings \"Persoonlijk /\n * Bedrijf\"). The active segment lifts with a subtle shadow. Token-driven.\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-lg bg-neutral-container 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 \"rounded-md font-medium text-default transition-colors\",\n sizes[size],\n active ? \"bg-module font-ui-650 shadow-lvl-0\" : \"hover:bg-neutral-container-emphasis\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\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 */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Additional CSS classes for the panel */\n className?: 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 disabled = false,\n triggerLabel,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [panelPos, setPanelPos] = useState<React.CSSProperties>({});\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\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 if (!isOpen) {\n const r = triggerRef.current?.getBoundingClientRect();\n if (r) {\n const gap = 6;\n const pos: React.CSSProperties = {};\n if (placement.startsWith(\"bottom\")) pos.top = r.bottom + gap;\n else pos.bottom = window.innerHeight - r.top + gap;\n if (placement.endsWith(\"start\")) pos.left = r.left;\n else pos.right = window.innerWidth - r.right;\n setPanelPos(pos);\n }\n }\n setIsOpen((open) => !open);\n };\n\n const close = () => setIsOpen(false);\n\n return (\n <div ref={rootRef} className=\"relative inline-flex\">\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(\"inline-flex items-center\", disabled && \"opacity-50 cursor-not-allowed\")}\n >\n {trigger}\n </button>\n\n {isOpen && (\n <div\n className={cn(\n \"fixed z-[60] bg-module rounded-[10px] shadow-[var(--shadow-dropdown)] border border-neutral\",\n className,\n )}\n style={panelPos}\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\nconst variantStyles = {\n primary: \"btn o__primary\",\n secondary: \"btn o__secondary\",\n outline: \"btn o__secondary\",\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-[200px] py-1\"\n trigger={\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex items-center justify-center transition-colors duration-200\",\n variantStyles[variant],\n size === \"sm\" ? \"px-1.5 py-1.5\" : \"px-2 py-2\",\n \"!rounded-l-none\",\n )}\n >\n <ChevronDown className=\"h-4 w-4\" />\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-2 text-left text-sm transition-colors\",\n option.variant === \"destructive\"\n ? \"text-error hover:bg-error-container\"\n : \"text-default hover:bg-neutral-container\",\n )}\n >\n {option.icon && (\n <span className=\"flex-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\nconst checkboxSizes = {\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\nconst labelSizes = {\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n full: 'text-base',\n};\n\n/**\n * Checkbox component with theme integration\n * \n * @example\n * ```tsx\n * <Checkbox label=\"Accept terms and conditions\" />\n * \n * <Checkbox \n * label=\"Subscribe to newsletter\" \n * helperText=\"You can unsubscribe at any time\"\n * />\n * \n * <Checkbox \n * label=\"Required field\" \n * error=\"This field is required\"\n * />\n * \n * <Checkbox \n * label=\"Select all\" \n * indeterminate={true}\n * />\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 checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\n\n // Handle indeterminate state\n React.useEffect(() => {\n if (ref && typeof ref === 'object' && ref.current) {\n ref.current.indeterminate = indeterminate;\n }\n }, [indeterminate, ref]);\n\n return (\n <div className={cn('flex flex-col', containerClassName)}>\n <div className=\"flex items-start\">\n <div className=\"flex items-center h-5\">\n <input\n ref={ref}\n id={checkboxId}\n type=\"checkbox\"\n className={cn(\n // Base styles\n 'rounded border transition-colors duration-200',\n 'focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Size styles\n checkboxSizes[size],\n\n // State styles — bg-input keeps the unchecked box mode-aware; the\n // checked fill is the forms-plugin `currentColor`. The plugin's\n // check glyph is white, so the fill must stay dark in both modes\n // (accent-fill would invert to near-white in dark → invisible check).\n hasError\n ? 'border-error [&:not(:checked)]:bg-[var(--base-input)] text-error focus:border-error focus:ring-error'\n : 'border-neutral [&:not(:checked)]:bg-[var(--base-input)] text-accent focus:border-[var(--accent-fill)] focus:ring-[var(--accent-fill)]',\n\n className\n )}\n {...props}\n />\n </div>\n\n {label && (\n <div className=\"ml-3 flex-1\">\n <label\n htmlFor={checkboxId}\n className={cn(\n 'font-medium cursor-pointer',\n hasError ? 'text-error' : 'text-default',\n labelSizes[size],\n labelClassName\n )}\n >\n {label}\n </label>\n\n {helperText && !error && (\n <p className=\"mt-1 text-xs text-muted\">\n {helperText}\n </p>\n )}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-xs text-error\">\n {error}\n </p>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox'; ","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { cn } from '../utils/cn';\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\nconst CalendarIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n);\n\nconst ChevronLeftIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"m15 18-6-6 6-6\" />\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"m9 18 6-6-6-6\" />\n </svg>\n);\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}, ref) => {\n const [isOpen, setIsOpen] = useState(false);\n const [currentMonth, setCurrentMonth] = useState(() => value || new Date());\n const containerRef = useRef<HTMLDivElement>(null);\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 switch (format) {\n case 'dd/MM/yyyy':\n return `${day}/${month}/${year}`;\n case 'yyyy-MM-dd':\n return `${year}-${month}-${day}`;\n case 'MM/dd/yyyy':\n default:\n return `${month}/${day}/${year}`;\n }\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 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-neutral rounded-[9px] transition-colors duration-200',\n 'bg-module text-default',\n 'placeholder:text-muted',\n 'focus:outline-none focus:border-[var(--accent-fill)]',\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-module-subtle',\n {\n 'px-3 py-2 text-sm': size === 'sm',\n 'px-3 py-2 text-base': size === 'md',\n 'px-4 py-3 text-lg': size === 'lg',\n 'px-4 py-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 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-muted hover:text-muted\"\n >\n <CalendarIcon />\n </button>\n </div>\n\n {/* Calendar Popup */}\n {isOpen && (\n <div className=\"absolute z-50 mt-1 bg-module border border-neutral rounded-[10px] shadow-[var(--shadow-dropdown)] p-4 min-w-[280px]\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-1 hover:bg-neutral-container rounded\"\n >\n <ChevronLeftIcon />\n </button>\n <h3 className=\"text-sm font-medium text-default\">\n {monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h3>\n <button\n onClick={handleNextMonth}\n className=\"p-1 hover:bg-neutral-container 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-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-200',\n {\n 'text-default hover:bg-neutral-container':\n isCurrentMonth && !isSelected && !isDisabled,\n 'bg-accent-fill text-on-accent': isSelected,\n 'bg-neutral-container text-default': isToday && !isSelected,\n 'text-muted cursor-not-allowed': isDisabled,\n }\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-between items-center mt-4 pt-3 border-t border-neutral\">\n <button\n onClick={handleClear}\n className=\"text-sm text-muted hover:text-default\"\n >\n Clear\n </button>\n <button\n onClick={() => setIsOpen(false)}\n className=\"text-sm text-link hover:underline\"\n >\n Close\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}); ","import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst cn = (...classes: string[]) => classes.filter(Boolean).join(\" \");\n\nconst SearchIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.197 5.197a7.5 7.5 0 0 0 10.606 10.606Z\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"\n />\n </svg>\n);\n\nconst inputSizes = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-3 py-2 text-sm\",\n full: \"px-3 py-2 text-sm\",\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-error\" : \"text-default\",\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-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-lg border transition-colors duration-200 bg-input\",\n \"placeholder:text-[var(--text-muted)] focus:outline-none\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\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-error text-error focus:border-error focus:ring-error\"\n : \"border-neutral text-default\",\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 <svg\n className={cn(\"animate-spin text-link\", iconSizes[size])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 // Dropdown Chevron\n <ChevronDownIcon\n className={cn(\n \"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-module border border-neutral 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-default hover:bg-accent-container 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-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-error\" : \"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\">\n Huidige zoekterm (niet-gedebounced): {String(inputValue)}\n </p>\n )}\n </div>\n );\n }\n);\n\nSearchableTextField.displayName = \"SearchableTextField\";\n","import { ChevronDownIcon } from \"lucide-react\";\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/cn\";\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: \"px-3 py-1.5 text-sm\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-3 py-2 text-sm\",\n full: \"px-3 py-2 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\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-[10.5px] font-ui-650 uppercase tracking-[0.08em] mb-1.5\",\n hasError\n ? \"text-error\"\n : \"text-muted\",\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <button\n type=\"button\"\n id={selectId}\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-[9px] border transition-colors duration-200 text-left\",\n \"focus:outline-none focus:border-[var(--accent-fill)] focus:ring-0 focus:ring-offset-0\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"bg-module\",\n selectSizes[size],\n hasError\n ? \"border-error text-error focus:border-error focus:ring-error\"\n : \"border-neutral text-default\",\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-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </button>\n\n {isOpen && (\n <div className=\"absolute z-10 mt-1 w-full rounded-[10px] bg-module shadow-[var(--shadow-dropdown)] border border-neutral\">\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-default border-neutral focus:outline-none focus:ring-0\"\n )}\n />\n </div>\n )}\n\n {canCreate && (\n <div\n className={cn(\n \"px-4 py-2 text-sm cursor-pointer\",\n \"text-link hover:bg-neutral-container\"\n )}\n onClick={() => createOption(searchTerm)}\n >\n +: “{searchTerm.trim()}”\n </div>\n )}\n\n <ul className=\"max-h-60 overflow-auto py-1\">\n {placeholder && !multiple && (\n <li\n className=\"px-4 py-2 text-sm text-muted cursor-pointer hover:bg-neutral-container\"\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 \"px-4 py-2 text-sm cursor-pointer\",\n \"text-default\",\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:bg-neutral-container\",\n isSelected && \"bg-accent-container 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-neutral [&:not(:checked)]:bg-[var(--base-input)] text-accent focus:ring-[var(--accent-fill)]\"\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-error\" : \"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 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-sm',\n lg: 'px-4 py-3 text-base',\n full: 'px-4 py-3 text-base',\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 textareaId = id || `textarea-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\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 'block text-[10.5px] font-ui-650 uppercase tracking-[0.08em] mb-1.5',\n hasError ? 'text-error' : 'text-muted',\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 className={cn(\n // Base styles\n 'block w-full rounded-lg border transition-colors duration-200 resize-vertical bg-input',\n 'placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-0',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Size styles\n textareaSizes[size],\n\n // State styles\n hasError\n ? 'border-error text-error focus:border-error focus:ring-error'\n : 'border-neutral text-default',\n\n className\n )}\n {...props}\n />\n\n {loading && (\n <div className=\"absolute top-3 right-3\">\n <svg\n className=\"animate-spin h-4 w-4 text-muted\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n className={cn(\n 'mt-1 text-xs',\n hasError ? 'text-error' : 'text-muted'\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea'; ","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\nconst inputSizes = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2 text-sm',\n lg: 'px-3 py-2 text-sm',\n full: 'px-3 py-2 text-sm',\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\n/**\n * TextField component with theme integration and validation states\n * \n * @example\n * ```tsx\n * <TextField\n * label=\"Email\"\n * placeholder=\"Enter your email\"\n * type=\"email\"\n * />\n * \n * <TextField\n * label=\"Search\"\n * startIcon={<SearchIcon />}\n * placeholder=\"Search...\"\n * />\n * \n * <TextField\n * label=\"Password\"\n * type=\"password\"\n * error=\"Password is required\"\n * />\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 inputId = id || `textfield-${Math.random().toString(36).substr(2, 9)}`;\n const hasError = Boolean(error);\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 'block text-[10.5px] font-ui-650 uppercase tracking-[0.08em] mb-1.5',\n hasError ? 'text-error' : 'text-muted',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n {startIcon && (\n // Todo fix inset not showing correctly on different sizes\n <div className=\"absolute left-0 pl-3 flex items-center pointer-events-none h-full\">\n <span className={cn('text-muted', iconSizes[size])}>\n {startIcon}\n </span>\n </div>\n )}\n\n <input\n ref={ref}\n id={inputId}\n className={cn(\n // Base styles\n 'block w-full rounded-lg border transition-colors duration-200 bg-input',\n 'placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-1 focus:ring-offset-0',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n\n // Size styles\n inputSizes[size],\n\n // Icon padding\n startIcon && 'pl-10',\n endIcon && 'pr-10',\n\n // State styles\n hasError\n ? 'border-error text-error focus:border-error focus:ring-error'\n : 'border-neutral text-default focus:border-[var(--accent-fill)] focus:ring-[var(--accent-fill)]',\n\n className\n )}\n {...props}\n />\n\n {(endIcon || loading) && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center\">\n {loading ? (\n <svg\n className={cn('animate-spin text-muted', iconSizes[size])}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 endIcon && (\n <span className={cn('text-muted', iconSizes[size])}>\n {endIcon}\n </span>\n )\n )}\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p\n className={cn(\n 'mt-1 text-xs',\n hasError ? 'text-error' : 'text-muted'\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = 'TextField'; ","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 component that works with Lucide React icons and provides theme integration\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',\n \n // Color variants\n {\n 'text-default': color === 'primary',\n 'text-muted': color === 'secondary',\n 'text-accent': color === 'accent',\n 'text-success': color === 'success',\n 'text-warning': color === 'warning',\n 'text-error': color === 'error',\n 'text-info': color === 'info',\n 'text-neutral': color === 'neutral',\n 'text-current': color === 'current',\n },\n \n // Clickable styles\n {\n 'cursor-pointer hover:opacity-80 transition-opacity duration-200': clickable,\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[var(--accent-border)] rounded': clickable,\n },\n \n className\n );\n\n const iconProps = {\n size: sizeValue,\n className: iconClasses,\n onClick: clickable ? onClick : undefined,\n 'aria-label': ariaLabel,\n role: clickable ? 'button' : undefined,\n tabIndex: clickable ? 0 : undefined,\n onKeyDown: clickable ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\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: 16,\n md: 20,\n lg: 24,\n xl: 32,\n };\n \n return sizeMap[size];\n} ","import { ReactNode } from 'react';\n\ninterface ContentLoadingProps {\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 children,\n showTableSkeleton = false,\n tableColumns = 6,\n tableRows = 8,\n}: ContentLoadingProps) {\n if (children) {\n return (\n <main className=\"flex-1 bg-module p-6\">\n <div className=\"w-full max-w-6xl mx-auto animate-pulse\">\n {children}\n </div>\n </main>\n );\n }\n\n return (\n <main className=\"flex-1 bg-module p-6\">\n <div className=\"w-full mx-auto space-y-6 animate-pulse\">\n\n {/* Title Bar */}\n {!showTableSkeleton && (\n <>\n <div className=\"h-6 bg-neutral-container-emphasis rounded w-1/4\" />\n\n {/* Description Lines */}\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-neutral-container-emphasis rounded w-3/4\" />\n <div className=\"h-4 bg-neutral-container-emphasis rounded w-1/2\" />\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 grid-cols-${tableColumns} gap-2 bg-neutral-container p-3`}>\n {Array.from({ length: tableColumns }).map((_, idx) => (\n <div\n key={`header-${idx}`}\n className=\"h-4 bg-neutral-border-emphasis rounded w-2/3\"\n />\n ))}\n </div>\n\n {/* Table rows */}\n {Array.from({ length: tableRows }).map((_, rowIdx) => (\n <div\n key={`row-${rowIdx}`}\n className={`grid grid-cols-${tableColumns} gap-2 p-3 border-t border-neutral`}\n >\n {Array.from({ length: tableColumns }).map((_, colIdx) => (\n <div\n key={`cell-${rowIdx}-${colIdx}`}\n className=\"h-4 bg-neutral-container-emphasis rounded w-full\"\n />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n </main>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\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 [menuPos, setMenuPos] = useState<React.CSSProperties>({});\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const submenuRef = useRef<HTMLDivElement>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\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 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 if (!isOpen) {\n const r = triggerRef.current?.getBoundingClientRect();\n if (r) {\n const gap = 6;\n const pos: React.CSSProperties = {};\n if (placement.startsWith(\"bottom\")) pos.top = r.bottom + gap;\n else pos.bottom = window.innerHeight - r.top + gap;\n if (placement.endsWith(\"start\")) pos.left = r.left;\n else pos.right = window.innerWidth - r.right;\n setMenuPos(pos);\n }\n }\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-[60] min-w-[200px] bg-module rounded-[10px] shadow-[var(--shadow-dropdown)] border border-neutral\",\n \"max-h-60 overflow-auto\"\n );\n\n const submenuClasses = cn(\n \"fixed z-[60] min-w-[200px] bg-module rounded-[10px] shadow-[var(--shadow-dropdown)] border border-neutral\",\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-neutral-container\",\n className\n )}\n >\n {/* Trigger */}\n <button\n ref={triggerRef}\n onClick={handleTriggerClick}\n disabled={disabled}\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 className={dropdownClasses} style={menuPos}>\n <div className=\"p-2\">\n {/* Header */}\n {header && (\n typeof header === \"string\" ? (\n <div className=\"text-xs font-medium text-muted uppercase tracking-wider 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-neutral 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 onClick={(event) => handleOptionClick(event, option)}\n onMouseEnter={() => handleOptionHover(option)}\n onMouseLeave={() => handleOptionLeave(option)}\n disabled={option.disabled}\n className={cn(\n \"w-full flex items-center justify-between px-3 py-2 text-sm text-default hover:bg-neutral-container rounded-md transition-colors\",\n {\n \"opacity-50 cursor-not-allowed\": option.disabled,\n \"bg-neutral-container\":\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-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 <span className=\"h-4 w-4 text-success flex-shrink-0 text-sm font-bold\">\n ✓\n </span>\n )}\n {hasChildren && (\n <span className=\"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-neutral 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 \"w-full flex items-center justify-between px-3 py-2 text-sm text-default hover:bg-neutral-container rounded-md transition-colors\",\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-muted\">\n {childOption.description}\n </span>\n )}\n </div>\n </div>\n\n {showCheck && isSelected && (\n <span className=\"h-4 w-4 text-success flex-shrink-0 text-sm font-bold\">\n ✓\n </span>\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-neutral mt-2 pt-2\">\n <div className=\"text-xs 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 { Button } from \"../action/Button\";\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// Icon components as inline SVG\nconst SearchIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m21 21-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n);\n\nconst ChevronUpIcon = ({ active }: { active?: boolean }) => (\n <svg\n className={cn(\n \"h-3 w-3\",\n active ? \"text-default\" : \"text-muted\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m18 15-6-6-6 6\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = ({ active }: { active?: boolean }) => (\n <svg\n className={cn(\n \"h-3 w-3\",\n active ? \"text-default\" : \"text-muted\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m6 9 6 6 6-6\"\n />\n </svg>\n);\n\nconst ChevronLeftIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m15 18-6-6 6-6\"\n />\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m9 18 6-6-6-6\"\n />\n </svg>\n);\n\nconst ChevronsLeftIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m11 17-5-5 5-5m6 10-5-5 5-5\"\n />\n </svg>\n);\n\nconst ChevronsRightIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m7 17 5-5-5-5m6 10 5-5-5-5\"\n />\n </svg>\n);\n\nconst ChevronDownSmallIcon = () => (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m6 9 6 6 6-6\"\n />\n </svg>\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-[160px]\">\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-[160px] btn btn o__secondary\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center space-x-1 max-w-[240px]\">\n <div className=\"relative\">\n <details className=\"group\">\n <summary className=\"flex items-center space-x-2 cursor-pointer rounded-full px-3 py-2 text-sm btn btn o__secondary\">\n <span>{props.label}</span>\n <span className=\"text-default\">\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-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-module border border-neutral rounded-[10px] shadow-[var(--shadow-dropdown)] 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-neutral-container text-sm text-default 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-neutral-container text-sm text-default flex items-center space-x-2 mt-2\"\n onClick={() => handleChange(null)}\n >\n <span className=\"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-[var(--text-default)] border-collapse\",\n className\n );\n\n const headerClasses = cn(\"bg-[var(--base-module)]\");\n\n const cellClasses = cn(\n \"text-[var(--text-default)] p-3 border-b border-[var(--neutral-border)]\"\n );\n\n const rowClasses = cn(\"h-12\", {\n \"hover:bg-[var(--neutral-container)] dark:hover:bg-[var(--neutral-container-emphasis)]\":\n 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-[200px]\">\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-[400px]\">\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-neutral [&:not(:checked)]:bg-[var(--base-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-[var(--text-muted)] uppercase tracking-wider\",\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-module\":\n column.sticky === \"left\",\n \"sticky right-0 bg-module\":\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-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-container\": 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-neutral [&:not(:checked)]:bg-[var(--base-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-module\":\n column.sticky === \"left\",\n \"sticky right-0 bg-module\":\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-muted hover:text-default\">\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-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-muted\">\n Rows per page:\n </span>\n <select\n value={pagination.pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n className=\"border border-[var(--neutral-border)] text-[var(--text-default)] rounded-md px-2 py-1 text-sm bg-[var(--base-input)] w-16\"\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-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-neutral', 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-200',\n {\n 'border-[var(--accent-fill)] text-default': currentActiveTab === item.id,\n 'border-transparent text-muted hover:text-default':\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-container text-accent'\n : 'bg-neutral-container 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-neutral px-2': variant === 'default' || variant === 'underline',\n 'bg-neutral-container 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-200 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-[var(--accent-fill)] text-default': variant === 'default' || variant === 'underline',\n 'bg-module text-default shadow-lvl-0': variant === 'pills',\n } : {};\n\n // Non-active, non-disabled state classes\n const inactiveClasses = !isActive && !item.disabled ? {\n 'border-transparent text-muted hover:text-default': variant === 'default',\n 'text-muted hover:text-default': variant === 'pills',\n 'border-transparent text-muted hover:text-default hover:border-neutral': 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-neutral-container-emphasis 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 { 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-50 flex items-center justify-center p-4',\n 'bg-[var(--base-modal-blanket)]',\n // 'animate-fade-in',\n backdropClassName\n )}\n onClick={handleBackdropClick}\n >\n <div\n ref={modalRef}\n className={cn(\n 'relative w-full bg-module rounded-2xl shadow-[var(--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-default\"\n >\n {title}\n </span>\n )}\n \n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-muted hover:text-default transition-colors\"\n aria-label=\"Close modal\"\n >\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\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 component with theme integration and typography variants\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 // Default element based on variant\n const defaultElement = as || getDefaultElement(variant);\n \n const textClasses = cn(\n // Base styles\n 'font-primary',\n \n // Variant styles\n {\n 'leading-relaxed': variant === 'body',\n 'text-sm leading-tight': variant === 'caption',\n 'text-sm font-medium leading-none': variant === 'label',\n 'font-mono text-sm bg-neutral-container px-1 py-0.5 rounded': variant === 'code',\n },\n \n // Size variants (override variant sizes)\n variant !== 'code' && {\n 'text-xs': size === 'xs',\n 'text-sm': size === 'sm',\n 'text-base': size === 'md',\n 'text-lg': size === 'lg',\n 'text-xl': size === 'xl',\n },\n \n // Weight variants\n variant !== 'label' && {\n 'font-light': weight === 'light',\n 'font-normal': weight === 'normal',\n 'font-medium': weight === 'medium',\n 'font-semibold': weight === 'semibold',\n 'font-bold': weight === 'bold',\n },\n \n // Color variants. Tekst-tonen lopen via de semantische `--text-*` tokens\n // (gedefinieerd voor light én dark in global.css) zodat ze matchen met de\n // rest van de interface (zelfde tokens als bv. Table). De `--text-*` vars\n // worden in `.dark` overschreven, dus geen aparte `dark:`-varianten nodig.\n {\n 'text-default': color === 'primary',\n 'text-muted': color === 'secondary',\n 'text-[var(--text-accent)]': color === 'accent',\n 'text-[var(--text-success)]': color === 'success',\n 'text-warning': color === 'warning',\n 'text-[var(--text-error)]': color === 'error',\n 'text-info': color === 'info',\n 'text-[var(--text-default)]': color === 'neutral',\n 'text-current': color === 'current',\n 'text-[var(--text-muted)]': color === 'muted',\n },\n \n // Alignment\n {\n 'text-left': align === 'left',\n 'text-center': align === 'center',\n 'text-right': align === 'right',\n 'text-justify': align === 'justify',\n },\n \n // Line height (override variant line heights)\n variant === 'body' && {\n 'leading-tight': lineHeight === 'tight',\n 'leading-normal': lineHeight === 'normal',\n 'leading-relaxed': lineHeight === 'relaxed',\n },\n \n // Text decorations\n {\n 'italic': italic,\n 'underline': underline,\n 'truncate': truncate,\n },\n \n className\n );\n\n const Tag = defaultElement as keyof React.JSX.IntrinsicElements;\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} ","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-neutral-emphasis bg-module\",\n error ? \"border-error\" : \"border-neutral\",\n disabled && \"opacity-50 cursor-not-allowed bg-module-subtle\"\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-default font-medium\">{selectedPointer.name}</span>\n ) : (\n <span className=\"text-sm text-muted\">{placeholder}</span>\n )}\n </div>\n\n {selectedPointer && !disabled && (\n <button\n onClick={handleClear}\n className=\"p-1 hover:bg-neutral-container rounded\"\n >\n <Icon icon={X} size=\"xs\" />\n </button>\n )}\n </div>\n\n {error && (\n <Text variant=\"body\" size=\"xs\" className=\"text-error\">\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-muted overflow-hidden bg-neutral-container px-2 py-1 rounded\">\n <span className=\"truncate\">{currentPath}</span>\n </div>\n\n <div className=\"flex-grow min-w-[150px]\">\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-module-subtle rounded-lg border border-neutral\">\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-[400px] overflow-auto rounded-lg border border-neutral\">\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-[400px] overflow-auto rounded-lg border border-neutral\">\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-neutral rounded-xl bg-module-subtle/50\">\n <div className=\"p-4 bg-accent-container 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-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 <div className={cn(\n \"inline-flex items-center justify-center font-medium rounded-lg transition-colors duration-200 px-6 py-3 text-base bg-accent-fill text-on-accent hover:opacity-90\",\n loading && \"opacity-50 cursor-wait\"\n )}>\n {loading && (\n <svg className=\"animate-spin h-4 w-4 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" 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 </svg>\n )}\n Browse Local File\n </div>\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 { 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 { FilePointer, InternalSDK, VirtualMount } from \"@opencxh/domain\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../action/Button\";\nimport { Checkbox } from \"../input/Checkbox\";\nimport { DatePicker } from \"../input/DatePicker\";\nimport { Select } from \"../input/Select\";\nimport { FolderSelect, type FolderDestination } from \"../input/FolderSelect\";\nimport { StorageInput } from \"../input/StorageInput\";\nimport { TextArea } from \"../input/TextArea\";\nimport { TextField } from \"../input/TextField\";\nimport { Text } from \"../typography/Text\";\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 console.log(\"handleSubmit\");\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 console.log(\"newErrors\", 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=\"space-y-1\">\n {item.options?.map((option) => (\n <label key={option.value} className=\"flex items-center gap-2\">\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=\"rounded-full border-neutral\"\n />\n <Text variant=\"label\" size=\"sm\">\n {option.label}\n </Text>\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=\"space-y-2\">\n {arrayValue.map((row, index) => (\n <div\n key={index}\n className=\"p-4 border border-neutral rounded-lg bg-module space-y-2 relative\"\n >\n <div className=\"absolute top-2 right-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleRemoveItem(index)}\n disabled={isDisabled}\n >\n Remove\n </Button>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\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=\"space-y-1\"\n >\n <label className=\"block\">\n <span className=\"block text-[10.5px] font-ui-650 uppercase tracking-[0.08em] text-muted\">\n {subField.label}\n {subField.required && (\n <span className=\"text-error ml-1\">*</span>\n )}\n </span>\n </label>\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=\"space-y-1\">\n {subField.options?.map((option) => (\n <label\n key={option.value}\n className=\"flex items-center gap-2\"\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=\"rounded-full border-neutral\"\n />\n <Text variant=\"label\" size=\"sm\">\n {option.label}\n </Text>\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 <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-error\"\n >\n {subFieldError}\n </Text>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleAddItem}\n disabled={isDisabled}\n >\n Add {item.label}\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 \"space-y-2\",\n {\n \"grid gap-2\": group.layout === \"grid\",\n \"flex flex-wrap gap-2\": 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-6 p-5 border border-neutral rounded-xl bg-module\"\n >\n {/* Group Header */}\n <div className=\"md:col-span-1\">\n <Text\n variant=\"label\"\n size=\"md\"\n weight=\"semibold\"\n className=\"text-default\"\n >\n {group.title}\n </Text>\n {group.description && (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-muted mt-1 leading-relaxed\"\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 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 \"space-y-1\",\n item.width &&\n typeof item.width === \"string\" &&\n `w-[${item.width}]`,\n item.width &&\n typeof item.width === \"number\" &&\n `col-span-${item.width}`\n )}\n >\n {/* Field Label */}\n {item.type !== \"custom\" && (\n <label className=\"block text-[10.5px] font-ui-650 uppercase tracking-[0.08em] text-muted\">\n {item.label}\n {item.required && (\n <span className=\"text-error ml-1\">*</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 \"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 <form ref={ref} onSubmit={handleSubmit} className={formClasses}>\n {/* Form Groups */}\n <div className=\"space-y-8\">{groups.map(renderGroup)}</div>\n\n {/* Form Buttons */}\n {showButtons && (\n <div className={cn(\"flex gap-3 justify-end pt-8\")}>\n {onCancel && (\n <Button\n type=\"button\"\n variant={cancelButton.variant}\n size={cancelButton.size || size}\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 || size}\n disabled={submitButton.disabled || loading}\n loading={loading}\n className={submitButton.className}\n >\n {submitButton.label}\n </Button>\n </div>\n )}\n </form>\n );\n};\n","import React from 'react';\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';\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-neutral-container text-default',\n primary: 'bg-accent-container text-accent',\n secondary: 'bg-neutral-container text-muted',\n success: 'bg-success-container text-success',\n warning: 'bg-notice-container text-on-notice',\n error: 'bg-error-container text-error',\n info: 'bg-beta-container text-link',\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-neutral-fill',\n primary: 'bg-accent-fill',\n secondary: 'bg-neutral-fill',\n success: 'bg-success-fill',\n warning: 'bg-notice-fill',\n error: 'bg-error-fill',\n info: 'bg-beta-fill',\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 <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\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-neutral-container text-muted\",\n success: \"bg-success-container text-success\",\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=\"✓\"\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-2xl border border-neutral bg-module px-11 py-9 shadow-lvl-1\",\n className,\n )}\n {...props}\n >\n {icon != null && (\n <span className={cn(\"flex h-[52px] w-[52px] items-center justify-center rounded-full text-2xl\", toneDisc[tone])}>\n {icon}\n </span>\n )}\n <div className=\"text-lg font-ui-650 text-default\">{title}</div>\n {description && <div className=\"max-w-sm text-sm leading-relaxed 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-neutral px-1.5 py-px text-[10px] font-medium leading-none 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-fill\",\n success: \"bg-success-fill\",\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-neutral-container\", 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-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-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 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 glyph; defaults to the ✦ sparkle. */\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 = \"✦\", 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-[var(--assistant-border)] bg-[var(--assistant-tint)]\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2 text-[var(--assistant-accent)]\">\n <span aria-hidden>{icon}</span>\n <span className=\"text-sm font-ui-650\">{title}</span>\n {action && <span className=\"ml-auto\">{action}</span>}\n </div>\n {children && <div className=\"text-sm leading-relaxed text-default\">{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-[10px]\",\n sm: \"w-6 h-6 text-xs\",\n md: \"w-7 h-7 text-[13px]\",\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-neutral-border-emphasis text-default\",\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 = \"shadow-[0_0_0_2px_var(--base-module)]\";\nconst OWNER_RING = \"shadow-[0_0_0_2px_var(--base-module),0_0_0_3.5px_var(--accent-border)]\";\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-neutral-container text-muted\",\n size === \"xs\" ? \"w-5 h-5 text-[10px]\" : size === \"md\" ? \"w-7 h-7 text-[11px]\" : size === \"lg\" ? \"w-9 h-9 text-xs\" : \"w-6 h-6 text-[10px]\",\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\nconst CH: Record<ChannelKey, { fg: string; bg: string }> = {\n mail: { fg: \"text-ch-mail\", bg: \"bg-ch-mail\" },\n wa: { fg: \"text-ch-wa\", bg: \"bg-ch-wa\" },\n chat: { fg: \"text-ch-chat\", bg: \"bg-ch-chat\" },\n tel: { fg: \"text-ch-tel\", bg: \"bg-ch-tel\" },\n note: { fg: \"text-ch-note\", bg: \"bg-ch-note\" },\n};\n\nconst sizes: Record<NonNullable<ChannelBadgeProps[\"size\"]>, string> = {\n sm: \"h-[18px] w-[18px] rounded-[5px] text-[9.5px]\",\n md: \"h-6 w-6 rounded-[7px] text-[11px]\",\n lg: \"h-[34px] w-[34px] rounded-[10px] text-[13px]\",\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 * `--ch-*` 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 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-default\",\n urgent: \"text-urgency\",\n success: \"text-success\",\n};\n\nconst cardTone: Record<NonNullable<KpiCardProps[\"tone\"]>, string> = {\n default: \"border-neutral\",\n urgent: \"border-error\",\n success: \"border-neutral\",\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-module px-4 py-3.5\", cardTone[tone], className)} {...props}>\n <div className={cn(\"text-2xl font-ui-650\", valueTone[tone])}>{value}</div>\n <div className=\"pt-0.5 text-xs text-muted\">{label}</div>\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface SourceChipProps {\n /** Label — the linked conversation subject. */\n label: React.ReactNode;\n /** Optional leading dot colour (a `--dot-*` / channel CSS var, or any colour). */\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(--dot-finance)\" 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-neutral-container px-2.5 py-1 text-xs text-muted transition-colors hover:bg-neutral-container-emphasis\",\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 <span aria-hidden className=\"shrink-0 opacity-70\">↗</span>\n </button>\n );\n}\n","import React, { useState } from 'react';\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-neutral-container',\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-[3/4]': aspectRatio === 'portrait',\n 'aspect-[4/3]': 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-200',\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-muted'\n );\n\n const defaultLoadingContent = (\n <div className=\"animate-pulse\">\n <div className=\"w-6 h-6 bg-neutral-container-emphasis rounded\"></div>\n </div>\n );\n\n const defaultErrorContent = (\n <div className=\"text-center\">\n <svg\n className=\"w-6 h-6 mx-auto mb-1\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\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 { ArrowLeft, Pencil } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { SplitButton, type SplitButtonOption } from \"../action/SplitButton\";\nimport { cn } from \"../utils/cn\";\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 */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\";\n /** Whether action is disabled */\n disabled?: boolean;\n /** Dropdown options for split button */\n splitOptions?: SplitButtonOption[];\n}\n\nexport interface PageHeaderProps {\n /** Page title */\n title: string;\n /** Page subtitle/description */\n subtitle?: string;\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 = () => {\n return (\n <svg className=\"w-4 h-4 rotate-180\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n};\n\n/**\n * PageHeader component for consistent page layouts with title, actions, and breadcrumbs\n */\nexport const PageHeader: React.FC<PageHeaderProps> = ({\n title,\n subtitle,\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 border-b border-neutral\",\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 <div className=\"flex items-center gap-2 text-default\">\n {onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className={cn(\n \"flex items-center text-sm cursor-pointer transition\",\n backClassName\n )}\n >\n <ArrowLeft size={16} color=\"currentColor\" />\n </button>\n )}\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-neutral rounded-lg outline-none focus:border-none px-1 -mx-1 min-w-0 flex-1\"\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-ui-650 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-[13px] text-muted truncate\">{subtitle}</span>\n )}\n {editable && (\n <Pencil\n size={15}\n onClick={handleTitleClick}\n className=\"shrink-0 cursor-pointer text-muted opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n )}\n </div>\n )}\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.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 type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n className={cn(\"btn\", {\n o__primary: action.variant === \"primary\",\n o__secondary:\n action.variant === \"secondary\" ||\n action.variant === \"outline\",\n o__tertiary: action.variant === \"ghost\",\n o__destructive: action.variant === \"destructive\",\n })}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\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 { 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\n type=\"button\"\n onClick={onBack}\n className=\"flex items-center gap-1 text-sm text-muted hover:text-default cursor-pointer transition px-2 py-1 rounded\"\n >\n <ArrowLeft size={16} />\n <span>{backLabel}</span>\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 type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n (e.target as HTMLButtonElement).blur();\n action.onClick();\n }}\n disabled={action.disabled}\n className={cn(\"btn\", {\n o__primary: action.variant === \"primary\",\n o__secondary:\n action.variant === \"secondary\" ||\n action.variant === \"outline\",\n o__ghost: action.variant === \"ghost\",\n o__destructive: action.variant === \"destructive\",\n })}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </button>\n )\n )}\n </div>\n )}\n </div>\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-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-neutral 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-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-muted\"\n >\n {subField.label}\n </Text>\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"text-default\"\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-default\"\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-default\"\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-neutral 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-default\"\n >\n {group.title}\n </Text>\n {group.description && (\n <Text\n variant=\"body\"\n size=\"sm\"\n className=\"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={cn(\n \"space-y-1\",\n item.width &&\n typeof item.width === \"string\" &&\n `w-[${item.width}]`,\n item.width &&\n typeof item.width === \"number\" &&\n `col-span-${item.width}`\n )}\n >\n {/* Field Label */}\n {item.type !== \"custom\" && (\n <Text\n variant=\"label\"\n size=\"sm\"\n className=\"font-medium 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 { ChevronDownIcon } from \"lucide-react\";\nimport React, { useState } 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 /** Start ingeklapt (alleen relevant als er children zijn). Default false. */\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 [isCollapsed, setIsCollapsed] = useState(item.defaultCollapsed ?? false);\n const hasChildren = item.children && item.children.length > 0;\n // Alleen top-level groepen (bv. teams) krijgen bold. Geneste groepen met\n // children (bv. mailbox-mappen) blijven normaal gewicht — anders wordt de\n // hele folder-boom zwart/bold.\n const isTopLevelParent = hasChildren && depth === 0;\n\n const toggleCollapse = () => {\n if (hasChildren) {\n setIsCollapsed(!isCollapsed);\n }\n };\n\n const isSelected = isSelectedHandler ? isSelectedHandler(item.path) : false;\n\n return (\n <li>\n <div\n className={cn(\n \"flex flex-row w-full py-1 rounded-lg items-center h-8 transition-colors cursor-pointer px-2.5 pr-1 no-underline text-sm\",\n {\n \"bg-accent-container text-accent\": isSelected && !hasChildren,\n \"hover:bg-neutral-container\": !(isSelected && !hasChildren),\n \"font-semibold\": isSelected || isTopLevelParent,\n }\n )}\n onClick={() => {\n if (hasChildren) {\n toggleCollapse();\n } else if (item.path) {\n onClick?.(item.path);\n }\n }}\n >\n {item.icon && <span className=\"mr-2 shrink-0\">{item.icon}</span>}\n <span className=\"flex-1 min-w-0 truncate\">{item.label}</span>\n {item.count !== undefined && item.count > 0 && (\n <span className=\"ml-2 mr-1.5\">{item.count}</span>\n )}\n {hasChildren && (\n <span className={`${isCollapsed ? \"collapsed\" : \"\"}`}>\n <ChevronDownIcon className=\"w-4 h-4 text-muted\" />\n </span>\n )}\n </div>\n {hasChildren && !isCollapsed && (\n <ul className=\"sidebar-menu-nested-items mb-1\">\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 )}\n </li>\n );\n};\n\nexport const SidebarMenu: React.FC<SidebarMenuProps> = ({\n title,\n actionIcons,\n items,\n isSelectedHandler,\n onClick,\n preMenuItemsComponent,\n}) => {\n return (\n <div className=\"flex flex-col h-screen mb-6\">\n <div className=\"sidebar-menu-header\">\n <span className=\"text-[15px] font-ui-650 text-default mb-2\">\n {title}\n </span>\n <div className=\"sidebar-menu-actions\">\n {actionIcons?.map((icon, index) => (\n <span key={index} className=\"sidebar-menu-action-icon\">\n {icon}\n </span>\n ))}\n </div>\n </div>\n {preMenuItemsComponent && (\n <div className=\"sidebar-menu-pre-items mb-4\">\n {preMenuItemsComponent}\n </div>\n )}\n <ul>\n {items.map((item, index) =>\n !item.path && !item.label && !item.children ? (\n <span key={index} className=\"flex w-full h-4\" />\n ) : (\n <SidebarMenuItem\n key={index}\n item={item}\n isSelectedHandler={isSelectedHandler}\n onClick={onClick}\n />\n )\n )}\n </ul>\n </div>\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 component with semantic HTML and theme integration\n */\nexport const Heading: React.FC<HeadingProps> = ({\n level = 1,\n size,\n weight = 'bold',\n color = 'current',\n align = 'left',\n truncate = false,\n className,\n children,\n ...props\n}) => {\n // Default size based on level if not specified\n const defaultSize = size || getDefaultSize(level);\n \n const headingClasses = cn(\n 'font-primary',\n \n // Size variants\n {\n 'text-xs': defaultSize === 'xs',\n 'text-sm': defaultSize === 'sm',\n 'text-base': defaultSize === 'md',\n 'text-lg': defaultSize === 'lg',\n 'text-xl': defaultSize === 'xl',\n 'text-2xl': defaultSize === '2xl',\n 'text-3xl': defaultSize === '3xl',\n 'text-4xl': defaultSize === '4xl',\n },\n \n // Weight variants\n {\n 'font-light': weight === 'light',\n 'font-normal': weight === 'normal',\n 'font-medium': weight === 'medium',\n 'font-semibold': weight === 'semibold',\n 'font-bold': weight === 'bold',\n },\n \n // Color variants — semantische `--text-*` tokens (light+dark) net als Text/Table.\n {\n 'text-default': color === 'primary',\n 'text-muted': color === 'secondary',\n 'text-[var(--text-accent)]': color === 'accent',\n 'text-[var(--text-success)]': color === 'success',\n 'text-warning': color === 'warning',\n 'text-[var(--text-error)]': color === 'error',\n 'text-info': color === 'info',\n 'text-[var(--text-default)]': color === 'neutral',\n 'text-current': color === 'current',\n },\n \n // Alignment\n {\n 'text-left': align === 'left',\n 'text-center': align === 'center',\n 'text-right': align === 'right',\n },\n \n // Truncation\n {\n 'truncate': truncate,\n },\n \n className\n );\n\n const Tag = `h${level}` as keyof React.JSX.IntrinsicElements;\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: '4xl',\n 2: '3xl',\n 3: '2xl',\n 4: 'xl',\n 5: 'lg',\n 6: 'md',\n };\n \n return sizeMap[level] || 'md';\n} ","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ListItem {\n /** Unique identifier */\n id?: string;\n /** List item content */\n content: React.ReactNode;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Click handler for interactive lists */\n onClick?: () => void;\n}\n\nexport interface ListProps {\n /** List items */\n items: ListItem[];\n /** List type */\n type?: 'unordered' | 'ordered' | 'description';\n /** List variant */\n variant?: 'default' | 'flush' | 'bordered' | 'divided';\n /** List size */\n size?: 'sm' | 'md' | 'lg';\n /** Whether list items are interactive */\n interactive?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Additional CSS classes for list items */\n itemClassName?: string;\n}\n\n/**\n * List component with theme integration and multiple variants\n */\nexport const List: React.FC<ListProps> = ({\n items,\n type = 'unordered',\n variant = 'default',\n size = 'md',\n interactive = false,\n className,\n itemClassName,\n}) => {\n const listClasses = cn(\n // Base styles\n 'space-y-1',\n \n // Variant styles\n {\n // Default - basic spacing\n '': variant === 'default',\n \n // Flush - no padding\n 'space-y-0': variant === 'flush',\n \n // Bordered - border around entire list\n 'border border-neutral rounded-lg overflow-hidden': variant === 'bordered',\n \n // Divided - borders between items\n 'divide-y divide-[color:var(--neutral-border)]': variant === 'divided',\n },\n \n // Size variants\n {\n 'text-sm': size === 'sm',\n 'text-base': size === 'md',\n 'text-lg': size === 'lg',\n },\n \n className\n );\n\n const getItemClasses = (item: ListItem, index: number) => cn(\n // Base item styles\n 'transition-colors duration-200',\n \n // Size-based padding\n {\n 'py-1 px-2': size === 'sm' && (variant === 'bordered' || variant === 'divided'),\n 'py-2 px-3': size === 'md' && (variant === 'bordered' || variant === 'divided'),\n 'py-3 px-4': size === 'lg' && (variant === 'bordered' || variant === 'divided'),\n },\n \n // Interactive styles\n interactive && !item.disabled && {\n 'cursor-pointer hover:bg-neutral-container': true,\n 'focus:outline-none focus:bg-neutral-container': true,\n },\n \n // Disabled styles\n item.disabled && {\n 'opacity-50 cursor-not-allowed': true,\n },\n \n itemClassName\n );\n\n const handleItemClick = (item: ListItem) => {\n if (interactive && !item.disabled && item.onClick) {\n item.onClick();\n }\n };\n\n const handleItemKeyDown = (e: React.KeyboardEvent, item: ListItem) => {\n if (interactive && !item.disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n item.onClick?.();\n }\n };\n\n if (type === 'ordered') {\n return (\n <ol className={listClasses}>\n {items.map((item, index) => (\n <li\n key={item.id || index}\n className={getItemClasses(item, index)}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => handleItemKeyDown(e, item)}\n tabIndex={interactive && !item.disabled ? 0 : undefined}\n role={interactive ? 'button' : undefined}\n >\n {item.content}\n </li>\n ))}\n </ol>\n );\n }\n\n if (type === 'description') {\n return (\n <dl className={listClasses}>\n {items.map((item, index) => (\n <div\n key={item.id || index}\n className={getItemClasses(item, index)}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => handleItemKeyDown(e, item)}\n tabIndex={interactive && !item.disabled ? 0 : undefined}\n role={interactive ? 'button' : undefined}\n >\n {item.content}\n </div>\n ))}\n </dl>\n );\n }\n\n // Default to unordered list\n return (\n <ul className={listClasses}>\n {items.map((item, index) => (\n <li\n key={item.id || index}\n className={getItemClasses(item, index)}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => handleItemKeyDown(e, item)}\n tabIndex={interactive && !item.disabled ? 0 : undefined}\n role={interactive ? 'button' : undefined}\n >\n {item.content}\n </li>\n ))}\n </ul>\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-50 flex items-center justify-center bg-[var(--base-modal-blanket)]\">\n <div\n className=\"flex flex-col w-full max-w-lg max-h-[80vh] p-2 mx-auto rounded-2xl border border-neutral shadow-[var(--shadow-modal)] bg-module\"\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-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 py-2 text-default border-0 focus:outline-none focus:ring-0 focus:border-0 focus:shadow-none bg-transparent\"\n />\n </div>\n <div\n ref={listRef}\n className=\"mt-2 pt-2 text-sm border-t border-neutral max-h-[50vh] overflow-y-auto\"\n >\n {filteredCommands.length === 0 && (\n <div className=\"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-container text-accent\" : \"text-default\"\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-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-muted border-t border-neutral\">\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex items-center justify-center min-w-[1.25rem] px-1 py-0.5 rounded border border-neutral bg-module-subtle text-[10px] 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-[1.25rem] px-1 py-0.5 rounded border border-neutral bg-module-subtle text-[10px] 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-[1.25rem] px-1 py-0.5 rounded border border-neutral bg-module-subtle text-[10px] 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\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\nconst backgroundMap = {\n none: '',\n primary: 'bg-accent-fill',\n secondary: 'bg-neutral-container',\n accent: 'bg-accent-container',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-error',\n info: 'bg-info',\n neutral: 'bg-neutral',\n white: 'bg-white',\n module: 'bg-module',\n 'module-subtle': 'bg-module-subtle',\n backdrop: 'bg-backdrop',\n editor: 'bg-editor',\n input: 'bg-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\nconst shadowMap = {\n none: 'shadow-none',\n sm: 'shadow-lvl-0',\n md: 'shadow-lvl-1',\n lg: 'shadow-lvl-2',\n xl: 'shadow-lvl-3',\n '2xl': 'shadow-lvl-3',\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',\n secondary: 'border-neutral',\n accent: 'border-accent',\n success: 'border-[var(--success-border)]',\n warning: 'border-[var(--notice-border)]',\n error: 'border-error',\n info: 'border-beta',\n neutral: 'border-neutral',\n white: 'border-[var(--base-module)]',\n};\n\n/**\n * Box primitive component for layout and styling\n * \n * @example\n * ```tsx\n * <Box padding=\"md\" background=\"primary\" radius=\"lg\">\n * Content\n * </Box>\n * \n * <Box as=\"section\" padding=\"lg\" shadow=\"md\">\n * <h2>Section Title</h2>\n * <p>Section content</p>\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'; ","import { Box, BoxProps } from \"./Box\";\n\nexport interface CardProps extends BoxProps {\n children: React.ReactNode;\n title?: string;\n}\n\nexport const Card = ({ children, title, ...props }: CardProps) => {\n return (\n <Box background='module' radius='xl' shadow='sm' border='sm' borderColor='neutral' {...props}>\n {title && <span className=\"text-base font-medium text-default mb-2\">{title}</span>}\n {children}\n </Box>\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-error bg-error-container rounded-lg\">\n <h2 className=\"text-lg font-semibold text-error\">Something went wrong</h2>\n <p className=\"text-sm text-error 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-error-fill 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","children","disabled","props","isDisabled","ButtonGroup","orientation","attached","baseClasses","Chevron","FilterChip","label","caret","onClear","onClick","e","Link","color","external","href","target","rel","isExternal","linkProps","SegmentedToggle","options","onChange","ariaLabel","opt","Popover","trigger","placement","triggerLabel","isOpen","setIsOpen","useState","panelPos","setPanelPos","rootRef","triggerRef","onDown","event","onEsc","handleToggle","r","pos","open","close","variantStyles","SplitButton","icon","menuPlacement","menuLabel","hasMenu","ChevronDown","Fragment","option","checkboxSizes","labelSizes","Checkbox","helperText","error","indeterminate","containerClassName","labelClassName","id","checkboxId","hasError","React","CalendarIcon","ChevronLeftIcon","ChevronRightIcon","DatePicker","placeholder","required","minDate","maxDate","format","currentMonth","setCurrentMonth","containerRef","handleClickOutside","formatDate","date","day","month","year","getCalendarDays","firstDay","startDate","days","current","handleDateSelect","handlePrevMonth","handleNextMonth","handleClear","inputClasses","calendarDays","monthNames","index","isCurrentMonth","isSelected","isToday","classes","SearchIcon","ChevronDownIcon","inputSizes","iconSizes","SearchableTextField","startIcon","externalLoading","onRemoteSearch","onSelect","debounceTime","showAllOnOpen","propValue","inputId","inputRef","inputValue","setInputValue","isSearchingRemote","setIsSearchingRemote","typedSinceOpen","setTypedSinceOpen","filteredOptions","useMemo","lowerCaseInput","handler","handleChange","newValue","handleSelect","handleFocus","showDropdown","resolvedRef","prev","selectSizes","norm","s","Select","searchable","multiple","allowCreate","onCreateOption","selectId","searchTerm","setSearchTerm","localOptions","setLocalOptions","includesOption","opts","needle","o","ensureValuesInOptions","baseOptions","currentValue","out","addIfMissing","v","val","next","optionValue","currentValues","newValues","selectedOption","selectedOptions","canCreate","createOption","labelToCreate","clean","newOption","getDisplayValue","textareaSizes","TextArea","rows","textareaId","TextField","endIcon","Icon","IconComponent","clickable","sizeValue","getSizeValue","iconClasses","iconProps","ContentLoading","showTableSkeleton","tableColumns","tableRows","_","idx","rowIdx","colIdx","Dropdown","showCheck","header","hoveredOption","setHoveredOption","submenuPosition","setSubmenuPosition","menuPos","setMenuPos","dropdownRef","submenuRef","hideTimeoutRef","handleEscape","hoveredElement","rect","handleTriggerClick","handleOptionClick","parentValue","handleOptionHover","handleOptionLeave","handleSubmenuOptionClick","dropdownClasses","submenuClasses","hasChildren","isHovered","childOption","childIndex","totalOptions","count","childCount","child","ChevronUpIcon","ChevronsLeftIcon","ChevronsRightIcon","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","checked","rowKey","handleSelectAll","f","totalItems","totalPages","startItem","endItem","allVisibleSelected","selectedRow","someVisibleSelected","tableClasses","headerClasses","cellClasses","rowClasses","el","action","actionId","TabsContext","createContext","TabBar","items","activeTab","onTabChange","internalActiveTab","setInternalActiveTab","currentActiveTab","handleTabClick","tabId","item","Tabs","defaultTab","handleTabChange","contextValue","activeTabItem","tabListClasses","tabClasses","isActive","sizeClasses","variantClasses","stateClasses","activeClasses","inactiveClasses","modalSizes","Modal","onClose","title","closeOnBackdropClick","closeOnEscape","backdropClassName","footer","showCloseButton","modalRef","previousActiveElement","handleBackdropClick","Text","weight","align","truncate","italic","underline","lineHeight","as","defaultElement","getDefaultElement","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","folders","files","path","parts","p","handleFolderClick","folderName","handleGoBack","tableData","explorerColumns","Folder","FileText","mountColumns","HardDrive","X","ArrowLeft","Search","FolderPlus","Upload","FolderSelect","onListFolders","templatePlaceholder","showTemplate","setFolders","res","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","renderGroup","visibleItems","groupClasses","formClasses","badgeVariants","badgeSizes","dotColors","Badge","dot","dismissible","onDismiss","toneDisc","EmptyState","tone","description","card","Kbd","trackSizes","fillVariants","ProgressBar","pct","spinnerSizes","spinnerColors","Spinner","showLabel","AssistantCard","initials","Avatar","src","errored","setErrored","base","RING","OWNER_RING","AvatarStack","people","max","shown","overflow","CH","ChannelBadge","channel","valueTone","cardTone","KpiCard","SourceChip","dotColor","Image","alt","aspectRatio","radius","showLoading","showError","fallback","loadingContent","errorContent","onLoad","onError","isLoading","setIsLoading","setHasError","currentSrc","setCurrentSrc","handleLoad","handleError","containerClasses","imageClasses","placeholderClasses","defaultLoadingContent","defaultErrorContent","PageHeader","subtitle","backLabel","backClassName","onBack","editable","onTitleChange","isEditing","setIsEditing","editValue","setEditValue","handleTitleClick","handleBlur","handleKeyDown","Pencil","PageToolbar","View","formatCheckbox","getOptionLabel","subValue","displayValue","formatted","viewClasses","SidebarMenuItem","isSelectedHandler","depth","isCollapsed","setIsCollapsed","isTopLevelParent","toggleCollapse","SidebarMenu","actionIcons","preMenuItemsComponent","Heading","level","defaultSize","getDefaultSize","headingClasses","Tag","List","type","interactive","itemClassName","listClasses","getItemClasses","handleItemClick","handleItemKeyDown","CommandPalette","commands","labels","initialCommandPath","initialActiveIndex","activeCommandPath","setActiveCommandPath","activeIndex","setActiveIndex","paletteRef","listRef","filteredCommands","c","command","prevIndex","ChevronRight","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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"}
|