@framesquared/form 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.d.ts +781 -0
- package/dist/index.js +2256 -0
- package/dist/index.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/field/Field.ts","../src/field/VTypes.ts","../src/field/Text.ts","../src/field/TextArea.ts","../src/field/Display.ts","../src/field/Hidden.ts","../src/field/Number.ts","../src/util/DateUtil.ts","../src/field/Date.ts","../src/picker/DatePicker.ts","../src/picker/ColorPicker.ts","../src/BoundList.ts","../src/field/ComboBox.ts","../src/field/Tag.ts","../src/field/Checkbox.ts","../src/field/Radio.ts","../src/field/CheckboxGroup.ts","../src/field/RadioGroup.ts","../src/FormPanel.ts","../src/form/BasicForm.ts","../src/form/Validators.ts","../src/field/FieldContainer.ts","../src/field/Slider.ts","../src/field/FileUpload.ts","../src/field/HtmlEditor.ts","../src/field/Spinner.ts"],"sourcesContent":["/**\n * @framesquared/form – Field (base class)\n *\n * Abstract base for all form fields. Provides label rendering,\n * value management, dirty tracking, validation framework, and\n * error display. Subclasses implement the actual input element.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Component } from '@framesquared/component';\nimport type { ComponentConfig } from '@framesquared/component';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface FieldConfig extends ComponentConfig {\n name?: string;\n value?: unknown;\n fieldLabel?: string;\n labelAlign?: 'left' | 'top' | 'right';\n labelWidth?: number;\n labelSeparator?: string;\n hideLabel?: boolean;\n emptyText?: string;\n readOnly?: boolean;\n disabled?: boolean;\n validateOnChange?: boolean;\n validateOnBlur?: boolean;\n msgTarget?: 'side' | 'under' | 'qtip' | 'title' | 'none';\n submitValue?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Field\n// ---------------------------------------------------------------------------\n\nexport class Field extends Component {\n static override $className = 'Ext.form.field.Field';\n\n declare protected _name: string;\n declare protected _originalValue: unknown;\n declare protected _value: unknown;\n declare protected _errors: string[];\n declare protected _wasValid: boolean;\n declare protected _wasDirty: boolean;\n declare protected _labelEl: HTMLElement | null;\n declare protected _bodyWrapEl: HTMLElement | null;\n declare protected _errorEl: HTMLElement | null;\n\n constructor(config: FieldConfig = {}) {\n super({ xtype: 'field', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as FieldConfig;\n this._name = cfg.name ?? '';\n this._originalValue = cfg.value ?? '';\n this._value = cfg.value ?? '';\n this._errors = [];\n this._wasValid = true;\n this._wasDirty = false;\n this._labelEl = null;\n this._bodyWrapEl = null;\n this._errorEl = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as FieldConfig;\n const el = this.el!;\n el.classList.add('x-field');\n\n const labelAlign = cfg.labelAlign ?? 'left';\n el.classList.add(`x-label-${labelAlign}`);\n\n // Label\n if (cfg.fieldLabel) {\n this._labelEl = document.createElement('label');\n this._labelEl.classList.add('x-field-label');\n this._labelEl.textContent = cfg.fieldLabel + (cfg.labelSeparator ?? ':');\n if (cfg.labelWidth) this._labelEl.style.width = `${cfg.labelWidth}px`;\n if (cfg.hideLabel) this._labelEl.style.display = 'none';\n el.appendChild(this._labelEl);\n }\n\n // Body wrap — subclasses add their input here\n this._bodyWrapEl = document.createElement('div');\n this._bodyWrapEl.classList.add('x-field-body');\n el.appendChild(this._bodyWrapEl);\n }\n\n /**\n * Called after the full subclass afterRender chain completes.\n * Subclasses that need post-render init should call super.afterRender()\n * then do their work — this method sets initial validity once\n * the input element exists.\n */\n protected initFieldValidity(): void {\n this._wasValid = this.isValid();\n }\n\n // -----------------------------------------------------------------------\n // Value\n // -----------------------------------------------------------------------\n\n getValue(): unknown {\n return this._value;\n }\n\n setValue(value: unknown): void {\n const oldValue = this._value;\n this._value = value;\n this.onValueChange(oldValue, value);\n }\n\n getRawValue(): string {\n return String(this._value ?? '');\n }\n\n setRawValue(value: string): void {\n this.setValue(value);\n }\n\n protected onValueChange(oldValue: unknown, newValue: unknown): void {\n if (oldValue !== newValue) {\n this.fire('change', this, newValue, oldValue);\n this.checkDirty();\n this.checkValidity();\n }\n }\n\n // -----------------------------------------------------------------------\n // Dirty tracking\n // -----------------------------------------------------------------------\n\n isDirty(): boolean {\n return this._value !== this._originalValue;\n }\n\n reset(): void {\n this.setValue(this._originalValue);\n this.clearInvalid();\n }\n\n protected checkDirty(): void {\n const dirty = this.isDirty();\n if (dirty !== this._wasDirty) {\n this._wasDirty = dirty;\n this.fire('dirtychange', this, dirty);\n }\n }\n\n // -----------------------------------------------------------------------\n // Validation\n // -----------------------------------------------------------------------\n\n getErrors(): string[] {\n return this.computeErrors();\n }\n\n isValid(): boolean {\n const errors = this.computeErrors();\n return errors.length === 0;\n }\n\n validate(): boolean {\n const errors = this.computeErrors();\n if (errors.length > 0) {\n this.markInvalid(errors);\n return false;\n }\n this.clearInvalid();\n return true;\n }\n\n /** Subclasses override to add field-specific validation. */\n protected computeErrors(): string[] {\n return [];\n }\n\n markInvalid(errors: string | string[]): void {\n this._errors = Array.isArray(errors) ? errors : [errors];\n if (this.el) {\n this.el.classList.add('x-field-invalid');\n this.showErrors();\n }\n this.fire('errorchange', this, this._errors);\n }\n\n clearInvalid(): void {\n this._errors = [];\n if (this.el) {\n this.el.classList.remove('x-field-invalid');\n this.removeErrorEl();\n }\n this.fire('errorchange', this, []);\n }\n\n protected checkValidity(): void {\n const valid = this.isValid();\n if (valid !== this._wasValid) {\n this._wasValid = valid;\n this.fire('validitychange', this, valid);\n }\n }\n\n // -----------------------------------------------------------------------\n // Error display\n // -----------------------------------------------------------------------\n\n protected showErrors(): void {\n this.removeErrorEl();\n if (this._errors.length === 0 || !this.el) return;\n this._errorEl = document.createElement('div');\n this._errorEl.classList.add('x-field-error');\n this._errorEl.textContent = this._errors.join(', ');\n this.el.appendChild(this._errorEl);\n }\n\n protected removeErrorEl(): void {\n if (this._errorEl && this._errorEl.parentNode) {\n this._errorEl.parentNode.removeChild(this._errorEl);\n }\n this._errorEl = null;\n }\n\n // -----------------------------------------------------------------------\n // Submission\n // -----------------------------------------------------------------------\n\n getSubmitValue(): string {\n const cfg = this._config as FieldConfig;\n if (cfg.submitValue === false) return '';\n return String(this._value ?? '');\n }\n\n getName(): string {\n return this._name;\n }\n}\n","/**\n * @framesquared/form – VTypes\n * Predefined validation types for text fields.\n */\n\nexport interface VTypeEntry {\n test: (value: string) => boolean;\n regex: RegExp;\n text: string;\n}\n\nexport const VTypes: Record<string, VTypeEntry> = {\n email: {\n regex: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\n test: (v: string) => /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v),\n text: 'Not a valid email address',\n },\n url: {\n regex: /^https?:\\/\\/.+/,\n test: (v: string) => /^https?:\\/\\/.+/.test(v),\n text: 'Not a valid URL',\n },\n alpha: {\n regex: /^[a-zA-Z]+$/,\n test: (v: string) => /^[a-zA-Z]+$/.test(v),\n text: 'Only letters allowed',\n },\n alphanum: {\n regex: /^[a-zA-Z0-9]+$/,\n test: (v: string) => /^[a-zA-Z0-9]+$/.test(v),\n text: 'Only letters and numbers allowed',\n },\n};\n","/**\n * @framesquared/form – TextField\n *\n * A text input field with validation (allowBlank, minLength, maxLength,\n * regex, vtype), character masking, triggers, and keyboard events.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\nimport { VTypes } from './VTypes.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TriggerConfig {\n type: string;\n handler?: (field: TextField, trigger: HTMLElement, event: Event) => void;\n cls?: string;\n}\n\nexport interface TextFieldConfig extends FieldConfig {\n maxLength?: number;\n minLength?: number;\n allowBlank?: boolean;\n regex?: RegExp;\n regexText?: string;\n vtype?: string;\n maskRe?: RegExp;\n stripCharsRe?: RegExp;\n inputType?: string;\n triggers?: TriggerConfig[];\n}\n\n// ---------------------------------------------------------------------------\n// TextField\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_KEYS = new Set(['Enter', 'Escape', 'Tab']);\n\nexport class TextField extends Field {\n static override $className = 'Ext.form.field.Text';\n\n declare protected _inputEl: HTMLInputElement;\n\n constructor(config: TextFieldConfig = {}) {\n super({ xtype: 'textfield', ...config });\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as TextFieldConfig;\n\n // Create input\n this._inputEl = document.createElement('input');\n this._inputEl.type = cfg.inputType ?? 'text';\n this._inputEl.classList.add('x-field-input');\n if (this._name) this._inputEl.name = this._name;\n if (cfg.emptyText) this._inputEl.placeholder = cfg.emptyText;\n if (cfg.readOnly) this._inputEl.readOnly = true;\n if (cfg.disabled) this._inputEl.disabled = true;\n if (cfg.maxLength) this._inputEl.maxLength = cfg.maxLength;\n\n // Set initial value\n if (this._value !== undefined && this._value !== null && this._value !== '') {\n this._inputEl.value = String(this._value);\n }\n\n this._bodyWrapEl!.appendChild(this._inputEl);\n\n // Triggers\n if (cfg.triggers) {\n for (const trig of cfg.triggers) {\n this.renderTrigger(trig);\n }\n }\n\n // Events\n this.attachInputEvents(cfg);\n\n // Initialize validity state after input exists\n this.initFieldValidity();\n }\n\n // -----------------------------------------------------------------------\n // Input element access\n // -----------------------------------------------------------------------\n\n getInputEl(): HTMLInputElement {\n return this._inputEl;\n }\n\n // -----------------------------------------------------------------------\n // Value override — sync with DOM\n // -----------------------------------------------------------------------\n\n override getValue(): string {\n if (this._inputEl) return this._inputEl.value;\n return String(this._value ?? '');\n }\n\n override setValue(value: unknown): void {\n const old = this.getValue();\n this._value = value;\n if (this._inputEl) {\n this._inputEl.value = String(value ?? '');\n }\n this.onValueChange(old, this.getValue());\n }\n\n override getRawValue(): string {\n return this._inputEl?.value ?? '';\n }\n\n override setRawValue(value: string): void {\n if (this._inputEl) this._inputEl.value = value;\n this._value = value;\n }\n\n override getSubmitValue(): string {\n if ((this._config as any).submitValue === false) return '';\n return this.getValue();\n }\n\n // -----------------------------------------------------------------------\n // Validation\n // -----------------------------------------------------------------------\n\n protected override computeErrors(): string[] {\n const cfg = this._config as TextFieldConfig;\n const value = this.getValue();\n const errors: string[] = [];\n\n // allowBlank\n if (cfg.allowBlank === false && (!value || value.trim() === '')) {\n errors.push('This field is required');\n }\n\n if (value && value.length > 0) {\n // minLength\n if (cfg.minLength !== undefined && value.length < cfg.minLength) {\n errors.push(`Minimum length is ${cfg.minLength}`);\n }\n\n // maxLength\n if (cfg.maxLength !== undefined && value.length > cfg.maxLength) {\n errors.push(`Maximum length is ${cfg.maxLength}`);\n }\n\n // regex\n if (cfg.regex && !cfg.regex.test(value)) {\n errors.push(cfg.regexText ?? 'Invalid format');\n }\n\n // vtype\n if (cfg.vtype && VTypes[cfg.vtype]) {\n const vt = VTypes[cfg.vtype];\n if (!vt.test(value)) {\n errors.push(vt.text);\n }\n }\n }\n\n return errors;\n }\n\n // -----------------------------------------------------------------------\n // Events\n // -----------------------------------------------------------------------\n\n protected attachInputEvents(cfg: TextFieldConfig): void {\n const input = this._inputEl;\n\n // Input change (live)\n input.addEventListener('input', () => {\n const newVal = input.value;\n const oldVal = this._value;\n this._value = newVal;\n if (newVal !== oldVal) {\n this.fire('change', this, newVal, oldVal);\n this.checkDirty();\n if (cfg.validateOnChange) this.validate();\n this.checkValidity();\n }\n });\n\n // Focus / Blur\n input.addEventListener('focus', () => {\n this.fire('focus', this);\n });\n\n input.addEventListener('blur', () => {\n this.fire('blur', this);\n if (cfg.validateOnBlur) this.validate();\n // Strip chars on blur\n if (cfg.stripCharsRe) {\n input.value = input.value.replace(cfg.stripCharsRe, '');\n this._value = input.value;\n }\n });\n\n // Special keys\n input.addEventListener('keydown', (e: KeyboardEvent) => {\n if (SPECIAL_KEYS.has(e.key)) {\n this.fire('specialkey', this, e);\n }\n });\n\n // maskRe — prevent disallowed characters\n if (cfg.maskRe) {\n const re = cfg.maskRe;\n input.addEventListener('keypress', (e: KeyboardEvent) => {\n if (e.key.length === 1 && !re.test(e.key)) {\n e.preventDefault();\n }\n });\n }\n }\n\n // -----------------------------------------------------------------------\n // Triggers\n // -----------------------------------------------------------------------\n\n protected renderTrigger(trig: TriggerConfig): void {\n const el = document.createElement('div');\n el.classList.add('x-field-trigger', `x-trigger-${trig.type}`);\n if (trig.cls) el.classList.add(trig.cls);\n el.setAttribute('role', 'button');\n\n if (trig.handler) {\n const handler = trig.handler;\n el.addEventListener('click', (e) => {\n handler(this, el, e);\n });\n }\n\n this._bodyWrapEl!.appendChild(el);\n }\n}\n","/**\n * @framesquared/form – TextArea\n * Multi-line text field using <textarea>. Supports rows, cols,\n * and auto-grow (grow, growMin, growMax).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { TextField } from './Text.js';\nimport type { TextFieldConfig } from './Text.js';\n\nexport interface TextAreaConfig extends TextFieldConfig {\n rows?: number;\n cols?: number;\n grow?: boolean;\n growMin?: number;\n growMax?: number;\n}\n\nexport class TextArea extends TextField {\n static override $className = 'Ext.form.field.TextArea';\n\n declare private _textareaEl: HTMLTextAreaElement;\n\n constructor(config: TextAreaConfig = {}) {\n super({ xtype: 'textarea', ...config });\n }\n\n protected override afterRender(): void {\n // Call Field's afterRender (label + bodyWrap), skip TextField's input creation\n // We need to replicate the field base render then create our own textarea\n const FieldProto = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(this)));\n FieldProto.afterRender?.call(this);\n\n const cfg = this._config as TextAreaConfig;\n\n this._textareaEl = document.createElement('textarea');\n this._textareaEl.classList.add('x-field-input');\n if (this._name) this._textareaEl.name = this._name;\n if (cfg.emptyText) this._textareaEl.placeholder = cfg.emptyText;\n if (cfg.readOnly) this._textareaEl.readOnly = true;\n if (cfg.disabled) this._textareaEl.disabled = true;\n if (cfg.rows) this._textareaEl.rows = cfg.rows;\n if (cfg.cols) this._textareaEl.cols = cfg.cols;\n\n if (cfg.grow) {\n if (cfg.growMin) this._textareaEl.style.minHeight = `${cfg.growMin}px`;\n if (cfg.growMax) this._textareaEl.style.maxHeight = `${cfg.growMax}px`;\n this._textareaEl.style.overflow = 'auto';\n }\n\n if (this._value !== undefined && this._value !== null && this._value !== '') {\n this._textareaEl.value = String(this._value);\n }\n\n this._bodyWrapEl!.appendChild(this._textareaEl);\n\n // Reuse TextField's event attachment\n // Override _inputEl to point to textarea for event handling\n (this as any)._inputEl = this._textareaEl as any;\n\n this.attachInputEvents(cfg);\n\n // Initialize validity state\n this.initFieldValidity();\n }\n\n override getInputEl(): HTMLInputElement {\n return this._textareaEl as any;\n }\n\n override getValue(): string {\n if (this._textareaEl) return this._textareaEl.value;\n return String(this._value ?? '');\n }\n\n override setValue(value: unknown): void {\n const old = this.getValue();\n this._value = value;\n if (this._textareaEl) {\n this._textareaEl.value = String(value ?? '');\n }\n this.onValueChange(old, this.getValue());\n }\n}\n","/**\n * @framesquared/form – DisplayField\n * Read-only display of a value. No input element, no form submission.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\n\nexport interface DisplayFieldConfig extends FieldConfig {\n renderer?: (value: unknown) => string;\n}\n\nexport class DisplayField extends Field {\n static override $className = 'Ext.form.field.Display';\n\n declare private _displayEl: HTMLElement | null;\n\n constructor(config: DisplayFieldConfig = {}) {\n super({ xtype: 'displayfield', submitValue: false, ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n this._displayEl = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n\n this._displayEl = document.createElement('div');\n this._displayEl.classList.add('x-display-field-value');\n this.updateDisplay();\n this._bodyWrapEl!.appendChild(this._displayEl);\n\n this.el!.classList.add('x-display-field');\n }\n\n override setValue(value: unknown): void {\n const old = this._value;\n this._value = value;\n this.updateDisplay();\n this.onValueChange(old, value);\n }\n\n override getSubmitValue(): string {\n return '';\n }\n\n private updateDisplay(): void {\n if (!this._displayEl) return;\n const cfg = this._config as DisplayFieldConfig;\n const text = cfg.renderer\n ? cfg.renderer(this._value)\n : String(this._value ?? '');\n this._displayEl.textContent = text;\n }\n}\n","/**\n * @framesquared/form – HiddenField\n * Renders as <input type=\"hidden\">. No label, no visible UI.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\n\nexport class HiddenField extends Field {\n static override $className = 'Ext.form.field.Hidden';\n\n declare private _hiddenInput: HTMLInputElement;\n\n constructor(config: FieldConfig = {}) {\n super({ xtype: 'hiddenfield', ...config });\n }\n\n protected override afterRender(): void {\n // Skip label rendering — call Component afterRender only\n const ComponentProto = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(this)));\n ComponentProto.afterRender?.call(this);\n\n this.el!.classList.add('x-field', 'x-hidden-field');\n this.el!.style.display = 'none';\n\n this._hiddenInput = document.createElement('input');\n this._hiddenInput.type = 'hidden';\n if (this._name) this._hiddenInput.name = this._name;\n if (this._value !== undefined && this._value !== null) {\n this._hiddenInput.value = String(this._value);\n }\n this.el!.appendChild(this._hiddenInput);\n }\n\n override getValue(): string {\n return this._hiddenInput?.value ?? String(this._value ?? '');\n }\n\n override setValue(value: unknown): void {\n const old = this.getValue();\n this._value = value;\n if (this._hiddenInput) this._hiddenInput.value = String(value ?? '');\n this.onValueChange(old, this.getValue());\n }\n\n override getSubmitValue(): string {\n return this.getValue();\n }\n}\n","/**\n * @framesquared/form – NumberField\n *\n * Numeric input with spinner triggers for increment/decrement,\n * min/max validation, and decimal precision formatting.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { TextField } from './Text.js';\nimport type { TextFieldConfig } from './Text.js';\n\nexport interface NumberFieldConfig extends TextFieldConfig {\n minValue?: number;\n maxValue?: number;\n step?: number;\n allowDecimals?: boolean;\n decimalPrecision?: number;\n decimalSeparator?: string;\n autoStripChars?: boolean;\n}\n\nexport class NumberField extends TextField {\n static override $className = 'Ext.form.field.Number';\n\n declare private _minValue: number | undefined;\n declare private _maxValue: number | undefined;\n declare private _step: number;\n declare private _allowDecimals: boolean;\n declare private _decimalPrecision: number;\n\n constructor(config: NumberFieldConfig = {}) {\n // Add spinner triggers\n const triggers = [\n { type: 'spinner-up', handler: (_f: any) => this.spinUp() },\n { type: 'spinner-down', handler: (_f: any) => this.spinDown() },\n ...(config.triggers ?? []),\n ];\n super({ xtype: 'numberfield', ...config, triggers, maskRe: config.maskRe ?? /[0-9.\\-]/ });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as NumberFieldConfig;\n this._minValue = cfg.minValue;\n this._maxValue = cfg.maxValue;\n this._step = cfg.step ?? 1;\n this._allowDecimals = cfg.allowDecimals ?? true;\n this._decimalPrecision = cfg.decimalPrecision ?? 10;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-numberfield');\n\n // Format initial value with precision\n if (this._config.value !== undefined && this._config.value !== null) {\n this.formatInputValue();\n }\n }\n\n // -----------------------------------------------------------------------\n // Value\n // -----------------------------------------------------------------------\n\n getNumberValue(): number {\n const raw = this.getInputEl()?.value ?? '';\n const n = parseFloat(raw);\n return isNaN(n) ? 0 : n;\n }\n\n override setValue(value: unknown): void {\n super.setValue(value);\n this.formatInputValue();\n }\n\n private formatInputValue(): void {\n if (!this._inputEl) return;\n const n = parseFloat(this._inputEl.value);\n if (!isNaN(n) && this._decimalPrecision < 10) {\n this._inputEl.value = n.toFixed(this._decimalPrecision);\n }\n }\n\n // -----------------------------------------------------------------------\n // Spin\n // -----------------------------------------------------------------------\n\n spinUp(): void {\n let val = this.getNumberValue() + this._step;\n if (this._maxValue !== undefined && val > this._maxValue) val = this._maxValue;\n this.setValue(val);\n this.fire('spin', this, val, 'up');\n }\n\n spinDown(): void {\n let val = this.getNumberValue() - this._step;\n if (this._minValue !== undefined && val < this._minValue) val = this._minValue;\n this.setValue(val);\n this.fire('spin', this, val, 'down');\n }\n\n // -----------------------------------------------------------------------\n // Constraints\n // -----------------------------------------------------------------------\n\n setMinValue(value: number): void { this._minValue = value; }\n setMaxValue(value: number): void { this._maxValue = value; }\n\n // -----------------------------------------------------------------------\n // Validation\n // -----------------------------------------------------------------------\n\n protected override computeErrors(): string[] {\n const errors = super.computeErrors();\n const raw = this.getInputEl()?.value ?? '';\n if (raw === '') return errors;\n\n const num = parseFloat(raw);\n\n if (isNaN(num)) {\n errors.push('Not a valid number');\n return errors;\n }\n\n if (!this._allowDecimals && raw.includes('.')) {\n errors.push('Decimal values are not allowed');\n }\n\n if (this._minValue !== undefined && num < this._minValue) {\n errors.push(`Value must be at least ${this._minValue}`);\n }\n\n if (this._maxValue !== undefined && num > this._maxValue) {\n errors.push(`Value must be at most ${this._maxValue}`);\n }\n\n return errors;\n }\n}\n","/**\n * @framesquared/form – DateUtil\n *\n * Date utility functions: format, parse, add, diff, isLeapYear, getDaysInMonth.\n * Format tokens: Y (4-digit year), m (01-12), d (01-31),\n * H (00-23), i (00-59), s (00-59), g (1-12), A (AM/PM).\n */\n\nexport type DateUnit = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second';\n\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTH_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction pad(n: number, len = 2): string {\n return String(n).padStart(len, '0');\n}\n\n// ---------------------------------------------------------------------------\n// Format\n// ---------------------------------------------------------------------------\n\nexport function formatDate(date: Date, format: string): string {\n const Y = date.getFullYear();\n const m = date.getMonth(); // 0-based\n const d = date.getDate();\n const H = date.getHours();\n const i = date.getMinutes();\n const s = date.getSeconds();\n\n // 12-hour\n const h12 = H % 12 || 12;\n const ampm = H < 12 ? 'AM' : 'PM';\n\n let result = '';\n for (let idx = 0; idx < format.length; idx++) {\n const ch = format[idx];\n switch (ch) {\n case 'Y': result += String(Y); break;\n case 'm': result += pad(m + 1); break;\n case 'd': result += pad(d); break;\n case 'H': result += pad(H); break;\n case 'i': result += pad(i); break;\n case 's': result += pad(s); break;\n case 'g': result += String(h12); break;\n case 'A': result += ampm; break;\n case 'F': result += MONTH_NAMES[m]; break;\n case 'M': result += MONTH_SHORT[m]; break;\n case 'j': result += String(d); break;\n case 'n': result += String(m + 1); break;\n default: result += ch; break;\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Parse\n// ---------------------------------------------------------------------------\n\nexport function parseDate(input: string, format: string): Date {\n let year = 0, month = 0, day = 1, hour = 0, minute = 0, second = 0;\n let inputIdx = 0;\n\n for (let fmtIdx = 0; fmtIdx < format.length && inputIdx < input.length; fmtIdx++) {\n const ch = format[fmtIdx];\n switch (ch) {\n case 'Y': year = parseInt(input.slice(inputIdx, inputIdx + 4), 10); inputIdx += 4; break;\n case 'm': month = parseInt(input.slice(inputIdx, inputIdx + 2), 10) - 1; inputIdx += 2; break;\n case 'd': day = parseInt(input.slice(inputIdx, inputIdx + 2), 10); inputIdx += 2; break;\n case 'H': hour = parseInt(input.slice(inputIdx, inputIdx + 2), 10); inputIdx += 2; break;\n case 'i': minute = parseInt(input.slice(inputIdx, inputIdx + 2), 10); inputIdx += 2; break;\n case 's': second = parseInt(input.slice(inputIdx, inputIdx + 2), 10); inputIdx += 2; break;\n default: inputIdx++; break; // skip separator\n }\n }\n\n return new Date(year, month, day, hour, minute, second);\n}\n\n// ---------------------------------------------------------------------------\n// Arithmetic\n// ---------------------------------------------------------------------------\n\nexport function addDate(date: Date, unit: DateUnit, amount: number): Date {\n const d = new Date(date.getTime());\n switch (unit) {\n case 'year': d.setFullYear(d.getFullYear() + amount); break;\n case 'month': d.setMonth(d.getMonth() + amount); break;\n case 'day': d.setDate(d.getDate() + amount); break;\n case 'hour': d.setHours(d.getHours() + amount); break;\n case 'minute': d.setMinutes(d.getMinutes() + amount); break;\n case 'second': d.setSeconds(d.getSeconds() + amount); break;\n }\n return d;\n}\n\nexport function diffDate(date1: Date, date2: Date, unit: DateUnit): number {\n const ms = date2.getTime() - date1.getTime();\n switch (unit) {\n case 'second': return Math.round(ms / 1000);\n case 'minute': return Math.round(ms / 60000);\n case 'hour': return Math.round(ms / 3600000);\n case 'day': return Math.round(ms / 86400000);\n case 'month': return (date2.getFullYear() - date1.getFullYear()) * 12 + (date2.getMonth() - date1.getMonth());\n case 'year': return date2.getFullYear() - date1.getFullYear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);\n}\n\nexport function getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\nexport function getMonthName(month: number): string {\n return MONTH_NAMES[month] ?? '';\n}\n\nexport function getMonthShortName(month: number): string {\n return MONTH_SHORT[month] ?? '';\n}\n","/**\n * @framesquared/form – DateField\n *\n * A text field for date input. Formats/parses dates using a\n * configurable format string. Has an expand trigger for opening\n * a DatePicker dropdown. Validates min/max date boundaries.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { TextField } from './Text.js';\nimport type { TextFieldConfig } from './Text.js';\nimport { formatDate, parseDate } from '../util/DateUtil.js';\n\nexport interface DateFieldConfig extends TextFieldConfig {\n format?: string;\n minValue?: Date;\n maxValue?: Date;\n disabledDates?: string[];\n disabledDays?: number[];\n showToday?: boolean;\n}\n\nexport class DateField extends TextField {\n static override $className = 'Ext.form.field.Date';\n\n declare private _format: string;\n declare private _minDate: Date | undefined;\n declare private _maxDate: Date | undefined;\n declare private _dateValue: Date | null;\n\n constructor(config: DateFieldConfig = {}) {\n const triggers = [\n { type: 'expand', handler: (_f: any) => { /* open picker placeholder */ } },\n ...(config.triggers ?? []),\n ];\n super({ xtype: 'datefield', ...config, triggers });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as DateFieldConfig;\n this._format = cfg.format ?? 'Y-m-d';\n this._minDate = cfg.minValue;\n this._maxDate = cfg.maxValue;\n this._dateValue = cfg.value instanceof Date ? cfg.value : null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-datefield');\n\n // Format initial date value\n if (this._dateValue) {\n this._inputEl.value = formatDate(this._dateValue, this._format);\n }\n }\n\n // -----------------------------------------------------------------------\n // Value\n // -----------------------------------------------------------------------\n\n getDateValue(): Date | null {\n return this._dateValue;\n }\n\n override setValue(value: unknown): void {\n if (value instanceof Date) {\n this._dateValue = value;\n const formatted = formatDate(value, this._format);\n this._value = formatted;\n if (this._inputEl) this._inputEl.value = formatted;\n this.onValueChange(null, value);\n } else if (typeof value === 'string' && value) {\n this._dateValue = parseDate(value, this._format);\n this._value = value;\n if (this._inputEl) this._inputEl.value = value;\n this.onValueChange(null, this._dateValue);\n } else {\n this._dateValue = null;\n this._value = '';\n if (this._inputEl) this._inputEl.value = '';\n }\n }\n\n // -----------------------------------------------------------------------\n // Constraints\n // -----------------------------------------------------------------------\n\n setMinValue(date: Date): void { this._minDate = date; }\n setMaxValue(date: Date): void { this._maxDate = date; }\n\n // -----------------------------------------------------------------------\n // Validation\n // -----------------------------------------------------------------------\n\n protected override computeErrors(): string[] {\n const errors = super.computeErrors();\n const d = this._dateValue;\n if (!d) return errors;\n\n if (this._minDate && d.getTime() < this._minDate.getTime()) {\n errors.push(`Date must be on or after ${formatDate(this._minDate, this._format)}`);\n }\n if (this._maxDate && d.getTime() > this._maxDate.getTime()) {\n errors.push(`Date must be on or before ${formatDate(this._maxDate, this._format)}`);\n }\n\n return errors;\n }\n}\n","/**\n * @framesquared/form – DatePicker\n *\n * Full calendar widget. Shows a month grid with day cells,\n * prev/next navigation, today button, and disabled date support.\n * Fires 'select' when a date is clicked.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Component } from '@framesquared/component';\nimport type { ComponentConfig } from '@framesquared/component';\nimport { getMonthName, getDaysInMonth } from '../util/DateUtil.js';\n\nexport interface DatePickerConfig extends ComponentConfig {\n value?: Date;\n minValue?: Date;\n maxValue?: Date;\n disabledDays?: number[];\n disabledDates?: string[];\n showToday?: boolean;\n}\n\nexport class DatePicker extends Component {\n static override $className = 'Ext.picker.Date';\n\n declare private _viewDate: Date;\n declare private _selectedDate: Date;\n declare private _minDate: Date | undefined;\n declare private _maxDate: Date | undefined;\n declare private _disabledDays: Set<number>;\n declare private _gridEl: HTMLElement | null;\n declare private _headerEl: HTMLElement | null;\n\n constructor(config: DatePickerConfig = {}) {\n super({ xtype: 'datepicker', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as DatePickerConfig;\n const now = cfg.value ?? new Date();\n this._viewDate = new Date(now.getFullYear(), now.getMonth(), 1);\n this._selectedDate = new Date(now.getTime());\n this._minDate = cfg.minValue;\n this._maxDate = cfg.maxValue;\n this._disabledDays = new Set(cfg.disabledDays ?? []);\n this._gridEl = null;\n this._headerEl = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-datepicker');\n this.buildUI();\n }\n\n // -----------------------------------------------------------------------\n // UI Build\n // -----------------------------------------------------------------------\n\n private buildUI(): void {\n const el = this.el!;\n el.innerHTML = '';\n\n // Navigation\n const nav = document.createElement('div');\n nav.classList.add('x-datepicker-nav');\n\n const prevBtn = document.createElement('button');\n prevBtn.classList.add('x-datepicker-prev');\n prevBtn.type = 'button';\n prevBtn.textContent = '‹';\n prevBtn.addEventListener('click', () => this.navigate(-1));\n\n this._headerEl = document.createElement('span');\n this._headerEl.classList.add('x-datepicker-header');\n\n const nextBtn = document.createElement('button');\n nextBtn.classList.add('x-datepicker-next');\n nextBtn.type = 'button';\n nextBtn.textContent = '›';\n nextBtn.addEventListener('click', () => this.navigate(1));\n\n nav.appendChild(prevBtn);\n nav.appendChild(this._headerEl);\n nav.appendChild(nextBtn);\n el.appendChild(nav);\n\n // Day headers\n const dayHeaders = document.createElement('div');\n dayHeaders.classList.add('x-datepicker-days');\n for (const d of ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']) {\n const dh = document.createElement('span');\n dh.classList.add('x-datepicker-dayname');\n dh.textContent = d;\n dayHeaders.appendChild(dh);\n }\n el.appendChild(dayHeaders);\n\n // Grid\n this._gridEl = document.createElement('div');\n this._gridEl.classList.add('x-datepicker-grid');\n el.appendChild(this._gridEl);\n\n // Today button\n const cfg = this._config as DatePickerConfig;\n if (cfg.showToday !== false) {\n const todayBtn = document.createElement('button');\n todayBtn.classList.add('x-datepicker-today');\n todayBtn.type = 'button';\n todayBtn.textContent = 'Today';\n todayBtn.addEventListener('click', () => {\n const today = new Date();\n this._selectedDate = today;\n this._viewDate = new Date(today.getFullYear(), today.getMonth(), 1);\n this.renderGrid();\n this.fire('select', this, today);\n });\n el.appendChild(todayBtn);\n }\n\n this.renderGrid();\n }\n\n private renderGrid(): void {\n if (!this._gridEl || !this._headerEl) return;\n\n const year = this._viewDate.getFullYear();\n const month = this._viewDate.getMonth();\n\n // Header\n this._headerEl.textContent = `${getMonthName(month)} ${year}`;\n\n // Clear grid\n this._gridEl.innerHTML = '';\n\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = new Date(year, month, 1).getDay(); // 0=Sun\n\n // Leading blanks\n for (let i = 0; i < firstDay; i++) {\n const blank = document.createElement('span');\n blank.classList.add('x-datepicker-blank');\n this._gridEl.appendChild(blank);\n }\n\n // Day cells\n for (let day = 1; day <= daysInMonth; day++) {\n const cellDate = new Date(year, month, day);\n const cell = document.createElement('span');\n cell.classList.add('x-datepicker-cell');\n cell.textContent = String(day);\n cell.setAttribute('data-date', `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`);\n\n const disabled = this.isDateDisabled(cellDate);\n if (disabled) {\n cell.classList.add('x-datepicker-disabled');\n }\n\n // Selected\n if (this._selectedDate &&\n cellDate.getFullYear() === this._selectedDate.getFullYear() &&\n cellDate.getMonth() === this._selectedDate.getMonth() &&\n cellDate.getDate() === this._selectedDate.getDate()) {\n cell.classList.add('x-datepicker-selected');\n }\n\n cell.addEventListener('click', () => {\n if (disabled) return;\n this._selectedDate = cellDate;\n this.renderGrid();\n this.fire('select', this, cellDate);\n });\n\n this._gridEl.appendChild(cell);\n }\n }\n\n // -----------------------------------------------------------------------\n // Navigation\n // -----------------------------------------------------------------------\n\n private navigate(delta: number): void {\n this._viewDate.setMonth(this._viewDate.getMonth() + delta);\n this.renderGrid();\n }\n\n // -----------------------------------------------------------------------\n // Disabled date check\n // -----------------------------------------------------------------------\n\n private isDateDisabled(date: Date): boolean {\n // Day of week\n if (this._disabledDays.has(date.getDay())) return true;\n\n // Min/Max\n if (this._minDate && date.getTime() < this.startOfDay(this._minDate).getTime()) return true;\n if (this._maxDate && date.getTime() > this.startOfDay(this._maxDate).getTime()) return true;\n\n return false;\n }\n\n private startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n\n // -----------------------------------------------------------------------\n // Public\n // -----------------------------------------------------------------------\n\n getSelectedDate(): Date {\n return new Date(this._selectedDate.getTime());\n }\n}\n","/**\n * @framesquared/form – ColorPicker\n *\n * A grid of color swatches. Fires 'select' with the hex color string.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Component } from '@framesquared/component';\nimport type { ComponentConfig } from '@framesquared/component';\n\nconst DEFAULT_COLORS = [\n '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333',\n '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080',\n 'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696',\n 'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0',\n 'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF',\n];\n\nexport interface ColorPickerConfig extends ComponentConfig {\n colors?: string[];\n}\n\nexport class ColorPicker extends Component {\n static override $className = 'Ext.picker.Color';\n\n declare private _colors: string[];\n declare private _selectedColor: string | null;\n\n constructor(config: ColorPickerConfig = {}) {\n super({ xtype: 'colorpicker', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as ColorPickerConfig;\n this._colors = cfg.colors ?? DEFAULT_COLORS;\n this._selectedColor = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-colorpicker');\n this.buildSwatches();\n }\n\n private buildSwatches(): void {\n const el = this.el!;\n for (const color of this._colors) {\n const swatch = document.createElement('div');\n swatch.classList.add('x-colorpicker-swatch');\n swatch.style.backgroundColor = `#${color}`;\n swatch.setAttribute('data-color', color);\n\n swatch.addEventListener('click', () => {\n this._selectedColor = color;\n this.fire('select', this, color);\n });\n\n el.appendChild(swatch);\n }\n }\n\n getSelectedColor(): string | null {\n return this._selectedColor;\n }\n}\n","/**\n * @framesquared/form – BoundList\n *\n * The dropdown list used by ComboBox. Renders items from a Store,\n * supports hover highlighting, keyboard navigation (up/down/enter/esc),\n * and fires itemclick/select events.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Component } from '@framesquared/component';\nimport type { ComponentConfig } from '@framesquared/component';\n\nexport interface BoundListConfig extends ComponentConfig {\n store?: any;\n displayField?: string;\n}\n\nexport class BoundList extends Component {\n static override $className = 'Ext.form.BoundList';\n\n declare private _store: any;\n declare private _displayField: string;\n declare private _highlightIndex: number;\n\n constructor(config: BoundListConfig = {}) {\n super({ xtype: 'boundlist', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as BoundListConfig;\n this._store = cfg.store ?? null;\n this._displayField = cfg.displayField ?? 'text';\n this._highlightIndex = -1;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-boundlist');\n this.el!.setAttribute('role', 'listbox');\n this.el!.tabIndex = -1;\n\n this.renderItems();\n\n this.el!.addEventListener('keydown', (e: KeyboardEvent) => {\n this.onKeyDown(e);\n });\n }\n\n refresh(): void {\n this.renderItems();\n }\n\n private renderItems(): void {\n if (!this.el) return;\n this.el.innerHTML = '';\n this._highlightIndex = -1;\n\n const records = Array.isArray(this._store) ? this._store : (this._store?.getRange?.() ?? []);\n for (let i = 0; i < records.length; i++) {\n const rec = records[i];\n const item = document.createElement('div');\n item.classList.add('x-boundlist-item');\n item.setAttribute('role', 'option');\n item.setAttribute('data-index', String(i));\n item.textContent = rec.get\n ? rec.get(this._displayField)\n : String(rec.data?.[this._displayField] ?? rec[this._displayField] ?? '');\n\n item.addEventListener('click', () => {\n this.fire('itemclick', this, rec, item, i);\n this.fire('select', this, rec);\n });\n\n item.addEventListener('mouseover', () => {\n this.highlightItem(i);\n });\n\n this.el.appendChild(item);\n }\n }\n\n private highlightItem(index: number): void {\n const items = this.el!.querySelectorAll('.x-boundlist-item');\n items.forEach((el, i) => {\n el.classList.toggle('x-boundlist-item-over', i === index);\n });\n this._highlightIndex = index;\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n const items = this.el!.querySelectorAll('.x-boundlist-item');\n const count = items.length;\n if (count === 0) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.highlightItem(Math.min(this._highlightIndex + 1, count - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.highlightItem(Math.max(this._highlightIndex - 1, 0));\n } else if (e.key === 'Enter' && this._highlightIndex >= 0) {\n e.preventDefault();\n const records = Array.isArray(this._store) ? this._store : (this._store?.getRange?.() ?? []);\n const rec = records[this._highlightIndex];\n if (rec) {\n this.fire('select', this, rec);\n }\n }\n }\n\n getStore(): any {\n return this._store;\n }\n}\n","/**\n * @framesquared/form – ComboBox\n *\n * A text field with a dropdown list of options. Supports local\n * and remote query modes, multi-select, forceSelection, typeAhead,\n * and keyboard navigation.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { TextField } from './Text.js';\nimport type { TextFieldConfig } from './Text.js';\nimport { BoundList } from '../BoundList.js';\n\nexport interface ComboBoxConfig extends TextFieldConfig {\n store?: any;\n displayField?: string;\n valueField?: string;\n queryMode?: 'local' | 'remote';\n queryParam?: string;\n queryDelay?: number;\n minChars?: number;\n triggerAction?: 'all' | 'last' | 'query';\n forceSelection?: boolean;\n typeAhead?: boolean;\n multiSelect?: boolean;\n delimiter?: string;\n editable?: boolean;\n autoSelect?: boolean;\n pageSize?: number;\n}\n\nexport class ComboBox extends TextField {\n static override $className = 'Ext.form.field.ComboBox';\n\n declare _store: any;\n declare private _displayField: string;\n declare private _valueField: string;\n declare private _queryMode: string;\n declare private _forceSelection: boolean;\n declare private _multiSelect: boolean;\n declare private _delimiter: string;\n declare private _expanded: boolean;\n declare private _selection: any[];\n declare private _boundList: BoundList | null;\n declare private _selectedValue: unknown;\n\n constructor(config: ComboBoxConfig = {}) {\n const triggers = [\n { type: 'expand', handler: (_f: any) => { if (this._expanded) this.collapse(); else this.expand(); } },\n ...(config.triggers ?? []),\n ];\n super({ xtype: 'combobox', ...config, triggers });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as ComboBoxConfig;\n this._store = cfg.store ?? null;\n this._displayField = cfg.displayField ?? 'text';\n this._valueField = cfg.valueField ?? 'id';\n this._queryMode = cfg.queryMode ?? 'local';\n this._forceSelection = cfg.forceSelection ?? false;\n this._multiSelect = cfg.multiSelect ?? false;\n this._delimiter = cfg.delimiter ?? ', ';\n this._expanded = false;\n this._selection = [];\n this._boundList = null;\n this._selectedValue = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-combobox');\n\n // forceSelection: revert on blur if no match\n if (this._forceSelection) {\n this.getInputEl().addEventListener('blur', () => {\n const raw = this.getInputEl().value;\n if (raw && !this.findRecord(this._displayField, raw)) {\n this.getInputEl().value = '';\n this._selectedValue = null;\n }\n });\n }\n }\n\n // -----------------------------------------------------------------------\n // Expand / Collapse\n // -----------------------------------------------------------------------\n\n expand(): void {\n if (this._expanded) return;\n this._expanded = true;\n\n if (!this._boundList) {\n this._boundList = new BoundList({\n store: this._store,\n displayField: this._displayField,\n renderTo: document.body,\n });\n const listEl = this._boundList.el!;\n listEl.classList.add('x-combobox-list');\n listEl.style.display = 'none';\n listEl.style.position = 'fixed';\n listEl.style.zIndex = '1000';\n listEl.style.backgroundColor = '#fff';\n listEl.style.border = '1px solid #ccc';\n listEl.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';\n listEl.style.minWidth = '100px';\n listEl.style.maxHeight = '200px';\n listEl.style.overflowY = 'auto';\n\n // Listen for selection\n (this._boundList as any).on?.('select', (_bl: any, rec: any) => {\n this.select(rec);\n this.collapse();\n });\n } else {\n this._boundList.refresh();\n }\n\n // Position below the field element\n const anchor = this.el ?? this.getInputEl();\n const rect = anchor.getBoundingClientRect();\n const listEl = this._boundList.el!;\n listEl.style.top = `${rect.bottom}px`;\n listEl.style.left = `${rect.left}px`;\n listEl.style.width = `${rect.width}px`;\n listEl.style.display = '';\n\n this.fire('expand', this);\n }\n\n collapse(): void {\n if (!this._expanded) return;\n this._expanded = false;\n if (this._boundList?.el) this._boundList.el.style.display = 'none';\n this.fire('collapse', this);\n }\n\n isExpanded(): boolean {\n return this._expanded;\n }\n\n // -----------------------------------------------------------------------\n // Selection\n // -----------------------------------------------------------------------\n\n select(record: any): void {\n if (!record) return;\n this.fire('beforeselect', this, record);\n\n if (this._multiSelect) {\n if (!this._selection.includes(record)) {\n this._selection.push(record);\n }\n this.updateMultiDisplay();\n } else {\n this._selection = [record];\n const display = record.get ? record.get(this._displayField) : (record[this._displayField] ?? '');\n const value = record.get ? record.get(this._valueField) : (record[this._valueField] ?? '');\n this.getInputEl().value = display;\n this._selectedValue = value;\n this._value = value;\n }\n\n this.fire('select', this, record);\n }\n\n deselect(record: any): void {\n this.fire('beforedeselect', this, record);\n const idx = this._selection.indexOf(record);\n if (idx !== -1) {\n this._selection.splice(idx, 1);\n if (this._multiSelect) this.updateMultiDisplay();\n }\n }\n\n getSelection(): any[] {\n return [...this._selection];\n }\n\n private updateMultiDisplay(): void {\n const display = this._selection\n .map(r => r.get ? r.get(this._displayField) : (r[this._displayField] ?? ''))\n .join(this._delimiter);\n this.getInputEl().value = display;\n this._value = this._selection.map(r => r.get ? r.get(this._valueField) : (r[this._valueField] ?? null));\n }\n\n // -----------------------------------------------------------------------\n // Query\n // -----------------------------------------------------------------------\n\n doQuery(queryString: string): void {\n this.fire('beforequery', this, queryString);\n if (this._queryMode === 'local' && this._store) {\n this._store.filter(this._displayField, queryString);\n } else if (this._queryMode === 'remote' && this._store) {\n const cfg = this._config as ComboBoxConfig;\n this._store.load({ params: { [cfg.queryParam ?? 'query']: queryString } });\n }\n }\n\n // -----------------------------------------------------------------------\n // Finding\n // -----------------------------------------------------------------------\n\n findRecord(field: string, value: unknown): any | null {\n return this._store?.findRecord?.(field, value) ?? null;\n }\n\n // -----------------------------------------------------------------------\n // Value override\n // -----------------------------------------------------------------------\n\n override getValue(): any {\n if (this._multiSelect) {\n return this._selection.map(r => r.get ? r.get(this._valueField) : (r[this._valueField] ?? null));\n }\n return this._selectedValue ?? super.getValue();\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n protected override onDestroy(): void {\n if (this._boundList) {\n this._boundList.destroy();\n this._boundList = null;\n }\n super.onDestroy();\n }\n}\n","/**\n * @framesquared/form – TagField\n *\n * A ComboBox variant that shows selected values as removable tag\n * chips in the input area. Always multi-select.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { ComboBox } from './ComboBox.js';\nimport type { ComboBoxConfig } from './ComboBox.js';\n\nexport interface TagFieldConfig extends ComboBoxConfig {\n filterPickList?: boolean;\n stacked?: boolean;\n createNewOnEnter?: boolean;\n}\n\nexport class TagField extends ComboBox {\n static override $className = 'Ext.form.field.Tag';\n\n declare private _tagWrapEl: HTMLElement | null;\n\n constructor(config: TagFieldConfig = {}) {\n super({ xtype: 'tagfield', multiSelect: true, ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n this._tagWrapEl = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-tagfield');\n\n // Create tag container before the input\n this._tagWrapEl = document.createElement('div');\n this._tagWrapEl.classList.add('x-tagfield-tags');\n this._bodyWrapEl!.insertBefore(this._tagWrapEl, this._bodyWrapEl!.firstChild);\n }\n\n // -----------------------------------------------------------------------\n // Override select to render tags\n // -----------------------------------------------------------------------\n\n override select(record: any): void {\n if (!record) return;\n const selection = this.getSelection();\n if (selection.includes(record)) return;\n\n this.fire('beforeselect', this, record);\n\n // Add to selection\n (this as any)._selection.push(record);\n this.renderTags();\n this.getInputEl().value = '';\n\n this.fire('select', this, record);\n }\n\n override deselect(record: any): void {\n this.fire('beforedeselect', this, record);\n const sel = (this as any)._selection as any[];\n const idx = sel.indexOf(record);\n if (idx !== -1) {\n sel.splice(idx, 1);\n this.renderTags();\n }\n }\n\n // -----------------------------------------------------------------------\n // Tag rendering\n // -----------------------------------------------------------------------\n\n private renderTags(): void {\n if (!this._tagWrapEl) return;\n this._tagWrapEl.innerHTML = '';\n\n const displayField = (this as any)._displayField;\n for (const rec of this.getSelection()) {\n const tag = document.createElement('span');\n tag.classList.add('x-tagfield-tag');\n\n const text = document.createElement('span');\n text.classList.add('x-tagfield-tag-text');\n text.textContent = rec.get ? rec.get(displayField) : '';\n tag.appendChild(text);\n\n const close = document.createElement('span');\n close.classList.add('x-tagfield-tag-close');\n close.textContent = '×';\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.deselect(rec);\n });\n tag.appendChild(close);\n\n this._tagWrapEl.appendChild(tag);\n }\n }\n\n // -----------------------------------------------------------------------\n // Value override\n // -----------------------------------------------------------------------\n\n override getValue(): any {\n const valueField = (this as any)._valueField;\n return this.getSelection().map(r => r.get ? r.get(valueField) : null);\n }\n}\n","/**\n * @framesquared/form – Checkbox\n *\n * A checkbox field using native <input type=\"checkbox\">.\n * Returns inputValue when checked, uncheckedValue when unchecked.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\n\nexport interface CheckboxConfig extends FieldConfig {\n inputValue?: string;\n uncheckedValue?: string;\n checked?: boolean;\n boxLabel?: string;\n}\n\nexport class Checkbox extends Field {\n static override $className = 'Ext.form.field.Checkbox';\n\n declare protected _inputEl: HTMLInputElement;\n declare protected _checked: boolean;\n declare protected _inputValue: string;\n declare protected _uncheckedValue: string;\n\n constructor(config: CheckboxConfig = {}) {\n super({ xtype: 'checkboxfield', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as CheckboxConfig;\n this._checked = cfg.checked ?? false;\n this._inputValue = cfg.inputValue ?? 'on';\n this._uncheckedValue = cfg.uncheckedValue ?? '';\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as CheckboxConfig;\n this.el!.classList.add('x-checkbox');\n\n // Create checkbox input\n this._inputEl = document.createElement('input');\n this._inputEl.type = 'checkbox';\n this._inputEl.classList.add('x-checkbox-input');\n if (this._name) this._inputEl.name = this._name;\n this._inputEl.checked = this._checked;\n\n this._bodyWrapEl!.appendChild(this._inputEl);\n\n // Box label\n if (cfg.boxLabel) {\n const label = document.createElement('span');\n label.classList.add('x-checkbox-label');\n label.textContent = cfg.boxLabel;\n this._bodyWrapEl!.appendChild(label);\n }\n\n // Change handler\n this._inputEl.addEventListener('change', () => {\n const prev = this._checked;\n this._checked = this._inputEl.checked;\n this.fire('change', this, this.getValue(), prev ? this._inputValue : this._uncheckedValue);\n });\n }\n\n // -----------------------------------------------------------------------\n // Value\n // -----------------------------------------------------------------------\n\n override getValue(): string {\n return this._checked ? this._inputValue : this._uncheckedValue;\n }\n\n isChecked(): boolean {\n return this._checked;\n }\n\n setChecked(checked: boolean): void {\n this._checked = checked;\n if (this._inputEl) this._inputEl.checked = checked;\n this.fire('change', this, this.getValue());\n }\n\n override getSubmitValue(): string {\n return this.getValue();\n }\n}\n","/**\n * @framesquared/form – Radio\n *\n * A radio button field. Uses native <input type=\"radio\"> with\n * group tracking to ensure single selection per name group.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Checkbox } from './Checkbox.js';\nimport type { CheckboxConfig } from './Checkbox.js';\n\n// Module-level radio group registry\nconst radioGroups = new Map<string, Set<Radio>>();\n\nexport class Radio extends Checkbox {\n static override $className = 'Ext.form.field.Radio';\n\n constructor(config: CheckboxConfig = {}) {\n super({ xtype: 'radiofield', ...config });\n }\n\n protected override afterRender(): void {\n super.afterRender();\n\n // Convert to radio\n this._inputEl.type = 'radio';\n this.el!.classList.remove('x-checkbox');\n this.el!.classList.add('x-radio');\n\n // Register in group\n if (this._name) {\n let group = radioGroups.get(this._name);\n if (!group) { group = new Set(); radioGroups.set(this._name, group); }\n group.add(this);\n }\n }\n\n override setChecked(checked: boolean): void {\n if (checked && this._name) {\n // Uncheck other radios in same group\n const group = radioGroups.get(this._name);\n if (group) {\n for (const radio of group) {\n if (radio !== this && radio._checked) {\n radio._checked = false;\n if (radio._inputEl) radio._inputEl.checked = false;\n }\n }\n }\n }\n super.setChecked(checked);\n }\n\n getGroupValue(): string {\n if (this._name) {\n const group = radioGroups.get(this._name);\n if (group) {\n for (const radio of group) {\n if (radio.isChecked()) return radio._inputValue;\n }\n }\n }\n return '';\n }\n\n protected override onDestroy(): void {\n if (this._name) {\n radioGroups.get(this._name)?.delete(this);\n }\n super.onDestroy();\n }\n}\n","/**\n * @framesquared/form – CheckboxGroup\n *\n * A container for Checkbox fields arranged in columns.\n * getValue returns array of checked values.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Container } from '@framesquared/component';\nimport type { ContainerConfig } from '@framesquared/component';\nimport { Checkbox } from './Checkbox.js';\n\nexport interface CheckboxGroupConfig extends ContainerConfig {\n columns?: number;\n vertical?: boolean;\n}\n\nexport class CheckboxGroup extends Container {\n static override $className = 'Ext.form.CheckboxGroup';\n\n constructor(config: CheckboxGroupConfig = {}) {\n super({ xtype: 'checkboxgroup', ...config });\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-checkbox-group');\n\n const cfg = this._config as CheckboxGroupConfig;\n if (cfg.columns) {\n const body = this.getBodyEl();\n body.style.display = 'grid';\n body.style.gridTemplateColumns = `repeat(${cfg.columns}, 1fr)`;\n }\n }\n\n getValue(): string[] {\n return this.getItems()\n .filter((item): item is Checkbox => item instanceof Checkbox && item.isChecked())\n .map(cb => cb.getValue());\n }\n\n setValue(values: string[]): void {\n for (const item of this.getItems()) {\n if (item instanceof Checkbox) {\n item.setChecked(values.includes(item.getValue()) || values.includes((item as any)._inputValue));\n }\n }\n }\n}\n","/**\n * @framesquared/form – RadioGroup\n *\n * A container for Radio fields. Only one radio can be selected\n * at a time (enforced by Radio's group mechanism).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Container } from '@framesquared/component';\nimport type { ContainerConfig } from '@framesquared/component';\nimport { Radio } from './Radio.js';\n\nexport interface RadioGroupConfig extends ContainerConfig {\n columns?: number;\n vertical?: boolean;\n}\n\nexport class RadioGroup extends Container {\n static override $className = 'Ext.form.RadioGroup';\n\n constructor(config: RadioGroupConfig = {}) {\n super({ xtype: 'radiogroup', ...config });\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-radio-group');\n\n const cfg = this._config as RadioGroupConfig;\n if (cfg.columns) {\n const body = this.getBodyEl();\n body.style.display = 'grid';\n body.style.gridTemplateColumns = `repeat(${cfg.columns}, 1fr)`;\n }\n }\n\n getValue(): string {\n for (const item of this.getItems()) {\n if (item instanceof Radio && item.isChecked()) {\n return item.getValue();\n }\n }\n return '';\n }\n\n setValue(value: string): void {\n for (const item of this.getItems()) {\n if (item instanceof Radio) {\n item.setChecked((item as any)._inputValue === value);\n }\n }\n }\n}\n","/**\n * @framesquared/form – FormPanel\n *\n * A Panel that manages form fields. Extends Panel to provide\n * automatic field collection, validation, value management,\n * and submit/load via fetch().\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Panel } from '@framesquared/ui';\nimport type { PanelConfig } from '@framesquared/ui';\nimport { Component } from '@framesquared/component';\nimport { BasicForm } from './form/BasicForm.js';\nimport type { SubmitOptions, SubmitResult } from './form/BasicForm.js';\nimport { Field } from './field/Field.js';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface FormPanelConfig extends PanelConfig {\n url?: string;\n method?: 'GET' | 'POST';\n standardSubmit?: boolean;\n jsonSubmit?: boolean;\n waitMsg?: string;\n trackResetOnLoad?: boolean;\n fieldDefaults?: Record<string, unknown>;\n timeout?: number;\n}\n\n// ---------------------------------------------------------------------------\n// FormPanel\n// ---------------------------------------------------------------------------\n\nexport class FormPanel extends Panel {\n static override $className = 'Ext.form.Panel';\n\n declare private _basicForm: BasicForm;\n declare private _url: string;\n declare private _method: string;\n declare private _jsonSubmit: boolean;\n\n constructor(config: FormPanelConfig = {}) {\n // Apply fieldDefaults to items\n if (config.fieldDefaults && config.items) {\n config.items = (config.items as any[]).map(item => {\n if (item instanceof Component) {\n const cfg = (item as any)._config;\n for (const [k, v] of Object.entries(config.fieldDefaults!)) {\n if (cfg[k] === undefined) cfg[k] = v;\n }\n return item;\n }\n return { ...config.fieldDefaults, ...item };\n });\n }\n super({ xtype: 'form', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as FormPanelConfig;\n this._basicForm = new BasicForm();\n this._url = cfg.url ?? '';\n this._method = cfg.method ?? 'POST';\n this._jsonSubmit = cfg.jsonSubmit ?? false;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-form');\n // Collect fields from children\n this.collectFields();\n }\n\n // -----------------------------------------------------------------------\n // Field collection\n // -----------------------------------------------------------------------\n\n private collectFields(): void {\n this.walkItems(this as any, (item: Component) => {\n if (item instanceof Field) {\n this._basicForm.addField(item);\n }\n });\n }\n\n private walkItems(container: any, fn: (item: Component) => void): void {\n const items = container.getItems?.() ?? [];\n for (const item of items) {\n fn(item);\n if (typeof item.getItems === 'function') {\n this.walkItems(item, fn);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Public API (delegates to BasicForm)\n // -----------------------------------------------------------------------\n\n getValues(asString = false, dirtyOnly = false): Record<string, unknown> | string {\n return this._basicForm.getValues(asString, dirtyOnly);\n }\n\n setValues(values: Record<string, unknown>): void {\n this._basicForm.setValues(values);\n }\n\n isFormValid(): boolean {\n return this._basicForm.isValid();\n }\n\n // Override component's isValid concept\n isValid(): boolean {\n return this._basicForm.isValid();\n }\n\n isDirty(): boolean {\n return this._basicForm.isDirty();\n }\n\n getFields(): Field[] {\n return this._basicForm.getFields();\n }\n\n findField(name: string): Field | undefined {\n return this._basicForm.findField(name);\n }\n\n reset(): void {\n this._basicForm.reset();\n }\n\n clearInvalid(): void {\n this._basicForm.clearInvalid();\n }\n\n markInvalid(errors: { field: string; message: string }[]): void {\n this._basicForm.markInvalid(errors);\n }\n\n hasInvalidField(): boolean {\n return !this._basicForm.isValid();\n }\n\n // -----------------------------------------------------------------------\n // Submit\n // -----------------------------------------------------------------------\n\n async submit(options: SubmitOptions & { clientValidation?: boolean } = {}): Promise<SubmitResult> {\n // Client validation\n if (options.clientValidation !== false && options.clientValidation !== undefined) {\n if (!this.isValid()) {\n return { success: false, errors: 'Validation failed' };\n }\n }\n\n const url = options.url ?? this._url;\n if (!url) return { success: false, errors: 'No URL specified' };\n\n this.fire('beforeaction', this, 'submit');\n\n try {\n const result = await this._basicForm.submit(url, {\n method: options.method ?? this._method,\n params: options.params,\n headers: options.headers,\n jsonSubmit: options.jsonSubmit ?? this._jsonSubmit,\n });\n\n if (result.success) {\n this.fire('actioncomplete', this, result);\n } else {\n this.fire('actionfailed', this, result);\n }\n\n return result;\n } catch (err) {\n const result = { success: false, errors: err };\n this.fire('actionfailed', this, result);\n return result;\n }\n }\n\n // -----------------------------------------------------------------------\n // Load\n // -----------------------------------------------------------------------\n\n async load(options: SubmitOptions = {}): Promise<void> {\n const url = options.url ?? this._url;\n if (!url) return;\n\n this.fire('beforeaction', this, 'load');\n\n try {\n const result = await this._basicForm.load(url, {\n method: options.method ?? 'GET',\n });\n\n if (result.success) {\n this.fire('actioncomplete', this, result);\n } else {\n this.fire('actionfailed', this, result);\n }\n } catch (err) {\n this.fire('actionfailed', this, { success: false, errors: err });\n }\n }\n}\n","/**\n * @framesquared/form – BasicForm\n *\n * Core form logic separated from UI. Manages a collection of\n * Field instances, collects/distributes values, validates,\n * and handles submit/load via fetch().\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Field } from '../field/Field.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SubmitOptions {\n url?: string;\n method?: string;\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n clientValidation?: boolean;\n jsonSubmit?: boolean;\n}\n\nexport interface SubmitResult {\n success: boolean;\n data?: any;\n errors?: any;\n}\n\n// ---------------------------------------------------------------------------\n// BasicForm\n// ---------------------------------------------------------------------------\n\nexport class BasicForm {\n private fields: Field[] = [];\n\n // -----------------------------------------------------------------------\n // Field management\n // -----------------------------------------------------------------------\n\n addField(field: Field): void {\n if (!this.fields.includes(field)) {\n this.fields.push(field);\n }\n }\n\n removeField(field: Field): void {\n const idx = this.fields.indexOf(field);\n if (idx !== -1) this.fields.splice(idx, 1);\n }\n\n getFields(): Field[] {\n return [...this.fields];\n }\n\n findField(name: string): Field | undefined {\n return this.fields.find(f => f.getName() === name);\n }\n\n // -----------------------------------------------------------------------\n // Values\n // -----------------------------------------------------------------------\n\n getValues(asString = false, dirtyOnly = false): Record<string, unknown> | string {\n const values: Record<string, unknown> = {};\n for (const field of this.fields) {\n const name = field.getName();\n if (!name) continue;\n if (dirtyOnly && !field.isDirty()) continue;\n values[name] = field.getSubmitValue?.() ?? field.getValue();\n }\n if (asString) {\n return new URLSearchParams(values as Record<string, string>).toString();\n }\n return values;\n }\n\n setValues(values: Record<string, unknown>): void {\n for (const [key, val] of Object.entries(values)) {\n const field = this.findField(key);\n if (field) field.setValue(val);\n }\n }\n\n // -----------------------------------------------------------------------\n // Validation\n // -----------------------------------------------------------------------\n\n isValid(): boolean {\n return this.fields.every(f => f.isValid());\n }\n\n isDirty(): boolean {\n return this.fields.some(f => f.isDirty());\n }\n\n reset(): void {\n for (const field of this.fields) field.reset();\n }\n\n clearInvalid(): void {\n for (const field of this.fields) field.clearInvalid();\n }\n\n markInvalid(errors: { field: string; message: string }[]): void {\n for (const err of errors) {\n const field = this.findField(err.field);\n if (field) field.markInvalid(err.message);\n }\n }\n\n // -----------------------------------------------------------------------\n // Submit / Load\n // -----------------------------------------------------------------------\n\n async submit(url: string, options: SubmitOptions = {}): Promise<SubmitResult> {\n const method = options.method ?? 'POST';\n const values = this.getValues() as Record<string, unknown>;\n const params = { ...values, ...(options.params ?? {}) };\n\n let body: string;\n const headers: Record<string, string> = { ...(options.headers ?? {}) };\n\n if (options.jsonSubmit) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(params);\n } else {\n headers['Content-Type'] = 'application/x-www-form-urlencoded';\n body = new URLSearchParams(params as Record<string, string>).toString();\n }\n\n const response = await fetch(url, { method, headers, body });\n const data = await response.json();\n\n return {\n success: response.ok && data.success !== false,\n data,\n };\n }\n\n async load(url: string, options: SubmitOptions = {}): Promise<SubmitResult> {\n const method = options.method ?? 'GET';\n const response = await fetch(url, { method });\n const data = await response.json();\n\n if (response.ok && data.data) {\n this.setValues(data.data);\n }\n\n return { success: response.ok, data };\n }\n}\n","/**\n * @framesquared/form – Validators\n *\n * Built-in validator functions and chain runner.\n * Each validator returns `true` on success or an error string on failure.\n */\n\n// ---------------------------------------------------------------------------\n// Individual validators\n// ---------------------------------------------------------------------------\n\nexport function presence(value: unknown): true | string {\n if (value === null || value === undefined || String(value).trim() === '') {\n return 'This field is required';\n }\n return true;\n}\n\nexport function length(value: unknown, opts: { min?: number; max?: number }): true | string {\n const s = String(value ?? '');\n if (opts.min !== undefined && s.length < opts.min) {\n return `Minimum length is ${opts.min}`;\n }\n if (opts.max !== undefined && s.length > opts.max) {\n return `Maximum length is ${opts.max}`;\n }\n return true;\n}\n\nexport function email(value: unknown): true | string {\n if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(String(value))) return true;\n return 'Not a valid email address';\n}\n\nexport function url(value: unknown): true | string {\n if (/^https?:\\/\\/.+/.test(String(value))) return true;\n return 'Not a valid URL';\n}\n\nexport function alpha(value: unknown): true | string {\n if (/^[a-zA-Z]+$/.test(String(value))) return true;\n return 'Only letters are allowed';\n}\n\nexport function alphanum(value: unknown): true | string {\n if (/^[a-zA-Z0-9]+$/.test(String(value))) return true;\n return 'Only letters and numbers are allowed';\n}\n\nexport function range(value: unknown, opts: { min?: number; max?: number }): true | string {\n const n = Number(value);\n if (opts.min !== undefined && n < opts.min) return `Value must be at least ${opts.min}`;\n if (opts.max !== undefined && n > opts.max) return `Value must be at most ${opts.max}`;\n return true;\n}\n\nexport function format(value: unknown, opts: { matcher: RegExp; message?: string }): true | string {\n if (opts.matcher.test(String(value))) return true;\n return opts.message ?? 'Invalid format';\n}\n\nexport function inclusion(value: unknown, opts: { list: unknown[] }): true | string {\n if (opts.list.includes(value)) return true;\n return 'Value is not in the allowed list';\n}\n\nexport function exclusion(value: unknown, opts: { list: unknown[] }): true | string {\n if (!opts.list.includes(value)) return true;\n return 'Value is in the excluded list';\n}\n\nexport function custom(value: unknown, opts: { fn: (v: unknown) => true | string }): true | string {\n return opts.fn(value);\n}\n\n// ---------------------------------------------------------------------------\n// Validator chain\n// ---------------------------------------------------------------------------\n\ninterface ChainEntry {\n type: 'presence' | 'length' | 'email' | 'url' | 'alpha' | 'alphanum' | 'range' | 'format' | 'inclusion' | 'exclusion' | 'custom';\n [key: string]: unknown;\n}\n\nconst VALIDATORS: Record<string, (value: unknown, opts: any) => true | string> = {\n presence: (v) => presence(v),\n length: (v, o) => length(v, o),\n email: (v) => email(v),\n url: (v) => url(v),\n alpha: (v) => alpha(v),\n alphanum: (v) => alphanum(v),\n range: (v, o) => range(v, o),\n format: (v, o) => format(v, o),\n inclusion: (v, o) => inclusion(v, o),\n exclusion: (v, o) => exclusion(v, o),\n custom: (v, o) => custom(v, o),\n};\n\n/**\n * Run a chain of validators against a value.\n * Returns an array of error strings (empty if all pass).\n */\nexport function validateChain(value: unknown, chain: ChainEntry[]): string[] {\n const errors: string[] = [];\n for (const entry of chain) {\n const fn = VALIDATORS[entry.type];\n if (!fn) continue;\n const result = fn(value, entry);\n if (result !== true) {\n errors.push(result);\n }\n }\n return errors;\n}\n","/**\n * @framesquared/form – FieldContainer\n *\n * A Container that groups multiple Field children under a single\n * label. Optionally combines child validation errors.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Container } from '@framesquared/component';\nimport type { ContainerConfig } from '@framesquared/component';\nimport { Field } from './Field.js';\n\nexport interface FieldContainerConfig extends ContainerConfig {\n fieldLabel?: string;\n labelSeparator?: string;\n combineErrors?: boolean;\n}\n\nexport class FieldContainer extends Container {\n static override $className = 'Ext.form.FieldContainer';\n\n constructor(config: FieldContainerConfig = {}) {\n super({ xtype: 'fieldcontainer', ...config });\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as FieldContainerConfig;\n this.el!.classList.add('x-field-container');\n\n // Label\n if (cfg.fieldLabel) {\n const label = document.createElement('label');\n label.classList.add('x-field-label');\n label.textContent = cfg.fieldLabel + (cfg.labelSeparator ?? ':');\n this.el!.insertBefore(label, this.el!.firstChild);\n }\n }\n\n getErrors(): string[] {\n const errors: string[] = [];\n for (const item of this.getItems()) {\n if (item instanceof Field) {\n errors.push(...item.getErrors());\n }\n }\n return errors;\n }\n\n isValid(): boolean {\n return this.getItems()\n .filter((item): item is Field => item instanceof Field)\n .every(f => f.isValid());\n }\n}\n","/**\n * @framesquared/form – Slider\n *\n * A slider field with draggable thumb(s) on a track. Supports\n * min/max, increment snapping, multi-thumb, vertical mode,\n * and full ARIA attributes.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\n\nexport interface SliderConfig extends FieldConfig {\n minValue?: number;\n maxValue?: number;\n increment?: number;\n vertical?: boolean;\n useTips?: boolean;\n values?: number[];\n clickToChange?: boolean;\n animate?: boolean;\n}\n\nexport class Slider extends Field {\n static override $className = 'Ext.slider.Slider';\n\n declare private _min: number;\n declare private _max: number;\n declare private _increment: number;\n declare private _vertical: boolean;\n declare private _values: number[];\n declare private _trackEl: HTMLElement | null;\n declare private _thumbEls: HTMLElement[];\n declare private _dragIndex: number;\n declare private _dragCleanup: (() => void) | null;\n\n constructor(config: SliderConfig = {}) {\n super({ xtype: 'sliderfield', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as SliderConfig;\n this._min = cfg.minValue ?? 0;\n this._max = cfg.maxValue ?? 100;\n this._increment = cfg.increment ?? 0;\n this._vertical = cfg.vertical ?? false;\n this._values = cfg.values\n ? cfg.values.map(v => this.snap(this.clamp(v)))\n : [this.snap(this.clamp(Number(cfg.value ?? this._min)))];\n this._trackEl = null;\n this._thumbEls = [];\n this._dragIndex = -1;\n this._dragCleanup = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const el = this.el!;\n el.classList.add('x-slider');\n if (this._vertical) el.classList.add('x-slider-vertical');\n\n // Track\n this._trackEl = document.createElement('div');\n this._trackEl.classList.add('x-slider-track');\n (this._bodyWrapEl ?? el).appendChild(this._trackEl);\n\n // Thumbs\n for (let i = 0; i < this._values.length; i++) {\n const thumb = document.createElement('div');\n thumb.classList.add('x-slider-thumb');\n thumb.setAttribute('tabindex', '0');\n thumb.setAttribute('role', 'slider');\n thumb.setAttribute('aria-valuemin', String(this._min));\n thumb.setAttribute('aria-valuemax', String(this._max));\n thumb.setAttribute('aria-valuenow', String(this._values[i]));\n this._trackEl.appendChild(thumb);\n this._thumbEls.push(thumb);\n this.setupThumbDrag(thumb, i);\n }\n\n this.positionThumbs();\n }\n\n // -----------------------------------------------------------------------\n // Value\n // -----------------------------------------------------------------------\n\n override getValue(): number {\n return this._values[0];\n }\n\n override setValue(value: unknown): void {\n const num = this.snap(this.clamp(Number(value)));\n const old = this._values[0];\n this._values[0] = num;\n this.positionThumbs();\n this.updateAria(0);\n if (num !== old) {\n this.fire('change', this, num, old);\n }\n }\n\n getValues(): number[] {\n return [...this._values];\n }\n\n // -----------------------------------------------------------------------\n // Constraints\n // -----------------------------------------------------------------------\n\n setMinValue(min: number): void {\n this._min = min;\n this._values = this._values.map(v => this.snap(this.clamp(v)));\n this.positionThumbs();\n this.updateAllAria();\n }\n\n setMaxValue(max: number): void {\n this._max = max;\n this._values = this._values.map(v => this.snap(this.clamp(v)));\n this.positionThumbs();\n this.updateAllAria();\n }\n\n setIncrement(inc: number): void {\n this._increment = inc;\n }\n\n private clamp(v: number): number {\n return Math.max(this._min, Math.min(this._max, v));\n }\n\n private snap(v: number): number {\n if (this._increment <= 0) return v;\n return Math.round(v / this._increment) * this._increment;\n }\n\n // -----------------------------------------------------------------------\n // Positioning\n // -----------------------------------------------------------------------\n\n private positionThumbs(): void {\n for (let i = 0; i < this._thumbEls.length; i++) {\n const pct = ((this._values[i] - this._min) / (this._max - this._min)) * 100;\n if (this._vertical) {\n this._thumbEls[i].style.bottom = `${pct}%`;\n } else {\n this._thumbEls[i].style.left = `${pct}%`;\n }\n }\n }\n\n private updateAria(index: number): void {\n const thumb = this._thumbEls[index];\n if (!thumb) return;\n thumb.setAttribute('aria-valuenow', String(this._values[index]));\n thumb.setAttribute('aria-valuemin', String(this._min));\n thumb.setAttribute('aria-valuemax', String(this._max));\n }\n\n private updateAllAria(): void {\n for (let i = 0; i < this._thumbEls.length; i++) this.updateAria(i);\n }\n\n // -----------------------------------------------------------------------\n // Drag\n // -----------------------------------------------------------------------\n\n private setupThumbDrag(thumb: HTMLElement, index: number): void {\n const onDown = (e: PointerEvent) => {\n e.preventDefault();\n this._dragIndex = index;\n this.fire('dragstart', this, index);\n\n const onMove = (me: PointerEvent) => {\n if (this._dragIndex < 0 || !this._trackEl) return;\n const rect = this._trackEl.getBoundingClientRect();\n let ratio: number;\n if (this._vertical) {\n ratio = 1 - (me.clientY - rect.top) / rect.height;\n } else {\n ratio = (me.clientX - rect.left) / rect.width;\n }\n ratio = Math.max(0, Math.min(1, ratio));\n const raw = this._min + ratio * (this._max - this._min);\n const val = this.snap(this.clamp(raw));\n const old = this._values[this._dragIndex];\n this._values[this._dragIndex] = val;\n this.positionThumbs();\n this.updateAria(this._dragIndex);\n if (val !== old) this.fire('drag', this, val);\n };\n\n const onUp = () => {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n this.fire('dragend', this, this._values[this._dragIndex]);\n this.fire('changecomplete', this, this._values[this._dragIndex]);\n this._dragIndex = -1;\n };\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n };\n\n thumb.addEventListener('pointerdown', onDown);\n }\n}\n","/**\n * @framesquared/form – FileField\n *\n * A file upload field with a hidden <input type=\"file\">,\n * a browse button, and a text display showing selected filename(s).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\n\nexport interface FileFieldConfig extends FieldConfig {\n buttonText?: string;\n buttonOnly?: boolean;\n accept?: string;\n multiple?: boolean;\n}\n\nexport class FileField extends Field {\n static override $className = 'Ext.form.field.File';\n\n declare private _fileInput: HTMLInputElement;\n declare private _textDisplay: HTMLElement;\n declare private _files: FileList | null;\n\n constructor(config: FileFieldConfig = {}) {\n super({ xtype: 'filefield', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n this._files = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as FileFieldConfig;\n this.el!.classList.add('x-filefield');\n\n const wrap = this._bodyWrapEl ?? this.el!;\n\n // Text display\n this._textDisplay = document.createElement('span');\n this._textDisplay.classList.add('x-filefield-text');\n if (cfg.buttonOnly) this._textDisplay.style.display = 'none';\n wrap.appendChild(this._textDisplay);\n\n // Browse button\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.classList.add('x-filefield-btn');\n btn.textContent = cfg.buttonText ?? 'Browse...';\n btn.addEventListener('click', () => this._fileInput.click());\n wrap.appendChild(btn);\n\n // Hidden file input\n this._fileInput = document.createElement('input');\n this._fileInput.type = 'file';\n this._fileInput.style.display = 'none';\n if (cfg.accept) this._fileInput.accept = cfg.accept;\n if (cfg.multiple) this._fileInput.multiple = true;\n if (this._name) this._fileInput.name = this._name;\n\n this._fileInput.addEventListener('change', () => {\n this._files = this._fileInput.files;\n const names = this._files\n ? Array.from(this._files).map(f => f.name).join(', ')\n : '';\n this._textDisplay.textContent = names;\n this.fire('change', this, this._files);\n });\n\n wrap.appendChild(this._fileInput);\n }\n\n override getValue(): FileList | null {\n return this._files;\n }\n\n getFileInput(): HTMLInputElement {\n return this._fileInput;\n }\n}\n","/**\n * @framesquared/form – HtmlEditor\n *\n * Rich text editor using contentEditable. Provides a toolbar with\n * formatting buttons, source edit mode, and XSS sanitization.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Field } from './Field.js';\nimport type { FieldConfig } from './Field.js';\n\nexport interface HtmlEditorConfig extends FieldConfig {\n enableFont?: boolean;\n enableColors?: boolean;\n enableLists?: boolean;\n enableLinks?: boolean;\n enableSourceEdit?: boolean;\n}\n\n// Toolbar button definitions\nconst TOOLBAR_BUTTONS = [\n { cmd: 'bold', label: 'B', cls: 'bold' },\n { cmd: 'italic', label: 'I', cls: 'italic' },\n { cmd: 'underline', label: 'U', cls: 'underline' },\n { cmd: 'strikeThrough', label: 'S', cls: 'strikethrough' },\n { cmd: 'justifyLeft', label: '⇐', cls: 'align-left' },\n { cmd: 'justifyCenter', label: '⇔', cls: 'align-center' },\n { cmd: 'justifyRight', label: '⇒', cls: 'align-right' },\n { cmd: 'insertOrderedList', label: 'OL', cls: 'ordered-list' },\n { cmd: 'insertUnorderedList', label: 'UL', cls: 'unordered-list' },\n { cmd: 'indent', label: '→', cls: 'indent' },\n { cmd: 'outdent', label: '←', cls: 'outdent' },\n { cmd: 'undo', label: '↩', cls: 'undo' },\n { cmd: 'redo', label: '↪', cls: 'redo' },\n];\n\n// Dangerous tags to strip for XSS prevention\nconst XSS_TAGS = /(<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>|<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>|on\\w+=\"[^\"]*\"|on\\w+='[^']*')/gi;\n\nexport class HtmlEditor extends Field {\n static override $className = 'Ext.form.field.HtmlEditor';\n\n declare private _toolbarEl: HTMLElement | null;\n declare private _editorEl: HTMLElement | null;\n declare private _sourceEl: HTMLTextAreaElement | null;\n declare private _sourceMode: boolean;\n\n constructor(config: HtmlEditorConfig = {}) {\n super({ xtype: 'htmleditor', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n this._toolbarEl = null;\n this._editorEl = null;\n this._sourceEl = null;\n this._sourceMode = false;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-htmleditor');\n\n const wrap = this._bodyWrapEl ?? this.el!;\n\n // Toolbar\n this._toolbarEl = document.createElement('div');\n this._toolbarEl.classList.add('x-htmleditor-toolbar');\n\n for (const btn of TOOLBAR_BUTTONS) {\n const el = document.createElement('button');\n el.type = 'button';\n el.classList.add('x-htmleditor-btn', `x-htmleditor-btn-${btn.cls}`);\n el.textContent = btn.label;\n el.title = btn.cmd;\n el.addEventListener('click', (e) => {\n e.preventDefault();\n this.execCommand(btn.cmd);\n });\n this._toolbarEl.appendChild(el);\n }\n\n // Source edit toggle\n const srcBtn = document.createElement('button');\n srcBtn.type = 'button';\n srcBtn.classList.add('x-htmleditor-btn', 'x-htmleditor-btn-source');\n srcBtn.textContent = 'HTML';\n srcBtn.addEventListener('click', () => this.toggleSourceEdit());\n this._toolbarEl.appendChild(srcBtn);\n\n wrap.appendChild(this._toolbarEl);\n\n // Editor area (contenteditable)\n this._editorEl = document.createElement('div');\n this._editorEl.classList.add('x-htmleditor-body');\n this._editorEl.contentEditable = 'true';\n this._editorEl.style.minHeight = '100px';\n\n if (this._value) {\n this._editorEl.innerHTML = this.sanitize(String(this._value));\n }\n\n this._editorEl.addEventListener('input', () => {\n this.fire('change', this, this.getValue());\n });\n\n wrap.appendChild(this._editorEl);\n\n // Source textarea (hidden by default)\n this._sourceEl = document.createElement('textarea');\n this._sourceEl.classList.add('x-htmleditor-source');\n this._sourceEl.style.display = 'none';\n this._sourceEl.style.width = '100%';\n this._sourceEl.style.minHeight = '100px';\n wrap.appendChild(this._sourceEl);\n }\n\n // -----------------------------------------------------------------------\n // Value\n // -----------------------------------------------------------------------\n\n override getValue(): string {\n if (this._sourceMode && this._sourceEl) {\n return this.sanitize(this._sourceEl.value);\n }\n return this._editorEl ? this.sanitize(this._editorEl.innerHTML) : '';\n }\n\n override setValue(value: unknown): void {\n const html = this.sanitize(String(value ?? ''));\n this._value = html;\n if (this._editorEl) this._editorEl.innerHTML = html;\n if (this._sourceEl) this._sourceEl.value = html;\n }\n\n // -----------------------------------------------------------------------\n // Commands\n // -----------------------------------------------------------------------\n\n execCommand(cmd: string, value?: string): void {\n if (this._sourceMode) return;\n try {\n document.execCommand(cmd, false, value ?? '');\n } catch {\n // execCommand may not be supported in test environment\n }\n this._editorEl?.focus();\n }\n\n // -----------------------------------------------------------------------\n // Source edit\n // -----------------------------------------------------------------------\n\n toggleSourceEdit(): void {\n this._sourceMode = !this._sourceMode;\n\n if (this._sourceMode) {\n // Switch to source\n if (this._sourceEl && this._editorEl) {\n this._sourceEl.value = this._editorEl.innerHTML;\n this._editorEl.style.display = 'none';\n this._sourceEl.style.display = '';\n }\n } else {\n // Switch to WYSIWYG\n if (this._sourceEl && this._editorEl) {\n this._editorEl.innerHTML = this.sanitize(this._sourceEl.value);\n this._sourceEl.style.display = 'none';\n this._editorEl.style.display = '';\n }\n }\n }\n\n isSourceEdit(): boolean {\n return this._sourceMode;\n }\n\n // -----------------------------------------------------------------------\n // Sanitize\n // -----------------------------------------------------------------------\n\n private sanitize(html: string): string {\n return html.replace(XSS_TAGS, '');\n }\n}\n","/**\n * @framesquared/form – Spinner\n *\n * Abstract base for fields with up/down spin behavior.\n * Extends TextField with spinner triggers and ArrowUp/ArrowDown keyboard.\n * Subclasses implement onSpinUp() and onSpinDown().\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { TextField } from './Text.js';\nimport type { TextFieldConfig } from './Text.js';\n\nexport interface SpinnerConfig extends TextFieldConfig {}\n\nexport abstract class Spinner extends TextField {\n static override $className = 'Ext.form.field.Spinner';\n\n constructor(config: SpinnerConfig = {}) {\n const triggers = [\n { type: 'spinner-up', handler: () => this.spinUp() },\n { type: 'spinner-down', handler: () => this.spinDown() },\n ...(config.triggers ?? []),\n ];\n super({ xtype: 'spinnerfield', ...config, triggers });\n }\n\n protected override afterRender(): void {\n super.afterRender();\n this.el!.classList.add('x-spinner');\n\n // Keyboard up/down\n this.getInputEl().addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.spinUp();\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.spinDown();\n }\n });\n }\n\n spinUp(): void {\n this.onSpinUp();\n this.fire('spin', this, 'up');\n }\n\n spinDown(): void {\n this.onSpinDown();\n this.fire('spin', this, 'down');\n }\n\n protected abstract onSpinUp(): void;\n protected abstract onSpinDown(): void;\n}\n"],"mappings":"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","names":["format","Component","Component","Component","Component","listEl","Container","Container","Component","url","Component","url","Container","Container"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@framesquared/form",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Form fields and validation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@framesquared/core": "0.1.0",
|
|
19
|
+
"@framesquared/component": "0.1.0",
|
|
20
|
+
"@framesquared/ui": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"clean": "rm -rf dist",
|
|
26
|
+
"typecheck": "tsc --noEmit --project tsconfig.build.json"
|
|
27
|
+
}
|
|
28
|
+
}
|