rich-react-component 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/base/Accordion.d.ts +17 -0
- package/dist/base/Alert.d.ts +15 -0
- package/dist/base/AutoComplete.d.ts +20 -0
- package/dist/base/Avatar.d.ts +8 -0
- package/dist/base/Badge.d.ts +9 -0
- package/dist/base/Breadcrumb.d.ts +10 -0
- package/dist/base/Button.d.ts +13 -0
- package/dist/base/Card.d.ts +9 -0
- package/dist/base/CheckBox.d.ts +17 -0
- package/dist/base/Col.d.ts +12 -0
- package/dist/base/ComboBox.d.ts +17 -0
- package/dist/base/Confirm.d.ts +25 -0
- package/dist/base/Container.d.ts +7 -0
- package/dist/base/DataGrid.d.ts +43 -0
- package/dist/base/DatePicker.d.ts +23 -0
- package/dist/base/DateTimePicker.d.ts +17 -0
- package/dist/base/Divider.d.ts +8 -0
- package/dist/base/FileInput.d.ts +19 -0
- package/dist/base/FormField.d.ts +12 -0
- package/dist/base/Icon.d.ts +15 -0
- package/dist/base/Input.d.ts +30 -0
- package/dist/base/Menu.d.ts +21 -0
- package/dist/base/Modal.d.ts +19 -0
- package/dist/base/MultiSelect.d.ts +25 -0
- package/dist/base/Navbar.d.ts +16 -0
- package/dist/base/NumberInput.d.ts +17 -0
- package/dist/base/PageHeader.d.ts +12 -0
- package/dist/base/Pagination.d.ts +15 -0
- package/dist/base/PasswordInput.d.ts +10 -0
- package/dist/base/Popover.d.ts +10 -0
- package/dist/base/ProgressBar.d.ts +10 -0
- package/dist/base/RadioButton.d.ts +18 -0
- package/dist/base/RadioGroup.d.ts +14 -0
- package/dist/base/Rating.d.ts +9 -0
- package/dist/base/Row.d.ts +6 -0
- package/dist/base/Select.d.ts +24 -0
- package/dist/base/Sidebar.d.ts +31 -0
- package/dist/base/Skeleton.d.ts +8 -0
- package/dist/base/Slider.d.ts +10 -0
- package/dist/base/Spinner.d.ts +7 -0
- package/dist/base/Stack.d.ts +12 -0
- package/dist/base/Stepper.d.ts +12 -0
- package/dist/base/Switch.d.ts +16 -0
- package/dist/base/Tabs.d.ts +16 -0
- package/dist/base/Tag.d.ts +14 -0
- package/dist/base/TextArea.d.ts +11 -0
- package/dist/base/TimePicker.d.ts +20 -0
- package/dist/base/Toast.d.ts +27 -0
- package/dist/base/Tooltip.d.ts +21 -0
- package/dist/base/index.d.ts +56 -0
- package/dist/base/shared/BooleanFieldControl.d.ts +22 -0
- package/dist/base/shared/FieldShell.d.ts +22 -0
- package/dist/base/shared/Label.d.ts +9 -0
- package/dist/base/shared/Popup.d.ts +25 -0
- package/dist/base/shared/ValidationMessage.d.ts +11 -0
- package/dist/base/shared/classNames.d.ts +1 -0
- package/dist/base/shared/fieldTypes.d.ts +26 -0
- package/dist/base/shared/index.d.ts +9 -0
- package/dist/base/shared/useControllableState.d.ts +16 -0
- package/dist/base/shared/useEscapeKey.d.ts +2 -0
- package/dist/base/shared/useListNavigation.d.ts +18 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +2092 -0
- package/dist/index.js.map +1 -0
- package/dist/remote/RemoteAutoComplete.d.ts +22 -0
- package/dist/remote/RemoteComboBox.d.ts +21 -0
- package/dist/remote/RemoteDataGrid.d.ts +24 -0
- package/dist/remote/RemoteMultiSelect.d.ts +13 -0
- package/dist/remote/RemoteSelect.d.ts +17 -0
- package/dist/remote/hooks/useDebouncedValue.d.ts +1 -0
- package/dist/remote/hooks/useRemoteData.d.ts +31 -0
- package/dist/remote/http/HttpClient.d.ts +31 -0
- package/dist/remote/index.d.ts +9 -0
- package/dist/remote/mapping.d.ts +8 -0
- package/dist/smart/SmartAction.d.ts +14 -0
- package/dist/smart/SmartActions.d.ts +14 -0
- package/dist/smart/SmartField.d.ts +18 -0
- package/dist/smart/SmartForm.d.ts +19 -0
- package/dist/smart/actionRegistry.d.ts +11 -0
- package/dist/smart/componentRegistry.d.ts +24 -0
- package/dist/smart/dataSourceRegistry.d.ts +17 -0
- package/dist/smart/index.d.ts +26 -0
- package/dist/smart/resolvers/comboBoxResolver.d.ts +10 -0
- package/dist/smart/resolvers/dataGridResolver.d.ts +11 -0
- package/dist/smart/resolvers/datePickerResolver.d.ts +3 -0
- package/dist/smart/resolvers/index.d.ts +13 -0
- package/dist/smart/resolvers/inputResolver.d.ts +8 -0
- package/dist/smart/runtime.d.ts +26 -0
- package/dist/smart/types.d.ts +114 -0
- package/dist/smart/useSmartAction.d.ts +36 -0
- package/dist/smart/useSmartDependencies.d.ts +13 -0
- package/dist/smart/useSmartField.d.ts +47 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/base/shared/classNames.ts","../src/base/shared/Label.tsx","../src/base/shared/ValidationMessage.tsx","../src/base/shared/FieldShell.tsx","../src/base/shared/useControllableState.ts","../src/base/Input.tsx","../src/base/TextArea.tsx","../src/base/NumberInput.tsx","../src/base/PasswordInput.tsx","../src/base/FileInput.tsx","../src/base/shared/BooleanFieldControl.tsx","../src/base/CheckBox.tsx","../src/base/Switch.tsx","../src/base/RadioButton.tsx","../src/base/RadioGroup.tsx","../src/base/Select.tsx","../src/base/shared/useEscapeKey.ts","../src/base/shared/Popup.tsx","../src/base/shared/useListNavigation.ts","../src/base/MultiSelect.tsx","../src/base/DatePicker.tsx","../src/base/TimePicker.tsx","../src/base/DateTimePicker.tsx","../src/base/ComboBox.tsx","../src/base/AutoComplete.tsx","../src/base/FormField.tsx","../src/base/Modal.tsx","../src/base/Pagination.tsx","../src/base/DataGrid.tsx","../src/base/Spinner.tsx","../src/base/Button.tsx","../src/base/Alert.tsx","../src/base/Toast.tsx","../src/base/Confirm.tsx","../src/base/Badge.tsx","../src/base/Tabs.tsx","../src/base/Accordion.tsx","../src/base/Tooltip.tsx","../src/base/Popover.tsx","../src/base/Card.tsx","../src/base/Divider.tsx","../src/base/Stack.tsx","../src/base/Container.tsx","../src/base/Row.tsx","../src/base/Col.tsx","../src/base/Breadcrumb.tsx","../src/base/Menu.tsx","../src/base/Stepper.tsx","../src/base/Avatar.tsx","../src/base/Tag.tsx","../src/base/Skeleton.tsx","../src/base/Slider.tsx","../src/base/Rating.tsx","../src/base/ProgressBar.tsx","../src/base/Icon.tsx","../src/base/Navbar.tsx","../src/base/Sidebar.tsx","../src/base/PageHeader.tsx","../src/remote/http/HttpClient.ts","../src/remote/hooks/useRemoteData.ts","../src/remote/hooks/useDebouncedValue.ts","../src/remote/mapping.ts","../src/remote/RemoteComboBox.tsx","../src/remote/RemoteAutoComplete.tsx","../src/remote/RemoteDataGrid.tsx","../src/remote/RemoteSelect.tsx","../src/remote/RemoteMultiSelect.tsx","../src/smart/componentRegistry.ts","../src/smart/dataSourceRegistry.ts","../src/smart/actionRegistry.ts","../src/smart/useSmartField.ts","../src/smart/useSmartDependencies.ts","../src/smart/useSmartAction.ts","../src/smart/resolvers/comboBoxResolver.tsx","../src/smart/resolvers/dataGridResolver.tsx","../src/smart/resolvers/datePickerResolver.tsx","../src/smart/resolvers/inputResolver.tsx","../src/smart/resolvers/index.ts","../src/smart/SmartField.tsx","../src/smart/SmartForm.tsx","../src/smart/SmartAction.tsx","../src/smart/SmartActions.tsx"],"sourcesContent":["export function cx(...values: Array<string | false | null | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./classNames\";\n\nexport interface LabelProps {\n htmlFor?: string;\n required?: boolean;\n className?: string;\n children: ReactNode;\n}\n\n/** Extracted out of FieldShell so it's independently usable (doc \"Form Infrastructure\" section). */\nexport function Label({ htmlFor, required, className, children }: LabelProps) {\n return (\n <label htmlFor={htmlFor} className={cx(\"form-label\", className)}>\n {children}\n {required && <span className=\"text-danger\"> *</span>}\n </label>\n );\n}\n","import { cx } from \"./classNames\";\n\nexport interface ValidationMessageProps {\n error?: string;\n helpText?: string;\n className?: string;\n}\n\n/**\n * Presentation only — owns no validation rules (doc section 10). Extracted\n * out of FieldShell so CheckBox/Switch (which don't use FieldShell's\n * `form-label` layout) can still reuse the identical error/help rendering.\n */\nexport function ValidationMessage({ error, helpText, className }: ValidationMessageProps) {\n if (error) return <div className={cx(\"invalid-feedback d-block\", className)}>{error}</div>;\n if (helpText) return <div className={cx(\"form-text\", className)}>{helpText}</div>;\n return null;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./classNames\";\nimport { Label } from \"./Label\";\nimport { ValidationMessage } from \"./ValidationMessage\";\n\nexport interface FieldShellProps {\n id?: string;\n label?: string;\n required?: boolean;\n error?: string;\n helpText?: string;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Shared label / help-text / validation-message presentation wrapper reused\n * by every Base field that has that shape (Input, TextArea, NumberInput,\n * DatePicker, TimePicker, ComboBox, AutoComplete, Select, MultiSelect,\n * RadioGroup, DateTimePicker). CheckBox/Switch and DataGrid have a\n * genuinely different layout and intentionally don't use this (they reuse\n * ValidationMessage directly instead — see BooleanFieldControl).\n *\n * Bootstrap conventions (`form-label`, `invalid-feedback`, `form-text`) are\n * used directly rather than reinventing a styling layer (doc section 15).\n */\nexport function FieldShell({ id, label, required, error, helpText, className, children }: FieldShellProps) {\n return (\n <div className={cx(\"mb-3\", className)}>\n {label && (\n <Label htmlFor={id} required={required}>\n {label}\n </Label>\n )}\n {children}\n <ValidationMessage error={error} helpText={helpText} />\n </div>\n );\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nexport interface ControllableStateOptions<T> {\n /** When defined, the component is controlled: this value always wins. */\n value?: T;\n defaultValue: T;\n onChange?: (value: T) => void;\n}\n\n/**\n * Single shared implementation of the library's controlled/uncontrolled policy\n * (doc section 14). Every Base form field composes this instead of\n * reimplementing its own controlled/uncontrolled logic.\n *\n * Policy: presence of `value !== undefined` on first render decides the mode\n * for the component's lifetime. Switching modes afterwards is a programmer\n * error and is flagged in development, mirroring React's own <input> warning.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: ControllableStateOptions<T>): [T, (next: T) => void] {\n const isControlled = value !== undefined;\n const isControlledRef = useRef(isControlled);\n\n if (process.env.NODE_ENV !== \"production\" && isControlledRef.current !== isControlled) {\n // eslint-disable-next-line no-console\n console.error(\n \"[react-components] A component switched between controlled and uncontrolled `value`. \" +\n \"Decide between passing `value` (controlled) or `defaultValue` (uncontrolled) for the \" +\n \"lifetime of the component, per the library's controlled/uncontrolled policy.\"\n );\n }\n\n const [internalValue, setInternalValue] = useState<T>(defaultValue);\n const currentValue = isControlled ? (value as T) : internalValue;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [currentValue, setValue];\n}\n","import { useId, type FocusEventHandler, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\ntype NativePassthroughProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"id\" | \"name\" | \"value\" | \"defaultValue\" | \"onChange\" | \"onBlur\" | \"className\" | \"disabled\" | \"readOnly\" | \"required\" | \"placeholder\"\n>;\n\nexport interface InputProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onBlur?: FocusEventHandler<HTMLInputElement>;\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"url\" | \"search\";\n maxLength?: number;\n autoFocus?: boolean;\n /**\n * Escape hatch for native attributes that don't deserve a first-class prop\n * on every text-like field (e.g. `inputMode`, `min`/`max`/`step`, `type`\n * override). Keeps the primary prop surface small (doc section 13) while\n * still letting NumberInput/DatePicker compose Input instead of\n * reimplementing it.\n */\n inputProps?: NativePassthroughProps;\n /**\n * Generic trailing slot rendered inside a Bootstrap `input-group` (e.g. a\n * visibility-toggle button, a unit suffix, a clear button). Not\n * password-specific — PasswordInput is just its first consumer, reusing\n * Input's full controlled-state/markup instead of reimplementing a\n * parallel text field (doc section 4/19).\n */\n endAdornment?: ReactNode;\n}\n\nexport function Input(props: InputProps) {\n const {\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n placeholder,\n helpText,\n error,\n value,\n defaultValue,\n onChange,\n onBlur,\n type = \"text\",\n maxLength,\n autoFocus,\n inputProps,\n endAdornment,\n } = props;\n\n const [currentValue, setValue] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? \"\",\n onChange,\n });\n\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n const control = (\n <input\n id={fieldId}\n name={name}\n className={cx(\"form-control\", error && \"is-invalid\")}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n placeholder={placeholder}\n maxLength={maxLength}\n autoFocus={autoFocus}\n value={currentValue}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlur}\n type={type}\n {...inputProps}\n />\n );\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n {endAdornment ? (\n <div className=\"input-group\">\n {control}\n {endAdornment}\n </div>\n ) : (\n control\n )}\n </FieldShell>\n );\n}\n","import { useId, type FocusEventHandler } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\nexport interface TextAreaProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onBlur?: FocusEventHandler<HTMLTextAreaElement>;\n rows?: number;\n maxLength?: number;\n}\n\nexport function TextArea(props: TextAreaProps) {\n const {\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n placeholder,\n helpText,\n error,\n value,\n defaultValue,\n onChange,\n onBlur,\n rows = 3,\n maxLength,\n } = props;\n\n const [currentValue, setValue] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? \"\",\n onChange,\n });\n\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <textarea\n id={fieldId}\n name={name}\n className={cx(\"form-control\", error && \"is-invalid\")}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n placeholder={placeholder}\n rows={rows}\n maxLength={maxLength}\n value={currentValue}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlur}\n />\n </FieldShell>\n );\n}\n","import type { FocusEventHandler } from \"react\";\nimport { Input } from \"./Input\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\nexport interface NumberInputProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: number | null;\n defaultValue?: number | null;\n onChange?: (value: number | null) => void;\n onBlur?: FocusEventHandler<HTMLInputElement>;\n min?: number;\n max?: number;\n step?: number;\n}\n\n/**\n * Composes Input (the \"Input foundation\" from doc section 19) instead of\n * reimplementing field markup/controlled-state logic — only the numeric\n * value coercion is unique to NumberInput.\n */\nexport function NumberInput({ value, defaultValue, onChange, min, max, step, ...rest }: NumberInputProps) {\n const [currentValue, setValue] = useControllableState<number | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n\n return (\n <Input\n {...rest}\n value={currentValue === null ? \"\" : String(currentValue)}\n onChange={(raw) => {\n if (raw.trim() === \"\") {\n setValue(null);\n return;\n }\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) setValue(parsed);\n }}\n inputProps={{ inputMode: \"decimal\", min, max, step }}\n />\n );\n}\n","import { useState } from \"react\";\nimport { Input, type InputProps } from \"./Input\";\n\nexport interface PasswordInputProps extends Omit<InputProps, \"type\" | \"endAdornment\" | \"inputProps\"> {}\n\n/**\n * Reuses Input entirely (controlled/uncontrolled logic, FieldShell,\n * markup) via Input's `endAdornment`/`inputProps` extension points instead\n * of building an independent text field (doc section 4). No password\n * strength infrastructure — just visibility toggling.\n */\nexport function PasswordInput(props: PasswordInputProps) {\n const [visible, setVisible] = useState(false);\n\n return (\n <Input\n {...props}\n inputProps={{ type: visible ? \"text\" : \"password\", autoComplete: \"current-password\" }}\n endAdornment={\n <button\n type=\"button\"\n className=\"btn btn-outline-secondary\"\n aria-label={visible ? \"Hide password\" : \"Show password\"}\n aria-pressed={visible}\n onClick={() => setVisible((prev) => !prev)}\n >\n {visible ? \"Hide\" : \"Show\"}\n </button>\n }\n />\n );\n}\n","import { useId } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport type { FieldIdentity, FieldPresentation } from \"./shared/fieldTypes\";\n\nexport interface FileInputProps extends FieldIdentity, FieldPresentation {\n disabled?: boolean;\n required?: boolean;\n accept?: string;\n multiple?: boolean;\n onChange?: (files: FileList | null) => void;\n}\n\n/**\n * File selection only — no upload/API/cloud-storage/chunking (doc section\n * 11; that belongs to a future Remote-layer concern, not Base).\n *\n * Intentionally uncontrolled-only: browsers do not allow programmatically\n * setting `<input type=\"file\">`'s value for security reasons, so this is a\n * documented, deliberate exception to the library's controlled/uncontrolled\n * policy rather than an inconsistency — there is no `value`/`defaultValue`\n * to be controlled.\n */\nexport function FileInput({ id, name, disabled, required, className, label, helpText, error, accept, multiple, onChange }: FileInputProps) {\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <input\n id={fieldId}\n name={name}\n type=\"file\"\n className={cx(\"form-control\", error && \"is-invalid\")}\n disabled={disabled}\n required={required}\n accept={accept}\n multiple={multiple}\n onChange={(event) => onChange?.(event.target.files)}\n />\n </FieldShell>\n );\n}\n","import { useId } from \"react\";\nimport { cx } from \"./classNames\";\nimport { ValidationMessage } from \"./ValidationMessage\";\nimport type { FieldIdentity } from \"./fieldTypes\";\n\nexport interface BooleanFieldControlProps extends FieldIdentity {\n disabled?: boolean;\n required?: boolean;\n className?: string;\n wrapperClassName: string;\n role?: string;\n label?: string;\n helpText?: string;\n error?: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}\n\n/**\n * Internal-only shared rendering for CheckBox and Switch: their public APIs\n * are genuinely identical (checked/defaultChecked/onChange/label/error/\n * helpText) and their markup differs only by wrapper class + `role` (doc\n * section 8: \"reuse if semantically correct, but don't couple them through\n * an abstraction that makes either public API worse\" — this doesn't, since\n * both components keep their own separate, unchanged public props).\n */\nexport function BooleanFieldControl({\n id,\n name,\n disabled,\n required,\n wrapperClassName,\n role,\n label,\n helpText,\n error,\n checked,\n onChange,\n className,\n}: BooleanFieldControlProps) {\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n return (\n <div className={cx(wrapperClassName, className)}>\n <input\n id={fieldId}\n name={name}\n type=\"checkbox\"\n role={role}\n className={cx(\"form-check-input\", error && \"is-invalid\")}\n disabled={disabled}\n required={required}\n checked={checked}\n onChange={(event) => onChange(event.target.checked)}\n />\n {label && (\n <label htmlFor={fieldId} className=\"form-check-label\">\n {label}\n </label>\n )}\n <ValidationMessage error={error} helpText={helpText} />\n </div>\n );\n}\n","import { BooleanFieldControl } from \"./shared/BooleanFieldControl\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldState } from \"./shared/fieldTypes\";\n\nexport interface CheckBoxProps extends FieldIdentity, FieldState {\n className?: string;\n label?: string;\n helpText?: string;\n error?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n}\n\n/**\n * Deliberately doesn't use FieldShell — a checkbox's label sits beside the\n * control, not above it, so the layout genuinely differs (doc section 13:\n * shared contracts only where a real semantic relationship exists). Shares\n * its actual rendering with Switch via BooleanFieldControl.\n */\nexport function CheckBox(props: CheckBoxProps) {\n const [checked, setChecked] = useControllableState<boolean>({\n value: props.checked,\n defaultValue: props.defaultChecked ?? false,\n onChange: props.onChange,\n });\n\n return (\n <BooleanFieldControl\n id={props.id}\n name={props.name}\n disabled={props.disabled}\n required={props.required}\n className={props.className}\n wrapperClassName=\"form-check mb-3\"\n label={props.label}\n helpText={props.helpText}\n error={props.error}\n checked={checked}\n onChange={setChecked}\n />\n );\n}\n","import { BooleanFieldControl } from \"./shared/BooleanFieldControl\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldState } from \"./shared/fieldTypes\";\n\nexport interface SwitchProps extends FieldIdentity, FieldState {\n className?: string;\n label?: string;\n helpText?: string;\n error?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n}\n\n/**\n * Same controlled/uncontrolled boolean behavior as CheckBox, reused via\n * BooleanFieldControl — only the wrapper class (`form-switch`) and\n * `role=\"switch\"` differ (doc section 8).\n */\nexport function Switch(props: SwitchProps) {\n const [checked, setChecked] = useControllableState<boolean>({\n value: props.checked,\n defaultValue: props.defaultChecked ?? false,\n onChange: props.onChange,\n });\n\n return (\n <BooleanFieldControl\n id={props.id}\n name={props.name}\n disabled={props.disabled}\n required={props.required}\n className={props.className}\n wrapperClassName=\"form-check form-switch mb-3\"\n role=\"switch\"\n label={props.label}\n helpText={props.helpText}\n error={props.error}\n checked={checked}\n onChange={setChecked}\n />\n );\n}\n","import { useId } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface RadioButtonProps<TValue extends string | number = string> {\n id?: string;\n name?: string;\n value: TValue;\n label?: string;\n checked: boolean;\n disabled?: boolean;\n className?: string;\n onChange?: (value: TValue) => void;\n}\n\n/**\n * A single radio input. Always controlled by `checked` — a lone HTML radio\n * doesn't have meaningful independent uncontrolled state the way a\n * checkbox does (mutual exclusivity requires a group), so it's normally\n * composed by RadioGroup, which owns the actual controlled/uncontrolled\n * value. Usable standalone by a consumer who wants to manage state itself.\n */\nexport function RadioButton<TValue extends string | number = string>({\n id,\n name,\n value,\n label,\n checked,\n disabled,\n className,\n onChange,\n}: RadioButtonProps<TValue>) {\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n return (\n <div className={cx(\"form-check\", className)}>\n <input\n id={fieldId}\n name={name}\n type=\"radio\"\n className=\"form-check-input\"\n value={String(value)}\n checked={checked}\n disabled={disabled}\n onChange={() => onChange?.(value)}\n />\n {label && (\n <label htmlFor={fieldId} className=\"form-check-label\">\n {label}\n </label>\n )}\n </div>\n );\n}\n","import { useId } from \"react\";\nimport { RadioButton } from \"./RadioButton\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState, SelectOption } from \"./shared/fieldTypes\";\n\nexport interface RadioGroupProps<TValue extends string | number = string> extends FieldIdentity, FieldState, FieldPresentation {\n options: SelectOption<TValue>[];\n value?: TValue | null;\n defaultValue?: TValue | null;\n onChange?: (value: TValue) => void;\n inline?: boolean;\n}\n\n/**\n * Composes RadioButton rather than reproducing radio rendering (doc\n * section 7) — this is the component that actually owns the group's\n * controlled/uncontrolled value.\n */\nexport function RadioGroup<TValue extends string | number = string>({\n options,\n value,\n defaultValue,\n onChange,\n inline,\n id,\n name,\n disabled,\n required,\n className,\n label,\n helpText,\n error,\n}: RadioGroupProps<TValue>) {\n const [currentValue, setValue] = useControllableState<TValue | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange: (next) => {\n if (next !== null) onChange?.(next);\n },\n });\n\n const generatedId = useId();\n const groupName = name ?? id ?? generatedId;\n\n return (\n <FieldShell label={label} required={required} error={error} helpText={helpText} className={className}>\n <div role=\"radiogroup\" aria-label={label} aria-required={required} className={cx(inline && \"d-flex gap-3\")}>\n {options.map((option) => (\n <RadioButton\n key={String(option.value)}\n name={groupName}\n value={option.value}\n label={option.label}\n checked={option.value === currentValue}\n disabled={disabled || option.disabled}\n onChange={(next) => setValue(next)}\n />\n ))}\n </div>\n </FieldShell>\n );\n}\n","import { useId } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState, SelectOption } from \"./shared/fieldTypes\";\n\nexport interface SelectProps<TValue extends string | number = string> extends FieldIdentity, FieldState, FieldPresentation {\n options: SelectOption<TValue>[];\n value?: TValue | null;\n defaultValue?: TValue | null;\n onChange?: (value: TValue | null) => void;\n /**\n * Presentational-only loading flag, same convention as ComboBox/\n * AutoComplete/MultiSelect's `loading` prop — Select has no idea *why*\n * it's loading (doc section 8). Disables the control and shows a\n * \"Loading…\" placeholder option; set by RemoteSelect.\n */\n loading?: boolean;\n}\n\n/**\n * Not remote-aware (doc section 5). Deliberately a native `<select>` rather\n * than reusing ComboBox's Popup/keyboard-list UI — their UI semantics\n * genuinely differ (native select already has full built-in keyboard/\n * screen-reader support, so reusing Popup here would be a *regression*, not\n * a simplification). The two DO share the same typed option abstraction\n * (`SelectOption`) and the same FieldShell/useControllableState — that's\n * the \"smallest appropriate abstraction\" the doc asks for.\n */\nexport function Select<TValue extends string | number = string>({\n options,\n value,\n defaultValue,\n onChange,\n placeholder,\n loading,\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n helpText,\n error,\n}: SelectProps<TValue>) {\n const [currentValue, setValue] = useControllableState<TValue | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <select\n id={fieldId}\n name={name}\n className={cx(\"form-select\", error && \"is-invalid\")}\n disabled={disabled || readOnly || loading}\n required={required}\n value={currentValue === null ? \"\" : String(currentValue)}\n onChange={(event) => {\n const raw = event.target.value;\n if (raw === \"\") {\n setValue(null);\n return;\n }\n const matched = options.find((option) => String(option.value) === raw);\n setValue(matched ? matched.value : null);\n }}\n >\n {loading && <option value=\"\">Loading…</option>}\n {!loading && placeholder && <option value=\"\">{placeholder}</option>}\n {options.map((option) => (\n <option key={String(option.value)} value={String(option.value)} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n </FieldShell>\n );\n}\n","import { useEffect } from \"react\";\n\n/** Shared by Popup and Modal so escape-to-close isn't reimplemented per component. */\nexport function useEscapeKey(active: boolean, onEscape: () => void): void {\n useEffect(() => {\n if (!active) return;\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\") onEscape();\n }\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [active, onEscape]);\n}\n","import { useEffect, useRef, type ReactNode, type RefObject } from \"react\";\nimport { cx } from \"./classNames\";\nimport { useEscapeKey } from \"./useEscapeKey\";\n\nexport interface PopupProps {\n open: boolean;\n onClose: () => void;\n anchorRef: RefObject<HTMLElement>;\n className?: string;\n /** ARIA role of the floating panel — callers set this (e.g. \"listbox\" for ComboBox, none for Tooltip/Popover). */\n role?: string;\n children: ReactNode;\n}\n\n/**\n * Anchored floating panel: open/close, escape-to-close, outside-click\n * dismissal, cleanup. Reused by ComboBox/AutoComplete/MultiSelect (as a\n * dropdown listbox) and by Tooltip/Popover (as a hover/click overlay) — so\n * it only forces Bootstrap's universal `show` visibility class; the\n * dropdown-specific (`dropdown-menu`) vs. tooltip/popover-specific\n * (`tooltip`, `popover`) presentation classes are each caller's own\n * responsibility via `className`.\n *\n * Known limitation (documented, not silently ignored): positioning is plain\n * CSS (`position: relative` on the anchor's wrapper), no portal/collision\n * detection yet. A portal-based strategy can be layered in later without\n * changing this component's public API.\n */\nexport function Popup({ open, onClose, anchorRef, className, role, children }: PopupProps) {\n const popupRef = useRef<HTMLDivElement>(null);\n\n useEscapeKey(open, onClose);\n\n useEffect(() => {\n if (!open) return;\n function handlePointerDown(event: MouseEvent) {\n const target = event.target as Node;\n if (popupRef.current?.contains(target)) return;\n if (anchorRef.current?.contains(target)) return;\n onClose();\n }\n document.addEventListener(\"mousedown\", handlePointerDown);\n return () => document.removeEventListener(\"mousedown\", handlePointerDown);\n }, [open, onClose, anchorRef]);\n\n if (!open) return null;\n\n return (\n <div ref={popupRef} className={cx(\"show\", className)} role={role}>\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useState, type KeyboardEvent } from \"react\";\nimport { useEscapeKey } from \"./useEscapeKey\";\n\nexport interface UseListNavigationOptions {\n itemCount: number;\n isOpen: boolean;\n onSelect: (index: number) => void;\n onClose: () => void;\n}\n\nexport interface UseListNavigationResult {\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n handleKeyDown: (event: KeyboardEvent) => void;\n}\n\n/**\n * Headless keyboard-navigation behavior shared by ComboBox and AutoComplete\n * (doc section 19 — \"shared behavior\" reuse for the list-selection concern\n * that both components genuinely have in common).\n */\nexport function useListNavigation({\n itemCount,\n isOpen,\n onSelect,\n onClose,\n}: UseListNavigationOptions): UseListNavigationResult {\n const [activeIndex, setActiveIndex] = useState(-1);\n\n useEffect(() => {\n if (!isOpen) setActiveIndex(-1);\n }, [isOpen]);\n\n useEscapeKey(isOpen, onClose);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!isOpen) {\n if (event.key === \"ArrowDown\" || event.key === \"Enter\") {\n event.preventDefault();\n }\n return;\n }\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndex((prev) => (itemCount === 0 ? -1 : (prev + 1) % itemCount));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex((prev) => (itemCount === 0 ? -1 : (prev - 1 + itemCount) % itemCount));\n break;\n case \"Home\":\n event.preventDefault();\n setActiveIndex(itemCount === 0 ? -1 : 0);\n break;\n case \"End\":\n event.preventDefault();\n setActiveIndex(itemCount === 0 ? -1 : itemCount - 1);\n break;\n case \"Enter\":\n if (activeIndex >= 0) {\n event.preventDefault();\n onSelect(activeIndex);\n }\n break;\n default:\n break;\n }\n },\n [isOpen, itemCount, activeIndex, onSelect]\n );\n\n return { activeIndex, setActiveIndex, handleKeyDown };\n}\n","import { useCallback, useId, useRef, useState } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { Popup } from \"./shared/Popup\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport { useListNavigation } from \"./shared/useListNavigation\";\nimport type { FieldIdentity, FieldPresentation, FieldState, SelectOption } from \"./shared/fieldTypes\";\n\nexport interface MultiSelectProps<TValue extends string | number = string> extends FieldIdentity, FieldState, FieldPresentation {\n options: SelectOption<TValue>[];\n values?: TValue[];\n defaultValues?: TValue[];\n onChange?: (values: TValue[]) => void;\n loading?: boolean;\n emptyText?: string;\n}\n\n/**\n * Follows ComboBox's established `options: SelectOption<TValue>[]` /\n * FieldShell / Popup / useListNavigation conventions rather than the raw\n * `items`+`valueMember`+`displayMember` shape shown as a *conceptual*\n * example in the source spec — that mapping-by-key convention belongs to\n * the Remote layer (where raw API objects need mapping); Base MultiSelect\n * receives already-typed `SelectOption`s, consistent with Base ComboBox.\n * (Documented in the final report as a deliberate reconciliation of the\n * spec's own two instructions: \"follow this example\" vs. \"follow ComboBox's\n * existing, good convention\" — the latter wins per the spec's own priority.)\n *\n * Reuses Popup + useListNavigation from ComboBox/AutoComplete; the only\n * real behavioral difference is that selecting an option toggles it in a\n * `values` array and leaves the popup open instead of closing it.\n */\nexport function MultiSelect<TValue extends string | number = string>({\n options,\n values,\n defaultValues,\n onChange,\n loading,\n emptyText = \"No options\",\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n placeholder = \"Select...\",\n helpText,\n error,\n}: MultiSelectProps<TValue>) {\n const [currentValues, setValues] = useControllableState<TValue[]>({\n value: values,\n defaultValue: defaultValues ?? [],\n onChange,\n });\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLButtonElement>(null);\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n const selectedSet = new Set(currentValues);\n\n const close = useCallback(() => setOpen(false), []);\n const toggleIndex = useCallback(\n (index: number) => {\n const option = options[index];\n if (!option || option.disabled) return;\n const next = selectedSet.has(option.value)\n ? currentValues.filter((v) => v !== option.value)\n : [...currentValues, option.value];\n setValues(next);\n },\n [options, currentValues, selectedSet, setValues]\n );\n\n const { activeIndex, setActiveIndex, handleKeyDown } = useListNavigation({\n itemCount: options.length,\n isOpen: open,\n onSelect: toggleIndex,\n onClose: close,\n });\n\n const selectedOptions = options.filter((option) => selectedSet.has(option.value));\n const summary = selectedOptions.map((option) => option.label).join(\", \");\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <div className=\"position-relative\">\n <button\n ref={anchorRef}\n id={fieldId}\n type=\"button\"\n name={name}\n className={cx(\"form-select text-start\", error && \"is-invalid\")}\n disabled={disabled || readOnly}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n >\n {summary || <span className=\"text-body-secondary\">{placeholder}</span>}\n </button>\n <Popup open={open} onClose={close} anchorRef={anchorRef} className=\"dropdown-menu w-100\" role=\"listbox\">\n {loading ? (\n <div className=\"px-3 py-2 text-body-secondary\">Loading…</div>\n ) : options.length === 0 ? (\n <div className=\"px-3 py-2 text-body-secondary\">{emptyText}</div>\n ) : (\n options.map((option, index) => (\n <div\n key={String(option.value)}\n role=\"option\"\n aria-selected={selectedSet.has(option.value)}\n className={cx(\n \"dropdown-item d-flex align-items-center gap-2\",\n index === activeIndex && \"active\",\n option.disabled && \"disabled\"\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n if (!option.disabled) toggleIndex(index);\n }}\n >\n <input type=\"checkbox\" className=\"form-check-input m-0\" checked={selectedSet.has(option.value)} readOnly tabIndex={-1} />\n {option.label}\n </div>\n ))\n )}\n </Popup>\n </div>\n </FieldShell>\n );\n}\n","import { Input } from \"./Input\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\nexport interface DatePickerProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: Date | null;\n defaultValue?: Date | null;\n onChange?: (value: Date | null) => void;\n min?: Date;\n max?: Date;\n}\n\n/**\n * Exported so TimePicker/DateTimePicker can compose the exact same\n * date-part parsing/formatting instead of reimplementing it (doc section\n * 12 — a coherent Date/Time value strategy across the whole family).\n */\nexport function toDateInputValue(date: Date | null | undefined): string {\n if (!date) return \"\";\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nexport function fromDateInputValue(raw: string): Date | null {\n if (!raw) return null;\n const parts = raw.split(\"-\").map(Number);\n const [year, month, day] = parts;\n if (!year || !month || !day) return null;\n return new Date(year, month - 1, day);\n}\n\n/**\n * Intentionally minimal: reuses Input + the native date picker UI rather\n * than building a calendar widget (doc section 10/18 — don't overbuild the\n * first iteration). value/onChange work in terms of `Date`, so a richer\n * Popup-based calendar can replace the native input later without breaking\n * this public contract. See \"Known Limitations\" in the final report.\n */\nexport function DatePicker({ value, defaultValue, onChange, min, max, ...rest }: DatePickerProps) {\n const [currentValue, setValue] = useControllableState<Date | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n\n return (\n <Input\n {...rest}\n value={toDateInputValue(currentValue)}\n onChange={(raw) => setValue(fromDateInputValue(raw))}\n inputProps={{\n type: \"date\",\n min: min ? toDateInputValue(min) : undefined,\n max: max ? toDateInputValue(max) : undefined,\n }}\n />\n );\n}\n","import { Input } from \"./Input\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\nexport interface TimePickerProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: Date | null;\n defaultValue?: Date | null;\n onChange?: (value: Date | null) => void;\n /** Native `<input type=\"time\">` step, in seconds. */\n step?: number;\n}\n\n/**\n * Value strategy (doc section 12): TimePicker uses `Date`, same as\n * DatePicker/DateTimePicker, for a coherent family — but only the\n * hours/minutes are meaningful; the date part is normalized to the epoch so\n * consumers can't accidentally depend on it. This is what lets\n * DateTimePicker combine a DatePicker date-part with a TimePicker\n * time-part into one `Date` without any string/format juggling.\n */\nexport function toTimeInputValue(date: Date | null | undefined): string {\n if (!date) return \"\";\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\nexport function fromTimeInputValue(raw: string): Date | null {\n if (!raw) return null;\n const [hours, minutes] = raw.split(\":\").map(Number);\n if (hours === undefined || minutes === undefined || Number.isNaN(hours) || Number.isNaN(minutes)) return null;\n return new Date(1970, 0, 1, hours, minutes, 0, 0);\n}\n\n/** Composes Input, same pattern as DatePicker/NumberInput (doc section 19). */\nexport function TimePicker({ value, defaultValue, onChange, step, ...rest }: TimePickerProps) {\n const [currentValue, setValue] = useControllableState<Date | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n\n return (\n <Input\n {...rest}\n value={toTimeInputValue(currentValue)}\n onChange={(raw) => setValue(fromTimeInputValue(raw))}\n inputProps={{ type: \"time\", step }}\n />\n );\n}\n","import { useId } from \"react\";\nimport { fromDateInputValue, toDateInputValue } from \"./DatePicker\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport { fromTimeInputValue, toTimeInputValue } from \"./TimePicker\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\nexport interface DateTimePickerProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: Date | null;\n defaultValue?: Date | null;\n onChange?: (value: Date | null) => void;\n min?: Date;\n max?: Date;\n}\n\nfunction combine(datePart: string, timePart: string): Date | null {\n const date = fromDateInputValue(datePart);\n if (!date) return null;\n const time = fromTimeInputValue(timePart || \"00:00\");\n if (time) date.setHours(time.getHours(), time.getMinutes(), 0, 0);\n return date;\n}\n\n/**\n * Reuses DatePicker's/TimePicker's exported date-part/time-part parsing so\n * the whole family shares one coherent `Date` value strategy (doc section\n * 12) — this is the actual \"behavior reuse\" the doc asks for. Renders two\n * plain native inputs rather than nesting two <Input>s: Input always wraps\n * itself in FieldShell, and nesting it twice here would produce two labels\n * for one field. A single FieldShell wraps both inputs as one field group.\n */\nexport function DateTimePicker({\n value,\n defaultValue,\n onChange,\n min,\n max,\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n helpText,\n error,\n}: DateTimePickerProps) {\n const [currentValue, setValue] = useControllableState<Date | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n const datePart = toDateInputValue(currentValue);\n const timePart = toTimeInputValue(currentValue);\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <div className=\"d-flex gap-2\">\n <input\n id={fieldId}\n name={name ? `${name}-date` : undefined}\n type=\"date\"\n className={cx(\"form-control\", error && \"is-invalid\")}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n min={min ? toDateInputValue(min) : undefined}\n max={max ? toDateInputValue(max) : undefined}\n value={datePart}\n onChange={(event) => setValue(combine(event.target.value, timePart))}\n />\n <input\n name={name ? `${name}-time` : undefined}\n type=\"time\"\n className={cx(\"form-control\", error && \"is-invalid\")}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n value={timePart}\n onChange={(event) => setValue(combine(datePart || toDateInputValue(new Date()), event.target.value))}\n />\n </div>\n </FieldShell>\n );\n}\n","import { useCallback, useId, useRef, useState } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { Popup } from \"./shared/Popup\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport { useListNavigation } from \"./shared/useListNavigation\";\nimport type { FieldIdentity, FieldPresentation, FieldState, SelectOption } from \"./shared/fieldTypes\";\n\nexport type { SelectOption };\n\nexport interface ComboBoxProps<TValue extends string | number = string> extends FieldIdentity, FieldState, FieldPresentation {\n options: SelectOption<TValue>[];\n value?: TValue | null;\n defaultValue?: TValue | null;\n onChange?: (value: TValue | null) => void;\n /**\n * Presentational-only loading flag. ComboBox has no idea *why* it's\n * loading (doc section 8: don't pollute Base with HTTP concepts) — this\n * is set by RemoteComboBox, but could equally be driven by any other\n * async source.\n */\n loading?: boolean;\n emptyText?: string;\n}\n\nexport function ComboBox<TValue extends string | number = string>({\n options,\n value,\n defaultValue,\n onChange,\n loading,\n emptyText = \"No options\",\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n placeholder = \"Select...\",\n helpText,\n error,\n}: ComboBoxProps<TValue>) {\n const [currentValue, setValue] = useControllableState<TValue | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLButtonElement>(null);\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n const selectedOption = options.find((option) => option.value === currentValue) ?? null;\n\n const close = useCallback(() => setOpen(false), []);\n const selectIndex = useCallback(\n (index: number) => {\n const option = options[index];\n if (!option || option.disabled) return;\n setValue(option.value);\n close();\n },\n [options, setValue, close]\n );\n\n const { activeIndex, setActiveIndex, handleKeyDown } = useListNavigation({\n itemCount: options.length,\n isOpen: open,\n onSelect: selectIndex,\n onClose: close,\n });\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <div className=\"position-relative\">\n <button\n ref={anchorRef}\n id={fieldId}\n type=\"button\"\n name={name}\n className={cx(\"form-select text-start\", error && \"is-invalid\")}\n disabled={disabled || readOnly}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n >\n {selectedOption ? selectedOption.label : <span className=\"text-body-secondary\">{placeholder}</span>}\n </button>\n <Popup open={open} onClose={close} anchorRef={anchorRef} className=\"dropdown-menu w-100\" role=\"listbox\">\n {loading ? (\n <div className=\"px-3 py-2 text-body-secondary\">Loading…</div>\n ) : options.length === 0 ? (\n <div className=\"px-3 py-2 text-body-secondary\">{emptyText}</div>\n ) : (\n options.map((option, index) => (\n <div\n key={String(option.value)}\n role=\"option\"\n aria-selected={option.value === currentValue}\n className={cx(\"dropdown-item\", index === activeIndex && \"active\", option.disabled && \"disabled\")}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n if (!option.disabled) selectIndex(index);\n }}\n >\n {option.label}\n </div>\n ))\n )}\n </Popup>\n </div>\n </FieldShell>\n );\n}\n","import { useCallback, useId, useRef, useState } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { Popup } from \"./shared/Popup\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport { useListNavigation } from \"./shared/useListNavigation\";\nimport type { FieldIdentity, FieldPresentation, FieldState, SelectOption } from \"./shared/fieldTypes\";\n\nexport interface AutoCompleteProps<TValue extends string | number = string> extends FieldIdentity, FieldState, FieldPresentation {\n options: SelectOption<TValue>[];\n value?: TValue | null;\n defaultValue?: TValue | null;\n onChange?: (value: TValue | null) => void;\n /** Controlled search text, independent from the selected `value`. */\n inputValue?: string;\n onInputValueChange?: (text: string) => void;\n /** Presentational-only loading flag — see ComboBox's `loading` prop. */\n loading?: boolean;\n emptyText?: string;\n /**\n * Local filter predicate. Defaults to a case-insensitive substring match.\n * RemoteAutoComplete overrides this with `() => true` because the server\n * already filtered the results — Base must never re-filter server output.\n */\n filter?: (option: SelectOption<TValue>, query: string) => boolean;\n}\n\nfunction defaultFilter<TValue extends string | number>(option: SelectOption<TValue>, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\nexport function AutoComplete<TValue extends string | number = string>({\n options,\n value,\n defaultValue,\n onChange,\n inputValue,\n onInputValueChange,\n loading,\n emptyText = \"No results\",\n filter,\n id,\n name,\n disabled,\n readOnly,\n required,\n className,\n label,\n placeholder,\n helpText,\n error,\n}: AutoCompleteProps<TValue>) {\n const [currentValue, setValue] = useControllableState<TValue | null>({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n const selectedOption = options.find((option) => option.value === currentValue) ?? null;\n\n const [internalText, setInternalText] = useControllableState<string>({\n value: inputValue,\n defaultValue: selectedOption?.label ?? \"\",\n onChange: onInputValueChange,\n });\n\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLInputElement>(null);\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n const matchFilter = filter ?? defaultFilter;\n const filteredOptions = options.filter((option) => matchFilter(option, internalText));\n\n const close = useCallback(() => setOpen(false), []);\n const selectIndex = useCallback(\n (index: number) => {\n const option = filteredOptions[index];\n if (!option || option.disabled) return;\n setValue(option.value);\n setInternalText(option.label);\n close();\n },\n [filteredOptions, setValue, setInternalText, close]\n );\n\n const { activeIndex, setActiveIndex, handleKeyDown } = useListNavigation({\n itemCount: filteredOptions.length,\n isOpen: open,\n onSelect: selectIndex,\n onClose: close,\n });\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <div className=\"position-relative\">\n <input\n ref={anchorRef}\n id={fieldId}\n name={name}\n type=\"text\"\n className={cx(\"form-control\", error && \"is-invalid\")}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n value={internalText}\n onFocus={() => setOpen(true)}\n onChange={(event) => {\n const text = event.target.value;\n setInternalText(text);\n setOpen(true);\n if (currentValue !== null) setValue(null);\n }}\n onKeyDown={handleKeyDown}\n />\n <Popup open={open} onClose={close} anchorRef={anchorRef} className=\"dropdown-menu w-100\" role=\"listbox\">\n {loading ? (\n <div className=\"px-3 py-2 text-body-secondary\">Loading…</div>\n ) : filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-body-secondary\">{emptyText}</div>\n ) : (\n filteredOptions.map((option, index) => (\n <div\n key={String(option.value)}\n role=\"option\"\n aria-selected={option.value === currentValue}\n className={cx(\"dropdown-item\", index === activeIndex && \"active\", option.disabled && \"disabled\")}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n if (!option.disabled) selectIndex(index);\n }}\n >\n {option.label}\n </div>\n ))\n )}\n </Popup>\n </div>\n </FieldShell>\n );\n}\n","import { FieldShell, type FieldShellProps } from \"./shared/FieldShell\";\n\nexport type FormFieldProps = FieldShellProps;\n\n/**\n * Public composition of Label + control + ValidationMessage for consumers\n * who need our field chrome around a *custom* control (e.g. a group of\n * RadioButtons, a Switch, a third-party widget) rather than one of our own\n * field components. Deliberately a thin re-export of FieldShell — the two\n * names serve different audiences (FieldShell: internal plumbing for our\n * own fields; FormField: the same behavior, public), not two\n * implementations (doc section 9 — no form-framework infrastructure here).\n */\nexport function FormField(props: FormFieldProps) {\n return <FieldShell {...props} />;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { useEscapeKey } from \"./shared/useEscapeKey\";\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n children: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\n/**\n * Centered/backdrop dialog overlay — a different interaction model from\n * Popup's anchored dropdown, so it's a separate component, but shares the\n * escape-to-close behavior via useEscapeKey.\n *\n * Known limitation: not rendered through a portal yet (renders in place).\n * Can be swapped to `createPortal(..., document.body)` later without\n * changing this component's props.\n */\nexport function Modal({ open, onClose, title, children, footer, className }: ModalProps) {\n useEscapeKey(open, onClose);\n\n if (!open) return null;\n\n return (\n <>\n <div className=\"modal d-block\" tabIndex={-1} role=\"dialog\" aria-modal=\"true\">\n <div className={cx(\"modal-dialog\", className)} role=\"document\">\n <div className=\"modal-content\">\n <div className=\"modal-header\">\n {title && <h5 className=\"modal-title\">{title}</h5>}\n <button type=\"button\" className=\"btn-close\" aria-label=\"Close\" onClick={onClose} />\n </div>\n <div className=\"modal-body\">{children}</div>\n {footer && <div className=\"modal-footer\">{footer}</div>}\n </div>\n </div>\n </div>\n <div className=\"modal-backdrop show\" onClick={onClose} />\n </>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface PaginationProps {\n currentPage: number;\n pageSize: number;\n totalItems: number;\n onPageChange: (page: number) => void;\n /** How many numbered page buttons to show on each side of the current page. */\n siblingCount?: number;\n className?: string;\n}\n\ntype PageEntry = number | \"ellipsis\";\n\nfunction getPageList(current: number, total: number, siblingCount: number): PageEntry[] {\n const pages: PageEntry[] = [];\n const start = Math.max(1, current - siblingCount);\n const end = Math.min(total, current + siblingCount);\n\n if (start > 1) {\n pages.push(1);\n if (start > 2) pages.push(\"ellipsis\");\n }\n for (let page = start; page <= end; page++) pages.push(page);\n if (end < total) {\n if (end < total - 1) pages.push(\"ellipsis\");\n pages.push(total);\n }\n return pages;\n}\n\n/**\n * UI-only, like DataGrid's other UI concerns — no API calls (doc section\n * 19). This is what lets it be reused by DataGrid (and later\n * RemoteDataGrid/SmartDataGrid) regardless of where the rows came from.\n */\nexport function Pagination({ currentPage, pageSize, totalItems, onPageChange, siblingCount = 1, className }: PaginationProps) {\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n const pages = getPageList(currentPage, totalPages, siblingCount);\n\n return (\n <nav aria-label=\"Pagination\" className={className}>\n <ul className=\"pagination mb-0\">\n <li className={cx(\"page-item\", currentPage <= 1 && \"disabled\")}>\n <button\n type=\"button\"\n className=\"page-link\"\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n >\n Previous\n </button>\n </li>\n {pages.map((page, index) =>\n page === \"ellipsis\" ? (\n <li key={`ellipsis-${index}`} className=\"page-item disabled\">\n <span className=\"page-link\">…</span>\n </li>\n ) : (\n <li key={page} className={cx(\"page-item\", page === currentPage && \"active\")}>\n <button\n type=\"button\"\n className=\"page-link\"\n aria-current={page === currentPage ? \"page\" : undefined}\n onClick={() => onPageChange(page)}\n >\n {page}\n </button>\n </li>\n )\n )}\n <li className={cx(\"page-item\", currentPage >= totalPages && \"disabled\")}>\n <button\n type=\"button\"\n className=\"page-link\"\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n >\n Next\n </button>\n </li>\n </ul>\n </nav>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Pagination } from \"./Pagination\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface DataGridColumn<TRow> {\n key: string;\n header: string;\n render?: (row: TRow) => ReactNode;\n sortable?: boolean;\n width?: string;\n}\n\nexport type DataGridSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport interface DataGridProps<TRow> {\n columns: DataGridColumn<TRow>[];\n rows: TRow[];\n rowKey: (row: TRow) => string | number;\n loading?: boolean;\n error?: string;\n emptyText?: string;\n className?: string;\n\n /** Selection is a generic UI concern — Base doesn't know how selection maps to anything remote. */\n selectedRowKeys?: Array<string | number>;\n onSelectionChange?: (keys: Array<string | number>) => void;\n\n /**\n * Sort UI only. Base renders sort indicators and calls back on header\n * click — it has no idea whether sorting happens client-side or via a\n * server request (doc section 10).\n */\n sort?: DataGridSort | null;\n onSortChange?: (sort: DataGridSort | null) => void;\n\n /** Pagination UI only, fully controlled from outside — same principle as sort. */\n page?: number;\n pageSize?: number;\n totalCount?: number;\n onPageChange?: (page: number) => void;\n}\n\nfunction nextSortDirection(current: DataGridSort | null | undefined, key: string): DataGridSort | null {\n if (!current || current.key !== key) return { key, direction: \"asc\" };\n if (current.direction === \"asc\") return { key, direction: \"desc\" };\n return null;\n}\n\n/**\n * Intentionally focused first iteration (doc section 10/18): columns, rows,\n * selection, sort UI, pagination UI, loading/empty/error presentation.\n * No built-in filtering UI, column resize/reorder, or virtualization yet —\n * those are future extensions, not implemented speculatively.\n */\nexport function DataGrid<TRow>({\n columns,\n rows,\n rowKey,\n loading,\n error,\n emptyText = \"No data\",\n className,\n selectedRowKeys,\n onSelectionChange,\n sort,\n onSortChange,\n page,\n pageSize,\n totalCount,\n onPageChange,\n}: DataGridProps<TRow>) {\n const selectable = Boolean(onSelectionChange);\n const selectedSet = new Set(selectedRowKeys ?? []);\n const paginated = page !== undefined && pageSize !== undefined && totalCount !== undefined;\n const totalPages = paginated ? Math.max(1, Math.ceil(totalCount / pageSize)) : 1;\n\n function toggleAll() {\n if (!onSelectionChange) return;\n if (selectedSet.size === rows.length) {\n onSelectionChange([]);\n } else {\n onSelectionChange(rows.map(rowKey));\n }\n }\n\n function toggleRow(key: string | number) {\n if (!onSelectionChange) return;\n const next = new Set(selectedSet);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n onSelectionChange(Array.from(next));\n }\n\n return (\n <div className={cx(\"table-responsive\", className)}>\n <table className=\"table table-hover align-middle\">\n <thead>\n <tr>\n {selectable && (\n <th style={{ width: \"2.5rem\" }}>\n <input\n type=\"checkbox\"\n className=\"form-check-input\"\n checked={rows.length > 0 && selectedSet.size === rows.length}\n onChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n </th>\n )}\n {columns.map((column) => (\n <th\n key={column.key}\n style={{ width: column.width }}\n role={column.sortable ? \"button\" : undefined}\n onClick={column.sortable && onSortChange ? () => onSortChange(nextSortDirection(sort, column.key)) : undefined}\n >\n {column.header}\n {column.sortable && sort?.key === column.key && (\n <span aria-hidden=\"true\"> {sort.direction === \"asc\" ? \"▲\" : \"▼\"}</span>\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <tr>\n <td colSpan={columns.length + (selectable ? 1 : 0)} className=\"text-center text-body-secondary py-4\">\n Loading…\n </td>\n </tr>\n ) : error ? (\n <tr>\n <td colSpan={columns.length + (selectable ? 1 : 0)} className=\"text-center text-danger py-4\">\n {error}\n </td>\n </tr>\n ) : rows.length === 0 ? (\n <tr>\n <td colSpan={columns.length + (selectable ? 1 : 0)} className=\"text-center text-body-secondary py-4\">\n {emptyText}\n </td>\n </tr>\n ) : (\n rows.map((row) => {\n const key = rowKey(row);\n return (\n <tr key={key}>\n {selectable && (\n <td>\n <input\n type=\"checkbox\"\n className=\"form-check-input\"\n checked={selectedSet.has(key)}\n onChange={() => toggleRow(key)}\n aria-label=\"Select row\"\n />\n </td>\n )}\n {columns.map((column) => (\n <td key={column.key}>{column.render ? column.render(row) : String((row as Record<string, unknown>)[column.key] ?? \"\")}</td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n\n {paginated && (\n <div className=\"d-flex justify-content-between align-items-center mt-2\">\n <span className=\"text-body-secondary small\">\n Page {page} of {totalPages} ({totalCount} rows)\n </span>\n <Pagination currentPage={page!} pageSize={pageSize!} totalItems={totalCount!} onPageChange={onPageChange!} />\n </div>\n )}\n </div>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface SpinnerProps {\n size?: \"sm\" | \"md\";\n variant?: string;\n className?: string;\n label?: string;\n}\n\nexport function Spinner({ size = \"md\", variant, className, label = \"Loading...\" }: SpinnerProps) {\n return (\n <span\n className={cx(\"spinner-border\", size === \"sm\" && \"spinner-border-sm\", variant && `text-${variant}`, className)}\n role=\"status\"\n >\n <span className=\"visually-hidden\">{label}</span>\n </span>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { Spinner } from \"./Spinner\";\nimport { cx } from \"./shared/classNames\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"success\"\n | \"danger\"\n | \"warning\"\n | \"info\"\n | \"light\"\n | \"dark\"\n | \"link\"\n | \"outline-primary\"\n | \"outline-secondary\";\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\" | \"disabled\"> {\n variant?: ButtonVariant;\n size?: \"sm\" | \"lg\";\n disabled?: boolean;\n loading?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n className?: string;\n children?: ReactNode;\n}\n\n/** Reuses Spinner for the loading indicator (doc section 13) instead of a bespoke inline spinner. */\nexport function Button({\n variant = \"primary\",\n size,\n disabled,\n loading,\n type = \"button\",\n className,\n children,\n onClick,\n ...rest\n}: ButtonProps) {\n const isDisabled = disabled || loading;\n\n return (\n <button\n type={type}\n className={cx(\"btn\", `btn-${variant}`, size && `btn-${size}`, className)}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n onClick={isDisabled ? undefined : onClick}\n {...rest}\n >\n {loading && <Spinner size=\"sm\" className=\"me-2\" label=\"\" />}\n {children}\n </button>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport type AlertVariant = \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"warning\" | \"info\" | \"light\" | \"dark\";\n\nexport interface AlertProps {\n variant?: AlertVariant;\n dismissible?: boolean;\n onDismiss?: () => void;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Presentation only (doc section 15) — deliberately not a toast\n * service/notification bus/error-management system. A consumer owns when\n * an Alert mounts/unmounts and what triggers it.\n */\nexport function Alert({ variant = \"info\", dismissible, onDismiss, className, children }: AlertProps) {\n return (\n <div className={cx(\"alert\", `alert-${variant}`, dismissible && \"alert-dismissible\", className)} role=\"alert\">\n {children}\n {dismissible && <button type=\"button\" className=\"btn-close\" aria-label=\"Close\" onClick={onDismiss} />}\n </div>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { Alert, type AlertVariant } from \"./Alert\";\n\nexport interface ToastOptions {\n variant?: AlertVariant;\n /** Auto-dismiss delay in ms. Pass 0 to require manual dismissal via the Alert's close button. */\n duration?: number;\n}\n\ninterface ToastItem {\n id: number;\n message: ReactNode;\n variant: AlertVariant;\n}\n\nexport interface ToastApi {\n show: (message: ReactNode, options?: ToastOptions) => number;\n dismiss: (id: number) => void;\n success: (message: ReactNode, options?: Omit<ToastOptions, \"variant\">) => number;\n error: (message: ReactNode, options?: Omit<ToastOptions, \"variant\">) => number;\n info: (message: ReactNode, options?: Omit<ToastOptions, \"variant\">) => number;\n warning: (message: ReactNode, options?: Omit<ToastOptions, \"variant\">) => number;\n}\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nconst DEFAULT_DURATION = 4000;\n\n/**\n * Global toast notifications. Reuses Alert's variant styling and dismiss\n * button (doc section 20: capability layers must not duplicate an existing\n * implementation) for the actual message presentation — this module only\n * owns the queue/timing/positioning concerns Alert's own doc comment\n * deliberately left out of Alert itself.\n */\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const nextId = useRef(0);\n const timers = useRef(new Map<number, ReturnType<typeof setTimeout>>());\n\n useEffect(() => {\n const activeTimers = timers.current;\n return () => {\n activeTimers.forEach(clearTimeout);\n activeTimers.clear();\n };\n }, []);\n\n const dismiss = useCallback((id: number) => {\n const timer = timers.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.current.delete(id);\n }\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const show = useCallback(\n (message: ReactNode, options?: ToastOptions) => {\n const id = nextId.current++;\n const variant = options?.variant ?? \"info\";\n const duration = options?.duration ?? DEFAULT_DURATION;\n setToasts((prev) => [...prev, { id, message, variant }]);\n if (duration > 0) {\n timers.current.set(\n id,\n setTimeout(() => dismiss(id), duration)\n );\n }\n return id;\n },\n [dismiss]\n );\n\n const api = useMemo<ToastApi>(\n () => ({\n show,\n dismiss,\n success: (message, options) => show(message, { ...options, variant: \"success\" }),\n error: (message, options) => show(message, { ...options, variant: \"danger\" }),\n info: (message, options) => show(message, { ...options, variant: \"info\" }),\n warning: (message, options) => show(message, { ...options, variant: \"warning\" }),\n }),\n [show, dismiss]\n );\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <div className=\"toast-container position-fixed bottom-0 end-0 p-3\" style={{ zIndex: 1090 }}>\n {toasts.map((toast) => (\n <Alert key={toast.id} variant={toast.variant} dismissible onDismiss={() => dismiss(toast.id)} className=\"shadow-sm\">\n {toast.message}\n </Alert>\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n\n/** Throws outside ToastProvider — same fail-fast contract as other context-backed hooks in this library. */\nexport function useToast(): ToastApi {\n const context = useContext(ToastContext);\n if (!context) throw new Error(\"useToast must be used within a ToastProvider\");\n return context;\n}\n","import { createContext, useCallback, useContext, useState, type ReactNode } from \"react\";\nimport { Button, type ButtonVariant } from \"./Button\";\nimport { Modal } from \"./Modal\";\n\nexport interface ConfirmOptions {\n title?: string;\n message: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmVariant?: ButtonVariant;\n}\n\nexport type ConfirmFn = (options: ConfirmOptions) => Promise<boolean>;\n\nconst ConfirmContext = createContext<ConfirmFn | null>(null);\n\ninterface PendingConfirm extends ConfirmOptions {\n resolve: (value: boolean) => void;\n}\n\n/**\n * Imperative yes/no dialog. Built on Modal + Button (doc section 20: reuse,\n * don't reimplement) instead of every screen wiring its own \"are you sure\"\n * modal-open state and footer buttons by hand.\n *\n * Known limitation: a second confirm() call while one is still pending\n * replaces it — the first promise never settles. Acceptable for v1 (doc\n * section 6: avoid speculative infrastructure); a queue can be added if a\n * real screen needs overlapping confirms.\n */\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [pending, setPending] = useState<PendingConfirm | null>(null);\n\n const confirm = useCallback<ConfirmFn>((options) => {\n return new Promise<boolean>((resolve) => {\n setPending({ ...options, resolve });\n });\n }, []);\n\n const settle = useCallback(\n (result: boolean) => {\n pending?.resolve(result);\n setPending(null);\n },\n [pending]\n );\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n <Modal\n open={pending !== null}\n onClose={() => settle(false)}\n title={pending?.title ?? \"Confirm\"}\n footer={\n <>\n <Button variant=\"outline-secondary\" onClick={() => settle(false)}>\n {pending?.cancelLabel ?? \"Cancel\"}\n </Button>\n <Button variant={pending?.confirmVariant ?? \"danger\"} onClick={() => settle(true)}>\n {pending?.confirmLabel ?? \"Confirm\"}\n </Button>\n </>\n }\n >\n {pending?.message}\n </Modal>\n </ConfirmContext.Provider>\n );\n}\n\n/** Throws outside ConfirmProvider — same fail-fast contract as other context-backed hooks in this library. */\nexport function useConfirm(): ConfirmFn {\n const context = useContext(ConfirmContext);\n if (!context) throw new Error(\"useConfirm must be used within a ConfirmProvider\");\n return context;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport type BadgeVariant = \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"warning\" | \"info\" | \"light\" | \"dark\";\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n pill?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nexport function Badge({ variant = \"primary\", pill, className, children }: BadgeProps) {\n return <span className={cx(\"badge\", `bg-${variant}`, pill && \"rounded-pill\", className)}>{children}</span>;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { useControllableState } from \"./shared/useControllableState\";\n\nexport interface TabItem {\n key: string;\n label: string;\n disabled?: boolean;\n content: ReactNode;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n activeKey?: string;\n defaultActiveKey?: string;\n onChange?: (key: string) => void;\n className?: string;\n}\n\n/** Tab definitions (`items`) are kept separate from rendering, per doc section 16. */\nexport function Tabs({ items, activeKey, defaultActiveKey, onChange, className }: TabsProps) {\n const [currentKey, setKey] = useControllableState<string>({\n value: activeKey,\n defaultValue: defaultActiveKey ?? items[0]?.key ?? \"\",\n onChange,\n });\n\n const activeItem = items.find((item) => item.key === currentKey);\n\n return (\n <div className={className}>\n <ul className=\"nav nav-tabs\" role=\"tablist\">\n {items.map((item) => (\n <li className=\"nav-item\" role=\"presentation\" key={item.key}>\n <button\n type=\"button\"\n className={cx(\"nav-link\", item.key === currentKey && \"active\")}\n role=\"tab\"\n aria-selected={item.key === currentKey}\n disabled={item.disabled}\n onClick={() => setKey(item.key)}\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n <div className=\"tab-content pt-3\" role=\"tabpanel\">\n {activeItem?.content}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { useControllableState } from \"./shared/useControllableState\";\n\nexport interface AccordionItem {\n key: string;\n header: string;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** false (default) = single-open (classic accordion); true = multiple sections can be open at once. */\n multiple?: boolean;\n openKeys?: string[];\n defaultOpenKeys?: string[];\n onChange?: (openKeys: string[]) => void;\n className?: string;\n}\n\nexport function Accordion({ items, multiple = false, openKeys, defaultOpenKeys, onChange, className }: AccordionProps) {\n const [currentOpenKeys, setOpenKeys] = useControllableState<string[]>({\n value: openKeys,\n defaultValue: defaultOpenKeys ?? [],\n onChange,\n });\n\n const openSet = new Set(currentOpenKeys);\n\n function toggle(key: string) {\n if (openSet.has(key)) {\n setOpenKeys(currentOpenKeys.filter((k) => k !== key));\n } else {\n setOpenKeys(multiple ? [...currentOpenKeys, key] : [key]);\n }\n }\n\n return (\n <div className={cx(\"accordion\", className)}>\n {items.map((item) => {\n const isOpen = openSet.has(item.key);\n return (\n <div className=\"accordion-item\" key={item.key}>\n <h2 className=\"accordion-header\">\n <button\n type=\"button\"\n className={cx(\"accordion-button\", !isOpen && \"collapsed\")}\n aria-expanded={isOpen}\n disabled={item.disabled}\n onClick={() => toggle(item.key)}\n >\n {item.header}\n </button>\n </h2>\n {isOpen && (\n <div className=\"accordion-collapse\">\n <div className=\"accordion-body\">{item.content}</div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { useId, useRef, useState, type ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { Popup } from \"./shared/Popup\";\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactNode;\n placement?: \"top\" | \"bottom\";\n className?: string;\n}\n\n/**\n * Reuses the existing Popup primitive (open/close, escape-to-close, outside\n * click, cleanup — all already implemented and tested) with Bootstrap's\n * real tooltip CSS classes for visual fidelity.\n *\n * Deliberately NOT wired to Bootstrap's own JS Tooltip plugin: that plugin\n * needs `@popperjs/core` (the plain `bootstrap` package doesn't bundle it —\n * only its non-ESM `bootstrap.bundle.js` does), so wiring it up would mean\n * either adding a new dependency or a fragile UMD-inside-an-ESM-library\n * dynamic import. Reusing our own already-tested Popup is the more\n * conservative choice here, not less (doc section 18: \"do NOT introduce\n * another positioning library unless actually necessary\").\n */\nexport function Tooltip({ content, children, placement = \"top\", className }: TooltipProps) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const tooltipId = useId();\n\n return (\n <span\n ref={anchorRef}\n className=\"position-relative d-inline-block\"\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n aria-describedby={open ? tooltipId : undefined}\n >\n {children}\n <Popup\n open={open}\n onClose={() => setOpen(false)}\n anchorRef={anchorRef}\n className={cx(\"tooltip show\", `bs-tooltip-${placement}`, \"position-absolute\", \"w-auto\", className)}\n >\n <span id={tooltipId} role=\"tooltip\" className=\"tooltip-inner\">\n {content}\n </span>\n </Popup>\n </span>\n );\n}\n","import { useRef, useState, type ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { Popup } from \"./shared/Popup\";\n\nexport interface PopoverProps {\n title?: ReactNode;\n content: ReactNode;\n children: ReactNode;\n placement?: \"top\" | \"bottom\";\n className?: string;\n}\n\n/** Click-triggered variant of Tooltip — same Popup-reuse rationale (see Tooltip.tsx). */\nexport function Popover({ title, content, children, placement = \"bottom\", className }: PopoverProps) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLSpanElement>(null);\n\n return (\n <span ref={anchorRef} className=\"position-relative d-inline-block\" onClick={() => setOpen((prev) => !prev)}>\n {children}\n <Popup\n open={open}\n onClose={() => setOpen(false)}\n anchorRef={anchorRef}\n className={cx(\"popover show\", `bs-popover-${placement}`, \"position-absolute\", \"w-auto\", className)}\n >\n {title && <h3 className=\"popover-header\">{title}</h3>}\n <div className=\"popover-body\">{content}</div>\n </Popup>\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface CardProps {\n header?: ReactNode;\n footer?: ReactNode;\n className?: string;\n children?: ReactNode;\n}\n\n/** Generic content container — the most basic layout primitive, used to group everything else. */\nexport function Card({ header, footer, className, children }: CardProps) {\n return (\n <div className={cx(\"card\", className)}>\n {header && <div className=\"card-header\">{header}</div>}\n <div className=\"card-body\">{children}</div>\n {footer && <div className=\"card-footer\">{footer}</div>}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface DividerProps {\n className?: string;\n vertical?: boolean;\n /** Optional centered label (e.g. \"OR\") — renders a labeled horizontal divider instead of a plain line. */\n label?: ReactNode;\n}\n\nexport function Divider({ className, vertical, label }: DividerProps) {\n if (vertical) {\n return <div className={cx(\"vr\", className)} role=\"separator\" aria-orientation=\"vertical\" />;\n }\n\n if (label) {\n return (\n <div className={cx(\"d-flex align-items-center gap-2 my-3\", className)} role=\"separator\">\n <hr className=\"flex-grow-1 m-0\" />\n <span className=\"text-body-secondary small\">{label}</span>\n <hr className=\"flex-grow-1 m-0\" />\n </div>\n );\n }\n\n return <hr className={cx(\"my-3\", className)} role=\"separator\" />;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface StackProps {\n direction?: \"row\" | \"column\";\n gap?: 0 | 1 | 2 | 3 | 4 | 5;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\";\n wrap?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\n/** Thin wrapper over Bootstrap's flex utilities — replaces repeated `d-flex gap-2` one-offs with one typed contract. */\nexport function Stack({ direction = \"column\", gap = 2, align, justify, wrap, className, children }: StackProps) {\n return (\n <div\n className={cx(\n \"d-flex\",\n direction === \"row\" ? \"flex-row\" : \"flex-column\",\n `gap-${gap}`,\n align && `align-items-${align}`,\n justify && `justify-content-${justify}`,\n wrap && \"flex-wrap\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface ContainerProps {\n fluid?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport function Container({ fluid, className, children }: ContainerProps) {\n return <div className={cx(fluid ? \"container-fluid\" : \"container\", className)}>{children}</div>;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface RowProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport function Row({ className, children }: RowProps) {\n return <div className={cx(\"row\", className)}>{children}</div>;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface ColProps {\n /** Column width at the default breakpoint (1-12). Omit for `col` (auto-width). */\n span?: number;\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n className?: string;\n children?: ReactNode;\n}\n\nexport function Col({ span, sm, md, lg, xl, className, children }: ColProps) {\n return (\n <div\n className={cx(\n span ? `col-${span}` : \"col\",\n sm ? `col-sm-${sm}` : undefined,\n md ? `col-md-${md}` : undefined,\n lg ? `col-lg-${lg}` : undefined,\n xl ? `col-xl-${xl}` : undefined,\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumb({ items, className }: BreadcrumbProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={className}>\n <ol className=\"breadcrumb mb-0\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const isInteractive = !isLast && (item.href || item.onClick);\n return (\n <li key={index} className={cx(\"breadcrumb-item\", isLast && \"active\")} aria-current={isLast ? \"page\" : undefined}>\n {isInteractive ? (\n <a\n href={item.href ?? \"#\"}\n onClick={(event) => {\n if (!item.href) event.preventDefault();\n item.onClick?.();\n }}\n >\n {item.label}\n </a>\n ) : (\n item.label\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { useCallback, useRef, useState, type ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\nimport { Popup } from \"./shared/Popup\";\nimport { useListNavigation } from \"./shared/useListNavigation\";\n\nexport interface MenuItem {\n key: string;\n label: ReactNode;\n disabled?: boolean;\n danger?: boolean;\n onSelect?: () => void;\n}\n\nexport interface MenuProps {\n items: MenuItem[];\n children: ReactNode;\n placement?: \"start\" | \"end\";\n className?: string;\n}\n\n/**\n * A generic click-triggered action menu (e.g. a \"...\" row action button) —\n * distinct from Select/ComboBox, which pick a *value*. Reuses Popup +\n * useListNavigation, the same headless pair ComboBox/AutoComplete/\n * MultiSelect already share (doc's reuse mandate).\n */\nexport function Menu({ items, children, placement = \"start\", className }: MenuProps) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLSpanElement>(null);\n\n const close = useCallback(() => setOpen(false), []);\n const selectIndex = useCallback(\n (index: number) => {\n const item = items[index];\n if (!item || item.disabled) return;\n item.onSelect?.();\n close();\n },\n [items, close]\n );\n\n const { activeIndex, setActiveIndex, handleKeyDown } = useListNavigation({\n itemCount: items.length,\n isOpen: open,\n onSelect: selectIndex,\n onClose: close,\n });\n\n return (\n <span\n ref={anchorRef}\n className=\"position-relative d-inline-block\"\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n >\n {children}\n <Popup\n open={open}\n onClose={close}\n anchorRef={anchorRef}\n role=\"menu\"\n className={cx(\"dropdown-menu show\", placement === \"end\" && \"dropdown-menu-end\", className)}\n >\n {items.map((item, index) => (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n className={cx(\"dropdown-item\", index === activeIndex && \"active\", item.disabled && \"disabled\", item.danger && \"text-danger\")}\n disabled={item.disabled}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => {\n // Without this, the click bubbles to the trigger <span>'s own\n // onClick (which toggles `open`), racing with close() from\n // selectIndex() in the same batch and leaving the menu open.\n event.stopPropagation();\n selectIndex(index);\n }}\n >\n {item.label}\n </button>\n ))}\n </Popup>\n </span>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface StepItem {\n key: string;\n label: string;\n description?: string;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the current step (0-based). Presentation only — no built-in next/back logic, that's app-level. */\n currentStep: number;\n className?: string;\n}\n\nexport function Stepper({ steps, currentStep, className }: StepperProps) {\n return (\n <ol className={cx(\"d-flex list-unstyled align-items-center\", className)}>\n {steps.map((step, index) => {\n const status = index < currentStep ? \"complete\" : index === currentStep ? \"active\" : \"upcoming\";\n const isLast = index === steps.length - 1;\n return (\n <li key={step.key} className={cx(\"d-flex align-items-center\", !isLast && \"flex-grow-1\")}>\n <div className=\"d-flex align-items-center gap-2\">\n <span\n className={cx(\n \"d-flex align-items-center justify-content-center rounded-circle flex-shrink-0\",\n status === \"complete\" ? \"bg-primary text-white\" : status === \"active\" ? \"border border-primary text-primary\" : \"border text-body-secondary\"\n )}\n style={{ width: \"2rem\", height: \"2rem\" }}\n aria-current={status === \"active\" ? \"step\" : undefined}\n >\n {status === \"complete\" ? \"✓\" : index + 1}\n </span>\n <div>\n <div className={cx(\"small fw-semibold\", status === \"upcoming\" && \"text-body-secondary\")}>{step.label}</div>\n {step.description && <div className=\"small text-body-secondary\">{step.description}</div>}\n </div>\n </div>\n {!isLast && <hr className=\"flex-grow-1 mx-2\" />}\n </li>\n );\n })}\n </ol>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface AvatarProps {\n src?: string;\n /** Used both for the image's alt text and for the initials fallback when there's no `src`. */\n name?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n const first = parts[0]?.[0] ?? \"\";\n const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nconst DIMENSION: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\n sm: \"1.75rem\",\n md: \"2.5rem\",\n lg: \"3.5rem\",\n};\n\nexport function Avatar({ src, name, size = \"md\", className }: AvatarProps) {\n const dimension = DIMENSION[size];\n\n if (src) {\n return (\n <img\n src={src}\n alt={name ?? \"\"}\n className={cx(\"rounded-circle\", className)}\n style={{ width: dimension, height: dimension, objectFit: \"cover\" }}\n />\n );\n }\n\n return (\n <span\n className={cx(\"d-inline-flex align-items-center justify-content-center rounded-circle bg-secondary text-white\", className)}\n style={{ width: dimension, height: dimension, fontSize: `calc(${dimension} * 0.4)` }}\n role={name ? \"img\" : undefined}\n aria-label={name}\n >\n {name ? getInitials(name) : null}\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { BadgeVariant } from \"./Badge\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface TagProps {\n variant?: BadgeVariant;\n onRemove?: () => void;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Reuses Badge's variant type (same visual vocabulary) — the difference\n * from Badge is purely behavioral: Tag is removable/interactive, Badge is\n * static.\n */\nexport function Tag({ variant = \"secondary\", onRemove, className, children }: TagProps) {\n return (\n <span className={cx(\"badge d-inline-flex align-items-center gap-1\", `bg-${variant}`, className)}>\n {children}\n {onRemove && (\n <button\n type=\"button\"\n className=\"btn-close btn-close-white\"\n style={{ fontSize: \"0.55rem\" }}\n aria-label=\"Remove\"\n onClick={onRemove}\n />\n )}\n </span>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface SkeletonProps {\n width?: string | number;\n height?: string | number;\n circle?: boolean;\n className?: string;\n}\n\n/** Uses Bootstrap's built-in `placeholder`/`placeholder-glow` classes rather than inventing a new loading-shimmer animation. */\nexport function Skeleton({ width = \"100%\", height = \"1rem\", circle, className }: SkeletonProps) {\n return (\n <span className={cx(\"placeholder-glow d-inline-block\", className)} style={{ width, height }} aria-hidden=\"true\">\n <span className={cx(\"placeholder w-100 h-100 d-block\", circle && \"rounded-circle\")} />\n </span>\n );\n}\n","import { useId } from \"react\";\nimport { FieldShell } from \"./shared/FieldShell\";\nimport { useControllableState } from \"./shared/useControllableState\";\nimport type { FieldIdentity, FieldPresentation, FieldState } from \"./shared/fieldTypes\";\n\nexport interface SliderProps extends FieldIdentity, FieldState, FieldPresentation {\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n}\n\nexport function Slider({\n value,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n id,\n name,\n disabled,\n required,\n className,\n label,\n helpText,\n error,\n}: SliderProps) {\n const [currentValue, setValue] = useControllableState<number>({\n value,\n defaultValue: defaultValue ?? min,\n onChange,\n });\n\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n\n return (\n <FieldShell id={fieldId} label={label} required={required} error={error} helpText={helpText} className={className}>\n <input\n id={fieldId}\n name={name}\n type=\"range\"\n className=\"form-range\"\n disabled={disabled}\n required={required}\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={(event) => setValue(Number(event.target.value))}\n />\n <div className=\"small text-body-secondary\">{currentValue}</div>\n </FieldShell>\n );\n}\n","import { cx } from \"./shared/classNames\";\nimport { useControllableState } from \"./shared/useControllableState\";\n\nexport interface RatingProps {\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n max?: number;\n disabled?: boolean;\n className?: string;\n}\n\nexport function Rating({ value, defaultValue, onChange, max = 5, disabled, className }: RatingProps) {\n const [currentValue, setValue] = useControllableState<number>({\n value,\n defaultValue: defaultValue ?? 0,\n onChange,\n });\n\n return (\n <div className={cx(\"d-inline-flex gap-1\", className)} role=\"radiogroup\" aria-label=\"Rating\">\n {Array.from({ length: max }, (_, index) => index + 1).map((n) => (\n <button\n key={n}\n type=\"button\"\n className=\"btn btn-link p-0 border-0\"\n disabled={disabled}\n role=\"radio\"\n aria-checked={n === currentValue}\n aria-label={`${n} star${n > 1 ? \"s\" : \"\"}`}\n onClick={() => setValue(n)}\n >\n <span aria-hidden=\"true\" style={{ fontSize: \"1.25rem\", color: n <= currentValue ? \"#f5b301\" : \"#ced4da\" }}>\n ★\n </span>\n </button>\n ))}\n </div>\n );\n}\n","import type { BadgeVariant } from \"./Badge\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface ProgressBarProps {\n /** 0-100. Values outside that range are clamped. */\n value: number;\n variant?: BadgeVariant;\n /** Show the percentage as text inside the bar. */\n label?: boolean;\n className?: string;\n}\n\nexport function ProgressBar({ value, variant = \"primary\", label, className }: ProgressBarProps) {\n const clamped = Math.max(0, Math.min(100, value));\n\n return (\n <div className={cx(\"progress\", className)} role=\"progressbar\" aria-valuenow={clamped} aria-valuemin={0} aria-valuemax={100}>\n <div className={cx(\"progress-bar\", `bg-${variant}`)} style={{ width: `${clamped}%` }}>\n {label ? `${Math.round(clamped)}%` : null}\n </div>\n </div>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport interface IconProps {\n /**\n * Full icon class name(s) — e.g. \"bi bi-trash\" (Bootstrap Icons) or\n * \"ki-outline ki-trash\" (Metronic Keenicons). Icon-set agnostic by design:\n * this component bundles no icon font of its own (doc section 15 — stay\n * on Bootstrap/Metronic, don't introduce another framework or a\n * duplicate asset), it only standardizes sizing and accessibility.\n */\n name: string;\n size?: \"sm\" | \"lg\" | \"xl\";\n className?: string;\n /** Accessible label. Omit for a purely decorative icon (default: aria-hidden). */\n label?: string;\n}\n\nconst SIZE_EM: Record<NonNullable<IconProps[\"size\"]>, string> = {\n sm: \"0.875em\",\n lg: \"1.5em\",\n xl: \"2em\",\n};\n\nexport function Icon({ name, size, className, label }: IconProps) {\n return (\n <i\n className={cx(name, className)}\n style={size ? { fontSize: SIZE_EM[size] } : undefined}\n role={label ? \"img\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface NavbarProps {\n brand?: ReactNode;\n /** Left-aligned slot, e.g. primary nav links. */\n start?: ReactNode;\n /** Right-aligned slot, e.g. search, notifications, user menu. */\n end?: ReactNode;\n variant?: \"light\" | \"dark\";\n className?: string;\n}\n\n/**\n * Top app bar shell. Brand/start/end are plain slots — actual nav links,\n * routing, and auth/user menus belong to the consuming app (doc section 22:\n * Base must not touch routing or auth), not to this component.\n */\nexport function Navbar({ brand, start, end, variant = \"light\", className }: NavbarProps) {\n return (\n <nav\n className={cx(\n \"navbar navbar-expand-lg border-bottom\",\n variant === \"dark\" ? \"navbar-dark bg-dark\" : \"navbar-light bg-light\",\n className\n )}\n >\n <div className=\"container-fluid\">\n {brand && <span className=\"navbar-brand mb-0\">{brand}</span>}\n {start && <div className=\"d-flex align-items-center gap-3\">{start}</div>}\n {end && <div className=\"d-flex align-items-center gap-3 ms-auto\">{end}</div>}\n </div>\n </nav>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Accordion } from \"./Accordion\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface SidebarLeafItem {\n key: string;\n label: ReactNode;\n icon?: ReactNode;\n href?: string;\n onClick?: () => void;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface SidebarGroup {\n key: string;\n label: string;\n items: SidebarLeafItem[];\n defaultOpen?: boolean;\n}\n\nexport type SidebarSection = SidebarLeafItem | SidebarGroup;\n\nexport interface SidebarProps {\n sections: SidebarSection[];\n header?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nfunction isGroup(section: SidebarSection): section is SidebarGroup {\n return \"items\" in section;\n}\n\nfunction SidebarLink({ item }: { item: SidebarLeafItem }) {\n return (\n <a\n href={item.href ?? \"#\"}\n className={cx(\"nav-link d-flex align-items-center gap-2\", item.active && \"active\", item.disabled && \"disabled\")}\n aria-current={item.active ? \"page\" : undefined}\n aria-disabled={item.disabled}\n onClick={(event) => {\n if (!item.href) event.preventDefault();\n if (item.disabled) return;\n item.onClick?.();\n }}\n >\n {item.icon}\n {item.label}\n </a>\n );\n}\n\n/**\n * Persistent vertical navigation. Leaf entries render as plain nav links;\n * grouped/collapsible sections reuse Accordion (doc section 20 — no second\n * independent collapse implementation) instead of reimplementing open/close\n * state. Active-state comes from the `active` flag the caller passes in —\n * routing/URL matching is the consuming app's job (doc section 22).\n */\nexport function Sidebar({ sections, header, footer, className }: SidebarProps) {\n return (\n <div className={cx(\"d-flex flex-column h-100\", className)}>\n {header && <div className=\"p-3 border-bottom\">{header}</div>}\n <nav className=\"nav flex-column flex-grow-1 p-2 gap-1\">\n {sections.map((section) =>\n isGroup(section) ? (\n <Accordion\n key={section.key}\n className=\"border-0\"\n defaultOpenKeys={section.defaultOpen ? [section.key] : []}\n items={[\n {\n key: section.key,\n header: section.label,\n content: (\n <div className=\"nav flex-column ps-2 gap-1\">\n {section.items.map((item) => (\n <SidebarLink key={item.key} item={item} />\n ))}\n </div>\n ),\n },\n ]}\n />\n ) : (\n <SidebarLink key={section.key} item={section} />\n )\n )}\n </nav>\n {footer && <div className=\"p-3 border-top\">{footer}</div>}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Breadcrumb, type BreadcrumbItem } from \"./Breadcrumb\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface PageHeaderProps {\n title: ReactNode;\n description?: ReactNode;\n breadcrumbItems?: BreadcrumbItem[];\n /** Right-aligned slot, typically page-level Buttons. */\n actions?: ReactNode;\n className?: string;\n}\n\n/** Composes Breadcrumb (doc section 20 — reuse, don't re-derive trail markup) for the standard title/breadcrumb/actions row atop a page. */\nexport function PageHeader({ title, description, breadcrumbItems, actions, className }: PageHeaderProps) {\n return (\n <div className={cx(\"mb-4\", className)}>\n {breadcrumbItems && breadcrumbItems.length > 0 && <Breadcrumb items={breadcrumbItems} className=\"mb-2\" />}\n <div className=\"d-flex align-items-start justify-content-between gap-3 flex-wrap\">\n <div>\n <h1 className=\"h3 mb-1\">{title}</h1>\n {description && <p className=\"text-body-secondary mb-0\">{description}</p>}\n </div>\n {actions && <div className=\"d-flex align-items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n","export interface HttpRequestOptions {\n params?: Record<string, unknown>;\n signal?: AbortSignal;\n}\n\nexport interface HttpClient {\n get<TResponse>(url: string, options?: HttpRequestOptions): Promise<TResponse>;\n}\n\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n url: string;\n\n constructor(status: number, statusText: string, url: string) {\n super(`HTTP ${status} ${statusText} for ${url}`);\n this.name = \"HttpError\";\n this.status = status;\n this.statusText = statusText;\n this.url = url;\n }\n}\n\nfunction serializeParams(params?: Record<string, unknown>): string {\n if (!params) return \"\";\n const searchParams = new URLSearchParams();\n for (const [key, rawValue] of Object.entries(params)) {\n if (rawValue === undefined || rawValue === null) continue;\n searchParams.set(key, String(rawValue));\n }\n const query = searchParams.toString();\n return query ? `?${query}` : \"\";\n}\n\nexport interface CreateHttpClientOptions {\n baseUrl?: string;\n /** Injectable fetch implementation — used by tests, could also route through a wrapped/instrumented fetch. */\n fetcher?: typeof fetch;\n /**\n * Extension point for cross-cutting concerns the doc explicitly defers\n * (authorization, tenant headers, interceptors) without building them now\n * (doc section 6: only establish extension points where justified).\n */\n buildRequestInit?: (url: string, init: RequestInit) => RequestInit;\n}\n\n/**\n * The single place Remote Components go through to talk to a backend.\n * Base Components never import this (enforced by dependency direction, not\n * just convention — Base has no dependency on `remote/*` at all).\n */\nexport function createHttpClient(options: CreateHttpClientOptions = {}): HttpClient {\n const { baseUrl = \"\", fetcher = fetch, buildRequestInit } = options;\n\n return {\n async get<TResponse>(url: string, requestOptions: HttpRequestOptions = {}): Promise<TResponse> {\n const fullUrl = `${baseUrl}${url}${serializeParams(requestOptions.params)}`;\n let init: RequestInit = { method: \"GET\", signal: requestOptions.signal };\n if (buildRequestInit) init = buildRequestInit(fullUrl, init);\n\n const response = await fetcher(fullUrl, init);\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, fullUrl);\n }\n return (await response.json()) as TResponse;\n },\n };\n}\n\nexport const defaultHttpClient = createHttpClient();\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { defaultHttpClient, type HttpClient } from \"../http/HttpClient\";\n\nexport type RemoteState = \"idle\" | \"loading\" | \"success\" | \"empty\" | \"error\";\n\nexport interface UseRemoteDataOptions<TResponse, TItem> {\n client?: HttpClient;\n /** `null`/`undefined` disables fetching entirely (e.g. RemoteAutoComplete below minSearchLength). */\n url: string | null | undefined;\n params?: Record<string, unknown>;\n mapResponse: (response: TResponse) => TItem[];\n enabled?: boolean;\n}\n\nexport interface UseRemoteDataResult<TItem> {\n state: RemoteState;\n items: TItem[];\n error: Error | null;\n reload: () => void;\n}\n\nfunction sortKeys(obj: Record<string, unknown>): Record<string, unknown> {\n return Object.keys(obj)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = obj[key];\n return acc;\n }, {});\n}\n\n/**\n * The one place remote/API data fetching lifecycle logic lives. Every\n * Remote Component (RemoteComboBox, RemoteAutoComplete, RemoteDataGrid)\n * composes this instead of writing its own fetch effect (doc section 6).\n *\n * Handles, per doc sections 5/7/8:\n * - stable request identity: params are compared by serialized *value*,\n * not object reference, so a new `{ ...params }` literal each render\n * does not cause an infinite request loop.\n * - request cancellation via AbortController.\n * - stale-response protection via a monotonically increasing request id,\n * which still guards correctness even if abort doesn't win the race.\n * - a consistent idle/loading/success/empty/error state model.\n */\nexport function useRemoteData<TResponse, TItem>({\n client = defaultHttpClient,\n url,\n params,\n mapResponse,\n enabled = true,\n}: UseRemoteDataOptions<TResponse, TItem>): UseRemoteDataResult<TItem> {\n const [state, setState] = useState<RemoteState>(\"idle\");\n const [items, setItems] = useState<TItem[]>([]);\n const [error, setError] = useState<Error | null>(null);\n const [reloadToken, setReloadToken] = useState(0);\n\n const paramsKey = useMemo(() => (params ? JSON.stringify(sortKeys(params)) : \"\"), [params]);\n\n const latestRequestId = useRef(0);\n const mapResponseRef = useRef(mapResponse);\n mapResponseRef.current = mapResponse;\n\n useEffect(() => {\n if (!enabled || !url) {\n setState(\"idle\");\n setItems([]);\n setError(null);\n return;\n }\n\n const requestId = ++latestRequestId.current;\n const controller = new AbortController();\n setState(\"loading\");\n setError(null);\n\n client\n .get<TResponse>(url, { params, signal: controller.signal })\n .then((response) => {\n if (requestId !== latestRequestId.current) return;\n const mapped = mapResponseRef.current(response);\n setItems(mapped);\n setState(mapped.length === 0 ? \"empty\" : \"success\");\n })\n .catch((err: unknown) => {\n if (requestId !== latestRequestId.current) return;\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n setError(err instanceof Error ? err : new Error(String(err)));\n setState(\"error\");\n });\n\n return () => {\n controller.abort();\n };\n // paramsKey (not params) is the intentional dependency: it's the stable,\n // value-based identity for \"did the request actually change\".\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, url, paramsKey, enabled, reloadToken]);\n\n const reload = useCallback(() => setReloadToken((token) => token + 1), []);\n\n return { state, items, error, reload };\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n return () => clearTimeout(timer);\n }, [value, delayMs]);\n\n return debounced;\n}\n","import type { SelectOption } from \"../base\";\n\n/**\n * Handles the two common response envelopes (bare array, `{ items: [...] }`)\n * explicitly (doc section 11). Anything else must be handled via an\n * explicit `mapResponse` — no guessing beyond these two conventions.\n */\nexport function defaultArrayNormalization(response: unknown): unknown[] {\n if (Array.isArray(response)) return response;\n if (response && typeof response === \"object\" && Array.isArray((response as { items?: unknown }).items)) {\n return (response as { items: unknown[] }).items;\n }\n throw new Error(\n \"Unable to normalize remote response into an array. Provide an explicit `mapResponse` for this endpoint's response shape.\"\n );\n}\n\nexport function toSelectOption<TValue extends string | number>(\n raw: unknown,\n valueMember: string,\n displayMember: string\n): SelectOption<TValue> {\n if (raw === null || typeof raw !== \"object\") {\n throw new Error(\"Remote item is not an object; cannot read valueMember/displayMember from it.\");\n }\n const record = raw as Record<string, unknown>;\n return {\n value: record[valueMember] as TValue,\n label: String(record[displayMember] ?? \"\"),\n };\n}\n","import { ComboBox, type ComboBoxProps, type SelectOption } from \"../base\";\nimport type { HttpClient } from \"./http/HttpClient\";\nimport { useRemoteData } from \"./hooks/useRemoteData\";\nimport { defaultArrayNormalization, toSelectOption } from \"./mapping\";\n\nexport interface RemoteComboBoxProps<TValue extends string | number = string, TResponse = unknown>\n extends Omit<ComboBoxProps<TValue>, \"options\" | \"loading\"> {\n url: string;\n params?: Record<string, unknown>;\n /** Key read off each raw remote item to produce the option's `value` (doc section 4). */\n valueMember: string;\n /** Key read off each raw remote item to produce the option's `label`. */\n displayMember: string;\n /** Escape hatch for response envelopes beyond bare array / `{ items: [...] }` (doc section 11). */\n mapResponse?: (response: TResponse) => unknown[];\n client?: HttpClient;\n enabled?: boolean;\n}\n\n/**\n * Adds remote-loading behavior to Base ComboBox by composing it — this is\n * NOT a second independent ComboBox implementation (doc section 20). All\n * selection/keyboard/popup UI behavior is Base ComboBox's; this component\n * only owns fetch lifecycle + raw-item -> SelectOption mapping.\n */\nexport function RemoteComboBox<TValue extends string | number = string, TResponse = unknown>({\n url,\n params,\n valueMember,\n displayMember,\n mapResponse,\n client,\n enabled,\n ...comboBoxProps\n}: RemoteComboBoxProps<TValue, TResponse>) {\n const { state, items, error } = useRemoteData<TResponse, SelectOption<TValue>>({\n client,\n url,\n params,\n enabled,\n mapResponse: (response) => {\n const rawItems = mapResponse ? mapResponse(response) : defaultArrayNormalization(response);\n return rawItems.map((raw) => toSelectOption<TValue>(raw, valueMember, displayMember));\n },\n });\n\n // A consumer-supplied `error` (field validation) wins; otherwise fall back\n // to the remote fetch error so failures are visible without requiring\n // every call site to wire this up by hand.\n const resolvedError = comboBoxProps.error ?? (state === \"error\" ? error?.message ?? \"Failed to load options\" : undefined);\n\n return <ComboBox<TValue> {...comboBoxProps} options={items} loading={state === \"loading\"} error={resolvedError} />;\n}\n","import { AutoComplete, type AutoCompleteProps, type SelectOption } from \"../base\";\nimport { useControllableState } from \"../base/shared/useControllableState\";\nimport type { HttpClient } from \"./http/HttpClient\";\nimport { useDebouncedValue } from \"./hooks/useDebouncedValue\";\nimport { useRemoteData } from \"./hooks/useRemoteData\";\nimport { defaultArrayNormalization, toSelectOption } from \"./mapping\";\n\nexport interface RemoteAutoCompleteProps<TValue extends string | number = string, TResponse = unknown>\n extends Omit<AutoCompleteProps<TValue>, \"options\" | \"loading\" | \"filter\"> {\n url: string;\n params?: Record<string, unknown>;\n /** Query-string parameter name the current search text is sent under. */\n searchParam: string;\n valueMember: string;\n displayMember: string;\n mapResponse?: (response: TResponse) => unknown[];\n minSearchLength?: number;\n debounceMs?: number;\n client?: HttpClient;\n}\n\n/**\n * Adds search input handling (debounce, minimum length, remote loading) to\n * Base AutoComplete by composing it. AutoComplete's own local `filter` is\n * disabled here (`() => true`) because the server has already filtered by\n * `searchParam` — re-filtering client-side would silently drop valid\n * server results whose label doesn't literally contain the query text.\n */\nexport function RemoteAutoComplete<TValue extends string | number = string, TResponse = unknown>({\n url,\n params,\n searchParam,\n valueMember,\n displayMember,\n mapResponse,\n minSearchLength = 1,\n debounceMs = 300,\n client,\n inputValue,\n onInputValueChange,\n ...autoCompleteProps\n}: RemoteAutoCompleteProps<TValue, TResponse>) {\n const [internalSearchText, setInternalSearchText] = useControllableState<string>({\n value: inputValue,\n defaultValue: \"\",\n onChange: onInputValueChange,\n });\n\n const debouncedSearchText = useDebouncedValue(internalSearchText, debounceMs);\n const searchReady = debouncedSearchText.length >= minSearchLength;\n\n const { state, items, error } = useRemoteData<TResponse, SelectOption<TValue>>({\n client,\n url,\n enabled: searchReady,\n params: { ...params, [searchParam]: debouncedSearchText },\n mapResponse: (response) => {\n const rawItems = mapResponse ? mapResponse(response) : defaultArrayNormalization(response);\n return rawItems.map((raw) => toSelectOption<TValue>(raw, valueMember, displayMember));\n },\n });\n\n const resolvedError =\n autoCompleteProps.error ?? (state === \"error\" ? error?.message ?? \"Failed to load suggestions\" : undefined);\n\n return (\n <AutoComplete<TValue>\n {...autoCompleteProps}\n options={items}\n loading={state === \"loading\"}\n error={resolvedError}\n inputValue={internalSearchText}\n onInputValueChange={setInternalSearchText}\n filter={() => true}\n />\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { DataGrid, type DataGridProps, type DataGridSort } from \"../base\";\nimport type { HttpClient } from \"./http/HttpClient\";\nimport { useRemoteData } from \"./hooks/useRemoteData\";\nimport { defaultArrayNormalization } from \"./mapping\";\n\nexport interface RemoteDataGridProps<TRow, TResponse = unknown>\n extends Omit<\n DataGridProps<TRow>,\n \"rows\" | \"loading\" | \"error\" | \"page\" | \"pageSize\" | \"totalCount\" | \"onPageChange\" | \"sort\" | \"onSortChange\"\n > {\n url: string;\n /** Additional filter params (e.g. `{ countryId }`) — page/pageSize/sort are managed internally. */\n params?: Record<string, unknown>;\n mapResponse?: (response: TResponse) => TRow[];\n /**\n * Extension point: read a total row count out of the raw response, when\n * the backend provides one. Strongly recommended — without it, pagination\n * falls back to a has-more heuristic (a full page implies \"at least one\n * more page exists\") which cannot show an exact page count.\n */\n getTotalCount?: (response: TResponse) => number | undefined;\n pageSize?: number;\n client?: HttpClient;\n}\n\n/**\n * Adds paging/sorting-against-a-server-endpoint behavior to Base DataGrid\n * by composing it. All table rendering, selection, and pagination/sort UI\n * remain Base DataGrid's — this component only owns request params\n * (page/pageSize/sort/filters) and response mapping (doc section 10).\n */\nexport function RemoteDataGrid<TRow, TResponse = unknown>({\n url,\n params,\n mapResponse,\n getTotalCount,\n pageSize = 20,\n client,\n ...dataGridProps\n}: RemoteDataGridProps<TRow, TResponse>) {\n const [page, setPage] = useState(1);\n const [sort, setSort] = useState<DataGridSort | null>(null);\n\n const paramsKey = useMemo(() => JSON.stringify(params ?? {}), [params]);\n const isFirstRender = useRef(true);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n setPage(1);\n }, [paramsKey]);\n\n const requestParams = useMemo(\n () => ({\n ...params,\n page,\n pageSize,\n ...(sort ? { sortKey: sort.key, sortDirection: sort.direction } : {}),\n }),\n [params, page, pageSize, sort]\n );\n\n const lastResponseRef = useRef<TResponse | undefined>(undefined);\n\n const { state, items, error } = useRemoteData<TResponse, TRow>({\n client,\n url,\n params: requestParams,\n mapResponse: (response) => {\n lastResponseRef.current = response;\n return mapResponse ? mapResponse(response) : (defaultArrayNormalization(response) as TRow[]);\n },\n });\n\n const explicitTotalCount = lastResponseRef.current !== undefined ? getTotalCount?.(lastResponseRef.current) : undefined;\n // Without a real total from the backend, `items.length` alone only describes the\n // *current* page and would freeze pagination on page 1 forever (totalPages would\n // never exceed 1). Infer \"there's at least one more page\" from a full page coming\n // back, the same has-more heuristic APIs without a count endpoint commonly use.\n const hasMorePages = items.length >= pageSize && pageSize > 0;\n const inferredTotalCount = hasMorePages ? page * pageSize + 1 : (page - 1) * pageSize + items.length;\n const totalCount = explicitTotalCount ?? inferredTotalCount;\n\n return (\n <DataGrid<TRow>\n {...dataGridProps}\n rows={items}\n loading={state === \"loading\"}\n error={error?.message}\n page={page}\n pageSize={pageSize}\n totalCount={totalCount}\n onPageChange={setPage}\n sort={sort}\n onSortChange={(next) => {\n setSort(next);\n setPage(1);\n }}\n />\n );\n}\n","import { Select, type SelectOption, type SelectProps } from \"../base\";\nimport type { HttpClient } from \"./http/HttpClient\";\nimport { useRemoteData } from \"./hooks/useRemoteData\";\nimport { defaultArrayNormalization, toSelectOption } from \"./mapping\";\n\nexport interface RemoteSelectProps<TValue extends string | number = string, TResponse = unknown>\n extends Omit<SelectProps<TValue>, \"options\" | \"loading\"> {\n url: string;\n params?: Record<string, unknown>;\n valueMember: string;\n displayMember: string;\n mapResponse?: (response: TResponse) => unknown[];\n client?: HttpClient;\n enabled?: boolean;\n}\n\n/**\n * Same reuse pattern as RemoteComboBox: composes Base Select instead of\n * reimplementing it (doc section 20). Thin — only fetch lifecycle +\n * valueMember/displayMember mapping belong here.\n */\nexport function RemoteSelect<TValue extends string | number = string, TResponse = unknown>({\n url,\n params,\n valueMember,\n displayMember,\n mapResponse,\n client,\n enabled,\n ...selectProps\n}: RemoteSelectProps<TValue, TResponse>) {\n const { state, items, error } = useRemoteData<TResponse, SelectOption<TValue>>({\n client,\n url,\n params,\n enabled,\n mapResponse: (response) => {\n const rawItems = mapResponse ? mapResponse(response) : defaultArrayNormalization(response);\n return rawItems.map((raw) => toSelectOption<TValue>(raw, valueMember, displayMember));\n },\n });\n\n const resolvedError = selectProps.error ?? (state === \"error\" ? error?.message ?? \"Failed to load options\" : undefined);\n\n return <Select<TValue> {...selectProps} options={items} loading={state === \"loading\"} error={resolvedError} />;\n}\n","import { MultiSelect, type MultiSelectProps, type SelectOption } from \"../base\";\nimport type { HttpClient } from \"./http/HttpClient\";\nimport { useRemoteData } from \"./hooks/useRemoteData\";\nimport { defaultArrayNormalization, toSelectOption } from \"./mapping\";\n\nexport interface RemoteMultiSelectProps<TValue extends string | number = string, TResponse = unknown>\n extends Omit<MultiSelectProps<TValue>, \"options\" | \"loading\"> {\n url: string;\n params?: Record<string, unknown>;\n valueMember: string;\n displayMember: string;\n mapResponse?: (response: TResponse) => unknown[];\n client?: HttpClient;\n enabled?: boolean;\n}\n\n/** Same reuse pattern as RemoteComboBox/RemoteSelect, composing Base MultiSelect. */\nexport function RemoteMultiSelect<TValue extends string | number = string, TResponse = unknown>({\n url,\n params,\n valueMember,\n displayMember,\n mapResponse,\n client,\n enabled,\n ...multiSelectProps\n}: RemoteMultiSelectProps<TValue, TResponse>) {\n const { state, items, error } = useRemoteData<TResponse, SelectOption<TValue>>({\n client,\n url,\n params,\n enabled,\n mapResponse: (response) => {\n const rawItems = mapResponse ? mapResponse(response) : defaultArrayNormalization(response);\n return rawItems.map((raw) => toSelectOption<TValue>(raw, valueMember, displayMember));\n },\n });\n\n const resolvedError =\n multiSelectProps.error ?? (state === \"error\" ? error?.message ?? \"Failed to load options\" : undefined);\n\n return <MultiSelect<TValue> {...multiSelectProps} options={items} loading={state === \"loading\"} error={resolvedError} />;\n}\n","import type { ReactElement } from \"react\";\nimport type { SmartFieldMetadata } from \"./types\";\nimport type { SmartRuntimeContext } from \"./runtime\";\n\nexport type SmartResolver<M extends SmartFieldMetadata = SmartFieldMetadata> = (\n metadata: M,\n ctx: SmartRuntimeContext\n) => ReactElement | null;\n\nexport interface SmartComponentRegistry {\n register<M extends SmartFieldMetadata>(component: M[\"component\"], resolver: SmartResolver<M>): void;\n resolve(metadata: SmartFieldMetadata, ctx: SmartRuntimeContext): ReactElement | null;\n has(component: string): boolean;\n}\n\n/**\n * Keyed by the `component` discriminant — not a switch, not a plugin\n * framework (doc §04). Type safety lives at the register()/resolve()\n * generic boundary; internal storage type-erases to `SmartResolver`, the\n * same escape hatch any typed registry needs, isolated to this one\n * function. No component type is privileged: Phase 2's built-in Input/\n * ComboBox/DatePicker/DataGrid resolvers will register through this exact\n * same call an application uses for a custom component.\n *\n * An unresolved `component` value never falls back to an unrelated\n * component (doc §12) — resolve() returns null and warns once per unknown\n * component name, so a field silently disappears from the form instead of\n * rendering the wrong thing.\n */\nexport function createSmartComponentRegistry(): SmartComponentRegistry {\n const resolvers = new Map<string, SmartResolver>();\n const warned = new Set<string>();\n\n return {\n register(component, resolver) {\n resolvers.set(component, resolver as SmartResolver);\n },\n resolve(metadata, ctx) {\n const resolver = resolvers.get(metadata.component);\n if (!resolver) {\n if (!warned.has(metadata.component)) {\n warned.add(metadata.component);\n console.warn(\n `Smart: no resolver registered for component \"${metadata.component}\" (field \"${metadata.name}\"). Skipping.`\n );\n }\n return null;\n }\n return resolver(metadata, ctx);\n },\n has(component) {\n return resolvers.has(component);\n },\n };\n}\n","import type { HttpClient } from \"../remote\";\n\nexport interface SmartDataSourceDefinition {\n url: string;\n /** Defaults to Remote's own defaultHttpClient when omitted, same as RemoteComboBox etc. already do. */\n client?: HttpClient;\n}\n\nexport interface SmartDataSourceRegistry {\n register(id: string, definition: SmartDataSourceDefinition): void;\n resolve(id: string): SmartDataSourceDefinition | undefined;\n}\n\n/**\n * Backs the id-based indirection decided in doc §09/§18 (decision 2):\n * metadata never carries a raw URL, only an id an application registers\n * once. The application owns environment/hostname/auth wiring in one\n * place — Smart never needs to know it exists.\n */\nexport function createSmartDataSourceRegistry(initial?: Record<string, SmartDataSourceDefinition>): SmartDataSourceRegistry {\n const definitions = new Map<string, SmartDataSourceDefinition>(Object.entries(initial ?? {}));\n\n return {\n register(id, definition) {\n definitions.set(id, definition);\n },\n resolve(id) {\n return definitions.get(id);\n },\n };\n}\n","export type SmartActionHandler = () => void;\n\nexport interface SmartActionRegistry {\n register(id: string, handler: SmartActionHandler): void;\n resolve(id: string): SmartActionHandler | undefined;\n}\n\n/**\n * Metadata carries an action id, never a function (doc §08/§11 — no\n * executable code from the server, ever). The application registers the\n * real handler once; Smart only looks it up by id.\n */\nexport function createSmartActionRegistry(): SmartActionRegistry {\n const handlers = new Map<string, SmartActionHandler>();\n\n return {\n register(id, handler) {\n handlers.set(id, handler);\n },\n resolve(id) {\n return handlers.get(id);\n },\n };\n}\n","import type { SmartDataSourceRef, SmartFieldMetadata, SmartFormMetadata, SmartParamValue } from \"./types\";\n\nexport interface UseSmartFieldOptions {\n values: Record<string, unknown>;\n /** Absent = fall back to metadata's raw `label`/`helpText`/etc. strings. */\n translate?: (key: string) => string;\n}\n\nexport interface ResolvedSmartField<M extends SmartFieldMetadata = SmartFieldMetadata> {\n metadata: M;\n visible: boolean;\n readOnly: boolean;\n disabled: boolean;\n required: boolean;\n label?: string;\n placeholder?: string;\n helpText?: string;\n validationMessage?: string;\n /**\n * Only present for metadata carrying a `dataSource` (ComboBox/DataGrid).\n * Resolved from `dataSource.params` + the current `values` snapshot —\n * ready to pass straight through as a Remote component's `params` prop\n * (doc §06). Field-name lookups that miss simply resolve to `undefined`,\n * same as reading a missing key off any plain object.\n */\n params?: Record<string, unknown>;\n}\n\nfunction hasDataSource(metadata: SmartFieldMetadata): metadata is Extract<SmartFieldMetadata, { dataSource: SmartDataSourceRef }> {\n return \"dataSource\" in metadata;\n}\n\nfunction resolveParams(paramDefs: Record<string, SmartParamValue> | undefined, values: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!paramDefs) return undefined;\n const resolved: Record<string, unknown> = {};\n for (const [key, def] of Object.entries(paramDefs)) {\n resolved[key] = def.kind === \"static\" ? def.value : values[def.field];\n }\n return resolved;\n}\n\nfunction resolveText(raw: string | undefined, key: string | undefined, translate: ((key: string) => string) | undefined): string | undefined {\n if (key && translate) return translate(key);\n return raw;\n}\n\n/**\n * Resolves one already-known metadata object. Pure function of its\n * arguments — no React state, no effect, no fetch. Exported separately from\n * `useSmartField` so a component-registry resolver that already holds a\n * specific field's metadata (as `SmartResolver` hands it) can reuse this\n * exact translate/params logic instead of re-deriving it (doc §04's\n * resolvers and `useSmartField`'s by-name lookup are two entry points onto\n * the same resolution, not two implementations).\n */\nexport function resolveSmartFieldMetadata<M extends SmartFieldMetadata = SmartFieldMetadata>(\n metadata: M,\n options: UseSmartFieldOptions\n): ResolvedSmartField<M> {\n const { values, translate } = options;\n\n return {\n metadata,\n visible: metadata.visible ?? true,\n readOnly: metadata.readOnly ?? false,\n disabled: metadata.disabled ?? false,\n required: metadata.required ?? false,\n label: resolveText(metadata.label, metadata.labelKey, translate),\n placeholder: metadata.placeholder,\n helpText: metadata.helpText,\n validationMessage: resolveText(metadata.validationMessage, metadata.validationMessageKey, translate),\n params: hasDataSource(metadata) ? resolveParams(metadata.dataSource.params, values) : undefined,\n };\n}\n\n/**\n * The headless engine every Smart component composes (doc §05/§18 —\n * Smart Runtime owns no canonical state). Looks a field up by name in\n * `formMetadata` and resolves it via `resolveSmartFieldMetadata`. Anything\n * not present in the metadata map is left alone: a field with no matching\n * metadata entry returns `undefined`, meaning \"not driven by metadata,\" not\n * \"hidden.\"\n *\n * A future SmartField component will call this directly, the same way\n * RemoteComboBox composes useRemoteData instead of writing its own effect.\n */\nexport function useSmartField<M extends SmartFieldMetadata = SmartFieldMetadata>(\n name: string,\n formMetadata: SmartFormMetadata | undefined,\n options: UseSmartFieldOptions\n): ResolvedSmartField<M> | undefined {\n const metadata = formMetadata?.fields.find((field) => field.name === name) as M | undefined;\n if (!metadata) return undefined;\n\n return resolveSmartFieldMetadata(metadata, options);\n}\n","import { useEffect, useRef } from \"react\";\n\nconst NO_DEPENDENCIES: readonly string[] = [];\n\nfunction pick(values: Record<string, unknown>, keys: readonly string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of keys) result[key] = values[key];\n return result;\n}\n\n/**\n * Mechanical dependency tracking only (doc §06/§10): watches the fields a\n * piece of metadata declared via `dependsOn` and calls\n * `onMetadataRefreshNeeded` once per field whose value actually changed\n * since the last render. It never evaluates *why* a change matters — that\n * stays server-owned; this hook only decides *when to ask again*.\n *\n * Uses the same \"stable value-based identity\" strategy as useRemoteData's\n * `paramsKey` (serialize, compare by value, not by object/array reference)\n * to avoid the exact infinite-loop failure mode the original architecture\n * doc warns against for Remote's own params.\n */\nexport function useSmartDependencies(\n dependsOn: string[] | undefined,\n values: Record<string, unknown>,\n onMetadataRefreshNeeded?: (changedField: string) => void\n): void {\n const watched = dependsOn ?? NO_DEPENDENCIES;\n const watchedSnapshot = pick(values, watched);\n const watchedKey = watched.length === 0 ? \"\" : JSON.stringify(watchedSnapshot);\n\n const previousRef = useRef<{ key: string; snapshot: Record<string, unknown> } | null>(null);\n const onRefreshRef = useRef(onMetadataRefreshNeeded);\n onRefreshRef.current = onMetadataRefreshNeeded;\n\n useEffect(() => {\n if (watched.length === 0) return;\n const previous = previousRef.current;\n\n if (previous && previous.key !== watchedKey) {\n for (const field of watched) {\n if (!Object.is(previous.snapshot[field], watchedSnapshot[field])) {\n onRefreshRef.current?.(field);\n }\n }\n }\n\n previousRef.current = { key: watchedKey, snapshot: watchedSnapshot };\n // watchedKey (not watched/values) is the intentional dependency — same\n // pattern as useRemoteData's paramsKey.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [watchedKey]);\n}\n","import type { SmartActionRegistry, SmartActionHandler } from \"./actionRegistry\";\nimport type { SmartActionMetadata, SmartFormMetadata } from \"./types\";\n\nexport interface UseSmartActionOptions {\n actions: SmartActionRegistry;\n /** Absent = fall back to metadata's raw `label` string (doc §07). */\n translate?: (key: string) => string;\n}\n\nexport interface ResolvedSmartAction {\n metadata: SmartActionMetadata;\n visible: boolean;\n /**\n * `metadata.enabled` ANDed with \"a handler actually exists\" — metadata\n * saying `enabled: true` cannot make an action clickable if the\n * application never registered a handler for its id (doc §12 fail-safe:\n * an unregistered action renders disabled, never a no-op that looks\n * clickable).\n */\n enabled: boolean;\n label?: string;\n handler?: SmartActionHandler;\n}\n\n/**\n * Resolves one already-known action's metadata. Pure function, mirrors\n * `resolveSmartFieldMetadata` — action metadata carries an id, never a\n * function; the real handler comes from the application-owned\n * `SmartActionRegistry` (doc §08/§16), looked up here by that id.\n */\nexport function resolveSmartActionMetadata(metadata: SmartActionMetadata, options: UseSmartActionOptions): ResolvedSmartAction {\n const { actions, translate } = options;\n const handler = actions.resolve(metadata.id);\n\n return {\n metadata,\n visible: metadata.visible ?? true,\n enabled: (metadata.enabled ?? true) && Boolean(handler),\n label: metadata.labelKey && translate ? translate(metadata.labelKey) : metadata.label,\n handler,\n };\n}\n\n/**\n * Looks an action up by id in `formMetadata.actions` and resolves it via\n * `resolveSmartActionMetadata` — the action-side counterpart of\n * `useSmartField`. Returns `undefined` when no action with that id is\n * declared, the same \"not present = left alone\" convention `useSmartField`\n * uses for fields.\n */\nexport function useSmartAction(id: string, formMetadata: SmartFormMetadata | undefined, options: UseSmartActionOptions): ResolvedSmartAction | undefined {\n const metadata = formMetadata?.actions?.find((action) => action.id === id);\n if (!metadata) return undefined;\n\n return resolveSmartActionMetadata(metadata, options);\n}\n","import { RemoteComboBox } from \"../../remote\";\nimport { resolveSmartFieldMetadata } from \"../useSmartField\";\nimport type { SmartResolver } from \"../componentRegistry\";\nimport type { ComboBoxMetadata } from \"../types\";\n\n/**\n * Composes RemoteComboBox, not ComboBox directly (doc §04 — Base vs. Remote\n * is inferred from the metadata shape: ComboBoxMetadata always carries a\n * `dataSource`, so this field is always remote-backed). RemoteComboBox in\n * turn composes Base ComboBox, so no selection/keyboard/popup behavior is\n * duplicated anywhere in this chain.\n */\nexport const comboBoxResolver: SmartResolver<ComboBoxMetadata> = (metadata, ctx) => {\n const resolved = resolveSmartFieldMetadata(metadata, { values: ctx.values, translate: ctx.translate });\n if (!resolved.visible) return null;\n\n const dataSourceDef = ctx.dataSources.resolve(metadata.dataSource.id);\n if (!dataSourceDef) {\n console.warn(`Smart: no data source registered for id \"${metadata.dataSource.id}\" (field \"${metadata.name}\"). Skipping.`);\n return null;\n }\n\n return (\n <RemoteComboBox\n label={resolved.label}\n url={dataSourceDef.url}\n client={dataSourceDef.client}\n params={resolved.params}\n valueMember={metadata.valueMember}\n displayMember={metadata.displayMember}\n required={resolved.required}\n readOnly={resolved.readOnly}\n disabled={resolved.disabled}\n helpText={resolved.helpText}\n error={resolved.validationMessage}\n value={(ctx.values[metadata.name] as string | number) ?? null}\n onChange={(value) => ctx.onFieldChange(metadata.name, value)}\n />\n );\n};\n","import type { DataGridColumn } from \"../../base\";\nimport { RemoteDataGrid } from \"../../remote\";\nimport { resolveSmartFieldMetadata } from \"../useSmartField\";\nimport type { SmartResolver } from \"../componentRegistry\";\nimport type { DataGridMetadata, SmartDataGridColumn } from \"../types\";\n\ntype SmartRow = Record<string, unknown>;\n\ntype Translate = (key: string) => string;\ntype Formatter = (value: unknown, translate: Translate | undefined) => string;\n\n/**\n * `format` is a closed enum the resolver maps to a small, Smart-owned set\n * of formatters — never a server-supplied function or expression (doc\n * §10/§24). Add a new format here, not a `render` field on the metadata.\n *\n * `boolean` is the one formatter that produces catalog text rather than a\n * locale-formatted value, so it's the one that takes `translate` (doc §07\n * — \"localization polish\"): with a translate function supplied, the\n * reserved keys below are authoritative, same as label/header resolution\n * elsewhere in Smart — no silent English fallback once a catalog exists.\n * `date`/`currency` already localize via `toLocaleString`, a different\n * axis (regional formatting, not a string catalog) that doesn't need one.\n */\nconst FORMATTERS: Record<NonNullable<SmartDataGridColumn[\"format\"]>, Formatter> = {\n text: (value) => (value == null ? \"\" : String(value)),\n boolean: (value, translate) => {\n const key = value ? \"smart.boolean.true\" : \"smart.boolean.false\";\n return translate ? translate(key) : value ? \"Yes\" : \"No\";\n },\n date: (value) => {\n if (value == null || value === \"\") return \"\";\n const date = value instanceof Date ? value : new Date(String(value));\n return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n },\n currency: (value) => {\n const amount = Number(value);\n return Number.isFinite(amount) ? amount.toLocaleString(undefined, { style: \"currency\", currency: \"USD\" }) : String(value ?? \"\");\n },\n};\n\nfunction resolveColumn(column: SmartDataGridColumn, translate: Translate | undefined): DataGridColumn<SmartRow> | null {\n if (column.visible === false) return null;\n const header = column.headerKey && translate ? translate(column.headerKey) : column.header ?? column.key;\n const formatter = column.format ? FORMATTERS[column.format] : undefined;\n\n return {\n key: column.key,\n header,\n sortable: column.sortable,\n render: formatter ? (row) => formatter(row[column.key], translate) : undefined,\n };\n}\n\n/**\n * Composes RemoteDataGrid, not Base DataGrid directly (doc §04 — inferred\n * from `dataSource` the same way ComboBoxMetadata is). Column metadata is\n * translated into a real `DataGridColumn<TRow>[]` and handed straight to\n * the existing grid — no second grid engine, no filtering/grouping DSL\n * (doc §10, matching the original library's own DataGrid scope\n * restraint).\n */\nexport const dataGridResolver: SmartResolver<DataGridMetadata> = (metadata, ctx) => {\n const resolved = resolveSmartFieldMetadata(metadata, { values: ctx.values, translate: ctx.translate });\n if (!resolved.visible) return null;\n\n const dataSourceDef = ctx.dataSources.resolve(metadata.dataSource.id);\n if (!dataSourceDef) {\n console.warn(`Smart: no data source registered for id \"${metadata.dataSource.id}\" (field \"${metadata.name}\"). Skipping.`);\n return null;\n }\n\n const columns = metadata.columns\n .map((column) => resolveColumn(column, ctx.translate))\n .filter((column): column is DataGridColumn<SmartRow> => column !== null);\n\n const totalCountField = metadata.totalCountField;\n const getTotalCount = totalCountField\n ? (response: unknown) => {\n const value = (response as Record<string, unknown> | null)?.[totalCountField];\n return typeof value === \"number\" ? value : undefined;\n }\n : undefined;\n\n return (\n <RemoteDataGrid<SmartRow>\n url={dataSourceDef.url}\n client={dataSourceDef.client}\n params={resolved.params}\n columns={columns}\n rowKey={(row) => row[metadata.rowKey] as string | number}\n getTotalCount={getTotalCount}\n />\n );\n};\n","import { DatePicker } from \"../../base\";\nimport { resolveSmartFieldMetadata } from \"../useSmartField\";\nimport type { SmartResolver } from \"../componentRegistry\";\nimport type { DatePickerMetadata } from \"../types\";\n\n/**\n * `minDate`/`maxDate` are ISO strings in metadata (plain JSON, doc §03 —\n * declarative only) but Base DatePicker's `min`/`max` are `Date` objects;\n * this is the one place that conversion happens. `values[metadata.name]`\n * is expected to already hold a `Date | null`, the same native type\n * DatePicker itself uses — Smart's `values` bag stores each field in its\n * Base component's own value shape, never a serialized form.\n */\nfunction parseIsoDate(value: string | undefined): Date | undefined {\n if (!value) return undefined;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? undefined : date;\n}\n\nexport const datePickerResolver: SmartResolver<DatePickerMetadata> = (metadata, ctx) => {\n const resolved = resolveSmartFieldMetadata(metadata, { values: ctx.values, translate: ctx.translate });\n if (!resolved.visible) return null;\n\n return (\n <DatePicker\n label={resolved.label}\n required={resolved.required}\n readOnly={resolved.readOnly}\n disabled={resolved.disabled}\n helpText={resolved.helpText}\n error={resolved.validationMessage}\n min={parseIsoDate(metadata.minDate)}\n max={parseIsoDate(metadata.maxDate)}\n value={(ctx.values[metadata.name] as Date | null) ?? null}\n onChange={(value) => ctx.onFieldChange(metadata.name, value)}\n />\n );\n};\n","import { Input } from \"../../base\";\nimport { resolveSmartFieldMetadata } from \"../useSmartField\";\nimport type { SmartResolver } from \"../componentRegistry\";\nimport type { InputMetadata } from \"../types\";\n\n/**\n * Composes Base Input (doc §03/§20 — reuse, not a second text-field\n * implementation). The only thing this file owns is translating resolved\n * metadata into Input's existing prop contract.\n */\nexport const inputResolver: SmartResolver<InputMetadata> = (metadata, ctx) => {\n const resolved = resolveSmartFieldMetadata(metadata, { values: ctx.values, translate: ctx.translate });\n if (!resolved.visible) return null;\n\n return (\n <Input\n label={resolved.label}\n required={resolved.required}\n readOnly={resolved.readOnly}\n disabled={resolved.disabled}\n helpText={resolved.helpText}\n placeholder={resolved.placeholder}\n error={resolved.validationMessage}\n maxLength={metadata.maxLength}\n value={(ctx.values[metadata.name] as string) ?? \"\"}\n onChange={(value) => ctx.onFieldChange(metadata.name, value)}\n />\n );\n};\n","import type { SmartComponentRegistry } from \"../componentRegistry\";\nimport { comboBoxResolver } from \"./comboBoxResolver\";\nimport { dataGridResolver } from \"./dataGridResolver\";\nimport { datePickerResolver } from \"./datePickerResolver\";\nimport { inputResolver } from \"./inputResolver\";\n\nexport { comboBoxResolver, dataGridResolver, datePickerResolver, inputResolver };\n\n/**\n * Registers Input/ComboBox/DatePicker/DataGrid through the exact same\n * `register()` call an application uses for a custom component (doc §04 —\n * no privileged core; a custom \"PatientSelector\" resolver is registered\n * the same way).\n */\nexport function registerBuiltInResolvers(registry: SmartComponentRegistry): void {\n registry.register(\"Input\", inputResolver);\n registry.register(\"ComboBox\", comboBoxResolver);\n registry.register(\"DatePicker\", datePickerResolver);\n registry.register(\"DataGrid\", dataGridResolver);\n}\n","import type { ReactElement } from \"react\";\nimport type { SmartRuntimeContext } from \"./runtime\";\nimport type { SmartFieldMetadata } from \"./types\";\nimport { useSmartDependencies } from \"./useSmartDependencies\";\n\nexport interface SmartFieldProps {\n metadata: SmartFieldMetadata;\n ctx: SmartRuntimeContext;\n}\n\n/**\n * Given one field's metadata, resolves it into whatever Base/Remote\n * component its `component` discriminant maps to (doc §09/§14) — it owns\n * no UI of its own, only delegates to `ctx.registry`.\n *\n * Also wires the mechanical dependency tracking every metadata-driven\n * field needs (doc §06): a consuming screen no longer calls\n * useSmartDependencies by hand per field, SmartField does it here and\n * reports which field needed the refresh, not just which value changed.\n */\nexport function SmartField({ metadata, ctx }: SmartFieldProps): ReactElement | null {\n const notifyRefresh = ctx.onMetadataRefreshNeeded;\n useSmartDependencies(\n metadata.dependsOn,\n ctx.values,\n notifyRefresh ? (changedField) => notifyRefresh(metadata.name, changedField) : undefined\n );\n\n if (metadata.visible === false) return null;\n return ctx.registry.resolve(metadata, ctx);\n}\n","import { Alert } from \"../base\";\nimport { SmartField } from \"./SmartField\";\nimport type { SmartRuntimeContext } from \"./runtime\";\nimport type { SmartFormMetadata } from \"./types\";\n\nexport interface SmartFormProps {\n metadata: SmartFormMetadata;\n ctx: SmartRuntimeContext;\n}\n\nconst SUPPORTED_SCHEMA_MAJOR = 1;\n\nfunction isSupportedSchemaVersion(version: string): boolean {\n const major = Number(version.split(\".\")[0]);\n return Number.isFinite(major) && major === SUPPORTED_SCHEMA_MAJOR;\n}\n\n/**\n * A thin iteration helper over SmartField (doc §09/§15/§18 decision 4) —\n * it owns no field values, evaluates no business rule, and decides no\n * layout. Its only two responsibilities: fail the whole form closed on an\n * unsupported schema version instead of rendering a partially-understood\n * form (doc §12, reusing Alert rather than a bespoke error UI), and map\n * each field's metadata to a SmartField.\n *\n * A SmartField used standalone (outside SmartForm) is responsible for its\n * own schemaVersion check — this component is the only place that check\n * happens automatically.\n */\nexport function SmartForm({ metadata, ctx }: SmartFormProps) {\n if (!isSupportedSchemaVersion(metadata.schemaVersion)) {\n return (\n <Alert variant=\"danger\">\n Unsupported form schema version "{metadata.schemaVersion}" — this app understands schema version {SUPPORTED_SCHEMA_MAJOR}.x.\n </Alert>\n );\n }\n\n return (\n <>\n {metadata.fields.map((field) => (\n <SmartField key={field.name} metadata={field} ctx={ctx} />\n ))}\n </>\n );\n}\n","import { Button } from \"../base\";\nimport { resolveSmartActionMetadata } from \"./useSmartAction\";\nimport type { SmartRuntimeContext } from \"./runtime\";\nimport type { SmartActionMetadata } from \"./types\";\n\nexport interface SmartActionProps {\n metadata: SmartActionMetadata;\n ctx: Pick<SmartRuntimeContext, \"actions\" | \"translate\">;\n}\n\n/**\n * Composes Base Button, not a second button implementation (doc §16/§20) —\n * the only component-shaped thing action metadata currently resolves to.\n * Unlike field metadata, an action's `component: \"Button\"` never needs a\n * registry lookup: there is exactly one action UI shape, so there is\n * nothing to resolve between.\n */\nexport function SmartAction({ metadata, ctx }: SmartActionProps) {\n const resolved = resolveSmartActionMetadata(metadata, ctx);\n if (!resolved.visible) return null;\n\n return (\n <Button disabled={!resolved.enabled} onClick={() => resolved.handler?.()}>\n {resolved.label ?? metadata.id}\n </Button>\n );\n}\n","import { SmartAction } from \"./SmartAction\";\nimport type { SmartRuntimeContext } from \"./runtime\";\nimport type { SmartFormMetadata } from \"./types\";\n\nexport interface SmartActionsProps {\n metadata: SmartFormMetadata;\n ctx: Pick<SmartRuntimeContext, \"actions\" | \"translate\">;\n}\n\n/**\n * A thin iteration helper over SmartAction — the action-side counterpart\n * of SmartForm (doc §09/§15). Maps `metadata.actions` to SmartActions and\n * nothing else: no layout, no spacing, no handler logic of its own. The\n * consuming screen wraps this in whatever layout (Stack, a form footer,\n * a toolbar) it needs.\n */\nexport function SmartActions({ metadata, ctx }: SmartActionsProps) {\n if (!metadata.actions || metadata.actions.length === 0) return null;\n\n return (\n <>\n {metadata.actions.map((action) => (\n <SmartAction key={action.id} metadata={action} ctx={ctx} />\n ))}\n </>\n );\n}\n"],"names":["cx","values","Label","htmlFor","required","className","children","jsx","ValidationMessage","error","helpText","FieldShell","id","label","useControllableState","value","defaultValue","onChange","isControlled","isControlledRef","useRef","internalValue","setInternalValue","useState","currentValue","setValue","useCallback","next","Input","props","name","disabled","readOnly","placeholder","onBlur","type","maxLength","autoFocus","inputProps","endAdornment","generatedId","useId","fieldId","control","event","jsxs","TextArea","rows","NumberInput","min","max","step","rest","raw","parsed","PasswordInput","visible","setVisible","prev","FileInput","accept","multiple","BooleanFieldControl","wrapperClassName","role","checked","CheckBox","setChecked","Switch","RadioButton","RadioGroup","options","inline","groupName","option","Select","loading","matched","useEscapeKey","active","onEscape","useEffect","handleKeyDown","Popup","open","onClose","anchorRef","popupRef","handlePointerDown","target","_a","_b","useListNavigation","itemCount","isOpen","onSelect","activeIndex","setActiveIndex","MultiSelect","defaultValues","emptyText","currentValues","setValues","setOpen","selectedSet","close","toggleIndex","index","v","summary","toDateInputValue","date","year","month","day","fromDateInputValue","parts","DatePicker","toTimeInputValue","hours","minutes","fromTimeInputValue","TimePicker","combine","datePart","timePart","time","DateTimePicker","ComboBox","selectedOption","selectIndex","defaultFilter","query","AutoComplete","inputValue","onInputValueChange","filter","internalText","setInternalText","matchFilter","filteredOptions","text","FormField","Modal","title","footer","Fragment","getPageList","current","total","siblingCount","pages","start","end","page","Pagination","currentPage","pageSize","totalItems","onPageChange","totalPages","nextSortDirection","key","DataGrid","columns","rowKey","selectedRowKeys","onSelectionChange","sort","onSortChange","totalCount","selectable","paginated","toggleAll","toggleRow","column","row","Spinner","size","variant","Button","onClick","isDisabled","Alert","dismissible","onDismiss","ToastContext","createContext","DEFAULT_DURATION","ToastProvider","toasts","setToasts","nextId","timers","activeTimers","dismiss","timer","toast","show","message","duration","api","useMemo","useToast","context","useContext","ConfirmContext","ConfirmProvider","pending","setPending","confirm","resolve","settle","result","useConfirm","Badge","pill","Tabs","items","activeKey","defaultActiveKey","currentKey","setKey","activeItem","item","Accordion","openKeys","defaultOpenKeys","currentOpenKeys","setOpenKeys","openSet","toggle","k","Tooltip","content","placement","tooltipId","Popover","Card","header","Divider","vertical","Stack","direction","gap","align","justify","wrap","Container","fluid","Row","Col","span","sm","md","lg","xl","Breadcrumb","isLast","isInteractive","Menu","Stepper","steps","currentStep","status","getInitials","first","last","DIMENSION","Avatar","src","dimension","Tag","onRemove","Skeleton","width","height","circle","Slider","Rating","_","n","ProgressBar","clamped","SIZE_EM","Icon","Navbar","brand","isGroup","section","SidebarLink","Sidebar","sections","PageHeader","description","breadcrumbItems","actions","HttpError","statusText","url","serializeParams","params","searchParams","rawValue","createHttpClient","baseUrl","fetcher","buildRequestInit","requestOptions","fullUrl","init","response","defaultHttpClient","sortKeys","obj","acc","useRemoteData","client","mapResponse","enabled","state","setState","setItems","setError","reloadToken","setReloadToken","paramsKey","latestRequestId","mapResponseRef","requestId","controller","mapped","err","reload","token","useDebouncedValue","delayMs","debounced","setDebounced","defaultArrayNormalization","toSelectOption","valueMember","displayMember","record","RemoteComboBox","comboBoxProps","resolvedError","RemoteAutoComplete","searchParam","minSearchLength","debounceMs","autoCompleteProps","internalSearchText","setInternalSearchText","debouncedSearchText","searchReady","RemoteDataGrid","getTotalCount","dataGridProps","setPage","setSort","isFirstRender","requestParams","lastResponseRef","explicitTotalCount","inferredTotalCount","RemoteSelect","selectProps","RemoteMultiSelect","multiSelectProps","createSmartComponentRegistry","resolvers","warned","component","resolver","metadata","ctx","createSmartDataSourceRegistry","initial","definitions","definition","createSmartActionRegistry","handlers","handler","hasDataSource","resolveParams","paramDefs","resolved","def","resolveText","translate","resolveSmartFieldMetadata","useSmartField","formMetadata","field","NO_DEPENDENCIES","pick","keys","useSmartDependencies","dependsOn","onMetadataRefreshNeeded","watched","watchedSnapshot","watchedKey","previousRef","onRefreshRef","previous","resolveSmartActionMetadata","useSmartAction","action","comboBoxResolver","dataSourceDef","FORMATTERS","amount","resolveColumn","formatter","dataGridResolver","totalCountField","parseIsoDate","datePickerResolver","inputResolver","registerBuiltInResolvers","registry","SmartField","notifyRefresh","changedField","SUPPORTED_SCHEMA_MAJOR","isSupportedSchemaVersion","version","major","SmartForm","SmartAction","SmartActions"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AutoCompleteProps } from '../base';
|
|
2
|
+
import { HttpClient } from './http/HttpClient';
|
|
3
|
+
export interface RemoteAutoCompleteProps<TValue extends string | number = string, TResponse = unknown> extends Omit<AutoCompleteProps<TValue>, "options" | "loading" | "filter"> {
|
|
4
|
+
url: string;
|
|
5
|
+
params?: Record<string, unknown>;
|
|
6
|
+
/** Query-string parameter name the current search text is sent under. */
|
|
7
|
+
searchParam: string;
|
|
8
|
+
valueMember: string;
|
|
9
|
+
displayMember: string;
|
|
10
|
+
mapResponse?: (response: TResponse) => unknown[];
|
|
11
|
+
minSearchLength?: number;
|
|
12
|
+
debounceMs?: number;
|
|
13
|
+
client?: HttpClient;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Adds search input handling (debounce, minimum length, remote loading) to
|
|
17
|
+
* Base AutoComplete by composing it. AutoComplete's own local `filter` is
|
|
18
|
+
* disabled here (`() => true`) because the server has already filtered by
|
|
19
|
+
* `searchParam` — re-filtering client-side would silently drop valid
|
|
20
|
+
* server results whose label doesn't literally contain the query text.
|
|
21
|
+
*/
|
|
22
|
+
export declare function RemoteAutoComplete<TValue extends string | number = string, TResponse = unknown>({ url, params, searchParam, valueMember, displayMember, mapResponse, minSearchLength, debounceMs, client, inputValue, onInputValueChange, ...autoCompleteProps }: RemoteAutoCompleteProps<TValue, TResponse>): import("react").JSX.Element;
|