@api-client/ui 0.5.5 → 0.5.6

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/build/src/elements/highlight/MarkdownStyles.d.ts.map +1 -1
  2. package/build/src/elements/highlight/MarkdownStyles.js +0 -13
  3. package/build/src/elements/highlight/MarkdownStyles.js.map +1 -1
  4. package/build/src/elements/http/BodyEditor.d.ts +0 -13
  5. package/build/src/elements/http/BodyEditor.d.ts.map +1 -1
  6. package/build/src/elements/http/BodyEditor.js +0 -13
  7. package/build/src/elements/http/BodyEditor.js.map +1 -1
  8. package/build/src/elements/http/BodyTextEditor.d.ts +0 -13
  9. package/build/src/elements/http/BodyTextEditor.d.ts.map +1 -1
  10. package/build/src/elements/http/BodyTextEditor.js +0 -13
  11. package/build/src/elements/http/BodyTextEditor.js.map +1 -1
  12. package/build/src/elements/http/BodyUrlEncodedEditor.d.ts +0 -13
  13. package/build/src/elements/http/BodyUrlEncodedEditor.d.ts.map +1 -1
  14. package/build/src/elements/http/BodyUrlEncodedEditor.js +0 -13
  15. package/build/src/elements/http/BodyUrlEncodedEditor.js.map +1 -1
  16. package/build/src/elements/http/UrlInput.d.ts +0 -13
  17. package/build/src/elements/http/UrlInput.d.ts.map +1 -1
  18. package/build/src/elements/http/UrlInput.js +0 -13
  19. package/build/src/elements/http/UrlInput.js.map +1 -1
  20. package/build/src/index.d.ts +2 -0
  21. package/build/src/index.d.ts.map +1 -1
  22. package/build/src/index.js +2 -0
  23. package/build/src/index.js.map +1 -1
  24. package/build/src/md/button/internals/button.styles.js +1 -1
  25. package/build/src/md/button/internals/button.styles.js.map +1 -1
  26. package/build/src/md/date/internals/DateTime.d.ts +0 -13
  27. package/build/src/md/date/internals/DateTime.d.ts.map +1 -1
  28. package/build/src/md/date/internals/DateTime.js +0 -13
  29. package/build/src/md/date/internals/DateTime.js.map +1 -1
  30. package/build/src/md/date-picker/index.d.ts +13 -0
  31. package/build/src/md/date-picker/index.d.ts.map +1 -0
  32. package/build/src/md/date-picker/index.js +13 -0
  33. package/build/src/md/date-picker/index.js.map +1 -0
  34. package/build/src/md/date-picker/internals/DatePicker.styles.d.ts +4 -0
  35. package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -0
  36. package/build/src/md/date-picker/internals/DatePicker.styles.js +336 -0
  37. package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -0
  38. package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +159 -0
  39. package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -0
  40. package/build/src/md/date-picker/internals/DatePickerCalendar.js +770 -0
  41. package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -0
  42. package/build/src/md/date-picker/internals/DatePickerUtils.d.ts +93 -0
  43. package/build/src/md/date-picker/internals/DatePickerUtils.d.ts.map +1 -0
  44. package/build/src/md/date-picker/internals/DatePickerUtils.js +221 -0
  45. package/build/src/md/date-picker/internals/DatePickerUtils.js.map +1 -0
  46. package/build/src/md/date-picker/ui-date-picker-input.d.ts +108 -0
  47. package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -0
  48. package/build/src/md/date-picker/ui-date-picker-input.js +397 -0
  49. package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -0
  50. package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +119 -0
  51. package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -0
  52. package/build/src/md/date-picker/ui-date-picker-modal-input.js +473 -0
  53. package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -0
  54. package/build/src/md/date-picker/ui-date-picker-modal.d.ts +108 -0
  55. package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -0
  56. package/build/src/md/date-picker/ui-date-picker-modal.js +344 -0
  57. package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -0
  58. package/build/src/md/dialog/internals/Dialog.styles.d.ts.map +1 -1
  59. package/build/src/md/dialog/internals/Dialog.styles.js +1 -0
  60. package/build/src/md/dialog/internals/Dialog.styles.js.map +1 -1
  61. package/demo/elements/har/har2.json +1 -1
  62. package/demo/md/date-picker/date-picker.ts +301 -0
  63. package/demo/md/date-picker/index.html +171 -0
  64. package/demo/md/index.html +2 -0
  65. package/package.json +1 -1
  66. package/src/elements/highlight/MarkdownStyles.ts +0 -13
  67. package/src/elements/http/BodyEditor.ts +0 -13
  68. package/src/elements/http/BodyTextEditor.ts +0 -13
  69. package/src/elements/http/BodyUrlEncodedEditor.ts +0 -13
  70. package/src/elements/http/UrlInput.ts +0 -13
  71. package/src/index.ts +17 -0
  72. package/src/md/button/internals/button.styles.ts +1 -1
  73. package/src/md/date/internals/DateTime.ts +0 -14
  74. package/src/md/date-picker/README.md +184 -0
  75. package/src/md/date-picker/index.ts +17 -0
  76. package/src/md/date-picker/internals/DatePicker.styles.ts +338 -0
  77. package/src/md/date-picker/internals/DatePickerCalendar.ts +697 -0
  78. package/src/md/date-picker/internals/DatePickerUtils.ts +288 -0
  79. package/src/md/date-picker/ui-date-picker-input.ts +272 -0
  80. package/src/md/date-picker/ui-date-picker-modal-input.ts +371 -0
  81. package/src/md/date-picker/ui-date-picker-modal.ts +263 -0
  82. package/src/md/dialog/internals/Dialog.styles.ts +1 -0
