@tachui/forms 0.8.1-alpha → 0.8.5-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DatePicker-D5nRFTUm.js +0 -1
- package/dist/Select-yZyKooXk.js +0 -1
- package/dist/Slider-0-oal5YR.js +0 -1
- package/dist/TextField-hX15dY3U.js +0 -1
- package/dist/components/advanced/index.js +0 -1
- package/dist/components/date-picker/index.js +0 -1
- package/dist/components/selection/index.js +0 -1
- package/dist/components/text-input/index.js +0 -1
- package/dist/index-D3WfkqVv.js +0 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -17
- package/dist/modifiers/index.d.ts +11 -0
- package/dist/modifiers/index.d.ts.map +1 -0
- package/dist/modifiers/index.js +162 -0
- package/dist/modifiers/placeholder.d.ts +8 -0
- package/dist/modifiers/placeholder.d.ts.map +1 -0
- package/dist/modifiers/required.d.ts +10 -0
- package/dist/modifiers/required.d.ts.map +1 -0
- package/dist/modifiers/validation.d.ts +8 -0
- package/dist/modifiers/validation.d.ts.map +1 -0
- package/dist/validation/index.js +0 -1
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +12 -3
- package/src/index.ts +8 -0
- package/src/modifiers/index.ts +70 -0
- package/src/modifiers/placeholder.ts +95 -0
- package/src/modifiers/required.ts +105 -0
- package/src/modifiers/validation.ts +138 -0
- package/src/version.ts +10 -0
- package/dist/DatePicker-D5nRFTUm.js.map +0 -1
- package/dist/Select-yZyKooXk.js.map +0 -1
- package/dist/Slider-0-oal5YR.js.map +0 -1
- package/dist/TextField-hX15dY3U.js.map +0 -1
- package/dist/components/advanced/index.js.map +0 -1
- package/dist/components/date-picker/index.js.map +0 -1
- package/dist/components/selection/index.js.map +0 -1
- package/dist/components/text-input/index.js.map +0 -1
- package/dist/index-D3WfkqVv.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/validation/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Slider-0-oal5YR.js","sources":["../src/components/advanced/Stepper.ts","../src/components/advanced/Slider.ts"],"sourcesContent":["/**\n * Stepper Component (TachUI)\n *\n * SwiftUI-inspired stepper component for numeric input with increment/decrement controls.\n * Provides bounded value adjustment with customizable step intervals and formatting.\n */\n\nimport type { ModifiableComponent, ModifierBuilder } from '@tachui/core'\nimport { createEffect, getSignalImpl, isSignal } from '@tachui/core'\nimport type { Signal } from '@tachui/core'\nimport { h } from '@tachui/core'\nimport type { ComponentInstance, ComponentProps, DOMNode } from '@tachui/core'\nimport { withModifiers } from '@tachui/core'\n\n/**\n * Stepper value types - supports integers and floating point numbers\n */\nexport type StepperValue = number\n\n/**\n * Stepper component properties\n */\nexport interface StepperProps extends ComponentProps {\n // Core properties\n title?: string\n value: Signal<StepperValue> | StepperValue\n\n // Range and stepping\n minimumValue?: StepperValue\n maximumValue?: StepperValue\n step?: StepperValue\n\n // Custom actions (alternative to value binding)\n onIncrement?: () => void\n onDecrement?: () => void\n\n // Event handling\n onChange?: (value: StepperValue) => void\n onEditingChanged?: (editing: boolean) => void\n\n // Behavior\n disabled?: boolean | Signal<boolean>\n allowsEmptyValue?: boolean\n\n // Formatting\n valueFormatter?: (value: StepperValue) => string\n displayValueInLabel?: boolean\n\n // Accessibility\n accessibilityLabel?: string\n accessibilityHint?: string\n incrementAccessibilityLabel?: string\n decrementAccessibilityLabel?: string\n}\n\n/**\n * Stepper theme configuration\n */\nexport interface StepperTheme {\n colors: {\n background: string\n border: string\n buttonBackground: string\n buttonHover: string\n buttonPress: string\n buttonDisabled: string\n text: string\n buttonText: string\n disabledText: string\n focusRing: string\n }\n spacing: {\n padding: number\n gap: number\n borderRadius: number\n buttonSize: number\n }\n typography: {\n labelSize: number\n buttonSize: number\n labelWeight: string\n buttonWeight: string\n fontFamily: string\n }\n transitions: {\n duration: number\n easing: string\n }\n}\n\n/**\n * Default Stepper theme\n */\nconst defaultStepperTheme: StepperTheme = {\n colors: {\n background: '#FFFFFF',\n border: '#D1D1D6',\n buttonBackground: '#F2F2F7',\n buttonHover: '#E5E5EA',\n buttonPress: '#D1D1D6',\n buttonDisabled: '#F2F2F7',\n text: '#000000',\n buttonText: '#007AFF',\n disabledText: '#8E8E93',\n focusRing: '#007AFF',\n },\n spacing: {\n padding: 12,\n gap: 8,\n borderRadius: 8,\n buttonSize: 32,\n },\n typography: {\n labelSize: 16,\n buttonSize: 18,\n labelWeight: '400',\n buttonWeight: '600',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n },\n transitions: {\n duration: 150,\n easing: 'cubic-bezier(0.2, 0.8, 0.2, 1)',\n },\n}\n\n/**\n * Stepper component implementation\n */\nexport class StepperComponent implements ComponentInstance<StepperProps> {\n public readonly type = 'component' as const\n public readonly id: string\n public readonly props: StepperProps\n private theme: StepperTheme = defaultStepperTheme\n private incrementButton: HTMLElement | null = null\n private decrementButton: HTMLElement | null = null\n private isEditing = false\n private longPressTimer: ReturnType<typeof setTimeout> | null = null\n private longPressInterval: ReturnType<typeof setInterval> | null = null\n\n constructor(props: StepperProps) {\n this.props = props\n this.id = `stepper-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n private resolveValue<T>(value: T | Signal<T>): T {\n return isSignal(value) ? value() : value\n }\n\n private getValue(): StepperValue {\n return this.resolveValue(this.props.value)\n }\n\n private setValue(newValue: StepperValue): void {\n const constrainedValue = this.constrainValue(newValue)\n\n if (isSignal(this.props.value)) {\n const signalImpl = getSignalImpl(this.props.value as any)\n if (signalImpl) {\n signalImpl.set(constrainedValue)\n }\n }\n\n if (this.props.onChange) {\n this.props.onChange(constrainedValue)\n }\n }\n\n private getMinimumValue(): StepperValue {\n return this.props.minimumValue ?? -Infinity\n }\n\n private getMaximumValue(): StepperValue {\n return this.props.maximumValue ?? Infinity\n }\n\n private getStep(): StepperValue {\n return this.props.step ?? 1\n }\n\n private isDisabled(): boolean {\n return this.resolveValue(this.props.disabled ?? false)\n }\n\n private constrainValue(value: StepperValue): StepperValue {\n const min = this.getMinimumValue()\n const max = this.getMaximumValue()\n return Math.min(Math.max(value, min), max)\n }\n\n private canIncrement(): boolean {\n if (this.isDisabled()) return false\n const currentValue = this.getValue()\n const maxValue = this.getMaximumValue()\n return currentValue < maxValue\n }\n\n private canDecrement(): boolean {\n if (this.isDisabled()) return false\n const currentValue = this.getValue()\n const minValue = this.getMinimumValue()\n return currentValue > minValue\n }\n\n private increment(): void {\n if (!this.canIncrement()) return\n\n if (this.props.onIncrement) {\n this.props.onIncrement()\n } else {\n const currentValue = this.getValue()\n const step = this.getStep()\n this.setValue(currentValue + step)\n }\n }\n\n private decrement(): void {\n if (!this.canDecrement()) return\n\n if (this.props.onDecrement) {\n this.props.onDecrement()\n } else {\n const currentValue = this.getValue()\n const step = this.getStep()\n this.setValue(currentValue - step)\n }\n }\n\n private formatValue(value: StepperValue): string {\n if (this.props.valueFormatter) {\n return this.props.valueFormatter(value)\n }\n\n // Default formatting with appropriate decimal places\n if (Number.isInteger(value)) {\n return value.toString()\n } else {\n // For decimal values, show up to 2 decimal places, removing trailing zeros\n return parseFloat(value.toFixed(2)).toString()\n }\n }\n\n private startLongPress(action: () => void): void {\n this.stopLongPress()\n this.setEditing(true)\n\n // Initial delay before starting continuous increment\n this.longPressTimer = setTimeout(() => {\n // Start continuous increment/decrement\n this.longPressInterval = setInterval(() => {\n action()\n }, 100) // 100ms interval for smooth continuous changes\n }, 500) // 500ms initial delay\n }\n\n private stopLongPress(): void {\n if (this.longPressTimer) {\n clearTimeout(this.longPressTimer)\n this.longPressTimer = null\n }\n\n if (this.longPressInterval) {\n clearInterval(this.longPressInterval)\n this.longPressInterval = null\n }\n\n this.setEditing(false)\n }\n\n private setEditing(editing: boolean): void {\n if (this.isEditing !== editing) {\n this.isEditing = editing\n if (this.props.onEditingChanged) {\n this.props.onEditingChanged(editing)\n }\n }\n }\n\n private createButton(\n type: 'increment' | 'decrement',\n symbol: string,\n action: () => void,\n canPerformAction: boolean\n ): DOMNode {\n const button = h('button', {\n type: 'button',\n disabled: !canPerformAction,\n 'aria-label':\n type === 'increment'\n ? this.props.incrementAccessibilityLabel || 'Increment'\n : this.props.decrementAccessibilityLabel || 'Decrement',\n style: {\n width: `${this.theme.spacing.buttonSize}px`,\n height: `${this.theme.spacing.buttonSize}px`,\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.spacing.borderRadius}px`,\n backgroundColor: canPerformAction\n ? this.theme.colors.buttonBackground\n : this.theme.colors.buttonDisabled,\n color: canPerformAction\n ? this.theme.colors.buttonText\n : this.theme.colors.disabledText,\n fontSize: `${this.theme.typography.buttonSize}px`,\n fontWeight: this.theme.typography.buttonWeight,\n fontFamily: this.theme.typography.fontFamily,\n cursor: canPerformAction ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n userSelect: 'none',\n outline: 'none',\n transition: `all ${this.theme.transitions.duration}ms ${this.theme.transitions.easing}`,\n touchAction: 'manipulation', // Prevent double-tap zoom on mobile\n },\n onclick: (e: Event) => {\n e.preventDefault()\n if (canPerformAction) {\n action()\n }\n },\n onmousedown: (e: Event) => {\n e.preventDefault()\n if (canPerformAction) {\n this.startLongPress(action)\n }\n },\n onmouseup: () => {\n this.stopLongPress()\n },\n ontouchstart: (e: Event) => {\n e.preventDefault()\n if (canPerformAction) {\n this.startLongPress(action)\n }\n },\n ontouchend: (e: Event) => {\n e.preventDefault()\n this.stopLongPress()\n },\n onmouseenter: (e: Event) => {\n if (canPerformAction) {\n const target = e.target as HTMLElement\n target.style.backgroundColor = this.theme.colors.buttonHover\n }\n },\n onmouseleave: (e: Event) => {\n const target = e.target as HTMLElement\n target.style.backgroundColor = canPerformAction\n ? this.theme.colors.buttonBackground\n : this.theme.colors.buttonDisabled\n this.stopLongPress()\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (canPerformAction) {\n action()\n }\n }\n },\n onfocus: (e: Event) => {\n const target = e.target as HTMLElement\n target.style.boxShadow = `0 0 0 2px ${this.theme.colors.focusRing}40`\n },\n onblur: (e: Event) => {\n const target = e.target as HTMLElement\n target.style.boxShadow = 'none'\n this.stopLongPress()\n },\n })\n\n const buttonDOM = button.element as HTMLElement\n if (buttonDOM) {\n buttonDOM.textContent = symbol\n buttonDOM.setAttribute('tabindex', '0')\n\n if (type === 'increment') {\n this.incrementButton = buttonDOM\n } else {\n this.decrementButton = buttonDOM\n }\n }\n\n return button\n }\n\n private createLabel(): DOMNode {\n const currentValue = this.getValue()\n const formattedValue = this.formatValue(currentValue)\n\n let labelText = this.props.title || ''\n if (this.props.displayValueInLabel !== false && this.props.title) {\n labelText = `${this.props.title}: ${formattedValue}`\n } else if (!this.props.title && this.props.displayValueInLabel !== false) {\n labelText = formattedValue\n }\n\n const label = h('span', {\n style: {\n fontSize: `${this.theme.typography.labelSize}px`,\n fontWeight: this.theme.typography.labelWeight,\n fontFamily: this.theme.typography.fontFamily,\n color: this.isDisabled()\n ? this.theme.colors.disabledText\n : this.theme.colors.text,\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n minHeight: `${this.theme.spacing.buttonSize}px`,\n },\n })\n\n const labelDOM = label.element as HTMLElement\n if (labelDOM) {\n labelDOM.textContent = labelText\n }\n\n return label\n }\n\n render(): DOMNode {\n const container = h('div', {\n id: this.id,\n 'data-component': 'stepper',\n role: 'group',\n 'aria-label':\n this.props.accessibilityLabel || this.props.title || 'Numeric stepper',\n 'aria-describedby': this.props.accessibilityHint\n ? `${this.id}-hint`\n : undefined,\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: `${this.theme.spacing.gap}px`,\n padding: `${this.theme.spacing.padding}px`,\n backgroundColor: this.theme.colors.background,\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.spacing.borderRadius}px`,\n fontFamily: this.theme.typography.fontFamily,\n },\n })\n\n // Create components\n const decrementButton = this.createButton(\n 'decrement',\n '−', // Using minus sign (U+2212) instead of hyphen for better visual appearance\n () => this.decrement(),\n this.canDecrement()\n )\n\n const label = this.createLabel()\n\n const incrementButton = this.createButton(\n 'increment',\n '+',\n () => this.increment(),\n this.canIncrement()\n )\n\n // Assemble container\n const containerDOM = container.element as HTMLElement\n if (containerDOM) {\n const decrementDOM = decrementButton.element as HTMLElement\n const labelDOM = label.element as HTMLElement\n const incrementDOM = incrementButton.element as HTMLElement\n\n if (decrementDOM) containerDOM.appendChild(decrementDOM)\n if (labelDOM) containerDOM.appendChild(labelDOM)\n if (incrementDOM) containerDOM.appendChild(incrementDOM)\n\n // Add accessibility hint if provided\n if (this.props.accessibilityHint) {\n const hint = h('span', {\n id: `${this.id}-hint`,\n style: {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: '0',\n },\n })\n\n const hintDOM = hint.element as HTMLElement\n if (hintDOM) {\n hintDOM.textContent = this.props.accessibilityHint\n containerDOM.appendChild(hintDOM)\n }\n }\n }\n\n // Set up reactive effects for value changes\n createEffect(() => {\n // Update button states when value changes\n if (this.incrementButton) {\n const canInc: boolean = this.canIncrement()\n ;(this.incrementButton as any).disabled = !canInc\n this.incrementButton.style.backgroundColor = canInc\n ? this.theme.colors.buttonBackground\n : this.theme.colors.buttonDisabled\n this.incrementButton.style.color = canInc\n ? this.theme.colors.buttonText\n : this.theme.colors.disabledText\n this.incrementButton.style.cursor = canInc ? 'pointer' : 'not-allowed'\n }\n\n if (this.decrementButton) {\n const canDec: boolean = this.canDecrement()\n ;(this.decrementButton as any).disabled = !canDec\n this.decrementButton.style.backgroundColor = canDec\n ? this.theme.colors.buttonBackground\n : this.theme.colors.buttonDisabled\n this.decrementButton.style.color = canDec\n ? this.theme.colors.buttonText\n : this.theme.colors.disabledText\n this.decrementButton.style.cursor = canDec ? 'pointer' : 'not-allowed'\n }\n\n // Update label text\n const labelElement = containerDOM?.querySelector(\n 'span:not([id$=\"-hint\"])'\n ) as HTMLElement\n if (labelElement) {\n const currentValue = this.getValue()\n const formattedValue = this.formatValue(currentValue)\n\n let labelText = this.props.title || ''\n if (this.props.displayValueInLabel !== false && this.props.title) {\n labelText = `${this.props.title}: ${formattedValue}`\n } else if (\n !this.props.title &&\n this.props.displayValueInLabel !== false\n ) {\n labelText = formattedValue\n }\n\n labelElement.textContent = labelText\n labelElement.style.color = this.isDisabled()\n ? this.theme.colors.disabledText\n : this.theme.colors.text\n }\n })\n\n return container\n }\n}\n\n/**\n * Create a Stepper component\n */\nexport function Stepper(\n props: StepperProps\n): ModifiableComponent<StepperProps> & {\n modifier: ModifierBuilder<ModifiableComponent<StepperProps>>\n} {\n return withModifiers(new StepperComponent(props))\n}\n\n/**\n * Stepper utility functions and presets\n */\nexport const StepperUtils = {\n /**\n * Create a quantity stepper (1-99, integer values)\n */\n quantity(\n value: Signal<number>,\n onChange?: (value: number) => void\n ): Omit<StepperProps, 'value'> & { value: Signal<number> } {\n return {\n title: 'Quantity',\n value,\n minimumValue: 1,\n maximumValue: 99,\n step: 1,\n onChange,\n displayValueInLabel: true,\n accessibilityLabel: 'Product quantity',\n incrementAccessibilityLabel: 'Increase quantity',\n decrementAccessibilityLabel: 'Decrease quantity',\n }\n },\n\n /**\n * Create an age stepper (0-120, integer values)\n */\n age(\n value: Signal<number>,\n onChange?: (value: number) => void\n ): Omit<StepperProps, 'value'> & { value: Signal<number> } {\n return {\n title: 'Age',\n value,\n minimumValue: 0,\n maximumValue: 120,\n step: 1,\n onChange,\n displayValueInLabel: true,\n accessibilityLabel: 'Age in years',\n incrementAccessibilityLabel: 'Increase age',\n decrementAccessibilityLabel: 'Decrease age',\n }\n },\n\n /**\n * Create a percentage stepper (0-100%, integer values)\n */\n percentage(\n value: Signal<number>,\n onChange?: (value: number) => void\n ): Omit<StepperProps, 'value'> & { value: Signal<number> } {\n return {\n title: 'Percentage',\n value,\n minimumValue: 0,\n maximumValue: 100,\n step: 1,\n onChange,\n displayValueInLabel: true,\n valueFormatter: (val: number) => `${val}%`,\n accessibilityLabel: 'Percentage value',\n incrementAccessibilityLabel: 'Increase percentage',\n decrementAccessibilityLabel: 'Decrease percentage',\n }\n },\n\n /**\n * Create a rating stepper (1-5 or 1-10, decimal values allowed)\n */\n rating(\n value: Signal<number>,\n maxRating: number = 5,\n step: number = 0.5,\n onChange?: (value: number) => void\n ): Omit<StepperProps, 'value'> & { value: Signal<number> } {\n return {\n title: 'Rating',\n value,\n minimumValue: 0,\n maximumValue: maxRating,\n step,\n onChange,\n displayValueInLabel: true,\n valueFormatter: (val: number) => `${val}/${maxRating}`,\n accessibilityLabel: `Rating out of ${maxRating}`,\n incrementAccessibilityLabel: 'Increase rating',\n decrementAccessibilityLabel: 'Decrease rating',\n }\n },\n\n /**\n * Create a price stepper (0+, decimal values with currency formatting)\n */\n price(\n value: Signal<number>,\n currency: string = '$',\n step: number = 0.01,\n maxValue?: number,\n onChange?: (value: number) => void\n ): Omit<StepperProps, 'value'> & { value: Signal<number> } {\n return {\n title: 'Price',\n value,\n minimumValue: 0,\n maximumValue: maxValue,\n step,\n onChange,\n displayValueInLabel: true,\n valueFormatter: (val: number) => `${currency}${val.toFixed(2)}`,\n accessibilityLabel: 'Price amount',\n incrementAccessibilityLabel: 'Increase price',\n decrementAccessibilityLabel: 'Decrease price',\n }\n },\n\n /**\n * Create a font size stepper (8-72pt, integer values)\n */\n fontSize(\n value: Signal<number>,\n onChange?: (value: number) => void\n ): Omit<StepperProps, 'value'> & { value: Signal<number> } {\n return {\n title: 'Font Size',\n value,\n minimumValue: 8,\n maximumValue: 72,\n step: 1,\n onChange,\n displayValueInLabel: true,\n valueFormatter: (val: number) => `${val}pt`,\n accessibilityLabel: 'Font size in points',\n incrementAccessibilityLabel: 'Increase font size',\n decrementAccessibilityLabel: 'Decrease font size',\n }\n },\n}\n\n/**\n * Stepper styles and theming\n */\nexport const StepperStyles = {\n theme: defaultStepperTheme,\n\n /**\n * Create a custom theme\n */\n createTheme(overrides: Partial<StepperTheme>): StepperTheme {\n return { ...defaultStepperTheme, ...overrides }\n },\n}\n","/**\n * Enhanced Slider Component (Phase 6.4.4)\n *\n * SwiftUI-inspired Slider component with range selection, formatting,\n * and precise value control for numeric input.\n */\n\nimport type { ModifiableComponent, ModifierBuilder } from '@tachui/core'\nimport { createEffect, createSignal, isSignal } from '@tachui/core'\nimport type { Signal } from '@tachui/core'\nimport { h, text } from '@tachui/core'\nimport type { ComponentInstance, ComponentProps } from '@tachui/core'\nimport { withModifiers } from '@tachui/core'\n\n/**\n * Slider component properties\n */\nexport interface SliderProps extends ComponentProps {\n // Value binding\n value: number | Signal<number>\n onValueChange?: (value: number) => void\n\n // Range\n min?: number\n max?: number\n step?: number\n\n // Formatting\n formatter?: (value: number) => string\n minimumValueLabel?: string\n maximumValueLabel?: string\n\n // Appearance\n variant?: 'default' | 'filled' | 'minimal'\n trackColor?: string\n thumbColor?: string\n activeTrackColor?: string\n size?: 'small' | 'medium' | 'large'\n\n // Behavior\n disabled?: boolean | Signal<boolean>\n showValue?: boolean\n showLabels?: boolean\n\n // Advanced features\n marks?: SliderMark[]\n range?: boolean\n vertical?: boolean\n\n // Accessibility\n accessibilityLabel?: string\n accessibilityHint?: string\n accessibilityValueDescription?: (value: number) => string\n}\n\n/**\n * Slider mark configuration\n */\nexport interface SliderMark {\n value: number\n label?: string\n color?: string\n}\n\n/**\n * Enhanced Slider component class\n */\nexport class EnhancedSlider implements ComponentInstance<SliderProps> {\n public readonly type = 'component' as const\n public readonly id: string\n public mounted = false\n public cleanup: (() => void)[] = []\n private sliderElement: HTMLInputElement | null = null\n private isDragging: () => boolean\n private setIsDragging: (dragging: boolean) => boolean\n\n constructor(public props: SliderProps) {\n this.id = `slider-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n // Initialize internal state\n const [dragging, setDragging] = createSignal(false)\n this.isDragging = dragging\n this.setIsDragging = setDragging\n\n // Handle value changes reactively\n createEffect(() => {\n const currentValue = this.getValue()\n if (this.sliderElement && !this.isDragging()) {\n this.sliderElement.value = String(currentValue)\n this.updateTrackFill()\n }\n })\n }\n\n /**\n * Get current value\n */\n private getValue(): number {\n const { value } = this.props\n if (isSignal(value)) {\n return (value as () => number)()\n }\n return value as number\n }\n\n /**\n * Check if slider is disabled\n */\n private isDisabled(): boolean {\n const { disabled } = this.props\n if (typeof disabled === 'boolean') return disabled\n if (isSignal(disabled)) return (disabled as () => boolean)()\n return false\n }\n\n /**\n * Format value for display\n */\n private formatValue(value: number): string {\n const { formatter } = this.props\n if (formatter) {\n return formatter(value)\n }\n\n // Default formatting based on step\n const step = this.props.step || 1\n if (step < 1) {\n const decimals = String(step).split('.')[1]?.length || 0\n return value.toFixed(decimals)\n }\n\n return String(Math.round(value))\n }\n\n /**\n * Handle value change\n */\n private handleValueChange = (newValue: number) => {\n const { min = 0, max = 100, step = 1 } = this.props\n\n // Clamp value to range\n let clampedValue = Math.max(min, Math.min(max, newValue))\n\n // Snap to step\n if (step > 0) {\n clampedValue = Math.round((clampedValue - min) / step) * step + min\n }\n\n // Update value\n if (this.props.onValueChange) {\n this.props.onValueChange(clampedValue)\n }\n\n this.updateTrackFill()\n }\n\n /**\n * Update track fill visual\n */\n private updateTrackFill() {\n if (!this.sliderElement) return\n\n const { min = 0, max = 100 } = this.props\n const value = this.getValue()\n const percentage = ((value - min) / (max - min)) * 100\n\n // Update CSS custom property for track fill\n this.sliderElement.style.setProperty('--slider-progress', `${percentage}%`)\n }\n\n /**\n * Handle input events\n */\n private handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n const value = parseFloat(target.value)\n\n if (!Number.isNaN(value)) {\n this.handleValueChange(value)\n }\n }\n\n /**\n * Handle mouse/touch start\n */\n private handleStart = () => {\n if (!this.isDisabled()) {\n this.setIsDragging(true)\n }\n }\n\n /**\n * Handle mouse/touch end\n */\n private handleEnd = () => {\n this.setIsDragging(false)\n }\n\n /**\n * Get slider size styles\n */\n private getSizeStyles() {\n const { size = 'medium' } = this.props\n\n switch (size) {\n case 'small':\n return {\n height: '4px',\n thumbSize: '16px',\n }\n case 'large':\n return {\n height: '8px',\n thumbSize: '24px',\n }\n default:\n return {\n height: '6px',\n thumbSize: '20px',\n }\n }\n }\n\n /**\n * Get slider variant styles\n */\n private getVariantStyles() {\n const {\n variant = 'default',\n trackColor = '#e2e8f0',\n activeTrackColor = '#007AFF',\n thumbColor = '#ffffff',\n } = this.props\n const sizeStyles = this.getSizeStyles()\n\n const baseStyles = {\n '--slider-track-color': trackColor,\n '--slider-active-track-color': activeTrackColor,\n '--slider-thumb-color': thumbColor,\n '--slider-height': sizeStyles.height,\n '--slider-thumb-size': sizeStyles.thumbSize,\n }\n\n switch (variant) {\n case 'filled':\n return {\n ...baseStyles,\n '--slider-track-color': '#f1f5f9',\n '--slider-active-track-color': activeTrackColor,\n backgroundColor: '#f8fafc',\n borderRadius: '12px',\n padding: '8px',\n }\n\n case 'minimal':\n return {\n ...baseStyles,\n '--slider-track-color': 'transparent',\n '--slider-active-track-color': activeTrackColor,\n border: `1px solid ${trackColor}`,\n }\n default:\n return baseStyles\n }\n }\n\n /**\n * Render slider marks\n */\n private renderMarks() {\n const { marks, min = 0, max = 100 } = this.props\n\n if (!marks || marks.length === 0) {\n return []\n }\n\n return marks.map(mark => {\n const percentage = ((mark.value - min) / (max - min)) * 100\n\n return h(\n 'div',\n {\n key: String(mark.value),\n style: {\n position: 'absolute',\n left: `${percentage}%`,\n top: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n pointerEvents: 'none',\n },\n },\n // Mark indicator\n h('div', {\n style: {\n width: '2px',\n height: '12px',\n backgroundColor: mark.color || '#666',\n marginBottom: '4px',\n },\n }),\n\n // Mark label\n ...(mark.label\n ? [\n h(\n 'span',\n {\n style: {\n fontSize: '12px',\n color: '#666',\n whiteSpace: 'nowrap',\n },\n },\n text(mark.label)\n ),\n ]\n : [])\n )\n })\n }\n\n /**\n * Render value labels\n */\n private renderLabels() {\n const {\n showLabels,\n min = 0,\n max = 100,\n minimumValueLabel,\n maximumValueLabel,\n } = this.props\n\n if (!showLabels) return []\n\n return [\n h(\n 'div',\n {\n style: {\n display: 'flex',\n justifyContent: 'space-between',\n marginTop: '8px',\n fontSize: '12px',\n color: '#666',\n },\n },\n h('span', {}, text(minimumValueLabel || this.formatValue(min))),\n h('span', {}, text(maximumValueLabel || this.formatValue(max)))\n ),\n ]\n }\n\n /**\n * Render value display\n */\n private renderValueDisplay() {\n const { showValue } = this.props\n\n if (!showValue) return []\n\n const currentValue = this.getValue()\n\n return [\n h(\n 'div',\n {\n style: {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: '8px',\n fontSize: '14px',\n fontWeight: '600',\n color: '#1a1a1a',\n },\n },\n text(this.formatValue(currentValue))\n ),\n ]\n }\n\n render() {\n const {\n min = 0,\n max = 100,\n step = 1,\n vertical = false,\n accessibilityLabel,\n accessibilityHint,\n accessibilityValueDescription,\n } = this.props\n\n const currentValue = this.getValue()\n const variantStyles = this.getVariantStyles()\n const isDisabled = this.isDisabled()\n\n // Slider CSS styles\n const sliderStyles = {\n appearance: 'none' as const,\n width: vertical ? '6px' : '100%',\n height: vertical ? '200px' : 'var(--slider-height)',\n background: `linear-gradient(to ${vertical ? 'top' : 'right'}, var(--slider-active-track-color) 0%, var(--slider-active-track-color) var(--slider-progress, 0%), var(--slider-track-color) var(--slider-progress, 0%), var(--slider-track-color) 100%)`,\n borderRadius: 'calc(var(--slider-height) / 2)',\n outline: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n opacity: isDisabled ? 0.5 : 1,\n transition: 'all 0.2s ease',\n\n // Webkit styles\n WebkitAppearance: 'none' as const,\n\n // Thumb styles\n '&::-webkit-slider-thumb': {\n appearance: 'none',\n width: 'var(--slider-thumb-size)',\n height: 'var(--slider-thumb-size)',\n borderRadius: '50%',\n background: 'var(--slider-thumb-color)',\n border: '2px solid var(--slider-active-track-color)',\n cursor: isDisabled ? 'not-allowed' : 'grab',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n transition: 'all 0.2s ease',\n },\n\n '&::-webkit-slider-thumb:hover': !isDisabled\n ? {\n transform: 'scale(1.1)',\n boxShadow: '0 4px 8px rgba(0,0,0,0.15)',\n }\n : {},\n\n '&::-webkit-slider-thumb:active': !isDisabled\n ? {\n cursor: 'grabbing',\n transform: 'scale(1.05)',\n }\n : {},\n\n // Firefox styles\n '&::-moz-range-thumb': {\n width: 'var(--slider-thumb-size)',\n height: 'var(--slider-thumb-size)',\n borderRadius: '50%',\n background: 'var(--slider-thumb-color)',\n border: '2px solid var(--slider-active-track-color)',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n },\n\n '&::-moz-range-track': {\n height: 'var(--slider-height)',\n borderRadius: 'calc(var(--slider-height) / 2)',\n background: 'var(--slider-track-color)',\n border: 'none',\n },\n }\n\n return h(\n 'div',\n {\n style: {\n ...variantStyles,\n position: 'relative',\n display: 'flex',\n flexDirection: vertical ? 'row' : 'column',\n alignItems: vertical ? 'center' : 'stretch',\n gap: vertical ? '12px' : '0',\n },\n 'aria-label': accessibilityLabel,\n 'aria-describedby': accessibilityHint ? `${this.id}-hint` : undefined,\n },\n // Value display\n ...this.renderValueDisplay(),\n\n // Slider container\n h(\n 'div',\n {\n style: {\n position: 'relative',\n width: vertical ? 'auto' : '100%',\n height: vertical ? '200px' : 'auto',\n },\n },\n // Slider input\n h('input', {\n ref: (el: HTMLInputElement) => {\n this.sliderElement = el\n\n if (el && !this.mounted) {\n // Set up event listeners\n el.addEventListener('input', this.handleInput)\n el.addEventListener('mousedown', this.handleStart)\n el.addEventListener('mouseup', this.handleEnd)\n el.addEventListener('touchstart', this.handleStart)\n el.addEventListener('touchend', this.handleEnd)\n\n this.cleanup.push(() => {\n el.removeEventListener('input', this.handleInput)\n el.removeEventListener('mousedown', this.handleStart)\n el.removeEventListener('mouseup', this.handleEnd)\n el.removeEventListener('touchstart', this.handleStart)\n el.removeEventListener('touchend', this.handleEnd)\n })\n\n // Initial setup\n this.updateTrackFill()\n this.mounted = true\n }\n },\n type: 'range',\n min: String(min),\n max: String(max),\n step: String(step),\n value: String(currentValue),\n disabled: isDisabled,\n orient: vertical ? 'vertical' : undefined,\n style: sliderStyles,\n 'aria-label': accessibilityLabel,\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-valuenow': currentValue,\n 'aria-valuetext': accessibilityValueDescription\n ? accessibilityValueDescription(currentValue)\n : this.formatValue(currentValue),\n }),\n\n // Slider marks\n ...this.renderMarks()\n ),\n\n // Labels\n ...this.renderLabels(),\n\n // Accessibility hint\n ...(accessibilityHint\n ? [\n h(\n 'div',\n {\n id: `${this.id}-hint`,\n style: {\n fontSize: '12px',\n color: '#666',\n marginTop: '4px',\n },\n },\n text(accessibilityHint)\n ),\n ]\n : [])\n )\n }\n}\n\n/**\n * Slider component function\n */\nexport function Slider(\n value: number | Signal<number>,\n props: Omit<SliderProps, 'value'> = {}\n): ModifiableComponent<SliderProps> & {\n modifier: ModifierBuilder<ModifiableComponent<SliderProps>>\n} {\n const sliderProps: SliderProps = { ...props, value }\n const component = new EnhancedSlider(sliderProps)\n return withModifiers(component)\n}\n\n/**\n * Slider style variants\n */\nexport const SliderStyles = {\n /**\n * Default slider (default)\n */\n Default(\n value: number | Signal<number>,\n props: Omit<SliderProps, 'value' | 'variant'> = {}\n ) {\n return Slider(value, { ...props, variant: 'default' })\n },\n\n /**\n * Filled slider with background\n */\n Filled(\n value: number | Signal<number>,\n props: Omit<SliderProps, 'value' | 'variant'> = {}\n ) {\n return Slider(value, { ...props, variant: 'filled' })\n },\n\n /**\n * Minimal slider with minimal styling\n */\n Minimal(\n value: number | Signal<number>,\n props: Omit<SliderProps, 'value' | 'variant'> = {}\n ) {\n return Slider(value, { ...props, variant: 'minimal' })\n },\n\n /**\n * Vertical slider\n */\n Vertical(\n value: number | Signal<number>,\n props: Omit<SliderProps, 'value' | 'vertical'> = {}\n ) {\n return Slider(value, { ...props, vertical: true })\n },\n\n /**\n * Range slider with marks\n */\n WithMarks(\n value: number | Signal<number>,\n marks: SliderMark[],\n props: Omit<SliderProps, 'value' | 'marks'> = {}\n ) {\n return Slider(value, { ...props, marks })\n },\n\n /**\n * Slider with value display\n */\n WithValue(\n value: number | Signal<number>,\n props: Omit<SliderProps, 'value' | 'showValue'> = {}\n ) {\n return Slider(value, { ...props, showValue: true })\n },\n\n /**\n * Slider with labels\n */\n WithLabels(\n value: number | Signal<number>,\n minimumLabel: string,\n maximumLabel: string,\n props: Omit<\n SliderProps,\n 'value' | 'showLabels' | 'minimumValueLabel' | 'maximumValueLabel'\n > = {}\n ) {\n return Slider(value, {\n ...props,\n showLabels: true,\n minimumValueLabel: minimumLabel,\n maximumValueLabel: maximumLabel,\n })\n },\n}\n\n/**\n * Slider utilities\n */\nexport const SliderUtils = {\n /**\n * Create marks for common ranges\n */\n createMarks(min: number, max: number, step: number): SliderMark[] {\n const marks: SliderMark[] = []\n\n for (let value = min; value <= max; value += step) {\n marks.push({\n value,\n label: String(value),\n })\n }\n\n return marks\n },\n\n /**\n * Create percentage marks\n */\n createPercentageMarks(): SliderMark[] {\n return [\n { value: 0, label: '0%' },\n { value: 25, label: '25%' },\n { value: 50, label: '50%' },\n { value: 75, label: '75%' },\n { value: 100, label: '100%' },\n ]\n },\n\n /**\n * Create custom formatter\n */\n createFormatter(\n unit: string,\n decimals: number = 0\n ): (value: number) => string {\n return (value: number) => `${value.toFixed(decimals)}${unit}`\n },\n\n /**\n * Snap value to step\n */\n snapToStep(value: number, min: number, step: number): number {\n return Math.round((value - min) / step) * step + min\n },\n\n /**\n * Convert slider value to different scale\n */\n mapToScale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number\n ): number {\n const percentage = (value - fromMin) / (fromMax - fromMin)\n return toMin + percentage * (toMax - toMin)\n },\n}\n"],"names":["defaultStepperTheme","StepperComponent","props","value","isSignal","newValue","constrainedValue","signalImpl","getSignalImpl","min","max","currentValue","maxValue","minValue","step","action","editing","type","symbol","canPerformAction","button","h","e","target","buttonDOM","formattedValue","labelText","label","labelDOM","container","decrementButton","incrementButton","containerDOM","decrementDOM","incrementDOM","hintDOM","createEffect","canInc","canDec","labelElement","Stepper","withModifiers","EnhancedSlider","dragging","setDragging","createSignal","disabled","formatter","decimals","clampedValue","percentage","event","size","variant","trackColor","activeTrackColor","thumbColor","sizeStyles","baseStyles","marks","mark","text","showLabels","minimumValueLabel","maximumValueLabel","showValue","vertical","accessibilityLabel","accessibilityHint","accessibilityValueDescription","variantStyles","isDisabled","sliderStyles","el","Slider","sliderProps","component"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextField-hX15dY3U.js","sources":["../src/utils/formatters.ts","../src/components/text-input/TextField.ts"],"sourcesContent":["/**\n * TextField Formatters\n *\n * Pre-built formatting functions for common input types.\n * Migrated from core TextField to forms plugin.\n */\n\nimport type { TextFieldFormatter } from '../types'\n\n/**\n * Common text formatters\n */\nexport const TextFieldFormatters = {\n /**\n * Phone number formatter (US format)\n */\n phone: (value: string): string => {\n const digits = value.replace(/\\D/g, '')\n if (digits.length <= 3) {\n return digits\n } else if (digits.length <= 6) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3)}`\n } else {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6, 10)}`\n }\n },\n\n /**\n * Credit card formatter\n */\n creditCard: (value: string): string => {\n const digits = value.replace(/\\D/g, '')\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ')\n },\n\n /**\n * Currency formatter\n */\n currency: (value: string): string => {\n const number = parseFloat(value.replace(/[^\\d.]/g, ''))\n if (Number.isNaN(number)) return ''\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n }).format(number)\n },\n\n /**\n * Uppercase formatter\n */\n uppercase: (value: string): string => value.toUpperCase(),\n\n /**\n * Lowercase formatter\n */\n lowercase: (value: string): string => value.toLowerCase(),\n\n /**\n * Title case formatter\n */\n titleCase: (value: string): string => {\n return value.replace(\n /\\w\\S*/g,\n txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()\n )\n },\n\n /**\n * Social Security Number formatter\n */\n ssn: (value: string): string => {\n const digits = value.replace(/\\D/g, '')\n if (digits.length <= 3) {\n return digits\n } else if (digits.length <= 5) {\n return `${digits.slice(0, 3)}-${digits.slice(3)}`\n } else {\n return `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5, 9)}`\n }\n },\n\n /**\n * Postal code formatter (US ZIP)\n */\n postalCode: (value: string): string => {\n const digits = value.replace(/\\D/g, '')\n if (digits.length <= 5) {\n return digits\n } else {\n return `${digits.slice(0, 5)}-${digits.slice(5, 9)}`\n }\n },\n\n /**\n * Decimal number formatter\n */\n decimal:\n (places: number = 2) =>\n (value: string): string => {\n const number = parseFloat(value.replace(/[^\\d.-]/g, ''))\n if (Number.isNaN(number)) return ''\n return number.toFixed(places)\n },\n\n /**\n * Percentage formatter\n */\n percentage: (value: string): string => {\n const number = parseFloat(value.replace(/[^\\d.-]/g, ''))\n if (Number.isNaN(number)) return ''\n return `${number}%`\n },\n\n /**\n * Custom formatter factory\n */\n custom: (formatFn: (value: string) => string): TextFieldFormatter => formatFn,\n}\n\n/**\n * Common text parsers (reverse of formatters)\n */\nexport const TextFieldParsers = {\n /**\n * Phone number parser - extracts digits only\n */\n phone: (value: string): string => {\n return value.replace(/\\D/g, '')\n },\n\n /**\n * Credit card parser - extracts digits only\n */\n creditCard: (value: string): string => {\n return value.replace(/\\D/g, '')\n },\n\n /**\n * Currency parser - extracts numeric value\n */\n currency: (value: string): string => {\n const matches = value.match(/[\\d.-]+/)\n return matches ? matches[0] : ''\n },\n\n /**\n * SSN parser - extracts digits only\n */\n ssn: (value: string): string => {\n return value.replace(/\\D/g, '')\n },\n\n /**\n * Postal code parser - extracts digits only\n */\n postalCode: (value: string): string => {\n return value.replace(/\\D/g, '')\n },\n\n /**\n * Decimal parser - extracts number\n */\n decimal: (value: string): string => {\n const matches = value.match(/^-?\\d*\\.?\\d*/)\n return matches ? matches[0] : ''\n },\n\n /**\n * Percentage parser - extracts number without %\n */\n percentage: (value: string): string => {\n return value.replace(/[^\\d.-]/g, '')\n },\n\n /**\n * No-op parser (returns value unchanged)\n */\n none: (value: string): string => value,\n\n /**\n * Custom parser factory\n */\n custom: (parseFn: (value: string) => string) => parseFn,\n}\n","/**\n * TextField Component - Enhanced\n *\n * SwiftUI-inspired text input with validation, formatting,\n * reactive props, and comprehensive accessibility support.\n *\n * Now includes all core TextField features:\n * - Advanced input types (date, time, color, etc.)\n * - Signal-based reactive props\n * - Formatting and parsing\n * - Mobile/accessibility features\n * - Typography control\n */\n\nimport type { Component, ComponentInstance, Signal } from '@tachui/core'\nimport { createEffect, createSignal, h, isSignal, text } from '@tachui/core'\nimport { createField } from '../../state'\nimport type { TextFieldProps, ValidationRule } from '../../types'\n\n/**\n * Helper to resolve signal or static value\n */\nconst resolveValue = <T>(\n value: T | Signal<T> | (() => T) | undefined,\n fallback: T\n): T => {\n if (value === undefined) return fallback\n if (typeof value === 'function') return (value as () => T)()\n if (isSignal(value)) return (value as () => T)()\n return value as T\n}\n\n/**\n * Enhanced TextField component implementation\n */\nexport const TextField: Component<TextFieldProps> = props => {\n const {\n name,\n label,\n placeholder,\n type = 'text',\n multiline = false,\n rows = 3,\n minLength,\n maxLength,\n pattern,\n autocomplete,\n spellcheck = true,\n disabled = false,\n required = false,\n validation,\n value: controlledValue,\n defaultValue = '',\n onChange,\n onBlur,\n onFocus,\n error: externalError,\n helperText,\n\n // New enhanced features\n keyboardType = 'default',\n returnKeyType,\n autoCapitalize,\n autoFocus = false,\n accessibilityLabel,\n accessibilityHint,\n accessibilityRole = 'textbox',\n formatter,\n parser,\n validateOnChange = false,\n validateOnBlur = true,\n font,\n textAlign,\n text: textSignal,\n placeholderSignal,\n disabledSignal,\n\n ...restProps\n } = props\n\n // Get form context if available\n const formContext = (props as any)._formContext\n\n // Create field state\n const field = createField(name, controlledValue ?? defaultValue, validation)\n\n // Register field with form if form context exists\n if (formContext) {\n formContext.register(name, validation)\n }\n\n const [focused, setFocused] = createSignal(false)\n const [characterCount, setCharacterCount] = createSignal(0)\n\n // Reactive state for dynamic props\n const [currentText, setCurrentText] = createSignal('')\n const [currentPlaceholder, setCurrentPlaceholder] = createSignal('')\n const [currentDisabled, setCurrentDisabled] = createSignal(false)\n\n // Set up reactive updates for signal-based props\n createEffect(() => {\n if (textSignal) {\n const resolvedText = resolveValue(textSignal, '')\n setCurrentText(resolvedText)\n if (resolvedText !== field.value()) {\n field.setValue(resolvedText)\n }\n }\n })\n\n createEffect(() => {\n if (placeholderSignal) {\n setCurrentPlaceholder(resolveValue(placeholderSignal, ''))\n }\n })\n\n createEffect(() => {\n if (disabledSignal) {\n setCurrentDisabled(resolveValue(disabledSignal, false))\n }\n })\n\n // Sync with controlled value\n if (controlledValue !== undefined) {\n createEffect(() => {\n if (field.value() !== controlledValue) {\n field.setValue(controlledValue)\n }\n })\n }\n\n // Update character count\n createEffect(() => {\n const value = field.value() || ''\n setCharacterCount(String(value).length)\n })\n\n // Apply formatter to display value\n const formatValue = (value: string): string => {\n if (formatter) {\n try {\n return formatter(value)\n } catch (error) {\n console.warn('TextField formatter error:', error)\n return value\n }\n }\n return value\n }\n\n // Parse formatted value to raw value\n const parseValue = (value: string): string => {\n if (parser) {\n try {\n return parser(value)\n } catch (error) {\n console.warn('TextField parser error:', error)\n return value\n }\n }\n return value\n }\n\n // Handle input change with formatting/parsing\n const handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement\n const rawValue = target.value\n\n // Parse the formatted input back to raw value\n const parsedValue = parseValue(rawValue)\n\n // Apply formatting for display (only if different from raw value)\n const formattedValue = formatValue(parsedValue)\n\n // Update field with parsed value\n field.setValue(parsedValue)\n\n // Update input display if formatting changed the value\n if (formattedValue !== rawValue && target) {\n // Preserve cursor position\n const cursorPosition = target.selectionStart || 0\n target.value = formattedValue\n target.setSelectionRange(cursorPosition, cursorPosition)\n }\n\n if (formContext) {\n formContext.setValue(name, parsedValue)\n }\n\n // Trigger validation on change if enabled\n if (validateOnChange) {\n field.validate()\n }\n\n if (onChange) {\n onChange(name, parsedValue, field as any)\n }\n }\n\n // Handle focus\n const handleFocus = (_event: Event) => {\n setFocused(true)\n field.onFocus()\n\n if (onFocus) {\n onFocus(name, field.value())\n }\n }\n\n // Handle blur with validation\n const handleBlur = (_event: Event) => {\n setFocused(false)\n field.onBlur()\n\n // Trigger validation on blur if enabled\n if (validateOnBlur) {\n field.validate()\n }\n\n if (onBlur) {\n onBlur(name, field.value())\n }\n }\n\n // Handle keyboard events (Enter, etc.)\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && !multiline) {\n event.preventDefault()\n // Submit form or trigger custom handler\n if (formContext?.submitForm) {\n formContext.submitForm()\n }\n }\n }\n\n // Determine error message\n const errorMessage =\n externalError || field.error() || formContext?.getError(name)\n\n // Resolve dynamic values\n const currentPlaceholderValue = placeholderSignal\n ? currentPlaceholder()\n : placeholder\n const isDisabled = disabledSignal ? currentDisabled() : disabled\n const displayValue = textSignal ? currentText() : field.value() || ''\n const formattedDisplayValue = formatValue(displayValue)\n\n // Create enhanced input props\n const inputProps: Record<string, any> = {\n id: restProps.id || name,\n name,\n value: formattedDisplayValue,\n placeholder: currentPlaceholderValue,\n disabled: isDisabled,\n required,\n minlength: minLength,\n maxlength: maxLength,\n pattern,\n autocomplete,\n spellcheck,\n oninput: handleChange,\n onfocus: handleFocus,\n onblur: handleBlur,\n onkeydown: handleKeyDown,\n\n // Enhanced accessibility\n 'aria-invalid': !!errorMessage,\n 'aria-describedby':\n [\n errorMessage ? `${name}-error` : null,\n helperText ? `${name}-helper` : null,\n maxLength ? `${name}-counter` : null,\n accessibilityHint ? `${name}-hint` : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n 'aria-label': accessibilityLabel,\n role: accessibilityRole,\n\n // Mobile features\n inputMode: keyboardType !== 'default' ? keyboardType : undefined,\n enterKeyHint: returnKeyType,\n autoCapitalize: autoCapitalize,\n autoFocus: autoFocus,\n\n // Data attributes for styling and debugging\n 'data-tachui-textfield': true,\n 'data-field-name': name,\n 'data-field-type': type,\n 'data-field-valid': !errorMessage,\n 'data-field-touched': field.touched(),\n 'data-field-dirty': field.dirty(),\n 'data-field-focused': focused(),\n 'data-field-validating': field.validating(),\n 'data-field-has-formatter': !!formatter,\n 'data-field-has-parser': !!parser,\n\n // Typography styling\n style: {\n ...(font?.family && { fontFamily: font.family }),\n ...(font?.size && {\n fontSize: typeof font.size === 'number' ? `${font.size}px` : font.size,\n }),\n ...(font?.weight && { fontWeight: font.weight }),\n ...(font?.style && { fontStyle: font.style }),\n ...(textAlign && { textAlign }),\n // Additional styling can be applied via modifiers\n },\n }\n\n if (type && !multiline) {\n ;(inputProps as any).type = type\n }\n\n const componentInstance: ComponentInstance = {\n type: 'component',\n id: restProps.id || `textfield-${name}`,\n render: () =>\n h(\n 'div',\n {\n ...restProps,\n class: `tachui-textfield ${restProps.class || ''}`.trim(),\n 'data-tachui-textfield-container': true,\n 'data-field-state': errorMessage\n ? 'error'\n : field.validating()\n ? 'validating'\n : 'valid',\n },\n // Label\n ...(label\n ? [\n h(\n 'label',\n {\n for: inputProps.id,\n 'data-tachui-label': true,\n 'data-required': required,\n },\n text(label),\n ...(required\n ? [\n h(\n 'span',\n {\n 'aria-label': 'required',\n 'data-required-indicator': true,\n },\n text(' *')\n ),\n ]\n : [])\n ),\n ]\n : []),\n\n // Input field\n h(multiline ? 'textarea' : 'input', {\n ...inputProps,\n ...(multiline ? { rows } : {}),\n }),\n\n // Character counter\n ...(maxLength\n ? [\n h(\n 'div',\n {\n id: `${name}-counter`,\n 'data-tachui-character-counter': true,\n 'data-over-limit': characterCount() > maxLength,\n },\n text(`${characterCount()}/${maxLength}`)\n ),\n ]\n : []),\n\n // Error message\n ...(errorMessage\n ? [\n h(\n 'div',\n {\n id: `${name}-error`,\n role: 'alert',\n 'aria-live': 'polite',\n 'data-tachui-error': true,\n },\n text(errorMessage)\n ),\n ]\n : []),\n\n // Helper text\n ...(helperText && !errorMessage\n ? [\n h(\n 'div',\n {\n id: `${name}-helper`,\n 'data-tachui-helper': true,\n },\n text(helperText)\n ),\n ]\n : []),\n\n // Accessibility hint\n ...(accessibilityHint\n ? [\n h(\n 'div',\n {\n id: `${name}-hint`,\n 'data-tachui-accessibility-hint': true,\n 'aria-hidden': 'true',\n },\n text(accessibilityHint)\n ),\n ]\n : []),\n\n // Validation indicator\n ...(field.validating()\n ? [\n h(\n 'div',\n {\n 'data-tachui-validation-spinner': true,\n 'aria-label': 'Validating...',\n 'aria-live': 'polite',\n },\n text('⏳')\n ),\n ]\n : [])\n ),\n props: props,\n cleanup: [\n () => {\n if (formContext) {\n formContext.unregister(name)\n }\n },\n ],\n }\n\n return componentInstance\n}\n\n/**\n * TextField variants for common use cases - Enhanced with formatters/validators\n */\n\n// Import formatters and validators\nimport { TextFieldFormatters, TextFieldParsers } from '../../utils/formatters'\n\nexport const EmailField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n }\n> = props => {\n return TextField({\n ...props,\n type: 'email',\n keyboardType: 'email',\n validation: {\n rules: ['required', 'email'],\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityRole: 'textbox',\n accessibilityLabel: props.accessibilityLabel || 'Email address',\n })\n}\n\nexport const PasswordField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n showStrengthIndicator?: boolean\n strongValidation?: boolean\n }\n> = props => {\n const {\n showStrengthIndicator: _showStrengthIndicator = false,\n strongValidation = false,\n minLength,\n ...textFieldProps\n } = props\n\n const rules: ValidationRule[] = ['required']\n\n if (strongValidation) {\n rules.push('strongPassword')\n } else {\n // Add minLength as a simple rule name for the test, and as an object with options\n rules.push('minLength')\n rules.push({ name: 'minLength', options: { minLength: minLength || 6 } })\n }\n\n return TextField({\n ...textFieldProps,\n type: 'password',\n validation: {\n rules,\n validateOn: 'change',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Password',\n })\n}\n\nexport const SearchField: Component<TextFieldProps> = props => {\n return TextField({\n ...props,\n type: 'search',\n keyboardType: 'search',\n placeholder: props.placeholder || 'Search...',\n accessibilityRole: 'searchbox',\n accessibilityLabel: props.accessibilityLabel || 'Search',\n })\n}\n\nexport const URLField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n }\n> = props => {\n return TextField({\n ...props,\n type: 'url',\n keyboardType: 'url',\n validation: {\n rules: ['url'],\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Website URL',\n })\n}\n\nexport const PhoneField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n format?: 'us' | 'international'\n }\n> = props => {\n const { format: _format = 'us', ...textFieldProps } = props\n\n return TextField({\n ...textFieldProps,\n type: 'tel',\n keyboardType: 'phone',\n formatter: TextFieldFormatters.phone,\n parser: TextFieldParsers.phone,\n validation: {\n rules: ['phone'],\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Phone number',\n })\n}\n\nexport const NumberField: Component<\n TextFieldProps & {\n min?: number\n max?: number\n precision?: number\n currency?: boolean\n }\n> = props => {\n const { min, max, precision = 0, currency = false, ...textFieldProps } = props\n\n const rules: ValidationRule[] = ['numeric']\n\n if (min !== undefined) {\n rules.push('min') // Add simple rule name for test\n rules.push({ name: 'min', options: { min } })\n }\n\n if (max !== undefined) {\n rules.push('max') // Add simple rule name for test\n rules.push({ name: 'max', options: { max } })\n }\n\n return TextField({\n ...textFieldProps,\n type: 'number',\n keyboardType: 'numeric',\n formatter: currency\n ? TextFieldFormatters.currency\n : precision > 0\n ? TextFieldFormatters.decimal(precision)\n : undefined,\n parser: currency ? TextFieldParsers.currency : TextFieldParsers.decimal,\n validation: {\n rules,\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Number',\n })\n}\n\nexport const CreditCardField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n }\n> = props => {\n return TextField({\n ...props,\n type: 'text',\n keyboardType: 'numeric',\n formatter: TextFieldFormatters.creditCard,\n parser: TextFieldParsers.creditCard,\n maxLength: 19, // 16 digits + 3 spaces\n validation: {\n rules: ['creditCard'],\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Credit card number',\n })\n}\n\nexport const SSNField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n }\n> = props => {\n return TextField({\n ...props,\n type: 'text',\n keyboardType: 'numeric',\n formatter: TextFieldFormatters.ssn,\n parser: TextFieldParsers.ssn,\n maxLength: 11, // 9 digits + 2 hyphens\n validation: {\n rules: ['ssn'],\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Social Security Number',\n })\n}\n\nexport const PostalCodeField: Component<\n TextFieldProps & {\n validation?: TextFieldProps['validation']\n }\n> = props => {\n return TextField({\n ...props,\n type: 'text',\n keyboardType: 'numeric',\n formatter: TextFieldFormatters.postalCode,\n parser: TextFieldParsers.postalCode,\n maxLength: 10, // 5 or 9 digits + hyphen\n validation: {\n rules: ['zipCode'], // Use zipCode to match test expectation\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Postal code',\n })\n}\n\nexport const TextArea: Component<TextFieldProps> = props => {\n return TextField({\n ...props,\n multiline: true,\n accessibilityLabel: props.accessibilityLabel || 'Text area',\n })\n}\n\n// New advanced date/time variants\nexport const DateField: Component<\n TextFieldProps & {\n min?: string\n max?: string\n }\n> = props => {\n const { min, max, ...textFieldProps } = props\n\n const rules: ValidationRule[] = ['date']\n\n if (min) {\n rules.push({ name: 'min', options: { min: new Date(min) } })\n }\n\n if (max) {\n rules.push({ name: 'max', options: { max: new Date(max) } })\n }\n\n return TextField({\n ...textFieldProps,\n type: 'date',\n validation: {\n rules,\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Date',\n })\n}\n\nexport const TimeField: Component<TextFieldProps> = props => {\n return TextField({\n ...props,\n type: 'time',\n validation: {\n rules: ['time'],\n validateOn: 'blur',\n ...props.validation,\n },\n accessibilityLabel: props.accessibilityLabel || 'Time',\n })\n}\n\nexport const ColorField: Component<TextFieldProps> = props => {\n return TextField({\n ...props,\n type: 'color',\n accessibilityLabel: props.accessibilityLabel || 'Color picker',\n })\n}\n"],"names":["TextFieldFormatters","value","digits","number","txt","places","formatFn","TextFieldParsers","matches","resolveValue","fallback","isSignal","TextField","props","name","label","placeholder","type","multiline","rows","minLength","maxLength","pattern","autocomplete","spellcheck","disabled","required","validation","controlledValue","defaultValue","onChange","onBlur","onFocus","externalError","helperText","keyboardType","returnKeyType","autoCapitalize","autoFocus","accessibilityLabel","accessibilityHint","accessibilityRole","formatter","parser","validateOnChange","validateOnBlur","font","textAlign","textSignal","placeholderSignal","disabledSignal","restProps","formContext","field","createField","focused","setFocused","createSignal","characterCount","setCharacterCount","currentText","setCurrentText","currentPlaceholder","setCurrentPlaceholder","currentDisabled","setCurrentDisabled","createEffect","resolvedText","formatValue","error","parseValue","handleChange","event","target","rawValue","parsedValue","formattedValue","cursorPosition","handleFocus","_event","handleBlur","handleKeyDown","errorMessage","currentPlaceholderValue","isDisabled","displayValue","formattedDisplayValue","inputProps","h","text","EmailField","PasswordField","_showStrengthIndicator","strongValidation","textFieldProps","rules","SearchField","URLField","PhoneField","_format","NumberField","min","max","precision","currency","CreditCardField","SSNField","PostalCodeField","TextArea","DateField","TimeField","ColorField"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-D3WfkqVv.js","sources":["../src/state/index.ts"],"sourcesContent":["/**\n * TachUI Forms State Management\n *\n * Reactive form state management with validation, field tracking,\n * and form lifecycle management using TachUI's signal system.\n */\n\nimport { createComputed, createEffect, createSignal } from '@tachui/core'\nimport type {\n FieldState,\n FieldValidation,\n FormState,\n FormSubmitHandler,\n UseFormReturn,\n ValidationResult,\n} from '../types'\nimport { validateValueAsync } from '../validation'\n\n/**\n * Create a reactive field state\n */\nfunction createFieldState<T = any>(\n initialValue?: T\n): {\n state: () => FieldState<T>\n setValue: (value: T) => void\n setError: (error: string | undefined) => void\n setTouched: (touched: boolean) => void\n setFocused: (focused: boolean) => void\n setValidating: (validating: boolean) => void\n} {\n const [value, setValue] = createSignal<T>(initialValue as T)\n const [error, setError] = createSignal<string | undefined>(undefined)\n const [touched, setTouched] = createSignal(false)\n const [dirty, setDirty] = createSignal(false)\n const [focused, setFocused] = createSignal(false)\n const [validating, setValidating] = createSignal(false)\n\n // Mark dirty when value changes from initial\n createEffect(() => {\n const currentValue = value()\n if (currentValue !== initialValue) {\n setDirty(true)\n }\n })\n\n const valid = createComputed(() => !error())\n\n const state = createComputed(\n (): FieldState<T> => ({\n value: value(),\n error: error(),\n touched: touched(),\n dirty: dirty(),\n valid: valid(),\n validating: validating(),\n focused: focused(),\n })\n )\n\n return {\n state,\n setValue: (newValue: T) => {\n setValue(newValue)\n // Mark dirty if value changed from initial\n if (newValue !== initialValue) {\n setDirty(true)\n } else {\n setDirty(false)\n }\n if (touched()) {\n // Trigger validation if field is touched\n // This will be handled by the form's validation system\n }\n },\n setError,\n setTouched,\n setFocused,\n setValidating,\n }\n}\n\n/**\n * Create a form state manager\n */\nexport function createFormState(\n initialValues: Record<string, any> = {}\n): UseFormReturn {\n const fields = new Map<string, ReturnType<typeof createFieldState>>()\n const validations = new Map<string, FieldValidation>()\n\n const [submitting, setSubmitting] = createSignal(false)\n const [submitted, setSubmitted] = createSignal(false)\n\n // Auto-register fields from initial values\n Object.keys(initialValues).forEach(name => {\n const fieldManager = createFieldState(initialValues[name])\n fields.set(name, fieldManager)\n })\n\n // Reactive form state\n const formState = createComputed((): FormState => {\n const fieldStates: Record<string, FieldState> = {}\n const errors: Record<string, string> = {}\n const touched: Record<string, boolean> = {}\n let valid = true\n let dirty = false\n\n for (const [name, fieldManager] of fields) {\n const fieldState = fieldManager.state()\n fieldStates[name] = fieldState\n\n if (fieldState.error) {\n errors[name] = fieldState.error\n valid = false\n }\n\n if (fieldState.touched) {\n touched[name] = true\n }\n\n if (fieldState.dirty) {\n dirty = true\n }\n }\n\n return {\n fields: fieldStates,\n valid,\n dirty,\n submitting: submitting(),\n submitted: submitted(),\n errors,\n touched,\n }\n })\n\n // Register a field\n const register = (name: string, validation?: FieldValidation) => {\n if (fields.has(name)) {\n // Field already exists, just update validation if provided\n if (validation) {\n validations.set(name, validation)\n }\n return\n }\n\n const fieldManager = createFieldState(initialValues[name])\n fields.set(name, fieldManager)\n\n if (validation) {\n validations.set(name, validation)\n }\n\n // Set up validation effects\n if (validation) {\n const fieldState = fieldManager.state\n\n createEffect(async () => {\n const state = fieldState()\n const shouldValidate =\n validation.validateOn === 'change' ||\n (validation.validateOn === 'blur' && state.touched) ||\n (validation.validateOn === 'submit' && submitted())\n\n if (shouldValidate && (state.dirty || state.touched)) {\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(state, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n } finally {\n fieldManager.setValidating(false)\n }\n }\n })\n }\n }\n\n // Unregister a field\n const unregister = (name: string) => {\n fields.delete(name)\n validations.delete(name)\n }\n\n // Set field value\n const setValue = (name: string, value: any) => {\n const fieldManager = fields.get(name)\n if (fieldManager) {\n fieldManager.setValue(value)\n }\n }\n\n // Get field value\n const getValue = (name: string) => {\n const fieldManager = fields.get(name)\n return fieldManager?.state().value\n }\n\n // Get field error\n const getError = (name: string) => {\n const fieldManager = fields.get(name)\n return fieldManager?.state().error\n }\n\n // Validate a specific field\n const validateField = async (name: string): Promise<boolean> => {\n const fieldManager = fields.get(name)\n const validation = validations.get(name)\n\n if (!fieldManager || !validation) {\n return true\n }\n\n const fieldState = fieldManager.state()\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(fieldState, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n return result.valid\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n return false\n } finally {\n fieldManager.setValidating(false)\n }\n }\n\n // Validate entire form\n const validateForm = async (): Promise<boolean> => {\n const validationPromises = Array.from(fields.keys()).map(validateField)\n const results = await Promise.all(validationPromises)\n return results.every(result => result)\n }\n\n // Reset form to initial state\n const resetForm = () => {\n for (const [name, fieldManager] of fields) {\n fieldManager.setValue(initialValues[name])\n fieldManager.setError(undefined)\n fieldManager.setTouched(false)\n fieldManager.setFocused(false)\n fieldManager.setValidating(false)\n }\n setSubmitting(false)\n setSubmitted(false)\n }\n\n // Submit form\n const submitForm = async (handler?: FormSubmitHandler) => {\n setSubmitting(true)\n setSubmitted(true)\n\n try {\n // Validate all fields\n const isValid = await validateForm()\n\n if (isValid && handler) {\n // Collect form values\n const values: Record<string, any> = {}\n for (const [name, fieldManager] of fields) {\n values[name] = fieldManager.state().value\n }\n\n await handler(values, formState())\n }\n } finally {\n setSubmitting(false)\n }\n }\n\n // Watch for changes in specific fields\n const watch = (fieldNames?: string[]): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldsToWatch = fieldNames || Array.from(fields.keys())\n\n for (const name of fieldsToWatch) {\n if (fields.has(name)) {\n values[name] = getValue(name)\n }\n }\n\n return values\n }\n\n // Trigger validation for specific fields\n const trigger = async (fieldNames?: string[]): Promise<boolean> => {\n const fieldsToValidate = fieldNames || Array.from(fields.keys())\n const validationPromises = fieldsToValidate.map(validateField)\n const results = await Promise.all(validationPromises)\n return results.every(result => result)\n }\n\n return {\n fields: formState().fields,\n state: formState(),\n register,\n unregister,\n setValue,\n getValue,\n getError,\n validateField,\n validateForm,\n resetForm,\n submitForm,\n watch,\n trigger,\n }\n}\n\n/**\n * Async field validation helper\n */\nasync function validateFieldAsync(\n fieldState: FieldState,\n validation: FieldValidation\n): Promise<ValidationResult> {\n if (!validation.rules || validation.rules.length === 0) {\n return { valid: true }\n }\n\n // Use debounced validation if specified\n if (validation.debounceMs) {\n return new Promise(resolve => {\n setTimeout(async () => {\n const result = await validateValueAsync(\n fieldState.value,\n validation.rules!\n )\n resolve(result)\n }, validation.debounceMs)\n\n // Store timeout ID for potential cleanup\n // In a real implementation, you'd want to manage this better\n })\n }\n\n return validateValueAsync(fieldState.value, validation.rules)\n}\n\n/**\n * Form field hook for individual field management\n */\nexport function createField<T = any>(\n _name: string,\n initialValue?: T,\n validation?: FieldValidation\n): {\n value: () => T\n setValue: (value: T) => void\n error: () => string | undefined\n touched: () => boolean\n dirty: () => boolean\n valid: () => boolean\n validating: () => boolean\n focused: () => boolean\n onFocus: () => void\n onBlur: () => void\n validate: () => Promise<boolean>\n reset: () => void\n} {\n const fieldManager = createFieldState(initialValue)\n const fieldState = fieldManager.state\n\n // Validation effect\n if (validation) {\n createEffect(async () => {\n const state = fieldState()\n const shouldValidate =\n validation.validateOn === 'change' ||\n (validation.validateOn === 'blur' && state.touched)\n\n if (shouldValidate && (state.dirty || state.touched)) {\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(state, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n } finally {\n fieldManager.setValidating(false)\n }\n }\n })\n }\n\n const validate = async (): Promise<boolean> => {\n if (!validation) return true\n\n fieldManager.setValidating(true)\n try {\n const result = await validateFieldAsync(fieldState(), validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n return result.valid\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n return false\n } finally {\n fieldManager.setValidating(false)\n }\n }\n\n const reset = () => {\n fieldManager.setValue(initialValue as T)\n fieldManager.setError(undefined)\n fieldManager.setTouched(false)\n fieldManager.setFocused(false)\n fieldManager.setValidating(false)\n }\n\n return {\n value: () => fieldState().value,\n setValue: fieldManager.setValue,\n error: () => fieldState().error,\n touched: () => fieldState().touched,\n dirty: () => fieldState().dirty,\n valid: () => fieldState().valid,\n validating: () => fieldState().validating,\n focused: () => fieldState().focused,\n onFocus: () => {\n fieldManager.setFocused(true)\n },\n onBlur: () => {\n fieldManager.setFocused(false)\n fieldManager.setTouched(true)\n },\n validate,\n reset,\n }\n}\n\n/**\n * Multi-step form state manager\n */\nexport function createMultiStepFormState(\n steps: string[],\n initialValues: Record<string, any> = {}\n) {\n const [currentStep, setCurrentStep] = createSignal(0)\n const [completedSteps, setCompletedSteps] = createSignal<Set<number>>(\n new Set()\n )\n const stepForms = new Map<number, UseFormReturn>()\n\n // Create form state for each step\n steps.forEach((_, index) => {\n const stepValues = Object.keys(initialValues)\n .filter(key => key.startsWith(`step_${index}_`))\n .reduce(\n (acc, key) => {\n const fieldName = key.replace(`step_${index}_`, '')\n acc[fieldName] = initialValues[key]\n return acc\n },\n {} as Record<string, any>\n )\n\n stepForms.set(index, createFormState(stepValues))\n })\n\n const nextStep = async (validateCurrent = true): Promise<boolean> => {\n const current = currentStep()\n const currentForm = stepForms.get(current)\n\n if (validateCurrent && currentForm) {\n const isValid = await currentForm.validateForm()\n if (!isValid) {\n return false\n }\n }\n\n if (current < steps.length - 1) {\n setCompletedSteps(prev => new Set([...prev, current]))\n setCurrentStep(current + 1)\n return true\n }\n\n return false\n }\n\n const previousStep = (): boolean => {\n const current = currentStep()\n if (current > 0) {\n setCurrentStep(current - 1)\n return true\n }\n return false\n }\n\n const goToStep = (stepIndex: number): boolean => {\n if (stepIndex >= 0 && stepIndex < steps.length) {\n setCurrentStep(stepIndex)\n return true\n }\n return false\n }\n\n const getCurrentForm = (): UseFormReturn | undefined => {\n return stepForms.get(currentStep())\n }\n\n const getAllValues = (): Record<string, any> => {\n const allValues: Record<string, any> = {}\n\n stepForms.forEach((form, stepIndex) => {\n const stepValues = form.watch()\n Object.keys(stepValues).forEach(fieldName => {\n allValues[`step_${stepIndex}_${fieldName}`] = stepValues[fieldName]\n })\n })\n\n return allValues\n }\n\n const validateAllSteps = async (): Promise<boolean> => {\n const validationPromises = Array.from(stepForms.values()).map(form =>\n form.validateForm()\n )\n const results = await Promise.all(validationPromises)\n return results.every(result => result)\n }\n\n return {\n currentStep,\n completedSteps,\n nextStep,\n previousStep,\n goToStep,\n getCurrentForm,\n getAllValues,\n validateAllSteps,\n getStepForm: (stepIndex: number) => stepForms.get(stepIndex),\n isStepCompleted: (stepIndex: number) => completedSteps().has(stepIndex),\n canGoToStep: (stepIndex: number) =>\n stepIndex <= currentStep() || completedSteps().has(stepIndex),\n }\n}\n\n// Export validation function for internal use\nexport { validateValueAsync } from '../validation'\n"],"names":["createFieldState","initialValue","value","setValue","createSignal","error","setError","touched","setTouched","dirty","setDirty","focused","setFocused","validating","setValidating","createEffect","valid","createComputed","newValue","createFormState","initialValues","fields","validations","submitting","setSubmitting","submitted","setSubmitted","name","fieldManager","formState","fieldStates","errors","fieldState","register","validation","state","result","validateFieldAsync","unregister","getValue","getError","validateField","validateForm","validationPromises","resetForm","submitForm","handler","values","watch","fieldNames","fieldsToWatch","trigger","resolve","validateValueAsync","createField","_name","validate","reset","createMultiStepFormState","steps","currentStep","setCurrentStep","completedSteps","setCompletedSteps","stepForms","_","index","stepValues","key","acc","fieldName","validateCurrent","current","currentForm","prev","stepIndex","allValues","form"],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/components/form-container/index.ts","../src/utils/index.ts"],"sourcesContent":["/**\n * Form Container Components\n *\n * Core form structure and state management components\n */\n\nimport { createSignal, createComputed } from '@tachui/core'\nimport { createFormState } from '../../state'\nimport type { FormState, FormSubmitHandler, FieldValidation } from '../../types'\n\nexport interface FormProps {\n onSubmit?: FormSubmitHandler\n validation?: Record<string, FieldValidation>\n initialValues?: Record<string, any>\n children?: any\n className?: string\n id?: string\n resetOnSubmit?: boolean\n validateOnSubmit?: boolean\n [key: string]: any\n}\n\nexport interface FormSectionProps {\n title?: string\n description?: string\n children?: any\n className?: string\n collapsible?: boolean\n defaultExpanded?: boolean\n [key: string]: any\n}\n\nexport class Form {\n readonly type = 'form-container'\n private formState: ReturnType<typeof createFormState>\n\n constructor(public readonly properties: FormProps) {\n this.formState = createFormState(properties.initialValues || {})\n\n // Register field validations\n if (properties.validation) {\n Object.entries(properties.validation).forEach(\n ([fieldName, validation]) => {\n this.formState.register(fieldName, validation)\n }\n )\n }\n }\n\n get state(): FormState {\n return this.formState.state\n }\n\n async handleSubmit(): Promise<void> {\n if (this.properties.validateOnSubmit !== false) {\n const isValid = await this.formState.validateForm()\n if (!isValid) {\n return\n }\n }\n\n if (this.properties.onSubmit) {\n await this.properties.onSubmit(\n this.formState.watch(),\n this.formState.state\n )\n }\n\n if (this.properties.resetOnSubmit) {\n this.formState.resetForm()\n }\n }\n\n register(fieldName: string, validation?: FieldValidation): void {\n this.formState.register(fieldName, validation)\n }\n\n setValue(fieldName: string, value: any): void {\n this.formState.setValue(fieldName, value)\n }\n\n getValue(fieldName: string): any {\n return this.formState.getValue(fieldName)\n }\n\n getError(fieldName: string): string | undefined {\n return this.formState.getError(fieldName)\n }\n\n async validateField(fieldName: string): Promise<boolean> {\n return this.formState.validateField(fieldName)\n }\n\n async validateForm(): Promise<boolean> {\n return this.formState.validateForm()\n }\n\n resetForm(): void {\n this.formState.resetForm()\n }\n\n render(): HTMLElement {\n const element = document.createElement('form')\n\n // Set form attributes\n if (this.properties.className) {\n element.className = this.properties.className\n }\n if (this.properties.id) {\n element.id = this.properties.id\n }\n\n // Prevent default form submission\n element.addEventListener('submit', e => {\n e.preventDefault()\n this.handleSubmit()\n })\n\n // Add children if provided\n if (this.properties.children) {\n if (Array.isArray(this.properties.children)) {\n this.properties.children.forEach(child => {\n if (typeof child === 'string') {\n element.appendChild(document.createTextNode(child))\n } else if (child && typeof child.render === 'function') {\n element.appendChild(child.render())\n } else if (child instanceof HTMLElement) {\n element.appendChild(child)\n }\n })\n } else if (typeof this.properties.children === 'string') {\n element.appendChild(document.createTextNode(this.properties.children))\n } else if (\n this.properties.children &&\n typeof this.properties.children.render === 'function'\n ) {\n element.appendChild(this.properties.children.render())\n } else if (this.properties.children instanceof HTMLElement) {\n element.appendChild(this.properties.children)\n }\n }\n\n return element\n }\n}\n\nexport class FormSection {\n readonly type = 'form-section'\n private expanded: () => boolean\n private setExpanded: (value: boolean) => void\n\n constructor(public readonly properties: FormSectionProps) {\n const [expandedSignal, setExpandedSignal] = createSignal(\n properties.defaultExpanded ?? true\n )\n this.expanded = expandedSignal\n this.setExpanded = setExpandedSignal\n }\n\n get isExpanded(): boolean {\n return this.expanded()\n }\n\n toggle(): void {\n if (this.properties.collapsible) {\n this.setExpanded(!this.expanded())\n }\n }\n\n expand(): void {\n this.setExpanded(true)\n }\n\n collapse(): void {\n if (this.properties.collapsible) {\n this.setExpanded(false)\n }\n }\n\n render(): HTMLElement {\n const section = document.createElement('section')\n\n if (this.properties.className) {\n section.className = this.properties.className\n }\n\n // Add title if provided\n if (this.properties.title) {\n const title = document.createElement('h3')\n title.textContent = this.properties.title\n title.style.cssText = 'margin: 0 0 1rem 0; font-weight: 600;'\n\n if (this.properties.collapsible) {\n title.style.cursor = 'pointer'\n title.addEventListener('click', () => this.toggle())\n\n const indicator = document.createElement('span')\n indicator.textContent = this.expanded() ? ' ▼' : ' ▶'\n indicator.style.cssText = 'font-size: 0.8em; margin-left: 0.5rem;'\n title.appendChild(indicator)\n\n // Update indicator when expanded state changes\n createComputed(() => {\n indicator.textContent = this.expanded() ? ' ▼' : ' ▶'\n })\n }\n\n section.appendChild(title)\n }\n\n // Add description if provided\n if (this.properties.description) {\n const description = document.createElement('p')\n description.textContent = this.properties.description\n description.style.cssText =\n 'margin: 0 0 1rem 0; color: #666; font-size: 0.9em;'\n section.appendChild(description)\n }\n\n // Add content container\n const content = document.createElement('div')\n\n // Handle collapsible behavior\n createComputed(() => {\n content.style.display = this.expanded() ? 'block' : 'none'\n })\n\n // Add children if provided\n if (this.properties.children) {\n if (Array.isArray(this.properties.children)) {\n this.properties.children.forEach(child => {\n if (typeof child === 'string') {\n content.appendChild(document.createTextNode(child))\n } else if (child && typeof child.render === 'function') {\n content.appendChild(child.render())\n } else if (child instanceof HTMLElement) {\n content.appendChild(child)\n }\n })\n } else if (typeof this.properties.children === 'string') {\n content.appendChild(document.createTextNode(this.properties.children))\n } else if (\n this.properties.children &&\n typeof this.properties.children.render === 'function'\n ) {\n content.appendChild(this.properties.children.render())\n } else if (this.properties.children instanceof HTMLElement) {\n content.appendChild(this.properties.children)\n }\n }\n\n section.appendChild(content)\n return section\n }\n}\n\nexport function form(props: FormProps): Form {\n return new Form(props)\n}\n\nexport function formSection(props: FormSectionProps): FormSection {\n return new FormSection(props)\n}\n\n// Re-export types for convenience\nexport type { FormState, FormSubmitHandler, FieldValidation }\n","/**\n * Form Utilities\n *\n * Shared utilities for form handling, formatting, and validation\n */\n\n// TODO: Migrate actual utilities from @tachui/forms\n// Placeholder implementation for unified package structure\n\n// Form state utilities (stubs)\nexport function useFormState() {\n return {\n /* TODO: Implement form state hook */\n }\n}\n\nexport function useFormValidation() {\n return {\n /* TODO: Implement form validation hook */\n }\n}\n\n// Formatting utilities (stubs)\nexport function formatCreditCard(value: string): string {\n return value.replace(/\\D/g, '').replace(/(\\d{4})(?=\\d)/g, '$1 ')\n}\n\nexport function formatPhoneNumber(value: string): string {\n return value.replace(/\\D/g, '').replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3')\n}\n\nexport function formatSSN(value: string): string {\n return value.replace(/\\D/g, '').replace(/(\\d{3})(\\d{2})(\\d{4})/, '$1-$2-$3')\n}\n\nexport function formatPostalCode(value: string): string {\n return value.toUpperCase().replace(/[^A-Z0-9]/g, '')\n}\n\n// Date utilities (stubs)\nexport function formatDate(date: Date, _format: string = 'yyyy-MM-dd'): string {\n return date.toISOString().split('T')[0]\n}\n\nexport function parseDate(value: string): Date {\n return new Date(value)\n}\n\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime())\n}\n\n// Type aliases\nexport type FormStateManager = any\nexport type FormatterFunction = (value: string) => string\nexport type DateFormat = string\nexport type FormUtilOptions = any\n"],"names":["Form","properties","createFormState","fieldName","validation","value","element","e","child","FormSection","expandedSignal","setExpandedSignal","createSignal","section","title","indicator","createComputed","description","content","form","props","formSection","useFormState","useFormValidation","formatCreditCard","formatPhoneNumber","formatSSN","formatPostalCode","formatDate","date","_format","parseDate","isValidDate"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/validation/component-validation.ts","../../src/validation/index.ts"],"sourcesContent":["/**\n * Forms Package Component Validation\n *\n * Validation for @tachui/advanced-forms components that registers with the Core\n * validation system, following proper plugin architecture.\n */\n\n// Import from core to register with the validation system\n// ComponentValidator type is defined locally since it's not exported from core\n\n/**\n * Component validator interface (matches core's internal interface)\n */\ninterface ComponentValidator {\n packageName: string\n componentName: string\n validate: (args: unknown[]) => void\n}\n\n/**\n * TachUI Forms validation error class\n */\nexport class FormsValidationError extends Error {\n constructor(\n message: string,\n public context: {\n component: string\n property?: string\n suggestion?: string\n documentation?: string\n example?: {\n wrong: string\n correct: string\n }\n }\n ) {\n super(message)\n this.name = 'FormsValidationError'\n }\n\n getFormattedMessage(): string {\n const { component, suggestion, example, documentation } = this.context\n\n let formatted = `❌ [@tachui/advanced-forms] ${component} Component Error: ${this.message}\\n`\n\n if (suggestion) {\n formatted += `\\n💡 Suggestion: ${suggestion}\\n`\n }\n\n if (example) {\n formatted += `\\n❌ Wrong: ${example.wrong}`\n formatted += `\\n✅ Correct: ${example.correct}\\n`\n }\n\n if (documentation) {\n formatted += `\\n📚 Documentation: ${documentation}`\n }\n\n return formatted\n }\n}\n\n/**\n * Forms Components Validation\n */\nexport const FormsComponentValidation = {\n // TextField Component\n validateTextField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'TextField component requires a props object with name',\n {\n component: 'TextField',\n suggestion: 'Add name property: TextField({ name: \"fieldName\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/textfield',\n example: {\n wrong: 'TextField()',\n correct: 'TextField({ name: \"email\", value: emailSignal })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('TextField requires a props object', {\n component: 'TextField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'TextField(\"email\")',\n correct: 'TextField({ name: \"email\" })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'TextField name property is required and must be a string',\n {\n component: 'TextField',\n suggestion: 'Provide a unique name for the field',\n example: {\n wrong: 'TextField({ placeholder: \"Email\" })',\n correct: 'TextField({ name: \"email\", placeholder: \"Email\" })',\n },\n }\n )\n }\n },\n\n // EmailField Component\n validateEmailField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'EmailField component requires a props object with name',\n {\n component: 'EmailField',\n suggestion: 'Add name property: EmailField({ name: \"email\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/emailfield',\n example: {\n wrong: 'EmailField()',\n correct: 'EmailField({ name: \"email\", value: emailSignal })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('EmailField requires a props object', {\n component: 'EmailField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'EmailField(\"email@example.com\")',\n correct: 'EmailField({ name: \"email\", value: \"email@example.com\" })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'EmailField name property is required and must be a string',\n {\n component: 'EmailField',\n suggestion: 'Provide a unique name for the email field',\n example: {\n wrong: 'EmailField({ placeholder: \"Email\" })',\n correct: 'EmailField({ name: \"email\", placeholder: \"Email\" })',\n },\n }\n )\n }\n },\n\n // PasswordField Component\n validatePasswordField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'PasswordField component requires a props object with name',\n {\n component: 'PasswordField',\n suggestion: 'Add name property: PasswordField({ name: \"password\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/passwordfield',\n example: {\n wrong: 'PasswordField()',\n correct:\n 'PasswordField({ name: \"password\", value: passwordSignal })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('PasswordField requires a props object', {\n component: 'PasswordField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'PasswordField(\"password\")',\n correct: 'PasswordField({ name: \"password\", value: passwordSignal })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'PasswordField name property is required and must be a string',\n {\n component: 'PasswordField',\n suggestion: 'Provide a unique name for the password field',\n example: {\n wrong: 'PasswordField({ placeholder: \"Password\" })',\n correct:\n 'PasswordField({ name: \"password\", placeholder: \"Password\" })',\n },\n }\n )\n }\n },\n\n // PhoneField Component\n validatePhoneField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'PhoneField component requires a props object with name',\n {\n component: 'PhoneField',\n suggestion: 'Add name property: PhoneField({ name: \"phone\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/phonefield',\n example: {\n wrong: 'PhoneField()',\n correct: 'PhoneField({ name: \"phone\", format: \"US\" })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('PhoneField requires a props object', {\n component: 'PhoneField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'PhoneField(\"(555) 123-4567\")',\n correct: 'PhoneField({ name: \"phone\", value: phoneSignal })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'PhoneField name property is required and must be a string',\n {\n component: 'PhoneField',\n suggestion: 'Provide a unique name for the phone field',\n example: {\n wrong: 'PhoneField({ format: \"US\" })',\n correct: 'PhoneField({ name: \"phone\", format: \"US\" })',\n },\n }\n )\n }\n },\n\n // NumberField Component\n validateNumberField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'NumberField component requires a props object with name',\n {\n component: 'NumberField',\n suggestion: 'Add name property: NumberField({ name: \"amount\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/numberfield',\n example: {\n wrong: 'NumberField()',\n correct: 'NumberField({ name: \"amount\", min: 0, max: 100 })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('NumberField requires a props object', {\n component: 'NumberField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'NumberField(42)',\n correct: 'NumberField({ name: \"amount\", value: 42 })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'NumberField name property is required and must be a string',\n {\n component: 'NumberField',\n suggestion: 'Provide a unique name for the number field',\n example: {\n wrong: 'NumberField({ min: 0, max: 100 })',\n correct: 'NumberField({ name: \"amount\", min: 0, max: 100 })',\n },\n }\n )\n }\n },\n\n // CreditCardField Component\n validateCreditCardField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'CreditCardField component requires a props object with name',\n {\n component: 'CreditCardField',\n suggestion:\n 'Add name property: CreditCardField({ name: \"cardNumber\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/creditcardfield',\n example: {\n wrong: 'CreditCardField()',\n correct:\n 'CreditCardField({ name: \"cardNumber\", onChange: handleChange })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError(\n 'CreditCardField requires a props object',\n {\n component: 'CreditCardField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'CreditCardField(\"4111111111111111\")',\n correct:\n 'CreditCardField({ name: \"cardNumber\", value: cardSignal })',\n },\n }\n )\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'CreditCardField name property is required and must be a string',\n {\n component: 'CreditCardField',\n suggestion: 'Provide a unique name for the credit card field',\n example: {\n wrong: 'CreditCardField({ placeholder: \"Card Number\" })',\n correct:\n 'CreditCardField({ name: \"cardNumber\", placeholder: \"Card Number\" })',\n },\n }\n )\n }\n },\n\n // Additional Forms components would go here...\n // (SearchField, URLField, TextArea, ColorField, etc.)\n}\n\n/**\n * Create Forms component validators for registration\n */\nexport function createFormsValidators(): ComponentValidator[] {\n return [\n {\n packageName: 'advanced-forms',\n componentName: 'TextField',\n validate: FormsComponentValidation.validateTextField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'EmailField',\n validate: FormsComponentValidation.validateEmailField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'PasswordField',\n validate: FormsComponentValidation.validatePasswordField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'PhoneField',\n validate: FormsComponentValidation.validatePhoneField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'NumberField',\n validate: FormsComponentValidation.validateNumberField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'CreditCardField',\n validate: FormsComponentValidation.validateCreditCardField,\n },\n // Additional validators would be added here for remaining Forms components\n ]\n}\n\n/**\n * Register Forms validators with Core validation system\n */\nexport async function registerFormsValidators(): Promise<void> {\n try {\n // Dynamic import to avoid circular dependency\n const { registerComponentValidator } = await import(\n '@tachui/core/validation'\n )\n\n const validators = createFormsValidators()\n\n for (const validator of validators) {\n registerComponentValidator(validator)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.info(\n `🔍 [@tachui/advanced-forms] Registered ${validators.length} component validators`\n )\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '⚠️ [@tachui/advanced-forms] Could not register validators with Core:',\n error\n )\n }\n }\n}\n\n// Auto-register when Forms package loads\nif (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {\n setTimeout(registerFormsValidators, 10)\n}\n","/**\n * TachUI Forms Validation System\n *\n * Comprehensive validation engine with built-in rules, custom validators,\n * async validation support, and i18n-ready error messages.\n */\n\nimport type {\n CustomValidationRule,\n FieldState,\n FieldValidation,\n ValidationResult,\n ValidationRule,\n} from '../types'\n\n/**\n * Built-in validation rules\n */\nconst VALIDATION_RULES: Record<\n string,\n (value: any, options?: any) => ValidationResult\n> = {\n required: (value: any): ValidationResult => ({\n valid: value !== null && value !== undefined && value !== '',\n message: 'This field is required',\n code: 'REQUIRED',\n }),\n\n email: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return {\n valid: emailRegex.test(value),\n message: 'Please enter a valid email address',\n code: 'INVALID_EMAIL',\n }\n },\n\n url: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n try {\n new URL(value)\n return { valid: true }\n } catch {\n return {\n valid: false,\n message: 'Please enter a valid URL',\n code: 'INVALID_URL',\n }\n }\n },\n\n number: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num),\n message: 'Please enter a valid number',\n code: 'INVALID_NUMBER',\n }\n },\n\n integer: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid:\n !Number.isNaN(num) && Number.isFinite(num) && Number.isInteger(num),\n message: 'Please enter a valid integer',\n code: 'INVALID_INTEGER',\n }\n },\n\n min: (value: any, options: { min: number }): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n if (Number.isNaN(num)) return { valid: true } // Let number validation handle this\n\n return {\n valid: num >= options.min,\n message: `Value must be at least ${options.min}`,\n code: 'MIN_VALUE',\n }\n },\n\n max: (value: any, options: { max: number }): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n if (Number.isNaN(num)) return { valid: true } // Let number validation handle this\n\n return {\n valid: num <= options.max,\n message: `Value must be at most ${options.max}`,\n code: 'MAX_VALUE',\n }\n },\n\n minLength: (\n value: string,\n options: { minLength: number }\n ): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: value.length >= options.minLength,\n message: `Must be at least ${options.minLength} characters`,\n code: 'MIN_LENGTH',\n }\n },\n\n maxLength: (\n value: string,\n options: { maxLength: number }\n ): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: value.length <= options.maxLength,\n message: `Must be at most ${options.maxLength} characters`,\n code: 'MAX_LENGTH',\n }\n },\n\n pattern: (\n value: string,\n options: { pattern: string | RegExp; message?: string }\n ): ValidationResult => {\n if (!value) return { valid: true }\n const regex =\n typeof options.pattern === 'string'\n ? new RegExp(options.pattern)\n : options.pattern\n return {\n valid: regex.test(value),\n message: options.message || 'Value does not match required pattern',\n code: 'PATTERN_MISMATCH',\n }\n },\n\n // Additional validation rules expected by tests\n numeric: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num),\n message: 'Please enter a valid number',\n code: 'INVALID_NUMERIC',\n }\n },\n\n phone: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const phoneRegex = /^\\+?[\\d\\s\\-().]+$/\n const digits = value.replace(/[\\s\\-().]/g, '')\n return {\n valid: phoneRegex.test(value) && digits.length >= 10,\n message: 'Please enter a valid phone number',\n code: 'INVALID_PHONE',\n }\n },\n\n creditCard: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const digits = value.replace(/\\s/g, '')\n // Basic Luhn algorithm check\n let sum = 0\n let alternate = false\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits.charAt(i))\n if (alternate) {\n n *= 2\n if (n > 9) n = (n % 10) + 1\n }\n sum += n\n alternate = !alternate\n }\n return {\n valid: /^\\d{13,19}$/.test(digits) && sum % 10 === 0,\n message: 'Please enter a valid credit card number',\n code: 'INVALID_CREDIT_CARD',\n }\n },\n\n ssn: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const digits = value.replace(/[-\\s]/g, '')\n return {\n valid: /^\\d{9}$/.test(digits),\n message: 'Please enter a valid Social Security Number',\n code: 'INVALID_SSN',\n }\n },\n\n postalCode: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n // US ZIP code (5 or 9 digits) or international postal codes\n const usZip = /^\\d{5}(-\\d{4})?$/\n const intlPostal = /^[A-Z0-9]{3,10}$/i\n return {\n valid: usZip.test(value) || intlPostal.test(value),\n message: 'Please enter a valid postal code',\n code: 'INVALID_POSTAL_CODE',\n }\n },\n\n zipCode: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n // US ZIP code (5 or 9 digits)\n const usZip = /^\\d{5}(-\\d{4})?$/\n return {\n valid: usZip.test(value),\n message: 'Please enter a valid ZIP code',\n code: 'INVALID_ZIP_CODE',\n }\n },\n\n date: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const date = new Date(value)\n return {\n valid:\n !Number.isNaN(date.getTime()) && !!value.match(/^\\d{4}-\\d{2}-\\d{2}$/),\n message: 'Please enter a valid date (YYYY-MM-DD)',\n code: 'INVALID_DATE',\n }\n },\n\n time: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value),\n message: 'Please enter a valid time (HH:MM)',\n code: 'INVALID_TIME',\n }\n },\n\n strongPassword: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const hasUpperCase = /[A-Z]/.test(value)\n const hasLowerCase = /[a-z]/.test(value)\n const hasNumbers = /\\d/.test(value)\n const hasNonalphas = /\\W/.test(value)\n const isLongEnough = value.length >= 8\n\n const valid =\n hasUpperCase && hasLowerCase && hasNumbers && hasNonalphas && isLongEnough\n return {\n valid,\n message: valid\n ? undefined\n : 'Password must be at least 8 characters with uppercase, lowercase, number and special character',\n code: 'WEAK_PASSWORD',\n }\n },\n}\n\n/**\n * Custom validation rule registry\n */\nconst customRules = new Map<string, CustomValidationRule>()\n\n/**\n * Register a custom validation rule\n */\nexport function registerValidationRule(rule: CustomValidationRule): void {\n customRules.set(rule.name, rule)\n}\n\n/**\n * Unregister a custom validation rule\n */\nexport function unregisterValidationRule(name: string): void {\n customRules.delete(name)\n}\n\n/**\n * Get all registered validation rules\n */\nexport function getValidationRules(): string[] {\n return [...Object.keys(VALIDATION_RULES), ...customRules.keys()]\n}\n\n/**\n * Validate a single value against validation rules\n */\nexport function validateValue(\n value: any,\n rules: ValidationRule[],\n options?: Record<string, any>\n): ValidationResult {\n for (const rule of rules) {\n let result: ValidationResult\n\n if (typeof rule === 'string') {\n // Built-in rule\n const validator = VALIDATION_RULES[rule]\n if (validator) {\n result = validator(value, options?.[rule])\n } else {\n // Check custom rules\n const customRule = customRules.get(rule)\n if (customRule) {\n result = customRule.validate(value, customRule.options)\n } else {\n console.warn(`Unknown validation rule: ${rule}`)\n continue\n }\n }\n } else if ('validate' in rule) {\n // Custom validation rule object\n result = rule.validate(value, rule.options)\n } else {\n // Built-in validation rule object (BuiltInValidationRule)\n const validator = VALIDATION_RULES[rule.name]\n if (validator) {\n result = validator(value, rule.options)\n } else {\n console.warn(`Unknown built-in validation rule: ${rule.name}`)\n continue\n }\n }\n\n if (!result.valid) {\n return result\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Validate a field state\n */\nexport function validateField(\n field: FieldState,\n validation?: FieldValidation\n): ValidationResult {\n if (!validation?.rules || validation.rules.length === 0) {\n return { valid: true }\n }\n\n return validateValue(field.value, validation.rules)\n}\n\n/**\n * Async validation function\n */\nexport async function validateValueAsync(\n value: any,\n rules: ValidationRule[],\n options?: Record<string, any>\n): Promise<ValidationResult> {\n for (const rule of rules) {\n let result: ValidationResult | Promise<ValidationResult>\n\n if (typeof rule === 'string') {\n const validator = VALIDATION_RULES[rule]\n if (validator) {\n result = validator(value, options?.[rule])\n } else {\n const customRule = customRules.get(rule)\n if (customRule) {\n result = customRule.validate(value, customRule.options)\n } else {\n continue\n }\n }\n } else if ('validate' in rule) {\n // Custom validation rule object\n result = rule.validate(value, rule.options)\n } else {\n // Built-in validation rule object (BuiltInValidationRule)\n const validator = VALIDATION_RULES[rule.name]\n if (validator) {\n result = validator(value, rule.options)\n } else {\n continue\n }\n }\n\n // Handle async validation\n const validationResult = await Promise.resolve(result)\n\n if (!validationResult.valid) {\n return validationResult\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Debounced validation\n */\nexport function createDebouncedValidator(\n validator: (value: any) => ValidationResult | Promise<ValidationResult>,\n delayMs: number = 300\n) {\n let timeoutId: ReturnType<typeof setTimeout>\n let lastValue: any\n let lastResult: ValidationResult | Promise<ValidationResult>\n\n return (value: any): Promise<ValidationResult> => {\n return new Promise(resolve => {\n // If value hasn't changed, return cached result\n if (value === lastValue && lastResult) {\n Promise.resolve(lastResult).then(resolve)\n return\n }\n\n lastValue = value\n\n // Clear previous timeout\n clearTimeout(timeoutId)\n\n // Set new timeout\n timeoutId = setTimeout(async () => {\n try {\n lastResult = validator(value)\n const result = await Promise.resolve(lastResult)\n resolve(result)\n } catch (_error) {\n resolve({\n valid: false,\n message: 'Validation error occurred',\n code: 'VALIDATION_ERROR',\n })\n }\n }, delayMs)\n })\n }\n}\n\n/**\n * Cross-field validation utilities\n */\nexport const CrossFieldValidators = {\n /**\n * Validate that two fields match (e.g., password confirmation)\n */\n fieldMatch:\n (field1: string, field2: string, message = 'Fields must match') =>\n (values: Record<string, any>): ValidationResult => {\n const isValid = values[field1] === values[field2]\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'FIELD_MISMATCH',\n }\n },\n\n /**\n * Validate that at least one field in a group is filled\n */\n requireOneOf:\n (fields: string[], message = 'At least one field is required') =>\n (values: Record<string, any>): ValidationResult => {\n const hasValue = fields.some(field => {\n const value = values[field]\n return value !== null && value !== undefined && value !== ''\n })\n\n if (hasValue) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'REQUIRE_ONE_OF',\n }\n },\n\n /**\n * Validate that a field is required when another field has a specific value\n */\n requiredWhen:\n (\n targetField: string,\n conditionalField: string,\n conditionalValue: any,\n message = `${targetField} is required`\n ) =>\n (values: Record<string, any>): ValidationResult => {\n if (values[conditionalField] === conditionalValue) {\n const targetValue = values[targetField]\n const isValid =\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== ''\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'REQUIRED_WHEN',\n }\n }\n return { valid: true }\n },\n\n /**\n * Validate date range (start date before end date)\n */\n dateRange:\n (\n startField: string,\n endField: string,\n message = 'End date must be after start date'\n ) =>\n (values: Record<string, any>): ValidationResult => {\n const startDate = values[startField]\n const endDate = values[endField]\n\n if (!startDate || !endDate) return { valid: true }\n\n const start = new Date(startDate)\n const end = new Date(endDate)\n const isValid = end >= start\n\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'INVALID_DATE_RANGE',\n }\n },\n}\n\n/**\n * Built-in validation rule presets\n */\nexport const ValidationPresets = {\n email: ['required', 'email'],\n password: ['required', { name: 'minLength', options: { minLength: 8 } }],\n phone: [\n 'required',\n {\n name: 'pattern',\n options: { pattern: /^\\+?[\\d\\s-()]+$/, message: 'Invalid phone number' },\n },\n ],\n url: ['required', 'url'],\n positiveNumber: ['required', 'number', { name: 'min', options: { min: 0 } }],\n percentage: [\n 'required',\n 'number',\n { name: 'min', options: { min: 0 } },\n { name: 'max', options: { max: 100 } },\n ],\n}\n\n/**\n * Validation message formatter\n */\nexport class ValidationMessageFormatter {\n private messages: Record<string, string> = {}\n\n constructor(messages: Record<string, string> = {}) {\n this.messages = messages\n }\n\n setMessage(code: string, message: string): void {\n this.messages[code] = message\n }\n\n setMessages(messages: Record<string, string>): void {\n this.messages = { ...this.messages, ...messages }\n }\n\n format(result: ValidationResult, fieldName?: string): string {\n if (result.code && this.messages[result.code]) {\n return this.messages[result.code].replace(\n `\\${field}`,\n fieldName || 'field'\n )\n }\n return result.message || 'Validation failed'\n }\n}\n\n/**\n * Default validation message formatter instance\n */\nexport const defaultMessageFormatter = new ValidationMessageFormatter()\n\n/**\n * Validation utilities\n */\nexport const ValidationUtils = {\n /**\n * Check if a validation result represents an error\n */\n isError: (result: ValidationResult): boolean => !result.valid,\n\n /**\n * Check if a validation result is valid\n */\n isValid: (result: ValidationResult): boolean => result.valid,\n\n /**\n * Combine multiple validation results\n */\n combineResults: (results: ValidationResult[]): ValidationResult => {\n const errors = results.filter(r => !r.valid)\n if (errors.length === 0) {\n return { valid: true }\n }\n\n return {\n valid: false,\n message: errors.map(e => e.message).join(', '),\n code: 'MULTIPLE_ERRORS',\n }\n },\n\n /**\n * Create a validation function from a rule configuration\n */\n createValidator:\n (rules: ValidationRule[], options?: Record<string, any>) =>\n (value: any): ValidationResult =>\n validateValue(value, rules, options),\n\n /**\n * Create an async validation function\n */\n createAsyncValidator:\n (rules: ValidationRule[], options?: Record<string, any>) =>\n (value: any): Promise<ValidationResult> =>\n validateValueAsync(value, rules, options),\n}\n\n// Export all validation functionality\nexport { VALIDATION_RULES }\n\n// Export component validation for plugin registration\nexport * from './component-validation'\n"],"names":["FormsValidationError","message","context","component","suggestion","example","documentation","formatted","FormsComponentValidation","args","props","propsObj","createFormsValidators","registerFormsValidators","registerComponentValidator","validators","validator","error","VALIDATION_RULES","value","num","options","phoneRegex","digits","sum","alternate","i","n","usZip","intlPostal","date","hasUpperCase","hasLowerCase","hasNumbers","hasNonalphas","isLongEnough","valid","customRules","registerValidationRule","rule","unregisterValidationRule","name","getValidationRules","validateValue","rules","result","customRule","validateField","field","validation","validateValueAsync","validationResult","createDebouncedValidator","delayMs","timeoutId","lastValue","lastResult","resolve","CrossFieldValidators","field1","field2","values","fields","targetField","conditionalField","conditionalValue","targetValue","startField","endField","startDate","endDate","start","ValidationPresets","ValidationMessageFormatter","messages","code","fieldName","defaultMessageFormatter","ValidationUtils","results","errors","e"],"mappings":"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"}
|