@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,13 +10,52 @@ import '../../md/icons/ui-icon.js';
10
10
  * A docked date picker that opens from a text field input.
11
11
  * Ideal for forms and date selection in medium to large layouts.
12
12
  *
13
+ * ## Features
14
+ * - Text field input with calendar dropdown
15
+ * - Keyboard navigation support (Arrow Down, Enter, Escape)
16
+ * - Custom date formatting
17
+ * - Input validation and error handling
18
+ * - Min/max date constraints
19
+ * - Disabled dates support
20
+ * - Accessible design with proper ARIA attributes
21
+ * - CSS Anchor Positioning API for dropdown placement
22
+ *
23
+ * ## Events
24
+ *
25
+ * ### `change`
26
+ * Fired when the selected date changes.
27
+ *
28
+ * **Detail:**
29
+ * ```typescript
30
+ * {
31
+ * value: Date | null,
32
+ * formattedValue: string
33
+ * }
34
+ * ```
35
+ *
13
36
  * ## Usage
14
37
  *
38
+ * ### Basic usage
15
39
  * ```html
16
40
  * <ui-date-picker-input
17
41
  * label="Select date"
42
+ * name="birthDate"
18
43
  * placeholder="MM/DD/YYYY"
19
44
  * .value=${new Date()}
45
+ * @change=${this.handleDateChange}
46
+ * ></ui-date-picker-input>
47
+ * ```
48
+ *
49
+ * ### With validation
50
+ * ```html
51
+ * <ui-date-picker-input
52
+ * label="Birth date"
53
+ * name="birthDate"
54
+ * required
55
+ * .error=${this.hasError}
56
+ * .errorMessage=${"Please select a valid date"}
57
+ * .minDate=${new Date('1900-01-01')}
58
+ * .maxDate=${new Date()}
20
59
  * ></ui-date-picker-input>
21
60
  * ```
22
61
  *
@@ -27,6 +66,14 @@ import '../../md/icons/ui-icon.js';
27
66
  * .dateFormat=${date => date.toLocaleDateString('en-GB')}
28
67
  * ></ui-date-picker-input>
