@nepdatejs/vanilla 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +124 -2
- package/dist/auto-define.cjs +11 -0
- package/dist/auto-define.cjs.map +1 -0
- package/dist/auto-define.d.cts +2 -0
- package/dist/auto-define.d.ts +2 -0
- package/dist/auto-define.js +9 -0
- package/dist/auto-define.js.map +1 -0
- package/dist/calendar-BAcO-jYq.js +142 -0
- package/dist/calendar-BAcO-jYq.js.map +1 -0
- package/dist/calendar-BNdN8qJv.d.ts +87 -0
- package/dist/calendar-C1LZI7XN.cjs +159 -0
- package/dist/calendar-C1LZI7XN.cjs.map +1 -0
- package/dist/calendar-QWPX0IfD.d.cts +87 -0
- package/dist/calendar.cjs +7 -0
- package/dist/calendar.d.cts +2 -0
- package/dist/calendar.d.ts +2 -0
- package/dist/calendar.js +3 -0
- package/dist/date-picker-BidCGOz0.d.cts +74 -0
- package/dist/date-picker-CQoabjlj.cjs +600 -0
- package/dist/date-picker-CQoabjlj.cjs.map +1 -0
- package/dist/date-picker-DyvpYe29.d.ts +74 -0
- package/dist/date-picker-ucoEFnMW.js +577 -0
- package/dist/date-picker-ucoEFnMW.js.map +1 -0
- package/dist/date-picker.cjs +6 -0
- package/dist/date-picker.d.cts +3 -0
- package/dist/date-picker.d.ts +3 -0
- package/dist/date-picker.js +1 -0
- package/dist/date-range-picker-BQKcZeqG.cjs +489 -0
- package/dist/date-range-picker-BQKcZeqG.cjs.map +1 -0
- package/dist/date-range-picker-D3eNvlgv.d.ts +98 -0
- package/dist/date-range-picker-DAkCzVgT.js +466 -0
- package/dist/date-range-picker-DAkCzVgT.js.map +1 -0
- package/dist/date-range-picker-SIl0vhUV.d.cts +98 -0
- package/dist/date-range-picker.cjs +6 -0
- package/dist/date-range-picker.d.cts +2 -0
- package/dist/date-range-picker.d.ts +2 -0
- package/dist/date-range-picker.js +1 -0
- package/dist/date-time-picker-BqweOP2u.js +487 -0
- package/dist/date-time-picker-BqweOP2u.js.map +1 -0
- package/dist/date-time-picker-Bxfn-a9T.cjs +510 -0
- package/dist/date-time-picker-Bxfn-a9T.cjs.map +1 -0
- package/dist/date-time-picker-BzSyQxrf.d.cts +92 -0
- package/dist/date-time-picker-DzDpzLMZ.d.ts +92 -0
- package/dist/date-time-picker.cjs +6 -0
- package/dist/date-time-picker.d.cts +2 -0
- package/dist/date-time-picker.d.ts +2 -0
- package/dist/date-time-picker.js +1 -0
- package/dist/define-7natoEH4.js +18 -0
- package/dist/define-7natoEH4.js.map +1 -0
- package/dist/define-B8NUA3yj.d.cts +16 -0
- package/dist/define-B8NUA3yj.d.ts +16 -0
- package/dist/define-DTTdLfIM.cjs +23 -0
- package/dist/define-DTTdLfIM.cjs.map +1 -0
- package/dist/element-utils-BVye8UQq.d.cts +82 -0
- package/dist/element-utils-C-r5gPlk.d.ts +82 -0
- package/dist/index.cjs +30 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/multi-date-picker-B2mQbjZM.d.ts +105 -0
- package/dist/multi-date-picker-BMEYUPBa.cjs +462 -0
- package/dist/multi-date-picker-BMEYUPBa.cjs.map +1 -0
- package/dist/multi-date-picker-BUNf5zyJ.d.cts +105 -0
- package/dist/multi-date-picker-XCg8Y0sF.js +439 -0
- package/dist/multi-date-picker-XCg8Y0sF.js.map +1 -0
- package/dist/multi-date-picker.cjs +6 -0
- package/dist/multi-date-picker.d.cts +2 -0
- package/dist/multi-date-picker.d.ts +2 -0
- package/dist/multi-date-picker.js +1 -0
- package/dist/nepdate-picker.global.js +3 -0
- package/dist/nepdate-picker.global.js.map +1 -0
- package/dist/preset-list-CASwnwmS.js +45 -0
- package/dist/preset-list-CASwnwmS.js.map +1 -0
- package/dist/preset-list-Cs8H12Wp.cjs +50 -0
- package/dist/preset-list-Cs8H12Wp.cjs.map +1 -0
- package/dist/registry-3qzdVB7H.cjs +591 -0
- package/dist/registry-3qzdVB7H.cjs.map +1 -0
- package/dist/registry-BvkGnkvV.js +466 -0
- package/dist/registry-BvkGnkvV.js.map +1 -0
- package/package.json +162 -3
- package/src/auto-define.ts +6 -0
- package/src/calendar-element.ts +129 -0
- package/src/calendar-view.ts +406 -0
- package/src/calendar.ts +45 -0
- package/src/date-picker-element.ts +249 -0
- package/src/date-picker.ts +91 -0
- package/src/date-range-picker-element.ts +201 -0
- package/src/date-range-picker.ts +20 -0
- package/src/date-time-picker-element.ts +191 -0
- package/src/date-time-picker.ts +20 -0
- package/src/datetime-view.ts +459 -0
- package/src/define.ts +16 -0
- package/src/dom.ts +109 -0
- package/src/element-utils.ts +86 -0
- package/src/global.ts +7 -0
- package/src/index.ts +15 -0
- package/src/multi-date-picker-element.ts +187 -0
- package/src/multi-date-picker.ts +53 -0
- package/src/multi-view.ts +345 -0
- package/src/picker-view.ts +448 -0
- package/src/preset-list.ts +51 -0
- package/src/range-view.ts +393 -0
- package/src/registry.ts +27 -0
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
const require_registry = require("./registry-3qzdVB7H.cjs");
|
|
2
|
+
const require_preset_list = require("./preset-list-Cs8H12Wp.cjs");
|
|
3
|
+
let _nepdatejs_core = require("@nepdatejs/core");
|
|
4
|
+
let _nepdatejs_datepicker = require("@nepdatejs/datepicker");
|
|
5
|
+
let _nepdatejs_dom = require("@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()) (0, _nepdatejs_dom.restoreFocus)(this.input);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
this.options = { ...options };
|
|
65
|
+
this.store = (0, _nepdatejs_datepicker.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 ?? require_registry.uid("ndp-input");
|
|
76
|
+
const panelId = `${inputId}-panel`;
|
|
77
|
+
this.input = require_registry.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 = require_registry.el("button", {
|
|
87
|
+
type: "button",
|
|
88
|
+
class: "ndp-icon-button",
|
|
89
|
+
"data-action": "clear"
|
|
90
|
+
}, [require_registry.icon("close")]);
|
|
91
|
+
this.switchButton = require_registry.el("button", {
|
|
92
|
+
type: "button",
|
|
93
|
+
class: "ndp-input__switch",
|
|
94
|
+
"data-action": "switch"
|
|
95
|
+
});
|
|
96
|
+
this.toggleButton = require_registry.el("button", {
|
|
97
|
+
type: "button",
|
|
98
|
+
class: "ndp-icon-button",
|
|
99
|
+
"data-action": "toggle"
|
|
100
|
+
}, [require_registry.icon("calendar")]);
|
|
101
|
+
this.box = require_registry.el("div", { class: "ndp-input" }, [this.input, require_registry.el("span", { class: "ndp-input__actions" }, [
|
|
102
|
+
this.clearButton,
|
|
103
|
+
this.switchButton,
|
|
104
|
+
this.toggleButton
|
|
105
|
+
])]);
|
|
106
|
+
this.hint = require_registry.el("p", {
|
|
107
|
+
class: "ndp-hint",
|
|
108
|
+
id: `${inputId}-hint`,
|
|
109
|
+
"aria-live": "polite",
|
|
110
|
+
hidden: true
|
|
111
|
+
});
|
|
112
|
+
this.hidden = require_registry.el("input", { type: "hidden" });
|
|
113
|
+
this.segment = require_registry.el("div", {
|
|
114
|
+
class: "ndp-segment",
|
|
115
|
+
role: "group"
|
|
116
|
+
}, [require_registry.el("button", {
|
|
117
|
+
type: "button",
|
|
118
|
+
class: "ndp-segment__item",
|
|
119
|
+
"data-calendar": "BS"
|
|
120
|
+
}), require_registry.el("button", {
|
|
121
|
+
type: "button",
|
|
122
|
+
class: "ndp-segment__item",
|
|
123
|
+
"data-calendar": "AD"
|
|
124
|
+
})]);
|
|
125
|
+
this.todayButton = require_registry.el("button", {
|
|
126
|
+
type: "button",
|
|
127
|
+
class: "ndp-button",
|
|
128
|
+
"data-action": "today"
|
|
129
|
+
});
|
|
130
|
+
const calendarRoot = require_registry.el("div", { class: "ndp-panel__calendar" });
|
|
131
|
+
this.presetList = new require_preset_list.PresetList((id) => {
|
|
132
|
+
if (this.store.actions.applyPreset(id) && !this.store.getState().open) (0, _nepdatejs_dom.restoreFocus)(this.input);
|
|
133
|
+
});
|
|
134
|
+
this.panel = require_registry.el("div", {
|
|
135
|
+
class: "ndp-panel",
|
|
136
|
+
id: panelId,
|
|
137
|
+
hidden: true
|
|
138
|
+
}, [require_registry.el("div", { class: "ndp-panel__body" }, [this.presetList.element, calendarRoot]), require_registry.el("div", { class: "ndp-panel__footer" }, [this.segment, this.todayButton])]);
|
|
139
|
+
this.field = require_registry.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 require_registry.CalendarView(calendarRoot, this.store.calendar, {
|
|
147
|
+
locale: () => this.options.locale,
|
|
148
|
+
onDayActivate: (date) => {
|
|
149
|
+
if (this.store.actions.select(date) && !this.store.getState().open) (0, _nepdatejs_dom.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 = (0, _nepdatejs_core.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
|
+
require_registry.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
|
+
require_registry.setAttrs(this.box, {
|
|
205
|
+
"data-invalid": state.error !== null,
|
|
206
|
+
"data-disabled": disabled
|
|
207
|
+
});
|
|
208
|
+
require_registry.setAttrs(this.field, { "data-ndp-theme": this.options.theme ?? null });
|
|
209
|
+
require_registry.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
|
+
require_registry.setAttrs(this.clearButton, { "aria-label": locale.labels.clear });
|
|
215
|
+
this.switchButton.hidden = !state.canSwitchCalendar;
|
|
216
|
+
require_registry.setText(this.switchButton, locale.calendarNames[state.calendar]);
|
|
217
|
+
const other = state.calendar === "BS" ? "AD" : "BS";
|
|
218
|
+
require_registry.setAttrs(this.switchButton, {
|
|
219
|
+
disabled,
|
|
220
|
+
"aria-label": `${locale.labels.calendar}: ${locale.calendarNames[state.calendar]} → ${locale.calendarNames[other]}`
|
|
221
|
+
});
|
|
222
|
+
require_registry.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
|
+
require_registry.setText(this.hint, hintText ?? "");
|
|
229
|
+
require_registry.setAttrs(this.hint, { "data-error": state.error !== null });
|
|
230
|
+
this.segment.hidden = !state.canSwitchCalendar;
|
|
231
|
+
require_registry.setAttrs(this.segment, { "aria-label": locale.labels.calendar });
|
|
232
|
+
for (const button of this.segment.querySelectorAll("button")) {
|
|
233
|
+
const calendar = button.dataset["calendar"];
|
|
234
|
+
require_registry.setText(button, locale.calendarNames[calendar]);
|
|
235
|
+
require_registry.setAttrs(button, { "aria-pressed": calendar === state.calendar ? "true" : "false" });
|
|
236
|
+
}
|
|
237
|
+
require_registry.setText(this.todayButton, locale.labels.today);
|
|
238
|
+
this.presetList.render(state.presets, locale.labels.presets);
|
|
239
|
+
const name = this.options.hiddenInput === false ? void 0 : this.options.name;
|
|
240
|
+
require_registry.setAttrs(this.hidden, {
|
|
241
|
+
name: name ?? null,
|
|
242
|
+
value: state.value
|
|
243
|
+
});
|
|
244
|
+
this.hidden.value = state.value;
|
|
245
|
+
this.hidden.disabled = name === void 0 || disabled;
|
|
246
|
+
require_registry.setPopupMode(state, [this.input], this.toggleButton, this.panel);
|
|
247
|
+
this.syncPanel(state.open && !state.inline);
|
|
248
|
+
this.panel.hidden = !state.inline && !this.wasOpen;
|
|
249
|
+
this.panel.style.setProperty("--ndp-panel-width", state.inline ? `${String(this.panelWidth())}px` : null);
|
|
250
|
+
}
|
|
251
|
+
panelWidth() {
|
|
252
|
+
return this.store.getState().presets.length > 0 ? 492 : 320;
|
|
253
|
+
}
|
|
254
|
+
syncPanel(open) {
|
|
255
|
+
if (open === this.wasOpen) return;
|
|
256
|
+
this.wasOpen = open;
|
|
257
|
+
this.options.onOpenChange?.(open);
|
|
258
|
+
if (open) {
|
|
259
|
+
this.panel.hidden = false;
|
|
260
|
+
const stopTracking = (0, _nepdatejs_dom.trackPosition)(this.box, this.panel, {
|
|
261
|
+
width: this.panelWidth(),
|
|
262
|
+
layout: this.options.panelLayout
|
|
263
|
+
});
|
|
264
|
+
const stopOutside = (0, _nepdatejs_dom.onOutsidePointer)([this.field, this.panel], () => {
|
|
265
|
+
this.store.actions.close();
|
|
266
|
+
});
|
|
267
|
+
const stopBackdrop = (0, _nepdatejs_dom.onBackdropPointer)(this.panel, () => {
|
|
268
|
+
this.store.actions.close();
|
|
269
|
+
});
|
|
270
|
+
const stopEscape = (0, _nepdatejs_dom.onEscape)(() => {
|
|
271
|
+
this.store.actions.close();
|
|
272
|
+
(0, _nepdatejs_dom.restoreFocus)(this.input);
|
|
273
|
+
});
|
|
274
|
+
this.closePanel = () => {
|
|
275
|
+
stopTracking();
|
|
276
|
+
stopOutside();
|
|
277
|
+
stopBackdrop();
|
|
278
|
+
stopEscape();
|
|
279
|
+
this.panel.hidden = true;
|
|
280
|
+
};
|
|
281
|
+
this.calendarView.focusGrid();
|
|
282
|
+
} else {
|
|
283
|
+
this.closePanel?.();
|
|
284
|
+
this.closePanel = null;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
remember(calendar) {
|
|
288
|
+
const key = this.options.persistCalendar;
|
|
289
|
+
if (!key) return;
|
|
290
|
+
try {
|
|
291
|
+
window.localStorage.setItem(key, calendar);
|
|
292
|
+
} catch {}
|
|
293
|
+
}
|
|
294
|
+
restoreCalendar() {
|
|
295
|
+
const key = this.options.persistCalendar;
|
|
296
|
+
if (!key) return;
|
|
297
|
+
const stored = readStorage(key);
|
|
298
|
+
if (stored === "BS" || stored === "AD") this.store.actions.switchCalendar(stored);
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
/** Only the keys the picker store understands, minus the view's own callbacks. */
|
|
302
|
+
function storeOptions(options) {
|
|
303
|
+
const out = {};
|
|
304
|
+
for (const [key, value] of Object.entries(options)) if (!VIEW_KEYS.has(key) && key !== "onChange" && key !== "onCalendarChange") out[key] = value;
|
|
305
|
+
return out;
|
|
306
|
+
}
|
|
307
|
+
function readStorage(key) {
|
|
308
|
+
try {
|
|
309
|
+
return window.localStorage.getItem(key);
|
|
310
|
+
} catch {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
//#endregion
|
|
315
|
+
//#region src/date-picker-element.ts
|
|
316
|
+
/**
|
|
317
|
+
* <nep-date-picker name="dob" min="2020-01-01"></nep-date-picker>
|
|
318
|
+
*
|
|
319
|
+
* A form-associated BS/AD date field: the form receives the AD "YYYY-MM-DD"
|
|
320
|
+
* value under `name`. Fires `change` with { value, ad, bs }, plus `nep-open`,
|
|
321
|
+
* `nep-close` and `nep-calendar-change`.
|
|
322
|
+
*/
|
|
323
|
+
var NepDatePickerElement = class extends require_registry.Base {
|
|
324
|
+
constructor() {
|
|
325
|
+
super();
|
|
326
|
+
this.view = null;
|
|
327
|
+
this.rich = {};
|
|
328
|
+
this.unsubscribe = null;
|
|
329
|
+
this.internals = typeof this.attachInternals === "function" ? this.attachInternals() : null;
|
|
330
|
+
require_registry.swallowInnerChange(this);
|
|
331
|
+
}
|
|
332
|
+
get value() {
|
|
333
|
+
return this.view?.getState().value ?? require_registry.isoOf((0, _nepdatejs_core.fromIsoDate)(this.getAttribute("value")));
|
|
334
|
+
}
|
|
335
|
+
set value(next) {
|
|
336
|
+
this.view?.store.actions.setValue(next);
|
|
337
|
+
}
|
|
338
|
+
get holidays() {
|
|
339
|
+
return this.rich.holidays;
|
|
340
|
+
}
|
|
341
|
+
set holidays(next) {
|
|
342
|
+
this.setRich({ holidays: next });
|
|
343
|
+
}
|
|
344
|
+
get events() {
|
|
345
|
+
return this.rich.events;
|
|
346
|
+
}
|
|
347
|
+
set events(next) {
|
|
348
|
+
this.setRich({ events: next });
|
|
349
|
+
}
|
|
350
|
+
get isDateDisabled() {
|
|
351
|
+
return this.rich.isDateDisabled;
|
|
352
|
+
}
|
|
353
|
+
set isDateDisabled(next) {
|
|
354
|
+
this.setRich({ isDateDisabled: next });
|
|
355
|
+
}
|
|
356
|
+
/** Shortcuts, including custom { id, label, resolve } ones. Overrides the presets attribute. */
|
|
357
|
+
get presets() {
|
|
358
|
+
return this.customPresets ?? require_registry.presetIds(this);
|
|
359
|
+
}
|
|
360
|
+
set presets(next) {
|
|
361
|
+
this.customPresets = next;
|
|
362
|
+
this.view?.setOptions({ presets: this.presets });
|
|
363
|
+
}
|
|
364
|
+
get form() {
|
|
365
|
+
return this.internals?.form ?? null;
|
|
366
|
+
}
|
|
367
|
+
get validity() {
|
|
368
|
+
return this.internals?.validity;
|
|
369
|
+
}
|
|
370
|
+
get validationMessage() {
|
|
371
|
+
return this.internals?.validationMessage ?? "";
|
|
372
|
+
}
|
|
373
|
+
checkValidity() {
|
|
374
|
+
return this.internals?.checkValidity() ?? true;
|
|
375
|
+
}
|
|
376
|
+
reportValidity() {
|
|
377
|
+
return this.internals?.reportValidity() ?? true;
|
|
378
|
+
}
|
|
379
|
+
connectedCallback() {
|
|
380
|
+
if (this.view) return;
|
|
381
|
+
const view = new DatePickerView(this, {
|
|
382
|
+
...this.readOptions(),
|
|
383
|
+
defaultValue: require_registry.str(this, "value"),
|
|
384
|
+
onChange: (value, detail) => {
|
|
385
|
+
this.dispatchEvent(new CustomEvent("change", {
|
|
386
|
+
bubbles: true,
|
|
387
|
+
detail: {
|
|
388
|
+
value,
|
|
389
|
+
ad: detail?.ad ?? null,
|
|
390
|
+
bs: detail?.bs ?? null
|
|
391
|
+
}
|
|
392
|
+
}));
|
|
393
|
+
},
|
|
394
|
+
onCalendarChange: (calendar) => {
|
|
395
|
+
this.dispatchEvent(new CustomEvent("nep-calendar-change", {
|
|
396
|
+
bubbles: true,
|
|
397
|
+
detail: { calendar }
|
|
398
|
+
}));
|
|
399
|
+
},
|
|
400
|
+
onOpenChange: (open) => {
|
|
401
|
+
this.dispatchEvent(new CustomEvent(open ? "nep-open" : "nep-close", { bubbles: true }));
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
this.view = view;
|
|
405
|
+
this.unsubscribe = view.store.subscribe(() => {
|
|
406
|
+
this.syncForm();
|
|
407
|
+
});
|
|
408
|
+
this.syncForm();
|
|
409
|
+
}
|
|
410
|
+
disconnectedCallback() {
|
|
411
|
+
this.unsubscribe?.();
|
|
412
|
+
this.view?.destroy();
|
|
413
|
+
this.view = null;
|
|
414
|
+
}
|
|
415
|
+
attributeChangedCallback(name, previous, next) {
|
|
416
|
+
if (!this.view || previous === next) return;
|
|
417
|
+
if (name === "value") this.view.store.actions.setValue(next ?? "");
|
|
418
|
+
this.view.setOptions(this.readOptions());
|
|
419
|
+
this.syncForm();
|
|
420
|
+
}
|
|
421
|
+
formResetCallback() {
|
|
422
|
+
this.view?.store.actions.reset();
|
|
423
|
+
}
|
|
424
|
+
formDisabledCallback(disabled) {
|
|
425
|
+
this.view?.setOptions({ disabled: disabled || require_registry.bool(this, "disabled") });
|
|
426
|
+
}
|
|
427
|
+
formStateRestoreCallback(state) {
|
|
428
|
+
if (typeof state === "string") this.view?.store.actions.setValue(state);
|
|
429
|
+
}
|
|
430
|
+
focus(options) {
|
|
431
|
+
this.view?.input.focus(options);
|
|
432
|
+
}
|
|
433
|
+
open() {
|
|
434
|
+
this.view?.open();
|
|
435
|
+
}
|
|
436
|
+
close() {
|
|
437
|
+
this.view?.close();
|
|
438
|
+
}
|
|
439
|
+
setRich(changes) {
|
|
440
|
+
this.rich = {
|
|
441
|
+
...this.rich,
|
|
442
|
+
...changes
|
|
443
|
+
};
|
|
444
|
+
this.view?.setOptions(changes);
|
|
445
|
+
}
|
|
446
|
+
readOptions() {
|
|
447
|
+
return {
|
|
448
|
+
...this.rich,
|
|
449
|
+
min: require_registry.str(this, "min"),
|
|
450
|
+
max: require_registry.str(this, "max"),
|
|
451
|
+
calendar: require_registry.calendarAttr(this, "calendar"),
|
|
452
|
+
defaultCalendar: require_registry.calendarAttr(this, "default-calendar"),
|
|
453
|
+
locale: require_registry.str(this, "locale"),
|
|
454
|
+
name: require_registry.str(this, "name"),
|
|
455
|
+
hiddenInput: this.internals === null,
|
|
456
|
+
placeholder: require_registry.str(this, "placeholder"),
|
|
457
|
+
required: require_registry.bool(this, "required"),
|
|
458
|
+
disabled: require_registry.bool(this, "disabled"),
|
|
459
|
+
clearable: require_registry.onUnlessFalse(this, "clearable"),
|
|
460
|
+
showEquivalent: require_registry.onUnlessFalse(this, "show-equivalent"),
|
|
461
|
+
closeOnSelect: require_registry.onUnlessFalse(this, "close-on-select"),
|
|
462
|
+
theme: require_registry.theme(this),
|
|
463
|
+
panelLayout: require_registry.panelLayout(this),
|
|
464
|
+
mask: require_registry.onUnlessFalse(this, "mask"),
|
|
465
|
+
inline: this.hasAttribute("inline"),
|
|
466
|
+
persistCalendar: require_registry.str(this, "persist-calendar"),
|
|
467
|
+
weekStartsOn: require_registry.weekday(this, "week-starts-on"),
|
|
468
|
+
displayFormat: require_registry.str(this, "display-format"),
|
|
469
|
+
ariaLabel: require_registry.str(this, "label"),
|
|
470
|
+
id: require_registry.str(this, "input-id"),
|
|
471
|
+
presets: this.presets
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
syncForm() {
|
|
475
|
+
const view = this.view;
|
|
476
|
+
if (!view || !this.internals) return;
|
|
477
|
+
const state = view.getState();
|
|
478
|
+
this.internals.setFormValue(state.value === "" ? null : state.value, state.value);
|
|
479
|
+
if (state.error) this.internals.setValidity({ customError: true }, state.error.message, view.input);
|
|
480
|
+
else if (require_registry.bool(this, "required") && state.value === "") this.internals.setValidity({ valueMissing: true }, view.input.validationMessage || "Please choose a date.", view.input);
|
|
481
|
+
else this.internals.setValidity({});
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
NepDatePickerElement.formAssociated = true;
|
|
485
|
+
NepDatePickerElement.observedAttributes = [
|
|
486
|
+
"value",
|
|
487
|
+
"min",
|
|
488
|
+
"max",
|
|
489
|
+
"calendar",
|
|
490
|
+
"default-calendar",
|
|
491
|
+
"locale",
|
|
492
|
+
"name",
|
|
493
|
+
"placeholder",
|
|
494
|
+
"required",
|
|
495
|
+
"disabled",
|
|
496
|
+
"clearable",
|
|
497
|
+
"show-equivalent",
|
|
498
|
+
"theme",
|
|
499
|
+
"panel-layout",
|
|
500
|
+
"mask",
|
|
501
|
+
"inline",
|
|
502
|
+
"persist-calendar",
|
|
503
|
+
"week-starts-on",
|
|
504
|
+
"display-format",
|
|
505
|
+
"label",
|
|
506
|
+
"close-on-select",
|
|
507
|
+
"input-id",
|
|
508
|
+
"presets"
|
|
509
|
+
];
|
|
510
|
+
//#endregion
|
|
511
|
+
//#region src/date-picker.ts
|
|
512
|
+
/** Register <nep-date-picker> (skipped if already defined). */
|
|
513
|
+
function defineDatePicker(registry) {
|
|
514
|
+
require_registry.defineElement(require_registry.ELEMENT_NAMES.datePicker, NepDatePickerElement, registry);
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Mount a date picker without custom elements.
|
|
518
|
+
*
|
|
519
|
+
* - Given a container, renders the field into it.
|
|
520
|
+
* - Given an <input>, hides it and keeps its value in step with the picker
|
|
521
|
+
* (AD "YYYY-MM-DD"), so existing forms and server code keep working.
|
|
522
|
+
*/
|
|
523
|
+
function createDatePicker(target, options = {}) {
|
|
524
|
+
const enhanced = target instanceof HTMLInputElement ? target : null;
|
|
525
|
+
let host = target;
|
|
526
|
+
if (enhanced) {
|
|
527
|
+
host = document.createElement("span");
|
|
528
|
+
enhanced.after(host);
|
|
529
|
+
enhanced.hidden = true;
|
|
530
|
+
}
|
|
531
|
+
const view = new DatePickerView(host, {
|
|
532
|
+
...enhanced ? {
|
|
533
|
+
defaultValue: enhanced.value,
|
|
534
|
+
name: void 0,
|
|
535
|
+
required: enhanced.required,
|
|
536
|
+
disabled: enhanced.disabled
|
|
537
|
+
} : {},
|
|
538
|
+
...options,
|
|
539
|
+
onChange: (value, detail) => {
|
|
540
|
+
if (enhanced) {
|
|
541
|
+
enhanced.value = value;
|
|
542
|
+
enhanced.dispatchEvent(new Event("input", { bubbles: true }));
|
|
543
|
+
enhanced.dispatchEvent(new Event("change", { bubbles: true }));
|
|
544
|
+
}
|
|
545
|
+
options.onChange?.(value, detail);
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
return {
|
|
549
|
+
view,
|
|
550
|
+
getValue: () => view.getState().value,
|
|
551
|
+
getState: () => view.getState(),
|
|
552
|
+
setValue: (value) => {
|
|
553
|
+
view.store.actions.setValue(value);
|
|
554
|
+
if (enhanced) enhanced.value = view.getState().value;
|
|
555
|
+
},
|
|
556
|
+
setOptions: (changes) => {
|
|
557
|
+
view.setOptions(changes);
|
|
558
|
+
},
|
|
559
|
+
open: () => {
|
|
560
|
+
view.open();
|
|
561
|
+
},
|
|
562
|
+
close: () => {
|
|
563
|
+
view.close();
|
|
564
|
+
},
|
|
565
|
+
destroy: () => {
|
|
566
|
+
view.destroy();
|
|
567
|
+
if (enhanced) {
|
|
568
|
+
host.remove();
|
|
569
|
+
enhanced.hidden = false;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
//#endregion
|
|
575
|
+
Object.defineProperty(exports, "DatePickerView", {
|
|
576
|
+
enumerable: true,
|
|
577
|
+
get: function() {
|
|
578
|
+
return DatePickerView;
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
Object.defineProperty(exports, "NepDatePickerElement", {
|
|
582
|
+
enumerable: true,
|
|
583
|
+
get: function() {
|
|
584
|
+
return NepDatePickerElement;
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
Object.defineProperty(exports, "createDatePicker", {
|
|
588
|
+
enumerable: true,
|
|
589
|
+
get: function() {
|
|
590
|
+
return createDatePicker;
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
Object.defineProperty(exports, "defineDatePicker", {
|
|
594
|
+
enumerable: true,
|
|
595
|
+
get: function() {
|
|
596
|
+
return defineDatePicker;
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
//# sourceMappingURL=date-picker-CQoabjlj.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|