@api-client/ui 0.5.6 → 0.5.8

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 (82) hide show
  1. package/.cursor/rules/html-and-css-best-practices.mdc +63 -0
  2. package/.cursor/rules/lit-best-practices.mdc +78 -0
  3. package/.github/instructions/html-and-css-best-practices.instructions.md +70 -0
  4. package/.github/instructions/lit-best-practices.instructions.md +86 -0
  5. package/build/src/elements/currency/currency-picker.d.ts +10 -0
  6. package/build/src/elements/currency/currency-picker.d.ts.map +1 -0
  7. package/build/src/elements/currency/currency-picker.js +27 -0
  8. package/build/src/elements/currency/currency-picker.js.map +1 -0
  9. package/build/src/elements/currency/internals/Picker.d.ts +311 -0
  10. package/build/src/elements/currency/internals/Picker.d.ts.map +1 -0
  11. package/build/src/elements/currency/internals/Picker.js +857 -0
  12. package/build/src/elements/currency/internals/Picker.js.map +1 -0
  13. package/build/src/elements/currency/internals/Picker.styles.d.ts +3 -0
  14. package/build/src/elements/currency/internals/Picker.styles.d.ts.map +1 -0
  15. package/build/src/elements/currency/internals/Picker.styles.js +58 -0
  16. package/build/src/elements/currency/internals/Picker.styles.js.map +1 -0
  17. package/build/src/elements/mention-textarea/internals/MentionTextArea.d.ts +216 -0
  18. package/build/src/elements/mention-textarea/internals/MentionTextArea.d.ts.map +1 -0
  19. package/build/src/elements/mention-textarea/internals/MentionTextArea.js +1037 -0
  20. package/build/src/elements/mention-textarea/internals/MentionTextArea.js.map +1 -0
  21. package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.d.ts +3 -0
  22. package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.d.ts.map +1 -0
  23. package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.js +274 -0
  24. package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.js.map +1 -0
  25. package/build/src/elements/mention-textarea/ui-mention-textarea.d.ts +13 -0
  26. package/build/src/elements/mention-textarea/ui-mention-textarea.d.ts.map +1 -0
  27. package/build/src/elements/mention-textarea/ui-mention-textarea.js +28 -0
  28. package/build/src/elements/mention-textarea/ui-mention-textarea.js.map +1 -0
  29. package/build/src/md/button/internals/base.d.ts +1 -0
  30. package/build/src/md/button/internals/base.d.ts.map +1 -1
  31. package/build/src/md/button/internals/base.js +7 -0
  32. package/build/src/md/button/internals/base.js.map +1 -1
  33. package/build/src/md/chip/internals/Chip.styles.d.ts.map +1 -1
  34. package/build/src/md/chip/internals/Chip.styles.js +2 -0
  35. package/build/src/md/chip/internals/Chip.styles.js.map +1 -1
  36. package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -1
  37. package/build/src/md/date-picker/internals/DatePicker.styles.js +73 -0
  38. package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -1
  39. package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +164 -51
  40. package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -1
  41. package/build/src/md/date-picker/internals/DatePickerCalendar.js +660 -368
  42. package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -1
  43. package/build/src/md/date-picker/ui-date-picker-input.d.ts +65 -13
  44. package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -1
  45. package/build/src/md/date-picker/ui-date-picker-input.js +143 -76
  46. package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -1
  47. package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +76 -17
  48. package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -1
  49. package/build/src/md/date-picker/ui-date-picker-modal-input.js +192 -127
  50. package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -1
  51. package/build/src/md/date-picker/ui-date-picker-modal.d.ts +63 -15
  52. package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -1
  53. package/build/src/md/date-picker/ui-date-picker-modal.js +143 -64
  54. package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -1
  55. package/demo/elements/currency/index.html +91 -0
  56. package/demo/elements/currency/index.ts +272 -0
  57. package/demo/elements/index.html +6 -0
  58. package/demo/elements/mention-textarea/index.html +19 -0
  59. package/demo/elements/mention-textarea/index.ts +205 -0
  60. package/demo/md/date-picker/date-picker.ts +138 -103
  61. package/package.json +2 -2
  62. package/src/elements/currency/currency-picker.ts +14 -0
  63. package/src/elements/currency/internals/Picker.styles.ts +58 -0
  64. package/src/elements/currency/internals/Picker.ts +846 -0
  65. package/src/elements/mention-textarea/internals/MentionTextArea.styles.ts +274 -0
  66. package/src/elements/mention-textarea/internals/MentionTextArea.ts +1036 -0
  67. package/src/elements/mention-textarea/ui-mention-textarea.ts +18 -0
  68. package/src/md/button/internals/base.ts +7 -0
  69. package/src/md/chip/internals/Chip.styles.ts +2 -0
  70. package/src/md/date-picker/internals/DatePicker.styles.ts +73 -0
  71. package/src/md/date-picker/internals/DatePickerCalendar.ts +643 -309
  72. package/src/md/date-picker/ui-date-picker-input.ts +110 -49
  73. package/src/md/date-picker/ui-date-picker-modal-input.ts +168 -99
  74. package/src/md/date-picker/ui-date-picker-modal.ts +136 -53
  75. package/test/README.md +3 -2
  76. package/test/elements/currency/CurrencyPicker.accessibility.test.ts +328 -0
  77. package/test/elements/currency/CurrencyPicker.core.test.ts +318 -0
  78. package/test/elements/currency/CurrencyPicker.integration.test.ts +482 -0
  79. package/test/elements/currency/CurrencyPicker.test.ts +486 -0
  80. package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +63 -0
  81. package/test/elements/mention-textarea/MentionTextArea.test.ts +321 -0
  82. package/tsconfig.json +1 -1
@@ -10,16 +10,63 @@ import '../../md/text-field/ui-outlined-text-field.js';
10
10
  import '../../md/icons/ui-icon.js';