29
68
  * ```
69
+ *
70
+ * ### With disabled dates
71
+ * ```html
72
+ * <ui-date-picker-input
73
+ * label="Appointment date"
74
+ * .disabledDates=${[new Date('2024-12-25'), new Date('2024-01-01')]}
75
+ * ></ui-date-picker-input>
76
+ * ```
30
77
  */
31
78
  let UiDatePickerInput = (() => {
32
79
  let _classDecorators = [customElement('ui-date-picker-input')];
@@ -37,6 +84,9 @@ let UiDatePickerInput = (() => {
37
84
  let _label_decorators;
38
85
  let _label_initializers = [];
39
86
  let _label_extraInitializers = [];
87
+ let _name_decorators;
88
+ let _name_initializers = [];
89
+ let _name_extraInitializers = [];
40
90
  let _placeholder_decorators;
41
91
  let _placeholder_initializers = [];
42
92
  let _placeholder_extraInitializers = [];
@@ -70,20 +120,21 @@ let UiDatePickerInput = (() => {
70
120
  let _dateFormat_decorators;
71
121
  let _dateFormat_initializers = [];
72
122
  let _dateFormat_extraInitializers = [];
73
- let __isOpen_decorators;
74
- let __isOpen_initializers = [];
75
- let __isOpen_extraInitializers = [];
76
- let __inputValue_decorators;
77
- let __inputValue_initializers = [];
78
- let __inputValue_extraInitializers = [];
79
- let __textField_decorators;
80
- let __textField_initializers = [];
81
- let __textField_extraInitializers = [];
123
+ let _isOpen_decorators;
124
+ let _isOpen_initializers = [];
125
+ let _isOpen_extraInitializers = [];
126
+ let _inputValue_decorators;
127
+ let _inputValue_initializers = [];
128
+ let _inputValue_extraInitializers = [];
129
+ let _textField_decorators;
130
+ let _textField_initializers = [];
131
+ let _textField_extraInitializers = [];
82
132
  var UiDatePickerInput = class extends _classSuper {
83
133
  static { _classThis = this; }
84
134
  static {
85
135
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
86
136
  _label_decorators = [property({ type: String })];
137
+ _name_decorators = [property({ type: String })];
87
138
  _placeholder_decorators = [property({ type: String })];
88
139
  _value_decorators = [property({ type: Object })];
89
140
  _disabled_decorators = [property({ type: Boolean })];
@@ -95,10 +146,11 @@ let UiDatePickerInput = (() => {
95
146
  _disabledDates_decorators = [property({ type: Array })];
96
147
  _locale_decorators = [property({ type: String })];
97
148
  _dateFormat_decorators = [property({ type: Object })];
98
- __isOpen_decorators = [state()];
99
- __inputValue_decorators = [state()];
100
- __textField_decorators = [query('ui-outlined-text-field')];
149
+ _isOpen_decorators = [state()];
150
+ _inputValue_decorators = [state()];
151
+ _textField_decorators = [query('ui-outlined-text-field')];
101
152
  __esDecorate(this, null, _label_decorators, { kind: "accessor", name: "label", static: false, private: false, access: { has: obj => "label" in obj, get: obj => obj.label, set: (obj, value) => { obj.label = value; } }, metadata: _metadata }, _label_initializers, _label_extraInitializers);
153
+ __esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
102
154
  __esDecorate(this, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: obj => "placeholder" in obj, get: obj => obj.placeholder, set: (obj, value) => { obj.placeholder = value; } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
103
155
  __esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
104
156
  __esDecorate(this, null, _disabled_decorators, { kind: "accessor", name: "disabled", static: false, private: false, access: { has: obj => "disabled" in obj, get: obj => obj.disabled, set: (obj, value) => { obj.disabled = value; } }, metadata: _metadata }, _disabled_initializers, _disabled_extraInitializers);
@@ -110,9 +162,9 @@ let UiDatePickerInput = (() => {
110
162
  __esDecorate(this, null, _disabledDates_decorators, { kind: "accessor", name: "disabledDates", static: false, private: false, access: { has: obj => "disabledDates" in obj, get: obj => obj.disabledDates, set: (obj, value) => { obj.disabledDates = value; } }, metadata: _metadata }, _disabledDates_initializers, _disabledDates_extraInitializers);
111
163
  __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);
112
164
  __esDecorate(this, null, _dateFormat_decorators, { kind: "accessor", name: "dateFormat", static: false, private: false, access: { has: obj => "dateFormat" in obj, get: obj => obj.dateFormat, set: (obj, value) => { obj.dateFormat = value; } }, metadata: _metadata }, _dateFormat_initializers, _dateFormat_extraInitializers);
113
- __esDecorate(this, null, __isOpen_decorators, { kind: "accessor", name: "_isOpen", static: false, private: false, access: { has: obj => "_isOpen" in obj, get: obj => obj._isOpen, set: (obj, value) => { obj._isOpen = value; } }, metadata: _metadata }, __isOpen_initializers, __isOpen_extraInitializers);
114
- __esDecorate(this, null, __inputValue_decorators, { kind: "accessor", name: "_inputValue", static: false, private: false, access: { has: obj => "_inputValue" in obj, get: obj => obj._inputValue, set: (obj, value) => { obj._inputValue = value; } }, metadata: _metadata }, __inputValue_initializers, __inputValue_extraInitializers);
115
- __esDecorate(this, null, __textField_decorators, { kind: "accessor", name: "_textField", static: false, private: false, access: { has: obj => "_textField" in obj, get: obj => obj._textField, set: (obj, value) => { obj._textField = value; } }, metadata: _metadata }, __textField_initializers, __textField_extraInitializers);
165
+ __esDecorate(this, null, _isOpen_decorators, { kind: "accessor", name: "isOpen", static: false, private: false, access: { has: obj => "isOpen" in obj, get: obj => obj.isOpen, set: (obj, value) => { obj.isOpen = value; } }, metadata: _metadata }, _isOpen_initializers, _isOpen_extraInitializers);
166
+ __esDecorate(this, null, _inputValue_decorators, { kind: "accessor", name: "inputValue", static: false, private: false, access: { has: obj => "inputValue" in obj, get: obj => obj.inputValue, set: (obj, value) => { obj.inputValue = value; } }, metadata: _metadata }, _inputValue_initializers, _inputValue_extraInitializers);
167
+ __esDecorate(this, null, _textField_decorators, { kind: "accessor", name: "textField", static: false, private: false, access: { has: obj => "textField" in obj, get: obj => obj.textField, set: (obj, value) => { obj.textField = value; } }, metadata: _metadata }, _textField_initializers, _textField_extraInitializers);
116
168
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
117
169
  UiDatePickerInput = _classThis = _classDescriptor.value;
118
170
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -124,7 +176,7 @@ let UiDatePickerInput = (() => {
124
176
  };
125
177
  #label_accessor_storage = __runInitializers(this, _label_initializers, ''
126
178
  /**
127
- * Placeholder text for the input
179
+ * The name attribute for the input field (for form handling)
128
180
  */
129
181
  );
130
182
  /**
@@ -132,7 +184,17 @@ let UiDatePickerInput = (() => {
132
184
  */
133
185
  get label() { return this.#label_accessor_storage; }
134
186
  set label(value) { this.#label_accessor_storage = value; }
135
- #placeholder_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _placeholder_initializers, 'MM/DD/YYYY'
187
+ #name_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _name_initializers, ''
188
+ /**
189
+ * Placeholder text for the input
190
+ */
191
+ ));
192
+ /**
193
+ * The name attribute for the input field (for form handling)
194
+ */
195
+ get name() { return this.#name_accessor_storage; }
196
+ set name(value) { this.#name_accessor_storage = value; }
197
+ #placeholder_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _placeholder_initializers, 'MM/DD/YYYY'
136
198
  /**
137
199
  * The currently selected date
138
200
  */
@@ -238,109 +300,117 @@ let UiDatePickerInput = (() => {
238
300
  */
239
301
  get dateFormat() { return this.#dateFormat_accessor_storage; }
240
302
  set dateFormat(value) { this.#dateFormat_accessor_storage = value; }
241
- #_isOpen_accessor_storage = (__runInitializers(this, _dateFormat_extraInitializers), __runInitializers(this, __isOpen_initializers, false));
242
- get _isOpen() { return this.#_isOpen_accessor_storage; }
243
- set _isOpen(value) { this.#_isOpen_accessor_storage = value; }
244
- #_inputValue_accessor_storage = (__runInitializers(this, __isOpen_extraInitializers), __runInitializers(this, __inputValue_initializers, ''));
245
- get _inputValue() { return this.#_inputValue_accessor_storage; }
246
- set _inputValue(value) { this.#_inputValue_accessor_storage = value; }
247
- #_textField_accessor_storage = (__runInitializers(this, __inputValue_extraInitializers), __runInitializers(this, __textField_initializers, void 0));
248
- get _textField() { return this.#_textField_accessor_storage; }
249
- set _textField(value) { this.#_textField_accessor_storage = value; }
303
+ #isOpen_accessor_storage = (__runInitializers(this, _dateFormat_extraInitializers), __runInitializers(this, _isOpen_initializers, false));
304
+ get isOpen() { return this.#isOpen_accessor_storage; }
305
+ set isOpen(value) { this.#isOpen_accessor_storage = value; }
306
+ #inputValue_accessor_storage = (__runInitializers(this, _isOpen_extraInitializers), __runInitializers(this, _inputValue_initializers, ''));
307
+ get inputValue() { return this.#inputValue_accessor_storage; }
308
+ set inputValue(value) { this.#inputValue_accessor_storage = value; }
309
+ #textField_accessor_storage = (__runInitializers(this, _inputValue_extraInitializers), __runInitializers(this, _textField_initializers, void 0));
310
+ get textField() { return this.#textField_accessor_storage; }
311
+ set textField(value) { this.#textField_accessor_storage = value; }
312
+ constructor() {
313
+ super();
314
+ __runInitializers(this, _textField_extraInitializers);
315
+ // Initialize boolean properties to false as per Lit best practices
316
+ this.disabled = false;
317
+ this.required = false;
318
+ this.error = false;
319
+ }
250
320
  connectedCallback() {
251
321
  super.connectedCallback();
252
- this._updateInputValue();
253
- document.addEventListener('click', this._handleDocumentClick.bind(this));
322
+ this.updateInputValue();
323
+ document.addEventListener('click', this.handleDocumentClick.bind(this));
254
324
  }
255
325
  disconnectedCallback() {
256
326
  super.disconnectedCallback();
257
- document.removeEventListener('click', this._handleDocumentClick.bind(this));
327
+ document.removeEventListener('click', this.handleDocumentClick.bind(this));
258
328
  }
259
329
  willUpdate(changedProperties) {
260
330
  if (changedProperties.has('value')) {
261
- this._updateInputValue();
331
+ this.updateInputValue();
262
332
  }
263
333
  }
264
334
  updated(changedProperties) {
265
- if (changedProperties.has('_isOpen') && this._isOpen) {
335
+ if (changedProperties.has('isOpen') && this.isOpen) {
266
336
  // Set anchor name on text field for CSS Anchor Positioning API
267
- if (this._textField) {
337
+ if (this.textField) {
268
338
  // Using setProperty since anchorName is not in TypeScript types yet
269
- this._textField.style.setProperty('anchor-name', '--ui-date-picker-anchor');
339
+ this.textField.style.setProperty('anchor-name', '--ui-date-picker-anchor');
270
340
  }
271
341
  }
272
342
  }
273
- _updateInputValue() {
343
+ updateInputValue() {
274
344
  if (this.value) {
275
- this._inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale);
345
+ this.inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale);
276
346
  }
277
347
  else {
278
- this._inputValue = '';
348
+ this.inputValue = '';
279
349
  }
280
350
  }
281
- _handleDocumentClick(event) {
351
+ handleDocumentClick(event) {
282
352
  if (!this.contains(event.target)) {
283
- this._isOpen = false;
353
+ this.isOpen = false;
284
354
  }
285
355
  }
286
- _handleInputClick() {
356
+ handleInputClick() {
287
357
  if (!this.disabled) {
288
- this._isOpen = !this._isOpen;
358
+ this.isOpen = !this.isOpen;
289
359
  }
290
360
  }
291
- _handleInputChange(event) {
361
+ handleInputChange(event) {
292
362
  const target = event.target;
293
- this._inputValue = target.value;
294
- const parsedDate = parseDate(this._inputValue);
363
+ this.inputValue = target.value;
364
+ const parsedDate = parseDate(this.inputValue);
295
365
  if (parsedDate) {
296
366
  this.value = parsedDate;
297
- this._dispatchChangeEvent();
367
+ this.dispatchChangeEvent();
298
368
  }
299
369
  }
300
- _handleCalendarDateSelect(event) {
370
+ handleCalendarDateSelect(event) {
301
371
  this.value = event.detail.date;
302
- this._isOpen = false;
303
- this._dispatchChangeEvent();
372
+ this.isOpen = false;
373
+ this.dispatchChangeEvent();
304
374
  }
305
- _handleCalendarDateCancel() {
306
- this._isOpen = false;
375
+ handleCalendarDateCancel() {
376
+ this.isOpen = false;
307
377
  }
308
- _handleKeyDown(event) {
378
+ handleKeyDown(event) {
309
379
  switch (event.key) {
310
380
  case 'Escape':
311
- this._isOpen = false;
381
+ this.isOpen = false;
312
382
  break;
313
383
  case 'ArrowDown':
314
- if (!this._isOpen) {
384
+ if (!this.isOpen) {
315
385
  event.preventDefault();
316
- this._isOpen = true;
386
+ this.isOpen = true;
317
387
  }
318
388
  break;
319
389
  case 'Enter':
320
- if (this._isOpen) {
390
+ if (this.isOpen) {
321
391
  event.preventDefault();
322
- this._isOpen = false;
392
+ this.isOpen = false;
323
393
  }
324
394
  break;
325
395
  }
326
396
  }
327
- _dispatchChangeEvent() {
397
+ dispatchChangeEvent() {
328
398
  this.dispatchEvent(new CustomEvent('change', {
329
399
  detail: {
330
400
  value: this.value,
331
- formattedValue: this._inputValue,
401
+ formattedValue: this.inputValue,
332
402
  },
333
403
  bubbles: true,
334
404
  composed: true,
335
405
  }));
336
406
  }
337
- _renderCalendarIcon() {
407
+ renderCalendarIcon() {
338
408
  return html `
