@tachui/forms 0.7.0-alpha1 → 0.8.0-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/README.md +136 -0
- package/dist/DatePicker-D5nRFTUm.js +475 -0
- package/dist/DatePicker-D5nRFTUm.js.map +1 -0
- package/dist/Select-yZyKooXk.js +945 -0
- package/dist/Select-yZyKooXk.js.map +1 -0
- package/dist/Slider-0-oal5YR.js +644 -0
- package/dist/Slider-0-oal5YR.js.map +1 -0
- package/dist/TextField-hX15dY3U.js +509 -0
- package/dist/TextField-hX15dY3U.js.map +1 -0
- package/dist/components/advanced/Slider.d.ts +190 -0
- package/dist/components/advanced/Slider.d.ts.map +1 -0
- package/dist/components/advanced/Stepper.d.ts +161 -0
- package/dist/components/advanced/Stepper.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +15 -0
- package/dist/components/advanced/index.d.ts.map +1 -0
- package/dist/components/advanced/index.js +6 -0
- package/dist/{state → components/advanced}/index.js.map +1 -1
- package/dist/components/date-picker/DatePicker.d.ts +126 -0
- package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
- package/dist/components/date-picker/index.d.ts +14 -0
- package/dist/components/date-picker/index.d.ts.map +1 -0
- package/dist/components/date-picker/index.js +5 -0
- package/dist/components/{index.js.map → date-picker/index.js.map} +1 -1
- package/dist/components/form-container/index.d.ts +58 -0
- package/dist/components/form-container/index.d.ts.map +1 -0
- package/dist/components/selection/Checkbox.d.ts.map +1 -0
- package/dist/components/selection/Radio.d.ts.map +1 -0
- package/dist/components/selection/Select.d.ts.map +1 -0
- package/dist/components/selection/index.d.ts +68 -0
- package/dist/components/selection/index.d.ts.map +1 -0
- package/dist/components/selection/index.js +12 -0
- package/dist/components/selection/index.js.map +1 -0
- package/dist/components/text-input/TextField.d.ts.map +1 -0
- package/dist/components/text-input/index.d.ts +8 -0
- package/dist/components/text-input/index.d.ts.map +1 -0
- package/dist/components/text-input/index.js +18 -0
- package/dist/components/text-input/index.js.map +1 -0
- package/dist/index-D3WfkqVv.js +249 -0
- package/dist/index-D3WfkqVv.js.map +1 -0
- package/dist/index.d.ts +10 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +196 -376
- package/dist/index.js.map +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/validation/component-validation.d.ts +11 -2
- package/dist/validation/component-validation.d.ts.map +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +687 -17
- package/dist/validation/index.js.map +1 -1
- package/package.json +54 -41
- package/src/components/advanced/Slider.ts +722 -0
- package/src/components/advanced/Stepper.ts +715 -0
- package/src/components/advanced/index.ts +20 -0
- package/src/components/date-picker/DatePicker.ts +925 -0
- package/src/components/date-picker/index.ts +20 -0
- package/src/components/form-container/index.ts +266 -0
- package/src/components/selection/Checkbox.ts +478 -0
- package/src/components/selection/Radio.ts +470 -0
- package/src/components/selection/Select.ts +620 -0
- package/src/components/selection/index.ts +81 -0
- package/src/components/text-input/TextField.ts +728 -0
- package/src/components/text-input/index.ts +35 -0
- package/src/index.ts +48 -0
- package/src/state/index.ts +544 -0
- package/src/types/index.ts +579 -0
- package/src/utils/formatters.ts +184 -0
- package/src/utils/index.ts +57 -0
- package/src/validation/component-validation.ts +429 -0
- package/src/validation/index.ts +641 -0
- package/dist/Form-ueYEcSg1.cjs +0 -2
- package/dist/Form-ueYEcSg1.cjs.map +0 -1
- package/dist/Form-ylAr3o_e.js +0 -376
- package/dist/Form-ylAr3o_e.js.map +0 -1
- package/dist/components/Form.d.ts +0 -76
- package/dist/components/Form.d.ts.map +0 -1
- package/dist/components/index.cjs +0 -2
- package/dist/components/index.cjs.map +0 -1
- package/dist/components/index.d.ts +0 -9
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -31
- package/dist/components/input/Checkbox.d.ts.map +0 -1
- package/dist/components/input/Radio.d.ts.map +0 -1
- package/dist/components/input/Select.d.ts.map +0 -1
- package/dist/components/input/TextField.d.ts.map +0 -1
- package/dist/components/input/index.d.ts +0 -11
- package/dist/components/input/index.d.ts.map +0 -1
- package/dist/forms-complex-BiQsZZlT.js +0 -361
- package/dist/forms-complex-BiQsZZlT.js.map +0 -1
- package/dist/forms-complex-DLEnXXJ5.cjs +0 -2
- package/dist/forms-complex-DLEnXXJ5.cjs.map +0 -1
- package/dist/forms-core-B1bx1drO.js +0 -839
- package/dist/forms-core-B1bx1drO.js.map +0 -1
- package/dist/forms-core-W_JGVLAI.cjs +0 -9
- package/dist/forms-core-W_JGVLAI.cjs.map +0 -1
- package/dist/forms-inputs-6QdeMWFk.js +0 -1075
- package/dist/forms-inputs-6QdeMWFk.js.map +0 -1
- package/dist/forms-inputs-DQ5QI_SU.cjs +0 -2
- package/dist/forms-inputs-DQ5QI_SU.cjs.map +0 -1
- package/dist/index.cjs +0 -2
- package/dist/index.cjs.map +0 -1
- package/dist/state/index.cjs +0 -2
- package/dist/state/index.cjs.map +0 -1
- package/dist/state/index.js +0 -9
- package/dist/utils/validators.d.ts +0 -101
- package/dist/utils/validators.d.ts.map +0 -1
- package/dist/validation/index.cjs +0 -2
- package/dist/validation/index.cjs.map +0 -1
- /package/dist/components/{input → selection}/Checkbox.d.ts +0 -0
- /package/dist/components/{input → selection}/Radio.d.ts +0 -0
- /package/dist/components/{input → selection}/Select.d.ts +0 -0
- /package/dist/components/{input → text-input}/TextField.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
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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"}
|