@nepdatejs/vanilla 0.0.0-stage → 0.1.1

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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -2
  3. package/dist/auto-define.cjs +11 -0
  4. package/dist/auto-define.cjs.map +1 -0
  5. package/dist/auto-define.d.cts +2 -0
  6. package/dist/auto-define.d.ts +2 -0
  7. package/dist/auto-define.js +9 -0
  8. package/dist/auto-define.js.map +1 -0
  9. package/dist/calendar-BAcO-jYq.js +142 -0
  10. package/dist/calendar-BAcO-jYq.js.map +1 -0
  11. package/dist/calendar-BNdN8qJv.d.ts +87 -0
  12. package/dist/calendar-C1LZI7XN.cjs +159 -0
  13. package/dist/calendar-C1LZI7XN.cjs.map +1 -0
  14. package/dist/calendar-QWPX0IfD.d.cts +87 -0
  15. package/dist/calendar.cjs +7 -0
  16. package/dist/calendar.d.cts +2 -0
  17. package/dist/calendar.d.ts +2 -0
  18. package/dist/calendar.js +3 -0
  19. package/dist/date-picker-BidCGOz0.d.cts +74 -0
  20. package/dist/date-picker-BwlrlU5Y.js +560 -0
  21. package/dist/date-picker-BwlrlU5Y.js.map +1 -0
  22. package/dist/date-picker-CgjYsf1w.cjs +583 -0
  23. package/dist/date-picker-CgjYsf1w.cjs.map +1 -0
  24. package/dist/date-picker-DyvpYe29.d.ts +74 -0
  25. package/dist/date-picker.cjs +6 -0
  26. package/dist/date-picker.d.cts +3 -0
  27. package/dist/date-picker.d.ts +3 -0
  28. package/dist/date-picker.js +1 -0
  29. package/dist/date-range-picker-D3eNvlgv.d.ts +98 -0
  30. package/dist/date-range-picker-NwetXUC-.js +449 -0
  31. package/dist/date-range-picker-NwetXUC-.js.map +1 -0
  32. package/dist/date-range-picker-SIl0vhUV.d.cts +98 -0
  33. package/dist/date-range-picker-VrQZFZED.cjs +472 -0
  34. package/dist/date-range-picker-VrQZFZED.cjs.map +1 -0
  35. package/dist/date-range-picker.cjs +6 -0
  36. package/dist/date-range-picker.d.cts +2 -0
  37. package/dist/date-range-picker.d.ts +2 -0
  38. package/dist/date-range-picker.js +1 -0
  39. package/dist/date-time-picker-BzSyQxrf.d.cts +92 -0
  40. package/dist/date-time-picker-ChHIBTBw.cjs +492 -0
  41. package/dist/date-time-picker-ChHIBTBw.cjs.map +1 -0
  42. package/dist/date-time-picker-CxqC95aM.js +469 -0
  43. package/dist/date-time-picker-CxqC95aM.js.map +1 -0
  44. package/dist/date-time-picker-DzDpzLMZ.d.ts +92 -0
  45. package/dist/date-time-picker.cjs +6 -0
  46. package/dist/date-time-picker.d.cts +2 -0
  47. package/dist/date-time-picker.d.ts +2 -0
  48. package/dist/date-time-picker.js +1 -0
  49. package/dist/define-B8NUA3yj.d.cts +16 -0
  50. package/dist/define-B8NUA3yj.d.ts +16 -0
  51. package/dist/define-BbTIFHtH.cjs +23 -0
  52. package/dist/define-BbTIFHtH.cjs.map +1 -0
  53. package/dist/define-D96w8Zu2.js +18 -0
  54. package/dist/define-D96w8Zu2.js.map +1 -0
  55. package/dist/element-utils-BVye8UQq.d.cts +82 -0
  56. package/dist/element-utils-C-r5gPlk.d.ts +82 -0
  57. package/dist/index.cjs +30 -0
  58. package/dist/index.d.cts +8 -0
  59. package/dist/index.d.ts +8 -0
  60. package/dist/index.js +8 -0
  61. package/dist/multi-date-picker-B2mQbjZM.d.ts +105 -0
  62. package/dist/multi-date-picker-BUNf5zyJ.d.cts +105 -0
  63. package/dist/multi-date-picker-C3Lr0Dq-.js +424 -0
  64. package/dist/multi-date-picker-C3Lr0Dq-.js.map +1 -0
  65. package/dist/multi-date-picker-DUyuO-nH.cjs +447 -0
  66. package/dist/multi-date-picker-DUyuO-nH.cjs.map +1 -0
  67. package/dist/multi-date-picker.cjs +6 -0
  68. package/dist/multi-date-picker.d.cts +2 -0
  69. package/dist/multi-date-picker.d.ts +2 -0
  70. package/dist/multi-date-picker.js +1 -0
  71. package/dist/nepdate-picker.global.js +3 -0
  72. package/dist/nepdate-picker.global.js.map +1 -0
  73. package/dist/preset-list-BYCZm61I.cjs +97 -0
  74. package/dist/preset-list-BYCZm61I.cjs.map +1 -0
  75. package/dist/preset-list-DmE6fJjr.js +80 -0
  76. package/dist/preset-list-DmE6fJjr.js.map +1 -0
  77. package/dist/registry-3qzdVB7H.cjs +591 -0
  78. package/dist/registry-3qzdVB7H.cjs.map +1 -0
  79. package/dist/registry-BvkGnkvV.js +466 -0
  80. package/dist/registry-BvkGnkvV.js.map +1 -0
  81. package/package.json +162 -3
  82. package/src/auto-define.ts +6 -0
  83. package/src/calendar-element.ts +129 -0
  84. package/src/calendar-view.ts +406 -0
  85. package/src/calendar.ts +45 -0
  86. package/src/date-picker-element.ts +249 -0
  87. package/src/date-picker.ts +91 -0
  88. package/src/date-range-picker-element.ts +201 -0
  89. package/src/date-range-picker.ts +20 -0
  90. package/src/date-time-picker-element.ts +191 -0
  91. package/src/date-time-picker.ts +20 -0
  92. package/src/datetime-view.ts +434 -0
  93. package/src/define.ts +16 -0
  94. package/src/dom.ts +109 -0
  95. package/src/element-utils.ts +86 -0
  96. package/src/global.ts +7 -0
  97. package/src/index.ts +15 -0
  98. package/src/multi-date-picker-element.ts +187 -0
  99. package/src/multi-date-picker.ts +53 -0
  100. package/src/multi-view.ts +323 -0
  101. package/src/panel.ts +61 -0
  102. package/src/picker-view.ts +423 -0
  103. package/src/preset-list.ts +51 -0
  104. package/src/range-view.ts +368 -0
  105. package/src/registry.ts +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-time-picker-ChHIBTBw.cjs","names":["createDateTimePicker","uid","el","icon","PresetList","CalendarView","getLocale","openPanel","Base","str","bool","calendarAttr","theme","panelLayout","onUnlessFalse","int","presetIds","ELEMENT_NAMES"],"sources":["../src/datetime-view.ts","../src/date-time-picker-element.ts","../src/date-time-picker.ts"],"sourcesContent":["import { getLocale } from '@nepdatejs/core';\nimport {\n createDateTimePicker,\n type DateTimePickerOptions,\n type DateTimePickerState,\n type DateTimePickerStore,\n type TimeCell,\n} from '@nepdatejs/datepicker';\nimport type { PanelLayout } from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { openPanel, renderSegment } from './panel';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport type { Theme } from './picker-view';\nimport {\n PANEL_WIDTH,\n PANEL_WIDTH_WITH_PRESETS,\n PresetList,\n TIME_COLUMNS_WIDTH,\n} from './preset-list';\n\nexport interface DateTimePickerViewOptions extends DateTimePickerOptions {\n readonly name?: string | undefined;\n readonly hiddenInput?: boolean | undefined;\n readonly required?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n /** 'sheet' opens a bottom sheet; 'popover' sits beside the field; 'auto' (default) uses the sheet below 480px. */\n readonly panelLayout?: PanelLayout | undefined;\n readonly theme?: Theme | undefined;\n readonly ariaLabel?: string | undefined;\n readonly timeLabel?: string | undefined;\n readonly id?: string | undefined;\n readonly onOpenChange?: ((open: boolean) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'name',\n 'hiddenInput',\n 'required',\n 'disabled',\n 'theme',\n 'panelLayout',\n 'ariaLabel',\n 'timeLabel',\n 'id',\n 'onOpenChange',\n 'onChange',\n]);\n\n/** A date input and a time input sharing one panel: calendar plus hour/minute columns. */\nexport class DateTimePickerView {\n readonly store: DateTimePickerStore;\n readonly dateInput: HTMLInputElement;\n readonly timeInput: HTMLInputElement;\n private options: DateTimePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly row: HTMLDivElement;\n private readonly dateBox: HTMLDivElement;\n private readonly timeBox: HTMLDivElement;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly nowButton: HTMLButtonElement;\n private readonly doneButton: HTMLButtonElement;\n private readonly hours: HTMLDivElement;\n private readonly minutes: HTMLDivElement;\n private readonly time: HTMLDivElement;\n private readonly hidden: HTMLInputElement;\n private readonly calendarView: CalendarView;\n private readonly presetList: PresetList;\n private readonly unsubscribe: () => void;\n private closePanel: (() => void) | null = null;\n private wasOpen = false;\n\n constructor(host: HTMLElement, options: DateTimePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createDateTimePicker({\n ...storeOptions(options),\n onChange: (value, detail) => {\n this.options.onChange?.(value, detail);\n },\n });\n const id = options.id ?? uid('ndp-datetime');\n this.dateInput = el('input', {\n class: 'ndp-input__control',\n id,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n 'aria-controls': `${id}-panel`,\n });\n this.timeInput = el('input', {\n class: 'ndp-input__control',\n id: `${id}-time`,\n type: 'text',\n autocomplete: 'off',\n });\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.dateBox = el('div', { class: 'ndp-input' }, [\n this.dateInput,\n el('span', { class: 'ndp-input__actions' }, [this.toggleButton]),\n ]);\n this.timeBox = el('div', { class: 'ndp-input ndp-input--time' }, [this.timeInput]);\n this.row = el('div', { class: 'ndp-datetime' }, [this.dateBox, this.timeBox]);\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${id}-hint`,\n 'aria-live': 'polite',\n hidden: true,\n });\n this.hidden = el('input', { type: 'hidden' });\n this.segment = el('div', { class: 'ndp-segment', role: 'group' }, [\n el('button', { type: 'button', class: 'ndp-segment__item', 'data-calendar': 'BS' }),\n el('button', { type: 'button', class: 'ndp-segment__item', 'data-calendar': 'AD' }),\n ]);\n this.nowButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'now',\n });\n this.doneButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-variant': 'primary',\n 'data-action': 'done',\n });\n this.hours = el('div', {\n class: 'ndp-time__column',\n role: 'group',\n 'data-unit': 'hour',\n });\n this.minutes = el('div', {\n class: 'ndp-time__column',\n role: 'group',\n 'data-unit': 'minute',\n });\n this.time = el('div', { class: 'ndp-time', role: 'group' }, [\n this.hours,\n this.minutes,\n ]);\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.presetList = new PresetList((presetId) => {\n this.store.actions.applyPreset(presetId);\n });\n this.panel = el(\n 'div',\n {\n class: 'ndp-panel',\n id: `${id}-panel`,\n\n hidden: true,\n },\n [\n el('div', { class: 'ndp-panel__body' }, [\n this.presetList.element,\n calendarRoot,\n this.time,\n ]),\n el('div', { class: 'ndp-panel__footer' }, [\n this.segment,\n el('span', {}, [this.nowButton, this.doneButton]),\n ]),\n ],\n );\n this.field = el('div', { class: 'ndp-field' }, [\n this.row,\n this.hint,\n this.panel,\n this.hidden,\n ]);\n host.append(this.field);\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n this.store.actions.selectDate(date);\n },\n });\n\n this.dateInput.addEventListener('input', () => {\n this.store.actions.typeDate(this.dateInput.value);\n });\n this.dateInput.addEventListener('blur', () => {\n this.store.actions.blurDate();\n });\n this.dateInput.addEventListener('keydown', (event) => {\n if (event.key === 'ArrowDown' && (event.altKey || this.dateInput.value === '')) {\n event.preventDefault();\n this.open();\n }\n });\n this.timeInput.addEventListener('input', () => {\n this.store.actions.typeTime(this.timeInput.value);\n });\n this.timeInput.addEventListener('blur', () => {\n this.store.actions.blurTime();\n });\n this.field.addEventListener('click', this.onClick);\n this.unsubscribe = this.store.subscribe(() => {\n this.render();\n });\n this.render();\n }\n\n getState(): DateTimePickerState {\n return this.store.getState();\n }\n\n setOptions(changes: Partial<DateTimePickerViewOptions>): void {\n this.options = { ...this.options, ...changes };\n const forStore = storeOptions(changes);\n if (Object.keys(forStore).length > 0) {\n this.store.setOptions(forStore);\n } else {\n this.render();\n }\n }\n\n open(): void {\n if (!this.options.disabled) {\n this.store.actions.open();\n }\n }\n\n close(): void {\n this.store.actions.close();\n }\n\n destroy(): void {\n this.closePanel?.();\n this.unsubscribe();\n this.calendarView.destroy();\n this.field.remove();\n }\n\n private render(): void {\n const state = this.store.getState();\n const locale = getLocale(this.options.locale);\n const disabled = this.options.disabled ?? false;\n const hint = state.error?.message ?? state.equivalentText;\n\n if (this.dateInput.value !== state.dateText) {\n this.dateInput.value = state.dateText;\n }\n if (this.timeInput.value !== state.timeText) {\n this.timeInput.value = state.timeText;\n }\n this.dateInput.setCustomValidity(\n state.error?.field === 'date' ? state.error.message : '',\n );\n this.timeInput.setCustomValidity(\n state.error?.field === 'time' ? state.error.message : '',\n );\n setAttrs(this.dateInput, {\n placeholder: state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': this.options.ariaLabel ?? null,\n 'aria-invalid': state.error?.field === 'date' ? 'true' : null,\n 'aria-describedby': hint ? this.hint.id : null,\n });\n setAttrs(this.timeInput, {\n placeholder: state.timePlaceholder,\n disabled,\n 'aria-label': this.options.timeLabel ?? locale.labels.time,\n 'aria-invalid': state.error?.field === 'time' ? 'true' : null,\n 'aria-describedby': hint ? this.hint.id : null,\n });\n setAttrs(this.dateBox, {\n 'data-invalid': state.error?.field === 'date',\n 'data-disabled': disabled,\n });\n setAttrs(this.timeBox, {\n 'data-invalid': state.error?.field === 'time',\n 'data-disabled': disabled,\n });\n setAttrs(this.field, { 'data-ndp-theme': this.options.theme ?? null });\n setAttrs(this.panel, {\n 'data-ndp-theme': this.options.theme ?? null,\n 'aria-label': locale.labels.chooseDate,\n });\n setAttrs(this.toggleButton, {\n disabled,\n 'aria-label': locale.labels.openCalendar,\n 'aria-expanded': state.open ? 'true' : 'false',\n });\n this.hint.hidden = hint === null;\n setText(this.hint, hint ?? '');\n setAttrs(this.hint, { 'data-error': state.error !== null });\n\n renderSegment(this.segment, state, locale);\n setText(this.nowButton, locale.labels.now);\n setText(this.doneButton, locale.labels.done);\n setAttrs(this.time, { 'aria-label': locale.labels.time });\n setAttrs(this.hours, { 'aria-label': locale.labels.hour });\n setAttrs(this.minutes, { 'aria-label': locale.labels.minute });\n renderColumn(this.hours, state.hours);\n renderColumn(this.minutes, state.minutes);\n this.presetList.render(state.presets, locale.labels.presets);\n\n const name = this.options.hiddenInput === false ? undefined : this.options.name;\n setAttrs(this.hidden, { name: name ?? null });\n this.hidden.value = state.value;\n this.hidden.disabled = name === undefined || disabled;\n setPopupMode(state, [this.dateInput], this.toggleButton, this.panel);\n this.syncPanel(state.open && !state.inline);\n this.panel.hidden = !state.inline && !this.wasOpen;\n this.panel.style.setProperty(\n '--ndp-panel-width',\n state.inline ? `${String(this.panelWidth())}px` : null,\n );\n }\n\n private panelWidth(): number {\n return (\n (this.store.getState().presets.length > 0\n ? PANEL_WIDTH_WITH_PRESETS\n : PANEL_WIDTH) + TIME_COLUMNS_WIDTH\n );\n }\n\n private syncPanel(open: boolean): void {\n if (open === this.wasOpen) {\n return;\n }\n this.wasOpen = open;\n this.options.onOpenChange?.(open);\n if (open) {\n this.closePanel = openPanel({\n panel: this.panel,\n anchor: this.row,\n inside: [this.field],\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n close: () => {\n this.store.actions.close();\n },\n returnFocus: this.dateInput,\n });\n for (const item of this.time.querySelectorAll<HTMLElement>(\n '[aria-pressed=\"true\"]',\n )) {\n if (typeof item.scrollIntoView === 'function') {\n item.scrollIntoView({ block: 'nearest' });\n }\n }\n this.calendarView.focusGrid();\n } else {\n this.closePanel?.();\n this.closePanel = null;\n }\n }\n\n private readonly onClick = (event: MouseEvent): void => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target || this.calendarView.element.contains(target)) {\n return;\n }\n const item = target.closest<HTMLButtonElement>('.ndp-time-item');\n if (item) {\n const unit = item.parentElement?.dataset['unit'];\n const value = Number(item.dataset['value']);\n if (unit === 'hour') {\n this.store.actions.selectHour(value);\n } else {\n this.store.actions.selectMinute(value);\n }\n return;\n }\n const calendar = target.closest<HTMLElement>('[data-calendar]')?.dataset['calendar'];\n if (calendar === 'BS' || calendar === 'AD') {\n this.store.actions.switchCalendar(calendar);\n return;\n }\n switch (target.closest<HTMLElement>('[data-action]')?.dataset['action']) {\n case 'toggle':\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n break;\n case 'now':\n this.store.actions.selectNow();\n break;\n case 'done':\n this.close();\n this.dateInput.focus();\n break;\n default:\n break;\n }\n };\n}\n\nfunction renderColumn(column: HTMLElement, cells: readonly TimeCell[]): void {\n if (column.children.length !== cells.length) {\n column.replaceChildren(\n ...cells.map((cell) =>\n el('button', {\n type: 'button',\n class: 'ndp-time-item',\n 'data-value': cell.value,\n }),\n ),\n );\n }\n cells.forEach((cell, index) => {\n const button = column.children[index];\n if (button) {\n setText(button, cell.label);\n setAttrs(button, {\n 'data-value': cell.value,\n 'aria-pressed': cell.isSelected ? 'true' : 'false',\n });\n }\n });\n}\n\nfunction storeOptions(\n options: Partial<DateTimePickerViewOptions>,\n): Partial<DateTimePickerOptions> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(options)) {\n if (!VIEW_KEYS.has(key)) {\n out[key] = value;\n }\n }\n\n return out;\n}\n","import type { SinglePreset } from '@nepdatejs/datepicker';\nimport { DateTimePickerView, type DateTimePickerViewOptions } from './datetime-view';\nimport {\n Base,\n str,\n bool,\n calendarAttr,\n int,\n onUnlessFalse,\n panelLayout,\n theme,\n presetIds,\n swallowInnerChange,\n type RichProps,\n} from './element-utils';\n\n/**\n * <nep-date-time-picker name=\"starts-at\" minute-step=\"15\"></nep-date-time-picker>\n *\n * A form-associated BS/AD date + time field. The form receives one instant as\n * an ISO timestamp with the zone's offset (\"2026-10-18T14:30:00+05:45\").\n * Fires `change` with { value, ad, bs, time }.\n */\nexport class NepDateTimePickerElement extends Base {\n static readonly formAssociated = true;\n static readonly observedAttributes: readonly string[] = [\n 'value',\n 'min',\n 'max',\n 'calendar',\n 'default-calendar',\n 'locale',\n 'name',\n 'required',\n 'disabled',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'time-zone',\n 'hour12',\n 'minute-step',\n 'default-time',\n 'label',\n 'time-label',\n 'presets',\n ];\n\n view: DateTimePickerView | null = null;\n private readonly internals: ElementInternals | null;\n private rich: RichProps = {};\n private unsubscribe: (() => void) | null = null;\n\n constructor() {\n super();\n this.internals =\n typeof this.attachInternals === 'function' ? this.attachInternals() : null;\n swallowInnerChange(this);\n }\n\n get value(): string {\n return this.view?.getState().value ?? '';\n }\n set value(next: string) {\n this.view?.store.actions.setValue(next);\n }\n set holidays(next: RichProps['holidays']) {\n this.rich = { ...this.rich, holidays: next };\n this.view?.setOptions({ holidays: next });\n }\n set isDateDisabled(next: RichProps['isDateDisabled']) {\n this.rich = { ...this.rich, isDateDisabled: next };\n this.view?.setOptions({ isDateDisabled: next });\n }\n\n connectedCallback(): void {\n if (this.view) {\n return;\n }\n const view = new DateTimePickerView(this, {\n ...this.readOptions(),\n defaultValue: str(this, 'value'),\n onChange: (value, detail) => {\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n detail: {\n value,\n ad: detail?.ad ?? null,\n bs: detail?.bs ?? null,\n time: detail?.time ?? null,\n },\n }),\n );\n },\n onOpenChange: (open) => {\n this.dispatchEvent(\n new CustomEvent(open ? 'nep-open' : 'nep-close', { bubbles: true }),\n );\n },\n });\n this.view = view;\n this.unsubscribe = view.store.subscribe(() => {\n this.syncForm();\n });\n this.syncForm();\n }\n\n disconnectedCallback(): void {\n this.unsubscribe?.();\n this.view?.destroy();\n this.view = null;\n }\n\n attributeChangedCallback(\n name: string,\n previous: string | null,\n next: string | null,\n ): void {\n if (!this.view || previous === next) {\n return;\n }\n if (name === 'value') {\n this.view.store.actions.setValue(next ?? '');\n }\n this.view.setOptions(this.readOptions());\n this.syncForm();\n }\n\n formResetCallback(): void {\n this.view?.store.actions.reset();\n }\n\n formDisabledCallback(disabled: boolean): void {\n this.view?.setOptions({ disabled: disabled || bool(this, 'disabled') });\n }\n\n override focus(options?: FocusOptions): void {\n this.view?.dateInput.focus(options);\n }\n\n private readOptions(): DateTimePickerViewOptions {\n return {\n ...this.rich,\n min: str(this, 'min'),\n max: str(this, 'max'),\n calendar: calendarAttr(this, 'calendar'),\n defaultCalendar: calendarAttr(this, 'default-calendar'),\n locale: str(this, 'locale'),\n name: str(this, 'name'),\n hiddenInput: this.internals === null,\n required: bool(this, 'required'),\n disabled: bool(this, 'disabled'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: this.hasAttribute('inline'),\n timeZone: str(this, 'time-zone'),\n hour12: bool(this, 'hour12'),\n minuteStep: int(this, 'minute-step'),\n defaultTime: str(this, 'default-time'),\n ariaLabel: str(this, 'label'),\n timeLabel: str(this, 'time-label'),\n presets: presetIds(this) as readonly SinglePreset[] | undefined,\n };\n }\n\n private syncForm(): void {\n const view = this.view;\n if (!view || !this.internals) {\n return;\n }\n const state = view.getState();\n this.internals.setFormValue(state.value === '' ? null : state.value);\n if (state.error) {\n this.internals.setValidity(\n { customError: true },\n state.error.message,\n state.error.field === 'time' ? view.timeInput : view.dateInput,\n );\n } else if (bool(this, 'required') && state.value === '') {\n this.internals.setValidity(\n { valueMissing: true },\n 'Please choose a date and time.',\n view.dateInput,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n","/** `@nepdatejs/vanilla/date-time-picker`: just the date + time picker. */\nimport { NepDateTimePickerElement } from './date-time-picker-element';\nimport { DateTimePickerView, type DateTimePickerViewOptions } from './datetime-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepDateTimePickerElement };\nexport { DateTimePickerView, type DateTimePickerViewOptions } from './datetime-view';\n\n/** Register <nep-date-time-picker> (skipped if already defined). */\nexport function defineDateTimePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.dateTimePicker, NepDateTimePickerElement, registry);\n}\n\n/** Mount a date + time picker into a container. */\nexport function createDateTimePicker(\n container: HTMLElement,\n options: DateTimePickerViewOptions = {},\n): DateTimePickerView {\n return new DateTimePickerView(container, options);\n}\n"],"mappings":"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"}
@@ -0,0 +1,469 @@
1
+ import { _ as icon, a as calendarAttr, b as setText, c as onUnlessFalse, d as str, f as swallowInnerChange, g as el, h as CalendarView, i as bool, l as panelLayout, n as defineElement, o as int, p as theme, r as Base, t as ELEMENT_NAMES, u as presetIds, v as setAttrs, x as uid, y as setPopupMode } from "./registry-BvkGnkvV.js";
2
+ import { n as openPanel, r as renderSegment, t as PresetList } from "./preset-list-DmE6fJjr.js";
3
+ import { getLocale } from "@nepdatejs/core";
4
+ import { createDateTimePicker } from "@nepdatejs/datepicker";
5
+ //#region src/datetime-view.ts
6
+ const VIEW_KEYS = /* @__PURE__ */ new Set([
7
+ "name",
8
+ "hiddenInput",
9
+ "required",
10
+ "disabled",
11
+ "theme",
12
+ "panelLayout",
13
+ "ariaLabel",
14
+ "timeLabel",
15
+ "id",
16
+ "onOpenChange",
17
+ "onChange"
18
+ ]);
19
+ /** A date input and a time input sharing one panel: calendar plus hour/minute columns. */
20
+ var DateTimePickerView = class {
21
+ constructor(host, options = {}) {
22
+ this.closePanel = null;
23
+ this.wasOpen = false;
24
+ this.onClick = (event) => {
25
+ const target = event.target instanceof Element ? event.target : null;
26
+ if (!target || this.calendarView.element.contains(target)) return;
27
+ const item = target.closest(".ndp-time-item");
28
+ if (item) {
29
+ const unit = item.parentElement?.dataset["unit"];
30
+ const value = Number(item.dataset["value"]);
31
+ if (unit === "hour") this.store.actions.selectHour(value);
32
+ else this.store.actions.selectMinute(value);
33
+ return;
34
+ }
35
+ const calendar = target.closest("[data-calendar]")?.dataset["calendar"];
36
+ if (calendar === "BS" || calendar === "AD") {
37
+ this.store.actions.switchCalendar(calendar);
38
+ return;
39
+ }
40
+ switch (target.closest("[data-action]")?.dataset["action"]) {
41
+ case "toggle":
42
+ if (this.store.getState().open) this.close();
43
+ else this.open();
44
+ break;
45
+ case "now":
46
+ this.store.actions.selectNow();
47
+ break;
48
+ case "done":
49
+ this.close();
50
+ this.dateInput.focus();
51
+ }
52
+ };
53
+ this.options = { ...options };
54
+ this.store = createDateTimePicker({
55
+ ...storeOptions(options),
56
+ onChange: (value, detail) => {
57
+ this.options.onChange?.(value, detail);
58
+ }
59
+ });
60
+ const id = options.id ?? uid("ndp-datetime");
61
+ this.dateInput = el("input", {
62
+ class: "ndp-input__control",
63
+ id,
64
+ type: "text",
65
+ inputmode: "numeric",
66
+ autocomplete: "off",
67
+ "aria-controls": `${id}-panel`
68
+ });
69
+ this.timeInput = el("input", {
70
+ class: "ndp-input__control",
71
+ id: `${id}-time`,
72
+ type: "text",
73
+ autocomplete: "off"
74
+ });
75
+ this.toggleButton = el("button", {
76
+ type: "button",
77
+ class: "ndp-icon-button",
78
+ "data-action": "toggle"
79
+ }, [icon("calendar")]);
80
+ this.dateBox = el("div", { class: "ndp-input" }, [this.dateInput, el("span", { class: "ndp-input__actions" }, [this.toggleButton])]);
81
+ this.timeBox = el("div", { class: "ndp-input ndp-input--time" }, [this.timeInput]);
82
+ this.row = el("div", { class: "ndp-datetime" }, [this.dateBox, this.timeBox]);
83
+ this.hint = el("p", {
84
+ class: "ndp-hint",
85
+ id: `${id}-hint`,
86
+ "aria-live": "polite",
87
+ hidden: true
88
+ });
89
+ this.hidden = el("input", { type: "hidden" });
90
+ this.segment = el("div", {
91
+ class: "ndp-segment",
92
+ role: "group"
93
+ }, [el("button", {
94
+ type: "button",
95
+ class: "ndp-segment__item",
96
+ "data-calendar": "BS"
97
+ }), el("button", {
98
+ type: "button",
99
+ class: "ndp-segment__item",
100
+ "data-calendar": "AD"
101
+ })]);
102
+ this.nowButton = el("button", {
103
+ type: "button",
104
+ class: "ndp-button",
105
+ "data-action": "now"
106
+ });
107
+ this.doneButton = el("button", {
108
+ type: "button",
109
+ class: "ndp-button",
110
+ "data-variant": "primary",
111
+ "data-action": "done"
112
+ });
113
+ this.hours = el("div", {
114
+ class: "ndp-time__column",
115
+ role: "group",
116
+ "data-unit": "hour"
117
+ });
118
+ this.minutes = el("div", {
119
+ class: "ndp-time__column",
120
+ role: "group",
121
+ "data-unit": "minute"
122
+ });
123
+ this.time = el("div", {
124
+ class: "ndp-time",
125
+ role: "group"
126
+ }, [this.hours, this.minutes]);
127
+ const calendarRoot = el("div", { class: "ndp-panel__calendar" });
128
+ this.presetList = new PresetList((presetId) => {
129
+ this.store.actions.applyPreset(presetId);
130
+ });
131
+ this.panel = el("div", {
132
+ class: "ndp-panel",
133
+ id: `${id}-panel`,
134
+ hidden: true
135
+ }, [el("div", { class: "ndp-panel__body" }, [
136
+ this.presetList.element,
137
+ calendarRoot,
138
+ this.time
139
+ ]), el("div", { class: "ndp-panel__footer" }, [this.segment, el("span", {}, [this.nowButton, this.doneButton])])]);
140
+ this.field = el("div", { class: "ndp-field" }, [
141
+ this.row,
142
+ this.hint,
143
+ this.panel,
144
+ this.hidden
145
+ ]);
146
+ host.append(this.field);
147
+ this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {
148
+ locale: () => this.options.locale,
149
+ onDayActivate: (date) => {
150
+ this.store.actions.selectDate(date);
151
+ }
152
+ });
153
+ this.dateInput.addEventListener("input", () => {
154
+ this.store.actions.typeDate(this.dateInput.value);
155
+ });
156
+ this.dateInput.addEventListener("blur", () => {
157
+ this.store.actions.blurDate();
158
+ });
159
+ this.dateInput.addEventListener("keydown", (event) => {
160
+ if (event.key === "ArrowDown" && (event.altKey || this.dateInput.value === "")) {
161
+ event.preventDefault();
162
+ this.open();
163
+ }
164
+ });
165
+ this.timeInput.addEventListener("input", () => {
166
+ this.store.actions.typeTime(this.timeInput.value);
167
+ });
168
+ this.timeInput.addEventListener("blur", () => {
169
+ this.store.actions.blurTime();
170
+ });
171
+ this.field.addEventListener("click", this.onClick);
172
+ this.unsubscribe = this.store.subscribe(() => {
173
+ this.render();
174
+ });
175
+ this.render();
176
+ }
177
+ getState() {
178
+ return this.store.getState();
179
+ }
180
+ setOptions(changes) {
181
+ this.options = {
182
+ ...this.options,
183
+ ...changes
184
+ };
185
+ const forStore = storeOptions(changes);
186
+ if (Object.keys(forStore).length > 0) this.store.setOptions(forStore);
187
+ else this.render();
188
+ }
189
+ open() {
190
+ if (!this.options.disabled) this.store.actions.open();
191
+ }
192
+ close() {
193
+ this.store.actions.close();
194
+ }
195
+ destroy() {
196
+ this.closePanel?.();
197
+ this.unsubscribe();
198
+ this.calendarView.destroy();
199
+ this.field.remove();
200
+ }
201
+ render() {
202
+ const state = this.store.getState();
203
+ const locale = getLocale(this.options.locale);
204
+ const disabled = this.options.disabled ?? false;
205
+ const hint = state.error?.message ?? state.equivalentText;
206
+ if (this.dateInput.value !== state.dateText) this.dateInput.value = state.dateText;
207
+ if (this.timeInput.value !== state.timeText) this.timeInput.value = state.timeText;
208
+ this.dateInput.setCustomValidity(state.error?.field === "date" ? state.error.message : "");
209
+ this.timeInput.setCustomValidity(state.error?.field === "time" ? state.error.message : "");
210
+ setAttrs(this.dateInput, {
211
+ placeholder: state.placeholder,
212
+ disabled,
213
+ required: this.options.required ?? false,
214
+ "aria-label": this.options.ariaLabel ?? null,
215
+ "aria-invalid": state.error?.field === "date" ? "true" : null,
216
+ "aria-describedby": hint ? this.hint.id : null
217
+ });
218
+ setAttrs(this.timeInput, {
219
+ placeholder: state.timePlaceholder,
220
+ disabled,
221
+ "aria-label": this.options.timeLabel ?? locale.labels.time,
222
+ "aria-invalid": state.error?.field === "time" ? "true" : null,
223
+ "aria-describedby": hint ? this.hint.id : null
224
+ });
225
+ setAttrs(this.dateBox, {
226
+ "data-invalid": state.error?.field === "date",
227
+ "data-disabled": disabled
228
+ });
229
+ setAttrs(this.timeBox, {
230
+ "data-invalid": state.error?.field === "time",
231
+ "data-disabled": disabled
232
+ });
233
+ setAttrs(this.field, { "data-ndp-theme": this.options.theme ?? null });
234
+ setAttrs(this.panel, {
235
+ "data-ndp-theme": this.options.theme ?? null,
236
+ "aria-label": locale.labels.chooseDate
237
+ });
238
+ setAttrs(this.toggleButton, {
239
+ disabled,
240
+ "aria-label": locale.labels.openCalendar,
241
+ "aria-expanded": state.open ? "true" : "false"
242
+ });
243
+ this.hint.hidden = hint === null;
244
+ setText(this.hint, hint ?? "");
245
+ setAttrs(this.hint, { "data-error": state.error !== null });
246
+ renderSegment(this.segment, state, locale);
247
+ setText(this.nowButton, locale.labels.now);
248
+ setText(this.doneButton, locale.labels.done);
249
+ setAttrs(this.time, { "aria-label": locale.labels.time });
250
+ setAttrs(this.hours, { "aria-label": locale.labels.hour });
251
+ setAttrs(this.minutes, { "aria-label": locale.labels.minute });
252
+ renderColumn(this.hours, state.hours);
253
+ renderColumn(this.minutes, state.minutes);
254
+ this.presetList.render(state.presets, locale.labels.presets);
255
+ const name = this.options.hiddenInput === false ? void 0 : this.options.name;
256
+ setAttrs(this.hidden, { name: name ?? null });
257
+ this.hidden.value = state.value;
258
+ this.hidden.disabled = name === void 0 || disabled;
259
+ setPopupMode(state, [this.dateInput], this.toggleButton, this.panel);
260
+ this.syncPanel(state.open && !state.inline);
261
+ this.panel.hidden = !state.inline && !this.wasOpen;
262
+ this.panel.style.setProperty("--ndp-panel-width", state.inline ? `${String(this.panelWidth())}px` : null);
263
+ }
264
+ panelWidth() {
265
+ return (this.store.getState().presets.length > 0 ? 492 : 320) + 136;
266
+ }
267
+ syncPanel(open) {
268
+ if (open === this.wasOpen) return;
269
+ this.wasOpen = open;
270
+ this.options.onOpenChange?.(open);
271
+ if (open) {
272
+ this.closePanel = openPanel({
273
+ panel: this.panel,
274
+ anchor: this.row,
275
+ inside: [this.field],
276
+ width: this.panelWidth(),
277
+ layout: this.options.panelLayout,
278
+ close: () => {
279
+ this.store.actions.close();
280
+ },
281
+ returnFocus: this.dateInput
282
+ });
283
+ for (const item of this.time.querySelectorAll("[aria-pressed=\"true\"]")) if (typeof item.scrollIntoView === "function") item.scrollIntoView({ block: "nearest" });
284
+ this.calendarView.focusGrid();
285
+ } else {
286
+ this.closePanel?.();
287
+ this.closePanel = null;
288
+ }
289
+ }
290
+ };
291
+ function renderColumn(column, cells) {
292
+ if (column.children.length !== cells.length) column.replaceChildren(...cells.map((cell) => el("button", {
293
+ type: "button",
294
+ class: "ndp-time-item",
295
+ "data-value": cell.value
296
+ })));
297
+ cells.forEach((cell, index) => {
298
+ const button = column.children[index];
299
+ if (button) {
300
+ setText(button, cell.label);
301
+ setAttrs(button, {
302
+ "data-value": cell.value,
303
+ "aria-pressed": cell.isSelected ? "true" : "false"
304
+ });
305
+ }
306
+ });
307
+ }
308
+ function storeOptions(options) {
309
+ const out = {};
310
+ for (const [key, value] of Object.entries(options)) if (!VIEW_KEYS.has(key)) out[key] = value;
311
+ return out;
312
+ }
313
+ //#endregion
314
+ //#region src/date-time-picker-element.ts
315
+ /**
316
+ * <nep-date-time-picker name="starts-at" minute-step="15"></nep-date-time-picker>
317
+ *
318
+ * A form-associated BS/AD date + time field. The form receives one instant as
319
+ * an ISO timestamp with the zone's offset ("2026-10-18T14:30:00+05:45").
320
+ * Fires `change` with { value, ad, bs, time }.
321
+ */
322
+ var NepDateTimePickerElement = class extends Base {
323
+ constructor() {
324
+ super();
325
+ this.view = null;
326
+ this.rich = {};
327
+ this.unsubscribe = null;
328
+ this.internals = typeof this.attachInternals === "function" ? this.attachInternals() : null;
329
+ swallowInnerChange(this);
330
+ }
331
+ get value() {
332
+ return this.view?.getState().value ?? "";
333
+ }
334
+ set value(next) {
335
+ this.view?.store.actions.setValue(next);
336
+ }
337
+ set holidays(next) {
338
+ this.rich = {
339
+ ...this.rich,
340
+ holidays: next
341
+ };
342
+ this.view?.setOptions({ holidays: next });
343
+ }
344
+ set isDateDisabled(next) {
345
+ this.rich = {
346
+ ...this.rich,
347
+ isDateDisabled: next
348
+ };
349
+ this.view?.setOptions({ isDateDisabled: next });
350
+ }
351
+ connectedCallback() {
352
+ if (this.view) return;
353
+ const view = new DateTimePickerView(this, {
354
+ ...this.readOptions(),
355
+ defaultValue: str(this, "value"),
356
+ onChange: (value, detail) => {
357
+ this.dispatchEvent(new CustomEvent("change", {
358
+ bubbles: true,
359
+ detail: {
360
+ value,
361
+ ad: detail?.ad ?? null,
362
+ bs: detail?.bs ?? null,
363
+ time: detail?.time ?? null
364
+ }
365
+ }));
366
+ },
367
+ onOpenChange: (open) => {
368
+ this.dispatchEvent(new CustomEvent(open ? "nep-open" : "nep-close", { bubbles: true }));
369
+ }
370
+ });
371
+ this.view = view;
372
+ this.unsubscribe = view.store.subscribe(() => {
373
+ this.syncForm();
374
+ });
375
+ this.syncForm();
376
+ }
377
+ disconnectedCallback() {
378
+ this.unsubscribe?.();
379
+ this.view?.destroy();
380
+ this.view = null;
381
+ }
382
+ attributeChangedCallback(name, previous, next) {
383
+ if (!this.view || previous === next) return;
384
+ if (name === "value") this.view.store.actions.setValue(next ?? "");
385
+ this.view.setOptions(this.readOptions());
386
+ this.syncForm();
387
+ }
388
+ formResetCallback() {
389
+ this.view?.store.actions.reset();
390
+ }
391
+ formDisabledCallback(disabled) {
392
+ this.view?.setOptions({ disabled: disabled || bool(this, "disabled") });
393
+ }
394
+ focus(options) {
395
+ this.view?.dateInput.focus(options);
396
+ }
397
+ readOptions() {
398
+ return {
399
+ ...this.rich,
400
+ min: str(this, "min"),
401
+ max: str(this, "max"),
402
+ calendar: calendarAttr(this, "calendar"),
403
+ defaultCalendar: calendarAttr(this, "default-calendar"),
404
+ locale: str(this, "locale"),
405
+ name: str(this, "name"),
406
+ hiddenInput: this.internals === null,
407
+ required: bool(this, "required"),
408
+ disabled: bool(this, "disabled"),
409
+ theme: theme(this),
410
+ panelLayout: panelLayout(this),
411
+ mask: onUnlessFalse(this, "mask"),
412
+ inline: this.hasAttribute("inline"),
413
+ timeZone: str(this, "time-zone"),
414
+ hour12: bool(this, "hour12"),
415
+ minuteStep: int(this, "minute-step"),
416
+ defaultTime: str(this, "default-time"),
417
+ ariaLabel: str(this, "label"),
418
+ timeLabel: str(this, "time-label"),
419
+ presets: presetIds(this)
420
+ };
421
+ }
422
+ syncForm() {
423
+ const view = this.view;
424
+ if (!view || !this.internals) return;
425
+ const state = view.getState();
426
+ this.internals.setFormValue(state.value === "" ? null : state.value);
427
+ if (state.error) this.internals.setValidity({ customError: true }, state.error.message, state.error.field === "time" ? view.timeInput : view.dateInput);
428
+ else if (bool(this, "required") && state.value === "") this.internals.setValidity({ valueMissing: true }, "Please choose a date and time.", view.dateInput);
429
+ else this.internals.setValidity({});
430
+ }
431
+ };
432
+ NepDateTimePickerElement.formAssociated = true;
433
+ NepDateTimePickerElement.observedAttributes = [
434
+ "value",
435
+ "min",
436
+ "max",
437
+ "calendar",
438
+ "default-calendar",
439
+ "locale",
440
+ "name",
441
+ "required",
442
+ "disabled",
443
+ "theme",
444
+ "panel-layout",
445
+ "mask",
446
+ "inline",
447
+ "time-zone",
448
+ "hour12",
449
+ "minute-step",
450
+ "default-time",
451
+ "label",
452
+ "time-label",
453
+ "presets"
454
+ ];
455
+ //#endregion
456
+ //#region src/date-time-picker.ts
457
+ /** `@nepdatejs/vanilla/date-time-picker`: just the date + time picker. */
458
+ /** Register <nep-date-time-picker> (skipped if already defined). */
459
+ function defineDateTimePicker(registry) {
460
+ defineElement(ELEMENT_NAMES.dateTimePicker, NepDateTimePickerElement, registry);
461
+ }
462
+ /** Mount a date + time picker into a container. */
463
+ function createDateTimePicker$1(container, options = {}) {
464
+ return new DateTimePickerView(container, options);
465
+ }
466
+ //#endregion
467
+ export { DateTimePickerView as i, defineDateTimePicker as n, NepDateTimePickerElement as r, createDateTimePicker$1 as t };
468
+
469
+ //# sourceMappingURL=date-time-picker-CxqC95aM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-time-picker-CxqC95aM.js","names":["createDateTimePicker"],"sources":["../src/datetime-view.ts","../src/date-time-picker-element.ts","../src/date-time-picker.ts"],"sourcesContent":["import { getLocale } from '@nepdatejs/core';\nimport {\n createDateTimePicker,\n type DateTimePickerOptions,\n type DateTimePickerState,\n type DateTimePickerStore,\n type TimeCell,\n} from '@nepdatejs/datepicker';\nimport type { PanelLayout } from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { openPanel, renderSegment } from './panel';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport type { Theme } from './picker-view';\nimport {\n PANEL_WIDTH,\n PANEL_WIDTH_WITH_PRESETS,\n PresetList,\n TIME_COLUMNS_WIDTH,\n} from './preset-list';\n\nexport interface DateTimePickerViewOptions extends DateTimePickerOptions {\n readonly name?: string | undefined;\n readonly hiddenInput?: boolean | undefined;\n readonly required?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n /** 'sheet' opens a bottom sheet; 'popover' sits beside the field; 'auto' (default) uses the sheet below 480px. */\n readonly panelLayout?: PanelLayout | undefined;\n readonly theme?: Theme | undefined;\n readonly ariaLabel?: string | undefined;\n readonly timeLabel?: string | undefined;\n readonly id?: string | undefined;\n readonly onOpenChange?: ((open: boolean) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'name',\n 'hiddenInput',\n 'required',\n 'disabled',\n 'theme',\n 'panelLayout',\n 'ariaLabel',\n 'timeLabel',\n 'id',\n 'onOpenChange',\n 'onChange',\n]);\n\n/** A date input and a time input sharing one panel: calendar plus hour/minute columns. */\nexport class DateTimePickerView {\n readonly store: DateTimePickerStore;\n readonly dateInput: HTMLInputElement;\n readonly timeInput: HTMLInputElement;\n private options: DateTimePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly row: HTMLDivElement;\n private readonly dateBox: HTMLDivElement;\n private readonly timeBox: HTMLDivElement;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly nowButton: HTMLButtonElement;\n private readonly doneButton: HTMLButtonElement;\n private readonly hours: HTMLDivElement;\n private readonly minutes: HTMLDivElement;\n private readonly time: HTMLDivElement;\n private readonly hidden: HTMLInputElement;\n private readonly calendarView: CalendarView;\n private readonly presetList: PresetList;\n private readonly unsubscribe: () => void;\n private closePanel: (() => void) | null = null;\n private wasOpen = false;\n\n constructor(host: HTMLElement, options: DateTimePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createDateTimePicker({\n ...storeOptions(options),\n onChange: (value, detail) => {\n this.options.onChange?.(value, detail);\n },\n });\n const id = options.id ?? uid('ndp-datetime');\n this.dateInput = el('input', {\n class: 'ndp-input__control',\n id,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n 'aria-controls': `${id}-panel`,\n });\n this.timeInput = el('input', {\n class: 'ndp-input__control',\n id: `${id}-time`,\n type: 'text',\n autocomplete: 'off',\n });\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.dateBox = el('div', { class: 'ndp-input' }, [\n this.dateInput,\n el('span', { class: 'ndp-input__actions' }, [this.toggleButton]),\n ]);\n this.timeBox = el('div', { class: 'ndp-input ndp-input--time' }, [this.timeInput]);\n this.row = el('div', { class: 'ndp-datetime' }, [this.dateBox, this.timeBox]);\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${id}-hint`,\n 'aria-live': 'polite',\n hidden: true,\n });\n this.hidden = el('input', { type: 'hidden' });\n this.segment = el('div', { class: 'ndp-segment', role: 'group' }, [\n el('button', { type: 'button', class: 'ndp-segment__item', 'data-calendar': 'BS' }),\n el('button', { type: 'button', class: 'ndp-segment__item', 'data-calendar': 'AD' }),\n ]);\n this.nowButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'now',\n });\n this.doneButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-variant': 'primary',\n 'data-action': 'done',\n });\n this.hours = el('div', {\n class: 'ndp-time__column',\n role: 'group',\n 'data-unit': 'hour',\n });\n this.minutes = el('div', {\n class: 'ndp-time__column',\n role: 'group',\n 'data-unit': 'minute',\n });\n this.time = el('div', { class: 'ndp-time', role: 'group' }, [\n this.hours,\n this.minutes,\n ]);\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.presetList = new PresetList((presetId) => {\n this.store.actions.applyPreset(presetId);\n });\n this.panel = el(\n 'div',\n {\n class: 'ndp-panel',\n id: `${id}-panel`,\n\n hidden: true,\n },\n [\n el('div', { class: 'ndp-panel__body' }, [\n this.presetList.element,\n calendarRoot,\n this.time,\n ]),\n el('div', { class: 'ndp-panel__footer' }, [\n this.segment,\n el('span', {}, [this.nowButton, this.doneButton]),\n ]),\n ],\n );\n this.field = el('div', { class: 'ndp-field' }, [\n this.row,\n this.hint,\n this.panel,\n this.hidden,\n ]);\n host.append(this.field);\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n this.store.actions.selectDate(date);\n },\n });\n\n this.dateInput.addEventListener('input', () => {\n this.store.actions.typeDate(this.dateInput.value);\n });\n this.dateInput.addEventListener('blur', () => {\n this.store.actions.blurDate();\n });\n this.dateInput.addEventListener('keydown', (event) => {\n if (event.key === 'ArrowDown' && (event.altKey || this.dateInput.value === '')) {\n event.preventDefault();\n this.open();\n }\n });\n this.timeInput.addEventListener('input', () => {\n this.store.actions.typeTime(this.timeInput.value);\n });\n this.timeInput.addEventListener('blur', () => {\n this.store.actions.blurTime();\n });\n this.field.addEventListener('click', this.onClick);\n this.unsubscribe = this.store.subscribe(() => {\n this.render();\n });\n this.render();\n }\n\n getState(): DateTimePickerState {\n return this.store.getState();\n }\n\n setOptions(changes: Partial<DateTimePickerViewOptions>): void {\n this.options = { ...this.options, ...changes };\n const forStore = storeOptions(changes);\n if (Object.keys(forStore).length > 0) {\n this.store.setOptions(forStore);\n } else {\n this.render();\n }\n }\n\n open(): void {\n if (!this.options.disabled) {\n this.store.actions.open();\n }\n }\n\n close(): void {\n this.store.actions.close();\n }\n\n destroy(): void {\n this.closePanel?.();\n this.unsubscribe();\n this.calendarView.destroy();\n this.field.remove();\n }\n\n private render(): void {\n const state = this.store.getState();\n const locale = getLocale(this.options.locale);\n const disabled = this.options.disabled ?? false;\n const hint = state.error?.message ?? state.equivalentText;\n\n if (this.dateInput.value !== state.dateText) {\n this.dateInput.value = state.dateText;\n }\n if (this.timeInput.value !== state.timeText) {\n this.timeInput.value = state.timeText;\n }\n this.dateInput.setCustomValidity(\n state.error?.field === 'date' ? state.error.message : '',\n );\n this.timeInput.setCustomValidity(\n state.error?.field === 'time' ? state.error.message : '',\n );\n setAttrs(this.dateInput, {\n placeholder: state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': this.options.ariaLabel ?? null,\n 'aria-invalid': state.error?.field === 'date' ? 'true' : null,\n 'aria-describedby': hint ? this.hint.id : null,\n });\n setAttrs(this.timeInput, {\n placeholder: state.timePlaceholder,\n disabled,\n 'aria-label': this.options.timeLabel ?? locale.labels.time,\n 'aria-invalid': state.error?.field === 'time' ? 'true' : null,\n 'aria-describedby': hint ? this.hint.id : null,\n });\n setAttrs(this.dateBox, {\n 'data-invalid': state.error?.field === 'date',\n 'data-disabled': disabled,\n });\n setAttrs(this.timeBox, {\n 'data-invalid': state.error?.field === 'time',\n 'data-disabled': disabled,\n });\n setAttrs(this.field, { 'data-ndp-theme': this.options.theme ?? null });\n setAttrs(this.panel, {\n 'data-ndp-theme': this.options.theme ?? null,\n 'aria-label': locale.labels.chooseDate,\n });\n setAttrs(this.toggleButton, {\n disabled,\n 'aria-label': locale.labels.openCalendar,\n 'aria-expanded': state.open ? 'true' : 'false',\n });\n this.hint.hidden = hint === null;\n setText(this.hint, hint ?? '');\n setAttrs(this.hint, { 'data-error': state.error !== null });\n\n renderSegment(this.segment, state, locale);\n setText(this.nowButton, locale.labels.now);\n setText(this.doneButton, locale.labels.done);\n setAttrs(this.time, { 'aria-label': locale.labels.time });\n setAttrs(this.hours, { 'aria-label': locale.labels.hour });\n setAttrs(this.minutes, { 'aria-label': locale.labels.minute });\n renderColumn(this.hours, state.hours);\n renderColumn(this.minutes, state.minutes);\n this.presetList.render(state.presets, locale.labels.presets);\n\n const name = this.options.hiddenInput === false ? undefined : this.options.name;\n setAttrs(this.hidden, { name: name ?? null });\n this.hidden.value = state.value;\n this.hidden.disabled = name === undefined || disabled;\n setPopupMode(state, [this.dateInput], this.toggleButton, this.panel);\n this.syncPanel(state.open && !state.inline);\n this.panel.hidden = !state.inline && !this.wasOpen;\n this.panel.style.setProperty(\n '--ndp-panel-width',\n state.inline ? `${String(this.panelWidth())}px` : null,\n );\n }\n\n private panelWidth(): number {\n return (\n (this.store.getState().presets.length > 0\n ? PANEL_WIDTH_WITH_PRESETS\n : PANEL_WIDTH) + TIME_COLUMNS_WIDTH\n );\n }\n\n private syncPanel(open: boolean): void {\n if (open === this.wasOpen) {\n return;\n }\n this.wasOpen = open;\n this.options.onOpenChange?.(open);\n if (open) {\n this.closePanel = openPanel({\n panel: this.panel,\n anchor: this.row,\n inside: [this.field],\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n close: () => {\n this.store.actions.close();\n },\n returnFocus: this.dateInput,\n });\n for (const item of this.time.querySelectorAll<HTMLElement>(\n '[aria-pressed=\"true\"]',\n )) {\n if (typeof item.scrollIntoView === 'function') {\n item.scrollIntoView({ block: 'nearest' });\n }\n }\n this.calendarView.focusGrid();\n } else {\n this.closePanel?.();\n this.closePanel = null;\n }\n }\n\n private readonly onClick = (event: MouseEvent): void => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target || this.calendarView.element.contains(target)) {\n return;\n }\n const item = target.closest<HTMLButtonElement>('.ndp-time-item');\n if (item) {\n const unit = item.parentElement?.dataset['unit'];\n const value = Number(item.dataset['value']);\n if (unit === 'hour') {\n this.store.actions.selectHour(value);\n } else {\n this.store.actions.selectMinute(value);\n }\n return;\n }\n const calendar = target.closest<HTMLElement>('[data-calendar]')?.dataset['calendar'];\n if (calendar === 'BS' || calendar === 'AD') {\n this.store.actions.switchCalendar(calendar);\n return;\n }\n switch (target.closest<HTMLElement>('[data-action]')?.dataset['action']) {\n case 'toggle':\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n break;\n case 'now':\n this.store.actions.selectNow();\n break;\n case 'done':\n this.close();\n this.dateInput.focus();\n break;\n default:\n break;\n }\n };\n}\n\nfunction renderColumn(column: HTMLElement, cells: readonly TimeCell[]): void {\n if (column.children.length !== cells.length) {\n column.replaceChildren(\n ...cells.map((cell) =>\n el('button', {\n type: 'button',\n class: 'ndp-time-item',\n 'data-value': cell.value,\n }),\n ),\n );\n }\n cells.forEach((cell, index) => {\n const button = column.children[index];\n if (button) {\n setText(button, cell.label);\n setAttrs(button, {\n 'data-value': cell.value,\n 'aria-pressed': cell.isSelected ? 'true' : 'false',\n });\n }\n });\n}\n\nfunction storeOptions(\n options: Partial<DateTimePickerViewOptions>,\n): Partial<DateTimePickerOptions> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(options)) {\n if (!VIEW_KEYS.has(key)) {\n out[key] = value;\n }\n }\n\n return out;\n}\n","import type { SinglePreset } from '@nepdatejs/datepicker';\nimport { DateTimePickerView, type DateTimePickerViewOptions } from './datetime-view';\nimport {\n Base,\n str,\n bool,\n calendarAttr,\n int,\n onUnlessFalse,\n panelLayout,\n theme,\n presetIds,\n swallowInnerChange,\n type RichProps,\n} from './element-utils';\n\n/**\n * <nep-date-time-picker name=\"starts-at\" minute-step=\"15\"></nep-date-time-picker>\n *\n * A form-associated BS/AD date + time field. The form receives one instant as\n * an ISO timestamp with the zone's offset (\"2026-10-18T14:30:00+05:45\").\n * Fires `change` with { value, ad, bs, time }.\n */\nexport class NepDateTimePickerElement extends Base {\n static readonly formAssociated = true;\n static readonly observedAttributes: readonly string[] = [\n 'value',\n 'min',\n 'max',\n 'calendar',\n 'default-calendar',\n 'locale',\n 'name',\n 'required',\n 'disabled',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'time-zone',\n 'hour12',\n 'minute-step',\n 'default-time',\n 'label',\n 'time-label',\n 'presets',\n ];\n\n view: DateTimePickerView | null = null;\n private readonly internals: ElementInternals | null;\n private rich: RichProps = {};\n private unsubscribe: (() => void) | null = null;\n\n constructor() {\n super();\n this.internals =\n typeof this.attachInternals === 'function' ? this.attachInternals() : null;\n swallowInnerChange(this);\n }\n\n get value(): string {\n return this.view?.getState().value ?? '';\n }\n set value(next: string) {\n this.view?.store.actions.setValue(next);\n }\n set holidays(next: RichProps['holidays']) {\n this.rich = { ...this.rich, holidays: next };\n this.view?.setOptions({ holidays: next });\n }\n set isDateDisabled(next: RichProps['isDateDisabled']) {\n this.rich = { ...this.rich, isDateDisabled: next };\n this.view?.setOptions({ isDateDisabled: next });\n }\n\n connectedCallback(): void {\n if (this.view) {\n return;\n }\n const view = new DateTimePickerView(this, {\n ...this.readOptions(),\n defaultValue: str(this, 'value'),\n onChange: (value, detail) => {\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n detail: {\n value,\n ad: detail?.ad ?? null,\n bs: detail?.bs ?? null,\n time: detail?.time ?? null,\n },\n }),\n );\n },\n onOpenChange: (open) => {\n this.dispatchEvent(\n new CustomEvent(open ? 'nep-open' : 'nep-close', { bubbles: true }),\n );\n },\n });\n this.view = view;\n this.unsubscribe = view.store.subscribe(() => {\n this.syncForm();\n });\n this.syncForm();\n }\n\n disconnectedCallback(): void {\n this.unsubscribe?.();\n this.view?.destroy();\n this.view = null;\n }\n\n attributeChangedCallback(\n name: string,\n previous: string | null,\n next: string | null,\n ): void {\n if (!this.view || previous === next) {\n return;\n }\n if (name === 'value') {\n this.view.store.actions.setValue(next ?? '');\n }\n this.view.setOptions(this.readOptions());\n this.syncForm();\n }\n\n formResetCallback(): void {\n this.view?.store.actions.reset();\n }\n\n formDisabledCallback(disabled: boolean): void {\n this.view?.setOptions({ disabled: disabled || bool(this, 'disabled') });\n }\n\n override focus(options?: FocusOptions): void {\n this.view?.dateInput.focus(options);\n }\n\n private readOptions(): DateTimePickerViewOptions {\n return {\n ...this.rich,\n min: str(this, 'min'),\n max: str(this, 'max'),\n calendar: calendarAttr(this, 'calendar'),\n defaultCalendar: calendarAttr(this, 'default-calendar'),\n locale: str(this, 'locale'),\n name: str(this, 'name'),\n hiddenInput: this.internals === null,\n required: bool(this, 'required'),\n disabled: bool(this, 'disabled'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: this.hasAttribute('inline'),\n timeZone: str(this, 'time-zone'),\n hour12: bool(this, 'hour12'),\n minuteStep: int(this, 'minute-step'),\n defaultTime: str(this, 'default-time'),\n ariaLabel: str(this, 'label'),\n timeLabel: str(this, 'time-label'),\n presets: presetIds(this) as readonly SinglePreset[] | undefined,\n };\n }\n\n private syncForm(): void {\n const view = this.view;\n if (!view || !this.internals) {\n return;\n }\n const state = view.getState();\n this.internals.setFormValue(state.value === '' ? null : state.value);\n if (state.error) {\n this.internals.setValidity(\n { customError: true },\n state.error.message,\n state.error.field === 'time' ? view.timeInput : view.dateInput,\n );\n } else if (bool(this, 'required') && state.value === '') {\n this.internals.setValidity(\n { valueMissing: true },\n 'Please choose a date and time.',\n view.dateInput,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n","/** `@nepdatejs/vanilla/date-time-picker`: just the date + time picker. */\nimport { NepDateTimePickerElement } from './date-time-picker-element';\nimport { DateTimePickerView, type DateTimePickerViewOptions } from './datetime-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepDateTimePickerElement };\nexport { DateTimePickerView, type DateTimePickerViewOptions } from './datetime-view';\n\n/** Register <nep-date-time-picker> (skipped if already defined). */\nexport function defineDateTimePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.dateTimePicker, NepDateTimePickerElement, registry);\n}\n\n/** Mount a date + time picker into a container. */\nexport function createDateTimePicker(\n container: HTMLElement,\n options: DateTimePickerViewOptions = {},\n): DateTimePickerView {\n return new DateTimePickerView(container, options);\n}\n"],"mappings":"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"}