rich-react-component 0.1.0 → 0.2.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/README.md +4 -2
- package/dist/base/Card.d.ts +15 -1
- package/dist/base/DataGrid.d.ts +27 -3
- package/dist/base/Flex.d.ts +20 -0
- package/dist/base/IconButton.d.ts +14 -0
- package/dist/base/ListItem.d.ts +25 -0
- package/dist/base/Sparkline.d.ts +22 -0
- package/dist/base/Statistic.d.ts +16 -0
- package/dist/base/Tabs.d.ts +20 -3
- package/dist/base/Text.d.ts +21 -0
- package/dist/base/index.d.ts +6 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1179 -893
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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":"wIAAO,SAASA,KAAMC,EAA0D,CAC9E,OAAOA,EAAO,OAAO,OAAO,EAAE,KAAK,GAAG,CACxC,CCSO,SAASC,GAAM,CAAE,QAAAC,EAAS,SAAAC,EAAU,UAAAC,EAAW,SAAAC,GAAwB,CAC5E,cACG,QAAM,CAAA,QAAAH,EAAkB,UAAWH,EAAG,aAAcK,CAAS,EAC3D,SAAA,CAAAC,EACAF,GAAYG,EAAA,IAAC,OAAK,CAAA,UAAU,cAAc,SAAE,KAAA,CAC/C,CAAA,CAAA,CAEJ,CCLO,SAASC,EAAkB,CAAE,MAAAC,EAAO,SAAAC,EAAU,UAAAL,GAAqC,CACpF,OAAAI,QAAe,MAAI,CAAA,UAAWT,EAAG,2BAA4BK,CAAS,EAAI,SAAMI,CAAA,CAAA,EAChFC,QAAkB,MAAI,CAAA,UAAWV,EAAG,YAAaK,CAAS,EAAI,SAASK,CAAA,CAAA,EACpE,IACT,CCSgB,SAAAC,EAAW,CAAE,GAAAC,EAAI,MAAAC,EAAO,SAAAT,EAAU,MAAAK,EAAO,SAAAC,EAAU,UAAAL,EAAW,SAAAC,GAA6B,CACzG,cACG,MAAI,CAAA,UAAWN,EAAG,OAAQK,CAAS,EACjC,SAAA,CAAAQ,GACEN,EAAAA,IAAAL,GAAA,CAAM,QAASU,EAAI,SAAAR,EACjB,SACHS,EAAA,EAEDP,EACDC,EAAAA,IAACC,EAAkB,CAAA,MAAAC,EAAc,SAAAC,CAAoB,CAAA,CACvD,CAAA,CAAA,CAEJ,CCpBO,SAASI,EAAwB,CACtC,MAAAC,EACA,aAAAC,EACA,SAAAC,CACF,EAAwD,CACtD,MAAMC,EAAeH,IAAU,OACzBI,EAAkBC,SAAOF,CAAY,EAEvC,QAAQ,IAAI,WAAa,cAAgBC,EAAgB,UAAYD,GAE/D,QAAA,MACN,wPAAA,EAMJ,KAAM,CAACG,EAAeC,CAAgB,EAAIC,WAAYP,CAAY,EAC5DQ,EAAeN,EAAgBH,EAAcM,EAE7CI,EAAWC,EAAA,YACdC,GAAY,CACNT,GACHI,EAAiBK,CAAI,EAEvBV,GAAA,MAAAA,EAAWU,EACb,EACA,CAACT,EAAcD,CAAQ,CAAA,EAGlB,MAAA,CAACO,EAAcC,CAAQ,CAChC,CCZO,SAASG,EAAMC,EAAmB,CACjC,KAAA,CACJ,GAAAjB,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,YAAAoB,EACA,SAAAvB,EACA,MAAAD,EACA,MAAAM,EACA,aAAAC,EACA,SAAAC,EACA,OAAAiB,EACA,KAAAC,EAAO,OACP,UAAAC,EACA,UAAAC,EACA,WAAAC,EACA,aAAAC,CACE,EAAAV,EAEE,CAACL,EAAcC,CAAQ,EAAIX,EAA6B,CAC5D,MAAAC,EACA,aAAcC,GAAgB,GAC9B,SAAAC,CAAA,CACD,EAEKuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEhBG,EACJpC,EAAA,IAAC,QAAA,CACC,GAAImC,EACJ,KAAAZ,EACA,UAAW9B,EAAG,eAAgBS,GAAS,YAAY,EACnD,SAAAsB,EACA,SAAAC,EACA,SAAA5B,EACA,YAAA6B,EACA,UAAAG,EACA,UAAAC,EACA,MAAOb,EACP,SAAWoB,GAAUnB,EAASmB,EAAM,OAAO,KAAK,EAChD,OAAAV,EACA,KAAAC,EACC,GAAGG,CAAA,CAAA,EAIR,OACG/B,EAAAA,IAAAI,EAAA,CAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC1F,SAAAkC,EACEM,EAAA,KAAA,MAAA,CAAI,UAAU,cACZ,SAAA,CAAAF,EACAJ,CAAA,EACH,EAEAI,CAEJ,CAAA,CAEJ,CCrFO,SAASG,GAASjB,EAAsB,CACvC,KAAA,CACJ,GAAAjB,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,YAAAoB,EACA,SAAAvB,EACA,MAAAD,EACA,MAAAM,EACA,aAAAC,EACA,SAAAC,EACA,OAAAiB,EACA,KAAAa,EAAO,EACP,UAAAX,CACE,EAAAP,EAEE,CAACL,EAAcC,CAAQ,EAAIX,EAA6B,CAC5D,MAAAC,EACA,aAAcC,GAAgB,GAC9B,SAAAC,CAAA,CACD,EAEKuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAGpB,OAAAjC,MAACI,GAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAE,EAAA,IAAC,WAAA,CACC,GAAImC,EACJ,KAAAZ,EACA,UAAW9B,EAAG,eAAgBS,GAAS,YAAY,EACnD,SAAAsB,EACA,SAAAC,EACA,SAAA5B,EACA,YAAA6B,EACA,KAAAc,EACA,UAAAX,EACA,MAAOZ,EACP,SAAWoB,GAAUnB,EAASmB,EAAM,OAAO,KAAK,EAChD,OAAAV,CAAA,CAEJ,CAAA,CAAA,CAEJ,CC1CgB,SAAAc,GAAY,CAAE,MAAAjC,EAAO,aAAAC,EAAc,SAAAC,EAAU,IAAAgC,EAAK,IAAAC,EAAK,KAAAC,EAAM,GAAGC,GAA0B,CACxG,KAAM,CAAC5B,EAAcC,CAAQ,EAAIX,EAAoC,CACnE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EAGC,OAAAV,EAAA,IAACqB,EAAA,CACE,GAAGwB,EACJ,MAAO5B,IAAiB,KAAO,GAAK,OAAOA,CAAY,EACvD,SAAW6B,GAAQ,CACb,GAAAA,EAAI,KAAK,IAAM,GAAI,CACrB5B,EAAS,IAAI,EACb,MACF,CACM,MAAA6B,EAAS,OAAOD,CAAG,EACpB,OAAO,MAAMC,CAAM,GAAG7B,EAAS6B,CAAM,CAC5C,EACA,WAAY,CAAE,UAAW,UAAW,IAAAL,EAAK,IAAAC,EAAK,KAAAC,CAAK,CAAA,CAAA,CAGzD,CC/BO,SAASI,GAAc1B,EAA2B,CACvD,KAAM,CAAC2B,EAASC,CAAU,EAAIlC,WAAS,EAAK,EAG1C,OAAAhB,EAAA,IAACqB,EAAA,CACE,GAAGC,EACJ,WAAY,CAAE,KAAM2B,EAAU,OAAS,WAAY,aAAc,kBAAmB,EACpF,aACEjD,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,4BACV,aAAYiD,EAAU,gBAAkB,gBACxC,eAAcA,EACd,QAAS,IAAMC,EAAYC,GAAS,CAACA,CAAI,EAExC,WAAU,OAAS,MAAA,CACtB,CAAA,CAAA,CAIR,CCRO,SAASC,GAAU,CAAE,GAAA/C,EAAI,KAAAkB,EAAM,SAAAC,EAAU,SAAA3B,EAAU,UAAAC,EAAW,MAAAQ,EAAO,SAAAH,EAAU,MAAAD,EAAO,OAAAmD,EAAQ,SAAAC,EAAU,SAAA5C,GAA4B,CACzI,MAAMuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAGpB,OAAAjC,MAACI,GAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAE,EAAA,IAAC,QAAA,CACC,GAAImC,EACJ,KAAAZ,EACA,KAAK,OACL,UAAW9B,EAAG,eAAgBS,GAAS,YAAY,EACnD,SAAAsB,EACA,SAAA3B,EACA,OAAAwD,EACA,SAAAC,EACA,SAAWjB,GAAU3B,GAAA,YAAAA,EAAW2B,EAAM,OAAO,MAAK,CAEtD,CAAA,CAAA,CAEJ,CChBO,SAASkB,GAAoB,CAClC,GAAAlD,EACA,KAAAkB,EACA,SAAAC,EACA,SAAA3B,EACA,iBAAA2D,EACA,KAAAC,EACA,MAAAnD,EACA,SAAAH,EACA,MAAAD,EACA,QAAAwD,EACA,SAAAhD,EACA,UAAAZ,CACF,EAA6B,CAC3B,MAAMmC,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEtB,cACG,MAAI,CAAA,UAAWxC,EAAG+D,EAAkB1D,CAAS,EAC5C,SAAA,CAAAE,EAAA,IAAC,QAAA,CACC,GAAImC,EACJ,KAAAZ,EACA,KAAK,WACL,KAAAkC,EACA,UAAWhE,EAAG,mBAAoBS,GAAS,YAAY,EACvD,SAAAsB,EACA,SAAA3B,EACA,QAAA6D,EACA,SAAWrB,GAAU3B,EAAS2B,EAAM,OAAO,OAAO,CAAA,CACpD,EACC/B,GACEN,EAAAA,IAAA,QAAA,CAAM,QAASmC,EAAS,UAAU,mBAChC,SACH7B,EAAA,EAEFN,EAAAA,IAACC,EAAkB,CAAA,MAAAC,EAAc,SAAAC,CAAoB,CAAA,CACvD,CAAA,CAAA,CAEJ,CC5CO,SAASwD,GAASrC,EAAsB,CAC7C,KAAM,CAACoC,EAASE,CAAU,EAAIrD,EAA8B,CAC1D,MAAOe,EAAM,QACb,aAAcA,EAAM,gBAAkB,GACtC,SAAUA,EAAM,QAAA,CACjB,EAGC,OAAAtB,EAAA,IAACuD,GAAA,CACC,GAAIjC,EAAM,GACV,KAAMA,EAAM,KACZ,SAAUA,EAAM,SAChB,SAAUA,EAAM,SAChB,UAAWA,EAAM,UACjB,iBAAiB,kBACjB,MAAOA,EAAM,MACb,SAAUA,EAAM,SAChB,MAAOA,EAAM,MACb,QAAAoC,EACA,SAAUE,CAAA,CAAA,CAGhB,CCvBO,SAASC,GAAOvC,EAAoB,CACzC,KAAM,CAACoC,EAASE,CAAU,EAAIrD,EAA8B,CAC1D,MAAOe,EAAM,QACb,aAAcA,EAAM,gBAAkB,GACtC,SAAUA,EAAM,QAAA,CACjB,EAGC,OAAAtB,EAAA,IAACuD,GAAA,CACC,GAAIjC,EAAM,GACV,KAAMA,EAAM,KACZ,SAAUA,EAAM,SAChB,SAAUA,EAAM,SAChB,UAAWA,EAAM,UACjB,iBAAiB,8BACjB,KAAK,SACL,MAAOA,EAAM,MACb,SAAUA,EAAM,SAChB,MAAOA,EAAM,MACb,QAAAoC,EACA,SAAUE,CAAA,CAAA,CAGhB,CCrBO,SAASE,GAAqD,CACnE,GAAAzD,EACA,KAAAkB,EACA,MAAAf,EACA,MAAAF,EACA,QAAAoD,EACA,SAAAlC,EACA,UAAA1B,EACA,SAAAY,CACF,EAA6B,CAC3B,MAAMuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEtB,cACG,MAAI,CAAA,UAAWxC,EAAG,aAAcK,CAAS,EACxC,SAAA,CAAAE,EAAA,IAAC,QAAA,CACC,GAAImC,EACJ,KAAAZ,EACA,KAAK,QACL,UAAU,mBACV,MAAO,OAAOf,CAAK,EACnB,QAAAkD,EACA,SAAAlC,EACA,SAAU,IAAMd,GAAA,YAAAA,EAAWF,EAAK,CAClC,EACCF,GACEN,EAAAA,IAAA,QAAA,CAAM,QAASmC,EAAS,UAAU,mBAChC,SACH7B,EAAA,CAEJ,CAAA,CAAA,CAEJ,CCjCO,SAASyD,GAAoD,CAClE,QAAAC,EACA,MAAAxD,EACA,aAAAC,EACA,SAAAC,EACA,OAAAuD,EACA,GAAA5D,EACA,KAAAkB,EACA,SAAAC,EACA,SAAA3B,EACA,UAAAC,EACA,MAAAQ,EACA,SAAAH,EACA,MAAAD,CACF,EAA4B,CAC1B,KAAM,CAACe,EAAcC,CAAQ,EAAIX,EAAoC,CACnE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAWW,GAAS,CACdA,IAAS,OAAMV,GAAA,MAAAA,EAAWU,GAChC,CAAA,CACD,EAEKa,EAAcC,EAAAA,QACdgC,EAAY3C,GAAQlB,GAAM4B,EAG9B,OAAAjC,EAAA,IAACI,GAAW,MAAAE,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC9E,SAACE,EAAAA,IAAA,MAAA,CAAI,KAAK,aAAa,aAAYM,EAAO,gBAAeT,EAAU,UAAWJ,EAAGwE,GAAU,cAAc,EACtG,SAAAD,EAAQ,IAAKG,GACZnE,EAAA,IAAC8D,GAAA,CAEC,KAAMI,EACN,MAAOC,EAAO,MACd,MAAOA,EAAO,MACd,QAASA,EAAO,QAAUlD,EAC1B,SAAUO,GAAY2C,EAAO,SAC7B,SAAW/C,GAASF,EAASE,CAAI,CAAA,EAN5B,OAAO+C,EAAO,KAAK,CAAA,CAQ3B,EACH,CACF,CAAA,CAEJ,CClCO,SAASC,GAAgD,CAC9D,QAAAJ,EACA,MAAAxD,EACA,aAAAC,EACA,SAAAC,EACA,YAAAgB,EACA,QAAA2C,EACA,GAAAhE,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,SAAAH,EACA,MAAAD,CACF,EAAwB,CACtB,KAAM,CAACe,EAAcC,CAAQ,EAAIX,EAAoC,CACnE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EAEKuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAGpB,OAAAjC,MAACI,GAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAwC,EAAA,KAAC,SAAA,CACC,GAAIH,EACJ,KAAAZ,EACA,UAAW9B,EAAG,cAAeS,GAAS,YAAY,EAClD,SAAUsB,GAAYC,GAAY4C,EAClC,SAAAxE,EACA,MAAOoB,IAAiB,KAAO,GAAK,OAAOA,CAAY,EACvD,SAAWoB,GAAU,CACb,MAAAS,EAAMT,EAAM,OAAO,MACzB,GAAIS,IAAQ,GAAI,CACd5B,EAAS,IAAI,EACb,MACF,CACM,MAAAoD,EAAUN,EAAQ,KAAMG,GAAW,OAAOA,EAAO,KAAK,IAAMrB,CAAG,EAC5D5B,EAAAoD,EAAUA,EAAQ,MAAQ,IAAI,CACzC,EAEC,SAAA,CAAAD,GAAYrE,EAAA,IAAA,SAAA,CAAO,MAAM,GAAG,SAAQ,WAAA,EACpC,CAACqE,GAAW3C,SAAgB,SAAO,CAAA,MAAM,GAAI,SAAYA,EAAA,EACzDsC,EAAQ,IAAKG,SACX,SAAkC,CAAA,MAAO,OAAOA,EAAO,KAAK,EAAG,SAAUA,EAAO,SAC9E,SAAOA,EAAA,KAAA,EADG,OAAOA,EAAO,KAAK,CAEhC,CACD,CAAA,CAAA,CAEL,CAAA,CAAA,CAEJ,CCjFgB,SAAAI,EAAaC,EAAiBC,EAA4B,CACxEC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACF,EAAQ,OACb,SAASG,EAActC,EAAsB,CACvCA,EAAM,MAAQ,UAAmBoC,GACvC,CACS,gBAAA,iBAAiB,UAAWE,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CAAA,EACjE,CAACH,EAAQC,CAAQ,CAAC,CACvB,CCgBgB,SAAAG,EAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,UAAAjF,EAAW,KAAA2D,EAAM,SAAA1D,GAAwB,CACnF,MAAAiF,EAAWnE,SAAuB,IAAI,EAgB5C,OAdA0D,EAAaM,EAAMC,CAAO,EAE1BJ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACG,EAAM,OACX,SAASI,EAAkB5C,EAAmB,SAC5C,MAAM6C,EAAS7C,EAAM,QACjB8C,EAAAH,EAAS,UAAT,MAAAG,EAAkB,SAASD,KAC3BE,EAAAL,EAAU,UAAV,MAAAK,EAAmB,SAASF,IACxBJ,GACV,CACS,gBAAA,iBAAiB,YAAaG,CAAiB,EACjD,IAAM,SAAS,oBAAoB,YAAaA,CAAiB,CACvE,EAAA,CAACJ,EAAMC,EAASC,CAAS,CAAC,EAExBF,EAGH7E,EAAA,IAAC,MAAI,CAAA,IAAKgF,EAAU,UAAWvF,EAAG,OAAQK,CAAS,EAAG,KAAA2D,EACnD,SAAA1D,CACH,CAAA,EALgB,IAOpB,CC/BO,SAASsF,EAAkB,CAChC,UAAAC,EACA,OAAAC,EACA,SAAAC,EACA,QAAAV,CACF,EAAsD,CACpD,KAAM,CAACW,EAAaC,CAAc,EAAI1E,EAAAA,SAAS,EAAE,EAEjD0D,EAAAA,UAAU,IAAM,CACTa,GAAQG,EAAe,EAAE,CAAA,EAC7B,CAACH,CAAM,CAAC,EAEXhB,EAAagB,EAAQT,CAAO,EAE5B,MAAMH,EAAgBxD,EAAA,YACnBkB,GAAyB,CACxB,GAAI,CAACkD,EAAQ,EACPlD,EAAM,MAAQ,aAAeA,EAAM,MAAQ,UAC7CA,EAAM,eAAe,EAEvB,MACF,CACA,OAAQA,EAAM,IAAK,CACjB,IAAK,YACHA,EAAM,eAAe,EACrBqD,EAAgBvC,GAAUmC,IAAc,EAAI,IAAMnC,EAAO,GAAKmC,CAAU,EACxE,MACF,IAAK,UACHjD,EAAM,eAAe,EACNqD,EAACvC,GAAUmC,IAAc,EAAI,IAAMnC,EAAO,EAAImC,GAAaA,CAAU,EACpF,MACF,IAAK,OACHjD,EAAM,eAAe,EACNqD,EAAAJ,IAAc,EAAI,GAAK,CAAC,EACvC,MACF,IAAK,MACHjD,EAAM,eAAe,EACrBqD,EAAeJ,IAAc,EAAI,GAAKA,EAAY,CAAC,EACnD,MACF,IAAK,QACCG,GAAe,IACjBpD,EAAM,eAAe,EACrBmD,EAASC,CAAW,GAEtB,KAGJ,CACF,EACA,CAACF,EAAQD,EAAWG,EAAaD,CAAQ,CAAA,EAGpC,MAAA,CAAE,YAAAC,EAAa,eAAAC,EAAgB,cAAAf,EACxC,CC1CO,SAASgB,GAAqD,CACnE,QAAA3B,EACA,OAAAtE,EACA,cAAAkG,EACA,SAAAlF,EACA,QAAA2D,EACA,UAAAwB,EAAY,aACZ,GAAAxF,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,YAAAoB,EAAc,YACd,SAAAvB,EACA,MAAAD,CACF,EAA6B,CAC3B,KAAM,CAAC4F,EAAeC,CAAS,EAAIxF,EAA+B,CAChE,MAAOb,EACP,aAAckG,GAAiB,CAAC,EAChC,SAAAlF,CAAA,CACD,EACK,CAACmE,EAAMmB,CAAO,EAAIhF,WAAS,EAAK,EAChC+D,EAAYlE,SAA0B,IAAI,EAC1CoB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEhBgE,EAAc,IAAI,IAAIH,CAAa,EAEnCI,EAAQ/E,EAAAA,YAAY,IAAM6E,EAAQ,EAAK,EAAG,CAAA,CAAE,EAC5CG,EAAchF,EAAA,YACjBiF,GAAkB,CACX,MAAAjC,EAASH,EAAQoC,CAAK,EACxB,GAAA,CAACjC,GAAUA,EAAO,SAAU,OAChC,MAAM/C,EAAO6E,EAAY,IAAI9B,EAAO,KAAK,EACrC2B,EAAc,OAAQO,GAAMA,IAAMlC,EAAO,KAAK,EAC9C,CAAC,GAAG2B,EAAe3B,EAAO,KAAK,EACnC4B,EAAU3E,CAAI,CAChB,EACA,CAAC4C,EAAS8B,EAAeG,EAAaF,CAAS,CAAA,EAG3C,CAAE,YAAAN,EAAa,eAAAC,EAAgB,cAAAf,CAAA,EAAkBU,EAAkB,CACvE,UAAWrB,EAAQ,OACnB,OAAQa,EACR,SAAUsB,EACV,QAASD,CAAA,CACV,EAGKI,EADkBtC,EAAQ,OAAQG,GAAW8B,EAAY,IAAI9B,EAAO,KAAK,CAAC,EAChD,IAAKA,GAAWA,EAAO,KAAK,EAAE,KAAK,IAAI,EAEvE,OACGnE,EAAAA,IAAAI,EAAA,CAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAwC,OAAC,MAAI,CAAA,UAAU,oBACb,SAAA,CAAAtC,EAAA,IAAC,SAAA,CACC,IAAK+E,EACL,GAAI5C,EACJ,KAAK,SACL,KAAAZ,EACA,UAAW9B,EAAG,yBAA0BS,GAAS,YAAY,EAC7D,SAAUsB,GAAYC,EACtB,gBAAc,UACd,gBAAeoD,EACf,QAAS,IAAMmB,EAAS7C,GAAS,CAACA,CAAI,EACtC,UAAWwB,EAEV,SAAW2B,GAAAtG,EAAAA,IAAC,OAAK,CAAA,UAAU,sBAAuB,SAAY0B,EAAA,CAAA,CACjE,EACC1B,EAAA,IAAA4E,EAAA,CAAM,KAAAC,EAAY,QAASqB,EAAO,UAAAnB,EAAsB,UAAU,sBAAsB,KAAK,UAC3F,SACCV,EAAArE,EAAA,IAAC,OAAI,UAAU,gCAAgC,SAAQ,UAAA,CAAA,EACrDgE,EAAQ,SAAW,EACrBhE,EAAA,IAAC,MAAI,CAAA,UAAU,gCAAiC,SAAA6F,CAAA,CAAU,EAE1D7B,EAAQ,IAAI,CAACG,EAAQiC,IACnB9D,EAAA,KAAC,MAAA,CAEC,KAAK,SACL,gBAAe2D,EAAY,IAAI9B,EAAO,KAAK,EAC3C,UAAW1E,EACT,gDACA2G,IAAUX,GAAe,SACzBtB,EAAO,UAAY,UACrB,EACA,aAAc,IAAMuB,EAAeU,CAAK,EACxC,YAAc/D,GAAU,CACtBA,EAAM,eAAe,EAChB8B,EAAO,UAAUgC,EAAYC,CAAK,CACzC,EAEA,SAAA,CAAApG,EAAA,IAAC,QAAM,CAAA,KAAK,WAAW,UAAU,uBAAuB,QAASiG,EAAY,IAAI9B,EAAO,KAAK,EAAG,SAAQ,GAAC,SAAU,GAAI,EACtHA,EAAO,KAAA,CAAA,EAfH,OAAOA,EAAO,KAAK,CAiB3B,CAAA,EAEL,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CCpHO,SAASoC,EAAiBC,EAAuC,CACtE,GAAI,CAACA,EAAa,MAAA,GACZ,MAAAC,EAAOD,EAAK,cACZE,EAAQ,OAAOF,EAAK,SAAA,EAAa,CAAC,EAAE,SAAS,EAAG,GAAG,EACnDG,EAAM,OAAOH,EAAK,QAAS,CAAA,EAAE,SAAS,EAAG,GAAG,EAClD,MAAO,GAAGC,CAAI,IAAIC,CAAK,IAAIC,CAAG,EAChC,CAEO,SAASC,EAAmB9D,EAA0B,CAC3D,GAAI,CAACA,EAAY,OAAA,KACjB,MAAM+D,EAAQ/D,EAAI,MAAM,GAAG,EAAE,IAAI,MAAM,EACjC,CAAC2D,EAAMC,EAAOC,CAAG,EAAIE,EAC3B,MAAI,CAACJ,GAAQ,CAACC,GAAS,CAACC,EAAY,KAC7B,IAAI,KAAKF,EAAMC,EAAQ,EAAGC,CAAG,CACtC,CASgB,SAAAG,GAAW,CAAE,MAAAtG,EAAO,aAAAC,EAAc,SAAAC,EAAU,IAAAgC,EAAK,IAAAC,EAAK,GAAGE,GAAyB,CAChG,KAAM,CAAC5B,EAAcC,CAAQ,EAAIX,EAAkC,CACjE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EAGC,OAAAV,EAAA,IAACqB,EAAA,CACE,GAAGwB,EACJ,MAAO0D,EAAiBtF,CAAY,EACpC,SAAW6B,GAAQ5B,EAAS0F,EAAmB9D,CAAG,CAAC,EACnD,WAAY,CACV,KAAM,OACN,IAAKJ,EAAM6D,EAAiB7D,CAAG,EAAI,OACnC,IAAKC,EAAM4D,EAAiB5D,CAAG,EAAI,MACrC,CAAA,CAAA,CAGN,CCvCO,SAASoE,GAAiBP,EAAuC,CACtE,GAAI,CAACA,EAAa,MAAA,GACZ,MAAAQ,EAAQ,OAAOR,EAAK,SAAU,CAAA,EAAE,SAAS,EAAG,GAAG,EAC/CS,EAAU,OAAOT,EAAK,WAAY,CAAA,EAAE,SAAS,EAAG,GAAG,EAClD,MAAA,GAAGQ,CAAK,IAAIC,CAAO,EAC5B,CAEO,SAASC,GAAmBpE,EAA0B,CAC3D,GAAI,CAACA,EAAY,OAAA,KACX,KAAA,CAACkE,EAAOC,CAAO,EAAInE,EAAI,MAAM,GAAG,EAAE,IAAI,MAAM,EAC9C,OAAAkE,IAAU,QAAaC,IAAY,QAAa,OAAO,MAAMD,CAAK,GAAK,OAAO,MAAMC,CAAO,EAAU,KAClG,IAAI,KAAK,KAAM,EAAG,EAAGD,EAAOC,EAAS,EAAG,CAAC,CAClD,CAGgB,SAAAE,GAAW,CAAE,MAAA3G,EAAO,aAAAC,EAAc,SAAAC,EAAU,KAAAkC,EAAM,GAAGC,GAAyB,CAC5F,KAAM,CAAC5B,EAAcC,CAAQ,EAAIX,EAAkC,CACjE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EAGC,OAAAV,EAAA,IAACqB,EAAA,CACE,GAAGwB,EACJ,MAAOkE,GAAiB9F,CAAY,EACpC,SAAW6B,GAAQ5B,EAASgG,GAAmBpE,CAAG,CAAC,EACnD,WAAY,CAAE,KAAM,OAAQ,KAAAF,CAAK,CAAA,CAAA,CAGvC,CClCA,SAASwE,GAAQC,EAAkBC,EAA+B,CAC1D,MAAAd,EAAOI,EAAmBS,CAAQ,EACxC,GAAI,CAACb,EAAa,OAAA,KACZ,MAAAe,EAAOL,GAAmBI,GAAY,OAAO,EAC/C,OAAAC,GAAWf,EAAA,SAASe,EAAK,SAAS,EAAGA,EAAK,WAAW,EAAG,EAAG,CAAC,EACzDf,CACT,CAUO,SAASgB,GAAe,CAC7B,MAAAhH,EACA,aAAAC,EACA,SAAAC,EACA,IAAAgC,EACA,IAAAC,EACA,GAAAtC,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,SAAAH,EACA,MAAAD,CACF,EAAwB,CACtB,KAAM,CAACe,EAAcC,CAAQ,EAAIX,EAAkC,CACjE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EAEKuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEhBoF,EAAWd,EAAiBtF,CAAY,EACxCqG,EAAWP,GAAiB9F,CAAY,EAE9C,OACGjB,EAAAA,IAAAI,EAAA,CAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAwC,OAAC,MAAI,CAAA,UAAU,eACb,SAAA,CAAAtC,EAAA,IAAC,QAAA,CACC,GAAImC,EACJ,KAAMZ,EAAO,GAAGA,CAAI,QAAU,OAC9B,KAAK,OACL,UAAW9B,EAAG,eAAgBS,GAAS,YAAY,EACnD,SAAAsB,EACA,SAAAC,EACA,SAAA5B,EACA,IAAK6C,EAAM6D,EAAiB7D,CAAG,EAAI,OACnC,IAAKC,EAAM4D,EAAiB5D,CAAG,EAAI,OACnC,MAAO0E,EACP,SAAWhF,GAAUnB,EAASkG,GAAQ/E,EAAM,OAAO,MAAOiF,CAAQ,CAAC,CAAA,CACrE,EACAtH,EAAA,IAAC,QAAA,CACC,KAAMuB,EAAO,GAAGA,CAAI,QAAU,OAC9B,KAAK,OACL,UAAW9B,EAAG,eAAgBS,GAAS,YAAY,EACnD,SAAAsB,EACA,SAAAC,EACA,SAAA5B,EACA,MAAOyH,EACP,SAAWjF,GAAUnB,EAASkG,GAAQC,GAAYd,EAAqB,IAAA,IAAM,EAAGlE,EAAM,OAAO,KAAK,CAAC,CAAA,CACrG,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CChEO,SAASoF,GAAkD,CAChE,QAAAzD,EACA,MAAAxD,EACA,aAAAC,EACA,SAAAC,EACA,QAAA2D,EACA,UAAAwB,EAAY,aACZ,GAAAxF,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,YAAAoB,EAAc,YACd,SAAAvB,EACA,MAAAD,CACF,EAA0B,CACxB,KAAM,CAACe,EAAcC,CAAQ,EAAIX,EAAoC,CACnE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EACK,CAACmE,EAAMmB,CAAO,EAAIhF,WAAS,EAAK,EAChC+D,EAAYlE,SAA0B,IAAI,EAC1CoB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEhByF,EAAiB1D,EAAQ,KAAMG,GAAWA,EAAO,QAAUlD,CAAY,GAAK,KAE5EiF,EAAQ/E,EAAAA,YAAY,IAAM6E,EAAQ,EAAK,EAAG,CAAA,CAAE,EAC5C2B,EAAcxG,EAAA,YACjBiF,GAAkB,CACX,MAAAjC,EAASH,EAAQoC,CAAK,EACxB,CAACjC,GAAUA,EAAO,WACtBjD,EAASiD,EAAO,KAAK,EACf+B,IACR,EACA,CAAClC,EAAS9C,EAAUgF,CAAK,CAAA,EAGrB,CAAE,YAAAT,EAAa,eAAAC,EAAgB,cAAAf,CAAA,EAAkBU,EAAkB,CACvE,UAAWrB,EAAQ,OACnB,OAAQa,EACR,SAAU8C,EACV,QAASzB,CAAA,CACV,EAED,OACGlG,EAAAA,IAAAI,EAAA,CAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAwC,OAAC,MAAI,CAAA,UAAU,oBACb,SAAA,CAAAtC,EAAA,IAAC,SAAA,CACC,IAAK+E,EACL,GAAI5C,EACJ,KAAK,SACL,KAAAZ,EACA,UAAW9B,EAAG,yBAA0BS,GAAS,YAAY,EAC7D,SAAUsB,GAAYC,EACtB,gBAAc,UACd,gBAAeoD,EACf,QAAS,IAAMmB,EAAS7C,GAAS,CAACA,CAAI,EACtC,UAAWwB,EAEV,WAAiB+C,EAAe,YAAS,OAAK,CAAA,UAAU,sBAAuB,SAAYhG,CAAA,CAAA,CAAA,CAC9F,EACC1B,EAAA,IAAA4E,EAAA,CAAM,KAAAC,EAAY,QAASqB,EAAO,UAAAnB,EAAsB,UAAU,sBAAsB,KAAK,UAC3F,SACCV,EAAArE,EAAA,IAAC,OAAI,UAAU,gCAAgC,SAAQ,UAAA,CAAA,EACrDgE,EAAQ,SAAW,EACrBhE,EAAA,IAAC,MAAI,CAAA,UAAU,gCAAiC,SAAA6F,CAAA,CAAU,EAE1D7B,EAAQ,IAAI,CAACG,EAAQiC,IACnBpG,EAAA,IAAC,MAAA,CAEC,KAAK,SACL,gBAAemE,EAAO,QAAUlD,EAChC,UAAWxB,EAAG,gBAAiB2G,IAAUX,GAAe,SAAUtB,EAAO,UAAY,UAAU,EAC/F,aAAc,IAAMuB,EAAeU,CAAK,EACxC,YAAc/D,GAAU,CACtBA,EAAM,eAAe,EAChB8B,EAAO,UAAUwD,EAAYvB,CAAK,CACzC,EAEC,SAAOjC,EAAA,KAAA,EAVH,OAAOA,EAAO,KAAK,CAY3B,CAAA,EAEL,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CCzFA,SAASyD,GAA8CzD,EAA8B0D,EAAwB,CAC3G,OAAKA,EACE1D,EAAO,MAAM,YAAA,EAAc,SAAS0D,EAAM,aAAa,EAD3C,EAErB,CAEO,SAASC,GAAsD,CACpE,QAAA9D,EACA,MAAAxD,EACA,aAAAC,EACA,SAAAC,EACA,WAAAqH,EACA,mBAAAC,EACA,QAAA3D,EACA,UAAAwB,EAAY,aACZ,OAAAoC,EACA,GAAA5H,EACA,KAAAkB,EACA,SAAAC,EACA,SAAAC,EACA,SAAA5B,EACA,UAAAC,EACA,MAAAQ,EACA,YAAAoB,EACA,SAAAvB,EACA,MAAAD,CACF,EAA8B,CAC5B,KAAM,CAACe,EAAcC,CAAQ,EAAIX,EAAoC,CACnE,MAAAC,EACA,aAAcC,GAAgB,KAC9B,SAAAC,CAAA,CACD,EACKgH,EAAiB1D,EAAQ,KAAMG,GAAWA,EAAO,QAAUlD,CAAY,GAAK,KAE5E,CAACiH,EAAcC,CAAe,EAAI5H,EAA6B,CACnE,MAAOwH,EACP,cAAcL,GAAA,YAAAA,EAAgB,QAAS,GACvC,SAAUM,CAAA,CACX,EAEK,CAACnD,EAAMmB,CAAO,EAAIhF,WAAS,EAAK,EAChC+D,EAAYlE,SAAyB,IAAI,EACzCoB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAEhBmG,EAAcH,GAAUL,GACxBS,EAAkBrE,EAAQ,OAAQG,GAAWiE,EAAYjE,EAAQ+D,CAAY,CAAC,EAE9EhC,EAAQ/E,EAAAA,YAAY,IAAM6E,EAAQ,EAAK,EAAG,CAAA,CAAE,EAC5C2B,EAAcxG,EAAA,YACjBiF,GAAkB,CACX,MAAAjC,EAASkE,EAAgBjC,CAAK,EAChC,CAACjC,GAAUA,EAAO,WACtBjD,EAASiD,EAAO,KAAK,EACrBgE,EAAgBhE,EAAO,KAAK,EACtB+B,IACR,EACA,CAACmC,EAAiBnH,EAAUiH,EAAiBjC,CAAK,CAAA,EAG9C,CAAE,YAAAT,EAAa,eAAAC,EAAgB,cAAAf,EAAA,EAAkBU,EAAkB,CACvE,UAAWgD,EAAgB,OAC3B,OAAQxD,EACR,SAAU8C,EACV,QAASzB,CAAA,CACV,EAED,OACGlG,EAAAA,IAAAI,EAAA,CAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAAwC,OAAC,MAAI,CAAA,UAAU,oBACb,SAAA,CAAAtC,EAAA,IAAC,QAAA,CACC,IAAK+E,EACL,GAAI5C,EACJ,KAAAZ,EACA,KAAK,OACL,UAAW9B,EAAG,eAAgBS,GAAS,YAAY,EACnD,SAAAsB,EACA,SAAAC,EACA,SAAA5B,EACA,YAAA6B,EACA,aAAa,MACb,KAAK,WACL,gBAAemD,EACf,gBAAc,UACd,MAAOqD,EACP,QAAS,IAAMlC,EAAQ,EAAI,EAC3B,SAAW3D,GAAU,CACb,MAAAiG,EAAOjG,EAAM,OAAO,MAC1B8F,EAAgBG,CAAI,EACpBtC,EAAQ,EAAI,EACR/E,IAAiB,MAAMC,EAAS,IAAI,CAC1C,EACA,UAAWyD,EAAA,CACb,EACC3E,EAAA,IAAA4E,EAAA,CAAM,KAAAC,EAAY,QAASqB,EAAO,UAAAnB,EAAsB,UAAU,sBAAsB,KAAK,UAC3F,SACCV,EAAArE,EAAA,IAAC,OAAI,UAAU,gCAAgC,SAAQ,UAAA,CAAA,EACrDqI,EAAgB,SAAW,EAC7BrI,EAAA,IAAC,MAAI,CAAA,UAAU,gCAAiC,SAAA6F,CAAA,CAAU,EAE1DwC,EAAgB,IAAI,CAAClE,EAAQiC,IAC3BpG,EAAA,IAAC,MAAA,CAEC,KAAK,SACL,gBAAemE,EAAO,QAAUlD,EAChC,UAAWxB,EAAG,gBAAiB2G,IAAUX,GAAe,SAAUtB,EAAO,UAAY,UAAU,EAC/F,aAAc,IAAMuB,EAAeU,CAAK,EACxC,YAAc/D,IAAU,CACtBA,GAAM,eAAe,EAChB8B,EAAO,UAAUwD,EAAYvB,CAAK,CACzC,EAEC,SAAOjC,EAAA,KAAA,EAVH,OAAOA,EAAO,KAAK,CAY3B,CAAA,EAEL,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CCrIO,SAASoE,GAAUjH,EAAuB,CACxC,OAAAtB,EAAA,IAACI,EAAY,CAAA,GAAGkB,CAAO,CAAA,CAChC,CCOgB,SAAAkH,GAAM,CAAE,KAAA3D,EAAM,QAAAC,EAAS,MAAA2D,EAAO,SAAA1I,EAAU,OAAA2I,EAAQ,UAAA5I,GAAyB,CAGvF,OAFAyE,EAAaM,EAAMC,CAAO,EAErBD,EAIDvC,EAAA,KAAAqG,WAAA,CAAA,SAAA,CAAC3I,EAAAA,IAAA,MAAA,CAAI,UAAU,gBAAgB,SAAU,GAAI,KAAK,SAAS,aAAW,OACpE,SAAAA,EAAAA,IAAC,OAAI,UAAWP,EAAG,eAAgBK,CAAS,EAAG,KAAK,WAClD,SAAAwC,EAAA,KAAC,MAAI,CAAA,UAAU,gBACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,eACZ,SAAA,CAAAmG,GAAUzI,EAAA,IAAA,KAAA,CAAG,UAAU,cAAe,SAAMyI,EAAA,EAC7CzI,EAAAA,IAAC,UAAO,KAAK,SAAS,UAAU,YAAY,aAAW,QAAQ,QAAS8E,CAAS,CAAA,CAAA,EACnF,EACC9E,EAAAA,IAAA,MAAA,CAAI,UAAU,aAAc,SAAAD,CAAS,CAAA,EACrC2I,GAAU1I,EAAA,IAAC,MAAI,CAAA,UAAU,eAAgB,SAAO0I,EAAA,CAAA,CACnD,CAAA,CACF,CAAA,EACF,EACC1I,EAAA,IAAA,MAAA,CAAI,UAAU,sBAAsB,QAAS8E,EAAS,CACzD,CAAA,CAAA,EAjBgB,IAmBpB,CC9BA,SAAS8D,GAAYC,EAAiBC,EAAeC,EAAmC,CACtF,MAAMC,EAAqB,CAAA,EACrBC,EAAQ,KAAK,IAAI,EAAGJ,EAAUE,CAAY,EAC1CG,EAAM,KAAK,IAAIJ,EAAOD,EAAUE,CAAY,EAE9CE,EAAQ,IACVD,EAAM,KAAK,CAAC,EACRC,EAAQ,GAAGD,EAAM,KAAK,UAAU,GAE7B,QAAAG,EAAOF,EAAOE,GAAQD,EAAKC,IAAQH,EAAM,KAAKG,CAAI,EAC3D,OAAID,EAAMJ,IACJI,EAAMJ,EAAQ,GAAGE,EAAM,KAAK,UAAU,EAC1CA,EAAM,KAAKF,CAAK,GAEXE,CACT,CAOgB,SAAAI,GAAW,CAAE,YAAAC,EAAa,SAAAC,EAAU,WAAAC,EAAY,aAAAC,EAAc,aAAAT,EAAe,EAAG,UAAAjJ,GAA8B,CACtH,MAAA2J,EAAa,KAAK,IAAI,EAAG,KAAK,KAAKF,EAAaD,CAAQ,CAAC,EACzDN,EAAQJ,GAAYS,EAAaI,EAAYV,CAAY,EAG7D,OAAA/I,EAAA,IAAC,OAAI,aAAW,aAAa,UAAAF,EAC3B,SAACwC,EAAAA,KAAA,KAAA,CAAG,UAAU,kBACZ,SAAA,CAAAtC,EAAAA,IAAC,MAAG,UAAWP,EAAG,YAAa4J,GAAe,GAAK,UAAU,EAC3D,SAAArJ,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,YACV,SAAUqJ,GAAe,EACzB,QAAS,IAAMG,EAAaH,EAAc,CAAC,EAC5C,SAAA,UAAA,CAAA,EAGH,EACCL,EAAM,IAAI,CAACG,EAAM/C,IAChB+C,IAAS,WACNnJ,EAAAA,IAAA,KAAA,CAA6B,UAAU,qBACtC,SAACA,EAAAA,IAAA,OAAA,CAAK,UAAU,YAAY,SAAC,GAAA,CAAA,CAAA,EADtB,YAAYoG,CAAK,EAE1B,EAECpG,EAAA,IAAA,KAAA,CAAc,UAAWP,EAAG,YAAa0J,IAASE,GAAe,QAAQ,EACxE,SAAArJ,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,YACV,eAAcmJ,IAASE,EAAc,OAAS,OAC9C,QAAS,IAAMG,EAAaL,CAAI,EAE/B,SAAAA,CAAA,IAPIA,CAST,CAEJ,EACAnJ,EAAAA,IAAC,MAAG,UAAWP,EAAG,YAAa4J,GAAeI,GAAc,UAAU,EACpE,SAAAzJ,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,YACV,SAAUqJ,GAAeI,EACzB,QAAS,IAAMD,EAAaH,EAAc,CAAC,EAC5C,SAAA,MAAA,CAAA,EAGH,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CC1CA,SAASK,GAAkBb,EAA0Cc,EAAkC,CACjG,MAAA,CAACd,GAAWA,EAAQ,MAAQc,EAAY,CAAE,IAAAA,EAAK,UAAW,OAC1Dd,EAAQ,YAAc,MAAc,CAAE,IAAAc,EAAK,UAAW,QACnD,IACT,CAQO,SAASC,GAAe,CAC7B,QAAAC,EACA,KAAArH,EACA,OAAAsH,EACA,QAAAzF,EACA,MAAAnE,EACA,UAAA2F,EAAY,UACZ,UAAA/F,EACA,gBAAAiK,EACA,kBAAAC,EACA,KAAAC,EACA,aAAAC,EACA,KAAAf,EACA,SAAAG,EACA,WAAAa,EACA,aAAAX,CACF,EAAwB,CAChB,MAAAY,EAAa,EAAQJ,EACrB/D,EAAc,IAAI,IAAI8D,GAAmB,CAAE,CAAA,EAC3CM,EAAYlB,IAAS,QAAaG,IAAa,QAAaa,IAAe,OAC3EV,EAAaY,EAAY,KAAK,IAAI,EAAG,KAAK,KAAKF,EAAab,CAAQ,CAAC,EAAI,EAE/E,SAASgB,GAAY,CACdN,IACD/D,EAAY,OAASzD,EAAK,OAC5BwH,EAAkB,CAAE,CAAA,EAEFA,EAAAxH,EAAK,IAAIsH,CAAM,CAAC,EAEtC,CAEA,SAASS,EAAUZ,EAAsB,CACvC,GAAI,CAACK,EAAmB,OAClB,MAAA5I,EAAO,IAAI,IAAI6E,CAAW,EAC5B7E,EAAK,IAAIuI,CAAG,EAAGvI,EAAK,OAAOuI,CAAG,EAC7BvI,EAAK,IAAIuI,CAAG,EACCK,EAAA,MAAM,KAAK5I,CAAI,CAAC,CACpC,CAEA,cACG,MAAI,CAAA,UAAW3B,EAAG,mBAAoBK,CAAS,EAC9C,SAAA,CAACwC,EAAAA,KAAA,QAAA,CAAM,UAAU,iCACf,SAAA,CAACtC,EAAA,IAAA,QAAA,CACC,gBAAC,KACE,CAAA,SAAA,CAAAoK,SACE,KAAG,CAAA,MAAO,CAAE,MAAO,UAClB,SAAApK,EAAA,IAAC,QAAA,CACC,KAAK,WACL,UAAU,mBACV,QAASwC,EAAK,OAAS,GAAKyD,EAAY,OAASzD,EAAK,OACtD,SAAU8H,EACV,aAAW,iBAAA,CAAA,EAEf,EAEDT,EAAQ,IAAKW,GACZlI,EAAA,KAAC,KAAA,CAEC,MAAO,CAAE,MAAOkI,EAAO,KAAM,EAC7B,KAAMA,EAAO,SAAW,SAAW,OACnC,QAASA,EAAO,UAAYN,EAAe,IAAMA,EAAaR,GAAkBO,EAAMO,EAAO,GAAG,CAAC,EAAI,OAEpG,SAAA,CAAOA,EAAA,OACPA,EAAO,WAAYP,GAAA,YAAAA,EAAM,OAAQO,EAAO,KACvClI,EAAA,KAAC,OAAK,CAAA,cAAY,OAAO,SAAA,CAAA,IAAE2H,EAAK,YAAc,MAAQ,IAAM,GAAA,EAAI,CAAA,CAAA,EAP7DO,EAAO,GAAA,CAUf,CAAA,CAAA,CACH,CACF,CAAA,EACAxK,EAAA,IAAC,QACE,CAAA,SAAAqE,EACErE,EAAAA,IAAA,KAAA,CACC,eAAC,KAAG,CAAA,QAAS6J,EAAQ,QAAUO,EAAa,EAAI,GAAI,UAAU,uCAAuC,SAErG,UAAA,CAAA,CAAA,CACF,EACElK,EACDF,EAAAA,IAAA,KAAA,CACC,SAACA,MAAA,KAAA,CAAG,QAAS6J,EAAQ,QAAUO,EAAa,EAAI,GAAI,UAAU,+BAC3D,SAAAlK,CAAA,CACH,CACF,CAAA,EACEsC,EAAK,SAAW,EAClBxC,EAAAA,IAAC,KACC,CAAA,SAAAA,MAAC,KAAG,CAAA,QAAS6J,EAAQ,QAAUO,EAAa,EAAI,GAAI,UAAU,uCAC3D,SACHvE,CAAA,CAAA,CACF,CAAA,EAEArD,EAAK,IAAKiI,GAAQ,CACV,MAAAd,EAAMG,EAAOW,CAAG,EACtB,cACG,KACE,CAAA,SAAA,CAAAL,SACE,KACC,CAAA,SAAApK,EAAA,IAAC,QAAA,CACC,KAAK,WACL,UAAU,mBACV,QAASiG,EAAY,IAAI0D,CAAG,EAC5B,SAAU,IAAMY,EAAUZ,CAAG,EAC7B,aAAW,YAAA,CAAA,EAEf,EAEDE,EAAQ,IAAKW,SACX,KAAqB,CAAA,SAAAA,EAAO,OAASA,EAAO,OAAOC,CAAG,EAAI,OAAQA,EAAgCD,EAAO,GAAG,GAAK,EAAE,CAAA,EAA3GA,EAAO,GAAsG,CACvH,CAAA,CAAA,EAdMb,CAeT,CAEH,CAAA,EAEL,CAAA,EACF,EAECU,GACC/H,EAAA,KAAC,MAAI,CAAA,UAAU,yDACb,SAAA,CAACA,EAAAA,KAAA,OAAA,CAAK,UAAU,4BAA4B,SAAA,CAAA,QACpC6G,EAAK,OAAKM,EAAW,KAAGU,EAAW,QAAA,EAC3C,QACCf,GAAW,CAAA,YAAaD,EAAO,SAAAG,EAAqB,WAAYa,EAAa,aAAAX,EAA6B,CAAA,EAC7G,CAEJ,CAAA,CAAA,CAEJ,CC1KgB,SAAAkB,GAAQ,CAAE,KAAAC,EAAO,KAAM,QAAAC,EAAS,UAAA9K,EAAW,MAAAQ,EAAQ,cAA8B,CAE7F,OAAAN,EAAA,IAAC,OAAA,CACC,UAAWP,EAAG,iBAAkBkL,IAAS,MAAQ,oBAAqBC,GAAW,QAAQA,CAAO,GAAI9K,CAAS,EAC7G,KAAK,SAEL,SAACE,EAAA,IAAA,OAAA,CAAK,UAAU,kBAAmB,SAAMM,EAAA,CAAA,CAAA,CAG/C,CCUO,SAASuK,EAAO,CACrB,QAAAD,EAAU,UACV,KAAAD,EACA,SAAAnJ,EACA,QAAA6C,EACA,KAAAzC,EAAO,SACP,UAAA9B,EACA,SAAAC,EACA,QAAA+K,EACA,GAAGjI,CACL,EAAgB,CACd,MAAMkI,EAAavJ,GAAY6C,EAG7B,OAAA/B,EAAA,KAAC,SAAA,CACC,KAAAV,EACA,UAAWnC,EAAG,MAAO,OAAOmL,CAAO,GAAID,GAAQ,OAAOA,CAAI,GAAI7K,CAAS,EACvE,SAAUiL,EACV,YAAW1G,GAAW,OACtB,QAAS0G,EAAa,OAAYD,EACjC,GAAGjI,EAEH,SAAA,CAAAwB,SAAYqG,GAAQ,CAAA,KAAK,KAAK,UAAU,OAAO,MAAM,GAAG,EACxD3K,CAAA,CAAA,CAAA,CAGP,CCpCgB,SAAAiL,GAAM,CAAE,QAAAJ,EAAU,OAAQ,YAAAK,EAAa,UAAAC,EAAW,UAAApL,EAAW,SAAAC,GAAwB,CACnG,OACGuC,EAAAA,KAAA,MAAA,CAAI,UAAW7C,EAAG,QAAS,SAASmL,CAAO,GAAIK,GAAe,oBAAqBnL,CAAS,EAAG,KAAK,QAClG,SAAA,CAAAC,EACAkL,GAAgBjL,EAAA,IAAA,SAAA,CAAO,KAAK,SAAS,UAAU,YAAY,aAAW,QAAQ,QAASkL,CAAW,CAAA,CACrG,CAAA,CAAA,CAEJ,CCDA,MAAMC,GAAeC,EAAAA,cAA+B,IAAI,EAElDC,GAAmB,IAST,SAAAC,GAAc,CAAE,SAAAvL,GAAqC,CACnE,KAAM,CAACwL,EAAQC,CAAS,EAAIxK,EAAA,SAAsB,CAAE,CAAA,EAC9CyK,EAAS5K,SAAO,CAAC,EACjB6K,EAAS7K,EAAAA,OAAW,IAAA,GAA4C,EAEtE6D,EAAAA,UAAU,IAAM,CACd,MAAMiH,EAAeD,EAAO,QAC5B,MAAO,IAAM,CACXC,EAAa,QAAQ,YAAY,EACjCA,EAAa,MAAM,CAAA,CAEvB,EAAG,CAAE,CAAA,EAEC,MAAAC,EAAUzK,cAAad,GAAe,CAC1C,MAAMwL,EAAQH,EAAO,QAAQ,IAAIrL,CAAE,EAC/BwL,IACF,aAAaA,CAAK,EACXH,EAAA,QAAQ,OAAOrL,CAAE,GAEhBmL,EAACrI,GAASA,EAAK,OAAQ2I,GAAUA,EAAM,KAAOzL,CAAE,CAAC,CAC7D,EAAG,CAAE,CAAA,EAEC0L,EAAO5K,EAAA,YACX,CAAC6K,EAAoBhI,IAA2B,CAC9C,MAAM3D,EAAKoL,EAAO,UACZb,GAAU5G,GAAA,YAAAA,EAAS,UAAW,OAC9BiI,GAAWjI,GAAA,YAAAA,EAAS,WAAYqH,GAC5B,OAAAG,EAACrI,GAAS,CAAC,GAAGA,EAAM,CAAE,GAAA9C,EAAI,QAAA2L,EAAS,QAAApB,CAAS,CAAA,CAAC,EACnDqB,EAAW,GACbP,EAAO,QAAQ,IACbrL,EACA,WAAW,IAAMuL,EAAQvL,CAAE,EAAG4L,CAAQ,CAAA,EAGnC5L,CACT,EACA,CAACuL,CAAO,CAAA,EAGJM,EAAMC,EAAA,QACV,KAAO,CACL,KAAAJ,EACA,QAAAH,EACA,QAAS,CAACI,EAAShI,IAAY+H,EAAKC,EAAS,CAAE,GAAGhI,EAAS,QAAS,UAAW,EAC/E,MAAO,CAACgI,EAAShI,IAAY+H,EAAKC,EAAS,CAAE,GAAGhI,EAAS,QAAS,SAAU,EAC5E,KAAM,CAACgI,EAAShI,IAAY+H,EAAKC,EAAS,CAAE,GAAGhI,EAAS,QAAS,OAAQ,EACzE,QAAS,CAACgI,EAAShI,IAAY+H,EAAKC,EAAS,CAAE,GAAGhI,EAAS,QAAS,UAAW,CAAA,GAEjF,CAAC+H,EAAMH,CAAO,CAAA,EAGhB,OACGtJ,EAAAA,KAAA6I,GAAa,SAAb,CAAsB,MAAOe,EAC3B,SAAA,CAAAnM,EACAC,EAAA,IAAA,MAAA,CAAI,UAAU,oDAAoD,MAAO,CAAE,OAAQ,IAAK,EACtF,SAAOuL,EAAA,IAAKO,SACVd,GAAqB,CAAA,QAASc,EAAM,QAAS,YAAW,GAAC,UAAW,IAAMF,EAAQE,EAAM,EAAE,EAAG,UAAU,YACrG,SAAMA,EAAA,OAAA,EADGA,EAAM,EAElB,CACD,EACH,CACF,CAAA,CAAA,CAEJ,CAGO,SAASM,IAAqB,CAC7B,MAAAC,EAAUC,aAAWnB,EAAY,EACvC,GAAI,CAACkB,EAAe,MAAA,IAAI,MAAM,8CAA8C,EACrE,OAAAA,CACT,CC3FA,MAAME,GAAiBnB,EAAAA,cAAgC,IAAI,EAgB3C,SAAAoB,GAAgB,CAAE,SAAAzM,GAAqC,CACrE,KAAM,CAAC0M,EAASC,CAAU,EAAI1L,WAAgC,IAAI,EAE5D2L,EAAUxL,cAAwB6C,GAC/B,IAAI,QAAkB4I,GAAY,CACvCF,EAAW,CAAE,GAAG1I,EAAS,QAAA4I,CAAS,CAAA,CAAA,CACnC,EACA,CAAE,CAAA,EAECC,EAAS1L,EAAA,YACZ2L,GAAoB,CACnBL,GAAA,MAAAA,EAAS,QAAQK,GACjBJ,EAAW,IAAI,CACjB,EACA,CAACD,CAAO,CAAA,EAGV,OACGnK,EAAAA,KAAAiK,GAAe,SAAf,CAAwB,MAAOI,EAC7B,SAAA,CAAA5M,EACDC,EAAA,IAACwI,GAAA,CACC,KAAMiE,IAAY,KAClB,QAAS,IAAMI,EAAO,EAAK,EAC3B,OAAOJ,GAAA,YAAAA,EAAS,QAAS,UACzB,OAEInK,EAAA,KAAAqG,WAAA,CAAA,SAAA,CAAC3I,EAAAA,IAAA6K,EAAA,CAAO,QAAQ,oBAAoB,QAAS,IAAMgC,EAAO,EAAK,EAC5D,UAASJ,GAAA,YAAAA,EAAA,cAAe,QAC3B,CAAA,EACCzM,EAAA,IAAA6K,EAAA,CAAO,SAAS4B,GAAA,YAAAA,EAAS,iBAAkB,SAAU,QAAS,IAAMI,EAAO,EAAI,EAC7E,UAAAJ,GAAA,YAAAA,EAAS,eAAgB,UAC5B,CAAA,EACF,EAGD,SAASA,GAAA,YAAAA,EAAA,OAAA,CACZ,CACF,CAAA,CAAA,CAEJ,CAGO,SAASM,IAAwB,CAChC,MAAAV,EAAUC,aAAWC,EAAc,EACzC,GAAI,CAACF,EAAe,MAAA,IAAI,MAAM,kDAAkD,EACzE,OAAAA,CACT,CChEO,SAASW,GAAM,CAAE,QAAApC,EAAU,UAAW,KAAAqC,EAAM,UAAAnN,EAAW,SAAAC,GAAwB,CACpF,OAAQC,EAAAA,IAAA,OAAA,CAAK,UAAWP,EAAG,QAAS,MAAMmL,CAAO,GAAIqC,GAAQ,eAAgBnN,CAAS,EAAI,SAAAC,CAAS,CAAA,CACrG,CCMO,SAASmN,GAAK,CAAE,MAAAC,EAAO,UAAAC,EAAW,iBAAAC,EAAkB,SAAA3M,EAAU,UAAAZ,GAAwB,OAC3F,KAAM,CAACwN,EAAYC,CAAM,EAAIhN,EAA6B,CACxD,MAAO6M,EACP,aAAcC,KAAoBlI,EAAAgI,EAAM,CAAC,IAAP,YAAAhI,EAAU,MAAO,GACnD,SAAAzE,CAAA,CACD,EAEK8M,EAAaL,EAAM,KAAMM,GAASA,EAAK,MAAQH,CAAU,EAG7D,OAAAhL,OAAC,OAAI,UAAAxC,EACH,SAAA,CAAAE,MAAC,KAAG,CAAA,UAAU,eAAe,KAAK,UAC/B,SAAMmN,EAAA,IAAKM,GACTzN,EAAAA,IAAA,KAAA,CAAG,UAAU,WAAW,KAAK,eAC5B,SAAAA,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWP,EAAG,WAAYgO,EAAK,MAAQH,GAAc,QAAQ,EAC7D,KAAK,MACL,gBAAeG,EAAK,MAAQH,EAC5B,SAAUG,EAAK,SACf,QAAS,IAAMF,EAAOE,EAAK,GAAG,EAE7B,SAAKA,EAAA,KAAA,CATwC,CAAA,EAAAA,EAAK,GAWvD,CACD,EACH,QACC,MAAI,CAAA,UAAU,mBAAmB,KAAK,WACpC,0BAAY,QACf,CACF,CAAA,CAAA,CAEJ,CC/BgB,SAAAC,GAAU,CAAE,MAAAP,EAAO,SAAA7J,EAAW,GAAO,SAAAqK,EAAU,gBAAAC,EAAiB,SAAAlN,EAAU,UAAAZ,GAA6B,CACrH,KAAM,CAAC+N,EAAiBC,CAAW,EAAIvN,EAA+B,CACpE,MAAOoN,EACP,aAAcC,GAAmB,CAAC,EAClC,SAAAlN,CAAA,CACD,EAEKqN,EAAU,IAAI,IAAIF,CAAe,EAEvC,SAASG,EAAOrE,EAAa,CACvBoE,EAAQ,IAAIpE,CAAG,EACjBmE,EAAYD,EAAgB,OAAQI,GAAMA,IAAMtE,CAAG,CAAC,EAExCmE,EAAAxK,EAAW,CAAC,GAAGuK,EAAiBlE,CAAG,EAAI,CAACA,CAAG,CAAC,CAE5D,CAGE,OAAA3J,MAAC,MAAI,CAAA,UAAWP,EAAG,YAAaK,CAAS,EACtC,SAAAqN,EAAM,IAAKM,GAAS,CACnB,MAAMlI,EAASwI,EAAQ,IAAIN,EAAK,GAAG,EAEjC,OAAAnL,EAAA,KAAC,MAAI,CAAA,UAAU,iBACb,SAAA,CAACtC,EAAAA,IAAA,KAAA,CAAG,UAAU,mBACZ,SAAAA,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWP,EAAG,mBAAoB,CAAC8F,GAAU,WAAW,EACxD,gBAAeA,EACf,SAAUkI,EAAK,SACf,QAAS,IAAMO,EAAOP,EAAK,GAAG,EAE7B,SAAKA,EAAA,MAAA,CAAA,EAEV,EACClI,GACEvF,EAAA,IAAA,MAAA,CAAI,UAAU,qBACb,SAACA,EAAA,IAAA,MAAA,CAAI,UAAU,iBAAkB,SAAKyN,EAAA,OAAQ,CAAA,EAChD,CAAA,GAfiCA,EAAK,GAiB1C,CAEH,CAAA,CACH,CAAA,CAEJ,CCzCO,SAASS,GAAQ,CAAE,QAAAC,EAAS,SAAApO,EAAU,UAAAqO,EAAY,MAAO,UAAAtO,GAA2B,CACzF,KAAM,CAAC+E,EAAMmB,CAAO,EAAIhF,WAAS,EAAK,EAChC+D,EAAYlE,SAAwB,IAAI,EACxCwN,EAAYnM,EAAAA,QAGhB,OAAAI,EAAA,KAAC,OAAA,CACC,IAAKyC,EACL,UAAU,mCACV,aAAc,IAAMiB,EAAQ,EAAI,EAChC,aAAc,IAAMA,EAAQ,EAAK,EACjC,QAAS,IAAMA,EAAQ,EAAI,EAC3B,OAAQ,IAAMA,EAAQ,EAAK,EAC3B,mBAAkBnB,EAAOwJ,EAAY,OAEpC,SAAA,CAAAtO,EACDC,EAAA,IAAC4E,EAAA,CACC,KAAAC,EACA,QAAS,IAAMmB,EAAQ,EAAK,EAC5B,UAAAjB,EACA,UAAWtF,EAAG,eAAgB,cAAc2O,CAAS,GAAI,oBAAqB,SAAUtO,CAAS,EAEjG,SAAAE,EAAA,IAAC,QAAK,GAAIqO,EAAW,KAAK,UAAU,UAAU,gBAC3C,SACHF,CAAA,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CCvCgB,SAAAG,GAAQ,CAAE,MAAA7F,EAAO,QAAA0F,EAAS,SAAApO,EAAU,UAAAqO,EAAY,SAAU,UAAAtO,GAA2B,CACnG,KAAM,CAAC+E,EAAMmB,CAAO,EAAIhF,WAAS,EAAK,EAChC+D,EAAYlE,SAAwB,IAAI,EAE9C,OACGyB,EAAA,KAAA,OAAA,CAAK,IAAKyC,EAAW,UAAU,mCAAmC,QAAS,IAAMiB,EAAS7C,GAAS,CAACA,CAAI,EACtG,SAAA,CAAApD,EACDuC,EAAA,KAACsC,EAAA,CACC,KAAAC,EACA,QAAS,IAAMmB,EAAQ,EAAK,EAC5B,UAAAjB,EACA,UAAWtF,EAAG,eAAgB,cAAc2O,CAAS,GAAI,oBAAqB,SAAUtO,CAAS,EAEhG,SAAA,CAAA2I,GAAUzI,EAAA,IAAA,KAAA,CAAG,UAAU,iBAAkB,SAAMyI,EAAA,EAC/CzI,EAAA,IAAA,MAAA,CAAI,UAAU,eAAgB,SAAQmO,EAAA,CAAA,CAAA,CACzC,CACF,CAAA,CAAA,CAEJ,CCpBO,SAASI,GAAK,CAAE,OAAAC,EAAQ,OAAA9F,EAAQ,UAAA5I,EAAW,SAAAC,GAAuB,CACvE,cACG,MAAI,CAAA,UAAWN,EAAG,OAAQK,CAAS,EACjC,SAAA,CAAA0O,GAAWxO,EAAA,IAAA,MAAA,CAAI,UAAU,cAAe,SAAOwO,EAAA,EAC/CxO,EAAAA,IAAA,MAAA,CAAI,UAAU,YAAa,SAAAD,CAAS,CAAA,EACpC2I,GAAU1I,EAAA,IAAC,MAAI,CAAA,UAAU,cAAe,SAAO0I,EAAA,CAClD,CAAA,CAAA,CAEJ,CCTO,SAAS+F,GAAQ,CAAE,UAAA3O,EAAW,SAAA4O,EAAU,MAAApO,GAAuB,CACpE,OAAIoO,EACK1O,EAAA,IAAC,MAAI,CAAA,UAAWP,EAAG,KAAMK,CAAS,EAAG,KAAK,YAAY,mBAAiB,UAAW,CAAA,EAGvFQ,EAEAgC,OAAC,OAAI,UAAW7C,EAAG,uCAAwCK,CAAS,EAAG,KAAK,YAC1E,SAAA,CAACE,EAAAA,IAAA,KAAA,CAAG,UAAU,iBAAkB,CAAA,EAC/BA,EAAA,IAAA,OAAA,CAAK,UAAU,4BAA6B,SAAMM,EAAA,EACnDN,EAAAA,IAAC,KAAG,CAAA,UAAU,iBAAkB,CAAA,CAClC,CAAA,CAAA,EAIGA,MAAC,MAAG,UAAWP,EAAG,OAAQK,CAAS,EAAG,KAAK,WAAY,CAAA,CAChE,CCZgB,SAAA6O,GAAM,CAAE,UAAAC,EAAY,SAAU,IAAAC,EAAM,EAAG,MAAAC,EAAO,QAAAC,EAAS,KAAAC,EAAM,UAAAlP,EAAW,SAAAC,CAAA,EAAwB,CAE5G,OAAAC,EAAA,IAAC,MAAA,CACC,UAAWP,EACT,SACAmP,IAAc,MAAQ,WAAa,cACnC,OAAOC,CAAG,GACVC,GAAS,eAAeA,CAAK,GAC7BC,GAAW,mBAAmBA,CAAO,GACrCC,GAAQ,YACRlP,CACF,EAEC,SAAAC,CAAA,CAAA,CAGP,CCrBO,SAASkP,GAAU,CAAE,MAAAC,EAAO,UAAApP,EAAW,SAAAC,GAA4B,CACjE,OAAAC,MAAC,OAAI,UAAWP,EAAGyP,EAAQ,kBAAoB,YAAapP,CAAS,EAAI,SAAAC,CAAS,CAAA,CAC3F,CCHO,SAASoP,GAAI,CAAE,UAAArP,EAAW,SAAAC,GAAsB,CACrD,aAAQ,MAAI,CAAA,UAAWN,EAAG,MAAOK,CAAS,EAAI,SAAAC,CAAS,CAAA,CACzD,CCIgB,SAAAqP,GAAI,CAAE,KAAAC,EAAM,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,UAAA3P,EAAW,SAAAC,GAAsB,CAEzE,OAAAC,EAAA,IAAC,MAAA,CACC,UAAWP,EACT4P,EAAO,OAAOA,CAAI,GAAK,MACvBC,EAAK,UAAUA,CAAE,GAAK,OACtBC,EAAK,UAAUA,CAAE,GAAK,OACtBC,EAAK,UAAUA,CAAE,GAAK,OACtBC,EAAK,UAAUA,CAAE,GAAK,OACtB3P,CACF,EAEC,SAAAC,CAAA,CAAA,CAGP,CChBO,SAAS2P,GAAW,CAAE,MAAAvC,EAAO,UAAArN,GAA8B,CAChE,OACGE,EAAAA,IAAA,MAAA,CAAI,aAAW,aAAa,UAAAF,EAC3B,SAAAE,EAAA,IAAC,KAAG,CAAA,UAAU,kBACX,SAAAmN,EAAM,IAAI,CAACM,EAAMrH,IAAU,CACpB,MAAAuJ,EAASvJ,IAAU+G,EAAM,OAAS,EAClCyC,EAAgB,CAACD,IAAWlC,EAAK,MAAQA,EAAK,SACpD,OACGzN,EAAAA,IAAA,KAAA,CAAe,UAAWP,EAAG,kBAAmBkQ,GAAU,QAAQ,EAAG,eAAcA,EAAS,OAAS,OACnG,SACCC,EAAA5P,EAAA,IAAC,IAAA,CACC,KAAMyN,EAAK,MAAQ,IACnB,QAAUpL,GAAU,OACboL,EAAK,MAAMpL,EAAM,eAAe,GACrC8C,EAAAsI,EAAK,UAAL,MAAAtI,EAAA,KAAAsI,EACF,EAEC,SAAKA,EAAA,KAAA,CACR,EAEAA,EAAK,OAZArH,CAcT,CAAA,CAEH,EACH,CACF,CAAA,CAEJ,CCfO,SAASyJ,GAAK,CAAE,MAAA1C,EAAO,SAAApN,EAAU,UAAAqO,EAAY,QAAS,UAAAtO,GAAwB,CACnF,KAAM,CAAC+E,EAAMmB,CAAO,EAAIhF,WAAS,EAAK,EAChC+D,EAAYlE,SAAwB,IAAI,EAExCqF,EAAQ/E,EAAAA,YAAY,IAAM6E,EAAQ,EAAK,EAAG,CAAA,CAAE,EAC5C2B,EAAcxG,EAAA,YACjBiF,GAAkB,OACX,MAAAqH,EAAON,EAAM/G,CAAK,EACpB,CAACqH,GAAQA,EAAK,YAClBtI,EAAAsI,EAAK,WAAL,MAAAtI,EAAA,KAAAsI,GACMvH,IACR,EACA,CAACiH,EAAOjH,CAAK,CAAA,EAGT,CAAE,YAAAT,EAAa,eAAAC,EAAgB,cAAAf,CAAA,EAAkBU,EAAkB,CACvE,UAAW8H,EAAM,OACjB,OAAQtI,EACR,SAAU8C,EACV,QAASzB,CAAA,CACV,EAGC,OAAA5D,EAAA,KAAC,OAAA,CACC,IAAKyC,EACL,UAAU,mCACV,QAAS,IAAMiB,EAAS7C,GAAS,CAACA,CAAI,EACtC,UAAWwB,EAEV,SAAA,CAAA5E,EACDC,EAAA,IAAC4E,EAAA,CACC,KAAAC,EACA,QAASqB,EACT,UAAAnB,EACA,KAAK,OACL,UAAWtF,EAAG,qBAAsB2O,IAAc,OAAS,oBAAqBtO,CAAS,EAExF,SAAMqN,EAAA,IAAI,CAACM,EAAMrH,IAChBpG,EAAA,IAAC,SAAA,CAEC,KAAK,SACL,KAAK,WACL,UAAWP,EAAG,gBAAiB2G,IAAUX,GAAe,SAAUgI,EAAK,UAAY,WAAYA,EAAK,QAAU,aAAa,EAC3H,SAAUA,EAAK,SACf,aAAc,IAAM/H,EAAeU,CAAK,EACxC,YAAc/D,GAAUA,EAAM,eAAe,EAC7C,QAAUA,GAAU,CAIlBA,EAAM,gBAAgB,EACtBsF,EAAYvB,CAAK,CACnB,EAEC,SAAKqH,EAAA,KAAA,EAfDA,EAAK,GAAA,CAiBb,CAAA,CACH,CAAA,CAAA,CAAA,CAGN,CCvEO,SAASqC,GAAQ,CAAE,MAAAC,EAAO,YAAAC,EAAa,UAAAlQ,GAA2B,CAErE,OAAAE,EAAA,IAAC,KAAG,CAAA,UAAWP,EAAG,0CAA2CK,CAAS,EACnE,SAAMiQ,EAAA,IAAI,CAACnN,EAAMwD,IAAU,CAC1B,MAAM6J,EAAS7J,EAAQ4J,EAAc,WAAa5J,IAAU4J,EAAc,SAAW,WAC/EL,EAASvJ,IAAU2J,EAAM,OAAS,EAEtC,OAAAzN,EAAA,KAAC,MAAkB,UAAW7C,EAAG,4BAA6B,CAACkQ,GAAU,aAAa,EACpF,SAAA,CAACrN,EAAAA,KAAA,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAtC,EAAA,IAAC,OAAA,CACC,UAAWP,EACT,gFACAwQ,IAAW,WAAa,wBAA0BA,IAAW,SAAW,qCAAuC,4BACjH,EACA,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACvC,eAAcA,IAAW,SAAW,OAAS,OAE5C,SAAAA,IAAW,WAAa,IAAM7J,EAAQ,CAAA,CACzC,SACC,MACC,CAAA,SAAA,CAACpG,EAAAA,IAAA,MAAA,CAAI,UAAWP,EAAG,oBAAqBwQ,IAAW,YAAc,qBAAqB,EAAI,SAAArN,EAAK,KAAM,CAAA,EACpGA,EAAK,aAAe5C,EAAA,IAAC,OAAI,UAAU,4BAA6B,WAAK,YAAY,CAAA,EACpF,CAAA,EACF,EACC,CAAC2P,GAAW3P,EAAAA,IAAA,KAAA,CAAG,UAAU,kBAAmB,CAAA,CAAA,GAjBtC4C,EAAK,GAkBd,CAEH,CAAA,CACH,CAAA,CAEJ,CCnCA,SAASsN,GAAY3O,EAAsB,SACzC,MAAMsF,EAAQtF,EAAK,KAAK,EAAE,MAAM,KAAK,EAC/B4O,IAAQhL,EAAA0B,EAAM,CAAC,IAAP,YAAA1B,EAAW,KAAM,GACzBiL,EAAOvJ,EAAM,OAAS,IAAKzB,EAAAyB,EAAMA,EAAM,OAAS,CAAC,IAAtB,YAAAzB,EAA0B,KAAM,GAAM,GAC/D,OAAA+K,EAAQC,GAAM,aACxB,CAEA,MAAMC,GAA8D,CAClE,GAAI,UACJ,GAAI,SACJ,GAAI,QACN,EAEO,SAASC,GAAO,CAAE,IAAAC,EAAK,KAAAhP,EAAM,KAAAoJ,EAAO,KAAM,UAAA7K,GAA0B,CACnE,MAAA0Q,EAAYH,GAAU1F,CAAI,EAEhC,OAAI4F,EAEAvQ,EAAA,IAAC,MAAA,CACC,IAAAuQ,EACA,IAAKhP,GAAQ,GACb,UAAW9B,EAAG,iBAAkBK,CAAS,EACzC,MAAO,CAAE,MAAO0Q,EAAW,OAAQA,EAAW,UAAW,OAAQ,CAAA,CAAA,EAMrExQ,EAAA,IAAC,OAAA,CACC,UAAWP,EAAG,iGAAkGK,CAAS,EACzH,MAAO,CAAE,MAAO0Q,EAAW,OAAQA,EAAW,SAAU,QAAQA,CAAS,SAAU,EACnF,KAAMjP,EAAO,MAAQ,OACrB,aAAYA,EAEX,SAAAA,EAAO2O,GAAY3O,CAAI,EAAI,IAAA,CAAA,CAGlC,CC/BO,SAASkP,GAAI,CAAE,QAAA7F,EAAU,YAAa,SAAA8F,EAAU,UAAA5Q,EAAW,SAAAC,GAAsB,CAEpF,OAAAuC,OAAC,QAAK,UAAW7C,EAAG,+CAAgD,MAAMmL,CAAO,GAAI9K,CAAS,EAC3F,SAAA,CAAAC,EACA2Q,GACC1Q,EAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,4BACV,MAAO,CAAE,SAAU,SAAU,EAC7B,aAAW,SACX,QAAS0Q,CAAA,CACX,CAEJ,CAAA,CAAA,CAEJ,CCrBgB,SAAAC,GAAS,CAAE,MAAAC,EAAQ,OAAQ,OAAAC,EAAS,OAAQ,OAAAC,EAAQ,UAAAhR,GAA4B,CAE5F,OAAAE,MAAC,QAAK,UAAWP,EAAG,kCAAmCK,CAAS,EAAG,MAAO,CAAE,MAAA8Q,EAAO,OAAAC,CAAA,EAAU,cAAY,OACvG,eAAC,OAAK,CAAA,UAAWpR,EAAG,kCAAmCqR,GAAU,gBAAgB,CAAG,CAAA,CACtF,CAAA,CAEJ,CCFO,SAASC,GAAO,CACrB,MAAAvQ,EACA,aAAAC,EACA,SAAAC,EACA,IAAAgC,EAAM,EACN,IAAAC,EAAM,IACN,KAAAC,EAAO,EACP,GAAAvC,EACA,KAAAkB,EACA,SAAAC,EACA,SAAA3B,EACA,UAAAC,EACA,MAAAQ,EACA,SAAAH,EACA,MAAAD,CACF,EAAgB,CACd,KAAM,CAACe,EAAcC,CAAQ,EAAIX,EAA6B,CAC5D,MAAAC,EACA,aAAcC,GAAgBiC,EAC9B,SAAAhC,CAAA,CACD,EAEKuB,EAAcC,EAAAA,QACdC,EAAU9B,GAAM4B,EAGpB,OAAAK,OAAClC,GAAW,GAAI+B,EAAS,MAAA7B,EAAc,SAAAT,EAAoB,MAAAK,EAAc,SAAAC,EAAoB,UAAAL,EAC3F,SAAA,CAAAE,EAAA,IAAC,QAAA,CACC,GAAImC,EACJ,KAAAZ,EACA,KAAK,QACL,UAAU,aACV,SAAAC,EACA,SAAA3B,EACA,IAAA6C,EACA,IAAAC,EACA,KAAAC,EACA,MAAO3B,EACP,SAAWoB,GAAUnB,EAAS,OAAOmB,EAAM,OAAO,KAAK,CAAC,CAAA,CAC1D,EACCrC,EAAA,IAAA,MAAA,CAAI,UAAU,4BAA6B,SAAaiB,EAAA,CAC3D,CAAA,CAAA,CAEJ,CC7CgB,SAAA+P,GAAO,CAAE,MAAAxQ,EAAO,aAAAC,EAAc,SAAAC,EAAU,IAAAiC,EAAM,EAAG,SAAAnB,EAAU,UAAA1B,GAA0B,CACnG,KAAM,CAACmB,EAAcC,CAAQ,EAAIX,EAA6B,CAC5D,MAAAC,EACA,aAAcC,GAAgB,EAC9B,SAAAC,CAAA,CACD,EAGC,OAAAV,MAAC,MAAI,CAAA,UAAWP,EAAG,sBAAuBK,CAAS,EAAG,KAAK,aAAa,aAAW,SAChF,SAAA,MAAM,KAAK,CAAE,OAAQ6C,CAAI,EAAG,CAACsO,EAAG7K,IAAUA,EAAQ,CAAC,EAAE,IAAK8K,GACzDlR,EAAA,IAAC,SAAA,CAEC,KAAK,SACL,UAAU,4BACV,SAAAwB,EACA,KAAK,QACL,eAAc0P,IAAMjQ,EACpB,aAAY,GAAGiQ,CAAC,QAAQA,EAAI,EAAI,IAAM,EAAE,GACxC,QAAS,IAAMhQ,EAASgQ,CAAC,EAEzB,SAAClR,EAAA,IAAA,OAAA,CAAK,cAAY,OAAO,MAAO,CAAE,SAAU,UAAW,MAAOkR,GAAKjQ,EAAe,UAAY,WAAa,SAE3G,IAAA,CAAA,EAXKiQ,CAaR,CAAA,CACH,CAAA,CAEJ,CC3BO,SAASC,GAAY,CAAE,MAAA3Q,EAAO,QAAAoK,EAAU,UAAW,MAAAtK,EAAO,UAAAR,GAA+B,CACxF,MAAAsR,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK5Q,CAAK,CAAC,EAEhD,aACG,MAAI,CAAA,UAAWf,EAAG,WAAYK,CAAS,EAAG,KAAK,cAAc,gBAAesR,EAAS,gBAAe,EAAG,gBAAe,IACrH,SAAApR,EAAAA,IAAC,OAAI,UAAWP,EAAG,eAAgB,MAAMmL,CAAO,EAAE,EAAG,MAAO,CAAE,MAAO,GAAGwG,CAAO,GAC5E,EAAA,SAAA9Q,EAAQ,GAAG,KAAK,MAAM8Q,CAAO,CAAC,IAAM,KACvC,CACF,CAAA,CAEJ,CCLA,MAAMC,GAA0D,CAC9D,GAAI,UACJ,GAAI,QACJ,GAAI,KACN,EAEO,SAASC,GAAK,CAAE,KAAA/P,EAAM,KAAAoJ,EAAM,UAAA7K,EAAW,MAAAQ,GAAoB,CAE9D,OAAAN,EAAA,IAAC,IAAA,CACC,UAAWP,EAAG8B,EAAMzB,CAAS,EAC7B,MAAO6K,EAAO,CAAE,SAAU0G,GAAQ1G,CAAI,CAAM,EAAA,OAC5C,KAAMrK,EAAQ,MAAQ,OACtB,aAAYA,EACZ,cAAaA,EAAQ,OAAY,EAAA,CAAA,CAGvC,CCfgB,SAAAiR,GAAO,CAAE,MAAAC,EAAO,MAAAvI,EAAO,IAAAC,EAAK,QAAA0B,EAAU,QAAS,UAAA9K,GAA0B,CAErF,OAAAE,EAAA,IAAC,MAAA,CACC,UAAWP,EACT,wCACAmL,IAAY,OAAS,sBAAwB,wBAC7C9K,CACF,EAEA,SAAAwC,EAAA,KAAC,MAAI,CAAA,UAAU,kBACZ,SAAA,CAAAkP,GAAUxR,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqB,SAAMwR,EAAA,EACpDvI,GAASjJ,EAAA,IAAC,MAAI,CAAA,UAAU,kCAAmC,SAAMiJ,EAAA,EACjEC,GAAOlJ,EAAA,IAAC,MAAI,CAAA,UAAU,0CAA2C,SAAIkJ,EAAA,CAAA,EACxE,CAAA,CAAA,CAGN,CCJA,SAASuI,GAAQC,EAAkD,CACjE,MAAO,UAAWA,CACpB,CAEA,SAASC,GAAY,CAAE,KAAAlE,GAAmC,CAEtD,OAAAnL,EAAA,KAAC,IAAA,CACC,KAAMmL,EAAK,MAAQ,IACnB,UAAWhO,EAAG,2CAA4CgO,EAAK,QAAU,SAAUA,EAAK,UAAY,UAAU,EAC9G,eAAcA,EAAK,OAAS,OAAS,OACrC,gBAAeA,EAAK,SACpB,QAAUpL,GAAU,OACboL,EAAK,MAAMpL,EAAM,eAAe,EACjC,CAAAoL,EAAK,YACTtI,EAAAsI,EAAK,UAAL,MAAAtI,EAAA,KAAAsI,GACF,EAEC,SAAA,CAAKA,EAAA,KACLA,EAAK,KAAA,CAAA,CAAA,CAGZ,CASO,SAASmE,GAAQ,CAAE,SAAAC,EAAU,OAAArD,EAAQ,OAAA9F,EAAQ,UAAA5I,GAA2B,CAC7E,cACG,MAAI,CAAA,UAAWL,EAAG,2BAA4BK,CAAS,EACrD,SAAA,CAAA0O,GAAWxO,EAAA,IAAA,MAAA,CAAI,UAAU,oBAAqB,SAAOwO,EAAA,EACrDxO,EAAA,IAAA,MAAA,CAAI,UAAU,wCACZ,SAAS6R,EAAA,IAAKH,GACbD,GAAQC,CAAO,EACb1R,EAAA,IAAC0N,GAAA,CAEC,UAAU,WACV,gBAAiBgE,EAAQ,YAAc,CAACA,EAAQ,GAAG,EAAI,CAAC,EACxD,MAAO,CACL,CACE,IAAKA,EAAQ,IACb,OAAQA,EAAQ,MAChB,QACG1R,EAAAA,IAAA,MAAA,CAAI,UAAU,6BACZ,WAAQ,MAAM,IAAKyN,SACjBkE,GAA2B,CAAA,KAAAlE,CAAA,EAAVA,EAAK,GAAiB,CACzC,EACH,CAEJ,CACF,CAAA,EAfKiE,EAAQ,GAAA,EAkBd1R,EAAAA,IAAA2R,GAAA,CAA8B,KAAMD,CAAA,EAAnBA,EAAQ,GAAoB,CAAA,EAGpD,EACChJ,GAAU1I,EAAA,IAAC,MAAI,CAAA,UAAU,iBAAkB,SAAO0I,EAAA,CACrD,CAAA,CAAA,CAEJ,CC/EO,SAASoJ,GAAW,CAAE,MAAArJ,EAAO,YAAAsJ,EAAa,gBAAAC,EAAiB,QAAAC,EAAS,UAAAnS,GAA8B,CACvG,cACG,MAAI,CAAA,UAAWL,EAAG,OAAQK,CAAS,EACjC,SAAA,CAAmBkS,GAAAA,EAAgB,OAAS,GAAKhS,EAAA,IAAC0P,IAAW,MAAOsC,EAAiB,UAAU,MAAO,CAAA,EACvG1P,EAAAA,KAAC,MAAI,CAAA,UAAU,mEACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAACtC,EAAA,IAAA,KAAA,CAAG,UAAU,UAAW,SAAMyI,EAAA,EAC9BsJ,GAAe/R,EAAA,IAAC,IAAE,CAAA,UAAU,2BAA4B,SAAY+R,EAAA,CAAA,EACvE,EACCE,GAAWjS,EAAA,IAAC,MAAI,CAAA,UAAU,kCAAmC,SAAQiS,EAAA,CAAA,EACxE,CACF,CAAA,CAAA,CAEJ,CClBO,MAAMC,WAAkB,KAAM,CAKnC,YAAYjC,EAAgBkC,EAAoBC,EAAa,CAC3D,MAAM,QAAQnC,CAAM,IAAIkC,CAAU,QAAQC,CAAG,EAAE,EAC/C,KAAK,KAAO,YACZ,KAAK,OAASnC,EACd,KAAK,WAAakC,EAClB,KAAK,IAAMC,CACb,CACF,CAEA,SAASC,GAAgBC,EAA0C,CACjE,GAAI,CAACA,EAAe,MAAA,GACd,MAAAC,EAAe,IAAI,gBACzB,SAAW,CAAC5I,EAAK6I,CAAQ,IAAK,OAAO,QAAQF,CAAM,EACnBE,GAAa,MAC3CD,EAAa,IAAI5I,EAAK,OAAO6I,CAAQ,CAAC,EAElC,MAAA3K,EAAQ0K,EAAa,WACpB,OAAA1K,EAAQ,IAAIA,CAAK,GAAK,EAC/B,CAmBgB,SAAA4K,GAAiBzO,EAAmC,GAAgB,CAClF,KAAM,CAAE,QAAA0O,EAAU,GAAI,QAAAC,EAAU,MAAO,iBAAAC,CAAqB,EAAA5O,EAErD,MAAA,CACL,MAAM,IAAeoO,EAAaS,EAAqC,GAAwB,CACvF,MAAAC,EAAU,GAAGJ,CAAO,GAAGN,CAAG,GAAGC,GAAgBQ,EAAe,MAAM,CAAC,GACzE,IAAIE,EAAoB,CAAE,OAAQ,MAAO,OAAQF,EAAe,QAC5DD,IAAyBG,EAAAH,EAAiBE,EAASC,CAAI,GAE3D,MAAMC,EAAW,MAAML,EAAQG,EAASC,CAAI,EACxC,GAAA,CAACC,EAAS,GACZ,MAAM,IAAId,GAAUc,EAAS,OAAQA,EAAS,WAAYF,CAAO,EAE3D,OAAA,MAAME,EAAS,MACzB,CAAA,CAEJ,CAEO,MAAMC,GAAoBR,GAAiB,EChDlD,SAASS,GAASC,EAAuD,CAChE,OAAA,OAAO,KAAKA,CAAG,EACnB,OACA,OAAgC,CAACC,EAAKzJ,KACjCyJ,EAAAzJ,CAAG,EAAIwJ,EAAIxJ,CAAG,EACXyJ,GACN,CAAE,CAAA,CACT,CAgBO,SAASC,EAAgC,CAC9C,OAAAC,EAASL,GACT,IAAAb,EACA,OAAAE,EACA,YAAAiB,EACA,QAAAC,EAAU,EACZ,EAAuE,CACrE,KAAM,CAACC,EAAOC,CAAQ,EAAI1S,WAAsB,MAAM,EAChD,CAACmM,EAAOwG,CAAQ,EAAI3S,EAAA,SAAkB,CAAE,CAAA,EACxC,CAACd,EAAO0T,CAAQ,EAAI5S,WAAuB,IAAI,EAC/C,CAAC6S,EAAaC,CAAc,EAAI9S,WAAS,CAAC,EAE1C+S,EAAY5H,EAAA,QAAQ,IAAOmG,EAAS,KAAK,UAAUY,GAASZ,CAAM,CAAC,EAAI,GAAK,CAACA,CAAM,CAAC,EAEpF0B,EAAkBnT,SAAO,CAAC,EAC1BoT,EAAiBpT,SAAO0S,CAAW,EACzCU,EAAe,QAAUV,EAEzB7O,EAAAA,UAAU,IAAM,CACV,GAAA,CAAC8O,GAAW,CAACpB,EAAK,CACpBsB,EAAS,MAAM,EACfC,EAAS,CAAE,CAAA,EACXC,EAAS,IAAI,EACb,MACF,CAEM,MAAAM,EAAY,EAAEF,EAAgB,QAC9BG,EAAa,IAAI,gBACvB,OAAAT,EAAS,SAAS,EAClBE,EAAS,IAAI,EAGVN,EAAA,IAAelB,EAAK,CAAE,OAAAE,EAAQ,OAAQ6B,EAAW,MAAQ,CAAA,EACzD,KAAMnB,GAAa,CAClB,GAAIkB,IAAcF,EAAgB,QAAS,OACrC,MAAAI,EAASH,EAAe,QAAQjB,CAAQ,EAC9CW,EAASS,CAAM,EACfV,EAASU,EAAO,SAAW,EAAI,QAAU,SAAS,CAAA,CACnD,EACA,MAAOC,GAAiB,CACnBH,IAAcF,EAAgB,UAC9BK,aAAe,cAAgBA,EAAI,OAAS,eACvCT,EAAAS,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,EAC5DX,EAAS,OAAO,GAAA,CACjB,EAEI,IAAM,CACXS,EAAW,MAAM,CAAA,CACnB,EAIC,CAACb,EAAQlB,EAAK2B,EAAWP,EAASK,CAAW,CAAC,EAE3C,MAAAS,EAASnT,cAAY,IAAM2S,EAAgBS,GAAUA,EAAQ,CAAC,EAAG,CAAA,CAAE,EAEzE,MAAO,CAAE,MAAAd,EAAO,MAAAtG,EAAO,MAAAjN,EAAO,OAAAoU,CAAO,CACvC,CCnGgB,SAAAE,GAAqBhU,EAAUiU,EAAoB,CACjE,KAAM,CAACC,EAAWC,CAAY,EAAI3T,WAASR,CAAK,EAEhDkE,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMmH,EAAQ,WAAW,IAAM8I,EAAanU,CAAK,EAAGiU,CAAO,EACpD,MAAA,IAAM,aAAa5I,CAAK,CAAA,EAC9B,CAACrL,EAAOiU,CAAO,CAAC,EAEZC,CACT,CCJO,SAASE,EAA0B5B,EAA8B,CAClE,GAAA,MAAM,QAAQA,CAAQ,EAAU,OAAAA,EAChC,GAAAA,GAAY,OAAOA,GAAa,UAAY,MAAM,QAASA,EAAiC,KAAK,EACnG,OAAQA,EAAkC,MAE5C,MAAM,IAAI,MACR,0HAAA,CAEJ,CAEgB,SAAA6B,EACd/R,EACAgS,EACAC,EACsB,CACtB,GAAIjS,IAAQ,MAAQ,OAAOA,GAAQ,SAC3B,MAAA,IAAI,MAAM,8EAA8E,EAEhG,MAAMkS,EAASlS,EACR,MAAA,CACL,MAAOkS,EAAOF,CAAW,EACzB,MAAO,OAAOE,EAAOD,CAAa,GAAK,EAAE,CAAA,CAE7C,CCLO,SAASE,GAA6E,CAC3F,IAAA7C,EACA,OAAAE,EACA,YAAAwC,EACA,cAAAC,EACA,YAAAxB,EACA,OAAAD,EACA,QAAAE,EACA,GAAG0B,CACL,EAA2C,CACzC,KAAM,CAAE,MAAAzB,EAAO,MAAAtG,EAAO,MAAAjN,CAAA,EAAUmT,EAA+C,CAC7E,OAAAC,EACA,IAAAlB,EACA,OAAAE,EACA,QAAAkB,EACA,YAAcR,IACKO,EAAcA,EAAYP,CAAQ,EAAI4B,EAA0B5B,CAAQ,GACzE,IAAKlQ,GAAQ+R,EAAuB/R,EAAKgS,EAAaC,CAAa,CAAC,CACtF,CACD,EAKKI,EAAgBD,EAAc,QAAUzB,IAAU,SAAUvT,GAAA,YAAAA,EAAO,UAAW,yBAA2B,QAExG,OAAAF,EAAA,IAACyH,GAAkB,CAAA,GAAGyN,EAAe,QAAS/H,EAAO,QAASsG,IAAU,UAAW,MAAO0B,CAAe,CAAA,CAClH,CCxBO,SAASC,GAAiF,CAC/F,IAAAhD,EACA,OAAAE,EACA,YAAA+C,EACA,YAAAP,EACA,cAAAC,EACA,YAAAxB,EACA,gBAAA+B,EAAkB,EAClB,WAAAC,EAAa,IACb,OAAAjC,EACA,WAAAvL,EACA,mBAAAC,EACA,GAAGwN,CACL,EAA+C,CAC7C,KAAM,CAACC,EAAoBC,CAAqB,EAAInV,EAA6B,CAC/E,MAAOwH,EACP,aAAc,GACd,SAAUC,CAAA,CACX,EAEK2N,EAAsBnB,GAAkBiB,EAAoBF,CAAU,EACtEK,EAAcD,EAAoB,QAAUL,EAE5C,CAAE,MAAA7B,EAAO,MAAAtG,EAAO,MAAAjN,CAAA,EAAUmT,EAA+C,CAC7E,OAAAC,EACA,IAAAlB,EACA,QAASwD,EACT,OAAQ,CAAE,GAAGtD,EAAQ,CAAC+C,CAAW,EAAGM,CAAoB,EACxD,YAAc3C,IACKO,EAAcA,EAAYP,CAAQ,EAAI4B,EAA0B5B,CAAQ,GACzE,IAAKlQ,GAAQ+R,EAAuB/R,EAAKgS,EAAaC,CAAa,CAAC,CACtF,CACD,EAEKI,EACJK,EAAkB,QAAU/B,IAAU,SAAUvT,GAAA,YAAAA,EAAO,UAAW,6BAA+B,QAGjG,OAAAF,EAAA,IAAC8H,GAAA,CACE,GAAG0N,EACJ,QAASrI,EACT,QAASsG,IAAU,UACnB,MAAO0B,EACP,WAAYM,EACZ,mBAAoBC,EACpB,OAAQ,IAAM,EAAA,CAAA,CAGpB,CC5CO,SAASG,GAA0C,CACxD,IAAAzD,EACA,OAAAE,EACA,YAAAiB,EACA,cAAAuC,EACA,SAAAxM,EAAW,GACX,OAAAgK,EACA,GAAGyC,CACL,EAAyC,CACvC,KAAM,CAAC5M,EAAM6M,CAAO,EAAIhV,WAAS,CAAC,EAC5B,CAACiJ,EAAMgM,CAAO,EAAIjV,WAA8B,IAAI,EAEpD+S,EAAY5H,UAAQ,IAAM,KAAK,UAAUmG,GAAU,EAAE,EAAG,CAACA,CAAM,CAAC,EAChE4D,EAAgBrV,SAAO,EAAI,EACjC6D,EAAAA,UAAU,IAAM,CACd,GAAIwR,EAAc,QAAS,CACzBA,EAAc,QAAU,GACxB,MACF,CACAF,EAAQ,CAAC,CAAA,EACR,CAACjC,CAAS,CAAC,EAEd,MAAMoC,EAAgBhK,EAAA,QACpB,KAAO,CACL,GAAGmG,EACH,KAAAnJ,EACA,SAAAG,EACA,GAAIW,EAAO,CAAE,QAASA,EAAK,IAAK,cAAeA,EAAK,SAAU,EAAI,CAAC,CAAA,GAErE,CAACqI,EAAQnJ,EAAMG,EAAUW,CAAI,CAAA,EAGzBmM,EAAkBvV,EAAAA,OAA8B,MAAS,EAEzD,CAAE,MAAA4S,EAAO,MAAAtG,EAAO,MAAAjN,CAAA,EAAUmT,EAA+B,CAC7D,OAAAC,EACA,IAAAlB,EACA,OAAQ+D,EACR,YAAcnD,IACZoD,EAAgB,QAAUpD,EACnBO,EAAcA,EAAYP,CAAQ,EAAK4B,EAA0B5B,CAAQ,EAClF,CACD,EAEKqD,EAAqBD,EAAgB,UAAY,OAAYN,GAAA,YAAAA,EAAgBM,EAAgB,SAAW,OAMxGE,EADenJ,EAAM,QAAU7D,GAAYA,EAAW,EAClBH,EAAOG,EAAW,GAAKH,EAAO,GAAKG,EAAW6D,EAAM,OACxFhD,EAAakM,GAAsBC,EAGvC,OAAAtW,EAAA,IAAC4J,GAAA,CACE,GAAGmM,EACJ,KAAM5I,EACN,QAASsG,IAAU,UACnB,MAAOvT,GAAA,YAAAA,EAAO,QACd,KAAAiJ,EACA,SAAAG,EACA,WAAAa,EACA,aAAc6L,EACd,KAAA/L,EACA,aAAe7I,GAAS,CACtB6U,EAAQ7U,CAAI,EACZ4U,EAAQ,CAAC,CACX,CAAA,CAAA,CAGN,CCjFO,SAASO,GAA2E,CACzF,IAAAnE,EACA,OAAAE,EACA,YAAAwC,EACA,cAAAC,EACA,YAAAxB,EACA,OAAAD,EACA,QAAAE,EACA,GAAGgD,CACL,EAAyC,CACvC,KAAM,CAAE,MAAA/C,EAAO,MAAAtG,EAAO,MAAAjN,CAAA,EAAUmT,EAA+C,CAC7E,OAAAC,EACA,IAAAlB,EACA,OAAAE,EACA,QAAAkB,EACA,YAAcR,IACKO,EAAcA,EAAYP,CAAQ,EAAI4B,EAA0B5B,CAAQ,GACzE,IAAKlQ,GAAQ+R,EAAuB/R,EAAKgS,EAAaC,CAAa,CAAC,CACtF,CACD,EAEKI,EAAgBqB,EAAY,QAAU/C,IAAU,SAAUvT,GAAA,YAAAA,EAAO,UAAW,yBAA2B,QAEtG,OAAAF,EAAA,IAACoE,GAAgB,CAAA,GAAGoS,EAAa,QAASrJ,EAAO,QAASsG,IAAU,UAAW,MAAO0B,CAAe,CAAA,CAC9G,CC5BO,SAASsB,GAAgF,CAC9F,IAAArE,EACA,OAAAE,EACA,YAAAwC,EACA,cAAAC,EACA,YAAAxB,EACA,OAAAD,EACA,QAAAE,EACA,GAAGkD,CACL,EAA8C,CAC5C,KAAM,CAAE,MAAAjD,EAAO,MAAAtG,EAAO,MAAAjN,CAAA,EAAUmT,EAA+C,CAC7E,OAAAC,EACA,IAAAlB,EACA,OAAAE,EACA,QAAAkB,EACA,YAAcR,IACKO,EAAcA,EAAYP,CAAQ,EAAI4B,EAA0B5B,CAAQ,GACzE,IAAKlQ,GAAQ+R,EAAuB/R,EAAKgS,EAAaC,CAAa,CAAC,CACtF,CACD,EAEKI,EACJuB,EAAiB,QAAUjD,IAAU,SAAUvT,GAAA,YAAAA,EAAO,UAAW,yBAA2B,QAEvF,OAAAF,EAAA,IAAC2F,GAAqB,CAAA,GAAG+Q,EAAkB,QAASvJ,EAAO,QAASsG,IAAU,UAAW,MAAO0B,CAAe,CAAA,CACxH,CCbO,SAASwB,IAAuD,CAC/D,MAAAC,MAAgB,IAChBC,MAAa,IAEZ,MAAA,CACL,SAASC,EAAWC,EAAU,CAClBH,EAAA,IAAIE,EAAWC,CAAyB,CACpD,EACA,QAAQC,EAAUC,EAAK,CACrB,MAAMF,EAAWH,EAAU,IAAII,EAAS,SAAS,EACjD,OAAKD,EASEA,EAASC,EAAUC,CAAG,GARtBJ,EAAO,IAAIG,EAAS,SAAS,IACzBH,EAAA,IAAIG,EAAS,SAAS,EACrB,QAAA,KACN,gDAAgDA,EAAS,SAAS,aAAaA,EAAS,IAAI,eAAA,GAGzF,KAGX,EACA,IAAIF,EAAW,CACN,OAAAF,EAAU,IAAIE,CAAS,CAChC,CAAA,CAEJ,CCnCO,SAASI,GAA8BC,EAA8E,CACpH,MAAAC,EAAc,IAAI,IAAuC,OAAO,QAAQD,GAAW,CAAE,CAAA,CAAC,EAErF,MAAA,CACL,SAAS9W,EAAIgX,EAAY,CACXD,EAAA,IAAI/W,EAAIgX,CAAU,CAChC,EACA,QAAQhX,EAAI,CACH,OAAA+W,EAAY,IAAI/W,CAAE,CAC3B,CAAA,CAEJ,CClBO,SAASiX,IAAiD,CACzD,MAAAC,MAAe,IAEd,MAAA,CACL,SAASlX,EAAImX,EAAS,CACXD,EAAA,IAAIlX,EAAImX,CAAO,CAC1B,EACA,QAAQnX,EAAI,CACH,OAAAkX,EAAS,IAAIlX,CAAE,CACxB,CAAA,CAEJ,CCKA,SAASoX,GAAcT,EAA2G,CAChI,MAAO,eAAgBA,CACzB,CAEA,SAASU,GAAcC,EAAwDjY,EAAsE,CACnJ,GAAI,CAACiY,EAAkB,OACvB,MAAMC,EAAoC,CAAA,EAC1C,SAAW,CAACjO,EAAKkO,CAAG,IAAK,OAAO,QAAQF,CAAS,EACtCC,EAAAjO,CAAG,EAAIkO,EAAI,OAAS,SAAWA,EAAI,MAAQnY,EAAOmY,EAAI,KAAK,EAE/D,OAAAD,CACT,CAEA,SAASE,GAAYhV,EAAyB6G,EAAyBoO,EAAsE,CAC3I,OAAIpO,GAAOoO,EAAkBA,EAAUpO,CAAG,EACnC7G,CACT,CAWgB,SAAAkV,EACdhB,EACAhT,EACuB,CACjB,KAAA,CAAE,OAAAtE,EAAQ,UAAAqY,CAAc,EAAA/T,EAEvB,MAAA,CACL,SAAAgT,EACA,QAASA,EAAS,SAAW,GAC7B,SAAUA,EAAS,UAAY,GAC/B,SAAUA,EAAS,UAAY,GAC/B,SAAUA,EAAS,UAAY,GAC/B,MAAOc,GAAYd,EAAS,MAAOA,EAAS,SAAUe,CAAS,EAC/D,YAAaf,EAAS,YACtB,SAAUA,EAAS,SACnB,kBAAmBc,GAAYd,EAAS,kBAAmBA,EAAS,qBAAsBe,CAAS,EACnG,OAAQN,GAAcT,CAAQ,EAAIU,GAAcV,EAAS,WAAW,OAAQtX,CAAM,EAAI,MAAA,CAE1F,CAagB,SAAAuY,GACd1W,EACA2W,EACAlU,EACmC,CAC7B,MAAAgT,EAAWkB,GAAA,YAAAA,EAAc,OAAO,KAAMC,GAAUA,EAAM,OAAS5W,GACrE,GAAKyV,EAEE,OAAAgB,EAA0BhB,EAAUhT,CAAO,CACpD,CC7FA,MAAMoU,GAAqC,CAAA,EAE3C,SAASC,GAAK3Y,EAAiC4Y,EAAkD,CAC/F,MAAMxL,EAAkC,CAAA,EACxC,UAAWnD,KAAO2O,EAAaxL,EAAAnD,CAAG,EAAIjK,EAAOiK,CAAG,EACzC,OAAAmD,CACT,CAcgB,SAAAyL,GACdC,EACA9Y,EACA+Y,EACM,CACN,MAAMC,EAAUF,GAAaJ,GACvBO,EAAkBN,GAAK3Y,EAAQgZ,CAAO,EACtCE,EAAaF,EAAQ,SAAW,EAAI,GAAK,KAAK,UAAUC,CAAe,EAEvEE,EAAchY,SAAkE,IAAI,EACpFiY,EAAejY,SAAO4X,CAAuB,EACnDK,EAAa,QAAUL,EAEvB/T,EAAAA,UAAU,IAAM,OACd,GAAIgU,EAAQ,SAAW,EAAG,OAC1B,MAAMK,EAAWF,EAAY,QAEzB,GAAAE,GAAYA,EAAS,MAAQH,EAC/B,UAAWT,KAASO,EACb,OAAO,GAAGK,EAAS,SAASZ,CAAK,EAAGQ,EAAgBR,CAAK,CAAC,IAC7DhT,EAAA2T,EAAa,UAAb,MAAA3T,EAAA,KAAA2T,EAAuBX,GAK7BU,EAAY,QAAU,CAAE,IAAKD,EAAY,SAAUD,EAAgB,EAIlE,CAACC,CAAU,CAAC,CACjB,CCtBgB,SAAAI,GAA2BhC,EAA+BhT,EAAqD,CACvH,KAAA,CAAE,QAAAiO,EAAS,UAAA8F,CAAc,EAAA/T,EACzBwT,EAAUvF,EAAQ,QAAQ+E,EAAS,EAAE,EAEpC,MAAA,CACL,SAAAA,EACA,QAASA,EAAS,SAAW,GAC7B,SAAUA,EAAS,SAAW,KAAS,EAAQQ,EAC/C,MAAOR,EAAS,UAAYe,EAAYA,EAAUf,EAAS,QAAQ,EAAIA,EAAS,MAChF,QAAAQ,CAAA,CAEJ,CASgB,SAAAyB,GAAe5Y,EAAY6X,EAA6ClU,EAAiE,OACjJ,MAAAgT,GAAW7R,EAAA+S,GAAA,YAAAA,EAAc,UAAd,YAAA/S,EAAuB,KAAM+T,GAAWA,EAAO,KAAO7Y,GACvE,GAAK2W,EAEE,OAAAgC,GAA2BhC,EAAUhT,CAAO,CACrD,CC3Ca,MAAAmV,GAAoD,CAACnC,EAAUC,IAAQ,CAC5E,MAAAW,EAAWI,EAA0BhB,EAAU,CAAE,OAAQC,EAAI,OAAQ,UAAWA,EAAI,SAAW,CAAA,EACrG,GAAI,CAACW,EAAS,QAAgB,OAAA,KAE9B,MAAMwB,EAAgBnC,EAAI,YAAY,QAAQD,EAAS,WAAW,EAAE,EACpE,OAAKoC,EAMHpZ,EAAA,IAACiV,GAAA,CACC,MAAO2C,EAAS,MAChB,IAAKwB,EAAc,IACnB,OAAQA,EAAc,OACtB,OAAQxB,EAAS,OACjB,YAAaZ,EAAS,YACtB,cAAeA,EAAS,cACxB,SAAUY,EAAS,SACnB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,MAAOA,EAAS,kBAChB,MAAQX,EAAI,OAAOD,EAAS,IAAI,GAAyB,KACzD,SAAWxW,GAAUyW,EAAI,cAAcD,EAAS,KAAMxW,CAAK,CAAA,CAAA,GAlBrD,QAAA,KAAK,4CAA4CwW,EAAS,WAAW,EAAE,aAAaA,EAAS,IAAI,eAAe,EACjH,KAoBX,ECfMqC,GAA4E,CAChF,KAAO7Y,GAAWA,GAAS,KAAO,GAAK,OAAOA,CAAK,EACnD,QAAS,CAACA,EAAOuX,IAERA,EAAYA,EADPvX,EAAQ,qBAAuB,qBACX,EAAIA,EAAQ,MAAQ,KAEtD,KAAOA,GAAU,CACX,GAAAA,GAAS,MAAQA,IAAU,GAAW,MAAA,GACpC,MAAAgG,EAAOhG,aAAiB,KAAOA,EAAQ,IAAI,KAAK,OAAOA,CAAK,CAAC,EAC5D,OAAA,OAAO,MAAMgG,EAAK,QAAS,CAAA,EAAI,OAAOhG,CAAK,EAAIgG,EAAK,oBAC7D,EACA,SAAWhG,GAAU,CACb,MAAA8Y,EAAS,OAAO9Y,CAAK,EAC3B,OAAO,OAAO,SAAS8Y,CAAM,EAAIA,EAAO,eAAe,OAAW,CAAE,MAAO,WAAY,SAAU,KAAO,CAAA,EAAI,OAAO9Y,GAAS,EAAE,CAChI,CACF,EAEA,SAAS+Y,GAAc/O,EAA6BuN,EAAmE,CACrH,GAAIvN,EAAO,UAAY,GAAc,OAAA,KAC/B,MAAAgE,EAAShE,EAAO,WAAauN,EAAYA,EAAUvN,EAAO,SAAS,EAAIA,EAAO,QAAUA,EAAO,IAC/FgP,EAAYhP,EAAO,OAAS6O,GAAW7O,EAAO,MAAM,EAAI,OAEvD,MAAA,CACL,IAAKA,EAAO,IACZ,OAAAgE,EACA,SAAUhE,EAAO,SACjB,OAAQgP,EAAa/O,GAAQ+O,EAAU/O,EAAID,EAAO,GAAG,EAAGuN,CAAS,EAAI,MAAA,CAEzE,CAUa,MAAA0B,GAAoD,CAACzC,EAAUC,IAAQ,CAC5E,MAAAW,EAAWI,EAA0BhB,EAAU,CAAE,OAAQC,EAAI,OAAQ,UAAWA,EAAI,SAAW,CAAA,EACrG,GAAI,CAACW,EAAS,QAAgB,OAAA,KAE9B,MAAMwB,EAAgBnC,EAAI,YAAY,QAAQD,EAAS,WAAW,EAAE,EACpE,GAAI,CAACoC,EACK,eAAA,KAAK,4CAA4CpC,EAAS,WAAW,EAAE,aAAaA,EAAS,IAAI,eAAe,EACjH,KAGT,MAAMnN,EAAUmN,EAAS,QACtB,IAAKxM,GAAW+O,GAAc/O,EAAQyM,EAAI,SAAS,CAAC,EACpD,OAAQzM,GAA+CA,IAAW,IAAI,EAEnEkP,EAAkB1C,EAAS,gBAC3BlB,EAAgB4D,EACjB1G,GAAsB,CACf,MAAAxS,EAASwS,GAAA,YAAAA,EAA8C0G,GACtD,OAAA,OAAOlZ,GAAU,SAAWA,EAAQ,MAE7C,EAAA,OAGF,OAAAR,EAAA,IAAC6V,GAAA,CACC,IAAKuD,EAAc,IACnB,OAAQA,EAAc,OACtB,OAAQxB,EAAS,OACjB,QAAA/N,EACA,OAASY,GAAQA,EAAIuM,EAAS,MAAM,EACpC,cAAAlB,CAAA,CAAA,CAGN,ECjFA,SAAS6D,GAAanZ,EAA6C,CACjE,GAAI,CAACA,EAAc,OACb,MAAAgG,EAAO,IAAI,KAAKhG,CAAK,EAC3B,OAAO,OAAO,MAAMgG,EAAK,QAAQ,CAAC,EAAI,OAAYA,CACpD,CAEa,MAAAoT,GAAwD,CAAC5C,EAAUC,IAAQ,CAChF,MAAAW,EAAWI,EAA0BhB,EAAU,CAAE,OAAQC,EAAI,OAAQ,UAAWA,EAAI,SAAW,CAAA,EACrG,OAAKW,EAAS,QAGZ5X,EAAA,IAAC8G,GAAA,CACC,MAAO8Q,EAAS,MAChB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,MAAOA,EAAS,kBAChB,IAAK+B,GAAa3C,EAAS,OAAO,EAClC,IAAK2C,GAAa3C,EAAS,OAAO,EAClC,MAAQC,EAAI,OAAOD,EAAS,IAAI,GAAqB,KACrD,SAAWxW,GAAUyW,EAAI,cAAcD,EAAS,KAAMxW,CAAK,CAAA,CAAA,EAbjC,IAgBhC,EC3BaqZ,GAA8C,CAAC7C,EAAUC,IAAQ,CACtE,MAAAW,EAAWI,EAA0BhB,EAAU,CAAE,OAAQC,EAAI,OAAQ,UAAWA,EAAI,SAAW,CAAA,EACrG,OAAKW,EAAS,QAGZ5X,EAAA,IAACqB,EAAA,CACC,MAAOuW,EAAS,MAChB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,SAAUA,EAAS,SACnB,YAAaA,EAAS,YACtB,MAAOA,EAAS,kBAChB,UAAWZ,EAAS,UACpB,MAAQC,EAAI,OAAOD,EAAS,IAAI,GAAgB,GAChD,SAAWxW,GAAUyW,EAAI,cAAcD,EAAS,KAAMxW,CAAK,CAAA,CAAA,EAbjC,IAgBhC,ECdO,SAASsZ,GAAyBC,EAAwC,CACtEA,EAAA,SAAS,QAASF,EAAa,EAC/BE,EAAA,SAAS,WAAYZ,EAAgB,EACrCY,EAAA,SAAS,aAAcH,EAAkB,EACzCG,EAAA,SAAS,WAAYN,EAAgB,CAChD,CCCO,SAASO,GAAW,CAAE,SAAAhD,EAAU,IAAAC,GAA6C,CAClF,MAAMgD,EAAgBhD,EAAI,wBAO1B,OANAsB,GACEvB,EAAS,UACTC,EAAI,OACJgD,EAAiBC,GAAiBD,EAAcjD,EAAS,KAAMkD,CAAY,EAAI,MAAA,EAG7ElD,EAAS,UAAY,GAAc,KAChCC,EAAI,SAAS,QAAQD,EAAUC,CAAG,CAC3C,CCpBA,MAAMkD,GAAyB,EAE/B,SAASC,GAAyBC,EAA0B,CAC1D,MAAMC,EAAQ,OAAOD,EAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,EAC1C,OAAO,OAAO,SAASC,CAAK,GAAKA,IAAUH,EAC7C,CAcO,SAASI,GAAU,CAAE,SAAAvD,EAAU,IAAAC,GAAuB,CAC3D,OAAKmD,GAAyBpD,EAAS,aAAa,EAU/ChX,EAAA,IAAA2I,EAAA,SAAA,CAAA,SAAAqO,EAAS,OAAO,IAAKmB,GACpBnY,EAAAA,IAACga,GAA4B,CAAA,SAAU7B,EAAO,IAAAlB,CAAA,EAA7BkB,EAAM,IAAiC,CACzD,CACH,CAAA,EAXE7V,EAAA,KAAC0I,GAAM,CAAA,QAAQ,SAAS,SAAA,CAAA,oCACiBgM,EAAS,cAAc,2CAA8CmD,GAAuB,KACrI,CAAA,CAAA,CAWN,CC5BO,SAASK,GAAY,CAAE,SAAAxD,EAAU,IAAAC,GAAyB,CACzD,MAAAW,EAAWoB,GAA2BhC,EAAUC,CAAG,EACzD,OAAKW,EAAS,QAGX5X,EAAAA,IAAA6K,EAAA,CAAO,SAAU,CAAC+M,EAAS,QAAS,QAAS,IAAA,OAAM,OAAAzS,EAAAyS,EAAS,UAAT,YAAAzS,EAAA,KAAAyS,IACjD,SAASA,EAAA,OAASZ,EAAS,EAC9B,CAAA,EAL4B,IAOhC,CCVO,SAASyD,GAAa,CAAE,SAAAzD,EAAU,IAAAC,GAA0B,CACjE,MAAI,CAACD,EAAS,SAAWA,EAAS,QAAQ,SAAW,EAAU,KAI1DhX,EAAA,IAAA2I,EAAA,SAAA,CAAA,SAAAqO,EAAS,QAAQ,IAAKkC,GACrBlZ,EAAAA,IAACwa,GAA4B,CAAA,SAAUtB,EAAQ,IAAAjC,CAAA,EAA7BiC,EAAO,EAAgC,CAC1D,CACH,CAAA,CAEJ"}
|
|
1
|
+
{"version":3,"file":"index.cjs","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/Icon.tsx","../src/base/Tabs.tsx","../src/base/Accordion.tsx","../src/base/Tooltip.tsx","../src/base/Popover.tsx","../src/base/Skeleton.tsx","../src/base/Stack.tsx","../src/base/Text.tsx","../src/base/Card.tsx","../src/base/Divider.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/Slider.tsx","../src/base/Rating.tsx","../src/base/ProgressBar.tsx","../src/base/Navbar.tsx","../src/base/Sidebar.tsx","../src/base/PageHeader.tsx","../src/base/Flex.tsx","../src/base/IconButton.tsx","../src/base/ListItem.tsx","../src/base/Sparkline.tsx","../src/base/Statistic.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 type DataGridAlign = \"start\" | \"center\" | \"end\";\n\n/**\n * Closed, finite formatter set — the same contract the Smart layer's\n * `format` metadata already targeted, now owned here instead of being\n * duplicated in a second Smart-side formatter map (doc: \"Base DataGrid owns\n * reusable presentation capability, Smart chooses a supported formatter\").\n * Never accepts an arbitrary/serialized function — that stays Smart's\n * closed-enum contract too.\n */\nexport type DataGridFormat = \"text\" | \"date\" | \"currency\" | \"boolean\";\n\nexport const dataGridFormatters: Record<DataGridFormat, (value: unknown) => ReactNode> = {\n text: (value) => (value == null ? \"\" : String(value)),\n boolean: (value) => (value ? \"Yes\" : \"No\"),\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\nexport interface DataGridColumn<TRow> {\n /** Row-identity/sort key. Defaults to `field` when omitted — required only if `field` is also omitted (a fully custom `render`-only column). */\n key?: string;\n /** Row property this column reads its value from — strongly typed against `TRow`. Enables the declarative `align`/`format`/`formatter` path below instead of a `render` callback. */\n field?: keyof TRow & string;\n header: string;\n align?: DataGridAlign;\n /** Defaults to `align` when omitted. */\n headerAlign?: DataGridAlign;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n sortable?: boolean;\n /** Built-in formatter selection — the normal way to display a field (see `dataGridFormatters`). */\n format?: DataGridFormat;\n /** Escape hatch for a computed display value that still gets the standard aligned cell wrapper. */\n formatter?: (value: unknown, row: TRow) => ReactNode;\n /** Escape hatch for a fully custom cell — the exception, not the default way to display a field. */\n render?: (row: TRow) => ReactNode;\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\nfunction columnKeyOf<TRow>(column: DataGridColumn<TRow>): string {\n return column.key ?? column.field ?? column.header;\n}\n\nfunction columnValueOf<TRow>(column: DataGridColumn<TRow>, row: TRow): unknown {\n const accessor = column.field ?? column.key;\n return accessor ? (row as Record<string, unknown>)[accessor] : undefined;\n}\n\nfunction renderCell<TRow>(column: DataGridColumn<TRow>, row: TRow): ReactNode {\n if (column.render) return column.render(row);\n const value = columnValueOf(column, row);\n if (column.formatter) return column.formatter(value, row);\n if (column.format) return dataGridFormatters[column.format](value);\n return value == null ? \"\" : String(value);\n}\n\nfunction alignClass(align: DataGridAlign | undefined): string | undefined {\n return align && `text-${align}`;\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 const key = columnKeyOf(column);\n return (\n <th\n key={key}\n className={alignClass(column.headerAlign ?? column.align)}\n style={{ width: column.width, minWidth: column.minWidth, maxWidth: column.maxWidth }}\n role={column.sortable ? \"button\" : undefined}\n onClick={column.sortable && onSortChange ? () => onSortChange(nextSortDirection(sort, key)) : undefined}\n >\n {column.header}\n {column.sortable && sort?.key === key && <span aria-hidden=\"true\"> {sort.direction === \"asc\" ? \"▲\" : \"▼\"}</span>}\n </th>\n );\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={columnKeyOf(column)} className={alignClass(column.align)}>\n {renderCell(column, row)}\n </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 { 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 { useRef, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Badge } from \"./Badge\";\nimport { Icon } from \"./Icon\";\nimport { cx } from \"./shared/classNames\";\nimport { useControllableState } from \"./shared/useControllableState\";\n\nexport type TabsVariant = \"default\" | \"underline\" | \"pill\" | \"card\" | \"button\";\nexport type TabsOrientation = \"horizontal\" | \"vertical\";\nexport type TabsSize = \"sm\" | \"lg\";\n\nexport interface TabItem {\n key: string;\n label: ReactNode;\n /** Icon class name(s), passed straight through to `Icon` (icon-set agnostic — doc section 15). */\n icon?: string;\n badge?: ReactNode;\n disabled?: boolean;\n /**\n * Optional — a tab can be nav-only (content driven externally, e.g. by\n * the same `activeKey` state feeding a sibling `DataGrid`) instead of\n * owning its panel.\n */\n content?: ReactNode;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n activeKey?: string;\n defaultActiveKey?: string;\n onChange?: (key: string) => void;\n /** Generic nav look, not a Metronic widget name — express a Metronic visual as `variant=\"pill\"` + `icon`, not a new named variant. */\n variant?: TabsVariant;\n orientation?: TabsOrientation;\n size?: TabsSize;\n /** Tab list fills its container width (`nav-fill`). */\n stretch?: boolean;\n className?: string;\n}\n\nfunction navClass(variant: TabsVariant): string {\n switch (variant) {\n case \"pill\":\n return \"nav-pills\";\n case \"underline\":\n return \"nav-underline\";\n case \"card\":\n return \"nav-tabs card-header-tabs\";\n default:\n return \"nav-tabs\";\n }\n}\n\nconst SIZE_CLASS: Record<TabsSize, string> = {\n sm: \"small\",\n lg: \"fs-5\",\n};\n\n/** Tab definitions (`items`) are kept separate from rendering, per doc section 16. */\nexport function Tabs({ items, activeKey, defaultActiveKey, onChange, variant = \"default\", orientation = \"horizontal\", size, stretch, 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 const isButtonVariant = variant === \"button\";\n const isVertical = orientation === \"vertical\";\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n function activate(index: number, focus: boolean) {\n const item = items[index];\n if (!item) return;\n setKey(item.key);\n if (focus) tabRefs.current[index]?.focus();\n }\n\n function findEnabled(from: number, step: 1 | -1): number {\n if (items.length === 0) return from;\n let index = from;\n for (let i = 0; i < items.length; i++) {\n index = (index + step + items.length) % items.length;\n if (!items[index]?.disabled) return index;\n }\n return from;\n }\n\n /** Roving-tabindex arrow-key navigation with automatic activation, per the WAI-ARIA Tabs authoring pattern. */\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const currentIndex = items.findIndex((item) => item.key === currentKey);\n const nextKey = isVertical ? \"ArrowDown\" : \"ArrowRight\";\n const prevKey = isVertical ? \"ArrowUp\" : \"ArrowLeft\";\n\n if (event.key === nextKey) {\n event.preventDefault();\n activate(findEnabled(currentIndex, 1), true);\n } else if (event.key === prevKey) {\n event.preventDefault();\n activate(findEnabled(currentIndex, -1), true);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n const first = items.findIndex((item) => !item.disabled);\n if (first >= 0) activate(first, true);\n } else if (event.key === \"End\") {\n event.preventDefault();\n for (let i = items.length - 1; i >= 0; i--) {\n if (!items[i]?.disabled) {\n activate(i, true);\n break;\n }\n }\n }\n }\n\n const tabList = (\n <div\n className={cx(\n isButtonVariant ? \"btn-group\" : \"nav\",\n !isButtonVariant && navClass(variant),\n !isButtonVariant && isVertical && \"flex-column\",\n !isButtonVariant && stretch && \"nav-fill\",\n !isButtonVariant && size && SIZE_CLASS[size]\n )}\n role=\"tablist\"\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n >\n {items.map((item, index) => {\n const active = item.key === currentKey;\n const buttonContent = (\n <>\n {item.icon && <Icon name={item.icon} size=\"sm\" className=\"me-1\" />}\n {item.label}\n {item.badge != null && (\n <Badge variant={active && !isButtonVariant ? \"primary\" : \"secondary\"} pill className=\"ms-2\">\n {item.badge}\n </Badge>\n )}\n </>\n );\n\n const button = (\n <button\n key={item.key}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n type=\"button\"\n id={`tab-${item.key}`}\n className={cx(isButtonVariant ? cx(\"btn\", size ? `btn-${size}` : \"btn-sm\", active ? \"btn-primary\" : \"btn-outline-primary\") : cx(\"nav-link\", active && \"active\"))}\n role=\"tab\"\n aria-selected={active}\n aria-controls={`tabpanel-${item.key}`}\n tabIndex={active ? 0 : -1}\n disabled={item.disabled}\n onClick={() => activate(index, false)}\n >\n {buttonContent}\n </button>\n );\n\n return isButtonVariant ? button : (\n <div key={item.key} className=\"nav-item\" role=\"presentation\">\n {button}\n </div>\n );\n })}\n </div>\n );\n\n const panel = activeItem?.content != null && (\n <div id={`tabpanel-${activeItem.key}`} className={cx(\"tab-content\", !isVertical && \"pt-3\")} role=\"tabpanel\" aria-labelledby={`tab-${activeItem.key}`}>\n {activeItem.content}\n </div>\n );\n\n if (isVertical) {\n return (\n <div className={cx(\"d-flex align-items-start gap-3\", className)}>\n {tabList}\n {panel && <div className=\"flex-grow-1\">{panel}</div>}\n </div>\n );\n }\n\n return (\n <div className={className}>\n {tabList}\n {panel}\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 { 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 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 { ElementType, ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type TextWeight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\nexport type TextTone = \"default\" | \"muted\" | \"primary\" | \"success\" | \"danger\" | \"warning\" | \"info\";\nexport type TextAlign = \"start\" | \"center\" | \"end\";\n\nexport interface TextProps {\n /** Rendered element — defaults to `span`. Pass e.g. `\"h3\"`/`\"p\"`/`\"label\"` for a semantic element without losing the typography contract. */\n as?: ElementType;\n size?: TextSize;\n weight?: TextWeight;\n tone?: TextTone;\n align?: TextAlign;\n /** Single-line ellipsis truncation. */\n truncate?: boolean;\n /** `false` disables wrapping (`text-nowrap`) without truncating. */\n wrap?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\n// em-based sizing (like Icon's SIZE_EM) rather than Bootstrap's fs-1..fs-6\n// heading scale or Metronic's fs-7/fs-8 extension — keeps Text usable in\n// any consuming app regardless of which font-size utilities it ships.\nconst SIZE_REM: Record<TextSize, string> = {\n xs: \"0.75rem\",\n sm: \"0.875rem\",\n md: \"1rem\",\n lg: \"1.25rem\",\n xl: \"1.5rem\",\n};\n\nconst WEIGHT_CLASS: Record<TextWeight, string> = {\n normal: \"fw-normal\",\n medium: \"fw-medium\",\n semibold: \"fw-semibold\",\n bold: \"fw-bold\",\n};\n\nconst TONE_CLASS: Record<TextTone, string | undefined> = {\n default: undefined,\n muted: \"text-body-secondary\",\n primary: \"text-primary\",\n success: \"text-success\",\n danger: \"text-danger\",\n warning: \"text-warning\",\n info: \"text-info\",\n};\n\n/** Generic typography primitive — replaces ad hoc `<span className=\"text-gray-500 fw-semibold fs-7\">` markup at call sites. */\nexport function Text({ as, size = \"md\", weight, tone = \"default\", align, truncate, wrap = true, className, children }: TextProps) {\n const Component = as ?? \"span\";\n\n return (\n <Component\n className={cx(\n weight && WEIGHT_CLASS[weight],\n TONE_CLASS[tone],\n align && `text-${align}`,\n truncate && \"text-truncate\",\n !wrap && !truncate && \"text-nowrap\",\n className\n )}\n style={{ fontSize: SIZE_REM[size] }}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Stack } from \"./Stack\";\nimport { Text } from \"./Text\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface CardProps {\n /** Standard header — renders an icon/avatar + title + subtitle row with a right-aligned actions slot, no manual header markup required. */\n title?: ReactNode;\n subtitle?: ReactNode;\n /** Mutually exclusive with `avatar` — `avatar` wins if both are given. */\n icon?: ReactNode;\n avatar?: ReactNode;\n /** Right-aligned header slot, typically Buttons/IconButtons/Menu. */\n actions?: ReactNode;\n /**\n * Escape hatch for header content the title/subtitle/icon/avatar/actions\n * shape can't express. Wins over all of the above when provided.\n */\n header?: ReactNode;\n footer?: ReactNode;\n /** Replaces `children` with a generic loading skeleton (reuses `Skeleton`, doc: no bespoke shimmer). */\n loading?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nfunction DefaultHeader({ title, subtitle, icon, avatar, actions }: Pick<CardProps, \"title\" | \"subtitle\" | \"icon\" | \"avatar\" | \"actions\">) {\n return (\n <div className=\"d-flex align-items-center justify-content-between gap-3\">\n <div className=\"d-flex align-items-center gap-3\" style={{ minWidth: 0 }}>\n {avatar ? avatar : icon && <span className=\"fs-2 lh-1\">{icon}</span>}\n {(title || subtitle) && (\n <div style={{ minWidth: 0 }}>\n {title && (\n <Text as=\"div\" size=\"lg\" weight=\"semibold\" truncate>\n {title}\n </Text>\n )}\n {subtitle && (\n <Text as=\"div\" size=\"sm\" tone=\"muted\" truncate>\n {subtitle}\n </Text>\n )}\n </div>\n )}\n </div>\n {actions && <div className=\"d-flex align-items-center gap-2 flex-shrink-0\">{actions}</div>}\n </div>\n );\n}\n\n/** Generic content container — the most basic layout primitive, used to group everything else. */\nexport function Card({ title, subtitle, icon, avatar, actions, header, footer, loading, className, children }: CardProps) {\n const hasStandardHeader = Boolean(title || subtitle || icon || avatar || actions);\n const resolvedHeader = header ?? (hasStandardHeader ? <DefaultHeader title={title} subtitle={subtitle} icon={icon} avatar={avatar} actions={actions} /> : undefined);\n\n return (\n <div className={cx(\"card\", className)}>\n {resolvedHeader && <div className=\"card-header\">{resolvedHeader}</div>}\n <div className=\"card-body\">\n {loading ? (\n <Stack gap={2}>\n <Skeleton height=\"1rem\" width=\"60%\" />\n <Skeleton height=\"1rem\" />\n <Skeleton height=\"1rem\" width=\"80%\" />\n </Stack>\n ) : (\n children\n )}\n </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 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 { 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 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","import { Stack, type StackProps } from \"./Stack\";\nimport { cx } from \"./shared/classNames\";\n\nexport type FlexGap = NonNullable<StackProps[\"gap\"]> | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst GAP_TOKEN: Record<\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\", NonNullable<StackProps[\"gap\"]>> = {\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n};\n\nexport interface FlexProps extends Omit<StackProps, \"gap\"> {\n gap?: FlexGap;\n /** `flex-grow-1` on the container itself (for a Flex nested inside another flex layout). */\n grow?: boolean;\n /** `flex-shrink-0` on the container itself. */\n shrink?: boolean;\n /** `w-100`. */\n fullWidth?: boolean;\n}\n\nfunction resolveGap(gap: FlexGap): NonNullable<StackProps[\"gap\"]> {\n return typeof gap === \"number\" ? gap : GAP_TOKEN[gap];\n}\n\n/**\n * Arbitrary flex layout on top of the same `d-flex` machinery Stack already\n * owns (doc: \"do not duplicate Stack\") — only the defaults and the extra\n * grow/shrink/fullWidth concerns differ. Stack defaults to a column\n * (vertical list of children); Flex defaults to a row, matching the\n * `<div className=\"d-flex align-items-center justify-content-between\">`\n * call sites it's meant to replace.\n */\nexport function Flex({ direction = \"row\", gap = \"sm\", grow, shrink, fullWidth, className, ...rest }: FlexProps) {\n return (\n <Stack\n direction={direction}\n gap={resolveGap(gap)}\n className={cx(grow && \"flex-grow-1\", shrink && \"flex-shrink-0\", fullWidth && \"w-100\", className)}\n {...rest}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button, type ButtonProps } from \"./Button\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { Tooltip } from \"./Tooltip\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface IconButtonProps extends Omit<ButtonProps, \"children\"> {\n /** Icon class name(s), passed straight through to `Icon` (icon-set agnostic — doc section 15). */\n icon: string;\n /** Required — an icon-only control has no visible text, so it must carry its own accessible name. */\n \"aria-label\": string;\n iconSize?: IconProps[\"size\"];\n /** Optional tooltip, composed from the existing `Tooltip` primitive rather than a second hover-label implementation. */\n tooltip?: ReactNode;\n}\n\n/** Composes Button + Icon (doc: reuse, don't build a second button system) for the common icon-only action button. */\nexport function IconButton({ icon, \"aria-label\": ariaLabel, iconSize, tooltip, variant = \"light\", loading, className, ...rest }: IconButtonProps) {\n const button = (\n <Button variant={variant} loading={loading} className={cx(\"btn-icon\", className)} aria-label={ariaLabel} {...rest}>\n {!loading && <Icon name={icon} size={iconSize} />}\n </Button>\n );\n\n return tooltip ? <Tooltip content={tooltip}>{button}</Tooltip> : button;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"./shared/classNames\";\n\nexport interface ListItemProps {\n /** Typically an `Avatar` or `Icon`. */\n leading?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n /** Typically an `IconButton`, `Badge`, or `Sparkline`. */\n trailing?: ReactNode;\n /** Presence makes the row an interactive `<button>` (established row-action pattern). */\n onClick?: () => void;\n disabled?: boolean;\n /** Tighter vertical rhythm for dense lists (e.g. inside a DataGrid cell). */\n dense?: boolean;\n className?: string;\n}\n\n/**\n * Generic leading/title-description/trailing row — the same shape as MUI's\n * `ListItem` + `ListItemAvatar` + `ListItemText` or Ant Design's\n * `List.Item.Meta`. Replaces repeated `<div className=\"d-flex\n * align-items-center\"><Avatar/><div><span/><span/></div></div>` markup.\n * Intentionally has no domain-specific counterpart (no `AuthorItem`/\n * `UserItem`) — callers pass whatever leading/title/description/trailing\n * content their row needs.\n */\nexport function ListItem({ leading, title, description, trailing, onClick, disabled, dense, className }: ListItemProps) {\n const content = (\n <>\n {leading && <span className=\"flex-shrink-0 d-inline-flex align-items-center\">{leading}</span>}\n <span className=\"flex-grow-1\" style={{ minWidth: 0 }}>\n <span className=\"d-block text-truncate\">{title}</span>\n {description && <span className=\"d-block text-truncate small text-body-secondary\">{description}</span>}\n </span>\n {trailing && <span className=\"flex-shrink-0 d-inline-flex align-items-center\">{trailing}</span>}\n </>\n );\n\n const rowClassName = cx(\n \"d-flex align-items-center text-start\",\n dense ? \"gap-2 py-1\" : \"gap-3 py-2\",\n onClick && \"w-100 border-0 bg-transparent\",\n disabled && \"opacity-50\",\n className\n );\n\n if (onClick) {\n return (\n <button type=\"button\" className={rowClassName} onClick={onClick} disabled={disabled}>\n {content}\n </button>\n );\n }\n\n return (\n <div className={rowClassName} aria-disabled={disabled || undefined}>\n {content}\n </div>\n );\n}\n","import { cx } from \"./shared/classNames\";\n\nexport type SparklineType = \"line\" | \"area\" | \"bar\";\nexport type SparklineTone = \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"warning\" | \"info\" | \"dark\";\n\nexport interface SparklineProps {\n type?: SparklineType;\n data: number[];\n tone?: SparklineTone;\n width?: number;\n height?: number;\n strokeWidth?: number;\n className?: string;\n /** Accessible label — omit for a purely decorative chart (default: aria-hidden), same convention as `Icon`. */\n label?: string;\n}\n\nfunction buildLinePoints(data: number[], width: number, height: number, padding: number): Array<[number, number]> {\n if (data.length === 0) return [];\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n const innerWidth = width - padding * 2;\n const innerHeight = height - padding * 2;\n const step = data.length > 1 ? innerWidth / (data.length - 1) : 0;\n\n return data.map((value, index) => {\n const x = padding + step * index;\n const y = padding + innerHeight - ((value - min) / range) * innerHeight;\n return [x, y];\n });\n}\n\nfunction LineOrArea({ type, data, width, height, strokeWidth }: { type: \"line\" | \"area\"; data: number[]; width: number; height: number; strokeWidth: number }) {\n const padding = strokeWidth;\n const points = buildLinePoints(data, width, height, padding);\n if (points.length === 0) return null;\n\n const linePoints = points.map(([x, y]) => `${x},${y}`).join(\" \");\n\n return (\n <>\n {type === \"area\" && (\n <polygon\n points={`${padding},${height - padding} ${linePoints} ${width - padding},${height - padding}`}\n fill=\"currentColor\"\n opacity={0.2}\n stroke=\"none\"\n />\n )}\n <polyline points={linePoints} fill=\"none\" stroke=\"currentColor\" strokeWidth={strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </>\n );\n}\n\nfunction Bars({ data, width, height }: { data: number[]; width: number; height: number }) {\n if (data.length === 0) return null;\n const min = Math.min(0, ...data);\n const max = Math.max(0, ...data);\n const range = max - min || 1;\n const gap = 2;\n const barWidth = Math.max((width - gap * (data.length - 1)) / data.length, 1);\n\n return (\n <>\n {data.map((value, index) => {\n const barHeight = Math.max(((value - min) / range) * height, 1);\n const x = index * (barWidth + gap);\n const y = height - barHeight;\n return <rect key={index} x={x} y={y} width={barWidth} height={barHeight} rx={1} fill=\"currentColor\" />;\n })}\n </>\n );\n}\n\n/**\n * Compact inline chart — the established dashboard \"sparkline\" concept\n * (MUI X `SparkLineChart`, DevExtreme/Kendo Sparkline). Implemented with\n * plain inline SVG rather than a charting dependency: this repo doesn't\n * already depend on one, and a public API shaped around `data`/`type`/\n * `tone` stays implementation-agnostic either way (doc: avoid unnecessary\n * dependencies; don't leak chart-library config as the public API).\n */\nexport function Sparkline({ type = \"line\", data, tone = \"primary\", width = 80, height = 28, strokeWidth = 2, className, label }: SparklineProps) {\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx(`text-${tone}`, className)}\n role={label ? \"img\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n >\n {type === \"bar\" ? <Bars data={data} width={width} height={height} /> : <LineOrArea type={type} data={data} width={width} height={height} strokeWidth={strokeWidth} />}\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Icon } from \"./Icon\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Text, type TextTone } from \"./Text\";\nimport { cx } from \"./shared/classNames\";\n\nexport type StatisticTrend = \"up\" | \"down\" | \"neutral\";\n\nexport interface StatisticProps {\n label: ReactNode;\n value: number | string;\n prefix?: ReactNode;\n suffix?: ReactNode;\n /** Decimal places applied when `value` is a number. */\n precision?: number;\n trend?: StatisticTrend;\n delta?: ReactNode;\n loading?: boolean;\n className?: string;\n}\n\nconst TREND_TONE: Record<StatisticTrend, TextTone> = {\n up: \"success\",\n down: \"danger\",\n neutral: \"muted\",\n};\n\nconst TREND_ICON: Record<StatisticTrend, string> = {\n up: \"bi bi-arrow-up-short\",\n down: \"bi bi-arrow-down-short\",\n neutral: \"bi bi-dash\",\n};\n\nfunction formatValue(value: number | string, precision?: number): string {\n return typeof value === \"number\" && precision != null ? value.toFixed(precision) : String(value);\n}\n\n/** Label/value/prefix/suffix/trend — the established dashboard \"Statistic\"/\"Stat\" pattern (MUI, Ant Design, Mantine). No dashboard business logic. */\nexport function Statistic({ label, value, prefix, suffix, precision, trend, delta, loading, className }: StatisticProps) {\n return (\n <div className={cx(\"d-flex flex-column gap-1\", className)}>\n <Text size=\"sm\" tone=\"muted\">\n {label}\n </Text>\n\n {loading ? (\n <Skeleton height=\"1.75rem\" width=\"60%\" />\n ) : (\n <div className=\"d-flex align-items-baseline gap-1\">\n {prefix && (\n <Text size=\"lg\" weight=\"semibold\">\n {prefix}\n </Text>\n )}\n <Text size=\"xl\" weight=\"bold\">\n {formatValue(value, precision)}\n </Text>\n {suffix && (\n <Text size=\"lg\" weight=\"semibold\">\n {suffix}\n </Text>\n )}\n </div>\n )}\n\n {!loading && (trend || delta != null) && (\n <Text size=\"sm\" tone={trend ? TREND_TONE[trend] : \"muted\"} className=\"d-inline-flex align-items-center gap-1\">\n {trend && <Icon name={TREND_ICON[trend]} size=\"sm\" />}\n {delta}\n </Text>\n )}\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;\n\n/**\n * `format` is a closed enum resolved onto Base DataGrid's own\n * `dataGridFormatters` (text/date/currency/boolean) — Smart requests a\n * formatter, it does not maintain a second rendering system for it (doc\n * §10/§24). Add a new format to Base's `DataGridFormat`, not a `render`\n * field on the metadata.\n *\n * `boolean` is the one case Smart still touches directly, because it's a\n * localization concern Base can't own: with a translate function supplied,\n * the reserved catalog keys below are authoritative, same as label/header\n * resolution elsewhere in Smart — no silent English fallback once a\n * catalog exists. Without translate, it still falls back to Base's own\n * plain \"Yes\"/\"No\", so no behavior is duplicated, only localized.\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 isLocalizedBoolean = column.format === \"boolean\" && Boolean(translate);\n\n return {\n key: column.key,\n header,\n sortable: column.sortable,\n format: isLocalizedBoolean ? undefined : column.format,\n formatter: isLocalizedBoolean\n ? (value) => translate!(value ? \"smart.boolean.true\" : \"smart.boolean.false\")\n : 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","dataGridFormatters","amount","nextSortDirection","key","columnKeyOf","column","columnValueOf","row","accessor","renderCell","alignClass","align","DataGrid","columns","rowKey","selectedRowKeys","onSelectionChange","sort","onSortChange","totalCount","selectable","paginated","toggleAll","toggleRow","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","SIZE_EM","Icon","navClass","SIZE_CLASS","Tabs","items","activeKey","defaultActiveKey","orientation","stretch","currentKey","setKey","activeItem","item","isButtonVariant","isVertical","tabRefs","activate","focus","findEnabled","from","i","currentIndex","nextKey","prevKey","first","tabList","buttonContent","button","node","panel","Accordion","openKeys","defaultOpenKeys","currentOpenKeys","setOpenKeys","openSet","toggle","k","Tooltip","content","placement","tooltipId","Popover","Skeleton","width","height","circle","Stack","direction","gap","justify","wrap","SIZE_REM","WEIGHT_CLASS","TONE_CLASS","Text","as","weight","tone","truncate","Component","DefaultHeader","subtitle","icon","avatar","actions","Card","header","resolvedHeader","Divider","vertical","Container","fluid","Row","Col","span","sm","md","lg","xl","Breadcrumb","isLast","isInteractive","Menu","Stepper","steps","currentStep","status","getInitials","last","DIMENSION","Avatar","src","dimension","Tag","onRemove","Slider","Rating","_","n","ProgressBar","clamped","Navbar","brand","isGroup","section","SidebarLink","Sidebar","sections","PageHeader","description","breadcrumbItems","GAP_TOKEN","resolveGap","Flex","grow","shrink","fullWidth","IconButton","ariaLabel","iconSize","tooltip","ListItem","leading","trailing","dense","rowClassName","buildLinePoints","data","padding","range","innerWidth","innerHeight","x","y","LineOrArea","strokeWidth","points","linePoints","Bars","barWidth","barHeight","Sparkline","TREND_TONE","TREND_ICON","formatValue","precision","Statistic","prefix","suffix","trend","delta","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","resolveColumn","isLocalizedBoolean","dataGridResolver","totalCountField","parseIsoDate","datePickerResolver","inputResolver","registerBuiltInResolvers","registry","SmartField","notifyRefresh","changedField","SUPPORTED_SCHEMA_MAJOR","isSupportedSchemaVersion","version","major","SmartForm","SmartAction","SmartActions"],"mappings":"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"}
|