@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
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { Modifier, ModifierContext } from '@tachui/core/modifiers/types'
|
|
2
|
+
import type { ModifierRegistry, PluginInfo } from '@tachui/registry'
|
|
3
|
+
import { registerModifierWithMetadata } from '@tachui/core/modifiers'
|
|
4
|
+
|
|
5
|
+
const requiredPriority = 72
|
|
6
|
+
|
|
7
|
+
interface RequiredModifierOptions {
|
|
8
|
+
message?: string
|
|
9
|
+
enabled?: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function normalizeOptions(
|
|
13
|
+
value?: boolean | string | RequiredModifierOptions,
|
|
14
|
+
): RequiredModifierOptions {
|
|
15
|
+
if (typeof value === 'boolean') {
|
|
16
|
+
return { enabled: value }
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
return { message: value, enabled: true }
|
|
20
|
+
}
|
|
21
|
+
const normalized: RequiredModifierOptions = { enabled: true }
|
|
22
|
+
|
|
23
|
+
if (value) {
|
|
24
|
+
Object.assign(normalized, value)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return normalized
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function applyRequired(
|
|
31
|
+
element: Element,
|
|
32
|
+
{ enabled, message }: RequiredModifierOptions,
|
|
33
|
+
): void {
|
|
34
|
+
if (!(element instanceof HTMLElement)) return
|
|
35
|
+
|
|
36
|
+
if (enabled !== false) {
|
|
37
|
+
element.setAttribute('aria-required', 'true')
|
|
38
|
+
element.classList.add('tachui-required')
|
|
39
|
+
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
|
|
40
|
+
element.required = true
|
|
41
|
+
} else {
|
|
42
|
+
element.setAttribute('data-required', 'true')
|
|
43
|
+
}
|
|
44
|
+
if (message) {
|
|
45
|
+
element.setAttribute('data-required-message', message)
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
element.removeAttribute('aria-required')
|
|
49
|
+
element.classList.remove('tachui-required')
|
|
50
|
+
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
|
|
51
|
+
element.required = false
|
|
52
|
+
} else {
|
|
53
|
+
element.removeAttribute('data-required')
|
|
54
|
+
}
|
|
55
|
+
element.removeAttribute('data-required-message')
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function createRequiredModifier(
|
|
60
|
+
options?: boolean | string | RequiredModifierOptions,
|
|
61
|
+
): Modifier {
|
|
62
|
+
const normalized = normalizeOptions(options)
|
|
63
|
+
return {
|
|
64
|
+
type: 'forms:required',
|
|
65
|
+
priority: requiredPriority,
|
|
66
|
+
properties: normalized,
|
|
67
|
+
apply(node: any, context: ModifierContext) {
|
|
68
|
+
const element = (context.element ?? node) as Element | undefined
|
|
69
|
+
if (!element) return node
|
|
70
|
+
|
|
71
|
+
applyRequired(element, normalized)
|
|
72
|
+
return node
|
|
73
|
+
},
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const REQUIRED_METADATA = {
|
|
78
|
+
category: 'accessibility' as const,
|
|
79
|
+
priority: requiredPriority,
|
|
80
|
+
signature: '(options?: boolean | string | { message?: string }) => Modifier',
|
|
81
|
+
description:
|
|
82
|
+
'Marks form inputs as required, wiring ARIA attributes and optional custom messaging.',
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function required(
|
|
86
|
+
options?: boolean | string | RequiredModifierOptions,
|
|
87
|
+
): Modifier {
|
|
88
|
+
return createRequiredModifier(options)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function registerRequiredModifier(
|
|
92
|
+
registry?: ModifierRegistry,
|
|
93
|
+
plugin?: PluginInfo,
|
|
94
|
+
): void {
|
|
95
|
+
const factory = (options?: boolean | string | RequiredModifierOptions) =>
|
|
96
|
+
createRequiredModifier(options)
|
|
97
|
+
|
|
98
|
+
registerModifierWithMetadata(
|
|
99
|
+
'required',
|
|
100
|
+
factory,
|
|
101
|
+
REQUIRED_METADATA,
|
|
102
|
+
registry,
|
|
103
|
+
plugin,
|
|
104
|
+
)
|
|
105
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { Modifier, ModifierContext } from '@tachui/core/modifiers/types'
|
|
2
|
+
import type { ModifierRegistry, PluginInfo } from '@tachui/registry'
|
|
3
|
+
import { registerModifierWithMetadata } from '@tachui/core/modifiers'
|
|
4
|
+
import { validateValue } from '../validation'
|
|
5
|
+
import type { ValidationResult, ValidationRule } from '../types'
|
|
6
|
+
|
|
7
|
+
const validationPriority = 74
|
|
8
|
+
|
|
9
|
+
type ValidationArgs =
|
|
10
|
+
| ValidationRule[]
|
|
11
|
+
| ValidationRule
|
|
12
|
+
|
|
13
|
+
interface ValidationProperties {
|
|
14
|
+
rules: ValidationRule[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const validationHandlers = new WeakMap<Element, (event?: Event) => void>()
|
|
18
|
+
|
|
19
|
+
function normalizeRules(input: ValidationArgs[]): ValidationRule[] {
|
|
20
|
+
const flattened: ValidationRule[] = []
|
|
21
|
+
input.forEach(entry => {
|
|
22
|
+
if (Array.isArray(entry)) {
|
|
23
|
+
flattened.push(...entry)
|
|
24
|
+
} else {
|
|
25
|
+
flattened.push(entry)
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
return flattened
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function applyValidationResult(
|
|
32
|
+
element: Element,
|
|
33
|
+
result: ValidationResult,
|
|
34
|
+
): void {
|
|
35
|
+
if (!(element instanceof HTMLElement)) return
|
|
36
|
+
|
|
37
|
+
if (
|
|
38
|
+
element instanceof HTMLInputElement ||
|
|
39
|
+
element instanceof HTMLTextAreaElement ||
|
|
40
|
+
element instanceof HTMLSelectElement
|
|
41
|
+
) {
|
|
42
|
+
element.setCustomValidity(result.valid ? '' : result.message ?? 'Invalid value')
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (result.valid) {
|
|
46
|
+
element.removeAttribute('aria-invalid')
|
|
47
|
+
element.classList.remove('tachui-invalid')
|
|
48
|
+
element.removeAttribute('data-validation-message')
|
|
49
|
+
} else {
|
|
50
|
+
element.setAttribute('aria-invalid', 'true')
|
|
51
|
+
element.classList.add('tachui-invalid')
|
|
52
|
+
if (result.message) {
|
|
53
|
+
element.setAttribute('data-validation-message', result.message)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function createValidationHandler(
|
|
59
|
+
element: Element,
|
|
60
|
+
rules: ValidationRule[],
|
|
61
|
+
): (event?: Event) => void {
|
|
62
|
+
return () => {
|
|
63
|
+
const currentValue =
|
|
64
|
+
element instanceof HTMLInputElement ||
|
|
65
|
+
element instanceof HTMLTextAreaElement ||
|
|
66
|
+
element instanceof HTMLSelectElement
|
|
67
|
+
? element.value
|
|
68
|
+
: element.textContent ?? ''
|
|
69
|
+
|
|
70
|
+
const result = validateValue(currentValue, rules)
|
|
71
|
+
applyValidationResult(element, result)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function createValidationModifier(
|
|
76
|
+
rules: ValidationRule[],
|
|
77
|
+
): Modifier {
|
|
78
|
+
const normalizedRules = rules.length
|
|
79
|
+
? rules
|
|
80
|
+
: (['required'] as ValidationRule[])
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
type: 'forms:validation',
|
|
84
|
+
priority: validationPriority,
|
|
85
|
+
properties: { rules: normalizedRules } satisfies ValidationProperties,
|
|
86
|
+
apply(node: any, context: ModifierContext) {
|
|
87
|
+
const element = (context.element ?? node) as Element | undefined
|
|
88
|
+
if (!element) return node
|
|
89
|
+
|
|
90
|
+
const handler = createValidationHandler(element, normalizedRules)
|
|
91
|
+
|
|
92
|
+
const existing = validationHandlers.get(element)
|
|
93
|
+
if (existing) {
|
|
94
|
+
element.removeEventListener('blur', existing)
|
|
95
|
+
element.removeEventListener('input', existing)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
element.addEventListener('blur', handler)
|
|
99
|
+
element.addEventListener('input', handler)
|
|
100
|
+
validationHandlers.set(element, handler)
|
|
101
|
+
|
|
102
|
+
handler()
|
|
103
|
+
|
|
104
|
+
return node
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const VALIDATION_METADATA = {
|
|
110
|
+
category: 'interaction' as const,
|
|
111
|
+
priority: validationPriority,
|
|
112
|
+
signature: '(...rules: ValidationRule[]) => Modifier',
|
|
113
|
+
description:
|
|
114
|
+
'Attaches validation rules to form inputs, wiring blur/input handlers and ARIA state.',
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function validation(
|
|
118
|
+
...rules: ValidationArgs[]
|
|
119
|
+
): Modifier {
|
|
120
|
+
const normalized = normalizeRules(rules)
|
|
121
|
+
return createValidationModifier(normalized)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function registerValidationModifier(
|
|
125
|
+
registry?: ModifierRegistry,
|
|
126
|
+
plugin?: PluginInfo,
|
|
127
|
+
): void {
|
|
128
|
+
const factory = (...rules: ValidationArgs[]) =>
|
|
129
|
+
createValidationModifier(normalizeRules(rules))
|
|
130
|
+
|
|
131
|
+
registerModifierWithMetadata(
|
|
132
|
+
'validation',
|
|
133
|
+
factory,
|
|
134
|
+
VALIDATION_METADATA,
|
|
135
|
+
registry,
|
|
136
|
+
plugin,
|
|
137
|
+
)
|
|
138
|
+
}
|
package/src/version.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Information
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent package name and version exports for @tachui/forms.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as packageJson from '../package.json'
|
|
8
|
+
|
|
9
|
+
export const TACHUI_PACKAGE = (packageJson as any).name
|
|
10
|
+
export const TACHUI_PACKAGE_VERSION = (packageJson as any).version
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker-D5nRFTUm.js","sources":["../src/components/date-picker/DatePicker.ts"],"sourcesContent":["/**\n * DatePicker Component (TachUI)\n *\n * SwiftUI-inspired date and time selection component with multiple styles\n * and display modes. Supports reactive bindings and comprehensive customization.\n */\n\nimport type { ModifiableComponent, ModifierBuilder } from '@tachui/core'\nimport { createEffect, 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 * Date picker display components\n */\nexport type DatePickerDisplayComponents = 'date' | 'time' | 'dateAndTime'\n\n/**\n * Date picker style options\n */\nexport type DatePickerStyle = 'compact' | 'wheel' | 'graphical'\n\n/**\n * DatePicker component properties\n */\nexport interface DatePickerProps extends ComponentProps {\n // Core properties\n title?: string\n selection: Signal<Date> | Date\n\n // Display options\n displayedComponents?:\n | DatePickerDisplayComponents\n | Signal<DatePickerDisplayComponents>\n style?: DatePickerStyle | Signal<DatePickerStyle>\n\n // Constraints\n minimumDate?: Date | Signal<Date>\n maximumDate?: Date | Signal<Date>\n\n // Localization\n locale?: string | Signal<string>\n dateFormat?: string | Signal<string>\n timeFormat?: string | Signal<string>\n\n // Behavior\n onChange?: (date: Date) => void\n disabled?: boolean | Signal<boolean>\n\n // Accessibility\n accessibilityLabel?: string\n accessibilityHint?: string\n}\n\n/**\n * DatePicker theme configuration\n */\nexport interface DatePickerTheme {\n colors: {\n background: string\n border: string\n text: string\n selectedBackground: string\n selectedText: string\n disabledText: string\n accent: string\n }\n spacing: {\n padding: number\n gap: number\n itemHeight: number\n }\n borderRadius: number\n fontSize: number\n fontFamily: string\n}\n\n/**\n * Default DatePicker theme\n */\nconst defaultDatePickerTheme: DatePickerTheme = {\n colors: {\n background: '#FFFFFF',\n border: '#D1D1D6',\n text: '#000000',\n selectedBackground: '#007AFF',\n selectedText: '#FFFFFF',\n disabledText: '#8E8E93',\n accent: '#007AFF',\n },\n spacing: {\n padding: 12,\n gap: 8,\n itemHeight: 44,\n },\n borderRadius: 8,\n fontSize: 16,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n}\n\n/**\n * DatePicker component implementation\n */\nexport class DatePickerComponent implements ComponentInstance<DatePickerProps> {\n public readonly type = 'component' as const\n public readonly id: string\n public readonly props: DatePickerProps\n private theme: DatePickerTheme = defaultDatePickerTheme\n private containerElement: HTMLElement | null = null\n\n constructor(props: DatePickerProps) {\n this.props = props\n this.id = `datepicker-${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 getSelectedDate(): Date {\n return this.resolveValue(this.props.selection)\n }\n\n private setSelectedDate(date: Date): void {\n if (isSignal(this.props.selection)) {\n // biome-ignore lint/suspicious/noExplicitAny: Signal setter requires dynamic typing\n ;(this.props.selection as any)(date)\n }\n\n if (this.props.onChange) {\n this.props.onChange(date)\n }\n }\n\n private getDisplayedComponents(): DatePickerDisplayComponents {\n return this.resolveValue(this.props.displayedComponents || 'date')\n }\n\n private getStyle(): DatePickerStyle {\n return this.resolveValue(this.props.style || 'compact')\n }\n\n private isDisabled(): boolean {\n return this.resolveValue(this.props.disabled || false)\n }\n\n private getMinimumDate(): Date | null {\n return this.props.minimumDate\n ? this.resolveValue(this.props.minimumDate)\n : null\n }\n\n private getMaximumDate(): Date | null {\n return this.props.maximumDate\n ? this.resolveValue(this.props.maximumDate)\n : null\n }\n\n private isDateInRange(date: Date): boolean {\n const min = this.getMinimumDate()\n const max = this.getMaximumDate()\n\n if (min && date < min) return false\n if (max && date > max) return false\n\n return true\n }\n\n private createCompactPicker(): DOMNode {\n const selectedDate = this.getSelectedDate()\n const components = this.getDisplayedComponents()\n\n const container = h('div', {\n style: {\n position: 'relative',\n display: 'inline-block',\n },\n })\n\n const input = h('input', {\n type:\n components === 'time'\n ? 'time'\n : components === 'date'\n ? 'date'\n : 'datetime-local',\n value: this.getInputValue(selectedDate, components),\n disabled: this.isDisabled(),\n min: this.getMinimumDate()?.toISOString().split('T')[0],\n max: this.getMaximumDate()?.toISOString().split('T')[0],\n style: {\n padding: `${this.theme.spacing.padding}px`,\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.borderRadius}px`,\n backgroundColor: this.theme.colors.background,\n color: this.isDisabled()\n ? this.theme.colors.disabledText\n : this.theme.colors.text,\n fontSize: `${this.theme.fontSize}px`,\n fontFamily: this.theme.fontFamily,\n cursor: this.isDisabled() ? 'not-allowed' : 'pointer',\n outline: 'none',\n },\n onchange: (e: Event) => {\n const target = e.target as HTMLInputElement\n if (target.value) {\n const newDate = new Date(target.value)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n }\n },\n onfocus: (e: Event) => {\n const target = e.target as HTMLInputElement\n target.style.borderColor = this.theme.colors.accent\n },\n onblur: (e: Event) => {\n const target = e.target as HTMLInputElement\n target.style.borderColor = this.theme.colors.border\n },\n })\n\n const containerDOM = container.element as HTMLElement\n const inputDOM = input.element as HTMLElement\n\n if (containerDOM && inputDOM) {\n containerDOM.appendChild(inputDOM)\n }\n\n return container\n }\n\n private getInputValue(\n date: Date,\n components: DatePickerDisplayComponents\n ): string {\n // Handle invalid dates gracefully\n if (Number.isNaN(date.getTime())) {\n switch (components) {\n case 'date':\n return ''\n case 'time':\n return '00:00'\n case 'dateAndTime':\n return ''\n default:\n return ''\n }\n }\n\n try {\n switch (components) {\n case 'date':\n return date.toISOString().split('T')[0]\n case 'time':\n return date.toTimeString().split(' ')[0].substring(0, 5)\n case 'dateAndTime':\n return date.toISOString().slice(0, 16)\n default:\n return date.toISOString().split('T')[0]\n }\n } catch {\n // Fallback for any date formatting errors\n return ''\n }\n }\n\n private createWheelPicker(): DOMNode {\n // Wheel picker with scrollable date/time components\n const container = h('div', {\n style: {\n display: 'flex',\n justifyContent: 'center',\n gap: `${this.theme.spacing.gap}px`,\n padding: `${this.theme.spacing.padding}px`,\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.borderRadius}px`,\n backgroundColor: this.theme.colors.background,\n },\n })\n\n const components = this.getDisplayedComponents()\n const selectedDate = this.getSelectedDate()\n\n // Create wheel components based on display mode\n if (components === 'date' || components === 'dateAndTime') {\n this.createDateWheels(container, selectedDate)\n }\n\n if (components === 'time' || components === 'dateAndTime') {\n this.createTimeWheels(container, selectedDate)\n }\n\n return container\n }\n\n private createDateWheels(container: DOMNode, selectedDate: Date): void {\n // Month wheel\n const monthWheel = this.createWheel(\n Array.from({ length: 12 }, (_, i) => ({\n value: i,\n label: new Date(2024, i, 1).toLocaleDateString(\n this.resolveValue(this.props.locale || 'en-US'),\n { month: 'short' }\n ),\n })),\n selectedDate.getMonth(),\n value => {\n const newDate = new Date(selectedDate)\n newDate.setMonth(value)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n }\n )\n\n // Day wheel\n const daysInMonth = new Date(\n selectedDate.getFullYear(),\n selectedDate.getMonth() + 1,\n 0\n ).getDate()\n const dayWheel = this.createWheel(\n Array.from({ length: daysInMonth }, (_, i) => ({\n value: i + 1,\n label: (i + 1).toString(),\n })),\n selectedDate.getDate(),\n value => {\n const newDate = new Date(selectedDate)\n newDate.setDate(value)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n }\n )\n\n // Year wheel\n const currentYear = selectedDate.getFullYear()\n const yearRange = 50\n const yearWheel = this.createWheel(\n Array.from({ length: yearRange * 2 }, (_, i) => {\n const year = currentYear - yearRange + i\n return { value: year, label: year.toString() }\n }),\n currentYear,\n value => {\n const newDate = new Date(selectedDate)\n newDate.setFullYear(value)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n }\n )\n\n const containerDOM = container.element as HTMLElement\n if (containerDOM) {\n const monthWheelDOM = monthWheel.element as HTMLElement\n const dayWheelDOM = dayWheel.element as HTMLElement\n const yearWheelDOM = yearWheel.element as HTMLElement\n\n if (monthWheelDOM) containerDOM.appendChild(monthWheelDOM)\n if (dayWheelDOM) containerDOM.appendChild(dayWheelDOM)\n if (yearWheelDOM) containerDOM.appendChild(yearWheelDOM)\n }\n }\n\n private createTimeWheels(container: DOMNode, selectedDate: Date): void {\n // Hour wheel\n const hourWheel = this.createWheel(\n Array.from({ length: 24 }, (_, i) => ({\n value: i,\n label: i.toString().padStart(2, '0'),\n })),\n selectedDate.getHours(),\n value => {\n const newDate = new Date(selectedDate)\n newDate.setHours(value)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n }\n )\n\n // Minute wheel\n const minuteWheel = this.createWheel(\n Array.from({ length: 60 }, (_, i) => ({\n value: i,\n label: i.toString().padStart(2, '0'),\n })),\n selectedDate.getMinutes(),\n value => {\n const newDate = new Date(selectedDate)\n newDate.setMinutes(value)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n }\n )\n\n const containerDOM = container.element as HTMLElement\n if (containerDOM) {\n const hourWheelDOM = hourWheel.element as HTMLElement\n const minuteWheelDOM = minuteWheel.element as HTMLElement\n\n if (hourWheelDOM) containerDOM.appendChild(hourWheelDOM)\n if (minuteWheelDOM) containerDOM.appendChild(minuteWheelDOM)\n }\n }\n\n private createWheel(\n items: { value: number; label: string }[],\n selectedValue: number,\n onSelect: (value: number) => void\n ): DOMNode {\n const wheel = h('div', {\n style: {\n width: '80px',\n height: '200px',\n overflowY: 'scroll',\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.borderRadius}px`,\n scrollSnapType: 'y mandatory',\n },\n })\n\n items.forEach(item => {\n const option = h('div', {\n style: {\n height: `${this.theme.spacing.itemHeight}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor:\n item.value === selectedValue\n ? this.theme.colors.selectedBackground\n : 'transparent',\n color:\n item.value === selectedValue\n ? this.theme.colors.selectedText\n : this.theme.colors.text,\n cursor: 'pointer',\n scrollSnapAlign: 'center',\n fontSize: `${this.theme.fontSize}px`,\n fontFamily: this.theme.fontFamily,\n },\n onclick: () => onSelect(item.value),\n })\n\n const optionDOM = option.element as HTMLElement\n if (optionDOM) {\n optionDOM.textContent = item.label\n }\n\n const wheelDOM = wheel.element as HTMLElement\n if (wheelDOM && optionDOM) {\n wheelDOM.appendChild(optionDOM)\n }\n })\n\n return wheel\n }\n\n private createGraphicalPicker(): DOMNode {\n // Calendar grid for date selection\n const selectedDate = this.getSelectedDate()\n const currentMonth = selectedDate.getMonth()\n const currentYear = selectedDate.getFullYear()\n\n const container = h('div', {\n style: {\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.borderRadius}px`,\n backgroundColor: this.theme.colors.background,\n padding: `${this.theme.spacing.padding}px`,\n fontFamily: this.theme.fontFamily,\n },\n })\n\n // Month/Year header\n const header = h('div', {\n style: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: `${this.theme.spacing.gap}px`,\n padding: `${this.theme.spacing.gap}px`,\n },\n })\n\n const monthYear = h('div', {\n style: {\n fontSize: `${this.theme.fontSize + 2}px`,\n fontWeight: '600',\n color: this.theme.colors.text,\n },\n })\n\n const monthYearDOM = monthYear.element as HTMLElement\n if (monthYearDOM) {\n monthYearDOM.textContent = new Date(\n currentYear,\n currentMonth,\n 1\n ).toLocaleDateString(this.resolveValue(this.props.locale || 'en-US'), {\n month: 'long',\n year: 'numeric',\n })\n }\n\n // Navigation buttons\n const prevButton = h('button', {\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n color: this.theme.colors.accent,\n cursor: 'pointer',\n fontSize: `${this.theme.fontSize + 4}px`,\n padding: '4px 8px',\n },\n onclick: () => {\n const newDate = new Date(selectedDate)\n newDate.setMonth(currentMonth - 1)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n },\n })\n\n const prevButtonDOM = prevButton.element as HTMLElement\n if (prevButtonDOM) {\n prevButtonDOM.textContent = '‹'\n }\n\n const nextButton = h('button', {\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n color: this.theme.colors.accent,\n cursor: 'pointer',\n fontSize: `${this.theme.fontSize + 4}px`,\n padding: '4px 8px',\n },\n onclick: () => {\n const newDate = new Date(selectedDate)\n newDate.setMonth(currentMonth + 1)\n if (this.isDateInRange(newDate)) {\n this.setSelectedDate(newDate)\n }\n },\n })\n\n const nextButtonDOM = nextButton.element as HTMLElement\n if (nextButtonDOM) {\n nextButtonDOM.textContent = '›'\n }\n\n // Calendar grid\n const grid = this.createCalendarGrid(selectedDate)\n\n // Assemble components\n const headerDOM = header.element as HTMLElement\n const containerDOM = container.element as HTMLElement\n\n if (headerDOM) {\n const prevButtonDOM = prevButton.element as HTMLElement\n const monthYearDOM = monthYear.element as HTMLElement\n const nextButtonDOM = nextButton.element as HTMLElement\n\n if (prevButtonDOM) headerDOM.appendChild(prevButtonDOM)\n if (monthYearDOM) headerDOM.appendChild(monthYearDOM)\n if (nextButtonDOM) headerDOM.appendChild(nextButtonDOM)\n }\n\n if (containerDOM) {\n if (headerDOM) containerDOM.appendChild(headerDOM)\n const gridDOM = grid.element as HTMLElement\n if (gridDOM) containerDOM.appendChild(gridDOM)\n }\n\n return container\n }\n\n private createCalendarGrid(selectedDate: Date): DOMNode {\n const currentMonth = selectedDate.getMonth()\n const currentYear = selectedDate.getFullYear()\n\n const grid = h('div', {\n style: {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '2px',\n fontSize: `${this.theme.fontSize}px`,\n },\n })\n\n // Day headers\n const dayHeaders = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n dayHeaders.forEach(day => {\n const dayHeader = h('div', {\n style: {\n padding: '8px 4px',\n textAlign: 'center',\n fontWeight: '600',\n color: this.theme.colors.disabledText,\n fontSize: `${this.theme.fontSize - 2}px`,\n },\n })\n\n const dayHeaderDOM = dayHeader.element as HTMLElement\n if (dayHeaderDOM) {\n dayHeaderDOM.textContent = day\n }\n\n const gridDOM = grid.element as HTMLElement\n if (gridDOM && dayHeaderDOM) {\n gridDOM.appendChild(dayHeaderDOM)\n }\n })\n\n // Calendar days\n const firstDay = new Date(currentYear, currentMonth, 1).getDay()\n const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate()\n const daysInPrevMonth = new Date(currentYear, currentMonth, 0).getDate()\n\n // Previous month's trailing days\n for (let i = firstDay - 1; i >= 0; i--) {\n const day = daysInPrevMonth - i\n const dayElement = this.createDayElement(\n new Date(currentYear, currentMonth - 1, day),\n selectedDate,\n true // isOtherMonth\n )\n const gridDOM = grid.element as HTMLElement\n const dayElementDOM = dayElement.element as HTMLElement\n if (gridDOM && dayElementDOM) {\n gridDOM.appendChild(dayElementDOM)\n }\n }\n\n // Current month days\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(currentYear, currentMonth, day)\n const dayElement = this.createDayElement(date, selectedDate, false)\n const gridDOM = grid.element as HTMLElement\n const dayElementDOM = dayElement.element as HTMLElement\n if (gridDOM && dayElementDOM) {\n gridDOM.appendChild(dayElementDOM)\n }\n }\n\n // Next month's leading days\n const totalCells = Math.ceil((firstDay + daysInMonth) / 7) * 7\n const remainingCells = totalCells - (firstDay + daysInMonth)\n for (let day = 1; day <= remainingCells; day++) {\n const dayElement = this.createDayElement(\n new Date(currentYear, currentMonth + 1, day),\n selectedDate,\n true // isOtherMonth\n )\n const gridDOM = grid.element as HTMLElement\n const dayElementDOM = dayElement.element as HTMLElement\n if (gridDOM && dayElementDOM) {\n gridDOM.appendChild(dayElementDOM)\n }\n }\n\n return grid\n }\n\n private createDayElement(\n date: Date,\n selectedDate: Date,\n isOtherMonth: boolean\n ): DOMNode {\n const isSelected = date.toDateString() === selectedDate.toDateString()\n const isToday = date.toDateString() === new Date().toDateString()\n const isInRange = this.isDateInRange(date)\n const isDisabled = this.isDisabled() || !isInRange\n\n const dayElement = h('button', {\n disabled: isDisabled,\n style: {\n padding: '8px',\n border: 'none',\n backgroundColor: isSelected\n ? this.theme.colors.selectedBackground\n : isToday\n ? `${this.theme.colors.accent}20`\n : 'transparent',\n color: isSelected\n ? this.theme.colors.selectedText\n : isOtherMonth || isDisabled\n ? this.theme.colors.disabledText\n : this.theme.colors.text,\n borderRadius: '4px',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: `${this.theme.fontSize}px`,\n fontWeight: isSelected || isToday ? '600' : '400',\n textAlign: 'center',\n minHeight: '36px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n onclick: () => {\n if (!isDisabled) {\n this.setSelectedDate(date)\n }\n },\n onmouseenter: (e: Event) => {\n if (!isDisabled && !isSelected) {\n const target = e.target as HTMLElement\n target.style.backgroundColor = `${this.theme.colors.accent}10`\n }\n },\n onmouseleave: (e: Event) => {\n if (!isDisabled && !isSelected && !isToday) {\n const target = e.target as HTMLElement\n target.style.backgroundColor = 'transparent'\n }\n },\n })\n\n const dayElementDOM = dayElement.element as HTMLElement\n if (dayElementDOM) {\n dayElementDOM.textContent = date.getDate().toString()\n }\n\n return dayElement\n }\n\n render(): DOMNode {\n const container = h('div', {\n id: this.id,\n 'data-component': 'datepicker',\n style: {\n display: 'inline-block',\n },\n })\n\n // Add title if provided\n if (this.props.title) {\n const label = h('label', {\n for: `${this.id}-input`,\n style: {\n display: 'block',\n marginBottom: `${this.theme.spacing.gap}px`,\n fontSize: `${this.theme.fontSize}px`,\n fontWeight: '500',\n color: this.theme.colors.text,\n fontFamily: this.theme.fontFamily,\n },\n })\n\n const labelDOM = label.element as HTMLElement\n if (labelDOM) {\n labelDOM.textContent = this.props.title\n }\n\n const containerDOM = container.element as HTMLElement\n if (containerDOM && labelDOM) {\n containerDOM.appendChild(labelDOM)\n }\n }\n\n // Create picker based on style\n const style = this.getStyle()\n let picker: DOMNode\n\n switch (style) {\n case 'wheel':\n picker = this.createWheelPicker()\n break\n case 'graphical':\n picker = this.createGraphicalPicker()\n break\n default:\n picker = this.createCompactPicker()\n break\n }\n\n const containerDOM = container.element as HTMLElement\n const pickerDOM = picker.element as HTMLElement\n if (containerDOM && pickerDOM) {\n containerDOM.appendChild(pickerDOM)\n }\n\n // Set up reactive effects\n createEffect(() => {\n // Update picker when reactive props change\n if (\n isSignal(this.props.selection) ||\n isSignal(this.props.style) ||\n isSignal(this.props.displayedComponents)\n ) {\n // Re-render picker with new values\n this.updatePicker()\n }\n })\n\n return container\n }\n\n private updatePicker(): void {\n // Re-render the picker when reactive properties change\n if (this.containerElement) {\n const style = this.getStyle()\n let newPicker: DOMNode\n\n switch (style) {\n case 'wheel':\n newPicker = this.createWheelPicker()\n break\n case 'graphical':\n newPicker = this.createGraphicalPicker()\n break\n default:\n newPicker = this.createCompactPicker()\n break\n }\n\n const newPickerDOM = newPicker.element as HTMLElement\n if (newPickerDOM) {\n // Replace the old picker with the new one\n const oldPicker = this.containerElement.querySelector(\n '[data-component=\"datepicker\"] > *:last-child'\n )\n if (oldPicker && this.containerElement) {\n this.containerElement.replaceChild(newPickerDOM, oldPicker)\n }\n }\n }\n }\n}\n\n/**\n * Create a DatePicker component\n */\nexport function DatePicker(\n props: DatePickerProps\n): ModifiableComponent<DatePickerProps> & {\n modifier: ModifierBuilder<ModifiableComponent<DatePickerProps>>\n} {\n return withModifiers(new DatePickerComponent(props))\n}\n\n/**\n * DatePicker utility functions and presets\n */\nexport const DatePickerUtils = {\n /**\n * Create a birthday picker (past dates only)\n */\n birthday(selection: Signal<Date>): DatePickerProps {\n return {\n title: 'Birthday',\n selection,\n displayedComponents: 'date',\n style: 'compact',\n maximumDate: new Date(),\n }\n },\n\n /**\n * Create a meeting time picker (future dates only)\n */\n meetingTime(selection: Signal<Date>): DatePickerProps {\n return {\n title: 'Meeting Time',\n selection,\n displayedComponents: 'dateAndTime',\n style: 'compact',\n minimumDate: new Date(),\n }\n },\n\n /**\n * Create a deadline picker with date range\n */\n deadline(\n selection: Signal<Date>,\n minimumDate?: Date,\n maximumDate?: Date\n ): DatePickerProps {\n return {\n title: 'Deadline',\n selection,\n displayedComponents: 'date',\n style: 'graphical',\n minimumDate: minimumDate || new Date(),\n maximumDate:\n maximumDate || new Date(Date.now() + 90 * 24 * 60 * 60 * 1000), // 90 days from now\n }\n },\n\n /**\n * Create a time-only picker\n */\n timeOnly(selection: Signal<Date>): DatePickerProps {\n return {\n title: 'Time',\n selection,\n displayedComponents: 'time',\n style: 'wheel',\n }\n },\n}\n\n/**\n * DatePicker styles and theming\n */\nexport const DatePickerStyles = {\n theme: defaultDatePickerTheme,\n\n /**\n * Create a custom theme\n */\n createTheme(overrides: Partial<DatePickerTheme>): DatePickerTheme {\n return { ...defaultDatePickerTheme, ...overrides }\n },\n}\n"],"names":["defaultDatePickerTheme","DatePickerComponent","props","value","isSignal","date","min","max","selectedDate","components","container","h","input","e","target","newDate","containerDOM","inputDOM","monthWheel","_","daysInMonth","dayWheel","currentYear","yearRange","yearWheel","year","monthWheelDOM","dayWheelDOM","yearWheelDOM","hourWheel","i","minuteWheel","hourWheelDOM","minuteWheelDOM","items","selectedValue","onSelect","wheel","item","optionDOM","wheelDOM","currentMonth","header","monthYear","monthYearDOM","prevButton","prevButtonDOM","nextButton","nextButtonDOM","grid","headerDOM","gridDOM","day","dayHeaderDOM","firstDay","daysInPrevMonth","dayElement","dayElementDOM","remainingCells","isOtherMonth","isSelected","isToday","isInRange","isDisabled","labelDOM","style","picker","pickerDOM","createEffect","newPicker","newPickerDOM","oldPicker","DatePicker","withModifiers"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Select-yZyKooXk.js","sources":["../src/components/selection/Checkbox.ts","../src/components/selection/Radio.ts","../src/components/selection/Select.ts"],"sourcesContent":["/**\n * Checkbox Component\n *\n * SwiftUI-inspired checkbox with support for indeterminate state,\n * validation, and accessibility features.\n */\n\nimport type { Component, ComponentInstance } from '@tachui/core'\nimport { createEffect, createSignal, h, text } from '@tachui/core'\nimport { createField } from '../../state'\nimport type { CheckboxProps } from '../../types'\n\n/**\n * Checkbox component implementation\n */\nexport const Checkbox: Component<CheckboxProps> = props => {\n const {\n name,\n label,\n disabled = false,\n required = false,\n checked: controlledChecked,\n defaultChecked = false,\n indeterminate = false,\n validation,\n onChange,\n onBlur,\n onFocus,\n error: externalError,\n helperText,\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(\n name,\n controlledChecked ?? defaultChecked,\n validation\n )\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\n // Sync with controlled value\n if (controlledChecked !== undefined) {\n createEffect(() => {\n if (field.value() !== controlledChecked) {\n field.setValue(controlledChecked)\n }\n })\n }\n\n // Handle checkbox change\n const handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n const newChecked = target.checked\n\n field.setValue(newChecked)\n\n if (formContext) {\n formContext.setValue(name, newChecked)\n }\n\n if (onChange) {\n onChange(name, newChecked, 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\n const handleBlur = (_event: Event) => {\n setFocused(false)\n field.onBlur()\n\n if (onBlur) {\n onBlur(name, field.value())\n }\n }\n\n // Determine error message\n const errorMessage =\n externalError || field.error() || formContext?.getError(name)\n\n // Handle keyboard interaction for custom styling\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n const checkbox = event.target as HTMLInputElement\n checkbox.checked = !checkbox.checked\n handleChange(event)\n }\n }\n\n const componentInstance: ComponentInstance = {\n type: 'component',\n id: restProps.id || `checkbox-${name}`,\n render: () =>\n h(\n 'div',\n {\n ...restProps,\n class: `tachui-checkbox ${restProps.class || ''}`.trim(),\n 'data-tachui-checkbox-container': true,\n 'data-field-state': errorMessage\n ? 'error'\n : field.validating()\n ? 'validating'\n : 'valid',\n 'data-checked': field.value(),\n 'data-indeterminate': indeterminate,\n 'data-disabled': disabled,\n },\n // Checkbox input and label wrapper\n h(\n 'label',\n {\n 'data-tachui-checkbox-label': true,\n 'data-focused': focused(),\n 'data-disabled': disabled,\n },\n // Hidden native checkbox for accessibility\n h('input', {\n type: 'checkbox',\n id: restProps.id || name,\n name,\n checked: field.value(),\n disabled,\n required,\n onchange: handleChange,\n onfocus: handleFocus,\n onblur: handleBlur,\n onkeydown: handleKeyDown,\n 'aria-invalid': !!errorMessage,\n 'aria-describedby':\n [\n errorMessage ? `${name}-error` : null,\n helperText ? `${name}-helper` : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n 'data-tachui-checkbox-input': true,\n style: {\n position: 'absolute',\n opacity: '0',\n width: '1px',\n height: '1px',\n margin: '-1px',\n padding: '0',\n border: '0',\n clip: 'rect(0,0,0,0)',\n },\n }),\n\n // Custom checkbox visual\n h(\n 'div',\n {\n 'data-tachui-checkbox-visual': true,\n 'data-checked': field.value(),\n 'data-indeterminate': indeterminate,\n 'data-focused': focused(),\n 'data-disabled': disabled,\n 'data-error': !!errorMessage,\n 'aria-hidden': 'true',\n role: 'presentation',\n },\n // Checkmark or indeterminate indicator\n ...(field.value() || indeterminate\n ? [\n h(\n 'div',\n {\n 'data-tachui-checkbox-indicator': true,\n 'data-type': indeterminate ? 'indeterminate' : 'checked',\n },\n text(indeterminate ? '−' : '✓')\n ),\n ]\n : [])\n ),\n\n // Label text\n ...(label\n ? [\n h(\n 'span',\n {\n 'data-tachui-checkbox-text': true,\n 'data-disabled': disabled,\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\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 // Validation indicator\n ...(field.validating()\n ? [\n h(\n 'div',\n {\n 'data-tachui-validation-spinner': true,\n 'aria-label': 'Validating...',\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 * Switch/Toggle component variant of Checkbox\n */\nexport const Switch: Component<\n CheckboxProps & {\n size?: 'small' | 'medium' | 'large'\n }\n> = props => {\n const { size = 'medium', ...checkboxProps } = props\n\n // Add switch-specific props\n const switchProps = {\n ...checkboxProps,\n class:\n `tachui-switch tachui-switch-${size} ${checkboxProps.class || ''}`.trim(),\n }\n\n const checkbox = Checkbox(switchProps)\n return {\n ...checkbox,\n render: () => {\n const result = checkbox.render()\n if (Array.isArray(result)) {\n return result.map(node => ({\n ...node,\n props: {\n ...node.props,\n 'data-tachui-switch': true,\n 'data-switch-size': size,\n },\n }))\n }\n return {\n ...result,\n props: {\n ...result.props,\n 'data-tachui-switch': true,\n 'data-switch-size': size,\n },\n }\n },\n }\n}\n\n/**\n * CheckboxGroup component for managing multiple related checkboxes\n */\nexport const CheckboxGroup: Component<{\n name: string\n label?: string\n options: Array<{\n value: any\n label: string\n disabled?: boolean\n }>\n value?: any[]\n defaultValue?: any[]\n onChange?: (name: string, value: any[], selected: any) => void\n validation?: any\n error?: string\n helperText?: string\n disabled?: boolean\n required?: boolean\n direction?: 'horizontal' | 'vertical'\n id?: string\n [key: string]: any\n}> = props => {\n const {\n name,\n label,\n options,\n value: controlledValue,\n defaultValue = [],\n onChange,\n validation,\n error,\n helperText,\n disabled = false,\n required = false,\n direction = 'vertical',\n ...restProps\n } = props\n\n // Create field state for the group\n const field = createField(name, controlledValue ?? defaultValue, validation)\n\n // Handle individual checkbox changes\n const handleCheckboxChange = (optionValue: any, checked: boolean) => {\n const currentValue = field.value() || []\n let newValue: any[]\n\n if (checked) {\n newValue = [...currentValue, optionValue]\n } else {\n newValue = currentValue.filter((v: any) => v !== optionValue)\n }\n\n field.setValue(newValue)\n\n if (onChange) {\n onChange(name, newValue, optionValue)\n }\n }\n\n const componentInstance: ComponentInstance = {\n type: 'component',\n id: restProps.id || `checkbox-group-${name}`,\n render: () =>\n h(\n 'fieldset',\n {\n ...restProps,\n 'data-tachui-checkbox-group': true,\n 'data-direction': direction,\n 'data-disabled': disabled,\n },\n // Group label\n ...(label\n ? [\n h(\n 'legend',\n {\n 'data-tachui-group-label': true,\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 // Checkbox options\n h(\n 'div',\n {\n 'data-tachui-checkbox-options': true,\n 'data-direction': direction,\n },\n ...options.flatMap((option, index) => {\n const checkbox = Checkbox({\n name: `${name}-${index}`,\n label: option.label,\n checked: (field.value() || []).includes(option.value),\n disabled: disabled || option.disabled,\n onChange: (_, checked) =>\n handleCheckboxChange(option.value, checked),\n })\n const result = checkbox.render()\n return Array.isArray(result) ? result : [result]\n })\n ),\n\n // Error message\n ...(error\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(error)\n ),\n ]\n : []),\n\n // Helper text\n ...(helperText && !error\n ? [\n h(\n 'div',\n {\n id: `${name}-helper`,\n 'data-tachui-helper': true,\n },\n text(helperText)\n ),\n ]\n : [])\n ),\n props: props,\n }\n\n return componentInstance\n}\n","/**\n * Radio Button Component\n *\n * SwiftUI-inspired radio button with group management,\n * validation, and comprehensive accessibility support.\n */\n\nimport type { Component, ComponentInstance } from '@tachui/core'\nimport { createEffect, createSignal, h, text } from '@tachui/core'\nimport { createField } from '../../state'\nimport type { RadioProps } from '../../types'\n\n/**\n * Individual Radio component\n */\nexport const Radio: Component<RadioProps> = props => {\n const {\n name,\n value,\n label,\n checked: controlledChecked,\n groupName,\n disabled = false,\n required = false,\n validation,\n onChange,\n onBlur,\n onFocus,\n error: externalError,\n helperText,\n ...restProps\n } = props\n\n // Get form context if available\n const formContext = (props as any)._formContext\n\n // For radio buttons, we use the group name or the name\n const fieldName = groupName || name\n\n // Create field state (shared across radio group)\n const field = createField(\n fieldName,\n controlledChecked ? value : undefined,\n validation\n )\n\n // Register field with form if form context exists\n if (formContext) {\n formContext.register(fieldName, validation)\n }\n\n const [focused, setFocused] = createSignal(false)\n\n // Determine if this radio is checked\n const isChecked = () => field.value() === value\n\n // Handle radio change\n const handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n\n if (target.checked) {\n field.setValue(value)\n\n if (formContext) {\n formContext.setValue(fieldName, value)\n }\n\n if (onChange) {\n onChange(fieldName, value, field as any)\n }\n }\n }\n\n // Handle focus\n const handleFocus = (_event: Event) => {\n setFocused(true)\n field.onFocus()\n\n if (onFocus) {\n onFocus(fieldName, field.value())\n }\n }\n\n // Handle blur\n const handleBlur = (_event: Event) => {\n setFocused(false)\n field.onBlur()\n\n if (onBlur) {\n onBlur(fieldName, field.value())\n }\n }\n\n // Determine error message\n const errorMessage =\n externalError || field.error() || formContext?.getError(fieldName)\n\n // Handle keyboard interaction\n const handleKeyDown = (event: KeyboardEvent) => {\n // Arrow keys for radio group navigation would be handled at the group level\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n handleChange(event)\n }\n }\n\n const componentInstance: ComponentInstance = {\n type: 'component',\n id: restProps.id || `radio-${fieldName}-${value}`,\n render: () =>\n h(\n 'div',\n {\n ...restProps,\n class: `tachui-radio ${restProps.class || ''}`.trim(),\n 'data-tachui-radio-container': true,\n 'data-field-state': errorMessage\n ? 'error'\n : field.validating()\n ? 'validating'\n : 'valid',\n 'data-checked': isChecked(),\n 'data-disabled': disabled,\n },\n // Radio input and label wrapper\n h(\n 'label',\n {\n 'data-tachui-radio-label': true,\n 'data-focused': focused(),\n 'data-disabled': disabled,\n },\n // Hidden native radio for accessibility\n h('input', {\n type: 'radio',\n id: restProps.id || `${fieldName}-${value}`,\n name: fieldName,\n value: value,\n checked: isChecked(),\n disabled,\n required,\n onchange: handleChange,\n onfocus: handleFocus,\n onblur: handleBlur,\n onkeydown: handleKeyDown,\n 'aria-invalid': !!errorMessage,\n 'aria-describedby':\n [\n errorMessage ? `${fieldName}-error` : null,\n helperText ? `${fieldName}-helper` : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n 'data-tachui-radio-input': true,\n style: {\n position: 'absolute',\n opacity: '0',\n width: '1px',\n height: '1px',\n margin: '-1px',\n padding: '0',\n border: '0',\n clip: 'rect(0,0,0,0)',\n },\n }),\n\n // Custom radio visual\n h(\n 'div',\n {\n 'data-tachui-radio-visual': true,\n 'data-checked': isChecked(),\n 'data-focused': focused(),\n 'data-disabled': disabled,\n 'data-error': !!errorMessage,\n 'aria-hidden': 'true',\n role: 'presentation',\n },\n // Radio dot indicator\n ...(isChecked()\n ? [\n h('div', {\n 'data-tachui-radio-dot': true,\n }),\n ]\n : [])\n ),\n\n // Label text\n ...(label\n ? [\n h(\n 'span',\n {\n 'data-tachui-radio-text': true,\n 'data-disabled': disabled,\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 ),\n props: props,\n cleanup: [\n () => {\n // Only unregister if this is the last radio in the group\n // This would need more sophisticated group management\n // For now, we let the form handle cleanup\n },\n ],\n }\n\n return componentInstance\n}\n\n/**\n * RadioGroup component for managing multiple radio buttons\n */\nexport const RadioGroup: Component<{\n name: string\n label?: string\n options: Array<{\n value: any\n label: string\n disabled?: boolean\n }>\n value?: any\n defaultValue?: any\n onChange?: (name: string, value: any) => void\n validation?: any\n error?: string\n helperText?: string\n disabled?: boolean\n required?: boolean\n direction?: 'horizontal' | 'vertical'\n id?: string\n [key: string]: any\n}> = props => {\n const {\n name,\n label,\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n validation,\n error,\n helperText,\n disabled = false,\n required = false,\n direction = 'vertical',\n ...restProps\n } = props\n\n // Get form context if available\n const formContext = (props as any)._formContext\n\n // Create field state for the group\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 // Sync with controlled value\n if (controlledValue !== undefined) {\n createEffect(() => {\n if (field.value() !== controlledValue) {\n field.setValue(controlledValue)\n }\n })\n }\n\n // Handle radio selection change\n const handleRadioChange = (optionValue: any) => {\n field.setValue(optionValue)\n\n if (formContext) {\n formContext.setValue(name, optionValue)\n }\n\n if (onChange) {\n onChange(name, optionValue)\n }\n }\n\n // Keyboard navigation for radio group\n const handleKeyDown = (event: KeyboardEvent) => {\n const currentIndex = options.findIndex(opt => opt.value === field.value())\n let nextIndex = currentIndex\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n event.preventDefault()\n nextIndex = (currentIndex + 1) % options.length\n break\n case 'ArrowUp':\n case 'ArrowLeft':\n event.preventDefault()\n nextIndex = currentIndex === 0 ? options.length - 1 : currentIndex - 1\n break\n case 'Home':\n event.preventDefault()\n nextIndex = 0\n break\n case 'End':\n event.preventDefault()\n nextIndex = options.length - 1\n break\n default:\n return\n }\n\n // Skip disabled options\n while (options[nextIndex]?.disabled) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n nextIndex = (nextIndex + 1) % options.length\n } else {\n nextIndex = nextIndex === 0 ? options.length - 1 : nextIndex - 1\n }\n\n // Prevent infinite loop\n if (nextIndex === currentIndex) break\n }\n\n if (!options[nextIndex]?.disabled) {\n handleRadioChange(options[nextIndex].value)\n\n // Focus the newly selected radio\n setTimeout(() => {\n const radioInput = document.querySelector(\n `input[name=\"${name}\"][value=\"${options[nextIndex].value}\"]`\n ) as HTMLInputElement\n if (radioInput) {\n radioInput.focus()\n }\n }, 0)\n }\n }\n\n const errorMessage = error || field.error()\n\n const componentInstance: ComponentInstance = {\n type: 'component',\n id: restProps.id || `radio-group-${name}`,\n render: () =>\n h(\n 'fieldset',\n {\n ...restProps,\n 'data-tachui-radio-group': true,\n 'data-direction': direction,\n 'data-disabled': disabled,\n role: 'radiogroup',\n 'aria-invalid': !!errorMessage,\n 'aria-describedby':\n [\n errorMessage ? `${name}-error` : null,\n helperText ? `${name}-helper` : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n onkeydown: handleKeyDown,\n },\n // Group label\n ...(label\n ? [\n h(\n 'legend',\n {\n 'data-tachui-group-label': true,\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 // Radio options\n h(\n 'div',\n {\n 'data-tachui-radio-options': true,\n 'data-direction': direction,\n },\n ...options.flatMap((option, index) => {\n const radio = Radio({\n name: `${name}-${index}`,\n groupName: name,\n value: option.value,\n label: option.label,\n checked: field.value() === option.value,\n disabled: disabled || option.disabled,\n required,\n onChange: () => handleRadioChange(option.value),\n _formContext: formContext,\n })\n const result = radio.render()\n return Array.isArray(result) ? result : [result]\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 props: props,\n cleanup: [\n () => {\n if (formContext) {\n formContext.unregister(name)\n }\n },\n ],\n }\n\n return componentInstance\n}\n","/**\n * Select/Picker Component\n *\n * SwiftUI-inspired select component with search, multiple selection,\n * async options loading, and comprehensive accessibility support.\n */\n\nimport type { Component, ComponentInstance } from '@tachui/core'\nimport {\n createEffect,\n createSignal,\n h,\n text,\n useLifecycle,\n setupOutsideClickDetection,\n} from '@tachui/core'\nimport { createField } from '../../state'\nimport type { SelectOption, SelectProps } from '../../types'\n\n/**\n * Select component implementation\n */\nexport const Select: Component<SelectProps> = props => {\n const {\n name,\n label,\n options,\n multiple = false,\n searchable = false,\n clearable = false,\n placeholder = multiple ? 'Select options...' : 'Select an option...',\n noOptionsMessage = 'No options available',\n loadingMessage = 'Loading...',\n maxMenuHeight = 200,\n disabled = false,\n required = false,\n value: controlledValue,\n defaultValue,\n validation,\n onChange,\n onBlur,\n onFocus,\n error: externalError,\n helperText,\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 [isOpen, setIsOpen] = createSignal(false)\n const [focused, setFocused] = createSignal(false)\n const [searchQuery, setSearchQuery] = createSignal('')\n const [highlightedIndex, setHighlightedIndex] = createSignal(-1)\n const [loading] = createSignal(false)\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 // Filter options based on search query\n const filteredOptions = () => {\n if (!searchable || !searchQuery()) {\n return options\n }\n\n const query = searchQuery().toLowerCase()\n return options.filter(\n option =>\n option.label.toLowerCase().includes(query) ||\n String(option.value).toLowerCase().includes(query)\n )\n }\n\n // Get display value for selected option(s)\n const getDisplayValue = () => {\n const value = field.value()\n\n if (multiple) {\n if (!value || !Array.isArray(value) || value.length === 0) {\n return placeholder\n }\n\n const selectedOptions = options.filter(opt => value.includes(opt.value))\n return selectedOptions.map(opt => opt.label).join(', ')\n } else {\n if (value === null || value === undefined || value === '') {\n return placeholder\n }\n\n const selectedOption = options.find(opt => opt.value === value)\n return selectedOption ? selectedOption.label : String(value)\n }\n }\n\n // Handle option selection\n const handleOptionSelect = (option: SelectOption) => {\n if (option.disabled) return\n\n let newValue: any\n\n if (multiple) {\n const currentValue = field.value() || []\n if (currentValue.includes(option.value)) {\n newValue = currentValue.filter((v: any) => v !== option.value)\n } else {\n newValue = [...currentValue, option.value]\n }\n } else {\n newValue = option.value\n setIsOpen(false)\n setSearchQuery('')\n }\n\n field.setValue(newValue)\n\n if (formContext) {\n formContext.setValue(name, newValue)\n }\n\n if (onChange) {\n onChange(name, newValue, field as any)\n }\n }\n\n // Handle dropdown toggle\n const toggleDropdown = () => {\n if (disabled) return\n\n const newOpen = !isOpen()\n setIsOpen(newOpen)\n\n if (newOpen) {\n setHighlightedIndex(-1)\n if (searchable) {\n setSearchQuery('')\n }\n }\n }\n\n // Handle search input\n const handleSearch = (event: Event) => {\n const target = event.target as HTMLInputElement\n setSearchQuery(target.value)\n setHighlightedIndex(-1)\n }\n\n // Handle keyboard navigation\n const handleKeyDown = (event: KeyboardEvent) => {\n const filtered = filteredOptions()\n\n switch (event.key) {\n case 'Enter':\n event.preventDefault()\n if (!isOpen()) {\n toggleDropdown()\n } else if (highlightedIndex() >= 0 && filtered[highlightedIndex()]) {\n handleOptionSelect(filtered[highlightedIndex()])\n }\n break\n\n case ' ':\n if (!searchable || !isOpen()) {\n event.preventDefault()\n toggleDropdown()\n }\n break\n\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setSearchQuery('')\n break\n\n case 'ArrowDown':\n event.preventDefault()\n if (!isOpen()) {\n toggleDropdown()\n } else {\n const nextIndex = Math.min(\n highlightedIndex() + 1,\n filtered.length - 1\n )\n setHighlightedIndex(nextIndex)\n }\n break\n\n case 'ArrowUp':\n event.preventDefault()\n if (isOpen()) {\n const prevIndex = Math.max(highlightedIndex() - 1, -1)\n setHighlightedIndex(prevIndex)\n }\n break\n\n case 'Home':\n if (isOpen()) {\n event.preventDefault()\n setHighlightedIndex(0)\n }\n break\n\n case 'End':\n if (isOpen()) {\n event.preventDefault()\n setHighlightedIndex(filtered.length - 1)\n }\n break\n\n case 'Backspace':\n if (clearable && !searchable && field.value() !== null) {\n event.preventDefault()\n handleClear()\n }\n break\n }\n }\n\n // Handle focus\n const handleFocus = () => {\n setFocused(true)\n field.onFocus()\n\n if (onFocus) {\n onFocus(name, field.value())\n }\n }\n\n // Handle blur\n const handleBlur = (event: FocusEvent) => {\n // ENHANCED: Use requestAnimationFrame instead of setTimeout for better performance\n requestAnimationFrame(() => {\n const relatedTarget = event.relatedTarget as Element\n const container = (event.target as Element).closest(\n '[data-tachui-select-container]'\n )\n\n if (!container?.contains(relatedTarget)) {\n setFocused(false)\n setIsOpen(false)\n field.onBlur()\n\n if (onBlur) {\n onBlur(name, field.value())\n }\n }\n })\n }\n\n // Handle clear\n const handleClear = () => {\n const newValue = multiple ? [] : null\n field.setValue(newValue)\n\n if (formContext) {\n formContext.setValue(name, newValue)\n }\n\n if (onChange) {\n onChange(name, newValue, field as any)\n }\n }\n\n // Check if option is selected\n const isOptionSelected = (option: SelectOption) => {\n const value = field.value()\n\n if (multiple) {\n return Array.isArray(value) && value.includes(option.value)\n }\n\n return value === option.value\n }\n\n // Determine error message\n const errorMessage =\n externalError || field.error() || formContext?.getError(name)\n\n const componentInstance: ComponentInstance = {\n type: 'component',\n id: restProps.id || `select-${name}`,\n cleanup: [],\n render: () => ({\n type: 'element',\n tag: 'div',\n props: {\n ...restProps,\n class: `tachui-select ${restProps.class || ''}`.trim(),\n 'data-tachui-select-container': true,\n 'data-field-state': errorMessage\n ? 'error'\n : field.validating()\n ? 'validating'\n : 'valid',\n 'data-open': isOpen(),\n 'data-disabled': disabled,\n 'data-multiple': multiple,\n 'data-searchable': searchable,\n },\n children: [\n // Label\n ...(label\n ? [\n h(\n 'label',\n {\n for: restProps.id || name,\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 // Select trigger\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n id: restProps.id || name,\n tabindex: disabled ? -1 : 0,\n role: 'combobox',\n 'aria-expanded': isOpen(),\n 'aria-haspopup': 'listbox',\n 'aria-invalid': !!errorMessage,\n 'aria-describedby':\n [\n errorMessage ? `${name}-error` : null,\n helperText ? `${name}-helper` : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined,\n onclick: toggleDropdown,\n onkeydown: handleKeyDown,\n onfocus: handleFocus,\n onblur: handleBlur,\n 'data-tachui-select-trigger': true,\n 'data-focused': focused(),\n 'data-disabled': disabled,\n 'data-error': !!errorMessage,\n },\n children: [\n // Display value\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-value': true,\n 'data-placeholder':\n !field.value() ||\n (multiple && (!field.value() || field.value().length === 0)),\n },\n children: [text(getDisplayValue())],\n },\n\n // Actions (clear, dropdown arrow)\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-actions': true,\n },\n children: [\n // Clear button\n ...(clearable &&\n field.value() &&\n (!multiple ||\n (Array.isArray(field.value()) && field.value().length > 0))\n ? [\n {\n type: 'element' as const,\n tag: 'button',\n props: {\n type: 'button',\n onclick: (e: Event) => {\n e.stopPropagation()\n handleClear()\n },\n 'aria-label': 'Clear selection',\n 'data-tachui-select-clear': true,\n },\n children: [text('×')],\n },\n ]\n : []),\n\n // Dropdown arrow\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-arrow': true,\n 'data-open': isOpen(),\n },\n children: [text('▼')],\n },\n ],\n },\n ],\n },\n\n // Dropdown menu\n ...(isOpen()\n ? [\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-dropdown': true,\n style: {\n maxHeight: `${maxMenuHeight}px`,\n },\n },\n children: [\n // Search input\n ...(searchable\n ? [\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-search': true,\n },\n children: [\n {\n type: 'element' as const,\n tag: 'input',\n props: {\n type: 'text',\n placeholder: 'Search...',\n value: searchQuery(),\n oninput: handleSearch,\n 'data-tachui-select-search-input': true,\n },\n },\n ],\n },\n ]\n : []),\n\n // Options list\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n role: 'listbox',\n 'aria-multiselectable': multiple,\n 'data-tachui-select-options': true,\n },\n children:\n filteredOptions().length > 0\n ? filteredOptions().map((option, index) => ({\n type: 'element' as const,\n tag: 'div',\n props: {\n role: 'option',\n 'aria-selected': isOptionSelected(option),\n 'aria-disabled': option.disabled,\n onclick: () => handleOptionSelect(option),\n 'data-tachui-select-option': true,\n 'data-selected': isOptionSelected(option),\n 'data-highlighted': highlightedIndex() === index,\n 'data-disabled': option.disabled,\n 'data-group': option.group,\n },\n children: [\n // Selection indicator for multiple\n ...(multiple\n ? [\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-checkbox': true,\n 'data-checked':\n isOptionSelected(option),\n },\n children: [\n text(\n isOptionSelected(option) ? '✓' : ''\n ),\n ],\n },\n ]\n : []),\n\n // Option label\n text(option.label),\n ],\n }))\n : [\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n 'data-tachui-select-no-options': true,\n },\n children: [\n text(\n loading() ? loadingMessage : noOptionsMessage\n ),\n ],\n },\n ],\n },\n ],\n },\n ]\n : []),\n\n // Error message\n ...(errorMessage\n ? [\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n id: `${name}-error`,\n role: 'alert',\n 'aria-live': 'polite',\n 'data-tachui-error': true,\n },\n children: [text(errorMessage)],\n },\n ]\n : []),\n\n // Helper text\n ...(helperText && !errorMessage\n ? [\n {\n type: 'element' as const,\n tag: 'div',\n props: {\n id: `${name}-helper`,\n 'data-tachui-helper': true,\n },\n children: [text(helperText)],\n },\n ]\n : []),\n ],\n }),\n props: props,\n }\n\n // Add form cleanup\n if (!componentInstance.cleanup) componentInstance.cleanup = []\n componentInstance.cleanup.push(() => {\n if (formContext) {\n formContext.unregister(name)\n }\n })\n\n // ENHANCED: Set up lifecycle hooks for improved click outside detection\n useLifecycle(componentInstance, {\n onDOMReady: (_elements, primaryElement) => {\n if (primaryElement) {\n // Set up enhanced outside click detection instead of relying on setTimeout blur\n setupOutsideClickDetection(\n componentInstance,\n () => {\n if (isOpen()) {\n setIsOpen(false)\n setFocused(false)\n field.onBlur()\n\n if (onBlur) {\n onBlur(name, field.value())\n }\n }\n },\n '[data-tachui-select-container]'\n )\n }\n },\n })\n\n return componentInstance\n}\n\n/**\n * MultiSelect variant for clearer multiple selection intent\n */\nexport const MultiSelect: Component<SelectProps> = props => {\n return Select({ ...props, multiple: true })\n}\n\n/**\n * Combobox variant with always-searchable behavior\n */\nexport const Combobox: Component<SelectProps> = props => {\n return Select({ ...props, searchable: true })\n}\n"],"names":["Checkbox","props","name","label","disabled","required","controlledChecked","defaultChecked","indeterminate","validation","onChange","onBlur","onFocus","externalError","helperText","restProps","formContext","field","createField","focused","setFocused","createSignal","createEffect","handleChange","event","newChecked","handleFocus","_event","handleBlur","errorMessage","handleKeyDown","checkbox","h","text","Switch","size","checkboxProps","switchProps","result","node","CheckboxGroup","options","controlledValue","defaultValue","error","direction","handleCheckboxChange","optionValue","checked","currentValue","newValue","v","option","index","_","Radio","value","groupName","fieldName","isChecked","RadioGroup","handleRadioChange","currentIndex","opt","nextIndex","radioInput","Select","multiple","searchable","clearable","placeholder","noOptionsMessage","loadingMessage","maxMenuHeight","isOpen","setIsOpen","searchQuery","setSearchQuery","highlightedIndex","setHighlightedIndex","loading","filteredOptions","query","getDisplayValue","selectedOption","handleOptionSelect","toggleDropdown","newOpen","handleSearch","target","filtered","prevIndex","handleClear","relatedTarget","isOptionSelected","componentInstance","e","useLifecycle","_elements","primaryElement","setupOutsideClickDetection","MultiSelect","Combobox"],"mappings":"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"}
|