@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,74 @@
1
+ import { i as DatePickerViewOptions, n as RichProps, r as DatePickerView, t as Base } from "./element-utils-C-r5gPlk.js";
2
+ import { DatePickerState, SinglePreset } from "@nepdatejs/datepicker";
3
+ //#region src/date-picker-element.d.ts
4
+ /**
5
+ * <nep-date-picker name="dob" min="2020-01-01"></nep-date-picker>
6
+ *
7
+ * A form-associated BS/AD date field: the form receives the AD "YYYY-MM-DD"
8
+ * value under `name`. Fires `change` with { value, ad, bs }, plus `nep-open`,
9
+ * `nep-close` and `nep-calendar-change`.
10
+ */
11
+ declare class NepDatePickerElement extends Base {
12
+ static readonly formAssociated = true;
13
+ static readonly observedAttributes: readonly string[];
14
+ /** The view, once connected. */
15
+ view: DatePickerView | null;
16
+ private readonly internals;
17
+ private rich;
18
+ private customPresets;
19
+ private unsubscribe;
20
+ constructor();
21
+ get value(): string;
22
+ set value(next: string);
23
+ get holidays(): RichProps["holidays"];
24
+ set holidays(next: RichProps["holidays"]);
25
+ get events(): RichProps["events"];
26
+ set events(next: RichProps["events"]);
27
+ get isDateDisabled(): RichProps["isDateDisabled"];
28
+ set isDateDisabled(next: RichProps["isDateDisabled"]);
29
+ /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */
30
+ get presets(): readonly SinglePreset[] | undefined;
31
+ set presets(next: readonly SinglePreset[] | undefined);
32
+ get form(): HTMLFormElement | null;
33
+ get validity(): ValidityState | undefined;
34
+ get validationMessage(): string;
35
+ checkValidity(): boolean;
36
+ reportValidity(): boolean;
37
+ connectedCallback(): void;
38
+ disconnectedCallback(): void;
39
+ attributeChangedCallback(name: string, previous: string | null, next: string | null): void;
40
+ formResetCallback(): void;
41
+ formDisabledCallback(disabled: boolean): void;
42
+ formStateRestoreCallback(state: string | File | FormData | null): void;
43
+ override focus(options?: FocusOptions): void;
44
+ open(): void;
45
+ close(): void;
46
+ private setRich;
47
+ private readOptions;
48
+ private syncForm;
49
+ }
50
+ //#endregion
51
+ //#region src/date-picker.d.ts
52
+ /** Register <nep-date-picker> (skipped if already defined). */
53
+ declare function defineDatePicker(registry?: CustomElementRegistry): void;
54
+ interface DatePickerHandle {
55
+ readonly view: DatePickerView;
56
+ getValue(): string;
57
+ getState(): DatePickerState;
58
+ setValue(value: string): void;
59
+ setOptions(changes: Partial<DatePickerViewOptions>): void;
60
+ open(): void;
61
+ close(): void;
62
+ destroy(): void;
63
+ }
64
+ /**
65
+ * Mount a date picker without custom elements.
66
+ *
67
+ * - Given a container, renders the field into it.
68
+ * - Given an <input>, hides it and keeps its value in step with the picker
69
+ * (AD "YYYY-MM-DD"), so existing forms and server code keep working.
70
+ */
71
+ declare function createDatePicker$1(target: HTMLElement, options?: DatePickerViewOptions): DatePickerHandle;
72
+ //#endregion
73
+ export { NepDatePickerElement as i, createDatePicker$1 as n, defineDatePicker as r, DatePickerHandle as t };
74
+ //# sourceMappingURL=date-picker-DyvpYe29.d.ts.map
@@ -0,0 +1,6 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_date_picker = require("./date-picker-CgjYsf1w.cjs");
3
+ exports.DatePickerView = require_date_picker.DatePickerView;
4
+ exports.NepDatePickerElement = require_date_picker.NepDatePickerElement;
5
+ exports.createDatePicker = require_date_picker.createDatePicker;
6
+ exports.defineDatePicker = require_date_picker.defineDatePicker;
@@ -0,0 +1,3 @@
1
+ import { a as Theme, i as DatePickerViewOptions, r as DatePickerView } from "./element-utils-BVye8UQq.cjs";
2
+ import { i as NepDatePickerElement, n as createDatePicker, r as defineDatePicker, t as DatePickerHandle } from "./date-picker-BidCGOz0.cjs";
3
+ export { DatePickerHandle, DatePickerView, type DatePickerViewOptions, NepDatePickerElement, type Theme, createDatePicker, defineDatePicker };
@@ -0,0 +1,3 @@
1
+ import { a as Theme, i as DatePickerViewOptions, r as DatePickerView } from "./element-utils-C-r5gPlk.js";
2
+ import { i as NepDatePickerElement, n as createDatePicker, r as defineDatePicker, t as DatePickerHandle } from "./date-picker-DyvpYe29.js";
3
+ export { DatePickerHandle, DatePickerView, type DatePickerViewOptions, NepDatePickerElement, type Theme, createDatePicker, defineDatePicker };
@@ -0,0 +1 @@
1
+ export { i as DatePickerView, r as NepDatePickerElement, t as createDatePicker, n as defineDatePicker } from "./date-picker-BwlrlU5Y.js";
@@ -0,0 +1,98 @@
1
+ import { a as Theme, n as RichProps, t as Base } from "./element-utils-C-r5gPlk.js";
2
+ import { DateRangePickerOptions, DateRangePickerState, DateRangePickerStore, RangeField, RangePreset } from "@nepdatejs/datepicker";
3
+ import { PanelLayout } from "@nepdatejs/dom";
4
+ //#region src/range-view.d.ts
5
+ interface DateRangePickerViewOptions extends DateRangePickerOptions {
6
+ /** Field names for plain form posts; hidden inputs are rendered when set. */
7
+ readonly startName?: string | undefined;
8
+ readonly endName?: string | undefined;
9
+ readonly hiddenInput?: boolean | undefined;
10
+ readonly disabled?: boolean | undefined;
11
+ readonly required?: boolean | undefined;
12
+ /** 'sheet' opens a bottom sheet; 'popover' sits beside the field; 'auto' (default) uses the sheet below 480px. */
13
+ readonly panelLayout?: PanelLayout | undefined;
14
+ readonly theme?: Theme | undefined;
15
+ readonly startLabel?: string | undefined;
16
+ readonly endLabel?: string | undefined;
17
+ /** Show a "Fiscal year" button that switches the panel to fiscal-year tiles. */
18
+ readonly fiscalYearView?: boolean | undefined;
19
+ readonly onOpenChange?: ((open: boolean) => void) | undefined;
20
+ }
21
+ /** Two date fields (start, end) sharing one panel calendar in range mode. */
22
+ declare class DateRangePickerView {
23
+ readonly store: DateRangePickerStore;
24
+ readonly inputs: Record<RangeField, HTMLInputElement>;
25
+ private options;
26
+ private readonly field;
27
+ private readonly boxes;
28
+ private readonly toggleButton;
29
+ private readonly hint;
30
+ private readonly panel;
31
+ private readonly segment;
32
+ private readonly fiscalButton;
33
+ private readonly footer;
34
+ private readonly hidden;
35
+ private readonly calendarView;
36
+ private readonly presetList;
37
+ private readonly unsubscribe;
38
+ private closePanel;
39
+ private wasOpen;
40
+ constructor(host: HTMLElement, options?: DateRangePickerViewOptions);
41
+ getState(): DateRangePickerState;
42
+ setOptions(changes: Partial<DateRangePickerViewOptions>): void;
43
+ open(): void;
44
+ close(): void;
45
+ destroy(): void;
46
+ private render;
47
+ private panelWidth;
48
+ private syncPanel;
49
+ private readonly onClick;
50
+ }
51
+ //#endregion
52
+ //#region src/date-range-picker-element.d.ts
53
+ /**
54
+ * <nep-date-range-picker name="leave" min-days="1"></nep-date-range-picker>
55
+ *
56
+ * Two BS/AD fields sharing one panel. The form receives `${name}-start` and
57
+ * `${name}-end` (or `start-name` / `end-name`). Fires `change` with { value }.
58
+ */
59
+ declare class NepDateRangePickerElement extends Base {
60
+ static readonly formAssociated = true;
61
+ static readonly observedAttributes: readonly string[];
62
+ view: DateRangePickerView | null;
63
+ private readonly internals;
64
+ private rich;
65
+ private customPresets;
66
+ private unsubscribe;
67
+ constructor();
68
+ get value(): {
69
+ start: string;
70
+ end: string;
71
+ };
72
+ set value(next: {
73
+ start: string;
74
+ end: string;
75
+ });
76
+ set holidays(next: RichProps["holidays"]);
77
+ set isDateDisabled(next: RichProps["isDateDisabled"]);
78
+ /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */
79
+ get presets(): readonly RangePreset[] | undefined;
80
+ set presets(next: readonly RangePreset[] | undefined);
81
+ connectedCallback(): void;
82
+ disconnectedCallback(): void;
83
+ attributeChangedCallback(): void;
84
+ formResetCallback(): void;
85
+ formDisabledCallback(disabled: boolean): void;
86
+ private names;
87
+ private readOptions;
88
+ private syncForm;
89
+ }
90
+ //#endregion
91
+ //#region src/date-range-picker.d.ts
92
+ /** Register <nep-date-range-picker> (skipped if already defined). */
93
+ declare function defineDateRangePicker(registry?: CustomElementRegistry): void;
94
+ /** Mount a date range picker into a container. */
95
+ declare function createDateRangePicker$1(container: HTMLElement, options?: DateRangePickerViewOptions): DateRangePickerView;
96
+ //#endregion
97
+ export { DateRangePickerViewOptions as a, DateRangePickerView as i, defineDateRangePicker as n, NepDateRangePickerElement as r, createDateRangePicker$1 as t };
98
+ //# sourceMappingURL=date-range-picker-D3eNvlgv.d.ts.map
@@ -0,0 +1,449 @@
1
+ import { _ as icon, a as calendarAttr, b as setText, c as onUnlessFalse, d as str, f as swallowInnerChange, g as el, h as CalendarView, i as bool, l as panelLayout, n as defineElement, o as int, p as theme, r as Base, t as ELEMENT_NAMES, u as presetIds, v as setAttrs, x as uid, y as setPopupMode } from "./registry-BvkGnkvV.js";
2
+ import { n as openPanel, r as renderSegment, t as PresetList } from "./preset-list-DmE6fJjr.js";
3
+ import { getLocale } from "@nepdatejs/core";
4
+ import { createDateRangePicker } from "@nepdatejs/datepicker";
5
+ import { restoreFocus } from "@nepdatejs/dom";
6
+ //#region src/range-view.ts
7
+ const VIEW_KEYS = /* @__PURE__ */ new Set([
8
+ "startName",
9
+ "endName",
10
+ "hiddenInput",
11
+ "disabled",
12
+ "required",
13
+ "theme",
14
+ "panelLayout",
15
+ "startLabel",
16
+ "endLabel",
17
+ "fiscalYearView",
18
+ "onOpenChange",
19
+ "onChange",
20
+ "onCalendarChange"
21
+ ]);
22
+ /** Two date fields (start, end) sharing one panel calendar in range mode. */
23
+ var DateRangePickerView = class {
24
+ constructor(host, options = {}) {
25
+ this.closePanel = null;
26
+ this.wasOpen = false;
27
+ this.onClick = (event) => {
28
+ const target = event.target instanceof Element ? event.target : null;
29
+ if (!target || this.calendarView.element.contains(target)) return;
30
+ const calendar = target.closest("[data-calendar]")?.dataset["calendar"];
31
+ if (calendar === "BS" || calendar === "AD") {
32
+ this.store.actions.switchCalendar(calendar);
33
+ return;
34
+ }
35
+ if (target.closest("[data-action=\"fiscal\"]")) {
36
+ const calendar = this.store.calendar;
37
+ calendar.actions.setView(calendar.getState().view === "fiscal" ? "day" : "fiscal");
38
+ this.calendarView.focusGrid();
39
+ return;
40
+ }
41
+ if (target.closest("[data-action=\"toggle\"]")) {
42
+ if (this.store.getState().open) this.close();
43
+ else this.open();
44
+ }
45
+ };
46
+ this.options = { ...options };
47
+ this.store = createDateRangePicker({
48
+ ...storeOptions(options),
49
+ onChange: (value, detail) => {
50
+ this.options.onChange?.(value, detail);
51
+ },
52
+ onCalendarChange: (calendar) => {
53
+ this.options.onCalendarChange?.(calendar);
54
+ }
55
+ });
56
+ const id = uid("ndp-range");
57
+ const makeInput = (field) => {
58
+ const input = el("input", {
59
+ class: "ndp-input__control",
60
+ id: `${id}-${field}`,
61
+ type: "text",
62
+ inputmode: "numeric",
63
+ autocomplete: "off",
64
+ "aria-controls": `${id}-panel`,
65
+ "data-field": field
66
+ });
67
+ input.addEventListener("input", () => {
68
+ this.store.actions.type(field, input.value);
69
+ });
70
+ input.addEventListener("blur", () => {
71
+ this.store.actions.blur(field);
72
+ });
73
+ input.addEventListener("keydown", (event) => {
74
+ if (event.key === "ArrowDown" && (event.altKey || input.value === "")) {
75
+ event.preventDefault();
76
+ this.open();
77
+ }
78
+ });
79
+ return input;
80
+ };
81
+ this.inputs = {
82
+ start: makeInput("start"),
83
+ end: makeInput("end")
84
+ };
85
+ this.toggleButton = el("button", {
86
+ type: "button",
87
+ class: "ndp-icon-button",
88
+ "data-action": "toggle"
89
+ }, [icon("calendar")]);
90
+ this.boxes = {
91
+ start: el("div", { class: "ndp-input" }, [this.inputs.start]),
92
+ end: el("div", { class: "ndp-input" }, [this.inputs.end, el("span", { class: "ndp-input__actions" }, [this.toggleButton])])
93
+ };
94
+ this.hint = el("p", {
95
+ class: "ndp-hint",
96
+ id: `${id}-hint`,
97
+ "aria-live": "polite",
98
+ hidden: true
99
+ });
100
+ this.hidden = {
101
+ start: el("input", { type: "hidden" }),
102
+ end: el("input", { type: "hidden" })
103
+ };
104
+ this.segment = el("div", {
105
+ class: "ndp-segment",
106
+ role: "group"
107
+ }, [el("button", {
108
+ type: "button",
109
+ class: "ndp-segment__item",
110
+ "data-calendar": "BS"
111
+ }), el("button", {
112
+ type: "button",
113
+ class: "ndp-segment__item",
114
+ "data-calendar": "AD"
115
+ })]);
116
+ this.fiscalButton = el("button", {
117
+ type: "button",
118
+ class: "ndp-button",
119
+ "data-action": "fiscal"
120
+ });
121
+ this.footer = el("div", { class: "ndp-panel__footer" }, [this.segment, this.fiscalButton]);
122
+ const calendarRoot = el("div", { class: "ndp-panel__calendar" });
123
+ this.presetList = new PresetList((id) => {
124
+ if (this.store.actions.applyPreset(id) && !this.store.getState().open) restoreFocus(this.inputs.start);
125
+ });
126
+ this.panel = el("div", {
127
+ class: "ndp-panel",
128
+ id: `${id}-panel`,
129
+ hidden: true
130
+ }, [el("div", { class: "ndp-panel__body" }, [this.presetList.element, calendarRoot]), this.footer]);
131
+ const row = el("div", { class: "ndp-range" }, [
132
+ this.boxes.start,
133
+ el("span", {
134
+ class: "ndp-range__separator",
135
+ "aria-hidden": "true"
136
+ }, ["→"]),
137
+ this.boxes.end
138
+ ]);
139
+ this.field = el("div", { class: "ndp-field" }, [
140
+ row,
141
+ this.hint,
142
+ this.panel,
143
+ this.hidden.start,
144
+ this.hidden.end
145
+ ]);
146
+ host.append(this.field);
147
+ this.calendarView = new CalendarView(calendarRoot, this.store.calendar, {
148
+ locale: () => this.options.locale,
149
+ onDayActivate: (date) => {
150
+ if (this.store.actions.select(date) && !this.store.getState().open) restoreFocus(this.inputs.end);
151
+ }
152
+ });
153
+ this.field.addEventListener("click", this.onClick);
154
+ this.unsubscribe = this.store.subscribe(() => {
155
+ this.render();
156
+ });
157
+ this.render();
158
+ }
159
+ getState() {
160
+ return this.store.getState();
161
+ }
162
+ setOptions(changes) {
163
+ this.options = {
164
+ ...this.options,
165
+ ...changes
166
+ };
167
+ const forStore = storeOptions(changes);
168
+ if (Object.keys(forStore).length > 0) this.store.setOptions(forStore);
169
+ else this.render();
170
+ }
171
+ open() {
172
+ if (!this.options.disabled) this.store.actions.open();
173
+ }
174
+ close() {
175
+ this.store.actions.close();
176
+ }
177
+ destroy() {
178
+ this.closePanel?.();
179
+ this.unsubscribe();
180
+ this.calendarView.destroy();
181
+ this.field.remove();
182
+ }
183
+ render() {
184
+ const state = this.store.getState();
185
+ const locale = getLocale(this.options.locale);
186
+ const disabled = this.options.disabled ?? false;
187
+ const hintText = state.error?.message ?? null;
188
+ const texts = {
189
+ start: state.startText,
190
+ end: state.endText
191
+ };
192
+ const labels = {
193
+ start: this.options.startLabel,
194
+ end: this.options.endLabel
195
+ };
196
+ for (const field of ["start", "end"]) {
197
+ const input = this.inputs[field];
198
+ if (input.value !== texts[field]) input.value = texts[field];
199
+ const error = state.error;
200
+ const fieldError = error !== null && (error.field === field || error.field === "range");
201
+ input.setCustomValidity(fieldError ? error.message : "");
202
+ setAttrs(input, {
203
+ placeholder: state.placeholder,
204
+ disabled,
205
+ required: this.options.required ?? false,
206
+ "aria-label": labels[field] ?? null,
207
+ "aria-invalid": fieldError ? "true" : null,
208
+ "aria-describedby": hintText ? this.hint.id : null
209
+ });
210
+ setAttrs(this.boxes[field], {
211
+ "data-invalid": fieldError,
212
+ "data-disabled": disabled
213
+ });
214
+ const name = this.options.hiddenInput === false ? void 0 : field === "start" ? this.options.startName : this.options.endName;
215
+ setAttrs(this.hidden[field], { name: name ?? null });
216
+ this.hidden[field].value = state.value[field];
217
+ this.hidden[field].disabled = name === void 0 || disabled;
218
+ }
219
+ setAttrs(this.field, { "data-ndp-theme": this.options.theme ?? null });
220
+ setAttrs(this.panel, {
221
+ "data-ndp-theme": this.options.theme ?? null,
222
+ "aria-label": locale.labels.chooseDate
223
+ });
224
+ setAttrs(this.toggleButton, {
225
+ disabled,
226
+ "aria-label": locale.labels.openCalendar,
227
+ "aria-expanded": state.open ? "true" : "false"
228
+ });
229
+ this.hint.hidden = hintText === null;
230
+ setText(this.hint, hintText ?? "");
231
+ setAttrs(this.hint, { "data-error": hintText !== null });
232
+ renderSegment(this.segment, state, locale);
233
+ this.presetList.render(state.presets, locale.labels.presets);
234
+ const fiscal = this.options.fiscalYearView ?? false;
235
+ this.fiscalButton.hidden = !fiscal;
236
+ setText(this.fiscalButton, locale.labels.fiscalYear);
237
+ setAttrs(this.fiscalButton, { "aria-pressed": state.calendarState.view === "fiscal" ? "true" : "false" });
238
+ this.footer.hidden = !fiscal && !state.canSwitchCalendar;
239
+ setPopupMode(state, [this.inputs.start, this.inputs.end], this.toggleButton, this.panel);
240
+ this.syncPanel(state.open && !state.inline);
241
+ this.panel.hidden = !state.inline && !this.wasOpen;
242
+ this.panel.style.setProperty("--ndp-panel-width", state.inline ? `${String(this.panelWidth())}px` : null);
243
+ }
244
+ panelWidth() {
245
+ return this.store.getState().presets.length > 0 ? 492 : 320;
246
+ }
247
+ syncPanel(open) {
248
+ if (open === this.wasOpen) return;
249
+ this.wasOpen = open;
250
+ this.options.onOpenChange?.(open);
251
+ if (open) {
252
+ const anchor = this.field.querySelector(".ndp-range") ?? this.field;
253
+ this.closePanel = openPanel({
254
+ panel: this.panel,
255
+ anchor,
256
+ inside: [this.field],
257
+ width: this.panelWidth(),
258
+ layout: this.options.panelLayout,
259
+ close: () => {
260
+ this.store.actions.close();
261
+ },
262
+ returnFocus: this.inputs.start
263
+ });
264
+ this.calendarView.focusGrid();
265
+ } else {
266
+ this.closePanel?.();
267
+ this.closePanel = null;
268
+ }
269
+ }
270
+ };
271
+ function storeOptions(options) {
272
+ const out = {};
273
+ for (const [key, value] of Object.entries(options)) if (!VIEW_KEYS.has(key)) out[key] = value;
274
+ return out;
275
+ }
276
+ //#endregion
277
+ //#region src/date-range-picker-element.ts
278
+ /**
279
+ * <nep-date-range-picker name="leave" min-days="1"></nep-date-range-picker>
280
+ *
281
+ * Two BS/AD fields sharing one panel. The form receives `${name}-start` and
282
+ * `${name}-end` (or `start-name` / `end-name`). Fires `change` with { value }.
283
+ */
284
+ var NepDateRangePickerElement = class extends Base {
285
+ constructor() {
286
+ super();
287
+ this.view = null;
288
+ this.rich = {};
289
+ this.unsubscribe = null;
290
+ this.internals = typeof this.attachInternals === "function" ? this.attachInternals() : null;
291
+ swallowInnerChange(this);
292
+ }
293
+ get value() {
294
+ return this.view?.getState().value ?? {
295
+ start: "",
296
+ end: ""
297
+ };
298
+ }
299
+ set value(next) {
300
+ this.view?.store.actions.setValue(next);
301
+ }
302
+ set holidays(next) {
303
+ this.rich = {
304
+ ...this.rich,
305
+ holidays: next
306
+ };
307
+ this.view?.setOptions({ holidays: next });
308
+ }
309
+ set isDateDisabled(next) {
310
+ this.rich = {
311
+ ...this.rich,
312
+ isDateDisabled: next
313
+ };
314
+ this.view?.setOptions({ isDateDisabled: next });
315
+ }
316
+ /** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */
317
+ get presets() {
318
+ return this.customPresets ?? presetIds(this);
319
+ }
320
+ set presets(next) {
321
+ this.customPresets = next;
322
+ this.view?.setOptions({ presets: this.presets });
323
+ }
324
+ connectedCallback() {
325
+ if (this.view) return;
326
+ const view = new DateRangePickerView(this, {
327
+ ...this.readOptions(),
328
+ defaultValue: {
329
+ start: str(this, "start") ?? "",
330
+ end: str(this, "end") ?? ""
331
+ },
332
+ onChange: (value) => {
333
+ this.dispatchEvent(new CustomEvent("change", {
334
+ bubbles: true,
335
+ detail: { value }
336
+ }));
337
+ },
338
+ onOpenChange: (open) => {
339
+ this.dispatchEvent(new CustomEvent(open ? "nep-open" : "nep-close", { bubbles: true }));
340
+ }
341
+ });
342
+ this.view = view;
343
+ this.unsubscribe = view.store.subscribe(() => {
344
+ this.syncForm();
345
+ });
346
+ this.syncForm();
347
+ }
348
+ disconnectedCallback() {
349
+ this.unsubscribe?.();
350
+ this.view?.destroy();
351
+ this.view = null;
352
+ }
353
+ attributeChangedCallback() {
354
+ this.view?.setOptions(this.readOptions());
355
+ this.syncForm();
356
+ }
357
+ formResetCallback() {
358
+ this.view?.store.actions.reset();
359
+ }
360
+ formDisabledCallback(disabled) {
361
+ this.view?.setOptions({ disabled: disabled || bool(this, "disabled") });
362
+ }
363
+ names() {
364
+ const name = str(this, "name");
365
+ return {
366
+ start: str(this, "start-name") ?? (name ? `${name}-start` : void 0),
367
+ end: str(this, "end-name") ?? (name ? `${name}-end` : void 0)
368
+ };
369
+ }
370
+ readOptions() {
371
+ const names = this.names();
372
+ return {
373
+ ...this.rich,
374
+ startName: names.start,
375
+ endName: names.end,
376
+ hiddenInput: this.internals === null,
377
+ min: str(this, "min"),
378
+ max: str(this, "max"),
379
+ calendar: calendarAttr(this, "calendar"),
380
+ defaultCalendar: calendarAttr(this, "default-calendar"),
381
+ locale: str(this, "locale"),
382
+ minDays: int(this, "min-days"),
383
+ maxDays: int(this, "max-days"),
384
+ disabled: bool(this, "disabled"),
385
+ required: bool(this, "required"),
386
+ theme: theme(this),
387
+ panelLayout: panelLayout(this),
388
+ mask: onUnlessFalse(this, "mask"),
389
+ inline: this.hasAttribute("inline"),
390
+ startLabel: str(this, "start-label"),
391
+ endLabel: str(this, "end-label"),
392
+ fiscalYearView: bool(this, "fiscal-years"),
393
+ presets: this.presets
394
+ };
395
+ }
396
+ syncForm() {
397
+ const view = this.view;
398
+ if (!view || !this.internals) return;
399
+ const state = view.getState();
400
+ const names = this.names();
401
+ const data = new FormData();
402
+ if (names.start && state.value.start) data.append(names.start, state.value.start);
403
+ if (names.end && state.value.end) data.append(names.end, state.value.end);
404
+ this.internals.setFormValue(data);
405
+ if (state.error) this.internals.setValidity({ customError: true }, state.error.message, view.inputs.start);
406
+ else if (bool(this, "required") && (state.value.start === "" || state.value.end === "")) this.internals.setValidity({ valueMissing: true }, "Please choose a start and end date.", view.inputs.start);
407
+ else this.internals.setValidity({});
408
+ }
409
+ };
410
+ NepDateRangePickerElement.formAssociated = true;
411
+ NepDateRangePickerElement.observedAttributes = [
412
+ "start",
413
+ "end",
414
+ "name",
415
+ "start-name",
416
+ "end-name",
417
+ "min",
418
+ "max",
419
+ "calendar",
420
+ "default-calendar",
421
+ "locale",
422
+ "min-days",
423
+ "max-days",
424
+ "disabled",
425
+ "required",
426
+ "theme",
427
+ "panel-layout",
428
+ "mask",
429
+ "inline",
430
+ "start-label",
431
+ "end-label",
432
+ "presets",
433
+ "fiscal-years"
434
+ ];
435
+ //#endregion
436
+ //#region src/date-range-picker.ts
437
+ /** `@nepdatejs/vanilla/date-range-picker`: just the range picker. */
438
+ /** Register <nep-date-range-picker> (skipped if already defined). */
439
+ function defineDateRangePicker(registry) {
440
+ defineElement(ELEMENT_NAMES.dateRangePicker, NepDateRangePickerElement, registry);
441
+ }
442
+ /** Mount a date range picker into a container. */
443
+ function createDateRangePicker$1(container, options = {}) {
444
+ return new DateRangePickerView(container, options);
445
+ }
446
+ //#endregion
447
+ export { DateRangePickerView as i, defineDateRangePicker as n, NepDateRangePickerElement as r, createDateRangePicker$1 as t };
448
+
449
+ //# sourceMappingURL=date-range-picker-NwetXUC-.js.map