11
11
  /**
12
12
  * A modal date input picker for manual date entry using keyboard.
13
- * Ideal for compact layouts and precise date entry.
13
+ * Ideal for compact layouts and precise date entry. Supports both single
14
+ * date selection and date range selection modes.
15
+ *
16
+ * ## Features
17
+ * - Manual date entry with keyboard input
18
+ * - Single date and date range modes
19
+ * - Input validation with error messages
20
+ * - Min/max date constraints
21
+ * - Multiple date format support (MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD)
22
+ * - Accessible design with proper ARIA labels and semantic HTML
23
+ * - Real-time validation feedback
24
+ *
25
+ * ## Events
26
+ *
27
+ * ### `date-input-change`
28
+ * Fired when a valid date is entered in the input fields.
29
+ *
30
+ * **Detail for range mode:**
31
+ * ```typescript
32
+ * {
33
+ * range: DateRange,
34
+ * formattedRange: {
35
+ * start: string | null,
36
+ * end: string | null
37
+ * }
38
+ * }
39
+ * ```
40
+ *
41
+ * **Detail for single date mode:**
42
+ * ```typescript
43
+ * {
44
+ * date: Date,
45
+ * formattedDate: string
46
+ * }
47
+ * ```
48
+ *
49
+ * ### `modal-input-close`
50
+ * Fired when the modal is closed, either by confirmation or cancellation.
51
+ *
52
+ * **Detail:**
53
+ * ```typescript
54
+ * {
55
+ * confirmed: boolean,
56
+ * date?: Date | null, // Available in single date mode
57
+ * range?: DateRange | null // Available in range mode
58
+ * }
59
+ * ```
14
60
  *
15
61
  * ## Usage
16
62
  *
63
+ * ### Range mode (default)
17
64
  * ```html
18
65
  * <ui-date-picker-modal-input
19
66
  * .open=${true}
20
67
  * .selectedRange=${{ start: new Date(), end: null }}
21
68
  * @date-input-change=${this.handleRangeChange}
22
- * @close=${this.handleClose}
69
+ * @modal-input-close=${this.handleClose}
23
70
  * ></ui-date-picker-modal-input>
24
71
  * ```
25
72
  *
@@ -28,6 +75,17 @@ import '../../md/icons/ui-icon.js';
28
75
  * <ui-date-picker-modal-input
29
76
  * .rangeMode=${false}
30
77
  * .selectedDate=${new Date()}
78
+ * @date-input-change=${this.handleDateChange}
79
+ * @modal-input-close=${this.handleClose}
80
+ * ></ui-date-picker-modal-input>
81
+ * ```
82
+ *
83
+ * ### With constraints
84
+ * ```html
85
+ * <ui-date-picker-modal-input
86
+ * .minDate=${new Date('2024-01-01')}
87
+ * .maxDate=${new Date('2024-12-31')}
88
+ * .locale=${'en-US'}
31
89
  * ></ui-date-picker-modal-input>
32
90
  * ```
33
91
  */
