@nepdatejs/vanilla 0.1.0 → 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.
- package/README.md +1 -1
- package/dist/auto-define.cjs +1 -1
- package/dist/auto-define.js +1 -1
- package/dist/{date-picker-ucoEFnMW.js → date-picker-BwlrlU5Y.js} +13 -30
- package/dist/date-picker-BwlrlU5Y.js.map +1 -0
- package/dist/{date-picker-CQoabjlj.cjs → date-picker-CgjYsf1w.cjs} +12 -29
- package/dist/date-picker-CgjYsf1w.cjs.map +1 -0
- package/dist/date-picker.cjs +1 -1
- package/dist/date-picker.js +1 -1
- package/dist/{date-range-picker-DAkCzVgT.js → date-range-picker-NwetXUC-.js} +13 -30
- package/dist/date-range-picker-NwetXUC-.js.map +1 -0
- package/dist/{date-range-picker-BQKcZeqG.cjs → date-range-picker-VrQZFZED.cjs} +12 -29
- package/dist/date-range-picker-VrQZFZED.cjs.map +1 -0
- package/dist/date-range-picker.cjs +1 -1
- package/dist/date-range-picker.js +1 -1
- package/dist/{date-time-picker-Bxfn-a9T.cjs → date-time-picker-ChHIBTBw.cjs} +12 -30
- package/dist/date-time-picker-ChHIBTBw.cjs.map +1 -0
- package/dist/{date-time-picker-BqweOP2u.js → date-time-picker-CxqC95aM.js} +12 -30
- package/dist/date-time-picker-CxqC95aM.js.map +1 -0
- package/dist/date-time-picker.cjs +1 -1
- package/dist/date-time-picker.js +1 -1
- package/dist/{define-DTTdLfIM.cjs → define-BbTIFHtH.cjs} +5 -5
- package/dist/{define-DTTdLfIM.cjs.map → define-BbTIFHtH.cjs.map} +1 -1
- package/dist/{define-7natoEH4.js → define-D96w8Zu2.js} +5 -5
- package/dist/{define-7natoEH4.js.map → define-D96w8Zu2.js.map} +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.js +5 -5
- package/dist/{multi-date-picker-XCg8Y0sF.js → multi-date-picker-C3Lr0Dq-.js} +13 -28
- package/dist/multi-date-picker-C3Lr0Dq-.js.map +1 -0
- package/dist/{multi-date-picker-BMEYUPBa.cjs → multi-date-picker-DUyuO-nH.cjs} +12 -27
- package/dist/multi-date-picker-DUyuO-nH.cjs.map +1 -0
- package/dist/multi-date-picker.cjs +1 -1
- package/dist/multi-date-picker.js +1 -1
- package/dist/nepdate-picker.global.js +2 -2
- package/dist/nepdate-picker.global.js.map +1 -1
- package/dist/preset-list-BYCZm61I.cjs +97 -0
- package/dist/preset-list-BYCZm61I.cjs.map +1 -0
- package/dist/preset-list-DmE6fJjr.js +80 -0
- package/dist/preset-list-DmE6fJjr.js.map +1 -0
- package/package.json +4 -4
- package/src/datetime-view.ts +12 -37
- package/src/multi-view.ts +11 -33
- package/src/panel.ts +61 -0
- package/src/picker-view.ts +11 -36
- package/src/range-view.ts +12 -37
- package/dist/date-picker-CQoabjlj.cjs.map +0 -1
- package/dist/date-picker-ucoEFnMW.js.map +0 -1
- package/dist/date-range-picker-BQKcZeqG.cjs.map +0 -1
- package/dist/date-range-picker-DAkCzVgT.js.map +0 -1
- package/dist/date-time-picker-BqweOP2u.js.map +0 -1
- package/dist/date-time-picker-Bxfn-a9T.cjs.map +0 -1
- package/dist/multi-date-picker-BMEYUPBa.cjs.map +0 -1
- package/dist/multi-date-picker-XCg8Y0sF.js.map +0 -1
- package/dist/preset-list-CASwnwmS.js +0 -45
- package/dist/preset-list-CASwnwmS.js.map +0 -1
- package/dist/preset-list-Cs8H12Wp.cjs +0 -50
- package/dist/preset-list-Cs8H12Wp.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker-CQoabjlj.cjs","names":["createDatePicker","uid","el","icon","PresetList","CalendarView","getLocale","trackPosition","onOutsidePointer","onBackdropPointer","onEscape","Base","isoOf","fromIsoDate","presetIds","str","bool","calendarAttr","onUnlessFalse","theme","panelLayout","weekday","ELEMENT_NAMES"],"sources":["../src/picker-view.ts","../src/date-picker-element.ts","../src/date-picker.ts"],"sourcesContent":["import { getLocale, type CalendarSystem } from '@nepdatejs/core';\nimport {\n createDatePicker,\n type DateDetail,\n type DatePickerOptions,\n type DatePickerState,\n type DatePickerStore,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport { PANEL_WIDTH, PANEL_WIDTH_WITH_PRESETS, PresetList } from './preset-list';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\n/** Everything the date picker DOM needs on top of the store's options. */\nexport interface DatePickerViewOptions extends DatePickerOptions {\n /** Submit the AD value with a plain form under this name (hidden input). */\n readonly name?: string | undefined;\n /** Render a hidden input for `name`. Off for the form-associated custom element. */\n readonly hiddenInput?: boolean | undefined;\n readonly id?: string | undefined;\n readonly placeholder?: string | undefined;\n readonly required?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n /** Show the × button. Default true. */\n readonly clearable?: boolean | undefined;\n /** Show the same day in the other calendar under the field. Default true. */\n readonly showEquivalent?: 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 /** Remember the viewer's BS/AD choice in localStorage under this key. */\n readonly persistCalendar?: string | undefined;\n readonly ariaLabel?: string | undefined;\n readonly onOpenChange?: ((open: boolean) => void) | undefined;\n /** Called on every keystroke with the current text. */\n readonly onInput?: ((text: string) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'name',\n 'hiddenInput',\n 'id',\n 'placeholder',\n 'required',\n 'disabled',\n 'clearable',\n 'showEquivalent',\n 'theme',\n 'panelLayout',\n 'persistCalendar',\n 'ariaLabel',\n 'onOpenChange',\n 'onInput',\n]);\n\n/**\n * The date picker field and panel, rendered with the @nepdatejs/styles markup\n * into `host`. Used by <nep-date-picker> and by createDatePicker().\n */\nexport class DatePickerView {\n readonly store: DatePickerStore;\n readonly input: HTMLInputElement;\n private options: DatePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly box: HTMLDivElement;\n private readonly clearButton: HTMLButtonElement;\n private readonly switchButton: HTMLButtonElement;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly todayButton: HTMLButtonElement;\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: DatePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createDatePicker({\n ...storeOptions(options),\n onChange: (value, detail) => {\n this.options.onChange?.(value, detail);\n },\n onCalendarChange: (calendar) => {\n this.remember(calendar);\n this.options.onCalendarChange?.(calendar);\n },\n });\n\n const inputId = options.id ?? uid('ndp-input');\n const panelId = `${inputId}-panel`;\n this.input = el('input', {\n class: 'ndp-input__control',\n id: inputId,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n spellcheck: 'false',\n 'aria-controls': panelId,\n });\n this.clearButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'clear' },\n [icon('close')],\n );\n this.switchButton = el('button', {\n type: 'button',\n class: 'ndp-input__switch',\n 'data-action': 'switch',\n });\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.box = el('div', { class: 'ndp-input' }, [\n this.input,\n el('span', { class: 'ndp-input__actions' }, [\n this.clearButton,\n this.switchButton,\n this.toggleButton,\n ]),\n ]);\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${inputId}-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.todayButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'today',\n });\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.presetList = new PresetList((id) => {\n if (this.store.actions.applyPreset(id) && !this.store.getState().open) {\n restoreFocus(this.input);\n }\n });\n this.panel = el(\n 'div',\n {\n class: 'ndp-panel',\n id: panelId,\n hidden: true,\n },\n [\n el('div', { class: 'ndp-panel__body' }, [this.presetList.element, calendarRoot]),\n el('div', { class: 'ndp-panel__footer' }, [this.segment, this.todayButton]),\n ],\n );\n this.field = el('div', { class: 'ndp-field' }, [\n this.box,\n this.hint,\n this.panel,\n this.hidden,\n ]);\n host.append(this.field);\n\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n if (this.store.actions.select(date) && !this.store.getState().open) {\n restoreFocus(this.input);\n }\n },\n });\n\n this.input.addEventListener('input', this.onTextInput);\n this.input.addEventListener('blur', () => {\n this.store.actions.blur();\n });\n this.input.addEventListener('keydown', this.onInputKeyDown);\n this.field.addEventListener('click', this.onClick);\n\n this.unsubscribe = this.store.subscribe(() => {\n this.render();\n });\n this.restoreCalendar();\n this.render();\n }\n\n getState(): DatePickerState {\n return this.store.getState();\n }\n\n /** Change view or store options. Unknown keys are ignored. */\n setOptions(changes: Partial<DatePickerViewOptions>): 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 hintText =\n state.error?.message ??\n ((this.options.showEquivalent ?? true) ? state.equivalentText : null);\n\n if (this.input.value !== state.text) {\n this.input.value = state.text;\n }\n this.input.setCustomValidity(state.error?.message ?? '');\n setAttrs(this.input, {\n placeholder: this.options.placeholder ?? state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': this.options.ariaLabel ?? null,\n 'aria-invalid': state.error ? 'true' : null,\n 'aria-describedby': hintText ? this.hint.id : null,\n });\n setAttrs(this.box, {\n 'data-invalid': state.error !== null,\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': this.options.ariaLabel\n ? `${this.options.ariaLabel}: ${locale.labels.calendar}`\n : locale.labels.chooseDate,\n });\n\n this.clearButton.hidden =\n !(this.options.clearable ?? true) || state.text === '' || disabled;\n setAttrs(this.clearButton, { 'aria-label': locale.labels.clear });\n this.switchButton.hidden = !state.canSwitchCalendar;\n setText(this.switchButton, locale.calendarNames[state.calendar]);\n const other: CalendarSystem = state.calendar === 'BS' ? 'AD' : 'BS';\n setAttrs(this.switchButton, {\n disabled,\n 'aria-label': `${locale.labels.calendar}: ${locale.calendarNames[state.calendar]} → ${locale.calendarNames[other]}`,\n });\n setAttrs(this.toggleButton, {\n disabled,\n 'aria-label': locale.labels.openCalendar,\n 'aria-expanded': state.open ? 'true' : 'false',\n });\n\n this.hint.hidden = hintText === null;\n setText(this.hint, hintText ?? '');\n setAttrs(this.hint, { 'data-error': state.error !== null });\n\n this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] as CalendarSystem;\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, {\n 'aria-pressed': calendar === state.calendar ? 'true' : 'false',\n });\n }\n setText(this.todayButton, locale.labels.today);\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, value: state.value });\n this.hidden.value = state.value;\n this.hidden.disabled = name === undefined || disabled;\n\n setPopupMode(state, [this.input], 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 this.store.getState().presets.length > 0\n ? PANEL_WIDTH_WITH_PRESETS\n : PANEL_WIDTH;\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.panel.hidden = false;\n const stopTracking = trackPosition(this.box, this.panel, {\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n });\n const stopOutside = onOutsidePointer([this.field, this.panel], () => {\n this.store.actions.close();\n });\n const stopBackdrop = onBackdropPointer(this.panel, () => {\n this.store.actions.close();\n });\n const stopEscape = onEscape(() => {\n this.store.actions.close();\n restoreFocus(this.input);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\n };\n this.calendarView.focusGrid();\n } else {\n this.closePanel?.();\n this.closePanel = null;\n }\n }\n\n private readonly onTextInput = (): void => {\n this.store.actions.type(this.input.value);\n this.options.onInput?.(this.input.value);\n };\n\n private readonly onInputKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'ArrowDown' && (event.altKey || this.input.value === '')) {\n event.preventDefault();\n this.open();\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 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 'clear':\n this.store.actions.clear();\n this.input.focus();\n break;\n case 'switch':\n this.store.actions.switchCalendar(\n this.store.getState().calendar === 'BS' ? 'AD' : 'BS',\n );\n break;\n case 'toggle':\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n break;\n case 'today':\n if (this.store.actions.selectToday()) {\n restoreFocus(this.input);\n }\n break;\n default:\n break;\n }\n };\n\n private remember(calendar: CalendarSystem): void {\n const key = this.options.persistCalendar;\n if (!key) {\n return;\n }\n try {\n window.localStorage.setItem(key, calendar);\n } catch {\n // Storage can be blocked (private mode); the choice then lasts for this page only.\n }\n }\n\n private restoreCalendar(): void {\n const key = this.options.persistCalendar;\n if (!key) {\n return;\n }\n const stored = readStorage(key);\n if (stored === 'BS' || stored === 'AD') {\n this.store.actions.switchCalendar(stored);\n }\n }\n}\n\n/** Only the keys the picker store understands, minus the view's own callbacks. */\nfunction storeOptions(\n options: Partial<DatePickerViewOptions>,\n): Partial<DatePickerOptions> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(options)) {\n if (!VIEW_KEYS.has(key) && key !== 'onChange' && key !== 'onCalendarChange') {\n out[key] = value;\n }\n }\n\n return out;\n}\n\nfunction readStorage(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null; // storage blocked\n }\n}\n\nexport type { DateDetail };\n","import { fromIsoDate } from '@nepdatejs/core';\nimport type { SinglePreset } from '@nepdatejs/datepicker';\nimport { DatePickerView, type DatePickerViewOptions } from './picker-view';\nimport {\n Base,\n str,\n bool,\n onUnlessFalse,\n calendarAttr,\n weekday,\n panelLayout,\n theme,\n presetIds,\n swallowInnerChange,\n isoOf,\n type RichProps,\n} from './element-utils';\n\n/**\n * <nep-date-picker name=\"dob\" min=\"2020-01-01\"></nep-date-picker>\n *\n * A form-associated BS/AD date field: the form receives the AD \"YYYY-MM-DD\"\n * value under `name`. Fires `change` with { value, ad, bs }, plus `nep-open`,\n * `nep-close` and `nep-calendar-change`.\n */\nexport class NepDatePickerElement 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 'placeholder',\n 'required',\n 'disabled',\n 'clearable',\n 'show-equivalent',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'persist-calendar',\n 'week-starts-on',\n 'display-format',\n 'label',\n 'close-on-select',\n 'input-id',\n 'presets',\n ];\n\n /** The view, once connected. */\n view: DatePickerView | null = null;\n private readonly internals: ElementInternals | null;\n private rich: RichProps = {};\n private customPresets: readonly SinglePreset[] | undefined;\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 ?? isoOf(fromIsoDate(this.getAttribute('value')));\n }\n set value(next: string) {\n this.view?.store.actions.setValue(next);\n }\n get holidays(): RichProps['holidays'] {\n return this.rich.holidays;\n }\n set holidays(next: RichProps['holidays']) {\n this.setRich({ holidays: next });\n }\n get events(): RichProps['events'] {\n return this.rich.events;\n }\n set events(next: RichProps['events']) {\n this.setRich({ events: next });\n }\n get isDateDisabled(): RichProps['isDateDisabled'] {\n return this.rich.isDateDisabled;\n }\n set isDateDisabled(next: RichProps['isDateDisabled']) {\n this.setRich({ isDateDisabled: next });\n }\n /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */\n get presets(): readonly SinglePreset[] | undefined {\n return this.customPresets ?? (presetIds(this) as readonly SinglePreset[] | undefined);\n }\n set presets(next: readonly SinglePreset[] | undefined) {\n this.customPresets = next;\n this.view?.setOptions({ presets: this.presets });\n }\n get form(): HTMLFormElement | null {\n return this.internals?.form ?? null;\n }\n get validity(): ValidityState | undefined {\n return this.internals?.validity;\n }\n get validationMessage(): string {\n return this.internals?.validationMessage ?? '';\n }\n checkValidity(): boolean {\n return this.internals?.checkValidity() ?? true;\n }\n reportValidity(): boolean {\n return this.internals?.reportValidity() ?? true;\n }\n\n connectedCallback(): void {\n if (this.view) {\n return;\n }\n const view = new DatePickerView(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: { value, ad: detail?.ad ?? null, bs: detail?.bs ?? null },\n }),\n );\n },\n onCalendarChange: (calendar) => {\n this.dispatchEvent(\n new CustomEvent('nep-calendar-change', { bubbles: true, detail: { calendar } }),\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 formStateRestoreCallback(state: string | File | FormData | null): void {\n if (typeof state === 'string') {\n this.view?.store.actions.setValue(state);\n }\n }\n\n override focus(options?: FocusOptions): void {\n this.view?.input.focus(options);\n }\n\n open(): void {\n this.view?.open();\n }\n\n close(): void {\n this.view?.close();\n }\n\n private setRich(changes: RichProps): void {\n this.rich = { ...this.rich, ...changes };\n this.view?.setOptions(changes);\n }\n\n private readOptions(): DatePickerViewOptions {\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 placeholder: str(this, 'placeholder'),\n required: bool(this, 'required'),\n disabled: bool(this, 'disabled'),\n clearable: onUnlessFalse(this, 'clearable'),\n showEquivalent: onUnlessFalse(this, 'show-equivalent'),\n closeOnSelect: onUnlessFalse(this, 'close-on-select'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: this.hasAttribute('inline'),\n persistCalendar: str(this, 'persist-calendar'),\n weekStartsOn: weekday(this, 'week-starts-on'),\n displayFormat: str(this, 'display-format'),\n ariaLabel: str(this, 'label'),\n id: str(this, 'input-id'),\n presets: this.presets,\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, state.value);\n if (state.error) {\n this.internals.setValidity({ customError: true }, state.error.message, view.input);\n } else if (bool(this, 'required') && state.value === '') {\n this.internals.setValidity(\n { valueMissing: true },\n view.input.validationMessage || 'Please choose a date.',\n view.input,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n","/** `@nepdatejs/vanilla/date-picker`: just the date picker (element, view and mount function). */\nimport type { DatePickerState } from '@nepdatejs/datepicker';\nimport { NepDatePickerElement } from './date-picker-element';\nimport { DatePickerView, type DatePickerViewOptions } from './picker-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepDatePickerElement };\nexport { DatePickerView, type DatePickerViewOptions, type Theme } from './picker-view';\n\n/** Register <nep-date-picker> (skipped if already defined). */\nexport function defineDatePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.datePicker, NepDatePickerElement, registry);\n}\n\nexport interface DatePickerHandle {\n readonly view: DatePickerView;\n getValue(): string;\n getState(): DatePickerState;\n setValue(value: string): void;\n setOptions(changes: Partial<DatePickerViewOptions>): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\n/**\n * Mount a date picker without custom elements.\n *\n * - Given a container, renders the field into it.\n * - Given an <input>, hides it and keeps its value in step with the picker\n * (AD \"YYYY-MM-DD\"), so existing forms and server code keep working.\n */\nexport function createDatePicker(\n target: HTMLElement,\n options: DatePickerViewOptions = {},\n): DatePickerHandle {\n const enhanced = target instanceof HTMLInputElement ? target : null;\n let host = target;\n if (enhanced) {\n host = document.createElement('span');\n enhanced.after(host);\n enhanced.hidden = true;\n }\n const view = new DatePickerView(host, {\n ...(enhanced\n ? {\n defaultValue: enhanced.value,\n name: undefined,\n required: enhanced.required,\n disabled: enhanced.disabled,\n }\n : {}),\n ...options,\n onChange: (value, detail) => {\n if (enhanced) {\n enhanced.value = value;\n enhanced.dispatchEvent(new Event('input', { bubbles: true }));\n enhanced.dispatchEvent(new Event('change', { bubbles: true }));\n }\n options.onChange?.(value, detail);\n },\n });\n\n return {\n view,\n getValue: () => view.getState().value,\n getState: () => view.getState(),\n setValue: (value) => {\n view.store.actions.setValue(value);\n if (enhanced) {\n enhanced.value = view.getState().value;\n }\n },\n setOptions: (changes) => {\n view.setOptions(changes);\n },\n open: () => {\n view.open();\n },\n close: () => {\n view.close();\n },\n destroy: () => {\n view.destroy();\n if (enhanced) {\n host.remove();\n enhanced.hidden = false;\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker-ucoEFnMW.js","names":["createDatePicker"],"sources":["../src/picker-view.ts","../src/date-picker-element.ts","../src/date-picker.ts"],"sourcesContent":["import { getLocale, type CalendarSystem } from '@nepdatejs/core';\nimport {\n createDatePicker,\n type DateDetail,\n type DatePickerOptions,\n type DatePickerState,\n type DatePickerStore,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport { PANEL_WIDTH, PANEL_WIDTH_WITH_PRESETS, PresetList } from './preset-list';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\n/** Everything the date picker DOM needs on top of the store's options. */\nexport interface DatePickerViewOptions extends DatePickerOptions {\n /** Submit the AD value with a plain form under this name (hidden input). */\n readonly name?: string | undefined;\n /** Render a hidden input for `name`. Off for the form-associated custom element. */\n readonly hiddenInput?: boolean | undefined;\n readonly id?: string | undefined;\n readonly placeholder?: string | undefined;\n readonly required?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n /** Show the × button. Default true. */\n readonly clearable?: boolean | undefined;\n /** Show the same day in the other calendar under the field. Default true. */\n readonly showEquivalent?: 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 /** Remember the viewer's BS/AD choice in localStorage under this key. */\n readonly persistCalendar?: string | undefined;\n readonly ariaLabel?: string | undefined;\n readonly onOpenChange?: ((open: boolean) => void) | undefined;\n /** Called on every keystroke with the current text. */\n readonly onInput?: ((text: string) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'name',\n 'hiddenInput',\n 'id',\n 'placeholder',\n 'required',\n 'disabled',\n 'clearable',\n 'showEquivalent',\n 'theme',\n 'panelLayout',\n 'persistCalendar',\n 'ariaLabel',\n 'onOpenChange',\n 'onInput',\n]);\n\n/**\n * The date picker field and panel, rendered with the @nepdatejs/styles markup\n * into `host`. Used by <nep-date-picker> and by createDatePicker().\n */\nexport class DatePickerView {\n readonly store: DatePickerStore;\n readonly input: HTMLInputElement;\n private options: DatePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly box: HTMLDivElement;\n private readonly clearButton: HTMLButtonElement;\n private readonly switchButton: HTMLButtonElement;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly todayButton: HTMLButtonElement;\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: DatePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createDatePicker({\n ...storeOptions(options),\n onChange: (value, detail) => {\n this.options.onChange?.(value, detail);\n },\n onCalendarChange: (calendar) => {\n this.remember(calendar);\n this.options.onCalendarChange?.(calendar);\n },\n });\n\n const inputId = options.id ?? uid('ndp-input');\n const panelId = `${inputId}-panel`;\n this.input = el('input', {\n class: 'ndp-input__control',\n id: inputId,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n spellcheck: 'false',\n 'aria-controls': panelId,\n });\n this.clearButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'clear' },\n [icon('close')],\n );\n this.switchButton = el('button', {\n type: 'button',\n class: 'ndp-input__switch',\n 'data-action': 'switch',\n });\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.box = el('div', { class: 'ndp-input' }, [\n this.input,\n el('span', { class: 'ndp-input__actions' }, [\n this.clearButton,\n this.switchButton,\n this.toggleButton,\n ]),\n ]);\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${inputId}-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.todayButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'today',\n });\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.presetList = new PresetList((id) => {\n if (this.store.actions.applyPreset(id) && !this.store.getState().open) {\n restoreFocus(this.input);\n }\n });\n this.panel = el(\n 'div',\n {\n class: 'ndp-panel',\n id: panelId,\n hidden: true,\n },\n [\n el('div', { class: 'ndp-panel__body' }, [this.presetList.element, calendarRoot]),\n el('div', { class: 'ndp-panel__footer' }, [this.segment, this.todayButton]),\n ],\n );\n this.field = el('div', { class: 'ndp-field' }, [\n this.box,\n this.hint,\n this.panel,\n this.hidden,\n ]);\n host.append(this.field);\n\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n if (this.store.actions.select(date) && !this.store.getState().open) {\n restoreFocus(this.input);\n }\n },\n });\n\n this.input.addEventListener('input', this.onTextInput);\n this.input.addEventListener('blur', () => {\n this.store.actions.blur();\n });\n this.input.addEventListener('keydown', this.onInputKeyDown);\n this.field.addEventListener('click', this.onClick);\n\n this.unsubscribe = this.store.subscribe(() => {\n this.render();\n });\n this.restoreCalendar();\n this.render();\n }\n\n getState(): DatePickerState {\n return this.store.getState();\n }\n\n /** Change view or store options. Unknown keys are ignored. */\n setOptions(changes: Partial<DatePickerViewOptions>): 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 hintText =\n state.error?.message ??\n ((this.options.showEquivalent ?? true) ? state.equivalentText : null);\n\n if (this.input.value !== state.text) {\n this.input.value = state.text;\n }\n this.input.setCustomValidity(state.error?.message ?? '');\n setAttrs(this.input, {\n placeholder: this.options.placeholder ?? state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': this.options.ariaLabel ?? null,\n 'aria-invalid': state.error ? 'true' : null,\n 'aria-describedby': hintText ? this.hint.id : null,\n });\n setAttrs(this.box, {\n 'data-invalid': state.error !== null,\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': this.options.ariaLabel\n ? `${this.options.ariaLabel}: ${locale.labels.calendar}`\n : locale.labels.chooseDate,\n });\n\n this.clearButton.hidden =\n !(this.options.clearable ?? true) || state.text === '' || disabled;\n setAttrs(this.clearButton, { 'aria-label': locale.labels.clear });\n this.switchButton.hidden = !state.canSwitchCalendar;\n setText(this.switchButton, locale.calendarNames[state.calendar]);\n const other: CalendarSystem = state.calendar === 'BS' ? 'AD' : 'BS';\n setAttrs(this.switchButton, {\n disabled,\n 'aria-label': `${locale.labels.calendar}: ${locale.calendarNames[state.calendar]} → ${locale.calendarNames[other]}`,\n });\n setAttrs(this.toggleButton, {\n disabled,\n 'aria-label': locale.labels.openCalendar,\n 'aria-expanded': state.open ? 'true' : 'false',\n });\n\n this.hint.hidden = hintText === null;\n setText(this.hint, hintText ?? '');\n setAttrs(this.hint, { 'data-error': state.error !== null });\n\n this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] as CalendarSystem;\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, {\n 'aria-pressed': calendar === state.calendar ? 'true' : 'false',\n });\n }\n setText(this.todayButton, locale.labels.today);\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, value: state.value });\n this.hidden.value = state.value;\n this.hidden.disabled = name === undefined || disabled;\n\n setPopupMode(state, [this.input], 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 this.store.getState().presets.length > 0\n ? PANEL_WIDTH_WITH_PRESETS\n : PANEL_WIDTH;\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.panel.hidden = false;\n const stopTracking = trackPosition(this.box, this.panel, {\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n });\n const stopOutside = onOutsidePointer([this.field, this.panel], () => {\n this.store.actions.close();\n });\n const stopBackdrop = onBackdropPointer(this.panel, () => {\n this.store.actions.close();\n });\n const stopEscape = onEscape(() => {\n this.store.actions.close();\n restoreFocus(this.input);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\n };\n this.calendarView.focusGrid();\n } else {\n this.closePanel?.();\n this.closePanel = null;\n }\n }\n\n private readonly onTextInput = (): void => {\n this.store.actions.type(this.input.value);\n this.options.onInput?.(this.input.value);\n };\n\n private readonly onInputKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'ArrowDown' && (event.altKey || this.input.value === '')) {\n event.preventDefault();\n this.open();\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 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 'clear':\n this.store.actions.clear();\n this.input.focus();\n break;\n case 'switch':\n this.store.actions.switchCalendar(\n this.store.getState().calendar === 'BS' ? 'AD' : 'BS',\n );\n break;\n case 'toggle':\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n break;\n case 'today':\n if (this.store.actions.selectToday()) {\n restoreFocus(this.input);\n }\n break;\n default:\n break;\n }\n };\n\n private remember(calendar: CalendarSystem): void {\n const key = this.options.persistCalendar;\n if (!key) {\n return;\n }\n try {\n window.localStorage.setItem(key, calendar);\n } catch {\n // Storage can be blocked (private mode); the choice then lasts for this page only.\n }\n }\n\n private restoreCalendar(): void {\n const key = this.options.persistCalendar;\n if (!key) {\n return;\n }\n const stored = readStorage(key);\n if (stored === 'BS' || stored === 'AD') {\n this.store.actions.switchCalendar(stored);\n }\n }\n}\n\n/** Only the keys the picker store understands, minus the view's own callbacks. */\nfunction storeOptions(\n options: Partial<DatePickerViewOptions>,\n): Partial<DatePickerOptions> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(options)) {\n if (!VIEW_KEYS.has(key) && key !== 'onChange' && key !== 'onCalendarChange') {\n out[key] = value;\n }\n }\n\n return out;\n}\n\nfunction readStorage(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null; // storage blocked\n }\n}\n\nexport type { DateDetail };\n","import { fromIsoDate } from '@nepdatejs/core';\nimport type { SinglePreset } from '@nepdatejs/datepicker';\nimport { DatePickerView, type DatePickerViewOptions } from './picker-view';\nimport {\n Base,\n str,\n bool,\n onUnlessFalse,\n calendarAttr,\n weekday,\n panelLayout,\n theme,\n presetIds,\n swallowInnerChange,\n isoOf,\n type RichProps,\n} from './element-utils';\n\n/**\n * <nep-date-picker name=\"dob\" min=\"2020-01-01\"></nep-date-picker>\n *\n * A form-associated BS/AD date field: the form receives the AD \"YYYY-MM-DD\"\n * value under `name`. Fires `change` with { value, ad, bs }, plus `nep-open`,\n * `nep-close` and `nep-calendar-change`.\n */\nexport class NepDatePickerElement 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 'placeholder',\n 'required',\n 'disabled',\n 'clearable',\n 'show-equivalent',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'persist-calendar',\n 'week-starts-on',\n 'display-format',\n 'label',\n 'close-on-select',\n 'input-id',\n 'presets',\n ];\n\n /** The view, once connected. */\n view: DatePickerView | null = null;\n private readonly internals: ElementInternals | null;\n private rich: RichProps = {};\n private customPresets: readonly SinglePreset[] | undefined;\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 ?? isoOf(fromIsoDate(this.getAttribute('value')));\n }\n set value(next: string) {\n this.view?.store.actions.setValue(next);\n }\n get holidays(): RichProps['holidays'] {\n return this.rich.holidays;\n }\n set holidays(next: RichProps['holidays']) {\n this.setRich({ holidays: next });\n }\n get events(): RichProps['events'] {\n return this.rich.events;\n }\n set events(next: RichProps['events']) {\n this.setRich({ events: next });\n }\n get isDateDisabled(): RichProps['isDateDisabled'] {\n return this.rich.isDateDisabled;\n }\n set isDateDisabled(next: RichProps['isDateDisabled']) {\n this.setRich({ isDateDisabled: next });\n }\n /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */\n get presets(): readonly SinglePreset[] | undefined {\n return this.customPresets ?? (presetIds(this) as readonly SinglePreset[] | undefined);\n }\n set presets(next: readonly SinglePreset[] | undefined) {\n this.customPresets = next;\n this.view?.setOptions({ presets: this.presets });\n }\n get form(): HTMLFormElement | null {\n return this.internals?.form ?? null;\n }\n get validity(): ValidityState | undefined {\n return this.internals?.validity;\n }\n get validationMessage(): string {\n return this.internals?.validationMessage ?? '';\n }\n checkValidity(): boolean {\n return this.internals?.checkValidity() ?? true;\n }\n reportValidity(): boolean {\n return this.internals?.reportValidity() ?? true;\n }\n\n connectedCallback(): void {\n if (this.view) {\n return;\n }\n const view = new DatePickerView(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: { value, ad: detail?.ad ?? null, bs: detail?.bs ?? null },\n }),\n );\n },\n onCalendarChange: (calendar) => {\n this.dispatchEvent(\n new CustomEvent('nep-calendar-change', { bubbles: true, detail: { calendar } }),\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 formStateRestoreCallback(state: string | File | FormData | null): void {\n if (typeof state === 'string') {\n this.view?.store.actions.setValue(state);\n }\n }\n\n override focus(options?: FocusOptions): void {\n this.view?.input.focus(options);\n }\n\n open(): void {\n this.view?.open();\n }\n\n close(): void {\n this.view?.close();\n }\n\n private setRich(changes: RichProps): void {\n this.rich = { ...this.rich, ...changes };\n this.view?.setOptions(changes);\n }\n\n private readOptions(): DatePickerViewOptions {\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 placeholder: str(this, 'placeholder'),\n required: bool(this, 'required'),\n disabled: bool(this, 'disabled'),\n clearable: onUnlessFalse(this, 'clearable'),\n showEquivalent: onUnlessFalse(this, 'show-equivalent'),\n closeOnSelect: onUnlessFalse(this, 'close-on-select'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: this.hasAttribute('inline'),\n persistCalendar: str(this, 'persist-calendar'),\n weekStartsOn: weekday(this, 'week-starts-on'),\n displayFormat: str(this, 'display-format'),\n ariaLabel: str(this, 'label'),\n id: str(this, 'input-id'),\n presets: this.presets,\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, state.value);\n if (state.error) {\n this.internals.setValidity({ customError: true }, state.error.message, view.input);\n } else if (bool(this, 'required') && state.value === '') {\n this.internals.setValidity(\n { valueMissing: true },\n view.input.validationMessage || 'Please choose a date.',\n view.input,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n","/** `@nepdatejs/vanilla/date-picker`: just the date picker (element, view and mount function). */\nimport type { DatePickerState } from '@nepdatejs/datepicker';\nimport { NepDatePickerElement } from './date-picker-element';\nimport { DatePickerView, type DatePickerViewOptions } from './picker-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepDatePickerElement };\nexport { DatePickerView, type DatePickerViewOptions, type Theme } from './picker-view';\n\n/** Register <nep-date-picker> (skipped if already defined). */\nexport function defineDatePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.datePicker, NepDatePickerElement, registry);\n}\n\nexport interface DatePickerHandle {\n readonly view: DatePickerView;\n getValue(): string;\n getState(): DatePickerState;\n setValue(value: string): void;\n setOptions(changes: Partial<DatePickerViewOptions>): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\n/**\n * Mount a date picker without custom elements.\n *\n * - Given a container, renders the field into it.\n * - Given an <input>, hides it and keeps its value in step with the picker\n * (AD \"YYYY-MM-DD\"), so existing forms and server code keep working.\n */\nexport function createDatePicker(\n target: HTMLElement,\n options: DatePickerViewOptions = {},\n): DatePickerHandle {\n const enhanced = target instanceof HTMLInputElement ? target : null;\n let host = target;\n if (enhanced) {\n host = document.createElement('span');\n enhanced.after(host);\n enhanced.hidden = true;\n }\n const view = new DatePickerView(host, {\n ...(enhanced\n ? {\n defaultValue: enhanced.value,\n name: undefined,\n required: enhanced.required,\n disabled: enhanced.disabled,\n }\n : {}),\n ...options,\n onChange: (value, detail) => {\n if (enhanced) {\n enhanced.value = value;\n enhanced.dispatchEvent(new Event('input', { bubbles: true }));\n enhanced.dispatchEvent(new Event('change', { bubbles: true }));\n }\n options.onChange?.(value, detail);\n },\n });\n\n return {\n view,\n getValue: () => view.getState().value,\n getState: () => view.getState(),\n setValue: (value) => {\n view.store.actions.setValue(value);\n if (enhanced) {\n enhanced.value = view.getState().value;\n }\n },\n setOptions: (changes) => {\n view.setOptions(changes);\n },\n open: () => {\n view.open();\n },\n close: () => {\n view.close();\n },\n destroy: () => {\n view.destroy();\n if (enhanced) {\n host.remove();\n enhanced.hidden = false;\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-range-picker-BQKcZeqG.cjs","names":["createDateRangePicker","uid","el","icon","PresetList","CalendarView","getLocale","trackPosition","onOutsidePointer","onBackdropPointer","onEscape","Base","presetIds","str","bool","calendarAttr","int","theme","panelLayout","onUnlessFalse","ELEMENT_NAMES"],"sources":["../src/range-view.ts","../src/date-range-picker-element.ts","../src/date-range-picker.ts"],"sourcesContent":["import { getLocale, type CalendarSystem } from '@nepdatejs/core';\nimport {\n createDateRangePicker,\n type DateRangePickerOptions,\n type DateRangePickerState,\n type DateRangePickerStore,\n type RangeField,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport { PANEL_WIDTH, PANEL_WIDTH_WITH_PRESETS, PresetList } from './preset-list';\nimport type { Theme } from './picker-view';\n\nexport interface DateRangePickerViewOptions extends DateRangePickerOptions {\n /** Field names for plain form posts; hidden inputs are rendered when set. */\n readonly startName?: string | undefined;\n readonly endName?: string | undefined;\n readonly hiddenInput?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n readonly required?: 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 startLabel?: string | undefined;\n readonly endLabel?: string | undefined;\n /** Show a \"Fiscal year\" button that switches the panel to fiscal-year tiles. */\n readonly fiscalYearView?: boolean | undefined;\n readonly onOpenChange?: ((open: boolean) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'startName',\n 'endName',\n 'hiddenInput',\n 'disabled',\n 'required',\n 'theme',\n 'panelLayout',\n 'startLabel',\n 'endLabel',\n 'fiscalYearView',\n 'onOpenChange',\n 'onChange',\n 'onCalendarChange',\n]);\n\n/** Two date fields (start, end) sharing one panel calendar in range mode. */\nexport class DateRangePickerView {\n readonly store: DateRangePickerStore;\n readonly inputs: Record<RangeField, HTMLInputElement>;\n private options: DateRangePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly boxes: Record<RangeField, HTMLDivElement>;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly fiscalButton: HTMLButtonElement;\n private readonly footer: HTMLDivElement;\n private readonly hidden: Record<RangeField, 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: DateRangePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createDateRangePicker({\n ...storeOptions(options),\n onChange: (value, detail) => {\n this.options.onChange?.(value, detail);\n },\n onCalendarChange: (calendar) => {\n this.options.onCalendarChange?.(calendar);\n },\n });\n const id = uid('ndp-range');\n const makeInput = (field: RangeField): HTMLInputElement => {\n const input = el('input', {\n class: 'ndp-input__control',\n id: `${id}-${field}`,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n 'aria-controls': `${id}-panel`,\n 'data-field': field,\n });\n input.addEventListener('input', () => {\n this.store.actions.type(field, input.value);\n });\n input.addEventListener('blur', () => {\n this.store.actions.blur(field);\n });\n input.addEventListener('keydown', (event) => {\n if (event.key === 'ArrowDown' && (event.altKey || input.value === '')) {\n event.preventDefault();\n this.open();\n }\n });\n return input;\n };\n this.inputs = { start: makeInput('start'), end: makeInput('end') };\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.boxes = {\n start: el('div', { class: 'ndp-input' }, [this.inputs.start]),\n end: el('div', { class: 'ndp-input' }, [\n this.inputs.end,\n el('span', { class: 'ndp-input__actions' }, [this.toggleButton]),\n ]),\n };\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${id}-hint`,\n 'aria-live': 'polite',\n hidden: true,\n });\n this.hidden = {\n start: el('input', { type: 'hidden' }),\n end: el('input', { type: 'hidden' }),\n };\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.fiscalButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'fiscal',\n });\n this.footer = el('div', { class: 'ndp-panel__footer' }, [\n this.segment,\n this.fiscalButton,\n ]);\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.presetList = new PresetList((id) => {\n if (this.store.actions.applyPreset(id) && !this.store.getState().open) {\n restoreFocus(this.inputs.start);\n }\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' }, [this.presetList.element, calendarRoot]),\n this.footer,\n ],\n );\n const row = el('div', { class: 'ndp-range' }, [\n this.boxes.start,\n el('span', { class: 'ndp-range__separator', 'aria-hidden': 'true' }, ['→']),\n this.boxes.end,\n ]);\n this.field = el('div', { class: 'ndp-field' }, [\n row,\n this.hint,\n this.panel,\n this.hidden.start,\n this.hidden.end,\n ]);\n host.append(this.field);\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n if (this.store.actions.select(date) && !this.store.getState().open) {\n restoreFocus(this.inputs.end);\n }\n },\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(): DateRangePickerState {\n return this.store.getState();\n }\n\n setOptions(changes: Partial<DateRangePickerViewOptions>): 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 hintText = state.error?.message ?? null;\n const texts: Record<RangeField, string> = {\n start: state.startText,\n end: state.endText,\n };\n const labels: Record<RangeField, string | undefined> = {\n start: this.options.startLabel,\n end: this.options.endLabel,\n };\n for (const field of ['start', 'end'] as const) {\n const input = this.inputs[field];\n if (input.value !== texts[field]) {\n input.value = texts[field];\n }\n const error = state.error;\n const fieldError =\n error !== null && (error.field === field || error.field === 'range');\n input.setCustomValidity(fieldError ? error.message : '');\n setAttrs(input, {\n placeholder: state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': labels[field] ?? null,\n 'aria-invalid': fieldError ? 'true' : null,\n 'aria-describedby': hintText ? this.hint.id : null,\n });\n setAttrs(this.boxes[field], {\n 'data-invalid': fieldError,\n 'data-disabled': disabled,\n });\n const name =\n this.options.hiddenInput === false\n ? undefined\n : field === 'start'\n ? this.options.startName\n : this.options.endName;\n setAttrs(this.hidden[field], { name: name ?? null });\n this.hidden[field].value = state.value[field];\n this.hidden[field].disabled = name === undefined || 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 = hintText === null;\n setText(this.hint, hintText ?? '');\n setAttrs(this.hint, { 'data-error': hintText !== null });\n this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] as CalendarSystem;\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, {\n 'aria-pressed': calendar === state.calendar ? 'true' : 'false',\n });\n }\n this.presetList.render(state.presets, locale.labels.presets);\n const fiscal = this.options.fiscalYearView ?? false;\n this.fiscalButton.hidden = !fiscal;\n setText(this.fiscalButton, locale.labels.fiscalYear);\n setAttrs(this.fiscalButton, {\n 'aria-pressed': state.calendarState.view === 'fiscal' ? 'true' : 'false',\n });\n this.footer.hidden = !fiscal && !state.canSwitchCalendar;\n setPopupMode(\n state,\n [this.inputs.start, this.inputs.end],\n this.toggleButton,\n this.panel,\n );\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 this.store.getState().presets.length > 0\n ? PANEL_WIDTH_WITH_PRESETS\n : PANEL_WIDTH;\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.panel.hidden = false;\n const anchor = this.field.querySelector('.ndp-range') ?? this.field;\n const stopTracking = trackPosition(anchor, this.panel, {\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n });\n const stopOutside = onOutsidePointer([this.field], () => {\n this.store.actions.close();\n });\n const stopBackdrop = onBackdropPointer(this.panel, () => {\n this.store.actions.close();\n });\n const stopEscape = onEscape(() => {\n this.store.actions.close();\n restoreFocus(this.inputs.start);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\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 calendar = target.closest<HTMLElement>('[data-calendar]')?.dataset['calendar'];\n if (calendar === 'BS' || calendar === 'AD') {\n this.store.actions.switchCalendar(calendar);\n return;\n }\n if (target.closest('[data-action=\"fiscal\"]')) {\n const calendar = this.store.calendar;\n calendar.actions.setView(calendar.getState().view === 'fiscal' ? 'day' : 'fiscal');\n this.calendarView.focusGrid();\n return;\n }\n if (target.closest('[data-action=\"toggle\"]')) {\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n }\n };\n}\n\nfunction storeOptions(\n options: Partial<DateRangePickerViewOptions>,\n): Partial<DateRangePickerOptions> {\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 { RangePreset } from '@nepdatejs/datepicker';\nimport { DateRangePickerView, type DateRangePickerViewOptions } from './range-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-range-picker name=\"leave\" min-days=\"1\"></nep-date-range-picker>\n *\n * Two BS/AD fields sharing one panel. The form receives `${name}-start` and\n * `${name}-end` (or `start-name` / `end-name`). Fires `change` with { value }.\n */\nexport class NepDateRangePickerElement extends Base {\n static readonly formAssociated = true;\n static readonly observedAttributes: readonly string[] = [\n 'start',\n 'end',\n 'name',\n 'start-name',\n 'end-name',\n 'min',\n 'max',\n 'calendar',\n 'default-calendar',\n 'locale',\n 'min-days',\n 'max-days',\n 'disabled',\n 'required',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'start-label',\n 'end-label',\n 'presets',\n 'fiscal-years',\n ];\n\n view: DateRangePickerView | null = null;\n private readonly internals: ElementInternals | null;\n private rich: RichProps = {};\n private customPresets: readonly RangePreset[] | undefined;\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(): { start: string; end: string } {\n return this.view?.getState().value ?? { start: '', end: '' };\n }\n set value(next: { start: string; end: 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 /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */\n get presets(): readonly RangePreset[] | undefined {\n return this.customPresets ?? (presetIds(this) as readonly RangePreset[] | undefined);\n }\n set presets(next: readonly RangePreset[] | undefined) {\n this.customPresets = next;\n this.view?.setOptions({ presets: this.presets });\n }\n\n connectedCallback(): void {\n if (this.view) {\n return;\n }\n const view = new DateRangePickerView(this, {\n ...this.readOptions(),\n defaultValue: { start: str(this, 'start') ?? '', end: str(this, 'end') ?? '' },\n onChange: (value) => {\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, detail: { value } }),\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(): void {\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 private names(): { start: string | undefined; end: string | undefined } {\n const name = str(this, 'name');\n\n return {\n start: str(this, 'start-name') ?? (name ? `${name}-start` : undefined),\n end: str(this, 'end-name') ?? (name ? `${name}-end` : undefined),\n };\n }\n\n private readOptions(): DateRangePickerViewOptions {\n const names = this.names();\n\n return {\n ...this.rich,\n startName: names.start,\n endName: names.end,\n hiddenInput: this.internals === null,\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 minDays: int(this, 'min-days'),\n maxDays: int(this, 'max-days'),\n disabled: bool(this, 'disabled'),\n required: bool(this, 'required'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: this.hasAttribute('inline'),\n startLabel: str(this, 'start-label'),\n endLabel: str(this, 'end-label'),\n fiscalYearView: bool(this, 'fiscal-years'),\n presets: this.presets,\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 const names = this.names();\n const data = new FormData();\n if (names.start && state.value.start) {\n data.append(names.start, state.value.start);\n }\n if (names.end && state.value.end) {\n data.append(names.end, state.value.end);\n }\n this.internals.setFormValue(data);\n if (state.error) {\n this.internals.setValidity(\n { customError: true },\n state.error.message,\n view.inputs.start,\n );\n } else if (\n bool(this, 'required') &&\n (state.value.start === '' || state.value.end === '')\n ) {\n this.internals.setValidity(\n { valueMissing: true },\n 'Please choose a start and end date.',\n view.inputs.start,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n","/** `@nepdatejs/vanilla/date-range-picker`: just the range picker. */\nimport { NepDateRangePickerElement } from './date-range-picker-element';\nimport { DateRangePickerView, type DateRangePickerViewOptions } from './range-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepDateRangePickerElement };\nexport { DateRangePickerView, type DateRangePickerViewOptions } from './range-view';\n\n/** Register <nep-date-range-picker> (skipped if already defined). */\nexport function defineDateRangePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.dateRangePicker, NepDateRangePickerElement, registry);\n}\n\n/** Mount a date range picker into a container. */\nexport function createDateRangePicker(\n container: HTMLElement,\n options: DateRangePickerViewOptions = {},\n): DateRangePickerView {\n return new DateRangePickerView(container, options);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-range-picker-DAkCzVgT.js","names":["createDateRangePicker"],"sources":["../src/range-view.ts","../src/date-range-picker-element.ts","../src/date-range-picker.ts"],"sourcesContent":["import { getLocale, type CalendarSystem } from '@nepdatejs/core';\nimport {\n createDateRangePicker,\n type DateRangePickerOptions,\n type DateRangePickerState,\n type DateRangePickerStore,\n type RangeField,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport { PANEL_WIDTH, PANEL_WIDTH_WITH_PRESETS, PresetList } from './preset-list';\nimport type { Theme } from './picker-view';\n\nexport interface DateRangePickerViewOptions extends DateRangePickerOptions {\n /** Field names for plain form posts; hidden inputs are rendered when set. */\n readonly startName?: string | undefined;\n readonly endName?: string | undefined;\n readonly hiddenInput?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n readonly required?: 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 startLabel?: string | undefined;\n readonly endLabel?: string | undefined;\n /** Show a \"Fiscal year\" button that switches the panel to fiscal-year tiles. */\n readonly fiscalYearView?: boolean | undefined;\n readonly onOpenChange?: ((open: boolean) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'startName',\n 'endName',\n 'hiddenInput',\n 'disabled',\n 'required',\n 'theme',\n 'panelLayout',\n 'startLabel',\n 'endLabel',\n 'fiscalYearView',\n 'onOpenChange',\n 'onChange',\n 'onCalendarChange',\n]);\n\n/** Two date fields (start, end) sharing one panel calendar in range mode. */\nexport class DateRangePickerView {\n readonly store: DateRangePickerStore;\n readonly inputs: Record<RangeField, HTMLInputElement>;\n private options: DateRangePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly boxes: Record<RangeField, HTMLDivElement>;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly fiscalButton: HTMLButtonElement;\n private readonly footer: HTMLDivElement;\n private readonly hidden: Record<RangeField, 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: DateRangePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createDateRangePicker({\n ...storeOptions(options),\n onChange: (value, detail) => {\n this.options.onChange?.(value, detail);\n },\n onCalendarChange: (calendar) => {\n this.options.onCalendarChange?.(calendar);\n },\n });\n const id = uid('ndp-range');\n const makeInput = (field: RangeField): HTMLInputElement => {\n const input = el('input', {\n class: 'ndp-input__control',\n id: `${id}-${field}`,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n 'aria-controls': `${id}-panel`,\n 'data-field': field,\n });\n input.addEventListener('input', () => {\n this.store.actions.type(field, input.value);\n });\n input.addEventListener('blur', () => {\n this.store.actions.blur(field);\n });\n input.addEventListener('keydown', (event) => {\n if (event.key === 'ArrowDown' && (event.altKey || input.value === '')) {\n event.preventDefault();\n this.open();\n }\n });\n return input;\n };\n this.inputs = { start: makeInput('start'), end: makeInput('end') };\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.boxes = {\n start: el('div', { class: 'ndp-input' }, [this.inputs.start]),\n end: el('div', { class: 'ndp-input' }, [\n this.inputs.end,\n el('span', { class: 'ndp-input__actions' }, [this.toggleButton]),\n ]),\n };\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${id}-hint`,\n 'aria-live': 'polite',\n hidden: true,\n });\n this.hidden = {\n start: el('input', { type: 'hidden' }),\n end: el('input', { type: 'hidden' }),\n };\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.fiscalButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'fiscal',\n });\n this.footer = el('div', { class: 'ndp-panel__footer' }, [\n this.segment,\n this.fiscalButton,\n ]);\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.presetList = new PresetList((id) => {\n if (this.store.actions.applyPreset(id) && !this.store.getState().open) {\n restoreFocus(this.inputs.start);\n }\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' }, [this.presetList.element, calendarRoot]),\n this.footer,\n ],\n );\n const row = el('div', { class: 'ndp-range' }, [\n this.boxes.start,\n el('span', { class: 'ndp-range__separator', 'aria-hidden': 'true' }, ['→']),\n this.boxes.end,\n ]);\n this.field = el('div', { class: 'ndp-field' }, [\n row,\n this.hint,\n this.panel,\n this.hidden.start,\n this.hidden.end,\n ]);\n host.append(this.field);\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n if (this.store.actions.select(date) && !this.store.getState().open) {\n restoreFocus(this.inputs.end);\n }\n },\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(): DateRangePickerState {\n return this.store.getState();\n }\n\n setOptions(changes: Partial<DateRangePickerViewOptions>): 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 hintText = state.error?.message ?? null;\n const texts: Record<RangeField, string> = {\n start: state.startText,\n end: state.endText,\n };\n const labels: Record<RangeField, string | undefined> = {\n start: this.options.startLabel,\n end: this.options.endLabel,\n };\n for (const field of ['start', 'end'] as const) {\n const input = this.inputs[field];\n if (input.value !== texts[field]) {\n input.value = texts[field];\n }\n const error = state.error;\n const fieldError =\n error !== null && (error.field === field || error.field === 'range');\n input.setCustomValidity(fieldError ? error.message : '');\n setAttrs(input, {\n placeholder: state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': labels[field] ?? null,\n 'aria-invalid': fieldError ? 'true' : null,\n 'aria-describedby': hintText ? this.hint.id : null,\n });\n setAttrs(this.boxes[field], {\n 'data-invalid': fieldError,\n 'data-disabled': disabled,\n });\n const name =\n this.options.hiddenInput === false\n ? undefined\n : field === 'start'\n ? this.options.startName\n : this.options.endName;\n setAttrs(this.hidden[field], { name: name ?? null });\n this.hidden[field].value = state.value[field];\n this.hidden[field].disabled = name === undefined || 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 = hintText === null;\n setText(this.hint, hintText ?? '');\n setAttrs(this.hint, { 'data-error': hintText !== null });\n this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] as CalendarSystem;\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, {\n 'aria-pressed': calendar === state.calendar ? 'true' : 'false',\n });\n }\n this.presetList.render(state.presets, locale.labels.presets);\n const fiscal = this.options.fiscalYearView ?? false;\n this.fiscalButton.hidden = !fiscal;\n setText(this.fiscalButton, locale.labels.fiscalYear);\n setAttrs(this.fiscalButton, {\n 'aria-pressed': state.calendarState.view === 'fiscal' ? 'true' : 'false',\n });\n this.footer.hidden = !fiscal && !state.canSwitchCalendar;\n setPopupMode(\n state,\n [this.inputs.start, this.inputs.end],\n this.toggleButton,\n this.panel,\n );\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 this.store.getState().presets.length > 0\n ? PANEL_WIDTH_WITH_PRESETS\n : PANEL_WIDTH;\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.panel.hidden = false;\n const anchor = this.field.querySelector('.ndp-range') ?? this.field;\n const stopTracking = trackPosition(anchor, this.panel, {\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n });\n const stopOutside = onOutsidePointer([this.field], () => {\n this.store.actions.close();\n });\n const stopBackdrop = onBackdropPointer(this.panel, () => {\n this.store.actions.close();\n });\n const stopEscape = onEscape(() => {\n this.store.actions.close();\n restoreFocus(this.inputs.start);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\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 calendar = target.closest<HTMLElement>('[data-calendar]')?.dataset['calendar'];\n if (calendar === 'BS' || calendar === 'AD') {\n this.store.actions.switchCalendar(calendar);\n return;\n }\n if (target.closest('[data-action=\"fiscal\"]')) {\n const calendar = this.store.calendar;\n calendar.actions.setView(calendar.getState().view === 'fiscal' ? 'day' : 'fiscal');\n this.calendarView.focusGrid();\n return;\n }\n if (target.closest('[data-action=\"toggle\"]')) {\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n }\n };\n}\n\nfunction storeOptions(\n options: Partial<DateRangePickerViewOptions>,\n): Partial<DateRangePickerOptions> {\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 { RangePreset } from '@nepdatejs/datepicker';\nimport { DateRangePickerView, type DateRangePickerViewOptions } from './range-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-range-picker name=\"leave\" min-days=\"1\"></nep-date-range-picker>\n *\n * Two BS/AD fields sharing one panel. The form receives `${name}-start` and\n * `${name}-end` (or `start-name` / `end-name`). Fires `change` with { value }.\n */\nexport class NepDateRangePickerElement extends Base {\n static readonly formAssociated = true;\n static readonly observedAttributes: readonly string[] = [\n 'start',\n 'end',\n 'name',\n 'start-name',\n 'end-name',\n 'min',\n 'max',\n 'calendar',\n 'default-calendar',\n 'locale',\n 'min-days',\n 'max-days',\n 'disabled',\n 'required',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'start-label',\n 'end-label',\n 'presets',\n 'fiscal-years',\n ];\n\n view: DateRangePickerView | null = null;\n private readonly internals: ElementInternals | null;\n private rich: RichProps = {};\n private customPresets: readonly RangePreset[] | undefined;\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(): { start: string; end: string } {\n return this.view?.getState().value ?? { start: '', end: '' };\n }\n set value(next: { start: string; end: 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 /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */\n get presets(): readonly RangePreset[] | undefined {\n return this.customPresets ?? (presetIds(this) as readonly RangePreset[] | undefined);\n }\n set presets(next: readonly RangePreset[] | undefined) {\n this.customPresets = next;\n this.view?.setOptions({ presets: this.presets });\n }\n\n connectedCallback(): void {\n if (this.view) {\n return;\n }\n const view = new DateRangePickerView(this, {\n ...this.readOptions(),\n defaultValue: { start: str(this, 'start') ?? '', end: str(this, 'end') ?? '' },\n onChange: (value) => {\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, detail: { value } }),\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(): void {\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 private names(): { start: string | undefined; end: string | undefined } {\n const name = str(this, 'name');\n\n return {\n start: str(this, 'start-name') ?? (name ? `${name}-start` : undefined),\n end: str(this, 'end-name') ?? (name ? `${name}-end` : undefined),\n };\n }\n\n private readOptions(): DateRangePickerViewOptions {\n const names = this.names();\n\n return {\n ...this.rich,\n startName: names.start,\n endName: names.end,\n hiddenInput: this.internals === null,\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 minDays: int(this, 'min-days'),\n maxDays: int(this, 'max-days'),\n disabled: bool(this, 'disabled'),\n required: bool(this, 'required'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: this.hasAttribute('inline'),\n startLabel: str(this, 'start-label'),\n endLabel: str(this, 'end-label'),\n fiscalYearView: bool(this, 'fiscal-years'),\n presets: this.presets,\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 const names = this.names();\n const data = new FormData();\n if (names.start && state.value.start) {\n data.append(names.start, state.value.start);\n }\n if (names.end && state.value.end) {\n data.append(names.end, state.value.end);\n }\n this.internals.setFormValue(data);\n if (state.error) {\n this.internals.setValidity(\n { customError: true },\n state.error.message,\n view.inputs.start,\n );\n } else if (\n bool(this, 'required') &&\n (state.value.start === '' || state.value.end === '')\n ) {\n this.internals.setValidity(\n { valueMissing: true },\n 'Please choose a start and end date.',\n view.inputs.start,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n","/** `@nepdatejs/vanilla/date-range-picker`: just the range picker. */\nimport { NepDateRangePickerElement } from './date-range-picker-element';\nimport { DateRangePickerView, type DateRangePickerViewOptions } from './range-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepDateRangePickerElement };\nexport { DateRangePickerView, type DateRangePickerViewOptions } from './range-view';\n\n/** Register <nep-date-range-picker> (skipped if already defined). */\nexport function defineDateRangePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.dateRangePicker, NepDateRangePickerElement, registry);\n}\n\n/** Mount a date range picker into a container. */\nexport function createDateRangePicker(\n container: HTMLElement,\n options: DateRangePickerViewOptions = {},\n): DateRangePickerView {\n return new DateRangePickerView(container, options);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-time-picker-BqweOP2u.js","names":["createDateTimePicker"],"sources":["../src/datetime-view.ts","../src/date-time-picker-element.ts","../src/date-time-picker.ts"],"sourcesContent":["import { getLocale, type CalendarSystem } from '@nepdatejs/core';\nimport {\n createDateTimePicker,\n type DateTimePickerOptions,\n type DateTimePickerState,\n type DateTimePickerStore,\n type TimeCell,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\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 this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] as CalendarSystem;\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, {\n 'aria-pressed': calendar === state.calendar ? 'true' : 'false',\n });\n }\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.panel.hidden = false;\n const stopTracking = trackPosition(this.row, this.panel, {\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n });\n const stopOutside = onOutsidePointer([this.field], () => {\n this.store.actions.close();\n });\n const stopBackdrop = onBackdropPointer(this.panel, () => {\n this.store.actions.close();\n });\n const stopEscape = onEscape(() => {\n this.store.actions.close();\n restoreFocus(this.dateInput);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-time-picker-Bxfn-a9T.cjs","names":["createDateTimePicker","uid","el","icon","PresetList","CalendarView","getLocale","trackPosition","onOutsidePointer","onBackdropPointer","onEscape","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, type CalendarSystem } from '@nepdatejs/core';\nimport {\n createDateTimePicker,\n type DateTimePickerOptions,\n type DateTimePickerState,\n type DateTimePickerStore,\n type TimeCell,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\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 this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] as CalendarSystem;\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, {\n 'aria-pressed': calendar === state.calendar ? 'true' : 'false',\n });\n }\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.panel.hidden = false;\n const stopTracking = trackPosition(this.row, this.panel, {\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n });\n const stopOutside = onOutsidePointer([this.field], () => {\n this.store.actions.close();\n });\n const stopBackdrop = onBackdropPointer(this.panel, () => {\n this.store.actions.close();\n });\n const stopEscape = onEscape(() => {\n this.store.actions.close();\n restoreFocus(this.dateInput);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-date-picker-BMEYUPBa.cjs","names":["createMultiDatePicker","uid","el","icon","CalendarView","getLocale","trackPosition","onOutsidePointer","onBackdropPointer","onEscape","Base","str","bool","int","calendarAttr","onUnlessFalse","theme","panelLayout","ELEMENT_NAMES"],"sources":["../src/multi-view.ts","../src/multi-date-picker-element.ts","../src/multi-date-picker.ts"],"sourcesContent":["import { getLocale } from '@nepdatejs/core';\nimport {\n createMultiDatePicker,\n type MultiDatePickerOptions,\n type MultiDatePickerState,\n type MultiDatePickerStore,\n} from '@nepdatejs/datepicker';\nimport {\n onBackdropPointer,\n onEscape,\n onOutsidePointer,\n restoreFocus,\n trackPosition,\n type PanelLayout,\n} from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport type { Theme } from './picker-view';\nimport { PANEL_WIDTH } from './preset-list';\n\n/** Everything the multiple-date picker DOM needs on top of the store's options. */\nexport interface MultiDatePickerViewOptions extends MultiDatePickerOptions {\n /** Submit each day under this name (one hidden input per day). */\n readonly name?: string | undefined;\n /** Render hidden inputs for `name`. Off for the form-associated custom element. */\n readonly hiddenInput?: boolean | undefined;\n readonly id?: string | undefined;\n readonly placeholder?: string | undefined;\n readonly required?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n /** Show the × button. Default true. */\n readonly clearable?: 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 onOpenChange?: ((open: boolean) => void) | undefined;\n}\n\nconst VIEW_KEYS = new Set([\n 'name',\n 'hiddenInput',\n 'id',\n 'placeholder',\n 'required',\n 'disabled',\n 'clearable',\n 'panelLayout',\n 'theme',\n 'ariaLabel',\n 'onOpenChange',\n 'onChange',\n]);\n\n/**\n * The multiple-date picker field and panel (PICK-001), rendered with the\n * @nepdatejs/styles markup into `host`. Used by <nep-multi-date-picker> and by\n * createMultiDatePicker().\n */\nexport class MultiDatePickerView {\n readonly store: MultiDatePickerStore;\n readonly input: HTMLInputElement;\n private options: MultiDatePickerViewOptions;\n private readonly field: HTMLDivElement;\n private readonly box: HTMLDivElement;\n private readonly clearButton: HTMLButtonElement;\n private readonly toggleButton: HTMLButtonElement;\n private readonly hint: HTMLParagraphElement;\n private readonly panel: HTMLDivElement;\n private readonly segment: HTMLDivElement;\n private readonly doneButton: HTMLButtonElement;\n private readonly hiddenInputs: HTMLSpanElement;\n private readonly calendarView: CalendarView;\n private readonly unsubscribe: () => void;\n private closePanel: (() => void) | null = null;\n private wasOpen = false;\n\n constructor(host: HTMLElement, options: MultiDatePickerViewOptions = {}) {\n this.options = { ...options };\n this.store = createMultiDatePicker({\n ...storeOptions(options),\n onChange: (value, dates) => {\n this.options.onChange?.(value, dates);\n },\n });\n\n const inputId = options.id ?? uid('ndp-multi');\n const panelId = `${inputId}-panel`;\n this.input = el('input', {\n class: 'ndp-input__control',\n id: inputId,\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'off',\n spellcheck: 'false',\n 'aria-controls': panelId,\n });\n this.clearButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'clear' },\n [icon('close')],\n );\n this.toggleButton = el(\n 'button',\n { type: 'button', class: 'ndp-icon-button', 'data-action': 'toggle' },\n [icon('calendar')],\n );\n this.box = el('div', { class: 'ndp-input' }, [\n this.input,\n el('span', { class: 'ndp-input__actions' }, [this.clearButton, this.toggleButton]),\n ]);\n this.hint = el('p', {\n class: 'ndp-hint',\n id: `${inputId}-hint`,\n 'aria-live': 'polite',\n 'data-error': true,\n hidden: true,\n });\n this.hiddenInputs = el('span', { hidden: true });\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.doneButton = el('button', {\n type: 'button',\n class: 'ndp-button',\n 'data-action': 'done',\n });\n const calendarRoot = el('div', { class: 'ndp-panel__calendar' });\n this.panel = el('div', { class: 'ndp-panel', id: panelId, hidden: true }, [\n calendarRoot,\n el('div', { class: 'ndp-panel__footer' }, [this.segment, this.doneButton]),\n ]);\n this.field = el('div', { class: 'ndp-field' }, [\n this.box,\n this.hint,\n this.hiddenInputs,\n this.panel,\n ]);\n host.append(this.field);\n\n this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {\n locale: () => this.options.locale,\n onDayActivate: (date) => {\n if (this.store.actions.select(date) && !this.store.getState().open) {\n restoreFocus(this.input);\n }\n },\n });\n\n this.input.addEventListener('input', () => {\n this.store.actions.type(this.input.value);\n });\n this.input.addEventListener('blur', () => {\n this.store.actions.blur();\n });\n this.input.addEventListener('keydown', (event) => {\n if (event.key === 'ArrowDown' && (event.altKey || this.input.value === '')) {\n event.preventDefault();\n this.open();\n }\n });\n this.field.addEventListener('click', this.onClick);\n\n this.unsubscribe = this.store.subscribe(() => {\n this.render();\n });\n this.render();\n }\n\n getState(): MultiDatePickerState {\n return this.store.getState();\n }\n\n /** Change view or store options. Unknown keys are ignored. */\n setOptions(changes: Partial<MultiDatePickerViewOptions>): 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\n if (this.input.value !== state.text) {\n this.input.value = state.text;\n }\n this.input.setCustomValidity(state.error?.message ?? '');\n setAttrs(this.input, {\n placeholder: this.options.placeholder ?? state.placeholder,\n disabled,\n required: this.options.required ?? false,\n 'aria-label': this.options.ariaLabel ?? null,\n 'aria-invalid': state.error ? 'true' : null,\n 'aria-describedby': state.error ? this.hint.id : null,\n });\n setAttrs(this.box, {\n 'data-invalid': state.error !== null,\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': this.options.ariaLabel\n ? `${this.options.ariaLabel}: ${locale.labels.calendar}`\n : locale.labels.chooseDate,\n });\n this.clearButton.hidden =\n !(this.options.clearable ?? true) || state.text === '' || disabled;\n setAttrs(this.clearButton, { 'aria-label': locale.labels.clear });\n setAttrs(this.toggleButton, { disabled, 'aria-label': locale.labels.openCalendar });\n this.hint.hidden = state.error === null;\n setText(this.hint, state.error?.message ?? '');\n\n this.segment.hidden = !state.canSwitchCalendar;\n setAttrs(this.segment, { 'aria-label': locale.labels.calendar });\n for (const button of this.segment.querySelectorAll<HTMLButtonElement>('button')) {\n const calendar = button.dataset['calendar'] === 'AD' ? 'AD' : 'BS';\n setText(button, locale.calendarNames[calendar]);\n setAttrs(button, { 'aria-pressed': String(calendar === state.calendar) });\n }\n setText(this.doneButton, locale.labels.done);\n this.doneButton.hidden = state.inline;\n\n const name = this.options.hiddenInput === false ? undefined : this.options.name;\n this.hiddenInputs.replaceChildren(\n ...(name === undefined\n ? []\n : state.value.map((value) =>\n el('input', { type: 'hidden', name, value, disabled }),\n )),\n );\n\n setPopupMode(state, [this.input], 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(PANEL_WIDTH)}px` : null,\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.panel.hidden = false;\n const stopTracking = trackPosition(this.box, this.panel, {\n width: PANEL_WIDTH,\n layout: this.options.panelLayout,\n });\n const close = (): void => {\n this.store.actions.close();\n };\n const stopOutside = onOutsidePointer([this.field, this.panel], close);\n const stopBackdrop = onBackdropPointer(this.panel, close);\n const stopEscape = onEscape(() => {\n close();\n restoreFocus(this.input);\n });\n this.closePanel = () => {\n stopTracking();\n stopOutside();\n stopBackdrop();\n stopEscape();\n this.panel.hidden = true;\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 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 'clear':\n this.store.actions.clear();\n this.input.focus();\n break;\n case 'toggle':\n if (this.store.getState().open) {\n this.close();\n } else {\n this.open();\n }\n break;\n case 'done':\n this.close();\n restoreFocus(this.input);\n break;\n default:\n break;\n }\n };\n}\n\n/** Only the keys the picker store understands, minus the view's own callbacks. */\nfunction storeOptions(\n options: Partial<MultiDatePickerViewOptions>,\n): Partial<MultiDatePickerOptions> {\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 { MultiDatePickerView, type MultiDatePickerViewOptions } from './multi-view';\nimport {\n Base,\n bool,\n calendarAttr,\n int,\n onUnlessFalse,\n panelLayout,\n str,\n swallowInnerChange,\n theme,\n type RichProps,\n} from './element-utils';\n\n/**\n * <nep-multi-date-picker name=\"holidays\" value=\"2026-10-18,2026-10-20\"></nep-multi-date-picker>\n *\n * A form-associated field for several separate BS/AD days (PICK-001). The form\n * receives one entry per day under `name`, each an AD \"YYYY-MM-DD\". Fires\n * `change` with { value: string[], dates: { ad, bs }[] }.\n */\nexport class NepMultiDatePickerElement extends Base {\n static readonly formAssociated = true;\n static readonly observedAttributes: readonly string[] = [\n 'value',\n 'min',\n 'max',\n 'max-dates',\n 'calendar',\n 'default-calendar',\n 'locale',\n 'name',\n 'required',\n 'disabled',\n 'clearable',\n 'close-on-select',\n 'theme',\n 'panel-layout',\n 'mask',\n 'inline',\n 'label',\n ];\n\n view: MultiDatePickerView | 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(): readonly string[] {\n return this.view?.getState().value ?? [];\n }\n set value(next: readonly 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 events(next: RichProps['events']) {\n this.rich = { ...this.rich, events: next };\n this.view?.setOptions({ events: 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 MultiDatePickerView(this, {\n ...this.readOptions(),\n defaultValue: list(str(this, 'value')),\n onChange: (value, dates) => {\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, detail: { value, dates } }),\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(list(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?.input.focus(options);\n }\n\n private readOptions(): MultiDatePickerViewOptions {\n return {\n ...this.rich,\n min: str(this, 'min'),\n max: str(this, 'max'),\n maxDates: int(this, 'max-dates'),\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 clearable: onUnlessFalse(this, 'clearable'),\n closeOnSelect: bool(this, 'close-on-select'),\n theme: theme(this),\n panelLayout: panelLayout(this),\n mask: onUnlessFalse(this, 'mask'),\n inline: bool(this, 'inline'),\n ariaLabel: str(this, 'label'),\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 const name = str(this, 'name');\n const data = new FormData();\n if (name !== undefined) {\n for (const day of state.value) {\n data.append(name, day);\n }\n }\n this.internals.setFormValue(state.value.length === 0 ? null : data);\n if (state.error) {\n this.internals.setValidity({ customError: true }, state.error.message, view.input);\n } else if (bool(this, 'required') && state.value.length === 0) {\n this.internals.setValidity(\n { valueMissing: true },\n 'Please choose at least one date.',\n view.input,\n );\n } else {\n this.internals.setValidity({});\n }\n }\n}\n\n/** \"2026-10-18, 2026-10-20\" → ['2026-10-18', '2026-10-20'] */\nfunction list(value: string | undefined): readonly string[] {\n return (value ?? '').split(/[\\s,]+/).filter((day) => day !== '');\n}\n","/** `@nepdatejs/vanilla/multi-date-picker`: just the multiple-date picker (element, view and mount function). */\nimport type { MultiDatePickerState } from '@nepdatejs/datepicker';\nimport { NepMultiDatePickerElement } from './multi-date-picker-element';\nimport { MultiDatePickerView, type MultiDatePickerViewOptions } from './multi-view';\nimport { defineElement, ELEMENT_NAMES } from './registry';\n\nexport { NepMultiDatePickerElement };\nexport { MultiDatePickerView, type MultiDatePickerViewOptions } from './multi-view';\n\n/** Register <nep-multi-date-picker> (skipped if already defined). */\nexport function defineMultiDatePicker(registry?: CustomElementRegistry): void {\n defineElement(ELEMENT_NAMES.multiDatePicker, NepMultiDatePickerElement, registry);\n}\n\nexport interface MultiDatePickerHandle {\n readonly view: MultiDatePickerView;\n getValue(): readonly string[];\n getState(): MultiDatePickerState;\n setValue(value: readonly string[]): void;\n setOptions(changes: Partial<MultiDatePickerViewOptions>): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\n/** Mount a multiple-date picker into a container, without custom elements. */\nexport function createMultiDatePicker(\n container: HTMLElement,\n options: MultiDatePickerViewOptions = {},\n): MultiDatePickerHandle {\n const view = new MultiDatePickerView(container, options);\n\n return {\n view,\n getValue: () => view.getState().value,\n getState: () => view.getState(),\n setValue: (value) => {\n view.store.actions.setValue(value);\n },\n setOptions: (changes) => {\n view.setOptions(changes);\n },\n open: () => {\n view.open();\n },\n close: () => {\n view.close();\n },\n destroy: () => {\n view.destroy();\n },\n };\n}\n"],"mappings":"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"}
|