@@ -0,0 +1,473 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { LitElement, html } from 'lit';
3
+ import { customElement, property, state } from 'lit/decorators.js';
4
+ import { modalStyles } from './internals/DatePicker.styles.js';
5
+ import { formatDate, parseDate } from './internals/DatePickerUtils.js';
6
+ import '../../md/dialog/ui-dialog.js';
7
+ import '../../md/button/ui-button.js';
8
+ import '../../md/icon-button/ui-icon-button.js';
9
+ import '../../md/text-field/ui-outlined-text-field.js';
10
+ import '../../md/icons/ui-icon.js';
11
+ /**
12
+ * A modal date input picker for manual date entry using keyboard.
13
+ * Ideal for compact layouts and precise date entry.
14
+ *
15
+ * ## Usage
16
+ *
17
+ * ```html
18
+ * <ui-date-picker-modal-input
19
+ * .open=${true}
20
+ * .selectedRange=${{ start: new Date(), end: null }}
21
+ * @date-input-change=${this.handleRangeChange}
22
+ * @close=${this.handleClose}
23
+ * ></ui-date-picker-modal-input>
24
+ * ```
25
+ *
26
+ * ### Single date mode
27
+ * ```html
28
+ * <ui-date-picker-modal-input
29
+ * .rangeMode=${false}
30
+ * .selectedDate=${new Date()}
31
+ * ></ui-date-picker-modal-input>
32
+ * ```
33
+ */
34
+ let UiDatePickerModalInput = (() => {
35
+ let _classDecorators = [customElement('ui-date-picker-modal-input')];
36
+ let _classDescriptor;
37
+ let _classExtraInitializers = [];
38
+ let _classThis;
39
+ let _classSuper = LitElement;
40
+ let _open_decorators;
41
+ let _open_initializers = [];
42
+ let _open_extraInitializers = [];
43
+ let _title_decorators;
44
+ let _title_initializers = [];
45
+ let _title_extraInitializers = [];
46
+ let _rangeMode_decorators;
47
+ let _rangeMode_initializers = [];
48
+ let _rangeMode_extraInitializers = [];
49
+ let _startLabel_decorators;
50
+ let _startLabel_initializers = [];
51
+ let _startLabel_extraInitializers = [];
52
+ let _endLabel_decorators;
53
+ let _endLabel_initializers = [];
54
+ let _endLabel_extraInitializers = [];
55
+ let _placeholder_decorators;
56
+ let _placeholder_initializers = [];
57
+ let _placeholder_extraInitializers = [];
58
+ let _selectedDate_decorators;
59
+ let _selectedDate_initializers = [];
60
+ let _selectedDate_extraInitializers = [];
61
+ let _selectedRange_decorators;
62
+ let _selectedRange_initializers = [];
63
+ let _selectedRange_extraInitializers = [];
64
+ let _minDate_decorators;
65
+ let _minDate_initializers = [];
66
+ let _minDate_extraInitializers = [];
67
+ let _maxDate_decorators;
68
+ let _maxDate_initializers = [];
69
+ let _maxDate_extraInitializers = [];
70
+ let _locale_decorators;
71
+ let _locale_initializers = [];
72
+ 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 = [];
85
+ var UiDatePickerModalInput = class extends _classSuper {
86
+ static { _classThis = this; }
87
+ static {
88
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
89
+ _open_decorators = [property({ type: Boolean })];
90
+ _title_decorators = [property({ type: String })];
91
+ _rangeMode_decorators = [property({ type: Boolean })];
92
+ _startLabel_decorators = [property({ type: String })];
93
+ _endLabel_decorators = [property({ type: String })];
94
+ _placeholder_decorators = [property({ type: String })];
95
+ _selectedDate_decorators = [property({ type: Object })];
96
+ _selectedRange_decorators = [property({ type: Object })];
97
+ _minDate_decorators = [property({ type: Object })];
98
+ _maxDate_decorators = [property({ type: Object })];
99
+ _locale_decorators = [property({ type: String })];
100
+ __startInput_decorators = [state()];
101
+ __endInput_decorators = [state()];
102
+ __startError_decorators = [state()];
103
+ __endError_decorators = [state()];
104
+ __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
+ __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
+ __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);
107
+ __esDecorate(this, null, _startLabel_decorators, { kind: "accessor", name: "startLabel", static: false, private: false, access: { has: obj => "startLabel" in obj, get: obj => obj.startLabel, set: (obj, value) => { obj.startLabel = value; } }, metadata: _metadata }, _startLabel_initializers, _startLabel_extraInitializers);
108
+ __esDecorate(this, null, _endLabel_decorators, { kind: "accessor", name: "endLabel", static: false, private: false, access: { has: obj => "endLabel" in obj, get: obj => obj.endLabel, set: (obj, value) => { obj.endLabel = value; } }, metadata: _metadata }, _endLabel_initializers, _endLabel_extraInitializers);
109
+ __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);
110
+ __esDecorate(this, null, _selectedDate_decorators, { kind: "accessor", name: "selectedDate", static: false, private: false, access: { has: obj => "selectedDate" in obj, get: obj => obj.selectedDate, set: (obj, value) => { obj.selectedDate = value; } }, metadata: _metadata }, _selectedDate_initializers, _selectedDate_extraInitializers);
111
+ __esDecorate(this, null, _selectedRange_decorators, { kind: "accessor", name: "selectedRange", static: false, private: false, access: { has: obj => "selectedRange" in obj, get: obj => obj.selectedRange, set: (obj, value) => { obj.selectedRange = value; } }, metadata: _metadata }, _selectedRange_initializers, _selectedRange_extraInitializers);
112
+ __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
+ __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
+ __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);
119
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
120
+ UiDatePickerModalInput = _classThis = _classDescriptor.value;
121
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
122
+ }
123
+ static styles = modalStyles;
124
+ #open_accessor_storage = __runInitializers(this, _open_initializers, false
125
+ /**
126
+ * The modal title
127
+ */
128
+ );
129
+ /**
130
+ * Whether the modal is open
131
+ */
132
+ get open() { return this.#open_accessor_storage; }
133
+ set open(value) { this.#open_accessor_storage = value; }
134
+ #title_accessor_storage = (__runInitializers(this, _open_extraInitializers), __runInitializers(this, _title_initializers, 'Enter dates'
135
+ /**
136
+ * Whether to use range mode (two date inputs) or single date mode
137
+ */
138
+ ));
139
+ /**
140
+ * The modal title
141
+ */
142
+ get title() { return this.#title_accessor_storage; }
143
+ set title(value) { this.#title_accessor_storage = value; }
144
+ #rangeMode_accessor_storage = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _rangeMode_initializers, true
145
+ /**
146
+ * Label for the start date (or single date)
147
+ */
148
+ ));
149
+ /**
150
+ * Whether to use range mode (two date inputs) or single date mode
151
+ */
152
+ get rangeMode() { return this.#rangeMode_accessor_storage; }
153
+ set rangeMode(value) { this.#rangeMode_accessor_storage = value; }
154
+ #startLabel_accessor_storage = (__runInitializers(this, _rangeMode_extraInitializers), __runInitializers(this, _startLabel_initializers, 'Start date'
155
+ /**
156
+ * Label for the end date (only used in range mode)
157
+ */
158
+ ));
159
+ /**
160
+ * Label for the start date (or single date)
161
+ */
162
+ get startLabel() { return this.#startLabel_accessor_storage; }
163
+ set startLabel(value) { this.#startLabel_accessor_storage = value; }
164
+ #endLabel_accessor_storage = (__runInitializers(this, _startLabel_extraInitializers), __runInitializers(this, _endLabel_initializers, 'End date'
165
+ /**
166
+ * Placeholder for date inputs
167
+ */
168
+ ));
169
+ /**
170
+ * Label for the end date (only used in range mode)
171
+ */
172
+ get endLabel() { return this.#endLabel_accessor_storage; }
173
+ set endLabel(value) { this.#endLabel_accessor_storage = value; }
174
+ #placeholder_accessor_storage = (__runInitializers(this, _endLabel_extraInitializers), __runInitializers(this, _placeholder_initializers, 'MM/DD/YYYY'
175
+ /**
176
+ * The selected date (single mode)
177
+ */
178
+ ));
179
+ /**
180
+ * Placeholder for date inputs
181
+ */
182
+ get placeholder() { return this.#placeholder_accessor_storage; }
183
+ set placeholder(value) { this.#placeholder_accessor_storage = value; }
184
+ #selectedDate_accessor_storage = (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _selectedDate_initializers, null
185
+ /**
186
+ * The selected date range (range mode)
187
+ */
188
+ ));
189
+ /**
190
+ * The selected date (single mode)
191
+ */
192
+ get selectedDate() { return this.#selectedDate_accessor_storage; }
193
+ set selectedDate(value) { this.#selectedDate_accessor_storage = value; }
194
+ #selectedRange_accessor_storage = (__runInitializers(this, _selectedDate_extraInitializers), __runInitializers(this, _selectedRange_initializers, null
195
+ /**
196
+ * Minimum selectable date
197
+ */
198
+ ));
199
+ /**
200
+ * The selected date range (range mode)
201
+ */
202
+ get selectedRange() { return this.#selectedRange_accessor_storage; }
203
+ set selectedRange(value) { this.#selectedRange_accessor_storage = value; }
204
+ #minDate_accessor_storage = (__runInitializers(this, _selectedRange_extraInitializers), __runInitializers(this, _minDate_initializers, undefined
205
+ /**
206
+ * Maximum selectable date
207
+ */
208
+ ));
209
+ /**
210
+ * Minimum selectable date
211
+ */
212
+ get minDate() { return this.#minDate_accessor_storage; }
213
+ set minDate(value) { this.#minDate_accessor_storage = value; }
214
+ #maxDate_accessor_storage = (__runInitializers(this, _minDate_extraInitializers), __runInitializers(this, _maxDate_initializers, undefined
215
+ /**
216
+ * Locale for date formatting
217
+ */
218
+ ));
219
+ /**
220
+ * Maximum selectable date
221
+ */
222
+ get maxDate() { return this.#maxDate_accessor_storage; }
223
+ set maxDate(value) { this.#maxDate_accessor_storage = value; }
224
+ #locale_accessor_storage = (__runInitializers(this, _maxDate_extraInitializers), __runInitializers(this, _locale_initializers, undefined));
225
+ /**
226
+ * Locale for date formatting
227
+ */
228
+ get locale() { return this.#locale_accessor_storage; }
229
+ 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; }
242
+ connectedCallback() {
243
+ super.connectedCallback();
244
+ this._updateInputValues();
245
+ }
246
+ willUpdate(changedProperties) {
247
+ if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {
248
+ this._updateInputValues();
249
+ }
250
+ }
251
+ _updateInputValues() {
252
+ 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) : '';
255
+ }
256
+ else if (!this.rangeMode && this.selectedDate) {
257
+ this._startInput = formatDate(this.selectedDate, this.locale);
258
+ }
259
+ }
260
+ _validateDate(dateString, isEndDate = false) {
261
+ if (!dateString.trim())
262
+ return null;
263
+ const parsedDate = parseDate(dateString);
264
+ if (!parsedDate)
265
+ return null;
266
+ // Check min/max constraints
267
+ if (this.minDate && parsedDate < this.minDate)
268
+ return null;
269
+ if (this.maxDate && parsedDate > this.maxDate)
270
+ return null;
271
+ // For range mode, validate end date is after start date
272
+ if (this.rangeMode && isEndDate) {
273
+ const startDate = parseDate(this._startInput);
274
+ if (startDate && parsedDate < startDate)
275
+ return null;
276
+ }
277
+ return parsedDate;
278
+ }
279
+ _handleStartInput(event) {
280
+ const target = event.target;
281
+ this._startInput = target.value;
282
+ this._startError = '';
283
+ if (this._startInput.trim()) {
284
+ const date = this._validateDate(this._startInput);
285
+ if (!date) {
286
+ this._startError = 'Invalid date format or out of range';
287
+ return;
288
+ }
289
+ if (this.rangeMode) {
290
+ const currentRange = this.selectedRange || { start: null, end: null };
291
+ this.selectedRange = { ...currentRange, start: date };
292
+ }
293
+ else {
294
+ this.selectedDate = date;
295
+ }
296
+ this._dispatchChangeEvent();
297
+ }
298
+ }
299
+ _handleEndInput(event) {
300
+ 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);
305
+ if (!date) {
306
+ this._endError = 'Invalid date format, out of range, or before start date';
307
+ return;
308
+ }
309
+ const currentRange = this.selectedRange || { start: null, end: null };
310
+ this.selectedRange = { ...currentRange, end: date };
311
+ this._dispatchChangeEvent();
312
+ }
313
+ }
314
+ _handleCancel() {
315
+ this._dispatchCloseEvent(false);
316
+ }
317
+ _handleConfirm() {
318
+ // Validate all inputs before confirming
319
+ let hasErrors = false;
320
+ if (this.rangeMode) {
321
+ if (!this._startInput.trim()) {
322
+ this._startError = 'Start date is required';
323
+ hasErrors = true;
324
+ }
325
+ else if (!this._validateDate(this._startInput)) {
326
+ this._startError = 'Invalid start date';
327
+ hasErrors = true;
328
+ }
329
+ if (!this._endInput.trim()) {
330
+ this._endError = 'End date is required';
331
+ hasErrors = true;
332
+ }
333
+ else if (!this._validateDate(this._endInput, true)) {
334
+ this._endError = 'Invalid end date';
335
+ hasErrors = true;
336
+ }
337
+ }
338
+ else {
339
+ if (!this._startInput.trim()) {
340
+ this._startError = 'Date is required';
341
+ hasErrors = true;
342
+ }
343
+ else if (!this._validateDate(this._startInput)) {
344
+ this._startError = 'Invalid date';
345
+ hasErrors = true;
346
+ }
347
+ }
348
+ if (!hasErrors) {
349
+ this._dispatchCloseEvent(true);
350
+ }
351
+ }
352
+ _dispatchChangeEvent() {
353
+ if (this.rangeMode && this.selectedRange) {
354
+ const event = {
355
+ range: this.selectedRange,
356
+ formattedRange: {
357
+ start: this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : null,
358
+ end: this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : null,
359
+ },
360
+ };
361
+ this.dispatchEvent(new CustomEvent('date-input-change', {
362
+ detail: event,
363
+ bubbles: true,
364
+ composed: true,
365
+ }));
366
+ }
367
+ else if (!this.rangeMode && this.selectedDate) {
368
+ this.dispatchEvent(new CustomEvent('date-input-change', {
369
+ detail: {
370
+ date: this.selectedDate,
371
+ formattedDate: formatDate(this.selectedDate, this.locale),
372
+ },
373
+ bubbles: true,
374
+ composed: true,
375
+ }));
376
+ }
377
+ }
378
+ _dispatchCloseEvent(confirmed) {
379
+ this.dispatchEvent(new CustomEvent('modal-input-close', {
380
+ detail: {
381
+ confirmed,
382
+ date: confirmed && !this.rangeMode ? this.selectedDate : null,
383
+ range: confirmed && this.rangeMode ? this.selectedRange : null,
384
+ },
385
+ bubbles: true,
386
+ composed: true,
387
+ }));
388
+ }
389
+ _renderHeader() {
390
+ 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">
394
+ <ui-icon icon="close"></ui-icon>
395
+ </ui-icon-button>
396
+ </div>
397
+ `;
398
+ }
399
+ _renderInputs() {
400
+ 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>
413
+
414
+ ${this.rangeMode
415
+ ? 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
+ `
427
+ : ''}
428
+
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);">
433
+ <strong>Supported formats:</strong><br />
434
+ MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD
435
+ </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>
440
+ </div>
441
+ </div>
442
+ `;
443
+ }
444
+ _renderActions() {
445
+ const hasValidInput = this.rangeMode
446
+ ? this._startInput.trim() && this._endInput.trim() && !this._startError && !this._endError
447
+ : this._startInput.trim() && !this._startError;
448
+ 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>
453
+ `;
454
+ }
455
+ render() {
456
+ return html `
457
+ <ui-dialog .open=${this.open} @close=${this._handleCancel}>
458
+ ${this._renderHeader()} ${this._renderInputs()} ${this._renderActions()}
459
+ </ui-dialog>
460
+ `;
461
+ }
462
+ constructor() {
463
+ super(...arguments);
464
+ __runInitializers(this, __endError_extraInitializers);
465
+ }
466
+ static {
467
+ __runInitializers(_classThis, _classExtraInitializers);
468
+ }
469
+ };
470
+ return UiDatePickerModalInput = _classThis;
471
+ })();
472
+ export { UiDatePickerModalInput };
473
+ //# sourceMappingURL=ui-date-picker-modal-input.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,108 @@
1
+ import { LitElement, TemplateResult } from 'lit';
2
+ import { DateRange } from './internals/DatePickerUtils.js';
3
+ import './internals/DatePickerCalendar.js';
4
+ import '../../md/dialog/ui-dialog.js';
5
+ import '../../md/button/ui-button.js';
6
+ import '../../md/icon-button/ui-icon-button.js';
7
+ import '../../md/icons/ui-icon.js';
8
+ export interface ModalDatePickerChangeEvent {
9
+ range: DateRange;
10
+ formattedRange: {
11
+ start: string | null;
12
+ end: string | null;
13
+ };
14
+ }
15
+ /**
16
+ * A modal date picker for selecting date ranges.
17
+ * Extends full-screen and is ideal for date range selection like flight bookings.
18
+ *
19
+ * ## Usage
20
+ *
21
+ * ```html
22
+ * <ui-date-picker-modal
23
+ * .open=${true}
24
+ * .selectedRange=${{ start: new Date(), end: null }}
25
+ * @change=${this.handleRangeChange}
26
+ * @close=${this.handleClose}
27
+ * ></ui-date-picker-modal>
28
+ * ```
29
+ *
30
+ * ### Custom labels
31
+ * ```html
32
+ * <ui-date-picker-modal
33
+ * title="Select travel dates"
34
+ * startLabel="Check-in"
35
+ * endLabel="Check-out"
36
+ * ></ui-date-picker-modal>
37
+ * ```
38
+ */
39
+ export declare class UiDatePickerModal extends LitElement {
40
+ static styles: import("lit").CSSResult;
41
+ /**
42
+ * Whether the modal is open
43
+ */
44
+ accessor open: boolean;
45
+ /**
46
+ * The modal title
47
+ */
48
+ accessor title: string;
49
+ /**
50
+ * Label for the start date
51
+ */
52
+ accessor startLabel: string;
53
+ /**
54
+ * Label for the end date
55
+ */
56
+ accessor endLabel: string;
57
+ /**
58
+ * The selected date range
59
+ */
60
+ accessor selectedRange: DateRange | null;
61
+ /**
62
+ * Minimum selectable date
63
+ */
64
+ accessor minDate: Date | undefined;
65
+ /**
66
+ * Maximum selectable date
67
+ */
68
+ accessor maxDate: Date | undefined;
69
+ /**
70
+ * Array of disabled dates
71
+ */
72
+ accessor disabledDates: Date[] | undefined;
73
+ /**
74
+ * Locale for date formatting
75
+ */
76
+ accessor locale: string | undefined;
77
+ /**
78
+ * Whether to show edit/calendar toggle button
79
+ */
80
+ accessor showModeToggle: boolean;
81
+ private accessor _isInputMode;
82
+ private _handleRangeSelect;
83
+ private _handleCancel;
84
+ private _handleConfirm;
85
+ private _handleModeToggle;
86
+ private _dispatchChangeEvent;
87
+ private _dispatchCloseEvent;
88
+ private _renderHeader;
89
+ private _renderDateDisplay;
90
+ private _renderCalendar;
91
+ private _renderInputMode;
92
+ private _renderContent;
93
+ private _renderActions;
94
+ render(): TemplateResult;
95
+ }
96
+ declare global {
97
+ interface HTMLElementTagNameMap {
98
+ 'ui-date-picker-modal': UiDatePickerModal;
99
+ }
100
+ interface HTMLElementEventMap {
101
+ 'date-range-change': CustomEvent<ModalDatePickerChangeEvent>;
102
+ 'close': CustomEvent<{
103
+ confirmed: boolean;
104
+ range: DateRange | null;
105
+ }>;
106
+ }
107
+ }
108
+ //# sourceMappingURL=ui-date-picker-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-date-picker-modal.d.ts","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAA;AAGtD,OAAO,EAAE,SAAS,EAAc,MAAM,gCAAgC,CAAA;AAEtE,OAAO,mCAAmC,CAAA;AAC1C,OAAO,8BAA8B,CAAA;AACrC,OAAO,8BAA8B,CAAA;AACrC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,2BAA2B,CAAA;AAElC,MAAM,WAAW,0BAA0B;IACzC,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;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,OAAgB,MAAM,0BAAc;IAEpC;;OAEG;IAC0B,QAAQ,CAAC,IAAI,UAAQ;IAElD;;OAEG;IACH,SAA8C,KAAK,SAAiB;IAEpE;;OAEG;IACyB,QAAQ,CAAC,UAAU,SAAe;IAE9D;;OAEG;IACyB,QAAQ,CAAC,QAAQ,SAAa;IAE1D;;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;IACwB,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,SAAS,CAAY;IAEjF;;OAEG;IACyB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAY;IAE3E;;OAEG;IAC0B,QAAQ,CAAC,cAAc,UAAO;IAElD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAE9C,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAWb,MAAM,IAAI,cAAc;CAOlC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,iBAAiB,CAAA;KAC1C;IAED,UAAU,mBAAmB;QAC3B,mBAAmB,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAA;QAC5D,OAAO,EAAE,WAAW,CAAC;YACnB,SAAS,EAAE,OAAO,CAAA;YAClB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;SACxB,CAAC,CAAA;KACH;CACF"}