339
- <ui-icon slot="suffix" icon="calendarToday" @click=${this._handleInputClick} style="cursor: pointer;"></ui-icon>
409
+ <ui-icon slot="suffix" icon="calendarToday" @click=${this.handleInputClick} class="calendar-icon"></ui-icon>
340
410
  `;
341
411
  }
342
- _renderDropdown() {
343
- if (!this._isOpen)
412
+ renderDropdown() {
413
+ if (!this.isOpen)
344
414
  return null;
345
415
  const currentDate = this.value || new Date();
346
416
  return html `
@@ -354,8 +424,8 @@ let UiDatePickerInput = (() => {
354
424
  .disabledDates=${this.disabledDates}
355
425
  .locale=${this.locale}
356
426
  showActions
357
- @date-select=${this._handleCalendarDateSelect}
358
- @date-cancel=${this._handleCalendarDateCancel}
427
+ @date-select=${this.handleCalendarDateSelect}
428
+ @date-cancel=${this.handleCalendarDateCancel}
359
429
  ></ui-date-picker-calendar>
360
430
  </div>
361
431
  `;
@@ -363,30 +433,27 @@ let UiDatePickerInput = (() => {
363
433
  render() {
364
434
  return html `
365
435
  <div class="input-container">
366
- ${this._isOpen ? html `<div class="backdrop" @click=${() => (this._isOpen = false)}></div>` : ''}
436
+ ${this.isOpen ? html `<div class="backdrop" @click=${() => (this.isOpen = false)}></div>` : ''}
367
437
  <ui-outlined-text-field
368
438
  .label=${this.label}
439
+ .name=${this.name}
369
440
  .placeholder=${this.placeholder}
370
- .value=${this._inputValue}
441
+ .value=${this.inputValue}
371
442
  .disabled=${this.disabled}
372
443
  .required=${this.required}
373
- .errorMessage=${this.errorMessage}
374
- .error=${this.error}
444
+ ?invalid=${this.error}
445
+ .invalidText=${this.errorMessage}
375
446
  readonly
376
- @click=${this._handleInputClick}
377
- @input=${this._handleInputChange}
378
- @keydown=${this._handleKeyDown}
447
+ @click=${this.handleInputClick}
448
+ @input=${this.handleInputChange}
449
+ @keydown=${this.handleKeyDown}
379
450
  >
380
- ${this._renderCalendarIcon()}
451
+ ${this.renderCalendarIcon()}
381
452
  </ui-outlined-text-field>
382
- ${this._renderDropdown()}
453
+ ${this.renderDropdown()}
383
454
  </div>
384
455
  `;
385
456
  }
386
- constructor() {
387
- super(...arguments);
388
- __runInitializers(this, __textField_extraInitializers);
389
- }
390
457
  static {
391
458
  __runInitializers(_classThis, _classExtraInitializers);
392
459
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ui-date-picker-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { inputStyles } from './internals/DatePicker.styles.js'\nimport { formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport type { DateSelectEvent } from './internals/DatePickerCalendar.js'\nimport './internals/DatePickerCalendar.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\n/**\n * A docked date picker that opens from a text field input.\n * Ideal for forms and date selection in medium to large layouts.\n *\n * ## Usage\n *\n * ```html\n * <ui-date-picker-input\n * label=\"Select date\"\n * placeholder=\"MM/DD/YYYY\"\n * .value=${new Date()}\n * ></ui-date-picker-input>\n * ```\n *\n * ### Custom date format\n * ```html\n * <ui-date-picker-input\n * label=\"Birth date\"\n * .dateFormat=${date => date.toLocaleDateString('en-GB')}\n * ></ui-date-picker-input>\n * ```\n */\n@customElement('ui-date-picker-input')\nexport class UiDatePickerInput extends LitElement {\n static override styles = inputStyles\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n }\n\n /**\n * The label for the input field\n */\n @property({ type: String }) accessor label = ''\n\n /**\n * Placeholder text for the input\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The currently selected date\n */\n @property({ type: Object }) accessor value: Date | null = null\n\n /**\n * Whether the date picker is disabled\n */\n @property({ type: Boolean }) accessor disabled = false\n\n /**\n * Whether the input is required\n */\n @property({ type: Boolean }) accessor required = false\n\n /**\n * Error message to display\n */\n @property({ type: String }) accessor errorMessage = ''\n\n /**\n * Whether the input has an error state\n */\n @property({ type: Boolean }) accessor error = false\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 * Array of disabled dates\n */\n @property({ type: Array }) accessor disabledDates: Date[] | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n /**\n * Custom date format function\n */\n @property({ type: Object }) accessor dateFormat: ((date: Date) => string) | undefined = undefined\n\n @state() private accessor _isOpen = false\n\n @state() private accessor _inputValue = ''\n\n @query('ui-outlined-text-field') private accessor _textField!: HTMLElement\n\n override connectedCallback(): void {\n super.connectedCallback()\n this._updateInputValue()\n document.addEventListener('click', this._handleDocumentClick.bind(this))\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick.bind(this))\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('value')) {\n this._updateInputValue()\n }\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('_isOpen') && this._isOpen) {\n // Set anchor name on text field for CSS Anchor Positioning API\n if (this._textField) {\n // Using setProperty since anchorName is not in TypeScript types yet\n this._textField.style.setProperty('anchor-name', '--ui-date-picker-anchor')\n }\n }\n }\n\n private _updateInputValue(): void {\n if (this.value) {\n this._inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale)\n } else {\n this._inputValue = ''\n }\n }\n\n private _handleDocumentClick(event: Event): void {\n if (!this.contains(event.target as Node)) {\n this._isOpen = false\n }\n }\n\n private _handleInputClick(): void {\n if (!this.disabled) {\n this._isOpen = !this._isOpen\n }\n }\n\n private _handleInputChange(event: Event): void {\n const target = event.target as HTMLInputElement\n this._inputValue = target.value\n\n const parsedDate = parseDate(this._inputValue)\n if (parsedDate) {\n this.value = parsedDate\n this._dispatchChangeEvent()\n }\n }\n\n private _handleCalendarDateSelect(event: CustomEvent<DateSelectEvent>): void {\n this.value = event.detail.date\n this._isOpen = false\n this._dispatchChangeEvent()\n }\n\n private _handleCalendarDateCancel(): void {\n this._isOpen = false\n }\n\n private _handleKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n this._isOpen = false\n break\n case 'ArrowDown':\n if (!this._isOpen) {\n event.preventDefault()\n this._isOpen = true\n }\n break\n case 'Enter':\n if (this._isOpen) {\n event.preventDefault()\n this._isOpen = false\n }\n break\n }\n }\n\n private _dispatchChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n value: this.value,\n formattedValue: this._inputValue,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private _renderCalendarIcon(): TemplateResult {\n return html`\n <ui-icon slot=\"suffix\" icon=\"calendarToday\" @click=${this._handleInputClick} style=\"cursor: pointer;\"></ui-icon>\n `\n }\n\n private _renderDropdown(): TemplateResult | null {\n if (!this._isOpen) return null\n\n const currentDate = this.value || new Date()\n\n return html`\n <div class=\"dropdown-container\">\n <ui-date-picker-calendar\n .year=${currentDate.getFullYear()}\n .month=${currentDate.getMonth()}\n .selectedDate=${this.value}\n .minDate=${this.minDate}\n .maxDate=${this.maxDate}\n .disabledDates=${this.disabledDates}\n .locale=${this.locale}\n showActions\n @date-select=${this._handleCalendarDateSelect}\n @date-cancel=${this._handleCalendarDateCancel}\n ></ui-date-picker-calendar>\n </div>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"input-container\">\n ${this._isOpen ? html`<div class=\"backdrop\" @click=${() => (this._isOpen = false)}></div>` : ''}\n <ui-outlined-text-field\n .label=${this.label}\n .placeholder=${this.placeholder}\n .value=${this._inputValue}\n .disabled=${this.disabled}\n .required=${this.required}\n .errorMessage=${this.errorMessage}\n .error=${this.error}\n readonly\n @click=${this._handleInputClick}\n @input=${this._handleInputChange}\n @keydown=${this._handleKeyDown}\n >\n ${this._renderCalendarIcon()}\n </ui-outlined-text-field>\n ${this._renderDropdown()}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-input': UiDatePickerInput\n }\n\n interface HTMLElementEventMap {\n change: CustomEvent<{\n value: Date | null\n formattedValue: string\n }>\n }\n}\n"]}
1
+ {"version":3,"file":"ui-date-picker-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { inputStyles } from './internals/DatePicker.styles.js'\nimport { formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport type { DateSelectEvent } from './internals/DatePickerCalendar.js'\nimport './internals/DatePickerCalendar.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\n/**\n * A docked date picker that opens from a text field input.\n * Ideal for forms and date selection in medium to large layouts.\n *\n * ## Features\n * - Text field input with calendar dropdown\n * - Keyboard navigation support (Arrow Down, Enter, Escape)\n * - Custom date formatting\n * - Input validation and error handling\n * - Min/max date constraints\n * - Disabled dates support\n * - Accessible design with proper ARIA attributes\n * - CSS Anchor Positioning API for dropdown placement\n *\n * ## Events\n *\n * ### `change`\n * Fired when the selected date changes.\n *\n * **Detail:**\n * ```typescript\n * {\n * value: Date | null,\n * formattedValue: string\n * }\n * ```\n *\n * ## Usage\n *\n * ### Basic usage\n * ```html\n * <ui-date-picker-input\n * label=\"Select date\"\n * name=\"birthDate\"\n * placeholder=\"MM/DD/YYYY\"\n * .value=${new Date()}\n * @change=${this.handleDateChange}\n * ></ui-date-picker-input>\n * ```\n *\n * ### With validation\n * ```html\n * <ui-date-picker-input\n * label=\"Birth date\"\n * name=\"birthDate\"\n * required\n * .error=${this.hasError}\n * .errorMessage=${\"Please select a valid date\"}\n * .minDate=${new Date('1900-01-01')}\n * .maxDate=${new Date()}\n * ></ui-date-picker-input>\n * ```\n *\n * ### Custom date format\n * ```html\n * <ui-date-picker-input\n * label=\"Birth date\"\n * .dateFormat=${date => date.toLocaleDateString('en-GB')}\n * ></ui-date-picker-input>\n * ```\n *\n * ### With disabled dates\n * ```html\n * <ui-date-picker-input\n * label=\"Appointment date\"\n * .disabledDates=${[new Date('2024-12-25'), new Date('2024-01-01')]}\n * ></ui-date-picker-input>\n * ```\n */\n@customElement('ui-date-picker-input')\nexport class UiDatePickerInput extends LitElement {\n static override styles = inputStyles\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n }\n\n /**\n * The label for the input field\n */\n @property({ type: String }) accessor label = ''\n\n /**\n * The name attribute for the input field (for form handling)\n */\n @property({ type: String }) accessor name = ''\n\n /**\n * Placeholder text for the input\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The currently selected date\n */\n @property({ type: Object }) accessor value: Date | null = null\n\n /**\n * Whether the date picker is disabled\n */\n @property({ type: Boolean }) accessor disabled = false\n\n /**\n * Whether the input is required\n */\n @property({ type: Boolean }) accessor required = false\n\n /**\n * Error message to display\n */\n @property({ type: String }) accessor errorMessage = ''\n\n /**\n * Whether the input has an error state\n */\n @property({ type: Boolean }) accessor error = false\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 * Array of disabled dates\n */\n @property({ type: Array }) accessor disabledDates: Date[] | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n /**\n * Custom date format function\n */\n @property({ type: Object }) accessor dateFormat: ((date: Date) => string) | undefined = undefined\n\n @state() private accessor isOpen = false\n\n @state() private accessor inputValue = ''\n\n @query('ui-outlined-text-field') private accessor textField!: HTMLElement\n\n constructor() {\n super()\n // Initialize boolean properties to false as per Lit best practices\n this.disabled = false\n this.required = false\n this.error = false\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateInputValue()\n document.addEventListener('click', this.handleDocumentClick.bind(this))\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback()\n document.removeEventListener('click', this.handleDocumentClick.bind(this))\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('value')) {\n this.updateInputValue()\n }\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('isOpen') && this.isOpen) {\n // Set anchor name on text field for CSS Anchor Positioning API\n if (this.textField) {\n // Using setProperty since anchorName is not in TypeScript types yet\n this.textField.style.setProperty('anchor-name', '--ui-date-picker-anchor')\n }\n }\n }\n\n private updateInputValue(): void {\n if (this.value) {\n this.inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale)\n } else {\n this.inputValue = ''\n }\n }\n\n private handleDocumentClick(event: Event): void {\n if (!this.contains(event.target as Node)) {\n this.isOpen = false\n }\n }\n\n private handleInputClick(): void {\n if (!this.disabled) {\n this.isOpen = !this.isOpen\n }\n }\n\n private handleInputChange(event: Event): void {\n const target = event.target as HTMLInputElement\n this.inputValue = target.value\n\n const parsedDate = parseDate(this.inputValue)\n if (parsedDate) {\n this.value = parsedDate\n this.dispatchChangeEvent()\n }\n }\n\n private handleCalendarDateSelect(event: CustomEvent<DateSelectEvent>): void {\n this.value = event.detail.date\n this.isOpen = false\n this.dispatchChangeEvent()\n }\n\n private handleCalendarDateCancel(): void {\n this.isOpen = false\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n this.isOpen = false\n break\n case 'ArrowDown':\n if (!this.isOpen) {\n event.preventDefault()\n this.isOpen = true\n }\n break\n case 'Enter':\n if (this.isOpen) {\n event.preventDefault()\n this.isOpen = false\n }\n break\n }\n }\n\n private dispatchChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n value: this.value,\n formattedValue: this.inputValue,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private renderCalendarIcon(): TemplateResult {\n return html`\n <ui-icon slot=\"suffix\" icon=\"calendarToday\" @click=${this.handleInputClick} class=\"calendar-icon\"></ui-icon>\n `\n }\n\n private renderDropdown(): TemplateResult | null {\n if (!this.isOpen) return null\n\n const currentDate = this.value || new Date()\n\n return html`\n <div class=\"dropdown-container\">\n <ui-date-picker-calendar\n .year=${currentDate.getFullYear()}\n .month=${currentDate.getMonth()}\n .selectedDate=${this.value}\n .minDate=${this.minDate}\n .maxDate=${this.maxDate}\n .disabledDates=${this.disabledDates}\n .locale=${this.locale}\n showActions\n @date-select=${this.handleCalendarDateSelect}\n @date-cancel=${this.handleCalendarDateCancel}\n ></ui-date-picker-calendar>\n </div>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"input-container\">\n ${this.isOpen ? html`<div class=\"backdrop\" @click=${() => (this.isOpen = false)}></div>` : ''}\n <ui-outlined-text-field\n .label=${this.label}\n .name=${this.name}\n .placeholder=${this.placeholder}\n .value=${this.inputValue}\n .disabled=${this.disabled}\n .required=${this.required}\n ?invalid=${this.error}\n .invalidText=${this.errorMessage}\n readonly\n @click=${this.handleInputClick}\n @input=${this.handleInputChange}\n @keydown=${this.handleKeyDown}\n >\n ${this.renderCalendarIcon()}\n </ui-outlined-text-field>\n ${this.renderDropdown()}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-input': UiDatePickerInput\n }\n\n interface HTMLElementEventMap {\n change: CustomEvent<{\n value: Date | null\n formattedValue: string\n }>\n }\n}\n"]}
@@ -14,16 +14,63 @@ export interface ModalInputDatePickerChangeEvent {
14
14
  }
