@nepdatejs/vanilla 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -2
  3. package/dist/auto-define.cjs +11 -0
  4. package/dist/auto-define.cjs.map +1 -0
  5. package/dist/auto-define.d.cts +2 -0
  6. package/dist/auto-define.d.ts +2 -0
  7. package/dist/auto-define.js +9 -0
  8. package/dist/auto-define.js.map +1 -0
  9. package/dist/calendar-BAcO-jYq.js +142 -0
  10. package/dist/calendar-BAcO-jYq.js.map +1 -0
  11. package/dist/calendar-BNdN8qJv.d.ts +87 -0
  12. package/dist/calendar-C1LZI7XN.cjs +159 -0
  13. package/dist/calendar-C1LZI7XN.cjs.map +1 -0
  14. package/dist/calendar-QWPX0IfD.d.cts +87 -0
  15. package/dist/calendar.cjs +7 -0
  16. package/dist/calendar.d.cts +2 -0
  17. package/dist/calendar.d.ts +2 -0
  18. package/dist/calendar.js +3 -0
  19. package/dist/date-picker-BidCGOz0.d.cts +74 -0
  20. package/dist/date-picker-BwlrlU5Y.js +560 -0
  21. package/dist/date-picker-BwlrlU5Y.js.map +1 -0
  22. package/dist/date-picker-CgjYsf1w.cjs +583 -0
  23. package/dist/date-picker-CgjYsf1w.cjs.map +1 -0
  24. package/dist/date-picker-DyvpYe29.d.ts +74 -0
  25. package/dist/date-picker.cjs +6 -0
  26. package/dist/date-picker.d.cts +3 -0
  27. package/dist/date-picker.d.ts +3 -0
  28. package/dist/date-picker.js +1 -0
  29. package/dist/date-range-picker-D3eNvlgv.d.ts +98 -0
  30. package/dist/date-range-picker-NwetXUC-.js +449 -0
  31. package/dist/date-range-picker-NwetXUC-.js.map +1 -0
  32. package/dist/date-range-picker-SIl0vhUV.d.cts +98 -0
  33. package/dist/date-range-picker-VrQZFZED.cjs +472 -0
  34. package/dist/date-range-picker-VrQZFZED.cjs.map +1 -0
  35. package/dist/date-range-picker.cjs +6 -0
  36. package/dist/date-range-picker.d.cts +2 -0
  37. package/dist/date-range-picker.d.ts +2 -0
  38. package/dist/date-range-picker.js +1 -0
  39. package/dist/date-time-picker-BzSyQxrf.d.cts +92 -0
  40. package/dist/date-time-picker-ChHIBTBw.cjs +492 -0
  41. package/dist/date-time-picker-ChHIBTBw.cjs.map +1 -0
  42. package/dist/date-time-picker-CxqC95aM.js +469 -0
  43. package/dist/date-time-picker-CxqC95aM.js.map +1 -0
  44. package/dist/date-time-picker-DzDpzLMZ.d.ts +92 -0
  45. package/dist/date-time-picker.cjs +6 -0
  46. package/dist/date-time-picker.d.cts +2 -0
  47. package/dist/date-time-picker.d.ts +2 -0
  48. package/dist/date-time-picker.js +1 -0
  49. package/dist/define-B8NUA3yj.d.cts +16 -0
  50. package/dist/define-B8NUA3yj.d.ts +16 -0
  51. package/dist/define-BbTIFHtH.cjs +23 -0
  52. package/dist/define-BbTIFHtH.cjs.map +1 -0
  53. package/dist/define-D96w8Zu2.js +18 -0
  54. package/dist/define-D96w8Zu2.js.map +1 -0
  55. package/dist/element-utils-BVye8UQq.d.cts +82 -0
  56. package/dist/element-utils-C-r5gPlk.d.ts +82 -0
  57. package/dist/index.cjs +30 -0
  58. package/dist/index.d.cts +8 -0
  59. package/dist/index.d.ts +8 -0
  60. package/dist/index.js +8 -0
  61. package/dist/multi-date-picker-B2mQbjZM.d.ts +105 -0
  62. package/dist/multi-date-picker-BUNf5zyJ.d.cts +105 -0
  63. package/dist/multi-date-picker-C3Lr0Dq-.js +424 -0
  64. package/dist/multi-date-picker-C3Lr0Dq-.js.map +1 -0
  65. package/dist/multi-date-picker-DUyuO-nH.cjs +447 -0
  66. package/dist/multi-date-picker-DUyuO-nH.cjs.map +1 -0
  67. package/dist/multi-date-picker.cjs +6 -0
  68. package/dist/multi-date-picker.d.cts +2 -0
  69. package/dist/multi-date-picker.d.ts +2 -0
  70. package/dist/multi-date-picker.js +1 -0
  71. package/dist/nepdate-picker.global.js +3 -0
  72. package/dist/nepdate-picker.global.js.map +1 -0
  73. package/dist/preset-list-BYCZm61I.cjs +97 -0
  74. package/dist/preset-list-BYCZm61I.cjs.map +1 -0
  75. package/dist/preset-list-DmE6fJjr.js +80 -0
  76. package/dist/preset-list-DmE6fJjr.js.map +1 -0
  77. package/dist/registry-3qzdVB7H.cjs +591 -0
  78. package/dist/registry-3qzdVB7H.cjs.map +1 -0
  79. package/dist/registry-BvkGnkvV.js +466 -0
  80. package/dist/registry-BvkGnkvV.js.map +1 -0
  81. package/package.json +162 -3
  82. package/src/auto-define.ts +6 -0
  83. package/src/calendar-element.ts +129 -0
  84. package/src/calendar-view.ts +406 -0
  85. package/src/calendar.ts +45 -0
  86. package/src/date-picker-element.ts +249 -0
  87. package/src/date-picker.ts +91 -0
  88. package/src/date-range-picker-element.ts +201 -0
  89. package/src/date-range-picker.ts +20 -0
  90. package/src/date-time-picker-element.ts +191 -0
  91. package/src/date-time-picker.ts +20 -0
  92. package/src/datetime-view.ts +434 -0
  93. package/src/define.ts +16 -0
  94. package/src/dom.ts +109 -0
  95. package/src/element-utils.ts +86 -0
  96. package/src/global.ts +7 -0
  97. package/src/index.ts +15 -0
  98. package/src/multi-date-picker-element.ts +187 -0
  99. package/src/multi-date-picker.ts +53 -0
  100. package/src/multi-view.ts +323 -0
  101. package/src/panel.ts +61 -0
  102. package/src/picker-view.ts +423 -0
  103. package/src/preset-list.ts +51 -0
  104. package/src/range-view.ts +368 -0
  105. package/src/registry.ts +27 -0
