@cmgfi/clear-ds 1.1.6 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/Checkbox/Checkbox.tsx","../src/components/InputText/InputText.tsx","../src/components/ListBox/ListBox.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/Select/Select.tsx","../src/components/IconButton/IconButton.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/SelectButton/SelectButton.tsx","../src/components/TextArea/TextArea.tsx","../src/components/ToggleSwitch/ToggleSwitch.tsx","../src/components/Button/Button.tsx","../src/components/DropdownButton/DropdownButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/SplitButton/SplitButton.tsx","../src/components/Paginator/Paginator.tsx","../src/components/Picklist/Picklist.tsx","../src/components/Card/Card.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Tabs/Tabs.tsx","../src/components/BannerTabs/BannerTabs.tsx","../src/components/Drawer/Drawer.tsx","../src/components/Toast/Toast.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/ProgressSpinner/clear-logo.png","../src/components/ProgressSpinner/ProgressSpinner.tsx","../src/components/MiscChip/MiscChip.tsx","../src/components/SeverityChip/SeverityChip.tsx","../src/components/ProfileChip/ProfileChip.tsx","../src/components/AUSChip/AUSChip.tsx","../src/components/Alert/BannerAlert.tsx","../src/components/Alert/InlineContainedAlert.tsx","../src/components/Alert/InlineAlert.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Modal/Modal.tsx","../src/components/Popup/Popup.tsx","../src/components/SidePanel/SidePanel.tsx","../src/components/SidePanel/SidePanelLayout.tsx","../src/components/URLATabsNav/_internal.tsx","../src/components/URLATabsNav/URLATabsNav.tsx","../src/components/URLATabsNav/URLATabsNavTablet.tsx","../src/components/URLATabsNav/URLATabsNavMobile.tsx","../src/components/TopBar/clear-logo.png","../src/components/TopBar/TopBar.tsx","../src/components/TopBar/clear-logo-clip.png","../src/components/TopBar/TopBarMobile.tsx","../src/components/LightningButton/LightningButton.tsx","../src/components/LoanBannerNav/LoanBannerNav.tsx","../src/components/DataTable/DataTableFilter.tsx","../src/components/DataTable/DataTable.tsx","../src/components/FullNav/FullNav.tsx","../src/components/FullNav/FullNavMobile.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef } from 'react';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'size'> {\n /** The visible label next to the checkbox. */\n label?: React.ReactNode;\n /** When true, renders a dash instead of a checkmark (useful for \"select all\" patterns). */\n indeterminate?: boolean;\n /** Shows the invalid/error state with red border and label. */\n invalid?: boolean;\n /** Helper text shown below the checkbox. Shown in red when `invalid` is true. */\n helperText?: string;\n /** Size variant. sm = 14px box / 10px label, md = 18px box / 12px label (default), lg = 22px box / 14px label. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Checkbox — Clear Design System\n *\n * A fully accessible checkbox with label, indeterminate, invalid, and disabled states.\n * Three sizes (sm, md, lg) follow the type scale.\n *\n * @example\n * <Checkbox label=\"Remember me\" />\n *\n * @example\n * <Checkbox label=\"Agree to terms\" checked={agreed} onChange={(e) => setAgreed(e.target.checked)} />\n *\n * @example\n * <Checkbox label=\"Select all\" indeterminate />\n *\n * @example\n * <Checkbox label=\"Accept terms\" invalid helperText=\"You must accept the terms to continue.\" />\n *\n * @example\n * <Checkbox label=\"Dense option\" size=\"sm\" />\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n indeterminate = false,\n invalid = false,\n helperText,\n size = 'md',\n disabled = false,\n id,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n useEffect(() => {\n if (resolvedRef.current) {\n resolvedRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate, resolvedRef]);\n\n const wrapperClass = [\n styles.wrapper,\n styles[size],\n disabled ? styles.disabled : '',\n invalid ? styles.invalid : '',\n indeterminate ? styles.indeterminate : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div>\n <label className={wrapperClass} htmlFor={id}>\n <input\n ref={resolvedRef}\n type=\"checkbox\"\n id={id}\n disabled={disabled}\n className={styles.input}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n\n <span className={styles.box} aria-hidden=\"true\">\n <svg className={styles.checkmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n <span className={styles.dash} />\n </span>\n\n {label && <span className={styles.label}>{label}</span>}\n </label>\n\n {helperText && (\n <span className={invalid ? styles.errorText : styles.helperText}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef } from 'react';\nimport styles from './InputText.module.css';\n\nexport interface InputTextProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Field label displayed above the input. */\n label?: string;\n /** Appends a red asterisk to the label and sets `aria-required`. */\n required?: boolean;\n /** Helper or error text shown below the input. */\n helperText?: string;\n /** Triggers the error/invalid visual state with red styling. */\n invalid?: boolean;\n /** Size variant. Affects label size, input font size, and padding. */\n size?: 'sm' | 'md' | 'lg';\n /** Icon or element rendered to the left of the input text. */\n prefixIcon?: React.ReactNode;\n /** Icon or element rendered to the right of the input text. */\n suffixIcon?: React.ReactNode;\n /** Associates the label `htmlFor` and input `id`. Auto-generated if not provided. */\n id?: string;\n}\n\nlet _idCounter = 0;\n\n/**\n * InputText — Clear Design System\n *\n * A text input with label, helper text, prefix/suffix icon slots, and full state support.\n * Sizes follow the type scale (sm=10px, md=12px, lg=14px).\n *\n * @example\n * // Basic\n * <InputText label=\"Search\" placeholder=\"Enter a keyword\" />\n *\n * @example\n * // Required with helper text\n * <InputText label=\"Email\" required helperText=\"We'll never share your email.\" />\n *\n * @example\n * // Invalid / error state\n * <InputText label=\"Email\" invalid helperText=\"Please enter a valid email address.\" />\n *\n * @example\n * // With icons\n * <InputText\n * label=\"Search\"\n * prefixIcon={<i className=\"pi pi-search\" />}\n * suffixIcon={<i className=\"pi pi-times\" />}\n * />\n *\n * @example\n * // Large size\n * <InputText label=\"Full name\" size=\"lg\" placeholder=\"Jane Smith\" />\n */\nexport const InputText = forwardRef<HTMLInputElement, InputTextProps>(\n (\n {\n label,\n required = false,\n helperText,\n invalid = false,\n size = 'md',\n prefixIcon,\n suffixIcon,\n disabled = false,\n id: idProp,\n className,\n ...rest\n },\n ref,\n ) => {\n // Stable id for label↔input association\n const id = idProp ?? `inputtext-${++_idCounter}`;\n\n const rootClass = [\n styles.root,\n styles[size],\n invalid ? styles.invalid : '',\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n {label && (\n <label className={styles.labelRow} htmlFor={id}>\n <span className={styles.labelText}>{label}</span>\n {required && (\n <span className={styles.requiredMark} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <div className={styles.inputWrap}>\n {prefixIcon && (\n <span className={styles.iconSlot} aria-hidden=\"true\">\n {prefixIcon}\n </span>\n )}\n\n <input\n ref={ref}\n id={id}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? `${id}-helper` : undefined}\n className={styles.nativeInput}\n {...rest}\n />\n\n {suffixIcon && (\n <span className={`${styles.iconSlot} ${styles.iconSlotSuffix}`} aria-hidden=\"true\">\n {suffixIcon}\n </span>\n )}\n </div>\n\n {helperText && (\n <span id={`${id}-helper`} className={styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n );\n },\n);\n\nInputText.displayName = 'InputText';\n","import { forwardRef, useId, useState, useMemo } from 'react';\nimport styles from './ListBox.module.css';\n\nexport interface ListBoxOption {\n /** Displayed text. */\n label: string;\n /** Unique identifier used for selection state. */\n value: string;\n /** When true, this individual option is non-interactive. */\n disabled?: boolean;\n}\n\nexport interface ListBoxOptionGroup {\n /** Bold, non-selectable group header. */\n label: string;\n /** Selectable options nested under this group. */\n items: ListBoxOption[];\n}\n\nfunction isGroupedOptions(\n options: ListBoxOption[] | ListBoxOptionGroup[],\n): options is ListBoxOptionGroup[] {\n return options.length > 0 && 'items' in options[0];\n}\n\nexport interface ListBoxProps {\n /**\n * Flat list of options or grouped option sets.\n * Groups are detected automatically when each entry contains an `items` array.\n */\n options: ListBoxOption[] | ListBoxOptionGroup[];\n /**\n * Controlled selection. Pass a `string` for single-select or `string[]` for\n * multi-select. Pass `null` / `[]` to clear.\n */\n value?: string | string[] | null;\n /** Called when the user clicks an option. */\n onChange?: (value: string | string[] | null) => void;\n /** When true, renders a checkbox per option and allows multiple selection. */\n multiple?: boolean;\n /** When true, shows a search input above the option list. */\n filter?: boolean;\n /** Placeholder text for the search input. Defaults to \"Search…\". */\n filterPlaceholder?: string;\n /** Label rendered above the filter input. Only visible when `filter` is true or a label/helperText is provided. */\n label?: string;\n /** Adds a red asterisk to the label and sets `aria-required` on the filter input. */\n required?: boolean;\n /** Helper text rendered below the filter input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders a red border to signal a validation error. */\n invalid?: boolean;\n /** Disables the entire component — no interaction, muted colours. */\n disabled?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * ListBox — Clear Design System\n *\n * A scrollable list that lets users select one or more values. Supports\n * single-select, multi-select (checkboxes), a filter/search header, and\n * grouped option sets with bold group headers.\n *\n * @example\n * <ListBox options={items} value={val} onChange={setVal} />\n *\n * @example\n * <ListBox multiple options={items} value={vals} onChange={setVals} />\n *\n * @example\n * <ListBox multiple filter label=\"Loan Type\" options={items} value={vals} onChange={setVals} />\n *\n * @example\n * <ListBox multiple options={groupedItems} value={vals} onChange={setVals} />\n */\nexport const ListBox = forwardRef<HTMLDivElement, ListBoxProps>(\n (\n {\n options,\n value,\n onChange,\n multiple = false,\n filter = false,\n filterPlaceholder = 'Search\\u2026',\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n className,\n style,\n },\n ref,\n ) => {\n const uid = useId();\n const filterId = `${uid}-filter`;\n const helperId = `${uid}-helper`;\n const [filterText, setFilterText] = useState('');\n\n const selectedValues = useMemo<string[]>(() => {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const grouped = isGroupedOptions(options);\n\n function matchesFilter(optLabel: string): boolean {\n if (!filter || !filterText) return true;\n return optLabel.toLowerCase().includes(filterText.toLowerCase());\n }\n\n function handleOptionClick(optionValue: string) {\n if (disabled) return;\n if (multiple) {\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue];\n onChange?.(next);\n } else {\n onChange?.(selectedValues[0] === optionValue ? null : optionValue);\n }\n }\n\n function renderOption(opt: ListBoxOption, isGroupItem = false) {\n if (!matchesFilter(opt.label)) return null;\n\n const isSelected = selectedValues.includes(opt.value);\n const isDisabled = disabled || opt.disabled;\n\n const optClasses = [\n styles.option,\n isSelected ? styles.optionHighlight : '',\n isDisabled ? styles.optionDisabled : '',\n isGroupItem ? styles.optionGroupItem : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const isCheckedDisabled = isSelected && isDisabled;\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || undefined}\n className={optClasses}\n onClick={() => !isDisabled && handleOptionClick(opt.value)}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (!isDisabled) handleOptionClick(opt.value);\n }\n }}\n >\n {multiple && (\n <span\n aria-hidden=\"true\"\n className={[\n styles.checkbox,\n isSelected && !isDisabled ? styles.checkboxChecked : '',\n isDisabled ? styles.checkboxDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {isSelected && (\n <svg\n className={\n isCheckedDisabled\n ? `${styles.checkmark} ${styles.checkmarkDisabled}`\n : styles.checkmark\n }\n viewBox=\"0 0 11 11\"\n >\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n </span>\n )}\n\n <span\n className={\n isDisabled\n ? `${styles.optionLabel} ${styles.optionLabelDisabled}`\n : styles.optionLabel\n }\n >\n {opt.label}\n </span>\n </div>\n );\n }\n\n function renderOptions() {\n if (grouped) {\n return (options as ListBoxOptionGroup[]).map((group) => {\n const items = group.items\n .map((opt) => renderOption(opt, true))\n .filter(Boolean);\n if (items.length === 0) return null;\n return (\n <div key={group.label}>\n <div className={styles.groupHeader}>{group.label}</div>\n {items}\n </div>\n );\n });\n }\n return (options as ListBoxOption[]).map((opt) => renderOption(opt));\n }\n\n const containerClasses = [\n styles.listbox,\n invalid ? styles.invalid : '',\n disabled ? styles.listboxDisabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showHeader = filter || !!(label || helperText);\n\n return (\n <div ref={ref} className={containerClasses} style={style}>\n {showHeader && (\n <div className={styles.header}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={filterId}>\n {label}\n </label>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n {filter && (\n <div className={styles.inputWrap}>\n <input\n id={filterId}\n type=\"text\"\n className={styles.filterInput}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={(e) => setFilterText(e.target.value)}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n />\n {filterText ? (\n <button\n type=\"button\"\n className={styles.iconButton}\n onClick={() => setFilterText('')}\n aria-label=\"Clear filter\"\n tabIndex={-1}\n disabled={disabled}\n >\n <svg viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 5L9 9M9 5L5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : (\n <span className={styles.iconSearch} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9.5 9.5L12.5 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n )}\n </div>\n )}\n\n {helperText && (\n <span\n id={helperId}\n className={invalid ? styles.errorText : styles.helperText}\n >\n {helperText}\n </span>\n )}\n </div>\n )}\n\n <div\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-disabled={disabled || undefined}\n className={styles.list}\n >\n {renderOptions()}\n </div>\n </div>\n );\n },\n);\n\nListBox.displayName = 'ListBox';\n","import { forwardRef, useRef } from 'react';\nimport styles from './RadioButton.module.css';\n\nexport interface RadioButtonProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'size'> {\n /** The visible label next to the radio button. */\n label?: React.ReactNode;\n /** Shows the invalid/error state with red border and label. */\n invalid?: boolean;\n /** Helper text shown below the radio button. Shown in red when `invalid` is true. */\n helperText?: string;\n /** Size variant. sm = 14px / md = 18px (default) / lg = 22px. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * RadioButton — Clear Design System\n *\n * A fully accessible radio button with label, invalid, and disabled states.\n * Three sizes (sm, md, lg) follow the type scale. Group multiple RadioButtons\n * under a shared `name` prop so the browser enforces single selection.\n *\n * @example\n * <RadioButton name=\"plan\" value=\"basic\" label=\"Basic\" />\n *\n * @example\n * <RadioButton name=\"plan\" value=\"pro\" label=\"Pro\" checked onChange={handleChange} />\n *\n * @example\n * <RadioButton name=\"plan\" value=\"enterprise\" label=\"Enterprise\" invalid helperText=\"Contact sales first.\" />\n *\n * @example\n * <RadioButton name=\"plan\" value=\"basic\" label=\"Small\" size=\"sm\" />\n */\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\n (\n {\n label,\n invalid = false,\n helperText,\n size = 'md',\n disabled = false,\n id,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n const wrapperClass = [\n styles.wrapper,\n styles[size],\n disabled ? styles.disabled : '',\n invalid ? styles.invalid : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div>\n <label className={wrapperClass} htmlFor={id}>\n <input\n ref={resolvedRef}\n type=\"radio\"\n id={id}\n disabled={disabled}\n className={styles.input}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n\n <span className={styles.circle} aria-hidden=\"true\">\n <span className={styles.dot} />\n </span>\n\n {label && <span className={styles.label}>{label}</span>}\n </label>\n\n {helperText && (\n <span className={invalid ? styles.errorText : styles.helperText}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nRadioButton.displayName = 'RadioButton';\n","import { forwardRef, useRef, useState, useEffect, useMemo, useId } from 'react';\nimport styles from './MultiSelect.module.css';\n\nexport interface MultiSelectOption {\n /** Displayed text. */\n label: string;\n /** Unique identifier used in the value array. */\n value: string;\n /** When true, this option cannot be toggled. */\n disabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n /** List of options to display in the dropdown. */\n options: MultiSelectOption[];\n /** Controlled array of selected values. */\n value?: string[];\n /** Called when the selection changes. */\n onChange?: (value: string[]) => void;\n /** Placeholder shown in the trigger when nothing is selected. */\n placeholder?: string;\n /** Label shown above the trigger input. */\n label?: string;\n /** Adds a red asterisk to the label and sets aria-required. */\n required?: boolean;\n /** Helper text shown below the trigger input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the trigger with a red border and turns the helper text red. */\n invalid?: boolean;\n /** Disables the entire component — trigger and dropdown are non-interactive. */\n disabled?: boolean;\n /**\n * When true (default), shows a search input in the dropdown header\n * that filters the option list in real time.\n */\n filter?: boolean;\n /** Placeholder for the search input. Defaults to \"Search…\". */\n filterPlaceholder?: string;\n /**\n * When true (default), shows a \"Select all\" checkbox in the dropdown header.\n * The checkbox is indeterminate when some (but not all) options are selected.\n */\n showSelectAll?: boolean;\n /** Size variant that controls font size and trigger padding. sm = 10px / md = 12px (default) / lg = 14px. */\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * MultiSelect — Clear Design System\n *\n * A dropdown that lets users select multiple values via checkboxes.\n * Selected items appear as chips in the trigger. Supports live search/filter\n * and a \"Select all\" toggle. Three sizes follow the type scale.\n *\n * @example\n * <MultiSelect options={items} value={vals} onChange={setVals} label=\"Loan types\" />\n *\n * @example\n * <MultiSelect options={items} value={vals} onChange={setVals} required invalid helperText=\"Select at least one.\" />\n *\n * @example\n * <MultiSelect options={items} value={vals} onChange={setVals} filter={false} showSelectAll={false} />\n */\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = 'Select options\\u2026',\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n filter = true,\n filterPlaceholder = 'Search\\u2026',\n showSelectAll = true,\n size = 'md',\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const dropdownId = `${uid}-dropdown`;\n const triggerId = `${uid}-trigger`;\n const helperId = `${uid}-helper`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [filterText, setFilterText] = useState('');\n\n const internalRef = useRef<HTMLDivElement>(null);\n const selectAllRef = useRef<HTMLInputElement>(null);\n\n // Merge external and internal refs on the root element\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const selectedValues = value ?? [];\n\n const selectableOptions = useMemo(() => options.filter(o => !o.disabled), [options]);\n const isAllSelected = selectableOptions.length > 0 && selectableOptions.every(o => selectedValues.includes(o.value));\n const isNoneSelected = !selectableOptions.some(o => selectedValues.includes(o.value));\n const isSomeSelected = !isNoneSelected && !isAllSelected;\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) {\n setIsOpen(false);\n setFilterText('');\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Sync select-all indeterminate state\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = isSomeSelected;\n }\n }, [isSomeSelected]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n const filteredOptions = useMemo(() => {\n if (!filter || !filterText) return options;\n const q = filterText.toLowerCase();\n return options.filter(o => o.label.toLowerCase().includes(q));\n }, [options, filter, filterText]);\n\n function toggleOpen() {\n if (disabled) return;\n setIsOpen(prev => {\n if (prev) setFilterText('');\n return !prev;\n });\n }\n\n function toggleOption(optValue: string) {\n const next = selectedValues.includes(optValue)\n ? selectedValues.filter(v => v !== optValue)\n : [...selectedValues, optValue];\n onChange?.(next);\n }\n\n function removeValue(optValue: string) {\n onChange?.(selectedValues.filter(v => v !== optValue));\n }\n\n function handleSelectAll() {\n const allVals = selectableOptions.map(o => o.value);\n if (isAllSelected) {\n onChange?.(selectedValues.filter(v => !allVals.includes(v)));\n } else {\n onChange?.([...new Set([...selectedValues, ...allVals])]);\n }\n }\n\n function handleTriggerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleOpen(); }\n else if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n else if (e.key === 'ArrowDown' && !isOpen) { e.preventDefault(); setIsOpen(true); }\n }\n\n const rootClass = [styles.root, styles[size], disabled ? styles.rootDisabled : '', className ?? '']\n .filter(Boolean).join(' ');\n\n const triggerClass = [\n styles.trigger,\n isOpen ? styles.triggerOpen : '',\n invalid ? styles.triggerInvalid : '',\n disabled ? styles.triggerDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {/* ── Field (label + trigger + helper) ── */}\n <div className={styles.field}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={triggerId}>{label}</label>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n id={triggerId}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={dropdownId}\n aria-required={required || undefined}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n className={triggerClass}\n onClick={toggleOpen}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={styles.triggerContent}>\n {selectedValues.length === 0 ? (\n <span className={styles.placeholder}>{placeholder}</span>\n ) : (\n <span className={styles.chips}>\n {selectedValues.map(v => {\n const opt = options.find(o => o.value === v);\n if (!opt) return null;\n return (\n <span key={v} className={styles.chip}>\n <span className={styles.chipLabel}>{opt.label}</span>\n {!disabled && (\n <button\n type=\"button\"\n className={styles.chipRemove}\n onMouseDown={e => e.stopPropagation()}\n onClick={e => { e.stopPropagation(); removeValue(v); }}\n aria-label={`Remove ${opt.label}`}\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>\n );\n })}\n </span>\n )}\n </span>\n\n <span className={styles.chevron} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 8\" fill=\"none\">\n <path d=\"M1 1l6 6 6-6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n {helperText && (\n <span id={helperId} className={invalid ? styles.errorText : styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n\n {/* ── Dropdown overlay ── */}\n {isOpen && (\n <div id={dropdownId} role=\"listbox\" aria-multiselectable=\"true\" className={styles.dropdown}>\n {/* Header */}\n <div className={styles.dropdownHeader}>\n {showSelectAll && (\n <span\n className={styles.selectAllWrap}\n onClick={handleSelectAll}\n aria-label=\"Select all\"\n role=\"checkbox\"\n aria-checked={isAllSelected ? true : isSomeSelected ? 'mixed' : false}\n tabIndex={0}\n onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleSelectAll(); } }}\n >\n <input ref={selectAllRef} type=\"checkbox\" className={styles.hiddenInput} checked={isAllSelected} onChange={handleSelectAll} />\n <span\n aria-hidden=\"true\"\n className={[\n styles.cbBox,\n isAllSelected ? styles.cbChecked : '',\n isSomeSelected ? styles.cbIndeterminate : '',\n ].filter(Boolean).join(' ')}\n >\n {isAllSelected && (\n <svg className={styles.cbCheckmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n {isSomeSelected && <span className={styles.cbDash} />}\n </span>\n </span>\n )}\n\n {filter && (\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L12.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <input\n type=\"text\"\n className={styles.searchInput}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={e => setFilterText(e.target.value)}\n aria-label=\"Filter options\"\n autoComplete=\"off\"\n />\n {filterText && (\n <button\n type=\"button\"\n className={styles.searchClear}\n onClick={() => setFilterText('')}\n aria-label=\"Clear filter\"\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 5l4 4M9 5l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Options */}\n <div className={styles.optionList}>\n {filteredOptions.length === 0 ? (\n <div className={styles.noResults}>No results</div>\n ) : (\n filteredOptions.map(opt => {\n const isSelected = selectedValues.includes(opt.value);\n const isDisabled = opt.disabled;\n const optClass = [\n styles.option,\n isSelected ? styles.optionHighlight : '',\n isDisabled ? styles.optionDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || undefined}\n className={optClass}\n onClick={() => !isDisabled && toggleOption(opt.value)}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !isDisabled) {\n e.preventDefault();\n toggleOption(opt.value);\n }\n }}\n >\n <span\n aria-hidden=\"true\"\n className={[\n styles.optionCb,\n isSelected ? styles.optionCbChecked : '',\n ].filter(Boolean).join(' ')}\n >\n {isSelected && (\n <svg className={styles.optionCbCheckmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n </span>\n <span className={isSelected ? `${styles.optionLabel} ${styles.optionLabelHighlight}` : styles.optionLabel}>\n {opt.label}\n </span>\n </div>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nMultiSelect.displayName = 'MultiSelect';\n","import { forwardRef, useRef, useState, useEffect, useMemo, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport styles from './Select.module.css';\n\nexport interface SelectOption {\n /** Displayed text. */\n label: string;\n /** Unique identifier used for the value. */\n value: string;\n /** When true, this option cannot be selected. */\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /** List of options to display in the dropdown. */\n options: SelectOption[];\n /** Controlled selected value. Pass `null` to clear. */\n value?: string | null;\n /** Called when the user selects an option. Receives `null` when cleared. */\n onChange?: (value: string | null) => void;\n /** Placeholder shown in the trigger when nothing is selected. */\n placeholder?: string;\n /** Label shown above the trigger input. */\n label?: string;\n /** Adds a red asterisk to the label and sets aria-required. */\n required?: boolean;\n /** Helper text shown below the trigger input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the trigger with a red border, red text, and red helper text. */\n invalid?: boolean;\n /** Disables the entire component — non-interactive and visually muted. */\n disabled?: boolean;\n /**\n * When true, shows a search input at the top of the dropdown\n * that filters the option list in real time.\n */\n filter?: boolean;\n /** Placeholder for the search input. Defaults to \"Search…\". */\n filterPlaceholder?: string;\n /** Size variant. sm = 10px / md = 12px (default) / lg = 14px. */\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Select — Clear Design System\n *\n * A single-value dropdown. Selecting an option closes the dropdown immediately.\n * Supports an optional live-search filter, three sizes, and full state coverage:\n * idle, hover, active/open, filled, invalid, and disabled.\n *\n * @example\n * <Select options={opts} value={val} onChange={setVal} label=\"Loan type\" />\n *\n * @example\n * <Select options={opts} value={val} onChange={setVal} required invalid helperText=\"Required.\" />\n *\n * @example\n * <Select options={opts} value={val} onChange={setVal} filter size=\"lg\" />\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = 'Select\\u2026',\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n filter = false,\n filterPlaceholder = 'Search\\u2026',\n size = 'md',\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const dropdownId = `${uid}-dropdown`;\n const triggerId = `${uid}-trigger`;\n const helperId = `${uid}-helper`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [filterText, setFilterText] = useState('');\n\n const internalRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropPos, setDropPos] = useState<{ top: number; left: number; width: number } | null>(null);\n\n // Merge external + internal refs\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const selectedOption = options.find(o => o.value === value) ?? null;\n\n // Close on outside click — dropdown is portaled, so check both refs\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n const target = e.target as Node;\n if (\n !internalRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setIsOpen(false);\n setFilterText('');\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Position the portaled dropdown relative to the trigger; track scroll/resize\n useEffect(() => {\n if (!isOpen) return;\n function recompute() {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) setDropPos({ top: rect.bottom + 2, left: rect.left, width: rect.width });\n }\n recompute();\n window.addEventListener('scroll', recompute, true);\n window.addEventListener('resize', recompute);\n return () => {\n window.removeEventListener('scroll', recompute, true);\n window.removeEventListener('resize', recompute);\n };\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n const filteredOptions = useMemo(() => {\n if (!filter || !filterText) return options;\n const q = filterText.toLowerCase();\n return options.filter(o => o.label.toLowerCase().includes(q));\n }, [options, filter, filterText]);\n\n function toggleOpen() {\n if (disabled) return;\n setIsOpen(prev => {\n if (prev) setFilterText('');\n return !prev;\n });\n }\n\n function selectOption(optValue: string) {\n onChange?.(optValue);\n setIsOpen(false);\n setFilterText('');\n }\n\n function handleTriggerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleOpen(); }\n else if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n else if (e.key === 'ArrowDown' && !isOpen) { e.preventDefault(); setIsOpen(true); }\n }\n\n const isFilled = !!selectedOption;\n\n const rootClass = [styles.root, styles[size], disabled ? styles.rootDisabled : '', className ?? '']\n .filter(Boolean).join(' ');\n\n const triggerClass = [\n styles.trigger,\n isOpen ? styles.triggerOpen : '',\n invalid ? styles.triggerInvalid : '',\n disabled ? styles.triggerDisabled : '',\n isFilled && !invalid && !disabled ? styles.triggerFilled : '',\n ].filter(Boolean).join(' ');\n\n const chevronClass = [\n styles.chevron,\n invalid ? styles.chevronInvalid : '',\n disabled ? styles.chevronDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {/* ── Field (label + trigger + helper) ── */}\n <div className={styles.field}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={triggerId}>{label}</label>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n ref={triggerRef}\n id={triggerId}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={dropdownId}\n aria-required={required || undefined}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n className={triggerClass}\n onClick={toggleOpen}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={styles.triggerContent}>\n {selectedOption\n ? <span className={styles.triggerValue}>{selectedOption.label}</span>\n : <span className={styles.placeholder}>{placeholder}</span>\n }\n </span>\n\n <span className={chevronClass} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 8\" fill=\"none\">\n <path d=\"M1 1l6 6 6-6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n {helperText && (\n <span id={helperId} className={invalid ? styles.errorText : styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n\n {/* ── Dropdown overlay (portaled to body so it escapes any ancestor overflow).\n `data-popover-root` tells any ancestor popover with its own outside-click\n handler to ignore clicks here — without it, the parent popover would\n close before this dropdown's option-click handler runs. ── */}\n {isOpen && dropPos && createPortal(\n <div\n ref={dropdownRef}\n data-popover-root=\"\"\n id={dropdownId}\n role=\"listbox\"\n className={styles.dropdown}\n style={{ top: dropPos.top, left: dropPos.left, width: dropPos.width }}\n >\n {/* Optional filter header */}\n {filter && (\n <div className={styles.filterHeader}>\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L12.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <input\n type=\"text\"\n className={styles.searchInput}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={e => setFilterText(e.target.value)}\n aria-label=\"Filter options\"\n autoComplete=\"off\"\n />\n {filterText && (\n <button\n type=\"button\"\n className={styles.searchClear}\n onClick={() => setFilterText('')}\n aria-label=\"Clear filter\"\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 5l4 4M9 5l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Option list */}\n <div className={styles.optionList}>\n {filteredOptions.length === 0 ? (\n <div className={styles.noResults}>No results</div>\n ) : (\n filteredOptions.map(opt => {\n const isSelected = opt.value === value;\n const isDisabled = opt.disabled;\n const optClass = [\n styles.option,\n isSelected ? styles.optionHighlight : '',\n isDisabled ? styles.optionDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || undefined}\n className={optClass}\n onClick={() => !isDisabled && selectOption(opt.value)}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !isDisabled) {\n e.preventDefault();\n selectOption(opt.value);\n }\n }}\n >\n <span className={isSelected ? `${styles.optionLabel} ${styles.optionLabelHighlight}` : styles.optionLabel}>\n {opt.label}\n </span>\n </div>\n );\n })\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n","import { forwardRef } from 'react';\nimport styles from './IconButton.module.css';\nimport type { ButtonVariant, ButtonSize } from '../Button/Button';\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** The icon to display. Pass any React node (e.g. a PrimeIcon `<i className=\"pi pi-search\" />`). */\n icon: React.ReactNode;\n /** Visual style. Defaults to `'primary'`. */\n variant?: ButtonVariant;\n /**\n * Size variant. Sizes match the Figma spec and share Button's sizing ramp:\n * - `sm` = 24×24px\n * - `md` = 36×36px (default)\n * - `lg` = 40×40px\n */\n size?: ButtonSize;\n /**\n * Accessible label describing the button's action. Required for screen-reader support\n * since there is no visible text.\n */\n 'aria-label': string;\n}\n\n/**\n * IconButton — Clear Design System\n *\n * A circular icon-only button. Shares the same variants and sizes as Button.\n * Always requires an `aria-label` since there is no visible text.\n *\n * @example\n * <IconButton icon={<i className=\"pi pi-search\" />} aria-label=\"Search\" />\n *\n * @example\n * <IconButton icon={<i className=\"pi pi-trash\" />} aria-label=\"Delete\" variant=\"danger\" />\n *\n * @example\n * <IconButton icon={<i className=\"pi pi-plus\" />} aria-label=\"Add\" size=\"sm\" />\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n icon,\n variant = 'primary',\n size = 'md',\n className,\n disabled,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n styles.btn,\n styles[variant],\n styles[size],\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button ref={ref} className={cls} disabled={disabled} {...rest}>\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n </button>\n );\n },\n);\n\nIconButton.displayName = 'IconButton';\n","import { forwardRef, useRef, useState, useEffect, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconButton } from '../IconButton/IconButton';\nimport styles from './DatePicker.module.css';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const;\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] as const;\n\ntype View = 'day' | 'month' | 'year';\n\n// ─── Date utilities ───────────────────────────────────────────────────────────\n\nfunction formatDate(date: Date): string {\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${m}/${d}/${date.getFullYear()}`;\n}\n\nfunction parseInputDate(text: string): Date | null {\n const match = text.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (!match) return null;\n const month = parseInt(match[1], 10) - 1;\n const day = parseInt(match[2], 10);\n const year = parseInt(match[3], 10);\n if (month < 0 || month > 11 || day < 1 || day > 31 || year < 1000) return null;\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null;\n return date;\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n}\n\nfunction isDateDisabled(date: Date, minDate?: Date, maxDate?: Date): boolean {\n if (minDate) {\n const min = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());\n if (date < min) return true;\n }\n if (maxDate) {\n const max = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());\n if (date > max) return true;\n }\n return false;\n}\n\n/** Returns the calendar grid weeks (including leading/trailing outside days). */\nfunction getCalendarWeeks(year: number, month: number): Date[][] {\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() - startDate.getDay());\n const endDate = new Date(lastDay);\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\n const weeks: Date[][] = [];\n const cur = new Date(startDate);\n while (cur <= endDate) {\n const week: Date[] = [];\n for (let i = 0; i < 7; i++) {\n week.push(new Date(cur));\n cur.setDate(cur.getDate() + 1);\n }\n weeks.push(week);\n }\n return weeks;\n}\n\n/** ISO 8601 week number. */\nfunction getISOWeek(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\n/** Start year of the 8-year page that contains the given year. */\nfunction getYearPageStart(year: number): number {\n return Math.floor(year / 8) * 8;\n}\n\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\n\nconst CalendarIcon = () => (\n <svg viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"2.5\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M1 6h12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M4.5 1v3M9.5 1v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst ChevronLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 11L5 7l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface DatePickerProps {\n /** Controlled selected date. Pass `null` to clear. */\n value?: Date | null;\n /** Called when the user selects or clears a date. */\n onChange?: (date: Date | null) => void;\n /** Label shown above the input. */\n label?: string;\n /** Adds a red asterisk to the label. */\n required?: boolean;\n /** Helper text shown below the input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the input in error state with red border and red helper text. */\n invalid?: boolean;\n /** Disables the entire component. */\n disabled?: boolean;\n /** Placeholder for the text input. Defaults to \"MM/DD/YYYY\". */\n placeholder?: string;\n /** Dates before this date are disabled in the calendar. */\n minDate?: Date;\n /** Dates after this date are disabled in the calendar. */\n maxDate?: Date;\n /** When true (default), shows ISO week numbers as the first calendar column. */\n showWeekNumbers?: boolean;\n id?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * DatePicker — Clear Design System\n *\n * A date input with a popup calendar. Users can type a date directly (MM/DD/YYYY)\n * or pick one from the calendar. Three views: day, month, and year.\n *\n * @example\n * <DatePicker label=\"Closing date\" value={date} onChange={setDate} />\n *\n * @example\n * <DatePicker label=\"Start date\" value={date} onChange={setDate} minDate={new Date()} />\n *\n * @example\n * <DatePicker label=\"Date\" value={date} onChange={setDate} required invalid helperText=\"Required.\" />\n */\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n placeholder = 'MM/DD/YYYY',\n minDate,\n maxDate,\n showWeekNumbers = true,\n id: idProp,\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const inputId = idProp ?? `${uid}-input`;\n const helperId = `${uid}-helper`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [view, setView] = useState<View>('day');\n const [viewYear, setViewYear] = useState<number>(() => value?.getFullYear() ?? new Date().getFullYear());\n const [viewMonth, setViewMonth] = useState<number>(() => value?.getMonth() ?? new Date().getMonth());\n const [inputText, setInputText] = useState<string>(() => value ? formatDate(value) : '');\n\n const internalRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n const [calPos, setCalPos] = useState<{ top: number; left: number } | null>(null);\n\n // Merge external + internal refs\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n // Sync inputText when value changes externally\n useEffect(() => {\n const formatted = value ? formatDate(value) : '';\n if (inputRef.current !== document.activeElement) {\n setInputText(formatted);\n }\n if (value) {\n setViewYear(value.getFullYear());\n setViewMonth(value.getMonth());\n }\n }, [value]);\n\n // Close on outside click — calendar is portaled, so check both refs\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n const target = e.target as Node;\n if (\n !internalRef.current?.contains(target) &&\n !calendarRef.current?.contains(target)\n ) {\n close();\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Position the portaled calendar relative to the trigger; track scroll/resize\n useEffect(() => {\n if (!isOpen) return;\n function recompute() {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) setCalPos({ top: rect.bottom + 4, left: rect.left });\n }\n recompute();\n window.addEventListener('scroll', recompute, true);\n window.addEventListener('resize', recompute);\n return () => {\n window.removeEventListener('scroll', recompute, true);\n window.removeEventListener('resize', recompute);\n };\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') close();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n function open() {\n if (disabled) return;\n setIsOpen(prev => {\n if (!prev) setView('day'); // only reset to day view when freshly opening\n return true;\n });\n }\n\n function close() {\n setIsOpen(false);\n setView('day');\n }\n\n // ─── Navigation ───────────────────────────────────────────────────────────\n\n function navPrev() {\n if (view === 'day') {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(y => y - 1); }\n else setViewMonth(m => m - 1);\n } else if (view === 'month') {\n setViewYear(y => y - 1);\n } else {\n setViewYear(y => getYearPageStart(y) - 8);\n }\n }\n\n function navNext() {\n if (view === 'day') {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(y => y + 1); }\n else setViewMonth(m => m + 1);\n } else if (view === 'month') {\n setViewYear(y => y + 1);\n } else {\n setViewYear(y => getYearPageStart(y) + 8);\n }\n }\n\n // ─── Selection ────────────────────────────────────────────────────────────\n\n function selectDay(date: Date) {\n if (isDateDisabled(date, minDate, maxDate)) return;\n // If outside-month day, navigate to that month\n if (date.getMonth() !== viewMonth || date.getFullYear() !== viewYear) {\n setViewMonth(date.getMonth());\n setViewYear(date.getFullYear());\n }\n onChange?.(date);\n setInputText(formatDate(date));\n close();\n }\n\n function selectMonth(monthIdx: number) {\n setViewMonth(monthIdx);\n setView('day');\n }\n\n function selectYear(year: number) {\n setViewYear(year);\n setView('month');\n }\n\n function handleToday() {\n const todayDate = new Date();\n todayDate.setHours(0, 0, 0, 0);\n if (isDateDisabled(todayDate, minDate, maxDate)) return;\n onChange?.(todayDate);\n setInputText(formatDate(todayDate));\n setViewYear(todayDate.getFullYear());\n setViewMonth(todayDate.getMonth());\n close();\n }\n\n function handleClear() {\n onChange?.(null);\n setInputText('');\n // Stay open (per spec)\n }\n\n // ─── Input ────────────────────────────────────────────────────────────────\n\n function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {\n const text = e.target.value;\n setInputText(text);\n if (text === '') {\n onChange?.(null);\n return;\n }\n const parsed = parseInputDate(text);\n if (parsed) {\n setViewYear(parsed.getFullYear());\n setViewMonth(parsed.getMonth());\n onChange?.(parsed);\n }\n }\n\n function handleInputKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n const parsed = parseInputDate(inputText);\n if (parsed) { onChange?.(parsed); close(); }\n }\n }\n\n // ─── Cell class helpers ───────────────────────────────────────────────────\n\n function dayCellClass(date: Date, inCurrentMonth: boolean): string {\n const classes = [styles.cell];\n const isToday = isSameDay(date, today);\n const isSelected = value ? isSameDay(date, value) : false;\n const isDisabled = isDateDisabled(date, minDate, maxDate);\n\n if (!inCurrentMonth) classes.push(styles.cellOutside);\n if (isDisabled) classes.push(styles.cellDisabled);\n if (isSelected) classes.push(styles.cellSelected);\n else if (isToday) classes.push(styles.cellToday);\n\n return classes.filter(Boolean).join(' ');\n }\n\n function dayInnerClass(date: Date): string {\n const classes = [styles.dayCircle];\n const isSelected = value ? isSameDay(date, value) : false;\n const isToday = isSameDay(date, today);\n if (isSelected) classes.push(styles.dayCircleSelected);\n else if (isToday) classes.push(styles.dayCircleToday);\n return classes.join(' ');\n }\n\n function monthCellClass(monthIdx: number): string {\n const classes = [styles.monthCell];\n if (value && value.getMonth() === monthIdx && value.getFullYear() === viewYear) {\n classes.push(styles.monthCellSelected);\n }\n return classes.join(' ');\n }\n\n function yearCellClass(year: number): string {\n const classes = [styles.yearCell];\n if (value && value.getFullYear() === year) classes.push(styles.yearCellSelected);\n return classes.join(' ');\n }\n\n // ─── Calendar data ────────────────────────────────────────────────────────\n\n const weeks = getCalendarWeeks(viewYear, viewMonth);\n const yearPageStart = getYearPageStart(viewYear);\n const yearPage = Array.from({ length: 8 }, (_, i) => yearPageStart + i);\n\n // ─── Header title ─────────────────────────────────────────────────────────\n\n const headerTitle = () => {\n if (view === 'day') {\n return (\n <div className={styles.titleGroup}>\n <button\n type=\"button\"\n className={styles.titleBtn}\n onClick={() => setView('month')}\n >\n {MONTH_NAMES[viewMonth]}\n </button>\n <button\n type=\"button\"\n className={styles.titleBtn}\n onClick={() => setView('year')}\n >\n {viewYear}\n </button>\n </div>\n );\n }\n if (view === 'month') {\n return <span className={styles.titleText}>{viewYear}</span>;\n }\n return (\n <span className={styles.titleText}>\n {yearPageStart} – {yearPageStart + 7}\n </span>\n );\n };\n\n // ─── Trigger classes ──────────────────────────────────────────────────────\n\n const triggerClass = [\n styles.inputWrap,\n isOpen ? styles.inputWrapOpen : '',\n invalid ? styles.inputWrapInvalid : '',\n disabled ? styles.inputWrapDisabled : '',\n ].filter(Boolean).join(' ');\n\n const rootClass = [styles.root, className ?? ''].filter(Boolean).join(' ');\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {/* ── Trigger field ── */}\n <div className={styles.field}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={inputId}>{label}</label>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div ref={triggerRef} className={triggerClass}>\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n className={styles.input}\n value={inputText}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n onChange={handleInputChange}\n onFocus={open}\n onKeyDown={handleInputKeyDown}\n autoComplete=\"off\"\n />\n <button\n type=\"button\"\n className={styles.calIconBtn}\n onClick={() => isOpen ? close() : open()}\n tabIndex={-1}\n aria-label={isOpen ? 'Close calendar' : 'Open calendar'}\n disabled={disabled}\n >\n <CalendarIcon />\n </button>\n </div>\n\n {helperText && (\n <span id={helperId} className={invalid ? styles.errorText : styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n\n {/* ── Calendar panel (portaled to body so it escapes any ancestor overflow).\n `data-popover-root` tells any ancestor popover with its own outside-click\n handler to ignore clicks here. ── */}\n {isOpen && calPos && createPortal(\n <div\n ref={calendarRef}\n data-popover-root=\"\"\n className={styles.calendar}\n style={{ top: calPos.top, left: calPos.left }}\n role=\"dialog\"\n aria-label=\"Date picker\"\n >\n {/* Header */}\n <div className={styles.calHeader}>\n <IconButton\n icon={<ChevronLeft />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={navPrev}\n aria-label=\"Previous\"\n />\n\n {headerTitle()}\n\n <IconButton\n icon={<ChevronRight />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={navNext}\n aria-label=\"Next\"\n />\n </div>\n\n {/* ── Day view ── */}\n {view === 'day' && (\n <div className={styles.dayView}>\n {/* Weekday header row */}\n <div className={showWeekNumbers ? styles.weekRowWithWk : styles.weekRow}>\n {showWeekNumbers && (\n <div className={`${styles.weekdayCell} ${styles.wkLabel}`}>Wk</div>\n )}\n {DAY_NAMES.map(d => (\n <div key={d} className={styles.weekdayCell}>{d}</div>\n ))}\n </div>\n\n {/* Week rows */}\n {weeks.map((week, wi) => {\n const inCurrentMonth = (d: Date) => d.getMonth() === viewMonth && d.getFullYear() === viewYear;\n return (\n <div\n key={wi}\n className={showWeekNumbers ? styles.weekRowWithWk : styles.weekRow}\n >\n {showWeekNumbers && (\n <div className={`${styles.cell} ${styles.wkCell}`}>\n {getISOWeek(week[0])}\n </div>\n )}\n {week.map((date, di) => {\n const disabled = isDateDisabled(date, minDate, maxDate);\n return (\n <div\n key={di}\n className={dayCellClass(date, inCurrentMonth(date))}\n onClick={() => !disabled && selectDay(date)}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={date.toDateString()}\n aria-pressed={value ? isSameDay(date, value) : false}\n aria-disabled={disabled || undefined}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n selectDay(date);\n }\n }}\n >\n <div className={dayInnerClass(date)}>\n {date.getDate()}\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n )}\n\n {/* ── Month view ── */}\n {view === 'month' && (\n <div className={styles.monthGrid}>\n {MONTH_NAMES.map((name, idx) => (\n <div\n key={name}\n className={monthCellClass(idx)}\n onClick={() => selectMonth(idx)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectMonth(idx); }\n }}\n >\n {name}\n </div>\n ))}\n </div>\n )}\n\n {/* ── Year view ── */}\n {view === 'year' && (\n <div className={styles.yearGrid}>\n {yearPage.map(year => (\n <div\n key={year}\n className={yearCellClass(year)}\n onClick={() => selectYear(year)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectYear(year); }\n }}\n >\n {year}\n </div>\n ))}\n </div>\n )}\n\n {/* ── Footer (day view only) ── */}\n {view === 'day' && (\n <div className={styles.footer}>\n <button type=\"button\" className={styles.clearBtn} onClick={handleClear}>\n Clear\n </button>\n <button type=\"button\" className={styles.todayBtn} onClick={handleToday}>\n Today\n </button>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n },\n);\n\nDatePicker.displayName = 'DatePicker';\n","import { forwardRef, useRef, useState, useEffect, useId } from 'react';\nimport styles from './SelectButton.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SelectButtonBadge {\n /** Displayed inside the badge circle. */\n value: string | number;\n /** Background color of the badge (hex or CSS color). */\n color: string;\n}\n\nexport interface SelectButtonOption {\n /** Option display label. */\n label: string;\n /** Unique identifier used as the value. */\n value: string;\n /** Plain count shown next to the label in bold. */\n count?: number;\n /** Colored circular badge (e.g., teal for info, red for alerts). */\n badge?: SelectButtonBadge;\n /** Optional icon rendered before the label. Pass any React node (e.g. a PrimeIcon). */\n icon?: React.ReactNode;\n}\n\nexport interface SelectButtonProps {\n /** Options to display. */\n options: SelectButtonOption[];\n /** Currently selected value. */\n value?: string | null;\n /** Called when the user selects an option. */\n onChange?: (value: string) => void;\n /**\n * - `'group'` (default): all options rendered as a joined toggle-button row.\n * Use for view switching or filter toggling.\n * - `'options'`: renders a split button showing the current selection;\n * clicking opens a dropdown to pick a different option.\n */\n variant?: 'group' | 'options';\n /** Size variant. Matches the standard button ramp: `sm` = 24px, `md` = 36px (default), `lg` = 40px. */\n size?: 'sm' | 'md' | 'lg';\n /** Optional field label rendered above the button. */\n label?: string;\n /** Adds a red asterisk next to the label. */\n required?: boolean;\n /** Disables the entire component. */\n disabled?: boolean;\n /** Placeholder for the `options` variant when nothing is selected. */\n placeholder?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\ninterface OptionContentProps {\n opt: SelectButtonOption;\n labelClassName: string;\n countClassName: string;\n badgeClassName: string;\n iconClassName: string;\n}\n\n/** Renders the label + optional count + optional badge inside a button. */\nfunction OptionContent({ opt, labelClassName, countClassName, badgeClassName, iconClassName }: OptionContentProps) {\n return (\n <>\n {opt.icon && (\n <span className={iconClassName} aria-hidden=\"true\">{opt.icon}</span>\n )}\n <span className={labelClassName}>{opt.label}</span>\n {opt.count !== undefined && (\n <span className={countClassName}>{opt.count}</span>\n )}\n {opt.badge && (\n <span\n className={badgeClassName}\n style={{ backgroundColor: opt.badge.color }}\n aria-label={`${opt.badge.value}`}\n >\n {opt.badge.value}\n </span>\n )}\n </>\n );\n}\n\n/**\n * SelectButton — Clear Design System\n *\n * A single-select toggle control with two variants:\n * - `group`: options displayed as a joined row of toggle buttons (use for view/filter switching).\n * - `options`: a split button showing the active selection; clicking opens a dropdown picker.\n *\n * Each option can carry an optional count number and a colored badge indicator.\n *\n * @example\n * // Toggle group\n * <SelectButton\n * options={[\n * { label: 'All', value: 'all', count: 42 },\n * { label: 'In Review', value: 'review', count: 5, badge: { value: 3, color: '#D60F00' } },\n * { label: 'Approved', value: 'approved', count: 12 },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * @example\n * // Dropdown options variant\n * <SelectButton\n * variant=\"options\"\n * options={statusOptions}\n * value={status}\n * onChange={setStatus}\n * label=\"Status\"\n * />\n */\nexport const SelectButton = forwardRef<HTMLDivElement, SelectButtonProps>(\n (\n {\n options,\n value,\n onChange,\n variant = 'group',\n size = 'md',\n label,\n required = false,\n disabled = false,\n placeholder = 'Select\\u2026',\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const [isOpen, setIsOpen] = useState(false);\n\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n const selectedOption = options.find(o => o.value === value) ?? null;\n\n function handleSelect(optValue: string) {\n if (disabled) return;\n onChange?.(optValue);\n setIsOpen(false);\n }\n\n const sizeClass = size === 'sm' ? styles.sizeSm : size === 'lg' ? styles.sizeLg : styles.sizeMd;\n const rootClass = [styles.root, sizeClass, className ?? ''].filter(Boolean).join(' ');\n\n // ── Group variant ──────────────────────────────────────────────────────────\n\n if (variant === 'group') {\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {label && (\n <div className={styles.labelRow}>\n <span className={styles.label}>{label}</span>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n className={styles.group}\n role=\"group\"\n aria-label={label ?? 'Select button group'}\n aria-disabled={disabled || undefined}\n >\n {options.map((opt, i) => {\n const isFirst = i === 0;\n const isLast = i === options.length - 1;\n const isSelected = opt.value === value;\n\n const posClass =\n options.length === 1 ? styles.btnSingle :\n isFirst ? styles.btnLeft :\n isLast ? styles.btnRight :\n styles.btnMiddle;\n\n const btnClass = [\n styles.btn,\n posClass,\n isSelected ? styles.btnSelected : '',\n disabled ? styles.btnDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <button\n key={opt.value}\n id={`${uid}-${opt.value}`}\n type=\"button\"\n className={btnClass}\n onClick={() => handleSelect(opt.value)}\n aria-pressed={isSelected}\n disabled={disabled}\n >\n <OptionContent\n opt={opt}\n labelClassName={styles.btnLabel}\n countClassName={styles.count}\n badgeClassName={styles.badge}\n iconClassName={styles.optionIcon}\n />\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n // ── Options variant (split button + dropdown) ──────────────────────────────\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {label && (\n <div className={styles.labelRow}>\n <span className={styles.label}>{label}</span>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n className={[styles.splitButton, disabled ? styles.splitButtonDisabled : ''].filter(Boolean).join(' ')}\n aria-disabled={disabled || undefined}\n >\n {/* Main area — shows current selection */}\n <button\n type=\"button\"\n className={styles.splitMain}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n disabled={disabled}\n >\n {selectedOption ? (\n <OptionContent\n opt={selectedOption}\n labelClassName={styles.btnLabel}\n countClassName={styles.count}\n badgeClassName={styles.badge}\n iconClassName={styles.optionIcon}\n />\n ) : (\n <span className={styles.placeholder}>{placeholder}</span>\n )}\n </button>\n\n {/* Chevron trigger */}\n <button\n type=\"button\"\n className={styles.splitChevron}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n aria-label={isOpen ? 'Close options' : 'Open options'}\n tabIndex={-1}\n disabled={disabled}\n >\n <span className={styles.chevronIcon} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n role=\"listbox\"\n aria-label={label ?? 'Options'}\n className={styles.dropdown}\n >\n {options.map(opt => {\n const isSelected = opt.value === value;\n const rowClass = [\n styles.dropdownRow,\n isSelected ? styles.dropdownRowSelected : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n className={rowClass}\n onClick={() => handleSelect(opt.value)}\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleSelect(opt.value); }\n }}\n >\n <OptionContent\n opt={opt}\n labelClassName={isSelected ? `${styles.btnLabel} ${styles.dropdownLabelSelected}` : styles.btnLabel}\n countClassName={styles.count}\n badgeClassName={styles.badge}\n iconClassName={styles.optionIcon}\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nSelectButton.displayName = 'SelectButton';\n","import { forwardRef, useRef, useState, useEffect, useId } from 'react';\nimport styles from './TextArea.module.css';\n\nexport interface TextAreaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'children'> {\n /** Label shown above the textarea. */\n label?: string;\n /** Adds a red asterisk to the label and sets aria-required. */\n required?: boolean;\n /** Helper text shown below the textarea. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the invalid/error state with red border, red-50 background, and red helper text. */\n invalid?: boolean;\n /** Number of visible text rows. Defaults to 3. */\n rows?: number;\n /**\n * When true, the textarea grows in height automatically as the user types,\n * instead of showing a scrollbar.\n */\n autoGrow?: boolean;\n}\n\n/**\n * TextArea — Clear Design System\n *\n * A multi-line text input with label, helper text, character counter (when\n * `maxLength` is set), and full state coverage: default, hover, focus, filled,\n * invalid, and disabled. Supports optional auto-grow behaviour.\n *\n * @example\n * <TextArea label=\"Loan notes\" placeholder=\"Enter notes…\" rows={4} />\n *\n * @example\n * <TextArea label=\"Comments\" maxLength={500} />\n *\n * @example\n * <TextArea label=\"Description\" autoGrow />\n *\n * @example\n * <TextArea label=\"Notes\" invalid helperText=\"This field is required.\" />\n */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n required = false,\n helperText,\n invalid = false,\n rows = 3,\n autoGrow = false,\n disabled = false,\n maxLength,\n id: idProp,\n className,\n style,\n value,\n defaultValue,\n onChange,\n ...rest\n },\n forwardedRef,\n ) => {\n const uid = useId();\n const inputId = idProp ?? `${uid}-textarea`;\n const helperId = `${uid}-helper`;\n\n const internalRef = useRef<HTMLTextAreaElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLTextAreaElement>;\n\n // Track character count for the counter\n const [charCount, setCharCount] = useState<number>(() => {\n if (value !== undefined) return String(value ?? '').length;\n if (defaultValue !== undefined) return String(defaultValue ?? '').length;\n return 0;\n });\n\n // Sync charCount when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n setCharCount(String(value ?? '').length);\n }\n }, [value]);\n\n // Auto-grow: resize the textarea to fit its content\n useEffect(() => {\n if (!autoGrow || !resolvedRef.current) return;\n const el = resolvedRef.current;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }, [autoGrow, value, charCount, resolvedRef]);\n\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\n setCharCount(e.target.value.length);\n onChange?.(e);\n }\n\n const showCounter = maxLength !== undefined;\n\n const outerClass = styles.outer;\n\n const innerClass = [\n styles.inner,\n invalid ? styles.innerInvalid : '',\n disabled ? styles.innerDisabled : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={[styles.root, className ?? ''].filter(Boolean).join(' ')} style={style}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n <div className={outerClass}>\n <div className={innerClass}>\n <textarea\n ref={resolvedRef}\n id={inputId}\n rows={autoGrow ? undefined : rows}\n maxLength={maxLength}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={\n [helperText ? helperId : '', showCounter ? `${uid}-counter` : '']\n .filter(Boolean)\n .join(' ') || undefined\n }\n className={[styles.textarea, autoGrow ? styles.textareaAutoGrow : ''].filter(Boolean).join(' ')}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n {...rest}\n />\n </div>\n\n {/* Bottom row: helper text + counter */}\n {(helperText || showCounter) && (\n <div className={styles.bottomRow}>\n {helperText ? (\n <span\n id={helperId}\n className={invalid ? styles.errorText : styles.helperText}\n >\n {helperText}\n </span>\n ) : (\n <span />\n )}\n {showCounter && (\n <span id={`${uid}-counter`} className={styles.counter} aria-live=\"polite\">\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nTextArea.displayName = 'TextArea';\n","import { forwardRef, useRef } from 'react';\nimport styles from './ToggleSwitch.module.css';\n\nexport interface ToggleSwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'size'> {\n /** Label shown to the right of the switch. */\n label?: React.ReactNode;\n /** Helper text shown below the switch row. */\n helperText?: string;\n}\n\n/**\n * ToggleSwitch — Clear Design System\n *\n * A binary on/off toggle. Use when an action takes immediate effect\n * (no Save/Submit required). Supports label, helper text, disabled,\n * and controlled/uncontrolled usage.\n *\n * @example\n * <ToggleSwitch label=\"Enable notifications\" checked={on} onChange={e => setOn(e.target.checked)} />\n *\n * @example\n * <ToggleSwitch label=\"Auto-lock\" defaultChecked />\n *\n * @example\n * <ToggleSwitch label=\"Feature locked\" disabled />\n */\nexport const ToggleSwitch = forwardRef<HTMLInputElement, ToggleSwitchProps>(\n (\n {\n label,\n helperText,\n disabled = false,\n id,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n const wrapperClass = [\n styles.wrapper,\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div>\n <label className={wrapperClass} htmlFor={id}>\n <input\n ref={resolvedRef}\n type=\"checkbox\"\n id={id}\n disabled={disabled}\n className={styles.input}\n role=\"switch\"\n {...rest}\n />\n\n <span className={styles.track} aria-hidden=\"true\">\n <span className={styles.thumb} />\n </span>\n\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n\n {helperText && (\n <span className={styles.helperText}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nToggleSwitch.displayName = 'ToggleSwitch';\n","import { forwardRef } from 'react';\nimport styles from './Button.module.css';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'link';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style. Defaults to `'primary'`. */\n variant?: ButtonVariant;\n /**\n * Size variant. Sizes match the Figma spec:\n * - `sm` = 24px height / 10px font\n * - `md` = 36px height / 12px font (default)\n * - `lg` = 40px height / 15px font\n */\n size?: ButtonSize;\n /** Icon rendered before the label. Pass any React node (e.g. a PrimeIcon). */\n leadingIcon?: React.ReactNode;\n /** Icon rendered after the label. */\n trailingIcon?: React.ReactNode;\n /**\n * Red notification badge shown after the label.\n * Pass a number or short string (e.g. `5` or `\"99+\"`).\n */\n badge?: string | number;\n}\n\n/**\n * Button — Clear Design System\n *\n * A versatile action button with five visual variants, three sizes, optional\n * leading/trailing icons, and an optional notification badge.\n *\n * @example\n * <Button>Submit</Button>\n *\n * @example\n * <Button variant=\"secondary\" size=\"sm\">Cancel</Button>\n *\n * @example\n * <Button variant=\"danger\" leadingIcon={<i className=\"pi pi-trash\" />}>Delete</Button>\n *\n * @example\n * <Button badge={3} trailingIcon={<i className=\"pi pi-chevron-down\" />}>Actions</Button>\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n leadingIcon,\n trailingIcon,\n badge,\n children,\n className,\n disabled,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n styles.btn,\n styles[variant],\n styles[size],\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button ref={ref} className={cls} disabled={disabled} {...rest}>\n {leadingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {leadingIcon}\n </span>\n )}\n\n {variant === 'link' ? (\n <span className={styles.linkLabel}>{children}</span>\n ) : (\n <span className={styles.label}>{children}</span>\n )}\n\n {badge !== undefined && (\n <span className={styles.badge} aria-label={`${badge} notifications`}>\n {badge}\n </span>\n )}\n\n {trailingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {trailingIcon}\n </span>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n","import { forwardRef, useRef, useState, useEffect } from 'react';\nimport styles from './DropdownButton.module.css';\nimport type { ButtonVariant, ButtonSize } from '../Button/Button';\n\nexport interface DropdownButtonItem {\n /** Displayed label. */\n label: string;\n /** Unique identifier passed to `onSelect`. */\n value: string;\n /** Optional icon rendered before the label. */\n icon?: React.ReactNode;\n /** When true, the item is non-interactive and visually muted. */\n disabled?: boolean;\n /** When true, renders a divider line above this item. */\n divider?: boolean;\n}\n\nexport interface DropdownButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onSelect'> {\n /** The button label. */\n label: string;\n /** Menu items shown in the dropdown. */\n items: DropdownButtonItem[];\n /** Called when the user selects an item. */\n onSelect?: (value: string) => void;\n /** Visual style. Defaults to `'primary'`. */\n variant?: ButtonVariant;\n /** Size. Defaults to `'md'`. */\n size?: ButtonSize;\n /** Optional icon rendered before the label. */\n leadingIcon?: React.ReactNode;\n}\n\n\n/**\n * DropdownButton — Clear Design System\n *\n * A button that opens an action menu dropdown when clicked. Uses the same\n * variant and size system as Button, with a built-in trailing chevron icon.\n *\n * @example\n * <DropdownButton\n * label=\"Actions\"\n * items={[\n * { label: 'Edit', value: 'edit' },\n * { label: 'Duplicate', value: 'duplicate' },\n * { label: 'Delete', value: 'delete' },\n * ]}\n * onSelect={handleAction}\n * />\n *\n * @example\n * <DropdownButton label=\"Export\" variant=\"secondary\" size=\"sm\" items={exportItems} onSelect={onExport} />\n */\nexport const DropdownButton = forwardRef<HTMLDivElement, DropdownButtonProps>(\n (\n {\n label,\n items,\n onSelect,\n variant = 'primary',\n size = 'md',\n leadingIcon,\n disabled,\n className,\n style,\n ...rest\n },\n externalRef,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n function handleSelect(item: DropdownButtonItem) {\n if (item.disabled) return;\n onSelect?.(item.value);\n setIsOpen(false);\n }\n\n const btnCls = [\n styles.btn,\n styles[variant],\n styles[size],\n isOpen ? styles.btnOpen : '',\n disabled ? styles.disabled : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={setRef}\n className={[styles.root, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n type=\"button\"\n className={btnCls}\n disabled={disabled}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n {...rest}\n >\n {leadingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {leadingIcon}\n </span>\n )}\n <span className={styles.label}>{label}</span>\n <span className={styles.chevron} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {isOpen && (\n <div role=\"menu\" className={styles.dropdown}>\n {items.map((item, i) => (\n <div key={item.value ?? i}>\n {item.divider && <div className={styles.divider} role=\"separator\" />}\n <div\n role=\"menuitem\"\n aria-disabled={item.disabled || undefined}\n className={[\n styles.item,\n item.disabled ? styles.itemDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleSelect(item)}\n tabIndex={item.disabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault();\n handleSelect(item);\n }\n }}\n >\n {item.icon && (\n <span className={styles.itemIcon} aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n <span className={styles.itemLabel}>{item.label}</span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nDropdownButton.displayName = 'DropdownButton';\n","import { forwardRef } from 'react';\nimport styles from './CloseButton.module.css';\n\nexport interface CloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Accessible label. Defaults to `\"Close\"`. Override when the button\n * closes something specific, e.g. `aria-label=\"Close dialog\"`.\n */\n 'aria-label'?: string;\n /** Size variant. `sm` = 24×24px (default). `md` = 36×36px. `lg` = 40×40px. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * CloseButton — Clear Design System\n *\n * A circular ghost button with a built-in ✕ icon. Use to dismiss modals,\n * panels, toasts, tags, or any overlay. Requires an `aria-label` for\n * screen-reader context (defaults to `\"Close\"`).\n *\n * @example\n * <CloseButton onClick={onClose} />\n *\n * @example\n * <CloseButton aria-label=\"Close dialog\" size=\"md\" onClick={onClose} />\n */\nexport const CloseButton = forwardRef<HTMLButtonElement, CloseButtonProps>(\n (\n {\n 'aria-label': ariaLabel = 'Close',\n size = 'sm',\n className,\n disabled,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n styles.btn,\n styles[size],\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={ariaLabel}\n className={cls}\n disabled={disabled}\n {...rest}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n );\n },\n);\n\nCloseButton.displayName = 'CloseButton';\n","import { forwardRef, useRef, useState, useEffect } from 'react';\nimport styles from './SplitButton.module.css';\n\nexport interface SplitButtonItem {\n /** Displayed label. */\n label: string;\n /** Unique identifier passed to `onSelect`. */\n value: string;\n /** Optional icon before the label. */\n icon?: React.ReactNode;\n /** When true, the item is non-interactive and visually muted. */\n disabled?: boolean;\n}\n\nexport interface SplitButtonProps {\n /** Label shown in the main action area. */\n label: string;\n /** Called when the user clicks the main action button (left side). */\n onAction?: () => void;\n /** Items shown in the dropdown, opened by clicking the right trigger. */\n items: SplitButtonItem[];\n /** Called when the user picks an item from the dropdown. */\n onSelect?: (value: string) => void;\n /**\n * Visual style.\n * - `'primary'` — both sides teal-700, forming a seamless pill.\n * - `'secondary'` — left side teal-50 (secondary), right trigger teal-700 (primary). Use when the button needs less visual weight.\n * Defaults to `'primary'`.\n */\n variant?: 'primary' | 'secondary';\n /** Size. `'md'` = 36px height (default). `'sm'` = 24px height. `'lg'` = 40px height. */\n size?: 'sm' | 'md' | 'lg';\n /** Optional icon rendered before the label in the main action area. */\n leadingIcon?: React.ReactNode;\n /** Disables the entire component. */\n disabled?: boolean;\n /** Accessible label for the dropdown trigger. Defaults to `\"More options\"`. */\n triggerAriaLabel?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SplitButton — Clear Design System\n *\n * Two joined buttons in a single pill:\n * - **Left** (main): executes the primary action when clicked.\n * - **Right** (trigger): opens a dropdown of secondary actions.\n *\n * @example\n * <SplitButton\n * label=\"Import\"\n * onAction={handleImport}\n * items={[\n * { label: 'Import Liabilities', value: 'liabilities' },\n * { label: 'View Report', value: 'report' },\n * { label: 'Get MI Quote', value: 'mi' },\n * ]}\n * onSelect={handleSelect}\n * />\n *\n * @example\n * <SplitButton label=\"Save\" variant=\"secondary\" onAction={onSave} items={moreActions} onSelect={onSelect} />\n */\nexport const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n (\n {\n label,\n onAction,\n items,\n onSelect,\n variant = 'primary',\n size = 'md',\n leadingIcon,\n disabled = false,\n triggerAriaLabel = 'More options',\n className,\n style,\n },\n externalRef,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n function handleSelect(item: SplitButtonItem) {\n if (item.disabled) return;\n onSelect?.(item.value);\n setIsOpen(false);\n }\n\n const mainCls = [\n styles.main,\n styles[`${variant}Main`],\n size === 'sm' ? styles.mainSm : size === 'lg' ? styles.mainLg : '',\n disabled ? styles.disabled : '',\n ].filter(Boolean).join(' ');\n\n const triggerCls = [\n styles.trigger,\n styles[`${variant}Trigger`],\n size === 'sm' ? styles.triggerSm : size === 'lg' ? styles.triggerLg : '',\n isOpen ? styles.triggerOpen : '',\n disabled ? styles.disabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={setRef}\n className={[styles.root, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Main action button ── */}\n <button\n type=\"button\"\n className={mainCls}\n onClick={() => !disabled && onAction?.()}\n disabled={disabled}\n >\n {leadingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">{leadingIcon}</span>\n )}\n <span className={styles.label}>{label}</span>\n </button>\n\n {/* ── Dropdown trigger ── */}\n <button\n type=\"button\"\n className={triggerCls}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n disabled={disabled}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={triggerAriaLabel}\n >\n <span className={styles.chevron} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {/* ── Dropdown panel ── */}\n {isOpen && (\n <div role=\"menu\" className={styles.dropdown}>\n {items.map((item, i) => (\n <div\n key={item.value ?? i}\n role=\"menuitem\"\n aria-disabled={item.disabled || undefined}\n className={[styles.item, item.disabled ? styles.itemDisabled : ''].filter(Boolean).join(' ')}\n onClick={() => handleSelect(item)}\n tabIndex={item.disabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault();\n handleSelect(item);\n }\n }}\n >\n {item.icon && (\n <span className={styles.itemIcon} aria-hidden=\"true\">{item.icon}</span>\n )}\n <span>{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nSplitButton.displayName = 'SplitButton';\n","import { forwardRef } from 'react';\nimport styles from './Paginator.module.css';\nimport { Select } from '../Select';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PageChangeEvent {\n /** 0-based index of the first record on the new page. */\n first: number;\n /** Records per page. */\n rows: number;\n /** 0-based page number. */\n page: number;\n}\n\nexport interface PaginatorProps {\n /** Total number of records across all pages. */\n totalRecords: number;\n /** 0-based index of the first record on the current page. */\n first: number;\n /** Number of records per page. */\n rows: number;\n /** Called when the user changes the page or rows-per-page. */\n onPageChange: (e: PageChangeEvent) => void;\n /**\n * Layout template.\n * - `'pages'` (default): page-number buttons + rows-per-page select.\n * - `'report'`: \"Showing X to Y of Z entries\" text instead of page buttons.\n * - `'full'`: \"Results per page\" label + select + entry count on the left; page buttons on the right.\n */\n template?: 'pages' | 'report' | 'full';\n /** Options shown in the rows-per-page dropdown. Defaults to `[10, 25, 50, 100]`. */\n rowsPerPageOptions?: number[];\n /** Number of page-number buttons visible at once. Defaults to 5. */\n pageLinkSize?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getPageLinks(\n currentPage: number,\n totalPages: number,\n pageLinkSize: number,\n): (number | '...')[] {\n if (totalPages <= pageLinkSize + 2) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const half = Math.floor(pageLinkSize / 2);\n let start = Math.max(1, currentPage - half);\n let end = Math.min(totalPages, start + pageLinkSize - 1);\n\n if (end - start < pageLinkSize - 1) {\n start = Math.max(1, end - pageLinkSize + 1);\n }\n\n const links: (number | '...')[] = [];\n if (start > 1) { links.push(1); if (start > 2) links.push('...'); }\n for (let i = start; i <= end; i++) links.push(i);\n if (end < totalPages) { if (end < totalPages - 1) links.push('...'); links.push(totalPages); }\n\n return links;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst ChevronFirst = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10 3L6 7l4 4M5 3v8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronPrev = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 3L5 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronNext = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronLast = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 3l4 4-4 4M9 3v8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── NavButton ────────────────────────────────────────────────────────────────\n\ninterface NavButtonProps {\n onClick: () => void;\n disabled?: boolean;\n selected?: boolean;\n 'aria-label': string;\n children: React.ReactNode;\n}\n\nfunction NavButton({ onClick, disabled, selected, 'aria-label': ariaLabel, children }: NavButtonProps) {\n const cls = [\n styles.navBtn,\n selected ? styles.navBtnSelected : '',\n disabled ? styles.navBtnDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={cls}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-current={selected ? 'page' : undefined}\n >\n <span className={styles.navBtnContent}>{children}</span>\n </button>\n );\n}\n\n// ─── Shared page navigation buttons ──────────────────────────────────────────\n\nfunction PageNav({\n currentPage,\n totalPages,\n pageLinkSize,\n onPage,\n}: {\n currentPage: number;\n totalPages: number;\n pageLinkSize: number;\n onPage: (page: number) => void;\n}) {\n const links = getPageLinks(currentPage, totalPages, pageLinkSize);\n\n return (\n <>\n <NavButton\n onClick={() => onPage(0)}\n disabled={currentPage === 0}\n aria-label=\"First page\"\n >\n <ChevronFirst />\n </NavButton>\n <NavButton\n onClick={() => onPage(currentPage - 1)}\n disabled={currentPage === 0}\n aria-label=\"Previous page\"\n >\n <ChevronPrev />\n </NavButton>\n\n {links.map((link, i) =>\n link === '...' ? (\n <span key={`ellipsis-${i}`} className={styles.ellipsis}>…</span>\n ) : (\n <NavButton\n key={link}\n onClick={() => onPage(link - 1)}\n selected={link - 1 === currentPage}\n aria-label={`Page ${link}`}\n >\n <span className={styles.pageNumber}>{link}</span>\n </NavButton>\n ),\n )}\n\n <NavButton\n onClick={() => onPage(currentPage + 1)}\n disabled={currentPage >= totalPages - 1}\n aria-label=\"Next page\"\n >\n <ChevronNext />\n </NavButton>\n <NavButton\n onClick={() => onPage(totalPages - 1)}\n disabled={currentPage >= totalPages - 1}\n aria-label=\"Last page\"\n >\n <ChevronLast />\n </NavButton>\n </>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\n/**\n * Paginator — Clear Design System\n *\n * Navigation control for paginated content. Works with DataTable or any\n * paginated list. Three layout templates: `pages`, `report`, and `full`.\n *\n * @example\n * // Basic page navigation\n * <Paginator totalRecords={200} first={0} rows={10} onPageChange={setPage} />\n *\n * @example\n * // Text summary instead of page numbers\n * <Paginator totalRecords={200} first={0} rows={10} onPageChange={setPage} template=\"report\" />\n *\n * @example\n * // Full layout with rows-per-page selector\n * <Paginator totalRecords={200} first={0} rows={10} onPageChange={setPage}\n * template=\"full\" rowsPerPageOptions={[10, 25, 50]} />\n */\nexport const Paginator = forwardRef<HTMLDivElement, PaginatorProps>(\n (\n {\n totalRecords,\n first,\n rows,\n onPageChange,\n template = 'pages',\n rowsPerPageOptions = [10, 25, 50, 100],\n pageLinkSize = 5,\n className,\n style,\n },\n ref,\n ) => {\n const totalPages = Math.max(1, Math.ceil(totalRecords / rows));\n const currentPage = Math.floor(first / rows);\n\n function goToPage(page: number) {\n const p = Math.max(0, Math.min(page, totalPages - 1));\n onPageChange({ first: p * rows, rows, page: p });\n }\n\n function changeRows(newRows: number) {\n onPageChange({ first: 0, rows: newRows, page: 0 });\n }\n\n const rowsOptions = rowsPerPageOptions.map(n => ({ label: String(n), value: String(n) }));\n\n // Range display\n const rangeStart = totalRecords === 0 ? 0 : first + 1;\n const rangeEnd = Math.min(first + rows, totalRecords);\n\n const containerClass = [\n styles.container,\n template === 'full' ? styles.containerFull : '',\n className ?? '',\n ].filter(Boolean).join(' ');\n\n // ── Template: report ────────────────────────────────────────────────────\n if (template === 'report') {\n return (\n <div ref={ref} className={containerClass} style={style} role=\"navigation\" aria-label=\"Pagination\">\n <NavButton onClick={() => goToPage(0)} disabled={currentPage === 0} aria-label=\"First page\">\n <ChevronFirst />\n </NavButton>\n <NavButton onClick={() => goToPage(currentPage - 1)} disabled={currentPage === 0} aria-label=\"Previous page\">\n <ChevronPrev />\n </NavButton>\n\n <span className={styles.reportText}>\n Showing {rangeStart} to {rangeEnd} of {totalRecords} entries\n </span>\n\n <NavButton onClick={() => goToPage(currentPage + 1)} disabled={currentPage >= totalPages - 1} aria-label=\"Next page\">\n <ChevronNext />\n </NavButton>\n <NavButton onClick={() => goToPage(totalPages - 1)} disabled={currentPage >= totalPages - 1} aria-label=\"Last page\">\n <ChevronLast />\n </NavButton>\n </div>\n );\n }\n\n // ── Template: full ──────────────────────────────────────────────────────\n if (template === 'full') {\n return (\n <div ref={ref} className={containerClass} style={style} role=\"navigation\" aria-label=\"Pagination\">\n <div className={styles.fullLeft}>\n <span className={styles.rowsLabel}>Results per page:</span>\n <Select\n options={rowsOptions}\n value={String(rows)}\n onChange={v => v && changeRows(Number(v))}\n size=\"sm\"\n style={{ width: 80 }}\n />\n <span className={styles.entriesCount}>{rangeEnd - rangeStart + (totalRecords > 0 ? 1 : 0)} entries</span>\n </div>\n\n <div className={styles.fullRight}>\n <PageNav\n currentPage={currentPage}\n totalPages={totalPages}\n pageLinkSize={pageLinkSize}\n onPage={goToPage}\n />\n </div>\n </div>\n );\n }\n\n // ── Template: pages (default) ───────────────────────────────────────────\n return (\n <div ref={ref} className={containerClass} style={style} role=\"navigation\" aria-label=\"Pagination\">\n <PageNav\n currentPage={currentPage}\n totalPages={totalPages}\n pageLinkSize={pageLinkSize}\n onPage={goToPage}\n />\n\n <Select\n options={rowsOptions}\n value={String(rows)}\n onChange={v => v && changeRows(Number(v))}\n size=\"sm\"\n style={{ width: 80 }}\n />\n </div>\n );\n },\n);\n\nPaginator.displayName = 'Paginator';\n","import { forwardRef, useState, useMemo } from 'react';\nimport styles from './Picklist.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PicklistItem {\n /** Unique identifier for the item. */\n id: string | number;\n /** Default label shown when no itemTemplate is provided. */\n label?: string;\n /** PrimeIcons class name for the item icon (default rendering only). */\n icon?: string;\n /** Prevents this item from being selected or moved. */\n disabled?: boolean;\n /** Any additional data fields (available in itemTemplate). */\n [key: string]: unknown;\n}\n\nexport interface PicklistChangeEvent {\n source: PicklistItem[];\n target: PicklistItem[];\n}\n\nexport interface PicklistProps {\n /** Items available in the source (left) list. */\n sourceItems: PicklistItem[];\n /** Items in the target (right) list. */\n targetItems: PicklistItem[];\n /** Called when items are moved between lists. Receives updated source and target arrays. */\n onChange: (e: PicklistChangeEvent) => void;\n /** Optional header for the source panel. Accepts any ReactNode — string, table header row, etc. */\n sourceHeader?: React.ReactNode;\n /** Optional header for the target panel. Accepts any ReactNode — string, table header row, etc. */\n targetHeader?: React.ReactNode;\n /**\n * Custom render function for each item row content.\n * The Picklist always prepends its own checkbox; this controls everything after it.\n * Defaults to rendering `[icon?] label`.\n */\n itemTemplate?: (item: PicklistItem) => React.ReactNode;\n /** Show a filter/search input at the top of each panel. */\n filter?: boolean;\n /** Placeholder for the source panel filter input. */\n sourceFilterPlaceholder?: string;\n /** Placeholder for the target panel filter input. */\n targetFilterPlaceholder?: string;\n /**\n * Show move-all buttons (>> and <<).\n * @default true\n */\n showMoveAll?: boolean;\n /**\n * Show checkboxes on each item row.\n * Set to `false` when items have icons that serve as the visual indicator —\n * selection is then shown via row highlight only.\n * @default true\n */\n showCheckbox?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst ChevronRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronDoubleRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2 3l4 4-4 4M7 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 3L5 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronDoubleLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M12 3L8 7l4 4M7 3L3 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"5.5\" cy=\"5.5\" r=\"3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8.5 8.5L11 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 2l8 8M10 2L2 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n// ─── Inline checkbox ──────────────────────────────────────────────────────────\n\nfunction ItemCheckbox({ checked, disabled }: { checked: boolean; disabled?: boolean }) {\n return (\n <span\n className={[\n styles.checkbox,\n checked ? styles.checkboxChecked : '',\n disabled ? styles.checkboxDisabled : '',\n ].filter(Boolean).join(' ')}\n aria-hidden=\"true\"\n >\n {checked && (\n <svg className={styles.checkmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ─── Control button ───────────────────────────────────────────────────────────\n\nfunction CtrlBtn({\n onClick,\n disabled,\n 'aria-label': ariaLabel,\n children,\n}: {\n onClick: () => void;\n disabled: boolean;\n 'aria-label': string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n className={[styles.ctrlBtn, disabled ? styles.ctrlBtnDisabled : ''].filter(Boolean).join(' ')}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n}\n\n// ─── Panel ────────────────────────────────────────────────────────────────────\n\ninterface PanelProps {\n header?: React.ReactNode;\n items: PicklistItem[];\n selectedIds: Set<string | number>;\n onToggle: (id: string | number) => void;\n itemTemplate?: (item: PicklistItem) => React.ReactNode;\n filter?: boolean;\n filterValue: string;\n onFilterChange: (v: string) => void;\n filterPlaceholder?: string;\n showCheckbox?: boolean;\n ariaLabel: string;\n}\n\nfunction Panel({\n header,\n items,\n selectedIds,\n onToggle,\n itemTemplate,\n filter,\n filterValue,\n onFilterChange,\n filterPlaceholder = 'Filter...',\n showCheckbox = true,\n ariaLabel,\n}: PanelProps) {\n const visible = useMemo(() => {\n if (!filter || !filterValue.trim()) return items;\n const q = filterValue.toLowerCase();\n return items.filter(item => String(item.label ?? '').toLowerCase().includes(q));\n }, [items, filter, filterValue]);\n\n return (\n <div className={styles.panel}>\n {header != null && (\n <div className={styles.panelHeader}>{header}</div>\n )}\n\n {filter && (\n <div className={styles.filterWrap}>\n <span className={styles.filterIcon}><SearchIcon /></span>\n <input\n type=\"text\"\n className={styles.filterInput}\n value={filterValue}\n onChange={e => onFilterChange(e.target.value)}\n placeholder={filterPlaceholder}\n aria-label={`Filter ${ariaLabel}`}\n />\n {filterValue && (\n <button\n type=\"button\"\n className={styles.filterClear}\n onClick={() => onFilterChange('')}\n aria-label=\"Clear filter\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n )}\n\n <ul\n className={styles.list}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-multiselectable=\"true\"\n >\n {visible.map(item => {\n const selected = selectedIds.has(item.id);\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n className={[\n styles.item,\n selected ? styles.itemSelected : '',\n item.disabled ? styles.itemDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => !item.disabled && onToggle(item.id)}\n tabIndex={item.disabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === ' ' || e.key === 'Enter') && !item.disabled) {\n e.preventDefault();\n onToggle(item.id);\n }\n }}\n >\n {showCheckbox && <ItemCheckbox checked={selected} disabled={item.disabled} />}\n {itemTemplate ? (\n itemTemplate(item)\n ) : (\n <span className={styles.itemContent}>\n {item.icon && <i className={`${item.icon} ${styles.itemIcon}`} aria-hidden=\"true\" />}\n <span className={styles.itemLabel}>{item.label}</span>\n </span>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n// ─── Picklist ─────────────────────────────────────────────────────────────────\n\n/**\n * Picklist — Clear Design System\n *\n * Two-panel component for moving items between a source list and a target list.\n * Supports checkbox multi-selection, custom item templates (table rows, etc.),\n * optional filter inputs per panel, and optional move-all buttons.\n *\n * The component is fully controlled — `sourceItems` and `targetItems` are props,\n * and `onChange` fires with the updated arrays on every move action.\n *\n * @example\n * // Simple string list\n * <Picklist\n * sourceItems={source}\n * targetItems={target}\n * onChange={({ source, target }) => { setSource(source); setTarget(target); }}\n * sourceHeader=\"Available\"\n * targetHeader=\"Selected\"\n * />\n *\n * @example\n * // Table-style rows\n * <Picklist\n * sourceItems={source}\n * targetItems={target}\n * onChange={...}\n * sourceHeader={<MyTableHeader />}\n * targetHeader={<MyTableHeader />}\n * itemTemplate={(item) => <MyTableRow item={item} />}\n * />\n */\nexport const Picklist = forwardRef<HTMLDivElement, PicklistProps>(\n (\n {\n sourceItems,\n targetItems,\n onChange,\n sourceHeader,\n targetHeader,\n itemTemplate,\n filter = false,\n sourceFilterPlaceholder,\n targetFilterPlaceholder,\n showMoveAll = true,\n showCheckbox = true,\n className,\n style,\n },\n ref,\n ) => {\n const [sourceSelected, setSourceSelected] = useState<Set<string | number>>(new Set());\n const [targetSelected, setTargetSelected] = useState<Set<string | number>>(new Set());\n const [sourceFilter, setSourceFilter] = useState('');\n const [targetFilter, setTargetFilter] = useState('');\n\n function toggleSource(id: string | number) {\n setSourceSelected(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n }\n\n function toggleTarget(id: string | number) {\n setTargetSelected(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n }\n\n function moveSelectedToTarget() {\n const moving = sourceItems.filter(item => sourceSelected.has(item.id));\n const remaining = sourceItems.filter(item => !sourceSelected.has(item.id));\n onChange({ source: remaining, target: [...targetItems, ...moving] });\n setSourceSelected(new Set());\n }\n\n function moveAllToTarget() {\n const movable = sourceItems.filter(item => !item.disabled);\n const remaining = sourceItems.filter(item => item.disabled);\n onChange({ source: remaining, target: [...targetItems, ...movable] });\n setSourceSelected(new Set());\n }\n\n function moveSelectedToSource() {\n const moving = targetItems.filter(item => targetSelected.has(item.id));\n const remaining = targetItems.filter(item => !targetSelected.has(item.id));\n onChange({ source: [...sourceItems, ...moving], target: remaining });\n setTargetSelected(new Set());\n }\n\n function moveAllToSource() {\n const movable = targetItems.filter(item => !item.disabled);\n const remaining = targetItems.filter(item => item.disabled);\n onChange({ source: [...sourceItems, ...movable], target: remaining });\n setTargetSelected(new Set());\n }\n\n const hasSourceSelected = sourceSelected.size > 0;\n const hasTargetSelected = targetSelected.size > 0;\n const hasSourceMovable = sourceItems.some(item => !item.disabled);\n const hasTargetMovable = targetItems.some(item => !item.disabled);\n\n return (\n <div\n ref={ref}\n className={[styles.root, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n <Panel\n header={sourceHeader}\n items={sourceItems}\n selectedIds={sourceSelected}\n onToggle={toggleSource}\n itemTemplate={itemTemplate}\n filter={filter}\n filterValue={sourceFilter}\n onFilterChange={setSourceFilter}\n filterPlaceholder={sourceFilterPlaceholder}\n showCheckbox={showCheckbox}\n ariaLabel=\"Source list\"\n />\n\n <div className={styles.controls} role=\"group\" aria-label=\"Move controls\">\n {showMoveAll && (\n <CtrlBtn\n onClick={moveAllToTarget}\n disabled={!hasSourceMovable}\n aria-label=\"Move all to target\"\n >\n <ChevronDoubleRight />\n </CtrlBtn>\n )}\n <CtrlBtn\n onClick={moveSelectedToTarget}\n disabled={!hasSourceSelected}\n aria-label=\"Move selected to target\"\n >\n <ChevronRight />\n </CtrlBtn>\n <CtrlBtn\n onClick={moveSelectedToSource}\n disabled={!hasTargetSelected}\n aria-label=\"Move selected to source\"\n >\n <ChevronLeft />\n </CtrlBtn>\n {showMoveAll && (\n <CtrlBtn\n onClick={moveAllToSource}\n disabled={!hasTargetMovable}\n aria-label=\"Move all to source\"\n >\n <ChevronDoubleLeft />\n </CtrlBtn>\n )}\n </div>\n\n <Panel\n header={targetHeader}\n items={targetItems}\n selectedIds={targetSelected}\n onToggle={toggleTarget}\n itemTemplate={itemTemplate}\n filter={filter}\n filterValue={targetFilter}\n onFilterChange={setTargetFilter}\n filterPlaceholder={targetFilterPlaceholder}\n showCheckbox={showCheckbox}\n ariaLabel=\"Target list\"\n />\n </div>\n );\n },\n);\n\nPicklist.displayName = 'Picklist';\n","import { forwardRef } from 'react';\nimport styles from './Card.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface CardProps {\n /** Bold primary title rendered at the top of the card. */\n title?: React.ReactNode;\n /** Muted subtitle rendered below the title. */\n subTitle?: React.ReactNode;\n /**\n * Action area rendered at the bottom of the card.\n * Typically contains buttons or links.\n */\n footer?: React.ReactNode;\n /** Card body content. Accepts any ReactNode. */\n children?: React.ReactNode;\n /**\n * Makes the entire card interactive — adds a pointer cursor and a subtle\n * shadow lift on hover. Pass a handler to opt into this mode.\n */\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Card ─────────────────────────────────────────────────────────────────────\n\n/**\n * Card — Clear Design System\n *\n * A surface container with consistent border, radius, and padding. Optionally\n * renders a title, subtitle, body content, and a footer action area.\n * All sections are optional — use what you need.\n *\n * @example\n * // Standard card\n * <Card title=\"Loan Summary\" subTitle=\"Application #12345\" footer={<Button>View</Button>}>\n * <p>Body content goes here.</p>\n * </Card>\n *\n * @example\n * // Content-only container (no header or footer)\n * <Card><DataTable ... /></Card>\n *\n * @example\n * // Interactive / clickable card\n * <Card title=\"Open Application\" onClick={() => navigate('/app/123')}>\n * <p>Click anywhere to open.</p>\n * </Card>\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ title, subTitle, footer, children, onClick, className, style }, ref) => {\n const interactive = onClick != null;\n const hasCaption = title != null || subTitle != null || children != null;\n\n return (\n <div\n ref={ref}\n className={[\n styles.card,\n interactive ? styles.cardClickable : '',\n className ?? '',\n ].filter(Boolean).join(' ')}\n style={style}\n onClick={onClick}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={interactive ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n } : undefined}\n >\n <div className={styles.body}>\n {hasCaption && (\n <div className={styles.caption}>\n {title != null && <div className={styles.title}>{title}</div>}\n {subTitle != null && <div className={styles.subTitle}>{subTitle}</div>}\n {children != null && <div className={styles.content}>{children}</div>}\n </div>\n )}\n {footer != null && <div className={styles.footer}>{footer}</div>}\n </div>\n </div>\n );\n },\n);\n\nCard.displayName = 'Card';\n","import { forwardRef } from 'react';\nimport styles from './Accordion.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AccordionVariant = 'simple' | 'page' | 'panel' | 'flyout';\n\nexport interface AccordionItem {\n /** Unique identifier. */\n id: string;\n /** Header title text. */\n title: string;\n /** Panel body — any ReactNode, including tables, forms, etc. */\n content: React.ReactNode;\n /**\n * Optional count badge shown next to the title.\n * Visible in `panel` and `flyout` variants only.\n */\n badge?: number;\n /**\n * Optional action slot rendered between the title and the chevron.\n * Primarily used in the `simple` variant (e.g. a checkbox + label).\n */\n headerAction?: React.ReactNode;\n /** Prevents toggling when true. */\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n /** Array of accordion items. */\n items: AccordionItem[];\n /**\n * Visual variant.\n * - `simple` — transparent header, teal-700 bottom border + title\n * - `page` — full-width section, gray `#e4e4e4` bg, top-rounded header\n * - `panel` — compact gray `#f4f4f5` header, 32px height, optional badge\n * - `flyout` — medium gray `#f4f4f5` header, 44px height, optional badge\n * @default 'page'\n */\n variant?: AccordionVariant;\n /**\n * IDs of currently open items (controlled).\n * When `multiple` is false, at most one ID should be present.\n */\n openIds: string[];\n /** Called with the new set of open IDs when the user toggles an item. */\n onChange: (ids: string[]) => void;\n /**\n * Allow multiple panels open simultaneously.\n * @default false\n */\n multiple?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Accordion ────────────────────────────────────────────────────────────────\n\n/**\n * Accordion — Clear Design System\n *\n * Collapsible content panels. Fully controlled — pass `openIds` + `onChange`.\n * Four visual variants: `simple` (teal underline), `page`, `panel`, `flyout`\n * (all three use a light gray header).\n *\n * @example\n * const [open, setOpen] = useState(['item1']);\n * <Accordion\n * variant=\"page\"\n * items={[\n * { id: 'item1', title: 'Borrower', content: <BorrowerForm /> },\n * { id: 'item2', title: 'Property', content: <PropertyForm /> },\n * ]}\n * openIds={open}\n * onChange={setOpen}\n * />\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n (\n {\n items,\n variant = 'page',\n openIds,\n onChange,\n multiple = false,\n className,\n style,\n },\n ref,\n ) => {\n const handleToggle = (id: string) => {\n const isOpen = openIds.includes(id);\n if (multiple) {\n onChange(isOpen ? openIds.filter((x) => x !== id) : [...openIds, id]);\n } else {\n onChange(isOpen ? [] : [id]);\n }\n };\n\n return (\n <div\n ref={ref}\n className={[\n styles.accordion,\n styles[`variant_${variant}`],\n className ?? '',\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {items.map((item) => {\n const isOpen = openIds.includes(item.id);\n const headerId = `accordion-header-${item.id}`;\n const panelId = `accordion-panel-${item.id}`;\n const useBadge = (variant === 'panel' || variant === 'flyout') && item.badge != null;\n const useChevronAngle = variant === 'panel' || variant === 'flyout';\n\n return (\n <div\n key={item.id}\n className={[\n styles.item,\n isOpen ? styles.itemOpen : '',\n item.disabled ? styles.itemDisabled : '',\n ].filter(Boolean).join(' ')}\n >\n {/* ── Header ── */}\n <button\n id={headerId}\n className={styles.header}\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => handleToggle(item.id)}\n >\n {/* Left: title + optional badge */}\n <span className={styles.titleGroup}>\n <span className={styles.title}>{item.title}</span>\n {useBadge && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n\n {/* Right: optional action slot + chevron */}\n <span className={styles.headerRight}>\n {item.headerAction != null && (\n <span\n className={styles.headerAction}\n onClick={(e) => e.stopPropagation()}\n >\n {item.headerAction}\n </span>\n )}\n <span\n className={[\n styles.chevron,\n isOpen ? styles.chevronOpen : '',\n ].join(' ')}\n >\n <i\n className={\n useChevronAngle\n ? 'pi pi-angle-down'\n : 'pi pi-chevron-down'\n }\n />\n </span>\n </span>\n </button>\n\n {/* ── Content panel (CSS grid expand) ── */}\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n className={[\n styles.contentOuter,\n isOpen ? styles.contentOpen : '',\n ].join(' ')}\n >\n <div className={styles.contentInner}>\n <div className={styles.contentBody}>{item.content}</div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nAccordion.displayName = 'Accordion';\n","import { forwardRef } from 'react';\nimport styles from './Tabs.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface TabItem {\n /** Unique identifier for this tab. */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (any ReactNode). */\n icon?: React.ReactNode;\n /** Optional trailing count badge. */\n count?: number;\n /**\n * Second icon rendered after the label, before the count.\n * When present a `|` pipe separator is inserted between the label and this icon.\n */\n icon2?: React.ReactNode;\n /** Panel content rendered when this tab is active. */\n content?: React.ReactNode;\n /** Prevents interaction when true. */\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n /** Array of tab definitions. */\n tabs: TabItem[];\n /** Controlled: id of the currently active tab. */\n activeTab: string;\n /** Called with the id of the tab the user selected. */\n onChange: (id: string) => void;\n /**\n * Visual + structural variant.\n * - `'panel'` (default): tab strip + content panel for the active tab.\n * - `'nav'`: navigation-only strip with larger padding/font; the active\n * tab's `content` is **not** rendered (each tab represents a page or\n * route). Renders as `<nav>` for the right semantics.\n */\n variant?: 'panel' | 'nav';\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Tabs ──────────────────────────────────────────────────────────────────────\n\n/**\n * Tabs — Clear Design System\n *\n * Standard underline-style tab strip. Fully controlled — the parent owns\n * which tab is active. Two variants:\n * - `'panel'` (default): renders the active tab's `content` below the strip.\n * Use for sub-section switching inside a page.\n * - `'nav'`: page-level navigation with larger padding/font; the active\n * tab's `content` is not rendered (each tab is a route/page). Renders\n * as `<nav>` for the right semantics.\n *\n * @example\n * // Panel variant (default) — sub-section switcher with content below.\n * const [active, setActive] = useState('tab1');\n * <Tabs\n * tabs={[\n * { id: 'tab1', label: 'Overview', content: <p>Overview content</p> },\n * { id: 'tab2', label: 'Details', content: <p>Details content</p> },\n * ]}\n * activeTab={active}\n * onChange={setActive}\n * />\n *\n * @example\n * // Nav variant — top-level page navigation, no content panel.\n * <Tabs\n * variant=\"nav\"\n * tabs={[\n * { id: 'pricing', label: 'Run Pricing' },\n * { id: 'scenarios', label: 'Lead Scenarios' },\n * { id: 'templates', label: 'Scenario Templates' },\n * ]}\n * activeTab={page}\n * onChange={setPage}\n * />\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n ({ tabs, activeTab, onChange, variant = 'panel', className, style }, ref) => {\n const activeItem = tabs.find((t) => t.id === activeTab);\n const isNav = variant === 'nav';\n const Root = isNav ? 'nav' : 'div';\n\n return (\n <Root\n ref={ref as React.Ref<HTMLDivElement & HTMLElement>}\n className={[\n styles.tabs,\n isNav ? styles.nav : '',\n className ?? '',\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Tab strip ── */}\n <div className={styles.tablist} role={isNav ? undefined : 'tablist'}>\n {tabs.map((tab) => {\n const isActive = tab.id === activeTab;\n const panelId = `tabpanel-${tab.id}`;\n const tabId = `tab-${tab.id}`;\n\n return (\n <button\n key={tab.id}\n id={tabId}\n role={isNav ? undefined : 'tab'}\n aria-selected={isNav ? undefined : isActive}\n aria-current={isNav && isActive ? 'page' : undefined}\n aria-disabled={tab.disabled}\n aria-controls={isNav ? undefined : panelId}\n disabled={tab.disabled}\n className={[\n styles.tab,\n isActive ? styles.tabActive : '',\n tab.disabled ? styles.tabDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => {\n if (!tab.disabled) onChange(tab.id);\n }}\n >\n {tab.icon != null && (\n <span className={styles.tabIcon}>{tab.icon}</span>\n )}\n <span className={styles.tabLabel}>{tab.label}</span>\n {tab.icon2 != null && (\n <>\n <span className={styles.tabPipe}>|</span>\n <span className={styles.tabIcon}>{tab.icon2}</span>\n </>\n )}\n {tab.count != null && (\n <span className={styles.tabCount}>{tab.count}</span>\n )}\n </button>\n );\n })}\n </div>\n\n {/* ── Content panel (panel variant only — nav variant is strip-only) ── */}\n {!isNav && activeItem != null && activeItem.content != null && (\n <div\n id={`tabpanel-${activeItem.id}`}\n role=\"tabpanel\"\n aria-labelledby={`tab-${activeItem.id}`}\n className={styles.panel}\n >\n {activeItem.content}\n </div>\n )}\n </Root>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n","import { forwardRef, useRef, useState, useEffect, useCallback } from 'react';\nimport styles from './BannerTabs.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type StatusShape = 'dot' | 'diamond' | 'square' | 'none';\nexport type StatusColor = 'green' | 'yellow' | 'red' | 'gray';\n\nexport interface BannerTabStatus {\n shape: StatusShape;\n color: StatusColor;\n}\n\nexport type BadgeShape = 'square' | 'diamond' | 'circle';\n\nexport interface BannerTabBadge {\n /** The number shown inside the badge. */\n count: number;\n /** Tooltip text revealed on hover. */\n tooltip: string;\n /**\n * Shape of the badge.\n * Defaults per position: 0 → square, 1 → diamond, 2 → circle.\n */\n shape?: BadgeShape;\n /**\n * CSS color value for the badge fill.\n * Defaults per position: 0 → --red-500, 1 → --yellow-500, 2 → --green-300.\n * When count is 0, always renders in muted gray regardless of this value.\n */\n color?: string;\n}\n\nexport interface BannerTabBadgeGroup {\n /** Ordered list of badge definitions within this group. */\n badges: BannerTabBadge[];\n}\n\nexport interface BannerTabItem {\n /** Unique identifier. */\n id: string;\n /** Primary label (\"DU\", \"Loan Summary\"). */\n label: string;\n /** Secondary label after \"/\" (\"LPA\" in \"DU / LPA\"). */\n subLabel?: string;\n /** Muted status line (\"Not Complete\", \"Rep. Score 732\"). */\n subtitle: string;\n /** Primary status indicator shape + color. */\n status: BannerTabStatus;\n /** Secondary status indicator (used alongside subLabel). */\n subStatus?: BannerTabStatus;\n /** Shows a lock icon after the label. */\n locked?: boolean;\n /**\n * One or more groups of count badges rendered below the subtitle.\n * Multiple groups are separated by a pipe ( | ).\n * Each badge defaults to square/diamond/circle with red/yellow/green fills\n * by position — override per badge with `shape` and `color`.\n */\n badgeGroups?: BannerTabBadgeGroup[];\n /** Custom docs/badge row rendered at the bottom of the card. */\n docs?: React.ReactNode;\n /** Prevents interaction when true. */\n disabled?: boolean;\n}\n\nexport interface BannerTabsProps {\n /** Array of banner tab definitions. */\n items: BannerTabItem[];\n /** Controlled: id of the active item, or null for none. */\n activeId: string | null;\n /** Called with the id when the user selects a tab. */\n onChange: (id: string) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Status indicator ─────────────────────────────────────────────────────────\n\nconst COLOR_MAP: Record<StatusColor, string> = {\n green: '#66BB5F',\n yellow: '#F5C664',\n red: '#E53935',\n gray: 'transparent',\n};\n\nconst BORDER_MAP: Record<StatusColor, string> = {\n green: '#66BB5F',\n yellow: '#F5C664',\n red: '#E53935',\n gray: '#94A3B8',\n};\n\nfunction StatusIndicator({ shape, color }: BannerTabStatus) {\n const fill = COLOR_MAP[color];\n const border = BORDER_MAP[color];\n const size = 9;\n\n if (shape === 'dot') {\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: fill,\n border: `1px solid ${border}`,\n flexShrink: 0,\n }}\n />\n );\n }\n\n if (shape === 'diamond') {\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n background: fill,\n border: `1px solid ${border}`,\n transform: 'rotate(45deg)',\n flexShrink: 0,\n }}\n />\n );\n }\n\n if (shape === 'square') {\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n background: fill,\n border: `1px solid ${border}`,\n flexShrink: 0,\n }}\n />\n );\n }\n\n // 'none' → hollow circle\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: 'transparent',\n border: `1.5px solid #94A3B8`,\n flexShrink: 0,\n }}\n />\n );\n}\n\n// ─── Badge defaults (by position) ─────────────────────────────────────────────\n\n// First badge group: square/diamond/circle, red-500/yellow-500/green-300\nconst BADGE_DEFAULTS_GROUP0: Array<{ shape: BadgeShape; color: string }> = [\n { shape: 'square', color: 'var(--red-500, #EB1000)' },\n { shape: 'diamond', color: 'var(--yellow-500, #FBDE0B)' },\n { shape: 'circle', color: 'var(--green-300, #6FB864)' },\n];\n\n// Subsequent badge groups: all squares, teal-600 / green-600 / teal-500\nconst BADGE_DEFAULTS_GROUP_N: Array<{ shape: BadgeShape; color: string }> = [\n { shape: 'square', color: 'var(--teal-600, #138890)' },\n { shape: 'square', color: 'var(--green-600, #22A34A)' },\n { shape: 'square', color: 'var(--teal-500, #32A4AC)' },\n];\n\nconst BADGE_ZERO_COLOR = 'var(--surface-500, #ADB5BD)';\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nfunction TabBadge({ shape, color, count, tooltip, diamondGroup0 }: {\n shape: BadgeShape;\n color: string;\n count: number;\n tooltip: string;\n /** True when this is the diamond badge in the first group — uses navy-800 text. */\n diamondGroup0?: boolean;\n}) {\n const disabled = count === 0;\n const bg = disabled ? BADGE_ZERO_COLOR : color;\n // Disabled → navy-900; diamond in group 0 → navy-800; everything else → white\n const numColor = disabled\n ? 'var(--navy-900, #0D1117)'\n : diamondGroup0\n ? 'var(--navy-800, #171D22)'\n : '#ffffff';\n\n return (\n <span className={styles.badge} data-tooltip={tooltip}>\n <span\n className={[\n styles.badgeShape,\n shape === 'circle' ? styles.badgeShapeCircle : '',\n shape === 'diamond' ? styles.badgeShapeDiamond : '',\n ].filter(Boolean).join(' ')}\n style={{ background: bg }}\n />\n <span className={styles.badgeNum} style={{ color: numColor }}>{count}</span>\n </span>\n );\n}\n\n// ─── BannerTabs ───────────────────────────────────────────────────────────────\n\n/**\n * BannerTabs — Clear Design System\n *\n * Scrollable horizontal strip of card-shaped navigation tabs. Each card shows\n * a status indicator, primary label, optional secondary label, a muted\n * subtitle, and optional count badge groups. Overflow is handled with\n * left/right arrow buttons and a fade gradient on the right edge.\n *\n * Fully controlled — the parent owns which tab is active.\n *\n * @example\n * const [active, setActive] = useState('loan-summary');\n * <BannerTabs items={loanStages} activeId={active} onChange={setActive} />\n */\nexport const BannerTabs = forwardRef<HTMLDivElement, BannerTabsProps>(\n ({ items, activeId, onChange, className, style }, ref) => {\n const trackRef = useRef<HTMLDivElement>(null);\n const [showLeft, setShowLeft] = useState(false);\n const [showRight, setShowRight] = useState(false);\n\n const updateArrows = useCallback(() => {\n const el = trackRef.current;\n if (el == null) return;\n setShowLeft(el.scrollLeft > 0);\n setShowRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n }, []);\n\n useEffect(() => {\n const el = trackRef.current;\n if (el == null) return;\n\n updateArrows();\n\n el.addEventListener('scroll', updateArrows, { passive: true });\n const ro = new ResizeObserver(updateArrows);\n ro.observe(el);\n\n return () => {\n el.removeEventListener('scroll', updateArrows);\n ro.disconnect();\n };\n }, [updateArrows]);\n\n const scrollBy = (direction: 'left' | 'right') => {\n trackRef.current?.scrollBy({\n left: direction === 'left' ? -200 : 200,\n behavior: 'smooth',\n });\n };\n\n return (\n <div\n ref={ref}\n className={[styles.bannerTabs, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Left arrow ── */}\n {showLeft && (\n <button\n className={[styles.arrow, styles.arrowLeft].join(' ')}\n onClick={() => scrollBy('left')}\n aria-label=\"Scroll left\"\n tabIndex={-1}\n >\n <i className=\"pi pi-chevron-left\" />\n </button>\n )}\n\n {/* ── Scroll track ── */}\n <div className={styles.track} ref={trackRef}>\n {items.map((item) => {\n const isActive = item.id === activeId;\n\n return (\n <button\n key={item.id}\n className={[\n styles.card,\n isActive ? styles.cardActive : '',\n item.disabled ? styles.cardDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => {\n if (!item.disabled) onChange(item.id);\n }}\n disabled={item.disabled}\n aria-pressed={isActive}\n aria-disabled={item.disabled}\n >\n {/* Row 1: status + label + subLabel + lock */}\n <div className={styles.labelRow}>\n <StatusIndicator shape={item.status.shape} color={item.status.color} />\n <span className={styles.label}>{item.label}</span>\n {item.subLabel != null && (\n <>\n <span className={styles.labelSep}>/</span>\n {item.subStatus != null && (\n <StatusIndicator shape={item.subStatus.shape} color={item.subStatus.color} />\n )}\n <span className={styles.label}>{item.subLabel}</span>\n </>\n )}\n {item.locked && (\n <i className={`pi pi-lock ${styles.lockIcon}`} />\n )}\n </div>\n\n {/* Row 2: subtitle */}\n <div className={styles.subtitle}>{item.subtitle}</div>\n\n {/* Row 3 (optional): structured count badge groups */}\n {item.badgeGroups != null && item.badgeGroups.length > 0 && (\n <div className={styles.badgeGroups}>\n {item.badgeGroups.map((group, gi) => (\n <div key={gi} className={styles.badgeGroupWrap}>\n {gi > 0 && <span className={styles.badgeGroupPipe}>|</span>}\n <div className={styles.badgeGroup}>\n {group.badges.map((badge, bi) => {\n const defaults = gi === 0 ? BADGE_DEFAULTS_GROUP0 : BADGE_DEFAULTS_GROUP_N;\n const def = defaults[bi] ?? { shape: 'square' as BadgeShape, color: 'var(--teal-600, #138890)' };\n const resolvedShape = badge.shape ?? def.shape;\n return (\n <TabBadge\n key={bi}\n shape={resolvedShape}\n color={badge.color ?? def.color}\n count={badge.count}\n tooltip={badge.tooltip}\n diamondGroup0={gi === 0 && resolvedShape === 'diamond'}\n />\n );\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Row 4 (optional): freeform docs slot */}\n {item.docs != null && (\n <div className={styles.docs}>{item.docs}</div>\n )}\n </button>\n );\n })}\n </div>\n\n {/* ── Right fade + arrow ── */}\n {showRight && (\n <>\n <div className={styles.fadeMask} />\n <button\n className={[styles.arrow, styles.arrowRight].join(' ')}\n onClick={() => scrollBy('right')}\n aria-label=\"Scroll right\"\n tabIndex={-1}\n >\n <i className=\"pi pi-chevron-right\" />\n </button>\n </>\n )}\n </div>\n );\n },\n);\n\nBannerTabs.displayName = 'BannerTabs';\n","import { forwardRef, useEffect, useRef, useState, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from '../Button';\nimport { CloseButton } from '../CloseButton';\nimport styles from './Drawer.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface DrawerAction {\n /** Button label */\n label: string;\n /** Called when the button is clicked */\n onClick: () => void;\n /** Disables the button */\n disabled?: boolean;\n}\n\nexport interface DrawerProps {\n /** Controls open/closed state */\n isOpen: boolean;\n /** Called when ✕ is clicked, scrim is clicked, or Escape is pressed */\n onClose: () => void;\n /** Panel heading */\n title?: string;\n /** Optional subtitle rendered below the title — any ReactNode */\n subtitle?: React.ReactNode;\n /** Scrollable body content */\n children: React.ReactNode;\n /**\n * Required primary action (right-aligned, primary variant).\n * Always rendered.\n */\n primaryAction: DrawerAction;\n /** Optional secondary action (right-aligned, secondary variant, left of primary) */\n secondaryAction?: DrawerAction;\n /**\n * Optional tertiary actions (left-aligned, ghost variant).\n * Multiple are supported — they appear to the left of the footer.\n */\n tertiaryActions?: DrawerAction[];\n /**\n * Which edge the drawer slides in from.\n * @default 'right'\n */\n side?: 'left' | 'right';\n /**\n * Panel width in px.\n * @default 800\n */\n width?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Drawer ───────────────────────────────────────────────────────────────────\n\n/**\n * Drawer — Clear Design System\n *\n * A full-height panel that slides in from the left or right edge, sitting on\n * top of page content with a dark scrim behind it. Unlike SidePanel, Drawer\n * does not push page content — it overlays it like a modal.\n *\n * The footer is always present with structured action buttons. A gradient\n * shadow appears above the footer when the body content overflows (indicating\n * more scrollable content below).\n *\n * Fully controlled — pass `isOpen` + `onClose`. Closes on ✕ click, scrim\n * click, or Escape key.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * <Drawer\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"Review Documents\"\n * primaryAction={{ label: 'Save', onClick: handleSave }}\n * secondaryAction={{ label: 'Cancel', onClick: () => setOpen(false) }}\n * >\n * <p>Drawer content here…</p>\n * </Drawer>\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(\n (\n {\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n primaryAction,\n secondaryAction,\n tertiaryActions,\n side = 'right',\n width = 800,\n className,\n style,\n },\n ref,\n ) => {\n const bodyRef = useRef<HTMLDivElement>(null);\n const [showFooterShadow, setShowFooterShadow] = useState(false);\n\n // ── Close on Escape ──────────────────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, onClose]);\n\n // ── Footer shadow: visible when body has overflow below scroll position ──\n const checkScroll = useCallback(() => {\n const el = bodyRef.current;\n if (!el) { setShowFooterShadow(false); return; }\n const hasMoreBelow = el.scrollHeight - el.scrollTop - el.clientHeight > 2;\n setShowFooterShadow(hasMoreBelow);\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n // Run on next tick so the DOM has rendered\n const raf = requestAnimationFrame(checkScroll);\n const el = bodyRef.current;\n if (!el) return;\n el.addEventListener('scroll', checkScroll);\n const ro = new ResizeObserver(checkScroll);\n ro.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n el.removeEventListener('scroll', checkScroll);\n ro.disconnect();\n };\n }, [isOpen, checkScroll]);\n\n const panelClass = [\n styles.drawer,\n styles[`side_${side}`],\n isOpen ? styles.open : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const overlayClass = [styles.overlay, isOpen ? styles.overlayOpen : '']\n .filter(Boolean)\n .join(' ');\n\n return createPortal(\n <div\n className={overlayClass}\n data-side={side}\n onClick={isOpen ? onClose : undefined}\n aria-hidden={!isOpen}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Drawer'}\n className={panelClass}\n style={{ width, ...style }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n <div className={styles.header}>\n <div className={styles.headerTitle}>\n {title && <span className={styles.title}>{title}</span>}\n {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n <CloseButton aria-label=\"Close drawer\" onClick={onClose} />\n </div>\n\n {/* ── Scrollable body ── */}\n <div ref={bodyRef} className={styles.body}>\n {children}\n </div>\n\n {/* ── Footer ── */}\n <div className={styles.footer}>\n {showFooterShadow && <div className={styles.footerShadow} aria-hidden=\"true\" />}\n\n {tertiaryActions && tertiaryActions.length > 0 && (\n <div className={styles.tertiaryGroup}>\n {tertiaryActions.map((action, i) => (\n <Button\n key={i}\n variant=\"ghost\"\n size=\"sm\"\n onClick={action.onClick}\n disabled={action.disabled}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n\n {secondaryAction && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={secondaryAction.onClick}\n disabled={secondaryAction.disabled}\n >\n {secondaryAction.label}\n </Button>\n )}\n\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={primaryAction.onClick}\n disabled={primaryAction.disabled}\n >\n {primaryAction.label}\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n );\n },\n);\n\nDrawer.displayName = 'Drawer';\n","import { useEffect, useState, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseButton } from '../CloseButton/CloseButton';\nimport styles from './Toast.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ToastSeverity = 'success' | 'info' | 'warn' | 'error';\nexport type ToastLayout = 'horizontal' | 'vertical';\n\nexport interface ToastOptions {\n /**\n * How the title and detail are arranged.\n * - `horizontal` (default): title and detail on one line — for short messages.\n * - `vertical`: title on top, detail below — for longer descriptions.\n */\n layout?: ToastLayout;\n /**\n * Auto-dismiss delay in ms. Set to `0` to disable auto-dismiss.\n * @default 5000\n */\n duration?: number;\n}\n\ninterface ToastItem extends ToastOptions {\n id: string;\n severity: ToastSeverity;\n /** Bold heading text */\n title: string;\n /** Optional supporting detail */\n detail?: string;\n /** Internal — tracks exit animation */\n exiting?: boolean;\n}\n\n// ─── Singleton store ──────────────────────────────────────────────────────────\n\ntype Listener = (items: ToastItem[]) => void;\nconst listeners = new Set<Listener>();\nlet _items: ToastItem[] = [];\n\nfunction emit() {\n listeners.forEach((l) => l([..._items]));\n}\n\nfunction removeItem(id: string) {\n // Mark as exiting first (triggers CSS exit animation)\n _items = _items.map((i) => (i.id === id ? { ...i, exiting: true } : i));\n emit();\n // Remove from DOM after animation completes\n setTimeout(() => {\n _items = _items.filter((i) => i.id !== id);\n emit();\n }, 300);\n}\n\nfunction addItem(\n severity: ToastSeverity,\n title: string,\n detail?: string,\n opts: ToastOptions = {},\n) {\n const item: ToastItem = {\n id: crypto.randomUUID(),\n severity,\n title,\n detail,\n layout: opts.layout ?? 'horizontal',\n duration: opts.duration ?? 5000,\n };\n _items = [..._items, item];\n emit();\n\n if (item.duration! > 0) {\n setTimeout(() => removeItem(item.id), item.duration);\n }\n}\n\n// ─── Public imperative API ────────────────────────────────────────────────────\n\n/**\n * Imperative toast API. Requires `<Toaster />` to be mounted in the app.\n *\n * @example\n * toast.success('Saved', 'Loan application saved successfully.');\n * toast.error('Failed', 'Unable to update loan. Please try again.');\n */\nexport const toast = {\n success: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('success', title, detail, opts),\n info: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('info', title, detail, opts),\n warn: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('warn', title, detail, opts),\n error: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('error', title, detail, opts),\n};\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst SEVERITY_CONFIG: Record<\n ToastSeverity,\n { icon: string; bgVar: string; borderVar: string; titleVar: string; iconVar: string }\n> = {\n success: {\n icon: 'pi-check',\n bgVar: '--green-50',\n borderVar: '--green-700',\n titleVar: '--green-700',\n iconVar: '--green-600',\n },\n info: {\n icon: 'pi-info-circle',\n bgVar: '--blue-50',\n borderVar: '--blue-600',\n titleVar: '--blue-600',\n iconVar: '--blue-600',\n },\n warn: {\n icon: 'pi-exclamation-triangle',\n bgVar: '--yellow-50',\n borderVar: '--yellow-800',\n titleVar: '--yellow-800',\n iconVar: '--yellow-600',\n },\n error: {\n icon: 'pi-times-circle',\n bgVar: '--red-50',\n borderVar: '--red-600',\n titleVar: '--red-600',\n iconVar: '--red-500',\n },\n};\n\n// Hardcoded fallbacks for each severity (for environments where tokens aren't loaded)\nconst SEVERITY_FALLBACKS: Record<ToastSeverity, { bg: string; border: string; title: string; icon: string }> = {\n success: { bg: '#edf8ea', border: '#1a760b', title: '#1a760b', icon: '#16a34a' },\n info: { bg: '#f5f9ff', border: '#326fd1', title: '#326fd1', icon: '#2563eb' },\n warn: { bg: '#fffce7', border: '#695d05', title: '#695d05', icon: '#ca8a04' },\n error: { bg: '#fff5f5', border: '#d60f00', title: '#d60f00', icon: '#dc2626' },\n};\n\n// ─── Single toast item ────────────────────────────────────────────────────────\n\ninterface ToastItemProps extends ToastItem {\n onClose: () => void;\n}\n\nfunction ToastItemView({ id, severity, title, detail, layout = 'horizontal', exiting, onClose }: ToastItemProps) {\n const cfg = SEVERITY_CONFIG[severity];\n const fb = SEVERITY_FALLBACKS[severity];\n const descId = `toast-desc-${id}`;\n const isVertical = layout === 'vertical';\n\n const cssVars = {\n '--t-bg': `var(${cfg.bgVar}, ${fb.bg})`,\n '--t-border': `var(${cfg.borderVar}, ${fb.border})`,\n '--t-title': `var(${cfg.titleVar}, ${fb.title})`,\n '--t-icon': `var(${cfg.iconVar}, ${fb.icon})`,\n } as React.CSSProperties;\n\n return (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n aria-describedby={detail ? descId : undefined}\n className={[styles.toast, exiting ? styles.toastExit : styles.toastEnter].join(' ')}\n style={cssVars}\n >\n <div className={[styles.content, isVertical ? styles.contentVertical : styles.contentHorizontal].join(' ')}>\n {/* Icon */}\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n\n {/* Text */}\n <div className={[styles.text, isVertical ? styles.textVertical : styles.textHorizontal].join(' ')}>\n <span className={styles.title}>{title}</span>\n {detail && (\n <span id={descId} className={styles.detail}>\n {detail}\n </span>\n )}\n </div>\n\n {/* Close */}\n <CloseButton aria-label=\"Dismiss notification\" onClick={onClose} />\n </div>\n </div>\n );\n}\n\n// ─── Toaster container ────────────────────────────────────────────────────────\n\n/**\n * Toaster — mount once in your app root to enable toast notifications.\n *\n * @example\n * // In App.tsx or layout root:\n * <Toaster />\n *\n * // Anywhere else:\n * toast.success('Saved', 'Your changes have been saved.');\n */\nexport function Toaster() {\n const [items, setItems] = useState<ToastItem[]>([]);\n\n useEffect(() => {\n listeners.add(setItems);\n return () => {\n listeners.delete(setItems);\n };\n }, []);\n\n if (items.length === 0) return null;\n\n return createPortal(\n <div className={styles.container} aria-label=\"Notifications\">\n {items.map((item) => (\n <ToastItemView\n key={item.id}\n {...item}\n onClose={() => removeItem(item.id)}\n />\n ))}\n </div>,\n document.body,\n );\n}\n\nToaster.displayName = 'Toaster';\n\n// ─── Static Toast (for Storybook / testing without Toaster) ──────────────────\n\nexport interface StaticToastProps {\n severity: ToastSeverity;\n title: string;\n detail?: string;\n layout?: ToastLayout;\n onClose?: () => void;\n}\n\n/**\n * A static, non-dismissing version of a single toast — useful for Storybook\n * and visual testing without needing the imperative API.\n */\nexport function Toast({ severity, title, detail, layout = 'horizontal', onClose }: StaticToastProps) {\n const id = useId();\n return (\n <ToastItemView\n id={id}\n severity={severity}\n title={title}\n detail={detail}\n layout={layout}\n onClose={onClose ?? (() => {})}\n />\n );\n}\n\nToast.displayName = 'Toast';\n","import styles from './ProgressBar.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProgressBarProps {\n /**\n * Current progress value. Clamped to [0, max].\n */\n value: number;\n /**\n * Maximum value. Defaults to 100.\n * @default 100\n */\n max?: number;\n /**\n * Puts the bar into an error state — hides the fill and shows `errorMessage` in red.\n */\n error?: boolean;\n /**\n * Error message shown below the track when `error` is true.\n */\n errorMessage?: string;\n /** Accessible label describing what is being measured. */\n 'aria-label'?: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ProgressBar({\n value,\n max = 100,\n error = false,\n errorMessage,\n 'aria-label': ariaLabel,\n}: ProgressBarProps) {\n const clamped = Math.min(Math.max(value, 0), max);\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n\n return (\n <div className={styles.wrapper}>\n <div\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={ariaLabel}\n className={[styles.track, error ? styles.trackError : ''].join(' ').trim()}\n >\n {!error && (\n <div\n className={styles.fill}\n style={{ width: `${pct}%` }}\n />\n )}\n </div>\n {error && errorMessage && (\n <p className={styles.errorMessage}>{errorMessage}</p>\n )}\n </div>\n );\n}\n\nProgressBar.displayName = 'ProgressBar';\n","export default \"data:image/png;base64,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\"","import { useId } from 'react';\nimport clearLogo from './clear-logo.png';\nimport styles from './ProgressSpinner.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProgressSpinnerProps {\n /**\n * Spinner size.\n * - `sm` — 20px ring\n * - `md` — 32px ring (default)\n * - `lg` — 36px ring with the CLEAR logo centered inside\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Text label displayed below the spinner. Primarily designed for the `lg` variant.\n */\n label?: string;\n /**\n * Adjusts the label text color for placement on light or dark backgrounds.\n * @default 'light'\n */\n theme?: 'light' | 'dark';\n /** Accessible label describing the loading state. */\n 'aria-label'?: string;\n}\n\n// ─── Size config ──────────────────────────────────────────────────────────────\n\nconst SIZE_CONFIG = {\n sm: { px: 20, r: 8.5, sw: 3 },\n md: { px: 32, r: 14.5, sw: 3 },\n lg: { px: 36, r: 16.5, sw: 3 },\n} as const;\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ProgressSpinner({\n size = 'md',\n label,\n theme = 'light',\n 'aria-label': ariaLabel,\n}: ProgressSpinnerProps) {\n const id = useId();\n const gradId = `ps-grad-${id.replace(/:/g, '')}`;\n\n const { px, r, sw } = SIZE_CONFIG[size];\n const circumference = 2 * Math.PI * r;\n const arcLength = circumference * 0.75;\n const gapLength = circumference * 0.25;\n\n const isLg = size === 'lg';\n\n return (\n <div\n className={styles.wrapper}\n role=\"status\"\n aria-label={ariaLabel ?? 'Loading'}\n >\n {/* Spinner ring */}\n <div className={[styles.ring, isLg ? styles.ringLg : ''].join(' ').trim()}>\n <svg\n width={px}\n height={px}\n viewBox={`0 0 ${px} ${px}`}\n className={styles.svg}\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id={gradId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--teal-600, #138890)\" />\n <stop offset=\"100%\" stopColor=\"var(--green-300, #6FB864)\" />\n </linearGradient>\n </defs>\n\n {/* Track */}\n <circle\n cx={px / 2}\n cy={px / 2}\n r={r}\n fill=\"none\"\n stroke=\"var(--surface-300, #F4F4F5)\"\n strokeWidth={sw}\n />\n\n {/* Gradient arc */}\n <circle\n cx={px / 2}\n cy={px / 2}\n r={r}\n fill=\"none\"\n stroke={`url(#${gradId})`}\n strokeWidth={sw}\n strokeDasharray={`${arcLength} ${gapLength}`}\n strokeLinecap=\"round\"\n />\n </svg>\n\n {/* Logo centered inside lg ring */}\n {isLg && (\n <img\n src={clearLogo}\n alt=\"\"\n aria-hidden=\"true\"\n className={styles.logo}\n />\n )}\n </div>\n\n {/* Label */}\n {label && (\n <span className={[styles.label, styles[`label--${theme}`]].join(' ')}>\n {label}\n </span>\n )}\n </div>\n );\n}\n\nProgressSpinner.displayName = 'ProgressSpinner';\n","import styles from './MiscChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type MiscChipColor =\n | 'red-darkest' | 'red-light'\n | 'yellow-darkest' | 'yellow-dark' | 'yellow-light'\n | 'green-darkest' | 'green-dark' | 'green-light'\n | 'blue-darkest' | 'blue-dark' | 'blue-light'\n | 'navy';\n\nexport interface MiscChipProps {\n label: string;\n color: MiscChipColor;\n /**\n * Whether the dismiss (✕) button is shown.\n * @default true\n */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n// ─── Color config (all map to existing tokens) ────────────────────────────────\n\nconst CONFIG: Record<MiscChipColor, { bgVar: string; bg: string; textVar?: string; text: string }> = {\n 'red-darkest': { bgVar: '--red-800', bg: '#990D03', text: '#ffffff' },\n 'red-light': { bgVar: '--red-200', bg: '#FFB8B3', textVar: '--red-900', text: '#630700' },\n 'yellow-darkest': { bgVar: '--yellow-800', bg: '#695D05', text: '#ffffff' },\n 'yellow-dark': { bgVar: '--yellow-400', bg: '#FCE53C', textVar: '--yellow-900', text: '#514908' },\n 'yellow-light': { bgVar: '--yellow-100', bg: '#FEF5B3', textVar: '--yellow-900', text: '#514908' },\n 'green-darkest': { bgVar: '--green-800', bg: '#174510', text: '#ffffff' },\n 'green-dark': { bgVar: '--green-400', bg: '#4B9C3E', text: '#ffffff' },\n 'green-light': { bgVar: '--green-200', bg: '#9BD491', textVar: '--green-900', text: '#11340B' },\n 'blue-darkest': { bgVar: '--blue-800', bg: '#204887', text: '#ffffff' },\n 'blue-dark': { bgVar: '--blue-400', bg: '#609AF8', text: '#ffffff' },\n 'blue-light': { bgVar: '--blue-200', bg: '#ABC9FB', textVar: '--blue-900', text: '#183462' },\n 'navy': { bgVar: '--navy-300', bg: '#70777D', text: '#ffffff' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function MiscChip({ label, color, dismissible = true, onDismiss }: MiscChipProps) {\n const cfg = CONFIG[color];\n\n const cssVars = {\n '--c-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--c-text': cfg.textVar ? `var(${cfg.textVar}, ${cfg.text})` : cfg.text,\n } as React.CSSProperties;\n\n return (\n <span className={styles.chip} style={cssVars}>\n <span className={styles.label}>{label}</span>\n {dismissible && (\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label={`Remove ${label}`}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n}\n\nMiscChip.displayName = 'MiscChip';\n","import styles from './SeverityChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type SeverityChipVariant = 'plain' | 'contrast' | 'error' | 'warning' | 'informative' | 'success';\n\nexport interface SeverityChipProps {\n label: string;\n severity: SeverityChipVariant;\n /**\n * Whether the dismiss (✕) button is shown.\n * @default true\n */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<SeverityChipVariant, { bgVar: string; bg: string; textVar?: string; text: string }> = {\n plain: { bgVar: '--navy-50', bg: '#EAEBEC', textVar: '--teal-900', text: '#18474A' },\n contrast: { bgVar: '--teal-900', bg: '#18474A', text: '#ffffff' },\n error: { bgVar: '--red-500', bg: '#EB1000', text: '#ffffff' },\n warning: { bgVar: '--yellow-400', bg: '#FCE53C', textVar: '--yellow-900', text: '#514908' },\n informative: { bgVar: '--blue-400', bg: '#609AF8', text: '#ffffff' },\n success: { bgVar: '--green-500', bg: '#1E830E', text: '#ffffff' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function SeverityChip({ label, severity, dismissible = true, onDismiss }: SeverityChipProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--c-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--c-text': cfg.textVar ? `var(${cfg.textVar}, ${cfg.text})` : cfg.text,\n } as React.CSSProperties;\n\n return (\n <span className={styles.chip} style={cssVars}>\n <span className={styles.label}>{label}</span>\n {dismissible && (\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label={`Remove ${label}`}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n}\n\nSeverityChip.displayName = 'SeverityChip';\n","import type { ReactNode } from 'react';\nimport styles from './ProfileChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProfileChipProps {\n label: string;\n /**\n * Content shown to the left of the label (avatar, icon, initials, etc.).\n * Rendered in a 18×18px circular clip.\n */\n leading?: ReactNode;\n /**\n * Content shown to the right of the label (avatar, icon, initials, etc.).\n * Rendered in a 18×18px circular clip.\n */\n trailing?: ReactNode;\n /**\n * Whether the dismiss (✕) button is shown.\n * @default true\n */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ProfileChip({ label, leading, trailing, dismissible = true, onDismiss }: ProfileChipProps) {\n return (\n <span\n className={styles.chip}\n data-leading={leading ? 'true' : undefined}\n data-trailing={trailing ? 'true' : undefined}\n >\n {leading && <span className={styles.avatar}>{leading}</span>}\n <span className={styles.label}>{label}</span>\n {trailing && <span className={styles.avatar}>{trailing}</span>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label={`Remove ${label}`}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n}\n\nProfileChip.displayName = 'ProfileChip';\n","import styles from './AUSChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AUSChipColor = 'green' | 'red' | 'yellow' | 'grey';\n\nexport interface AUSChipProps {\n label: string;\n /** AUS finding color — maps to standard severity tokens. */\n color: AUSChipColor;\n}\n\n// ─── Dot color config ─────────────────────────────────────────────────────────\n\nconst DOT_CONFIG: Record<AUSChipColor, { dotVar: string; dot: string }> = {\n green: { dotVar: '--green-500', dot: '#1E830E' },\n red: { dotVar: '--red-500', dot: '#EB1000' },\n yellow: { dotVar: '--yellow-400', dot: '#FCE53C' },\n grey: { dotVar: '--navy-300', dot: '#70777D' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function AUSChip({ label, color }: AUSChipProps) {\n const cfg = DOT_CONFIG[color];\n\n return (\n <span className={styles.chip}>\n <span\n className={styles.dot}\n style={{ background: `var(${cfg.dotVar}, ${cfg.dot})` }}\n aria-hidden=\"true\"\n />\n <span className={styles.label}>{label}</span>\n </span>\n );\n}\n\nAUSChip.displayName = 'AUSChip';\n","import { CloseButton } from '../CloseButton/CloseButton';\nimport styles from './BannerAlert.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BannerAlertSeverity = 'success' | 'info' | 'warn' | 'error' | 'neutral';\n\nexport interface BannerAlertProps {\n severity: BannerAlertSeverity;\n /** Bold heading text */\n title: string;\n /** Optional supporting detail shown after the title */\n detail?: string;\n /**\n * Whether a dismiss (✕) button is shown.\n * @default true\n */\n closable?: boolean;\n onClose?: () => void;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<\n BannerAlertSeverity,\n { icon: string; bgVar: string; borderVar: string; colorVar: string; bg: string; border: string; color: string }\n> = {\n success: { icon: 'pi-check', bgVar: '--green-50', borderVar: '--green-700', colorVar: '--green-700', bg: '#edf8ea', border: '#1a760b', color: '#1a760b' },\n info: { icon: 'pi-info-circle', bgVar: '--blue-50', borderVar: '--blue-600', colorVar: '--blue-600', bg: '#f5f9ff', border: '#326fd1', color: '#326fd1' },\n warn: { icon: 'pi-exclamation-triangle', bgVar: '--yellow-50', borderVar: '--yellow-800', colorVar: '--yellow-800', bg: '#fefaed', border: '#695d05', color: '#695d05' },\n error: { icon: 'pi-exclamation-circle', bgVar: '--red-50', borderVar: '--red-600', colorVar: '--red-600', bg: '#fff5f5', border: '#d60f00', color: '#d60f00' },\n neutral: { icon: 'pi-info-circle', bgVar: '--teal-50', borderVar: '--teal-700', colorVar: '--teal-700', bg: '#eaf6f7', border: '#186368', color: '#186368' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function BannerAlert({ severity, title, detail, closable = true, onClose }: BannerAlertProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--a-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--a-border': `var(${cfg.borderVar}, ${cfg.border})`,\n '--a-color': `var(${cfg.colorVar}, ${cfg.color})`,\n } as React.CSSProperties;\n\n return (\n <div role=\"alert\" className={styles.banner} style={cssVars}>\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n <div className={styles.text}>\n <span className={styles.title}>{title}</span>\n {detail && <span className={styles.detail}>{detail}</span>}\n </div>\n {closable && (\n <CloseButton aria-label=\"Dismiss\" onClick={onClose} />\n )}\n </div>\n );\n}\n\nBannerAlert.displayName = 'BannerAlert';\n","import { CloseButton } from '../CloseButton/CloseButton';\nimport styles from './InlineContainedAlert.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AlertSeverity = 'success' | 'info' | 'warn' | 'error';\n\nexport interface InlineContainedAlertProps {\n severity: AlertSeverity;\n message: string;\n /**\n * Whether a dismiss (✕) button is shown.\n * @default true\n */\n closable?: boolean;\n onClose?: () => void;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<\n AlertSeverity,\n { icon: string; bgVar: string; colorVar: string; bg: string; color: string }\n> = {\n success: { icon: 'pi-check', bgVar: '--green-50', colorVar: '--green-700', bg: '#edf8ea', color: '#1a760b' },\n info: { icon: 'pi-info-circle', bgVar: '--blue-50', colorVar: '--blue-600', bg: '#f5f9ff', color: '#326fd1' },\n warn: { icon: 'pi-exclamation-triangle', bgVar: '--yellow-50', colorVar: '--yellow-800', bg: '#fffce7', color: '#695d05' },\n error: { icon: 'pi-exclamation-circle', bgVar: '--red-50', colorVar: '--red-600', bg: '#fff5f5', color: '#d60f00' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function InlineContainedAlert({ severity, message, closable = true, onClose }: InlineContainedAlertProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--a-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--a-color': `var(${cfg.colorVar}, ${cfg.color})`,\n } as React.CSSProperties;\n\n return (\n <div role=\"alert\" className={styles.alert} style={cssVars}>\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n <span className={styles.message}>{message}</span>\n {closable && (\n <CloseButton aria-label=\"Dismiss\" onClick={onClose} />\n )}\n </div>\n );\n}\n\nInlineContainedAlert.displayName = 'InlineContainedAlert';\n","import styles from './InlineAlert.module.css';\nimport type { AlertSeverity } from './InlineContainedAlert';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface InlineAlertProps {\n severity: AlertSeverity;\n message: string;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<\n AlertSeverity,\n { icon: string; colorVar: string; color: string }\n> = {\n success: { icon: 'pi-check', colorVar: '--green-700', color: '#1a760b' },\n info: { icon: 'pi-info-circle', colorVar: '--blue-600', color: '#326fd1' },\n warn: { icon: 'pi-exclamation-triangle', colorVar: '--yellow-800', color: '#695d05' },\n error: { icon: 'pi-exclamation-circle', colorVar: '--red-600', color: '#d60f00' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function InlineAlert({ severity, message }: InlineAlertProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--a-color': `var(${cfg.colorVar}, ${cfg.color})`,\n } as React.CSSProperties;\n\n return (\n <div role=\"status\" className={styles.alert} style={cssVars}>\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n <span className={styles.message}>{message}</span>\n </div>\n );\n}\n\nInlineAlert.displayName = 'InlineAlert';\n","import { useRef, useState, useEffect, useId, useCallback } from 'react';\nimport { Select } from '../Select';\nimport { Button } from '../Button';\nimport styles from './FileUpload.module.css';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nexport const DEFAULT_DOC_TYPES = [\n 'Miscellaneous',\n 'Agreements',\n 'Bank Statement',\n 'Hazard Insurance Binder',\n 'Pay Stub',\n 'Personal Identification',\n 'Purchase Agreement',\n 'Tax Return Transcript',\n];\n\nconst DEFAULT_ACCEPT =\n '.html,.heic,.jpeg,.jpg,.png,.gif,.bmp,.tiff,.tif,.pdf,.doc,.docx,.xls,.xlsx';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface StagedFile {\n id: string;\n file: File;\n docType: string;\n}\n\nexport interface FileUploadResult {\n file: File;\n docType: string;\n}\n\nexport interface FileUploadProps {\n /**\n * Called as soon as files are dropped or selected (before classification).\n * Use this to trigger the actual upload to your server.\n */\n onFilesAdded?: (files: File[]) => void;\n /**\n * Called when the Upload button is clicked with all classified files.\n * The component resets its internal list after calling this.\n */\n onUpload: (files: FileUploadResult[]) => void;\n /**\n * Document type options shown in the per-file dropdown.\n * @default DEFAULT_DOC_TYPES (standard mortgage document types)\n */\n docTypes?: string[];\n /**\n * Accepted file extensions passed to the native file input.\n * Files dropped via drag-and-drop are validated against this list too.\n * @default '.html,.heic,.jpeg,.jpg,.png,.gif,.bmp,.tiff,.tif,.pdf,.doc,.docx,.xls,.xlsx'\n */\n accept?: string;\n /**\n * Pre-populate the staged file list — useful for Storybook / testing.\n * These files are added to the queue on mount without triggering `onFilesAdded`.\n */\n initialFiles?: File[];\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction isValidFile(file: File, accept: string): boolean {\n const extensions = accept\n .split(',')\n .map((e) => e.trim().toLowerCase());\n return extensions.some((ext) => file.name.toLowerCase().endsWith(ext));\n}\n\n// ─── FileUpload ───────────────────────────────────────────────────────────────\n\n/**\n * FileUpload — Clear Design System\n *\n * A two-step document upload widget for the mortgage workflow:\n *\n * 1. User drops or browses for files → `onFilesAdded` fires (consumer uploads\n * to server); each file appears in the classification list below.\n * 2. User selects a document type for each file (searchable dropdown).\n * 3. When all files are classified, the Upload button activates. Clicking it\n * calls `onUpload` with the full list and resets the component.\n *\n * Invalid file types show an error message below the drop zone.\n *\n * @example\n * <FileUpload\n * onFilesAdded={files => myApi.upload(files)}\n * onUpload={results => myApi.classify(results)}\n * />\n */\nexport function FileUpload({\n onFilesAdded,\n onUpload,\n docTypes = DEFAULT_DOC_TYPES,\n accept = DEFAULT_ACCEPT,\n initialFiles,\n className,\n style,\n}: FileUploadProps) {\n const [items, setItems] = useState<StagedFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n\n // Pre-populate from initialFiles prop (mount only)\n useEffect(() => {\n if (initialFiles && initialFiles.length > 0) {\n setItems(\n initialFiles.map((file) => ({\n id: crypto.randomUUID(),\n file,\n docType: '',\n })),\n );\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const canUpload = items.length > 0 && items.every((i) => i.docType !== '');\n\n const docTypeOptions = docTypes.map((t) => ({ label: t, value: t }));\n\n // ── File processing ────────────────────────────────────────────────────────\n\n const processFiles = useCallback(\n (files: File[]) => {\n setError(null);\n const valid: File[] = [];\n const invalid: File[] = [];\n\n files.forEach((f) => {\n if (isValidFile(f, accept)) {\n valid.push(f);\n } else {\n invalid.push(f);\n }\n });\n\n if (invalid.length > 0) {\n setError('File format not supported. Please try again.');\n }\n\n if (valid.length > 0) {\n const newItems: StagedFile[] = valid.map((file) => ({\n id: crypto.randomUUID(),\n file,\n docType: '',\n }));\n setItems((prev) => [...prev, ...newItems]);\n onFilesAdded?.(valid);\n }\n },\n [accept, onFilesAdded],\n );\n\n // ── Handlers ───────────────────────────────────────────────────────────────\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n // Only clear drag state when leaving the drop zone itself, not its children\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragOver(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n processFiles(Array.from(e.dataTransfer.files));\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n processFiles(Array.from(e.target.files));\n // Reset so the same file can be re-selected\n e.target.value = '';\n }\n };\n\n const handleZoneClick = () => {\n inputRef.current?.click();\n };\n\n const updateDocType = (id: string, docType: string | null) => {\n setItems((prev) =>\n prev.map((item) => (item.id === id ? { ...item, docType: docType ?? '' } : item)),\n );\n };\n\n const removeItem = (id: string) => {\n setItems((prev) => prev.filter((item) => item.id !== id));\n };\n\n const handleUpload = () => {\n if (!canUpload) return;\n onUpload(items.map(({ file, docType }) => ({ file, docType })));\n setItems([]);\n setError(null);\n };\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n return (\n <div\n className={[styles.container, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Drop zone ── */}\n <div\n className={[styles.dropzone, isDragOver ? styles.dragOver : '']\n .filter(Boolean)\n .join(' ')}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleZoneClick}\n role=\"button\"\n tabIndex={0}\n aria-label=\"File upload area. Click or drop files here.\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleZoneClick();\n }}\n >\n <span className={styles.dropText}>\n Drop file(s) here or{' '}\n <span className={styles.browseLink}>browse</span>\n </span>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n multiple\n accept={accept}\n className={styles.hiddenInput}\n onChange={handleInputChange}\n tabIndex={-1}\n />\n </div>\n\n {/* ── Error message ── */}\n {error && (\n <div className={styles.errorMessage} role=\"alert\">\n <i className=\"pi pi-exclamation-triangle\" aria-hidden=\"true\" />\n {error}\n </div>\n )}\n\n {/* ── Classification list ── */}\n {items.length > 0 && (\n <div className={styles.fileList}>\n <div className={styles.tableHeader}>\n <span className={styles.colName}>Document Name</span>\n <span className={styles.colType}>Document Type</span>\n </div>\n\n {items.map((item) => (\n <div key={item.id} className={styles.fileRow}>\n <span className={styles.fileName} title={item.file.name}>\n {item.file.name}\n </span>\n\n <div className={styles.docTypeWrap}>\n <Select\n options={docTypeOptions}\n value={item.docType || null}\n onChange={(v) => updateDocType(item.id, v)}\n placeholder=\"Select Doc Type\"\n filter\n size=\"sm\"\n style={{ width: '100%' }}\n />\n </div>\n\n <button\n type=\"button\"\n className={styles.removeBtn}\n onClick={() => removeItem(item.id)}\n aria-label={`Remove ${item.file.name}`}\n >\n <i className=\"pi pi-times-circle\" aria-hidden=\"true\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* ── Footer: Upload button ── */}\n <div className={styles.footer}>\n <Button\n variant=\"primary\"\n size=\"md\"\n onClick={handleUpload}\n disabled={!canUpload}\n >\n Upload\n </Button>\n </div>\n </div>\n );\n}\n\nFileUpload.displayName = 'FileUpload';\n","import { useRef, useState, useId } from 'react';\nimport styles from './Tooltip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n /** Content displayed inside the tooltip bubble */\n content: React.ReactNode;\n /** The element the tooltip is anchored to */\n children: React.ReactNode;\n /**\n * Which side the tooltip appears on relative to the trigger.\n * @default 'top'\n */\n placement?: TooltipPlacement;\n /**\n * Delay in ms before the tooltip appears on hover.\n * @default 200\n */\n delay?: number;\n /** When true, the tooltip will not appear */\n disabled?: boolean;\n /**\n * Maximum width of the tooltip bubble in px. Content wraps when exceeded.\n * @default 140\n */\n maxWidth?: number;\n className?: string;\n}\n\n// ─── Tooltip ──────────────────────────────────────────────────────────────────\n\n/**\n * Tooltip — Clear Design System\n *\n * A small informational bubble anchored to a trigger element. Appears on\n * hover and keyboard focus; hides on mouse leave and blur.\n *\n * Wraps its child in an inline container — the child itself is not modified.\n * Uses `aria-describedby` to associate the tooltip text with the trigger for\n * screen readers.\n *\n * @example\n * <Tooltip content=\"Delete this record\" placement=\"top\">\n * <IconButton icon={<i className=\"pi pi-trash\" />} aria-label=\"Delete\" />\n * </Tooltip>\n */\nexport function Tooltip({\n content,\n children,\n placement = 'top',\n delay = 200,\n disabled = false,\n maxWidth = 140,\n className,\n}: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const tooltipId = useId();\n\n const show = () => {\n if (disabled) return;\n timerRef.current = setTimeout(() => setVisible(true), delay);\n };\n\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n };\n\n const tooltipClass = [\n styles.tooltip,\n styles[`placement_${placement}`],\n visible ? styles.visible : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n className={styles.wrapper}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {/* Trigger — aria-describedby links it to the tooltip for screen readers */}\n <span aria-describedby={visible ? tooltipId : undefined}>\n {children}\n </span>\n\n <div\n id={tooltipId}\n role=\"tooltip\"\n className={tooltipClass}\n style={{ maxWidth }}\n aria-hidden={!visible}\n >\n {content}\n </div>\n </span>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n","import { forwardRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseButton } from '../CloseButton';\nimport styles from './Modal.module.css';\n\nexport interface ModalProps {\n /** Controls visibility */\n isOpen: boolean;\n /** Called when ✕ is clicked, scrim is clicked, or Escape is pressed */\n onClose: () => void;\n /** Modal title — renders in the header */\n title?: string;\n /** Modal body content — any ReactNode */\n children: React.ReactNode;\n /** Footer slot — typically right-aligned action buttons */\n footer?: React.ReactNode;\n /**\n * Render a dark scrim behind the modal.\n * @default true\n */\n scrim?: boolean;\n /**\n * Modal width in px.\n * @default 510\n */\n width?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Modal — Clear Design System\n *\n * A centered overlay dialog. Always rendered via a portal into `document.body`.\n * Supports a dark scrim (default) or no scrim for inline-style alerts.\n * Closes on ✕ click, scrim click, or Escape key.\n *\n * Fully controlled — pass `isOpen` + `onClose`.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * <Modal\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"Unsaved Changes\"\n * footer={\n * <>\n * <Button variant=\"secondary\" size=\"sm\" onClick={() => setOpen(false)}>No</Button>\n * <Button variant=\"primary\" size=\"sm\" onClick={() => setOpen(false)}>Yes</Button>\n * </>\n * }\n * >\n * <p>Are you sure you want to leave without saving?</p>\n * </Modal>\n */\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n isOpen,\n onClose,\n title,\n children,\n footer,\n scrim = true,\n width = 510,\n className,\n style,\n },\n ref,\n ) => {\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return createPortal(\n <div\n className={styles.overlay}\n data-scrim={scrim}\n onClick={scrim ? onClose : undefined}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Modal'}\n className={[styles.modal, className ?? ''].filter(Boolean).join(' ')}\n style={{ width, ...style }}\n onClick={e => e.stopPropagation()}\n >\n {/* Header — always rendered (close button is always present) */}\n <div className={styles.header}>\n <div className={styles.headerTitle}>\n {title && <span className={styles.title}>{title}</span>}\n </div>\n <CloseButton aria-label=\"Close\" onClick={onClose} />\n </div>\n\n <div className={styles.body}>{children}</div>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </div>,\n document.body,\n );\n },\n);\n\nModal.displayName = 'Modal';\n","import { forwardRef, useRef, useState, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseButton } from '../CloseButton';\nimport styles from './Popup.module.css';\n\nconst ARROW_H = 10; // px — height of the arrow triangle\n\nexport interface PopupProps {\n /** Controls popup visibility */\n isOpen: boolean;\n /** Called when ✕ is clicked or the scrim is clicked */\n onClose: () => void;\n /**\n * The element the popup is anchored to.\n * The popup measures this element's position to place itself.\n */\n trigger: React.ReactNode;\n /** Optional header title */\n title?: string;\n /** Popup body content — any ReactNode */\n children: React.ReactNode;\n /** Footer slot — typically action buttons, right-aligned with a separator border */\n footer?: React.ReactNode;\n /**\n * Which side of the trigger the popup opens on.\n * @default 'bottom'\n */\n placement?: 'top' | 'bottom';\n /**\n * Horizontal alignment relative to the trigger.\n * - 'right': popup extends to the right; its left edge anchors near the trigger's left edge.\n * - 'left': popup extends to the left; its right edge anchors near the trigger's right edge.\n * The arrow always points at the exact trigger center.\n * @default 'right'\n */\n align?: 'left' | 'right';\n /**\n * Popup width in px.\n * @default 360\n */\n width?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Popup — Clear Design System\n *\n * A positioned overlay anchored to a trigger element. Opens above or below the\n * trigger with a small triangle arrow pointing at it. Renders a scrim behind it\n * to keep focus on the popup.\n *\n * Fully controlled — pass `isOpen` + `onClose`. The popup measures the trigger's\n * screen position to place itself; the trigger is responsible for toggling state.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * <Popup\n * trigger={<Button onClick={() => setOpen(true)}>Details</Button>}\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"Loan Details\"\n * footer={<Button size=\"sm\" onClick={() => setOpen(false)}>Close</Button>}\n * >\n * <p>…content…</p>\n * </Popup>\n */\nexport const Popup = forwardRef<HTMLDivElement, PopupProps>(\n (\n {\n isOpen,\n onClose,\n trigger,\n title,\n children,\n footer,\n placement = 'bottom',\n align = 'right',\n width = 360,\n className,\n style,\n },\n ref,\n ) => {\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [pos, setPos] = useState<{\n top?: number;\n bottom?: number;\n left: number;\n arrowLeft: number;\n } | null>(null);\n\n const calculatePos = useCallback(() => {\n if (!triggerRef.current) return null;\n const r = triggerRef.current.getBoundingClientRect();\n const centerX = r.left + r.width / 2;\n // Anchor left edge (align='right') or right edge (align='left') to the trigger,\n // then clamp so the popup stays within the viewport.\n let left = align === 'right' ? r.left : r.right - width;\n left = Math.max(8, Math.min(left, window.innerWidth - width - 8));\n // Arrow always points at exact trigger center, regardless of clamping.\n const arrowLeft = centerX - left;\n return placement === 'bottom'\n ? { top: r.bottom + ARROW_H, left, arrowLeft }\n : { bottom: window.innerHeight - r.top + ARROW_H, left, arrowLeft };\n }, [placement, align, width]);\n\n useLayoutEffect(() => {\n if (!isOpen) { setPos(null); return; }\n setPos(calculatePos());\n }, [isOpen, calculatePos]);\n\n return (\n <>\n <span ref={triggerRef} className={styles.triggerWrap}>\n {trigger}\n </span>\n\n {isOpen && pos &&\n createPortal(\n <>\n {/* Scrim */}\n <div\n className={styles.scrim}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Popup panel */}\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Popup'}\n className={[styles.popup, className ?? ''].filter(Boolean).join(' ')}\n data-placement={placement}\n style={{\n width,\n top: pos.top,\n bottom: pos.bottom,\n left: pos.left,\n '--popup-arrow-left': `${pos.arrowLeft}px`,\n ...style,\n } as React.CSSProperties}\n >\n {title && (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n <CloseButton aria-label=\"Close popup\" onClick={onClose} />\n </div>\n )}\n\n <div className={styles.body}>{children}</div>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </>,\n document.body,\n )}\n </>\n );\n },\n);\n\nPopup.displayName = 'Popup';\n","import { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport { CloseButton } from '../CloseButton';\nimport styles from './SidePanel.module.css';\n\nexport interface SidePanelProps {\n /** Controls open/closed state */\n isOpen: boolean;\n /** Called when the ✕ button is pressed */\n onClose: () => void;\n /** Primary heading (e.g. borrower name). When omitted, the title row is hidden. */\n title?: string;\n /** Subtitle row below the title (e.g. phone + loan# link as ReactNode) */\n subtitle?: React.ReactNode;\n /**\n * When provided, renders a Save button in the header (teal, sm).\n * Called on Save click.\n */\n onSave?: () => void;\n /**\n * Slot below the title row — intended for the future BoltDropdown\n * section navigator. Accepts any ReactNode.\n */\n headerContent?: React.ReactNode;\n /** Panel width in px. @default 470 */\n width?: number;\n /** Panel body content (scrollable). */\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SidePanel — Clear Design System\n *\n * A fixed-position drawer that slides in from the right edge. It **pushes**\n * main content (no overlay). Use with `SidePanelLayout` to shift the page\n * content left when the panel opens.\n *\n * @example\n * <SidePanelLayout open={open} panelWidth={470}>\n * <main>…page content…</main>\n * </SidePanelLayout>\n * <SidePanel isOpen={open} onClose={() => setOpen(false)} title=\"Ryan Smith\">\n * …panel body…\n * </SidePanel>\n */\nexport const SidePanel = forwardRef<HTMLDivElement, SidePanelProps>(\n (\n {\n isOpen,\n onClose,\n title,\n subtitle,\n onSave,\n headerContent,\n width = 470,\n children,\n className,\n style,\n },\n ref,\n ) => {\n const isCompact = width < 400;\n\n const panelClass = [\n styles.panel,\n isOpen ? styles.open : '',\n isCompact ? styles.compact : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const actions = (\n <div className={styles.actions}>\n {onSave && (\n <Button variant=\"primary\" size=\"sm\" onClick={onSave}>\n Save\n </Button>\n )}\n <CloseButton aria-label=\"Close panel\" onClick={onClose} />\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={title ?? 'Side panel'}\n className={panelClass}\n style={{ width, ...style }}\n >\n <div className={styles.header}>\n {title ? (\n <div className={styles.titleBar}>\n <div className={styles.titleGroup}>\n <span className={styles.title}>{title}</span>\n {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n {actions}\n </div>\n ) : (\n <div className={styles.titleBarNoTitle}>{actions}</div>\n )}\n\n {headerContent && (\n <div className={styles.headerContent}>{headerContent}</div>\n )}\n </div>\n\n <div className={styles.body}>{children}</div>\n </div>\n );\n },\n);\n\nSidePanel.displayName = 'SidePanel';\n","import { forwardRef } from 'react';\nimport styles from './SidePanelLayout.module.css';\n\nexport interface SidePanelLayoutProps {\n /** Should match SidePanel's `isOpen` */\n open: boolean;\n /** Should match SidePanel's `width`. @default 470 */\n panelWidth?: number;\n /** The main page content that gets pushed left */\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SidePanelLayout — Clear Design System\n *\n * A thin layout wrapper that pushes the main content left when a `SidePanel`\n * is open. Place this around the page's main content area, then render a\n * `SidePanel` alongside it (outside this wrapper).\n *\n * @example\n * <SidePanelLayout open={panelOpen} panelWidth={470}>\n * <main>…page content…</main>\n * </SidePanelLayout>\n * <SidePanel isOpen={panelOpen} onClose={close} title=\"Details\">…</SidePanel>\n */\nexport const SidePanelLayout = forwardRef<HTMLDivElement, SidePanelLayoutProps>(\n ({ open, panelWidth = 470, children, className, style }, ref) => {\n const cls = [styles.layout, className ?? ''].filter(Boolean).join(' ');\n\n return (\n <div\n ref={ref}\n className={cls}\n style={{\n paddingRight: open ? panelWidth : 0,\n ...style,\n }}\n >\n {children}\n </div>\n );\n },\n);\n\nSidePanelLayout.displayName = 'SidePanelLayout';\n","/**\n * URLATabsNav — shared internal types, icons, and sub-components.\n * Imported by URLATabsNav (desktop), URLATabsNavTablet, and URLATabsNavMobile.\n */\nimport { useState, useRef, useEffect } from 'react';\nimport styles from './URLATabsNav.module.css';\n\n// ─── Shared types ─────────────────────────────────────────────────────────────\n\n/**\n * An option in the applicant selector.\n * A single option may represent one borrower or a combined group (e.g. spouses).\n */\nexport interface URLATabsNavApplicantOption {\n id: string;\n label: string;\n}\n\n/** A single tab item. */\nexport interface URLATabsNavTab {\n id: string;\n label: string;\n disabled?: boolean;\n}\n\n/** An item in a dropdown menu (sort, section, actions, etc.). */\nexport interface URLATabsNavMenuItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nexport const ArrowRight = () => <i className=\"pi pi-arrow-right\" aria-hidden=\"true\" />;\nexport const ReplayIcon = () => <i className=\"pi pi-replay\" aria-hidden=\"true\" />;\nexport const UserIcon = () => <i className=\"pi pi-user\" aria-hidden=\"true\" />;\nexport const PlusCircle = () => <i className=\"pi pi-plus-circle\" aria-hidden=\"true\" />;\nexport const SortIcon = () => <i className=\"pi pi-user-plus\" aria-hidden=\"true\" />;\n\nexport const ChevronDown = () => (\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1 1l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ─── ApplicantSelector ────────────────────────────────────────────────────────\n// Custom rectangular dropdown: person icon + label + chevron.\n// Default: 245×35px, r:6. Pass height=44 for touch-friendly mobile variant.\n\nexport function ApplicantSelector({\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n height = 35,\n}: {\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n height?: number;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const selected = applicants.find((a) => a.id === selectedApplicantId);\n\n return (\n <div ref={wrapRef} className={styles.applicantWrap}>\n <button\n type=\"button\"\n className={styles.applicantTrigger}\n style={height !== 35 ? { height } : undefined}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className={styles.applicantIcon}><UserIcon /></span>\n <span className={styles.applicantLabel}>{selected?.label ?? ''}</span>\n <span className={styles.applicantChevron}><ChevronDown /></span>\n </button>\n\n {open && (\n <div role=\"listbox\" className={styles.applicantMenu}>\n {applicants.map((a) => (\n <div\n key={a.id}\n role=\"option\"\n aria-selected={a.id === selectedApplicantId}\n className={[\n styles.applicantOption,\n a.id === selectedApplicantId ? styles.applicantOptionSelected : '',\n ]\n .filter(Boolean)\n .join(' ')}\n tabIndex={0}\n onClick={() => { onApplicantChange(a.id); setOpen(false); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onApplicantChange(a.id);\n setOpen(false);\n }\n }}\n >\n {a.label}\n </div>\n ))}\n {onAddApplicant && (\n <>\n <div className={styles.applicantDivider} />\n <button\n type=\"button\"\n className={styles.applicantAddBtn}\n onClick={() => { onAddApplicant(); setOpen(false); }}\n >\n <PlusCircle />\n New Applicant\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── SortButton ───────────────────────────────────────────────────────────────\n// Default: 47×35px, r:6, surface-300 bg. Pass height=44, width=62 for mobile.\n\nexport function SortButton({\n sortItems,\n onSortSelect,\n height = 35,\n width = 47,\n}: {\n sortItems: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n height?: number;\n width?: number;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const sizeStyle = (height !== 35 || width !== 47) ? { height, width } : undefined;\n\n return (\n <div ref={wrapRef} className={styles.sortWrap}>\n <button\n type=\"button\"\n className={styles.sortBtn}\n style={sizeStyle}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Sort applicants\"\n >\n <span className={styles.sortBtnIcon}><SortIcon /></span>\n <span className={styles.sortBtnChevron}><ChevronDown /></span>\n </button>\n\n {open && (\n <div role=\"menu\" className={styles.sortMenu}>\n {sortItems.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n className={styles.sortMenuItem}\n onClick={() => { onSortSelect?.(item.value); setOpen(false); }}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport {\n ArrowRight,\n ReplayIcon,\n ApplicantSelector,\n SortButton,\n type URLATabsNavApplicantOption,\n type URLATabsNavTab,\n type URLATabsNavMenuItem,\n} from './_internal';\nimport styles from './URLATabsNav.module.css';\n\n// ─── Re-export shared types so consumers can import from this file ─────────────\nexport type { URLATabsNavApplicantOption, URLATabsNavTab, URLATabsNavMenuItem };\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface URLATabsNavProps {\n // ── Applicant selector ────────────────────────────────────────────────────\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n\n // ── Sort dropdown ─────────────────────────────────────────────────────────\n sortItems?: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n\n // ── Tabs ──────────────────────────────────────────────────────────────────\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n\n // ── Optional AUS action buttons ───────────────────────────────────────────\n onNextValidation?: () => void;\n nextValidationBadge?: number;\n onBackToAUS?: () => void;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── URLATabsNav ──────────────────────────────────────────────────────────────\n\n/**\n * URLATabsNav — Clear Design System\n *\n * Single-row sub-navigation bar for the URLA section of the loan origination app.\n *\n * - **Left section**: applicant selector (245px) + optional sort button (47px)\n * - **Divider**: 1px vertical rule (35px tall)\n * - **Right section**: optional AUS action buttons + scrollable tab strip\n *\n * @example\n * <URLATabsNav\n * applicants={[{ id: 'joint', label: 'Ryan Smith | Laura Smith' }]}\n * selectedApplicantId=\"joint\"\n * onApplicantChange={setApplicant}\n * tabs={tabs}\n * activeTabId={activeTab}\n * onTabChange={setActiveTab}\n * />\n */\nexport const URLATabsNav = forwardRef<HTMLDivElement, URLATabsNavProps>(\n function URLATabsNav(props, ref) {\n const {\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n sortItems,\n onSortSelect,\n tabs,\n activeTabId,\n onTabChange,\n onNextValidation,\n nextValidationBadge,\n onBackToAUS,\n className,\n style,\n } = props;\n\n return (\n <div\n ref={ref}\n className={[styles.nav, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Left: applicant selector + sort ──────────────────────── */}\n <div className={styles.leftSection}>\n <ApplicantSelector\n applicants={applicants}\n selectedApplicantId={selectedApplicantId}\n onApplicantChange={onApplicantChange}\n onAddApplicant={onAddApplicant}\n />\n {sortItems && sortItems.length > 0 && (\n <SortButton sortItems={sortItems} onSortSelect={onSortSelect} />\n )}\n </div>\n\n {/* ── Divider ──────────────────────────────────────────────── */}\n <div className={styles.divider} aria-hidden=\"true\" />\n\n {/* ── Right: AUS buttons + tabs + trailing spacer ───────────── */}\n <div className={styles.tabsSection} role=\"tablist\">\n {(onNextValidation || onBackToAUS) && (\n <div className={styles.ausButtons}>\n {onNextValidation && (\n <Button\n variant=\"danger\"\n size=\"sm\"\n leadingIcon={<ArrowRight />}\n badge={nextValidationBadge}\n onClick={onNextValidation}\n >\n Next Validation\n </Button>\n )}\n {onBackToAUS && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leadingIcon={<ReplayIcon />}\n onClick={onBackToAUS}\n >\n Back to AUS\n </Button>\n )}\n </div>\n )}\n\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n className={[\n styles.tab,\n tab.id === activeTabId ? styles.tabActive : '',\n tab.disabled ? styles.tabDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-selected={tab.id === activeTabId}\n aria-disabled={tab.disabled}\n disabled={tab.disabled}\n onClick={() => { if (!tab.disabled) onTabChange(tab.id); }}\n >\n {tab.label}\n </button>\n ))}\n\n <div className={styles.spacer} aria-hidden=\"true\" />\n </div>\n </div>\n );\n },\n);\n\nURLATabsNav.displayName = 'URLATabsNav';\n","import { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport {\n ArrowRight,\n ReplayIcon,\n ApplicantSelector,\n SortButton,\n type URLATabsNavApplicantOption,\n type URLATabsNavTab,\n type URLATabsNavMenuItem,\n} from './_internal';\nimport styles from './URLATabsNavTablet.module.css';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface URLATabsNavTabletProps {\n // Row 1 — borrower info\n borrowerName: string;\n onLoanDetailsClick?: () => void;\n\n // Row 1 — applicant selector + sort\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n sortItems?: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n\n // Row 1 — AUS action buttons (optional)\n onNextValidation?: () => void;\n nextValidationBadge?: number;\n onBackToAUS?: () => void;\n\n // Row 2 — tab strip\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n\n // Row 2 — optional red count badge at far right of tab strip\n tabStripBadge?: number;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── URLATabsNavTablet ────────────────────────────────────────────────────────\n\n/**\n * URLATabsNavTablet — two-row variant of URLATabsNav for tablet viewports (~992px).\n *\n * Row 1: borrower name + \"Loan Details ⓘ\" | divider | applicant selector + sort | divider | AUS buttons\n * Row 2: scrollable tab strip + optional red count badge\n */\nexport const URLATabsNavTablet = forwardRef<HTMLDivElement, URLATabsNavTabletProps>(\n function URLATabsNavTablet(props, ref) {\n const {\n borrowerName,\n onLoanDetailsClick,\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n sortItems,\n onSortSelect,\n onNextValidation,\n nextValidationBadge,\n onBackToAUS,\n tabs,\n activeTabId,\n onTabChange,\n tabStripBadge,\n className,\n style,\n } = props;\n\n return (\n <div\n ref={ref}\n className={[styles.nav, className].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Row 1 ──────────────────────────────────────────────────── */}\n <div className={styles.row1}>\n {/* Borrower name + Loan Details link */}\n <div className={styles.borrowerBlock}>\n <span className={styles.borrowerName}>{borrowerName}</span>\n <button\n type=\"button\"\n className={styles.loanDetailsBtn}\n onClick={onLoanDetailsClick}\n >\n Loan Details\n <i className=\"pi pi-info-circle\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Divider */}\n <div className={styles.divider} aria-hidden=\"true\" />\n\n {/* Applicant selector + sort */}\n <ApplicantSelector\n applicants={applicants}\n selectedApplicantId={selectedApplicantId}\n onApplicantChange={onApplicantChange}\n onAddApplicant={onAddApplicant}\n height={35}\n />\n {sortItems && sortItems.length > 0 && (\n <SortButton sortItems={sortItems} onSortSelect={onSortSelect} height={35} />\n )}\n\n {/* Divider */}\n <div className={styles.divider} aria-hidden=\"true\" />\n\n {/* AUS action buttons */}\n {(onNextValidation || onBackToAUS) && (\n <div className={styles.ausButtons}>\n {onNextValidation && (\n <Button\n variant=\"danger\"\n size=\"sm\"\n leadingIcon={<ArrowRight />}\n badge={nextValidationBadge}\n onClick={onNextValidation}\n >\n Next Validation\n </Button>\n )}\n {onBackToAUS && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leadingIcon={<ReplayIcon />}\n onClick={onBackToAUS}\n >\n Back to AUS\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* ── Row 2 — tab strip ──────────────────────────────────────── */}\n <div className={styles.tabsSection} role=\"tablist\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n className={[\n styles.tab,\n tab.id === activeTabId ? styles.tabActive : '',\n tab.disabled ? styles.tabDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-selected={tab.id === activeTabId}\n aria-disabled={tab.disabled}\n disabled={tab.disabled}\n onClick={() => { if (!tab.disabled) onTabChange(tab.id); }}\n >\n {tab.label}\n </button>\n ))}\n\n <div className={styles.spacer} aria-hidden=\"true\" />\n\n {tabStripBadge != null && tabStripBadge > 0 && (\n <span className={styles.stripBadge} aria-label={`${tabStripBadge} items`}>\n {tabStripBadge}\n </span>\n )}\n </div>\n </div>\n );\n },\n);\n\nURLATabsNavTablet.displayName = 'URLATabsNavTablet';\n","import { forwardRef, useState, useRef, useEffect } from 'react';\nimport { Button } from '../Button';\nimport {\n ArrowRight,\n ReplayIcon,\n ApplicantSelector,\n SortButton,\n ChevronDown,\n type URLATabsNavApplicantOption,\n type URLATabsNavTab,\n type URLATabsNavMenuItem,\n} from './_internal';\nimport styles from './URLATabsNavMobile.module.css';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface URLATabsNavMobileProps {\n // Row 1 — borrower info\n borrowerName: string;\n onLoanDetailsClick?: () => void;\n\n // Row 1 — section switcher dropdown (e.g. \"URLA\", \"Loan Summary\")\n sectionLabel: string;\n sectionItems?: URLATabsNavMenuItem[];\n onSectionSelect?: (value: string) => void;\n\n // Row 1 — section sort (chevron-only pill)\n onSectionSort?: () => void;\n\n // Row 1 — actions dropdown\n actionItems?: URLATabsNavMenuItem[];\n onActionSelect?: (value: string) => void;\n\n // Row 1 — save icon button\n onSave?: () => void;\n\n // Row 2 — applicant selector + sort (44px touch targets)\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n sortItems?: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n\n // Row 2 — AUS buttons (optional)\n onNextValidation?: () => void;\n nextValidationBadge?: number;\n onBackToAUS?: () => void;\n\n // Row 2 — tab dropdown (shows active tab, switches on select)\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Internal: SectionDropdown ────────────────────────────────────────────────\n// w:168, h:44, r:6, border #cbced1 — shows sectionLabel + chevron.\n\nfunction SectionDropdown({\n label,\n items,\n onSelect,\n}: {\n label: string;\n items?: URLATabsNavMenuItem[];\n onSelect?: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.sectionWrap}>\n <button\n type=\"button\"\n className={styles.sectionTrigger}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className={styles.sectionLabel}>{label}</span>\n <span className={styles.sectionChevron}><ChevronDown /></span>\n </button>\n\n {open && items && items.length > 0 && (\n <div role=\"listbox\" className={styles.dropdownMenu}>\n {items.map((item) => (\n <div\n key={item.value}\n role=\"option\"\n aria-selected={item.label === label}\n className={[\n styles.dropdownOption,\n item.label === label ? styles.dropdownOptionSelected : '',\n ]\n .filter(Boolean)\n .join(' ')}\n tabIndex={0}\n onClick={() => { onSelect?.(item.value); setOpen(false); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect?.(item.value);\n setOpen(false);\n }\n }}\n >\n {item.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Internal: ActionsButton ──────────────────────────────────────────────────\n// h:44, r:20, teal-50 bg, \"Actions\" text + chevron — opens a dropdown menu.\n\nfunction ActionsButton({\n items,\n onSelect,\n}: {\n items: URLATabsNavMenuItem[];\n onSelect?: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.actionsWrap}>\n <button\n type=\"button\"\n className={styles.actionsBtn}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n >\n Actions\n <ChevronDown />\n </button>\n\n {open && (\n <div role=\"menu\" className={styles.dropdownMenu}>\n {items.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n className={styles.dropdownOption}\n onClick={() => { onSelect?.(item.value); setOpen(false); }}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Internal: TabDropdown ────────────────────────────────────────────────────\n// h:44, r:6, w:fill — shows active tab name; opens a listbox of all tabs.\n\nfunction TabDropdown({\n tabs,\n activeTabId,\n onTabChange,\n}: {\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const activeTab = tabs.find((t) => t.id === activeTabId);\n\n return (\n <div ref={wrapRef} className={styles.tabDropdownWrap}>\n <button\n type=\"button\"\n className={styles.tabDropdownTrigger}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-label=\"Select tab\"\n >\n <span className={styles.tabDropdownLabel}>{activeTab?.label ?? ''}</span>\n <span className={styles.tabDropdownChevron}><ChevronDown /></span>\n </button>\n\n {open && (\n <div role=\"listbox\" className={styles.tabDropdownMenu}>\n {tabs.map((tab) => (\n <div\n key={tab.id}\n role=\"option\"\n aria-selected={tab.id === activeTabId}\n aria-disabled={tab.disabled}\n className={[\n styles.dropdownOption,\n tab.id === activeTabId ? styles.dropdownOptionSelected : '',\n tab.disabled ? styles.dropdownOptionDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n tabIndex={tab.disabled ? -1 : 0}\n onClick={() => {\n if (!tab.disabled) {\n onTabChange(tab.id);\n setOpen(false);\n }\n }}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !tab.disabled) {\n e.preventDefault();\n onTabChange(tab.id);\n setOpen(false);\n }\n }}\n >\n {tab.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── URLATabsNavMobile ────────────────────────────────────────────────────────\n\n/**\n * URLATabsNavMobile — two-row touch-optimised variant for mobile viewports (~768px).\n *\n * Row 1: borrower name + \"Loan Details ⓘ\" | section dropdown | sort pill | Actions | Save\n * Row 2: AUS pills | applicant selector (44px) | sort button (62×44) | tab dropdown (fill)\n */\nexport const URLATabsNavMobile = forwardRef<HTMLDivElement, URLATabsNavMobileProps>(\n function URLATabsNavMobile(props, ref) {\n const {\n borrowerName,\n onLoanDetailsClick,\n sectionLabel,\n sectionItems,\n onSectionSelect,\n onSectionSort,\n actionItems,\n onActionSelect,\n onSave,\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n sortItems,\n onSortSelect,\n onNextValidation,\n nextValidationBadge,\n onBackToAUS,\n tabs,\n activeTabId,\n onTabChange,\n className,\n style,\n } = props;\n\n return (\n <div\n ref={ref}\n className={[styles.container, className].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Row 1 ──────────────────────────────────────────────────── */}\n <div className={styles.row1}>\n {/* Left: borrower name + loan details */}\n <div className={styles.borrowerBlock}>\n <span className={styles.borrowerName}>{borrowerName}</span>\n <button\n type=\"button\"\n className={styles.loanDetailsBtn}\n onClick={onLoanDetailsClick}\n >\n Loan Details\n <i className=\"pi pi-info-circle\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Right: section controls */}\n <div className={styles.rightControls}>\n <SectionDropdown\n label={sectionLabel}\n items={sectionItems}\n onSelect={onSectionSelect}\n />\n\n {onSectionSort && (\n <button\n type=\"button\"\n className={styles.sortPill}\n onClick={onSectionSort}\n aria-label=\"Sort sections\"\n >\n <ChevronDown />\n </button>\n )}\n\n {actionItems && actionItems.length > 0 && (\n <ActionsButton items={actionItems} onSelect={onActionSelect} />\n )}\n\n {onSave && (\n <button\n type=\"button\"\n className={styles.saveBtn}\n onClick={onSave}\n aria-label=\"Save\"\n >\n <i className=\"pi pi-save\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n\n {/* ── Row 2 ──────────────────────────────────────────────────── */}\n <div className={styles.row2}>\n {/* AUS pills */}\n {(onNextValidation || onBackToAUS) && (\n <div className={styles.ausButtons}>\n {onNextValidation && (\n <Button\n variant=\"danger\"\n size=\"sm\"\n leadingIcon={<ArrowRight />}\n badge={nextValidationBadge}\n onClick={onNextValidation}\n >\n Next Validation\n </Button>\n )}\n {onBackToAUS && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leadingIcon={<ReplayIcon />}\n onClick={onBackToAUS}\n >\n Back to AUS\n </Button>\n )}\n </div>\n )}\n\n {/* Applicant selector (44px touch height) */}\n <ApplicantSelector\n applicants={applicants}\n selectedApplicantId={selectedApplicantId}\n onApplicantChange={onApplicantChange}\n onAddApplicant={onAddApplicant}\n height={44}\n />\n\n {/* Sort button (62×44 touch target) */}\n {sortItems && sortItems.length > 0 && (\n <SortButton\n sortItems={sortItems}\n onSortSelect={onSortSelect}\n height={44}\n width={62}\n />\n )}\n\n {/* Tab dropdown — fills remaining width */}\n <TabDropdown\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n />\n </div>\n </div>\n );\n },\n);\n\nURLATabsNavMobile.displayName = 'URLATabsNavMobile';\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAcCAYAAAD2izi6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAADIZJREFUeAHtWglwFFUafn1MT889k8yRTCZ3SEgIpxA3gJEzIKAU7KIuCmupoFW6sOyK7oIonmgpW4KWeC2lILfLoYRgQIlIjLDkgpBwBEIg12Qymfvoe19PJjAJJAFX2Sr0r+qZ6Xf8773v/XeCgN4Jgw8Hxo3DSan0LiI1fT5uThoFWEbH84JPcDvq2Obmb9nL53dTpaV1cCwanseDXxEhvbQh5jvuIIOzHy4ksgfn0TUnjzAnTu7mvLY6wGIIHqVKwuKSJ2GZWXdhKrWaczvcbEXFCue7b68FXcD/SgkXPzTPv7LUuPeQQzZ3fk5/E5T507P1az6qMvxri2D8dLtPPeW+NNB5CWjEMKLHNAm4TShSAkOSo/9wwwG6tXWv+8Vn14iN2nHjtLRcNRZPSB7J80CPSXAv29h8grt0piRYUdHQNVnz1KKJ0pyxBwXIkq4q+4Prn2/8G3SCGFLpIbkT2gQA1FKpDD9eXCACKIDbgJCIbyH6vfWbqMKvVnkLdlVrH3liNj4yZx2iUBoFrxsIwSCUTyigHMSDkABUoQSCIDjp4z++6P7g3bUhLvn5iqiZ91/EZAo9daJ8rvudt7aCMFDZOXlWaDuNhFRGV5YUScFtQl0AourHn5jKt7RdgsrWJp85t5Z3OaIEv49D9QZMQICba2mp4i7V1yNSmQS1JA7EDYYhsB8TaAqgplgmuHljtrzxfBM7b8EZiKwZT0pptt4/w9K10O0KYMjmgbQ0iRBkzqNxZi05bqqVqaul8Lh4wDk6ivx7ti4I7N3bdL3Jqj/Oz5VOmLKNt7bGS6fPOMMhKIfQNCZwwm4I3izQaesYcBtTp6E3GFDa3sHK8ib+GAIvMZmgC3akOlb+fRoErxX04q09WzYcbV/wUALnsC9C5EqA4DjGuhyL7H97UgRPvJzbGjyRxENioLQ0oN2yp449f5aSJKVgbReqcbBzpwiuCFxvIYkQflDnqyveVT+6oA4otYh77Vv7QOfFsODmCY3gC8LrCz36+4szkfDD99EPQN9OrD8eV/YhAsjpX3h1O3/pAiNJTJL6318dDQEVJ98oACIjxL3+48KIxW82mO4Ke7j41MwHlVr9UoIkM6AtJVAU5RiaavZ5nJvra/GXASgT+lgjZDL0ZnO6NtryhlypzUMQXhkajwJXwOs95rN1LGtqOlsVPvv1zhi6RKPRaIiypL4PbfZ4BMEUnV2CM+BxFbVdPvdnp9PpEvkiIDdXZnl6iZ9paeZ5u+N126qXVoBfgPpwIqHbtqRkpsYkplZRAb+MYxkebg29IioCDI5QlCdlCtTpcS48X/7Dx+DagD0EyODc8f/BcWIk5BMCGtJVHkDgCVKBshx9/GTpoVHgWhBDEp81fMyTMrVmXcDnuYYHJF6h0qL21sszLtRW7kN1CQmPCHarII0xoGHwMHBrCU0dOGK4KSH5rN/jxDmWFUi5AgU8X8Uw1G6Wpo9ISVkQSiLq93mCKlL+UcaI3LdAJ3hdGIeAGJ431cOz3HAIHiuVkQghldoYOrifoYL7JQTRKCHlKBX0sTzLDhuRN90DOsHDI/aCmBMyxpBK5Tq/101jGI5IpAoHQ9H7GJreL5XJ3AiKoT6Pg44yxe01m1PicfngrLkI5UPYJvfhMJNbmYaJlyXoYmKO+z1uGpdICCilBYjPNqumrKybA0rLGvGwWm/cGPR5aIVC84w5LXNLc11tJei0ZVDyJnxHB3ykABlIVWqu5XT9gNbW0xcjeZiTkzNi4geeDPo9SNDvlg/KyTt46tjhSRFDeIMleWcg4OVwiHjA73297sSh5ZE8MkfkbsAkxDyf182pTabPUImCTCWUUsBWVmwGt5649GGj1vu9HqiyAGdZ9GD1seIZZWVlPQ08WldTvqm9pWmyRCongn4vazTFfQ3C9ldjHJAiwfE8UcNkCiVeUVwog+BdBt2jB6S5vv58+eFCmVSmEC+Ol5KKiTExMYaucSaTyYjhwIgABMNQtKHuxDERvEiNxGrLS+djEtIFJ2AQ5BwUJhcqCQGn0Ewl+D+QQh31oPhNylVozfFvJoebexp3ESjh0rmTBzmGKoEGEUdRHPoKs15s18dqn6MCQR7DUdzabHsYhB0S6O5phTBfwd5mm49B/aSDfoHUGpd0jWMRTRLHMQBaC+DosH0RnhepkaHffpfjAIpiok0kcRxhoUSSAPM7aCCiPWcOADt28OAW5KohAAQk5FCgWtHZOXfDS0QUvY1HEAGaL04tGnWWZWBhSDYWNu8mJbIJAhBQXCIHjZ7Tu/vZu0A5m3bhRiOgAj5EodLkw7ZlYodESimEsG9HUaGjNwau9tY9Co0W8AJC4RKMZwielglywgj7OBPmutMKwDFwc9QVr/WM2/okn49VR7CA9o8f2t+cLo/IcyxQKJTx4m+oRjrouQEiCAywWv397EGwwjHmAbxoYyXQZhquMpcIV6NEpDdnira1XPociA8kHOOC7UiAVmtS4+9uAeBrg0Y7gBuTUdNeciYAbjwWRB/4a3J2bLxG+c6SyhLQe4zVjWC4QXWdFaqDF6rVaUQAJLgRQlASEZCwlHTKDd+5bn8ZkAgRJqIVfr9ZTesWf+J8u+17LEaXbBqe+NhpKMrVH27fdM+O5fsLS16bAm4s8g8Fr7MXpR5FMV4am37n2uemH10MbqCwarc32hKR7NAhpHI5W/l90SjwE4hnaVhWQ/VQLJHoxMQ0e0PD2T7WRmISEjIE4ecpnKOu2rq1ymg5IpOjxow5ecmwDW/9rmL573ctEet54ip4bxsJ9zFbLkw6F/RzUmsDXRyTJFu0tT7fnj/PFA26F1WvR3Qw4K+BIsALDKONGzh0Rh9zQvvQ6/Uqi8Ui02qTtCDsIR1226cYtOYUFeTjYgdsA53gXU8FQ97XaE7bSFOBnwVBtGHbt+WkAnMyVhudvnD0IdjGVLy3r9J1rmnz4oplYsrTpYrdQgL4CFMey1JvOJ9vV2vxtPIi29Cnxx4Zf+oH9xOOVn/UyvW/s86ZMwjvb31nW/M8kpRhDPQKJkPMV7GJAzJ6WY8dNnpyTULWKLcxZbDfkpkq1hpFoNDm+rMfwgxDtI+8ALjBWSPHrAPdA+0uHlzWiDEfwAsbLtoA8DOQeEDUWnRshmVi1hGkPZgwbdOfXtn30GcrDj67fU/bfUOqV7U8L9R/V/tV2faalTTlq6d8LBZvUWZOe8y8LGt01NSWs866NStPJRRttIbsTsYQch4gMFC4vXHpjh2n+qvGCM0NdeW6GPNOGHfNgvEdHZOQWqPR6Qtcdvubfre1CSWjYeYkn2Awxb9O+b1SnhJY6DnZ6tJvpoIIM+G0Ns5SRRt2QZFmUIx4csjoyTM6Wpr+EaRdxyhoaTVaZU60MX41vCejwHN10HlchOnhJPA/UlfVQZj9xeICQAWnaPQKrKOpefGeR7eKVWbxbxn09GW5U4blW1aZEqSDjFE47m51uBtO2I6cLGpZ/uUn9Se6xq0vzyulKO536mji9EPphzJBhA3tIxcO2dDsO8cXwExkGgSAhZIENVIifsACOA84hoGZHcfC+AyTKlWesm/36kD3SlFonew7xi4iFKo1MIflkU4mMCKWhEaKXhqmiawCqgvvaiZoiaYatqVD/9NQU1aSJDKJSUobZzQnHoKxEoDFixfqa6teATcA4JVDLCx97oz3UluSSiclOJ+3+JNZn08MA9BbeBLa+L0LUxIWvpxU1XAmoI1PV3hnxh5UgR7F1BF33eOGQ+UEKcd+PLAL7cEv5LUtSQPvjjbHfQ5DfIsIWsjQQ00TgYRDAh5Hy5t11eUvgesXakN7MVhSBsTGJ30Js4SBEDAReCAGvfAdyoe/1nrBlmOznfKOnHBvK88wethvrSw5ECcyiE/Lzo9NSPlanOd1298+U3l0KbhBAEUKSdHjBY8fISVgDOXy0OY0DdF07vK2i/vqX3OcVJwui8hPB40bpBw0lBozYX78mzotMtTVzoDYeOTCvebDqeDaMIa4+r5SfK5XL7xSg1OpVNGkLjaTgA5TwHhXkPbXdjQ1NYKIshfo/TwhHjqdTiNTRWVDMTRzAmcLwmTVefGiE3SqfU8eWMT+kM49gr7KZt0WBD1BnL36ngeG5Cdu9bc5AecLCDqTFFHC/IDAWD/t9rNqHUoQuEAGnEHAMywwp8jA0ULrM6/Or1oNfrky/k0F6T9h/E+i65Xqr/yHwaSnhs0cMNLwlygTMRhHeR2GsKgE5QCOcrwEE9wuO3XqXJn7o8YfTJuLi4s50Ld0/Ea/0bX0XxB9nrPY0cBvAAAAAElFTkSuQmCC\"","import React, { forwardRef, useState, useEffect, useRef } from 'react';\nimport styles from './TopBar.module.css';\nimport logoUrl from './clear-logo.png';\n\nexport interface TopBarMenuItem {\n label: string;\n value: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n divider?: boolean;\n}\n\nexport interface TopBarNavItem {\n id: string;\n label: string;\n items?: TopBarMenuItem[];\n onSelect?: (value: string) => void;\n /** Teal color + plus-circle icon (for the Create CTA) */\n isPrimary?: boolean;\n}\n\nexport interface TopBarUserProfile {\n name: string;\n /** Shown above the avatar. E.g. \"Loan Officer\" */\n role?: string;\n /** 1–2 char initials. Defaults to first letters of name words. */\n initials?: string;\n menuItems?: TopBarMenuItem[];\n onMenuSelect?: (value: string) => void;\n}\n\nexport interface TopBarProps {\n /** e.g. \"v.1.88.3459\" — shown in small text next to logo */\n version?: string;\n navItems: TopBarNavItem[];\n onSearch?: (query: string) => void;\n searchPlaceholder?: string;\n profile: TopBarUserProfile;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction cx(...classes: (string | undefined | false | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ChevronDown() {\n return (\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction DropdownPanel({\n items,\n onSelect,\n className,\n}: {\n items: TopBarMenuItem[];\n onSelect: (value: string) => void;\n className?: string;\n}) {\n return (\n <div role=\"menu\" className={cx(styles.dropdownPanel, className)}>\n {items.map((item) =>\n item.divider ? (\n <div key={item.value} className={styles.dropdownDivider} />\n ) : (\n <button\n key={item.value}\n role=\"menuitem\"\n className={styles.dropdownItem}\n disabled={item.disabled}\n onClick={() => onSelect(item.value)}\n >\n {item.icon}\n {item.label}\n </button>\n )\n )}\n </div>\n );\n}\n\nfunction NavItem({ id: _id, label, items, onSelect, isPrimary }: TopBarNavItem) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n\n function handleClickOutside(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.navWrap}>\n <button\n className={cx(\n styles.navItem,\n open && styles.navItemOpen,\n isPrimary && styles.navItemPrimary\n )}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n >\n {isPrimary && <i className=\"pi pi-plus-circle\" aria-hidden=\"true\" />}\n {label}\n {items && items.length > 0 && (\n <span className={cx(styles.navChevron, open && styles.navChevronOpen)}>\n <ChevronDown />\n </span>\n )}\n </button>\n {open && items && items.length > 0 && (\n <DropdownPanel\n items={items}\n onSelect={(value) => {\n onSelect?.(value);\n setOpen(false);\n }}\n />\n )}\n </div>\n );\n}\n\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\nfunction ProfileButton({ profile }: { profile: TopBarUserProfile }) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n const initials = profile.initials ?? getInitials(profile.name);\n\n useEffect(() => {\n if (!open) return;\n\n function handleClickOutside(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div className={styles.profileArea}>\n {profile.role && <span className={styles.roleLabel}>{profile.role}</span>}\n <div ref={wrapRef} className={styles.avatarWrap}>\n <button\n className={styles.avatarBtn}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`${profile.name} — open profile menu`}\n >\n {initials}\n </button>\n {open && profile.menuItems && profile.menuItems.length > 0 && (\n <DropdownPanel\n items={profile.menuItems}\n className={styles.profilePanel}\n onSelect={(value) => {\n profile.onMenuSelect?.(value);\n setOpen(false);\n }}\n />\n )}\n </div>\n </div>\n );\n}\n\nexport const TopBar = forwardRef<HTMLDivElement, TopBarProps>(function TopBar(props, ref) {\n const { version, navItems, onSearch, searchPlaceholder, profile, className, style } = props;\n\n return (\n <div ref={ref} className={cx(styles.bar, className)} style={style}>\n {/* Left group: logo + version + nav items */}\n <div className={styles.leftGroup}>\n <img src={logoUrl} alt=\"Clear\" className={styles.logo} />\n {version && <span className={styles.version}>{version}</span>}\n {navItems.map((item) => (\n <NavItem key={item.id} {...item} />\n ))}\n </div>\n\n {/* Center: search */}\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon}>\n <i className=\"pi pi-search\" aria-hidden=\"true\" />\n </span>\n <input\n className={styles.searchInput}\n placeholder={searchPlaceholder ?? 'Search Leads and Loans'}\n onChange={(e) => onSearch?.(e.target.value)}\n aria-label=\"Search\"\n />\n </div>\n\n {/* Right group: profile */}\n <div className={styles.rightGroup}>\n <ProfileButton profile={profile} />\n </div>\n </div>\n );\n});\n","export default \"data:image/png;base64,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\"","import React, { useState, useEffect, useRef } from 'react';\nimport styles from './TopBarMobile.module.css';\nimport logoUrl from './clear-logo.png';\nimport logoClipUrl from './clear-logo-clip.png';\nimport type { TopBarUserProfile, TopBarMenuItem } from './TopBar';\n\nexport interface TopBarMobileBorrower {\n name: string;\n onInfoClick?: () => void;\n}\n\nexport interface TopBarMobileProps {\n /** When provided → URLA mode: small C logo left + borrower name center */\n borrower?: TopBarMobileBorrower;\n onMenuOpen?: () => void;\n onSearchOpen?: () => void;\n profile: TopBarUserProfile;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\nfunction DropdownPanel({\n items,\n onSelect,\n}: {\n items: TopBarMenuItem[];\n onSelect: (value: string) => void;\n}) {\n return (\n <div role=\"menu\" className={styles.dropdownPanel}>\n {items.map((item) =>\n item.divider ? (\n <div key={item.value} className={styles.dropdownDivider} />\n ) : (\n <button\n key={item.value}\n role=\"menuitem\"\n className={styles.dropdownItem}\n disabled={item.disabled}\n onClick={() => onSelect(item.value)}\n >\n {item.icon}\n {item.label}\n </button>\n )\n )}\n </div>\n );\n}\n\nfunction MobileProfileButton({ profile }: { profile: TopBarUserProfile }) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n const initials = profile.initials ?? getInitials(profile.name);\n\n useEffect(() => {\n if (!open) return;\n\n function handleClickOutside(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.avatarWrap}>\n <button\n className={styles.avatarBtn}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`${profile.name} — open profile menu`}\n >\n {initials}\n </button>\n {open && profile.menuItems && profile.menuItems.length > 0 && (\n <DropdownPanel\n items={profile.menuItems}\n onSelect={(value) => {\n profile.onMenuSelect?.(value);\n setOpen(false);\n }}\n />\n )}\n </div>\n );\n}\n\nexport function TopBarMobile({\n borrower,\n onMenuOpen,\n onSearchOpen,\n profile,\n className,\n style,\n}: TopBarMobileProps) {\n const isUrla = !!borrower;\n\n return (\n <div\n className={[styles.bar, className].filter(Boolean).join(' ')}\n style={style}\n >\n {/* Left */}\n <div className={styles.left}>\n <button\n className={styles.iconBtn}\n onClick={onMenuOpen}\n aria-label=\"Open menu\"\n >\n <i className=\"pi pi-bars\" aria-hidden=\"true\" />\n </button>\n {isUrla && (\n <img src={logoClipUrl} alt=\"Clear\" className={styles.logoClip} />\n )}\n </div>\n\n {/* Center */}\n <div className={styles.center}>\n {isUrla ? (\n <>\n <span className={styles.borrowerName}>{borrower.name}</span>\n <button\n className={styles.infoIcon}\n onClick={borrower.onInfoClick}\n aria-label=\"Borrower info\"\n >\n <i className=\"pi pi-info-circle\" aria-hidden=\"true\" />\n </button>\n </>\n ) : (\n <img src={logoUrl} alt=\"Clear\" className={styles.logo} />\n )}\n </div>\n\n {/* Right */}\n <div className={styles.right}>\n <button\n className={[styles.iconBtn, styles.searchBtn].join(' ')}\n onClick={onSearchOpen}\n aria-label=\"Open search\"\n >\n <i className=\"pi pi-search\" aria-hidden=\"true\" />\n </button>\n <MobileProfileButton profile={profile} />\n </div>\n </div>\n );\n}\n","import { forwardRef, useState, useRef, useEffect } from 'react';\nimport styles from './LightningButton.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface LightningButtonItem {\n label: string;\n value: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n divider?: boolean;\n}\n\nexport interface LightningButtonProps {\n /**\n * Visual variant.\n * - `'basic'` — no visible container, teal icon (default)\n * - `'filled'` — teal-50 bg / teal-200 border idle; teal-700 bg on hover/active\n */\n variant?: 'basic' | 'filled';\n /**\n * Button size. Only meaningful for the `filled` variant.\n * - `'sm'` — 24px tall\n * - `'md'` — 36px tall (default)\n * - `'lg'` — 40px tall\n */\n size?: 'sm' | 'md' | 'lg';\n /** Dropdown items. */\n items: LightningButtonItem[];\n /** Called when the user selects a dropdown item. */\n onSelect: (value: string) => void;\n /** Disables the button and blocks dropdown. */\n disabled?: boolean;\n /** Accessible label — required since there is no visible text. */\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── LightningButton ──────────────────────────────────────────────────────────\n\n/**\n * LightningButton — Clear Design System\n *\n * A pill-shaped icon-only dropdown button with a lightning bolt icon.\n * Used as the \"Quick Actions\" trigger in navigation bars and toolbars.\n *\n * Two variants:\n * - `basic` — no visible container, teal icon (default)\n * - `filled` — solid teal-700 background\n *\n * @example\n * <LightningButton\n * variant=\"basic\"\n * items={[{ label: 'Copy Loan', value: 'copy' }]}\n * onSelect={(v) => console.log(v)}\n * aria-label=\"Quick actions\"\n * />\n */\nexport const LightningButton = forwardRef<HTMLButtonElement, LightningButtonProps>(\n function LightningButton(\n {\n variant = 'basic',\n size = 'md',\n items,\n onSelect,\n disabled,\n 'aria-label': ariaLabel = 'Quick actions',\n className,\n style,\n },\n ref,\n ) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!containerRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const handleSelect = (value: string) => {\n setOpen(false);\n onSelect(value);\n };\n\n const btnClass = [\n styles.btn,\n size === 'sm' ? styles.btnSm : size === 'lg' ? styles.btnLg : styles.btnMd,\n variant === 'filled' ? styles.btnFilled : styles.btnBasic,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={containerRef}\n className={[styles.wrap, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n ref={ref}\n type=\"button\"\n className={btnClass}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <span className={styles.boltIcon} aria-hidden=\"true\">\n <i className=\"pi pi-bolt\" />\n </span>\n <span className={styles.chevronIcon} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {open && (\n <div role=\"menu\" className={styles.menu}>\n {items.map((item) => {\n if (item.divider) {\n return <div key={item.value} className={styles.menuDivider} role=\"separator\" />;\n }\n return (\n <div\n key={item.value}\n role=\"menuitem\"\n className={[styles.menuItem, item.disabled ? styles.menuItemDisabled : '']\n .filter(Boolean)\n .join(' ')}\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n onClick={() => {\n if (!item.disabled) handleSelect(item.value);\n }}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault();\n handleSelect(item.value);\n }\n }}\n >\n {item.icon && <span className={styles.menuItemIcon} aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n);\n\nLightningButton.displayName = 'LightningButton';\n","import { forwardRef, useRef, useState, useEffect } from 'react';\nimport { BannerTabs } from '../BannerTabs';\nimport type { BannerTabItem, StatusColor } from '../BannerTabs';\nimport { Button } from '../Button';\nimport type { ButtonVariant } from '../Button';\nimport { IconButton } from '../IconButton';\nimport { DropdownButton } from '../DropdownButton';\nimport type { DropdownButtonItem } from '../DropdownButton';\nimport { SplitButton } from '../SplitButton';\nimport type { SplitButtonItem } from '../SplitButton';\nimport { BannerAlert } from '../Alert';\nimport type { BannerAlertSeverity } from '../Alert';\nimport { LightningButton } from '../LightningButton';\nimport styles from './LoanBannerNav.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * A single action rendered in the right-side action zone.\n *\n * Rendering rules (in priority order):\n * 1. No `label` + `items` → small secondary icon-only DropdownButton (⚡▼)\n * 2. No `label` + no `items` → small secondary IconButton (💬, 🔄)\n * 3. `label` + `items` → small secondary DropdownButton with text (+ optional badge)\n * 4. `label` only → small secondary Button with optional leading icon\n */\nexport interface LoanBannerNavAction {\n /** Unique key. */\n value: string;\n /** Button label. Omit for icon-only rendering. */\n label?: string;\n /** Click handler (used for non-dropdown buttons). */\n onClick?: () => void;\n /** Visual variant for text buttons. Defaults to `'secondary'`. */\n variant?: ButtonVariant;\n /** Leading icon (or the sole icon when label is omitted). */\n icon?: React.ReactNode;\n /** Red count badge shown on the button. */\n badge?: string | number;\n /** If provided, the button opens a dropdown menu. */\n items?: DropdownButtonItem[];\n /** Called when the user selects a dropdown item. */\n onSelect?: (value: string) => void;\n /** Renders a pipe `|` divider immediately before this action. */\n dividerBefore?: boolean;\n /** Aria label — required when `label` is omitted. */\n ariaLabel?: string;\n /**\n * When `true`, renders as a `LightningButton` pill (bolt icon + chevron).\n * Requires `items` and `onSelect`. `variant` controls outline vs filled.\n */\n lightning?: boolean;\n /** LightningButton variant when `lightning` is true. Defaults to `'basic'`. */\n lightningVariant?: 'basic' | 'filled';\n}\n\nexport interface LoanBannerNavCondition {\n /** Label text shown in the condition badge (e.g. \"Dunning Delete Org\"). */\n label: string;\n /** Called when the user dismisses the condition. */\n onDismiss?: () => void;\n}\n\nexport interface LoanBannerNavToolbar {\n /** Left slot — e.g. a compact section-navigation dropdown. */\n left?: React.ReactNode;\n /** Center slot — fills remaining width. e.g. a wide Select. */\n center?: React.ReactNode;\n /** Right slot — e.g. the ⚡▼ quick-actions dropdown. */\n right?: React.ReactNode;\n}\n\nexport interface LoanBannerNavBanner {\n /** Bold heading text shown in the alert strip. */\n title: string;\n /** Optional detail text shown after the title. */\n detail?: string;\n /** Visual severity. Defaults to `'warn'`. */\n severity?: BannerAlertSeverity;\n /** Whether the dismiss (✕) button is shown. Defaults to `true`. */\n closable?: boolean;\n /** Called when the user dismisses the banner. */\n onClose?: () => void;\n}\n\nexport interface LoanBannerNavCollapsedSection {\n /** Section label (e.g. \"Loan Summary\"). */\n label: string;\n /** Muted sub-label (e.g. \"LE Pending for 2 Days\"). */\n subLabel?: string;\n /** Status dot color. */\n status?: StatusColor;\n}\n\nexport interface LoanBannerNavProps {\n // ── Core navigation ──────────────────────────────────────────────────────\n /** Tab definitions — reuses `BannerTabItem` from BannerTabs. */\n tabs: BannerTabItem[];\n /** Controlled active tab id. */\n activeTabId: string;\n /** Called when the user selects a different tab. */\n onTabChange: (id: string) => void;\n\n // ── Left ─────────────────────────────────────────────────────────────────\n /** Hamburger / menu-toggle handler. */\n onMenuToggle?: () => void;\n\n // ── Right — flexible action zone (full mode) ─────────────────────────────\n /**\n * Actions rendered left-to-right before the primary button.\n * Order is exactly as provided — consumers control placement.\n */\n secondaryActions?: LoanBannerNavAction[];\n\n /** Dedicated refresh icon button (sm secondary). */\n onRefresh?: () => void;\n\n // ── Right — primary action ────────────────────────────────────────────────\n /** Primary button label. Defaults to `'Save Loan'`. */\n primaryLabel?: string;\n /** Primary button click handler. */\n onPrimary?: () => void;\n /** When provided, primary renders as a `SplitButton`. */\n primaryItems?: SplitButtonItem[];\n /** Called when the user selects a SplitButton dropdown item. */\n onPrimarySelect?: (value: string) => void;\n\n // ── Condition badge ───────────────────────────────────────────────────────\n /** When provided, renders a dismissible condition badge before the primary. */\n condition?: LoanBannerNavCondition;\n\n // ── Secondary toolbar row ─────────────────────────────────────────────────\n /**\n * When provided, renders a secondary toolbar row below the main bar.\n * Three layout slots: left (compact), center (flex-1), right (compact).\n */\n toolbar?: LoanBannerNavToolbar;\n\n // ── Status banner ─────────────────────────────────────────────────────────\n /**\n * When provided, renders a `BannerAlert` strip below the main bar\n * (or below the toolbar if both are present).\n */\n banner?: LoanBannerNavBanner;\n\n // ── Collapsed / mobile mode ───────────────────────────────────────────────\n /** Switches to compact single-row mode (hides BannerTabs, shows breadcrumb pills). */\n collapsed?: boolean;\n /** Parent section breadcrumb pill shown in collapsed mode. */\n collapsedSection?: LoanBannerNavCollapsedSection;\n /** When provided, renders a back-arrow before the breadcrumb pills. */\n onCollapsedBack?: () => void;\n /** When provided, renders a \">\" expand button to reveal all tabs. */\n onExpandTabs?: () => void;\n /** Items for the ⚡▼ quick-actions dropdown in collapsed mode. */\n collapsedQuickItems?: DropdownButtonItem[];\n /** Called when the user picks a collapsed quick action. */\n onCollapsedQuickAction?: (value: string) => void;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst HamburgerIcon = () => (\n <svg width=\"18\" height=\"14\" viewBox=\"0 0 18 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M0 1h18M0 7h18M0 13h18\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst RefreshIcon = () => <i className=\"pi pi-refresh\" aria-hidden=\"true\" />;\n\nconst ChevronRightIcon = () => (\n <svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l5 5-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronLeftIcon = () => (\n <svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 1L1 6l5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Nav-specific badge dropdown ─────────────────────────────────────────────\n// A secondary sm dropdown button with the count badge rendered INSIDE,\n// after the chevron. Only used in the nav action zone.\n\nconst NavChevronDown = () => (\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nfunction NavBadgeDropdown({ label, badge, items, onSelect }: {\n label: string;\n badge: string | number;\n items: DropdownButtonItem[];\n onSelect?: (value: string) => void;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!ref.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n return (\n <div ref={ref} className={styles.navBadgeDrop}>\n <button\n type=\"button\"\n className={styles.navBadgeDropBtn}\n onClick={() => setIsOpen((p) => !p)}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n >\n <span className={styles.navBadgeDropLabel}>{label}</span>\n <span className={styles.navBadgeDropChevron}><NavChevronDown /></span>\n <span className={styles.navBadgeDropBadge}>{badge}</span>\n </button>\n\n {isOpen && (\n <div role=\"menu\" className={styles.navBadgeDropMenu}>\n {items.map((item) => (\n <div\n key={item.value}\n role=\"menuitem\"\n className={[styles.navBadgeDropItem, item.disabled ? styles.navBadgeDropItemDisabled : ''].filter(Boolean).join(' ')}\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n onClick={() => {\n if (!item.disabled) { onSelect?.(item.value); setIsOpen(false); }\n }}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault(); onSelect?.(item.value); setIsOpen(false);\n }\n }}\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Action renderer ──────────────────────────────────────────────────────────\n\nfunction renderAction(action: LoanBannerNavAction) {\n const isIconOnly = !action.label;\n\n // LightningButton pill (bolt icon + chevron dropdown)\n if (action.lightning && action.items) {\n return (\n <LightningButton\n key={action.value}\n variant={action.lightningVariant ?? 'filled'}\n size=\"sm\"\n items={action.items}\n onSelect={action.onSelect ?? (() => {})}\n aria-label={action.ariaLabel ?? 'Quick actions'}\n />\n );\n }\n\n // Icon-only DropdownButton (fallback for non-lightning icon dropdowns)\n if (isIconOnly && action.items) {\n return (\n <DropdownButton\n key={action.value}\n label=\"\"\n leadingIcon={action.icon}\n variant=\"secondary\"\n size=\"sm\"\n items={action.items}\n onSelect={action.onSelect}\n aria-label={action.ariaLabel ?? action.value}\n />\n );\n }\n\n // Icon-only button (💬, 🔄)\n if (isIconOnly) {\n return (\n <IconButton\n key={action.value}\n icon={action.icon}\n variant=\"secondary\"\n size=\"sm\"\n aria-label={action.ariaLabel ?? action.value}\n onClick={action.onClick}\n />\n );\n }\n\n // Text dropdown with inline badge (Generate BRW Needs List ▼[7])\n if (action.items && action.badge != null) {\n return (\n <NavBadgeDropdown\n key={action.value}\n label={action.label ?? ''}\n badge={action.badge}\n items={action.items}\n onSelect={action.onSelect}\n />\n );\n }\n\n // Text DropdownButton without badge\n if (action.items) {\n return (\n <DropdownButton\n key={action.value}\n label={action.label ?? ''}\n leadingIcon={action.icon}\n variant={action.variant ?? 'secondary'}\n size=\"sm\"\n items={action.items}\n onSelect={action.onSelect}\n />\n );\n }\n\n // Text button (Create Sandbox, Save History, Refresh)\n return (\n <Button\n key={action.value}\n variant={action.variant ?? 'secondary'}\n size=\"sm\"\n leadingIcon={action.icon}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n );\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * LoanBannerNav — Clear Design System\n *\n * Primary navigation bar for the loan origination application.\n * Wraps `BannerTabs` in a full-width bar with a menu toggle on the left and\n * a flexible action zone on the right.\n *\n * Optionally renders a secondary toolbar row (left/center/right slots) and/or\n * a `BannerAlert` strip below.\n *\n * @example\n * <LoanBannerNav\n * tabs={tabs}\n * activeTabId=\"urla\"\n * onTabChange={setActiveTab}\n * onRefresh={handleRefresh}\n * onPrimary={handleSave}\n * />\n */\nexport const LoanBannerNav = forwardRef<HTMLElement, LoanBannerNavProps>(\n function LoanBannerNav(props, ref) {\n const {\n tabs,\n activeTabId,\n onTabChange,\n onMenuToggle,\n secondaryActions = [],\n onRefresh,\n primaryLabel = 'Save Loan',\n onPrimary,\n primaryItems,\n onPrimarySelect,\n condition,\n toolbar,\n banner,\n collapsed = false,\n collapsedSection,\n onCollapsedBack,\n onExpandTabs,\n collapsedQuickItems = [],\n onCollapsedQuickAction,\n } = props;\n\n const activeTab = tabs.find((t) => t.id === activeTabId);\n\n const dotClass = (color?: StatusColor) =>\n [styles.breadcrumbDot, color ? styles[`status_${color}`] : ''].filter(Boolean).join(' ');\n\n // ── Primary button / SplitButton ─────────────────────────────────────────\n const primaryEl = onPrimary && (\n primaryItems?.length ? (\n <SplitButton\n label={primaryLabel}\n onAction={onPrimary}\n items={primaryItems}\n onSelect={onPrimarySelect}\n variant=\"primary\"\n size=\"sm\"\n />\n ) : (\n <Button variant=\"primary\" size=\"sm\" onClick={onPrimary}>\n {primaryLabel}\n </Button>\n )\n );\n\n // ── Right-side actions (full mode) ──────────────────────────────────────\n const fullRightActions = (\n <div className={styles.actions}>\n {condition && (\n <div className={styles.conditionBadge}>\n <span className={styles.conditionLabel}>{condition.label}</span>\n {condition.onDismiss && (\n <button\n className={styles.conditionDismiss}\n onClick={condition.onDismiss}\n aria-label=\"Dismiss condition\"\n >\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l7 7M8 1L1 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {secondaryActions.map((action) => (\n <div key={action.value} className={styles.actionItem}>\n {action.dividerBefore && <span className={styles.divider} aria-hidden=\"true\" />}\n {renderAction(action)}\n </div>\n ))}\n\n {onRefresh && (\n <IconButton\n variant=\"secondary\"\n size=\"sm\"\n aria-label=\"Refresh\"\n icon={<RefreshIcon />}\n onClick={onRefresh}\n />\n )}\n\n {primaryEl}\n </div>\n );\n\n // ── Right-side actions (collapsed mode) ─────────────────────────────────\n const collapsedRightActions = (\n <div className={styles.actions}>\n {collapsedQuickItems.length > 0 && (\n <LightningButton\n variant=\"filled\"\n size=\"sm\"\n items={collapsedQuickItems}\n onSelect={onCollapsedQuickAction ?? (() => {})}\n aria-label=\"Quick actions\"\n />\n )}\n {onRefresh && (\n <IconButton\n variant=\"secondary\"\n size=\"sm\"\n aria-label=\"Refresh\"\n icon={<RefreshIcon />}\n onClick={onRefresh}\n />\n )}\n {primaryEl}\n </div>\n );\n\n return (\n <nav\n ref={ref}\n className={[styles.nav, collapsed ? styles.collapsed : ''].filter(Boolean).join(' ')}\n >\n {/* ── Main row ──────────────────────────────────────────────────── */}\n <div className={styles.mainRow}>\n <button className={styles.menuToggle} onClick={onMenuToggle} aria-label=\"Toggle menu\">\n <HamburgerIcon />\n </button>\n\n {collapsed ? (\n <>\n {onCollapsedBack && (\n <button className={styles.backBtn} onClick={onCollapsedBack} aria-label=\"Back\">\n <ChevronLeftIcon />\n </button>\n )}\n <div className={styles.breadcrumbs}>\n {collapsedSection && (\n <div className={styles.breadcrumbItem}>\n {collapsedSection.status && <span className={dotClass(collapsedSection.status)} />}\n <div className={styles.breadcrumbText}>\n <span className={styles.breadcrumbLabel}>{collapsedSection.label}</span>\n {collapsedSection.subLabel && (\n <span className={styles.breadcrumbSublabel}>{collapsedSection.subLabel}</span>\n )}\n </div>\n </div>\n )}\n {activeTab && (\n <div className={styles.breadcrumbItem}>\n {activeTab.status.shape !== 'none' && (\n <span className={dotClass(activeTab.status.color)} />\n )}\n <div className={styles.breadcrumbText}>\n <span className={styles.breadcrumbLabel}>\n {activeTab.label}{activeTab.subLabel ? ` / ${activeTab.subLabel}` : ''}\n </span>\n {activeTab.subtitle && (\n <span className={styles.breadcrumbSublabel}>{activeTab.subtitle}</span>\n )}\n </div>\n </div>\n )}\n </div>\n {onExpandTabs && (\n <button className={styles.expandBtn} onClick={onExpandTabs} aria-label=\"Show all tabs\">\n <ChevronRightIcon />\n </button>\n )}\n {collapsedRightActions}\n </>\n ) : (\n <>\n <div className={styles.tabsArea}>\n <BannerTabs items={tabs} activeId={activeTabId} onChange={onTabChange} />\n </div>\n {fullRightActions}\n </>\n )}\n </div>\n\n {/* ── Secondary toolbar row ─────────────────────────────────────── */}\n {toolbar && !collapsed && (\n <div className={styles.toolbarRow}>\n {toolbar.left && <div className={styles.toolbarLeft}>{toolbar.left}</div>}\n {toolbar.center && <div className={styles.toolbarCenter}>{toolbar.center}</div>}\n {toolbar.right && <div className={styles.toolbarRight}>{toolbar.right}</div>}\n </div>\n )}\n\n {/* ── BannerAlert strip ─────────────────────────────────────────── */}\n {banner && !collapsed && (\n <BannerAlert\n severity={banner.severity ?? 'warn'}\n title={banner.title}\n detail={banner.detail}\n closable={banner.closable ?? true}\n onClose={banner.onClose}\n />\n )}\n </nav>\n );\n }\n);\n","import { useState, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport styles from './DataTable.module.css';\nimport { Button } from '../Button';\nimport { IconButton } from '../IconButton';\nimport { SelectButton } from '../SelectButton';\nimport { DatePicker } from '../DatePicker';\nimport { Select } from '../Select';\nimport { InputText } from '../InputText';\nimport { Checkbox } from '../Checkbox';\n\nconst RemoveIcon = (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l8 8M9 1l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n// Date <-> ISO string helpers. Parsing \"YYYY-MM-DD\" with `new Date()` gives\n// UTC midnight, which shifts to the previous local day in US timezones — so\n// build the Date from year/month/day directly to stay timezone-safe.\nfunction parseISODate(s: string): Date | null {\n const m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n return new Date(parseInt(m[1], 10), parseInt(m[2], 10) - 1, parseInt(m[3], 10));\n}\n\nfunction toISODate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type FilterType = 'rule' | 'checklist' | 'grouped-checklist';\n\n/**\n * Drives which operator set the rule filter shows and which value editor it\n * renders. `'text'` (default) uses text operators with a text input. `'date'`\n * uses date operators with a native date picker.\n */\nexport type FilterDataType = 'text' | 'date';\n\nexport interface FilterOption {\n label: string;\n value: unknown;\n}\n\nexport interface FilterGroup {\n label: string;\n options: FilterOption[];\n}\n\nexport interface ColumnFilter {\n /** Determines which filter UI to render. */\n type: FilterType;\n /**\n * For `'rule'` type — selects the operator set and value editor.\n * @default 'text'\n */\n dataType?: FilterDataType;\n /** Options for `'checklist'` type. */\n options?: FilterOption[];\n /** Grouped options for `'grouped-checklist'` type. */\n groups?: FilterGroup[];\n /** Controlled filter value. Format depends on type. */\n value?: unknown;\n /** Called with the new value when the user clicks Apply. */\n onChange?: (value: unknown) => void;\n}\n\n// ─── Rule-based filter value ──────────────────────────────────────────────────\n\nexport interface FilterRule {\n matchMode: string;\n value: string;\n}\n\nexport interface RuleFilterValue {\n operator: 'and' | 'or';\n rules: FilterRule[];\n}\n\nconst TEXT_MATCH_MODES = [\n { label: 'Contains', value: 'contains' },\n { label: 'Starts with', value: 'startsWith' },\n { label: 'Ends with', value: 'endsWith' },\n { label: 'Equals', value: 'equals' },\n { label: 'Not equals', value: 'notEquals' },\n { label: 'Greater than', value: 'gt' },\n { label: 'Less than', value: 'lt' },\n { label: 'Blank', value: 'blank' },\n { label: 'Not blank', value: 'notBlank' },\n];\n\nconst DATE_MATCH_MODES = [\n { label: 'Date equal to', value: 'dateEquals' },\n { label: 'Date not equal to', value: 'dateNotEquals' },\n { label: 'Date before', value: 'dateBefore' },\n { label: 'Date after', value: 'dateAfter' },\n { label: 'Date on or before', value: 'dateOnOrBefore' },\n { label: 'Date on or after', value: 'dateOnOrAfter' },\n { label: 'Blank', value: 'blank' },\n { label: 'Not blank', value: 'notBlank' },\n];\n\n// Operators that take no value — the value input is hidden.\nconst VALUELESS_MODES = new Set(['blank', 'notBlank']);\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction RuleFilter({\n value,\n dataType,\n onApply,\n onReset,\n onClose,\n}: {\n value?: RuleFilterValue;\n dataType: FilterDataType;\n onApply: (v: RuleFilterValue) => void;\n onReset: () => void;\n onClose: () => void;\n}) {\n const matchModes = dataType === 'date' ? DATE_MATCH_MODES : TEXT_MATCH_MODES;\n const defaultMode = matchModes[0].value;\n const [rules, setRules] = useState<FilterRule[]>(\n value?.rules?.length ? value.rules : [{ matchMode: defaultMode, value: '' }],\n );\n const [operator, setOperator] = useState<'and' | 'or'>(value?.operator ?? 'and');\n\n function updateRule(i: number, patch: Partial<FilterRule>) {\n setRules(prev => prev.map((r, idx) => (idx === i ? { ...r, ...patch } : r)));\n }\n\n function addRule() {\n setRules(prev => [...prev, { matchMode: defaultMode, value: '' }]);\n }\n\n function removeRule(i: number) {\n setRules(prev => prev.filter((_, idx) => idx !== i));\n }\n\n return (\n <>\n <div className={styles.filterBody}>\n {rules.map((rule, i) => (\n <div key={i} className={styles.filterRule}>\n {i > 0 && (\n <div className={styles.filterOperatorRow}>\n <SelectButton\n options={[\n { label: 'AND', value: 'and' },\n { label: 'OR', value: 'or' },\n ]}\n value={operator}\n onChange={v => setOperator(v as 'and' | 'or')}\n />\n </div>\n )}\n <div className={styles.filterRuleRow}>\n <div className={styles.filterFieldFull}>\n <Select\n options={matchModes}\n value={rule.matchMode}\n onChange={v => v && updateRule(i, { matchMode: v })}\n style={{ width: '100%' }}\n />\n </div>\n {!VALUELESS_MODES.has(rule.matchMode) && (\n <div className={styles.filterInputRow}>\n <div className={styles.filterFieldFull}>\n {dataType === 'date' ? (\n <DatePicker\n value={rule.value ? parseISODate(rule.value) : null}\n onChange={d => updateRule(i, { value: d ? toISODate(d) : '' })}\n style={{ width: '100%' }}\n />\n ) : (\n <InputText\n placeholder=\"Value\"\n value={rule.value}\n onChange={e => updateRule(i, { value: e.target.value })}\n />\n )}\n </div>\n {rules.length > 1 && (\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n icon={RemoveIcon}\n aria-label=\"Remove rule\"\n onClick={() => removeRule(i)}\n />\n )}\n </div>\n )}\n {VALUELESS_MODES.has(rule.matchMode) && rules.length > 1 && (\n <div className={styles.filterInputRow}>\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n icon={RemoveIcon}\n aria-label=\"Remove rule\"\n onClick={() => removeRule(i)}\n />\n </div>\n )}\n </div>\n </div>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={addRule} style={{ alignSelf: 'flex-start' }}>\n + Add rule\n </Button>\n </div>\n <FilterFooter onReset={onReset} onApply={() => onApply({ operator, rules })} onClose={onClose} />\n </>\n );\n}\n\nfunction ChecklistFilter({\n options = [],\n value,\n onApply,\n onReset,\n onClose,\n}: {\n options?: FilterOption[];\n value?: unknown[];\n onApply: (v: unknown[]) => void;\n onReset: () => void;\n onClose: () => void;\n}) {\n const [selected, setSelected] = useState<Set<unknown>>(new Set(value ?? []));\n const [search, setSearch] = useState('');\n\n const filtered = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n );\n const allSelected = filtered.length > 0 && filtered.every(o => selected.has(o.value));\n const someSelected = filtered.some(o => selected.has(o.value));\n const partialSelected = someSelected && !allSelected;\n\n function toggle(v: unknown) {\n setSelected(prev => {\n const next = new Set(prev);\n next.has(v) ? next.delete(v) : next.add(v);\n return next;\n });\n }\n\n function toggleAll() {\n if (allSelected) {\n setSelected(prev => {\n const next = new Set(prev);\n filtered.forEach(o => next.delete(o.value));\n return next;\n });\n } else {\n setSelected(prev => {\n const next = new Set(prev);\n filtered.forEach(o => next.add(o.value));\n return next;\n });\n }\n }\n\n return (\n <>\n <div className={styles.filterBody}>\n <InputText\n placeholder=\"Search…\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n prefixIcon={\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L12.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n }\n />\n <div className={styles.filterChecklist}>\n <Checkbox\n label=\"Select All\"\n checked={allSelected}\n indeterminate={partialSelected}\n onChange={toggleAll}\n />\n {filtered.map(opt => (\n <Checkbox\n key={String(opt.value)}\n label={opt.label}\n checked={selected.has(opt.value)}\n onChange={() => toggle(opt.value)}\n />\n ))}\n </div>\n </div>\n <FilterFooter onReset={onReset} onApply={() => onApply(Array.from(selected))} onClose={onClose} />\n </>\n );\n}\n\nfunction GroupedChecklistFilter({\n groups = [],\n value,\n onApply,\n onReset,\n onClose,\n}: {\n groups?: FilterGroup[];\n value?: unknown[];\n onApply: (v: unknown[]) => void;\n onReset: () => void;\n onClose: () => void;\n}) {\n const [selected, setSelected] = useState<Set<unknown>>(new Set(value ?? []));\n\n function toggle(v: unknown) {\n setSelected(prev => {\n const next = new Set(prev);\n next.has(v) ? next.delete(v) : next.add(v);\n return next;\n });\n }\n\n function clearGroup(group: FilterGroup) {\n setSelected(prev => {\n const next = new Set(prev);\n group.options.forEach(o => next.delete(o.value));\n return next;\n });\n }\n\n return (\n <>\n <div className={styles.filterBody}>\n {groups.map(group => (\n <div key={group.label} className={styles.filterGroup}>\n <div className={styles.filterGroupHeader}>\n <span className={styles.filterGroupLabel}>{group.label}</span>\n <Button variant=\"link\" size=\"sm\" onClick={() => clearGroup(group)}>\n Clear All\n </Button>\n </div>\n {group.options.map(opt => (\n <Checkbox\n key={String(opt.value)}\n label={opt.label}\n checked={selected.has(opt.value)}\n onChange={() => toggle(opt.value)}\n />\n ))}\n </div>\n ))}\n </div>\n <FilterFooter onReset={onReset} onApply={() => onApply(Array.from(selected))} onClose={onClose} />\n </>\n );\n}\n\nfunction FilterFooter({\n onReset,\n onApply,\n onClose,\n}: {\n onReset: () => void;\n onApply: () => void;\n onClose: () => void;\n}) {\n return (\n <div className={styles.filterFooter}>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => { onReset(); onClose(); }}>\n Reset\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={() => { onApply(); onClose(); }}>\n Apply\n </Button>\n </div>\n );\n}\n\n// ─── Main FilterPopover ───────────────────────────────────────────────────────\n\ninterface FilterPopoverProps {\n config: ColumnFilter;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLButtonElement>;\n}\n\nexport function FilterPopover({ config, onClose, anchorRef }: FilterPopoverProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\n\n // Compute position from the filter button's rect; flip to keep within viewport.\n // Tracks scroll (capture, so nested overflow scrolls fire too) + resize.\n useEffect(() => {\n function recompute() {\n const anchor = anchorRef.current?.getBoundingClientRect();\n if (!anchor) return;\n const POPOVER_W = 280;\n const POPOVER_H = 360;\n let top = anchor.bottom + 4;\n let left = anchor.left;\n if (left + POPOVER_W > window.innerWidth - 8) {\n left = Math.max(8, anchor.right - POPOVER_W);\n }\n if (top + POPOVER_H > window.innerHeight - 8) {\n top = Math.max(8, anchor.top - POPOVER_H - 4);\n }\n setPos({ top, left });\n }\n recompute();\n window.addEventListener('scroll', recompute, true);\n window.addEventListener('resize', recompute);\n return () => {\n window.removeEventListener('scroll', recompute, true);\n window.removeEventListener('resize', recompute);\n };\n }, [anchorRef]);\n\n // Close on outside click — but ignore clicks inside any portaled child popover\n // (Select dropdown, DatePicker calendar). Those mark themselves with\n // `data-popover-root` so they don't trick us into closing.\n useEffect(() => {\n function handleOut(e: MouseEvent) {\n const target = e.target as HTMLElement;\n if (target.closest('[data-popover-root]')) return;\n if (\n panelRef.current && !panelRef.current.contains(target) &&\n anchorRef.current && !anchorRef.current.contains(target)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [onClose, anchorRef]);\n\n // Close on Escape\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [onClose]);\n\n function handleReset() {\n config.onChange?.(null);\n }\n\n if (!pos) return null;\n\n return createPortal(\n <div\n ref={panelRef}\n data-popover-root=\"\"\n className={styles.filterPopover}\n style={{ top: pos.top, left: pos.left }}\n >\n {config.type === 'rule' && (\n <RuleFilter\n value={config.value as RuleFilterValue | undefined}\n dataType={config.dataType ?? 'text'}\n onApply={v => config.onChange?.(v)}\n onReset={handleReset}\n onClose={onClose}\n />\n )}\n {config.type === 'checklist' && (\n <ChecklistFilter\n options={config.options}\n value={config.value as unknown[] | undefined}\n onApply={v => config.onChange?.(v)}\n onReset={handleReset}\n onClose={onClose}\n />\n )}\n {config.type === 'grouped-checklist' && (\n <GroupedChecklistFilter\n groups={config.groups}\n value={config.value as unknown[] | undefined}\n onApply={v => config.onChange?.(v)}\n onReset={handleReset}\n onClose={onClose}\n />\n )}\n </div>,\n document.body,\n );\n}\n","import { useState, useRef, useCallback } from 'react';\nimport styles from './DataTable.module.css';\nimport { FilterPopover } from './DataTableFilter';\nimport type { ColumnFilter } from './DataTableFilter';\nimport { Checkbox } from '../Checkbox';\nimport { IconButton } from '../IconButton';\nimport { CloseButton } from '../CloseButton';\n\n// ─── Re-export filter types ───────────────────────────────────────────────────\nexport type { ColumnFilter, FilterOption, FilterGroup, FilterType, FilterDataType, RuleFilterValue } from './DataTableFilter';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type SortOrder = 1 | -1;\nexport type SelectionMode = 'none' | 'single' | 'multiple';\nexport type EditMode = 'row' | 'cell';\n\nexport interface SortMeta {\n field: string;\n order: SortOrder;\n}\n\nexport interface DataTableColumn<T extends object = Record<string, unknown>> {\n /** Data field key. */\n field: string;\n /** Column header content. */\n header: React.ReactNode;\n /** Show sort icons and make column sortable. */\n sortable?: boolean;\n /** Attach a filter popover to this column's header. */\n filter?: ColumnFilter;\n /** Custom cell renderer. Return any ReactNode. */\n body?: (row: T, index: number) => React.ReactNode;\n /**\n * Editor rendered when a row/cell enters edit mode.\n * `onChange` should be called with the new value.\n */\n editor?: (row: T, field: string, onChange: (val: unknown) => void) => React.ReactNode;\n /** Footer cell content. Pass a function to receive all data. */\n footer?: React.ReactNode | ((data: T[]) => React.ReactNode);\n /** Column width (px number or CSS string). */\n width?: number | string;\n /** Text alignment for header and cells. */\n align?: 'left' | 'center' | 'right';\n}\n\n/** Pre-grouped data structure. */\nexport interface DataTableGroup<T extends object = Record<string, unknown>> {\n /** Group header label. */\n label: string;\n /** Rows in this group. */\n data: T[];\n /** Whether the group starts expanded. Defaults to true. */\n defaultExpanded?: boolean;\n}\n\n/** Row expansion (nested rows) configuration. */\nexport interface DataTableExpansion<T extends object = Record<string, unknown>> {\n /** Field used as the unique row key for tracking expanded state. */\n dataKey: string;\n /**\n * Field on each row that contains an array of child rows.\n * If provided, the expanded section renders a nested DataTable\n * using the same columns (or `columns` if specified).\n */\n childKey?: string;\n /** Custom expansion template. Overrides the default nested table. */\n template?: (row: T) => React.ReactNode;\n /** Custom column set for the nested table. Defaults to parent columns. */\n columns?: DataTableColumn<T>[];\n}\n\nexport interface DataTableProps<T extends object = Record<string, unknown>> {\n /** Flat row array or pre-grouped array (`DataTableGroup<T>[]`). */\n data: T[] | DataTableGroup<T>[];\n /** Column definitions. */\n columns: DataTableColumn<T>[];\n /** Field name used as unique row identifier. Defaults to `'id'`. */\n dataKey?: string;\n\n // ── Selection ──\n selectionMode?: SelectionMode;\n /** Controlled selection. `T` for single, `T[]` for multiple. */\n selection?: T | T[] | null;\n onSelectionChange?: (sel: T | T[] | null) => void;\n\n // ── Sorting (controlled — parent manages actual sort) ──\n sortMode?: 'single' | 'multiple';\n sortField?: string;\n sortOrder?: SortOrder;\n multiSortMeta?: SortMeta[];\n onSort?: (e: { field: string; order: SortOrder; multiSortMeta?: SortMeta[] }) => void;\n\n // ── Row expansion / nested rows ──\n expansion?: DataTableExpansion<T>;\n\n // ── Inline editing ──\n editMode?: EditMode;\n onRowEditSave?: (updated: T, original: T) => void;\n onRowEditCancel?: () => void;\n onCellEdit?: (row: T, field: string, value: unknown) => void;\n\n // ── Display ──\n stripedRows?: boolean;\n /** `'sm'` = compact (6px padding). `'md'` = default (8px). */\n size?: 'sm' | 'md';\n showFooter?: boolean;\n loading?: boolean;\n emptyMessage?: React.ReactNode;\n scrollable?: boolean;\n scrollHeight?: string;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction isGroupedData<T extends object>(data: T[] | DataTableGroup<T>[]): data is DataTableGroup<T>[] {\n return data.length > 0 && typeof data[0] === 'object' && data[0] !== null && 'label' in data[0] && 'data' in data[0];\n}\n\nfunction getRowKey<T>(row: T, dataKey: string): unknown {\n return (row as Record<string, unknown>)[dataKey];\n}\n\nfunction getCellValue<T>(row: T, field: string): unknown {\n return (row as Record<string, unknown>)[field];\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nfunction SortAscIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M5 2L2 6h6L5 2z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M5 8L2 4h6L5 8z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortNeutralIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" fill=\"none\">\n <path d=\"M5 2L2 6h6L5 2z\" fill=\"currentColor\" opacity=\"0.3\" />\n <path d=\"M5 12L2 8h6l-3 4z\" fill=\"currentColor\" opacity=\"0.3\" />\n </svg>\n );\n}\n\nfunction FilterIcon({ active }: { active?: boolean }) {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M1 2h8M2.5 5h5M4 8h2\"\n stroke={active ? 'var(--teal-700,#047880)' : 'currentColor'}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M4 2l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 4l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nconst CheckSvg = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst PencilSvg = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M8 2l2 2-6 6H2V8l6-6z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\n/**\n * DataTable — Clear Design System\n *\n * A full-featured data grid with sortable/filterable columns, row selection,\n * expandable row groups, nested row expansion, and inline row/cell editing.\n *\n * @example\n * <DataTable\n * data={loans}\n * dataKey=\"id\"\n * columns={[\n * { field: 'borrower', header: 'Borrower', sortable: true },\n * { field: 'amount', header: 'Amount', body: (row) => formatCurrency(row.amount) },\n * ]}\n * />\n */\nexport function DataTable<T extends object = Record<string, unknown>>({\n data,\n columns,\n dataKey = 'id',\n selectionMode = 'none',\n selection,\n onSelectionChange,\n sortMode = 'single',\n sortField,\n sortOrder,\n multiSortMeta,\n onSort,\n expansion,\n editMode,\n onRowEditSave,\n onRowEditCancel,\n onCellEdit,\n stripedRows = false,\n size = 'md',\n showFooter = false,\n loading = false,\n emptyMessage = 'No data found.',\n scrollable = false,\n scrollHeight,\n className,\n style,\n}: DataTableProps<T>) {\n // ── Internal state ────────────────────────────────────────────────────────\n const [expandedKeys, setExpandedKeys] = useState<Set<unknown>>(new Set());\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(() => {\n if (isGroupedData(data)) {\n return new Set(\n data\n .filter(g => g.defaultExpanded !== false)\n .map(g => g.label),\n );\n }\n return new Set();\n });\n const [editingRowKey, setEditingRowKey] = useState<unknown>(null);\n const [editingCell, setEditingCell] = useState<{ rowKey: unknown; field: string } | null>(null);\n const [editValues, setEditValues] = useState<Record<string, unknown>>({});\n const [openFilterField, setOpenFilterField] = useState<string | null>(null);\n const filterBtnRefs = useRef<Map<string, React.RefObject<HTMLButtonElement>>>(new Map());\n\n const grouped = isGroupedData(data);\n const flatData: T[] = grouped ? (data as DataTableGroup<T>[]).flatMap(g => g.data) : (data as T[]);\n\n // ── Total column count (including selection / expansion / edit cols) ───────\n const hasExpandCol = !!expansion;\n const hasSelectCol = selectionMode === 'multiple';\n const hasEditCol = editMode === 'row';\n const totalCols = columns.length + (hasExpandCol ? 1 : 0) + (hasSelectCol ? 1 : 0) + (hasEditCol ? 1 : 0);\n\n // ── Sort helpers ──────────────────────────────────────────────────────────\n function getSortOrder(field: string): SortOrder | 0 {\n if (sortMode === 'multiple' && multiSortMeta) {\n return multiSortMeta.find(m => m.field === field)?.order ?? 0;\n }\n return sortField === field ? (sortOrder ?? 0) : 0;\n }\n\n function getSortPriority(field: string): number | null {\n if (sortMode !== 'multiple' || !multiSortMeta) return null;\n const idx = multiSortMeta.findIndex(m => m.field === field);\n return idx >= 0 ? idx + 1 : null;\n }\n\n function handleSort(field: string) {\n if (!onSort) return;\n const current = getSortOrder(field);\n const next: SortOrder = current === 1 ? -1 : 1;\n if (sortMode === 'multiple') {\n const meta = multiSortMeta ? [...multiSortMeta] : [];\n const existing = meta.findIndex(m => m.field === field);\n if (existing >= 0) {\n meta[existing] = { field, order: next };\n } else {\n meta.push({ field, order: next });\n }\n onSort({ field, order: next, multiSortMeta: meta });\n } else {\n onSort({ field, order: next });\n }\n }\n\n // ── Selection helpers ─────────────────────────────────────────────────────\n function isSelected(row: T): boolean {\n if (!selection) return false;\n const key = getRowKey(row, dataKey);\n if (Array.isArray(selection)) {\n return selection.some(r => getRowKey(r, dataKey) === key);\n }\n return getRowKey(selection as T, dataKey) === key;\n }\n\n function handleRowSelect(row: T) {\n if (selectionMode === 'none' && editMode !== 'cell') return;\n if (selectionMode === 'single') {\n onSelectionChange?.(isSelected(row) ? null : row);\n } else if (selectionMode === 'multiple') {\n const arr = Array.isArray(selection) ? [...selection] : [];\n const key = getRowKey(row, dataKey);\n const idx = arr.findIndex(r => getRowKey(r, dataKey) === key);\n if (idx >= 0) {\n arr.splice(idx, 1);\n } else {\n arr.push(row);\n }\n onSelectionChange?.(arr);\n }\n }\n\n function handleSelectAll(checked: boolean) {\n onSelectionChange?.(checked ? [...flatData] : []);\n }\n\n const allSelected = flatData.length > 0 && flatData.every(r => isSelected(r));\n const someSelected = !allSelected && flatData.some(r => isSelected(r));\n\n // ── Expansion helpers ─────────────────────────────────────────────────────\n function toggleExpand(row: T) {\n const key = expansion ? getRowKey(row, expansion.dataKey) : getRowKey(row, dataKey);\n setExpandedKeys(prev => {\n const next = new Set(prev);\n next.has(key) ? next.delete(key) : next.add(key);\n return next;\n });\n }\n\n function isExpanded(row: T): boolean {\n const key = expansion ? getRowKey(row, expansion.dataKey) : getRowKey(row, dataKey);\n return expandedKeys.has(key);\n }\n\n // ── Edit helpers ──────────────────────────────────────────────────────────\n function startRowEdit(row: T) {\n const key = getRowKey(row, dataKey);\n const vals: Record<string, unknown> = {};\n columns.forEach(col => { vals[col.field] = getCellValue(row, col.field); });\n setEditingRowKey(key);\n setEditValues(vals);\n }\n\n function saveRowEdit(row: T) {\n const updated = { ...row, ...editValues } as T;\n onRowEditSave?.(updated, row);\n setEditingRowKey(null);\n setEditValues({});\n }\n\n function cancelRowEdit() {\n setEditingRowKey(null);\n setEditValues({});\n onRowEditCancel?.();\n }\n\n function startCellEdit(row: T, field: string) {\n const key = getRowKey(row, dataKey);\n setEditingCell({ rowKey: key, field });\n setEditValues({ [field]: getCellValue(row, field) });\n }\n\n function saveCellEdit(row: T, field: string) {\n const updated = { ...row, [field]: editValues[field] } as T;\n onCellEdit?.(updated, field, editValues[field]);\n setEditingCell(null);\n setEditValues({});\n }\n\n // ── Filter helper ─────────────────────────────────────────────────────────\n function getFilterBtnRef(field: string): React.RefObject<HTMLButtonElement> {\n if (!filterBtnRefs.current.has(field)) {\n filterBtnRefs.current.set(field, { current: null } as React.RefObject<HTMLButtonElement>);\n }\n return filterBtnRefs.current.get(field)!;\n }\n\n function isFilterActive(col: DataTableColumn<T>): boolean {\n if (!col.filter?.value) return false;\n const v = col.filter.value;\n if (Array.isArray(v)) return v.length > 0;\n if (typeof v === 'object' && v !== null) {\n const rv = v as { rules?: unknown[] };\n return (rv.rules ?? []).some((r: unknown) => (r as { value?: string }).value !== '');\n }\n return false;\n }\n\n // ── Render: header row ────────────────────────────────────────────────────\n const renderHeader = () => (\n <thead>\n <tr className={styles.headerRow}>\n {hasExpandCol && <th className={`${styles.headerCell} ${styles.expandCol}`} />}\n {hasSelectCol && (\n <th className={`${styles.headerCell} ${styles.selectCol}`}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={e => handleSelectAll(e.target.checked)}\n aria-label=\"Select all rows\"\n size=\"sm\"\n />\n </th>\n )}\n {columns.map(col => {\n const order = getSortOrder(col.field);\n const priority = getSortPriority(col.field);\n const filterRef = col.filter ? getFilterBtnRef(col.field) : null;\n return (\n <th\n key={col.field}\n className={`${styles.headerCell} ${col.sortable ? styles.headerCellSortable : ''}`}\n style={{ width: col.width, textAlign: col.align ?? 'left' }}\n onClick={() => col.sortable && handleSort(col.field)}\n aria-sort={order === 1 ? 'ascending' : order === -1 ? 'descending' : 'none'}\n >\n <span className={styles.headerCellContent}>\n <span className={styles.headerText}>{col.header}</span>\n\n {col.sortable && (\n <span className={`${styles.sortIcon} ${order !== 0 ? styles.sortIconActive : ''}`}>\n {order === 1 ? <SortAscIcon /> : order === -1 ? <SortDescIcon /> : <SortNeutralIcon />}\n {priority !== null && (\n <span className={styles.sortPriority}>{priority}</span>\n )}\n </span>\n )}\n\n {col.filter && (\n <div className={styles.filterBtnWrap} onClick={e => e.stopPropagation()}>\n <button\n ref={filterRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n className={`${styles.filterBtn} ${isFilterActive(col) ? styles.filterBtnActive : ''}`}\n aria-label={`Filter ${col.header}`}\n onClick={() => setOpenFilterField(prev => prev === col.field ? null : col.field)}\n >\n <FilterIcon active={isFilterActive(col)} />\n </button>\n {openFilterField === col.field && filterRef && (\n <FilterPopover\n config={col.filter}\n onClose={() => setOpenFilterField(null)}\n anchorRef={filterRef}\n />\n )}\n </div>\n )}\n </span>\n </th>\n );\n })}\n {hasEditCol && <th className={`${styles.headerCell} ${styles.editCol}`} />}\n </tr>\n </thead>\n );\n\n // ── Render: a single body row ─────────────────────────────────────────────\n const renderBodyRow = useCallback((row: T, rowIndex: number, isOdd: boolean) => {\n const rowKey = getRowKey(row, dataKey);\n const selected = isSelected(row);\n const expanded = hasExpandCol && isExpanded(row);\n const isEditingRow = editMode === 'row' && editingRowKey === rowKey;\n\n const rowClass = [\n styles.bodyRow,\n selected ? styles.rowSelected : '',\n stripedRows && isOdd ? styles.rowStriped : '',\n selectionMode !== 'none' ? styles.rowClickable : '',\n ].filter(Boolean).join(' ');\n\n const cells = columns.map(col => {\n const isEditingCell = editMode === 'cell' && editingCell != null && editingCell.rowKey === rowKey && editingCell.field === col.field;\n const showEditor = isEditingRow || isEditingCell;\n\n let content: React.ReactNode;\n if (showEditor && col.editor) {\n content = col.editor(\n { ...row, ...editValues } as T,\n col.field,\n val => setEditValues(prev => ({ ...prev, [col.field]: val })),\n );\n } else if (showEditor) {\n content = (\n <input\n className={styles.cellInput}\n value={String(editValues[col.field] ?? getCellValue(row, col.field) ?? '')}\n onChange={e => setEditValues(prev => ({ ...prev, [col.field]: e.target.value }))}\n />\n );\n } else if (col.body) {\n content = col.body(row, rowIndex);\n } else {\n content = String(getCellValue(row, col.field) ?? '');\n }\n\n return (\n <td\n key={col.field}\n className={styles.bodyCell}\n style={{ textAlign: col.align ?? 'left' }}\n onClick={() => {\n if (editMode === 'cell' && col.editor && !isEditingCell) {\n if (editingCell) saveCellEdit(row, editingCell.field);\n startCellEdit(row, col.field);\n }\n }}\n >\n {isEditingCell ? (\n <div className={styles.cellEditWrap}>\n {content}\n <IconButton variant=\"ghost\" size=\"sm\" icon={<CheckSvg />} aria-label=\"Confirm edit\" onClick={e => { e.stopPropagation(); saveCellEdit(row, col.field); }} />\n <CloseButton size=\"sm\" aria-label=\"Cancel edit\" onClick={e => { e.stopPropagation(); setEditingCell(null); setEditValues({}); }} />\n </div>\n ) : content}\n </td>\n );\n });\n\n return (\n <>\n <tr\n key={String(rowKey)}\n className={rowClass}\n onClick={() => {\n if (selectionMode !== 'none') handleRowSelect(row);\n }}\n aria-selected={selectionMode !== 'none' ? selected : undefined}\n >\n {hasExpandCol && (\n <td className={`${styles.bodyCell} ${styles.expandCell}`}>\n <button\n type=\"button\"\n className={styles.expandBtn}\n onClick={e => { e.stopPropagation(); toggleExpand(row); }}\n aria-label={expanded ? 'Collapse row' : 'Expand row'}\n aria-expanded={expanded}\n >\n {expanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n </td>\n )}\n {hasSelectCol && (\n <td className={`${styles.bodyCell} ${styles.selectCell}`} onClick={e => e.stopPropagation()}>\n <Checkbox\n checked={selected}\n onChange={() => handleRowSelect(row)}\n aria-label=\"Select row\"\n size=\"sm\"\n />\n </td>\n )}\n {cells}\n {hasEditCol && (\n <td className={`${styles.bodyCell} ${styles.editCell}`} onClick={e => e.stopPropagation()}>\n {isEditingRow ? (\n <div className={styles.rowEditBtns}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<CheckSvg />} aria-label=\"Save row\" onClick={() => saveRowEdit(row)} />\n <CloseButton size=\"sm\" aria-label=\"Cancel edit\" onClick={cancelRowEdit} />\n </div>\n ) : (\n <IconButton variant=\"ghost\" size=\"sm\" icon={<PencilSvg />} aria-label=\"Edit row\" onClick={() => startRowEdit(row)} />\n )}\n </td>\n )}\n </tr>\n\n {/* Expansion row */}\n {hasExpandCol && expanded && expansion && (\n <tr key={`${String(rowKey)}-expansion`} className={styles.expansionRow}>\n <td colSpan={totalCols} className={styles.expansionCell}>\n {expansion.template ? (\n expansion.template(row)\n ) : expansion.childKey ? (\n <DataTable<T>\n data={(getCellValue(row, String(expansion.childKey)) as T[]) ?? []}\n columns={expansion.columns ?? columns}\n dataKey={dataKey}\n selectionMode={selectionMode}\n stripedRows={stripedRows}\n size={size}\n showFooter={showFooter}\n editMode={editMode}\n />\n ) : null}\n </td>\n </tr>\n )}\n </>\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columns, editingRowKey, editingCell, editValues, expandedKeys, selection, stripedRows, hasExpandCol, hasSelectCol, hasEditCol, selectionMode, editMode]);\n\n // ── Render: body ──────────────────────────────────────────────────────────\n const renderBody = () => {\n if (loading) {\n return (\n <tbody>\n {Array.from({ length: 5 }).map((_, i) => (\n <tr key={i} className={styles.bodyRow}>\n {Array.from({ length: totalCols }).map((__, j) => (\n <td key={j} className={styles.bodyCell}>\n <span className={styles.skeleton} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n }\n\n if (flatData.length === 0) {\n return (\n <tbody>\n <tr>\n <td colSpan={totalCols} className={styles.emptyCell}>\n {emptyMessage}\n </td>\n </tr>\n </tbody>\n );\n }\n\n if (grouped) {\n return (\n <tbody>\n {(data as DataTableGroup<T>[]).map(group => {\n const isGroupExpanded = expandedGroups.has(group.label);\n return (\n <>\n {/* Group header row */}\n <tr\n key={`group-${group.label}`}\n className={styles.groupRow}\n onClick={() => setExpandedGroups(prev => {\n const next = new Set(prev);\n next.has(group.label) ? next.delete(group.label) : next.add(group.label);\n return next;\n })}\n >\n <td colSpan={totalCols} className={styles.groupCell}>\n <span className={styles.groupToggle}>\n {isGroupExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </span>\n <span className={styles.groupLabel}>{group.label}</span>\n <span className={styles.groupCount}>({group.data.length})</span>\n </td>\n </tr>\n {/* Child rows */}\n {isGroupExpanded && group.data.map((row, i) => renderBodyRow(row, i, i % 2 !== 0))}\n </>\n );\n })}\n </tbody>\n );\n }\n\n return (\n <tbody>\n {(data as T[]).map((row, i) => renderBodyRow(row, i, i % 2 !== 0))}\n </tbody>\n );\n };\n\n // ── Render: footer ────────────────────────────────────────────────────────\n const renderFooter = () => {\n if (!showFooter) return null;\n const hasFooter = columns.some(col => col.footer !== undefined);\n if (!hasFooter) return null;\n return (\n <tfoot>\n <tr className={styles.footerRow}>\n {hasExpandCol && <td className={styles.footerCell} />}\n {hasSelectCol && <td className={styles.footerCell} />}\n {columns.map(col => (\n <td key={col.field} className={styles.footerCell} style={{ textAlign: col.align ?? 'left' }}>\n {typeof col.footer === 'function' ? col.footer(flatData) : col.footer}\n </td>\n ))}\n {hasEditCol && <td className={styles.footerCell} />}\n </tr>\n </tfoot>\n );\n };\n\n // ── Main render ───────────────────────────────────────────────────────────\n const tableClass = [\n styles.table,\n styles[size],\n stripedRows ? styles.striped : '',\n ].filter(Boolean).join(' ');\n\n const wrapClass = [\n styles.wrapper,\n scrollable ? styles.wrapperScrollable : '',\n className ?? '',\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapClass} style={style}>\n <div\n className={styles.scrollContainer}\n style={scrollable && scrollHeight ? { maxHeight: scrollHeight, overflowY: 'auto' } : undefined}\n >\n <table className={tableClass} role=\"grid\">\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </table>\n </div>\n {loading && <div className={styles.loadingOverlay} aria-busy=\"true\" aria-label=\"Loading\" />}\n </div>\n );\n}\n\nDataTable.displayName = 'DataTable';\n","import React from 'react';\nimport { TopBar } from '../TopBar/TopBar';\nimport { LoanBannerNav } from '../LoanBannerNav/LoanBannerNav';\nimport { URLATabsNav } from '../URLATabsNav/URLATabsNav';\nimport type { TopBarProps } from '../TopBar/TopBar';\nimport type { LoanBannerNavProps } from '../LoanBannerNav/LoanBannerNav';\nimport type { URLATabsNavProps } from '../URLATabsNav/URLATabsNav';\nimport styles from './FullNav.module.css';\n\nexport interface FullNavProps {\n topBar: TopBarProps;\n /** When provided → loan-file context: LoanBannerNav renders below TopBar */\n loanBannerNav?: LoanBannerNavProps;\n /** When provided → URLA section: URLATabsNav renders below LoanBannerNav */\n urlATabsNav?: URLATabsNavProps;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function FullNav({ topBar, loanBannerNav, urlATabsNav, className, style }: FullNavProps) {\n return (\n <div\n className={[styles.shell, className].filter(Boolean).join(' ')}\n style={style}\n >\n <TopBar {...topBar} />\n {loanBannerNav && <LoanBannerNav {...loanBannerNav} />}\n {urlATabsNav && <URLATabsNav {...urlATabsNav} />}\n </div>\n );\n}\n","import React from 'react';\nimport { TopBarMobile } from '../TopBar/TopBarMobile';\nimport { URLATabsNavMobile } from '../URLATabsNav/URLATabsNavMobile';\nimport type { TopBarMobileProps } from '../TopBar/TopBarMobile';\nimport type { URLATabsNavMobileProps } from '../URLATabsNav/URLATabsNavMobile';\nimport styles from './FullNav.module.css';\n\nexport interface FullNavMobileProps {\n topBar: TopBarMobileProps;\n /** URLA sub-nav — only renders when topBar.borrower is also set */\n urlATabsNavMobile?: URLATabsNavMobileProps;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function FullNavMobile({ topBar, urlATabsNavMobile, className, style }: FullNavMobileProps) {\n const showSubNav = !!topBar.borrower && !!urlATabsNavMobile;\n\n return (\n <div\n className={[styles.shell, className].filter(Boolean).join(' ')}\n style={style}\n >\n <TopBarMobile {...topBar} />\n {showSubNav && <URLATabsNavMobile {...urlATabsNavMobile!} />}\n </div>\n );\n}\n"],"names":["Checkbox","forwardRef","label","indeterminate","invalid","helperText","size","disabled","id","className","rest","forwardedRef","internalRef","useRef","resolvedRef","useEffect","wrapperClass","styles","jsxs","jsx","_idCounter","InputText","required","prefixIcon","suffixIcon","idProp","ref","rootClass","isGroupedOptions","options","ListBox","value","onChange","multiple","filter","filterPlaceholder","style","uid","useId","filterId","helperId","filterText","setFilterText","useState","selectedValues","useMemo","grouped","matchesFilter","optLabel","handleOptionClick","optionValue","next","v","renderOption","opt","isGroupItem","isSelected","isDisabled","optClasses","isCheckedDisabled","e","renderOptions","group","items","containerClasses","showHeader","RadioButton","MultiSelect","placeholder","showSelectAll","externalRef","dropdownId","triggerId","isOpen","setIsOpen","selectAllRef","setRef","node","selectableOptions","o","isAllSelected","isSomeSelected","handleOut","_a","handleKey","filteredOptions","q","toggleOpen","prev","toggleOption","optValue","removeValue","handleSelectAll","allVals","handleTriggerKeyDown","triggerClass","optClass","Select","triggerRef","dropdownRef","dropPos","setDropPos","selectedOption","target","_b","recompute","rect","selectOption","isFilled","chevronClass","createPortal","IconButton","icon","variant","cls","DAY_NAMES","MONTH_NAMES","formatDate","date","m","d","parseInputDate","text","match","month","day","year","isSameDay","a","b","isDateDisabled","minDate","maxDate","min","max","getCalendarWeeks","firstDay","lastDay","startDate","endDate","weeks","cur","week","i","getISOWeek","yearStart","getYearPageStart","CalendarIcon","ChevronLeft","ChevronRight","DatePicker","showWeekNumbers","inputId","view","setView","viewYear","setViewYear","viewMonth","setViewMonth","inputText","setInputText","inputRef","calendarRef","calPos","setCalPos","today","formatted","close","open","navPrev","y","navNext","selectDay","selectMonth","monthIdx","selectYear","handleToday","todayDate","handleClear","handleInputChange","parsed","handleInputKeyDown","dayCellClass","inCurrentMonth","classes","isToday","dayInnerClass","monthCellClass","yearCellClass","yearPageStart","yearPage","_","headerTitle","wi","di","name","idx","OptionContent","labelClassName","countClassName","badgeClassName","iconClassName","Fragment","SelectButton","handleSelect","sizeClass","isFirst","isLast","posClass","btnClass","rowClass","TextArea","rows","autoGrow","maxLength","defaultValue","charCount","setCharCount","el","handleChange","showCounter","outerClass","innerClass","ToggleSwitch","Button","leadingIcon","trailingIcon","badge","children","DropdownButton","onSelect","item","btnCls","CloseButton","ariaLabel","SplitButton","onAction","triggerAriaLabel","mainCls","triggerCls","getPageLinks","currentPage","totalPages","pageLinkSize","half","start","end","links","ChevronFirst","ChevronPrev","ChevronNext","ChevronLast","NavButton","onClick","selected","PageNav","onPage","link","Paginator","totalRecords","first","onPageChange","template","rowsPerPageOptions","goToPage","page","p","changeRows","newRows","rowsOptions","n","rangeStart","rangeEnd","containerClass","ChevronDoubleRight","ChevronDoubleLeft","SearchIcon","CloseIcon","ItemCheckbox","checked","CtrlBtn","Panel","header","selectedIds","onToggle","itemTemplate","filterValue","onFilterChange","showCheckbox","visible","Picklist","sourceItems","targetItems","sourceHeader","targetHeader","sourceFilterPlaceholder","targetFilterPlaceholder","showMoveAll","sourceSelected","setSourceSelected","targetSelected","setTargetSelected","sourceFilter","setSourceFilter","targetFilter","setTargetFilter","toggleSource","toggleTarget","moveSelectedToTarget","moving","remaining","moveAllToTarget","movable","moveSelectedToSource","moveAllToSource","hasSourceSelected","hasTargetSelected","hasSourceMovable","hasTargetMovable","Card","title","subTitle","footer","interactive","hasCaption","Accordion","openIds","handleToggle","x","headerId","panelId","useBadge","useChevronAngle","Tabs","tabs","activeTab","activeItem","t","isNav","Root","tab","isActive","tabId","COLOR_MAP","BORDER_MAP","StatusIndicator","shape","color","fill","border","BADGE_DEFAULTS_GROUP0","BADGE_DEFAULTS_GROUP_N","BADGE_ZERO_COLOR","TabBadge","count","tooltip","diamondGroup0","bg","numColor","BannerTabs","activeId","trackRef","showLeft","setShowLeft","showRight","setShowRight","updateArrows","useCallback","ro","scrollBy","direction","gi","bi","def","resolvedShape","Drawer","onClose","subtitle","primaryAction","secondaryAction","tertiaryActions","side","width","bodyRef","showFooterShadow","setShowFooterShadow","handler","checkScroll","hasMoreBelow","raf","panelClass","overlayClass","action","listeners","_items","emit","l","removeItem","addItem","severity","detail","opts","toast","SEVERITY_CONFIG","SEVERITY_FALLBACKS","ToastItemView","layout","exiting","cfg","fb","descId","isVertical","cssVars","Toaster","setItems","Toast","ProgressBar","error","errorMessage","clamped","pct","clearLogo","SIZE_CONFIG","ProgressSpinner","theme","gradId","px","r","sw","circumference","arcLength","gapLength","isLg","CONFIG","MiscChip","dismissible","onDismiss","SeverityChip","ProfileChip","leading","trailing","DOT_CONFIG","AUSChip","BannerAlert","closable","InlineContainedAlert","message","InlineAlert","DEFAULT_DOC_TYPES","DEFAULT_ACCEPT","isValidFile","file","accept","ext","FileUpload","onFilesAdded","onUpload","docTypes","initialFiles","isDragOver","setIsDragOver","setError","canUpload","docTypeOptions","processFiles","files","valid","f","newItems","handleDragOver","handleDragLeave","handleDrop","handleZoneClick","updateDocType","docType","handleUpload","Tooltip","content","placement","delay","maxWidth","setVisible","timerRef","tooltipId","show","hide","tooltipClass","Modal","scrim","ARROW_H","Popup","trigger","align","pos","setPos","calculatePos","centerX","left","arrowLeft","useLayoutEffect","SidePanel","onSave","headerContent","isCompact","actions","SidePanelLayout","panelWidth","ArrowRight","ReplayIcon","UserIcon","PlusCircle","SortIcon","ChevronDown","ApplicantSelector","applicants","selectedApplicantId","onApplicantChange","onAddApplicant","height","setOpen","wrapRef","SortButton","sortItems","onSortSelect","sizeStyle","URLATabsNav","props","activeTabId","onTabChange","onNextValidation","nextValidationBadge","onBackToAUS","URLATabsNavTablet","borrowerName","onLoanDetailsClick","tabStripBadge","SectionDropdown","ActionsButton","TabDropdown","URLATabsNavMobile","sectionLabel","sectionItems","onSectionSelect","onSectionSort","actionItems","onActionSelect","logoUrl","cx","DropdownPanel","NavItem","_id","isPrimary","handleClickOutside","handleKeyDown","getInitials","words","ProfileButton","profile","initials","TopBar","version","navItems","onSearch","searchPlaceholder","logoClipUrl","MobileProfileButton","TopBarMobile","borrower","onMenuOpen","onSearchOpen","isUrla","LightningButton","containerRef","HamburgerIcon","RefreshIcon","ChevronRightIcon","ChevronLeftIcon","NavChevronDown","NavBadgeDropdown","renderAction","isIconOnly","LoanBannerNav","onMenuToggle","secondaryActions","onRefresh","primaryLabel","onPrimary","primaryItems","onPrimarySelect","condition","toolbar","banner","collapsed","collapsedSection","onCollapsedBack","onExpandTabs","collapsedQuickItems","onCollapsedQuickAction","dotClass","primaryEl","fullRightActions","collapsedRightActions","RemoveIcon","parseISODate","s","toISODate","TEXT_MATCH_MODES","DATE_MATCH_MODES","VALUELESS_MODES","RuleFilter","dataType","onApply","onReset","matchModes","defaultMode","rules","setRules","operator","setOperator","updateRule","patch","addRule","removeRule","rule","FilterFooter","ChecklistFilter","setSelected","search","setSearch","filtered","allSelected","partialSelected","toggle","toggleAll","GroupedChecklistFilter","groups","clearGroup","FilterPopover","config","anchorRef","panelRef","anchor","POPOVER_W","POPOVER_H","top","handleReset","isGroupedData","data","getRowKey","row","dataKey","getCellValue","field","SortAscIcon","SortDescIcon","SortNeutralIcon","FilterIcon","active","ChevronDownIcon","CheckSvg","PencilSvg","DataTable","columns","selectionMode","selection","onSelectionChange","sortMode","sortField","sortOrder","multiSortMeta","onSort","expansion","editMode","onRowEditSave","onRowEditCancel","onCellEdit","stripedRows","showFooter","loading","emptyMessage","scrollable","scrollHeight","expandedKeys","setExpandedKeys","expandedGroups","setExpandedGroups","g","editingRowKey","setEditingRowKey","editingCell","setEditingCell","editValues","setEditValues","openFilterField","setOpenFilterField","filterBtnRefs","flatData","hasExpandCol","hasSelectCol","hasEditCol","totalCols","getSortOrder","getSortPriority","handleSort","meta","existing","key","handleRowSelect","arr","someSelected","toggleExpand","isExpanded","startRowEdit","vals","col","saveRowEdit","updated","cancelRowEdit","startCellEdit","saveCellEdit","getFilterBtnRef","isFilterActive","renderHeader","order","priority","filterRef","renderBodyRow","rowIndex","isOdd","rowKey","expanded","isEditingRow","cells","isEditingCell","showEditor","val","renderBody","__","j","isGroupExpanded","renderFooter","tableClass","wrapClass","FullNav","topBar","loanBannerNav","urlATabsNav","FullNavMobile","urlATabsNavMobile","showSubNav"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/Checkbox/Checkbox.tsx","../src/components/InputText/InputText.tsx","../src/components/ListBox/ListBox.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/MiscChip/MiscChip.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/Select/Select.tsx","../src/components/IconButton/IconButton.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/Calendar/Calendar.tsx","../src/components/SelectButton/SelectButton.tsx","../src/components/TextArea/TextArea.tsx","../src/components/ToggleSwitch/ToggleSwitch.tsx","../src/components/Button/Button.tsx","../src/components/DropdownButton/DropdownButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/SplitButton/SplitButton.tsx","../src/components/Paginator/Paginator.tsx","../src/components/Picklist/Picklist.tsx","../src/components/Card/Card.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Tabs/Tabs.tsx","../src/components/BannerTabs/BannerTabs.tsx","../src/components/Drawer/Drawer.tsx","../src/components/Toast/Toast.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/ProgressSpinner/clear-logo.png","../src/components/ProgressSpinner/ProgressSpinner.tsx","../src/components/SeverityChip/SeverityChip.tsx","../src/components/ProfileChip/ProfileChip.tsx","../src/components/AUSChip/AUSChip.tsx","../src/components/Alert/BannerAlert.tsx","../src/components/Alert/InlineContainedAlert.tsx","../src/components/Alert/InlineAlert.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Modal/Modal.tsx","../src/components/Popup/Popup.tsx","../src/components/SidePanel/SidePanel.tsx","../src/components/SidePanel/SidePanelLayout.tsx","../src/components/URLATabsNav/_internal.tsx","../src/components/URLATabsNav/URLATabsNav.tsx","../src/components/URLATabsNav/URLATabsNavTablet.tsx","../src/components/URLATabsNav/URLATabsNavMobile.tsx","../src/components/TopBar/clear-logo.png","../src/components/TopBar/TopBar.tsx","../src/components/TopBar/clear-logo-clip.png","../src/components/TopBar/TopBarMobile.tsx","../src/components/LightningButton/LightningButton.tsx","../src/components/LoanBannerNav/LoanBannerNav.tsx","../src/components/DataTable/DataTableFilter.tsx","../src/components/DataTable/DataTable.tsx","../src/components/FullNav/FullNav.tsx","../src/components/FullNav/FullNavMobile.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef } from 'react';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'size'> {\n /** The visible label next to the checkbox. */\n label?: React.ReactNode;\n /** When true, renders a dash instead of a checkmark (useful for \"select all\" patterns). */\n indeterminate?: boolean;\n /** Shows the invalid/error state with red border and label. */\n invalid?: boolean;\n /** Helper text shown below the checkbox. Shown in red when `invalid` is true. */\n helperText?: string;\n /** Size variant. sm = 14px box / 10px label, md = 18px box / 12px label (default), lg = 22px box / 14px label. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Checkbox — Clear Design System\n *\n * A fully accessible checkbox with label, indeterminate, invalid, and disabled states.\n * Three sizes (sm, md, lg) follow the type scale.\n *\n * @example\n * <Checkbox label=\"Remember me\" />\n *\n * @example\n * <Checkbox label=\"Agree to terms\" checked={agreed} onChange={(e) => setAgreed(e.target.checked)} />\n *\n * @example\n * <Checkbox label=\"Select all\" indeterminate />\n *\n * @example\n * <Checkbox label=\"Accept terms\" invalid helperText=\"You must accept the terms to continue.\" />\n *\n * @example\n * <Checkbox label=\"Dense option\" size=\"sm\" />\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n indeterminate = false,\n invalid = false,\n helperText,\n size = 'md',\n disabled = false,\n id,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n useEffect(() => {\n if (resolvedRef.current) {\n resolvedRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate, resolvedRef]);\n\n const wrapperClass = [\n styles.wrapper,\n styles[size],\n disabled ? styles.disabled : '',\n invalid ? styles.invalid : '',\n indeterminate ? styles.indeterminate : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div>\n <label className={wrapperClass} htmlFor={id}>\n <input\n ref={resolvedRef}\n type=\"checkbox\"\n id={id}\n disabled={disabled}\n className={styles.input}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n\n <span className={styles.box} aria-hidden=\"true\">\n <svg className={styles.checkmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n <span className={styles.dash} />\n </span>\n\n {label && <span className={styles.label}>{label}</span>}\n </label>\n\n {helperText && (\n <span className={invalid ? styles.errorText : styles.helperText}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef } from 'react';\nimport styles from './InputText.module.css';\n\nexport interface InputTextProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Field label displayed above the input. */\n label?: string;\n /** Appends a red asterisk to the label and sets `aria-required`. */\n required?: boolean;\n /** Helper or error text shown below the input. */\n helperText?: string;\n /** Triggers the error/invalid visual state with red styling. */\n invalid?: boolean;\n /** Size variant. Affects label size, input font size, and padding. */\n size?: 'sm' | 'md' | 'lg';\n /** Icon or element rendered to the left of the input text. */\n prefixIcon?: React.ReactNode;\n /** Icon or element rendered to the right of the input text. */\n suffixIcon?: React.ReactNode;\n /** Associates the label `htmlFor` and input `id`. Auto-generated if not provided. */\n id?: string;\n}\n\nlet _idCounter = 0;\n\n/**\n * InputText — Clear Design System\n *\n * A text input with label, helper text, prefix/suffix icon slots, and full state support.\n * Sizes follow the type scale (sm=10px, md=12px, lg=14px).\n *\n * @example\n * // Basic\n * <InputText label=\"Search\" placeholder=\"Enter a keyword\" />\n *\n * @example\n * // Required with helper text\n * <InputText label=\"Email\" required helperText=\"We'll never share your email.\" />\n *\n * @example\n * // Invalid / error state\n * <InputText label=\"Email\" invalid helperText=\"Please enter a valid email address.\" />\n *\n * @example\n * // With icons\n * <InputText\n * label=\"Search\"\n * prefixIcon={<i className=\"pi pi-search\" />}\n * suffixIcon={<i className=\"pi pi-times\" />}\n * />\n *\n * @example\n * // Large size\n * <InputText label=\"Full name\" size=\"lg\" placeholder=\"Jane Smith\" />\n */\nexport const InputText = forwardRef<HTMLInputElement, InputTextProps>(\n (\n {\n label,\n required = false,\n helperText,\n invalid = false,\n size = 'md',\n prefixIcon,\n suffixIcon,\n disabled = false,\n id: idProp,\n className,\n ...rest\n },\n ref,\n ) => {\n // Stable id for label↔input association\n const id = idProp ?? `inputtext-${++_idCounter}`;\n\n const rootClass = [\n styles.root,\n styles[size],\n invalid ? styles.invalid : '',\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass}>\n {label && (\n <label className={styles.labelRow} htmlFor={id}>\n <span className={styles.labelText}>{label}</span>\n {required && (\n <span className={styles.requiredMark} aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n <div className={styles.inputWrap}>\n {prefixIcon && (\n <span className={styles.iconSlot} aria-hidden=\"true\">\n {prefixIcon}\n </span>\n )}\n\n <input\n ref={ref}\n id={id}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? `${id}-helper` : undefined}\n className={styles.nativeInput}\n {...rest}\n />\n\n {suffixIcon && (\n <span className={`${styles.iconSlot} ${styles.iconSlotSuffix}`} aria-hidden=\"true\">\n {suffixIcon}\n </span>\n )}\n </div>\n\n {helperText && (\n <span id={`${id}-helper`} className={styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n );\n },\n);\n\nInputText.displayName = 'InputText';\n","import { forwardRef, useId, useState, useMemo } from 'react';\nimport styles from './ListBox.module.css';\n\nexport interface ListBoxOption {\n /** Displayed text. */\n label: string;\n /** Unique identifier used for selection state. */\n value: string;\n /** When true, this individual option is non-interactive. */\n disabled?: boolean;\n}\n\nexport interface ListBoxOptionGroup {\n /** Bold, non-selectable group header. */\n label: string;\n /** Selectable options nested under this group. */\n items: ListBoxOption[];\n}\n\nfunction isGroupedOptions(\n options: ListBoxOption[] | ListBoxOptionGroup[],\n): options is ListBoxOptionGroup[] {\n return options.length > 0 && 'items' in options[0];\n}\n\nexport interface ListBoxProps {\n /**\n * Flat list of options or grouped option sets.\n * Groups are detected automatically when each entry contains an `items` array.\n */\n options: ListBoxOption[] | ListBoxOptionGroup[];\n /**\n * Controlled selection. Pass a `string` for single-select or `string[]` for\n * multi-select. Pass `null` / `[]` to clear.\n */\n value?: string | string[] | null;\n /** Called when the user clicks an option. */\n onChange?: (value: string | string[] | null) => void;\n /** When true, renders a checkbox per option and allows multiple selection. */\n multiple?: boolean;\n /** When true, shows a search input above the option list. */\n filter?: boolean;\n /** Placeholder text for the search input. Defaults to \"Search…\". */\n filterPlaceholder?: string;\n /** Label rendered above the filter input. Only visible when `filter` is true or a label/helperText is provided. */\n label?: string;\n /** Adds a red asterisk to the label and sets `aria-required` on the filter input. */\n required?: boolean;\n /** Helper text rendered below the filter input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders a red border to signal a validation error. */\n invalid?: boolean;\n /** Disables the entire component — no interaction, muted colours. */\n disabled?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * ListBox — Clear Design System\n *\n * A scrollable list that lets users select one or more values. Supports\n * single-select, multi-select (checkboxes), a filter/search header, and\n * grouped option sets with bold group headers.\n *\n * @example\n * <ListBox options={items} value={val} onChange={setVal} />\n *\n * @example\n * <ListBox multiple options={items} value={vals} onChange={setVals} />\n *\n * @example\n * <ListBox multiple filter label=\"Loan Type\" options={items} value={vals} onChange={setVals} />\n *\n * @example\n * <ListBox multiple options={groupedItems} value={vals} onChange={setVals} />\n */\nexport const ListBox = forwardRef<HTMLDivElement, ListBoxProps>(\n (\n {\n options,\n value,\n onChange,\n multiple = false,\n filter = false,\n filterPlaceholder = 'Search\\u2026',\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n className,\n style,\n },\n ref,\n ) => {\n const uid = useId();\n const filterId = `${uid}-filter`;\n const helperId = `${uid}-helper`;\n const [filterText, setFilterText] = useState('');\n\n const selectedValues = useMemo<string[]>(() => {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const grouped = isGroupedOptions(options);\n\n function matchesFilter(optLabel: string): boolean {\n if (!filter || !filterText) return true;\n return optLabel.toLowerCase().includes(filterText.toLowerCase());\n }\n\n function handleOptionClick(optionValue: string) {\n if (disabled) return;\n if (multiple) {\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue];\n onChange?.(next);\n } else {\n onChange?.(selectedValues[0] === optionValue ? null : optionValue);\n }\n }\n\n function renderOption(opt: ListBoxOption, isGroupItem = false) {\n if (!matchesFilter(opt.label)) return null;\n\n const isSelected = selectedValues.includes(opt.value);\n const isDisabled = disabled || opt.disabled;\n\n const optClasses = [\n styles.option,\n isSelected ? styles.optionHighlight : '',\n isDisabled ? styles.optionDisabled : '',\n isGroupItem ? styles.optionGroupItem : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const isCheckedDisabled = isSelected && isDisabled;\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || undefined}\n className={optClasses}\n onClick={() => !isDisabled && handleOptionClick(opt.value)}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (!isDisabled) handleOptionClick(opt.value);\n }\n }}\n >\n {multiple && (\n <span\n aria-hidden=\"true\"\n className={[\n styles.checkbox,\n isSelected && !isDisabled ? styles.checkboxChecked : '',\n isDisabled ? styles.checkboxDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {isSelected && (\n <svg\n className={\n isCheckedDisabled\n ? `${styles.checkmark} ${styles.checkmarkDisabled}`\n : styles.checkmark\n }\n viewBox=\"0 0 11 11\"\n >\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n </span>\n )}\n\n <span\n className={\n isDisabled\n ? `${styles.optionLabel} ${styles.optionLabelDisabled}`\n : styles.optionLabel\n }\n >\n {opt.label}\n </span>\n </div>\n );\n }\n\n function renderOptions() {\n if (grouped) {\n return (options as ListBoxOptionGroup[]).map((group) => {\n const items = group.items\n .map((opt) => renderOption(opt, true))\n .filter(Boolean);\n if (items.length === 0) return null;\n return (\n <div key={group.label}>\n <div className={styles.groupHeader}>{group.label}</div>\n {items}\n </div>\n );\n });\n }\n return (options as ListBoxOption[]).map((opt) => renderOption(opt));\n }\n\n const containerClasses = [\n styles.listbox,\n invalid ? styles.invalid : '',\n disabled ? styles.listboxDisabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const showHeader = filter || !!(label || helperText);\n\n return (\n <div ref={ref} className={containerClasses} style={style}>\n {showHeader && (\n <div className={styles.header}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={filterId}>\n {label}\n </label>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n {filter && (\n <div className={styles.inputWrap}>\n <input\n id={filterId}\n type=\"text\"\n className={styles.filterInput}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={(e) => setFilterText(e.target.value)}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n />\n {filterText ? (\n <button\n type=\"button\"\n className={styles.iconButton}\n onClick={() => setFilterText('')}\n aria-label=\"Clear filter\"\n tabIndex={-1}\n disabled={disabled}\n >\n <svg viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 5L9 9M9 5L5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : (\n <span className={styles.iconSearch} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9.5 9.5L12.5 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n )}\n </div>\n )}\n\n {helperText && (\n <span\n id={helperId}\n className={invalid ? styles.errorText : styles.helperText}\n >\n {helperText}\n </span>\n )}\n </div>\n )}\n\n <div\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-disabled={disabled || undefined}\n className={styles.list}\n >\n {renderOptions()}\n </div>\n </div>\n );\n },\n);\n\nListBox.displayName = 'ListBox';\n","import { forwardRef, useRef } from 'react';\nimport styles from './RadioButton.module.css';\n\nexport interface RadioButtonProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'size'> {\n /** The visible label next to the radio button. */\n label?: React.ReactNode;\n /** Shows the invalid/error state with red border and label. */\n invalid?: boolean;\n /** Helper text shown below the radio button. Shown in red when `invalid` is true. */\n helperText?: string;\n /** Size variant. sm = 14px / md = 18px (default) / lg = 22px. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * RadioButton — Clear Design System\n *\n * A fully accessible radio button with label, invalid, and disabled states.\n * Three sizes (sm, md, lg) follow the type scale. Group multiple RadioButtons\n * under a shared `name` prop so the browser enforces single selection.\n *\n * @example\n * <RadioButton name=\"plan\" value=\"basic\" label=\"Basic\" />\n *\n * @example\n * <RadioButton name=\"plan\" value=\"pro\" label=\"Pro\" checked onChange={handleChange} />\n *\n * @example\n * <RadioButton name=\"plan\" value=\"enterprise\" label=\"Enterprise\" invalid helperText=\"Contact sales first.\" />\n *\n * @example\n * <RadioButton name=\"plan\" value=\"basic\" label=\"Small\" size=\"sm\" />\n */\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\n (\n {\n label,\n invalid = false,\n helperText,\n size = 'md',\n disabled = false,\n id,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n const wrapperClass = [\n styles.wrapper,\n styles[size],\n disabled ? styles.disabled : '',\n invalid ? styles.invalid : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div>\n <label className={wrapperClass} htmlFor={id}>\n <input\n ref={resolvedRef}\n type=\"radio\"\n id={id}\n disabled={disabled}\n className={styles.input}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n\n <span className={styles.circle} aria-hidden=\"true\">\n <span className={styles.dot} />\n </span>\n\n {label && <span className={styles.label}>{label}</span>}\n </label>\n\n {helperText && (\n <span className={invalid ? styles.errorText : styles.helperText}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nRadioButton.displayName = 'RadioButton';\n","import styles from './MiscChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type MiscChipColor =\n | 'red-darkest' | 'red-light'\n | 'yellow-darkest' | 'yellow-dark' | 'yellow-light'\n | 'green-darkest' | 'green-dark' | 'green-light'\n | 'blue-darkest' | 'blue-dark' | 'blue-light'\n | 'navy';\n\nexport interface MiscChipProps {\n label: string;\n color: MiscChipColor;\n /**\n * Whether the dismiss (✕) button is shown.\n * @default true\n */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n// ─── Color config (all map to existing tokens) ────────────────────────────────\n\nconst CONFIG: Record<MiscChipColor, { bgVar: string; bg: string; textVar?: string; text: string }> = {\n 'red-darkest': { bgVar: '--red-800', bg: '#990D03', text: '#ffffff' },\n 'red-light': { bgVar: '--red-200', bg: '#FFB8B3', textVar: '--red-900', text: '#630700' },\n 'yellow-darkest': { bgVar: '--yellow-800', bg: '#695D05', text: '#ffffff' },\n 'yellow-dark': { bgVar: '--yellow-400', bg: '#FCE53C', textVar: '--yellow-900', text: '#514908' },\n 'yellow-light': { bgVar: '--yellow-100', bg: '#FEF5B3', textVar: '--yellow-900', text: '#514908' },\n 'green-darkest': { bgVar: '--green-800', bg: '#174510', text: '#ffffff' },\n 'green-dark': { bgVar: '--green-400', bg: '#4B9C3E', text: '#ffffff' },\n 'green-light': { bgVar: '--green-200', bg: '#9BD491', textVar: '--green-900', text: '#11340B' },\n 'blue-darkest': { bgVar: '--blue-800', bg: '#204887', text: '#ffffff' },\n 'blue-dark': { bgVar: '--blue-400', bg: '#609AF8', text: '#ffffff' },\n 'blue-light': { bgVar: '--blue-200', bg: '#ABC9FB', textVar: '--blue-900', text: '#183462' },\n 'navy': { bgVar: '--navy-300', bg: '#70777D', text: '#ffffff' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function MiscChip({ label, color, dismissible = true, onDismiss }: MiscChipProps) {\n const cfg = CONFIG[color];\n\n const cssVars = {\n '--c-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--c-text': cfg.textVar ? `var(${cfg.textVar}, ${cfg.text})` : cfg.text,\n } as React.CSSProperties;\n\n return (\n <span className={styles.chip} style={cssVars}>\n <span className={styles.label}>{label}</span>\n {dismissible && (\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label={`Remove ${label}`}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n}\n\nMiscChip.displayName = 'MiscChip';\n","import { forwardRef, useRef, useState, useEffect, useMemo, useId } from 'react';\nimport type { ReactNode } from 'react';\nimport { MiscChip } from '../MiscChip';\nimport type { MiscChipColor } from '../MiscChip';\nimport styles from './MultiSelect.module.css';\n\nexport interface MultiSelectOption {\n /** Displayed text. */\n label: string;\n /** Unique identifier used in the value array. */\n value: string;\n /** When true, this option cannot be toggled. */\n disabled?: boolean;\n /**\n * When set, the option is rendered as a MiscChip in the dropdown row and the\n * trigger pill, using the given color. Mirrors the production \"tag picker\"\n * pattern where each option carries its own color.\n */\n chip?: { color: MiscChipColor };\n}\n\nexport interface MultiSelectProps {\n /** List of options to display in the dropdown. */\n options: MultiSelectOption[];\n /** Controlled array of selected values. */\n value?: string[];\n /** Called when the selection changes. */\n onChange?: (value: string[]) => void;\n /** Placeholder shown in the trigger when nothing is selected. */\n placeholder?: string;\n /** Label shown above the trigger input. */\n label?: string;\n /** Adds a red asterisk to the label and sets aria-required. */\n required?: boolean;\n /** Helper text shown below the trigger input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the trigger with a red border and turns the helper text red. */\n invalid?: boolean;\n /** Disables the entire component — trigger and dropdown are non-interactive. */\n disabled?: boolean;\n /**\n * When true (default), shows a search input in the dropdown header\n * that filters the option list in real time.\n */\n filter?: boolean;\n /** Placeholder for the search input. Defaults to \"Search…\". */\n filterPlaceholder?: string;\n /**\n * When true (default), shows a \"Select all\" checkbox in the dropdown header.\n * The checkbox is indeterminate when some (but not all) options are selected.\n */\n showSelectAll?: boolean;\n /** Size variant that controls font size and trigger padding. sm = 10px / md = 12px (default) / lg = 14px. */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Optional content rendered as a sticky bottom row of the dropdown\n * (e.g., a \"Modify Tags\" action link). Mirrors PrimeNG's `footerTemplate`.\n */\n footer?: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * MultiSelect — Clear Design System\n *\n * A dropdown that lets users select multiple values via checkboxes.\n * Selected items appear as chips in the trigger. Supports live search/filter\n * and a \"Select all\" toggle. Three sizes follow the type scale.\n *\n * @example\n * <MultiSelect options={items} value={vals} onChange={setVals} label=\"Loan types\" />\n *\n * @example\n * <MultiSelect options={items} value={vals} onChange={setVals} required invalid helperText=\"Select at least one.\" />\n *\n * @example\n * <MultiSelect options={items} value={vals} onChange={setVals} filter={false} showSelectAll={false} />\n */\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = 'Select options\\u2026',\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n filter = true,\n filterPlaceholder = 'Search\\u2026',\n showSelectAll = true,\n size = 'md',\n footer,\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const dropdownId = `${uid}-dropdown`;\n const triggerId = `${uid}-trigger`;\n const helperId = `${uid}-helper`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [filterText, setFilterText] = useState('');\n\n const internalRef = useRef<HTMLDivElement>(null);\n const selectAllRef = useRef<HTMLInputElement>(null);\n\n // Merge external and internal refs on the root element\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const selectedValues = value ?? [];\n\n const selectableOptions = useMemo(() => options.filter(o => !o.disabled), [options]);\n const isAllSelected = selectableOptions.length > 0 && selectableOptions.every(o => selectedValues.includes(o.value));\n const isNoneSelected = !selectableOptions.some(o => selectedValues.includes(o.value));\n const isSomeSelected = !isNoneSelected && !isAllSelected;\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) {\n setIsOpen(false);\n setFilterText('');\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Sync select-all indeterminate state\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = isSomeSelected;\n }\n }, [isSomeSelected]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n const filteredOptions = useMemo(() => {\n if (!filter || !filterText) return options;\n const q = filterText.toLowerCase();\n return options.filter(o => o.label.toLowerCase().includes(q));\n }, [options, filter, filterText]);\n\n function toggleOpen() {\n if (disabled) return;\n setIsOpen(prev => {\n if (prev) setFilterText('');\n return !prev;\n });\n }\n\n function toggleOption(optValue: string) {\n const next = selectedValues.includes(optValue)\n ? selectedValues.filter(v => v !== optValue)\n : [...selectedValues, optValue];\n onChange?.(next);\n }\n\n function removeValue(optValue: string) {\n onChange?.(selectedValues.filter(v => v !== optValue));\n }\n\n function handleSelectAll() {\n const allVals = selectableOptions.map(o => o.value);\n if (isAllSelected) {\n onChange?.(selectedValues.filter(v => !allVals.includes(v)));\n } else {\n onChange?.([...new Set([...selectedValues, ...allVals])]);\n }\n }\n\n function handleTriggerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleOpen(); }\n else if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n else if (e.key === 'ArrowDown' && !isOpen) { e.preventDefault(); setIsOpen(true); }\n }\n\n const rootClass = [styles.root, styles[size], disabled ? styles.rootDisabled : '', className ?? '']\n .filter(Boolean).join(' ');\n\n const triggerClass = [\n styles.trigger,\n isOpen ? styles.triggerOpen : '',\n invalid ? styles.triggerInvalid : '',\n disabled ? styles.triggerDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {/* ── Field (label + trigger + helper) ── */}\n <div className={styles.field}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={triggerId}>{label}</label>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n id={triggerId}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={dropdownId}\n aria-required={required || undefined}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n className={triggerClass}\n onClick={toggleOpen}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={styles.triggerContent}>\n {selectedValues.length === 0 ? (\n <span className={styles.placeholder}>{placeholder}</span>\n ) : (\n <span className={styles.chips}>\n {selectedValues.map(v => {\n const opt = options.find(o => o.value === v);\n if (!opt) return null;\n if (opt.chip) {\n return (\n <span\n key={v}\n onMouseDown={e => e.stopPropagation()}\n onClick={e => e.stopPropagation()}\n >\n <MiscChip\n label={opt.label}\n color={opt.chip.color}\n dismissible={!disabled}\n onDismiss={() => removeValue(v)}\n />\n </span>\n );\n }\n return (\n <span key={v} className={styles.chip}>\n <span className={styles.chipLabel}>{opt.label}</span>\n {!disabled && (\n <button\n type=\"button\"\n className={styles.chipRemove}\n onMouseDown={e => e.stopPropagation()}\n onClick={e => { e.stopPropagation(); removeValue(v); }}\n aria-label={`Remove ${opt.label}`}\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </span>\n );\n })}\n </span>\n )}\n </span>\n\n <span className={styles.chevron} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 8\" fill=\"none\">\n <path d=\"M1 1l6 6 6-6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n {helperText && (\n <span id={helperId} className={invalid ? styles.errorText : styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n\n {/* ── Dropdown overlay ── */}\n {isOpen && (\n <div id={dropdownId} role=\"listbox\" aria-multiselectable=\"true\" className={styles.dropdown}>\n {/* Header */}\n <div className={styles.dropdownHeader}>\n {showSelectAll && (\n <span\n className={styles.selectAllWrap}\n onClick={handleSelectAll}\n aria-label=\"Select all\"\n role=\"checkbox\"\n aria-checked={isAllSelected ? true : isSomeSelected ? 'mixed' : false}\n tabIndex={0}\n onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleSelectAll(); } }}\n >\n <input ref={selectAllRef} type=\"checkbox\" className={styles.hiddenInput} checked={isAllSelected} onChange={handleSelectAll} />\n <span\n aria-hidden=\"true\"\n className={[\n styles.cbBox,\n isAllSelected ? styles.cbChecked : '',\n isSomeSelected ? styles.cbIndeterminate : '',\n ].filter(Boolean).join(' ')}\n >\n {isAllSelected && (\n <svg className={styles.cbCheckmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n {isSomeSelected && <span className={styles.cbDash} />}\n </span>\n </span>\n )}\n\n {filter && (\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L12.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <input\n type=\"text\"\n className={styles.searchInput}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={e => setFilterText(e.target.value)}\n aria-label=\"Filter options\"\n autoComplete=\"off\"\n />\n {filterText && (\n <button\n type=\"button\"\n className={styles.searchClear}\n onClick={() => setFilterText('')}\n aria-label=\"Clear filter\"\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 5l4 4M9 5l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Options */}\n <div className={styles.optionList}>\n {filteredOptions.length === 0 ? (\n <div className={styles.noResults}>No results</div>\n ) : (\n filteredOptions.map(opt => {\n const isSelected = selectedValues.includes(opt.value);\n const isDisabled = opt.disabled;\n const optClass = [\n styles.option,\n isSelected ? styles.optionHighlight : '',\n isDisabled ? styles.optionDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || undefined}\n className={optClass}\n onClick={() => !isDisabled && toggleOption(opt.value)}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !isDisabled) {\n e.preventDefault();\n toggleOption(opt.value);\n }\n }}\n >\n <span\n aria-hidden=\"true\"\n className={[\n styles.optionCb,\n isSelected ? styles.optionCbChecked : '',\n ].filter(Boolean).join(' ')}\n >\n {isSelected && (\n <svg className={styles.optionCbCheckmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n </span>\n {opt.chip ? (\n <span className={styles.optionChipWrap}>\n <MiscChip label={opt.label} color={opt.chip.color} dismissible={false} />\n </span>\n ) : (\n <span className={isSelected ? `${styles.optionLabel} ${styles.optionLabelHighlight}` : styles.optionLabel}>\n {opt.label}\n </span>\n )}\n </div>\n );\n })\n )}\n </div>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n )}\n </div>\n );\n },\n);\n\nMultiSelect.displayName = 'MultiSelect';\n","import { forwardRef, useRef, useState, useEffect, useLayoutEffect, useMemo, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport styles from './Select.module.css';\n\nexport interface SelectOption {\n /** Displayed text. */\n label: string;\n /** Unique identifier used for the value. */\n value: string;\n /** When true, this option cannot be selected. */\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /** List of options to display in the dropdown. */\n options: SelectOption[];\n /** Controlled selected value. Pass `null` to clear. */\n value?: string | null;\n /** Called when the user selects an option. Receives `null` when cleared. */\n onChange?: (value: string | null) => void;\n /** Placeholder shown in the trigger when nothing is selected. */\n placeholder?: string;\n /** Label shown above the trigger input. */\n label?: string;\n /** Adds a red asterisk to the label and sets aria-required. */\n required?: boolean;\n /** Helper text shown below the trigger input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the trigger with a red border, red text, and red helper text. */\n invalid?: boolean;\n /** Disables the entire component — non-interactive and visually muted. */\n disabled?: boolean;\n /**\n * When true, shows a search input at the top of the dropdown\n * that filters the option list in real time.\n */\n filter?: boolean;\n /** Placeholder for the search input. Defaults to \"Search…\". */\n filterPlaceholder?: string;\n /** Size variant. sm = 10px / md = 12px (default) / lg = 14px. */\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Select — Clear Design System\n *\n * A single-value dropdown. Selecting an option closes the dropdown immediately.\n * Supports an optional live-search filter, three sizes, and full state coverage:\n * idle, hover, active/open, filled, invalid, and disabled.\n *\n * @example\n * <Select options={opts} value={val} onChange={setVal} label=\"Loan type\" />\n *\n * @example\n * <Select options={opts} value={val} onChange={setVal} required invalid helperText=\"Required.\" />\n *\n * @example\n * <Select options={opts} value={val} onChange={setVal} filter size=\"lg\" />\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = 'Select\\u2026',\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n filter = false,\n filterPlaceholder = 'Search\\u2026',\n size = 'md',\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const dropdownId = `${uid}-dropdown`;\n const triggerId = `${uid}-trigger`;\n const helperId = `${uid}-helper`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [filterText, setFilterText] = useState('');\n\n const internalRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropPos, setDropPos] = useState<{ top: number; left: number; width: number } | null>(null);\n\n // Merge external + internal refs\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const selectedOption = options.find(o => o.value === value) ?? null;\n\n // Close on outside click — dropdown is portaled, so check both refs\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n const target = e.target as Node;\n if (\n !internalRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setIsOpen(false);\n setFilterText('');\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Position the portaled dropdown relative to the trigger; track scroll/resize\n useEffect(() => {\n if (!isOpen) return;\n function recompute() {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) setDropPos({ top: rect.bottom + 2, left: rect.left, width: rect.width });\n }\n recompute();\n window.addEventListener('scroll', recompute, true);\n window.addEventListener('resize', recompute);\n return () => {\n window.removeEventListener('scroll', recompute, true);\n window.removeEventListener('resize', recompute);\n };\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n // On open, scroll the selected option into view so the menu doesn't start at the top\n const hasScrolledOnOpen = useRef(false);\n useLayoutEffect(() => {\n if (!isOpen) {\n hasScrolledOnOpen.current = false;\n return;\n }\n if (!dropPos || hasScrolledOnOpen.current) return;\n const el = dropdownRef.current?.querySelector<HTMLElement>(\n '[role=\"option\"][aria-selected=\"true\"]',\n );\n if (el) {\n el.scrollIntoView({ block: 'start' });\n hasScrolledOnOpen.current = true;\n }\n }, [isOpen, dropPos]);\n\n const filteredOptions = useMemo(() => {\n if (!filter || !filterText) return options;\n const q = filterText.toLowerCase();\n return options.filter(o => o.label.toLowerCase().includes(q));\n }, [options, filter, filterText]);\n\n function toggleOpen() {\n if (disabled) return;\n setIsOpen(prev => {\n if (prev) setFilterText('');\n return !prev;\n });\n }\n\n function selectOption(optValue: string) {\n onChange?.(optValue);\n setIsOpen(false);\n setFilterText('');\n }\n\n function handleTriggerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleOpen(); }\n else if (e.key === 'Escape') { setIsOpen(false); setFilterText(''); }\n else if (e.key === 'ArrowDown' && !isOpen) { e.preventDefault(); setIsOpen(true); }\n }\n\n const isFilled = !!selectedOption;\n\n const rootClass = [styles.root, styles[size], disabled ? styles.rootDisabled : '', className ?? '']\n .filter(Boolean).join(' ');\n\n const triggerClass = [\n styles.trigger,\n isOpen ? styles.triggerOpen : '',\n invalid ? styles.triggerInvalid : '',\n disabled ? styles.triggerDisabled : '',\n isFilled && !invalid && !disabled ? styles.triggerFilled : '',\n ].filter(Boolean).join(' ');\n\n const chevronClass = [\n styles.chevron,\n invalid ? styles.chevronInvalid : '',\n disabled ? styles.chevronDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {/* ── Field (label + trigger + helper) ── */}\n <div className={styles.field}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={triggerId}>{label}</label>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n ref={triggerRef}\n id={triggerId}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={dropdownId}\n aria-required={required || undefined}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n className={triggerClass}\n onClick={toggleOpen}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={styles.triggerContent}>\n {selectedOption\n ? <span className={styles.triggerValue}>{selectedOption.label}</span>\n : <span className={styles.placeholder}>{placeholder}</span>\n }\n </span>\n\n <span className={chevronClass} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 8\" fill=\"none\">\n <path d=\"M1 1l6 6 6-6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n {helperText && (\n <span id={helperId} className={invalid ? styles.errorText : styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n\n {/* ── Dropdown overlay (portaled to body so it escapes any ancestor overflow).\n `data-popover-root` tells any ancestor popover with its own outside-click\n handler to ignore clicks here — without it, the parent popover would\n close before this dropdown's option-click handler runs. ── */}\n {isOpen && dropPos && createPortal(\n <div\n ref={dropdownRef}\n data-popover-root=\"\"\n id={dropdownId}\n role=\"listbox\"\n className={styles.dropdown}\n style={{ top: dropPos.top, left: dropPos.left, width: dropPos.width }}\n >\n {/* Optional filter header */}\n {filter && (\n <div className={styles.filterHeader}>\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon} aria-hidden=\"true\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L12.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <input\n type=\"text\"\n className={styles.searchInput}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={e => setFilterText(e.target.value)}\n aria-label=\"Filter options\"\n autoComplete=\"off\"\n />\n {filterText && (\n <button\n type=\"button\"\n className={styles.searchClear}\n onClick={() => setFilterText('')}\n aria-label=\"Clear filter\"\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 5l4 4M9 5l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Option list */}\n <div className={styles.optionList}>\n {filteredOptions.length === 0 ? (\n <div className={styles.noResults}>No results</div>\n ) : (\n filteredOptions.map(opt => {\n const isSelected = opt.value === value;\n const isDisabled = opt.disabled;\n const optClass = [\n styles.option,\n isSelected ? styles.optionHighlight : '',\n isDisabled ? styles.optionDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled || undefined}\n className={optClass}\n onClick={() => !isDisabled && selectOption(opt.value)}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !isDisabled) {\n e.preventDefault();\n selectOption(opt.value);\n }\n }}\n >\n <span className={isSelected ? `${styles.optionLabel} ${styles.optionLabelHighlight}` : styles.optionLabel}>\n {opt.label}\n </span>\n </div>\n );\n })\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n","import { forwardRef } from 'react';\nimport styles from './IconButton.module.css';\nimport type { ButtonVariant, ButtonSize } from '../Button/Button';\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** The icon to display. Pass any React node (e.g. a PrimeIcon `<i className=\"pi pi-search\" />`). */\n icon: React.ReactNode;\n /** Visual style. Defaults to `'primary'`. */\n variant?: ButtonVariant;\n /**\n * Size variant. Sizes match the Figma spec and share Button's sizing ramp:\n * - `sm` = 24×24px\n * - `md` = 36×36px (default)\n * - `lg` = 40×40px\n */\n size?: ButtonSize;\n /**\n * Accessible label describing the button's action. Required for screen-reader support\n * since there is no visible text.\n */\n 'aria-label': string;\n}\n\n/**\n * IconButton — Clear Design System\n *\n * A circular icon-only button. Shares the same variants and sizes as Button.\n * Always requires an `aria-label` since there is no visible text.\n *\n * @example\n * <IconButton icon={<i className=\"pi pi-search\" />} aria-label=\"Search\" />\n *\n * @example\n * <IconButton icon={<i className=\"pi pi-trash\" />} aria-label=\"Delete\" variant=\"danger\" />\n *\n * @example\n * <IconButton icon={<i className=\"pi pi-plus\" />} aria-label=\"Add\" size=\"sm\" />\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n icon,\n variant = 'primary',\n size = 'md',\n className,\n disabled,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n styles.btn,\n styles[variant],\n styles[size],\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button ref={ref} className={cls} disabled={disabled} {...rest}>\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n </button>\n );\n },\n);\n\nIconButton.displayName = 'IconButton';\n","import { forwardRef, useRef, useState, useEffect, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconButton } from '../IconButton/IconButton';\nimport styles from './DatePicker.module.css';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const;\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] as const;\n\ntype View = 'day' | 'month' | 'year';\n\n// ─── Date utilities ───────────────────────────────────────────────────────────\n\nfunction formatDate(date: Date): string {\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${m}/${d}/${date.getFullYear()}`;\n}\n\nfunction parseInputDate(text: string): Date | null {\n const match = text.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (!match) return null;\n const month = parseInt(match[1], 10) - 1;\n const day = parseInt(match[2], 10);\n const year = parseInt(match[3], 10);\n if (month < 0 || month > 11 || day < 1 || day > 31 || year < 1000) return null;\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null;\n return date;\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n}\n\nfunction isDateDisabled(date: Date, minDate?: Date, maxDate?: Date): boolean {\n if (minDate) {\n const min = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());\n if (date < min) return true;\n }\n if (maxDate) {\n const max = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());\n if (date > max) return true;\n }\n return false;\n}\n\n/** Returns the calendar grid weeks (including leading/trailing outside days). */\nfunction getCalendarWeeks(year: number, month: number): Date[][] {\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() - startDate.getDay());\n const endDate = new Date(lastDay);\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\n const weeks: Date[][] = [];\n const cur = new Date(startDate);\n while (cur <= endDate) {\n const week: Date[] = [];\n for (let i = 0; i < 7; i++) {\n week.push(new Date(cur));\n cur.setDate(cur.getDate() + 1);\n }\n weeks.push(week);\n }\n return weeks;\n}\n\n/** ISO 8601 week number. */\nfunction getISOWeek(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\n/** Start year of the 8-year page that contains the given year. */\nfunction getYearPageStart(year: number): number {\n return Math.floor(year / 8) * 8;\n}\n\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\n\nconst CalendarIcon = () => (\n <svg viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"2.5\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M1 6h12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M4.5 1v3M9.5 1v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst ChevronLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 11L5 7l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface DatePickerProps {\n /** Controlled selected date. Pass `null` to clear. */\n value?: Date | null;\n /** Called when the user selects or clears a date. */\n onChange?: (date: Date | null) => void;\n /** Label shown above the input. */\n label?: string;\n /** Adds a red asterisk to the label. */\n required?: boolean;\n /** Helper text shown below the input. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the input in error state with red border and red helper text. */\n invalid?: boolean;\n /** Disables the entire component. */\n disabled?: boolean;\n /** Placeholder for the text input. Defaults to \"MM/DD/YYYY\". */\n placeholder?: string;\n /** Dates before this date are disabled in the calendar. */\n minDate?: Date;\n /** Dates after this date are disabled in the calendar. */\n maxDate?: Date;\n /** When true (default), shows ISO week numbers as the first calendar column. */\n showWeekNumbers?: boolean;\n id?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * DatePicker — Clear Design System\n *\n * A date input with a popup calendar. Users can type a date directly (MM/DD/YYYY)\n * or pick one from the calendar. Three views: day, month, and year.\n *\n * @example\n * <DatePicker label=\"Closing date\" value={date} onChange={setDate} />\n *\n * @example\n * <DatePicker label=\"Start date\" value={date} onChange={setDate} minDate={new Date()} />\n *\n * @example\n * <DatePicker label=\"Date\" value={date} onChange={setDate} required invalid helperText=\"Required.\" />\n */\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n label,\n required = false,\n helperText,\n invalid = false,\n disabled = false,\n placeholder = 'MM/DD/YYYY',\n minDate,\n maxDate,\n showWeekNumbers = true,\n id: idProp,\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const inputId = idProp ?? `${uid}-input`;\n const helperId = `${uid}-helper`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [view, setView] = useState<View>('day');\n const [viewYear, setViewYear] = useState<number>(() => value?.getFullYear() ?? new Date().getFullYear());\n const [viewMonth, setViewMonth] = useState<number>(() => value?.getMonth() ?? new Date().getMonth());\n const [inputText, setInputText] = useState<string>(() => value ? formatDate(value) : '');\n\n const internalRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n const [calPos, setCalPos] = useState<{ top: number; left: number } | null>(null);\n\n // Merge external + internal refs\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n // Sync inputText when value changes externally\n useEffect(() => {\n const formatted = value ? formatDate(value) : '';\n if (inputRef.current !== document.activeElement) {\n setInputText(formatted);\n }\n if (value) {\n setViewYear(value.getFullYear());\n setViewMonth(value.getMonth());\n }\n }, [value]);\n\n // Close on outside click — calendar is portaled, so check both refs\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n const target = e.target as Node;\n if (\n !internalRef.current?.contains(target) &&\n !calendarRef.current?.contains(target)\n ) {\n close();\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Position the portaled calendar relative to the trigger; track scroll/resize\n useEffect(() => {\n if (!isOpen) return;\n function recompute() {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) setCalPos({ top: rect.bottom + 4, left: rect.left });\n }\n recompute();\n window.addEventListener('scroll', recompute, true);\n window.addEventListener('resize', recompute);\n return () => {\n window.removeEventListener('scroll', recompute, true);\n window.removeEventListener('resize', recompute);\n };\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') close();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n function open() {\n if (disabled) return;\n setIsOpen(prev => {\n if (!prev) setView('day'); // only reset to day view when freshly opening\n return true;\n });\n }\n\n function close() {\n setIsOpen(false);\n setView('day');\n }\n\n // ─── Navigation ───────────────────────────────────────────────────────────\n\n function navPrev() {\n if (view === 'day') {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(y => y - 1); }\n else setViewMonth(m => m - 1);\n } else if (view === 'month') {\n setViewYear(y => y - 1);\n } else {\n setViewYear(y => getYearPageStart(y) - 8);\n }\n }\n\n function navNext() {\n if (view === 'day') {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(y => y + 1); }\n else setViewMonth(m => m + 1);\n } else if (view === 'month') {\n setViewYear(y => y + 1);\n } else {\n setViewYear(y => getYearPageStart(y) + 8);\n }\n }\n\n // ─── Selection ────────────────────────────────────────────────────────────\n\n function selectDay(date: Date) {\n if (isDateDisabled(date, minDate, maxDate)) return;\n // If outside-month day, navigate to that month\n if (date.getMonth() !== viewMonth || date.getFullYear() !== viewYear) {\n setViewMonth(date.getMonth());\n setViewYear(date.getFullYear());\n }\n onChange?.(date);\n setInputText(formatDate(date));\n close();\n }\n\n function selectMonth(monthIdx: number) {\n setViewMonth(monthIdx);\n setView('day');\n }\n\n function selectYear(year: number) {\n setViewYear(year);\n setView('month');\n }\n\n function handleToday() {\n const todayDate = new Date();\n todayDate.setHours(0, 0, 0, 0);\n if (isDateDisabled(todayDate, minDate, maxDate)) return;\n onChange?.(todayDate);\n setInputText(formatDate(todayDate));\n setViewYear(todayDate.getFullYear());\n setViewMonth(todayDate.getMonth());\n close();\n }\n\n function handleClear() {\n onChange?.(null);\n setInputText('');\n // Stay open (per spec)\n }\n\n // ─── Input ────────────────────────────────────────────────────────────────\n\n function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {\n const text = e.target.value;\n setInputText(text);\n if (text === '') {\n onChange?.(null);\n return;\n }\n const parsed = parseInputDate(text);\n if (parsed) {\n setViewYear(parsed.getFullYear());\n setViewMonth(parsed.getMonth());\n onChange?.(parsed);\n }\n }\n\n function handleInputKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n const parsed = parseInputDate(inputText);\n if (parsed) { onChange?.(parsed); close(); }\n }\n }\n\n // ─── Cell class helpers ───────────────────────────────────────────────────\n\n function dayCellClass(date: Date, inCurrentMonth: boolean): string {\n const classes = [styles.cell];\n const isToday = isSameDay(date, today);\n const isSelected = value ? isSameDay(date, value) : false;\n const isDisabled = isDateDisabled(date, minDate, maxDate);\n\n if (!inCurrentMonth) classes.push(styles.cellOutside);\n if (isDisabled) classes.push(styles.cellDisabled);\n if (isSelected) classes.push(styles.cellSelected);\n else if (isToday) classes.push(styles.cellToday);\n\n return classes.filter(Boolean).join(' ');\n }\n\n function dayInnerClass(date: Date): string {\n const classes = [styles.dayCircle];\n const isSelected = value ? isSameDay(date, value) : false;\n const isToday = isSameDay(date, today);\n if (isSelected) classes.push(styles.dayCircleSelected);\n else if (isToday) classes.push(styles.dayCircleToday);\n return classes.join(' ');\n }\n\n function monthCellClass(monthIdx: number): string {\n const classes = [styles.monthCell];\n if (value && value.getMonth() === monthIdx && value.getFullYear() === viewYear) {\n classes.push(styles.monthCellSelected);\n }\n return classes.join(' ');\n }\n\n function yearCellClass(year: number): string {\n const classes = [styles.yearCell];\n if (value && value.getFullYear() === year) classes.push(styles.yearCellSelected);\n return classes.join(' ');\n }\n\n // ─── Calendar data ────────────────────────────────────────────────────────\n\n const weeks = getCalendarWeeks(viewYear, viewMonth);\n const yearPageStart = getYearPageStart(viewYear);\n const yearPage = Array.from({ length: 8 }, (_, i) => yearPageStart + i);\n\n // ─── Header title ─────────────────────────────────────────────────────────\n\n const headerTitle = () => {\n if (view === 'day') {\n return (\n <div className={styles.titleGroup}>\n <button\n type=\"button\"\n className={styles.titleBtn}\n onClick={() => setView('month')}\n >\n {MONTH_NAMES[viewMonth]}\n </button>\n <button\n type=\"button\"\n className={styles.titleBtn}\n onClick={() => setView('year')}\n >\n {viewYear}\n </button>\n </div>\n );\n }\n if (view === 'month') {\n return <span className={styles.titleText}>{viewYear}</span>;\n }\n return (\n <span className={styles.titleText}>\n {yearPageStart} – {yearPageStart + 7}\n </span>\n );\n };\n\n // ─── Trigger classes ──────────────────────────────────────────────────────\n\n const triggerClass = [\n styles.inputWrap,\n isOpen ? styles.inputWrapOpen : '',\n invalid ? styles.inputWrapInvalid : '',\n disabled ? styles.inputWrapDisabled : '',\n ].filter(Boolean).join(' ');\n\n const rootClass = [styles.root, className ?? ''].filter(Boolean).join(' ');\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {/* ── Trigger field ── */}\n <div className={styles.field}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={inputId}>{label}</label>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div ref={triggerRef} className={triggerClass}>\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n className={styles.input}\n value={inputText}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={helperText ? helperId : undefined}\n onChange={handleInputChange}\n onFocus={open}\n onKeyDown={handleInputKeyDown}\n autoComplete=\"off\"\n />\n <button\n type=\"button\"\n className={styles.calIconBtn}\n onClick={() => isOpen ? close() : open()}\n tabIndex={-1}\n aria-label={isOpen ? 'Close calendar' : 'Open calendar'}\n disabled={disabled}\n >\n <CalendarIcon />\n </button>\n </div>\n\n {helperText && (\n <span id={helperId} className={invalid ? styles.errorText : styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n\n {/* ── Calendar panel (portaled to body so it escapes any ancestor overflow).\n `data-popover-root` tells any ancestor popover with its own outside-click\n handler to ignore clicks here. ── */}\n {isOpen && calPos && createPortal(\n <div\n ref={calendarRef}\n data-popover-root=\"\"\n className={styles.calendar}\n style={{ top: calPos.top, left: calPos.left }}\n role=\"dialog\"\n aria-label=\"Date picker\"\n >\n {/* Header */}\n <div className={styles.calHeader}>\n <IconButton\n icon={<ChevronLeft />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={navPrev}\n aria-label=\"Previous\"\n />\n\n {headerTitle()}\n\n <IconButton\n icon={<ChevronRight />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={navNext}\n aria-label=\"Next\"\n />\n </div>\n\n {/* ── Day view ── */}\n {view === 'day' && (\n <div className={styles.dayView}>\n {/* Weekday header row */}\n <div className={showWeekNumbers ? styles.weekRowWithWk : styles.weekRow}>\n {showWeekNumbers && (\n <div className={`${styles.weekdayCell} ${styles.wkLabel}`}>Wk</div>\n )}\n {DAY_NAMES.map(d => (\n <div key={d} className={styles.weekdayCell}>{d}</div>\n ))}\n </div>\n\n {/* Week rows */}\n {weeks.map((week, wi) => {\n const inCurrentMonth = (d: Date) => d.getMonth() === viewMonth && d.getFullYear() === viewYear;\n return (\n <div\n key={wi}\n className={showWeekNumbers ? styles.weekRowWithWk : styles.weekRow}\n >\n {showWeekNumbers && (\n <div className={`${styles.cell} ${styles.wkCell}`}>\n {getISOWeek(week[0])}\n </div>\n )}\n {week.map((date, di) => {\n const disabled = isDateDisabled(date, minDate, maxDate);\n return (\n <div\n key={di}\n className={dayCellClass(date, inCurrentMonth(date))}\n onClick={() => !disabled && selectDay(date)}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={date.toDateString()}\n aria-pressed={value ? isSameDay(date, value) : false}\n aria-disabled={disabled || undefined}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n selectDay(date);\n }\n }}\n >\n <div className={dayInnerClass(date)}>\n {date.getDate()}\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n )}\n\n {/* ── Month view ── */}\n {view === 'month' && (\n <div className={styles.monthGrid}>\n {MONTH_NAMES.map((name, idx) => (\n <div\n key={name}\n className={monthCellClass(idx)}\n onClick={() => selectMonth(idx)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectMonth(idx); }\n }}\n >\n {name}\n </div>\n ))}\n </div>\n )}\n\n {/* ── Year view ── */}\n {view === 'year' && (\n <div className={styles.yearGrid}>\n {yearPage.map(year => (\n <div\n key={year}\n className={yearCellClass(year)}\n onClick={() => selectYear(year)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectYear(year); }\n }}\n >\n {year}\n </div>\n ))}\n </div>\n )}\n\n {/* ── Footer (day view only) ── */}\n {view === 'day' && (\n <div className={styles.footer}>\n <button type=\"button\" className={styles.clearBtn} onClick={handleClear}>\n Clear\n </button>\n <button type=\"button\" className={styles.todayBtn} onClick={handleToday}>\n Today\n </button>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n },\n);\n\nDatePicker.displayName = 'DatePicker';\n","import { forwardRef, useState, useEffect } from 'react';\nimport { IconButton } from '../IconButton/IconButton';\nimport styles from './Calendar.module.css';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] as const;\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] as const;\n\ntype View = 'day' | 'month' | 'year';\n\n// ─── Date utilities ───────────────────────────────────────────────────────────\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n}\n\nfunction isDateDisabled(date: Date, minDate?: Date, maxDate?: Date): boolean {\n if (minDate) {\n const min = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());\n if (date < min) return true;\n }\n if (maxDate) {\n const max = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());\n if (date > max) return true;\n }\n return false;\n}\n\n/** Returns the calendar grid weeks (including leading/trailing outside days). */\nfunction getCalendarWeeks(year: number, month: number): Date[][] {\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() - startDate.getDay());\n const endDate = new Date(lastDay);\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\n const weeks: Date[][] = [];\n const cur = new Date(startDate);\n while (cur <= endDate) {\n const week: Date[] = [];\n for (let i = 0; i < 7; i++) {\n week.push(new Date(cur));\n cur.setDate(cur.getDate() + 1);\n }\n weeks.push(week);\n }\n return weeks;\n}\n\n/** ISO 8601 week number. */\nfunction getISOWeek(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\n/** Start year of the 8-year page that contains the given year. */\nfunction getYearPageStart(year: number): number {\n return Math.floor(year / 8) * 8;\n}\n\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\n\nconst ChevronLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 11L5 7l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface CalendarProps {\n /** Controlled selected date. Pass `null` to clear. */\n value?: Date | null;\n /** Called when the user selects (or, with the footer, clears) a date. */\n onChange?: (date: Date | null) => void;\n /** Dates before this date are disabled and not selectable. */\n minDate?: Date;\n /** Dates after this date are disabled and not selectable. */\n maxDate?: Date;\n /** When true, shows ISO week numbers as the first column. Defaults to false. */\n showWeekNumbers?: boolean;\n /**\n * Surface style. `'card'` (default) is a white panel with a border and shadow;\n * `'plain'` is transparent with no border or shadow, letting the page show through.\n */\n variant?: 'card' | 'plain';\n /** Month to display initially when there is no `value`. Defaults to the current month. */\n defaultMonth?: Date;\n id?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Calendar — Clear Design System\n *\n * A standalone, inline calendar for picking a single date. Renders directly in the\n * page (no popover or text input). Three views: day, month, and year — click the\n * month or year in the header to drill up. This is the same calendar surface used\n * inside DatePicker, extracted for use on its own.\n *\n * @example\n * <Calendar value={date} onChange={setDate} />\n *\n * @example\n * <Calendar value={date} onChange={setDate} minDate={new Date()} showFooter />\n */\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(\n (\n {\n value,\n onChange,\n minDate,\n maxDate,\n showWeekNumbers = false,\n variant = 'card',\n defaultMonth,\n id,\n className,\n style,\n },\n ref,\n ) => {\n const initial = value ?? defaultMonth ?? new Date();\n const [view, setView] = useState<View>('day');\n const [viewYear, setViewYear] = useState<number>(initial.getFullYear());\n const [viewMonth, setViewMonth] = useState<number>(initial.getMonth());\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n // Follow the selected value when it changes externally\n useEffect(() => {\n if (value) {\n setViewYear(value.getFullYear());\n setViewMonth(value.getMonth());\n }\n }, [value]);\n\n // ─── Navigation ───────────────────────────────────────────────────────────\n\n function navPrev() {\n if (view === 'day') {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(y => y - 1); }\n else setViewMonth(m => m - 1);\n } else if (view === 'month') {\n setViewYear(y => y - 1);\n } else {\n setViewYear(y => getYearPageStart(y) - 8);\n }\n }\n\n function navNext() {\n if (view === 'day') {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(y => y + 1); }\n else setViewMonth(m => m + 1);\n } else if (view === 'month') {\n setViewYear(y => y + 1);\n } else {\n setViewYear(y => getYearPageStart(y) + 8);\n }\n }\n\n // ─── Selection ────────────────────────────────────────────────────────────\n\n function selectDay(date: Date) {\n if (isDateDisabled(date, minDate, maxDate)) return;\n // If outside-month day, navigate to that month\n if (date.getMonth() !== viewMonth || date.getFullYear() !== viewYear) {\n setViewMonth(date.getMonth());\n setViewYear(date.getFullYear());\n }\n onChange?.(date);\n }\n\n function selectMonth(monthIdx: number) {\n setViewMonth(monthIdx);\n setView('day');\n }\n\n function selectYear(year: number) {\n setViewYear(year);\n setView('month');\n }\n\n // ─── Cell class helpers ───────────────────────────────────────────────────\n\n function dayCellClass(date: Date, inCurrentMonth: boolean): string {\n const classes = [styles.cell];\n const isToday = isSameDay(date, today);\n const isSelected = value ? isSameDay(date, value) : false;\n const disabled = isDateDisabled(date, minDate, maxDate);\n\n if (!inCurrentMonth) classes.push(styles.cellOutside);\n if (disabled) classes.push(styles.cellDisabled);\n if (isSelected) classes.push(styles.cellSelected);\n else if (isToday) classes.push(styles.cellToday);\n\n return classes.filter(Boolean).join(' ');\n }\n\n function dayInnerClass(date: Date): string {\n const classes = [styles.dayCircle];\n const isSelected = value ? isSameDay(date, value) : false;\n const isToday = isSameDay(date, today);\n if (isSelected) classes.push(styles.dayCircleSelected);\n else if (isToday) classes.push(styles.dayCircleToday);\n return classes.join(' ');\n }\n\n function monthCellClass(monthIdx: number): string {\n const classes = [styles.monthCell];\n if (value && value.getMonth() === monthIdx && value.getFullYear() === viewYear) {\n classes.push(styles.monthCellSelected);\n }\n return classes.join(' ');\n }\n\n function yearCellClass(year: number): string {\n const classes = [styles.yearCell];\n if (value && value.getFullYear() === year) classes.push(styles.yearCellSelected);\n return classes.join(' ');\n }\n\n // ─── Calendar data ────────────────────────────────────────────────────────\n\n const weeks = getCalendarWeeks(viewYear, viewMonth);\n const yearPageStart = getYearPageStart(viewYear);\n const yearPage = Array.from({ length: 8 }, (_, i) => yearPageStart + i);\n\n // ─── Header title ─────────────────────────────────────────────────────────\n\n const headerTitle = () => {\n if (view === 'day') {\n return (\n <div className={styles.titleGroup}>\n <button\n type=\"button\"\n className={styles.titleBtn}\n onClick={() => setView('month')}\n >\n {MONTH_NAMES[viewMonth]}\n </button>\n <button\n type=\"button\"\n className={styles.titleBtn}\n onClick={() => setView('year')}\n >\n {viewYear}\n </button>\n </div>\n );\n }\n if (view === 'month') {\n return <span className={styles.titleText}>{viewYear}</span>;\n }\n return (\n <span className={styles.titleText}>\n {yearPageStart} – {yearPageStart + 7}\n </span>\n );\n };\n\n const rootClass = [\n styles.calendar,\n variant === 'plain' ? styles.plain : '',\n className,\n ].filter(Boolean).join(' ');\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n <div\n ref={ref}\n id={id}\n className={rootClass}\n style={style}\n role=\"group\"\n aria-label=\"Calendar\"\n >\n {/* Header */}\n <div className={styles.calHeader}>\n <IconButton\n icon={<ChevronLeft />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={navPrev}\n aria-label=\"Previous\"\n />\n\n {headerTitle()}\n\n <IconButton\n icon={<ChevronRight />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={navNext}\n aria-label=\"Next\"\n />\n </div>\n\n {/* ── Day view ── */}\n {view === 'day' && (\n <div className={styles.dayView}>\n {/* Weekday header row */}\n <div className={showWeekNumbers ? styles.weekRowWithWk : styles.weekRow}>\n {showWeekNumbers && (\n <div className={`${styles.weekdayCell} ${styles.wkLabel}`}>Wk</div>\n )}\n {DAY_NAMES.map(d => (\n <div key={d} className={styles.weekdayCell}>{d}</div>\n ))}\n </div>\n\n {/* Week rows */}\n {weeks.map((week, wi) => {\n const inCurrentMonth = (d: Date) => d.getMonth() === viewMonth && d.getFullYear() === viewYear;\n return (\n <div\n key={wi}\n className={showWeekNumbers ? styles.weekRowWithWk : styles.weekRow}\n >\n {showWeekNumbers && (\n <div className={`${styles.cell} ${styles.wkCell}`}>\n {getISOWeek(week[0])}\n </div>\n )}\n {week.map((date, di) => {\n const disabled = isDateDisabled(date, minDate, maxDate);\n return (\n <div\n key={di}\n className={dayCellClass(date, inCurrentMonth(date))}\n onClick={() => !disabled && selectDay(date)}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={date.toDateString()}\n aria-pressed={value ? isSameDay(date, value) : false}\n aria-disabled={disabled || undefined}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n selectDay(date);\n }\n }}\n >\n <div className={dayInnerClass(date)}>\n {date.getDate()}\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n )}\n\n {/* ── Month view ── */}\n {view === 'month' && (\n <div className={styles.monthGrid}>\n {MONTH_NAMES.map((name, idx) => (\n <div\n key={name}\n className={monthCellClass(idx)}\n onClick={() => selectMonth(idx)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectMonth(idx); }\n }}\n >\n {name}\n </div>\n ))}\n </div>\n )}\n\n {/* ── Year view ── */}\n {view === 'year' && (\n <div className={styles.yearGrid}>\n {yearPage.map(year => (\n <div\n key={year}\n className={yearCellClass(year)}\n onClick={() => selectYear(year)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectYear(year); }\n }}\n >\n {year}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nCalendar.displayName = 'Calendar';\n","import { forwardRef, useRef, useState, useEffect, useId } from 'react';\nimport styles from './SelectButton.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SelectButtonBadge {\n /** Displayed inside the badge circle. */\n value: string | number;\n /** Background color of the badge (hex or CSS color). */\n color: string;\n}\n\nexport interface SelectButtonOption {\n /** Option display label. */\n label: string;\n /** Unique identifier used as the value. */\n value: string;\n /** Plain count shown next to the label in bold. */\n count?: number;\n /** Colored circular badge (e.g., teal for info, red for alerts). */\n badge?: SelectButtonBadge;\n /** Optional icon rendered before the label. Pass any React node (e.g. a PrimeIcon). */\n icon?: React.ReactNode;\n}\n\nexport interface SelectButtonProps {\n /** Options to display. */\n options: SelectButtonOption[];\n /** Currently selected value. */\n value?: string | null;\n /** Called when the user selects an option. */\n onChange?: (value: string) => void;\n /**\n * - `'group'` (default): all options rendered as a joined toggle-button row.\n * Use for view switching or filter toggling.\n * - `'options'`: renders a split button showing the current selection;\n * clicking opens a dropdown to pick a different option.\n */\n variant?: 'group' | 'options';\n /** Size variant. Matches the standard button ramp: `sm` = 24px, `md` = 36px (default), `lg` = 40px. */\n size?: 'sm' | 'md' | 'lg';\n /** Optional field label rendered above the button. */\n label?: string;\n /** Adds a red asterisk next to the label. */\n required?: boolean;\n /** Disables the entire component. */\n disabled?: boolean;\n /** Placeholder for the `options` variant when nothing is selected. */\n placeholder?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\ninterface OptionContentProps {\n opt: SelectButtonOption;\n labelClassName: string;\n countClassName: string;\n badgeClassName: string;\n iconClassName: string;\n}\n\n/** Renders the label + optional count + optional badge inside a button. */\nfunction OptionContent({ opt, labelClassName, countClassName, badgeClassName, iconClassName }: OptionContentProps) {\n return (\n <>\n {opt.icon && (\n <span className={iconClassName} aria-hidden=\"true\">{opt.icon}</span>\n )}\n <span className={labelClassName}>{opt.label}</span>\n {opt.count !== undefined && (\n <span className={countClassName}>{opt.count}</span>\n )}\n {opt.badge && (\n <span\n className={badgeClassName}\n style={{ backgroundColor: opt.badge.color }}\n aria-label={`${opt.badge.value}`}\n >\n {opt.badge.value}\n </span>\n )}\n </>\n );\n}\n\n/**\n * SelectButton — Clear Design System\n *\n * A single-select toggle control with two variants:\n * - `group`: options displayed as a joined row of toggle buttons (use for view/filter switching).\n * - `options`: a split button showing the active selection; clicking opens a dropdown picker.\n *\n * Each option can carry an optional count number and a colored badge indicator.\n *\n * @example\n * // Toggle group\n * <SelectButton\n * options={[\n * { label: 'All', value: 'all', count: 42 },\n * { label: 'In Review', value: 'review', count: 5, badge: { value: 3, color: '#D60F00' } },\n * { label: 'Approved', value: 'approved', count: 12 },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n *\n * @example\n * // Dropdown options variant\n * <SelectButton\n * variant=\"options\"\n * options={statusOptions}\n * value={status}\n * onChange={setStatus}\n * label=\"Status\"\n * />\n */\nexport const SelectButton = forwardRef<HTMLDivElement, SelectButtonProps>(\n (\n {\n options,\n value,\n onChange,\n variant = 'group',\n size = 'md',\n label,\n required = false,\n disabled = false,\n placeholder = 'Select\\u2026',\n className,\n style,\n },\n externalRef,\n ) => {\n const uid = useId();\n const [isOpen, setIsOpen] = useState(false);\n\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n const selectedOption = options.find(o => o.value === value) ?? null;\n\n function handleSelect(optValue: string) {\n if (disabled) return;\n onChange?.(optValue);\n setIsOpen(false);\n }\n\n const sizeClass = size === 'sm' ? styles.sizeSm : size === 'lg' ? styles.sizeLg : styles.sizeMd;\n const rootClass = [styles.root, sizeClass, className ?? ''].filter(Boolean).join(' ');\n\n // ── Group variant ──────────────────────────────────────────────────────────\n\n if (variant === 'group') {\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {label && (\n <div className={styles.labelRow}>\n <span className={styles.label}>{label}</span>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n className={styles.group}\n role=\"group\"\n aria-label={label ?? 'Select button group'}\n aria-disabled={disabled || undefined}\n >\n {options.map((opt, i) => {\n const isFirst = i === 0;\n const isLast = i === options.length - 1;\n const isSelected = opt.value === value;\n\n const posClass =\n options.length === 1 ? styles.btnSingle :\n isFirst ? styles.btnLeft :\n isLast ? styles.btnRight :\n styles.btnMiddle;\n\n const btnClass = [\n styles.btn,\n posClass,\n isSelected ? styles.btnSelected : '',\n disabled ? styles.btnDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <button\n key={opt.value}\n id={`${uid}-${opt.value}`}\n type=\"button\"\n className={btnClass}\n onClick={() => handleSelect(opt.value)}\n aria-pressed={isSelected}\n disabled={disabled}\n >\n <OptionContent\n opt={opt}\n labelClassName={styles.btnLabel}\n countClassName={styles.count}\n badgeClassName={styles.badge}\n iconClassName={styles.optionIcon}\n />\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n // ── Options variant (split button + dropdown) ──────────────────────────────\n\n return (\n <div ref={setRef} className={rootClass} style={style}>\n {label && (\n <div className={styles.labelRow}>\n <span className={styles.label}>{label}</span>\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </div>\n )}\n\n <div\n className={[styles.splitButton, disabled ? styles.splitButtonDisabled : ''].filter(Boolean).join(' ')}\n aria-disabled={disabled || undefined}\n >\n {/* Main area — shows current selection */}\n <button\n type=\"button\"\n className={styles.splitMain}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n disabled={disabled}\n >\n {selectedOption ? (\n <OptionContent\n opt={selectedOption}\n labelClassName={styles.btnLabel}\n countClassName={styles.count}\n badgeClassName={styles.badge}\n iconClassName={styles.optionIcon}\n />\n ) : (\n <span className={styles.placeholder}>{placeholder}</span>\n )}\n </button>\n\n {/* Chevron trigger */}\n <button\n type=\"button\"\n className={styles.splitChevron}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n aria-label={isOpen ? 'Close options' : 'Open options'}\n tabIndex={-1}\n disabled={disabled}\n >\n <span className={styles.chevronIcon} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n role=\"listbox\"\n aria-label={label ?? 'Options'}\n className={styles.dropdown}\n >\n {options.map(opt => {\n const isSelected = opt.value === value;\n const rowClass = [\n styles.dropdownRow,\n isSelected ? styles.dropdownRowSelected : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n className={rowClass}\n onClick={() => handleSelect(opt.value)}\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleSelect(opt.value); }\n }}\n >\n <OptionContent\n opt={opt}\n labelClassName={isSelected ? `${styles.btnLabel} ${styles.dropdownLabelSelected}` : styles.btnLabel}\n countClassName={styles.count}\n badgeClassName={styles.badge}\n iconClassName={styles.optionIcon}\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nSelectButton.displayName = 'SelectButton';\n","import { forwardRef, useRef, useState, useEffect, useId } from 'react';\nimport styles from './TextArea.module.css';\n\nexport interface TextAreaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'children'> {\n /** Label shown above the textarea. */\n label?: string;\n /** Adds a red asterisk to the label and sets aria-required. */\n required?: boolean;\n /** Helper text shown below the textarea. Turns red when `invalid` is true. */\n helperText?: string;\n /** Renders the invalid/error state with red border, red-50 background, and red helper text. */\n invalid?: boolean;\n /** Number of visible text rows. Defaults to 3. */\n rows?: number;\n /**\n * When true, the textarea grows in height automatically as the user types,\n * instead of showing a scrollbar.\n */\n autoGrow?: boolean;\n}\n\n/**\n * TextArea — Clear Design System\n *\n * A multi-line text input with label, helper text, character counter (when\n * `maxLength` is set), and full state coverage: default, hover, focus, filled,\n * invalid, and disabled. Supports optional auto-grow behaviour.\n *\n * @example\n * <TextArea label=\"Loan notes\" placeholder=\"Enter notes…\" rows={4} />\n *\n * @example\n * <TextArea label=\"Comments\" maxLength={500} />\n *\n * @example\n * <TextArea label=\"Description\" autoGrow />\n *\n * @example\n * <TextArea label=\"Notes\" invalid helperText=\"This field is required.\" />\n */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n required = false,\n helperText,\n invalid = false,\n rows = 3,\n autoGrow = false,\n disabled = false,\n maxLength,\n id: idProp,\n className,\n style,\n value,\n defaultValue,\n onChange,\n ...rest\n },\n forwardedRef,\n ) => {\n const uid = useId();\n const inputId = idProp ?? `${uid}-textarea`;\n const helperId = `${uid}-helper`;\n\n const internalRef = useRef<HTMLTextAreaElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLTextAreaElement>;\n\n // Track character count for the counter\n const [charCount, setCharCount] = useState<number>(() => {\n if (value !== undefined) return String(value ?? '').length;\n if (defaultValue !== undefined) return String(defaultValue ?? '').length;\n return 0;\n });\n\n // Sync charCount when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n setCharCount(String(value ?? '').length);\n }\n }, [value]);\n\n // Auto-grow: resize the textarea to fit its content\n useEffect(() => {\n if (!autoGrow || !resolvedRef.current) return;\n const el = resolvedRef.current;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }, [autoGrow, value, charCount, resolvedRef]);\n\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\n setCharCount(e.target.value.length);\n onChange?.(e);\n }\n\n const showCounter = maxLength !== undefined;\n\n const outerClass = styles.outer;\n\n const innerClass = [\n styles.inner,\n invalid ? styles.innerInvalid : '',\n disabled ? styles.innerDisabled : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={[styles.root, className ?? ''].filter(Boolean).join(' ')} style={style}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n <div className={outerClass}>\n <div className={innerClass}>\n <textarea\n ref={resolvedRef}\n id={inputId}\n rows={autoGrow ? undefined : rows}\n maxLength={maxLength}\n disabled={disabled}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={\n [helperText ? helperId : '', showCounter ? `${uid}-counter` : '']\n .filter(Boolean)\n .join(' ') || undefined\n }\n className={[styles.textarea, autoGrow ? styles.textareaAutoGrow : ''].filter(Boolean).join(' ')}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n {...rest}\n />\n </div>\n\n {/* Bottom row: helper text + counter */}\n {(helperText || showCounter) && (\n <div className={styles.bottomRow}>\n {helperText ? (\n <span\n id={helperId}\n className={invalid ? styles.errorText : styles.helperText}\n >\n {helperText}\n </span>\n ) : (\n <span />\n )}\n {showCounter && (\n <span id={`${uid}-counter`} className={styles.counter} aria-live=\"polite\">\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nTextArea.displayName = 'TextArea';\n","import { forwardRef, useRef } from 'react';\nimport styles from './ToggleSwitch.module.css';\n\nexport interface ToggleSwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'size'> {\n /** Label shown to the right of the switch. */\n label?: React.ReactNode;\n /** Helper text shown below the switch row. */\n helperText?: string;\n}\n\n/**\n * ToggleSwitch — Clear Design System\n *\n * A binary on/off toggle. Use when an action takes immediate effect\n * (no Save/Submit required). Supports label, helper text, disabled,\n * and controlled/uncontrolled usage.\n *\n * @example\n * <ToggleSwitch label=\"Enable notifications\" checked={on} onChange={e => setOn(e.target.checked)} />\n *\n * @example\n * <ToggleSwitch label=\"Auto-lock\" defaultChecked />\n *\n * @example\n * <ToggleSwitch label=\"Feature locked\" disabled />\n */\nexport const ToggleSwitch = forwardRef<HTMLInputElement, ToggleSwitchProps>(\n (\n {\n label,\n helperText,\n disabled = false,\n id,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const resolvedRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n const wrapperClass = [\n styles.wrapper,\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div>\n <label className={wrapperClass} htmlFor={id}>\n <input\n ref={resolvedRef}\n type=\"checkbox\"\n id={id}\n disabled={disabled}\n className={styles.input}\n role=\"switch\"\n {...rest}\n />\n\n <span className={styles.track} aria-hidden=\"true\">\n <span className={styles.thumb} />\n </span>\n\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n\n {helperText && (\n <span className={styles.helperText}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nToggleSwitch.displayName = 'ToggleSwitch';\n","import { forwardRef } from 'react';\nimport styles from './Button.module.css';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'link';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style. Defaults to `'primary'`. */\n variant?: ButtonVariant;\n /**\n * Size variant. Sizes match the Figma spec:\n * - `sm` = 24px height / 10px font\n * - `md` = 36px height / 12px font (default)\n * - `lg` = 40px height / 15px font\n */\n size?: ButtonSize;\n /** Icon rendered before the label. Pass any React node (e.g. a PrimeIcon). */\n leadingIcon?: React.ReactNode;\n /** Icon rendered after the label. */\n trailingIcon?: React.ReactNode;\n /**\n * Red notification badge shown after the label.\n * Pass a number or short string (e.g. `5` or `\"99+\"`).\n */\n badge?: string | number;\n}\n\n/**\n * Button — Clear Design System\n *\n * A versatile action button with five visual variants, three sizes, optional\n * leading/trailing icons, and an optional notification badge.\n *\n * @example\n * <Button>Submit</Button>\n *\n * @example\n * <Button variant=\"secondary\" size=\"sm\">Cancel</Button>\n *\n * @example\n * <Button variant=\"danger\" leadingIcon={<i className=\"pi pi-trash\" />}>Delete</Button>\n *\n * @example\n * <Button badge={3} trailingIcon={<i className=\"pi pi-chevron-down\" />}>Actions</Button>\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n leadingIcon,\n trailingIcon,\n badge,\n children,\n className,\n disabled,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n styles.btn,\n styles[variant],\n styles[size],\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button ref={ref} className={cls} disabled={disabled} {...rest}>\n {leadingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {leadingIcon}\n </span>\n )}\n\n {variant === 'link' ? (\n <span className={styles.linkLabel}>{children}</span>\n ) : (\n <span className={styles.label}>{children}</span>\n )}\n\n {badge !== undefined && (\n <span className={styles.badge} aria-label={`${badge} notifications`}>\n {badge}\n </span>\n )}\n\n {trailingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {trailingIcon}\n </span>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n","import { forwardRef, useRef, useState, useEffect } from 'react';\nimport styles from './DropdownButton.module.css';\nimport type { ButtonVariant, ButtonSize } from '../Button/Button';\n\nexport interface DropdownButtonItem {\n /** Displayed label. */\n label: string;\n /** Unique identifier passed to `onSelect`. */\n value: string;\n /** Optional icon rendered before the label. */\n icon?: React.ReactNode;\n /** When true, the item is non-interactive and visually muted. */\n disabled?: boolean;\n /** When true, renders a divider line above this item. */\n divider?: boolean;\n}\n\nexport interface DropdownButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onSelect'> {\n /** The button label. */\n label: string;\n /** Menu items shown in the dropdown. */\n items: DropdownButtonItem[];\n /** Called when the user selects an item. */\n onSelect?: (value: string) => void;\n /** Visual style. Defaults to `'primary'`. */\n variant?: ButtonVariant;\n /** Size. Defaults to `'md'`. */\n size?: ButtonSize;\n /** Optional icon rendered before the label. */\n leadingIcon?: React.ReactNode;\n}\n\n\n/**\n * DropdownButton — Clear Design System\n *\n * A button that opens an action menu dropdown when clicked. Uses the same\n * variant and size system as Button, with a built-in trailing chevron icon.\n *\n * @example\n * <DropdownButton\n * label=\"Actions\"\n * items={[\n * { label: 'Edit', value: 'edit' },\n * { label: 'Duplicate', value: 'duplicate' },\n * { label: 'Delete', value: 'delete' },\n * ]}\n * onSelect={handleAction}\n * />\n *\n * @example\n * <DropdownButton label=\"Export\" variant=\"secondary\" size=\"sm\" items={exportItems} onSelect={onExport} />\n */\nexport const DropdownButton = forwardRef<HTMLDivElement, DropdownButtonProps>(\n (\n {\n label,\n items,\n onSelect,\n variant = 'primary',\n size = 'md',\n leadingIcon,\n disabled,\n className,\n style,\n ...rest\n },\n externalRef,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n function handleSelect(item: DropdownButtonItem) {\n if (item.disabled) return;\n onSelect?.(item.value);\n setIsOpen(false);\n }\n\n const btnCls = [\n styles.btn,\n styles[variant],\n styles[size],\n isOpen ? styles.btnOpen : '',\n disabled ? styles.disabled : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={setRef}\n className={[styles.root, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n type=\"button\"\n className={btnCls}\n disabled={disabled}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n {...rest}\n >\n {leadingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {leadingIcon}\n </span>\n )}\n <span className={styles.label}>{label}</span>\n <span className={styles.chevron} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {isOpen && (\n <div role=\"menu\" className={styles.dropdown}>\n {items.map((item, i) => (\n <div key={item.value ?? i}>\n {item.divider && <div className={styles.divider} role=\"separator\" />}\n <div\n role=\"menuitem\"\n aria-disabled={item.disabled || undefined}\n className={[\n styles.item,\n item.disabled ? styles.itemDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleSelect(item)}\n tabIndex={item.disabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault();\n handleSelect(item);\n }\n }}\n >\n {item.icon && (\n <span className={styles.itemIcon} aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n <span className={styles.itemLabel}>{item.label}</span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nDropdownButton.displayName = 'DropdownButton';\n","import { forwardRef } from 'react';\nimport styles from './CloseButton.module.css';\n\nexport interface CloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Accessible label. Defaults to `\"Close\"`. Override when the button\n * closes something specific, e.g. `aria-label=\"Close dialog\"`.\n */\n 'aria-label'?: string;\n /** Size variant. `sm` = 24×24px (default). `md` = 36×36px. `lg` = 40×40px. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * CloseButton — Clear Design System\n *\n * A circular ghost button with a built-in ✕ icon. Use to dismiss modals,\n * panels, toasts, tags, or any overlay. Requires an `aria-label` for\n * screen-reader context (defaults to `\"Close\"`).\n *\n * @example\n * <CloseButton onClick={onClose} />\n *\n * @example\n * <CloseButton aria-label=\"Close dialog\" size=\"md\" onClick={onClose} />\n */\nexport const CloseButton = forwardRef<HTMLButtonElement, CloseButtonProps>(\n (\n {\n 'aria-label': ariaLabel = 'Close',\n size = 'sm',\n className,\n disabled,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n styles.btn,\n styles[size],\n disabled ? styles.disabled : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={ariaLabel}\n className={cls}\n disabled={disabled}\n {...rest}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n );\n },\n);\n\nCloseButton.displayName = 'CloseButton';\n","import { forwardRef, useRef, useState, useEffect } from 'react';\nimport styles from './SplitButton.module.css';\n\nexport interface SplitButtonItem {\n /** Displayed label. */\n label: string;\n /** Unique identifier passed to `onSelect`. */\n value: string;\n /** Optional icon before the label. */\n icon?: React.ReactNode;\n /** When true, the item is non-interactive and visually muted. */\n disabled?: boolean;\n}\n\nexport interface SplitButtonProps {\n /** Label shown in the main action area. */\n label: string;\n /** Called when the user clicks the main action button (left side). */\n onAction?: () => void;\n /** Items shown in the dropdown, opened by clicking the right trigger. */\n items: SplitButtonItem[];\n /** Called when the user picks an item from the dropdown. */\n onSelect?: (value: string) => void;\n /**\n * Visual style.\n * - `'primary'` — both sides teal-700, forming a seamless pill.\n * - `'secondary'` — left side teal-50 (secondary), right trigger teal-700 (primary). Use when the button needs less visual weight.\n * Defaults to `'primary'`.\n */\n variant?: 'primary' | 'secondary';\n /** Size. `'md'` = 36px height (default). `'sm'` = 24px height. `'lg'` = 40px height. */\n size?: 'sm' | 'md' | 'lg';\n /** Optional icon rendered before the label in the main action area. */\n leadingIcon?: React.ReactNode;\n /** Disables the entire component. */\n disabled?: boolean;\n /** Accessible label for the dropdown trigger. Defaults to `\"More options\"`. */\n triggerAriaLabel?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SplitButton — Clear Design System\n *\n * Two joined buttons in a single pill:\n * - **Left** (main): executes the primary action when clicked.\n * - **Right** (trigger): opens a dropdown of secondary actions.\n *\n * @example\n * <SplitButton\n * label=\"Import\"\n * onAction={handleImport}\n * items={[\n * { label: 'Import Liabilities', value: 'liabilities' },\n * { label: 'View Report', value: 'report' },\n * { label: 'Get MI Quote', value: 'mi' },\n * ]}\n * onSelect={handleSelect}\n * />\n *\n * @example\n * <SplitButton label=\"Save\" variant=\"secondary\" onAction={onSave} items={moreActions} onSelect={onSelect} />\n */\nexport const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n (\n {\n label,\n onAction,\n items,\n onSelect,\n variant = 'primary',\n size = 'md',\n leadingIcon,\n disabled = false,\n triggerAriaLabel = 'More options',\n className,\n style,\n },\n externalRef,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setRef = (node: HTMLDivElement | null) => {\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof externalRef === 'function') externalRef(node);\n else if (externalRef) (externalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!internalRef.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n function handleSelect(item: SplitButtonItem) {\n if (item.disabled) return;\n onSelect?.(item.value);\n setIsOpen(false);\n }\n\n const mainCls = [\n styles.main,\n styles[`${variant}Main`],\n size === 'sm' ? styles.mainSm : size === 'lg' ? styles.mainLg : '',\n disabled ? styles.disabled : '',\n ].filter(Boolean).join(' ');\n\n const triggerCls = [\n styles.trigger,\n styles[`${variant}Trigger`],\n size === 'sm' ? styles.triggerSm : size === 'lg' ? styles.triggerLg : '',\n isOpen ? styles.triggerOpen : '',\n disabled ? styles.disabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={setRef}\n className={[styles.root, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Main action button ── */}\n <button\n type=\"button\"\n className={mainCls}\n onClick={() => !disabled && onAction?.()}\n disabled={disabled}\n >\n {leadingIcon && (\n <span className={styles.icon} aria-hidden=\"true\">{leadingIcon}</span>\n )}\n <span className={styles.label}>{label}</span>\n </button>\n\n {/* ── Dropdown trigger ── */}\n <button\n type=\"button\"\n className={triggerCls}\n onClick={() => !disabled && setIsOpen(prev => !prev)}\n disabled={disabled}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={triggerAriaLabel}\n >\n <span className={styles.chevron} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {/* ── Dropdown panel ── */}\n {isOpen && (\n <div role=\"menu\" className={styles.dropdown}>\n {items.map((item, i) => (\n <div\n key={item.value ?? i}\n role=\"menuitem\"\n aria-disabled={item.disabled || undefined}\n className={[styles.item, item.disabled ? styles.itemDisabled : ''].filter(Boolean).join(' ')}\n onClick={() => handleSelect(item)}\n tabIndex={item.disabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault();\n handleSelect(item);\n }\n }}\n >\n {item.icon && (\n <span className={styles.itemIcon} aria-hidden=\"true\">{item.icon}</span>\n )}\n <span>{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nSplitButton.displayName = 'SplitButton';\n","import { forwardRef } from 'react';\nimport styles from './Paginator.module.css';\nimport { Select } from '../Select';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PageChangeEvent {\n /** 0-based index of the first record on the new page. */\n first: number;\n /** Records per page. */\n rows: number;\n /** 0-based page number. */\n page: number;\n}\n\nexport interface PaginatorProps {\n /** Total number of records across all pages. */\n totalRecords: number;\n /** 0-based index of the first record on the current page. */\n first: number;\n /** Number of records per page. */\n rows: number;\n /** Called when the user changes the page or rows-per-page. */\n onPageChange: (e: PageChangeEvent) => void;\n /**\n * Layout template.\n * - `'pages'` (default): page-number buttons + rows-per-page select.\n * - `'report'`: \"Showing X to Y of Z entries\" text instead of page buttons.\n * - `'full'`: \"Results per page\" label + select + entry count on the left; page buttons on the right.\n */\n template?: 'pages' | 'report' | 'full';\n /** Options shown in the rows-per-page dropdown. Defaults to `[10, 25, 50, 100]`. */\n rowsPerPageOptions?: number[];\n /** Number of page-number buttons visible at once. Defaults to 5. */\n pageLinkSize?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getPageLinks(\n currentPage: number,\n totalPages: number,\n pageLinkSize: number,\n): (number | '...')[] {\n if (totalPages <= pageLinkSize + 2) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const half = Math.floor(pageLinkSize / 2);\n let start = Math.max(1, currentPage - half);\n let end = Math.min(totalPages, start + pageLinkSize - 1);\n\n if (end - start < pageLinkSize - 1) {\n start = Math.max(1, end - pageLinkSize + 1);\n }\n\n const links: (number | '...')[] = [];\n if (start > 1) { links.push(1); if (start > 2) links.push('...'); }\n for (let i = start; i <= end; i++) links.push(i);\n if (end < totalPages) { if (end < totalPages - 1) links.push('...'); links.push(totalPages); }\n\n return links;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst ChevronFirst = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10 3L6 7l4 4M5 3v8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronPrev = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 3L5 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronNext = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronLast = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 3l4 4-4 4M9 3v8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── NavButton ────────────────────────────────────────────────────────────────\n\ninterface NavButtonProps {\n onClick: () => void;\n disabled?: boolean;\n selected?: boolean;\n 'aria-label': string;\n children: React.ReactNode;\n}\n\nfunction NavButton({ onClick, disabled, selected, 'aria-label': ariaLabel, children }: NavButtonProps) {\n const cls = [\n styles.navBtn,\n selected ? styles.navBtnSelected : '',\n disabled ? styles.navBtnDisabled : '',\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={cls}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-current={selected ? 'page' : undefined}\n >\n <span className={styles.navBtnContent}>{children}</span>\n </button>\n );\n}\n\n// ─── Shared page navigation buttons ──────────────────────────────────────────\n\nfunction PageNav({\n currentPage,\n totalPages,\n pageLinkSize,\n onPage,\n}: {\n currentPage: number;\n totalPages: number;\n pageLinkSize: number;\n onPage: (page: number) => void;\n}) {\n const links = getPageLinks(currentPage, totalPages, pageLinkSize);\n\n return (\n <>\n <NavButton\n onClick={() => onPage(0)}\n disabled={currentPage === 0}\n aria-label=\"First page\"\n >\n <ChevronFirst />\n </NavButton>\n <NavButton\n onClick={() => onPage(currentPage - 1)}\n disabled={currentPage === 0}\n aria-label=\"Previous page\"\n >\n <ChevronPrev />\n </NavButton>\n\n {links.map((link, i) =>\n link === '...' ? (\n <span key={`ellipsis-${i}`} className={styles.ellipsis}>…</span>\n ) : (\n <NavButton\n key={link}\n onClick={() => onPage(link - 1)}\n selected={link - 1 === currentPage}\n aria-label={`Page ${link}`}\n >\n <span className={styles.pageNumber}>{link}</span>\n </NavButton>\n ),\n )}\n\n <NavButton\n onClick={() => onPage(currentPage + 1)}\n disabled={currentPage >= totalPages - 1}\n aria-label=\"Next page\"\n >\n <ChevronNext />\n </NavButton>\n <NavButton\n onClick={() => onPage(totalPages - 1)}\n disabled={currentPage >= totalPages - 1}\n aria-label=\"Last page\"\n >\n <ChevronLast />\n </NavButton>\n </>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\n/**\n * Paginator — Clear Design System\n *\n * Navigation control for paginated content. Works with DataTable or any\n * paginated list. Three layout templates: `pages`, `report`, and `full`.\n *\n * @example\n * // Basic page navigation\n * <Paginator totalRecords={200} first={0} rows={10} onPageChange={setPage} />\n *\n * @example\n * // Text summary instead of page numbers\n * <Paginator totalRecords={200} first={0} rows={10} onPageChange={setPage} template=\"report\" />\n *\n * @example\n * // Full layout with rows-per-page selector\n * <Paginator totalRecords={200} first={0} rows={10} onPageChange={setPage}\n * template=\"full\" rowsPerPageOptions={[10, 25, 50]} />\n */\nexport const Paginator = forwardRef<HTMLDivElement, PaginatorProps>(\n (\n {\n totalRecords,\n first,\n rows,\n onPageChange,\n template = 'pages',\n rowsPerPageOptions = [10, 25, 50, 100],\n pageLinkSize = 5,\n className,\n style,\n },\n ref,\n ) => {\n const totalPages = Math.max(1, Math.ceil(totalRecords / rows));\n const currentPage = Math.floor(first / rows);\n\n function goToPage(page: number) {\n const p = Math.max(0, Math.min(page, totalPages - 1));\n onPageChange({ first: p * rows, rows, page: p });\n }\n\n function changeRows(newRows: number) {\n onPageChange({ first: 0, rows: newRows, page: 0 });\n }\n\n const rowsOptions = rowsPerPageOptions.map(n => ({ label: String(n), value: String(n) }));\n\n // Range display\n const rangeStart = totalRecords === 0 ? 0 : first + 1;\n const rangeEnd = Math.min(first + rows, totalRecords);\n\n const containerClass = [\n styles.container,\n template === 'full' ? styles.containerFull : '',\n className ?? '',\n ].filter(Boolean).join(' ');\n\n // ── Template: report ────────────────────────────────────────────────────\n if (template === 'report') {\n return (\n <div ref={ref} className={containerClass} style={style} role=\"navigation\" aria-label=\"Pagination\">\n <NavButton onClick={() => goToPage(0)} disabled={currentPage === 0} aria-label=\"First page\">\n <ChevronFirst />\n </NavButton>\n <NavButton onClick={() => goToPage(currentPage - 1)} disabled={currentPage === 0} aria-label=\"Previous page\">\n <ChevronPrev />\n </NavButton>\n\n <span className={styles.reportText}>\n Showing {rangeStart} to {rangeEnd} of {totalRecords} entries\n </span>\n\n <NavButton onClick={() => goToPage(currentPage + 1)} disabled={currentPage >= totalPages - 1} aria-label=\"Next page\">\n <ChevronNext />\n </NavButton>\n <NavButton onClick={() => goToPage(totalPages - 1)} disabled={currentPage >= totalPages - 1} aria-label=\"Last page\">\n <ChevronLast />\n </NavButton>\n </div>\n );\n }\n\n // ── Template: full ──────────────────────────────────────────────────────\n if (template === 'full') {\n return (\n <div ref={ref} className={containerClass} style={style} role=\"navigation\" aria-label=\"Pagination\">\n <div className={styles.fullLeft}>\n <span className={styles.rowsLabel}>Results per page:</span>\n <Select\n options={rowsOptions}\n value={String(rows)}\n onChange={v => v && changeRows(Number(v))}\n size=\"sm\"\n style={{ width: 80 }}\n />\n <span className={styles.entriesCount}>{rangeEnd - rangeStart + (totalRecords > 0 ? 1 : 0)} entries</span>\n </div>\n\n <div className={styles.fullRight}>\n <PageNav\n currentPage={currentPage}\n totalPages={totalPages}\n pageLinkSize={pageLinkSize}\n onPage={goToPage}\n />\n </div>\n </div>\n );\n }\n\n // ── Template: pages (default) ───────────────────────────────────────────\n return (\n <div ref={ref} className={containerClass} style={style} role=\"navigation\" aria-label=\"Pagination\">\n <PageNav\n currentPage={currentPage}\n totalPages={totalPages}\n pageLinkSize={pageLinkSize}\n onPage={goToPage}\n />\n\n <Select\n options={rowsOptions}\n value={String(rows)}\n onChange={v => v && changeRows(Number(v))}\n size=\"sm\"\n style={{ width: 80 }}\n />\n </div>\n );\n },\n);\n\nPaginator.displayName = 'Paginator';\n","import { forwardRef, useState, useMemo } from 'react';\nimport styles from './Picklist.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PicklistItem {\n /** Unique identifier for the item. */\n id: string | number;\n /** Default label shown when no itemTemplate is provided. */\n label?: string;\n /** PrimeIcons class name for the item icon (default rendering only). */\n icon?: string;\n /** Prevents this item from being selected or moved. */\n disabled?: boolean;\n /** Any additional data fields (available in itemTemplate). */\n [key: string]: unknown;\n}\n\nexport interface PicklistChangeEvent {\n source: PicklistItem[];\n target: PicklistItem[];\n}\n\nexport interface PicklistProps {\n /** Items available in the source (left) list. */\n sourceItems: PicklistItem[];\n /** Items in the target (right) list. */\n targetItems: PicklistItem[];\n /** Called when items are moved between lists. Receives updated source and target arrays. */\n onChange: (e: PicklistChangeEvent) => void;\n /** Optional header for the source panel. Accepts any ReactNode — string, table header row, etc. */\n sourceHeader?: React.ReactNode;\n /** Optional header for the target panel. Accepts any ReactNode — string, table header row, etc. */\n targetHeader?: React.ReactNode;\n /**\n * Custom render function for each item row content.\n * The Picklist always prepends its own checkbox; this controls everything after it.\n * Defaults to rendering `[icon?] label`.\n */\n itemTemplate?: (item: PicklistItem) => React.ReactNode;\n /** Show a filter/search input at the top of each panel. */\n filter?: boolean;\n /** Placeholder for the source panel filter input. */\n sourceFilterPlaceholder?: string;\n /** Placeholder for the target panel filter input. */\n targetFilterPlaceholder?: string;\n /**\n * Show move-all buttons (>> and <<).\n * @default true\n */\n showMoveAll?: boolean;\n /**\n * Show checkboxes on each item row.\n * Set to `false` when items have icons that serve as the visual indicator —\n * selection is then shown via row highlight only.\n * @default true\n */\n showCheckbox?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst ChevronRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M5 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronDoubleRight = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2 3l4 4-4 4M7 3l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9 3L5 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronDoubleLeft = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M12 3L8 7l4 4M7 3L3 7l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"5.5\" cy=\"5.5\" r=\"3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8.5 8.5L11 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 2l8 8M10 2L2 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n// ─── Inline checkbox ──────────────────────────────────────────────────────────\n\nfunction ItemCheckbox({ checked, disabled }: { checked: boolean; disabled?: boolean }) {\n return (\n <span\n className={[\n styles.checkbox,\n checked ? styles.checkboxChecked : '',\n disabled ? styles.checkboxDisabled : '',\n ].filter(Boolean).join(' ')}\n aria-hidden=\"true\"\n >\n {checked && (\n <svg className={styles.checkmark} viewBox=\"0 0 11 11\">\n <polyline points=\"1.5,5.5 4.5,8.5 9.5,2.5\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ─── Control button ───────────────────────────────────────────────────────────\n\nfunction CtrlBtn({\n onClick,\n disabled,\n 'aria-label': ariaLabel,\n children,\n}: {\n onClick: () => void;\n disabled: boolean;\n 'aria-label': string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n className={[styles.ctrlBtn, disabled ? styles.ctrlBtnDisabled : ''].filter(Boolean).join(' ')}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n}\n\n// ─── Panel ────────────────────────────────────────────────────────────────────\n\ninterface PanelProps {\n header?: React.ReactNode;\n items: PicklistItem[];\n selectedIds: Set<string | number>;\n onToggle: (id: string | number) => void;\n itemTemplate?: (item: PicklistItem) => React.ReactNode;\n filter?: boolean;\n filterValue: string;\n onFilterChange: (v: string) => void;\n filterPlaceholder?: string;\n showCheckbox?: boolean;\n ariaLabel: string;\n}\n\nfunction Panel({\n header,\n items,\n selectedIds,\n onToggle,\n itemTemplate,\n filter,\n filterValue,\n onFilterChange,\n filterPlaceholder = 'Filter...',\n showCheckbox = true,\n ariaLabel,\n}: PanelProps) {\n const visible = useMemo(() => {\n if (!filter || !filterValue.trim()) return items;\n const q = filterValue.toLowerCase();\n return items.filter(item => String(item.label ?? '').toLowerCase().includes(q));\n }, [items, filter, filterValue]);\n\n return (\n <div className={styles.panel}>\n {header != null && (\n <div className={styles.panelHeader}>{header}</div>\n )}\n\n {filter && (\n <div className={styles.filterWrap}>\n <span className={styles.filterIcon}><SearchIcon /></span>\n <input\n type=\"text\"\n className={styles.filterInput}\n value={filterValue}\n onChange={e => onFilterChange(e.target.value)}\n placeholder={filterPlaceholder}\n aria-label={`Filter ${ariaLabel}`}\n />\n {filterValue && (\n <button\n type=\"button\"\n className={styles.filterClear}\n onClick={() => onFilterChange('')}\n aria-label=\"Clear filter\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n )}\n\n <ul\n className={styles.list}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-multiselectable=\"true\"\n >\n {visible.map(item => {\n const selected = selectedIds.has(item.id);\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n className={[\n styles.item,\n selected ? styles.itemSelected : '',\n item.disabled ? styles.itemDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => !item.disabled && onToggle(item.id)}\n tabIndex={item.disabled ? -1 : 0}\n onKeyDown={e => {\n if ((e.key === ' ' || e.key === 'Enter') && !item.disabled) {\n e.preventDefault();\n onToggle(item.id);\n }\n }}\n >\n {showCheckbox && <ItemCheckbox checked={selected} disabled={item.disabled} />}\n {itemTemplate ? (\n itemTemplate(item)\n ) : (\n <span className={styles.itemContent}>\n {item.icon && <i className={`${item.icon} ${styles.itemIcon}`} aria-hidden=\"true\" />}\n <span className={styles.itemLabel}>{item.label}</span>\n </span>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n// ─── Picklist ─────────────────────────────────────────────────────────────────\n\n/**\n * Picklist — Clear Design System\n *\n * Two-panel component for moving items between a source list and a target list.\n * Supports checkbox multi-selection, custom item templates (table rows, etc.),\n * optional filter inputs per panel, and optional move-all buttons.\n *\n * The component is fully controlled — `sourceItems` and `targetItems` are props,\n * and `onChange` fires with the updated arrays on every move action.\n *\n * @example\n * // Simple string list\n * <Picklist\n * sourceItems={source}\n * targetItems={target}\n * onChange={({ source, target }) => { setSource(source); setTarget(target); }}\n * sourceHeader=\"Available\"\n * targetHeader=\"Selected\"\n * />\n *\n * @example\n * // Table-style rows\n * <Picklist\n * sourceItems={source}\n * targetItems={target}\n * onChange={...}\n * sourceHeader={<MyTableHeader />}\n * targetHeader={<MyTableHeader />}\n * itemTemplate={(item) => <MyTableRow item={item} />}\n * />\n */\nexport const Picklist = forwardRef<HTMLDivElement, PicklistProps>(\n (\n {\n sourceItems,\n targetItems,\n onChange,\n sourceHeader,\n targetHeader,\n itemTemplate,\n filter = false,\n sourceFilterPlaceholder,\n targetFilterPlaceholder,\n showMoveAll = true,\n showCheckbox = true,\n className,\n style,\n },\n ref,\n ) => {\n const [sourceSelected, setSourceSelected] = useState<Set<string | number>>(new Set());\n const [targetSelected, setTargetSelected] = useState<Set<string | number>>(new Set());\n const [sourceFilter, setSourceFilter] = useState('');\n const [targetFilter, setTargetFilter] = useState('');\n\n function toggleSource(id: string | number) {\n setSourceSelected(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n }\n\n function toggleTarget(id: string | number) {\n setTargetSelected(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n }\n\n function moveSelectedToTarget() {\n const moving = sourceItems.filter(item => sourceSelected.has(item.id));\n const remaining = sourceItems.filter(item => !sourceSelected.has(item.id));\n onChange({ source: remaining, target: [...targetItems, ...moving] });\n setSourceSelected(new Set());\n }\n\n function moveAllToTarget() {\n const movable = sourceItems.filter(item => !item.disabled);\n const remaining = sourceItems.filter(item => item.disabled);\n onChange({ source: remaining, target: [...targetItems, ...movable] });\n setSourceSelected(new Set());\n }\n\n function moveSelectedToSource() {\n const moving = targetItems.filter(item => targetSelected.has(item.id));\n const remaining = targetItems.filter(item => !targetSelected.has(item.id));\n onChange({ source: [...sourceItems, ...moving], target: remaining });\n setTargetSelected(new Set());\n }\n\n function moveAllToSource() {\n const movable = targetItems.filter(item => !item.disabled);\n const remaining = targetItems.filter(item => item.disabled);\n onChange({ source: [...sourceItems, ...movable], target: remaining });\n setTargetSelected(new Set());\n }\n\n const hasSourceSelected = sourceSelected.size > 0;\n const hasTargetSelected = targetSelected.size > 0;\n const hasSourceMovable = sourceItems.some(item => !item.disabled);\n const hasTargetMovable = targetItems.some(item => !item.disabled);\n\n return (\n <div\n ref={ref}\n className={[styles.root, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n <Panel\n header={sourceHeader}\n items={sourceItems}\n selectedIds={sourceSelected}\n onToggle={toggleSource}\n itemTemplate={itemTemplate}\n filter={filter}\n filterValue={sourceFilter}\n onFilterChange={setSourceFilter}\n filterPlaceholder={sourceFilterPlaceholder}\n showCheckbox={showCheckbox}\n ariaLabel=\"Source list\"\n />\n\n <div className={styles.controls} role=\"group\" aria-label=\"Move controls\">\n {showMoveAll && (\n <CtrlBtn\n onClick={moveAllToTarget}\n disabled={!hasSourceMovable}\n aria-label=\"Move all to target\"\n >\n <ChevronDoubleRight />\n </CtrlBtn>\n )}\n <CtrlBtn\n onClick={moveSelectedToTarget}\n disabled={!hasSourceSelected}\n aria-label=\"Move selected to target\"\n >\n <ChevronRight />\n </CtrlBtn>\n <CtrlBtn\n onClick={moveSelectedToSource}\n disabled={!hasTargetSelected}\n aria-label=\"Move selected to source\"\n >\n <ChevronLeft />\n </CtrlBtn>\n {showMoveAll && (\n <CtrlBtn\n onClick={moveAllToSource}\n disabled={!hasTargetMovable}\n aria-label=\"Move all to source\"\n >\n <ChevronDoubleLeft />\n </CtrlBtn>\n )}\n </div>\n\n <Panel\n header={targetHeader}\n items={targetItems}\n selectedIds={targetSelected}\n onToggle={toggleTarget}\n itemTemplate={itemTemplate}\n filter={filter}\n filterValue={targetFilter}\n onFilterChange={setTargetFilter}\n filterPlaceholder={targetFilterPlaceholder}\n showCheckbox={showCheckbox}\n ariaLabel=\"Target list\"\n />\n </div>\n );\n },\n);\n\nPicklist.displayName = 'Picklist';\n","import { forwardRef } from 'react';\nimport styles from './Card.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface CardProps {\n /** Bold primary title rendered at the top of the card. */\n title?: React.ReactNode;\n /** Muted subtitle rendered below the title. */\n subTitle?: React.ReactNode;\n /**\n * Action area rendered at the bottom of the card.\n * Typically contains buttons or links.\n */\n footer?: React.ReactNode;\n /** Card body content. Accepts any ReactNode. */\n children?: React.ReactNode;\n /**\n * Makes the entire card interactive — adds a pointer cursor and a subtle\n * shadow lift on hover. Pass a handler to opt into this mode.\n */\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Card ─────────────────────────────────────────────────────────────────────\n\n/**\n * Card — Clear Design System\n *\n * A surface container with consistent border, radius, and padding. Optionally\n * renders a title, subtitle, body content, and a footer action area.\n * All sections are optional — use what you need.\n *\n * @example\n * // Standard card\n * <Card title=\"Loan Summary\" subTitle=\"Application #12345\" footer={<Button>View</Button>}>\n * <p>Body content goes here.</p>\n * </Card>\n *\n * @example\n * // Content-only container (no header or footer)\n * <Card><DataTable ... /></Card>\n *\n * @example\n * // Interactive / clickable card\n * <Card title=\"Open Application\" onClick={() => navigate('/app/123')}>\n * <p>Click anywhere to open.</p>\n * </Card>\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ title, subTitle, footer, children, onClick, className, style }, ref) => {\n const interactive = onClick != null;\n const hasCaption = title != null || subTitle != null || children != null;\n\n return (\n <div\n ref={ref}\n className={[\n styles.card,\n interactive ? styles.cardClickable : '',\n className ?? '',\n ].filter(Boolean).join(' ')}\n style={style}\n onClick={onClick}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={interactive ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n } : undefined}\n >\n <div className={styles.body}>\n {hasCaption && (\n <div className={styles.caption}>\n {title != null && <div className={styles.title}>{title}</div>}\n {subTitle != null && <div className={styles.subTitle}>{subTitle}</div>}\n {children != null && <div className={styles.content}>{children}</div>}\n </div>\n )}\n {footer != null && <div className={styles.footer}>{footer}</div>}\n </div>\n </div>\n );\n },\n);\n\nCard.displayName = 'Card';\n","import { forwardRef } from 'react';\nimport styles from './Accordion.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AccordionVariant = 'simple' | 'page' | 'panel' | 'flyout';\n\nexport interface AccordionItem {\n /** Unique identifier. */\n id: string;\n /** Header title text. */\n title: string;\n /** Panel body — any ReactNode, including tables, forms, etc. */\n content: React.ReactNode;\n /**\n * Optional count badge shown next to the title.\n * Visible in `panel` and `flyout` variants only.\n */\n badge?: number;\n /**\n * Optional action slot rendered between the title and the chevron.\n * Primarily used in the `simple` variant (e.g. a checkbox + label).\n */\n headerAction?: React.ReactNode;\n /** Prevents toggling when true. */\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n /** Array of accordion items. */\n items: AccordionItem[];\n /**\n * Visual variant.\n * - `simple` — transparent header, teal-700 bottom border + title\n * - `page` — full-width section, gray `#e4e4e4` bg, top-rounded header\n * - `panel` — compact gray `#f4f4f5` header, 32px height, optional badge\n * - `flyout` — medium gray `#f4f4f5` header, 44px height, optional badge\n * @default 'page'\n */\n variant?: AccordionVariant;\n /**\n * IDs of currently open items (controlled).\n * When `multiple` is false, at most one ID should be present.\n */\n openIds: string[];\n /** Called with the new set of open IDs when the user toggles an item. */\n onChange: (ids: string[]) => void;\n /**\n * Allow multiple panels open simultaneously.\n * @default false\n */\n multiple?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Accordion ────────────────────────────────────────────────────────────────\n\n/**\n * Accordion — Clear Design System\n *\n * Collapsible content panels. Fully controlled — pass `openIds` + `onChange`.\n * Four visual variants: `simple` (teal underline), `page`, `panel`, `flyout`\n * (all three use a light gray header).\n *\n * @example\n * const [open, setOpen] = useState(['item1']);\n * <Accordion\n * variant=\"page\"\n * items={[\n * { id: 'item1', title: 'Borrower', content: <BorrowerForm /> },\n * { id: 'item2', title: 'Property', content: <PropertyForm /> },\n * ]}\n * openIds={open}\n * onChange={setOpen}\n * />\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n (\n {\n items,\n variant = 'page',\n openIds,\n onChange,\n multiple = false,\n className,\n style,\n },\n ref,\n ) => {\n const handleToggle = (id: string) => {\n const isOpen = openIds.includes(id);\n if (multiple) {\n onChange(isOpen ? openIds.filter((x) => x !== id) : [...openIds, id]);\n } else {\n onChange(isOpen ? [] : [id]);\n }\n };\n\n return (\n <div\n ref={ref}\n className={[\n styles.accordion,\n styles[`variant_${variant}`],\n className ?? '',\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {items.map((item) => {\n const isOpen = openIds.includes(item.id);\n const headerId = `accordion-header-${item.id}`;\n const panelId = `accordion-panel-${item.id}`;\n const useBadge = (variant === 'panel' || variant === 'flyout') && item.badge != null;\n const useChevronAngle = variant === 'panel' || variant === 'flyout';\n\n return (\n <div\n key={item.id}\n className={[\n styles.item,\n isOpen ? styles.itemOpen : '',\n item.disabled ? styles.itemDisabled : '',\n ].filter(Boolean).join(' ')}\n >\n {/* ── Header ── */}\n <button\n id={headerId}\n className={styles.header}\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => handleToggle(item.id)}\n >\n {/* Left: title + optional badge */}\n <span className={styles.titleGroup}>\n <span className={styles.title}>{item.title}</span>\n {useBadge && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n\n {/* Right: optional action slot + chevron */}\n <span className={styles.headerRight}>\n {item.headerAction != null && (\n <span\n className={styles.headerAction}\n onClick={(e) => e.stopPropagation()}\n >\n {item.headerAction}\n </span>\n )}\n <span\n className={[\n styles.chevron,\n isOpen ? styles.chevronOpen : '',\n ].join(' ')}\n >\n <i\n className={\n useChevronAngle\n ? 'pi pi-angle-down'\n : 'pi pi-chevron-down'\n }\n />\n </span>\n </span>\n </button>\n\n {/* ── Content panel (CSS grid expand) ── */}\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n className={[\n styles.contentOuter,\n isOpen ? styles.contentOpen : '',\n ].join(' ')}\n >\n <div className={styles.contentInner}>\n <div className={styles.contentBody}>{item.content}</div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nAccordion.displayName = 'Accordion';\n","import { forwardRef } from 'react';\nimport styles from './Tabs.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface TabItem {\n /** Unique identifier for this tab. */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (any ReactNode). */\n icon?: React.ReactNode;\n /** Optional trailing count badge. */\n count?: number;\n /**\n * Second icon rendered after the label, before the count.\n * When present a `|` pipe separator is inserted between the label and this icon.\n */\n icon2?: React.ReactNode;\n /** Panel content rendered when this tab is active. */\n content?: React.ReactNode;\n /** Prevents interaction when true. */\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n /** Array of tab definitions. */\n tabs: TabItem[];\n /** Controlled: id of the currently active tab. */\n activeTab: string;\n /** Called with the id of the tab the user selected. */\n onChange: (id: string) => void;\n /**\n * Visual + structural variant.\n * - `'panel'` (default): tab strip + content panel for the active tab.\n * - `'nav'`: navigation-only strip with larger padding/font; the active\n * tab's `content` is **not** rendered (each tab represents a page or\n * route). Renders as `<nav>` for the right semantics.\n */\n variant?: 'panel' | 'nav';\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Tabs ──────────────────────────────────────────────────────────────────────\n\n/**\n * Tabs — Clear Design System\n *\n * Standard underline-style tab strip. Fully controlled — the parent owns\n * which tab is active. Two variants:\n * - `'panel'` (default): renders the active tab's `content` below the strip.\n * Use for sub-section switching inside a page.\n * - `'nav'`: page-level navigation with larger padding/font; the active\n * tab's `content` is not rendered (each tab is a route/page). Renders\n * as `<nav>` for the right semantics.\n *\n * @example\n * // Panel variant (default) — sub-section switcher with content below.\n * const [active, setActive] = useState('tab1');\n * <Tabs\n * tabs={[\n * { id: 'tab1', label: 'Overview', content: <p>Overview content</p> },\n * { id: 'tab2', label: 'Details', content: <p>Details content</p> },\n * ]}\n * activeTab={active}\n * onChange={setActive}\n * />\n *\n * @example\n * // Nav variant — top-level page navigation, no content panel.\n * <Tabs\n * variant=\"nav\"\n * tabs={[\n * { id: 'pricing', label: 'Run Pricing' },\n * { id: 'scenarios', label: 'Lead Scenarios' },\n * { id: 'templates', label: 'Scenario Templates' },\n * ]}\n * activeTab={page}\n * onChange={setPage}\n * />\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n ({ tabs, activeTab, onChange, variant = 'panel', className, style }, ref) => {\n const activeItem = tabs.find((t) => t.id === activeTab);\n const isNav = variant === 'nav';\n const Root = isNav ? 'nav' : 'div';\n\n return (\n <Root\n ref={ref as React.Ref<HTMLDivElement & HTMLElement>}\n className={[\n styles.tabs,\n isNav ? styles.nav : '',\n className ?? '',\n ].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Tab strip ── */}\n <div className={styles.tablist} role={isNav ? undefined : 'tablist'}>\n {tabs.map((tab) => {\n const isActive = tab.id === activeTab;\n const panelId = `tabpanel-${tab.id}`;\n const tabId = `tab-${tab.id}`;\n\n return (\n <button\n key={tab.id}\n id={tabId}\n role={isNav ? undefined : 'tab'}\n aria-selected={isNav ? undefined : isActive}\n aria-current={isNav && isActive ? 'page' : undefined}\n aria-disabled={tab.disabled}\n aria-controls={isNav ? undefined : panelId}\n disabled={tab.disabled}\n className={[\n styles.tab,\n isActive ? styles.tabActive : '',\n tab.disabled ? styles.tabDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => {\n if (!tab.disabled) onChange(tab.id);\n }}\n >\n {tab.icon != null && (\n <span className={styles.tabIcon}>{tab.icon}</span>\n )}\n <span className={styles.tabLabel}>{tab.label}</span>\n {tab.icon2 != null && (\n <>\n <span className={styles.tabPipe}>|</span>\n <span className={styles.tabIcon}>{tab.icon2}</span>\n </>\n )}\n {tab.count != null && (\n <span className={styles.tabCount}>{tab.count}</span>\n )}\n </button>\n );\n })}\n </div>\n\n {/* ── Content panel (panel variant only — nav variant is strip-only) ── */}\n {!isNav && activeItem != null && activeItem.content != null && (\n <div\n id={`tabpanel-${activeItem.id}`}\n role=\"tabpanel\"\n aria-labelledby={`tab-${activeItem.id}`}\n className={styles.panel}\n >\n {activeItem.content}\n </div>\n )}\n </Root>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n","import { forwardRef, useRef, useState, useEffect, useCallback } from 'react';\nimport styles from './BannerTabs.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type StatusShape = 'dot' | 'diamond' | 'square' | 'none';\nexport type StatusColor = 'green' | 'yellow' | 'red' | 'gray';\n\nexport interface BannerTabStatus {\n shape: StatusShape;\n color: StatusColor;\n}\n\nexport type BadgeShape = 'square' | 'diamond' | 'circle';\n\nexport interface BannerTabBadge {\n /** The number shown inside the badge. */\n count: number;\n /** Tooltip text revealed on hover. */\n tooltip: string;\n /**\n * Shape of the badge.\n * Defaults per position: 0 → square, 1 → diamond, 2 → circle.\n */\n shape?: BadgeShape;\n /**\n * CSS color value for the badge fill.\n * Defaults per position: 0 → --red-500, 1 → --yellow-500, 2 → --green-300.\n * When count is 0, always renders in muted gray regardless of this value.\n */\n color?: string;\n}\n\nexport interface BannerTabBadgeGroup {\n /** Ordered list of badge definitions within this group. */\n badges: BannerTabBadge[];\n}\n\nexport interface BannerTabItem {\n /** Unique identifier. */\n id: string;\n /** Primary label (\"DU\", \"Loan Summary\"). */\n label: string;\n /** Secondary label after \"/\" (\"LPA\" in \"DU / LPA\"). */\n subLabel?: string;\n /** Muted status line (\"Not Complete\", \"Rep. Score 732\"). */\n subtitle: string;\n /** Primary status indicator shape + color. */\n status: BannerTabStatus;\n /** Secondary status indicator (used alongside subLabel). */\n subStatus?: BannerTabStatus;\n /** Shows a lock icon after the label. */\n locked?: boolean;\n /**\n * One or more groups of count badges rendered below the subtitle.\n * Multiple groups are separated by a pipe ( | ).\n * Each badge defaults to square/diamond/circle with red/yellow/green fills\n * by position — override per badge with `shape` and `color`.\n */\n badgeGroups?: BannerTabBadgeGroup[];\n /** Custom docs/badge row rendered at the bottom of the card. */\n docs?: React.ReactNode;\n /** Prevents interaction when true. */\n disabled?: boolean;\n}\n\nexport interface BannerTabsProps {\n /** Array of banner tab definitions. */\n items: BannerTabItem[];\n /** Controlled: id of the active item, or null for none. */\n activeId: string | null;\n /** Called with the id when the user selects a tab. */\n onChange: (id: string) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Status indicator ─────────────────────────────────────────────────────────\n\nconst COLOR_MAP: Record<StatusColor, string> = {\n green: '#66BB5F',\n yellow: '#F5C664',\n red: '#E53935',\n gray: 'transparent',\n};\n\nconst BORDER_MAP: Record<StatusColor, string> = {\n green: '#66BB5F',\n yellow: '#F5C664',\n red: '#E53935',\n gray: '#94A3B8',\n};\n\nfunction StatusIndicator({ shape, color }: BannerTabStatus) {\n const fill = COLOR_MAP[color];\n const border = BORDER_MAP[color];\n const size = 9;\n\n if (shape === 'dot') {\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: fill,\n border: `1px solid ${border}`,\n flexShrink: 0,\n }}\n />\n );\n }\n\n if (shape === 'diamond') {\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n background: fill,\n border: `1px solid ${border}`,\n transform: 'rotate(45deg)',\n flexShrink: 0,\n }}\n />\n );\n }\n\n if (shape === 'square') {\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n background: fill,\n border: `1px solid ${border}`,\n flexShrink: 0,\n }}\n />\n );\n }\n\n // 'none' → hollow circle\n return (\n <span\n className={styles.statusIndicator}\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: 'transparent',\n border: `1.5px solid #94A3B8`,\n flexShrink: 0,\n }}\n />\n );\n}\n\n// ─── Badge defaults (by position) ─────────────────────────────────────────────\n\n// First badge group: square/diamond/circle, red-500/yellow-500/green-300\nconst BADGE_DEFAULTS_GROUP0: Array<{ shape: BadgeShape; color: string }> = [\n { shape: 'square', color: 'var(--red-500, #EB1000)' },\n { shape: 'diamond', color: 'var(--yellow-500, #FBDE0B)' },\n { shape: 'circle', color: 'var(--green-300, #6FB864)' },\n];\n\n// Subsequent badge groups: all squares, teal-600 / green-600 / teal-500\nconst BADGE_DEFAULTS_GROUP_N: Array<{ shape: BadgeShape; color: string }> = [\n { shape: 'square', color: 'var(--teal-600, #138890)' },\n { shape: 'square', color: 'var(--green-600, #22A34A)' },\n { shape: 'square', color: 'var(--teal-500, #32A4AC)' },\n];\n\nconst BADGE_ZERO_COLOR = 'var(--surface-500, #ADB5BD)';\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nfunction TabBadge({ shape, color, count, tooltip, diamondGroup0 }: {\n shape: BadgeShape;\n color: string;\n count: number;\n tooltip: string;\n /** True when this is the diamond badge in the first group — uses navy-800 text. */\n diamondGroup0?: boolean;\n}) {\n const disabled = count === 0;\n const bg = disabled ? BADGE_ZERO_COLOR : color;\n // Disabled → navy-900; diamond in group 0 → navy-800; everything else → white\n const numColor = disabled\n ? 'var(--navy-900, #0D1117)'\n : diamondGroup0\n ? 'var(--navy-800, #171D22)'\n : '#ffffff';\n\n return (\n <span className={styles.badge} data-tooltip={tooltip}>\n <span\n className={[\n styles.badgeShape,\n shape === 'circle' ? styles.badgeShapeCircle : '',\n shape === 'diamond' ? styles.badgeShapeDiamond : '',\n ].filter(Boolean).join(' ')}\n style={{ background: bg }}\n />\n <span className={styles.badgeNum} style={{ color: numColor }}>{count}</span>\n </span>\n );\n}\n\n// ─── BannerTabs ───────────────────────────────────────────────────────────────\n\n/**\n * BannerTabs — Clear Design System\n *\n * Scrollable horizontal strip of card-shaped navigation tabs. Each card shows\n * a status indicator, primary label, optional secondary label, a muted\n * subtitle, and optional count badge groups. Overflow is handled with\n * left/right arrow buttons and a fade gradient on the right edge.\n *\n * Fully controlled — the parent owns which tab is active.\n *\n * @example\n * const [active, setActive] = useState('loan-summary');\n * <BannerTabs items={loanStages} activeId={active} onChange={setActive} />\n */\nexport const BannerTabs = forwardRef<HTMLDivElement, BannerTabsProps>(\n ({ items, activeId, onChange, className, style }, ref) => {\n const trackRef = useRef<HTMLDivElement>(null);\n const [showLeft, setShowLeft] = useState(false);\n const [showRight, setShowRight] = useState(false);\n\n const updateArrows = useCallback(() => {\n const el = trackRef.current;\n if (el == null) return;\n setShowLeft(el.scrollLeft > 0);\n setShowRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n }, []);\n\n useEffect(() => {\n const el = trackRef.current;\n if (el == null) return;\n\n updateArrows();\n\n el.addEventListener('scroll', updateArrows, { passive: true });\n const ro = new ResizeObserver(updateArrows);\n ro.observe(el);\n\n return () => {\n el.removeEventListener('scroll', updateArrows);\n ro.disconnect();\n };\n }, [updateArrows]);\n\n const scrollBy = (direction: 'left' | 'right') => {\n trackRef.current?.scrollBy({\n left: direction === 'left' ? -200 : 200,\n behavior: 'smooth',\n });\n };\n\n return (\n <div\n ref={ref}\n className={[styles.bannerTabs, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Left arrow ── */}\n {showLeft && (\n <button\n className={[styles.arrow, styles.arrowLeft].join(' ')}\n onClick={() => scrollBy('left')}\n aria-label=\"Scroll left\"\n tabIndex={-1}\n >\n <i className=\"pi pi-chevron-left\" />\n </button>\n )}\n\n {/* ── Scroll track ── */}\n <div className={styles.track} ref={trackRef}>\n {items.map((item) => {\n const isActive = item.id === activeId;\n\n return (\n <button\n key={item.id}\n className={[\n styles.card,\n isActive ? styles.cardActive : '',\n item.disabled ? styles.cardDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => {\n if (!item.disabled) onChange(item.id);\n }}\n disabled={item.disabled}\n aria-pressed={isActive}\n aria-disabled={item.disabled}\n >\n {/* Row 1: status + label + subLabel + lock */}\n <div className={styles.labelRow}>\n <StatusIndicator shape={item.status.shape} color={item.status.color} />\n <span className={styles.label}>{item.label}</span>\n {item.subLabel != null && (\n <>\n <span className={styles.labelSep}>/</span>\n {item.subStatus != null && (\n <StatusIndicator shape={item.subStatus.shape} color={item.subStatus.color} />\n )}\n <span className={styles.label}>{item.subLabel}</span>\n </>\n )}\n {item.locked && (\n <i className={`pi pi-lock ${styles.lockIcon}`} />\n )}\n </div>\n\n {/* Row 2: subtitle */}\n <div className={styles.subtitle}>{item.subtitle}</div>\n\n {/* Row 3 (optional): structured count badge groups */}\n {item.badgeGroups != null && item.badgeGroups.length > 0 && (\n <div className={styles.badgeGroups}>\n {item.badgeGroups.map((group, gi) => (\n <div key={gi} className={styles.badgeGroupWrap}>\n {gi > 0 && <span className={styles.badgeGroupPipe}>|</span>}\n <div className={styles.badgeGroup}>\n {group.badges.map((badge, bi) => {\n const defaults = gi === 0 ? BADGE_DEFAULTS_GROUP0 : BADGE_DEFAULTS_GROUP_N;\n const def = defaults[bi] ?? { shape: 'square' as BadgeShape, color: 'var(--teal-600, #138890)' };\n const resolvedShape = badge.shape ?? def.shape;\n return (\n <TabBadge\n key={bi}\n shape={resolvedShape}\n color={badge.color ?? def.color}\n count={badge.count}\n tooltip={badge.tooltip}\n diamondGroup0={gi === 0 && resolvedShape === 'diamond'}\n />\n );\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Row 4 (optional): freeform docs slot */}\n {item.docs != null && (\n <div className={styles.docs}>{item.docs}</div>\n )}\n </button>\n );\n })}\n </div>\n\n {/* ── Right fade + arrow ── */}\n {showRight && (\n <>\n <div className={styles.fadeMask} />\n <button\n className={[styles.arrow, styles.arrowRight].join(' ')}\n onClick={() => scrollBy('right')}\n aria-label=\"Scroll right\"\n tabIndex={-1}\n >\n <i className=\"pi pi-chevron-right\" />\n </button>\n </>\n )}\n </div>\n );\n },\n);\n\nBannerTabs.displayName = 'BannerTabs';\n","import { forwardRef, useEffect, useRef, useState, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from '../Button';\nimport { CloseButton } from '../CloseButton';\nimport styles from './Drawer.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface DrawerAction {\n /** Button label */\n label: string;\n /** Called when the button is clicked */\n onClick: () => void;\n /** Disables the button */\n disabled?: boolean;\n}\n\nexport interface DrawerProps {\n /** Controls open/closed state */\n isOpen: boolean;\n /** Called when ✕ is clicked, scrim is clicked, or Escape is pressed */\n onClose: () => void;\n /** Panel heading */\n title?: string;\n /** Optional subtitle rendered below the title — any ReactNode */\n subtitle?: React.ReactNode;\n /** Scrollable body content */\n children: React.ReactNode;\n /**\n * Required primary action (right-aligned, primary variant).\n * Always rendered.\n */\n primaryAction: DrawerAction;\n /** Optional secondary action (right-aligned, secondary variant, left of primary) */\n secondaryAction?: DrawerAction;\n /**\n * Optional tertiary actions (left-aligned, ghost variant).\n * Multiple are supported — they appear to the left of the footer.\n */\n tertiaryActions?: DrawerAction[];\n /**\n * Which edge the drawer slides in from.\n * @default 'right'\n */\n side?: 'left' | 'right';\n /**\n * Panel width in px.\n * @default 800\n */\n width?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Drawer ───────────────────────────────────────────────────────────────────\n\n/**\n * Drawer — Clear Design System\n *\n * A full-height panel that slides in from the left or right edge, sitting on\n * top of page content with a dark scrim behind it. Unlike SidePanel, Drawer\n * does not push page content — it overlays it like a modal.\n *\n * The footer is always present with structured action buttons. A gradient\n * shadow appears above the footer when the body content overflows (indicating\n * more scrollable content below).\n *\n * Fully controlled — pass `isOpen` + `onClose`. Closes on ✕ click, scrim\n * click, or Escape key.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * <Drawer\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"Review Documents\"\n * primaryAction={{ label: 'Save', onClick: handleSave }}\n * secondaryAction={{ label: 'Cancel', onClick: () => setOpen(false) }}\n * >\n * <p>Drawer content here…</p>\n * </Drawer>\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(\n (\n {\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n primaryAction,\n secondaryAction,\n tertiaryActions,\n side = 'right',\n width = 800,\n className,\n style,\n },\n ref,\n ) => {\n const bodyRef = useRef<HTMLDivElement>(null);\n const [showFooterShadow, setShowFooterShadow] = useState(false);\n\n // ── Close on Escape ──────────────────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, onClose]);\n\n // ── Footer shadow: visible when body has overflow below scroll position ──\n const checkScroll = useCallback(() => {\n const el = bodyRef.current;\n if (!el) { setShowFooterShadow(false); return; }\n const hasMoreBelow = el.scrollHeight - el.scrollTop - el.clientHeight > 2;\n setShowFooterShadow(hasMoreBelow);\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n // Run on next tick so the DOM has rendered\n const raf = requestAnimationFrame(checkScroll);\n const el = bodyRef.current;\n if (!el) return;\n el.addEventListener('scroll', checkScroll);\n const ro = new ResizeObserver(checkScroll);\n ro.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n el.removeEventListener('scroll', checkScroll);\n ro.disconnect();\n };\n }, [isOpen, checkScroll]);\n\n const panelClass = [\n styles.drawer,\n styles[`side_${side}`],\n isOpen ? styles.open : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const overlayClass = [styles.overlay, isOpen ? styles.overlayOpen : '']\n .filter(Boolean)\n .join(' ');\n\n return createPortal(\n <div\n className={overlayClass}\n data-side={side}\n onClick={isOpen ? onClose : undefined}\n aria-hidden={!isOpen}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Drawer'}\n className={panelClass}\n style={{ width, ...style }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n <div className={styles.header}>\n <div className={styles.headerTitle}>\n {title && <span className={styles.title}>{title}</span>}\n {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n <CloseButton aria-label=\"Close drawer\" onClick={onClose} />\n </div>\n\n {/* ── Scrollable body ── */}\n <div ref={bodyRef} className={styles.body}>\n {children}\n </div>\n\n {/* ── Footer ── */}\n <div className={styles.footer}>\n {showFooterShadow && <div className={styles.footerShadow} aria-hidden=\"true\" />}\n\n {tertiaryActions && tertiaryActions.length > 0 && (\n <div className={styles.tertiaryGroup}>\n {tertiaryActions.map((action, i) => (\n <Button\n key={i}\n variant=\"ghost\"\n size=\"sm\"\n onClick={action.onClick}\n disabled={action.disabled}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n\n {secondaryAction && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={secondaryAction.onClick}\n disabled={secondaryAction.disabled}\n >\n {secondaryAction.label}\n </Button>\n )}\n\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={primaryAction.onClick}\n disabled={primaryAction.disabled}\n >\n {primaryAction.label}\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n );\n },\n);\n\nDrawer.displayName = 'Drawer';\n","import { useEffect, useState, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseButton } from '../CloseButton/CloseButton';\nimport styles from './Toast.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ToastSeverity = 'success' | 'info' | 'warn' | 'error';\nexport type ToastLayout = 'horizontal' | 'vertical';\n\nexport interface ToastOptions {\n /**\n * How the title and detail are arranged.\n * - `horizontal` (default): title and detail on one line — for short messages.\n * - `vertical`: title on top, detail below — for longer descriptions.\n */\n layout?: ToastLayout;\n /**\n * Auto-dismiss delay in ms. Set to `0` to disable auto-dismiss.\n * @default 5000\n */\n duration?: number;\n}\n\ninterface ToastItem extends ToastOptions {\n id: string;\n severity: ToastSeverity;\n /** Bold heading text */\n title: string;\n /** Optional supporting detail */\n detail?: string;\n /** Internal — tracks exit animation */\n exiting?: boolean;\n}\n\n// ─── Singleton store ──────────────────────────────────────────────────────────\n\ntype Listener = (items: ToastItem[]) => void;\nconst listeners = new Set<Listener>();\nlet _items: ToastItem[] = [];\n\nfunction emit() {\n listeners.forEach((l) => l([..._items]));\n}\n\nfunction removeItem(id: string) {\n // Mark as exiting first (triggers CSS exit animation)\n _items = _items.map((i) => (i.id === id ? { ...i, exiting: true } : i));\n emit();\n // Remove from DOM after animation completes\n setTimeout(() => {\n _items = _items.filter((i) => i.id !== id);\n emit();\n }, 300);\n}\n\nfunction addItem(\n severity: ToastSeverity,\n title: string,\n detail?: string,\n opts: ToastOptions = {},\n) {\n const item: ToastItem = {\n id: crypto.randomUUID(),\n severity,\n title,\n detail,\n layout: opts.layout ?? 'horizontal',\n duration: opts.duration ?? 5000,\n };\n _items = [..._items, item];\n emit();\n\n if (item.duration! > 0) {\n setTimeout(() => removeItem(item.id), item.duration);\n }\n}\n\n// ─── Public imperative API ────────────────────────────────────────────────────\n\n/**\n * Imperative toast API. Requires `<Toaster />` to be mounted in the app.\n *\n * @example\n * toast.success('Saved', 'Loan application saved successfully.');\n * toast.error('Failed', 'Unable to update loan. Please try again.');\n */\nexport const toast = {\n success: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('success', title, detail, opts),\n info: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('info', title, detail, opts),\n warn: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('warn', title, detail, opts),\n error: (title: string, detail?: string, opts?: ToastOptions) =>\n addItem('error', title, detail, opts),\n};\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst SEVERITY_CONFIG: Record<\n ToastSeverity,\n { icon: string; bgVar: string; borderVar: string; titleVar: string; iconVar: string }\n> = {\n success: {\n icon: 'pi-check',\n bgVar: '--green-50',\n borderVar: '--green-700',\n titleVar: '--green-700',\n iconVar: '--green-600',\n },\n info: {\n icon: 'pi-info-circle',\n bgVar: '--blue-50',\n borderVar: '--blue-600',\n titleVar: '--blue-600',\n iconVar: '--blue-600',\n },\n warn: {\n icon: 'pi-exclamation-triangle',\n bgVar: '--yellow-50',\n borderVar: '--yellow-800',\n titleVar: '--yellow-800',\n iconVar: '--yellow-600',\n },\n error: {\n icon: 'pi-times-circle',\n bgVar: '--red-50',\n borderVar: '--red-600',\n titleVar: '--red-600',\n iconVar: '--red-500',\n },\n};\n\n// Hardcoded fallbacks for each severity (for environments where tokens aren't loaded)\nconst SEVERITY_FALLBACKS: Record<ToastSeverity, { bg: string; border: string; title: string; icon: string }> = {\n success: { bg: '#edf8ea', border: '#1a760b', title: '#1a760b', icon: '#16a34a' },\n info: { bg: '#f5f9ff', border: '#326fd1', title: '#326fd1', icon: '#2563eb' },\n warn: { bg: '#fffce7', border: '#695d05', title: '#695d05', icon: '#ca8a04' },\n error: { bg: '#fff5f5', border: '#d60f00', title: '#d60f00', icon: '#dc2626' },\n};\n\n// ─── Single toast item ────────────────────────────────────────────────────────\n\ninterface ToastItemProps extends ToastItem {\n onClose: () => void;\n}\n\nfunction ToastItemView({ id, severity, title, detail, layout = 'horizontal', exiting, onClose }: ToastItemProps) {\n const cfg = SEVERITY_CONFIG[severity];\n const fb = SEVERITY_FALLBACKS[severity];\n const descId = `toast-desc-${id}`;\n const isVertical = layout === 'vertical';\n\n const cssVars = {\n '--t-bg': `var(${cfg.bgVar}, ${fb.bg})`,\n '--t-border': `var(${cfg.borderVar}, ${fb.border})`,\n '--t-title': `var(${cfg.titleVar}, ${fb.title})`,\n '--t-icon': `var(${cfg.iconVar}, ${fb.icon})`,\n } as React.CSSProperties;\n\n return (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n aria-describedby={detail ? descId : undefined}\n className={[styles.toast, exiting ? styles.toastExit : styles.toastEnter].join(' ')}\n style={cssVars}\n >\n <div className={[styles.content, isVertical ? styles.contentVertical : styles.contentHorizontal].join(' ')}>\n {/* Icon */}\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n\n {/* Text */}\n <div className={[styles.text, isVertical ? styles.textVertical : styles.textHorizontal].join(' ')}>\n <span className={styles.title}>{title}</span>\n {detail && (\n <span id={descId} className={styles.detail}>\n {detail}\n </span>\n )}\n </div>\n\n {/* Close */}\n <CloseButton aria-label=\"Dismiss notification\" onClick={onClose} />\n </div>\n </div>\n );\n}\n\n// ─── Toaster container ────────────────────────────────────────────────────────\n\n/**\n * Toaster — mount once in your app root to enable toast notifications.\n *\n * @example\n * // In App.tsx or layout root:\n * <Toaster />\n *\n * // Anywhere else:\n * toast.success('Saved', 'Your changes have been saved.');\n */\nexport function Toaster() {\n const [items, setItems] = useState<ToastItem[]>([]);\n\n useEffect(() => {\n listeners.add(setItems);\n return () => {\n listeners.delete(setItems);\n };\n }, []);\n\n if (items.length === 0) return null;\n\n return createPortal(\n <div className={styles.container} aria-label=\"Notifications\">\n {items.map((item) => (\n <ToastItemView\n key={item.id}\n {...item}\n onClose={() => removeItem(item.id)}\n />\n ))}\n </div>,\n document.body,\n );\n}\n\nToaster.displayName = 'Toaster';\n\n// ─── Static Toast (for Storybook / testing without Toaster) ──────────────────\n\nexport interface StaticToastProps {\n severity: ToastSeverity;\n title: string;\n detail?: string;\n layout?: ToastLayout;\n onClose?: () => void;\n}\n\n/**\n * A static, non-dismissing version of a single toast — useful for Storybook\n * and visual testing without needing the imperative API.\n */\nexport function Toast({ severity, title, detail, layout = 'horizontal', onClose }: StaticToastProps) {\n const id = useId();\n return (\n <ToastItemView\n id={id}\n severity={severity}\n title={title}\n detail={detail}\n layout={layout}\n onClose={onClose ?? (() => {})}\n />\n );\n}\n\nToast.displayName = 'Toast';\n","import styles from './ProgressBar.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProgressBarProps {\n /**\n * Current progress value. Clamped to [0, max].\n */\n value: number;\n /**\n * Maximum value. Defaults to 100.\n * @default 100\n */\n max?: number;\n /**\n * Puts the bar into an error state — hides the fill and shows `errorMessage` in red.\n */\n error?: boolean;\n /**\n * Error message shown below the track when `error` is true.\n */\n errorMessage?: string;\n /** Accessible label describing what is being measured. */\n 'aria-label'?: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ProgressBar({\n value,\n max = 100,\n error = false,\n errorMessage,\n 'aria-label': ariaLabel,\n}: ProgressBarProps) {\n const clamped = Math.min(Math.max(value, 0), max);\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n\n return (\n <div className={styles.wrapper}>\n <div\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={ariaLabel}\n className={[styles.track, error ? styles.trackError : ''].join(' ').trim()}\n >\n {!error && (\n <div\n className={styles.fill}\n style={{ width: `${pct}%` }}\n />\n )}\n </div>\n {error && errorMessage && (\n <p className={styles.errorMessage}>{errorMessage}</p>\n )}\n </div>\n );\n}\n\nProgressBar.displayName = 'ProgressBar';\n","export default \"data:image/png;base64,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\"","import { useId } from 'react';\nimport clearLogo from './clear-logo.png';\nimport styles from './ProgressSpinner.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProgressSpinnerProps {\n /**\n * Spinner size.\n * - `sm` — 20px ring\n * - `md` — 32px ring (default)\n * - `lg` — 36px ring with the CLEAR logo centered inside\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Text label displayed below the spinner. Primarily designed for the `lg` variant.\n */\n label?: string;\n /**\n * Adjusts the label text color for placement on light or dark backgrounds.\n * @default 'light'\n */\n theme?: 'light' | 'dark';\n /** Accessible label describing the loading state. */\n 'aria-label'?: string;\n}\n\n// ─── Size config ──────────────────────────────────────────────────────────────\n\nconst SIZE_CONFIG = {\n sm: { px: 20, r: 8.5, sw: 3 },\n md: { px: 32, r: 14.5, sw: 3 },\n lg: { px: 36, r: 16.5, sw: 3 },\n} as const;\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ProgressSpinner({\n size = 'md',\n label,\n theme = 'light',\n 'aria-label': ariaLabel,\n}: ProgressSpinnerProps) {\n const id = useId();\n const gradId = `ps-grad-${id.replace(/:/g, '')}`;\n\n const { px, r, sw } = SIZE_CONFIG[size];\n const circumference = 2 * Math.PI * r;\n const arcLength = circumference * 0.75;\n const gapLength = circumference * 0.25;\n\n const isLg = size === 'lg';\n\n return (\n <div\n className={styles.wrapper}\n role=\"status\"\n aria-label={ariaLabel ?? 'Loading'}\n >\n {/* Spinner ring */}\n <div className={[styles.ring, isLg ? styles.ringLg : ''].join(' ').trim()}>\n <svg\n width={px}\n height={px}\n viewBox={`0 0 ${px} ${px}`}\n className={styles.svg}\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id={gradId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--teal-600, #138890)\" />\n <stop offset=\"100%\" stopColor=\"var(--green-300, #6FB864)\" />\n </linearGradient>\n </defs>\n\n {/* Track */}\n <circle\n cx={px / 2}\n cy={px / 2}\n r={r}\n fill=\"none\"\n stroke=\"var(--surface-300, #F4F4F5)\"\n strokeWidth={sw}\n />\n\n {/* Gradient arc */}\n <circle\n cx={px / 2}\n cy={px / 2}\n r={r}\n fill=\"none\"\n stroke={`url(#${gradId})`}\n strokeWidth={sw}\n strokeDasharray={`${arcLength} ${gapLength}`}\n strokeLinecap=\"round\"\n />\n </svg>\n\n {/* Logo centered inside lg ring */}\n {isLg && (\n <img\n src={clearLogo}\n alt=\"\"\n aria-hidden=\"true\"\n className={styles.logo}\n />\n )}\n </div>\n\n {/* Label */}\n {label && (\n <span className={[styles.label, styles[`label--${theme}`]].join(' ')}>\n {label}\n </span>\n )}\n </div>\n );\n}\n\nProgressSpinner.displayName = 'ProgressSpinner';\n","import styles from './SeverityChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type SeverityChipVariant = 'plain' | 'contrast' | 'error' | 'warning' | 'informative' | 'success';\n\nexport interface SeverityChipProps {\n label: string;\n severity: SeverityChipVariant;\n /**\n * Whether the dismiss (✕) button is shown.\n * @default true\n */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<SeverityChipVariant, { bgVar: string; bg: string; textVar?: string; text: string }> = {\n plain: { bgVar: '--navy-50', bg: '#EAEBEC', textVar: '--teal-900', text: '#18474A' },\n contrast: { bgVar: '--teal-900', bg: '#18474A', text: '#ffffff' },\n error: { bgVar: '--red-500', bg: '#EB1000', text: '#ffffff' },\n warning: { bgVar: '--yellow-400', bg: '#FCE53C', textVar: '--yellow-900', text: '#514908' },\n informative: { bgVar: '--blue-400', bg: '#609AF8', text: '#ffffff' },\n success: { bgVar: '--green-500', bg: '#1E830E', text: '#ffffff' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function SeverityChip({ label, severity, dismissible = true, onDismiss }: SeverityChipProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--c-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--c-text': cfg.textVar ? `var(${cfg.textVar}, ${cfg.text})` : cfg.text,\n } as React.CSSProperties;\n\n return (\n <span className={styles.chip} style={cssVars}>\n <span className={styles.label}>{label}</span>\n {dismissible && (\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label={`Remove ${label}`}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n}\n\nSeverityChip.displayName = 'SeverityChip';\n","import type { ReactNode } from 'react';\nimport styles from './ProfileChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProfileChipProps {\n label: string;\n /**\n * Content shown to the left of the label (avatar, icon, initials, etc.).\n * Rendered in a 18×18px circular clip.\n */\n leading?: ReactNode;\n /**\n * Content shown to the right of the label (avatar, icon, initials, etc.).\n * Rendered in a 18×18px circular clip.\n */\n trailing?: ReactNode;\n /**\n * Whether the dismiss (✕) button is shown.\n * @default true\n */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ProfileChip({ label, leading, trailing, dismissible = true, onDismiss }: ProfileChipProps) {\n return (\n <span\n className={styles.chip}\n data-leading={leading ? 'true' : undefined}\n data-trailing={trailing ? 'true' : undefined}\n >\n {leading && <span className={styles.avatar}>{leading}</span>}\n <span className={styles.label}>{label}</span>\n {trailing && <span className={styles.avatar}>{trailing}</span>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label={`Remove ${label}`}\n >\n <i className=\"pi pi-times\" aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n}\n\nProfileChip.displayName = 'ProfileChip';\n","import styles from './AUSChip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AUSChipColor = 'green' | 'red' | 'yellow' | 'grey';\n\nexport interface AUSChipProps {\n label: string;\n /** AUS finding color — maps to standard severity tokens. */\n color: AUSChipColor;\n}\n\n// ─── Dot color config ─────────────────────────────────────────────────────────\n\nconst DOT_CONFIG: Record<AUSChipColor, { dotVar: string; dot: string }> = {\n green: { dotVar: '--green-500', dot: '#1E830E' },\n red: { dotVar: '--red-500', dot: '#EB1000' },\n yellow: { dotVar: '--yellow-400', dot: '#FCE53C' },\n grey: { dotVar: '--navy-300', dot: '#70777D' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function AUSChip({ label, color }: AUSChipProps) {\n const cfg = DOT_CONFIG[color];\n\n return (\n <span className={styles.chip}>\n <span\n className={styles.dot}\n style={{ background: `var(${cfg.dotVar}, ${cfg.dot})` }}\n aria-hidden=\"true\"\n />\n <span className={styles.label}>{label}</span>\n </span>\n );\n}\n\nAUSChip.displayName = 'AUSChip';\n","import { CloseButton } from '../CloseButton/CloseButton';\nimport styles from './BannerAlert.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BannerAlertSeverity = 'success' | 'info' | 'warn' | 'error' | 'neutral';\n\nexport interface BannerAlertProps {\n severity: BannerAlertSeverity;\n /** Bold heading text */\n title: string;\n /** Optional supporting detail shown after the title */\n detail?: string;\n /**\n * Whether a dismiss (✕) button is shown.\n * @default true\n */\n closable?: boolean;\n onClose?: () => void;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<\n BannerAlertSeverity,\n { icon: string; bgVar: string; borderVar: string; colorVar: string; bg: string; border: string; color: string }\n> = {\n success: { icon: 'pi-check', bgVar: '--green-50', borderVar: '--green-700', colorVar: '--green-700', bg: '#edf8ea', border: '#1a760b', color: '#1a760b' },\n info: { icon: 'pi-info-circle', bgVar: '--blue-50', borderVar: '--blue-600', colorVar: '--blue-600', bg: '#f5f9ff', border: '#326fd1', color: '#326fd1' },\n warn: { icon: 'pi-exclamation-triangle', bgVar: '--yellow-50', borderVar: '--yellow-800', colorVar: '--yellow-800', bg: '#fefaed', border: '#695d05', color: '#695d05' },\n error: { icon: 'pi-exclamation-circle', bgVar: '--red-50', borderVar: '--red-600', colorVar: '--red-600', bg: '#fff5f5', border: '#d60f00', color: '#d60f00' },\n neutral: { icon: 'pi-info-circle', bgVar: '--teal-50', borderVar: '--teal-700', colorVar: '--teal-700', bg: '#eaf6f7', border: '#186368', color: '#186368' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function BannerAlert({ severity, title, detail, closable = true, onClose }: BannerAlertProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--a-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--a-border': `var(${cfg.borderVar}, ${cfg.border})`,\n '--a-color': `var(${cfg.colorVar}, ${cfg.color})`,\n } as React.CSSProperties;\n\n return (\n <div role=\"alert\" className={styles.banner} style={cssVars}>\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n <div className={styles.text}>\n <span className={styles.title}>{title}</span>\n {detail && <span className={styles.detail}>{detail}</span>}\n </div>\n {closable && (\n <CloseButton aria-label=\"Dismiss\" onClick={onClose} />\n )}\n </div>\n );\n}\n\nBannerAlert.displayName = 'BannerAlert';\n","import { CloseButton } from '../CloseButton/CloseButton';\nimport styles from './InlineContainedAlert.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AlertSeverity = 'success' | 'info' | 'warn' | 'error';\n\nexport interface InlineContainedAlertProps {\n severity: AlertSeverity;\n message: string;\n /**\n * Whether a dismiss (✕) button is shown.\n * @default true\n */\n closable?: boolean;\n onClose?: () => void;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<\n AlertSeverity,\n { icon: string; bgVar: string; colorVar: string; bg: string; color: string }\n> = {\n success: { icon: 'pi-check', bgVar: '--green-50', colorVar: '--green-700', bg: '#edf8ea', color: '#1a760b' },\n info: { icon: 'pi-info-circle', bgVar: '--blue-50', colorVar: '--blue-600', bg: '#f5f9ff', color: '#326fd1' },\n warn: { icon: 'pi-exclamation-triangle', bgVar: '--yellow-50', colorVar: '--yellow-800', bg: '#fffce7', color: '#695d05' },\n error: { icon: 'pi-exclamation-circle', bgVar: '--red-50', colorVar: '--red-600', bg: '#fff5f5', color: '#d60f00' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function InlineContainedAlert({ severity, message, closable = true, onClose }: InlineContainedAlertProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--a-bg': `var(${cfg.bgVar}, ${cfg.bg})`,\n '--a-color': `var(${cfg.colorVar}, ${cfg.color})`,\n } as React.CSSProperties;\n\n return (\n <div role=\"alert\" className={styles.alert} style={cssVars}>\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n <span className={styles.message}>{message}</span>\n {closable && (\n <CloseButton aria-label=\"Dismiss\" onClick={onClose} />\n )}\n </div>\n );\n}\n\nInlineContainedAlert.displayName = 'InlineContainedAlert';\n","import styles from './InlineAlert.module.css';\nimport type { AlertSeverity } from './InlineContainedAlert';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface InlineAlertProps {\n severity: AlertSeverity;\n message: string;\n}\n\n// ─── Severity config ──────────────────────────────────────────────────────────\n\nconst CONFIG: Record<\n AlertSeverity,\n { icon: string; colorVar: string; color: string }\n> = {\n success: { icon: 'pi-check', colorVar: '--green-700', color: '#1a760b' },\n info: { icon: 'pi-info-circle', colorVar: '--blue-600', color: '#326fd1' },\n warn: { icon: 'pi-exclamation-triangle', colorVar: '--yellow-800', color: '#695d05' },\n error: { icon: 'pi-exclamation-circle', colorVar: '--red-600', color: '#d60f00' },\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function InlineAlert({ severity, message }: InlineAlertProps) {\n const cfg = CONFIG[severity];\n\n const cssVars = {\n '--a-color': `var(${cfg.colorVar}, ${cfg.color})`,\n } as React.CSSProperties;\n\n return (\n <div role=\"status\" className={styles.alert} style={cssVars}>\n <i className={`pi ${cfg.icon} ${styles.icon}`} aria-hidden=\"true\" />\n <span className={styles.message}>{message}</span>\n </div>\n );\n}\n\nInlineAlert.displayName = 'InlineAlert';\n","import { useRef, useState, useEffect, useId, useCallback } from 'react';\nimport { Select } from '../Select';\nimport { Button } from '../Button';\nimport styles from './FileUpload.module.css';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nexport const DEFAULT_DOC_TYPES = [\n 'Miscellaneous',\n 'Agreements',\n 'Bank Statement',\n 'Hazard Insurance Binder',\n 'Pay Stub',\n 'Personal Identification',\n 'Purchase Agreement',\n 'Tax Return Transcript',\n];\n\nconst DEFAULT_ACCEPT =\n '.html,.heic,.jpeg,.jpg,.png,.gif,.bmp,.tiff,.tif,.pdf,.doc,.docx,.xls,.xlsx';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface StagedFile {\n id: string;\n file: File;\n docType: string;\n}\n\nexport interface FileUploadResult {\n file: File;\n docType: string;\n}\n\nexport interface FileUploadProps {\n /**\n * Called as soon as files are dropped or selected (before classification).\n * Use this to trigger the actual upload to your server.\n */\n onFilesAdded?: (files: File[]) => void;\n /**\n * Called when the Upload button is clicked with all classified files.\n * The component resets its internal list after calling this.\n */\n onUpload: (files: FileUploadResult[]) => void;\n /**\n * Document type options shown in the per-file dropdown.\n * @default DEFAULT_DOC_TYPES (standard mortgage document types)\n */\n docTypes?: string[];\n /**\n * Accepted file extensions passed to the native file input.\n * Files dropped via drag-and-drop are validated against this list too.\n * @default '.html,.heic,.jpeg,.jpg,.png,.gif,.bmp,.tiff,.tif,.pdf,.doc,.docx,.xls,.xlsx'\n */\n accept?: string;\n /**\n * Pre-populate the staged file list — useful for Storybook / testing.\n * These files are added to the queue on mount without triggering `onFilesAdded`.\n */\n initialFiles?: File[];\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction isValidFile(file: File, accept: string): boolean {\n const extensions = accept\n .split(',')\n .map((e) => e.trim().toLowerCase());\n return extensions.some((ext) => file.name.toLowerCase().endsWith(ext));\n}\n\n// ─── FileUpload ───────────────────────────────────────────────────────────────\n\n/**\n * FileUpload — Clear Design System\n *\n * A two-step document upload widget for the mortgage workflow:\n *\n * 1. User drops or browses for files → `onFilesAdded` fires (consumer uploads\n * to server); each file appears in the classification list below.\n * 2. User selects a document type for each file (searchable dropdown).\n * 3. When all files are classified, the Upload button activates. Clicking it\n * calls `onUpload` with the full list and resets the component.\n *\n * Invalid file types show an error message below the drop zone.\n *\n * @example\n * <FileUpload\n * onFilesAdded={files => myApi.upload(files)}\n * onUpload={results => myApi.classify(results)}\n * />\n */\nexport function FileUpload({\n onFilesAdded,\n onUpload,\n docTypes = DEFAULT_DOC_TYPES,\n accept = DEFAULT_ACCEPT,\n initialFiles,\n className,\n style,\n}: FileUploadProps) {\n const [items, setItems] = useState<StagedFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n\n // Pre-populate from initialFiles prop (mount only)\n useEffect(() => {\n if (initialFiles && initialFiles.length > 0) {\n setItems(\n initialFiles.map((file) => ({\n id: crypto.randomUUID(),\n file,\n docType: '',\n })),\n );\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const canUpload = items.length > 0 && items.every((i) => i.docType !== '');\n\n const docTypeOptions = docTypes.map((t) => ({ label: t, value: t }));\n\n // ── File processing ────────────────────────────────────────────────────────\n\n const processFiles = useCallback(\n (files: File[]) => {\n setError(null);\n const valid: File[] = [];\n const invalid: File[] = [];\n\n files.forEach((f) => {\n if (isValidFile(f, accept)) {\n valid.push(f);\n } else {\n invalid.push(f);\n }\n });\n\n if (invalid.length > 0) {\n setError('File format not supported. Please try again.');\n }\n\n if (valid.length > 0) {\n const newItems: StagedFile[] = valid.map((file) => ({\n id: crypto.randomUUID(),\n file,\n docType: '',\n }));\n setItems((prev) => [...prev, ...newItems]);\n onFilesAdded?.(valid);\n }\n },\n [accept, onFilesAdded],\n );\n\n // ── Handlers ───────────────────────────────────────────────────────────────\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n // Only clear drag state when leaving the drop zone itself, not its children\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragOver(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n processFiles(Array.from(e.dataTransfer.files));\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n processFiles(Array.from(e.target.files));\n // Reset so the same file can be re-selected\n e.target.value = '';\n }\n };\n\n const handleZoneClick = () => {\n inputRef.current?.click();\n };\n\n const updateDocType = (id: string, docType: string | null) => {\n setItems((prev) =>\n prev.map((item) => (item.id === id ? { ...item, docType: docType ?? '' } : item)),\n );\n };\n\n const removeItem = (id: string) => {\n setItems((prev) => prev.filter((item) => item.id !== id));\n };\n\n const handleUpload = () => {\n if (!canUpload) return;\n onUpload(items.map(({ file, docType }) => ({ file, docType })));\n setItems([]);\n setError(null);\n };\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n return (\n <div\n className={[styles.container, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Drop zone ── */}\n <div\n className={[styles.dropzone, isDragOver ? styles.dragOver : '']\n .filter(Boolean)\n .join(' ')}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleZoneClick}\n role=\"button\"\n tabIndex={0}\n aria-label=\"File upload area. Click or drop files here.\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleZoneClick();\n }}\n >\n <span className={styles.dropText}>\n Drop file(s) here or{' '}\n <span className={styles.browseLink}>browse</span>\n </span>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n multiple\n accept={accept}\n className={styles.hiddenInput}\n onChange={handleInputChange}\n tabIndex={-1}\n />\n </div>\n\n {/* ── Error message ── */}\n {error && (\n <div className={styles.errorMessage} role=\"alert\">\n <i className=\"pi pi-exclamation-triangle\" aria-hidden=\"true\" />\n {error}\n </div>\n )}\n\n {/* ── Classification list ── */}\n {items.length > 0 && (\n <div className={styles.fileList}>\n <div className={styles.tableHeader}>\n <span className={styles.colName}>Document Name</span>\n <span className={styles.colType}>Document Type</span>\n </div>\n\n {items.map((item) => (\n <div key={item.id} className={styles.fileRow}>\n <span className={styles.fileName} title={item.file.name}>\n {item.file.name}\n </span>\n\n <div className={styles.docTypeWrap}>\n <Select\n options={docTypeOptions}\n value={item.docType || null}\n onChange={(v) => updateDocType(item.id, v)}\n placeholder=\"Select Doc Type\"\n filter\n size=\"sm\"\n style={{ width: '100%' }}\n />\n </div>\n\n <button\n type=\"button\"\n className={styles.removeBtn}\n onClick={() => removeItem(item.id)}\n aria-label={`Remove ${item.file.name}`}\n >\n <i className=\"pi pi-times-circle\" aria-hidden=\"true\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* ── Footer: Upload button ── */}\n <div className={styles.footer}>\n <Button\n variant=\"primary\"\n size=\"md\"\n onClick={handleUpload}\n disabled={!canUpload}\n >\n Upload\n </Button>\n </div>\n </div>\n );\n}\n\nFileUpload.displayName = 'FileUpload';\n","import { useRef, useState, useId } from 'react';\nimport styles from './Tooltip.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n /** Content displayed inside the tooltip bubble */\n content: React.ReactNode;\n /** The element the tooltip is anchored to */\n children: React.ReactNode;\n /**\n * Which side the tooltip appears on relative to the trigger.\n * @default 'top'\n */\n placement?: TooltipPlacement;\n /**\n * Delay in ms before the tooltip appears on hover.\n * @default 200\n */\n delay?: number;\n /** When true, the tooltip will not appear */\n disabled?: boolean;\n /**\n * Maximum width of the tooltip bubble in px. Content wraps when exceeded.\n * @default 140\n */\n maxWidth?: number;\n className?: string;\n}\n\n// ─── Tooltip ──────────────────────────────────────────────────────────────────\n\n/**\n * Tooltip — Clear Design System\n *\n * A small informational bubble anchored to a trigger element. Appears on\n * hover and keyboard focus; hides on mouse leave and blur.\n *\n * Wraps its child in an inline container — the child itself is not modified.\n * Uses `aria-describedby` to associate the tooltip text with the trigger for\n * screen readers.\n *\n * @example\n * <Tooltip content=\"Delete this record\" placement=\"top\">\n * <IconButton icon={<i className=\"pi pi-trash\" />} aria-label=\"Delete\" />\n * </Tooltip>\n */\nexport function Tooltip({\n content,\n children,\n placement = 'top',\n delay = 200,\n disabled = false,\n maxWidth = 140,\n className,\n}: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const tooltipId = useId();\n\n const show = () => {\n if (disabled) return;\n timerRef.current = setTimeout(() => setVisible(true), delay);\n };\n\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n };\n\n const tooltipClass = [\n styles.tooltip,\n styles[`placement_${placement}`],\n visible ? styles.visible : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n className={styles.wrapper}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {/* Trigger — aria-describedby links it to the tooltip for screen readers */}\n <span aria-describedby={visible ? tooltipId : undefined}>\n {children}\n </span>\n\n <div\n id={tooltipId}\n role=\"tooltip\"\n className={tooltipClass}\n style={{ maxWidth }}\n aria-hidden={!visible}\n >\n {content}\n </div>\n </span>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n","import { forwardRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseButton } from '../CloseButton';\nimport styles from './Modal.module.css';\n\nexport interface ModalProps {\n /** Controls visibility */\n isOpen: boolean;\n /** Called when ✕ is clicked, scrim is clicked, or Escape is pressed */\n onClose: () => void;\n /** Modal title — renders in the header */\n title?: string;\n /** Modal body content — any ReactNode */\n children: React.ReactNode;\n /** Footer slot — typically right-aligned action buttons */\n footer?: React.ReactNode;\n /**\n * Render a dark scrim behind the modal.\n * @default true\n */\n scrim?: boolean;\n /**\n * Modal width in px.\n * @default 510\n */\n width?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Modal — Clear Design System\n *\n * A centered overlay dialog. Always rendered via a portal into `document.body`.\n * Supports a dark scrim (default) or no scrim for inline-style alerts.\n * Closes on ✕ click, scrim click, or Escape key.\n *\n * Fully controlled — pass `isOpen` + `onClose`.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * <Modal\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"Unsaved Changes\"\n * footer={\n * <>\n * <Button variant=\"secondary\" size=\"sm\" onClick={() => setOpen(false)}>No</Button>\n * <Button variant=\"primary\" size=\"sm\" onClick={() => setOpen(false)}>Yes</Button>\n * </>\n * }\n * >\n * <p>Are you sure you want to leave without saving?</p>\n * </Modal>\n */\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n isOpen,\n onClose,\n title,\n children,\n footer,\n scrim = true,\n width = 510,\n className,\n style,\n },\n ref,\n ) => {\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return createPortal(\n <div\n className={styles.overlay}\n data-scrim={scrim}\n onClick={scrim ? onClose : undefined}\n >\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Modal'}\n className={[styles.modal, className ?? ''].filter(Boolean).join(' ')}\n style={{ width, ...style }}\n onClick={e => e.stopPropagation()}\n >\n {/* Header — always rendered (close button is always present) */}\n <div className={styles.header}>\n <div className={styles.headerTitle}>\n {title && <span className={styles.title}>{title}</span>}\n </div>\n <CloseButton aria-label=\"Close\" onClick={onClose} />\n </div>\n\n <div className={styles.body}>{children}</div>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </div>,\n document.body,\n );\n },\n);\n\nModal.displayName = 'Modal';\n","import { forwardRef, useRef, useState, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseButton } from '../CloseButton';\nimport styles from './Popup.module.css';\n\nconst ARROW_H = 10; // px — height of the arrow triangle\n\nexport interface PopupProps {\n /** Controls popup visibility */\n isOpen: boolean;\n /** Called when ✕ is clicked or the scrim is clicked */\n onClose: () => void;\n /**\n * The element the popup is anchored to.\n * The popup measures this element's position to place itself.\n */\n trigger: React.ReactNode;\n /** Optional header title */\n title?: string;\n /** Popup body content — any ReactNode */\n children: React.ReactNode;\n /** Footer slot — typically action buttons, right-aligned with a separator border */\n footer?: React.ReactNode;\n /**\n * Which side of the trigger the popup opens on.\n * @default 'bottom'\n */\n placement?: 'top' | 'bottom';\n /**\n * Horizontal alignment relative to the trigger.\n * - 'right': popup extends to the right; its left edge anchors near the trigger's left edge.\n * - 'left': popup extends to the left; its right edge anchors near the trigger's right edge.\n * The arrow always points at the exact trigger center.\n * @default 'right'\n */\n align?: 'left' | 'right';\n /**\n * Popup width in px.\n * @default 360\n */\n width?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Popup — Clear Design System\n *\n * A positioned overlay anchored to a trigger element. Opens above or below the\n * trigger with a small triangle arrow pointing at it. Renders a scrim behind it\n * to keep focus on the popup.\n *\n * Fully controlled — pass `isOpen` + `onClose`. The popup measures the trigger's\n * screen position to place itself; the trigger is responsible for toggling state.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * <Popup\n * trigger={<Button onClick={() => setOpen(true)}>Details</Button>}\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"Loan Details\"\n * footer={<Button size=\"sm\" onClick={() => setOpen(false)}>Close</Button>}\n * >\n * <p>…content…</p>\n * </Popup>\n */\nexport const Popup = forwardRef<HTMLDivElement, PopupProps>(\n (\n {\n isOpen,\n onClose,\n trigger,\n title,\n children,\n footer,\n placement = 'bottom',\n align = 'right',\n width = 360,\n className,\n style,\n },\n ref,\n ) => {\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [pos, setPos] = useState<{\n top?: number;\n bottom?: number;\n left: number;\n arrowLeft: number;\n } | null>(null);\n\n const calculatePos = useCallback(() => {\n if (!triggerRef.current) return null;\n const r = triggerRef.current.getBoundingClientRect();\n const centerX = r.left + r.width / 2;\n // Anchor left edge (align='right') or right edge (align='left') to the trigger,\n // then clamp so the popup stays within the viewport.\n let left = align === 'right' ? r.left : r.right - width;\n left = Math.max(8, Math.min(left, window.innerWidth - width - 8));\n // Arrow always points at exact trigger center, regardless of clamping.\n const arrowLeft = centerX - left;\n return placement === 'bottom'\n ? { top: r.bottom + ARROW_H, left, arrowLeft }\n : { bottom: window.innerHeight - r.top + ARROW_H, left, arrowLeft };\n }, [placement, align, width]);\n\n useLayoutEffect(() => {\n if (!isOpen) { setPos(null); return; }\n setPos(calculatePos());\n }, [isOpen, calculatePos]);\n\n return (\n <>\n <span ref={triggerRef} className={styles.triggerWrap}>\n {trigger}\n </span>\n\n {isOpen && pos &&\n createPortal(\n <>\n {/* Scrim */}\n <div\n className={styles.scrim}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Popup panel */}\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Popup'}\n className={[styles.popup, className ?? ''].filter(Boolean).join(' ')}\n data-placement={placement}\n style={{\n width,\n top: pos.top,\n bottom: pos.bottom,\n left: pos.left,\n '--popup-arrow-left': `${pos.arrowLeft}px`,\n ...style,\n } as React.CSSProperties}\n >\n {title && (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n <CloseButton aria-label=\"Close popup\" onClick={onClose} />\n </div>\n )}\n\n <div className={styles.body}>{children}</div>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </>,\n document.body,\n )}\n </>\n );\n },\n);\n\nPopup.displayName = 'Popup';\n","import { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport { CloseButton } from '../CloseButton';\nimport styles from './SidePanel.module.css';\n\nexport interface SidePanelProps {\n /** Controls open/closed state */\n isOpen: boolean;\n /** Called when the ✕ button is pressed */\n onClose: () => void;\n /** Primary heading (e.g. borrower name). When omitted, the title row is hidden. */\n title?: string;\n /** Subtitle row below the title (e.g. phone + loan# link as ReactNode) */\n subtitle?: React.ReactNode;\n /**\n * When provided, renders a Save button in the header (teal, sm).\n * Called on Save click.\n */\n onSave?: () => void;\n /**\n * Slot below the title row — intended for the future BoltDropdown\n * section navigator. Accepts any ReactNode.\n */\n headerContent?: React.ReactNode;\n /** Panel width in px. @default 470 */\n width?: number;\n /** Panel body content (scrollable). */\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SidePanel — Clear Design System\n *\n * A fixed-position drawer that slides in from the right edge. It **pushes**\n * main content (no overlay). Use with `SidePanelLayout` to shift the page\n * content left when the panel opens.\n *\n * @example\n * <SidePanelLayout open={open} panelWidth={470}>\n * <main>…page content…</main>\n * </SidePanelLayout>\n * <SidePanel isOpen={open} onClose={() => setOpen(false)} title=\"Ryan Smith\">\n * …panel body…\n * </SidePanel>\n */\nexport const SidePanel = forwardRef<HTMLDivElement, SidePanelProps>(\n (\n {\n isOpen,\n onClose,\n title,\n subtitle,\n onSave,\n headerContent,\n width = 470,\n children,\n className,\n style,\n },\n ref,\n ) => {\n const isCompact = width < 400;\n\n const panelClass = [\n styles.panel,\n isOpen ? styles.open : '',\n isCompact ? styles.compact : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const actions = (\n <div className={styles.actions}>\n {onSave && (\n <Button variant=\"primary\" size=\"sm\" onClick={onSave}>\n Save\n </Button>\n )}\n <CloseButton aria-label=\"Close panel\" onClick={onClose} />\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={title ?? 'Side panel'}\n className={panelClass}\n style={{ width, ...style }}\n >\n <div className={styles.header}>\n {title ? (\n <div className={styles.titleBar}>\n <div className={styles.titleGroup}>\n <span className={styles.title}>{title}</span>\n {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n {actions}\n </div>\n ) : (\n <div className={styles.titleBarNoTitle}>{actions}</div>\n )}\n\n {headerContent && (\n <div className={styles.headerContent}>{headerContent}</div>\n )}\n </div>\n\n <div className={styles.body}>{children}</div>\n </div>\n );\n },\n);\n\nSidePanel.displayName = 'SidePanel';\n","import { forwardRef } from 'react';\nimport styles from './SidePanelLayout.module.css';\n\nexport interface SidePanelLayoutProps {\n /** Should match SidePanel's `isOpen` */\n open: boolean;\n /** Should match SidePanel's `width`. @default 470 */\n panelWidth?: number;\n /** The main page content that gets pushed left */\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SidePanelLayout — Clear Design System\n *\n * A thin layout wrapper that pushes the main content left when a `SidePanel`\n * is open. Place this around the page's main content area, then render a\n * `SidePanel` alongside it (outside this wrapper).\n *\n * @example\n * <SidePanelLayout open={panelOpen} panelWidth={470}>\n * <main>…page content…</main>\n * </SidePanelLayout>\n * <SidePanel isOpen={panelOpen} onClose={close} title=\"Details\">…</SidePanel>\n */\nexport const SidePanelLayout = forwardRef<HTMLDivElement, SidePanelLayoutProps>(\n ({ open, panelWidth = 470, children, className, style }, ref) => {\n const cls = [styles.layout, className ?? ''].filter(Boolean).join(' ');\n\n return (\n <div\n ref={ref}\n className={cls}\n style={{\n paddingRight: open ? panelWidth : 0,\n ...style,\n }}\n >\n {children}\n </div>\n );\n },\n);\n\nSidePanelLayout.displayName = 'SidePanelLayout';\n","/**\n * URLATabsNav — shared internal types, icons, and sub-components.\n * Imported by URLATabsNav (desktop), URLATabsNavTablet, and URLATabsNavMobile.\n */\nimport { useState, useRef, useEffect } from 'react';\nimport styles from './URLATabsNav.module.css';\n\n// ─── Shared types ─────────────────────────────────────────────────────────────\n\n/**\n * An option in the applicant selector.\n * A single option may represent one borrower or a combined group (e.g. spouses).\n */\nexport interface URLATabsNavApplicantOption {\n id: string;\n label: string;\n}\n\n/** A single tab item. */\nexport interface URLATabsNavTab {\n id: string;\n label: string;\n disabled?: boolean;\n}\n\n/** An item in a dropdown menu (sort, section, actions, etc.). */\nexport interface URLATabsNavMenuItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nexport const ArrowRight = () => <i className=\"pi pi-arrow-right\" aria-hidden=\"true\" />;\nexport const ReplayIcon = () => <i className=\"pi pi-replay\" aria-hidden=\"true\" />;\nexport const UserIcon = () => <i className=\"pi pi-user\" aria-hidden=\"true\" />;\nexport const PlusCircle = () => <i className=\"pi pi-plus-circle\" aria-hidden=\"true\" />;\nexport const SortIcon = () => <i className=\"pi pi-user-plus\" aria-hidden=\"true\" />;\n\nexport const ChevronDown = () => (\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1 1l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ─── ApplicantSelector ────────────────────────────────────────────────────────\n// Custom rectangular dropdown: person icon + label + chevron.\n// Default: 245×35px, r:6. Pass height=44 for touch-friendly mobile variant.\n\nexport function ApplicantSelector({\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n height = 35,\n}: {\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n height?: number;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const selected = applicants.find((a) => a.id === selectedApplicantId);\n\n return (\n <div ref={wrapRef} className={styles.applicantWrap}>\n <button\n type=\"button\"\n className={styles.applicantTrigger}\n style={height !== 35 ? { height } : undefined}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className={styles.applicantIcon}><UserIcon /></span>\n <span className={styles.applicantLabel}>{selected?.label ?? ''}</span>\n <span className={styles.applicantChevron}><ChevronDown /></span>\n </button>\n\n {open && (\n <div role=\"listbox\" className={styles.applicantMenu}>\n {applicants.map((a) => (\n <div\n key={a.id}\n role=\"option\"\n aria-selected={a.id === selectedApplicantId}\n className={[\n styles.applicantOption,\n a.id === selectedApplicantId ? styles.applicantOptionSelected : '',\n ]\n .filter(Boolean)\n .join(' ')}\n tabIndex={0}\n onClick={() => { onApplicantChange(a.id); setOpen(false); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onApplicantChange(a.id);\n setOpen(false);\n }\n }}\n >\n {a.label}\n </div>\n ))}\n {onAddApplicant && (\n <>\n <div className={styles.applicantDivider} />\n <button\n type=\"button\"\n className={styles.applicantAddBtn}\n onClick={() => { onAddApplicant(); setOpen(false); }}\n >\n <PlusCircle />\n New Applicant\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── SortButton ───────────────────────────────────────────────────────────────\n// Default: 47×35px, r:6, surface-300 bg. Pass height=44, width=62 for mobile.\n\nexport function SortButton({\n sortItems,\n onSortSelect,\n height = 35,\n width = 47,\n}: {\n sortItems: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n height?: number;\n width?: number;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const sizeStyle = (height !== 35 || width !== 47) ? { height, width } : undefined;\n\n return (\n <div ref={wrapRef} className={styles.sortWrap}>\n <button\n type=\"button\"\n className={styles.sortBtn}\n style={sizeStyle}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Sort applicants\"\n >\n <span className={styles.sortBtnIcon}><SortIcon /></span>\n <span className={styles.sortBtnChevron}><ChevronDown /></span>\n </button>\n\n {open && (\n <div role=\"menu\" className={styles.sortMenu}>\n {sortItems.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n className={styles.sortMenuItem}\n onClick={() => { onSortSelect?.(item.value); setOpen(false); }}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport {\n ArrowRight,\n ReplayIcon,\n ApplicantSelector,\n SortButton,\n type URLATabsNavApplicantOption,\n type URLATabsNavTab,\n type URLATabsNavMenuItem,\n} from './_internal';\nimport styles from './URLATabsNav.module.css';\n\n// ─── Re-export shared types so consumers can import from this file ─────────────\nexport type { URLATabsNavApplicantOption, URLATabsNavTab, URLATabsNavMenuItem };\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface URLATabsNavProps {\n // ── Applicant selector ────────────────────────────────────────────────────\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n\n // ── Sort dropdown ─────────────────────────────────────────────────────────\n sortItems?: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n\n // ── Tabs ──────────────────────────────────────────────────────────────────\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n\n // ── Optional AUS action buttons ───────────────────────────────────────────\n onNextValidation?: () => void;\n nextValidationBadge?: number;\n onBackToAUS?: () => void;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── URLATabsNav ──────────────────────────────────────────────────────────────\n\n/**\n * URLATabsNav — Clear Design System\n *\n * Single-row sub-navigation bar for the URLA section of the loan origination app.\n *\n * - **Left section**: applicant selector (245px) + optional sort button (47px)\n * - **Divider**: 1px vertical rule (35px tall)\n * - **Right section**: optional AUS action buttons + scrollable tab strip\n *\n * @example\n * <URLATabsNav\n * applicants={[{ id: 'joint', label: 'Ryan Smith | Laura Smith' }]}\n * selectedApplicantId=\"joint\"\n * onApplicantChange={setApplicant}\n * tabs={tabs}\n * activeTabId={activeTab}\n * onTabChange={setActiveTab}\n * />\n */\nexport const URLATabsNav = forwardRef<HTMLDivElement, URLATabsNavProps>(\n function URLATabsNav(props, ref) {\n const {\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n sortItems,\n onSortSelect,\n tabs,\n activeTabId,\n onTabChange,\n onNextValidation,\n nextValidationBadge,\n onBackToAUS,\n className,\n style,\n } = props;\n\n return (\n <div\n ref={ref}\n className={[styles.nav, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Left: applicant selector + sort ──────────────────────── */}\n <div className={styles.leftSection}>\n <ApplicantSelector\n applicants={applicants}\n selectedApplicantId={selectedApplicantId}\n onApplicantChange={onApplicantChange}\n onAddApplicant={onAddApplicant}\n />\n {sortItems && sortItems.length > 0 && (\n <SortButton sortItems={sortItems} onSortSelect={onSortSelect} />\n )}\n </div>\n\n {/* ── Divider ──────────────────────────────────────────────── */}\n <div className={styles.divider} aria-hidden=\"true\" />\n\n {/* ── Right: AUS buttons + tabs + trailing spacer ───────────── */}\n <div className={styles.tabsSection} role=\"tablist\">\n {(onNextValidation || onBackToAUS) && (\n <div className={styles.ausButtons}>\n {onNextValidation && (\n <Button\n variant=\"danger\"\n size=\"sm\"\n leadingIcon={<ArrowRight />}\n badge={nextValidationBadge}\n onClick={onNextValidation}\n >\n Next Validation\n </Button>\n )}\n {onBackToAUS && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leadingIcon={<ReplayIcon />}\n onClick={onBackToAUS}\n >\n Back to AUS\n </Button>\n )}\n </div>\n )}\n\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n className={[\n styles.tab,\n tab.id === activeTabId ? styles.tabActive : '',\n tab.disabled ? styles.tabDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-selected={tab.id === activeTabId}\n aria-disabled={tab.disabled}\n disabled={tab.disabled}\n onClick={() => { if (!tab.disabled) onTabChange(tab.id); }}\n >\n {tab.label}\n </button>\n ))}\n\n <div className={styles.spacer} aria-hidden=\"true\" />\n </div>\n </div>\n );\n },\n);\n\nURLATabsNav.displayName = 'URLATabsNav';\n","import { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport {\n ArrowRight,\n ReplayIcon,\n ApplicantSelector,\n SortButton,\n type URLATabsNavApplicantOption,\n type URLATabsNavTab,\n type URLATabsNavMenuItem,\n} from './_internal';\nimport styles from './URLATabsNavTablet.module.css';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface URLATabsNavTabletProps {\n // Row 1 — borrower info\n borrowerName: string;\n onLoanDetailsClick?: () => void;\n\n // Row 1 — applicant selector + sort\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n sortItems?: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n\n // Row 1 — AUS action buttons (optional)\n onNextValidation?: () => void;\n nextValidationBadge?: number;\n onBackToAUS?: () => void;\n\n // Row 2 — tab strip\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n\n // Row 2 — optional red count badge at far right of tab strip\n tabStripBadge?: number;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── URLATabsNavTablet ────────────────────────────────────────────────────────\n\n/**\n * URLATabsNavTablet — two-row variant of URLATabsNav for tablet viewports (~992px).\n *\n * Row 1: borrower name + \"Loan Details ⓘ\" | divider | applicant selector + sort | divider | AUS buttons\n * Row 2: scrollable tab strip + optional red count badge\n */\nexport const URLATabsNavTablet = forwardRef<HTMLDivElement, URLATabsNavTabletProps>(\n function URLATabsNavTablet(props, ref) {\n const {\n borrowerName,\n onLoanDetailsClick,\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n sortItems,\n onSortSelect,\n onNextValidation,\n nextValidationBadge,\n onBackToAUS,\n tabs,\n activeTabId,\n onTabChange,\n tabStripBadge,\n className,\n style,\n } = props;\n\n return (\n <div\n ref={ref}\n className={[styles.nav, className].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Row 1 ──────────────────────────────────────────────────── */}\n <div className={styles.row1}>\n {/* Borrower name + Loan Details link */}\n <div className={styles.borrowerBlock}>\n <span className={styles.borrowerName}>{borrowerName}</span>\n <button\n type=\"button\"\n className={styles.loanDetailsBtn}\n onClick={onLoanDetailsClick}\n >\n Loan Details\n <i className=\"pi pi-info-circle\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Divider */}\n <div className={styles.divider} aria-hidden=\"true\" />\n\n {/* Applicant selector + sort */}\n <ApplicantSelector\n applicants={applicants}\n selectedApplicantId={selectedApplicantId}\n onApplicantChange={onApplicantChange}\n onAddApplicant={onAddApplicant}\n height={35}\n />\n {sortItems && sortItems.length > 0 && (\n <SortButton sortItems={sortItems} onSortSelect={onSortSelect} height={35} />\n )}\n\n {/* Divider */}\n <div className={styles.divider} aria-hidden=\"true\" />\n\n {/* AUS action buttons */}\n {(onNextValidation || onBackToAUS) && (\n <div className={styles.ausButtons}>\n {onNextValidation && (\n <Button\n variant=\"danger\"\n size=\"sm\"\n leadingIcon={<ArrowRight />}\n badge={nextValidationBadge}\n onClick={onNextValidation}\n >\n Next Validation\n </Button>\n )}\n {onBackToAUS && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leadingIcon={<ReplayIcon />}\n onClick={onBackToAUS}\n >\n Back to AUS\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* ── Row 2 — tab strip ──────────────────────────────────────── */}\n <div className={styles.tabsSection} role=\"tablist\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n className={[\n styles.tab,\n tab.id === activeTabId ? styles.tabActive : '',\n tab.disabled ? styles.tabDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-selected={tab.id === activeTabId}\n aria-disabled={tab.disabled}\n disabled={tab.disabled}\n onClick={() => { if (!tab.disabled) onTabChange(tab.id); }}\n >\n {tab.label}\n </button>\n ))}\n\n <div className={styles.spacer} aria-hidden=\"true\" />\n\n {tabStripBadge != null && tabStripBadge > 0 && (\n <span className={styles.stripBadge} aria-label={`${tabStripBadge} items`}>\n {tabStripBadge}\n </span>\n )}\n </div>\n </div>\n );\n },\n);\n\nURLATabsNavTablet.displayName = 'URLATabsNavTablet';\n","import { forwardRef, useState, useRef, useEffect } from 'react';\nimport { Button } from '../Button';\nimport {\n ArrowRight,\n ReplayIcon,\n ApplicantSelector,\n SortButton,\n ChevronDown,\n type URLATabsNavApplicantOption,\n type URLATabsNavTab,\n type URLATabsNavMenuItem,\n} from './_internal';\nimport styles from './URLATabsNavMobile.module.css';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface URLATabsNavMobileProps {\n // Row 1 — borrower info\n borrowerName: string;\n onLoanDetailsClick?: () => void;\n\n // Row 1 — section switcher dropdown (e.g. \"URLA\", \"Loan Summary\")\n sectionLabel: string;\n sectionItems?: URLATabsNavMenuItem[];\n onSectionSelect?: (value: string) => void;\n\n // Row 1 — section sort (chevron-only pill)\n onSectionSort?: () => void;\n\n // Row 1 — actions dropdown\n actionItems?: URLATabsNavMenuItem[];\n onActionSelect?: (value: string) => void;\n\n // Row 1 — save icon button\n onSave?: () => void;\n\n // Row 2 — applicant selector + sort (44px touch targets)\n applicants: URLATabsNavApplicantOption[];\n selectedApplicantId: string;\n onApplicantChange: (id: string) => void;\n onAddApplicant?: () => void;\n sortItems?: URLATabsNavMenuItem[];\n onSortSelect?: (value: string) => void;\n\n // Row 2 — AUS buttons (optional)\n onNextValidation?: () => void;\n nextValidationBadge?: number;\n onBackToAUS?: () => void;\n\n // Row 2 — tab dropdown (shows active tab, switches on select)\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Internal: SectionDropdown ────────────────────────────────────────────────\n// w:168, h:44, r:6, border #cbced1 — shows sectionLabel + chevron.\n\nfunction SectionDropdown({\n label,\n items,\n onSelect,\n}: {\n label: string;\n items?: URLATabsNavMenuItem[];\n onSelect?: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.sectionWrap}>\n <button\n type=\"button\"\n className={styles.sectionTrigger}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n <span className={styles.sectionLabel}>{label}</span>\n <span className={styles.sectionChevron}><ChevronDown /></span>\n </button>\n\n {open && items && items.length > 0 && (\n <div role=\"listbox\" className={styles.dropdownMenu}>\n {items.map((item) => (\n <div\n key={item.value}\n role=\"option\"\n aria-selected={item.label === label}\n className={[\n styles.dropdownOption,\n item.label === label ? styles.dropdownOptionSelected : '',\n ]\n .filter(Boolean)\n .join(' ')}\n tabIndex={0}\n onClick={() => { onSelect?.(item.value); setOpen(false); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect?.(item.value);\n setOpen(false);\n }\n }}\n >\n {item.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Internal: ActionsButton ──────────────────────────────────────────────────\n// h:44, r:20, teal-50 bg, \"Actions\" text + chevron — opens a dropdown menu.\n\nfunction ActionsButton({\n items,\n onSelect,\n}: {\n items: URLATabsNavMenuItem[];\n onSelect?: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.actionsWrap}>\n <button\n type=\"button\"\n className={styles.actionsBtn}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n >\n Actions\n <ChevronDown />\n </button>\n\n {open && (\n <div role=\"menu\" className={styles.dropdownMenu}>\n {items.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n className={styles.dropdownOption}\n onClick={() => { onSelect?.(item.value); setOpen(false); }}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Internal: TabDropdown ────────────────────────────────────────────────────\n// h:44, r:6, w:fill — shows active tab name; opens a listbox of all tabs.\n\nfunction TabDropdown({\n tabs,\n activeTabId,\n onTabChange,\n}: {\n tabs: URLATabsNavTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const activeTab = tabs.find((t) => t.id === activeTabId);\n\n return (\n <div ref={wrapRef} className={styles.tabDropdownWrap}>\n <button\n type=\"button\"\n className={styles.tabDropdownTrigger}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-label=\"Select tab\"\n >\n <span className={styles.tabDropdownLabel}>{activeTab?.label ?? ''}</span>\n <span className={styles.tabDropdownChevron}><ChevronDown /></span>\n </button>\n\n {open && (\n <div role=\"listbox\" className={styles.tabDropdownMenu}>\n {tabs.map((tab) => (\n <div\n key={tab.id}\n role=\"option\"\n aria-selected={tab.id === activeTabId}\n aria-disabled={tab.disabled}\n className={[\n styles.dropdownOption,\n tab.id === activeTabId ? styles.dropdownOptionSelected : '',\n tab.disabled ? styles.dropdownOptionDisabled : '',\n ]\n .filter(Boolean)\n .join(' ')}\n tabIndex={tab.disabled ? -1 : 0}\n onClick={() => {\n if (!tab.disabled) {\n onTabChange(tab.id);\n setOpen(false);\n }\n }}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !tab.disabled) {\n e.preventDefault();\n onTabChange(tab.id);\n setOpen(false);\n }\n }}\n >\n {tab.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── URLATabsNavMobile ────────────────────────────────────────────────────────\n\n/**\n * URLATabsNavMobile — two-row touch-optimised variant for mobile viewports (~768px).\n *\n * Row 1: borrower name + \"Loan Details ⓘ\" | section dropdown | sort pill | Actions | Save\n * Row 2: AUS pills | applicant selector (44px) | sort button (62×44) | tab dropdown (fill)\n */\nexport const URLATabsNavMobile = forwardRef<HTMLDivElement, URLATabsNavMobileProps>(\n function URLATabsNavMobile(props, ref) {\n const {\n borrowerName,\n onLoanDetailsClick,\n sectionLabel,\n sectionItems,\n onSectionSelect,\n onSectionSort,\n actionItems,\n onActionSelect,\n onSave,\n applicants,\n selectedApplicantId,\n onApplicantChange,\n onAddApplicant,\n sortItems,\n onSortSelect,\n onNextValidation,\n nextValidationBadge,\n onBackToAUS,\n tabs,\n activeTabId,\n onTabChange,\n className,\n style,\n } = props;\n\n return (\n <div\n ref={ref}\n className={[styles.container, className].filter(Boolean).join(' ')}\n style={style}\n >\n {/* ── Row 1 ──────────────────────────────────────────────────── */}\n <div className={styles.row1}>\n {/* Left: borrower name + loan details */}\n <div className={styles.borrowerBlock}>\n <span className={styles.borrowerName}>{borrowerName}</span>\n <button\n type=\"button\"\n className={styles.loanDetailsBtn}\n onClick={onLoanDetailsClick}\n >\n Loan Details\n <i className=\"pi pi-info-circle\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Right: section controls */}\n <div className={styles.rightControls}>\n <SectionDropdown\n label={sectionLabel}\n items={sectionItems}\n onSelect={onSectionSelect}\n />\n\n {onSectionSort && (\n <button\n type=\"button\"\n className={styles.sortPill}\n onClick={onSectionSort}\n aria-label=\"Sort sections\"\n >\n <ChevronDown />\n </button>\n )}\n\n {actionItems && actionItems.length > 0 && (\n <ActionsButton items={actionItems} onSelect={onActionSelect} />\n )}\n\n {onSave && (\n <button\n type=\"button\"\n className={styles.saveBtn}\n onClick={onSave}\n aria-label=\"Save\"\n >\n <i className=\"pi pi-save\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n\n {/* ── Row 2 ──────────────────────────────────────────────────── */}\n <div className={styles.row2}>\n {/* AUS pills */}\n {(onNextValidation || onBackToAUS) && (\n <div className={styles.ausButtons}>\n {onNextValidation && (\n <Button\n variant=\"danger\"\n size=\"sm\"\n leadingIcon={<ArrowRight />}\n badge={nextValidationBadge}\n onClick={onNextValidation}\n >\n Next Validation\n </Button>\n )}\n {onBackToAUS && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leadingIcon={<ReplayIcon />}\n onClick={onBackToAUS}\n >\n Back to AUS\n </Button>\n )}\n </div>\n )}\n\n {/* Applicant selector (44px touch height) */}\n <ApplicantSelector\n applicants={applicants}\n selectedApplicantId={selectedApplicantId}\n onApplicantChange={onApplicantChange}\n onAddApplicant={onAddApplicant}\n height={44}\n />\n\n {/* Sort button (62×44 touch target) */}\n {sortItems && sortItems.length > 0 && (\n <SortButton\n sortItems={sortItems}\n onSortSelect={onSortSelect}\n height={44}\n width={62}\n />\n )}\n\n {/* Tab dropdown — fills remaining width */}\n <TabDropdown\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n />\n </div>\n </div>\n );\n },\n);\n\nURLATabsNavMobile.displayName = 'URLATabsNavMobile';\n","export default \"data:image/png;base64,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\"","import React, { forwardRef, useState, useEffect, useRef } from 'react';\nimport styles from './TopBar.module.css';\nimport logoUrl from './clear-logo.png';\nimport { InputText } from '../InputText';\n\nexport interface TopBarMenuItem {\n label: string;\n value: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n divider?: boolean;\n}\n\nexport interface TopBarNavItem {\n id: string;\n label: string;\n items?: TopBarMenuItem[];\n onSelect?: (value: string) => void;\n /** Teal color + plus-circle icon (for the Create CTA) */\n isPrimary?: boolean;\n}\n\nexport interface TopBarUserProfile {\n name: string;\n /** Shown above the avatar. E.g. \"Loan Officer\" */\n role?: string;\n /** 1–2 char initials. Defaults to first letters of name words. */\n initials?: string;\n menuItems?: TopBarMenuItem[];\n onMenuSelect?: (value: string) => void;\n}\n\nexport interface TopBarProps {\n /** e.g. \"v.1.88.3459\" — shown in small text next to logo */\n version?: string;\n navItems: TopBarNavItem[];\n onSearch?: (query: string) => void;\n searchPlaceholder?: string;\n profile: TopBarUserProfile;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction cx(...classes: (string | undefined | false | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ChevronDown() {\n return (\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction DropdownPanel({\n items,\n onSelect,\n className,\n}: {\n items: TopBarMenuItem[];\n onSelect: (value: string) => void;\n className?: string;\n}) {\n return (\n <div role=\"menu\" className={cx(styles.dropdownPanel, className)}>\n {items.map((item) =>\n item.divider ? (\n <div key={item.value} className={styles.dropdownDivider} />\n ) : (\n <button\n key={item.value}\n role=\"menuitem\"\n className={styles.dropdownItem}\n disabled={item.disabled}\n onClick={() => onSelect(item.value)}\n >\n {item.icon}\n {item.label}\n </button>\n )\n )}\n </div>\n );\n}\n\nfunction NavItem({ id: _id, label, items, onSelect, isPrimary }: TopBarNavItem) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n\n function handleClickOutside(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.navWrap}>\n <button\n className={cx(\n styles.navItem,\n open && styles.navItemOpen,\n isPrimary && styles.navItemPrimary\n )}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n >\n {isPrimary && <i className=\"pi pi-plus-circle\" aria-hidden=\"true\" />}\n {label}\n {items && items.length > 0 && (\n <span className={cx(styles.navChevron, open && styles.navChevronOpen)}>\n <ChevronDown />\n </span>\n )}\n </button>\n {open && items && items.length > 0 && (\n <DropdownPanel\n items={items}\n onSelect={(value) => {\n onSelect?.(value);\n setOpen(false);\n }}\n />\n )}\n </div>\n );\n}\n\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\nfunction ProfileButton({ profile }: { profile: TopBarUserProfile }) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n const initials = profile.initials ?? getInitials(profile.name);\n\n useEffect(() => {\n if (!open) return;\n\n function handleClickOutside(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div className={cx(styles.profileArea, profile.role && styles.profilePill)}>\n {profile.role && <span className={styles.roleLabel}>{profile.role}</span>}\n <div ref={wrapRef} className={styles.avatarWrap}>\n <button\n className={styles.avatarBtn}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`${profile.name} — open profile menu`}\n >\n {initials}\n </button>\n {open && profile.menuItems && profile.menuItems.length > 0 && (\n <DropdownPanel\n items={profile.menuItems}\n className={styles.profilePanel}\n onSelect={(value) => {\n profile.onMenuSelect?.(value);\n setOpen(false);\n }}\n />\n )}\n </div>\n </div>\n );\n}\n\nexport const TopBar = forwardRef<HTMLDivElement, TopBarProps>(function TopBar(props, ref) {\n const { version, navItems, onSearch, searchPlaceholder, profile, className, style } = props;\n\n return (\n <div ref={ref} className={cx(styles.bar, className)} style={style}>\n {/* Left group: logo + version + nav items */}\n <div className={styles.leftGroup}>\n <span className={styles.brand}>\n <img src={logoUrl} alt=\"Clear\" className={styles.logo} />\n {version && <span className={styles.version}>{version}</span>}\n </span>\n <div className={styles.navGroup}>\n {navItems.map((item) => (\n <NavItem key={item.id} {...item} />\n ))}\n </div>\n </div>\n\n {/* Center: search */}\n <div className={styles.searchWrap}>\n <InputText\n className={styles.search}\n prefixIcon={<i className=\"pi pi-search\" aria-hidden=\"true\" />}\n placeholder={searchPlaceholder ?? 'Search Leads and Loans'}\n onChange={(e) => onSearch?.(e.target.value)}\n aria-label=\"Search\"\n />\n </div>\n\n {/* Right group: profile */}\n <div className={styles.rightGroup}>\n <ProfileButton profile={profile} />\n </div>\n </div>\n );\n});\n","export default \"data:image/png;base64,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\"","import React, { useState, useEffect, useRef } from 'react';\nimport styles from './TopBarMobile.module.css';\nimport logoUrl from './clear-logo.png';\nimport logoClipUrl from './clear-logo-clip.png';\nimport type { TopBarUserProfile, TopBarMenuItem } from './TopBar';\n\nexport interface TopBarMobileBorrower {\n name: string;\n onInfoClick?: () => void;\n}\n\nexport interface TopBarMobileProps {\n /** When provided → URLA mode: small C logo left + borrower name center */\n borrower?: TopBarMobileBorrower;\n onMenuOpen?: () => void;\n onSearchOpen?: () => void;\n profile: TopBarUserProfile;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction getInitials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\nfunction DropdownPanel({\n items,\n onSelect,\n}: {\n items: TopBarMenuItem[];\n onSelect: (value: string) => void;\n}) {\n return (\n <div role=\"menu\" className={styles.dropdownPanel}>\n {items.map((item) =>\n item.divider ? (\n <div key={item.value} className={styles.dropdownDivider} />\n ) : (\n <button\n key={item.value}\n role=\"menuitem\"\n className={styles.dropdownItem}\n disabled={item.disabled}\n onClick={() => onSelect(item.value)}\n >\n {item.icon}\n {item.label}\n </button>\n )\n )}\n </div>\n );\n}\n\nfunction MobileProfileButton({ profile }: { profile: TopBarUserProfile }) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement>(null);\n const initials = profile.initials ?? getInitials(profile.name);\n\n useEffect(() => {\n if (!open) return;\n\n function handleClickOutside(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={wrapRef} className={styles.avatarWrap}>\n <button\n className={styles.avatarBtn}\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`${profile.name} — open profile menu`}\n >\n {initials}\n </button>\n {open && profile.menuItems && profile.menuItems.length > 0 && (\n <DropdownPanel\n items={profile.menuItems}\n onSelect={(value) => {\n profile.onMenuSelect?.(value);\n setOpen(false);\n }}\n />\n )}\n </div>\n );\n}\n\nexport function TopBarMobile({\n borrower,\n onMenuOpen,\n onSearchOpen,\n profile,\n className,\n style,\n}: TopBarMobileProps) {\n const isUrla = !!borrower;\n\n return (\n <div\n className={[styles.bar, className].filter(Boolean).join(' ')}\n style={style}\n >\n {/* Left */}\n <div className={styles.left}>\n <button\n className={styles.iconBtn}\n onClick={onMenuOpen}\n aria-label=\"Open menu\"\n >\n <i className=\"pi pi-bars\" aria-hidden=\"true\" />\n </button>\n {isUrla && (\n <img src={logoClipUrl} alt=\"Clear\" className={styles.logoClip} />\n )}\n </div>\n\n {/* Center */}\n <div className={styles.center}>\n {isUrla ? (\n <>\n <span className={styles.borrowerName}>{borrower.name}</span>\n <button\n className={styles.infoIcon}\n onClick={borrower.onInfoClick}\n aria-label=\"Borrower info\"\n >\n <i className=\"pi pi-info-circle\" aria-hidden=\"true\" />\n </button>\n </>\n ) : (\n <img src={logoUrl} alt=\"Clear\" className={styles.logo} />\n )}\n </div>\n\n {/* Right */}\n <div className={styles.right}>\n <button\n className={[styles.iconBtn, styles.searchBtn].join(' ')}\n onClick={onSearchOpen}\n aria-label=\"Open search\"\n >\n <i className=\"pi pi-search\" aria-hidden=\"true\" />\n </button>\n <MobileProfileButton profile={profile} />\n </div>\n </div>\n );\n}\n","import { forwardRef, useState, useRef, useEffect } from 'react';\nimport styles from './LightningButton.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface LightningButtonItem {\n label: string;\n value: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n divider?: boolean;\n}\n\nexport interface LightningButtonProps {\n /**\n * Visual variant.\n * - `'basic'` — no visible container, teal icon (default)\n * - `'filled'` — teal-50 bg / teal-200 border idle; teal-700 bg on hover/active\n */\n variant?: 'basic' | 'filled';\n /**\n * Button size. Only meaningful for the `filled` variant.\n * - `'sm'` — 24px tall\n * - `'md'` — 36px tall (default)\n * - `'lg'` — 40px tall\n */\n size?: 'sm' | 'md' | 'lg';\n /** Dropdown items. */\n items: LightningButtonItem[];\n /** Called when the user selects a dropdown item. */\n onSelect: (value: string) => void;\n /** Disables the button and blocks dropdown. */\n disabled?: boolean;\n /** Accessible label — required since there is no visible text. */\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── LightningButton ──────────────────────────────────────────────────────────\n\n/**\n * LightningButton — Clear Design System\n *\n * A pill-shaped icon-only dropdown button with a lightning bolt icon.\n * Used as the \"Quick Actions\" trigger in navigation bars and toolbars.\n *\n * Two variants:\n * - `basic` — no visible container, teal icon (default)\n * - `filled` — solid teal-700 background\n *\n * @example\n * <LightningButton\n * variant=\"basic\"\n * items={[{ label: 'Copy Loan', value: 'copy' }]}\n * onSelect={(v) => console.log(v)}\n * aria-label=\"Quick actions\"\n * />\n */\nexport const LightningButton = forwardRef<HTMLButtonElement, LightningButtonProps>(\n function LightningButton(\n {\n variant = 'basic',\n size = 'md',\n items,\n onSelect,\n disabled,\n 'aria-label': ariaLabel = 'Quick actions',\n className,\n style,\n },\n ref,\n ) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleOut(e: MouseEvent) {\n if (!containerRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [open]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n const handleSelect = (value: string) => {\n setOpen(false);\n onSelect(value);\n };\n\n const btnClass = [\n styles.btn,\n size === 'sm' ? styles.btnSm : size === 'lg' ? styles.btnLg : styles.btnMd,\n variant === 'filled' ? styles.btnFilled : styles.btnBasic,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={containerRef}\n className={[styles.wrap, className ?? ''].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n ref={ref}\n type=\"button\"\n className={btnClass}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <span className={styles.boltIcon} aria-hidden=\"true\">\n <i className=\"pi pi-bolt\" />\n </span>\n <span className={styles.chevronIcon} aria-hidden=\"true\">\n <i className=\"pi pi-chevron-down\" />\n </span>\n </button>\n\n {open && (\n <div role=\"menu\" className={styles.menu}>\n {items.map((item) => {\n if (item.divider) {\n return <div key={item.value} className={styles.menuDivider} role=\"separator\" />;\n }\n return (\n <div\n key={item.value}\n role=\"menuitem\"\n className={[styles.menuItem, item.disabled ? styles.menuItemDisabled : '']\n .filter(Boolean)\n .join(' ')}\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n onClick={() => {\n if (!item.disabled) handleSelect(item.value);\n }}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault();\n handleSelect(item.value);\n }\n }}\n >\n {item.icon && <span className={styles.menuItemIcon} aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n);\n\nLightningButton.displayName = 'LightningButton';\n","import { forwardRef, useRef, useState, useEffect } from 'react';\nimport { BannerTabs } from '../BannerTabs';\nimport type { BannerTabItem, StatusColor } from '../BannerTabs';\nimport { Button } from '../Button';\nimport type { ButtonVariant } from '../Button';\nimport { IconButton } from '../IconButton';\nimport { DropdownButton } from '../DropdownButton';\nimport type { DropdownButtonItem } from '../DropdownButton';\nimport { SplitButton } from '../SplitButton';\nimport type { SplitButtonItem } from '../SplitButton';\nimport { BannerAlert } from '../Alert';\nimport type { BannerAlertSeverity } from '../Alert';\nimport { LightningButton } from '../LightningButton';\nimport styles from './LoanBannerNav.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * A single action rendered in the right-side action zone.\n *\n * Rendering rules (in priority order):\n * 1. No `label` + `items` → small secondary icon-only DropdownButton (⚡▼)\n * 2. No `label` + no `items` → small secondary IconButton (💬, 🔄)\n * 3. `label` + `items` → small secondary DropdownButton with text (+ optional badge)\n * 4. `label` only → small secondary Button with optional leading icon\n */\nexport interface LoanBannerNavAction {\n /** Unique key. */\n value: string;\n /** Button label. Omit for icon-only rendering. */\n label?: string;\n /** Click handler (used for non-dropdown buttons). */\n onClick?: () => void;\n /** Visual variant for text buttons. Defaults to `'secondary'`. */\n variant?: ButtonVariant;\n /** Leading icon (or the sole icon when label is omitted). */\n icon?: React.ReactNode;\n /** Red count badge shown on the button. */\n badge?: string | number;\n /** If provided, the button opens a dropdown menu. */\n items?: DropdownButtonItem[];\n /** Called when the user selects a dropdown item. */\n onSelect?: (value: string) => void;\n /** Renders a pipe `|` divider immediately before this action. */\n dividerBefore?: boolean;\n /** Aria label — required when `label` is omitted. */\n ariaLabel?: string;\n /**\n * When `true`, renders as a `LightningButton` pill (bolt icon + chevron).\n * Requires `items` and `onSelect`. `variant` controls outline vs filled.\n */\n lightning?: boolean;\n /** LightningButton variant when `lightning` is true. Defaults to `'basic'`. */\n lightningVariant?: 'basic' | 'filled';\n}\n\nexport interface LoanBannerNavCondition {\n /** Label text shown in the condition badge (e.g. \"Dunning Delete Org\"). */\n label: string;\n /** Called when the user dismisses the condition. */\n onDismiss?: () => void;\n}\n\nexport interface LoanBannerNavToolbar {\n /** Left slot — e.g. a compact section-navigation dropdown. */\n left?: React.ReactNode;\n /** Center slot — fills remaining width. e.g. a wide Select. */\n center?: React.ReactNode;\n /** Right slot — e.g. the ⚡▼ quick-actions dropdown. */\n right?: React.ReactNode;\n}\n\nexport interface LoanBannerNavBanner {\n /** Bold heading text shown in the alert strip. */\n title: string;\n /** Optional detail text shown after the title. */\n detail?: string;\n /** Visual severity. Defaults to `'warn'`. */\n severity?: BannerAlertSeverity;\n /** Whether the dismiss (✕) button is shown. Defaults to `true`. */\n closable?: boolean;\n /** Called when the user dismisses the banner. */\n onClose?: () => void;\n}\n\nexport interface LoanBannerNavCollapsedSection {\n /** Section label (e.g. \"Loan Summary\"). */\n label: string;\n /** Muted sub-label (e.g. \"LE Pending for 2 Days\"). */\n subLabel?: string;\n /** Status dot color. */\n status?: StatusColor;\n}\n\nexport interface LoanBannerNavProps {\n // ── Core navigation ──────────────────────────────────────────────────────\n /** Tab definitions — reuses `BannerTabItem` from BannerTabs. */\n tabs: BannerTabItem[];\n /** Controlled active tab id. */\n activeTabId: string;\n /** Called when the user selects a different tab. */\n onTabChange: (id: string) => void;\n\n // ── Left ─────────────────────────────────────────────────────────────────\n /** Hamburger / menu-toggle handler. */\n onMenuToggle?: () => void;\n\n // ── Right — flexible action zone (full mode) ─────────────────────────────\n /**\n * Actions rendered left-to-right before the primary button.\n * Order is exactly as provided — consumers control placement.\n */\n secondaryActions?: LoanBannerNavAction[];\n\n /** Dedicated refresh icon button (sm secondary). */\n onRefresh?: () => void;\n\n // ── Right — primary action ────────────────────────────────────────────────\n /** Primary button label. Defaults to `'Save Loan'`. */\n primaryLabel?: string;\n /** Primary button click handler. */\n onPrimary?: () => void;\n /** When provided, primary renders as a `SplitButton`. */\n primaryItems?: SplitButtonItem[];\n /** Called when the user selects a SplitButton dropdown item. */\n onPrimarySelect?: (value: string) => void;\n\n // ── Condition badge ───────────────────────────────────────────────────────\n /** When provided, renders a dismissible condition badge before the primary. */\n condition?: LoanBannerNavCondition;\n\n // ── Secondary toolbar row ─────────────────────────────────────────────────\n /**\n * When provided, renders a secondary toolbar row below the main bar.\n * Three layout slots: left (compact), center (flex-1), right (compact).\n */\n toolbar?: LoanBannerNavToolbar;\n\n // ── Status banner ─────────────────────────────────────────────────────────\n /**\n * When provided, renders a `BannerAlert` strip below the main bar\n * (or below the toolbar if both are present).\n */\n banner?: LoanBannerNavBanner;\n\n // ── Collapsed / mobile mode ───────────────────────────────────────────────\n /** Switches to compact single-row mode (hides BannerTabs, shows breadcrumb pills). */\n collapsed?: boolean;\n /** Parent section breadcrumb pill shown in collapsed mode. */\n collapsedSection?: LoanBannerNavCollapsedSection;\n /** When provided, renders a back-arrow before the breadcrumb pills. */\n onCollapsedBack?: () => void;\n /** When provided, renders a \">\" expand button to reveal all tabs. */\n onExpandTabs?: () => void;\n /** Items for the ⚡▼ quick-actions dropdown in collapsed mode. */\n collapsedQuickItems?: DropdownButtonItem[];\n /** Called when the user picks a collapsed quick action. */\n onCollapsedQuickAction?: (value: string) => void;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst HamburgerIcon = () => (\n <svg width=\"18\" height=\"14\" viewBox=\"0 0 18 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M0 1h18M0 7h18M0 13h18\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst RefreshIcon = () => <i className=\"pi pi-refresh\" aria-hidden=\"true\" />;\n\nconst ChevronRightIcon = () => (\n <svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l5 5-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronLeftIcon = () => (\n <svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 1L1 6l5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Nav-specific badge dropdown ─────────────────────────────────────────────\n// A secondary sm dropdown button with the count badge rendered INSIDE,\n// after the chevron. Only used in the nav action zone.\n\nconst NavChevronDown = () => (\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nfunction NavBadgeDropdown({ label, badge, items, onSelect }: {\n label: string;\n badge: string | number;\n items: DropdownButtonItem[];\n onSelect?: (value: string) => void;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n function handleOut(e: MouseEvent) {\n if (!ref.current?.contains(e.target as Node)) setIsOpen(false);\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setIsOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen]);\n\n return (\n <div ref={ref} className={styles.navBadgeDrop}>\n <button\n type=\"button\"\n className={styles.navBadgeDropBtn}\n onClick={() => setIsOpen((p) => !p)}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n >\n <span className={styles.navBadgeDropLabel}>{label}</span>\n <span className={styles.navBadgeDropChevron}><NavChevronDown /></span>\n <span className={styles.navBadgeDropBadge}>{badge}</span>\n </button>\n\n {isOpen && (\n <div role=\"menu\" className={styles.navBadgeDropMenu}>\n {items.map((item) => (\n <div\n key={item.value}\n role=\"menuitem\"\n className={[styles.navBadgeDropItem, item.disabled ? styles.navBadgeDropItemDisabled : ''].filter(Boolean).join(' ')}\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n onClick={() => {\n if (!item.disabled) { onSelect?.(item.value); setIsOpen(false); }\n }}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !item.disabled) {\n e.preventDefault(); onSelect?.(item.value); setIsOpen(false);\n }\n }}\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Action renderer ──────────────────────────────────────────────────────────\n\nfunction renderAction(action: LoanBannerNavAction) {\n const isIconOnly = !action.label;\n\n // LightningButton pill (bolt icon + chevron dropdown)\n if (action.lightning && action.items) {\n return (\n <LightningButton\n key={action.value}\n variant={action.lightningVariant ?? 'filled'}\n size=\"sm\"\n items={action.items}\n onSelect={action.onSelect ?? (() => {})}\n aria-label={action.ariaLabel ?? 'Quick actions'}\n />\n );\n }\n\n // Icon-only DropdownButton (fallback for non-lightning icon dropdowns)\n if (isIconOnly && action.items) {\n return (\n <DropdownButton\n key={action.value}\n label=\"\"\n leadingIcon={action.icon}\n variant=\"secondary\"\n size=\"sm\"\n items={action.items}\n onSelect={action.onSelect}\n aria-label={action.ariaLabel ?? action.value}\n />\n );\n }\n\n // Icon-only button (💬, 🔄)\n if (isIconOnly) {\n return (\n <IconButton\n key={action.value}\n icon={action.icon}\n variant=\"secondary\"\n size=\"sm\"\n aria-label={action.ariaLabel ?? action.value}\n onClick={action.onClick}\n />\n );\n }\n\n // Text dropdown with inline badge (Generate BRW Needs List ▼[7])\n if (action.items && action.badge != null) {\n return (\n <NavBadgeDropdown\n key={action.value}\n label={action.label ?? ''}\n badge={action.badge}\n items={action.items}\n onSelect={action.onSelect}\n />\n );\n }\n\n // Text DropdownButton without badge\n if (action.items) {\n return (\n <DropdownButton\n key={action.value}\n label={action.label ?? ''}\n leadingIcon={action.icon}\n variant={action.variant ?? 'secondary'}\n size=\"sm\"\n items={action.items}\n onSelect={action.onSelect}\n />\n );\n }\n\n // Text button (Create Sandbox, Save History, Refresh)\n return (\n <Button\n key={action.value}\n variant={action.variant ?? 'secondary'}\n size=\"sm\"\n leadingIcon={action.icon}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n );\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * LoanBannerNav — Clear Design System\n *\n * Primary navigation bar for the loan origination application.\n * Wraps `BannerTabs` in a full-width bar with a menu toggle on the left and\n * a flexible action zone on the right.\n *\n * Optionally renders a secondary toolbar row (left/center/right slots) and/or\n * a `BannerAlert` strip below.\n *\n * @example\n * <LoanBannerNav\n * tabs={tabs}\n * activeTabId=\"urla\"\n * onTabChange={setActiveTab}\n * onRefresh={handleRefresh}\n * onPrimary={handleSave}\n * />\n */\nexport const LoanBannerNav = forwardRef<HTMLElement, LoanBannerNavProps>(\n function LoanBannerNav(props, ref) {\n const {\n tabs,\n activeTabId,\n onTabChange,\n onMenuToggle,\n secondaryActions = [],\n onRefresh,\n primaryLabel = 'Save Loan',\n onPrimary,\n primaryItems,\n onPrimarySelect,\n condition,\n toolbar,\n banner,\n collapsed = false,\n collapsedSection,\n onCollapsedBack,\n onExpandTabs,\n collapsedQuickItems = [],\n onCollapsedQuickAction,\n } = props;\n\n const activeTab = tabs.find((t) => t.id === activeTabId);\n\n const dotClass = (color?: StatusColor) =>\n [styles.breadcrumbDot, color ? styles[`status_${color}`] : ''].filter(Boolean).join(' ');\n\n // ── Primary button / SplitButton ─────────────────────────────────────────\n const primaryEl = onPrimary && (\n primaryItems?.length ? (\n <SplitButton\n label={primaryLabel}\n onAction={onPrimary}\n items={primaryItems}\n onSelect={onPrimarySelect}\n variant=\"primary\"\n size=\"sm\"\n />\n ) : (\n <Button variant=\"primary\" size=\"sm\" onClick={onPrimary}>\n {primaryLabel}\n </Button>\n )\n );\n\n // ── Right-side actions (full mode) ──────────────────────────────────────\n const fullRightActions = (\n <div className={styles.actions}>\n {condition && (\n <div className={styles.conditionBadge}>\n <span className={styles.conditionLabel}>{condition.label}</span>\n {condition.onDismiss && (\n <button\n className={styles.conditionDismiss}\n onClick={condition.onDismiss}\n aria-label=\"Dismiss condition\"\n >\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l7 7M8 1L1 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {secondaryActions.map((action) => (\n <div key={action.value} className={styles.actionItem}>\n {action.dividerBefore && <span className={styles.divider} aria-hidden=\"true\" />}\n {renderAction(action)}\n </div>\n ))}\n\n {onRefresh && (\n <IconButton\n variant=\"secondary\"\n size=\"sm\"\n aria-label=\"Refresh\"\n icon={<RefreshIcon />}\n onClick={onRefresh}\n />\n )}\n\n {primaryEl}\n </div>\n );\n\n // ── Right-side actions (collapsed mode) ─────────────────────────────────\n const collapsedRightActions = (\n <div className={styles.actions}>\n {collapsedQuickItems.length > 0 && (\n <LightningButton\n variant=\"filled\"\n size=\"sm\"\n items={collapsedQuickItems}\n onSelect={onCollapsedQuickAction ?? (() => {})}\n aria-label=\"Quick actions\"\n />\n )}\n {onRefresh && (\n <IconButton\n variant=\"secondary\"\n size=\"sm\"\n aria-label=\"Refresh\"\n icon={<RefreshIcon />}\n onClick={onRefresh}\n />\n )}\n {primaryEl}\n </div>\n );\n\n return (\n <nav\n ref={ref}\n className={[styles.nav, collapsed ? styles.collapsed : ''].filter(Boolean).join(' ')}\n >\n {/* ── Main row ──────────────────────────────────────────────────── */}\n <div className={styles.mainRow}>\n <button className={styles.menuToggle} onClick={onMenuToggle} aria-label=\"Toggle menu\">\n <HamburgerIcon />\n </button>\n\n {collapsed ? (\n <>\n {onCollapsedBack && (\n <button className={styles.backBtn} onClick={onCollapsedBack} aria-label=\"Back\">\n <ChevronLeftIcon />\n </button>\n )}\n <div className={styles.breadcrumbs}>\n {collapsedSection && (\n <div className={styles.breadcrumbItem}>\n {collapsedSection.status && <span className={dotClass(collapsedSection.status)} />}\n <div className={styles.breadcrumbText}>\n <span className={styles.breadcrumbLabel}>{collapsedSection.label}</span>\n {collapsedSection.subLabel && (\n <span className={styles.breadcrumbSublabel}>{collapsedSection.subLabel}</span>\n )}\n </div>\n </div>\n )}\n {activeTab && (\n <div className={styles.breadcrumbItem}>\n {activeTab.status.shape !== 'none' && (\n <span className={dotClass(activeTab.status.color)} />\n )}\n <div className={styles.breadcrumbText}>\n <span className={styles.breadcrumbLabel}>\n {activeTab.label}{activeTab.subLabel ? ` / ${activeTab.subLabel}` : ''}\n </span>\n {activeTab.subtitle && (\n <span className={styles.breadcrumbSublabel}>{activeTab.subtitle}</span>\n )}\n </div>\n </div>\n )}\n </div>\n {onExpandTabs && (\n <button className={styles.expandBtn} onClick={onExpandTabs} aria-label=\"Show all tabs\">\n <ChevronRightIcon />\n </button>\n )}\n {collapsedRightActions}\n </>\n ) : (\n <>\n <div className={styles.tabsArea}>\n <BannerTabs items={tabs} activeId={activeTabId} onChange={onTabChange} />\n </div>\n {fullRightActions}\n </>\n )}\n </div>\n\n {/* ── Secondary toolbar row ─────────────────────────────────────── */}\n {toolbar && !collapsed && (\n <div className={styles.toolbarRow}>\n {toolbar.left && <div className={styles.toolbarLeft}>{toolbar.left}</div>}\n {toolbar.center && <div className={styles.toolbarCenter}>{toolbar.center}</div>}\n {toolbar.right && <div className={styles.toolbarRight}>{toolbar.right}</div>}\n </div>\n )}\n\n {/* ── BannerAlert strip ─────────────────────────────────────────── */}\n {banner && !collapsed && (\n <BannerAlert\n severity={banner.severity ?? 'warn'}\n title={banner.title}\n detail={banner.detail}\n closable={banner.closable ?? true}\n onClose={banner.onClose}\n />\n )}\n </nav>\n );\n }\n);\n","import { useState, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport styles from './DataTable.module.css';\nimport { Button } from '../Button';\nimport { IconButton } from '../IconButton';\nimport { SelectButton } from '../SelectButton';\nimport { DatePicker } from '../DatePicker';\nimport { Select } from '../Select';\nimport { InputText } from '../InputText';\nimport { Checkbox } from '../Checkbox';\n\nconst RemoveIcon = (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1l8 8M9 1l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n// Date <-> ISO string helpers. Parsing \"YYYY-MM-DD\" with `new Date()` gives\n// UTC midnight, which shifts to the previous local day in US timezones — so\n// build the Date from year/month/day directly to stay timezone-safe.\nfunction parseISODate(s: string): Date | null {\n const m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n return new Date(parseInt(m[1], 10), parseInt(m[2], 10) - 1, parseInt(m[3], 10));\n}\n\nfunction toISODate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type FilterType = 'rule' | 'checklist' | 'grouped-checklist';\n\n/**\n * Drives which operator set the rule filter shows and which value editor it\n * renders. `'text'` (default) uses text operators with a text input. `'date'`\n * uses date operators with a native date picker.\n */\nexport type FilterDataType = 'text' | 'date';\n\nexport interface FilterOption {\n label: string;\n value: unknown;\n}\n\nexport interface FilterGroup {\n label: string;\n options: FilterOption[];\n}\n\nexport interface ColumnFilter {\n /** Determines which filter UI to render. */\n type: FilterType;\n /**\n * For `'rule'` type — selects the operator set and value editor.\n * @default 'text'\n */\n dataType?: FilterDataType;\n /** Options for `'checklist'` type. */\n options?: FilterOption[];\n /** Grouped options for `'grouped-checklist'` type. */\n groups?: FilterGroup[];\n /** Controlled filter value. Format depends on type. */\n value?: unknown;\n /** Called with the new value when the user clicks Apply. */\n onChange?: (value: unknown) => void;\n}\n\n// ─── Rule-based filter value ──────────────────────────────────────────────────\n\nexport interface FilterRule {\n matchMode: string;\n value: string;\n}\n\nexport interface RuleFilterValue {\n operator: 'and' | 'or';\n rules: FilterRule[];\n}\n\nconst TEXT_MATCH_MODES = [\n { label: 'Contains', value: 'contains' },\n { label: 'Starts with', value: 'startsWith' },\n { label: 'Ends with', value: 'endsWith' },\n { label: 'Equals', value: 'equals' },\n { label: 'Not equals', value: 'notEquals' },\n { label: 'Greater than', value: 'gt' },\n { label: 'Less than', value: 'lt' },\n { label: 'Blank', value: 'blank' },\n { label: 'Not blank', value: 'notBlank' },\n];\n\nconst DATE_MATCH_MODES = [\n { label: 'Date equal to', value: 'dateEquals' },\n { label: 'Date not equal to', value: 'dateNotEquals' },\n { label: 'Date before', value: 'dateBefore' },\n { label: 'Date after', value: 'dateAfter' },\n { label: 'Date on or before', value: 'dateOnOrBefore' },\n { label: 'Date on or after', value: 'dateOnOrAfter' },\n { label: 'Blank', value: 'blank' },\n { label: 'Not blank', value: 'notBlank' },\n];\n\n// Operators that take no value — the value input is hidden.\nconst VALUELESS_MODES = new Set(['blank', 'notBlank']);\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction RuleFilter({\n value,\n dataType,\n onApply,\n onReset,\n onClose,\n}: {\n value?: RuleFilterValue;\n dataType: FilterDataType;\n onApply: (v: RuleFilterValue) => void;\n onReset: () => void;\n onClose: () => void;\n}) {\n const matchModes = dataType === 'date' ? DATE_MATCH_MODES : TEXT_MATCH_MODES;\n const defaultMode = matchModes[0].value;\n const [rules, setRules] = useState<FilterRule[]>(\n value?.rules?.length ? value.rules : [{ matchMode: defaultMode, value: '' }],\n );\n const [operator, setOperator] = useState<'and' | 'or'>(value?.operator ?? 'and');\n\n function updateRule(i: number, patch: Partial<FilterRule>) {\n setRules(prev => prev.map((r, idx) => (idx === i ? { ...r, ...patch } : r)));\n }\n\n function addRule() {\n setRules(prev => [...prev, { matchMode: defaultMode, value: '' }]);\n }\n\n function removeRule(i: number) {\n setRules(prev => prev.filter((_, idx) => idx !== i));\n }\n\n return (\n <>\n <div className={styles.filterBody}>\n {rules.map((rule, i) => (\n <div key={i} className={styles.filterRule}>\n {i > 0 && (\n <div className={styles.filterOperatorRow}>\n <SelectButton\n options={[\n { label: 'AND', value: 'and' },\n { label: 'OR', value: 'or' },\n ]}\n value={operator}\n onChange={v => setOperator(v as 'and' | 'or')}\n />\n </div>\n )}\n <div className={styles.filterRuleRow}>\n <div className={styles.filterFieldFull}>\n <Select\n options={matchModes}\n value={rule.matchMode}\n onChange={v => v && updateRule(i, { matchMode: v })}\n style={{ width: '100%' }}\n />\n </div>\n {!VALUELESS_MODES.has(rule.matchMode) && (\n <div className={styles.filterInputRow}>\n <div className={styles.filterFieldFull}>\n {dataType === 'date' ? (\n <DatePicker\n value={rule.value ? parseISODate(rule.value) : null}\n onChange={d => updateRule(i, { value: d ? toISODate(d) : '' })}\n style={{ width: '100%' }}\n />\n ) : (\n <InputText\n placeholder=\"Value\"\n value={rule.value}\n onChange={e => updateRule(i, { value: e.target.value })}\n />\n )}\n </div>\n {rules.length > 1 && (\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n icon={RemoveIcon}\n aria-label=\"Remove rule\"\n onClick={() => removeRule(i)}\n />\n )}\n </div>\n )}\n {VALUELESS_MODES.has(rule.matchMode) && rules.length > 1 && (\n <div className={styles.filterInputRow}>\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n icon={RemoveIcon}\n aria-label=\"Remove rule\"\n onClick={() => removeRule(i)}\n />\n </div>\n )}\n </div>\n </div>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={addRule} style={{ alignSelf: 'flex-start' }}>\n + Add rule\n </Button>\n </div>\n <FilterFooter onReset={onReset} onApply={() => onApply({ operator, rules })} onClose={onClose} />\n </>\n );\n}\n\nfunction ChecklistFilter({\n options = [],\n value,\n onApply,\n onReset,\n onClose,\n}: {\n options?: FilterOption[];\n value?: unknown[];\n onApply: (v: unknown[]) => void;\n onReset: () => void;\n onClose: () => void;\n}) {\n const [selected, setSelected] = useState<Set<unknown>>(new Set(value ?? []));\n const [search, setSearch] = useState('');\n\n const filtered = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n );\n const allSelected = filtered.length > 0 && filtered.every(o => selected.has(o.value));\n const someSelected = filtered.some(o => selected.has(o.value));\n const partialSelected = someSelected && !allSelected;\n\n function toggle(v: unknown) {\n setSelected(prev => {\n const next = new Set(prev);\n next.has(v) ? next.delete(v) : next.add(v);\n return next;\n });\n }\n\n function toggleAll() {\n if (allSelected) {\n setSelected(prev => {\n const next = new Set(prev);\n filtered.forEach(o => next.delete(o.value));\n return next;\n });\n } else {\n setSelected(prev => {\n const next = new Set(prev);\n filtered.forEach(o => next.add(o.value));\n return next;\n });\n }\n }\n\n return (\n <>\n <div className={styles.filterBody}>\n <InputText\n placeholder=\"Search…\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n prefixIcon={\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L12.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n }\n />\n <div className={styles.filterChecklist}>\n <Checkbox\n label=\"Select All\"\n checked={allSelected}\n indeterminate={partialSelected}\n onChange={toggleAll}\n />\n {filtered.map(opt => (\n <Checkbox\n key={String(opt.value)}\n label={opt.label}\n checked={selected.has(opt.value)}\n onChange={() => toggle(opt.value)}\n />\n ))}\n </div>\n </div>\n <FilterFooter onReset={onReset} onApply={() => onApply(Array.from(selected))} onClose={onClose} />\n </>\n );\n}\n\nfunction GroupedChecklistFilter({\n groups = [],\n value,\n onApply,\n onReset,\n onClose,\n}: {\n groups?: FilterGroup[];\n value?: unknown[];\n onApply: (v: unknown[]) => void;\n onReset: () => void;\n onClose: () => void;\n}) {\n const [selected, setSelected] = useState<Set<unknown>>(new Set(value ?? []));\n\n function toggle(v: unknown) {\n setSelected(prev => {\n const next = new Set(prev);\n next.has(v) ? next.delete(v) : next.add(v);\n return next;\n });\n }\n\n function clearGroup(group: FilterGroup) {\n setSelected(prev => {\n const next = new Set(prev);\n group.options.forEach(o => next.delete(o.value));\n return next;\n });\n }\n\n return (\n <>\n <div className={styles.filterBody}>\n {groups.map(group => (\n <div key={group.label} className={styles.filterGroup}>\n <div className={styles.filterGroupHeader}>\n <span className={styles.filterGroupLabel}>{group.label}</span>\n <Button variant=\"link\" size=\"sm\" onClick={() => clearGroup(group)}>\n Clear All\n </Button>\n </div>\n {group.options.map(opt => (\n <Checkbox\n key={String(opt.value)}\n label={opt.label}\n checked={selected.has(opt.value)}\n onChange={() => toggle(opt.value)}\n />\n ))}\n </div>\n ))}\n </div>\n <FilterFooter onReset={onReset} onApply={() => onApply(Array.from(selected))} onClose={onClose} />\n </>\n );\n}\n\nfunction FilterFooter({\n onReset,\n onApply,\n onClose,\n}: {\n onReset: () => void;\n onApply: () => void;\n onClose: () => void;\n}) {\n return (\n <div className={styles.filterFooter}>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => { onReset(); onClose(); }}>\n Reset\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={() => { onApply(); onClose(); }}>\n Apply\n </Button>\n </div>\n );\n}\n\n// ─── Main FilterPopover ───────────────────────────────────────────────────────\n\ninterface FilterPopoverProps {\n config: ColumnFilter;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLButtonElement>;\n}\n\nexport function FilterPopover({ config, onClose, anchorRef }: FilterPopoverProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\n\n // Compute position from the filter button's rect; flip to keep within viewport.\n // Tracks scroll (capture, so nested overflow scrolls fire too) + resize.\n useEffect(() => {\n function recompute() {\n const anchor = anchorRef.current?.getBoundingClientRect();\n if (!anchor) return;\n const POPOVER_W = 280;\n const POPOVER_H = 360;\n let top = anchor.bottom + 4;\n let left = anchor.left;\n if (left + POPOVER_W > window.innerWidth - 8) {\n left = Math.max(8, anchor.right - POPOVER_W);\n }\n if (top + POPOVER_H > window.innerHeight - 8) {\n top = Math.max(8, anchor.top - POPOVER_H - 4);\n }\n setPos({ top, left });\n }\n recompute();\n window.addEventListener('scroll', recompute, true);\n window.addEventListener('resize', recompute);\n return () => {\n window.removeEventListener('scroll', recompute, true);\n window.removeEventListener('resize', recompute);\n };\n }, [anchorRef]);\n\n // Close on outside click — but ignore clicks inside any portaled child popover\n // (Select dropdown, DatePicker calendar). Those mark themselves with\n // `data-popover-root` so they don't trick us into closing.\n useEffect(() => {\n function handleOut(e: MouseEvent) {\n const target = e.target as HTMLElement;\n if (target.closest('[data-popover-root]')) return;\n if (\n panelRef.current && !panelRef.current.contains(target) &&\n anchorRef.current && !anchorRef.current.contains(target)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleOut);\n return () => document.removeEventListener('mousedown', handleOut);\n }, [onClose, anchorRef]);\n\n // Close on Escape\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [onClose]);\n\n function handleReset() {\n config.onChange?.(null);\n }\n\n if (!pos) return null;\n\n return createPortal(\n <div\n ref={panelRef}\n data-popover-root=\"\"\n className={styles.filterPopover}\n style={{ top: pos.top, left: pos.left }}\n >\n {config.type === 'rule' && (\n <RuleFilter\n value={config.value as RuleFilterValue | undefined}\n dataType={config.dataType ?? 'text'}\n onApply={v => config.onChange?.(v)}\n onReset={handleReset}\n onClose={onClose}\n />\n )}\n {config.type === 'checklist' && (\n <ChecklistFilter\n options={config.options}\n value={config.value as unknown[] | undefined}\n onApply={v => config.onChange?.(v)}\n onReset={handleReset}\n onClose={onClose}\n />\n )}\n {config.type === 'grouped-checklist' && (\n <GroupedChecklistFilter\n groups={config.groups}\n value={config.value as unknown[] | undefined}\n onApply={v => config.onChange?.(v)}\n onReset={handleReset}\n onClose={onClose}\n />\n )}\n </div>,\n document.body,\n );\n}\n","import { useState, useRef, useCallback } from 'react';\nimport styles from './DataTable.module.css';\nimport { FilterPopover } from './DataTableFilter';\nimport type { ColumnFilter } from './DataTableFilter';\nimport { Checkbox } from '../Checkbox';\nimport { IconButton } from '../IconButton';\nimport { CloseButton } from '../CloseButton';\n\n// ─── Re-export filter types ───────────────────────────────────────────────────\nexport type { ColumnFilter, FilterOption, FilterGroup, FilterType, FilterDataType, RuleFilterValue } from './DataTableFilter';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type SortOrder = 1 | -1;\nexport type SelectionMode = 'none' | 'single' | 'multiple';\nexport type EditMode = 'row' | 'cell';\n\nexport interface SortMeta {\n field: string;\n order: SortOrder;\n}\n\nexport interface DataTableColumn<T extends object = Record<string, unknown>> {\n /** Data field key. */\n field: string;\n /** Column header content. */\n header: React.ReactNode;\n /** Show sort icons and make column sortable. */\n sortable?: boolean;\n /** Attach a filter popover to this column's header. */\n filter?: ColumnFilter;\n /** Custom cell renderer. Return any ReactNode. */\n body?: (row: T, index: number) => React.ReactNode;\n /**\n * Editor rendered when a row/cell enters edit mode.\n * `onChange` should be called with the new value.\n */\n editor?: (row: T, field: string, onChange: (val: unknown) => void) => React.ReactNode;\n /** Footer cell content. Pass a function to receive all data. */\n footer?: React.ReactNode | ((data: T[]) => React.ReactNode);\n /** Column width (px number or CSS string). */\n width?: number | string;\n /** Text alignment for header and cells. */\n align?: 'left' | 'center' | 'right';\n}\n\n/** Pre-grouped data structure. */\nexport interface DataTableGroup<T extends object = Record<string, unknown>> {\n /** Group header label. */\n label: string;\n /** Rows in this group. */\n data: T[];\n /** Whether the group starts expanded. Defaults to true. */\n defaultExpanded?: boolean;\n}\n\n/** Row expansion (nested rows) configuration. */\nexport interface DataTableExpansion<T extends object = Record<string, unknown>> {\n /** Field used as the unique row key for tracking expanded state. */\n dataKey: string;\n /**\n * Field on each row that contains an array of child rows.\n * If provided, the expanded section renders a nested DataTable\n * using the same columns (or `columns` if specified).\n */\n childKey?: string;\n /** Custom expansion template. Overrides the default nested table. */\n template?: (row: T) => React.ReactNode;\n /** Custom column set for the nested table. Defaults to parent columns. */\n columns?: DataTableColumn<T>[];\n}\n\nexport interface DataTableProps<T extends object = Record<string, unknown>> {\n /** Flat row array or pre-grouped array (`DataTableGroup<T>[]`). */\n data: T[] | DataTableGroup<T>[];\n /** Column definitions. */\n columns: DataTableColumn<T>[];\n /** Field name used as unique row identifier. Defaults to `'id'`. */\n dataKey?: string;\n\n // ── Selection ──\n selectionMode?: SelectionMode;\n /** Controlled selection. `T` for single, `T[]` for multiple. */\n selection?: T | T[] | null;\n onSelectionChange?: (sel: T | T[] | null) => void;\n\n // ── Sorting (controlled — parent manages actual sort) ──\n sortMode?: 'single' | 'multiple';\n sortField?: string;\n sortOrder?: SortOrder;\n multiSortMeta?: SortMeta[];\n onSort?: (e: { field: string; order: SortOrder; multiSortMeta?: SortMeta[] }) => void;\n\n // ── Row expansion / nested rows ──\n expansion?: DataTableExpansion<T>;\n\n // ── Inline editing ──\n editMode?: EditMode;\n onRowEditSave?: (updated: T, original: T) => void;\n onRowEditCancel?: () => void;\n onCellEdit?: (row: T, field: string, value: unknown) => void;\n\n // ── Display ──\n stripedRows?: boolean;\n /** `'sm'` = compact (6px padding). `'md'` = default (8px). */\n size?: 'sm' | 'md';\n showFooter?: boolean;\n loading?: boolean;\n emptyMessage?: React.ReactNode;\n scrollable?: boolean;\n scrollHeight?: string;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction isGroupedData<T extends object>(data: T[] | DataTableGroup<T>[]): data is DataTableGroup<T>[] {\n return data.length > 0 && typeof data[0] === 'object' && data[0] !== null && 'label' in data[0] && 'data' in data[0];\n}\n\nfunction getRowKey<T>(row: T, dataKey: string): unknown {\n return (row as Record<string, unknown>)[dataKey];\n}\n\nfunction getCellValue<T>(row: T, field: string): unknown {\n return (row as Record<string, unknown>)[field];\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nfunction SortAscIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M5 2L2 6h6L5 2z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M5 8L2 4h6L5 8z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortNeutralIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" fill=\"none\">\n <path d=\"M5 2L2 6h6L5 2z\" fill=\"currentColor\" opacity=\"0.3\" />\n <path d=\"M5 12L2 8h6l-3 4z\" fill=\"currentColor\" opacity=\"0.3\" />\n </svg>\n );\n}\n\nfunction FilterIcon({ active }: { active?: boolean }) {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M1 2h8M2.5 5h5M4 8h2\"\n stroke={active ? 'var(--teal-700,#047880)' : 'currentColor'}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M4 2l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 4l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nconst CheckSvg = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst PencilSvg = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M8 2l2 2-6 6H2V8l6-6z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\n/**\n * DataTable — Clear Design System\n *\n * A full-featured data grid with sortable/filterable columns, row selection,\n * expandable row groups, nested row expansion, and inline row/cell editing.\n *\n * @example\n * <DataTable\n * data={loans}\n * dataKey=\"id\"\n * columns={[\n * { field: 'borrower', header: 'Borrower', sortable: true },\n * { field: 'amount', header: 'Amount', body: (row) => formatCurrency(row.amount) },\n * ]}\n * />\n */\nexport function DataTable<T extends object = Record<string, unknown>>({\n data,\n columns,\n dataKey = 'id',\n selectionMode = 'none',\n selection,\n onSelectionChange,\n sortMode = 'single',\n sortField,\n sortOrder,\n multiSortMeta,\n onSort,\n expansion,\n editMode,\n onRowEditSave,\n onRowEditCancel,\n onCellEdit,\n stripedRows = false,\n size = 'md',\n showFooter = false,\n loading = false,\n emptyMessage = 'No data found.',\n scrollable = false,\n scrollHeight,\n className,\n style,\n}: DataTableProps<T>) {\n // ── Internal state ────────────────────────────────────────────────────────\n const [expandedKeys, setExpandedKeys] = useState<Set<unknown>>(new Set());\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(() => {\n if (isGroupedData(data)) {\n return new Set(\n data\n .filter(g => g.defaultExpanded !== false)\n .map(g => g.label),\n );\n }\n return new Set();\n });\n const [editingRowKey, setEditingRowKey] = useState<unknown>(null);\n const [editingCell, setEditingCell] = useState<{ rowKey: unknown; field: string } | null>(null);\n const [editValues, setEditValues] = useState<Record<string, unknown>>({});\n const [openFilterField, setOpenFilterField] = useState<string | null>(null);\n const filterBtnRefs = useRef<Map<string, React.RefObject<HTMLButtonElement>>>(new Map());\n\n const grouped = isGroupedData(data);\n const flatData: T[] = grouped ? (data as DataTableGroup<T>[]).flatMap(g => g.data) : (data as T[]);\n\n // ── Total column count (including selection / expansion / edit cols) ───────\n const hasExpandCol = !!expansion;\n const hasSelectCol = selectionMode === 'multiple';\n const hasEditCol = editMode === 'row';\n const totalCols = columns.length + (hasExpandCol ? 1 : 0) + (hasSelectCol ? 1 : 0) + (hasEditCol ? 1 : 0);\n\n // ── Sort helpers ──────────────────────────────────────────────────────────\n function getSortOrder(field: string): SortOrder | 0 {\n if (sortMode === 'multiple' && multiSortMeta) {\n return multiSortMeta.find(m => m.field === field)?.order ?? 0;\n }\n return sortField === field ? (sortOrder ?? 0) : 0;\n }\n\n function getSortPriority(field: string): number | null {\n if (sortMode !== 'multiple' || !multiSortMeta) return null;\n const idx = multiSortMeta.findIndex(m => m.field === field);\n return idx >= 0 ? idx + 1 : null;\n }\n\n function handleSort(field: string) {\n if (!onSort) return;\n const current = getSortOrder(field);\n const next: SortOrder = current === 1 ? -1 : 1;\n if (sortMode === 'multiple') {\n const meta = multiSortMeta ? [...multiSortMeta] : [];\n const existing = meta.findIndex(m => m.field === field);\n if (existing >= 0) {\n meta[existing] = { field, order: next };\n } else {\n meta.push({ field, order: next });\n }\n onSort({ field, order: next, multiSortMeta: meta });\n } else {\n onSort({ field, order: next });\n }\n }\n\n // ── Selection helpers ─────────────────────────────────────────────────────\n function isSelected(row: T): boolean {\n if (!selection) return false;\n const key = getRowKey(row, dataKey);\n if (Array.isArray(selection)) {\n return selection.some(r => getRowKey(r, dataKey) === key);\n }\n return getRowKey(selection as T, dataKey) === key;\n }\n\n function handleRowSelect(row: T) {\n if (selectionMode === 'none' && editMode !== 'cell') return;\n if (selectionMode === 'single') {\n onSelectionChange?.(isSelected(row) ? null : row);\n } else if (selectionMode === 'multiple') {\n const arr = Array.isArray(selection) ? [...selection] : [];\n const key = getRowKey(row, dataKey);\n const idx = arr.findIndex(r => getRowKey(r, dataKey) === key);\n if (idx >= 0) {\n arr.splice(idx, 1);\n } else {\n arr.push(row);\n }\n onSelectionChange?.(arr);\n }\n }\n\n function handleSelectAll(checked: boolean) {\n onSelectionChange?.(checked ? [...flatData] : []);\n }\n\n const allSelected = flatData.length > 0 && flatData.every(r => isSelected(r));\n const someSelected = !allSelected && flatData.some(r => isSelected(r));\n\n // ── Expansion helpers ─────────────────────────────────────────────────────\n function toggleExpand(row: T) {\n const key = expansion ? getRowKey(row, expansion.dataKey) : getRowKey(row, dataKey);\n setExpandedKeys(prev => {\n const next = new Set(prev);\n next.has(key) ? next.delete(key) : next.add(key);\n return next;\n });\n }\n\n function isExpanded(row: T): boolean {\n const key = expansion ? getRowKey(row, expansion.dataKey) : getRowKey(row, dataKey);\n return expandedKeys.has(key);\n }\n\n // ── Edit helpers ──────────────────────────────────────────────────────────\n function startRowEdit(row: T) {\n const key = getRowKey(row, dataKey);\n const vals: Record<string, unknown> = {};\n columns.forEach(col => { vals[col.field] = getCellValue(row, col.field); });\n setEditingRowKey(key);\n setEditValues(vals);\n }\n\n function saveRowEdit(row: T) {\n const updated = { ...row, ...editValues } as T;\n onRowEditSave?.(updated, row);\n setEditingRowKey(null);\n setEditValues({});\n }\n\n function cancelRowEdit() {\n setEditingRowKey(null);\n setEditValues({});\n onRowEditCancel?.();\n }\n\n function startCellEdit(row: T, field: string) {\n const key = getRowKey(row, dataKey);\n setEditingCell({ rowKey: key, field });\n setEditValues({ [field]: getCellValue(row, field) });\n }\n\n function saveCellEdit(row: T, field: string) {\n const updated = { ...row, [field]: editValues[field] } as T;\n onCellEdit?.(updated, field, editValues[field]);\n setEditingCell(null);\n setEditValues({});\n }\n\n // ── Filter helper ─────────────────────────────────────────────────────────\n function getFilterBtnRef(field: string): React.RefObject<HTMLButtonElement> {\n if (!filterBtnRefs.current.has(field)) {\n filterBtnRefs.current.set(field, { current: null } as React.RefObject<HTMLButtonElement>);\n }\n return filterBtnRefs.current.get(field)!;\n }\n\n function isFilterActive(col: DataTableColumn<T>): boolean {\n if (!col.filter?.value) return false;\n const v = col.filter.value;\n if (Array.isArray(v)) return v.length > 0;\n if (typeof v === 'object' && v !== null) {\n const rv = v as { rules?: unknown[] };\n return (rv.rules ?? []).some((r: unknown) => (r as { value?: string }).value !== '');\n }\n return false;\n }\n\n // ── Render: header row ────────────────────────────────────────────────────\n const renderHeader = () => (\n <thead>\n <tr className={styles.headerRow}>\n {hasExpandCol && <th className={`${styles.headerCell} ${styles.expandCol}`} />}\n {hasSelectCol && (\n <th className={`${styles.headerCell} ${styles.selectCol}`}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={e => handleSelectAll(e.target.checked)}\n aria-label=\"Select all rows\"\n size=\"sm\"\n />\n </th>\n )}\n {columns.map(col => {\n const order = getSortOrder(col.field);\n const priority = getSortPriority(col.field);\n const filterRef = col.filter ? getFilterBtnRef(col.field) : null;\n return (\n <th\n key={col.field}\n className={`${styles.headerCell} ${col.sortable ? styles.headerCellSortable : ''}`}\n style={{ width: col.width, textAlign: col.align ?? 'left' }}\n onClick={() => col.sortable && handleSort(col.field)}\n aria-sort={order === 1 ? 'ascending' : order === -1 ? 'descending' : 'none'}\n >\n <span className={styles.headerCellContent}>\n <span className={styles.headerText}>{col.header}</span>\n\n {col.sortable && (\n <span className={`${styles.sortIcon} ${order !== 0 ? styles.sortIconActive : ''}`}>\n {order === 1 ? <SortAscIcon /> : order === -1 ? <SortDescIcon /> : <SortNeutralIcon />}\n {priority !== null && (\n <span className={styles.sortPriority}>{priority}</span>\n )}\n </span>\n )}\n\n {col.filter && (\n <div className={styles.filterBtnWrap} onClick={e => e.stopPropagation()}>\n <button\n ref={filterRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n className={`${styles.filterBtn} ${isFilterActive(col) ? styles.filterBtnActive : ''}`}\n aria-label={`Filter ${col.header}`}\n onClick={() => setOpenFilterField(prev => prev === col.field ? null : col.field)}\n >\n <FilterIcon active={isFilterActive(col)} />\n </button>\n {openFilterField === col.field && filterRef && (\n <FilterPopover\n config={col.filter}\n onClose={() => setOpenFilterField(null)}\n anchorRef={filterRef}\n />\n )}\n </div>\n )}\n </span>\n </th>\n );\n })}\n {hasEditCol && <th className={`${styles.headerCell} ${styles.editCol}`} />}\n </tr>\n </thead>\n );\n\n // ── Render: a single body row ─────────────────────────────────────────────\n const renderBodyRow = useCallback((row: T, rowIndex: number, isOdd: boolean) => {\n const rowKey = getRowKey(row, dataKey);\n const selected = isSelected(row);\n const expanded = hasExpandCol && isExpanded(row);\n const isEditingRow = editMode === 'row' && editingRowKey === rowKey;\n\n const rowClass = [\n styles.bodyRow,\n selected ? styles.rowSelected : '',\n stripedRows && isOdd ? styles.rowStriped : '',\n selectionMode !== 'none' ? styles.rowClickable : '',\n ].filter(Boolean).join(' ');\n\n const cells = columns.map(col => {\n const isEditingCell = editMode === 'cell' && editingCell != null && editingCell.rowKey === rowKey && editingCell.field === col.field;\n const showEditor = isEditingRow || isEditingCell;\n\n let content: React.ReactNode;\n if (showEditor && col.editor) {\n content = col.editor(\n { ...row, ...editValues } as T,\n col.field,\n val => setEditValues(prev => ({ ...prev, [col.field]: val })),\n );\n } else if (showEditor) {\n content = (\n <input\n className={styles.cellInput}\n value={String(editValues[col.field] ?? getCellValue(row, col.field) ?? '')}\n onChange={e => setEditValues(prev => ({ ...prev, [col.field]: e.target.value }))}\n />\n );\n } else if (col.body) {\n content = col.body(row, rowIndex);\n } else {\n content = String(getCellValue(row, col.field) ?? '');\n }\n\n return (\n <td\n key={col.field}\n className={styles.bodyCell}\n style={{ textAlign: col.align ?? 'left' }}\n onClick={() => {\n if (editMode === 'cell' && col.editor && !isEditingCell) {\n if (editingCell) saveCellEdit(row, editingCell.field);\n startCellEdit(row, col.field);\n }\n }}\n >\n {isEditingCell ? (\n <div className={styles.cellEditWrap}>\n {content}\n <IconButton variant=\"ghost\" size=\"sm\" icon={<CheckSvg />} aria-label=\"Confirm edit\" onClick={e => { e.stopPropagation(); saveCellEdit(row, col.field); }} />\n <CloseButton size=\"sm\" aria-label=\"Cancel edit\" onClick={e => { e.stopPropagation(); setEditingCell(null); setEditValues({}); }} />\n </div>\n ) : content}\n </td>\n );\n });\n\n return (\n <>\n <tr\n key={String(rowKey)}\n className={rowClass}\n onClick={() => {\n if (selectionMode !== 'none') handleRowSelect(row);\n }}\n aria-selected={selectionMode !== 'none' ? selected : undefined}\n >\n {hasExpandCol && (\n <td className={`${styles.bodyCell} ${styles.expandCell}`}>\n <button\n type=\"button\"\n className={styles.expandBtn}\n onClick={e => { e.stopPropagation(); toggleExpand(row); }}\n aria-label={expanded ? 'Collapse row' : 'Expand row'}\n aria-expanded={expanded}\n >\n {expanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </button>\n </td>\n )}\n {hasSelectCol && (\n <td className={`${styles.bodyCell} ${styles.selectCell}`} onClick={e => e.stopPropagation()}>\n <Checkbox\n checked={selected}\n onChange={() => handleRowSelect(row)}\n aria-label=\"Select row\"\n size=\"sm\"\n />\n </td>\n )}\n {cells}\n {hasEditCol && (\n <td className={`${styles.bodyCell} ${styles.editCell}`} onClick={e => e.stopPropagation()}>\n {isEditingRow ? (\n <div className={styles.rowEditBtns}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<CheckSvg />} aria-label=\"Save row\" onClick={() => saveRowEdit(row)} />\n <CloseButton size=\"sm\" aria-label=\"Cancel edit\" onClick={cancelRowEdit} />\n </div>\n ) : (\n <IconButton variant=\"ghost\" size=\"sm\" icon={<PencilSvg />} aria-label=\"Edit row\" onClick={() => startRowEdit(row)} />\n )}\n </td>\n )}\n </tr>\n\n {/* Expansion row */}\n {hasExpandCol && expanded && expansion && (\n <tr key={`${String(rowKey)}-expansion`} className={styles.expansionRow}>\n <td colSpan={totalCols} className={styles.expansionCell}>\n {expansion.template ? (\n expansion.template(row)\n ) : expansion.childKey ? (\n <DataTable<T>\n data={(getCellValue(row, String(expansion.childKey)) as T[]) ?? []}\n columns={expansion.columns ?? columns}\n dataKey={dataKey}\n selectionMode={selectionMode}\n stripedRows={stripedRows}\n size={size}\n showFooter={showFooter}\n editMode={editMode}\n />\n ) : null}\n </td>\n </tr>\n )}\n </>\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columns, editingRowKey, editingCell, editValues, expandedKeys, selection, stripedRows, hasExpandCol, hasSelectCol, hasEditCol, selectionMode, editMode]);\n\n // ── Render: body ──────────────────────────────────────────────────────────\n const renderBody = () => {\n if (loading) {\n return (\n <tbody>\n {Array.from({ length: 5 }).map((_, i) => (\n <tr key={i} className={styles.bodyRow}>\n {Array.from({ length: totalCols }).map((__, j) => (\n <td key={j} className={styles.bodyCell}>\n <span className={styles.skeleton} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n }\n\n if (flatData.length === 0) {\n return (\n <tbody>\n <tr>\n <td colSpan={totalCols} className={styles.emptyCell}>\n {emptyMessage}\n </td>\n </tr>\n </tbody>\n );\n }\n\n if (grouped) {\n return (\n <tbody>\n {(data as DataTableGroup<T>[]).map(group => {\n const isGroupExpanded = expandedGroups.has(group.label);\n return (\n <>\n {/* Group header row */}\n <tr\n key={`group-${group.label}`}\n className={styles.groupRow}\n onClick={() => setExpandedGroups(prev => {\n const next = new Set(prev);\n next.has(group.label) ? next.delete(group.label) : next.add(group.label);\n return next;\n })}\n >\n <td colSpan={totalCols} className={styles.groupCell}>\n <span className={styles.groupToggle}>\n {isGroupExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </span>\n <span className={styles.groupLabel}>{group.label}</span>\n <span className={styles.groupCount}>({group.data.length})</span>\n </td>\n </tr>\n {/* Child rows */}\n {isGroupExpanded && group.data.map((row, i) => renderBodyRow(row, i, i % 2 !== 0))}\n </>\n );\n })}\n </tbody>\n );\n }\n\n return (\n <tbody>\n {(data as T[]).map((row, i) => renderBodyRow(row, i, i % 2 !== 0))}\n </tbody>\n );\n };\n\n // ── Render: footer ────────────────────────────────────────────────────────\n const renderFooter = () => {\n if (!showFooter) return null;\n const hasFooter = columns.some(col => col.footer !== undefined);\n if (!hasFooter) return null;\n return (\n <tfoot>\n <tr className={styles.footerRow}>\n {hasExpandCol && <td className={styles.footerCell} />}\n {hasSelectCol && <td className={styles.footerCell} />}\n {columns.map(col => (\n <td key={col.field} className={styles.footerCell} style={{ textAlign: col.align ?? 'left' }}>\n {typeof col.footer === 'function' ? col.footer(flatData) : col.footer}\n </td>\n ))}\n {hasEditCol && <td className={styles.footerCell} />}\n </tr>\n </tfoot>\n );\n };\n\n // ── Main render ───────────────────────────────────────────────────────────\n const tableClass = [\n styles.table,\n styles[size],\n stripedRows ? styles.striped : '',\n ].filter(Boolean).join(' ');\n\n const wrapClass = [\n styles.wrapper,\n scrollable ? styles.wrapperScrollable : '',\n className ?? '',\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapClass} style={style}>\n <div\n className={styles.scrollContainer}\n style={scrollable && scrollHeight ? { maxHeight: scrollHeight, overflowY: 'auto' } : undefined}\n >\n <table className={tableClass} role=\"grid\">\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </table>\n </div>\n {loading && <div className={styles.loadingOverlay} aria-busy=\"true\" aria-label=\"Loading\" />}\n </div>\n );\n}\n\nDataTable.displayName = 'DataTable';\n","import React from 'react';\nimport { TopBar } from '../TopBar/TopBar';\nimport { LoanBannerNav } from '../LoanBannerNav/LoanBannerNav';\nimport { URLATabsNav } from '../URLATabsNav/URLATabsNav';\nimport type { TopBarProps } from '../TopBar/TopBar';\nimport type { LoanBannerNavProps } from '../LoanBannerNav/LoanBannerNav';\nimport type { URLATabsNavProps } from '../URLATabsNav/URLATabsNav';\nimport styles from './FullNav.module.css';\n\nexport interface FullNavProps {\n topBar: TopBarProps;\n /** When provided → loan-file context: LoanBannerNav renders below TopBar */\n loanBannerNav?: LoanBannerNavProps;\n /** When provided → URLA section: URLATabsNav renders below LoanBannerNav */\n urlATabsNav?: URLATabsNavProps;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function FullNav({ topBar, loanBannerNav, urlATabsNav, className, style }: FullNavProps) {\n return (\n <div\n className={[styles.shell, className].filter(Boolean).join(' ')}\n style={style}\n >\n <TopBar {...topBar} />\n {loanBannerNav && <LoanBannerNav {...loanBannerNav} />}\n {urlATabsNav && <URLATabsNav {...urlATabsNav} />}\n </div>\n );\n}\n","import React from 'react';\nimport { TopBarMobile } from '../TopBar/TopBarMobile';\nimport { URLATabsNavMobile } from '../URLATabsNav/URLATabsNavMobile';\nimport type { TopBarMobileProps } from '../TopBar/TopBarMobile';\nimport type { URLATabsNavMobileProps } from '../URLATabsNav/URLATabsNavMobile';\nimport styles from './FullNav.module.css';\n\nexport interface FullNavMobileProps {\n topBar: TopBarMobileProps;\n /** URLA sub-nav — only renders when topBar.borrower is also set */\n urlATabsNavMobile?: URLATabsNavMobileProps;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function FullNavMobile({ topBar, urlATabsNavMobile, className, style }: FullNavMobileProps) {\n const showSubNav = !!topBar.borrower && !!urlATabsNavMobile;\n\n return (\n <div\n className={[styles.shell, className].filter(Boolean).join(' ')}\n style={style}\n >\n <TopBarMobile {...topBar} />\n {showSubNav && <URLATabsNavMobile {...urlATabsNavMobile!} />}\n </div>\n );\n}\n"],"names":["Checkbox","forwardRef","label","indeterminate","invalid","helperText","size","disabled","id","className","rest","forwardedRef","internalRef","useRef","resolvedRef","useEffect","wrapperClass","styles","jsxs","jsx","_idCounter","InputText","required","prefixIcon","suffixIcon","idProp","ref","rootClass","isGroupedOptions","options","ListBox","value","onChange","multiple","filter","filterPlaceholder","style","uid","useId","filterId","helperId","filterText","setFilterText","useState","selectedValues","useMemo","grouped","matchesFilter","optLabel","handleOptionClick","optionValue","next","v","renderOption","opt","isGroupItem","isSelected","isDisabled","optClasses","isCheckedDisabled","e","renderOptions","group","items","containerClasses","showHeader","RadioButton","CONFIG","MiscChip","color","dismissible","onDismiss","cfg","cssVars","MultiSelect","placeholder","showSelectAll","footer","externalRef","dropdownId","triggerId","isOpen","setIsOpen","selectAllRef","setRef","node","selectableOptions","o","isAllSelected","isSomeSelected","handleOut","_a","handleKey","filteredOptions","q","toggleOpen","prev","toggleOption","optValue","removeValue","handleSelectAll","allVals","handleTriggerKeyDown","triggerClass","optClass","Select","triggerRef","dropdownRef","dropPos","setDropPos","selectedOption","target","_b","recompute","rect","hasScrolledOnOpen","useLayoutEffect","el","selectOption","isFilled","chevronClass","createPortal","IconButton","icon","variant","cls","DAY_NAMES","MONTH_NAMES","formatDate","date","m","d","parseInputDate","text","match","month","day","year","isSameDay","a","b","isDateDisabled","minDate","maxDate","min","max","getCalendarWeeks","firstDay","lastDay","startDate","endDate","weeks","cur","week","i","getISOWeek","yearStart","getYearPageStart","CalendarIcon","ChevronLeft","ChevronRight","DatePicker","showWeekNumbers","inputId","view","setView","viewYear","setViewYear","viewMonth","setViewMonth","inputText","setInputText","inputRef","calendarRef","calPos","setCalPos","today","formatted","close","open","navPrev","y","navNext","selectDay","selectMonth","monthIdx","selectYear","handleToday","todayDate","handleClear","handleInputChange","parsed","handleInputKeyDown","dayCellClass","inCurrentMonth","classes","isToday","dayInnerClass","monthCellClass","yearCellClass","yearPageStart","yearPage","_","headerTitle","wi","di","name","idx","Calendar","defaultMonth","initial","OptionContent","labelClassName","countClassName","badgeClassName","iconClassName","Fragment","SelectButton","handleSelect","sizeClass","isFirst","isLast","posClass","btnClass","rowClass","TextArea","rows","autoGrow","maxLength","defaultValue","charCount","setCharCount","handleChange","showCounter","outerClass","innerClass","ToggleSwitch","Button","leadingIcon","trailingIcon","badge","children","DropdownButton","onSelect","item","btnCls","CloseButton","ariaLabel","SplitButton","onAction","triggerAriaLabel","mainCls","triggerCls","getPageLinks","currentPage","totalPages","pageLinkSize","half","start","end","links","ChevronFirst","ChevronPrev","ChevronNext","ChevronLast","NavButton","onClick","selected","PageNav","onPage","link","Paginator","totalRecords","first","onPageChange","template","rowsPerPageOptions","goToPage","page","p","changeRows","newRows","rowsOptions","n","rangeStart","rangeEnd","containerClass","ChevronDoubleRight","ChevronDoubleLeft","SearchIcon","CloseIcon","ItemCheckbox","checked","CtrlBtn","Panel","header","selectedIds","onToggle","itemTemplate","filterValue","onFilterChange","showCheckbox","visible","Picklist","sourceItems","targetItems","sourceHeader","targetHeader","sourceFilterPlaceholder","targetFilterPlaceholder","showMoveAll","sourceSelected","setSourceSelected","targetSelected","setTargetSelected","sourceFilter","setSourceFilter","targetFilter","setTargetFilter","toggleSource","toggleTarget","moveSelectedToTarget","moving","remaining","moveAllToTarget","movable","moveSelectedToSource","moveAllToSource","hasSourceSelected","hasTargetSelected","hasSourceMovable","hasTargetMovable","Card","title","subTitle","interactive","hasCaption","Accordion","openIds","handleToggle","x","headerId","panelId","useBadge","useChevronAngle","Tabs","tabs","activeTab","activeItem","t","isNav","Root","tab","isActive","tabId","COLOR_MAP","BORDER_MAP","StatusIndicator","shape","fill","border","BADGE_DEFAULTS_GROUP0","BADGE_DEFAULTS_GROUP_N","BADGE_ZERO_COLOR","TabBadge","count","tooltip","diamondGroup0","bg","numColor","BannerTabs","activeId","trackRef","showLeft","setShowLeft","showRight","setShowRight","updateArrows","useCallback","ro","scrollBy","direction","gi","bi","def","resolvedShape","Drawer","onClose","subtitle","primaryAction","secondaryAction","tertiaryActions","side","width","bodyRef","showFooterShadow","setShowFooterShadow","handler","checkScroll","hasMoreBelow","raf","panelClass","overlayClass","action","listeners","_items","emit","l","removeItem","addItem","severity","detail","opts","toast","SEVERITY_CONFIG","SEVERITY_FALLBACKS","ToastItemView","layout","exiting","fb","descId","isVertical","Toaster","setItems","Toast","ProgressBar","error","errorMessage","clamped","pct","clearLogo","SIZE_CONFIG","ProgressSpinner","theme","gradId","px","sw","circumference","arcLength","gapLength","isLg","SeverityChip","ProfileChip","leading","trailing","DOT_CONFIG","AUSChip","BannerAlert","closable","InlineContainedAlert","message","InlineAlert","DEFAULT_DOC_TYPES","DEFAULT_ACCEPT","isValidFile","file","accept","ext","FileUpload","onFilesAdded","onUpload","docTypes","initialFiles","isDragOver","setIsDragOver","setError","canUpload","docTypeOptions","processFiles","files","valid","f","newItems","handleDragOver","handleDragLeave","handleDrop","handleZoneClick","updateDocType","docType","handleUpload","Tooltip","content","placement","delay","maxWidth","setVisible","timerRef","tooltipId","show","hide","tooltipClass","Modal","scrim","ARROW_H","Popup","trigger","align","pos","setPos","calculatePos","r","centerX","left","arrowLeft","SidePanel","onSave","headerContent","isCompact","actions","SidePanelLayout","panelWidth","ArrowRight","ReplayIcon","UserIcon","PlusCircle","SortIcon","ChevronDown","ApplicantSelector","applicants","selectedApplicantId","onApplicantChange","onAddApplicant","height","setOpen","wrapRef","SortButton","sortItems","onSortSelect","sizeStyle","URLATabsNav","props","activeTabId","onTabChange","onNextValidation","nextValidationBadge","onBackToAUS","URLATabsNavTablet","borrowerName","onLoanDetailsClick","tabStripBadge","SectionDropdown","ActionsButton","TabDropdown","URLATabsNavMobile","sectionLabel","sectionItems","onSectionSelect","onSectionSort","actionItems","onActionSelect","logoUrl","cx","DropdownPanel","NavItem","_id","isPrimary","handleClickOutside","handleKeyDown","getInitials","words","ProfileButton","profile","initials","TopBar","version","navItems","onSearch","searchPlaceholder","logoClipUrl","MobileProfileButton","TopBarMobile","borrower","onMenuOpen","onSearchOpen","isUrla","LightningButton","containerRef","HamburgerIcon","RefreshIcon","ChevronRightIcon","ChevronLeftIcon","NavChevronDown","NavBadgeDropdown","renderAction","isIconOnly","LoanBannerNav","onMenuToggle","secondaryActions","onRefresh","primaryLabel","onPrimary","primaryItems","onPrimarySelect","condition","toolbar","banner","collapsed","collapsedSection","onCollapsedBack","onExpandTabs","collapsedQuickItems","onCollapsedQuickAction","dotClass","primaryEl","fullRightActions","collapsedRightActions","RemoveIcon","parseISODate","s","toISODate","TEXT_MATCH_MODES","DATE_MATCH_MODES","VALUELESS_MODES","RuleFilter","dataType","onApply","onReset","matchModes","defaultMode","rules","setRules","operator","setOperator","updateRule","patch","addRule","removeRule","rule","FilterFooter","ChecklistFilter","setSelected","search","setSearch","filtered","allSelected","partialSelected","toggle","toggleAll","GroupedChecklistFilter","groups","clearGroup","FilterPopover","config","anchorRef","panelRef","anchor","POPOVER_W","POPOVER_H","top","handleReset","isGroupedData","data","getRowKey","row","dataKey","getCellValue","field","SortAscIcon","SortDescIcon","SortNeutralIcon","FilterIcon","active","ChevronDownIcon","CheckSvg","PencilSvg","DataTable","columns","selectionMode","selection","onSelectionChange","sortMode","sortField","sortOrder","multiSortMeta","onSort","expansion","editMode","onRowEditSave","onRowEditCancel","onCellEdit","stripedRows","showFooter","loading","emptyMessage","scrollable","scrollHeight","expandedKeys","setExpandedKeys","expandedGroups","setExpandedGroups","g","editingRowKey","setEditingRowKey","editingCell","setEditingCell","editValues","setEditValues","openFilterField","setOpenFilterField","filterBtnRefs","flatData","hasExpandCol","hasSelectCol","hasEditCol","totalCols","getSortOrder","getSortPriority","handleSort","meta","existing","key","handleRowSelect","arr","someSelected","toggleExpand","isExpanded","startRowEdit","vals","col","saveRowEdit","updated","cancelRowEdit","startCellEdit","saveCellEdit","getFilterBtnRef","isFilterActive","renderHeader","order","priority","filterRef","renderBodyRow","rowIndex","isOdd","rowKey","expanded","isEditingRow","cells","isEditingCell","showEditor","val","renderBody","__","j","isGroupExpanded","renderFooter","tableClass","wrapClass","FullNav","topBar","loanBannerNav","urlATabsNav","FullNavMobile","urlATabsNavMobile","showSubNav"],"mappings":"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"}