15
15
  /**
16
16
  * A modal date input picker for manual date entry using keyboard.
17
- * Ideal for compact layouts and precise date entry.
17
+ * Ideal for compact layouts and precise date entry. Supports both single
18
+ * date selection and date range selection modes.
19
+ *
20
+ * ## Features
21
+ * - Manual date entry with keyboard input
22
+ * - Single date and date range modes
23
+ * - Input validation with error messages
24
+ * - Min/max date constraints
25
+ * - Multiple date format support (MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD)
26
+ * - Accessible design with proper ARIA labels and semantic HTML
27
+ * - Real-time validation feedback
28
+ *
29
+ * ## Events
30
+ *
31
+ * ### `date-input-change`
32
+ * Fired when a valid date is entered in the input fields.
33
+ *
34
+ * **Detail for range mode:**
35
+ * ```typescript
36
+ * {
37
+ * range: DateRange,
38
+ * formattedRange: {
39
+ * start: string | null,
40
+ * end: string | null
41
+ * }
42
+ * }
43
+ * ```
44
+ *
45
+ * **Detail for single date mode:**
46
+ * ```typescript
47
+ * {
48
+ * date: Date,
49
+ * formattedDate: string
50
+ * }
51
+ * ```
52
+ *
53
+ * ### `modal-input-close`
54
+ * Fired when the modal is closed, either by confirmation or cancellation.
55
+ *
56
+ * **Detail:**
57
+ * ```typescript
58
+ * {
59
+ * confirmed: boolean,
60
+ * date?: Date | null, // Available in single date mode
61
+ * range?: DateRange | null // Available in range mode
62
+ * }
63
+ * ```
18
64
  *
19
65
  * ## Usage
20
66
  *
67
+ * ### Range mode (default)
21
68
  * ```html
22
69
  * <ui-date-picker-modal-input
23
70
  * .open=${true}
24
71
  * .selectedRange=${{ start: new Date(), end: null }}
25
72
  * @date-input-change=${this.handleRangeChange}
26
- * @close=${this.handleClose}
73
+ * @modal-input-close=${this.handleClose}
27
74
  * ></ui-date-picker-modal-input>
28
75
  * ```
29
76
  *
@@ -32,6 +79,17 @@ export interface ModalInputDatePickerChangeEvent {
32
79
  * <ui-date-picker-modal-input
33
80
  * .rangeMode=${false}
34
81
  * .selectedDate=${new Date()}
82
+ * @date-input-change=${this.handleDateChange}
83
+ * @modal-input-close=${this.handleClose}
84
+ * ></ui-date-picker-modal-input>
85
+ * ```
86
+ *
87
+ * ### With constraints
88
+ * ```html
89
+ * <ui-date-picker-modal-input
90
+ * .minDate=${new Date('2024-01-01')}
91
+ * .maxDate=${new Date('2024-12-31')}
92
+ * .locale=${'en-US'}
35
93
  * ></ui-date-picker-modal-input>
36
94
  * ```
37
95
  */
