declarative-forms 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/html.ts","../src/util/dom.ts","../src/fields/Field.ts","../src/fields/ComputedField.ts","../src/util/value.ts","../src/fields/TextAreaField.ts","../src/fields/ArrayField.ts","../src/fields/CardsField.ts","../src/fields/CheckboxField.ts","../src/fields/CustomField.ts","../src/fields/FileField.ts","../src/fields/MessageField.ts","../src/components/styles.ts","../src/components/DlSelect.ts","../src/fields/SelectField.ts","../src/fields/TextField.ts","../src/core/FieldRegistry.ts","../src/util/deepEqual.ts","../src/core/FormModel.ts","../src/core/IdGenerator.ts","../src/core/UpdateScheduler.ts","../src/ui/ButtonBar.ts","../src/ui/ModalView.ts","../src/ui/ModalStack.ts","../src/ui/TabBar.ts","../src/ui/tooltip/NativeTooltipProvider.ts","../src/ui/tooltip/TooltipController.ts","../src/core/DeclarativeForm.ts"],"names":["option"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Opt-in HTML for label/message/option content.\n *\n * Everything the library renders is treated as plain text by default. When you\n * genuinely need markup — a link inside a checkbox caption, a tag badge inside a\n * select option — wrap it in {@link html} to say so explicitly.\n */\n\nconst SAFE_HTML = Symbol.for('declarative-forms.SafeHtml');\n\n/** A string the caller has explicitly marked as trusted HTML. */\nexport class SafeHtml {\n /** Brand used by {@link isSafeHtml} so instances survive duplicated module copies. */\n readonly [SAFE_HTML] = true;\n\n constructor(readonly value: string) {}\n\n toString(): string {\n return this.value;\n }\n}\n\nexport function isSafeHtml(value: unknown): value is SafeHtml {\n return typeof value === 'object' && value !== null && SAFE_HTML in value;\n}\n\nconst ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\n/** Escape a string for interpolation into an HTML context. */\nexport function escapeHtml(value: unknown): string {\n return String(value).replace(/[&<>\"']/g, (char) => ESCAPES[char] as string);\n}\n\n/**\n * Mark content as trusted HTML.\n *\n * As a tagged template, interpolated values are escaped and only the literal\n * parts are trusted — this is the form you want for anything data-driven:\n *\n * ```ts\n * html`<b>${userSuppliedName}</b>`\n * ```\n *\n * Called with a plain string, the whole string is trusted. Use it only for\n * markup you control:\n *\n * ```ts\n * html('<span class=\"dl-option-tag\">Offline</span>')\n * ```\n */\nexport function html(raw: string): SafeHtml;\nexport function html(strings: TemplateStringsArray, ...values: unknown[]): SafeHtml;\nexport function html(\n stringsOrRaw: string | TemplateStringsArray,\n ...values: unknown[]\n): SafeHtml {\n if (typeof stringsOrRaw === 'string') {\n return new SafeHtml(stringsOrRaw);\n }\n\n let out = stringsOrRaw[0] ?? '';\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n out += isSafeHtml(value) ? value.value : escapeHtml(value);\n out += stringsOrRaw[i + 1] ?? '';\n }\n\n return new SafeHtml(out);\n}\n\n/** Content that is rendered as text unless explicitly wrapped in {@link html}. */\nexport type TextOrHtml = string | SafeHtml;\n","import { isSafeHtml, type TextOrHtml } from './html.js';\n\n/**\n * Set an element's content from a {@link TextOrHtml}.\n *\n * Plain strings go through `textContent`; only values explicitly wrapped in\n * `html()` reach `innerHTML`.\n */\nexport function setContent(el: Element, content: TextOrHtml | null | undefined): void {\n if (content == null) {\n el.textContent = '';\n } else if (isSafeHtml(content)) {\n el.innerHTML = content.value;\n } else {\n el.textContent = content;\n }\n}\n\n/** Render a {@link TextOrHtml} to a string, for attributes such as tooltip content. */\nexport function contentToString(content: TextOrHtml | null | undefined): string {\n if (content == null) return '';\n return isSafeHtml(content) ? content.value : content;\n}\n\nexport interface CreateElOptions {\n classNames?: readonly (string | undefined | false)[];\n attrs?: Record<string, string | undefined>;\n content?: TextOrHtml;\n}\n\n/** Create an element with classes, attributes and content in one call. */\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n options: CreateElOptions = {},\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n\n for (const name of options.classNames ?? []) {\n if (name) el.classList.add(name);\n }\n\n for (const [key, value] of Object.entries(options.attrs ?? {})) {\n if (value !== undefined) el.setAttribute(key, value);\n }\n\n if (options.content !== undefined) setContent(el, options.content);\n\n return el;\n}\n\n/** Add each space-separated name in `classNames` to `el`. */\nexport function addClasses(el: Element, classNames: string | undefined): void {\n if (!classNames) return;\n for (const name of classNames.split(/\\s+/)) {\n if (name) el.classList.add(name);\n }\n}\n\n/**\n * Find the descendants of `root` whose `attribute` equals `value`.\n *\n * v1 built an attribute selector by string concatenation\n * (`dl-option[value=\"' + val + '\"]`), which threw a `DOMException` on any value\n * containing a quote or a backslash. Comparing in JS sidesteps selector\n * escaping altogether — option lists are small enough that the scan is free.\n */\nexport function findByAttribute<T extends Element>(\n root: ParentNode,\n selector: string,\n attribute: string,\n value: string,\n): T[] {\n return [...root.querySelectorAll(selector)].filter(\n (el) => el.getAttribute(attribute) === value,\n ) as T[];\n}\n\n/**\n * Strip whitespace from a tab label to form its class name.\n *\n * Part of the frozen DOM contract: `'Find Citation'` → `.dl-tab-btn.FindCitation`.\n */\nexport function tabClassName(tab: string): string {\n return tab.replace(/\\s/g, '');\n}\n","import { addClasses, createEl, setContent, tabClassName } from '../util/dom.js';\nimport type {\n BaseFieldDescriptor,\n FieldContext,\n FieldDescriptor,\n FormChangeContext,\n Reactive,\n TabSpec,\n} from '../types/descriptors.js';\nimport type { FormContext } from '../core/FormContext.js';\n\n/**\n * The imperative handle consumers get from `form.field(name)`.\n *\n * Replaces v1's `descriptor.domElement`, which the library wrote back onto the\n * caller's own object.\n */\nexport interface FieldHandle {\n readonly name: string;\n /** The control element — an `<input>`, `<textarea>`, `<dl-select>`, … */\n readonly element: HTMLElement;\n /** The `.dl-form-field-wrapper` containing label, tooltip and control. */\n readonly wrapper: HTMLElement;\n getValue(): unknown;\n setValue(value: unknown): void;\n focus(): void;\n /** Show a loading state, where the field kind supports one. */\n setLoading(loading: boolean): void;\n}\n\n/**\n * Base class for every field kind.\n *\n * Subclasses implement {@link createControl} plus the value accessors; the base\n * class owns the wrapper, label, tooltip marker and active state — i.e. all the\n * parts of the frozen DOM contract that are the same for every kind.\n */\nexport abstract class Field<\n D extends BaseFieldDescriptor = FieldDescriptor,\n> implements FieldHandle {\n readonly wrapper: HTMLElement;\n\n protected label: HTMLLabelElement | undefined;\n\n /** The `.dl-tooltip` marker, when this field declares a tooltip. */\n tooltipMarker: HTMLElement | undefined;\n\n private control: HTMLElement | undefined;\n private active = true;\n\n constructor(\n readonly descriptor: D,\n protected readonly context: FormContext,\n ) {\n this.wrapper = createEl('div', {\n attrs: { id: `dl-form-field-wrapper-for-${descriptor.name}` },\n classNames: ['dl-form-field-wrapper'],\n });\n\n this.applyTabClasses();\n }\n\n /**\n * Build the control and the surrounding label/tooltip.\n *\n * Deliberately separate from the constructor: subclass field initializers run\n * *after* `super()` under ES2022 class-field semantics, so anything\n * `createControl` assigned would be reset to `undefined` if it ran from the\n * base constructor. {@link FieldRegistry} calls this immediately after\n * construction.\n */\n build(): this {\n if (this.control) return this;\n\n const element = this.createControl();\n this.control = element;\n\n // v1 set both the property and the attribute; consumer selectors such as\n // `dl-select[name=…]` depend on the attribute being present.\n (element as HTMLInputElement).name = this.descriptor.name;\n element.setAttribute('name', this.descriptor.name);\n\n if (this.wrapperExtraClass) this.wrapper.classList.add(this.wrapperExtraClass);\n addClasses(this.wrapper, this.descriptor.className);\n\n this.label = this.createLabel();\n this.createTooltipMarker();\n\n if ((element as HTMLInputElement).type === 'hidden') {\n this.wrapper.classList.add('dl-form-hidden-field');\n }\n\n this.wrapper.appendChild(element);\n return this;\n }\n\n /** The control element — an `<input>`, `<textarea>`, `<dl-select>`, … */\n get element(): HTMLElement {\n if (!this.control) {\n throw new Error('declarative-forms: field.build() must run before use.');\n }\n return this.control;\n }\n\n get name(): string {\n return this.descriptor.name;\n }\n\n /** Extra class the kind contributes to its wrapper, e.g. `dl-select-wrapper`. */\n protected get wrapperExtraClass(): string | undefined {\n return undefined;\n }\n\n /**\n * Whether this kind holds a value at all.\n *\n * `message` fields are presentational and stay out of `getValues()`.\n */\n get contributesValue(): boolean {\n return true;\n }\n\n /** Build the control element. Called once, from {@link build}. */\n protected abstract createControl(): HTMLElement;\n\n abstract getValue(): unknown;\n abstract setValue(value: unknown): void;\n\n focus(): void {\n (this.element as HTMLElement & { focus?: () => void }).focus?.();\n }\n\n setLoading(_loading: boolean): void {\n // Only kinds with an async surface (select, file) implement this.\n }\n\n /** Ask the owning form to recompute values and re-run the update cycle. */\n protected requestUpdate(force = false): void {\n this.context.requestUpdate(this, force);\n }\n\n /** Resolve a value that may have been given as a function of the form context. */\n protected resolve<T>(value: Reactive<T> | undefined): T | undefined {\n if (typeof value === 'function') {\n return (value as (ctx: FieldContext) => T)(\n this.context.contextFor(this.descriptor),\n );\n }\n return value;\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n setActive(active: boolean): void {\n this.active = active;\n this.wrapper.classList.toggle('inactive', !active);\n }\n\n /** Show or hide the field because of the currently selected tab. */\n setInTab(inTab: boolean): void {\n this.wrapper.classList.toggle('notInTab', !inTab);\n }\n\n /** Tabs this field currently belongs to. */\n tabs(): string[] {\n const spec = this.resolve<TabSpec | undefined>(this.descriptor.tab);\n if (!spec) return [];\n return (Array.isArray(spec) ? spec : [spec]).filter(\n (tab): tab is string => typeof tab === 'string' && tab.length > 0,\n );\n }\n\n /**\n * Apply the default value. Awaited during form initialisation.\n *\n * A `defaultValue` function may return a promise, so the result is always\n * resolved before being applied.\n */\n async applyDefaultValue(): Promise<void> {\n if (this.descriptor.defaultValue === undefined) return;\n const value: unknown = await Promise.resolve(\n this.resolve(this.descriptor.defaultValue),\n );\n if (value !== undefined) this.setValue(value);\n }\n\n /**\n * Hook for setup that cannot happen in {@link build} — loading select\n * options, or a first render that needs the form context. May be synchronous.\n */\n initialize(): void | Promise<void> {\n // Overridden where needed.\n }\n\n /**\n * Called on every form update, after values have settled.\n *\n * @param triggerName name of the field whose input started this update\n */\n onFormUpdate(_ctx: FormChangeContext, _triggerName: string | undefined): void {\n // Overridden where needed.\n }\n\n destroy(): void {\n this.wrapper.remove();\n }\n\n private applyTabClasses(): void {\n for (const tab of this.tabsFromStaticDescriptor()) {\n this.wrapper.classList.add(tabClassName(tab));\n }\n }\n\n /**\n * Tab classes are stamped on at construction time, before the form has any\n * values, so only a statically declared `tab` can contribute one.\n */\n private tabsFromStaticDescriptor(): string[] {\n const spec = this.descriptor.tab;\n if (!spec || typeof spec === 'function') return [];\n return (Array.isArray(spec) ? spec : [spec]).filter(\n (tab): tab is string => typeof tab === 'string' && tab.length > 0,\n );\n }\n\n private createLabel(): HTMLLabelElement | undefined {\n if (this.descriptor.displayName === undefined) {\n this.wrapper.classList.add('withoutLabel');\n return undefined;\n }\n\n // v1 pointed `for` at the field name while the control only ever had a\n // `name`, so no label was ever actually associated. Give the control a real\n // id and point at that.\n const controlId = this.controlIdForLabel();\n const label = createEl('label', {\n attrs: { for: controlId },\n content: this.descriptor.displayName,\n });\n\n this.wrapper.appendChild(label);\n return label;\n }\n\n /**\n * The id `label[for]` should target.\n *\n * Defaults to giving the control element an id; kinds whose control is a\n * wrapper (checkbox, cards, file) override this to point at the real input.\n */\n protected controlIdForLabel(): string {\n const id = this.context.ids.for('control', this.descriptor.name);\n if (!this.element.id) this.element.id = id;\n return this.element.id;\n }\n\n private createTooltipMarker(): void {\n const tooltip = this.descriptor.tooltip;\n if (tooltip === undefined) return;\n\n const descriptor =\n typeof tooltip === 'object' && tooltip !== null && 'text' in tooltip\n ? tooltip\n : { text: tooltip, inInput: false };\n\n const marker = this.context.tooltips.createMarker(descriptor.text);\n this.tooltipMarker = marker;\n\n if (this.label && !descriptor.inInput) {\n this.label.appendChild(marker);\n } else {\n marker.classList.add('dl-tooltip-in-input');\n this.element.classList.add('dl-tooltip-inside');\n this.wrapper.appendChild(marker);\n }\n }\n\n /** Convenience for subclasses that render simple text content. */\n protected setContent = setContent;\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport type { ComputedFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A value derived from the rest of the form.\n *\n * Rendered as a hidden input (which adds `.dl-form-hidden-field` to the wrapper)\n * and recomputed before the dialog is confirmed. The computed value lives on the\n * field rather than in the DOM, so it is not limited to strings.\n */\nexport class ComputedField extends Field<ComputedFieldDescriptor> {\n private value: unknown = '';\n\n protected createControl(): HTMLElement {\n const input = createEl('input');\n input.type = 'hidden';\n return input;\n }\n\n getValue(): unknown {\n return this.value;\n }\n\n setValue(value: unknown): void {\n this.value = value;\n }\n\n /** Recompute. Awaited by `updateComputedFields()` before a button action runs. */\n async recompute(): Promise<void> {\n const ctx = this.context.contextFor(this.descriptor);\n this.value = await this.descriptor.compute(ctx);\n }\n}\n","/**\n * Coerce a field value to the string an `<input>` or attribute can hold.\n *\n * Field values are `unknown` because `computed` and `custom` fields may hold\n * anything. The DOM-backed kinds still need a string, and this is the single\n * place that conversion happens — including the deliberate choice to render\n * `null`/`undefined` as `''` rather than `\"null\"`.\n *\n * Objects are JSON-encoded rather than becoming `[object Object]`, which is\n * what a bare `String()` would produce.\n */\nexport function asText(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { FormChangeContext, TextAreaFieldDescriptor } from '../types/descriptors.js';\n\n/** A multi-line `<textarea>`. */\nexport class TextAreaField extends Field<TextAreaFieldDescriptor> {\n private textarea!: HTMLTextAreaElement;\n\n protected createControl(): HTMLElement {\n const textarea = createEl('textarea');\n this.textarea = textarea;\n\n const placeholder = this.descriptor.placeholder;\n if (typeof placeholder === 'string') textarea.placeholder = placeholder;\n\n textarea.oninput = () => this.requestUpdate();\n textarea.onchange = textarea.oninput;\n\n return textarea;\n }\n\n /** Whether Enter inserts a newline rather than confirming the dialog. */\n get allowsNewlines(): boolean {\n return this.descriptor.allowNewlines === true;\n }\n\n getValue(): string {\n return this.textarea.value;\n }\n\n setValue(value: unknown): void {\n this.textarea.value = asText(value);\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n if (typeof this.descriptor.placeholder === 'function') {\n this.textarea.placeholder = this.resolve(this.descriptor.placeholder) ?? '';\n }\n }\n}\n","import { Field } from './Field.js';\nimport { createEl, setContent } from '../util/dom.js';\nimport type {\n ArrayFieldDescriptor,\n FieldDescriptor,\n FormChangeContext,\n FormValues,\n} from '../types/descriptors.js';\nimport type { TextOrHtml } from '../util/html.js';\n\n/**\n * A repeating list of sub-records, each edited in its own nested dialog.\n *\n * v1 implemented this by overwriting the caller's `field.render` with a closure\n * that also owned the suggestion checkboxes and the add/edit/delete buttons.\n * Here the entries, the accepted suggestions and the DOM are all state on the\n * field, and the entry dialogs are built through `context.createSubForm`.\n */\nexport class ArrayField extends Field<ArrayFieldDescriptor> {\n private entries: FormValues[] = [];\n /** Suggestions the user ticked, kept with their index so they can be un-ticked. */\n private acceptedSuggestions: { entry: FormValues; index: number }[] = [];\n\n protected createControl(): HTMLElement {\n return createEl('div', { classNames: ['array-of'] });\n }\n\n override initialize(): void {\n this.render();\n }\n\n getValue(): FormValues[] {\n const result = [...this.entries];\n\n // Accepted suggestions are merged in, skipping any already added by hand.\n for (const { entry } of this.acceptedSuggestions) {\n const encoded = JSON.stringify(entry);\n if (!result.some((existing) => JSON.stringify(existing) === encoded)) {\n result.push(entry);\n }\n }\n\n return result;\n }\n\n setValue(value: unknown): void {\n this.entries = Array.isArray(value) ? [...(value as FormValues[])] : [];\n this.render();\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n this.render();\n }\n\n // ------------------------------------------------------------------ render\n\n private render(): void {\n this.element.replaceChildren();\n\n const suggestions = this.resolve(this.descriptor.suggested);\n if (suggestions && suggestions.length > 0) {\n this.element.appendChild(this.renderSuggestions(suggestions));\n }\n\n this.entries.forEach((entry, index) => {\n this.element.appendChild(this.renderEntry(entry, index));\n });\n\n this.element.appendChild(this.renderAddButton());\n }\n\n private renderSuggestions(suggestions: readonly FormValues[]): HTMLElement {\n const container = createEl('div', {\n classNames: ['dl-form-array-suggested-container'],\n });\n\n suggestions.forEach((suggestion, index) => {\n const id = this.context.ids.for(\n 'suggestion',\n `${this.descriptor.name}-${String(index)}`,\n );\n\n const wrapper = createEl('span', {\n classNames: ['check', 'dl-form-array-of-suggestion'],\n attrs: { value: 'false' },\n });\n\n const checkbox = createEl('input', { attrs: { type: 'checkbox', id } });\n checkbox.checked = this.acceptedSuggestions.some((item) => item.index === index);\n\n checkbox.oninput = checkbox.onchange = () => {\n wrapper.setAttribute('value', String(checkbox.checked));\n\n if (checkbox.checked) {\n this.acceptedSuggestions.push({ entry: suggestion, index });\n } else {\n this.acceptedSuggestions = this.acceptedSuggestions.filter(\n (item) => item.index !== index,\n );\n }\n\n this.requestUpdate();\n };\n\n const label = createEl('label', { attrs: { for: id } });\n setContent(label, this.entrySummary(suggestion));\n\n wrapper.appendChild(checkbox);\n wrapper.appendChild(label);\n container.appendChild(wrapper);\n });\n\n return container;\n }\n\n private renderEntry(entry: FormValues, index: number): HTMLElement {\n const row = createEl('div', {\n classNames: ['dl-form-array-of-entry'],\n attrs: { 'data-el-index': String(index) },\n });\n\n const summary = createEl('span');\n setContent(summary, this.entrySummary(entry));\n row.appendChild(summary);\n\n const edit = createEl('button', {\n classNames: ['edit-array-of-btn'],\n attrs: { type: 'button', 'data-el-index': String(index) },\n content: 'Edit',\n });\n edit.onclick = (event) => {\n event.preventDefault();\n this.openEntryDialog(index);\n };\n\n const remove = createEl('button', {\n classNames: ['delete-array-of-btn'],\n attrs: { type: 'button', 'data-el-index': String(index) },\n content: 'Remove',\n });\n remove.onclick = (event) => {\n event.preventDefault();\n this.entries.splice(index, 1);\n this.render();\n this.notifyChange();\n this.requestUpdate(true);\n };\n\n row.appendChild(edit);\n row.appendChild(remove);\n return row;\n }\n\n private renderAddButton(): HTMLElement {\n const button = createEl('button', {\n classNames: ['dl-form-array-of-add-entry'],\n attrs: { type: 'button' },\n content: this.descriptor.newButtonLabel ?? 'Add',\n });\n\n button.onclick = (event) => {\n event.preventDefault();\n this.openEntryDialog();\n };\n\n return button;\n }\n\n /** Default summary: every non-empty string value, comma separated. */\n private entrySummary(entry: FormValues): TextOrHtml {\n if (this.descriptor.renderEntry) return this.descriptor.renderEntry(entry);\n\n return Object.values(entry)\n .filter(\n (value): value is string => typeof value === 'string' && value.trim() !== '',\n )\n .join(', ');\n }\n\n // ------------------------------------------------------------ entry dialog\n\n /** Open the add dialog, or the edit dialog when `index` is given. */\n private openEntryDialog(index?: number): void {\n const editing = index !== undefined;\n const existing = editing ? this.entries[index] : undefined;\n\n const fields = editing ? this.editFields(existing ?? {}) : this.descriptor.of;\n\n const confirmId = this.context.ids.for('array-confirm', this.descriptor.name);\n\n const form = this.context.createSubForm({\n classNames: [`form-for-array-of-${this.descriptor.name}`],\n fields,\n isEditingArrayEntry: editing,\n buttons: {\n OK: {\n id: confirmId,\n isActive: ({ data }) => this.validateEntry(data),\n action: (values) => {\n if (editing && index !== undefined) this.entries[index] = values;\n else this.entries.push(values);\n\n this.render();\n this.notifyChange();\n this.requestUpdate(true);\n },\n },\n },\n });\n\n form.openInModal();\n }\n\n /** Seed each field with the entry's current value, then apply `mapFieldsOnEdit`. */\n private editFields(entry: FormValues): readonly FieldDescriptor[] {\n const seeded = this.descriptor.of.map((field) => ({\n ...field,\n defaultValue: entry[field.name] ?? field.defaultValue ?? '',\n })) as FieldDescriptor[];\n\n return this.descriptor.mapFieldsOnEdit?.(seeded, entry) ?? seeded;\n }\n\n private validateEntry(entry: FormValues): boolean | Promise<boolean> {\n if (!this.descriptor.isValidRecord) return true;\n return this.descriptor.isValidRecord(entry, this.context.contextFor(this.descriptor));\n }\n\n private notifyChange(): void {\n const onChange = this.descriptor.onChange;\n if (!onChange) return;\n\n void this.context.scheduler\n .whenSettled()\n .then(() => onChange(this.context.contextFor(this.descriptor).data));\n }\n}\n","import { Field } from './Field.js';\nimport { createEl, findByAttribute } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { CardsFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A row of clickable option cards — a richer alternative to a select when there\n * are few options and each needs a description or an icon.\n *\n * v1 called this `detailedOptions`.\n */\nexport class CardsField extends Field<CardsFieldDescriptor> {\n private value: string | undefined;\n\n protected createControl(): HTMLElement {\n const container = createEl('div', { classNames: ['detailed-options'] });\n\n for (const card of this.descriptor.cards) {\n const cardEl = createEl('div', {\n classNames: ['detailed-option'],\n attrs: { 'data-value': card.value },\n content: card.content,\n });\n\n cardEl.addEventListener('click', () => {\n this.select(card.value);\n this.requestUpdate();\n });\n\n container.appendChild(cardEl);\n }\n\n return container;\n }\n\n getValue(): string {\n return this.value ?? '';\n }\n\n setValue(value: unknown): void {\n if (value == null) return;\n this.select(asText(value));\n }\n\n private select(value: string): void {\n const target = findByAttribute(\n this.element,\n '.detailed-option',\n 'data-value',\n value,\n )[0];\n if (!target) return;\n\n this.value = value;\n this.element.setAttribute('value', value);\n\n for (const card of this.element.querySelectorAll('.detailed-option')) {\n card.classList.remove('active');\n }\n target.classList.add('active');\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport type { CheckboxFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A checkbox with a caption.\n *\n * The control is a `<span class=\"check\">` wrapping the input and its caption —\n * part of the frozen DOM contract, since `.dl-form form .check input` and\n * `.check label` are styled by the default stylesheet and by consumers.\n */\nexport class CheckboxField extends Field<CheckboxFieldDescriptor> {\n private input!: HTMLInputElement;\n\n protected createControl(): HTMLElement {\n const wrapper = createEl('span', { classNames: ['check'] });\n\n // v1 used `field-<index>`, which collided across forms. The generator is\n // scoped per form, so a parent form and its array sub-form never clash.\n const inputId = this.context.ids.for('check', this.descriptor.name);\n\n const input = createEl('input', { attrs: { type: 'checkbox', id: inputId } });\n this.input = input;\n\n input.oninput = input.onchange = () => {\n wrapper.setAttribute('value', String(input.checked));\n this.requestUpdate();\n };\n\n const caption = createEl('label', {\n attrs: { for: inputId },\n content: this.descriptor.label,\n });\n\n wrapper.appendChild(input);\n wrapper.appendChild(caption);\n wrapper.setAttribute('value', 'false');\n\n return wrapper;\n }\n\n /** The outer `displayName` label points at the real input, not the wrapper. */\n protected override controlIdForLabel(): string {\n return this.input.id;\n }\n\n getValue(): boolean {\n return this.input.checked;\n }\n\n setValue(value: unknown): void {\n const checked = value === 'false' ? false : Boolean(value);\n this.input.checked = checked;\n this.element.setAttribute('value', String(checked));\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport type {\n CustomFieldDescriptor,\n FormChangeContext,\n RenderContext,\n} from '../types/descriptors.js';\n\n/**\n * An escape hatch: you render the content, the form manages the value.\n *\n * `render` is called on mount and again on every form update. v1 injected\n * `setValue` and `onChange` onto the DOM element; both now arrive on the render\n * context instead, so the element stays a plain `HTMLElement`.\n */\nexport class CustomField extends Field<CustomFieldDescriptor> {\n private value: unknown = '';\n\n protected createControl(): HTMLElement {\n return createEl('p', { classNames: ['render'] });\n }\n\n getValue(): unknown {\n return this.value;\n }\n\n setValue(value: unknown): void {\n this.value = value;\n }\n\n override initialize(): void {\n this.render();\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n this.render();\n }\n\n private render(): void {\n this.descriptor.render(this.renderContext());\n }\n\n private renderContext(): RenderContext {\n const base = this.context.contextFor(this.descriptor);\n return {\n ...base,\n element: this.element,\n requestUpdate: (force = false) => this.requestUpdate(force),\n setValue: (value: unknown) => {\n this.value = value;\n this.requestUpdate();\n },\n };\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { FileFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A file picker with an image preview.\n *\n * The field's value is the URL returned by the form's `persistFile` hook, not\n * the `File` itself — the dialog stores a reference, the app decides where the\n * bytes go.\n */\nexport class FileField extends Field<FileFieldDescriptor> {\n private input!: HTMLInputElement;\n private preview!: HTMLElement;\n private url: string | undefined;\n\n protected createControl(): HTMLElement {\n const container = createEl('div', { classNames: ['file-field'] });\n const preview = createEl('div', { classNames: ['file-preview', 'empty'] });\n const input = createEl('input', { attrs: { type: 'file' } });\n\n this.preview = preview;\n this.input = input;\n\n if (this.descriptor.accept) input.setAttribute('accept', this.descriptor.accept);\n input.id = this.context.ids.for('file', this.descriptor.name);\n\n input.oninput = () => {\n void this.handlePick();\n };\n\n container.appendChild(preview);\n container.appendChild(input);\n return container;\n }\n\n protected override controlIdForLabel(): string {\n return this.input.id;\n }\n\n getValue(): string {\n return this.url ?? '';\n }\n\n setValue(value: unknown): void {\n const url = value == null || value === '' ? undefined : asText(value);\n this.url = url;\n\n if (url) {\n this.element.setAttribute('data-value', url);\n this.renderPreview(url);\n } else {\n this.element.removeAttribute('data-value');\n this.clearPreview();\n this.input.value = '';\n }\n }\n\n override setLoading(loading: boolean): void {\n this.preview.classList.toggle('loading', loading);\n }\n\n private async handlePick(): Promise<void> {\n const file = this.input.files?.[0];\n\n if (!file) {\n this.setValue(undefined);\n this.requestUpdate();\n return;\n }\n\n this.clearPreview();\n this.preview.classList.remove('empty');\n this.setLoading(true);\n\n try {\n const url = await this.context.persistFile(file);\n this.setValue(url);\n } catch (error) {\n this.setValue(undefined);\n this.reportError(error);\n } finally {\n this.setLoading(false);\n this.requestUpdate();\n }\n }\n\n /**\n * Surface an upload failure.\n *\n * Dispatches a cancelable `dl-error` event on the field so the app can show\n * its own message; if nothing calls `preventDefault()`, the error is logged\n * rather than vanishing. Throwing here would only produce an unhandled\n * rejection, since this runs from an event handler.\n */\n private reportError(error: unknown): void {\n const event = new CustomEvent('dl-error', {\n bubbles: true,\n cancelable: true,\n detail: { field: this.descriptor.name, error },\n });\n\n if (this.element.dispatchEvent(event)) {\n console.error(\n `declarative-forms: persistFile failed for field \"${this.descriptor.name}\".`,\n error,\n );\n }\n }\n\n private clearPreview(): void {\n this.preview.replaceChildren();\n this.preview.classList.add('empty');\n }\n\n private renderPreview(url: string): void {\n this.preview.replaceChildren();\n this.preview.classList.remove('empty');\n\n const container = createEl('div', { classNames: ['file-selection-container'] });\n const image = createEl('img', { classNames: ['file-preview'] });\n image.src = url;\n image.alt = '';\n\n const deleteButton = createEl('button', {\n classNames: ['file-selection-delete-btn'],\n attrs: { type: 'button', 'aria-label': 'Remove file' },\n });\n deleteButton.appendChild(\n createEl('div', { classNames: ['file-selection-delete-btn-icon'] }),\n );\n deleteButton.onclick = () => {\n this.setValue(undefined);\n this.requestUpdate();\n };\n\n container.appendChild(image);\n container.appendChild(deleteButton);\n this.preview.appendChild(container);\n }\n}\n","import { Field } from './Field.js';\nimport { createEl, setContent } from '../util/dom.js';\nimport type { FormChangeContext, MessageFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A presentational paragraph. Holds no value and never appears in `getValues()`.\n */\nexport class MessageField extends Field<MessageFieldDescriptor> {\n protected createControl(): HTMLElement {\n const el = createEl('p', { classNames: ['message'] });\n setContent(el, this.resolve(this.descriptor.message) ?? '');\n return el;\n }\n\n override get contributesValue(): boolean {\n return false;\n }\n\n getValue(): undefined {\n return undefined;\n }\n\n setValue(): void {\n // Messages are not settable.\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n if (typeof this.descriptor.message === 'function') {\n setContent(this.element, this.resolve(this.descriptor.message) ?? '');\n }\n }\n}\n","/**\n * Structural styles for `<dl-select>`.\n *\n * These live in JS rather than in the shipped stylesheet because the component\n * does not work without them — the options popup is absolutely positioned and\n * toggled through these rules. Everything here is themable through the `--dl-*`\n * custom properties, and the form/modal chrome ships separately as\n * `declarative-forms/styles.css`.\n *\n * v1 appended this on `window.load` as an import side effect, which broke SSR\n * and leaked between tests. It is now injected lazily, the first time a\n * `<dl-select>` is actually connected to a document.\n */\nexport const DL_SELECT_STYLES = `\n@keyframes dl-placeholder-shimmer {\n 0% { background-position: -468px 0 }\n 100% { background-position: 468px 0 }\n}\n\ndl-select {\n display: block;\n position: relative;\n font-weight: 300;\n font-family: var(--dl-font-family, 'Rubik');\n --dl-select-input-width: 370px;\n}\n\ndl-select .input-wrapper {\n display: inline-block;\n border-width: 2px;\n border-style: solid;\n border-color: var(--dl-line-color, #ddd);\n background-color: var(--dl-options-background, #fff);\n color: var(--dl-options-text-color, #545454);\n border-radius: 4px;\n}\n\ndl-select.dl-focused .input-wrapper {\n border-color: var(--dl-focused-line-color, #bbb);\n}\n\ndl-select.dl-focused .input-wrapper svg {\n border-left: 1px solid var(--dl-focused-line-color, #bbb);\n fill: var(--dl-focused-line-color, #bbb);\n}\n\ndl-select .input-wrapper input {\n width: var(--dl-select-input-width);\n color: var(--dl-options-text-color, #545454);\n outline-width: 0;\n margin-top: 2px;\n padding: 6px;\n font-size: var(--dl-font-size, 0.9em);\n font-family: var(--dl-font-family, 'Rubik');\n font-weight: 300;\n border: 0;\n border-radius: 4px;\n float: left;\n cursor: pointer;\n box-sizing: content-box;\n background: transparent;\n}\n\ndl-select .input-wrapper input::placeholder {\n color: var(--dl-options-inactive-text-color, #545454);\n}\n\ndl-select .input-wrapper svg {\n width: 20px;\n height: 20px;\n margin-top: var(--dl-drop-down-icon-margin-top, 5px);\n margin-right: 4px;\n padding-left: 4px;\n fill: var(--dl-line-color, #ddd);\n float: right;\n border-left: 1px solid var(--dl-line-color, #ddd);\n cursor: pointer;\n}\n\n.options-wrapper {\n position: absolute;\n left: 0;\n top: 20px;\n font-size: var(--dl-font-size, 0.9em);\n width: 100%;\n max-height: 230px;\n overflow-y: auto;\n overflow-x: hidden;\n box-shadow: 0 0 10px -2px rgba(0, 0, 0, 0.4);\n z-index: 100;\n background-color: var(--dl-options-background, #fff);\n font-family: var(--dl-font-family, 'Rubik');\n border-top: 1px solid var(--dl-focused-line-color, #bbb);\n border-bottom: 1px solid var(--dl-focused-line-color, #bbb);\n border-radius: 4px;\n}\n\n.options-wrapper dl-option {\n display: block;\n border-left: 1px solid var(--dl-focused-line-color, #bbb);\n border-right: 1px solid var(--dl-focused-line-color, #bbb);\n cursor: pointer;\n padding-top: var(--dl-options-padding-top, 5px);\n padding-right: var(--dl-options-padding-right, 5px);\n padding-bottom: var(--dl-options-padding-bottom, 5px);\n padding-left: var(--dl-options-padding-left, 5px);\n color: var(--dl-options-text-color, #545454);\n background-color: var(--dl-options-background, #fff);\n}\n\n.options-wrapper dl-option[selected=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.options-wrapper dl-option:hover,\n.options-wrapper dl-option.dl-focused {\n background-color: var(--dl-options-option-hover-color, rgba(224, 240, 227, 0.4));\n}\n\n.options-wrapper .noMatchesHint {\n border-left: 1px solid var(--dl-focused-line-color, #bbb);\n border-right: 1px solid var(--dl-focused-line-color, #bbb);\n padding: 5px;\n font-style: italic;\n color: var(--dl-options-text-color, #545454);\n}\n\ndl-select .dl-option-tag {\n float: right;\n border: 1px solid #888;\n font-size: 0.8em;\n padding: 2px;\n font-family: 'Source Code Pro', monospace;\n border-radius: 2px;\n margin-top: -1px;\n}\n\ndl-select .dl-option-tag:last-child {\n margin-right: 10px;\n}\n\n.dl-select-no-options-available svg path { display: none; }\n.dl-select-no-options-available svg { border-left: none !important; }\n\n.dl-select-loading svg,\n.dl-select-no-options-available svg,\n.dl-select-loading input,\n.dl-select-no-options-available input {\n pointer-events: none;\n}\n\n.dl-select-loading .input-wrapper {\n animation: dl-placeholder-shimmer 1.25s linear infinite forwards;\n background: linear-gradient(\n to right,\n var(--dl-select-loading-col1, #eee) 10%,\n var(--dl-select-loading-col2, #ddd) 18%,\n var(--dl-select-loading-col1, #eee) 33%\n );\n background-size: 800px 104px;\n position: relative;\n width: 412px;\n}\n\n.dl-select-loading input { opacity: 0; }\n\n.dl-field-one-third input,\n.dl-field-two-third input {\n --dl-select-input-width: 127px;\n}\n\nbody.dark-theme dl-select {\n --dl-select-loading-col1: #282727;\n --dl-select-loading-col2: #505656;\n}\n`;\n\nlet injected = false;\n\n/**\n * Inject the `<dl-select>` styles once per document.\n *\n * Safe to call repeatedly and safe to call before `document.body` exists.\n */\nexport function injectStyles(): void {\n if (injected || typeof document === 'undefined') return;\n injected = true;\n\n const style = document.createElement('style');\n style.setAttribute('data-declarative-forms', 'dl-select');\n style.textContent = DL_SELECT_STYLES;\n (document.head ?? document.documentElement).appendChild(style);\n}\n\n/** Allow re-injection. Test-only. */\nexport function resetStyleInjection(): void {\n injected = false;\n}\n","import { findByAttribute } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport { injectStyles } from './styles.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst ARROW_PATH =\n 'M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 ' +\n '1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 ' +\n '4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-' +\n '4.695-4.502s-0.436-1.17 0-1.615z';\n\n/** Minimum time the loading skeleton stays up, so it does not flash. */\nconst MIN_LOADING_MS = 1500;\n/** Delay before the skeleton appears, so fast loads never show it at all. */\nconst LOADING_DELAY_MS = 100;\n\n/**\n * Base class for the custom elements.\n *\n * `class X extends HTMLElement` is evaluated as soon as the module loads, which\n * throws outright in Node — breaking any server-rendered or prerendered app\n * that so much as imports the package. Falling back to an empty class keeps the\n * module importable; the stand-in is never instantiated, because custom\n * elements are only registered when `customElements` exists.\n */\nconst CustomElementBase: typeof HTMLElement =\n typeof HTMLElement === 'undefined'\n ? (class {} as unknown as typeof HTMLElement)\n : HTMLElement;\n\n/**\n * An option inside a {@link DlSelect}.\n *\n * v1 never registered this element, leaving it an `HTMLUnknownElement`.\n * Registering it gives it a stable prototype and somewhere to hang the option\n * semantics the accessibility work needs.\n */\nexport class DlOption extends CustomElementBase {\n /** The value this option contributes, falling back to its text. */\n get optionValue(): string {\n return this.getAttribute('value') ?? this.innerText;\n }\n\n /** Text shown once selected, which may differ from the option's own label. */\n get displayText(): string {\n return this.getAttribute('displayWhenSelected') ?? this.innerText;\n }\n}\n\n/**\n * A filterable combobox that supports async options and multi-select.\n *\n * Deliberately light-DOM: consumers style its internals (`.input-wrapper`,\n * `.options-wrapper`, `dl-option`) and the options popup is reparented to\n * `document.body` while open so it can escape a scrolling container.\n */\nexport class DlSelect extends CustomElementBase {\n readonly optionsWrapper: HTMLDivElement;\n readonly inputWrapper: HTMLSpanElement;\n readonly noMatchesHint: HTMLSpanElement;\n readonly selectedContainer: HTMLSpanElement;\n readonly inputField: HTMLInputElement;\n readonly arrow: SVGSVGElement;\n\n multiple = false;\n isLoading = false;\n\n private initialized = false;\n private loadingTimeouts: ReturnType<typeof setTimeout>[] = [];\n private loadingStartedAt: number | undefined;\n private pendingValue: unknown;\n private selectedOption: DlOption | undefined;\n private focusedOption: DlOption | undefined;\n private repositionListener: (() => void) | undefined;\n private scrollTargets: EventTarget[] = [];\n\n constructor() {\n super();\n this.optionsWrapper = document.createElement('div');\n this.inputWrapper = document.createElement('span');\n this.noMatchesHint = document.createElement('span');\n this.selectedContainer = document.createElement('span');\n this.inputField = document.createElement('input');\n this.arrow = document.createElementNS(SVG_NS, 'svg');\n }\n\n connectedCallback(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n injectStyles();\n\n this.inputWrapper.classList.add('input-wrapper');\n this.optionsWrapper.classList.add('options-wrapper');\n this.optionsWrapper.setAttribute(\n 'data-for-dl-select',\n this.getAttribute('name') ?? '',\n );\n this.selectedContainer.classList.add('selected-container');\n this.optionsWrapper.style.display = 'none';\n\n this.noMatchesHint.classList.add('noMatchesHint');\n this.noMatchesHint.textContent = 'No Matches';\n this.noMatchesHint.style.display = 'none';\n this.optionsWrapper.appendChild(this.noMatchesHint);\n\n this.multiple = this.getAttribute('multiple') !== null;\n this.inputField.placeholder = this.getAttribute('placeholder') ?? 'Select ...';\n this.inputField.onfocus = () => this.open();\n this.inputField.onblur = () => this.close();\n this.inputField.oninput = () => this.filterOptions(this.inputField.value);\n\n const path = document.createElementNS(SVG_NS, 'path');\n path.setAttribute('d', ARROW_PATH);\n this.arrow.appendChild(path);\n this.arrow.onclick = () => this.inputField.focus();\n\n this.classList.add('dl-select-no-options-available');\n this.addEventListener('keydown', this.onKeyDown);\n\n this.mount();\n }\n\n disconnectedCallback(): void {\n this.detachRepositionListeners();\n for (const timeout of this.loadingTimeouts) clearTimeout(timeout);\n this.loadingTimeouts = [];\n }\n\n /** Move any author-provided `<dl-option>` children into the popup. */\n private mount(): void {\n while (this.firstElementChild) {\n this.adoptOption(this.firstElementChild as DlOption);\n }\n\n this.inputWrapper.appendChild(this.selectedContainer);\n this.inputWrapper.appendChild(this.inputField);\n this.inputWrapper.appendChild(this.arrow);\n this.appendChild(this.inputWrapper);\n this.appendChild(this.optionsWrapper);\n\n this.setValue(this.getValue());\n this.updatePlaceholder();\n }\n\n private adoptOption(option: DlOption): void {\n option.onmousedown = () => this.selectOption(option);\n option.onmouseover = () => this.clearFocusedOption();\n this.optionsWrapper.appendChild(option);\n }\n\n addOption(option: DlOption | HTMLElement): void {\n this.adoptOption(option as DlOption);\n this.classList.remove('dl-select-no-options-available');\n this.updatePlaceholder();\n }\n\n removeAllOptions(): void {\n this.classList.add('dl-select-no-options-available');\n for (const option of this.optionsWrapper.querySelectorAll('dl-option')) {\n option.remove();\n }\n this.selectedOption = undefined;\n this.updatePlaceholder();\n }\n\n /** All options currently in the popup. */\n get options(): DlOption[] {\n return [...this.optionsWrapper.querySelectorAll('dl-option')] as DlOption[];\n }\n\n // ---------------------------------------------------------------- loading\n\n /**\n * Enter the loading state.\n *\n * The skeleton only appears after a short delay, so options that resolve\n * quickly never flash one. Repeated calls are safe.\n */\n setLoadingStatus(): void {\n this.isLoading = true;\n this.loadingTimeouts.push(\n setTimeout(() => {\n this.classList.add('dl-select-loading');\n this.optionsWrapper.remove();\n this.loadingStartedAt = Date.now();\n }, LOADING_DELAY_MS),\n );\n }\n\n unsetLoadingStatus(): void {\n for (const timeout of this.loadingTimeouts) clearTimeout(timeout);\n this.loadingTimeouts = [];\n\n const elapsed = this.loadingStartedAt ? Date.now() - this.loadingStartedAt : 0;\n const delay = this.loadingStartedAt ? Math.max(0, MIN_LOADING_MS - elapsed) : 0;\n\n const finish = (): void => {\n this.appendChild(this.optionsWrapper);\n this.classList.remove('dl-select-loading');\n this.isLoading = false;\n this.loadingStartedAt = undefined;\n\n if (this.pendingValue !== undefined) {\n const value = this.pendingValue;\n this.pendingValue = undefined;\n this.setValue(value);\n }\n };\n\n if (delay === 0) finish();\n else this.loadingTimeouts.push(setTimeout(finish, delay));\n }\n\n // ------------------------------------------------------------ value access\n\n getValue(): string | string[] | undefined {\n const raw = this.getAttribute('value');\n\n if (raw) {\n if (!this.multiple) return raw;\n try {\n return JSON.parse(raw) as string[];\n } catch {\n return undefined;\n }\n }\n\n // Fall back to a value set before the matching option existed.\n const pending = this.getAttribute('tmp-value');\n if (!pending) return undefined;\n\n if (this.multiple) {\n try {\n return (JSON.parse(pending) as string[]).filter((v) => this.findOption(v));\n } catch {\n return undefined;\n }\n }\n\n return this.findOption(pending) ? pending : undefined;\n }\n\n setValue(value: unknown): void {\n if (value === undefined || value === null || value === '') return;\n\n // Options are not in the DOM while loading; replay once they arrive.\n if (this.isLoading) {\n this.pendingValue = value;\n return;\n }\n\n if (this.multiple) {\n const next = (Array.isArray(value) ? value : [value]).map(asText);\n for (const current of (this.getValue() as string[] | undefined) ?? []) {\n const option = this.findOption(current);\n if (option) this.deselectOption(option);\n }\n for (const entry of next) {\n const option = this.findOption(entry);\n if (option) this.selectOption(option);\n }\n return;\n }\n\n const single = asText(value);\n this.setAttribute('tmp-value', single);\n const option = this.findOption(single);\n if (option) this.selectOption(option);\n }\n\n /**\n * Find an option by its `value` attribute, falling back to its text.\n *\n * v1 concatenated the value straight into an attribute selector, which threw\n * on any value containing a quote or a backslash.\n */\n private findOption(value: string): DlOption | undefined {\n return (\n this.options.find((option) => option.getAttribute('value') === value) ??\n this.options.find((option) => option.innerText === value)\n );\n }\n\n // ------------------------------------------------------------- selection\n\n private selectOption(option: DlOption | undefined): void {\n if (!option) return;\n\n const value = option.optionValue;\n\n if (this.multiple) {\n const current = (this.getValue() as string[] | undefined) ?? [];\n if (current.includes(value)) return;\n\n this.selectedContainer.appendChild(this.createTag(option));\n this.markSelected(option, true);\n this.setAttribute('value', JSON.stringify([...current, value]));\n } else {\n this.selectedOption = option;\n this.inputField.value = option.displayText;\n this.setAttribute('value', value);\n }\n\n this.emitChange();\n }\n\n private deselectOption(option: DlOption): void {\n const value = option.optionValue;\n const current = (this.getValue() as string[] | undefined) ?? [];\n\n this.tagFor(value)?.remove();\n this.markSelected(option, false);\n this.setAttribute('value', JSON.stringify(current.filter((v) => v !== value)));\n\n this.emitChange();\n }\n\n /** Mark every option carrying this value, since duplicates are allowed. */\n private markSelected(option: DlOption, selected: boolean): void {\n const attribute = option.getAttribute('value');\n const matches = attribute\n ? findByAttribute(this, 'dl-option', 'value', attribute)\n : [option];\n\n for (const match of matches) match.setAttribute('selected', String(selected));\n }\n\n private createTag(option: DlOption): HTMLElement {\n const tag = document.createElement('span');\n tag.classList.add('multiselect-tag');\n tag.dataset['value'] = option.optionValue;\n tag.innerText = option.displayText;\n\n // Class names carry v1's \"muliselect\" typo: consumers style them.\n const removeContainer = document.createElement('span');\n removeContainer.classList.add('dl-muliselect-selected-remove-container');\n\n const remove = document.createElement('span');\n remove.classList.add('dl-muliselect-selected-remove');\n remove.onclick = () => this.deselectOption(option);\n\n removeContainer.appendChild(remove);\n tag.appendChild(removeContainer);\n return tag;\n }\n\n private tagFor(value: string): HTMLElement | undefined {\n return findByAttribute<HTMLElement>(\n this.selectedContainer,\n '.multiselect-tag',\n 'data-value',\n value,\n )[0];\n }\n\n private emitChange(): void {\n this.dispatchEvent(new CustomEvent('change', { bubbles: false, cancelable: true }));\n }\n\n // -------------------------------------------------------------- filtering\n\n filterOptions(query: string): void {\n const terms = query.toLowerCase().split(' ').filter(Boolean);\n let matched = false;\n\n for (const option of this.options) {\n const text = option.innerText.toLowerCase();\n const visible = terms.length === 0 || terms.every((term) => text.includes(term));\n option.style.display = visible ? 'block' : 'none';\n matched ||= visible;\n }\n\n this.noMatchesHint.style.display = matched ? 'none' : 'block';\n }\n\n private visibleOptions(): DlOption[] {\n return this.options.filter((option) => option.style.display !== 'none');\n }\n\n private clearFocusedOption(): void {\n this.focusedOption = undefined;\n for (const option of this.options) option.classList.remove('dl-focused');\n }\n\n private focusOption(option: DlOption | undefined): void {\n this.clearFocusedOption();\n if (!option) return;\n this.focusedOption = option;\n option.classList.add('dl-focused');\n option.scrollIntoView?.({ block: 'nearest' });\n }\n\n private step(delta: 1 | -1): void {\n const visible = this.visibleOptions();\n if (visible.length === 0) return;\n\n const current = this.focusedOption ? visible.indexOf(this.focusedOption) : -1;\n const next = current < 0 ? (delta === 1 ? 0 : visible.length - 1) : current + delta;\n\n if (next < 0 || next >= visible.length) return;\n this.focusOption(visible[next]);\n }\n\n private readonly onKeyDown = (event: Event): void => {\n const key = (event as KeyboardEvent).key;\n\n if (key === 'ArrowDown') this.step(1);\n else if (key === 'ArrowUp') this.step(-1);\n else if (key === 'Enter') {\n this.selectOption(this.focusedOption);\n this.close();\n } else return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n // ------------------------------------------------------------ open / close\n\n private get placeholderText(): string {\n if (this.options.length === 0) return 'No Options Available';\n if (this.selectedOption) return this.selectedOption.innerText;\n return this.getAttribute('placeholder') ?? 'Select ...';\n }\n\n private updatePlaceholder(): void {\n this.inputField.placeholder = this.placeholderText;\n }\n\n /** Open the popup. Named `open` because `focus()` is `HTMLElement`'s. */\n open(): void {\n this.classList.add('dl-focused');\n this.updatePlaceholder();\n this.inputField.value = '';\n this.optionsWrapper.style.display = 'inline-block';\n this.filterOptions('');\n\n // Reparented to the body so a scrolling ancestor cannot clip the popup.\n document.body.appendChild(this.optionsWrapper);\n this.reposition();\n this.attachRepositionListeners();\n }\n\n close(): void {\n this.classList.remove('dl-focused');\n this.optionsWrapper.style.display = 'none';\n this.inputField.value = this.selectedOption?.displayText ?? '';\n this.inputField.blur();\n this.clearFocusedOption();\n this.appendChild(this.optionsWrapper);\n this.detachRepositionListeners();\n }\n\n private reposition(): void {\n const anchor = this.inputWrapper.getBoundingClientRect();\n const style = this.optionsWrapper.style;\n style.position = 'absolute';\n style.top = `${anchor.bottom + window.scrollY + 2}px`;\n style.left = `${anchor.left + window.scrollX}px`;\n style.width = `${anchor.width}px`;\n }\n\n private attachRepositionListeners(): void {\n const listener = (): void => this.reposition();\n this.repositionListener = listener;\n this.scrollTargets = [];\n\n for (let el: Element | null = this.inputWrapper; el; el = el.parentElement) {\n if (el.scrollHeight > el.clientHeight) {\n el.addEventListener('scroll', listener);\n this.scrollTargets.push(el);\n }\n }\n\n document.addEventListener('scroll', listener);\n window.addEventListener('resize', listener);\n this.scrollTargets.push(document, window);\n }\n\n private detachRepositionListeners(): void {\n const listener = this.repositionListener;\n if (!listener) return;\n\n for (const target of this.scrollTargets) {\n target.removeEventListener('scroll', listener);\n target.removeEventListener('resize', listener);\n }\n\n this.scrollTargets = [];\n this.repositionListener = undefined;\n }\n}\n\n/**\n * Register `<dl-select>` and `<dl-option>`.\n *\n * Idempotent, and a no-op outside a browser. Called automatically whenever a\n * form builds a select field.\n */\nexport function defineDlSelect(): void {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get('dl-option')) customElements.define('dl-option', DlOption);\n if (!customElements.get('dl-select')) customElements.define('dl-select', DlSelect);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'dl-select': DlSelect;\n 'dl-option': DlOption;\n }\n}\n","import { Field } from './Field.js';\nimport { setContent } from '../util/dom.js';\nimport { defineDlSelect, type DlOption, type DlSelect } from '../components/DlSelect.js';\nimport type {\n FormChangeContext,\n SelectFieldDescriptor,\n SelectOption,\n} from '../types/descriptors.js';\n\n/** A `<dl-select>` combobox, single or multiple. */\nexport class SelectField extends Field<SelectFieldDescriptor> {\n private select!: DlSelect;\n\n protected override get wrapperExtraClass(): string {\n return 'dl-select-wrapper';\n }\n\n protected createControl(): HTMLElement {\n defineDlSelect();\n\n const select = document.createElement('dl-select');\n this.select = select;\n\n if (this.descriptor.multiple) select.setAttribute('multiple', '');\n\n const placeholder = this.descriptor.placeholder;\n if (typeof placeholder === 'string') select.setAttribute('placeholder', placeholder);\n\n select.onchange = () => this.requestUpdate();\n\n return select;\n }\n\n override async initialize(): Promise<void> {\n await this.loadOptions();\n }\n\n getValue(): string | string[] {\n const value = this.select.getValue();\n if (value === undefined) return this.descriptor.multiple ? [] : '';\n return value;\n }\n\n setValue(value: unknown): void {\n this.select.setValue(value);\n }\n\n override setLoading(loading: boolean): void {\n if (loading) this.select.setLoadingStatus();\n else this.select.unsetLoadingStatus();\n }\n\n override onFormUpdate(_ctx: FormChangeContext, triggerName: string | undefined): void {\n if (typeof this.descriptor.placeholder === 'function') {\n this.select.setAttribute(\n 'placeholder',\n this.resolve(this.descriptor.placeholder) ?? '',\n );\n }\n\n const dependsOnTrigger =\n triggerName !== undefined &&\n this.descriptor.reloadOnChangeOf?.includes(triggerName) === true;\n\n if (dependsOnTrigger && typeof this.descriptor.options === 'function') {\n void this.loadOptions({ reload: true });\n }\n }\n\n /**\n * Populate the options.\n *\n * Each load claims a generation token; if a newer load starts while this one\n * is still in flight, the stale result is dropped instead of clobbering the\n * fresher options. v1 had no such guard, so a slow response from an earlier\n * keystroke could repopulate the select with outdated values.\n */\n private async loadOptions(opts: { reload?: boolean } = {}): Promise<void> {\n const isCurrent = this.context.scheduler.claim(`options:${this.descriptor.name}`);\n const source = this.descriptor.options;\n\n const requested =\n typeof source === 'function'\n ? source(this.context.contextFor(this.descriptor))\n : source;\n\n // A plain array needs no loading state at all.\n const isAsync = requested instanceof Promise;\n if (isAsync) this.select.setLoadingStatus();\n\n try {\n const options = (await requested) ?? [];\n if (!isCurrent()) return;\n\n if (opts.reload) this.context.tooltips.reset(this.descriptor.name);\n\n const previous = this.select.getValue();\n this.select.removeAllOptions();\n for (const option of options) this.select.addOption(this.createOption(option));\n\n if (isAsync) this.select.unsetLoadingStatus();\n if (previous !== undefined) this.select.setValue(previous);\n } catch (error) {\n if (!isCurrent()) return;\n if (isAsync) this.select.unsetLoadingStatus();\n this.reportOptionsError(error);\n }\n }\n\n private createOption(option: SelectOption): DlOption {\n const el = document.createElement('dl-option');\n\n if (typeof option === 'string') {\n el.textContent = option;\n return el;\n }\n\n el.setAttribute('value', option.value);\n setContent(el, option.label);\n if (option.displayWhenSelected) {\n el.setAttribute('displayWhenSelected', option.displayWhenSelected);\n }\n\n return el;\n }\n\n private reportOptionsError(error: unknown): void {\n const handler = this.descriptor.onOptionsError;\n if (!handler) return;\n\n const message = handler({\n ...this.context.contextFor(this.descriptor),\n error,\n });\n\n if (message) {\n this.context.tooltips.setMessage(this.descriptor.name, message.level, message.text);\n }\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { FormChangeContext, TextFieldDescriptor } from '../types/descriptors.js';\n\n/** The fallback kind: a single-line `<input>`. */\nexport class TextField extends Field<TextFieldDescriptor> {\n private input!: HTMLInputElement;\n\n protected createControl(): HTMLElement {\n const input = createEl('input');\n this.input = input;\n\n if (this.descriptor.type) input.type = this.descriptor.type;\n if (this.descriptor.autocomplete) {\n input.setAttribute('autocomplete', this.descriptor.autocomplete);\n }\n\n const placeholder = this.descriptor.placeholder;\n if (typeof placeholder === 'string') input.placeholder = placeholder;\n\n input.oninput = () => this.requestUpdate();\n input.onchange = input.oninput;\n\n return input;\n }\n\n getValue(): string {\n return this.input.value;\n }\n\n setValue(value: unknown): void {\n this.input.value = asText(value);\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n if (typeof this.descriptor.placeholder === 'function') {\n this.input.placeholder = this.resolve(this.descriptor.placeholder) ?? '';\n }\n }\n}\n","import { ArrayField } from '../fields/ArrayField.js';\nimport { CardsField } from '../fields/CardsField.js';\nimport { CheckboxField } from '../fields/CheckboxField.js';\nimport { ComputedField } from '../fields/ComputedField.js';\nimport { CustomField } from '../fields/CustomField.js';\nimport { FileField } from '../fields/FileField.js';\nimport { MessageField } from '../fields/MessageField.js';\nimport { SelectField } from '../fields/SelectField.js';\nimport { TextAreaField } from '../fields/TextAreaField.js';\nimport { TextField } from '../fields/TextField.js';\nimport type { Field } from '../fields/Field.js';\nimport type { FieldDescriptor } from '../types/descriptors.js';\nimport type { FormContext } from './FormContext.js';\n\n/** Constructs a field from its descriptor. */\nexport type FieldConstructor = new (\n descriptor: never,\n context: FormContext,\n) => Field<never>;\n\n/**\n * Maps a descriptor's `kind` to the class that implements it.\n *\n * This replaces v1's ten-branch `if/else`, and makes the set of field kinds\n * extensible: register your own class and it becomes usable in any descriptor.\n */\nexport class FieldRegistry {\n private readonly kinds = new Map<string, FieldConstructor>();\n\n constructor(entries?: Iterable<[string, FieldConstructor]>) {\n for (const [kind, ctor] of entries ?? []) this.kinds.set(kind, ctor);\n }\n\n register(kind: string, ctor: FieldConstructor): this {\n this.kinds.set(kind, ctor);\n return this;\n }\n\n has(kind: string): boolean {\n return this.kinds.has(kind);\n }\n\n /** A copy, so callers can add kinds without mutating the shared default. */\n clone(): FieldRegistry {\n return new FieldRegistry(this.kinds);\n }\n\n create(descriptor: FieldDescriptor, context: FormContext): Field {\n const kind = descriptor.kind ?? 'text';\n const Ctor = this.kinds.get(kind);\n\n if (!Ctor) {\n throw new Error(\n `declarative-forms: unknown field kind \"${kind}\" on field \"${descriptor.name}\". ` +\n `Known kinds: ${[...this.kinds.keys()].sort().join(', ')}.`,\n );\n }\n\n return (new Ctor(descriptor as never, context) as Field).build();\n }\n}\n\n/** The built-in field kinds. */\nexport const defaultFieldRegistry = new FieldRegistry([\n ['text', TextField as unknown as FieldConstructor],\n ['textarea', TextAreaField as unknown as FieldConstructor],\n ['select', SelectField as unknown as FieldConstructor],\n ['checkbox', CheckboxField as unknown as FieldConstructor],\n ['message', MessageField as unknown as FieldConstructor],\n ['file', FileField as unknown as FieldConstructor],\n ['computed', ComputedField as unknown as FieldConstructor],\n ['cards', CardsField as unknown as FieldConstructor],\n ['custom', CustomField as unknown as FieldConstructor],\n ['array', ArrayField as unknown as FieldConstructor],\n]);\n","/**\n * Structural equality for form data snapshots.\n *\n * Replaces the `@react-hookz/deep-equal` dependency. Scoped to what form values\n * can actually be: primitives, plain objects, arrays, `Date`, and `File`/`Blob`\n * (compared by identity, since their contents are not cheaply comparable).\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {\n return false;\n }\n\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false;\n\n if (a instanceof Date) return a.getTime() === (b as Date).getTime();\n\n // Identity-compared: two distinct File/Blob handles are never treated as equal.\n if (typeof Blob !== 'undefined' && a instanceof Blob) return false;\n if (typeof FileList !== 'undefined' && a instanceof FileList) return false;\n\n if (Array.isArray(a)) {\n const other = b as unknown[];\n if (a.length !== other.length) return false;\n return a.every((item, i) => deepEqual(item, other[i]));\n }\n\n if (a instanceof Map) {\n const other = b as Map<unknown, unknown>;\n if (a.size !== other.size) return false;\n for (const [key, value] of a) {\n if (!other.has(key) || !deepEqual(value, other.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set) {\n const other = b as Set<unknown>;\n if (a.size !== other.size) return false;\n for (const value of a) {\n if (!other.has(value)) return false;\n }\n return true;\n }\n\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n\n const aKeys = Object.keys(left);\n if (aKeys.length !== Object.keys(right).length) return false;\n\n return aKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n deepEqual(left[key], right[key]),\n );\n}\n","import { deepEqual } from '../util/deepEqual.js';\nimport type { FormValues } from '../types/descriptors.js';\n\nexport type InputSubscriber = (values: FormValues) => void;\n\n/**\n * Change detection and input subscribers for one form.\n *\n * Tracks two baselines — one including the active tab and one excluding it — so\n * that switching tabs can be treated as a change or not depending on the caller.\n */\nexport class FormModel {\n private last: FormValues | undefined;\n private lastWithoutTab: FormValues | undefined;\n private readonly subscribers: InputSubscriber[] = [];\n\n /**\n * Report whether `values` differ from the last seen snapshot, and adopt it as\n * the new baseline.\n *\n * @param includeTab compare `activeTab` as well as the field values\n */\n hasChanged(values: FormValues, includeTab = false): boolean {\n const snapshot = { ...values };\n const withoutTab = { ...values };\n delete withoutTab['activeTab'];\n\n if (this.last === undefined) {\n this.last = snapshot;\n this.lastWithoutTab = withoutTab;\n return true;\n }\n\n const baseline = includeTab ? this.last : this.lastWithoutTab;\n const candidate = includeTab ? snapshot : withoutTab;\n\n if (deepEqual(baseline, candidate)) return false;\n\n this.last = snapshot;\n this.lastWithoutTab = withoutTab;\n return true;\n }\n\n subscribe(subscriber: InputSubscriber): () => void {\n this.subscribers.push(subscriber);\n return () => {\n const index = this.subscribers.indexOf(subscriber);\n if (index >= 0) this.subscribers.splice(index, 1);\n };\n }\n\n notify(values: FormValues): void {\n for (const subscriber of [...this.subscribers]) {\n subscriber(values);\n }\n }\n\n /** Forget the baseline so the next comparison reports a change. */\n reset(): void {\n this.last = undefined;\n this.lastWithoutTab = undefined;\n }\n}\n","let formCounter = 0;\n\n/**\n * Per-form unique DOM ids.\n *\n * v1 gave checkboxes ids like `field-0`, which collided between any two forms on\n * the page — and always collided between a parent form and its array sub-form.\n * Scoping the counter per form makes `label[for]` reliable, which is what the\n * accessibility work builds on.\n */\nexport class IdGenerator {\n private readonly prefix: string;\n private counter = 0;\n\n constructor(prefix?: string) {\n this.prefix = prefix ?? `dlf${++formCounter}`;\n }\n\n /** A unique id, e.g. `dlf3-field-2`. */\n next(kind = 'field'): string {\n return `${this.prefix}-${kind}-${++this.counter}`;\n }\n\n /** A stable id derived from a name, e.g. `dlf3-control-email`. */\n for(kind: string, name: string): string {\n return `${this.prefix}-${kind}-${name}`;\n }\n}\n\n/** Reset the global form counter. Test-only. */\nexport function resetIdCounter(): void {\n formCounter = 0;\n}\n","/**\n * Tracks the form's in-flight async work.\n *\n * v1 pushed every promise onto a `this.allPromises` array that was never\n * cleared, so each `Promise.allSettled(allPromises)` re-awaited the entire\n * history of the form and the array grew without bound. This tracks only what\n * is actually pending, and hands out generation tokens so a slow async result\n * from an earlier keystroke cannot overwrite a newer one.\n */\nexport class UpdateScheduler {\n private pending = new Set<Promise<unknown>>();\n private generations = new Map<string, number>();\n\n /** Register async work and drop it from the set once it settles. */\n track<T>(work: Promise<T>): Promise<T> {\n this.pending.add(work);\n const forget = (): void => {\n this.pending.delete(work);\n };\n work.then(forget, forget);\n return work;\n }\n\n /** Number of currently in-flight operations. Test/diagnostics only. */\n get pendingCount(): number {\n return this.pending.size;\n }\n\n /**\n * Resolve once nothing is in flight.\n *\n * Loops because settling one batch may schedule another (an options load\n * whose completion triggers a dependent field's reload).\n */\n async whenSettled(): Promise<void> {\n let guard = 0;\n while (this.pending.size > 0) {\n if (++guard > 100) {\n throw new Error(\n 'declarative-forms: form updates did not settle after 100 rounds — ' +\n 'a field callback is most likely scheduling work on every update.',\n );\n }\n await Promise.allSettled([...this.pending]);\n }\n }\n\n /**\n * Claim the next generation for `key` and return a predicate that reports\n * whether that claim is still the newest.\n *\n * ```ts\n * const isCurrent = scheduler.claim(`options:${field.name}`);\n * const values = await load();\n * if (!isCurrent()) return; // a newer load superseded this one\n * ```\n */\n claim(key: string): () => boolean {\n const generation = (this.generations.get(key) ?? 0) + 1;\n this.generations.set(key, generation);\n return () => this.generations.get(key) === generation;\n }\n\n /** Invalidate every outstanding claim and forget all pending work. */\n reset(): void {\n this.pending.clear();\n for (const key of this.generations.keys()) {\n this.generations.set(key, (this.generations.get(key) ?? 0) + 1);\n }\n }\n}\n","import { addClasses, createEl } from '../util/dom.js';\nimport type { ButtonContext, ButtonDescriptor, ButtonMap } from '../types/options.js';\n\nexport interface ButtonBarCallbacks {\n /** Resolve once all pending form work has settled. */\n whenSettled(): Promise<void>;\n /** Recompute `computed` fields before an action runs. */\n updateComputedFields(): Promise<void>;\n getValues(): Record<string, unknown>;\n /** Run the action and close the dialog. */\n closeWith(action: ButtonDescriptor['action']): Promise<void>;\n}\n\n/**\n * The dialog's lower bar.\n *\n * Buttons are real `<button type=\"button\">` elements rather than v1's\n * `<div class=\"btn\">`. They keep the `.btn` class, so every existing stylesheet\n * still matches, and the shipped CSS normalises the font so the change is not\n * visible — but they are now focusable and operable from the keyboard.\n */\nexport class ButtonBar {\n readonly element: HTMLElement;\n\n private readonly buttons: { descriptor: ButtonDescriptor; element: HTMLElement }[] = [];\n\n constructor(\n private readonly config: ButtonMap,\n private readonly callbacks: ButtonBarCallbacks,\n ) {\n this.element = createEl('div', { classNames: ['low-bar'] });\n\n for (const [label, descriptor] of Object.entries(config)) {\n const button = this.createButton(label, descriptor);\n this.buttons.push({ descriptor, element: button });\n this.element.appendChild(button);\n }\n }\n\n get count(): number {\n return this.buttons.length;\n }\n\n /** The first button — the one Enter activates. */\n get primary(): HTMLElement | undefined {\n return this.buttons[0]?.element;\n }\n\n /** Whether the primary button is currently disabled. */\n get primaryDisabled(): boolean {\n return this.primary?.classList.contains('disabled') ?? false;\n }\n\n private createButton(label: string, descriptor: ButtonDescriptor): HTMLElement {\n const button = createEl('button', {\n classNames: ['btn'],\n attrs: { type: 'button' },\n content: label,\n });\n\n if (descriptor.id) button.id = descriptor.id;\n addClasses(button, descriptor.class);\n\n button.onclick = () => {\n void this.activate(descriptor, button);\n };\n\n return button;\n }\n\n private async activate(\n descriptor: ButtonDescriptor,\n button: HTMLElement,\n ): Promise<void> {\n const classes = button.classList;\n if (classes.contains('loading-btn') || classes.contains('disabled')) return;\n\n classes.add('loading-btn');\n\n try {\n await this.callbacks.whenSettled();\n // The disabled state can change while pending work settles.\n if (classes.contains('disabled')) return;\n\n await this.callbacks.updateComputedFields();\n\n if (descriptor.doNotCloseModal) {\n await descriptor.action?.(this.callbacks.getValues());\n } else {\n await this.callbacks.closeWith(descriptor.action);\n }\n } finally {\n // v1 wrote `.remove('loading-btn')`, which called Element.remove() and\n // deleted the confirm button outright.\n classes.remove('loading-btn');\n }\n }\n\n /**\n * Re-evaluate every `isActive` / `isVisible` predicate.\n *\n * Buttons without an `id` are skipped, matching v1 — an id is what opts a\n * button into state management.\n */\n async refresh(ctx: ButtonContext): Promise<void> {\n const work: Promise<void>[] = [];\n\n for (const { descriptor, element } of this.buttons) {\n if (!descriptor.id) continue;\n\n if (descriptor.isActive) {\n work.push(\n this.applyPredicate(descriptor.isActive(ctx), (active) => {\n element.classList.toggle('disabled', !active);\n element.toggleAttribute('disabled', !active);\n }),\n );\n }\n\n if (descriptor.isVisible) {\n work.push(\n this.applyPredicate(descriptor.isVisible(ctx), (visible) => {\n element.classList.toggle('invisible', !visible);\n }),\n );\n }\n }\n\n await Promise.allSettled(work);\n }\n\n /**\n * Apply a predicate result.\n *\n * A synchronous predicate is applied immediately. v1 always set the button\n * disabled first and cleared it in a `.then()`, which made every button flash\n * disabled on every keystroke and let a well-timed click be dropped.\n */\n private applyPredicate(\n result: boolean | Promise<boolean>,\n apply: (value: boolean) => void,\n ): Promise<void> {\n if (typeof result === 'boolean') {\n apply(result);\n return Promise.resolve();\n }\n\n return result.then(apply);\n }\n\n /** The configured buttons, for callers that want to invoke an action directly. */\n get descriptors(): ButtonMap {\n return this.config;\n }\n}\n","import { createEl } from '../util/dom.js';\nimport type { ButtonBar } from './ButtonBar.js';\nimport type { TabBar } from './TabBar.js';\n\nexport interface ModalViewOptions {\n tabBar: TabBar;\n buttonBar: ButtonBar;\n /** Render a close button. Omit for a dialog that cannot be dismissed. */\n onCancel?: () => void;\n}\n\n/**\n * The modal chrome.\n *\n * ```html\n * <div class=\"dl-modal\">\n * <div class=\"modal\">\n * <div class=\"up-bar\"><button class=\"cancelBtn secondary\"></button></div>\n * <div class=\"tabWrapper\">…</div>\n * <div class=\"modal-content\">…the form…</div>\n * <div class=\"low-bar\">…buttons…</div>\n * </div>\n * </div>\n * ```\n *\n * Every one of these class names is overridden by at least one consumer, so the\n * structure is fixed. The upper bar is always present but only carries the\n * `up-bar` class when the dialog is dismissable — a v1 quirk that consumer CSS\n * relies on to reserve (or not reserve) the header strip.\n */\nexport class ModalView {\n readonly wrapper: HTMLElement;\n readonly modal: HTMLElement;\n readonly content: HTMLElement;\n readonly upBar: HTMLElement;\n\n constructor(options: ModalViewOptions) {\n this.wrapper = createEl('div', { classNames: ['dl-modal'] });\n this.wrapper.style.display = 'none';\n\n this.modal = createEl('div', { classNames: ['modal'] });\n this.content = createEl('div', { classNames: ['modal-content'] });\n this.upBar = createEl('div');\n\n if (options.onCancel) {\n this.upBar.classList.add('up-bar');\n\n const cancel = createEl('button', {\n classNames: ['cancelBtn', 'secondary'],\n attrs: { type: 'button', 'aria-label': 'Close dialog' },\n });\n cancel.onclick = () => options.onCancel?.();\n\n this.upBar.appendChild(cancel);\n }\n\n this.modal.appendChild(this.upBar);\n this.modal.appendChild(options.tabBar.element);\n this.modal.appendChild(this.content);\n this.modal.appendChild(options.buttonBar.element);\n this.wrapper.appendChild(this.modal);\n }\n\n /** Attach to the document body. Used by `openInModal`. */\n mount(): void {\n document.body.appendChild(this.wrapper);\n }\n\n setVisible(visible: boolean): void {\n this.wrapper.style.display = visible ? 'block' : 'none';\n }\n\n hide(): void {\n this.wrapper.classList.add('dl-modal-hidden');\n }\n\n show(): void {\n this.wrapper.classList.remove('dl-modal-hidden');\n // Re-displaying an element restarts its CSS animations. This dialog was\n // already on screen before it was covered, so replaying its entrance would\n // fade the backdrop back in from nothing — a flash of the page underneath.\n this.wrapper.classList.add('dl-modal-restored');\n }\n\n /**\n * Record how many dialogs this one was opened on top of.\n *\n * A stacked dialog inherits a backdrop that is already on screen: the dialog\n * below is hidden in the same frame this one appears. Fading this backdrop in\n * would leave the page uncovered for the length of the animation, so themes\n * suppress it on the `dl-modal-stacked` class. The depth also goes on the\n * wrapper as `--dl-stack-depth`, so a theme can show how deep the stack is.\n */\n setStackDepth(depth: number): void {\n this.wrapper.classList.toggle('dl-modal-stacked', depth > 0);\n\n if (depth > 0) this.wrapper.style.setProperty('--dl-stack-depth', String(depth));\n else this.wrapper.style.removeProperty('--dl-stack-depth');\n }\n\n /** Mark the dialog as embedded rather than floating. */\n setEmbedded(): void {\n this.wrapper.classList.add('noModalDialog');\n }\n\n addModalClasses(names: readonly string[] | undefined): void {\n for (const name of names ?? []) this.modal.classList.add(name);\n }\n\n addWrapperClasses(names: readonly string[] | undefined): void {\n for (const name of names ?? []) this.wrapper.classList.add(name);\n }\n\n remove(): void {\n this.wrapper.remove();\n }\n}\n","import type { FormValues } from '../types/descriptors.js';\n\n/** What the stack needs from a form on it. */\nexport interface StackableDialog {\n getValues(): FormValues;\n hide(): void;\n show(): void;\n /** Re-apply the active tab after being revealed again. */\n refreshTabs(): void;\n /** Handle Esc. No-op when the dialog is not dismissable. */\n requestCancel(): void;\n /** Handle Enter. Only called when the dialog has exactly one button. */\n requestConfirm(event: KeyboardEvent): void;\n /** Number of buttons in the lower bar. */\n readonly buttonCount: number;\n}\n\n/**\n * The stack of open modal dialogs.\n *\n * v1 kept this in a module-level `var` and registered its `keydown` handler as\n * an import side effect, which ran even in Node and could not be torn down.\n * Here the listener is attached when the first dialog opens and removed when\n * the last one closes, so importing the library does nothing observable.\n */\nexport class ModalStack {\n private readonly dialogs: StackableDialog[] = [];\n private listening = false;\n\n get size(): number {\n return this.dialogs.length;\n }\n\n /** Values of every dialog on the stack, outermost first. */\n values(): FormValues[] {\n return this.dialogs.map((dialog) => dialog.getValues());\n }\n\n /** The dialog currently on top, if any. */\n get top(): StackableDialog | undefined {\n return this.dialogs[this.dialogs.length - 1];\n }\n\n push(dialog: StackableDialog): void {\n this.dialogs.push(dialog);\n this.startListening();\n\n // Only the topmost dialog stays visible.\n if (this.dialogs.length >= 2) {\n this.dialogs[this.dialogs.length - 2]?.hide();\n }\n }\n\n /** Remove a dialog and reveal whatever it was covering. */\n remove(dialog: StackableDialog): void {\n const index = this.dialogs.indexOf(dialog);\n if (index < 0) return;\n\n this.dialogs.splice(index, 1);\n\n const top = this.top;\n if (top) {\n top.show();\n top.refreshTabs();\n } else {\n this.stopListening();\n }\n }\n\n contains(dialog: StackableDialog): boolean {\n return this.dialogs.includes(dialog);\n }\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n const top = this.top;\n if (!top) return;\n\n if (event.key === 'Escape') {\n top.requestCancel();\n } else if (event.key === 'Enter' && top.buttonCount === 1) {\n top.requestConfirm(event);\n }\n };\n\n private startListening(): void {\n if (this.listening || typeof document === 'undefined') return;\n document.addEventListener('keydown', this.onKeyDown);\n this.listening = true;\n }\n\n private stopListening(): void {\n if (!this.listening) return;\n document.removeEventListener('keydown', this.onKeyDown);\n this.listening = false;\n }\n}\n\n/** The stack shared by all forms that do not opt into their own. */\nexport const globalModalStack = new ModalStack();\n","import { createEl, tabClassName } from '../util/dom.js';\n\n/**\n * The dialog's tab strip.\n *\n * v1 resolved tabs with `document.querySelector('.dl-tab-btn.active')`, so two\n * open forms fought over each other's active tab. This owns its buttons and\n * never queries the document.\n *\n * The rendered shape is part of the frozen contract: `.dl-tab-btn` elements are\n * direct, clickable siblings inside `.tabWrapper`, each carrying the tab label\n * with whitespace stripped as a class (`'Find Citation'` → `.FindCitation`), and\n * a `seen` class once visited.\n */\nexport class TabBar {\n readonly element: HTMLElement;\n\n private buttons = new Map<string, HTMLElement>();\n private seen = new Set<string>();\n private active: string | undefined;\n\n constructor(private readonly onSelect: (tab: string) => void) {\n this.element = createEl('div', { classNames: ['tabWrapper'] });\n }\n\n get activeTab(): string | undefined {\n return this.active;\n }\n\n /** Rebuild the strip from the tabs that currently have at least one visible field. */\n render(tabs: readonly string[]): void {\n this.element.replaceChildren();\n this.buttons = new Map();\n\n for (const tab of tabs) {\n const button = createEl('div', {\n classNames: ['dl-tab-btn', tabClassName(tab), this.seen.has(tab) && 'seen'],\n content: tab,\n });\n\n button.onclick = () => this.onSelect(tab);\n\n this.buttons.set(tab, button);\n this.element.appendChild(button);\n }\n\n // Keep the current tab if it survived the rebuild, otherwise fall back.\n const next = this.active && this.buttons.has(this.active) ? this.active : tabs[0];\n if (next) this.select(next);\n else this.active = undefined;\n }\n\n /**\n * Mark a tab active.\n *\n * Selecting a tab that is not currently rendered is a no-op rather than an\n * error — a tab can disappear when the fields in it all become inactive.\n */\n select(tab: string): boolean {\n const button = this.buttons.get(tab);\n if (!button) return false;\n\n for (const other of this.buttons.values()) other.classList.remove('active');\n\n button.classList.add('active');\n button.classList.add('seen');\n this.seen.add(tab);\n this.active = tab;\n\n return true;\n }\n\n get tabs(): string[] {\n return [...this.buttons.keys()];\n }\n\n get isEmpty(): boolean {\n return this.buttons.size === 0;\n }\n}\n","import { createEl } from '../../util/dom.js';\nimport type { TooltipProvider } from './TooltipProvider.js';\n\nconst BUBBLE_CLASS = 'dl-tooltip-bubble';\n\ninterface Attachment {\n content: string;\n bubble: HTMLElement | undefined;\n listeners: (() => void)[];\n}\n\n/**\n * Zero-dependency tooltip.\n *\n * Renders a positioned bubble on hover and on focus, placed to the right of the\n * trigger and flipped to the left when it would overflow the viewport. Content\n * is an HTML string because tooltip text has always supported markup; callers\n * mark it with `html()` at the descriptor level.\n */\nexport class NativeTooltipProvider implements TooltipProvider {\n private readonly attachments = new WeakMap<HTMLElement, Attachment>();\n\n attach(element: HTMLElement, content: string): void {\n const existing = this.attachments.get(element);\n if (existing) {\n existing.content = content;\n if (existing.bubble) existing.bubble.innerHTML = content;\n return;\n }\n\n const attachment: Attachment = { content, bubble: undefined, listeners: [] };\n this.attachments.set(element, attachment);\n\n const show = (): void => this.show(element);\n const hide = (): void => this.hide(element);\n\n const bind = (type: string, handler: EventListener): void => {\n element.addEventListener(type, handler);\n attachment.listeners.push(() => element.removeEventListener(type, handler));\n };\n\n bind('mouseenter', show);\n bind('mouseleave', hide);\n bind('focus', show);\n bind('blur', hide);\n }\n\n detach(element: HTMLElement): void {\n const attachment = this.attachments.get(element);\n if (!attachment) return;\n\n for (const remove of attachment.listeners) remove();\n attachment.bubble?.remove();\n this.attachments.delete(element);\n }\n\n private show(element: HTMLElement): void {\n const attachment = this.attachments.get(element);\n if (!attachment || attachment.bubble) return;\n\n const bubble = createEl('div', { classNames: [BUBBLE_CLASS] });\n bubble.innerHTML = attachment.content;\n bubble.setAttribute('role', 'tooltip');\n document.body.appendChild(bubble);\n attachment.bubble = bubble;\n\n this.position(element, bubble);\n }\n\n private hide(element: HTMLElement): void {\n const attachment = this.attachments.get(element);\n if (!attachment?.bubble) return;\n attachment.bubble.remove();\n attachment.bubble = undefined;\n }\n\n private position(element: HTMLElement, bubble: HTMLElement): void {\n const anchor = element.getBoundingClientRect();\n const box = bubble.getBoundingClientRect();\n const gap = 8;\n\n let left = anchor.right + gap;\n if (left + box.width > window.innerWidth) {\n left = Math.max(gap, anchor.left - box.width - gap);\n }\n\n const top = anchor.top + anchor.height / 2 - box.height / 2;\n\n bubble.style.left = `${left + window.scrollX}px`;\n bubble.style.top = `${Math.max(gap, top) + window.scrollY}px`;\n }\n}\n","import { contentToString, createEl } from '../../util/dom.js';\nimport { NativeTooltipProvider } from './NativeTooltipProvider.js';\nimport type { TooltipProvider } from './TooltipProvider.js';\nimport type { TextOrHtml } from '../../util/html.js';\n\n/** Class applied for each message level, matching the shipped stylesheet. */\nconst LEVEL_CLASS = {\n info: 'tooltip-warning',\n warning: 'tooltip-warning',\n error: 'tooltip-error',\n success: 'tooltip-success',\n loading: 'tooltip-loading',\n} as const;\n\nexport type TooltipLevel = keyof typeof LEVEL_CLASS;\n\n/**\n * Owns the tooltip markers of one form.\n *\n * v1 looked markers up with `document.querySelector('#dl-form-field-wrapper-for-…')`,\n * so two forms with a same-named field fought over each other's tooltips. This\n * keeps its own registry, keyed by field name.\n */\nexport class TooltipController {\n private readonly markers = new Map<string, HTMLElement>();\n private readonly provider: TooltipProvider;\n\n constructor(provider: TooltipProvider = new NativeTooltipProvider()) {\n this.provider = provider;\n }\n\n /**\n * Create the `<span class=\"dl-tooltip\">?</span>` marker for a field.\n *\n * Registered by field name so `setTooltip(name, …)` can find it later. The\n * `data-tippy-content` attribute is retained from v1 as the content store.\n */\n createMarker(content: TextOrHtml): HTMLElement {\n const text = contentToString(content);\n const marker = createEl('span', {\n classNames: ['dl-tooltip'],\n attrs: {\n 'data-tippy-content': text,\n 'data-initial-tippy-content': text,\n },\n content: '?',\n });\n\n this.provider.attach(marker, text);\n return marker;\n }\n\n /** Associate a marker with a field name. Called by the form after mounting. */\n register(fieldName: string, marker: HTMLElement | undefined): void {\n if (marker) this.markers.set(fieldName, marker);\n }\n\n /**\n * Replace a field's tooltip text, icon and state class.\n *\n * A field without a tooltip is a silent no-op, matching v1.\n */\n set(fieldName: string, text: string, icon = '?', className = ''): void {\n const marker = this.markers.get(fieldName);\n if (!marker) return;\n\n const base = marker.classList.contains('dl-tooltip-in-input')\n ? 'dl-tooltip dl-tooltip-in-input'\n : 'dl-tooltip';\n marker.className = className ? `${base} ${className}` : base;\n\n marker.setAttribute('data-tippy-content', text);\n marker.innerHTML = icon;\n\n this.provider.attach(marker, text);\n }\n\n setSuccess(fieldName: string, text: string): void {\n this.set(fieldName, text, '&#10003;', LEVEL_CLASS.success);\n }\n\n setWarning(fieldName: string, text: string): void {\n this.set(fieldName, text, '!', LEVEL_CLASS.warning);\n }\n\n setError(fieldName: string, text: string): void {\n this.set(fieldName, text, '!', LEVEL_CLASS.error);\n }\n\n setLoading(fieldName: string, text: string): void {\n this.set(fieldName, text, '', LEVEL_CLASS.loading);\n }\n\n /** Apply a `{ level, text }` message from an options loader. */\n setMessage(fieldName: string, level: 'info' | 'warning' | 'error', text: string): void {\n if (level === 'error') this.setError(fieldName, text);\n else this.setWarning(fieldName, text);\n }\n\n /** Restore a field's original tooltip text and `?` icon. */\n reset(fieldName: string): void {\n const marker = this.markers.get(fieldName);\n if (!marker) return;\n this.set(fieldName, marker.getAttribute('data-initial-tippy-content') ?? '', '?', '');\n }\n\n resetAll(fieldNames: Iterable<string>): void {\n for (const name of fieldNames) this.reset(name);\n }\n\n destroy(): void {\n for (const marker of this.markers.values()) this.provider.detach(marker);\n this.markers.clear();\n }\n}\n","import { ComputedField } from '../fields/ComputedField.js';\nimport { TextAreaField } from '../fields/TextAreaField.js';\nimport { defaultFieldRegistry } from './FieldRegistry.js';\nimport type { FieldRegistry } from './FieldRegistry.js';\nimport { FormModel, type InputSubscriber } from './FormModel.js';\nimport { IdGenerator } from './IdGenerator.js';\nimport { UpdateScheduler } from './UpdateScheduler.js';\nimport { ButtonBar } from '../ui/ButtonBar.js';\nimport { ModalView } from '../ui/ModalView.js';\nimport { globalModalStack } from '../ui/ModalStack.js';\nimport type { ModalStack, StackableDialog } from '../ui/ModalStack.js';\nimport { TabBar } from '../ui/TabBar.js';\nimport { TooltipController } from '../ui/tooltip/TooltipController.js';\nimport { createEl } from '../util/dom.js';\nimport type { Field, FieldHandle } from '../fields/Field.js';\nimport type { FormContext, SubForm, SubFormOptions } from './FormContext.js';\nimport type {\n FieldContext,\n FieldDescriptor,\n FormChangeContext,\n FormValues,\n} from '../types/descriptors.js';\nimport type {\n ButtonContext,\n ButtonDescriptor,\n ButtonMap,\n DeclarativeFormOptions,\n OpenInModalOptions,\n} from '../types/options.js';\n\n/** Options only used when a form is created as a child of another. */\ninterface InternalOptions {\n parent?: DeclarativeForm;\n stack?: ModalStack;\n registry?: FieldRegistry;\n isEditingArrayEntry?: boolean;\n}\n\n/** Persisted file URLs, so re-picking the same file does not re-upload it. */\nconst filePersistenceCache = new WeakMap<File, Promise<string>>();\n\n/**\n * A declarative form dialog.\n *\n * ```ts\n * const form = new DeclarativeForm({\n * fields: [\n * { name: 'title', displayName: 'Title' },\n * { name: 'lang', kind: 'select', displayName: 'Language',\n * options: [{ value: 'en', label: 'English' }] },\n * ],\n * onConfirm: (values) => console.log(values),\n * onCancel: () => {},\n * });\n *\n * form.openInModal();\n * ```\n */\nexport class DeclarativeForm implements SubForm, StackableDialog {\n /** The `.dl-form` wrapper containing the `<form>`. */\n readonly dom: HTMLElement;\n /** The `<form>` element the fields are rendered into. */\n readonly formElement: HTMLFormElement;\n\n private readonly options: DeclarativeFormOptions;\n private readonly registry: FieldRegistry;\n private readonly stack: ModalStack;\n private readonly parent: DeclarativeForm | undefined;\n\n private readonly fieldList: Field[] = [];\n private readonly fieldsByName = new Map<string, Field>();\n\n private readonly model = new FormModel();\n private readonly scheduler = new UpdateScheduler();\n private readonly ids = new IdGenerator();\n private readonly tooltips: TooltipController;\n\n private readonly tabBar: TabBar;\n private readonly buttonBar: ButtonBar;\n private view: ModalView | undefined;\n\n private readonly editingArrayEntry: boolean;\n private embedded = false;\n private ready: Promise<void>;\n\n constructor(options: DeclarativeFormOptions, internal: InternalOptions = {}) {\n this.options = options;\n this.registry = internal.registry ?? defaultFieldRegistry;\n this.stack = internal.stack ?? globalModalStack;\n this.parent = internal.parent;\n this.editingArrayEntry = internal.isEditingArrayEntry ?? false;\n\n this.tooltips = new TooltipController(options.tooltipProvider);\n\n this.dom = createEl('div', { classNames: ['dl-form'] });\n this.formElement = createEl('form', { attrs: { autocomplete: 'off' } });\n for (const name of options.classNames ?? []) this.formElement.classList.add(name);\n this.formElement.onsubmit = (event) => {\n event.preventDefault();\n return false;\n };\n this.dom.appendChild(this.formElement);\n\n this.tabBar = new TabBar((tab) => this.setActiveTab(tab));\n this.buttonBar = new ButtonBar(this.resolveButtons(), {\n whenSettled: () => this.scheduler.whenSettled(),\n updateComputedFields: () => this.updateComputedFields(),\n getValues: () => this.getValues(),\n closeWith: (action) => this.close(action),\n });\n\n this.buildFields();\n this.ready = this.initialize();\n }\n\n // ------------------------------------------------------------------ setup\n\n private resolveButtons(): ButtonMap {\n if (this.options.buttons) return this.options.buttons;\n\n return {\n [this.options.confirmLabel ?? 'OK']: {\n id: this.ids.for('confirm', 'default'),\n action: this.options.onConfirm,\n },\n };\n }\n\n private buildFields(): void {\n const context = this.createFieldContext();\n\n for (const descriptor of this.options.fields) {\n if (this.fieldsByName.has(descriptor.name)) {\n throw new Error(\n `declarative-forms: duplicate field name \"${descriptor.name}\". ` +\n 'Field names must be unique within a form.',\n );\n }\n\n const field = this.registry.create(descriptor, context);\n this.fieldList.push(field);\n this.fieldsByName.set(descriptor.name, field);\n this.tooltips.register(descriptor.name, field.tooltipMarker);\n this.formElement.appendChild(field.wrapper);\n }\n }\n\n private async initialize(): Promise<void> {\n await Promise.allSettled(\n this.fieldList.map((field) =>\n this.scheduler.track(Promise.resolve(field.initialize())),\n ),\n );\n await Promise.allSettled(\n this.fieldList.map((field) => this.scheduler.track(field.applyDefaultValue())),\n );\n await this.update();\n }\n\n /** Resolves once initial options and default values have been applied. */\n whenReady(): Promise<void> {\n return this.ready.then(() => this.scheduler.whenSettled());\n }\n\n private createFieldContext(): FormContext {\n return {\n ids: this.ids,\n tooltips: this.tooltips,\n scheduler: this.scheduler,\n get parentData() {\n return undefined;\n },\n stackData: [],\n isEditingArrayEntry: this.editingArrayEntry,\n contextFor: (descriptor) => this.contextFor(descriptor),\n requestUpdate: (source, force) => {\n void this.update(source, force);\n },\n persistFile: (file) => this.persistFile(file),\n createSubForm: (options) => this.createSubForm(options),\n };\n }\n\n private contextFor(descriptor: FieldDescriptor): FieldContext {\n return {\n data: this.getValues(),\n form: this,\n field: descriptor,\n parentData: this.parent?.getValues(),\n stackData: this.stack.values(),\n isEditingArrayEntry: this.editingArrayEntry,\n };\n }\n\n private createSubForm(options: SubFormOptions): SubForm {\n return new DeclarativeForm(\n {\n fields: options.fields,\n classNames: options.classNames,\n buttons: options.buttons,\n onCancel: () => {},\n persistFile: this.options.persistFile,\n tooltipProvider: this.options.tooltipProvider,\n },\n {\n parent: this,\n stack: this.stack,\n registry: this.registry,\n isEditingArrayEntry: options.isEditingArrayEntry,\n },\n );\n }\n\n private async persistFile(file: File): Promise<string> {\n const persist = this.options.persistFile;\n if (!persist) {\n throw new Error(\n 'declarative-forms: a file field needs a `persistFile` handler on the form ' +\n 'to turn the picked File into a storable URL.',\n );\n }\n\n const cached = filePersistenceCache.get(file);\n if (cached) return cached;\n\n const pending = Promise.resolve(persist(file)).then(String);\n filePersistenceCache.set(file, pending);\n\n try {\n return await pending;\n } catch (error) {\n filePersistenceCache.delete(file);\n throw error;\n }\n }\n\n // ------------------------------------------------------------------ values\n\n /**\n * Current values, keyed by field name.\n *\n * Inactive fields (`isActive` returned false) are omitted. The active tab is\n * always included under `activeTab`.\n */\n getValues(): FormValues {\n const values: FormValues = {};\n\n for (const field of this.fieldList) {\n if (!field.contributesValue || !field.isActive()) continue;\n values[field.name] = field.getValue();\n }\n\n values['activeTab'] = this.tabBar.activeTab;\n return values;\n }\n\n /** Imperative handle for a field, or `undefined` if there is no such field. */\n field(name: string): FieldHandle | undefined {\n return this.fieldsByName.get(name);\n }\n\n /** Every field handle, in declaration order. */\n get fields(): readonly FieldHandle[] {\n return this.fieldList;\n }\n\n /** Notified whenever the form's values change. Returns an unsubscribe function. */\n subscribeOnInput(subscriber: InputSubscriber): () => void {\n return this.model.subscribe(subscriber);\n }\n\n // ------------------------------------------------------------------ update\n\n /**\n * Recompute derived state: field visibility, tabs, reactive content and\n * button predicates.\n *\n * @param source the field whose input triggered this update\n * @param force run even when nothing changed\n * @param includeTab treat a tab switch as a change\n */\n async update(source?: FieldHandle, force = false, includeTab = false): Promise<void> {\n const values = this.getValues();\n const changed = this.model.hasChanged(values, includeTab);\n if (!changed && !force) return;\n\n const triggerName = source?.name;\n const activeTabs = new Set<string>();\n\n for (const field of this.fieldList) {\n const ctx: FormChangeContext = {\n ...this.contextFor(field.descriptor),\n data: values,\n trigger: source,\n };\n\n if (field.descriptor.isActive) {\n const active = field.descriptor.isActive(ctx);\n field.setActive(active);\n if (active) for (const tab of field.tabs()) activeTabs.add(tab);\n } else {\n field.setActive(true);\n for (const tab of field.tabs()) activeTabs.add(tab);\n }\n\n field.descriptor.onFormChange?.(ctx);\n field.onFormUpdate(ctx, triggerName);\n }\n\n this.renderTabs(activeTabs);\n\n await this.scheduler.whenSettled();\n\n if (changed) this.model.notify(this.getValues());\n\n await this.buttonBar.refresh(this.buttonContext());\n }\n\n private buttonContext(): ButtonContext {\n return {\n data: this.getValues(),\n parentData: this.parent?.getValues(),\n stackData: this.stack.values(),\n };\n }\n\n /** Recompute every `computed` field. Runs before a button action fires. */\n async updateComputedFields(): Promise<void> {\n const computed = this.fieldList.filter(\n (field): field is ComputedField => field instanceof ComputedField,\n );\n\n await Promise.allSettled(\n computed.map((field) => this.scheduler.track(field.recompute())),\n );\n }\n\n // -------------------------------------------------------------------- tabs\n\n /** Tabs in declaration order, keeping only those with at least one active field. */\n private renderTabs(activeTabs: Set<string>): void {\n const ordered: string[] = [];\n for (const field of this.fieldList) {\n for (const tab of field.tabs()) {\n if (activeTabs.has(tab) && !ordered.includes(tab)) ordered.push(tab);\n }\n }\n\n this.tabBar.render(ordered);\n this.applyActiveTab();\n }\n\n /**\n * Switch tabs.\n *\n * Called with no argument, it re-applies the current tab — useful after a\n * nested dialog closes and the fields underneath need re-syncing.\n */\n setActiveTab(tab?: string): void {\n if (tab && !this.tabBar.select(tab)) return;\n this.applyActiveTab();\n void this.update(undefined, true, true);\n }\n\n private applyActiveTab(): void {\n const active = this.tabBar.activeTab;\n if (!active) return;\n\n for (const field of this.fieldList) {\n const tabs = field.tabs();\n field.setInTab(tabs.length === 0 || tabs.includes(active));\n }\n }\n\n /** Re-apply the active tab. Called by the stack when this dialog is revealed. */\n refreshTabs(): void {\n this.applyActiveTab();\n }\n\n // ----------------------------------------------------------------- display\n\n /**\n * Open the form as a modal dialog.\n *\n * Returns the outer `.dl-modal` element.\n */\n openInModal(options?: OpenInModalOptions): HTMLElement {\n this.embedded = false;\n\n const view = this.ensureView();\n view.mount();\n view.content.appendChild(this.dom);\n view.setStackDepth(this.stack.size);\n view.setVisible(true);\n view.addModalClasses(options?.classNames);\n view.addWrapperClasses(options?.wrapperClassNames);\n\n this.stack.push(this);\n this.applyActiveTab();\n\n return view.wrapper;\n }\n\n /** Render the form inline, inside `host`, instead of as a floating dialog. */\n appendInElement(host: HTMLElement, options?: OpenInModalOptions): HTMLElement {\n this.embedded = true;\n\n const view = this.ensureView();\n view.setEmbedded();\n view.setVisible(true);\n view.addWrapperClasses(options?.classNames);\n view.content.appendChild(this.dom);\n host.appendChild(view.wrapper);\n\n void this.whenReady().then(() => this.applyActiveTab());\n\n return view.wrapper;\n }\n\n private ensureView(): ModalView {\n if (this.view) return this.view;\n\n this.view = new ModalView({\n tabBar: this.tabBar,\n buttonBar: this.buttonBar,\n onCancel: this.options.onCancel ? () => this.cancel() : undefined,\n });\n\n return this.view;\n }\n\n /** The outer `.dl-modal` element, once the form has been displayed. */\n get modalElement(): HTMLElement | undefined {\n return this.view?.wrapper;\n }\n\n hide(): void {\n this.view?.hide();\n }\n\n show(): void {\n this.view?.show();\n }\n\n /** The form's HTML, for tests and snapshots. */\n getHTML(): string {\n return this.dom.outerHTML;\n }\n\n // ---------------------------------------------------------------- lifecycle\n\n get buttonCount(): number {\n return this.buttonBar.count;\n }\n\n /**\n * Run the confirm action and close.\n *\n * @param action defaults to the form's `onConfirm`\n */\n async close(action?: ButtonDescriptor['action']): Promise<void> {\n const callback = action ?? this.options.onConfirm;\n if (callback) await callback(this.getValues());\n\n if (!this.embedded) this.teardownView();\n this.stack.remove(this);\n }\n\n /** Dismiss the dialog. A no-op when the form has no `onCancel`. */\n cancel(): void {\n if (!this.options.onCancel) return;\n\n this.teardownView();\n this.options.onCancel();\n this.stack.remove(this);\n }\n\n /** Close without running any callback. */\n remove(): void {\n this.teardownView();\n this.stack.remove(this);\n }\n\n /** Release tooltips and listeners. Call when discarding an embedded form. */\n destroy(): void {\n this.remove();\n this.tooltips.destroy();\n this.scheduler.reset();\n for (const field of this.fieldList) field.destroy();\n }\n\n private teardownView(): void {\n this.view?.remove();\n this.view = undefined;\n }\n\n // -------------------------------------------------------- keyboard (stack)\n\n requestCancel(): void {\n this.cancel();\n }\n\n /**\n * Enter pressed while this dialog is on top.\n *\n * Inside a textarea that allows newlines, Enter inserts one. Otherwise it\n * confirms — unless the confirm button is disabled.\n */\n requestConfirm(event: KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n const field = target?.getAttribute?.('name')\n ? this.fieldsByName.get(target.getAttribute('name') as string)\n : undefined;\n\n if (field instanceof TextAreaField) {\n // Suppress the newline, but do not confirm either.\n if (!field.allowsNewlines) {\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (this.buttonBar.primaryDisabled) return;\n this.buttonBar.primary?.click();\n }\n\n // ---------------------------------------------------------------- tooltips\n\n setTooltip(fieldName: string, text: string, icon?: string, className?: string): void {\n this.tooltips.set(fieldName, text, icon, className);\n }\n\n setTooltipSuccess(fieldName: string, text: string): void {\n this.tooltips.setSuccess(fieldName, text);\n }\n\n setTooltipWarning(fieldName: string, text: string): void {\n this.tooltips.setWarning(fieldName, text);\n }\n\n setTooltipError(fieldName: string, text: string): void {\n this.tooltips.setError(fieldName, text);\n }\n\n setTooltipLoading(fieldName: string, text: string): void {\n this.tooltips.setLoading(fieldName, text);\n }\n\n resetTooltip(fieldName: string): void {\n this.tooltips.reset(fieldName);\n }\n\n resetTooltips(fieldNames: Iterable<string>): void {\n this.tooltips.resetAll(fieldNames);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/util/html.ts","../src/util/dom.ts","../src/fields/Field.ts","../src/fields/ComputedField.ts","../src/util/value.ts","../src/fields/TextAreaField.ts","../src/fields/ArrayField.ts","../src/fields/CardsField.ts","../src/fields/CheckboxField.ts","../src/fields/CustomField.ts","../src/fields/FileField.ts","../src/fields/MessageField.ts","../src/components/styles.ts","../src/components/DlSelect.ts","../src/fields/SelectField.ts","../src/fields/TextField.ts","../src/core/FieldRegistry.ts","../src/util/deepEqual.ts","../src/core/FormModel.ts","../src/core/IdGenerator.ts","../src/core/UpdateScheduler.ts","../src/ui/ButtonBar.ts","../src/ui/ModalView.ts","../src/ui/ModalStack.ts","../src/ui/TabBar.ts","../src/ui/tooltip/NativeTooltipProvider.ts","../src/ui/tooltip/TooltipController.ts","../src/core/DeclarativeForm.ts","../src/core/ask.ts"],"names":["option"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Opt-in HTML for label/message/option content.\n *\n * Everything the library renders is treated as plain text by default. When you\n * genuinely need markup — a link inside a checkbox caption, a tag badge inside a\n * select option — wrap it in {@link html} to say so explicitly.\n */\n\nconst SAFE_HTML = Symbol.for('declarative-forms.SafeHtml');\n\n/** A string the caller has explicitly marked as trusted HTML. */\nexport class SafeHtml {\n /** Brand used by {@link isSafeHtml} so instances survive duplicated module copies. */\n readonly [SAFE_HTML] = true;\n\n constructor(readonly value: string) {}\n\n toString(): string {\n return this.value;\n }\n}\n\nexport function isSafeHtml(value: unknown): value is SafeHtml {\n return typeof value === 'object' && value !== null && SAFE_HTML in value;\n}\n\nconst ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\n/** Escape a string for interpolation into an HTML context. */\nexport function escapeHtml(value: unknown): string {\n return String(value).replace(/[&<>\"']/g, (char) => ESCAPES[char] as string);\n}\n\n/**\n * Mark content as trusted HTML.\n *\n * As a tagged template, interpolated values are escaped and only the literal\n * parts are trusted — this is the form you want for anything data-driven:\n *\n * ```ts\n * html`<b>${userSuppliedName}</b>`\n * ```\n *\n * Called with a plain string, the whole string is trusted. Use it only for\n * markup you control:\n *\n * ```ts\n * html('<span class=\"dl-option-tag\">Offline</span>')\n * ```\n */\nexport function html(raw: string): SafeHtml;\nexport function html(strings: TemplateStringsArray, ...values: unknown[]): SafeHtml;\nexport function html(\n stringsOrRaw: string | TemplateStringsArray,\n ...values: unknown[]\n): SafeHtml {\n if (typeof stringsOrRaw === 'string') {\n return new SafeHtml(stringsOrRaw);\n }\n\n let out = stringsOrRaw[0] ?? '';\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n out += isSafeHtml(value) ? value.value : escapeHtml(value);\n out += stringsOrRaw[i + 1] ?? '';\n }\n\n return new SafeHtml(out);\n}\n\n/** Content that is rendered as text unless explicitly wrapped in {@link html}. */\nexport type TextOrHtml = string | SafeHtml;\n","import { isSafeHtml, type TextOrHtml } from './html.js';\n\n/**\n * Set an element's content from a {@link TextOrHtml}.\n *\n * Plain strings go through `textContent`; only values explicitly wrapped in\n * `html()` reach `innerHTML`.\n */\nexport function setContent(el: Element, content: TextOrHtml | null | undefined): void {\n if (content == null) {\n el.textContent = '';\n } else if (isSafeHtml(content)) {\n el.innerHTML = content.value;\n } else {\n el.textContent = content;\n }\n}\n\n/** Render a {@link TextOrHtml} to a string, for attributes such as tooltip content. */\nexport function contentToString(content: TextOrHtml | null | undefined): string {\n if (content == null) return '';\n return isSafeHtml(content) ? content.value : content;\n}\n\nexport interface CreateElOptions {\n classNames?: readonly (string | undefined | false)[];\n attrs?: Record<string, string | undefined>;\n content?: TextOrHtml;\n}\n\n/** Create an element with classes, attributes and content in one call. */\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n options: CreateElOptions = {},\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n\n for (const name of options.classNames ?? []) {\n if (name) el.classList.add(name);\n }\n\n for (const [key, value] of Object.entries(options.attrs ?? {})) {\n if (value !== undefined) el.setAttribute(key, value);\n }\n\n if (options.content !== undefined) setContent(el, options.content);\n\n return el;\n}\n\n/** Add each space-separated name in `classNames` to `el`. */\nexport function addClasses(el: Element, classNames: string | undefined): void {\n if (!classNames) return;\n for (const name of classNames.split(/\\s+/)) {\n if (name) el.classList.add(name);\n }\n}\n\n/**\n * Find the descendants of `root` whose `attribute` equals `value`.\n *\n * v1 built an attribute selector by string concatenation\n * (`dl-option[value=\"' + val + '\"]`), which threw a `DOMException` on any value\n * containing a quote or a backslash. Comparing in JS sidesteps selector\n * escaping altogether — option lists are small enough that the scan is free.\n */\nexport function findByAttribute<T extends Element>(\n root: ParentNode,\n selector: string,\n attribute: string,\n value: string,\n): T[] {\n return [...root.querySelectorAll(selector)].filter(\n (el) => el.getAttribute(attribute) === value,\n ) as T[];\n}\n\n/**\n * Strip whitespace from a tab label to form its class name.\n *\n * Part of the frozen DOM contract: `'Find Citation'` → `.dl-tab-btn.FindCitation`.\n */\nexport function tabClassName(tab: string): string {\n return tab.replace(/\\s/g, '');\n}\n","import { addClasses, createEl, setContent, tabClassName } from '../util/dom.js';\nimport type {\n BaseFieldDescriptor,\n FieldContext,\n FieldDescriptor,\n FormChangeContext,\n Reactive,\n TabSpec,\n} from '../types/descriptors.js';\nimport type { FormContext } from '../core/FormContext.js';\n\n/**\n * The imperative handle consumers get from `form.field(name)`.\n *\n * Replaces v1's `descriptor.domElement`, which the library wrote back onto the\n * caller's own object.\n */\nexport interface FieldHandle {\n readonly name: string;\n /** The control element — an `<input>`, `<textarea>`, `<dl-select>`, … */\n readonly element: HTMLElement;\n /** The `.dl-form-field-wrapper` containing label, tooltip and control. */\n readonly wrapper: HTMLElement;\n getValue(): unknown;\n setValue(value: unknown): void;\n focus(): void;\n /** Show a loading state, where the field kind supports one. */\n setLoading(loading: boolean): void;\n}\n\n/**\n * Base class for every field kind.\n *\n * Subclasses implement {@link createControl} plus the value accessors; the base\n * class owns the wrapper, label, tooltip marker and active state — i.e. all the\n * parts of the frozen DOM contract that are the same for every kind.\n */\nexport abstract class Field<\n D extends BaseFieldDescriptor = FieldDescriptor,\n> implements FieldHandle {\n readonly wrapper: HTMLElement;\n\n protected label: HTMLLabelElement | undefined;\n\n /** The `.dl-tooltip` marker, when this field declares a tooltip. */\n tooltipMarker: HTMLElement | undefined;\n\n private control: HTMLElement | undefined;\n private active = true;\n\n constructor(\n readonly descriptor: D,\n protected readonly context: FormContext,\n ) {\n this.wrapper = createEl('div', {\n attrs: { id: `dl-form-field-wrapper-for-${descriptor.name}` },\n classNames: ['dl-form-field-wrapper'],\n });\n\n this.applyTabClasses();\n }\n\n /**\n * Build the control and the surrounding label/tooltip.\n *\n * Deliberately separate from the constructor: subclass field initializers run\n * *after* `super()` under ES2022 class-field semantics, so anything\n * `createControl` assigned would be reset to `undefined` if it ran from the\n * base constructor. {@link FieldRegistry} calls this immediately after\n * construction.\n */\n build(): this {\n if (this.control) return this;\n\n const element = this.createControl();\n this.control = element;\n\n // v1 set both the property and the attribute; consumer selectors such as\n // `dl-select[name=…]` depend on the attribute being present.\n (element as HTMLInputElement).name = this.descriptor.name;\n element.setAttribute('name', this.descriptor.name);\n\n if (this.wrapperExtraClass) this.wrapper.classList.add(this.wrapperExtraClass);\n addClasses(this.wrapper, this.descriptor.className);\n\n this.label = this.createLabel();\n this.createTooltipMarker();\n\n if ((element as HTMLInputElement).type === 'hidden') {\n this.wrapper.classList.add('dl-form-hidden-field');\n }\n\n this.wrapper.appendChild(element);\n return this;\n }\n\n /** The control element — an `<input>`, `<textarea>`, `<dl-select>`, … */\n get element(): HTMLElement {\n if (!this.control) {\n throw new Error('declarative-forms: field.build() must run before use.');\n }\n return this.control;\n }\n\n get name(): string {\n return this.descriptor.name;\n }\n\n /** Extra class the kind contributes to its wrapper, e.g. `dl-select-wrapper`. */\n protected get wrapperExtraClass(): string | undefined {\n return undefined;\n }\n\n /**\n * Whether this kind holds a value at all.\n *\n * `message` fields are presentational and stay out of `getValues()`.\n */\n get contributesValue(): boolean {\n return true;\n }\n\n /** Build the control element. Called once, from {@link build}. */\n protected abstract createControl(): HTMLElement;\n\n abstract getValue(): unknown;\n abstract setValue(value: unknown): void;\n\n focus(): void {\n (this.element as HTMLElement & { focus?: () => void }).focus?.();\n }\n\n setLoading(_loading: boolean): void {\n // Only kinds with an async surface (select, file) implement this.\n }\n\n /** Ask the owning form to recompute values and re-run the update cycle. */\n protected requestUpdate(force = false): void {\n this.context.requestUpdate(this, force);\n }\n\n /** Resolve a value that may have been given as a function of the form context. */\n protected resolve<T>(value: Reactive<T> | undefined): T | undefined {\n if (typeof value === 'function') {\n return (value as (ctx: FieldContext) => T)(\n this.context.contextFor(this.descriptor),\n );\n }\n return value;\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n setActive(active: boolean): void {\n this.active = active;\n this.wrapper.classList.toggle('inactive', !active);\n }\n\n /** Show or hide the field because of the currently selected tab. */\n setInTab(inTab: boolean): void {\n this.wrapper.classList.toggle('notInTab', !inTab);\n }\n\n /** Tabs this field currently belongs to. */\n tabs(): string[] {\n const spec = this.resolve<TabSpec | undefined>(this.descriptor.tab);\n if (!spec) return [];\n return (Array.isArray(spec) ? spec : [spec]).filter(\n (tab): tab is string => typeof tab === 'string' && tab.length > 0,\n );\n }\n\n /**\n * Apply the default value. Awaited during form initialisation.\n *\n * A `defaultValue` function may return a promise, so the result is always\n * resolved before being applied.\n */\n async applyDefaultValue(): Promise<void> {\n if (this.descriptor.defaultValue === undefined) return;\n const value: unknown = await Promise.resolve(\n this.resolve(this.descriptor.defaultValue),\n );\n if (value !== undefined) this.setValue(value);\n }\n\n /**\n * Apply a plainly declared default value straight away.\n *\n * {@link applyDefaultValue} is awaited during initialisation, so a value it\n * applies cannot be seen by the first layout pass. A default that is neither a\n * function nor a promise needs no awaiting, so it is applied at build time and\n * `isActive` predicates reading it are right from the first paint. The async\n * pass runs afterwards regardless and simply sets the same value again.\n */\n applyStaticDefaultValue(): void {\n const value = this.descriptor.defaultValue;\n if (value === undefined || typeof value === 'function') return;\n if (value instanceof Promise) return;\n this.setValue(value);\n }\n\n /**\n * Hook for setup that cannot happen in {@link build} — loading select\n * options, or a first render that needs the form context. May be synchronous.\n */\n initialize(): void | Promise<void> {\n // Overridden where needed.\n }\n\n /**\n * Called on every form update, after values have settled.\n *\n * @param triggerName name of the field whose input started this update\n */\n onFormUpdate(_ctx: FormChangeContext, _triggerName: string | undefined): void {\n // Overridden where needed.\n }\n\n destroy(): void {\n this.wrapper.remove();\n }\n\n private applyTabClasses(): void {\n for (const tab of this.tabsFromStaticDescriptor()) {\n this.wrapper.classList.add(tabClassName(tab));\n }\n }\n\n /**\n * Tab classes are stamped on at construction time, before the form has any\n * values, so only a statically declared `tab` can contribute one.\n */\n private tabsFromStaticDescriptor(): string[] {\n const spec = this.descriptor.tab;\n if (!spec || typeof spec === 'function') return [];\n return (Array.isArray(spec) ? spec : [spec]).filter(\n (tab): tab is string => typeof tab === 'string' && tab.length > 0,\n );\n }\n\n private createLabel(): HTMLLabelElement | undefined {\n if (this.descriptor.displayName === undefined) {\n this.wrapper.classList.add('withoutLabel');\n return undefined;\n }\n\n // v1 pointed `for` at the field name while the control only ever had a\n // `name`, so no label was ever actually associated. Give the control a real\n // id and point at that.\n const controlId = this.controlIdForLabel();\n const label = createEl('label', {\n attrs: { for: controlId },\n content: this.descriptor.displayName,\n });\n\n this.wrapper.appendChild(label);\n return label;\n }\n\n /**\n * The id `label[for]` should target.\n *\n * Defaults to giving the control element an id; kinds whose control is a\n * wrapper (checkbox, cards, file) override this to point at the real input.\n */\n protected controlIdForLabel(): string {\n const id = this.context.ids.for('control', this.descriptor.name);\n if (!this.element.id) this.element.id = id;\n return this.element.id;\n }\n\n private createTooltipMarker(): void {\n const tooltip = this.descriptor.tooltip;\n if (tooltip === undefined) return;\n\n const descriptor =\n typeof tooltip === 'object' && tooltip !== null && 'text' in tooltip\n ? tooltip\n : { text: tooltip, inInput: false };\n\n const marker = this.context.tooltips.createMarker(descriptor.text);\n this.tooltipMarker = marker;\n\n if (this.label && !descriptor.inInput) {\n this.label.appendChild(marker);\n } else {\n marker.classList.add('dl-tooltip-in-input');\n this.element.classList.add('dl-tooltip-inside');\n this.wrapper.appendChild(marker);\n }\n }\n\n /** Convenience for subclasses that render simple text content. */\n protected setContent = setContent;\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport type { ComputedFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A value derived from the rest of the form.\n *\n * Rendered as a hidden input (which adds `.dl-form-hidden-field` to the wrapper)\n * and recomputed before the dialog is confirmed. The computed value lives on the\n * field rather than in the DOM, so it is not limited to strings.\n */\nexport class ComputedField extends Field<ComputedFieldDescriptor> {\n private value: unknown = '';\n\n protected createControl(): HTMLElement {\n const input = createEl('input');\n input.type = 'hidden';\n return input;\n }\n\n getValue(): unknown {\n return this.value;\n }\n\n setValue(value: unknown): void {\n this.value = value;\n }\n\n /** Recompute. Awaited by `updateComputedFields()` before a button action runs. */\n async recompute(): Promise<void> {\n const ctx = this.context.contextFor(this.descriptor);\n this.value = await this.descriptor.compute(ctx);\n }\n}\n","/**\n * Coerce a field value to the string an `<input>` or attribute can hold.\n *\n * Field values are `unknown` because `computed` and `custom` fields may hold\n * anything. The DOM-backed kinds still need a string, and this is the single\n * place that conversion happens — including the deliberate choice to render\n * `null`/`undefined` as `''` rather than `\"null\"`.\n *\n * Objects are JSON-encoded rather than becoming `[object Object]`, which is\n * what a bare `String()` would produce.\n */\nexport function asText(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { FormChangeContext, TextAreaFieldDescriptor } from '../types/descriptors.js';\n\n/** A multi-line `<textarea>`. */\nexport class TextAreaField extends Field<TextAreaFieldDescriptor> {\n private textarea!: HTMLTextAreaElement;\n\n protected createControl(): HTMLElement {\n const textarea = createEl('textarea');\n this.textarea = textarea;\n\n const placeholder = this.descriptor.placeholder;\n if (typeof placeholder === 'string') textarea.placeholder = placeholder;\n\n textarea.oninput = () => this.requestUpdate();\n textarea.onchange = textarea.oninput;\n\n return textarea;\n }\n\n /** Whether Enter inserts a newline rather than confirming the dialog. */\n get allowsNewlines(): boolean {\n return this.descriptor.allowNewlines === true;\n }\n\n getValue(): string {\n return this.textarea.value;\n }\n\n setValue(value: unknown): void {\n this.textarea.value = asText(value);\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n if (typeof this.descriptor.placeholder === 'function') {\n this.textarea.placeholder = this.resolve(this.descriptor.placeholder) ?? '';\n }\n }\n}\n","import { Field } from './Field.js';\nimport { createEl, setContent } from '../util/dom.js';\nimport type {\n ArrayFieldDescriptor,\n FieldDescriptor,\n FormChangeContext,\n FormValues,\n} from '../types/descriptors.js';\nimport type { TextOrHtml } from '../util/html.js';\n\n/**\n * A repeating list of sub-records, each edited in its own nested dialog.\n *\n * v1 implemented this by overwriting the caller's `field.render` with a closure\n * that also owned the suggestion checkboxes and the add/edit/delete buttons.\n * Here the entries, the accepted suggestions and the DOM are all state on the\n * field, and the entry dialogs are built through `context.createSubForm`.\n */\nexport class ArrayField extends Field<ArrayFieldDescriptor> {\n private entries: FormValues[] = [];\n /** Suggestions the user ticked, kept with their index so they can be un-ticked. */\n private acceptedSuggestions: { entry: FormValues; index: number }[] = [];\n\n protected createControl(): HTMLElement {\n return createEl('div', { classNames: ['array-of'] });\n }\n\n override initialize(): void {\n this.render();\n }\n\n getValue(): FormValues[] {\n const result = [...this.entries];\n\n // Accepted suggestions are merged in, skipping any already added by hand.\n for (const { entry } of this.acceptedSuggestions) {\n const encoded = JSON.stringify(entry);\n if (!result.some((existing) => JSON.stringify(existing) === encoded)) {\n result.push(entry);\n }\n }\n\n return result;\n }\n\n setValue(value: unknown): void {\n this.entries = Array.isArray(value) ? [...(value as FormValues[])] : [];\n this.render();\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n this.render();\n }\n\n // ------------------------------------------------------------------ render\n\n private render(): void {\n this.element.replaceChildren();\n\n const suggestions = this.resolve(this.descriptor.suggested);\n if (suggestions && suggestions.length > 0) {\n this.element.appendChild(this.renderSuggestions(suggestions));\n }\n\n this.entries.forEach((entry, index) => {\n this.element.appendChild(this.renderEntry(entry, index));\n });\n\n this.element.appendChild(this.renderAddButton());\n }\n\n private renderSuggestions(suggestions: readonly FormValues[]): HTMLElement {\n const container = createEl('div', {\n classNames: ['dl-form-array-suggested-container'],\n });\n\n suggestions.forEach((suggestion, index) => {\n const id = this.context.ids.for(\n 'suggestion',\n `${this.descriptor.name}-${String(index)}`,\n );\n\n const wrapper = createEl('span', {\n classNames: ['check', 'dl-form-array-of-suggestion'],\n attrs: { value: 'false' },\n });\n\n const checkbox = createEl('input', { attrs: { type: 'checkbox', id } });\n checkbox.checked = this.acceptedSuggestions.some((item) => item.index === index);\n\n checkbox.oninput = checkbox.onchange = () => {\n wrapper.setAttribute('value', String(checkbox.checked));\n\n if (checkbox.checked) {\n this.acceptedSuggestions.push({ entry: suggestion, index });\n } else {\n this.acceptedSuggestions = this.acceptedSuggestions.filter(\n (item) => item.index !== index,\n );\n }\n\n this.requestUpdate();\n };\n\n const label = createEl('label', { attrs: { for: id } });\n setContent(label, this.entrySummary(suggestion));\n\n wrapper.appendChild(checkbox);\n wrapper.appendChild(label);\n container.appendChild(wrapper);\n });\n\n return container;\n }\n\n private renderEntry(entry: FormValues, index: number): HTMLElement {\n const row = createEl('div', {\n classNames: ['dl-form-array-of-entry'],\n attrs: { 'data-el-index': String(index) },\n });\n\n const summary = createEl('span');\n setContent(summary, this.entrySummary(entry));\n row.appendChild(summary);\n\n const edit = createEl('button', {\n classNames: ['edit-array-of-btn'],\n attrs: { type: 'button', 'data-el-index': String(index) },\n content: 'Edit',\n });\n edit.onclick = (event) => {\n event.preventDefault();\n this.openEntryDialog(index);\n };\n\n const remove = createEl('button', {\n classNames: ['delete-array-of-btn'],\n attrs: { type: 'button', 'data-el-index': String(index) },\n content: 'Remove',\n });\n remove.onclick = (event) => {\n event.preventDefault();\n this.entries.splice(index, 1);\n this.render();\n this.notifyChange();\n this.requestUpdate(true);\n };\n\n row.appendChild(edit);\n row.appendChild(remove);\n return row;\n }\n\n private renderAddButton(): HTMLElement {\n const button = createEl('button', {\n classNames: ['dl-form-array-of-add-entry'],\n attrs: { type: 'button' },\n content: this.descriptor.newButtonLabel ?? 'Add',\n });\n\n button.onclick = (event) => {\n event.preventDefault();\n this.openEntryDialog();\n };\n\n return button;\n }\n\n /** Default summary: every non-empty string value, comma separated. */\n private entrySummary(entry: FormValues): TextOrHtml {\n if (this.descriptor.renderEntry) return this.descriptor.renderEntry(entry);\n\n return Object.values(entry)\n .filter(\n (value): value is string => typeof value === 'string' && value.trim() !== '',\n )\n .join(', ');\n }\n\n // ------------------------------------------------------------ entry dialog\n\n /** Open the add dialog, or the edit dialog when `index` is given. */\n private openEntryDialog(index?: number): void {\n const editing = index !== undefined;\n const existing = editing ? this.entries[index] : undefined;\n\n const fields = editing ? this.editFields(existing ?? {}) : this.descriptor.of;\n\n const confirmId = this.context.ids.for('array-confirm', this.descriptor.name);\n\n const form = this.context.createSubForm({\n classNames: [`form-for-array-of-${this.descriptor.name}`],\n fields,\n isEditingArrayEntry: editing,\n buttons: {\n OK: {\n id: confirmId,\n isActive: ({ data }) => this.validateEntry(data),\n action: (values) => {\n if (editing && index !== undefined) this.entries[index] = values;\n else this.entries.push(values);\n\n this.render();\n this.notifyChange();\n this.requestUpdate(true);\n },\n },\n },\n });\n\n form.openInModal();\n }\n\n /** Seed each field with the entry's current value, then apply `mapFieldsOnEdit`. */\n private editFields(entry: FormValues): readonly FieldDescriptor[] {\n const seeded = this.descriptor.of.map((field) => ({\n ...field,\n defaultValue: entry[field.name] ?? field.defaultValue ?? '',\n })) as FieldDescriptor[];\n\n return this.descriptor.mapFieldsOnEdit?.(seeded, entry) ?? seeded;\n }\n\n private validateEntry(entry: FormValues): boolean | Promise<boolean> {\n if (!this.descriptor.isValidRecord) return true;\n return this.descriptor.isValidRecord(entry, this.context.contextFor(this.descriptor));\n }\n\n private notifyChange(): void {\n const onChange = this.descriptor.onChange;\n if (!onChange) return;\n\n void this.context.scheduler\n .whenSettled()\n .then(() => onChange(this.context.contextFor(this.descriptor).data));\n }\n}\n","import { Field } from './Field.js';\nimport { createEl, findByAttribute } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { CardsFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A row of clickable option cards — a richer alternative to a select when there\n * are few options and each needs a description or an icon.\n *\n * v1 called this `detailedOptions`.\n */\nexport class CardsField extends Field<CardsFieldDescriptor> {\n private value: string | undefined;\n\n protected createControl(): HTMLElement {\n const container = createEl('div', { classNames: ['detailed-options'] });\n\n for (const card of this.descriptor.cards) {\n const cardEl = createEl('div', {\n classNames: ['detailed-option'],\n attrs: { 'data-value': card.value },\n content: card.content,\n });\n\n cardEl.addEventListener('click', () => {\n this.select(card.value);\n this.requestUpdate();\n });\n\n container.appendChild(cardEl);\n }\n\n return container;\n }\n\n getValue(): string {\n return this.value ?? '';\n }\n\n setValue(value: unknown): void {\n if (value == null) return;\n this.select(asText(value));\n }\n\n private select(value: string): void {\n const target = findByAttribute(\n this.element,\n '.detailed-option',\n 'data-value',\n value,\n )[0];\n if (!target) return;\n\n this.value = value;\n this.element.setAttribute('value', value);\n\n for (const card of this.element.querySelectorAll('.detailed-option')) {\n card.classList.remove('active');\n }\n target.classList.add('active');\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport type { CheckboxFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A checkbox with a caption.\n *\n * The control is a `<span class=\"check\">` wrapping the input and its caption —\n * part of the frozen DOM contract, since `.dl-form form .check input` and\n * `.check label` are styled by the default stylesheet and by consumers.\n */\nexport class CheckboxField extends Field<CheckboxFieldDescriptor> {\n private input!: HTMLInputElement;\n\n protected createControl(): HTMLElement {\n const wrapper = createEl('span', { classNames: ['check'] });\n\n // v1 used `field-<index>`, which collided across forms. The generator is\n // scoped per form, so a parent form and its array sub-form never clash.\n const inputId = this.context.ids.for('check', this.descriptor.name);\n\n const input = createEl('input', { attrs: { type: 'checkbox', id: inputId } });\n this.input = input;\n\n input.oninput = input.onchange = () => {\n wrapper.setAttribute('value', String(input.checked));\n this.requestUpdate();\n };\n\n const caption = createEl('label', {\n attrs: { for: inputId },\n content: this.descriptor.label,\n });\n\n wrapper.appendChild(input);\n wrapper.appendChild(caption);\n wrapper.setAttribute('value', 'false');\n\n return wrapper;\n }\n\n /** The outer `displayName` label points at the real input, not the wrapper. */\n protected override controlIdForLabel(): string {\n return this.input.id;\n }\n\n getValue(): boolean {\n return this.input.checked;\n }\n\n setValue(value: unknown): void {\n const checked = value === 'false' ? false : Boolean(value);\n this.input.checked = checked;\n this.element.setAttribute('value', String(checked));\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport type {\n CustomFieldDescriptor,\n FormChangeContext,\n RenderContext,\n} from '../types/descriptors.js';\n\n/**\n * An escape hatch: you render the content, the form manages the value.\n *\n * `render` is called on mount and again on every form update. v1 injected\n * `setValue` and `onChange` onto the DOM element; both now arrive on the render\n * context instead, so the element stays a plain `HTMLElement`.\n */\nexport class CustomField extends Field<CustomFieldDescriptor> {\n private value: unknown = '';\n\n protected createControl(): HTMLElement {\n return createEl('p', { classNames: ['render'] });\n }\n\n getValue(): unknown {\n return this.value;\n }\n\n setValue(value: unknown): void {\n this.value = value;\n }\n\n override initialize(): void {\n this.render();\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n this.render();\n }\n\n private render(): void {\n this.descriptor.render(this.renderContext());\n }\n\n private renderContext(): RenderContext {\n const base = this.context.contextFor(this.descriptor);\n return {\n ...base,\n element: this.element,\n requestUpdate: (force = false) => this.requestUpdate(force),\n setValue: (value: unknown) => {\n this.value = value;\n this.requestUpdate();\n },\n };\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { FileFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A file picker with an image preview.\n *\n * The field's value is the URL returned by the form's `persistFile` hook, not\n * the `File` itself — the dialog stores a reference, the app decides where the\n * bytes go.\n */\nexport class FileField extends Field<FileFieldDescriptor> {\n private input!: HTMLInputElement;\n private preview!: HTMLElement;\n private url: string | undefined;\n\n protected createControl(): HTMLElement {\n const container = createEl('div', { classNames: ['file-field'] });\n const preview = createEl('div', { classNames: ['file-preview', 'empty'] });\n const input = createEl('input', { attrs: { type: 'file' } });\n\n this.preview = preview;\n this.input = input;\n\n if (this.descriptor.accept) input.setAttribute('accept', this.descriptor.accept);\n input.id = this.context.ids.for('file', this.descriptor.name);\n\n input.oninput = () => {\n void this.handlePick();\n };\n\n container.appendChild(preview);\n container.appendChild(input);\n return container;\n }\n\n protected override controlIdForLabel(): string {\n return this.input.id;\n }\n\n getValue(): string {\n return this.url ?? '';\n }\n\n setValue(value: unknown): void {\n const url = value == null || value === '' ? undefined : asText(value);\n this.url = url;\n\n if (url) {\n this.element.setAttribute('data-value', url);\n this.renderPreview(url);\n } else {\n this.element.removeAttribute('data-value');\n this.clearPreview();\n this.input.value = '';\n }\n }\n\n override setLoading(loading: boolean): void {\n this.preview.classList.toggle('loading', loading);\n }\n\n private async handlePick(): Promise<void> {\n const file = this.input.files?.[0];\n\n if (!file) {\n this.setValue(undefined);\n this.requestUpdate();\n return;\n }\n\n this.clearPreview();\n this.preview.classList.remove('empty');\n this.setLoading(true);\n\n try {\n const url = await this.context.persistFile(file);\n this.setValue(url);\n } catch (error) {\n this.setValue(undefined);\n this.reportError(error);\n } finally {\n this.setLoading(false);\n this.requestUpdate();\n }\n }\n\n /**\n * Surface an upload failure.\n *\n * Dispatches a cancelable `dl-error` event on the field so the app can show\n * its own message; if nothing calls `preventDefault()`, the error is logged\n * rather than vanishing. Throwing here would only produce an unhandled\n * rejection, since this runs from an event handler.\n */\n private reportError(error: unknown): void {\n const event = new CustomEvent('dl-error', {\n bubbles: true,\n cancelable: true,\n detail: { field: this.descriptor.name, error },\n });\n\n if (this.element.dispatchEvent(event)) {\n console.error(\n `declarative-forms: persistFile failed for field \"${this.descriptor.name}\".`,\n error,\n );\n }\n }\n\n private clearPreview(): void {\n this.preview.replaceChildren();\n this.preview.classList.add('empty');\n }\n\n private renderPreview(url: string): void {\n this.preview.replaceChildren();\n this.preview.classList.remove('empty');\n\n const container = createEl('div', { classNames: ['file-selection-container'] });\n const image = createEl('img', { classNames: ['file-preview'] });\n image.src = url;\n image.alt = '';\n\n const deleteButton = createEl('button', {\n classNames: ['file-selection-delete-btn'],\n attrs: { type: 'button', 'aria-label': 'Remove file' },\n });\n deleteButton.appendChild(\n createEl('div', { classNames: ['file-selection-delete-btn-icon'] }),\n );\n deleteButton.onclick = () => {\n this.setValue(undefined);\n this.requestUpdate();\n };\n\n container.appendChild(image);\n container.appendChild(deleteButton);\n this.preview.appendChild(container);\n }\n}\n","import { Field } from './Field.js';\nimport { createEl, setContent } from '../util/dom.js';\nimport type { FormChangeContext, MessageFieldDescriptor } from '../types/descriptors.js';\n\n/**\n * A presentational paragraph. Holds no value and never appears in `getValues()`.\n */\nexport class MessageField extends Field<MessageFieldDescriptor> {\n protected createControl(): HTMLElement {\n const el = createEl('p', { classNames: ['message'] });\n setContent(el, this.resolve(this.descriptor.message) ?? '');\n return el;\n }\n\n override get contributesValue(): boolean {\n return false;\n }\n\n getValue(): undefined {\n return undefined;\n }\n\n setValue(): void {\n // Messages are not settable.\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n if (typeof this.descriptor.message === 'function') {\n setContent(this.element, this.resolve(this.descriptor.message) ?? '');\n }\n }\n}\n","/**\n * Structural styles for `<dl-select>`.\n *\n * These live in JS rather than in the shipped stylesheet because the component\n * does not work without them — the options popup is absolutely positioned and\n * toggled through these rules. Everything here is themable through the `--dl-*`\n * custom properties, and the form/modal chrome ships separately as\n * `declarative-forms/styles.css`.\n *\n * v1 appended this on `window.load` as an import side effect, which broke SSR\n * and leaked between tests. It is now injected lazily, the first time a\n * `<dl-select>` is actually connected to a document.\n */\nexport const DL_SELECT_STYLES = `\n@keyframes dl-placeholder-shimmer {\n 0% { background-position: -468px 0 }\n 100% { background-position: 468px 0 }\n}\n\ndl-select {\n display: block;\n position: relative;\n font-weight: 300;\n font-family: var(--dl-font-family, 'Rubik');\n --dl-select-input-width: 370px;\n}\n\ndl-select .input-wrapper {\n display: inline-block;\n border-width: 2px;\n border-style: solid;\n border-color: var(--dl-line-color, #ddd);\n background-color: var(--dl-options-background, #fff);\n color: var(--dl-options-text-color, #545454);\n border-radius: 4px;\n}\n\ndl-select.dl-focused .input-wrapper {\n border-color: var(--dl-focused-line-color, #bbb);\n}\n\ndl-select.dl-focused .input-wrapper svg {\n border-left: 1px solid var(--dl-focused-line-color, #bbb);\n fill: var(--dl-focused-line-color, #bbb);\n}\n\ndl-select .input-wrapper input {\n width: var(--dl-select-input-width);\n color: var(--dl-options-text-color, #545454);\n outline-width: 0;\n margin-top: 2px;\n padding: 6px;\n font-size: var(--dl-font-size, 0.9em);\n font-family: var(--dl-font-family, 'Rubik');\n font-weight: 300;\n border: 0;\n border-radius: 4px;\n float: left;\n cursor: pointer;\n box-sizing: content-box;\n background: transparent;\n}\n\ndl-select .input-wrapper input::placeholder {\n color: var(--dl-options-inactive-text-color, #545454);\n}\n\ndl-select .input-wrapper svg {\n width: 20px;\n height: 20px;\n margin-top: var(--dl-drop-down-icon-margin-top, 5px);\n margin-right: 4px;\n padding-left: 4px;\n fill: var(--dl-line-color, #ddd);\n float: right;\n border-left: 1px solid var(--dl-line-color, #ddd);\n cursor: pointer;\n}\n\n.options-wrapper {\n position: absolute;\n left: 0;\n top: 20px;\n font-size: var(--dl-font-size, 0.9em);\n width: 100%;\n max-height: 230px;\n overflow-y: auto;\n overflow-x: hidden;\n box-shadow: 0 0 10px -2px rgba(0, 0, 0, 0.4);\n z-index: 100;\n background-color: var(--dl-options-background, #fff);\n font-family: var(--dl-font-family, 'Rubik');\n border-top: 1px solid var(--dl-focused-line-color, #bbb);\n border-bottom: 1px solid var(--dl-focused-line-color, #bbb);\n border-radius: 4px;\n}\n\n.options-wrapper dl-option {\n display: block;\n border-left: 1px solid var(--dl-focused-line-color, #bbb);\n border-right: 1px solid var(--dl-focused-line-color, #bbb);\n cursor: pointer;\n padding-top: var(--dl-options-padding-top, 5px);\n padding-right: var(--dl-options-padding-right, 5px);\n padding-bottom: var(--dl-options-padding-bottom, 5px);\n padding-left: var(--dl-options-padding-left, 5px);\n color: var(--dl-options-text-color, #545454);\n background-color: var(--dl-options-background, #fff);\n}\n\n.options-wrapper dl-option[selected=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.options-wrapper dl-option:hover,\n.options-wrapper dl-option.dl-focused {\n background-color: var(--dl-options-option-hover-color, rgba(224, 240, 227, 0.4));\n}\n\n.options-wrapper .noMatchesHint {\n border-left: 1px solid var(--dl-focused-line-color, #bbb);\n border-right: 1px solid var(--dl-focused-line-color, #bbb);\n padding: 5px;\n font-style: italic;\n color: var(--dl-options-text-color, #545454);\n}\n\ndl-select .dl-option-tag {\n float: right;\n border: 1px solid #888;\n font-size: 0.8em;\n padding: 2px;\n font-family: 'Source Code Pro', monospace;\n border-radius: 2px;\n margin-top: -1px;\n}\n\ndl-select .dl-option-tag:last-child {\n margin-right: 10px;\n}\n\n.dl-select-no-options-available svg path { display: none; }\n.dl-select-no-options-available svg { border-left: none !important; }\n\n.dl-select-loading svg,\n.dl-select-no-options-available svg,\n.dl-select-loading input,\n.dl-select-no-options-available input {\n pointer-events: none;\n}\n\n.dl-select-loading .input-wrapper {\n animation: dl-placeholder-shimmer 1.25s linear infinite forwards;\n background: linear-gradient(\n to right,\n var(--dl-select-loading-col1, #eee) 10%,\n var(--dl-select-loading-col2, #ddd) 18%,\n var(--dl-select-loading-col1, #eee) 33%\n );\n background-size: 800px 104px;\n position: relative;\n width: 412px;\n}\n\n.dl-select-loading input { opacity: 0; }\n\n.dl-field-one-third input,\n.dl-field-two-third input {\n --dl-select-input-width: 127px;\n}\n\nbody.dark-theme dl-select {\n --dl-select-loading-col1: #282727;\n --dl-select-loading-col2: #505656;\n}\n`;\n\nlet injected = false;\n\n/**\n * Inject the `<dl-select>` styles once per document.\n *\n * Safe to call repeatedly and safe to call before `document.body` exists.\n */\nexport function injectStyles(): void {\n if (injected || typeof document === 'undefined') return;\n injected = true;\n\n const style = document.createElement('style');\n style.setAttribute('data-declarative-forms', 'dl-select');\n style.textContent = DL_SELECT_STYLES;\n (document.head ?? document.documentElement).appendChild(style);\n}\n\n/** Allow re-injection. Test-only. */\nexport function resetStyleInjection(): void {\n injected = false;\n}\n","import { findByAttribute } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport { injectStyles } from './styles.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst ARROW_PATH =\n 'M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 ' +\n '1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 ' +\n '4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-' +\n '4.695-4.502s-0.436-1.17 0-1.615z';\n\n/** Minimum time the loading skeleton stays up, so it does not flash. */\nconst MIN_LOADING_MS = 1500;\n/** Delay before the skeleton appears, so fast loads never show it at all. */\nconst LOADING_DELAY_MS = 100;\n\n/**\n * Base class for the custom elements.\n *\n * `class X extends HTMLElement` is evaluated as soon as the module loads, which\n * throws outright in Node — breaking any server-rendered or prerendered app\n * that so much as imports the package. Falling back to an empty class keeps the\n * module importable; the stand-in is never instantiated, because custom\n * elements are only registered when `customElements` exists.\n */\nconst CustomElementBase: typeof HTMLElement =\n typeof HTMLElement === 'undefined'\n ? (class {} as unknown as typeof HTMLElement)\n : HTMLElement;\n\n/**\n * An option inside a {@link DlSelect}.\n *\n * v1 never registered this element, leaving it an `HTMLUnknownElement`.\n * Registering it gives it a stable prototype and somewhere to hang the option\n * semantics the accessibility work needs.\n */\nexport class DlOption extends CustomElementBase {\n /** The value this option contributes, falling back to its text. */\n get optionValue(): string {\n return this.getAttribute('value') ?? this.innerText;\n }\n\n /** Text shown once selected, which may differ from the option's own label. */\n get displayText(): string {\n return this.getAttribute('displayWhenSelected') ?? this.innerText;\n }\n}\n\n/**\n * A filterable combobox that supports async options and multi-select.\n *\n * Deliberately light-DOM: consumers style its internals (`.input-wrapper`,\n * `.options-wrapper`, `dl-option`) and the options popup is reparented to\n * `document.body` while open so it can escape a scrolling container.\n */\nexport class DlSelect extends CustomElementBase {\n readonly optionsWrapper: HTMLDivElement;\n readonly inputWrapper: HTMLSpanElement;\n readonly noMatchesHint: HTMLSpanElement;\n readonly selectedContainer: HTMLSpanElement;\n readonly inputField: HTMLInputElement;\n readonly arrow: SVGSVGElement;\n\n multiple = false;\n isLoading = false;\n\n private initialized = false;\n private loadingTimeouts: ReturnType<typeof setTimeout>[] = [];\n private loadingStartedAt: number | undefined;\n private pendingValue: unknown;\n private selectedOption: DlOption | undefined;\n private focusedOption: DlOption | undefined;\n private repositionListener: (() => void) | undefined;\n private scrollTargets: EventTarget[] = [];\n\n constructor() {\n super();\n this.optionsWrapper = document.createElement('div');\n this.inputWrapper = document.createElement('span');\n this.noMatchesHint = document.createElement('span');\n this.selectedContainer = document.createElement('span');\n this.inputField = document.createElement('input');\n this.arrow = document.createElementNS(SVG_NS, 'svg');\n }\n\n connectedCallback(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n injectStyles();\n\n this.inputWrapper.classList.add('input-wrapper');\n this.optionsWrapper.classList.add('options-wrapper');\n this.optionsWrapper.setAttribute(\n 'data-for-dl-select',\n this.getAttribute('name') ?? '',\n );\n this.selectedContainer.classList.add('selected-container');\n this.optionsWrapper.style.display = 'none';\n\n this.noMatchesHint.classList.add('noMatchesHint');\n this.noMatchesHint.textContent = 'No Matches';\n this.noMatchesHint.style.display = 'none';\n this.optionsWrapper.appendChild(this.noMatchesHint);\n\n this.multiple = this.getAttribute('multiple') !== null;\n this.inputField.placeholder = this.getAttribute('placeholder') ?? 'Select ...';\n this.inputField.onfocus = () => this.open();\n this.inputField.onblur = () => this.close();\n this.inputField.oninput = () => this.filterOptions(this.inputField.value);\n\n const path = document.createElementNS(SVG_NS, 'path');\n path.setAttribute('d', ARROW_PATH);\n this.arrow.appendChild(path);\n this.arrow.onclick = () => this.inputField.focus();\n\n this.classList.add('dl-select-no-options-available');\n this.addEventListener('keydown', this.onKeyDown);\n\n this.mount();\n }\n\n disconnectedCallback(): void {\n this.detachRepositionListeners();\n for (const timeout of this.loadingTimeouts) clearTimeout(timeout);\n this.loadingTimeouts = [];\n }\n\n /** Move any author-provided `<dl-option>` children into the popup. */\n private mount(): void {\n while (this.firstElementChild) {\n this.adoptOption(this.firstElementChild as DlOption);\n }\n\n this.inputWrapper.appendChild(this.selectedContainer);\n this.inputWrapper.appendChild(this.inputField);\n this.inputWrapper.appendChild(this.arrow);\n this.appendChild(this.inputWrapper);\n this.appendChild(this.optionsWrapper);\n\n this.setValue(this.getValue());\n this.updatePlaceholder();\n }\n\n private adoptOption(option: DlOption): void {\n option.onmousedown = () => this.selectOption(option);\n option.onmouseover = () => this.clearFocusedOption();\n this.optionsWrapper.appendChild(option);\n }\n\n addOption(option: DlOption | HTMLElement): void {\n this.adoptOption(option as DlOption);\n this.classList.remove('dl-select-no-options-available');\n this.updatePlaceholder();\n }\n\n removeAllOptions(): void {\n this.classList.add('dl-select-no-options-available');\n for (const option of this.optionsWrapper.querySelectorAll('dl-option')) {\n option.remove();\n }\n this.selectedOption = undefined;\n this.updatePlaceholder();\n }\n\n /** All options currently in the popup. */\n get options(): DlOption[] {\n return [...this.optionsWrapper.querySelectorAll('dl-option')] as DlOption[];\n }\n\n // ---------------------------------------------------------------- loading\n\n /**\n * Enter the loading state.\n *\n * The skeleton only appears after a short delay, so options that resolve\n * quickly never flash one. Repeated calls are safe.\n */\n setLoadingStatus(): void {\n this.isLoading = true;\n this.loadingTimeouts.push(\n setTimeout(() => {\n this.classList.add('dl-select-loading');\n this.optionsWrapper.remove();\n this.loadingStartedAt = Date.now();\n }, LOADING_DELAY_MS),\n );\n }\n\n unsetLoadingStatus(): void {\n for (const timeout of this.loadingTimeouts) clearTimeout(timeout);\n this.loadingTimeouts = [];\n\n const elapsed = this.loadingStartedAt ? Date.now() - this.loadingStartedAt : 0;\n const delay = this.loadingStartedAt ? Math.max(0, MIN_LOADING_MS - elapsed) : 0;\n\n const finish = (): void => {\n this.appendChild(this.optionsWrapper);\n this.classList.remove('dl-select-loading');\n this.isLoading = false;\n this.loadingStartedAt = undefined;\n\n if (this.pendingValue !== undefined) {\n const value = this.pendingValue;\n this.pendingValue = undefined;\n this.setValue(value);\n }\n };\n\n if (delay === 0) finish();\n else this.loadingTimeouts.push(setTimeout(finish, delay));\n }\n\n // ------------------------------------------------------------ value access\n\n getValue(): string | string[] | undefined {\n const raw = this.getAttribute('value');\n\n if (raw) {\n if (!this.multiple) return raw;\n try {\n return JSON.parse(raw) as string[];\n } catch {\n return undefined;\n }\n }\n\n // Fall back to a value set before the matching option existed.\n const pending = this.getAttribute('tmp-value');\n if (!pending) return undefined;\n\n if (this.multiple) {\n try {\n return (JSON.parse(pending) as string[]).filter((v) => this.findOption(v));\n } catch {\n return undefined;\n }\n }\n\n return this.findOption(pending) ? pending : undefined;\n }\n\n setValue(value: unknown): void {\n if (value === undefined || value === null || value === '') return;\n\n // Options are not in the DOM while loading; replay once they arrive.\n if (this.isLoading) {\n this.pendingValue = value;\n return;\n }\n\n if (this.multiple) {\n const next = (Array.isArray(value) ? value : [value]).map(asText);\n for (const current of (this.getValue() as string[] | undefined) ?? []) {\n const option = this.findOption(current);\n if (option) this.deselectOption(option);\n }\n for (const entry of next) {\n const option = this.findOption(entry);\n if (option) this.selectOption(option);\n }\n return;\n }\n\n const single = asText(value);\n this.setAttribute('tmp-value', single);\n const option = this.findOption(single);\n if (option) this.selectOption(option);\n }\n\n /**\n * Find an option by its `value` attribute, falling back to its text.\n *\n * v1 concatenated the value straight into an attribute selector, which threw\n * on any value containing a quote or a backslash.\n */\n private findOption(value: string): DlOption | undefined {\n return (\n this.options.find((option) => option.getAttribute('value') === value) ??\n this.options.find((option) => option.innerText === value)\n );\n }\n\n // ------------------------------------------------------------- selection\n\n private selectOption(option: DlOption | undefined): void {\n if (!option) return;\n\n const value = option.optionValue;\n\n if (this.multiple) {\n const current = (this.getValue() as string[] | undefined) ?? [];\n if (current.includes(value)) return;\n\n this.selectedContainer.appendChild(this.createTag(option));\n this.markSelected(option, true);\n this.setAttribute('value', JSON.stringify([...current, value]));\n } else {\n this.selectedOption = option;\n this.inputField.value = option.displayText;\n this.setAttribute('value', value);\n }\n\n this.emitChange();\n }\n\n private deselectOption(option: DlOption): void {\n const value = option.optionValue;\n const current = (this.getValue() as string[] | undefined) ?? [];\n\n this.tagFor(value)?.remove();\n this.markSelected(option, false);\n this.setAttribute('value', JSON.stringify(current.filter((v) => v !== value)));\n\n this.emitChange();\n }\n\n /** Mark every option carrying this value, since duplicates are allowed. */\n private markSelected(option: DlOption, selected: boolean): void {\n const attribute = option.getAttribute('value');\n const matches = attribute\n ? findByAttribute(this, 'dl-option', 'value', attribute)\n : [option];\n\n for (const match of matches) match.setAttribute('selected', String(selected));\n }\n\n private createTag(option: DlOption): HTMLElement {\n const tag = document.createElement('span');\n tag.classList.add('multiselect-tag');\n tag.dataset['value'] = option.optionValue;\n tag.innerText = option.displayText;\n\n // Class names carry v1's \"muliselect\" typo: consumers style them.\n const removeContainer = document.createElement('span');\n removeContainer.classList.add('dl-muliselect-selected-remove-container');\n\n const remove = document.createElement('span');\n remove.classList.add('dl-muliselect-selected-remove');\n remove.onclick = () => this.deselectOption(option);\n\n removeContainer.appendChild(remove);\n tag.appendChild(removeContainer);\n return tag;\n }\n\n private tagFor(value: string): HTMLElement | undefined {\n return findByAttribute<HTMLElement>(\n this.selectedContainer,\n '.multiselect-tag',\n 'data-value',\n value,\n )[0];\n }\n\n private emitChange(): void {\n this.dispatchEvent(new CustomEvent('change', { bubbles: false, cancelable: true }));\n }\n\n // -------------------------------------------------------------- filtering\n\n filterOptions(query: string): void {\n const terms = query.toLowerCase().split(' ').filter(Boolean);\n let matched = false;\n\n for (const option of this.options) {\n const text = option.innerText.toLowerCase();\n const visible = terms.length === 0 || terms.every((term) => text.includes(term));\n option.style.display = visible ? 'block' : 'none';\n matched ||= visible;\n }\n\n this.noMatchesHint.style.display = matched ? 'none' : 'block';\n }\n\n private visibleOptions(): DlOption[] {\n return this.options.filter((option) => option.style.display !== 'none');\n }\n\n private clearFocusedOption(): void {\n this.focusedOption = undefined;\n for (const option of this.options) option.classList.remove('dl-focused');\n }\n\n private focusOption(option: DlOption | undefined): void {\n this.clearFocusedOption();\n if (!option) return;\n this.focusedOption = option;\n option.classList.add('dl-focused');\n option.scrollIntoView?.({ block: 'nearest' });\n }\n\n private step(delta: 1 | -1): void {\n const visible = this.visibleOptions();\n if (visible.length === 0) return;\n\n const current = this.focusedOption ? visible.indexOf(this.focusedOption) : -1;\n const next = current < 0 ? (delta === 1 ? 0 : visible.length - 1) : current + delta;\n\n if (next < 0 || next >= visible.length) return;\n this.focusOption(visible[next]);\n }\n\n private readonly onKeyDown = (event: Event): void => {\n const key = (event as KeyboardEvent).key;\n\n if (key === 'ArrowDown') this.step(1);\n else if (key === 'ArrowUp') this.step(-1);\n else if (key === 'Enter') {\n this.selectOption(this.focusedOption);\n this.close();\n } else return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n // ------------------------------------------------------------ open / close\n\n private get placeholderText(): string {\n if (this.options.length === 0) return 'No Options Available';\n if (this.selectedOption) return this.selectedOption.innerText;\n return this.getAttribute('placeholder') ?? 'Select ...';\n }\n\n private updatePlaceholder(): void {\n this.inputField.placeholder = this.placeholderText;\n }\n\n /** Open the popup. Named `open` because `focus()` is `HTMLElement`'s. */\n open(): void {\n this.classList.add('dl-focused');\n this.updatePlaceholder();\n this.inputField.value = '';\n this.optionsWrapper.style.display = 'inline-block';\n this.filterOptions('');\n\n // Reparented to the body so a scrolling ancestor cannot clip the popup.\n document.body.appendChild(this.optionsWrapper);\n this.reposition();\n this.attachRepositionListeners();\n }\n\n close(): void {\n this.classList.remove('dl-focused');\n this.optionsWrapper.style.display = 'none';\n this.inputField.value = this.selectedOption?.displayText ?? '';\n this.inputField.blur();\n this.clearFocusedOption();\n this.appendChild(this.optionsWrapper);\n this.detachRepositionListeners();\n }\n\n private reposition(): void {\n const anchor = this.inputWrapper.getBoundingClientRect();\n const style = this.optionsWrapper.style;\n style.position = 'absolute';\n style.top = `${anchor.bottom + window.scrollY + 2}px`;\n style.left = `${anchor.left + window.scrollX}px`;\n style.width = `${anchor.width}px`;\n }\n\n private attachRepositionListeners(): void {\n const listener = (): void => this.reposition();\n this.repositionListener = listener;\n this.scrollTargets = [];\n\n for (let el: Element | null = this.inputWrapper; el; el = el.parentElement) {\n if (el.scrollHeight > el.clientHeight) {\n el.addEventListener('scroll', listener);\n this.scrollTargets.push(el);\n }\n }\n\n document.addEventListener('scroll', listener);\n window.addEventListener('resize', listener);\n this.scrollTargets.push(document, window);\n }\n\n private detachRepositionListeners(): void {\n const listener = this.repositionListener;\n if (!listener) return;\n\n for (const target of this.scrollTargets) {\n target.removeEventListener('scroll', listener);\n target.removeEventListener('resize', listener);\n }\n\n this.scrollTargets = [];\n this.repositionListener = undefined;\n }\n}\n\n/**\n * Register `<dl-select>` and `<dl-option>`.\n *\n * Idempotent, and a no-op outside a browser. Called automatically whenever a\n * form builds a select field.\n */\nexport function defineDlSelect(): void {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get('dl-option')) customElements.define('dl-option', DlOption);\n if (!customElements.get('dl-select')) customElements.define('dl-select', DlSelect);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'dl-select': DlSelect;\n 'dl-option': DlOption;\n }\n}\n","import { Field } from './Field.js';\nimport { setContent } from '../util/dom.js';\nimport { defineDlSelect, type DlOption, type DlSelect } from '../components/DlSelect.js';\nimport type {\n FormChangeContext,\n SelectFieldDescriptor,\n SelectOption,\n} from '../types/descriptors.js';\n\n/** A `<dl-select>` combobox, single or multiple. */\nexport class SelectField extends Field<SelectFieldDescriptor> {\n private select!: DlSelect;\n\n protected override get wrapperExtraClass(): string {\n return 'dl-select-wrapper';\n }\n\n protected createControl(): HTMLElement {\n defineDlSelect();\n\n const select = document.createElement('dl-select');\n this.select = select;\n\n if (this.descriptor.multiple) select.setAttribute('multiple', '');\n\n const placeholder = this.descriptor.placeholder;\n if (typeof placeholder === 'string') select.setAttribute('placeholder', placeholder);\n\n select.onchange = () => this.requestUpdate();\n\n return select;\n }\n\n override async initialize(): Promise<void> {\n await this.loadOptions();\n }\n\n getValue(): string | string[] {\n const value = this.select.getValue();\n if (value === undefined) return this.descriptor.multiple ? [] : '';\n return value;\n }\n\n setValue(value: unknown): void {\n this.select.setValue(value);\n }\n\n override setLoading(loading: boolean): void {\n if (loading) this.select.setLoadingStatus();\n else this.select.unsetLoadingStatus();\n }\n\n override onFormUpdate(_ctx: FormChangeContext, triggerName: string | undefined): void {\n if (typeof this.descriptor.placeholder === 'function') {\n this.select.setAttribute(\n 'placeholder',\n this.resolve(this.descriptor.placeholder) ?? '',\n );\n }\n\n const dependsOnTrigger =\n triggerName !== undefined &&\n this.descriptor.reloadOnChangeOf?.includes(triggerName) === true;\n\n if (dependsOnTrigger && typeof this.descriptor.options === 'function') {\n void this.loadOptions({ reload: true });\n }\n }\n\n /**\n * Populate the options.\n *\n * Each load claims a generation token; if a newer load starts while this one\n * is still in flight, the stale result is dropped instead of clobbering the\n * fresher options. v1 had no such guard, so a slow response from an earlier\n * keystroke could repopulate the select with outdated values.\n */\n private async loadOptions(opts: { reload?: boolean } = {}): Promise<void> {\n const isCurrent = this.context.scheduler.claim(`options:${this.descriptor.name}`);\n const source = this.descriptor.options;\n\n const requested =\n typeof source === 'function'\n ? source(this.context.contextFor(this.descriptor))\n : source;\n\n // A plain array needs no loading state at all.\n const isAsync = requested instanceof Promise;\n if (isAsync) this.select.setLoadingStatus();\n\n try {\n const options = (await requested) ?? [];\n if (!isCurrent()) return;\n\n if (opts.reload) this.context.tooltips.reset(this.descriptor.name);\n\n const previous = this.select.getValue();\n this.select.removeAllOptions();\n for (const option of options) this.select.addOption(this.createOption(option));\n\n if (isAsync) this.select.unsetLoadingStatus();\n if (previous !== undefined) this.select.setValue(previous);\n } catch (error) {\n if (!isCurrent()) return;\n if (isAsync) this.select.unsetLoadingStatus();\n this.reportOptionsError(error);\n }\n }\n\n private createOption(option: SelectOption): DlOption {\n const el = document.createElement('dl-option');\n\n if (typeof option === 'string') {\n el.textContent = option;\n return el;\n }\n\n el.setAttribute('value', option.value);\n setContent(el, option.label);\n if (option.displayWhenSelected) {\n el.setAttribute('displayWhenSelected', option.displayWhenSelected);\n }\n\n return el;\n }\n\n private reportOptionsError(error: unknown): void {\n const handler = this.descriptor.onOptionsError;\n if (!handler) return;\n\n const message = handler({\n ...this.context.contextFor(this.descriptor),\n error,\n });\n\n if (message) {\n this.context.tooltips.setMessage(this.descriptor.name, message.level, message.text);\n }\n }\n}\n","import { Field } from './Field.js';\nimport { createEl } from '../util/dom.js';\nimport { asText } from '../util/value.js';\nimport type { FormChangeContext, TextFieldDescriptor } from '../types/descriptors.js';\n\n/** The fallback kind: a single-line `<input>`. */\nexport class TextField extends Field<TextFieldDescriptor> {\n private input!: HTMLInputElement;\n\n protected createControl(): HTMLElement {\n const input = createEl('input');\n this.input = input;\n\n if (this.descriptor.type) input.type = this.descriptor.type;\n if (this.descriptor.autocomplete) {\n input.setAttribute('autocomplete', this.descriptor.autocomplete);\n }\n\n const placeholder = this.descriptor.placeholder;\n if (typeof placeholder === 'string') input.placeholder = placeholder;\n\n input.oninput = () => this.requestUpdate();\n input.onchange = input.oninput;\n\n return input;\n }\n\n getValue(): string {\n return this.input.value;\n }\n\n setValue(value: unknown): void {\n this.input.value = asText(value);\n }\n\n override onFormUpdate(_ctx: FormChangeContext): void {\n if (typeof this.descriptor.placeholder === 'function') {\n this.input.placeholder = this.resolve(this.descriptor.placeholder) ?? '';\n }\n }\n}\n","import { ArrayField } from '../fields/ArrayField.js';\nimport { CardsField } from '../fields/CardsField.js';\nimport { CheckboxField } from '../fields/CheckboxField.js';\nimport { ComputedField } from '../fields/ComputedField.js';\nimport { CustomField } from '../fields/CustomField.js';\nimport { FileField } from '../fields/FileField.js';\nimport { MessageField } from '../fields/MessageField.js';\nimport { SelectField } from '../fields/SelectField.js';\nimport { TextAreaField } from '../fields/TextAreaField.js';\nimport { TextField } from '../fields/TextField.js';\nimport type { Field } from '../fields/Field.js';\nimport type { FieldDescriptor } from '../types/descriptors.js';\nimport type { FormContext } from './FormContext.js';\n\n/** Constructs a field from its descriptor. */\nexport type FieldConstructor = new (\n descriptor: never,\n context: FormContext,\n) => Field<never>;\n\n/**\n * Maps a descriptor's `kind` to the class that implements it.\n *\n * This replaces v1's ten-branch `if/else`, and makes the set of field kinds\n * extensible: register your own class and it becomes usable in any descriptor.\n */\nexport class FieldRegistry {\n private readonly kinds = new Map<string, FieldConstructor>();\n\n constructor(entries?: Iterable<[string, FieldConstructor]>) {\n for (const [kind, ctor] of entries ?? []) this.kinds.set(kind, ctor);\n }\n\n register(kind: string, ctor: FieldConstructor): this {\n this.kinds.set(kind, ctor);\n return this;\n }\n\n has(kind: string): boolean {\n return this.kinds.has(kind);\n }\n\n /** A copy, so callers can add kinds without mutating the shared default. */\n clone(): FieldRegistry {\n return new FieldRegistry(this.kinds);\n }\n\n create(descriptor: FieldDescriptor, context: FormContext): Field {\n const kind = descriptor.kind ?? 'text';\n const Ctor = this.kinds.get(kind);\n\n if (!Ctor) {\n throw new Error(\n `declarative-forms: unknown field kind \"${kind}\" on field \"${descriptor.name}\". ` +\n `Known kinds: ${[...this.kinds.keys()].sort().join(', ')}.`,\n );\n }\n\n return (new Ctor(descriptor as never, context) as Field).build();\n }\n}\n\n/** The built-in field kinds. */\nexport const defaultFieldRegistry = new FieldRegistry([\n ['text', TextField as unknown as FieldConstructor],\n ['textarea', TextAreaField as unknown as FieldConstructor],\n ['select', SelectField as unknown as FieldConstructor],\n ['checkbox', CheckboxField as unknown as FieldConstructor],\n ['message', MessageField as unknown as FieldConstructor],\n ['file', FileField as unknown as FieldConstructor],\n ['computed', ComputedField as unknown as FieldConstructor],\n ['cards', CardsField as unknown as FieldConstructor],\n ['custom', CustomField as unknown as FieldConstructor],\n ['array', ArrayField as unknown as FieldConstructor],\n]);\n","/**\n * Structural equality for form data snapshots.\n *\n * Replaces the `@react-hookz/deep-equal` dependency. Scoped to what form values\n * can actually be: primitives, plain objects, arrays, `Date`, and `File`/`Blob`\n * (compared by identity, since their contents are not cheaply comparable).\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {\n return false;\n }\n\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false;\n\n if (a instanceof Date) return a.getTime() === (b as Date).getTime();\n\n // Identity-compared: two distinct File/Blob handles are never treated as equal.\n if (typeof Blob !== 'undefined' && a instanceof Blob) return false;\n if (typeof FileList !== 'undefined' && a instanceof FileList) return false;\n\n if (Array.isArray(a)) {\n const other = b as unknown[];\n if (a.length !== other.length) return false;\n return a.every((item, i) => deepEqual(item, other[i]));\n }\n\n if (a instanceof Map) {\n const other = b as Map<unknown, unknown>;\n if (a.size !== other.size) return false;\n for (const [key, value] of a) {\n if (!other.has(key) || !deepEqual(value, other.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set) {\n const other = b as Set<unknown>;\n if (a.size !== other.size) return false;\n for (const value of a) {\n if (!other.has(value)) return false;\n }\n return true;\n }\n\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n\n const aKeys = Object.keys(left);\n if (aKeys.length !== Object.keys(right).length) return false;\n\n return aKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n deepEqual(left[key], right[key]),\n );\n}\n","import { deepEqual } from '../util/deepEqual.js';\nimport type { FormValues } from '../types/descriptors.js';\n\nexport type InputSubscriber = (values: FormValues) => void;\n\n/**\n * Change detection and input subscribers for one form.\n *\n * Tracks two baselines — one including the active tab and one excluding it — so\n * that switching tabs can be treated as a change or not depending on the caller.\n */\nexport class FormModel {\n private last: FormValues | undefined;\n private lastWithoutTab: FormValues | undefined;\n private readonly subscribers: InputSubscriber[] = [];\n\n /**\n * Report whether `values` differ from the last seen snapshot, and adopt it as\n * the new baseline.\n *\n * @param includeTab compare `activeTab` as well as the field values\n */\n hasChanged(values: FormValues, includeTab = false): boolean {\n const snapshot = { ...values };\n const withoutTab = { ...values };\n delete withoutTab['activeTab'];\n\n if (this.last === undefined) {\n this.last = snapshot;\n this.lastWithoutTab = withoutTab;\n return true;\n }\n\n const baseline = includeTab ? this.last : this.lastWithoutTab;\n const candidate = includeTab ? snapshot : withoutTab;\n\n if (deepEqual(baseline, candidate)) return false;\n\n this.last = snapshot;\n this.lastWithoutTab = withoutTab;\n return true;\n }\n\n subscribe(subscriber: InputSubscriber): () => void {\n this.subscribers.push(subscriber);\n return () => {\n const index = this.subscribers.indexOf(subscriber);\n if (index >= 0) this.subscribers.splice(index, 1);\n };\n }\n\n notify(values: FormValues): void {\n for (const subscriber of [...this.subscribers]) {\n subscriber(values);\n }\n }\n\n /** Forget the baseline so the next comparison reports a change. */\n reset(): void {\n this.last = undefined;\n this.lastWithoutTab = undefined;\n }\n}\n","let formCounter = 0;\n\n/**\n * Per-form unique DOM ids.\n *\n * v1 gave checkboxes ids like `field-0`, which collided between any two forms on\n * the page — and always collided between a parent form and its array sub-form.\n * Scoping the counter per form makes `label[for]` reliable, which is what the\n * accessibility work builds on.\n */\nexport class IdGenerator {\n private readonly prefix: string;\n private counter = 0;\n\n constructor(prefix?: string) {\n this.prefix = prefix ?? `dlf${++formCounter}`;\n }\n\n /** A unique id, e.g. `dlf3-field-2`. */\n next(kind = 'field'): string {\n return `${this.prefix}-${kind}-${++this.counter}`;\n }\n\n /** A stable id derived from a name, e.g. `dlf3-control-email`. */\n for(kind: string, name: string): string {\n return `${this.prefix}-${kind}-${name}`;\n }\n}\n\n/** Reset the global form counter. Test-only. */\nexport function resetIdCounter(): void {\n formCounter = 0;\n}\n","/**\n * Tracks the form's in-flight async work.\n *\n * v1 pushed every promise onto a `this.allPromises` array that was never\n * cleared, so each `Promise.allSettled(allPromises)` re-awaited the entire\n * history of the form and the array grew without bound. This tracks only what\n * is actually pending, and hands out generation tokens so a slow async result\n * from an earlier keystroke cannot overwrite a newer one.\n */\nexport class UpdateScheduler {\n private pending = new Set<Promise<unknown>>();\n private generations = new Map<string, number>();\n\n /** Register async work and drop it from the set once it settles. */\n track<T>(work: Promise<T>): Promise<T> {\n this.pending.add(work);\n const forget = (): void => {\n this.pending.delete(work);\n };\n work.then(forget, forget);\n return work;\n }\n\n /** Number of currently in-flight operations. Test/diagnostics only. */\n get pendingCount(): number {\n return this.pending.size;\n }\n\n /**\n * Resolve once nothing is in flight.\n *\n * Loops because settling one batch may schedule another (an options load\n * whose completion triggers a dependent field's reload).\n */\n async whenSettled(): Promise<void> {\n let guard = 0;\n while (this.pending.size > 0) {\n if (++guard > 100) {\n throw new Error(\n 'declarative-forms: form updates did not settle after 100 rounds — ' +\n 'a field callback is most likely scheduling work on every update.',\n );\n }\n await Promise.allSettled([...this.pending]);\n }\n }\n\n /**\n * Claim the next generation for `key` and return a predicate that reports\n * whether that claim is still the newest.\n *\n * ```ts\n * const isCurrent = scheduler.claim(`options:${field.name}`);\n * const values = await load();\n * if (!isCurrent()) return; // a newer load superseded this one\n * ```\n */\n claim(key: string): () => boolean {\n const generation = (this.generations.get(key) ?? 0) + 1;\n this.generations.set(key, generation);\n return () => this.generations.get(key) === generation;\n }\n\n /** Invalidate every outstanding claim and forget all pending work. */\n reset(): void {\n this.pending.clear();\n for (const key of this.generations.keys()) {\n this.generations.set(key, (this.generations.get(key) ?? 0) + 1);\n }\n }\n}\n","import { addClasses, createEl } from '../util/dom.js';\nimport type { ButtonContext, ButtonDescriptor, ButtonMap } from '../types/options.js';\n\nexport interface ButtonBarCallbacks {\n /** Resolve once all pending form work has settled. */\n whenSettled(): Promise<void>;\n /** Recompute `computed` fields before an action runs. */\n updateComputedFields(): Promise<void>;\n getValues(): Record<string, unknown>;\n /** Run the action and close the dialog. */\n closeWith(action: ButtonDescriptor['action']): Promise<void>;\n}\n\n/**\n * The dialog's lower bar.\n *\n * Buttons are real `<button type=\"button\">` elements rather than v1's\n * `<div class=\"btn\">`. They keep the `.btn` class, so every existing stylesheet\n * still matches, and the shipped CSS normalises the font so the change is not\n * visible — but they are now focusable and operable from the keyboard.\n */\nexport class ButtonBar {\n readonly element: HTMLElement;\n\n private readonly buttons: { descriptor: ButtonDescriptor; element: HTMLElement }[] = [];\n\n constructor(\n private readonly config: ButtonMap,\n private readonly callbacks: ButtonBarCallbacks,\n ) {\n this.element = createEl('div', { classNames: ['low-bar'] });\n\n for (const [label, descriptor] of Object.entries(config)) {\n const button = this.createButton(label, descriptor);\n this.buttons.push({ descriptor, element: button });\n this.element.appendChild(button);\n }\n }\n\n get count(): number {\n return this.buttons.length;\n }\n\n /** The first button — the one Enter activates. */\n get primary(): HTMLElement | undefined {\n return this.buttons[0]?.element;\n }\n\n /** Whether the primary button is currently disabled. */\n get primaryDisabled(): boolean {\n return this.primary?.classList.contains('disabled') ?? false;\n }\n\n private createButton(label: string, descriptor: ButtonDescriptor): HTMLElement {\n const button = createEl('button', {\n classNames: ['btn'],\n attrs: { type: 'button' },\n content: label,\n });\n\n if (descriptor.id) button.id = descriptor.id;\n addClasses(button, descriptor.class);\n\n button.onclick = () => {\n void this.activate(descriptor, button);\n };\n\n return button;\n }\n\n private async activate(\n descriptor: ButtonDescriptor,\n button: HTMLElement,\n ): Promise<void> {\n const classes = button.classList;\n if (classes.contains('loading-btn') || classes.contains('disabled')) return;\n\n classes.add('loading-btn');\n\n try {\n await this.callbacks.whenSettled();\n // The disabled state can change while pending work settles.\n if (classes.contains('disabled')) return;\n\n await this.callbacks.updateComputedFields();\n\n if (descriptor.doNotCloseModal) {\n await descriptor.action?.(this.callbacks.getValues());\n } else {\n await this.callbacks.closeWith(descriptor.action);\n }\n } finally {\n // v1 wrote `.remove('loading-btn')`, which called Element.remove() and\n // deleted the confirm button outright.\n classes.remove('loading-btn');\n }\n }\n\n /**\n * Re-evaluate every `isActive` / `isVisible` predicate.\n *\n * Buttons without an `id` are skipped, matching v1 — an id is what opts a\n * button into state management.\n */\n async refresh(ctx: ButtonContext): Promise<void> {\n const work: Promise<void>[] = [];\n\n for (const { descriptor, element } of this.buttons) {\n if (!descriptor.id) continue;\n\n if (descriptor.isActive) {\n work.push(\n this.applyPredicate(descriptor.isActive(ctx), (active) => {\n element.classList.toggle('disabled', !active);\n element.toggleAttribute('disabled', !active);\n }),\n );\n }\n\n if (descriptor.isVisible) {\n work.push(\n this.applyPredicate(descriptor.isVisible(ctx), (visible) => {\n element.classList.toggle('invisible', !visible);\n }),\n );\n }\n }\n\n await Promise.allSettled(work);\n }\n\n /**\n * Apply a predicate result.\n *\n * A synchronous predicate is applied immediately. v1 always set the button\n * disabled first and cleared it in a `.then()`, which made every button flash\n * disabled on every keystroke and let a well-timed click be dropped.\n */\n private applyPredicate(\n result: boolean | Promise<boolean>,\n apply: (value: boolean) => void,\n ): Promise<void> {\n if (typeof result === 'boolean') {\n apply(result);\n return Promise.resolve();\n }\n\n return result.then(apply);\n }\n\n /** The configured buttons, for callers that want to invoke an action directly. */\n get descriptors(): ButtonMap {\n return this.config;\n }\n}\n","import { createEl } from '../util/dom.js';\nimport type { ButtonBar } from './ButtonBar.js';\nimport type { TabBar } from './TabBar.js';\n\nexport interface ModalViewOptions {\n tabBar: TabBar;\n buttonBar: ButtonBar;\n /** Render a close button. Omit for a dialog that cannot be dismissed. */\n onCancel?: () => void;\n}\n\n/**\n * The modal chrome.\n *\n * ```html\n * <div class=\"dl-modal\">\n * <div class=\"modal\">\n * <div class=\"up-bar\"><button class=\"cancelBtn secondary\"></button></div>\n * <div class=\"tabWrapper\">…</div>\n * <div class=\"modal-content\">…the form…</div>\n * <div class=\"low-bar\">…buttons…</div>\n * </div>\n * </div>\n * ```\n *\n * Every one of these class names is overridden by at least one consumer, so the\n * structure is fixed. The upper bar is always present but only carries the\n * `up-bar` class when the dialog is dismissable — a v1 quirk that consumer CSS\n * relies on to reserve (or not reserve) the header strip.\n */\nexport class ModalView {\n readonly wrapper: HTMLElement;\n readonly modal: HTMLElement;\n readonly content: HTMLElement;\n readonly upBar: HTMLElement;\n\n constructor(options: ModalViewOptions) {\n this.wrapper = createEl('div', { classNames: ['dl-modal'] });\n this.wrapper.style.display = 'none';\n\n this.modal = createEl('div', { classNames: ['modal'] });\n this.content = createEl('div', { classNames: ['modal-content'] });\n this.upBar = createEl('div');\n\n if (options.onCancel) {\n this.upBar.classList.add('up-bar');\n\n const cancel = createEl('button', {\n classNames: ['cancelBtn', 'secondary'],\n attrs: { type: 'button', 'aria-label': 'Close dialog' },\n });\n cancel.onclick = () => options.onCancel?.();\n\n this.upBar.appendChild(cancel);\n }\n\n this.modal.appendChild(this.upBar);\n this.modal.appendChild(options.tabBar.element);\n this.modal.appendChild(this.content);\n this.modal.appendChild(options.buttonBar.element);\n this.wrapper.appendChild(this.modal);\n }\n\n /** Attach to the document body. Used by `openInModal`. */\n mount(): void {\n document.body.appendChild(this.wrapper);\n }\n\n setVisible(visible: boolean): void {\n this.wrapper.style.display = visible ? 'block' : 'none';\n }\n\n hide(): void {\n this.wrapper.classList.add('dl-modal-hidden');\n }\n\n show(): void {\n this.wrapper.classList.remove('dl-modal-hidden');\n // Re-displaying an element restarts its CSS animations. This dialog was\n // already on screen before it was covered, so replaying its entrance would\n // fade the backdrop back in from nothing — a flash of the page underneath.\n this.wrapper.classList.add('dl-modal-restored');\n }\n\n /**\n * Record how many dialogs this one was opened on top of.\n *\n * A stacked dialog inherits a backdrop that is already on screen: the dialog\n * below is hidden in the same frame this one appears. Fading this backdrop in\n * would leave the page uncovered for the length of the animation, so themes\n * suppress it on the `dl-modal-stacked` class. The depth also goes on the\n * wrapper as `--dl-stack-depth`, so a theme can show how deep the stack is.\n */\n setStackDepth(depth: number): void {\n this.wrapper.classList.toggle('dl-modal-stacked', depth > 0);\n\n if (depth > 0) this.wrapper.style.setProperty('--dl-stack-depth', String(depth));\n else this.wrapper.style.removeProperty('--dl-stack-depth');\n }\n\n /** Mark the dialog as embedded rather than floating. */\n setEmbedded(): void {\n this.wrapper.classList.add('noModalDialog');\n }\n\n addModalClasses(names: readonly string[] | undefined): void {\n for (const name of names ?? []) this.modal.classList.add(name);\n }\n\n addWrapperClasses(names: readonly string[] | undefined): void {\n for (const name of names ?? []) this.wrapper.classList.add(name);\n }\n\n remove(): void {\n this.wrapper.remove();\n }\n}\n","import type { FormValues } from '../types/descriptors.js';\n\n/** What the stack needs from a form on it. */\nexport interface StackableDialog {\n getValues(): FormValues;\n hide(): void;\n show(): void;\n /** Re-apply the active tab after being revealed again. */\n refreshTabs(): void;\n /** Handle Esc. No-op when the dialog is not dismissable. */\n requestCancel(): void;\n /** Handle Enter. Only called when the dialog has exactly one button. */\n requestConfirm(event: KeyboardEvent): void;\n /** Number of buttons in the lower bar. */\n readonly buttonCount: number;\n}\n\n/**\n * The stack of open modal dialogs.\n *\n * v1 kept this in a module-level `var` and registered its `keydown` handler as\n * an import side effect, which ran even in Node and could not be torn down.\n * Here the listener is attached when the first dialog opens and removed when\n * the last one closes, so importing the library does nothing observable.\n */\nexport class ModalStack {\n private readonly dialogs: StackableDialog[] = [];\n private listening = false;\n\n get size(): number {\n return this.dialogs.length;\n }\n\n /** Values of every dialog on the stack, outermost first. */\n values(): FormValues[] {\n return this.dialogs.map((dialog) => dialog.getValues());\n }\n\n /** The dialog currently on top, if any. */\n get top(): StackableDialog | undefined {\n return this.dialogs[this.dialogs.length - 1];\n }\n\n push(dialog: StackableDialog): void {\n this.dialogs.push(dialog);\n this.startListening();\n\n // Only the topmost dialog stays visible.\n if (this.dialogs.length >= 2) {\n this.dialogs[this.dialogs.length - 2]?.hide();\n }\n }\n\n /** Remove a dialog and reveal whatever it was covering. */\n remove(dialog: StackableDialog): void {\n const index = this.dialogs.indexOf(dialog);\n if (index < 0) return;\n\n this.dialogs.splice(index, 1);\n\n const top = this.top;\n if (top) {\n top.show();\n top.refreshTabs();\n } else {\n this.stopListening();\n }\n }\n\n contains(dialog: StackableDialog): boolean {\n return this.dialogs.includes(dialog);\n }\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n const top = this.top;\n if (!top) return;\n\n if (event.key === 'Escape') {\n top.requestCancel();\n } else if (event.key === 'Enter' && top.buttonCount === 1) {\n top.requestConfirm(event);\n }\n };\n\n private startListening(): void {\n if (this.listening || typeof document === 'undefined') return;\n document.addEventListener('keydown', this.onKeyDown);\n this.listening = true;\n }\n\n private stopListening(): void {\n if (!this.listening) return;\n document.removeEventListener('keydown', this.onKeyDown);\n this.listening = false;\n }\n}\n\n/** The stack shared by all forms that do not opt into their own. */\nexport const globalModalStack = new ModalStack();\n","import { createEl, tabClassName } from '../util/dom.js';\n\n/**\n * The dialog's tab strip.\n *\n * v1 resolved tabs with `document.querySelector('.dl-tab-btn.active')`, so two\n * open forms fought over each other's active tab. This owns its buttons and\n * never queries the document.\n *\n * The rendered shape is part of the frozen contract: `.dl-tab-btn` elements are\n * direct, clickable siblings inside `.tabWrapper`, each carrying the tab label\n * with whitespace stripped as a class (`'Find Citation'` → `.FindCitation`), and\n * a `seen` class once visited.\n */\nexport class TabBar {\n readonly element: HTMLElement;\n\n private buttons = new Map<string, HTMLElement>();\n private seen = new Set<string>();\n private active: string | undefined;\n\n constructor(private readonly onSelect: (tab: string) => void) {\n this.element = createEl('div', { classNames: ['tabWrapper'] });\n }\n\n get activeTab(): string | undefined {\n return this.active;\n }\n\n /** Rebuild the strip from the tabs that currently have at least one visible field. */\n render(tabs: readonly string[]): void {\n this.element.replaceChildren();\n this.buttons = new Map();\n\n for (const tab of tabs) {\n const button = createEl('div', {\n classNames: ['dl-tab-btn', tabClassName(tab), this.seen.has(tab) && 'seen'],\n content: tab,\n });\n\n button.onclick = () => this.onSelect(tab);\n\n this.buttons.set(tab, button);\n this.element.appendChild(button);\n }\n\n // Keep the current tab if it survived the rebuild, otherwise fall back.\n const next = this.active && this.buttons.has(this.active) ? this.active : tabs[0];\n if (next) this.select(next);\n else this.active = undefined;\n }\n\n /**\n * Mark a tab active.\n *\n * Selecting a tab that is not currently rendered is a no-op rather than an\n * error — a tab can disappear when the fields in it all become inactive.\n */\n select(tab: string): boolean {\n const button = this.buttons.get(tab);\n if (!button) return false;\n\n for (const other of this.buttons.values()) other.classList.remove('active');\n\n button.classList.add('active');\n button.classList.add('seen');\n this.seen.add(tab);\n this.active = tab;\n\n return true;\n }\n\n get tabs(): string[] {\n return [...this.buttons.keys()];\n }\n\n get isEmpty(): boolean {\n return this.buttons.size === 0;\n }\n}\n","import { createEl } from '../../util/dom.js';\nimport type { TooltipProvider } from './TooltipProvider.js';\n\nconst BUBBLE_CLASS = 'dl-tooltip-bubble';\n\ninterface Attachment {\n content: string;\n bubble: HTMLElement | undefined;\n listeners: (() => void)[];\n}\n\n/**\n * Zero-dependency tooltip.\n *\n * Renders a positioned bubble on hover and on focus, placed to the right of the\n * trigger and flipped to the left when it would overflow the viewport. Content\n * is an HTML string because tooltip text has always supported markup; callers\n * mark it with `html()` at the descriptor level.\n */\nexport class NativeTooltipProvider implements TooltipProvider {\n private readonly attachments = new WeakMap<HTMLElement, Attachment>();\n\n attach(element: HTMLElement, content: string): void {\n const existing = this.attachments.get(element);\n if (existing) {\n existing.content = content;\n if (existing.bubble) existing.bubble.innerHTML = content;\n return;\n }\n\n const attachment: Attachment = { content, bubble: undefined, listeners: [] };\n this.attachments.set(element, attachment);\n\n const show = (): void => this.show(element);\n const hide = (): void => this.hide(element);\n\n const bind = (type: string, handler: EventListener): void => {\n element.addEventListener(type, handler);\n attachment.listeners.push(() => element.removeEventListener(type, handler));\n };\n\n bind('mouseenter', show);\n bind('mouseleave', hide);\n bind('focus', show);\n bind('blur', hide);\n }\n\n detach(element: HTMLElement): void {\n const attachment = this.attachments.get(element);\n if (!attachment) return;\n\n for (const remove of attachment.listeners) remove();\n attachment.bubble?.remove();\n this.attachments.delete(element);\n }\n\n private show(element: HTMLElement): void {\n const attachment = this.attachments.get(element);\n if (!attachment || attachment.bubble) return;\n\n const bubble = createEl('div', { classNames: [BUBBLE_CLASS] });\n bubble.innerHTML = attachment.content;\n bubble.setAttribute('role', 'tooltip');\n document.body.appendChild(bubble);\n attachment.bubble = bubble;\n\n this.position(element, bubble);\n }\n\n private hide(element: HTMLElement): void {\n const attachment = this.attachments.get(element);\n if (!attachment?.bubble) return;\n attachment.bubble.remove();\n attachment.bubble = undefined;\n }\n\n private position(element: HTMLElement, bubble: HTMLElement): void {\n const anchor = element.getBoundingClientRect();\n const box = bubble.getBoundingClientRect();\n const gap = 8;\n\n let left = anchor.right + gap;\n if (left + box.width > window.innerWidth) {\n left = Math.max(gap, anchor.left - box.width - gap);\n }\n\n const top = anchor.top + anchor.height / 2 - box.height / 2;\n\n bubble.style.left = `${left + window.scrollX}px`;\n bubble.style.top = `${Math.max(gap, top) + window.scrollY}px`;\n }\n}\n","import { contentToString, createEl } from '../../util/dom.js';\nimport { NativeTooltipProvider } from './NativeTooltipProvider.js';\nimport type { TooltipProvider } from './TooltipProvider.js';\nimport type { TextOrHtml } from '../../util/html.js';\n\n/** Class applied for each message level, matching the shipped stylesheet. */\nconst LEVEL_CLASS = {\n info: 'tooltip-warning',\n warning: 'tooltip-warning',\n error: 'tooltip-error',\n success: 'tooltip-success',\n loading: 'tooltip-loading',\n} as const;\n\nexport type TooltipLevel = keyof typeof LEVEL_CLASS;\n\n/**\n * Owns the tooltip markers of one form.\n *\n * v1 looked markers up with `document.querySelector('#dl-form-field-wrapper-for-…')`,\n * so two forms with a same-named field fought over each other's tooltips. This\n * keeps its own registry, keyed by field name.\n */\nexport class TooltipController {\n private readonly markers = new Map<string, HTMLElement>();\n private readonly provider: TooltipProvider;\n\n constructor(provider: TooltipProvider = new NativeTooltipProvider()) {\n this.provider = provider;\n }\n\n /**\n * Create the `<span class=\"dl-tooltip\">?</span>` marker for a field.\n *\n * Registered by field name so `setTooltip(name, …)` can find it later. The\n * `data-tippy-content` attribute is retained from v1 as the content store.\n */\n createMarker(content: TextOrHtml): HTMLElement {\n const text = contentToString(content);\n const marker = createEl('span', {\n classNames: ['dl-tooltip'],\n attrs: {\n 'data-tippy-content': text,\n 'data-initial-tippy-content': text,\n },\n content: '?',\n });\n\n this.provider.attach(marker, text);\n return marker;\n }\n\n /** Associate a marker with a field name. Called by the form after mounting. */\n register(fieldName: string, marker: HTMLElement | undefined): void {\n if (marker) this.markers.set(fieldName, marker);\n }\n\n /**\n * Replace a field's tooltip text, icon and state class.\n *\n * A field without a tooltip is a silent no-op, matching v1.\n */\n set(fieldName: string, text: string, icon = '?', className = ''): void {\n const marker = this.markers.get(fieldName);\n if (!marker) return;\n\n const base = marker.classList.contains('dl-tooltip-in-input')\n ? 'dl-tooltip dl-tooltip-in-input'\n : 'dl-tooltip';\n marker.className = className ? `${base} ${className}` : base;\n\n marker.setAttribute('data-tippy-content', text);\n marker.innerHTML = icon;\n\n this.provider.attach(marker, text);\n }\n\n setSuccess(fieldName: string, text: string): void {\n this.set(fieldName, text, '&#10003;', LEVEL_CLASS.success);\n }\n\n setWarning(fieldName: string, text: string): void {\n this.set(fieldName, text, '!', LEVEL_CLASS.warning);\n }\n\n setError(fieldName: string, text: string): void {\n this.set(fieldName, text, '!', LEVEL_CLASS.error);\n }\n\n setLoading(fieldName: string, text: string): void {\n this.set(fieldName, text, '', LEVEL_CLASS.loading);\n }\n\n /** Apply a `{ level, text }` message from an options loader. */\n setMessage(fieldName: string, level: 'info' | 'warning' | 'error', text: string): void {\n if (level === 'error') this.setError(fieldName, text);\n else this.setWarning(fieldName, text);\n }\n\n /** Restore a field's original tooltip text and `?` icon. */\n reset(fieldName: string): void {\n const marker = this.markers.get(fieldName);\n if (!marker) return;\n this.set(fieldName, marker.getAttribute('data-initial-tippy-content') ?? '', '?', '');\n }\n\n resetAll(fieldNames: Iterable<string>): void {\n for (const name of fieldNames) this.reset(name);\n }\n\n destroy(): void {\n for (const marker of this.markers.values()) this.provider.detach(marker);\n this.markers.clear();\n }\n}\n","import { ComputedField } from '../fields/ComputedField.js';\nimport { TextAreaField } from '../fields/TextAreaField.js';\nimport { defaultFieldRegistry } from './FieldRegistry.js';\nimport type { FieldRegistry } from './FieldRegistry.js';\nimport { FormModel, type InputSubscriber } from './FormModel.js';\nimport { IdGenerator } from './IdGenerator.js';\nimport { UpdateScheduler } from './UpdateScheduler.js';\nimport { ButtonBar } from '../ui/ButtonBar.js';\nimport { ModalView } from '../ui/ModalView.js';\nimport { globalModalStack } from '../ui/ModalStack.js';\nimport type { ModalStack, StackableDialog } from '../ui/ModalStack.js';\nimport { TabBar } from '../ui/TabBar.js';\nimport { TooltipController } from '../ui/tooltip/TooltipController.js';\nimport { createEl } from '../util/dom.js';\nimport type { Field, FieldHandle } from '../fields/Field.js';\nimport type { FormContext, SubForm, SubFormOptions } from './FormContext.js';\nimport type {\n FieldContext,\n FieldDescriptor,\n FormChangeContext,\n FormValues,\n} from '../types/descriptors.js';\nimport type {\n ButtonContext,\n ButtonDescriptor,\n ButtonMap,\n DeclarativeFormOptions,\n OpenInModalOptions,\n} from '../types/options.js';\n\n/** Options only used when a form is created as a child of another. */\ninterface InternalOptions {\n parent?: DeclarativeForm;\n stack?: ModalStack;\n registry?: FieldRegistry;\n isEditingArrayEntry?: boolean;\n}\n\n/** Persisted file URLs, so re-picking the same file does not re-upload it. */\nconst filePersistenceCache = new WeakMap<File, Promise<string>>();\n\n/**\n * A declarative form dialog.\n *\n * ```ts\n * const form = new DeclarativeForm({\n * fields: [\n * { name: 'title', displayName: 'Title' },\n * { name: 'lang', kind: 'select', displayName: 'Language',\n * options: [{ value: 'en', label: 'English' }] },\n * ],\n * onConfirm: (values) => console.log(values),\n * onCancel: () => {},\n * });\n *\n * form.openInModal();\n * ```\n */\nexport class DeclarativeForm implements SubForm, StackableDialog {\n /** The `.dl-form` wrapper containing the `<form>`. */\n readonly dom: HTMLElement;\n /** The `<form>` element the fields are rendered into. */\n readonly formElement: HTMLFormElement;\n\n private readonly options: DeclarativeFormOptions;\n private readonly registry: FieldRegistry;\n private readonly stack: ModalStack;\n private readonly parent: DeclarativeForm | undefined;\n\n private readonly fieldList: Field[] = [];\n private readonly fieldsByName = new Map<string, Field>();\n\n private readonly model = new FormModel();\n private readonly scheduler = new UpdateScheduler();\n private readonly ids = new IdGenerator();\n private readonly tooltips: TooltipController;\n\n private readonly tabBar: TabBar;\n private readonly buttonBar: ButtonBar;\n private view: ModalView | undefined;\n\n private readonly editingArrayEntry: boolean;\n private embedded = false;\n private ready: Promise<void>;\n\n constructor(options: DeclarativeFormOptions, internal: InternalOptions = {}) {\n this.options = options;\n this.registry = internal.registry ?? defaultFieldRegistry;\n this.stack = internal.stack ?? globalModalStack;\n this.parent = internal.parent;\n this.editingArrayEntry = internal.isEditingArrayEntry ?? false;\n\n this.tooltips = new TooltipController(options.tooltipProvider);\n\n this.dom = createEl('div', { classNames: ['dl-form'] });\n this.formElement = createEl('form', { attrs: { autocomplete: 'off' } });\n for (const name of options.classNames ?? []) this.formElement.classList.add(name);\n this.formElement.onsubmit = (event) => {\n event.preventDefault();\n return false;\n };\n this.dom.appendChild(this.formElement);\n\n this.tabBar = new TabBar((tab) => this.setActiveTab(tab));\n this.buttonBar = new ButtonBar(this.resolveButtons(), {\n whenSettled: () => this.scheduler.whenSettled(),\n updateComputedFields: () => this.updateComputedFields(),\n getValues: () => this.getValues(),\n closeWith: (action) => this.close(action),\n });\n\n this.buildFields();\n this.applyInitialLayout();\n this.ready = this.initialize();\n }\n\n // ------------------------------------------------------------------ setup\n\n private resolveButtons(): ButtonMap {\n if (this.options.buttons) return this.options.buttons;\n\n return {\n [this.options.confirmLabel ?? 'OK']: {\n id: this.ids.for('confirm', 'default'),\n action: this.options.onConfirm,\n },\n };\n }\n\n private buildFields(): void {\n const context = this.createFieldContext();\n\n for (const descriptor of this.options.fields) {\n if (this.fieldsByName.has(descriptor.name)) {\n throw new Error(\n `declarative-forms: duplicate field name \"${descriptor.name}\". ` +\n 'Field names must be unique within a form.',\n );\n }\n\n const field = this.registry.create(descriptor, context);\n field.applyStaticDefaultValue();\n this.fieldList.push(field);\n this.fieldsByName.set(descriptor.name, field);\n this.tooltips.register(descriptor.name, field.tooltipMarker);\n this.formElement.appendChild(field.wrapper);\n }\n }\n\n /**\n * Decide field visibility and build the tab strip synchronously, before the\n * caller gets the form back.\n *\n * {@link initialize} is async — it awaits option loads and default values —\n * but `openInModal()` normally runs in the same tick as the constructor.\n * Without this pass the dialog paints every field of every tab, then collapses\n * to the active tab once that first async update lands, which is a visible\n * layout shift as soon as any field loads its options over the network.\n *\n * Only visibility is decided here: no `onFormChange`, no `onFormUpdate`, and\n * the value model is left untouched, so the regular update cycle still sees\n * the first real change and refreshes the buttons.\n */\n private applyInitialLayout(): void {\n const values = this.getValues();\n const activeTabs = new Set<string>();\n\n for (const field of this.fieldList) {\n const active =\n field.descriptor.isActive?.({\n ...this.contextFor(field.descriptor),\n data: values,\n }) ?? true;\n\n field.setActive(active);\n if (active) for (const tab of field.tabs()) activeTabs.add(tab);\n }\n\n this.renderTabs(activeTabs);\n }\n\n private async initialize(): Promise<void> {\n await Promise.allSettled(\n this.fieldList.map((field) =>\n this.scheduler.track(Promise.resolve(field.initialize())),\n ),\n );\n await Promise.allSettled(\n this.fieldList.map((field) => this.scheduler.track(field.applyDefaultValue())),\n );\n await this.update();\n }\n\n /** Resolves once initial options and default values have been applied. */\n whenReady(): Promise<void> {\n return this.ready.then(() => this.scheduler.whenSettled());\n }\n\n private createFieldContext(): FormContext {\n return {\n ids: this.ids,\n tooltips: this.tooltips,\n scheduler: this.scheduler,\n get parentData() {\n return undefined;\n },\n stackData: [],\n isEditingArrayEntry: this.editingArrayEntry,\n contextFor: (descriptor) => this.contextFor(descriptor),\n requestUpdate: (source, force) => {\n void this.update(source, force);\n },\n persistFile: (file) => this.persistFile(file),\n createSubForm: (options) => this.createSubForm(options),\n };\n }\n\n private contextFor(descriptor: FieldDescriptor): FieldContext {\n return {\n data: this.getValues(),\n form: this,\n field: descriptor,\n parentData: this.parent?.getValues(),\n stackData: this.stack.values(),\n isEditingArrayEntry: this.editingArrayEntry,\n };\n }\n\n private createSubForm(options: SubFormOptions): SubForm {\n return new DeclarativeForm(\n {\n fields: options.fields,\n classNames: options.classNames,\n buttons: options.buttons,\n onCancel: () => {},\n persistFile: this.options.persistFile,\n tooltipProvider: this.options.tooltipProvider,\n },\n {\n parent: this,\n stack: this.stack,\n registry: this.registry,\n isEditingArrayEntry: options.isEditingArrayEntry,\n },\n );\n }\n\n private async persistFile(file: File): Promise<string> {\n const persist = this.options.persistFile;\n if (!persist) {\n throw new Error(\n 'declarative-forms: a file field needs a `persistFile` handler on the form ' +\n 'to turn the picked File into a storable URL.',\n );\n }\n\n const cached = filePersistenceCache.get(file);\n if (cached) return cached;\n\n const pending = Promise.resolve(persist(file)).then(String);\n filePersistenceCache.set(file, pending);\n\n try {\n return await pending;\n } catch (error) {\n filePersistenceCache.delete(file);\n throw error;\n }\n }\n\n // ------------------------------------------------------------------ values\n\n /**\n * Current values, keyed by field name.\n *\n * Inactive fields (`isActive` returned false) are omitted. The active tab is\n * always included under `activeTab`.\n */\n getValues(): FormValues {\n const values: FormValues = {};\n\n for (const field of this.fieldList) {\n if (!field.contributesValue || !field.isActive()) continue;\n values[field.name] = field.getValue();\n }\n\n values['activeTab'] = this.tabBar.activeTab;\n return values;\n }\n\n /** Imperative handle for a field, or `undefined` if there is no such field. */\n field(name: string): FieldHandle | undefined {\n return this.fieldsByName.get(name);\n }\n\n /** Every field handle, in declaration order. */\n get fields(): readonly FieldHandle[] {\n return this.fieldList;\n }\n\n /** Notified whenever the form's values change. Returns an unsubscribe function. */\n subscribeOnInput(subscriber: InputSubscriber): () => void {\n return this.model.subscribe(subscriber);\n }\n\n // ------------------------------------------------------------------ update\n\n /**\n * Recompute derived state: field visibility, tabs, reactive content and\n * button predicates.\n *\n * @param source the field whose input triggered this update\n * @param force run even when nothing changed\n * @param includeTab treat a tab switch as a change\n */\n async update(source?: FieldHandle, force = false, includeTab = false): Promise<void> {\n const values = this.getValues();\n const changed = this.model.hasChanged(values, includeTab);\n if (!changed && !force) return;\n\n const triggerName = source?.name;\n const activeTabs = new Set<string>();\n\n for (const field of this.fieldList) {\n const ctx: FormChangeContext = {\n ...this.contextFor(field.descriptor),\n data: values,\n trigger: source,\n };\n\n if (field.descriptor.isActive) {\n const active = field.descriptor.isActive(ctx);\n field.setActive(active);\n if (active) for (const tab of field.tabs()) activeTabs.add(tab);\n } else {\n field.setActive(true);\n for (const tab of field.tabs()) activeTabs.add(tab);\n }\n\n field.descriptor.onFormChange?.(ctx);\n field.onFormUpdate(ctx, triggerName);\n }\n\n this.renderTabs(activeTabs);\n\n await this.scheduler.whenSettled();\n\n if (changed) this.model.notify(this.getValues());\n\n await this.buttonBar.refresh(this.buttonContext());\n }\n\n private buttonContext(): ButtonContext {\n return {\n data: this.getValues(),\n parentData: this.parent?.getValues(),\n stackData: this.stack.values(),\n };\n }\n\n /** Recompute every `computed` field. Runs before a button action fires. */\n async updateComputedFields(): Promise<void> {\n const computed = this.fieldList.filter(\n (field): field is ComputedField => field instanceof ComputedField,\n );\n\n await Promise.allSettled(\n computed.map((field) => this.scheduler.track(field.recompute())),\n );\n }\n\n // -------------------------------------------------------------------- tabs\n\n /** Tabs in declaration order, keeping only those with at least one active field. */\n private renderTabs(activeTabs: Set<string>): void {\n const ordered: string[] = [];\n for (const field of this.fieldList) {\n for (const tab of field.tabs()) {\n if (activeTabs.has(tab) && !ordered.includes(tab)) ordered.push(tab);\n }\n }\n\n this.tabBar.render(ordered);\n this.applyActiveTab();\n }\n\n /**\n * Switch tabs.\n *\n * Called with no argument, it re-applies the current tab — useful after a\n * nested dialog closes and the fields underneath need re-syncing.\n */\n setActiveTab(tab?: string): void {\n if (tab && !this.tabBar.select(tab)) return;\n this.applyActiveTab();\n void this.update(undefined, true, true);\n }\n\n private applyActiveTab(): void {\n const active = this.tabBar.activeTab;\n if (!active) return;\n\n for (const field of this.fieldList) {\n const tabs = field.tabs();\n field.setInTab(tabs.length === 0 || tabs.includes(active));\n }\n }\n\n /** Re-apply the active tab. Called by the stack when this dialog is revealed. */\n refreshTabs(): void {\n this.applyActiveTab();\n }\n\n // ----------------------------------------------------------------- display\n\n /**\n * Open the form as a modal dialog.\n *\n * Returns the outer `.dl-modal` element.\n */\n openInModal(options?: OpenInModalOptions): HTMLElement {\n this.embedded = false;\n\n const view = this.ensureView();\n view.mount();\n view.content.appendChild(this.dom);\n view.setStackDepth(this.stack.size);\n view.setVisible(true);\n view.addModalClasses(options?.classNames);\n view.addWrapperClasses(options?.wrapperClassNames);\n\n this.stack.push(this);\n this.applyActiveTab();\n\n return view.wrapper;\n }\n\n /** Render the form inline, inside `host`, instead of as a floating dialog. */\n appendInElement(host: HTMLElement, options?: OpenInModalOptions): HTMLElement {\n this.embedded = true;\n\n const view = this.ensureView();\n view.setEmbedded();\n view.setVisible(true);\n view.addWrapperClasses(options?.classNames);\n view.content.appendChild(this.dom);\n host.appendChild(view.wrapper);\n\n void this.whenReady().then(() => this.applyActiveTab());\n\n return view.wrapper;\n }\n\n private ensureView(): ModalView {\n if (this.view) return this.view;\n\n this.view = new ModalView({\n tabBar: this.tabBar,\n buttonBar: this.buttonBar,\n onCancel: this.options.onCancel ? () => this.cancel() : undefined,\n });\n\n return this.view;\n }\n\n /** The outer `.dl-modal` element, once the form has been displayed. */\n get modalElement(): HTMLElement | undefined {\n return this.view?.wrapper;\n }\n\n hide(): void {\n this.view?.hide();\n }\n\n show(): void {\n this.view?.show();\n }\n\n /** The form's HTML, for tests and snapshots. */\n getHTML(): string {\n return this.dom.outerHTML;\n }\n\n // ---------------------------------------------------------------- lifecycle\n\n get buttonCount(): number {\n return this.buttonBar.count;\n }\n\n /**\n * Run the confirm action and close.\n *\n * @param action defaults to the form's `onConfirm`\n */\n async close(action?: ButtonDescriptor['action']): Promise<void> {\n const callback = action ?? this.options.onConfirm;\n if (callback) await callback(this.getValues());\n\n if (!this.embedded) this.teardownView();\n this.stack.remove(this);\n }\n\n /** Dismiss the dialog. A no-op when the form has no `onCancel`. */\n cancel(): void {\n if (!this.options.onCancel) return;\n\n this.teardownView();\n this.options.onCancel();\n this.stack.remove(this);\n }\n\n /** Close without running any callback. */\n remove(): void {\n this.teardownView();\n this.stack.remove(this);\n }\n\n /** Release tooltips and listeners. Call when discarding an embedded form. */\n destroy(): void {\n this.remove();\n this.tooltips.destroy();\n this.scheduler.reset();\n for (const field of this.fieldList) field.destroy();\n }\n\n private teardownView(): void {\n this.view?.remove();\n this.view = undefined;\n }\n\n // -------------------------------------------------------- keyboard (stack)\n\n requestCancel(): void {\n this.cancel();\n }\n\n /**\n * Enter pressed while this dialog is on top.\n *\n * Inside a textarea that allows newlines, Enter inserts one. Otherwise it\n * confirms — unless the confirm button is disabled.\n */\n requestConfirm(event: KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n const field = target?.getAttribute?.('name')\n ? this.fieldsByName.get(target.getAttribute('name') as string)\n : undefined;\n\n if (field instanceof TextAreaField) {\n // Suppress the newline, but do not confirm either.\n if (!field.allowsNewlines) {\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (this.buttonBar.primaryDisabled) return;\n this.buttonBar.primary?.click();\n }\n\n // ---------------------------------------------------------------- tooltips\n\n setTooltip(fieldName: string, text: string, icon?: string, className?: string): void {\n this.tooltips.set(fieldName, text, icon, className);\n }\n\n setTooltipSuccess(fieldName: string, text: string): void {\n this.tooltips.setSuccess(fieldName, text);\n }\n\n setTooltipWarning(fieldName: string, text: string): void {\n this.tooltips.setWarning(fieldName, text);\n }\n\n setTooltipError(fieldName: string, text: string): void {\n this.tooltips.setError(fieldName, text);\n }\n\n setTooltipLoading(fieldName: string, text: string): void {\n this.tooltips.setLoading(fieldName, text);\n }\n\n resetTooltip(fieldName: string): void {\n this.tooltips.reset(fieldName);\n }\n\n resetTooltips(fieldNames: Iterable<string>): void {\n this.tooltips.resetAll(fieldNames);\n }\n}\n","import { DeclarativeForm } from './DeclarativeForm.js';\nimport type { FieldDescriptor, FormValues } from '../types/descriptors.js';\nimport type {\n ButtonMap,\n DeclarativeFormOptions,\n OpenInModalOptions,\n} from '../types/options.js';\n\n/**\n * Everything {@link DeclarativeForm} accepts, minus the three things `ask`\n * owns: the fields it is given, and the two callbacks it turns into a promise.\n */\nexport interface AskOptions extends Omit<\n DeclarativeFormOptions,\n 'fields' | 'onConfirm' | 'onCancel'\n> {\n /** Class names for the dialog chrome, as passed to `openInModal`. */\n modal?: OpenInModalOptions;\n /**\n * Whether the dialog can be dismissed with Esc or the close button.\n *\n * Defaults to `true`. When `false` no close button is rendered and the\n * promise can only settle with values — so only turn it off when a button of\n * yours is guaranteed to close the dialog.\n */\n dismissable?: boolean;\n}\n\n/**\n * Ask the user for a record, the way `prompt()` asks for a string.\n *\n * Opens the fields as a modal dialog and resolves with its values, or with\n * `undefined` when the user dismisses it.\n *\n * ```ts\n * const release = await ask([\n * { name: 'title', displayName: 'Release title' },\n * { name: 'notes', kind: 'textarea', displayName: 'What changed' },\n * ]);\n *\n * if (release) publish(release);\n * ```\n *\n * With custom {@link AskOptions.buttons | buttons}, the promise resolves when\n * any button that closes the dialog has run its action; a `doNotCloseModal`\n * button (a wizard's \"Next\") leaves it pending, as it leaves the dialog open.\n *\n * Use `new DeclarativeForm(…)` directly when you need the form object itself —\n * to embed it in a page, subscribe to its values, or close it from elsewhere.\n */\nexport function ask(\n fields: readonly FieldDescriptor[],\n options: AskOptions = {},\n): Promise<FormValues | undefined> {\n return askWith(DeclarativeForm, fields, options);\n}\n\n/**\n * {@link ask}, against a given form class.\n *\n * Not part of the public API — the seam exists so the documentation site can\n * run the real `ask` against an instrumented `DeclarativeForm` subclass, rather\n * than a copy of this function that could drift from it.\n */\nexport function askWith(\n FormClass: typeof DeclarativeForm,\n fields: readonly FieldDescriptor[],\n options: AskOptions = {},\n): Promise<FormValues | undefined> {\n const { modal, dismissable = true, buttons, ...formOptions } = options;\n\n return new Promise((resolve) => {\n let settled = false;\n\n /**\n * Settle after the dialog is gone.\n *\n * `close()` awaits the confirm callback and only then tears the view down\n * and pops the modal stack, so resolving inline would hand control back to\n * the caller while the dialog is still mounted — and a `while` loop that\n * asks again immediately would push its next dialog onto a stack that still\n * holds this one, which renders it as a stacked dialog over nothing. A\n * macrotask runs after all of that settling work, which is microtasks.\n */\n const settle = (values: FormValues | undefined): void => {\n if (settled) return;\n settled = true;\n setTimeout(() => resolve(values), 0);\n };\n\n new FormClass({\n ...formOptions,\n fields,\n buttons: buttons && settleOnClose(buttons, settle),\n onConfirm: (values) => settle(values),\n onCancel: dismissable ? () => settle(undefined) : undefined,\n }).openInModal(modal);\n });\n}\n\n/** Resolve the promise after any dialog-closing button has run its action. */\nfunction settleOnClose(\n buttons: ButtonMap,\n settle: (values: FormValues) => void,\n): ButtonMap {\n return Object.fromEntries(\n Object.entries(buttons).map(([label, descriptor]) => [\n label,\n descriptor.doNotCloseModal\n ? descriptor\n : {\n ...descriptor,\n action: async (values: FormValues) => {\n const result = await descriptor.action?.(values);\n settle(values);\n return result;\n },\n },\n ]),\n );\n}\n"]}