@@ -70,18 +128,18 @@ let UiDatePickerModalInput = (() => {
70
128
  let _locale_decorators;
71
129
  let _locale_initializers = [];
72
130
  let _locale_extraInitializers = [];
73
- let __startInput_decorators;
74
- let __startInput_initializers = [];
75
- let __startInput_extraInitializers = [];
76
- let __endInput_decorators;
77
- let __endInput_initializers = [];
78
- let __endInput_extraInitializers = [];
79
- let __startError_decorators;
80
- let __startError_initializers = [];
81
- let __startError_extraInitializers = [];
82
- let __endError_decorators;
83
- let __endError_initializers = [];
84
- let __endError_extraInitializers = [];
131
+ let _startInput_decorators;
132
+ let _startInput_initializers = [];
133
+ let _startInput_extraInitializers = [];
134
+ let _endInput_decorators;
135
+ let _endInput_initializers = [];
136
+ let _endInput_extraInitializers = [];
137
+ let _startError_decorators;
138
+ let _startError_initializers = [];
139
+ let _startError_extraInitializers = [];
140
+ let _endError_decorators;
141
+ let _endError_initializers = [];
142
+ let _endError_extraInitializers = [];
85
143
  var UiDatePickerModalInput = class extends _classSuper {
86
144
  static { _classThis = this; }
87
145
  static {
@@ -97,10 +155,10 @@ let UiDatePickerModalInput = (() => {
97
155
  _minDate_decorators = [property({ type: Object })];
98
156
  _maxDate_decorators = [property({ type: Object })];
99
157
  _locale_decorators = [property({ type: String })];
100
- __startInput_decorators = [state()];
101
- __endInput_decorators = [state()];
102
- __startError_decorators = [state()];
103
- __endError_decorators = [state()];
158
+ _startInput_decorators = [state()];
159
+ _endInput_decorators = [state()];
160
+ _startError_decorators = [state()];
161
+ _endError_decorators = [state()];
104
162
  __esDecorate(this, null, _open_decorators, { kind: "accessor", name: "open", static: false, private: false, access: { has: obj => "open" in obj, get: obj => obj.open, set: (obj, value) => { obj.open = value; } }, metadata: _metadata }, _open_initializers, _open_extraInitializers);
105
163
  __esDecorate(this, null, _title_decorators, { kind: "accessor", name: "title", static: false, private: false, access: { has: obj => "title" in obj, get: obj => obj.title, set: (obj, value) => { obj.title = value; } }, metadata: _metadata }, _title_initializers, _title_extraInitializers);
106
164
  __esDecorate(this, null, _rangeMode_decorators, { kind: "accessor", name: "rangeMode", static: false, private: false, access: { has: obj => "rangeMode" in obj, get: obj => obj.rangeMode, set: (obj, value) => { obj.rangeMode = value; } }, metadata: _metadata }, _rangeMode_initializers, _rangeMode_extraInitializers);
@@ -112,10 +170,10 @@ let UiDatePickerModalInput = (() => {
112
170
  __esDecorate(this, null, _minDate_decorators, { kind: "accessor", name: "minDate", static: false, private: false, access: { has: obj => "minDate" in obj, get: obj => obj.minDate, set: (obj, value) => { obj.minDate = value; } }, metadata: _metadata }, _minDate_initializers, _minDate_extraInitializers);
113
171
  __esDecorate(this, null, _maxDate_decorators, { kind: "accessor", name: "maxDate", static: false, private: false, access: { has: obj => "maxDate" in obj, get: obj => obj.maxDate, set: (obj, value) => { obj.maxDate = value; } }, metadata: _metadata }, _maxDate_initializers, _maxDate_extraInitializers);
114
172
  __esDecorate(this, null, _locale_decorators, { kind: "accessor", name: "locale", static: false, private: false, access: { has: obj => "locale" in obj, get: obj => obj.locale, set: (obj, value) => { obj.locale = value; } }, metadata: _metadata }, _locale_initializers, _locale_extraInitializers);
115
- __esDecorate(this, null, __startInput_decorators, { kind: "accessor", name: "_startInput", static: false, private: false, access: { has: obj => "_startInput" in obj, get: obj => obj._startInput, set: (obj, value) => { obj._startInput = value; } }, metadata: _metadata }, __startInput_initializers, __startInput_extraInitializers);
116
- __esDecorate(this, null, __endInput_decorators, { kind: "accessor", name: "_endInput", static: false, private: false, access: { has: obj => "_endInput" in obj, get: obj => obj._endInput, set: (obj, value) => { obj._endInput = value; } }, metadata: _metadata }, __endInput_initializers, __endInput_extraInitializers);
117
- __esDecorate(this, null, __startError_decorators, { kind: "accessor", name: "_startError", static: false, private: false, access: { has: obj => "_startError" in obj, get: obj => obj._startError, set: (obj, value) => { obj._startError = value; } }, metadata: _metadata }, __startError_initializers, __startError_extraInitializers);
118
- __esDecorate(this, null, __endError_decorators, { kind: "accessor", name: "_endError", static: false, private: false, access: { has: obj => "_endError" in obj, get: obj => obj._endError, set: (obj, value) => { obj._endError = value; } }, metadata: _metadata }, __endError_initializers, __endError_extraInitializers);
173
+ __esDecorate(this, null, _startInput_decorators, { kind: "accessor", name: "startInput", static: false, private: false, access: { has: obj => "startInput" in obj, get: obj => obj.startInput, set: (obj, value) => { obj.startInput = value; } }, metadata: _metadata }, _startInput_initializers, _startInput_extraInitializers);
174
+ __esDecorate(this, null, _endInput_decorators, { kind: "accessor", name: "endInput", static: false, private: false, access: { has: obj => "endInput" in obj, get: obj => obj.endInput, set: (obj, value) => { obj.endInput = value; } }, metadata: _metadata }, _endInput_initializers, _endInput_extraInitializers);
175
+ __esDecorate(this, null, _startError_decorators, { kind: "accessor", name: "startError", static: false, private: false, access: { has: obj => "startError" in obj, get: obj => obj.startError, set: (obj, value) => { obj.startError = value; } }, metadata: _metadata }, _startError_initializers, _startError_extraInitializers);
176
+ __esDecorate(this, null, _endError_decorators, { kind: "accessor", name: "endError", static: false, private: false, access: { has: obj => "endError" in obj, get: obj => obj.endError, set: (obj, value) => { obj.endError = value; } }, metadata: _metadata }, _endError_initializers, _endError_extraInitializers);
119
177
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
120
178
  UiDatePickerModalInput = _classThis = _classDescriptor.value;
121
179
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -141,7 +199,7 @@ let UiDatePickerModalInput = (() => {
141
199
  */
142
200
  get title() { return this.#title_accessor_storage; }
143
201
  set title(value) { this.#title_accessor_storage = value; }
144
- #rangeMode_accessor_storage = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _rangeMode_initializers, true
202
+ #rangeMode_accessor_storage = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _rangeMode_initializers, false
145
203
  /**
146
204
  * Label for the start date (or single date)
147
205
  */
@@ -227,37 +285,44 @@ let UiDatePickerModalInput = (() => {
227
285
  */
228
286
  get locale() { return this.#locale_accessor_storage; }
229
287
  set locale(value) { this.#locale_accessor_storage = value; }
230
- #_startInput_accessor_storage = (__runInitializers(this, _locale_extraInitializers), __runInitializers(this, __startInput_initializers, ''));
231
- get _startInput() { return this.#_startInput_accessor_storage; }
232
- set _startInput(value) { this.#_startInput_accessor_storage = value; }
233
- #_endInput_accessor_storage = (__runInitializers(this, __startInput_extraInitializers), __runInitializers(this, __endInput_initializers, ''));
234
- get _endInput() { return this.#_endInput_accessor_storage; }
235
- set _endInput(value) { this.#_endInput_accessor_storage = value; }
236
- #_startError_accessor_storage = (__runInitializers(this, __endInput_extraInitializers), __runInitializers(this, __startError_initializers, ''));
237
- get _startError() { return this.#_startError_accessor_storage; }
238
- set _startError(value) { this.#_startError_accessor_storage = value; }
239
- #_endError_accessor_storage = (__runInitializers(this, __startError_extraInitializers), __runInitializers(this, __endError_initializers, ''));
240
- get _endError() { return this.#_endError_accessor_storage; }
241
- set _endError(value) { this.#_endError_accessor_storage = value; }
288
+ #startInput_accessor_storage = (__runInitializers(this, _locale_extraInitializers), __runInitializers(this, _startInput_initializers, ''));
289
+ get startInput() { return this.#startInput_accessor_storage; }
290
+ set startInput(value) { this.#startInput_accessor_storage = value; }
291
+ #endInput_accessor_storage = (__runInitializers(this, _startInput_extraInitializers), __runInitializers(this, _endInput_initializers, ''));
292
+ get endInput() { return this.#endInput_accessor_storage; }
293
+ set endInput(value) { this.#endInput_accessor_storage = value; }
294
+ #startError_accessor_storage = (__runInitializers(this, _endInput_extraInitializers), __runInitializers(this, _startError_initializers, ''));
295
+ get startError() { return this.#startError_accessor_storage; }
296
+ set startError(value) { this.#startError_accessor_storage = value; }
297
+ #endError_accessor_storage = (__runInitializers(this, _startError_extraInitializers), __runInitializers(this, _endError_initializers, ''));
298
+ get endError() { return this.#endError_accessor_storage; }
299
+ set endError(value) { this.#endError_accessor_storage = value; }
300
+ constructor() {
301
+ super();
302
+ __runInitializers(this, _endError_extraInitializers);
303
+ // Initialize boolean properties to false first, then set intended defaults
304
+ this.open = false;
305
+ this.rangeMode = true; // Default to range mode as documented
306
+ }
242
307
  connectedCallback() {
243
308
  super.connectedCallback();
244
- this._updateInputValues();
309
+ this.updateInputValues();
245
310
  }
246
311
  willUpdate(changedProperties) {
247
312
  if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {
248
- this._updateInputValues();
313
+ this.updateInputValues();
249
314
  }
250
315
  }
251
- _updateInputValues() {
316
+ updateInputValues() {
252
317
  if (this.rangeMode && this.selectedRange) {
253
- this._startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : '';
254
- this._endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : '';
318
+ this.startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : '';
319
+ this.endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : '';
255
320
  }
256
321
  else if (!this.rangeMode && this.selectedDate) {
257
- this._startInput = formatDate(this.selectedDate, this.locale);
322
+ this.startInput = formatDate(this.selectedDate, this.locale);
258
323
  }
259
324
  }
260
- _validateDate(dateString, isEndDate = false) {
325
+ validateDate(dateString, isEndDate = false) {
261
326
  if (!dateString.trim())
262
327
  return null;
263
328
  const parsedDate = parseDate(dateString);
@@ -270,20 +335,20 @@ let UiDatePickerModalInput = (() => {
270
335
  return null;
271
336
  // For range mode, validate end date is after start date
272
337
  if (this.rangeMode && isEndDate) {
273
- const startDate = parseDate(this._startInput);
338
+ const startDate = parseDate(this.startInput);
274
339
  if (startDate && parsedDate < startDate)
275
340
  return null;
276
341
  }
277
342
  return parsedDate;
278
343
  }
279
- _handleStartInput(event) {
344
+ handleStartInput(event) {
280
345
  const target = event.target;
281
- this._startInput = target.value;
282
- this._startError = '';
283
- if (this._startInput.trim()) {
284
- const date = this._validateDate(this._startInput);
346
+ this.startInput = target.value;
347
+ this.startError = '';
348
+ if (this.startInput.trim()) {
349
+ const date = this.validateDate(this.startInput);
285
350
  if (!date) {
286
- this._startError = 'Invalid date format or out of range';
351
+ this.startError = 'Invalid date format or out of range';
287
352
  return;
288
353
  }
289
354
  if (this.rangeMode) {
@@ -293,63 +358,63 @@ let UiDatePickerModalInput = (() => {
293
358
  else {
294
359
  this.selectedDate = date;
295
360
  }
296
- this._dispatchChangeEvent();
361
+ this.dispatchChangeEvent();
297
362
  }
298
363
  }
299
- _handleEndInput(event) {
364
+ handleEndInput(event) {
300
365
  const target = event.target;
301
- this._endInput = target.value;
302
- this._endError = '';
303
- if (this._endInput.trim()) {
304
- const date = this._validateDate(this._endInput, true);
366
+ this.endInput = target.value;
367
+ this.endError = '';
368
+ if (this.endInput.trim()) {
369
+ const date = this.validateDate(this.endInput, true);
305
370
  if (!date) {
306
- this._endError = 'Invalid date format, out of range, or before start date';
371
+ this.endError = 'Invalid date format, out of range, or before start date';
307
372
  return;
308
373
  }
309
374
  const currentRange = this.selectedRange || { start: null, end: null };
310
375
  this.selectedRange = { ...currentRange, end: date };
311
- this._dispatchChangeEvent();
376
+ this.dispatchChangeEvent();
312
377
  }
313
378
  }
314
- _handleCancel() {
315
- this._dispatchCloseEvent(false);
379
+ handleCancel() {
380
+ this.dispatchCloseEvent(false);
316
381
  }
317
- _handleConfirm() {
382
+ handleConfirm() {
318
383
  // Validate all inputs before confirming
319
384
  let hasErrors = false;
320
385
  if (this.rangeMode) {
321
- if (!this._startInput.trim()) {
322
- this._startError = 'Start date is required';
386
+ if (!this.startInput.trim()) {
387
+ this.startError = 'Start date is required';
323
388
  hasErrors = true;
324
389
  }
325
- else if (!this._validateDate(this._startInput)) {
326
- this._startError = 'Invalid start date';
390
+ else if (!this.validateDate(this.startInput)) {
391
+ this.startError = 'Invalid start date';
327
392
  hasErrors = true;
328
393
  }
329
- if (!this._endInput.trim()) {
330
- this._endError = 'End date is required';
394
+ if (!this.endInput.trim()) {
395
+ this.endError = 'End date is required';
331
396
  hasErrors = true;
332
397
  }
333
- else if (!this._validateDate(this._endInput, true)) {
334
- this._endError = 'Invalid end date';
398
+ else if (!this.validateDate(this.endInput, true)) {
399
+ this.endError = 'Invalid end date';
335
400
  hasErrors = true;
336
401
  }
337
402
  }
338
403
  else {
339
- if (!this._startInput.trim()) {
340
- this._startError = 'Date is required';
404
+ if (!this.startInput.trim()) {
405
+ this.startError = 'Date is required';
341
406
  hasErrors = true;
342
407
  }
343
- else if (!this._validateDate(this._startInput)) {
344
- this._startError = 'Invalid date';
408
+ else if (!this.validateDate(this.startInput)) {
409
+ this.startError = 'Invalid date';
345
410
  hasErrors = true;
346
411
  }
347
412
  }
348
413
  if (!hasErrors) {
349
- this._dispatchCloseEvent(true);
414
+ this.dispatchCloseEvent(true);
350
415
  }
351
416
  }
352
- _dispatchChangeEvent() {
417
+ dispatchChangeEvent() {
353
418
  if (this.rangeMode && this.selectedRange) {
354
419
  const event = {
355
420
  range: this.selectedRange,
@@ -375,7 +440,7 @@ let UiDatePickerModalInput = (() => {
375
440
  }));
376
441
  }
377
442
  }
378
- _dispatchCloseEvent(confirmed) {
443
+ dispatchCloseEvent(confirmed) {
379
444
  this.dispatchEvent(new CustomEvent('modal-input-close', {
380
445
  detail: {
381
446
  confirmed,
@@ -386,83 +451,83 @@ let UiDatePickerModalInput = (() => {
386
451
  composed: true,
387
452
  }));
388
453
  }
389
- _renderHeader() {
454
+ renderHeader() {
390
455
  return html `
391
- <div class="modal-header">
392
- <h2 class="modal-title">${this.title}</h2>
393
- <ui-icon-button @click=${this._handleCancel} aria-label="Close" title="Close">
456
+ <header class="modal-header">
457
+ <h2 id="modal-title" class="modal-title">${this.title}</h2>
458
+ <ui-icon-button @click=${this.handleCancel} aria-label="Close" title="Close">
394
459
  <ui-icon icon="close"></ui-icon>
395
460
  </ui-icon-button>
396
- </div>
461
+ </header>
397
462
  `;
398
463
  }
399
- _renderInputs() {
464
+ renderInputs() {
400
465
  return html `
401
- <div class="modal-content">
402
- <div style="display: flex; flex-direction: column; gap: 16px; width: 100%; max-width: 400px;">
403
- <ui-outlined-text-field
404
- .label=${this.rangeMode ? this.startLabel : 'Date'}
405
- .placeholder=${this.placeholder}
406
- .value=${this._startInput}
407
- .errorMessage=${this._startError}
408
- .error=${!!this._startError}
409
- @input=${this._handleStartInput}
410
- >
411
- <ui-icon slot="trailing-icon" icon="calendarToday"></ui-icon>
412
- </ui-outlined-text-field>
466
+ <main class="modal-content">
467
+ <div class="input-container" role="form" aria-labelledby="modal-title">
468
+ <fieldset>
469
+ <legend class="visually-hidden">${this.rangeMode ? 'Enter date range' : 'Enter date'}</legend>
470
+
471
+ <ui-outlined-text-field
472
+ .label=${this.rangeMode ? this.startLabel : 'Date'}
473
+ .placeholder=${this.placeholder}
474
+ .value=${this.startInput}
475
+ .invalidText=${this.startError}
476
+ ?invalid=${!!this.startError}
477
+ @input=${this.handleStartInput}
478
+ required
479
+ aria-describedby="format-help"
480
+ >
481
+ <ui-icon slot="suffix" icon="calendarToday"></ui-icon>
482
+ </ui-outlined-text-field>
413
483
 
414
- ${this.rangeMode
484
+ ${this.rangeMode
415
485
  ? html `
416
- <ui-outlined-text-field
417
- .label=${this.endLabel}
418
- .placeholder=${this.placeholder}
419
- .value=${this._endInput}
420
- .errorMessage=${this._endError}
421
- .error=${!!this._endError}
422
- @input=${this._handleEndInput}
423
- >
424
- <ui-icon slot="trailing-icon" icon="calendarToday"></ui-icon>
425
- </ui-outlined-text-field>
426
- `
486
+ <ui-outlined-text-field
487
+ .label=${this.endLabel}
488
+ .placeholder=${this.placeholder}
489
+ .value=${this.endInput}
490
+ .invalidText=${this.endError}
491
+ ?invalid=${!!this.endError}
492
+ @input=${this.handleEndInput}
493
+ required
494
+ aria-describedby="format-help"
495
+ >
496
+ <ui-icon slot="suffix" icon="calendarToday"></ui-icon>
497
+ </ui-outlined-text-field>
498
+ `
427
499
  : ''}
500
+ </fieldset>
428
501
 
429
- <div
430
- style="margin-top: 16px; padding: 16px; background: var(--ui-color-surface-variant, #e7e0ec); border-radius: 12px;"
431
- >
432
- <p style="margin: 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);">
502
+ <aside id="format-help" class="format-help" role="note" aria-label="Date format information">
503
+ <p class="help-title">
433
504
  <strong>Supported formats:</strong><br />
434
505
  MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD
435
506
  </p>
436
- <p style="margin: 8px 0 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);">
437
- <strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25
438
- </p>
439
- </div>
507
+ <p class="help-examples"><strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25</p>
508
+ </aside>
440
509
  </div>
441
- </div>
510
+ </main>
442
511
  `;
443
512
  }
444
- _renderActions() {
513
+ renderActions() {
445
514
  const hasValidInput = this.rangeMode
446
- ? this._startInput.trim() && this._endInput.trim() && !this._startError && !this._endError
447
- : this._startInput.trim() && !this._startError;
515
+ ? this.startInput.trim() && this.endInput.trim() && !this.startError && !this.endError
516
+ : this.startInput.trim() && !this.startError;
448
517
  return html `
449
- <div class="modal-actions">
450
- <ui-button color="text" @click=${this._handleCancel}>Cancel</ui-button>
451
- <ui-button color="filled" @click=${this._handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>
452
- </div>
518
+ <footer class="modal-actions">
519
+ <ui-button color="text" @click=${this.handleCancel}>Cancel</ui-button>
520
+ <ui-button color="filled" @click=${this.handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>
521
+ </footer>
453
522
  `;
454
523
  }
455
524
  render() {
456
525
  return html `
457
- <ui-dialog .open=${this.open} @close=${this._handleCancel}>
458
- ${this._renderHeader()} ${this._renderInputs()} ${this._renderActions()}
526
+ <ui-dialog .open=${this.open} @close=${this.handleCancel}>
527
+ ${this.renderHeader()} ${this.renderInputs()} ${this.renderActions()}
459
528
  </ui-dialog>
460
529
  `;
461
530
  }
462
- constructor() {
463
- super(...arguments);
464
- __runInitializers(this, __endError_extraInitializers);
465
- }
466
531
  static {
467
532
  __runInitializers(_classThis, _classExtraInitializers);
468
533
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ui-date-picker-modal-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { modalStyles } from './internals/DatePicker.styles.js'\nimport { DateRange, formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport '../../md/dialog/ui-dialog.js'\nimport '../../md/button/ui-button.js'\nimport '../../md/icon-button/ui-icon-button.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\nexport interface ModalInputDatePickerChangeEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * A modal date input picker for manual date entry using keyboard.\n * Ideal for compact layouts and precise date entry.\n *\n * ## Usage\n *\n * ```html\n * <ui-date-picker-modal-input\n * .open=${true}\n * .selectedRange=${{ start: new Date(), end: null }}\n * @date-input-change=${this.handleRangeChange}\n * @close=${this.handleClose}\n * ></ui-date-picker-modal-input>\n * ```\n *\n * ### Single date mode\n * ```html\n * <ui-date-picker-modal-input\n * .rangeMode=${false}\n * .selectedDate=${new Date()}\n * ></ui-date-picker-modal-input>\n * ```\n */\n@customElement('ui-date-picker-modal-input')\nexport class UiDatePickerModalInput extends LitElement {\n static override styles = modalStyles\n\n /**\n * Whether the modal is open\n */\n @property({ type: Boolean }) accessor open = false\n\n /**\n * The modal title\n */\n @property({ type: String }) override accessor title = 'Enter dates'\n\n /**\n * Whether to use range mode (two date inputs) or single date mode\n */\n @property({ type: Boolean }) accessor rangeMode = true\n\n /**\n * Label for the start date (or single date)\n */\n @property({ type: String }) accessor startLabel = 'Start date'\n\n /**\n * Label for the end date (only used in range mode)\n */\n @property({ type: String }) accessor endLabel = 'End date'\n\n /**\n * Placeholder for date inputs\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The selected date (single mode)\n */\n @property({ type: Object }) accessor selectedDate: Date | null = null\n\n /**\n * The selected date range (range mode)\n */\n @property({ type: Object }) accessor selectedRange: DateRange | null = null\n\n /**\n * Minimum selectable date\n */\n @property({ type: Object }) accessor minDate: Date | undefined = undefined\n\n /**\n * Maximum selectable date\n */\n @property({ type: Object }) accessor maxDate: Date | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n @state() private accessor _startInput = ''\n\n @state() private accessor _endInput = ''\n\n @state() private accessor _startError = ''\n\n @state() private accessor _endError = ''\n\n override connectedCallback(): void {\n super.connectedCallback()\n this._updateInputValues()\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {\n this._updateInputValues()\n }\n }\n\n private _updateInputValues(): void {\n if (this.rangeMode && this.selectedRange) {\n this._startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : ''\n this._endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : ''\n } else if (!this.rangeMode && this.selectedDate) {\n this._startInput = formatDate(this.selectedDate, this.locale)\n }\n }\n\n private _validateDate(dateString: string, isEndDate = false): Date | null {\n if (!dateString.trim()) return null\n\n const parsedDate = parseDate(dateString)\n if (!parsedDate) return null\n\n // Check min/max constraints\n if (this.minDate && parsedDate < this.minDate) return null\n if (this.maxDate && parsedDate > this.maxDate) return null\n\n // For range mode, validate end date is after start date\n if (this.rangeMode && isEndDate) {\n const startDate = parseDate(this._startInput)\n if (startDate && parsedDate < startDate) return null\n }\n\n return parsedDate\n }\n\n private _handleStartInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this._startInput = target.value\n this._startError = ''\n\n if (this._startInput.trim()) {\n const date = this._validateDate(this._startInput)\n if (!date) {\n this._startError = 'Invalid date format or out of range'\n return\n }\n\n if (this.rangeMode) {\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, start: date }\n } else {\n this.selectedDate = date\n }\n\n this._dispatchChangeEvent()\n }\n }\n\n private _handleEndInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this._endInput = target.value\n this._endError = ''\n\n if (this._endInput.trim()) {\n const date = this._validateDate(this._endInput, true)\n if (!date) {\n this._endError = 'Invalid date format, out of range, or before start date'\n return\n }\n\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, end: date }\n this._dispatchChangeEvent()\n }\n }\n\n private _handleCancel(): void {\n this._dispatchCloseEvent(false)\n }\n\n private _handleConfirm(): void {\n // Validate all inputs before confirming\n let hasErrors = false\n\n if (this.rangeMode) {\n if (!this._startInput.trim()) {\n this._startError = 'Start date is required'\n hasErrors = true\n } else if (!this._validateDate(this._startInput)) {\n this._startError = 'Invalid start date'\n hasErrors = true\n }\n\n if (!this._endInput.trim()) {\n this._endError = 'End date is required'\n hasErrors = true\n } else if (!this._validateDate(this._endInput, true)) {\n this._endError = 'Invalid end date'\n hasErrors = true\n }\n } else {\n if (!this._startInput.trim()) {\n this._startError = 'Date is required'\n hasErrors = true\n } else if (!this._validateDate(this._startInput)) {\n this._startError = 'Invalid date'\n hasErrors = true\n }\n }\n\n if (!hasErrors) {\n this._dispatchCloseEvent(true)\n }\n }\n\n private _dispatchChangeEvent(): void {\n if (this.rangeMode && this.selectedRange) {\n const event: ModalInputDatePickerChangeEvent = {\n range: this.selectedRange,\n formattedRange: {\n start: this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : null,\n end: this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : null,\n },\n }\n\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n } else if (!this.rangeMode && this.selectedDate) {\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: {\n date: this.selectedDate,\n formattedDate: formatDate(this.selectedDate, this.locale),\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n }\n\n private _dispatchCloseEvent(confirmed: boolean): void {\n this.dispatchEvent(\n new CustomEvent('modal-input-close', {\n detail: {\n confirmed,\n date: confirmed && !this.rangeMode ? this.selectedDate : null,\n range: confirmed && this.rangeMode ? this.selectedRange : null,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private _renderHeader(): TemplateResult {\n return html`\n <div class=\"modal-header\">\n <h2 class=\"modal-title\">${this.title}</h2>\n <ui-icon-button @click=${this._handleCancel} aria-label=\"Close\" title=\"Close\">\n <ui-icon icon=\"close\"></ui-icon>\n </ui-icon-button>\n </div>\n `\n }\n\n private _renderInputs(): TemplateResult {\n return html`\n <div class=\"modal-content\">\n <div style=\"display: flex; flex-direction: column; gap: 16px; width: 100%; max-width: 400px;\">\n <ui-outlined-text-field\n .label=${this.rangeMode ? this.startLabel : 'Date'}\n .placeholder=${this.placeholder}\n .value=${this._startInput}\n .errorMessage=${this._startError}\n .error=${!!this._startError}\n @input=${this._handleStartInput}\n >\n <ui-icon slot=\"trailing-icon\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n\n ${this.rangeMode\n ? html`\n <ui-outlined-text-field\n .label=${this.endLabel}\n .placeholder=${this.placeholder}\n .value=${this._endInput}\n .errorMessage=${this._endError}\n .error=${!!this._endError}\n @input=${this._handleEndInput}\n >\n <ui-icon slot=\"trailing-icon\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n `\n : ''}\n\n <div\n style=\"margin-top: 16px; padding: 16px; background: var(--ui-color-surface-variant, #e7e0ec); border-radius: 12px;\"\n >\n <p style=\"margin: 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);\">\n <strong>Supported formats:</strong><br />\n MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD\n </p>\n <p style=\"margin: 8px 0 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);\">\n <strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25\n </p>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderActions(): TemplateResult {\n const hasValidInput = this.rangeMode\n ? this._startInput.trim() && this._endInput.trim() && !this._startError && !this._endError\n : this._startInput.trim() && !this._startError\n\n return html`\n <div class=\"modal-actions\">\n <ui-button color=\"text\" @click=${this._handleCancel}>Cancel</ui-button>\n <ui-button color=\"filled\" @click=${this._handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>\n </div>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <ui-dialog .open=${this.open} @close=${this._handleCancel}>\n ${this._renderHeader()} ${this._renderInputs()} ${this._renderActions()}\n </ui-dialog>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-modal-input': UiDatePickerModalInput\n }\n\n interface HTMLElementEventMap {\n 'date-input-change': CustomEvent<\n | ModalInputDatePickerChangeEvent\n | {\n date: Date\n formattedDate: string\n }\n >\n 'modal-input-close': CustomEvent<{\n confirmed: boolean\n date?: Date | null\n range?: DateRange | null\n }>\n }\n}\n"]}
1
+ {"version":3,"file":"ui-date-picker-modal-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { modalStyles } from './internals/DatePicker.styles.js'\nimport { DateRange, formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport '../../md/dialog/ui-dialog.js'\nimport '../../md/button/ui-button.js'\nimport '../../md/icon-button/ui-icon-button.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\nexport interface ModalInputDatePickerChangeEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * A modal date input picker for manual date entry using keyboard.\n * Ideal for compact layouts and precise date entry. Supports both single\n * date selection and date range selection modes.\n *\n * ## Features\n * - Manual date entry with keyboard input\n * - Single date and date range modes\n * - Input validation with error messages\n * - Min/max date constraints\n * - Multiple date format support (MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD)\n * - Accessible design with proper ARIA labels and semantic HTML\n * - Real-time validation feedback\n *\n * ## Events\n *\n * ### `date-input-change`\n * Fired when a valid date is entered in the input fields.\n *\n * **Detail for range mode:**\n * ```typescript\n * {\n * range: DateRange,\n * formattedRange: {\n * start: string | null,\n * end: string | null\n * }\n * }\n * ```\n *\n * **Detail for single date mode:**\n * ```typescript\n * {\n * date: Date,\n * formattedDate: string\n * }\n * ```\n *\n * ### `modal-input-close`\n * Fired when the modal is closed, either by confirmation or cancellation.\n *\n * **Detail:**\n * ```typescript\n * {\n * confirmed: boolean,\n * date?: Date | null, // Available in single date mode\n * range?: DateRange | null // Available in range mode\n * }\n * ```\n *\n * ## Usage\n *\n * ### Range mode (default)\n * ```html\n * <ui-date-picker-modal-input\n * .open=${true}\n * .selectedRange=${{ start: new Date(), end: null }}\n * @date-input-change=${this.handleRangeChange}\n * @modal-input-close=${this.handleClose}\n * ></ui-date-picker-modal-input>\n * ```\n *\n * ### Single date mode\n * ```html\n * <ui-date-picker-modal-input\n * .rangeMode=${false}\n * .selectedDate=${new Date()}\n * @date-input-change=${this.handleDateChange}\n * @modal-input-close=${this.handleClose}\n * ></ui-date-picker-modal-input>\n * ```\n *\n * ### With constraints\n * ```html\n * <ui-date-picker-modal-input\n * .minDate=${new Date('2024-01-01')}\n * .maxDate=${new Date('2024-12-31')}\n * .locale=${'en-US'}\n * ></ui-date-picker-modal-input>\n * ```\n */\n@customElement('ui-date-picker-modal-input')\nexport class UiDatePickerModalInput extends LitElement {\n static override styles = modalStyles\n\n /**\n * Whether the modal is open\n */\n @property({ type: Boolean }) accessor open = false\n\n /**\n * The modal title\n */\n @property({ type: String }) override accessor title = 'Enter dates'\n\n /**\n * Whether to use range mode (two date inputs) or single date mode\n */\n @property({ type: Boolean }) accessor rangeMode = false\n\n /**\n * Label for the start date (or single date)\n */\n @property({ type: String }) accessor startLabel = 'Start date'\n\n /**\n * Label for the end date (only used in range mode)\n */\n @property({ type: String }) accessor endLabel = 'End date'\n\n /**\n * Placeholder for date inputs\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The selected date (single mode)\n */\n @property({ type: Object }) accessor selectedDate: Date | null = null\n\n /**\n * The selected date range (range mode)\n */\n @property({ type: Object }) accessor selectedRange: DateRange | null = null\n\n /**\n * Minimum selectable date\n */\n @property({ type: Object }) accessor minDate: Date | undefined = undefined\n\n /**\n * Maximum selectable date\n */\n @property({ type: Object }) accessor maxDate: Date | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n @state() private accessor startInput = ''\n\n @state() private accessor endInput = ''\n\n @state() private accessor startError = ''\n\n @state() private accessor endError = ''\n\n constructor() {\n super()\n // Initialize boolean properties to false first, then set intended defaults\n this.open = false\n this.rangeMode = true // Default to range mode as documented\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateInputValues()\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {\n this.updateInputValues()\n }\n }\n\n private updateInputValues(): void {\n if (this.rangeMode && this.selectedRange) {\n this.startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : ''\n this.endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : ''\n } else if (!this.rangeMode && this.selectedDate) {\n this.startInput = formatDate(this.selectedDate, this.locale)\n }\n }\n\n private validateDate(dateString: string, isEndDate = false): Date | null {\n if (!dateString.trim()) return null\n\n const parsedDate = parseDate(dateString)\n if (!parsedDate) return null\n\n // Check min/max constraints\n if (this.minDate && parsedDate < this.minDate) return null\n if (this.maxDate && parsedDate > this.maxDate) return null\n\n // For range mode, validate end date is after start date\n if (this.rangeMode && isEndDate) {\n const startDate = parseDate(this.startInput)\n if (startDate && parsedDate < startDate) return null\n }\n\n return parsedDate\n }\n\n private handleStartInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this.startInput = target.value\n this.startError = ''\n\n if (this.startInput.trim()) {\n const date = this.validateDate(this.startInput)\n if (!date) {\n this.startError = 'Invalid date format or out of range'\n return\n }\n\n if (this.rangeMode) {\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, start: date }\n } else {\n this.selectedDate = date\n }\n\n this.dispatchChangeEvent()\n }\n }\n\n private handleEndInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this.endInput = target.value\n this.endError = ''\n\n if (this.endInput.trim()) {\n const date = this.validateDate(this.endInput, true)\n if (!date) {\n this.endError = 'Invalid date format, out of range, or before start date'\n return\n }\n\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, end: date }\n this.dispatchChangeEvent()\n }\n }\n\n private handleCancel(): void {\n this.dispatchCloseEvent(false)\n }\n\n private handleConfirm(): void {\n // Validate all inputs before confirming\n let hasErrors = false\n\n if (this.rangeMode) {\n if (!this.startInput.trim()) {\n this.startError = 'Start date is required'\n hasErrors = true\n } else if (!this.validateDate(this.startInput)) {\n this.startError = 'Invalid start date'\n hasErrors = true\n }\n\n if (!this.endInput.trim()) {\n this.endError = 'End date is required'\n hasErrors = true\n } else if (!this.validateDate(this.endInput, true)) {\n this.endError = 'Invalid end date'\n hasErrors = true\n }\n } else {\n if (!this.startInput.trim()) {\n this.startError = 'Date is required'\n hasErrors = true\n } else if (!this.validateDate(this.startInput)) {\n this.startError = 'Invalid date'\n hasErrors = true\n }\n }\n\n if (!hasErrors) {\n this.dispatchCloseEvent(true)\n }\n }\n\n private dispatchChangeEvent(): void {\n if (this.rangeMode && this.selectedRange) {\n const event: ModalInputDatePickerChangeEvent = {\n range: this.selectedRange,\n formattedRange: {\n start: this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : null,\n end: this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : null,\n },\n }\n\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n } else if (!this.rangeMode && this.selectedDate) {\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: {\n date: this.selectedDate,\n formattedDate: formatDate(this.selectedDate, this.locale),\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n }\n\n private dispatchCloseEvent(confirmed: boolean): void {\n this.dispatchEvent(\n new CustomEvent('modal-input-close', {\n detail: {\n confirmed,\n date: confirmed && !this.rangeMode ? this.selectedDate : null,\n range: confirmed && this.rangeMode ? this.selectedRange : null,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private renderHeader(): TemplateResult {\n return html`\n <header class=\"modal-header\">\n <h2 id=\"modal-title\" class=\"modal-title\">${this.title}</h2>\n <ui-icon-button @click=${this.handleCancel} aria-label=\"Close\" title=\"Close\">\n <ui-icon icon=\"close\"></ui-icon>\n </ui-icon-button>\n </header>\n `\n }\n\n private renderInputs(): TemplateResult {\n return html`\n <main class=\"modal-content\">\n <div class=\"input-container\" role=\"form\" aria-labelledby=\"modal-title\">\n <fieldset>\n <legend class=\"visually-hidden\">${this.rangeMode ? 'Enter date range' : 'Enter date'}</legend>\n\n <ui-outlined-text-field\n .label=${this.rangeMode ? this.startLabel : 'Date'}\n .placeholder=${this.placeholder}\n .value=${this.startInput}\n .invalidText=${this.startError}\n ?invalid=${!!this.startError}\n @input=${this.handleStartInput}\n required\n aria-describedby=\"format-help\"\n >\n <ui-icon slot=\"suffix\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n\n ${this.rangeMode\n ? html`\n <ui-outlined-text-field\n .label=${this.endLabel}\n .placeholder=${this.placeholder}\n .value=${this.endInput}\n .invalidText=${this.endError}\n ?invalid=${!!this.endError}\n @input=${this.handleEndInput}\n required\n aria-describedby=\"format-help\"\n >\n <ui-icon slot=\"suffix\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n `\n : ''}\n </fieldset>\n\n <aside id=\"format-help\" class=\"format-help\" role=\"note\" aria-label=\"Date format information\">\n <p class=\"help-title\">\n <strong>Supported formats:</strong><br />\n MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD\n </p>\n <p class=\"help-examples\"><strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25</p>\n </aside>\n </div>\n </main>\n `\n }\n\n private renderActions(): TemplateResult {\n const hasValidInput = this.rangeMode\n ? this.startInput.trim() && this.endInput.trim() && !this.startError && !this.endError\n : this.startInput.trim() && !this.startError\n\n return html`\n <footer class=\"modal-actions\">\n <ui-button color=\"text\" @click=${this.handleCancel}>Cancel</ui-button>\n <ui-button color=\"filled\" @click=${this.handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>\n </footer>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <ui-dialog .open=${this.open} @close=${this.handleCancel}>\n ${this.renderHeader()} ${this.renderInputs()} ${this.renderActions()}\n </ui-dialog>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-modal-input': UiDatePickerModalInput\n }\n\n interface HTMLElementEventMap {\n 'date-input-change': CustomEvent<\n | ModalInputDatePickerChangeEvent\n | {\n date: Date\n formattedDate: string\n }\n >\n 'modal-input-close': CustomEvent<{\n confirmed: boolean\n date?: Date | null\n range?: DateRange | null\n }>\n }\n}\n"]}