@@ -81,23 +139,24 @@ export declare class UiDatePickerModalInput extends LitElement {
81
139
  * Locale for date formatting
82
140
  */
83
141
  accessor locale: string | undefined;
84
- private accessor _startInput;
85
- private accessor _endInput;
86
- private accessor _startError;
87
- private accessor _endError;
142
+ private accessor startInput;
143
+ private accessor endInput;
144
+ private accessor startError;
145
+ private accessor endError;
146
+ constructor();
88
147
  connectedCallback(): void;
89
148
  willUpdate(changedProperties: Map<string | number | symbol, unknown>): void;
90
- private _updateInputValues;
91
- private _validateDate;
92
- private _handleStartInput;
93
- private _handleEndInput;
94
- private _handleCancel;
95
- private _handleConfirm;
96
- private _dispatchChangeEvent;
97
- private _dispatchCloseEvent;
98
- private _renderHeader;
99
- private _renderInputs;
100
- private _renderActions;
149
+ private updateInputValues;
150
+ private validateDate;
151
+ private handleStartInput;
152
+ private handleEndInput;
153
+ private handleCancel;
154
+ private handleConfirm;
155
+ private dispatchChangeEvent;
156
+ private dispatchCloseEvent;
157
+ private renderHeader;
158
+ private renderInputs;
159
+ private renderActions;
101
160
  render(): TemplateResult;
102
161
  }