@@ -0,0 +1,560 @@
1
+ import { _ as icon, a as calendarAttr, b as setText, c as onUnlessFalse, d as str, f as swallowInnerChange, g as el, h as CalendarView, i as bool, l as panelLayout, m as weekday, n as defineElement, p as theme, r as Base, s as isoOf, t as ELEMENT_NAMES, u as presetIds, v as setAttrs, x as uid, y as setPopupMode } from "./registry-BvkGnkvV.js";
2
+ import { n as openPanel, r as renderSegment, t as PresetList } from "./preset-list-DmE6fJjr.js";
3
+ import { fromIsoDate, getLocale } from "@nepdatejs/core";
4
+ import { createDatePicker } from "@nepdatejs/datepicker";
5
+ import { restoreFocus } from "@nepdatejs/dom";
6
+ //#region src/picker-view.ts
7
+ const VIEW_KEYS = /* @__PURE__ */ new Set([
8
+ "name",
9
+ "hiddenInput",
10
+ "id",
11
+ "placeholder",
12
+ "required",
13
+ "disabled",
14
+ "clearable",
15
+ "showEquivalent",
16
+ "theme",
17
+ "panelLayout",
18
+ "persistCalendar",
19
+ "ariaLabel",
20
+ "onOpenChange",
21
+ "onInput"
22
+ ]);
23
+ /**
24
+ * The date picker field and panel, rendered with the @nepdatejs/styles markup
25
+ * into `host`. Used by <nep-date-picker> and by createDatePicker().
26
+ */
27
+ var DatePickerView = class {
28
+ constructor(host, options = {}) {
29
+ this.closePanel = null;
30
+ this.wasOpen = false;
31
+ this.onTextInput = () => {
32
+ this.store.actions.type(this.input.value);
33
+ this.options.onInput?.(this.input.value);
34
+ };
35
+ this.onInputKeyDown = (event) => {
36
+ if (event.key === "ArrowDown" && (event.altKey || this.input.value === "")) {
37
+ event.preventDefault();
38
+ this.open();
39
+ }
40
+ };
41
+ this.onClick = (event) => {
42
+ const target = event.target instanceof Element ? event.target : null;
43
+ if (!target || this.calendarView.element.contains(target)) return;
44
+ const calendar = target.closest("[data-calendar]")?.dataset["calendar"];
45
+ if (calendar === "BS" || calendar === "AD") {
46
+ this.store.actions.switchCalendar(calendar);
47
+ return;
48
+ }
49
+ switch (target.closest("[data-action]")?.dataset["action"]) {
50
+ case "clear":
51
+ this.store.actions.clear();
52
+ this.input.focus();
53
+ break;
54
+ case "switch":
55
+ this.store.actions.switchCalendar(this.store.getState().calendar === "BS" ? "AD" : "BS");
56
+ break;
57
+ case "toggle":
58
+ if (this.store.getState().open) this.close();
59
+ else this.open();
60
+ break;
61
+ case "today": if (this.store.actions.selectToday()) restoreFocus(this.input);
62
+ }
63
+ };
64
+ this.options = { ...options };
65
+ this.store = createDatePicker({
66
+ ...storeOptions(options),
67
+ onChange: (value, detail) => {
68
+ this.options.onChange?.(value, detail);
69
+ },
70
+ onCalendarChange: (calendar) => {
71
+ this.remember(calendar);
72
+ this.options.onCalendarChange?.(calendar);
73
+ }
74
+ });
75
+ const inputId = options.id ?? uid("ndp-input");
76
+ const panelId = `${inputId}-panel`;
77
+ this.input = el("input", {
78
+ class: "ndp-input__control",
79
+ id: inputId,
80
+ type: "text",
81
+ inputmode: "numeric",
82
+ autocomplete: "off",
83
+ spellcheck: "false",
84
+ "aria-controls": panelId
85
+ });
86
+ this.clearButton = el("button", {
87
+ type: "button",
88
+ class: "ndp-icon-button",
89
+ "data-action": "clear"
90
+ }, [icon("close")]);
91
+ this.switchButton = el("button", {
92
+ type: "button",
93
+ class: "ndp-input__switch",
94
+ "data-action": "switch"
95
+ });
96
+ this.toggleButton = el("button", {
97
+ type: "button",
98
+ class: "ndp-icon-button",
99
+ "data-action": "toggle"
100
+ }, [icon("calendar")]);
101
+ this.box = el("div", { class: "ndp-input" }, [this.input, el("span", { class: "ndp-input__actions" }, [
102
+ this.clearButton,
103
+ this.switchButton,
104
+ this.toggleButton
105
+ ])]);
106
+ this.hint = el("p", {
107
+ class: "ndp-hint",
108
+ id: `${inputId}-hint`,
109
+ "aria-live": "polite",
110
+ hidden: true
111
+ });
112
+ this.hidden = el("input", { type: "hidden" });
113
+ this.segment = el("div", {
114
+ class: "ndp-segment",
115
+ role: "group"
116
+ }, [el("button", {
117
+ type: "button",
118
+ class: "ndp-segment__item",
119
+ "data-calendar": "BS"
120
+ }), el("button", {
121
+ type: "button",
122
+ class: "ndp-segment__item",
123
+ "data-calendar": "AD"
124
+ })]);
125
+ this.todayButton = el("button", {
126
+ type: "button",
127
+ class: "ndp-button",
128
+ "data-action": "today"
129
+ });
130
+ const calendarRoot = el("div", { class: "ndp-panel__calendar" });
131
+ this.presetList = new PresetList((id) => {
132
+ if (this.store.actions.applyPreset(id) && !this.store.getState().open) restoreFocus(this.input);
133
+ });
134
+ this.panel = el("div", {
135
+ class: "ndp-panel",
136
+ id: panelId,
137
+ hidden: true
138
+ }, [el("div", { class: "ndp-panel__body" }, [this.presetList.element, calendarRoot]), el("div", { class: "ndp-panel__footer" }, [this.segment, this.todayButton])]);
139
+ this.field = el("div", { class: "ndp-field" }, [
140
+ this.box,
141
+ this.hint,
142
+ this.panel,
143
+ this.hidden
144
+ ]);
145
+ host.append(this.field);
146
+ this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {
147
+ locale: () => this.options.locale,
148
+ onDayActivate: (date) => {
149
+ if (this.store.actions.select(date) && !this.store.getState().open) restoreFocus(this.input);
150
+ }
151
+ });
152
+ this.input.addEventListener("input", this.onTextInput);
153
+ this.input.addEventListener("blur", () => {
154
+ this.store.actions.blur();
155
+ });
156
+ this.input.addEventListener("keydown", this.onInputKeyDown);
157
+ this.field.addEventListener("click", this.onClick);
158
+ this.unsubscribe = this.store.subscribe(() => {
159
+ this.render();
160
+ });
161
+ this.restoreCalendar();
162
+ this.render();
163
+ }
164
+ getState() {
165
+ return this.store.getState();
166
+ }
167
+ /** Change view or store options. Unknown keys are ignored. */
168
+ setOptions(changes) {
169
+ this.options = {
170
+ ...this.options,
171
+ ...changes
172
+ };
173
+ const forStore = storeOptions(changes);
174
+ if (Object.keys(forStore).length > 0) this.store.setOptions(forStore);
175
+ else this.render();
176
+ }
177
+ open() {
178
+ if (!this.options.disabled) this.store.actions.open();
179
+ }
180
+ close() {
181
+ this.store.actions.close();
182
+ }
183
+ destroy() {
184
+ this.closePanel?.();
185
+ this.unsubscribe();
186
+ this.calendarView.destroy();
187
+ this.field.remove();
188
+ }
189
+ render() {
190
+ const state = this.store.getState();
191
+ const locale = getLocale(this.options.locale);
192
+ const disabled = this.options.disabled ?? false;
193
+ const hintText = state.error?.message ?? (this.options.showEquivalent ?? true ? state.equivalentText : null);
194
+ if (this.input.value !== state.text) this.input.value = state.text;
195
+ this.input.setCustomValidity(state.error?.message ?? "");
196
+ setAttrs(this.input, {
197
+ placeholder: this.options.placeholder ?? state.placeholder,
198
+ disabled,
199
+ required: this.options.required ?? false,
200
+ "aria-label": this.options.ariaLabel ?? null,
201
+ "aria-invalid": state.error ? "true" : null,
202
+ "aria-describedby": hintText ? this.hint.id : null
203
+ });
204
+ setAttrs(this.box, {
205
+ "data-invalid": state.error !== null,
206
+ "data-disabled": disabled
207
+ });
208
+ setAttrs(this.field, { "data-ndp-theme": this.options.theme ?? null });
209
+ setAttrs(this.panel, {
210
+ "data-ndp-theme": this.options.theme ?? null,
211
+ "aria-label": this.options.ariaLabel ? `${this.options.ariaLabel}: ${locale.labels.calendar}` : locale.labels.chooseDate
212
+ });
213
+ this.clearButton.hidden = !(this.options.clearable ?? true) || state.text === "" || disabled;
214
+ setAttrs(this.clearButton, { "aria-label": locale.labels.clear });
215
+ this.switchButton.hidden = !state.canSwitchCalendar;
216
+ setText(this.switchButton, locale.calendarNames[state.calendar]);
217
+ const other = state.calendar === "BS" ? "AD" : "BS";
218
+ setAttrs(this.switchButton, {
219
+ disabled,
220
+ "aria-label": `${locale.labels.calendar}: ${locale.calendarNames[state.calendar]} → ${locale.calendarNames[other]}`
221
+ });
222
+ setAttrs(this.toggleButton, {
223
+ disabled,
224
+ "aria-label": locale.labels.openCalendar,
225
+ "aria-expanded": state.open ? "true" : "false"
226
+ });
227
+ this.hint.hidden = hintText === null;
228
+ setText(this.hint, hintText ?? "");
229
+ setAttrs(this.hint, { "data-error": state.error !== null });
230
+ renderSegment(this.segment, state, locale);
231
+ setText(this.todayButton, locale.labels.today);
232
+ this.presetList.render(state.presets, locale.labels.presets);
233
+ const name = this.options.hiddenInput === false ? void 0 : this.options.name;
234
+ setAttrs(this.hidden, {
235
+ name: name ?? null,
236
+ value: state.value
237
+ });
238
+ this.hidden.value = state.value;
239
+ this.hidden.disabled = name === void 0 || disabled;
240
+ setPopupMode(state, [this.input], this.toggleButton, this.panel);
241
+ this.syncPanel(state.open && !state.inline);
242
+ this.panel.hidden = !state.inline && !this.wasOpen;
243
+ this.panel.style.setProperty("--ndp-panel-width", state.inline ? `${String(this.panelWidth())}px` : null);
244
+ }
245
+ panelWidth() {
246
+ return this.store.getState().presets.length > 0 ? 492 : 320;
247
+ }
248
+ syncPanel(open) {
249
+ if (open === this.wasOpen) return;
250
+ this.wasOpen = open;
251
+ this.options.onOpenChange?.(open);
252
+ if (open) {
253
+ this.closePanel = openPanel({
254
+ panel: this.panel,
255
+ anchor: this.box,
256
+ inside: [this.field, this.panel],
257
+ width: this.panelWidth(),
258
+ layout: this.options.panelLayout,
259
+ close: () => {
260
+ this.store.actions.close();
261
+ },
262
+ returnFocus: this.input
263
+ });
264
+ this.calendarView.focusGrid();
265
+ } else {
266
+ this.closePanel?.();
267
+ this.closePanel = null;
268
+ }
269
+ }
270
+ remember(calendar) {
271
+ const key = this.options.persistCalendar;
272
+ if (!key) return;
273
+ try {
274
+ window.localStorage.setItem(key, calendar);
275
+ } catch {}
276
+ }
277
+ restoreCalendar() {
278
+ const key = this.options.persistCalendar;
279
+ if (!key) return;
280
+ const stored = readStorage(key);
281
+ if (stored === "BS" || stored === "AD") this.store.actions.switchCalendar(stored);
282
+ }
283
+ };
284
+ /** Only the keys the picker store understands, minus the view's own callbacks. */
285
+ function storeOptions(options) {
286
+ const out = {};
287
+ for (const [key, value] of Object.entries(options)) if (!VIEW_KEYS.has(key) && key !== "onChange" && key !== "onCalendarChange") out[key] = value;
288
+ return out;
289
+ }
290
+ function readStorage(key) {
291
+ try {
292
+ return window.localStorage.getItem(key);
293
+ } catch {
294
+ return null;
295
+ }
296
+ }
297
+ //#endregion
298
+ //#region src/date-picker-element.ts
299
+ /**
300
+ * <nep-date-picker name="dob" min="2020-01-01"></nep-date-picker>
301
+ *
302
+ * A form-associated BS/AD date field: the form receives the AD "YYYY-MM-DD"
303
+ * value under `name`. Fires `change` with { value, ad, bs }, plus `nep-open`,
304
+ * `nep-close` and `nep-calendar-change`.
305
+ */
306
+ var NepDatePickerElement = class extends Base {
307
+ constructor() {
308
+ super();
309
+ this.view = null;
310
+ this.rich = {};
311
+ this.unsubscribe = null;
312
+ this.internals = typeof this.attachInternals === "function" ? this.attachInternals() : null;
313
+ swallowInnerChange(this);
314
+ }
315
+ get value() {
316
+ return this.view?.getState().value ?? isoOf(fromIsoDate(this.getAttribute("value")));
317
+ }
318
+ set value(next) {
319
+ this.view?.store.actions.setValue(next);
320
+ }
321
+ get holidays() {
322
+ return this.rich.holidays;
323
+ }
324
+ set holidays(next) {
325
+ this.setRich({ holidays: next });
326
+ }
327
+ get events() {
328
+ return this.rich.events;
329
+ }
330
+ set events(next) {
331
+ this.setRich({ events: next });
332
+ }
333
+ get isDateDisabled() {
334
+ return this.rich.isDateDisabled;
335
+ }
336
+ set isDateDisabled(next) {
337
+ this.setRich({ isDateDisabled: next });
338
+ }
339
+ /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */
340
+ get presets() {
341
+ return this.customPresets ?? presetIds(this);
342
+ }
343
+ set presets(next) {
344
+ this.customPresets = next;
345
+ this.view?.setOptions({ presets: this.presets });
346
+ }
347
+ get form() {
348
+ return this.internals?.form ?? null;
349
+ }
350
+ get validity() {
351
+ return this.internals?.validity;
352
+ }
353
+ get validationMessage() {
354
+ return this.internals?.validationMessage ?? "";
355
+ }
356
+ checkValidity() {
357
+ return this.internals?.checkValidity() ?? true;
358
+ }
359
+ reportValidity() {
360
+ return this.internals?.reportValidity() ?? true;
361
+ }
362
+ connectedCallback() {
363
+ if (this.view) return;
364
+ const view = new DatePickerView(this, {
365
+ ...this.readOptions(),
366
+ defaultValue: str(this, "value"),
367
+ onChange: (value, detail) => {
368
+ this.dispatchEvent(new CustomEvent("change", {
369
+ bubbles: true,
370
+ detail: {
371
+ value,
372
+ ad: detail?.ad ?? null,
373
+ bs: detail?.bs ?? null
374
+ }
375
+ }));
376
+ },
377
+ onCalendarChange: (calendar) => {
378
+ this.dispatchEvent(new CustomEvent("nep-calendar-change", {
379
+ bubbles: true,
380
+ detail: { calendar }
381
+ }));
382
+ },
383
+ onOpenChange: (open) => {
384
+ this.dispatchEvent(new CustomEvent(open ? "nep-open" : "nep-close", { bubbles: true }));
385
+ }
386
+ });
387
+ this.view = view;
388
+ this.unsubscribe = view.store.subscribe(() => {
389
+ this.syncForm();
390
+ });
391
+ this.syncForm();
392
+ }
393
+ disconnectedCallback() {
394
+ this.unsubscribe?.();
395
+ this.view?.destroy();
396
+ this.view = null;
397
+ }
398
+ attributeChangedCallback(name, previous, next) {
399
+ if (!this.view || previous === next) return;
400
+ if (name === "value") this.view.store.actions.setValue(next ?? "");
401
+ this.view.setOptions(this.readOptions());
402
+ this.syncForm();
403
+ }
404
+ formResetCallback() {
405
+ this.view?.store.actions.reset();
406
+ }
407
+ formDisabledCallback(disabled) {
408
+ this.view?.setOptions({ disabled: disabled || bool(this, "disabled") });
409
+ }
410
+ formStateRestoreCallback(state) {
411
+ if (typeof state === "string") this.view?.store.actions.setValue(state);
412
+ }
413
+ focus(options) {
414
+ this.view?.input.focus(options);
415
+ }
416
+ open() {
417
+ this.view?.open();
418
+ }
419
+ close() {
420
+ this.view?.close();
421
+ }
422
+ setRich(changes) {
423
+ this.rich = {
424
+ ...this.rich,
425
+ ...changes
426
+ };
427
+ this.view?.setOptions(changes);
428
+ }
429
+ readOptions() {
430
+ return {
431
+ ...this.rich,
432
+ min: str(this, "min"),
433
+ max: str(this, "max"),
434
+ calendar: calendarAttr(this, "calendar"),
435
+ defaultCalendar: calendarAttr(this, "default-calendar"),
436
+ locale: str(this, "locale"),
437
+ name: str(this, "name"),
438
+ hiddenInput: this.internals === null,
439
+ placeholder: str(this, "placeholder"),
440
+ required: bool(this, "required"),
441
+ disabled: bool(this, "disabled"),
442
+ clearable: onUnlessFalse(this, "clearable"),
443
+ showEquivalent: onUnlessFalse(this, "show-equivalent"),
444
+ closeOnSelect: onUnlessFalse(this, "close-on-select"),
445
+ theme: theme(this),
446
+ panelLayout: panelLayout(this),
447
+ mask: onUnlessFalse(this, "mask"),
448
+ inline: this.hasAttribute("inline"),
449
+ persistCalendar: str(this, "persist-calendar"),
450
+ weekStartsOn: weekday(this, "week-starts-on"),
451
+ displayFormat: str(this, "display-format"),
452
+ ariaLabel: str(this, "label"),
453
+ id: str(this, "input-id"),
454
+ presets: this.presets
455
+ };
456
+ }
457
+ syncForm() {
458
+ const view = this.view;
459
+ if (!view || !this.internals) return;
460
+ const state = view.getState();
461
+ this.internals.setFormValue(state.value === "" ? null : state.value, state.value);
462
+ if (state.error) this.internals.setValidity({ customError: true }, state.error.message, view.input);
463
+ else if (bool(this, "required") && state.value === "") this.internals.setValidity({ valueMissing: true }, view.input.validationMessage || "Please choose a date.", view.input);
464
+ else this.internals.setValidity({});
465
+ }
466
+ };
467
+ NepDatePickerElement.formAssociated = true;
468
+ NepDatePickerElement.observedAttributes = [
469
+ "value",
470
+ "min",
471
+ "max",
472
+ "calendar",
473
+ "default-calendar",
474
+ "locale",
475
+ "name",
476
+ "placeholder",
477
+ "required",
478
+ "disabled",
479
+ "clearable",
480
+ "show-equivalent",
481
+ "theme",
482
+ "panel-layout",
483
+ "mask",
484
+ "inline",
485
+ "persist-calendar",
486
+ "week-starts-on",
487
+ "display-format",
488
+ "label",
489
+ "close-on-select",
490
+ "input-id",
491
+ "presets"
492
+ ];
493
+ //#endregion
494
+ //#region src/date-picker.ts
495
+ /** Register <nep-date-picker> (skipped if already defined). */
496
+ function defineDatePicker(registry) {
497
+ defineElement(ELEMENT_NAMES.datePicker, NepDatePickerElement, registry);
498
+ }
499
+ /**
500
+ * Mount a date picker without custom elements.
501
+ *
502
+ * - Given a container, renders the field into it.
503
+ * - Given an <input>, hides it and keeps its value in step with the picker
504
+ * (AD "YYYY-MM-DD"), so existing forms and server code keep working.
505
+ */
506
+ function createDatePicker$1(target, options = {}) {
507
+ const enhanced = target instanceof HTMLInputElement ? target : null;
508
+ let host = target;
509
+ if (enhanced) {
510
+ host = document.createElement("span");
511
+ enhanced.after(host);
512
+ enhanced.hidden = true;
513
+ }
514
+ const view = new DatePickerView(host, {
515
+ ...enhanced ? {
516
+ defaultValue: enhanced.value,
517
+ name: void 0,
518
+ required: enhanced.required,
519
+ disabled: enhanced.disabled
520
+ } : {},
521
+ ...options,
522
+ onChange: (value, detail) => {
523
+ if (enhanced) {
524
+ enhanced.value = value;
525
+ enhanced.dispatchEvent(new Event("input", { bubbles: true }));
526
+ enhanced.dispatchEvent(new Event("change", { bubbles: true }));
527
+ }
528
+ options.onChange?.(value, detail);
529
+ }
530
+ });
531
+ return {
532
+ view,
533
+ getValue: () => view.getState().value,
534
+ getState: () => view.getState(),
535
+ setValue: (value) => {
536
+ view.store.actions.setValue(value);
537
+ if (enhanced) enhanced.value = view.getState().value;
538
+ },
539
+ setOptions: (changes) => {
540
+ view.setOptions(changes);
541
+ },
542
+ open: () => {
543
+ view.open();
544
+ },
545
+ close: () => {
546
+ view.close();
547
+ },
548
+ destroy: () => {
549
+ view.destroy();
550
+ if (enhanced) {
551
+ host.remove();
552
+ enhanced.hidden = false;
553
+ }
554
+ }
555
+ };
556
+ }
557
+ //#endregion
558
+ export { DatePickerView as i, defineDatePicker as n, NepDatePickerElement as r, createDatePicker$1 as t };
559
+
560
+ //# sourceMappingURL=date-picker-BwlrlU5Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-BwlrlU5Y.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 { restoreFocus, type PanelLayout } from '@nepdatejs/dom';\nimport { CalendarView } from './calendar-view';\nimport { openPanel, renderSegment } from './panel';\nimport { el, icon, setAttrs, setPopupMode, setText, uid } from './dom';\nimport { 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 renderSegment(this.segment, state, locale);\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.closePanel = openPanel({\n panel: this.panel,\n anchor: this.box,\n inside: [this.field, this.panel],\n width: this.panelWidth(),\n layout: this.options.panelLayout,\n close: () => {\n this.store.actions.close();\n },\n returnFocus: this.input,\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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"}