@arqel-dev/fields 0.15.0 → 0.15.1
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 +2 -2
- package/dist/color.js +3 -1
- package/dist/color.js.map +1 -1
- package/dist/date.js +83 -3
- package/dist/date.js.map +1 -1
- package/dist/file.js +8 -5
- package/dist/file.js.map +1 -1
- package/dist/index.js +138 -36
- package/dist/index.js.map +1 -1
- package/dist/number.js +30 -18
- package/dist/number.js.map +1 -1
- package/dist/register.js +138 -36
- package/dist/register.js.map +1 -1
- package/dist/relationship.js +9 -6
- package/dist/relationship.js.map +1 -1
- package/dist/select.js +5 -1
- package/dist/select.js.map +1 -1
- package/dist/slug.js +4 -2
- package/dist/slug.js.map +1 -1
- package/dist/text.js +3 -1
- package/dist/text.js.map +1 -1
- package/package.json +6 -4
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/styles.ts","../src/boolean/Checkbox.tsx","../src/boolean/Toggle.tsx","../src/color/ColorInput.tsx","../src/date/DateInput.tsx","../src/date/DateTimeInput.tsx","../src/file/FileInput.tsx","../src/file/ImageInput.tsx","../src/hidden/HiddenInput.tsx","../src/number/CurrencyInput.tsx","../src/number/NumberInput.tsx","../src/relationship/BelongsToInput.tsx","../src/relationship/HasManyReadonly.tsx","../src/shared/options.ts","../src/select/MultiSelectInput.tsx","../src/select/RadioGroup.tsx","../src/select/SelectInput.tsx","../src/slug/SlugInput.tsx","../src/text/EmailInput.tsx","../src/text/PasswordInput.tsx","../src/text/TextareaInput.tsx","../src/text/TextInput.tsx","../src/text/UrlInput.tsx","../src/register.ts"],"names":["jsx","cn","jsxs","useState","useEffect"],"mappings":"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","file":"register.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","import type { BooleanFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { checkboxClasses } from '../shared/styles.js';\n\nexport function Checkbox({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as BooleanFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"checkbox\"\n className={checkboxClasses}\n checked={value === true}\n disabled={disabled || f.disabled || f.readonly}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n}\n","/**\n * `<Toggle>` — switch-style boolean control with optional on/off labels.\n *\n * Renders as a `role=\"switch\"` button so screen readers announce it\n * correctly; styling is the canonical iOS-style track/thumb.\n */\n\nimport type { ToggleFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function Toggle({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as ToggleFieldSchema;\n const checked = value === true;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div className=\"flex items-center gap-3\">\n <button\n id={inputId}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n disabled={isDisabled}\n onClick={() => onChange(!checked)}\n className={cn(\n 'relative inline-flex h-6 w-11 items-center rounded-full transition-colors',\n checked ? 'bg-primary' : 'bg-muted',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0.5',\n )}\n />\n </button>\n {(f.props.onLabel || f.props.offLabel) && (\n <span className=\"text-sm text-muted-foreground\">\n {checked ? f.props.onLabel : f.props.offLabel}\n </span>\n )}\n </div>\n );\n}\n","/**\n * `<ColorInput>` — native color picker plus optional preset swatches.\n *\n * `field.props.presets: string[]` (hex strings) renders a strip of\n * clickable swatches above the picker. The native `<input type=\"color\">`\n * is a/11y-friendly out of the box.\n */\n\nimport type { ColorFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function ColorInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as ColorFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n const current = typeof value === 'string' && value.length > 0 ? value : '#000000';\n const presets = f.props.presets ?? [];\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <input\n id={inputId}\n type=\"color\"\n className={cn(\n 'h-9 w-12 cursor-pointer rounded-sm border border-[var(--input)]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n value={current}\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n <input\n type=\"text\"\n className=\"h-9 w-28 rounded-sm border border-[var(--input)] bg-background px-2 font-mono text-xs\"\n value={current}\n disabled={isDisabled}\n onChange={(e) => onChange(e.target.value)}\n />\n {presets.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {presets.map((preset) => (\n <button\n key={preset}\n type=\"button\"\n aria-label={`Preset ${preset}`}\n disabled={isDisabled}\n onClick={() => onChange(preset)}\n className=\"h-6 w-6 rounded-full border border-border disabled:cursor-not-allowed disabled:opacity-50\"\n style={{ backgroundColor: preset }}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * `<DateInput>` — native `<input type=\"date\">`.\n *\n * Phase 1 leans on the browser's built-in date picker for footprint\n * reasons. A `react-day-picker`-based custom picker lands in Phase 2\n * when we need locale-specific formatting + min/max enforcement\n * beyond what the native control provides.\n */\n\nimport type { DateFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function DateInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as DateFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"date\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.minDate}\n max={f.props.maxDate}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n","import type { DateTimeFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function DateTimeInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as DateTimeFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"datetime-local\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.minDate}\n max={f.props.maxDate}\n step={f.props.seconds ? 1 : undefined}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n","/**\n * `<FileInput>` — drag-drop file picker.\n *\n * Phase 1 stores the selected `File` object directly in the form\n * state; the actual upload happens server-side via Inertia's\n * multipart-aware form submission. Progress events are exposed\n * via `useArqelForm`'s `progress` field (Inertia native).\n */\n\nimport type { FileFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useState } from 'react';\n\nexport function FileInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as FileFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n const [dragOver, setDragOver] = useState(false);\n\n const file = value instanceof File ? value : null;\n const filename = file?.name ?? (typeof value === 'string' ? value : null);\n\n const handleFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return;\n onChange(files[0]);\n };\n\n return (\n <section\n aria-label=\"File upload\"\n onDragOver={(e) => {\n e.preventDefault();\n if (!isDisabled) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (!isDisabled) handleFiles(e.dataTransfer.files);\n }}\n className={cn(\n 'flex flex-col items-center justify-center gap-2 rounded-sm border-2 border-dashed px-4 py-6 text-sm',\n dragOver ? 'border-primary bg-muted' : 'border-border',\n hasError && 'border-destructive',\n isDisabled && 'opacity-50',\n )}\n >\n {filename ? (\n <span className=\"font-medium\">{filename}</span>\n ) : (\n <span className=\"text-muted-foreground\">Drag a file here or click to browse</span>\n )}\n <label className=\"cursor-pointer text-xs text-primary hover:underline\">\n {filename ? 'Choose another file' : 'Browse'}\n <input\n id={inputId}\n type=\"file\"\n className=\"sr-only\"\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => handleFiles(e.target.files)}\n />\n </label>\n </section>\n );\n}\n","/**\n * `<ImageInput>` — image picker with preview.\n *\n * Phase 1 ships preview-only (URL or local `URL.createObjectURL`).\n * Crop / aspect-ratio editor lands in Phase 2 with `react-image-crop`.\n */\n\nimport type { ImageFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useEffect, useState } from 'react';\n\nexport function ImageInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as ImageFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n\n useEffect(() => {\n if (value instanceof File) {\n const url = URL.createObjectURL(value);\n setPreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n }\n if (typeof value === 'string' && value.length > 0) {\n setPreviewUrl(value);\n return undefined;\n }\n setPreviewUrl(null);\n return undefined;\n }, [value]);\n\n return (\n <div className=\"flex flex-col gap-2\">\n {previewUrl && (\n <img\n src={previewUrl}\n alt=\"Preview\"\n className={cn('max-h-40 w-auto rounded-sm border border-border')}\n />\n )}\n <label\n className={cn(\n 'inline-flex w-fit cursor-pointer items-center gap-2 rounded-sm border border-border px-3 py-1.5 text-sm',\n 'hover:bg-muted',\n isDisabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {previewUrl ? 'Replace image' : 'Choose image'}\n <input\n id={inputId}\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) onChange(file);\n }}\n />\n </label>\n </div>\n );\n}\n","/**\n * `<HiddenInput>` — `type=\"hidden\"` value carrier.\n *\n * The wrapping `<FieldRenderer>` already skips the visible label when\n * `field.label` is empty/null, so server-side `HiddenField::label(null)`\n * keeps the form layout tight. The component just renders the input.\n */\n\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\n\nexport function HiddenInput({ field, value, inputId }: FieldRendererProps) {\n return (\n <input\n id={inputId}\n type=\"hidden\"\n name={field.name}\n value={value === null || value === undefined ? '' : String(value)}\n readOnly\n />\n );\n}\n","/**\n * `<CurrencyInput>` — number input with currency display when blurred.\n *\n * While focused, the input shows the raw numeric value (decimal point\n * normalised). On blur, the value is reformatted via Intl.NumberFormat\n * using the field's `prefix`/`thousandsSeparator`/`decimalSeparator`\n * props (server-emitted from `CurrencyField`).\n */\n\nimport type { CurrencyFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function CurrencyInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as CurrencyFieldSchema;\n const [focused, setFocused] = useState(false);\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const numeric =\n typeof value === 'number' ? value : value === '' || value == null ? null : Number(value);\n const decimals = f.props.decimals ?? 2;\n\n const formatted =\n numeric === null || Number.isNaN(numeric)\n ? ''\n : `${f.props.prefix}${formatNumber(numeric, decimals, f.props.thousandsSeparator, f.props.decimalSeparator)}${f.props.suffix ?? ''}`;\n\n const display = focused ? (numeric === null ? '' : String(numeric)) : formatted;\n\n return (\n <input\n id={inputId}\n type={focused ? 'number' : 'text'}\n inputMode=\"decimal\"\n className={inputClasses}\n value={display}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.min}\n max={f.props.max}\n step={f.props.step ?? 10 ** -decimals}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') {\n onChange(null);\n return;\n }\n const num = Number(raw);\n onChange(Number.isNaN(num) ? null : num);\n }}\n />\n );\n}\n\nfunction formatNumber(num: number, decimals: number, thousands: string, decimal: string): string {\n const fixed = num.toFixed(decimals);\n const [whole, frac] = fixed.split('.');\n const safeWhole = (whole ?? '0').replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousands);\n return frac ? `${safeWhole}${decimal}${frac}` : safeWhole;\n}\n","/**\n * `<NumberInput>` — numeric input with optional stepper buttons.\n *\n * Empty string is normalised to `null`; non-numeric inputs are also\n * sent as `null` so server-side validation rules see typed values.\n */\n\nimport type { NumberFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function NumberInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as NumberFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const setValue = (raw: number) => {\n if (Number.isNaN(raw)) {\n onChange(null);\n return;\n }\n if (f.props.integer) onChange(Math.trunc(raw));\n else onChange(raw);\n };\n\n const current = typeof value === 'number' ? value : null;\n const step = typeof f.props.step === 'number' ? f.props.step : 1;\n\n return (\n <div className=\"relative inline-flex w-full\">\n <input\n id={inputId}\n type=\"number\"\n inputMode={f.props.integer ? 'numeric' : 'decimal'}\n className={cn(inputClasses, 'pr-16')}\n value={current === null ? '' : String(current)}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.min}\n max={f.props.max}\n step={f.props.step}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n if (e.target.value === '') {\n onChange(null);\n return;\n }\n setValue(Number(e.target.value));\n }}\n />\n <div className=\"absolute inset-y-0 right-0 flex flex-col\">\n <button\n type=\"button\"\n aria-label=\"Increment\"\n disabled={isDisabled}\n onClick={() => setValue((current ?? 0) + step)}\n className=\"flex h-1/2 w-8 items-center justify-center text-xs text-muted-foreground hover:text-foreground disabled:opacity-50\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n aria-label=\"Decrement\"\n disabled={isDisabled}\n onClick={() => setValue((current ?? 0) - step)}\n className=\"flex h-1/2 w-8 items-center justify-center text-xs text-muted-foreground hover:text-foreground disabled:opacity-50\"\n >\n ▼\n </button>\n </div>\n </div>\n );\n}\n","/**\n * `<BelongsToInput>` — async-search picker for belongsTo relationships.\n *\n * Hits the search route emitted server-side (`field.props.searchRoute`,\n * registered by `arqel-dev/fields` `FieldSearchController`) with a 300ms\n * debounce. Returned options are { value: id, label: title } pairs.\n *\n * Phase 1 ships a list-rendered picker (combobox with native `<input>`\n * + `<ul>`); Base UI Combobox lands in a follow-up.\n */\n\nimport type { BelongsToFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useEffect, useRef, useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\ninterface SearchResult {\n value: string | number;\n label: string;\n}\n\nexport function BelongsToInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as BelongsToFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult[]>([]);\n const [open, setOpen] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!f.props.searchRoute || !query) {\n setResults([]);\n return;\n }\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const url = `${f.props.searchRoute}?q=${encodeURIComponent(query)}`;\n fetch(url, { signal: controller.signal, headers: { Accept: 'application/json' } })\n .then((r) => (r.ok ? r.json() : []))\n .then((data) => {\n if (Array.isArray(data)) setResults(data);\n })\n .catch(() => {\n /* aborts/network — silently swallow */\n });\n }, 300);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [query, f.props.searchRoute]);\n\n const selectedLabel = results.find((r) => String(r.value) === String(value))?.label;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={\n open\n ? query\n : (selectedLabel ?? (value === null || value === undefined ? '' : String(value)))\n }\n placeholder={f.placeholder ?? `Search ${f.props.relatedResource}…`}\n disabled={isDisabled}\n readOnly={!(f.readonly === true || f.readonly === undefined)}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n aria-expanded={open}\n aria-controls={`${inputId}-listbox`}\n role=\"combobox\"\n onFocus={() => setOpen(true)}\n onBlur={() => setTimeout(() => setOpen(false), 100)}\n onChange={(e) => setQuery(e.target.value)}\n />\n {open && results.length > 0 && (\n <div\n id={`${inputId}-listbox`}\n role=\"listbox\"\n className={cn(\n 'absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-sm border border-border bg-background shadow-md',\n )}\n >\n {results.map((r) => (\n <div\n key={String(r.value)}\n role=\"option\"\n aria-selected={String(r.value) === String(value)}\n tabIndex={-1}\n className=\"cursor-pointer px-3 py-1.5 text-sm hover:bg-muted\"\n onMouseDown={(e) => {\n e.preventDefault();\n onChange(r.value);\n setQuery('');\n setOpen(false);\n }}\n >\n {r.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * `<HasManyReadonly>` — flat read-only list of related records.\n *\n * Phase 1 ships a stacked list (label + id). The full inline-table\n * editor lives behind FIELDS-JS-003 follow-up since editable nested\n * collections require their own change-set tracking.\n */\n\nimport type { HasManyFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\n\ninterface RelatedRecord {\n id: string | number;\n label?: string;\n [key: string]: unknown;\n}\n\nexport function HasManyReadonly({ field, value, inputId, describedBy }: FieldRendererProps) {\n const f = field as HasManyFieldSchema;\n const items: RelatedRecord[] = Array.isArray(value) ? (value as RelatedRecord[]) : [];\n\n if (items.length === 0) {\n return (\n <p id={inputId} aria-describedby={describedBy} className=\"text-sm text-muted-foreground\">\n No {f.props.relatedResource} linked.\n </p>\n );\n }\n\n return (\n <ul\n id={inputId}\n aria-describedby={describedBy}\n className=\"divide-y divide-[var(--border)] rounded-sm border border-border\"\n >\n {items.map((item) => (\n <li\n key={String(item.id)}\n className=\"flex items-center justify-between gap-3 px-3 py-2 text-sm\"\n >\n <span>{item.label ?? `#${item.id}`}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{item.id}</span>\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * Normalises the polymorphic `options` shape on Select/Radio fields:\n * the server can emit either an array (`[{value, label}, …]`) or an\n * object (`{ value: 'Label' }`). Components only need the array form.\n */\n\nexport interface NormalisedOption {\n value: string | number;\n label: string;\n}\n\nexport function normaliseOptions(options: unknown): NormalisedOption[] {\n if (!options) return [];\n if (Array.isArray(options)) {\n return options.filter(\n (o): o is NormalisedOption =>\n typeof o === 'object' && o !== null && 'value' in o && 'label' in o,\n );\n }\n if (typeof options === 'object') {\n return Object.entries(options as Record<string, string>).map(([value, label]) => ({\n value,\n label,\n }));\n }\n return [];\n}\n","/**\n * `<MultiSelectInput>` — chip-list multi-select.\n *\n * Selected items render as removable chips above the option dropdown.\n * Backed by a native `<select multiple>` for a11y; the chip strip is\n * presentation-only and writes back through the same `onChange`.\n */\n\nimport type { MultiSelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function MultiSelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as MultiSelectFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n const selectedSet = new Set(arr.map(String));\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const remove = (v: string | number) => {\n onChange(arr.filter((x) => String(x) !== String(v)));\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arr.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {arr.map((v) => {\n const opt = options.find((o) => String(o.value) === String(v));\n return (\n <span\n key={String(v)}\n className=\"inline-flex items-center gap-1 rounded-sm bg-muted px-2 py-0.5 text-xs\"\n >\n {opt?.label ?? String(v)}\n {!isDisabled && (\n <button\n type=\"button\"\n aria-label={`Remove ${opt?.label ?? String(v)}`}\n onClick={() => remove(v)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n )}\n </span>\n );\n })}\n </div>\n )}\n <select\n id={inputId}\n multiple\n className={cn(inputClasses, 'h-auto min-h-[6rem] py-1')}\n value={Array.from(selectedSet)}\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n","/**\n * `<RadioGroup>` — radio buttons in a `role=\"radiogroup\"`.\n *\n * Honours `props.inline` to lay items out horizontally vs the default\n * stacked layout.\n */\n\nimport type { RadioFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function RadioGroup({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as RadioFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div\n id={inputId}\n role=\"radiogroup\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn('flex gap-3', f.props.inline ? 'flex-row flex-wrap' : 'flex-col')}\n >\n {(f.props.options ?? []).map((opt) => {\n const checked = String(value ?? '') === String(opt.value);\n return (\n <label key={String(opt.value)} className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={f.name}\n value={String(opt.value)}\n checked={checked}\n disabled={isDisabled}\n onChange={() => onChange(opt.value)}\n className=\"h-4 w-4 border-[var(--input)] text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n","/**\n * `<SelectInput>` — single-value select.\n *\n * Phase 1 ships the native `<select>` for predictability and\n * a11y-by-default. A searchable Combobox (Base UI) variant lands in\n * FIELDS-JS-003 follow-up when `props.searchable === true`.\n */\n\nimport type { SelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SelectFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n\n return (\n <select\n id={inputId}\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n disabled={disabled || f.disabled || f.readonly}\n required={f.required === true}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n {(f.placeholder || !f.required) && <option value=\"\">{f.placeholder ?? '—'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n","/**\n * `<SlugInput>` — auto-generated URL-safe slug.\n *\n * Phase 1 ships a manual slug field (text input with slug normalisation\n * on every keystroke). Auto-derivation from a source field (`dependsOn`)\n * lands as a follow-up because it requires either FormContext access\n * or a dependency-resolver pipeline that we don't yet expose.\n *\n * Reserved slug detection (`field.props.reservedSlugs`) is enforced\n * server-side via the Validator; the input itself just normalises.\n */\n\nimport type { SlugFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SlugInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SlugFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? 'my-resource-slug'}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n autoComplete=\"off\"\n pattern=\"^[a-z0-9-]*$\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(slugify(e.target.value))}\n />\n );\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n","/**\n * `<EmailInput>` — `<input type=\"email\">` with sensible defaults.\n *\n * Mirrors browser email validation; server-side validation remains the\n * source of truth (Laravel `email` rule).\n */\n\nimport type { EmailFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function EmailInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as EmailFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"email\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'email'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<PasswordInput>` — masked input with a \"reveal\" toggle button.\n *\n * Toggles between `type=\"password\"` and `type=\"text\"`; the button\n * is rendered inside the trailing edge of the input via wrapper.\n */\n\nimport type { PasswordFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function PasswordInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as PasswordFieldSchema;\n const [revealed, setRevealed] = useState(false);\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type={revealed ? 'text' : 'password'}\n className={cn(inputClasses, 'pr-10')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'current-password'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n <button\n type=\"button\"\n aria-label={revealed ? 'Hide password' : 'Show password'}\n aria-pressed={revealed}\n disabled={isDisabled}\n onClick={() => setRevealed((v) => !v)}\n className={cn(\n 'absolute inset-y-0 right-0 flex w-9 items-center justify-center text-sm',\n 'text-muted-foreground hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {revealed ? '◉' : '○'}\n </button>\n </div>\n );\n}\n","import type { TextareaFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextareaInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextareaFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <textarea\n id={inputId}\n className={cn(inputClasses, 'h-auto min-h-[5rem] py-2')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n rows={4}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<TextInput>` — generic single-line text field.\n *\n * Used as the registered component for FieldType `text` and `slug`.\n * Slug-specific auto-generation logic lives in FIELDS-JS-004's\n * `<SlugInput>`; this component is the simple text path.\n */\n\nimport type { TextFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n minLength={f.props.minLength}\n pattern={f.props.pattern}\n autoComplete={f.props.autocomplete}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","import type { UrlFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function UrlInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as UrlFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"url\"\n inputMode=\"url\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? 'https://…'}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'url'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * Side-effect import that registers every built-in field component\n * into `@arqel-dev/ui`'s FieldRegistry.\n *\n * import '@arqel-dev/fields/register';\n *\n * The component name passed to `registerField()` matches the value\n * emitted by `Field::component()` server-side (e.g. `'TextInput'`).\n * Apps can re-register their own components after this import to\n * override defaults.\n */\n\nimport { registerField } from '@arqel-dev/ui/form';\nimport { Checkbox, Toggle } from './boolean/index.js';\nimport { ColorInput } from './color/index.js';\nimport { DateInput, DateTimeInput } from './date/index.js';\nimport { FileInput, ImageInput } from './file/index.js';\nimport { HiddenInput } from './hidden/index.js';\nimport { CurrencyInput, NumberInput } from './number/index.js';\nimport { BelongsToInput, HasManyReadonly } from './relationship/index.js';\nimport { MultiSelectInput, RadioGroup, SelectInput } from './select/index.js';\nimport { SlugInput } from './slug/index.js';\nimport { EmailInput, PasswordInput, TextareaInput, TextInput, UrlInput } from './text/index.js';\n\nregisterField('TextInput', TextInput);\nregisterField('TextareaInput', TextareaInput);\nregisterField('EmailInput', EmailInput);\nregisterField('UrlInput', UrlInput);\nregisterField('PasswordInput', PasswordInput);\nregisterField('NumberInput', NumberInput);\nregisterField('CurrencyInput', CurrencyInput);\nregisterField('Checkbox', Checkbox);\nregisterField('Toggle', Toggle);\nregisterField('SelectInput', SelectInput);\nregisterField('MultiSelectInput', MultiSelectInput);\nregisterField('RadioGroup', RadioGroup);\nregisterField('BelongsToInput', BelongsToInput);\nregisterField('HasManyReadonly', HasManyReadonly);\nregisterField('DateInput', DateInput);\nregisterField('DateTimeInput', DateTimeInput);\nregisterField('FileInput', FileInput);\nregisterField('ImageInput', ImageInput);\nregisterField('SlugInput', SlugInput);\nregisterField('ColorInput', ColorInput);\nregisterField('HiddenInput', HiddenInput);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/styles.ts","../src/boolean/Checkbox.tsx","../src/boolean/Toggle.tsx","../src/color/ColorInput.tsx","../src/date/DateInput.tsx","../src/date/DateTimeInput.tsx","../src/file/FileInput.tsx","../src/file/ImageInput.tsx","../src/hidden/HiddenInput.tsx","../src/number/CurrencyInput.tsx","../src/number/NumberInput.tsx","../src/relationship/BelongsToInput.tsx","../src/relationship/HasManyReadonly.tsx","../src/shared/options.ts","../src/select/MultiSelectInput.tsx","../src/select/RadioGroup.tsx","../src/select/SelectInput.tsx","../src/slug/SlugInput.tsx","../src/text/EmailInput.tsx","../src/text/PasswordInput.tsx","../src/text/TextareaInput.tsx","../src/text/TextInput.tsx","../src/text/UrlInput.tsx","../src/register.ts"],"names":["jsx","cn","jsxs","useArqelTranslations","useState","useEffect"],"mappings":"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","file":"register.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","import type { BooleanFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { checkboxClasses } from '../shared/styles.js';\n\nexport function Checkbox({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as BooleanFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"checkbox\"\n className={checkboxClasses}\n checked={value === true}\n disabled={disabled || f.disabled || f.readonly}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n}\n","/**\n * `<Toggle>` — switch-style boolean control with optional on/off labels.\n *\n * Renders as a `role=\"switch\"` button so screen readers announce it\n * correctly; styling is the canonical iOS-style track/thumb.\n */\n\nimport type { ToggleFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function Toggle({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as ToggleFieldSchema;\n const checked = value === true;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div className=\"flex items-center gap-3\">\n <button\n id={inputId}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n disabled={isDisabled}\n onClick={() => onChange(!checked)}\n className={cn(\n 'relative inline-flex h-6 w-11 items-center rounded-full transition-colors',\n checked ? 'bg-primary' : 'bg-muted',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0.5',\n )}\n />\n </button>\n {(f.props.onLabel || f.props.offLabel) && (\n <span className=\"text-sm text-muted-foreground\">\n {checked ? f.props.onLabel : f.props.offLabel}\n </span>\n )}\n </div>\n );\n}\n","/**\n * `<ColorInput>` — native color picker plus optional preset swatches.\n *\n * `field.props.presets: string[]` (hex strings) renders a strip of\n * clickable swatches above the picker. The native `<input type=\"color\">`\n * is a/11y-friendly out of the box.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ColorFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function ColorInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as ColorFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n const current = typeof value === 'string' && value.length > 0 ? value : '#000000';\n const presets = f.props.presets ?? [];\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <input\n id={inputId}\n type=\"color\"\n className={cn(\n 'h-9 w-12 cursor-pointer rounded-sm border border-[var(--input)]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n value={current}\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n <input\n type=\"text\"\n className=\"h-9 w-28 rounded-sm border border-[var(--input)] bg-background px-2 font-mono text-xs\"\n value={current}\n disabled={isDisabled}\n onChange={(e) => onChange(e.target.value)}\n />\n {presets.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {presets.map((preset) => (\n <button\n key={preset}\n type=\"button\"\n aria-label={t('arqel.fields.color.preset_aria', 'Preset :color', { color: preset })}\n disabled={isDisabled}\n onClick={() => onChange(preset)}\n className=\"h-6 w-6 rounded-full border border-border disabled:cursor-not-allowed disabled:opacity-50\"\n style={{ backgroundColor: preset }}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * `<DateInput>` — native `<input type=\"date\">`.\n *\n * Phase 1 leans on the browser's built-in date picker for footprint\n * reasons. A `react-day-picker`-based custom picker lands in Phase 2\n * when we need locale-specific formatting + min/max enforcement\n * beyond what the native control provides.\n */\n\nimport type { DateFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function DateInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as DateFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"date\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.minDate}\n max={f.props.maxDate}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n );\n}\n","import type { DateTimeFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\n/**\n * Detect whether a value string carries an absolute instant — i.e. an\n * explicit UTC `Z` or a numeric `±HH:MM` offset. A bare wall-clock string\n * (`2024-01-02T03:04`) has no zone and is shown as-is.\n */\nfunction hasZone(value: string): boolean {\n return /[zZ]$|[+-]\\d{2}:?\\d{2}$/.test(value.trim());\n}\n\n/**\n * Render an absolute `Date` as the `datetime-local` wall-clock string\n * (`YYYY-MM-DDTHH:mm[:ss]`) observed in `timeZone`. Uses `Intl` parts so\n * the conversion honours DST without pulling in a date library. Falls back\n * to the runtime zone if `Intl` rejects the zone.\n */\nfunction toZonedLocalInput(date: Date, timeZone: string, withSeconds: boolean): string {\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...(withSeconds ? { second: '2-digit' } : {}),\n };\n let parts: Intl.DateTimeFormatPart[];\n try {\n parts = new Intl.DateTimeFormat('en-CA', { ...options, timeZone }).formatToParts(date);\n } catch {\n parts = new Intl.DateTimeFormat('en-CA', options).formatToParts(date);\n }\n const get = (type: Intl.DateTimeFormatPartTypes): string =>\n parts.find((p) => p.type === type)?.value ?? '00';\n // `Intl` may emit a literal `24` for midnight in some engines; normalise.\n const hour = get('hour') === '24' ? '00' : get('hour');\n const date_ = `${get('year')}-${get('month')}-${get('day')}`;\n const time = withSeconds\n ? `${hour}:${get('minute')}:${get('second')}`\n : `${hour}:${get('minute')}`;\n return `${date_}T${time}`;\n}\n\n/**\n * Inverse of {@link toZonedLocalInput}: interpret a wall-clock string as a\n * local time in `timeZone` and return the equivalent absolute UTC ISO\n * instant, so the edited value round-trips to the server in the same zone\n * the field declared. Computed by measuring the zone's offset at that\n * instant via `Intl` (DST-aware) and subtracting it.\n */\nfunction zonedLocalInputToIso(wallClock: string, timeZone: string): string {\n // Treat the wall-clock as if it were UTC, then correct by the zone offset.\n const asUtc = new Date(`${wallClock}Z`);\n if (Number.isNaN(asUtc.getTime())) return wallClock;\n const offsetMs = zoneOffsetMs(asUtc, timeZone);\n return new Date(asUtc.getTime() - offsetMs).toISOString();\n}\n\n/** Offset (ms) of `timeZone` from UTC at the given instant, DST-aware. */\nfunction zoneOffsetMs(date: Date, timeZone: string): number {\n try {\n const dtf = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n const parts = dtf.formatToParts(date);\n const get = (type: Intl.DateTimeFormatPartTypes): number =>\n Number(parts.find((p) => p.type === type)?.value ?? '0');\n const hour = get('hour') === 24 ? 0 : get('hour');\n const asIfUtc = Date.UTC(\n get('year'),\n get('month') - 1,\n get('day'),\n hour,\n get('minute'),\n get('second'),\n );\n return asIfUtc - date.getTime();\n } catch {\n return 0;\n }\n}\n\nexport function DateTimeInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as DateTimeFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n // `timezone` is server-emitted from `DateTimeField->timezone(...)`. When set\n // and the incoming value is an absolute instant, the native datetime-local\n // control — which always renders in the *browser* zone — would otherwise show\n // the wrong wall-clock time. Convert into the declared zone for display and\n // back to a UTC instant on edit so the stored moment is preserved.\n const timeZone = f.props.timezone;\n const withSeconds = f.props.seconds === true;\n\n const raw = typeof value === 'string' ? value : '';\n let display = raw;\n if (timeZone !== undefined && timeZone !== '' && raw !== '' && hasZone(raw)) {\n const parsed = new Date(raw);\n if (!Number.isNaN(parsed.getTime())) {\n display = toZonedLocalInput(parsed, timeZone, withSeconds);\n }\n }\n\n return (\n <input\n id={inputId}\n type=\"datetime-local\"\n className={inputClasses}\n value={display}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.minDate}\n max={f.props.maxDate}\n step={withSeconds ? 1 : undefined}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = e.target.value;\n if (next === '') {\n onChange(null);\n return;\n }\n // Re-anchor the edited wall-clock to the declared zone so the value\n // sent back is an absolute instant, not a browser-local string.\n if (timeZone !== undefined && timeZone !== '') {\n onChange(zonedLocalInputToIso(next, timeZone));\n return;\n }\n onChange(next);\n }}\n />\n );\n}\n","/**\n * `<FileInput>` — drag-drop file picker.\n *\n * Phase 1 stores the selected `File` object directly in the form\n * state; the actual upload happens server-side via Inertia's\n * multipart-aware form submission. Progress events are exposed\n * via `useArqelForm`'s `progress` field (Inertia native).\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { FileFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useState } from 'react';\n\nexport function FileInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as FileFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n const [dragOver, setDragOver] = useState(false);\n\n const file = value instanceof File ? value : null;\n const filename = file?.name ?? (typeof value === 'string' ? value : null);\n\n const handleFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return;\n onChange(files[0]);\n };\n\n return (\n <section\n aria-label={t('arqel.fields.file.upload', 'File upload')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!isDisabled) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (!isDisabled) handleFiles(e.dataTransfer.files);\n }}\n className={cn(\n 'flex flex-col items-center justify-center gap-2 rounded-sm border-2 border-dashed px-4 py-6 text-sm',\n dragOver ? 'border-primary bg-muted' : 'border-border',\n hasError && 'border-destructive',\n isDisabled && 'opacity-50',\n )}\n >\n {filename ? (\n <span className=\"font-medium\">{filename}</span>\n ) : (\n <span className=\"text-muted-foreground\">\n {t('arqel.fields.file.drop_hint', 'Drag a file here or click to browse')}\n </span>\n )}\n <label className=\"cursor-pointer text-xs text-primary hover:underline\">\n {filename\n ? t('arqel.fields.file.choose_another', 'Choose another file')\n : t('arqel.fields.file.browse', 'Browse')}\n <input\n id={inputId}\n type=\"file\"\n className=\"sr-only\"\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => handleFiles(e.target.files)}\n />\n </label>\n </section>\n );\n}\n","/**\n * `<ImageInput>` — image picker with preview.\n *\n * Phase 1 ships preview-only (URL or local `URL.createObjectURL`).\n * Crop / aspect-ratio editor lands in Phase 2 with `react-image-crop`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ImageFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useEffect, useState } from 'react';\n\nexport function ImageInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as ImageFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n\n useEffect(() => {\n if (value instanceof File) {\n const url = URL.createObjectURL(value);\n setPreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n }\n if (typeof value === 'string' && value.length > 0) {\n setPreviewUrl(value);\n return undefined;\n }\n setPreviewUrl(null);\n return undefined;\n }, [value]);\n\n return (\n <div className=\"flex flex-col gap-2\">\n {previewUrl && (\n <img\n src={previewUrl}\n alt={t('arqel.fields.image.preview_alt', 'Preview')}\n className={cn('max-h-40 w-auto rounded-sm border border-border')}\n />\n )}\n <label\n className={cn(\n 'inline-flex w-fit cursor-pointer items-center gap-2 rounded-sm border border-border px-3 py-1.5 text-sm',\n 'hover:bg-muted',\n isDisabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {previewUrl\n ? t('arqel.fields.image.replace', 'Replace image')\n : t('arqel.fields.image.choose', 'Choose image')}\n <input\n id={inputId}\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) onChange(file);\n }}\n />\n </label>\n </div>\n );\n}\n","/**\n * `<HiddenInput>` — `type=\"hidden\"` value carrier.\n *\n * The wrapping `<FieldRenderer>` already skips the visible label when\n * `field.label` is empty/null, so server-side `HiddenField::label(null)`\n * keeps the form layout tight. The component just renders the input.\n */\n\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\n\nexport function HiddenInput({ field, value, inputId }: FieldRendererProps) {\n return (\n <input\n id={inputId}\n type=\"hidden\"\n name={field.name}\n value={value === null || value === undefined ? '' : String(value)}\n readOnly\n />\n );\n}\n","/**\n * `<CurrencyInput>` — number input with currency display when blurred.\n *\n * While focused, the input shows the bare numeric value using the\n * field's `decimalSeparator` (so a `pt_BR`/`de`/`fr` user sees and\n * edits `1234,56`, not `1234.56`). Typing is parsed back through the\n * same separator before `Number()`, so comma-decimal locales can type a\n * value without it collapsing to `NaN`/`null`. On blur, the value is\n * reformatted with the field's `prefix`/`thousandsSeparator`/\n * `decimalSeparator` props (server-emitted from `CurrencyField`).\n */\n\nimport type { CurrencyFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function CurrencyInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as CurrencyFieldSchema;\n // While focused we keep the raw typed string locally so a partial\n // entry (`1234,` / `1234,5`) survives re-renders; a controlled numeric\n // value would otherwise drop the trailing decimal mark mid-typing.\n const [draft, setDraft] = useState<string | null>(null);\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const numeric =\n typeof value === 'number' ? value : value === '' || value == null ? null : Number(value);\n const decimals = f.props.decimals ?? 2;\n const decimalSeparator = f.props.decimalSeparator ?? '.';\n const focused = draft !== null;\n\n const formatted =\n numeric === null || Number.isNaN(numeric)\n ? ''\n : `${f.props.prefix}${formatNumber(numeric, decimals, f.props.thousandsSeparator, decimalSeparator)}${f.props.suffix ?? ''}`;\n\n const display = focused ? draft : formatted;\n\n return (\n <input\n id={inputId}\n // `text` (not `number`) while focused so comma-decimal locales can\n // type their decimal mark — a numeric input only accepts '.'.\n type=\"text\"\n inputMode=\"decimal\"\n className={inputClasses}\n value={display}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onFocus={() => setDraft(numeric === null ? '' : toEditable(numeric, decimalSeparator))}\n onBlur={() => setDraft(null)}\n onChange={(e) => {\n setDraft(e.target.value);\n onChange(parseEditable(e.target.value, decimalSeparator));\n }}\n />\n );\n}\n\n/**\n * Render a number as an editable string using the field's decimal\n * separator (e.g. `1234.56` -> `1234,56` for a comma-decimal locale).\n * Grouping separators are intentionally dropped while editing.\n */\nfunction toEditable(num: number, decimal: string): string {\n const s = String(num);\n return decimal === '.' ? s : s.replace('.', decimal);\n}\n\n/**\n * Parse what the user typed back into a number, honouring the field's\n * decimal separator. Grouping characters are stripped so partially\n * formatted input (`1.234,5`) still round-trips. Returns `null` for\n * empty / unparseable input.\n */\nfunction parseEditable(raw: string, decimal: string): number | null {\n if (raw.trim() === '') {\n return null;\n }\n let normalised = raw;\n if (decimal !== '.') {\n // Drop everything that is not a digit, sign, or the decimal mark,\n // then swap the decimal mark for '.' so Number() can parse it.\n const escaped = decimal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n normalised = raw.replace(new RegExp(`[^0-9${escaped}+-]`, 'g'), '').replace(decimal, '.');\n }\n const num = Number(normalised);\n return Number.isNaN(num) ? null : num;\n}\n\nfunction formatNumber(num: number, decimals: number, thousands: string, decimal: string): string {\n const fixed = num.toFixed(decimals);\n const [whole, frac] = fixed.split('.');\n const safeWhole = (whole ?? '0').replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousands);\n return frac ? `${safeWhole}${decimal}${frac}` : safeWhole;\n}\n","/**\n * `<NumberInput>` — numeric input with optional stepper buttons.\n *\n * Empty string is normalised to `null`; non-numeric inputs are also\n * sent as `null` so server-side validation rules see typed values.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { NumberFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function NumberInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as NumberFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const setValue = (raw: number) => {\n if (Number.isNaN(raw)) {\n onChange(null);\n return;\n }\n if (f.props.integer) onChange(Math.trunc(raw));\n else onChange(raw);\n };\n\n const current = typeof value === 'number' ? value : null;\n const step = typeof f.props.step === 'number' ? f.props.step : 1;\n\n return (\n <div className=\"relative inline-flex w-full\">\n <input\n id={inputId}\n type=\"number\"\n inputMode={f.props.integer ? 'numeric' : 'decimal'}\n className={cn(inputClasses, 'pr-16')}\n value={current === null ? '' : String(current)}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n min={f.props.min}\n max={f.props.max}\n step={f.props.step}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n if (e.target.value === '') {\n onChange(null);\n return;\n }\n setValue(Number(e.target.value));\n }}\n />\n <div className=\"absolute inset-y-0 right-0 flex flex-col\">\n <button\n type=\"button\"\n aria-label={t('arqel.fields.increment', 'Increment')}\n disabled={isDisabled}\n onClick={() => setValue((current ?? 0) + step)}\n className=\"flex h-1/2 w-8 items-center justify-center text-xs text-muted-foreground hover:text-foreground disabled:opacity-50\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n aria-label={t('arqel.fields.decrement', 'Decrement')}\n disabled={isDisabled}\n onClick={() => setValue((current ?? 0) - step)}\n className=\"flex h-1/2 w-8 items-center justify-center text-xs text-muted-foreground hover:text-foreground disabled:opacity-50\"\n >\n ▼\n </button>\n </div>\n </div>\n );\n}\n","/**\n * `<BelongsToInput>` — async-search picker for belongsTo relationships.\n *\n * Hits the search route emitted server-side (`field.props.searchRoute`,\n * registered by `arqel-dev/fields` `FieldSearchController`) with a 300ms\n * debounce. Returned options are { value: id, label: title } pairs.\n *\n * Phase 1 ships a list-rendered picker (combobox with native `<input>`\n * + `<ul>`); Base UI Combobox lands in a follow-up.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { BelongsToFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useEffect, useRef, useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\ninterface SearchResult {\n value: string | number;\n label: string;\n}\n\nexport function BelongsToInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as BelongsToFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult[]>([]);\n const [open, setOpen] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!f.props.searchRoute || !query) {\n setResults([]);\n return;\n }\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const url = `${f.props.searchRoute}?q=${encodeURIComponent(query)}`;\n fetch(url, { signal: controller.signal, headers: { Accept: 'application/json' } })\n .then((r) => (r.ok ? r.json() : []))\n .then((data) => {\n if (Array.isArray(data)) setResults(data);\n })\n .catch(() => {\n /* aborts/network — silently swallow */\n });\n }, 300);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [query, f.props.searchRoute]);\n\n const selectedLabel = results.find((r) => String(r.value) === String(value))?.label;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={\n open\n ? query\n : (selectedLabel ?? (value === null || value === undefined ? '' : String(value)))\n }\n placeholder={\n f.placeholder ??\n t('arqel.fields.belongsto.search', 'Search :resource…', {\n resource: f.props.relatedResource,\n })\n }\n disabled={isDisabled}\n readOnly={!(f.readonly === true || f.readonly === undefined)}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n aria-expanded={open}\n aria-controls={`${inputId}-listbox`}\n role=\"combobox\"\n onFocus={() => setOpen(true)}\n onBlur={() => setTimeout(() => setOpen(false), 100)}\n onChange={(e) => setQuery(e.target.value)}\n />\n {open && results.length > 0 && (\n <div\n id={`${inputId}-listbox`}\n role=\"listbox\"\n className={cn(\n 'absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-sm border border-border bg-background shadow-md',\n )}\n >\n {results.map((r) => (\n <div\n key={String(r.value)}\n role=\"option\"\n aria-selected={String(r.value) === String(value)}\n tabIndex={-1}\n className=\"cursor-pointer px-3 py-1.5 text-sm hover:bg-muted\"\n onMouseDown={(e) => {\n e.preventDefault();\n onChange(r.value);\n setQuery('');\n setOpen(false);\n }}\n >\n {r.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * `<HasManyReadonly>` — flat read-only list of related records.\n *\n * Phase 1 ships a stacked list (label + id). The full inline-table\n * editor lives behind FIELDS-JS-003 follow-up since editable nested\n * collections require their own change-set tracking.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { HasManyFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\n\ninterface RelatedRecord {\n id: string | number;\n label?: string;\n [key: string]: unknown;\n}\n\nexport function HasManyReadonly({ field, value, inputId, describedBy }: FieldRendererProps) {\n const f = field as HasManyFieldSchema;\n const t = useArqelTranslations();\n const items: RelatedRecord[] = Array.isArray(value) ? (value as RelatedRecord[]) : [];\n\n if (items.length === 0) {\n return (\n <p id={inputId} aria-describedby={describedBy} className=\"text-sm text-muted-foreground\">\n {t('arqel.fields.has_many_empty', 'No :resource linked.', {\n resource: f.props.relatedResource,\n })}\n </p>\n );\n }\n\n return (\n <ul\n id={inputId}\n aria-describedby={describedBy}\n className=\"divide-y divide-[var(--border)] rounded-sm border border-border\"\n >\n {items.map((item) => (\n <li\n key={String(item.id)}\n className=\"flex items-center justify-between gap-3 px-3 py-2 text-sm\"\n >\n <span>{item.label ?? `#${item.id}`}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{item.id}</span>\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * Normalises the polymorphic `options` shape on Select/Radio fields:\n * the server can emit either an array (`[{value, label}, …]`) or an\n * object (`{ value: 'Label' }`). Components only need the array form.\n */\n\nexport interface NormalisedOption {\n value: string | number;\n label: string;\n}\n\nexport function normaliseOptions(options: unknown): NormalisedOption[] {\n if (!options) return [];\n if (Array.isArray(options)) {\n return options.filter(\n (o): o is NormalisedOption =>\n typeof o === 'object' && o !== null && 'value' in o && 'label' in o,\n );\n }\n if (typeof options === 'object') {\n return Object.entries(options as Record<string, string>).map(([value, label]) => ({\n value,\n label,\n }));\n }\n return [];\n}\n","/**\n * `<MultiSelectInput>` — chip-list multi-select.\n *\n * Selected items render as removable chips above the option dropdown.\n * Backed by a native `<select multiple>` for a11y; the chip strip is\n * presentation-only and writes back through the same `onChange`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { MultiSelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function MultiSelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as MultiSelectFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n const selectedSet = new Set(arr.map(String));\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const remove = (v: string | number) => {\n onChange(arr.filter((x) => String(x) !== String(v)));\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arr.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {arr.map((v) => {\n const opt = options.find((o) => String(o.value) === String(v));\n return (\n <span\n key={String(v)}\n className=\"inline-flex items-center gap-1 rounded-sm bg-muted px-2 py-0.5 text-xs\"\n >\n {opt?.label ?? String(v)}\n {!isDisabled && (\n <button\n type=\"button\"\n aria-label={t('arqel.fields.multiselect.remove', 'Remove :label', {\n label: opt?.label ?? String(v),\n })}\n onClick={() => remove(v)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n )}\n </span>\n );\n })}\n </div>\n )}\n <select\n id={inputId}\n multiple\n className={cn(inputClasses, 'h-auto min-h-[6rem] py-1')}\n value={Array.from(selectedSet)}\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n","/**\n * `<RadioGroup>` — radio buttons in a `role=\"radiogroup\"`.\n *\n * Honours `props.inline` to lay items out horizontally vs the default\n * stacked layout.\n */\n\nimport type { RadioFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function RadioGroup({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as RadioFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div\n id={inputId}\n role=\"radiogroup\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn('flex gap-3', f.props.inline ? 'flex-row flex-wrap' : 'flex-col')}\n >\n {(f.props.options ?? []).map((opt) => {\n const checked = String(value ?? '') === String(opt.value);\n return (\n <label key={String(opt.value)} className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={f.name}\n value={String(opt.value)}\n checked={checked}\n disabled={isDisabled}\n onChange={() => onChange(opt.value)}\n className=\"h-4 w-4 border-[var(--input)] text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n","/**\n * `<SelectInput>` — single-value select.\n *\n * Phase 1 ships the native `<select>` for predictability and\n * a11y-by-default. A searchable Combobox (Base UI) variant lands in\n * FIELDS-JS-003 follow-up when `props.searchable === true`.\n */\n\nimport type { SelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SelectFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n\n return (\n <select\n id={inputId}\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n disabled={disabled || f.disabled || f.readonly}\n required={f.required === true}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n {(f.placeholder || !f.required) && <option value=\"\">{f.placeholder ?? '—'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n","/**\n * `<SlugInput>` — auto-generated URL-safe slug.\n *\n * Phase 1 ships a manual slug field (text input with slug normalisation\n * on every keystroke). Auto-derivation from a source field (`dependsOn`)\n * lands as a follow-up because it requires either FormContext access\n * or a dependency-resolver pipeline that we don't yet expose.\n *\n * Reserved slug detection (`field.props.reservedSlugs`) is enforced\n * server-side via the Validator; the input itself just normalises.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { SlugFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SlugInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SlugFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? t('arqel.fields.slug.placeholder', 'my-resource-slug')}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n autoComplete=\"off\"\n pattern=\"^[a-z0-9-]*$\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(slugify(e.target.value))}\n />\n );\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n","/**\n * `<EmailInput>` — `<input type=\"email\">` with sensible defaults.\n *\n * Mirrors browser email validation; server-side validation remains the\n * source of truth (Laravel `email` rule).\n */\n\nimport type { EmailFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function EmailInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as EmailFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"email\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'email'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<PasswordInput>` — masked input with a \"reveal\" toggle button.\n *\n * Toggles between `type=\"password\"` and `type=\"text\"`; the button\n * is rendered inside the trailing edge of the input via wrapper.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { PasswordFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function PasswordInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as PasswordFieldSchema;\n const t = useArqelTranslations();\n const [revealed, setRevealed] = useState(false);\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type={revealed ? 'text' : 'password'}\n className={cn(inputClasses, 'pr-10')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'current-password'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n <button\n type=\"button\"\n aria-label={\n revealed\n ? t('arqel.fields.password.hide', 'Hide password')\n : t('arqel.fields.password.show', 'Show password')\n }\n aria-pressed={revealed}\n disabled={isDisabled}\n onClick={() => setRevealed((v) => !v)}\n className={cn(\n 'absolute inset-y-0 right-0 flex w-9 items-center justify-center text-sm',\n 'text-muted-foreground hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {revealed ? '◉' : '○'}\n </button>\n </div>\n );\n}\n","import type { TextareaFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextareaInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextareaFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <textarea\n id={inputId}\n className={cn(inputClasses, 'h-auto min-h-[5rem] py-2')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n rows={4}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<TextInput>` — generic single-line text field.\n *\n * Used as the registered component for FieldType `text` and `slug`.\n * Slug-specific auto-generation logic lives in FIELDS-JS-004's\n * `<SlugInput>`; this component is the simple text path.\n */\n\nimport type { TextFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n minLength={f.props.minLength}\n pattern={f.props.pattern}\n autoComplete={f.props.autocomplete}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","import type { UrlFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function UrlInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as UrlFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"url\"\n inputMode=\"url\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? 'https://…'}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'url'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * Side-effect import that registers every built-in field component\n * into `@arqel-dev/ui`'s FieldRegistry.\n *\n * import '@arqel-dev/fields/register';\n *\n * The component name passed to `registerField()` matches the value\n * emitted by `Field::component()` server-side (e.g. `'TextInput'`).\n * Apps can re-register their own components after this import to\n * override defaults.\n */\n\nimport { registerField } from '@arqel-dev/ui/form';\nimport { Checkbox, Toggle } from './boolean/index.js';\nimport { ColorInput } from './color/index.js';\nimport { DateInput, DateTimeInput } from './date/index.js';\nimport { FileInput, ImageInput } from './file/index.js';\nimport { HiddenInput } from './hidden/index.js';\nimport { CurrencyInput, NumberInput } from './number/index.js';\nimport { BelongsToInput, HasManyReadonly } from './relationship/index.js';\nimport { MultiSelectInput, RadioGroup, SelectInput } from './select/index.js';\nimport { SlugInput } from './slug/index.js';\nimport { EmailInput, PasswordInput, TextareaInput, TextInput, UrlInput } from './text/index.js';\n\nregisterField('TextInput', TextInput);\nregisterField('TextareaInput', TextareaInput);\nregisterField('EmailInput', EmailInput);\nregisterField('UrlInput', UrlInput);\nregisterField('PasswordInput', PasswordInput);\nregisterField('NumberInput', NumberInput);\nregisterField('CurrencyInput', CurrencyInput);\nregisterField('Checkbox', Checkbox);\nregisterField('Toggle', Toggle);\nregisterField('SelectInput', SelectInput);\nregisterField('MultiSelectInput', MultiSelectInput);\nregisterField('RadioGroup', RadioGroup);\nregisterField('BelongsToInput', BelongsToInput);\nregisterField('HasManyReadonly', HasManyReadonly);\nregisterField('DateInput', DateInput);\nregisterField('DateTimeInput', DateTimeInput);\nregisterField('FileInput', FileInput);\nregisterField('ImageInput', ImageInput);\nregisterField('SlugInput', SlugInput);\nregisterField('ColorInput', ColorInput);\nregisterField('HiddenInput', HiddenInput);\n"]}
|
package/dist/relationship.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
1
2
|
import { cn } from '@arqel-dev/ui/utils';
|
|
2
3
|
import { useState, useRef, useEffect } from 'react';
|
|
3
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -27,6 +28,7 @@ function BelongsToInput({
|
|
|
27
28
|
describedBy
|
|
28
29
|
}) {
|
|
29
30
|
const f = field;
|
|
31
|
+
const t = useArqelTranslations();
|
|
30
32
|
const hasError = errors !== void 0 && errors.length > 0;
|
|
31
33
|
const isDisabled = disabled || f.disabled || f.readonly;
|
|
32
34
|
const [query, setQuery] = useState("");
|
|
@@ -63,7 +65,9 @@ function BelongsToInput({
|
|
|
63
65
|
type: "text",
|
|
64
66
|
className: inputClasses,
|
|
65
67
|
value: open ? query : selectedLabel ?? (value === null || value === void 0 ? "" : String(value)),
|
|
66
|
-
placeholder: f.placeholder ??
|
|
68
|
+
placeholder: f.placeholder ?? t("arqel.fields.belongsto.search", "Search :resource\u2026", {
|
|
69
|
+
resource: f.props.relatedResource
|
|
70
|
+
}),
|
|
67
71
|
disabled: isDisabled,
|
|
68
72
|
readOnly: !(f.readonly === true || f.readonly === void 0),
|
|
69
73
|
"aria-invalid": hasError || void 0,
|
|
@@ -107,13 +111,12 @@ function BelongsToInput({
|
|
|
107
111
|
}
|
|
108
112
|
function HasManyReadonly({ field, value, inputId, describedBy }) {
|
|
109
113
|
const f = field;
|
|
114
|
+
const t = useArqelTranslations();
|
|
110
115
|
const items = Array.isArray(value) ? value : [];
|
|
111
116
|
if (items.length === 0) {
|
|
112
|
-
return /* @__PURE__ */
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
" linked."
|
|
116
|
-
] });
|
|
117
|
+
return /* @__PURE__ */ jsx("p", { id: inputId, "aria-describedby": describedBy, className: "text-sm text-muted-foreground", children: t("arqel.fields.has_many_empty", "No :resource linked.", {
|
|
118
|
+
resource: f.props.relatedResource
|
|
119
|
+
}) });
|
|
117
120
|
}
|
|
118
121
|
return /* @__PURE__ */ jsx(
|
|
119
122
|
"ul",
|
package/dist/relationship.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/styles.ts","../src/relationship/BelongsToInput.tsx","../src/relationship/HasManyReadonly.tsx"],"names":["cn","jsxs","jsx"],"mappings":"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","file":"relationship.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<BelongsToInput>` — async-search picker for belongsTo relationships.\n *\n * Hits the search route emitted server-side (`field.props.searchRoute`,\n * registered by `arqel-dev/fields` `FieldSearchController`) with a 300ms\n * debounce. Returned options are { value: id, label: title } pairs.\n *\n * Phase 1 ships a list-rendered picker (combobox with native `<input>`\n * + `<ul>`); Base UI Combobox lands in a follow-up.\n */\n\nimport type { BelongsToFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useEffect, useRef, useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\ninterface SearchResult {\n value: string | number;\n label: string;\n}\n\nexport function BelongsToInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as BelongsToFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult[]>([]);\n const [open, setOpen] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!f.props.searchRoute || !query) {\n setResults([]);\n return;\n }\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const url = `${f.props.searchRoute}?q=${encodeURIComponent(query)}`;\n fetch(url, { signal: controller.signal, headers: { Accept: 'application/json' } })\n .then((r) => (r.ok ? r.json() : []))\n .then((data) => {\n if (Array.isArray(data)) setResults(data);\n })\n .catch(() => {\n /* aborts/network — silently swallow */\n });\n }, 300);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [query, f.props.searchRoute]);\n\n const selectedLabel = results.find((r) => String(r.value) === String(value))?.label;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={\n open\n ? query\n : (selectedLabel ?? (value === null || value === undefined ? '' : String(value)))\n }\n placeholder={f.placeholder ?? `Search ${f.props.relatedResource}…`}\n disabled={isDisabled}\n readOnly={!(f.readonly === true || f.readonly === undefined)}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n aria-expanded={open}\n aria-controls={`${inputId}-listbox`}\n role=\"combobox\"\n onFocus={() => setOpen(true)}\n onBlur={() => setTimeout(() => setOpen(false), 100)}\n onChange={(e) => setQuery(e.target.value)}\n />\n {open && results.length > 0 && (\n <div\n id={`${inputId}-listbox`}\n role=\"listbox\"\n className={cn(\n 'absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-sm border border-border bg-background shadow-md',\n )}\n >\n {results.map((r) => (\n <div\n key={String(r.value)}\n role=\"option\"\n aria-selected={String(r.value) === String(value)}\n tabIndex={-1}\n className=\"cursor-pointer px-3 py-1.5 text-sm hover:bg-muted\"\n onMouseDown={(e) => {\n e.preventDefault();\n onChange(r.value);\n setQuery('');\n setOpen(false);\n }}\n >\n {r.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * `<HasManyReadonly>` — flat read-only list of related records.\n *\n * Phase 1 ships a stacked list (label + id). The full inline-table\n * editor lives behind FIELDS-JS-003 follow-up since editable nested\n * collections require their own change-set tracking.\n */\n\nimport type { HasManyFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\n\ninterface RelatedRecord {\n id: string | number;\n label?: string;\n [key: string]: unknown;\n}\n\nexport function HasManyReadonly({ field, value, inputId, describedBy }: FieldRendererProps) {\n const f = field as HasManyFieldSchema;\n const items: RelatedRecord[] = Array.isArray(value) ? (value as RelatedRecord[]) : [];\n\n if (items.length === 0) {\n return (\n <p id={inputId} aria-describedby={describedBy} className=\"text-sm text-muted-foreground\">\n No {f.props.relatedResource} linked.\n </p>\n );\n }\n\n return (\n <ul\n id={inputId}\n aria-describedby={describedBy}\n className=\"divide-y divide-[var(--border)] rounded-sm border border-border\"\n >\n {items.map((item) => (\n <li\n key={String(item.id)}\n className=\"flex items-center justify-between gap-3 px-3 py-2 text-sm\"\n >\n <span>{item.label ?? `#${item.id}`}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{item.id}</span>\n </li>\n ))}\n </ul>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/styles.ts","../src/relationship/BelongsToInput.tsx","../src/relationship/HasManyReadonly.tsx"],"names":["cn","useArqelTranslations","jsx","jsxs"],"mappings":"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","file":"relationship.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<BelongsToInput>` — async-search picker for belongsTo relationships.\n *\n * Hits the search route emitted server-side (`field.props.searchRoute`,\n * registered by `arqel-dev/fields` `FieldSearchController`) with a 300ms\n * debounce. Returned options are { value: id, label: title } pairs.\n *\n * Phase 1 ships a list-rendered picker (combobox with native `<input>`\n * + `<ul>`); Base UI Combobox lands in a follow-up.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { BelongsToFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useEffect, useRef, useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\ninterface SearchResult {\n value: string | number;\n label: string;\n}\n\nexport function BelongsToInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as BelongsToFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult[]>([]);\n const [open, setOpen] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!f.props.searchRoute || !query) {\n setResults([]);\n return;\n }\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const url = `${f.props.searchRoute}?q=${encodeURIComponent(query)}`;\n fetch(url, { signal: controller.signal, headers: { Accept: 'application/json' } })\n .then((r) => (r.ok ? r.json() : []))\n .then((data) => {\n if (Array.isArray(data)) setResults(data);\n })\n .catch(() => {\n /* aborts/network — silently swallow */\n });\n }, 300);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [query, f.props.searchRoute]);\n\n const selectedLabel = results.find((r) => String(r.value) === String(value))?.label;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={\n open\n ? query\n : (selectedLabel ?? (value === null || value === undefined ? '' : String(value)))\n }\n placeholder={\n f.placeholder ??\n t('arqel.fields.belongsto.search', 'Search :resource…', {\n resource: f.props.relatedResource,\n })\n }\n disabled={isDisabled}\n readOnly={!(f.readonly === true || f.readonly === undefined)}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n aria-expanded={open}\n aria-controls={`${inputId}-listbox`}\n role=\"combobox\"\n onFocus={() => setOpen(true)}\n onBlur={() => setTimeout(() => setOpen(false), 100)}\n onChange={(e) => setQuery(e.target.value)}\n />\n {open && results.length > 0 && (\n <div\n id={`${inputId}-listbox`}\n role=\"listbox\"\n className={cn(\n 'absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-sm border border-border bg-background shadow-md',\n )}\n >\n {results.map((r) => (\n <div\n key={String(r.value)}\n role=\"option\"\n aria-selected={String(r.value) === String(value)}\n tabIndex={-1}\n className=\"cursor-pointer px-3 py-1.5 text-sm hover:bg-muted\"\n onMouseDown={(e) => {\n e.preventDefault();\n onChange(r.value);\n setQuery('');\n setOpen(false);\n }}\n >\n {r.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * `<HasManyReadonly>` — flat read-only list of related records.\n *\n * Phase 1 ships a stacked list (label + id). The full inline-table\n * editor lives behind FIELDS-JS-003 follow-up since editable nested\n * collections require their own change-set tracking.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { HasManyFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\n\ninterface RelatedRecord {\n id: string | number;\n label?: string;\n [key: string]: unknown;\n}\n\nexport function HasManyReadonly({ field, value, inputId, describedBy }: FieldRendererProps) {\n const f = field as HasManyFieldSchema;\n const t = useArqelTranslations();\n const items: RelatedRecord[] = Array.isArray(value) ? (value as RelatedRecord[]) : [];\n\n if (items.length === 0) {\n return (\n <p id={inputId} aria-describedby={describedBy} className=\"text-sm text-muted-foreground\">\n {t('arqel.fields.has_many_empty', 'No :resource linked.', {\n resource: f.props.relatedResource,\n })}\n </p>\n );\n }\n\n return (\n <ul\n id={inputId}\n aria-describedby={describedBy}\n className=\"divide-y divide-[var(--border)] rounded-sm border border-border\"\n >\n {items.map((item) => (\n <li\n key={String(item.id)}\n className=\"flex items-center justify-between gap-3 px-3 py-2 text-sm\"\n >\n <span>{item.label ?? `#${item.id}`}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{item.id}</span>\n </li>\n ))}\n </ul>\n );\n}\n"]}
|
package/dist/select.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
1
2
|
import { cn } from '@arqel-dev/ui/utils';
|
|
2
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
4
|
|
|
@@ -43,6 +44,7 @@ function MultiSelectInput({
|
|
|
43
44
|
describedBy
|
|
44
45
|
}) {
|
|
45
46
|
const f = field;
|
|
47
|
+
const t = useArqelTranslations();
|
|
46
48
|
const hasError = errors !== void 0 && errors.length > 0;
|
|
47
49
|
const options = normaliseOptions(f.props.options);
|
|
48
50
|
const arr = Array.isArray(value) ? value : [];
|
|
@@ -64,7 +66,9 @@ function MultiSelectInput({
|
|
|
64
66
|
"button",
|
|
65
67
|
{
|
|
66
68
|
type: "button",
|
|
67
|
-
"aria-label":
|
|
69
|
+
"aria-label": t("arqel.fields.multiselect.remove", "Remove :label", {
|
|
70
|
+
label: opt?.label ?? String(v)
|
|
71
|
+
}),
|
|
68
72
|
onClick: () => remove(v),
|
|
69
73
|
className: "text-muted-foreground hover:text-foreground",
|
|
70
74
|
children: "\u2715"
|
package/dist/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/options.ts","../src/shared/styles.ts","../src/select/MultiSelectInput.tsx","../src/select/RadioGroup.tsx","../src/select/SelectInput.tsx"],"names":["cn","jsx","jsxs"],"mappings":"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","file":"select.js","sourcesContent":["/**\n * Normalises the polymorphic `options` shape on Select/Radio fields:\n * the server can emit either an array (`[{value, label}, …]`) or an\n * object (`{ value: 'Label' }`). Components only need the array form.\n */\n\nexport interface NormalisedOption {\n value: string | number;\n label: string;\n}\n\nexport function normaliseOptions(options: unknown): NormalisedOption[] {\n if (!options) return [];\n if (Array.isArray(options)) {\n return options.filter(\n (o): o is NormalisedOption =>\n typeof o === 'object' && o !== null && 'value' in o && 'label' in o,\n );\n }\n if (typeof options === 'object') {\n return Object.entries(options as Record<string, string>).map(([value, label]) => ({\n value,\n label,\n }));\n }\n return [];\n}\n","/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<MultiSelectInput>` — chip-list multi-select.\n *\n * Selected items render as removable chips above the option dropdown.\n * Backed by a native `<select multiple>` for a11y; the chip strip is\n * presentation-only and writes back through the same `onChange`.\n */\n\nimport type { MultiSelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function MultiSelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as MultiSelectFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n const selectedSet = new Set(arr.map(String));\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const remove = (v: string | number) => {\n onChange(arr.filter((x) => String(x) !== String(v)));\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arr.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {arr.map((v) => {\n const opt = options.find((o) => String(o.value) === String(v));\n return (\n <span\n key={String(v)}\n className=\"inline-flex items-center gap-1 rounded-sm bg-muted px-2 py-0.5 text-xs\"\n >\n {opt?.label ?? String(v)}\n {!isDisabled && (\n <button\n type=\"button\"\n aria-label={`Remove ${opt?.label ?? String(v)}`}\n onClick={() => remove(v)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n )}\n </span>\n );\n })}\n </div>\n )}\n <select\n id={inputId}\n multiple\n className={cn(inputClasses, 'h-auto min-h-[6rem] py-1')}\n value={Array.from(selectedSet)}\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n","/**\n * `<RadioGroup>` — radio buttons in a `role=\"radiogroup\"`.\n *\n * Honours `props.inline` to lay items out horizontally vs the default\n * stacked layout.\n */\n\nimport type { RadioFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function RadioGroup({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as RadioFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div\n id={inputId}\n role=\"radiogroup\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn('flex gap-3', f.props.inline ? 'flex-row flex-wrap' : 'flex-col')}\n >\n {(f.props.options ?? []).map((opt) => {\n const checked = String(value ?? '') === String(opt.value);\n return (\n <label key={String(opt.value)} className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={f.name}\n value={String(opt.value)}\n checked={checked}\n disabled={isDisabled}\n onChange={() => onChange(opt.value)}\n className=\"h-4 w-4 border-[var(--input)] text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n","/**\n * `<SelectInput>` — single-value select.\n *\n * Phase 1 ships the native `<select>` for predictability and\n * a11y-by-default. A searchable Combobox (Base UI) variant lands in\n * FIELDS-JS-003 follow-up when `props.searchable === true`.\n */\n\nimport type { SelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SelectFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n\n return (\n <select\n id={inputId}\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n disabled={disabled || f.disabled || f.readonly}\n required={f.required === true}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n {(f.placeholder || !f.required) && <option value=\"\">{f.placeholder ?? '—'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/options.ts","../src/shared/styles.ts","../src/select/MultiSelectInput.tsx","../src/select/RadioGroup.tsx","../src/select/SelectInput.tsx"],"names":["cn","jsx","jsxs"],"mappings":"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","file":"select.js","sourcesContent":["/**\n * Normalises the polymorphic `options` shape on Select/Radio fields:\n * the server can emit either an array (`[{value, label}, …]`) or an\n * object (`{ value: 'Label' }`). Components only need the array form.\n */\n\nexport interface NormalisedOption {\n value: string | number;\n label: string;\n}\n\nexport function normaliseOptions(options: unknown): NormalisedOption[] {\n if (!options) return [];\n if (Array.isArray(options)) {\n return options.filter(\n (o): o is NormalisedOption =>\n typeof o === 'object' && o !== null && 'value' in o && 'label' in o,\n );\n }\n if (typeof options === 'object') {\n return Object.entries(options as Record<string, string>).map(([value, label]) => ({\n value,\n label,\n }));\n }\n return [];\n}\n","/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<MultiSelectInput>` — chip-list multi-select.\n *\n * Selected items render as removable chips above the option dropdown.\n * Backed by a native `<select multiple>` for a11y; the chip strip is\n * presentation-only and writes back through the same `onChange`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { MultiSelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function MultiSelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as MultiSelectFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n const selectedSet = new Set(arr.map(String));\n const isDisabled = disabled || f.disabled || f.readonly;\n\n const remove = (v: string | number) => {\n onChange(arr.filter((x) => String(x) !== String(v)));\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {arr.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {arr.map((v) => {\n const opt = options.find((o) => String(o.value) === String(v));\n return (\n <span\n key={String(v)}\n className=\"inline-flex items-center gap-1 rounded-sm bg-muted px-2 py-0.5 text-xs\"\n >\n {opt?.label ?? String(v)}\n {!isDisabled && (\n <button\n type=\"button\"\n aria-label={t('arqel.fields.multiselect.remove', 'Remove :label', {\n label: opt?.label ?? String(v),\n })}\n onClick={() => remove(v)}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n )}\n </span>\n );\n })}\n </div>\n )}\n <select\n id={inputId}\n multiple\n className={cn(inputClasses, 'h-auto min-h-[6rem] py-1')}\n value={Array.from(selectedSet)}\n disabled={isDisabled}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n","/**\n * `<RadioGroup>` — radio buttons in a `role=\"radiogroup\"`.\n *\n * Honours `props.inline` to lay items out horizontally vs the default\n * stacked layout.\n */\n\nimport type { RadioFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport function RadioGroup({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as RadioFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div\n id={inputId}\n role=\"radiogroup\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={cn('flex gap-3', f.props.inline ? 'flex-row flex-wrap' : 'flex-col')}\n >\n {(f.props.options ?? []).map((opt) => {\n const checked = String(value ?? '') === String(opt.value);\n return (\n <label key={String(opt.value)} className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={f.name}\n value={String(opt.value)}\n checked={checked}\n disabled={isDisabled}\n onChange={() => onChange(opt.value)}\n className=\"h-4 w-4 border-[var(--input)] text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n","/**\n * `<SelectInput>` — single-value select.\n *\n * Phase 1 ships the native `<select>` for predictability and\n * a11y-by-default. A searchable Combobox (Base UI) variant lands in\n * FIELDS-JS-003 follow-up when `props.searchable === true`.\n */\n\nimport type { SelectFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { normaliseOptions } from '../shared/options.js';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SelectInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SelectFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n const options = normaliseOptions(f.props.options);\n\n return (\n <select\n id={inputId}\n className={inputClasses}\n value={value === null || value === undefined ? '' : String(value)}\n disabled={disabled || f.disabled || f.readonly}\n required={f.required === true}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n {(f.placeholder || !f.required) && <option value=\"\">{f.placeholder ?? '—'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n"]}
|