103
162
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"ui-date-picker-modal-input.d.ts","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAA;AAGtD,OAAO,EAAE,SAAS,EAAyB,MAAM,gCAAgC,CAAA;AACjF,OAAO,8BAA8B,CAAA;AACrC,OAAO,8BAA8B,CAAA;AACrC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,+CAA+C,CAAA;AACtD,OAAO,2BAA2B,CAAA;AAElC,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,SAAS,CAAA;IAChB,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KACnB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBACa,sBAAuB,SAAQ,UAAU;IACpD,OAAgB,MAAM,0BAAc;IAEpC;;OAEG;IAC0B,QAAQ,CAAC,IAAI,UAAQ;IAElD;;OAEG;IACH,SAA8C,KAAK,SAAgB;IAEnE;;OAEG;IAC0B,QAAQ,CAAC,SAAS,UAAO;IAEtD;;OAEG;IACyB,QAAQ,CAAC,UAAU,SAAe;IAE9D;;OAEG;IACyB,QAAQ,CAAC,QAAQ,SAAa;IAE1D;;OAEG;IACyB,QAAQ,CAAC,WAAW,SAAe;IAE/D;;OAEG;IACyB,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAO;IAErE;;OAEG;IACyB,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAO;IAE3E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAY;IAElE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IAEjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;IAE/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IAEjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;IAE/B,iBAAiB,IAAI,IAAI;IAKzB,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMpF,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,cAAc;IAab,MAAM,IAAI,cAAc;CAOlC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B,EAAE,sBAAsB,CAAA;KACrD;IAED,UAAU,mBAAmB;QAC3B,mBAAmB,EAAE,WAAW,CAC5B,+BAA+B,GAC/B;YACE,IAAI,EAAE,IAAI,CAAA;YACV,aAAa,EAAE,MAAM,CAAA;SACtB,CACJ,CAAA;QACD,mBAAmB,EAAE,WAAW,CAAC;YAC/B,SAAS,EAAE,OAAO,CAAA;YAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;YAClB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;SACzB,CAAC,CAAA;KACH;CACF"}
1
+ {"version":3,"file":"ui-date-picker-modal-input.d.ts","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAA;AAGtD,OAAO,EAAE,SAAS,EAAyB,MAAM,gCAAgC,CAAA;AACjF,OAAO,8BAA8B,CAAA;AACrC,OAAO,8BAA8B,CAAA;AACrC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,+CAA+C,CAAA;AACtD,OAAO,2BAA2B,CAAA;AAElC,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,SAAS,CAAA;IAChB,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KACnB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,qBACa,sBAAuB,SAAQ,UAAU;IACpD,OAAgB,MAAM,0BAAc;IAEpC;;OAEG;IAC0B,QAAQ,CAAC,IAAI,UAAQ;IAElD;;OAEG;IACH,SAA8C,KAAK,SAAgB;IAEnE;;OAEG;IAC0B,QAAQ,CAAC,SAAS,UAAQ;IAEvD;;OAEG;IACyB,QAAQ,CAAC,UAAU,SAAe;IAE9D;;OAEG;IACyB,QAAQ,CAAC,QAAQ,SAAa;IAE1D;;OAEG;IACyB,QAAQ,CAAC,WAAW,SAAe;IAE/D;;OAEG;IACyB,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAO;IAErE;;OAEG;IACyB,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAO;IAE3E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAY;IAElE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAK;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAK;;IAS9B,iBAAiB,IAAI,IAAI;IAKzB,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMpF,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,YAAY;IAkDpB,OAAO,CAAC,aAAa;IAaZ,MAAM,IAAI,cAAc;CAOlC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B,EAAE,sBAAsB,CAAA;KACrD;IAED,UAAU,mBAAmB;QAC3B,mBAAmB,EAAE,WAAW,CAC5B,+BAA+B,GAC/B;YACE,IAAI,EAAE,IAAI,CAAA;YACV,aAAa,EAAE,MAAM,CAAA;SACtB,CACJ,CAAA;QACD,mBAAmB,EAAE,WAAW,CAAC;YAC/B,SAAS,EAAE,OAAO,CAAA;YAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;YAClB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;SACzB,CAAC,CAAA;KACH;CACF"}