@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
@@ -16,23 +16,70 @@ export interface ModalDatePickerChangeEvent {
16
16
  * A modal date picker for selecting date ranges.
17
17
  * Extends full-screen and is ideal for date range selection like flight bookings.
18
18
  *
19
+ * ## Features
20
+ * - Full-screen modal interface
21
+ * - Date range selection with visual feedback
22
+ * - Calendar and input mode toggle
23
+ * - Min/max date constraints
24
+ * - Disabled dates support
25
+ * - Accessible design with proper ARIA attributes and semantic HTML
26
+ * - Real-time date range validation
27
+ *
28
+ * ## Events
29
+ *
30
+ * ### `date-range-change`
31
+ * Fired when a date range is selected or changed.
32
+ *
33
+ * **Detail:**
34
+ * ```typescript
35
+ * {
36
+ * range: DateRange,
37
+ * formattedRange: {
38
+ * start: string | null,
39
+ * end: string | null
40
+ * }
41
+ * }
42
+ * ```
43
+ *
44
+ * ### `close`
45
+ * Fired when the modal is closed.
46
+ *
47
+ * **Detail:**
48
+ * ```typescript
49
+ * {
50
+ * confirmed: boolean,
51
+ * range: DateRange | null
52
+ * }
53
+ * ```
54
+ *
19
55
  * ## Usage
20
56
  *
57
+ * ### Basic usage
21
58
  * ```html
22
59
  * <ui-date-picker-modal
23
60
  * .open=${true}
24
61
  * .selectedRange=${{ start: new Date(), end: null }}
25
- * @change=${this.handleRangeChange}
62
+ * @date-range-change=${this.handleRangeChange}
26
63
  * @close=${this.handleClose}
27
64
  * ></ui-date-picker-modal>
28
65
  * ```
29
66
  *
30
- * ### Custom labels
67
+ * ### Custom labels and constraints
31
68
  * ```html
32
69
  * <ui-date-picker-modal
33
70
  * title="Select travel dates"
34
71
  * startLabel="Check-in"
35
72
  * endLabel="Check-out"
73
+ * .minDate=${new Date()}
74
+ * .maxDate=${new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)}
75
+ * .disabledDates=${[new Date('2024-12-25')]}
76
+ * ></ui-date-picker-modal>
77
+ * ```
78
+ *
79
+ * ### With mode toggle disabled
80
+ * ```html
81
+ * <ui-date-picker-modal
82
+ * .showModeToggle=${false}
36
83
  * ></ui-date-picker-modal>
37
84
  * ```
38
85
  */
@@ -78,19 +125,20 @@ export declare class UiDatePickerModal extends LitElement {
78
125
  * Whether to show edit/calendar toggle button
79
126
  */
80
127
  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;
128
+ private accessor isInputMode;
129
+ constructor();
130
+ private handleRangeSelect;
131
+ private handleCancel;
132
+ private handleConfirm;
133
+ private handleModeToggle;
134
+ private dispatchChangeEvent;
135
+ private dispatchCloseEvent;
136
+ private renderHeader;
137
+ private renderDateDisplay;
138
+ private renderCalendar;
139
+ private renderInputMode;
140
+ private renderContent;
141
+ private renderActions;
94
142
  render(): TemplateResult;
95
143
  }
96
144
  declare global {
@@ -1 +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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;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,WAAW,CAAQ;;IAS7C,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAwBZ,MAAM,IAAI,cAAc;CAalC;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"}
@@ -12,23 +12,70 @@ import '../../md/icons/ui-icon.js';
12
12
  * A modal date picker for selecting date ranges.
13
13
  * Extends full-screen and is ideal for date range selection like flight bookings.
14
14
  *
15
+ * ## Features
16
+ * - Full-screen modal interface
17
+ * - Date range selection with visual feedback
18
+ * - Calendar and input mode toggle
19
+ * - Min/max date constraints
20
+ * - Disabled dates support
21
+ * - Accessible design with proper ARIA attributes and semantic HTML
22
+ * - Real-time date range validation
23
+ *
24
+ * ## Events
25
+ *
26
+ * ### `date-range-change`
27
+ * Fired when a date range is selected or changed.
28
+ *
29
+ * **Detail:**
30
+ * ```typescript
31
+ * {
32
+ * range: DateRange,
33
+ * formattedRange: {
34
+ * start: string | null,
35
+ * end: string | null
36
+ * }
37
+ * }
38
+ * ```
39
+ *
40
+ * ### `close`
41
+ * Fired when the modal is closed.
42
+ *
43
+ * **Detail:**
44
+ * ```typescript
45
+ * {
46
+ * confirmed: boolean,
47
+ * range: DateRange | null
48
+ * }
49
+ * ```
50
+ *
15
51
  * ## Usage
16
52
  *
53
+ * ### Basic usage
17
54
  * ```html
18
55
  * <ui-date-picker-modal
19
56
  * .open=${true}
20
57
  * .selectedRange=${{ start: new Date(), end: null }}
21
- * @change=${this.handleRangeChange}
58
+ * @date-range-change=${this.handleRangeChange}
22
59
  * @close=${this.handleClose}
23
60
  * ></ui-date-picker-modal>
24
61
  * ```
25
62
  *
26
- * ### Custom labels
63
+ * ### Custom labels and constraints
27
64
  * ```html
28
65
  * <ui-date-picker-modal
29
66
  * title="Select travel dates"
30
67
  * startLabel="Check-in"
31
68
  * endLabel="Check-out"
69
+ * .minDate=${new Date()}
70
+ * .maxDate=${new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)}
71
+ * .disabledDates=${[new Date('2024-12-25')]}
72
+ * ></ui-date-picker-modal>
73
+ * ```
74
+ *
75
+ * ### With mode toggle disabled
76
+ * ```html
77
+ * <ui-date-picker-modal
78
+ * .showModeToggle=${false}
32
79
  * ></ui-date-picker-modal>
33
80
  * ```
34
81
  */
@@ -68,9 +115,9 @@ let UiDatePickerModal = (() => {
68
115
  let _showModeToggle_decorators;
69
116
  let _showModeToggle_initializers = [];
70
117
  let _showModeToggle_extraInitializers = [];
71
- let __isInputMode_decorators;
72
- let __isInputMode_initializers = [];
73
- let __isInputMode_extraInitializers = [];
118
+ let _isInputMode_decorators;
119
+ let _isInputMode_initializers = [];
120
+ let _isInputMode_extraInitializers = [];
74
121
  var UiDatePickerModal = class extends _classSuper {
75
122
  static { _classThis = this; }
76
123
  static {
@@ -85,7 +132,7 @@ let UiDatePickerModal = (() => {
85
132
  _disabledDates_decorators = [property({ type: Array })];
86
133
  _locale_decorators = [property({ type: String })];
87
134
  _showModeToggle_decorators = [property({ type: Boolean })];
88
- __isInputMode_decorators = [state()];
135
+ _isInputMode_decorators = [state()];
89
136
  __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);
90
137
  __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);
91
138
  __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);
@@ -96,7 +143,7 @@ let UiDatePickerModal = (() => {
96
143
  __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);
97
144
  __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);
98
145
  __esDecorate(this, null, _showModeToggle_decorators, { kind: "accessor", name: "showModeToggle", static: false, private: false, access: { has: obj => "showModeToggle" in obj, get: obj => obj.showModeToggle, set: (obj, value) => { obj.showModeToggle = value; } }, metadata: _metadata }, _showModeToggle_initializers, _showModeToggle_extraInitializers);
99
- __esDecorate(this, null, __isInputMode_decorators, { kind: "accessor", name: "_isInputMode", static: false, private: false, access: { has: obj => "_isInputMode" in obj, get: obj => obj._isInputMode, set: (obj, value) => { obj._isInputMode = value; } }, metadata: _metadata }, __isInputMode_initializers, __isInputMode_extraInitializers);
146
+ __esDecorate(this, null, _isInputMode_decorators, { kind: "accessor", name: "isInputMode", static: false, private: false, access: { has: obj => "isInputMode" in obj, get: obj => obj.isInputMode, set: (obj, value) => { obj.isInputMode = value; } }, metadata: _metadata }, _isInputMode_initializers, _isInputMode_extraInitializers);
100
147
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
101
148
  UiDatePickerModal = _classThis = _classDescriptor.value;
102
149
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -198,23 +245,30 @@ let UiDatePickerModal = (() => {
198
245
  */
199
246
  get showModeToggle() { return this.#showModeToggle_accessor_storage; }
200
247
  set showModeToggle(value) { this.#showModeToggle_accessor_storage = value; }
201
- #_isInputMode_accessor_storage = (__runInitializers(this, _showModeToggle_extraInitializers), __runInitializers(this, __isInputMode_initializers, false));
202
- get _isInputMode() { return this.#_isInputMode_accessor_storage; }
203
- set _isInputMode(value) { this.#_isInputMode_accessor_storage = value; }
204
- _handleRangeSelect(event) {
248
+ #isInputMode_accessor_storage = (__runInitializers(this, _showModeToggle_extraInitializers), __runInitializers(this, _isInputMode_initializers, false));
249
+ get isInputMode() { return this.#isInputMode_accessor_storage; }
250
+ set isInputMode(value) { this.#isInputMode_accessor_storage = value; }
251
+ constructor() {
252
+ super();
253
+ __runInitializers(this, _isInputMode_extraInitializers);
254
+ // Initialize boolean properties to false as per Lit best practices
255
+ this.open = false;
256
+ this.showModeToggle = true;
257
+ }
258
+ handleRangeSelect(event) {
205
259
  this.selectedRange = event.detail.range;
206
- this._dispatchChangeEvent();
260
+ this.dispatchChangeEvent();
207
261
  }
208
- _handleCancel() {
209
- this._dispatchCloseEvent(false);
262
+ handleCancel() {
263
+ this.dispatchCloseEvent(false);
210
264
  }
211
- _handleConfirm() {
212
- this._dispatchCloseEvent(true);
265
+ handleConfirm() {
266
+ this.dispatchCloseEvent(true);
213
267
  }
214
- _handleModeToggle() {
215
- this._isInputMode = !this._isInputMode;
268
+ handleModeToggle() {
269
+ this.isInputMode = !this.isInputMode;
216
270
  }
217
- _dispatchChangeEvent() {
271
+ dispatchChangeEvent() {
218
272
  if (!this.selectedRange)
219
273
  return;
220
274
  const event = {
@@ -230,7 +284,7 @@ let UiDatePickerModal = (() => {
230
284
  composed: true,
231
285
  }));
232
286
  }
233
- _dispatchCloseEvent(confirmed) {
287
+ dispatchCloseEvent(confirmed) {
234
288
  this.dispatchEvent(new CustomEvent('close', {
235
289
  detail: {
236
290
  confirmed,
@@ -240,100 +294,125 @@ let UiDatePickerModal = (() => {
240
294
  composed: true,
241
295
  }));
242
296
  }
243
- _renderHeader() {
297
+ renderHeader() {
244
298
  return html `
245
- <div class="modal-header">
246
- <h2 class="modal-title">${this.title}</h2>
247
- <div style="display: flex; gap: 8px;">
299
+ <header class="modal-header">
300
+ <h2 id="modal-title" class="modal-title">${this.title}</h2>
301
+ <div class="header-actions">
248
302
  ${this.showModeToggle
249
303
  ? html `
250
304
  <ui-icon-button
251
- @click=${this._handleModeToggle}
252
- aria-label=${this._isInputMode ? 'Show calendar' : 'Show date input'}
253
- title=${this._isInputMode ? 'Show calendar' : 'Show date input'}
305
+ @click=${this.handleModeToggle}
306
+ aria-label=${this.isInputMode ? 'Show calendar' : 'Show date input'}
307
+ title=${this.isInputMode ? 'Show calendar' : 'Show date input'}
254
308
  >
255
- <ui-icon icon=${this._isInputMode ? 'calendarToday' : 'edit'}></ui-icon>
309
+ <ui-icon icon=${this.isInputMode ? 'calendarToday' : 'edit'}></ui-icon>
256
310
  </ui-icon-button>
257
311
  `
258
312
  : ''}
259
- <ui-icon-button @click=${this._handleCancel} aria-label="Close" title="Close">
313
+ <ui-icon-button @click=${this.handleCancel} aria-label="Close" title="Close">
260
314
  <ui-icon icon="close"></ui-icon>
261
315
  </ui-icon-button>
262
316
  </div>
263
- </div>
317
+ </header>
264
318
  `;
265
319
  }
266
- _renderDateDisplay() {
320
+ renderDateDisplay() {
267
321
  const startDate = this.selectedRange?.start;
268
322
  const endDate = this.selectedRange?.end;
269
323
  return html `
270
- <div class="date-range-display">
324
+ <section class="date-range-display" role="status" aria-live="polite" aria-label="Selected date range">
271
325
  <div class="date-display">
272
- <div class="date-label">${this.startLabel}</div>
273
- <div class="date-value">${startDate ? formatDate(startDate, this.locale) : 'Select date'}</div>
326
+ <div class="date-label" id="start-label">${this.startLabel}</div>
327
+ <div class="date-value" aria-labelledby="start-label" aria-describedby="start-description">
328
+ ${startDate ? formatDate(startDate, this.locale) : 'Select date'}
329
+ </div>
330
+ <div id="start-description" class="visually-hidden">
331
+ ${startDate ? `Start date selected: ${formatDate(startDate, this.locale)}` : 'No start date selected'}
332
+ </div>
274
333
  </div>
275
- <div class="date-separator">—</div>
334
+ <div class="date-separator" aria-hidden="true">—</div>
276
335
  <div class="date-display">
277
- <div class="date-label">${this.endLabel}</div>
278
- <div class="date-value">${endDate ? formatDate(endDate, this.locale) : 'Select date'}</div>
336
+ <div class="date-label" id="end-label">${this.endLabel}</div>
337
+ <div class="date-value" aria-labelledby="end-label" aria-describedby="end-description">
338
+ ${endDate ? formatDate(endDate, this.locale) : 'Select date'}
339
+ </div>
340
+ <div id="end-description" class="visually-hidden">
341
+ ${endDate ? `End date selected: ${formatDate(endDate, this.locale)}` : 'No end date selected'}
342
+ </div>
279
343
  </div>
280
- </div>
344
+ </section>
281
345
  `;
282
346
  }
283
- _renderCalendar() {
347
+ renderCalendar() {
284
348
  const currentDate = this.selectedRange?.start || new Date();
285
349
  return html `
286
350
  <ui-date-picker-calendar
287
351
  .year=${currentDate.getFullYear()}
288
352
  .month=${currentDate.getMonth()}
289
- .selectedRange=${this.selectedRange}
353
+ .rangeStart=${this.selectedRange?.start || null}
354
+ .rangeEnd=${this.selectedRange?.end || null}
290
355
  .rangeSelection=${true}
291
356
  .minDate=${this.minDate}
292
357
  .maxDate=${this.maxDate}
293
358
  .disabledDates=${this.disabledDates}
294
359
  .locale=${this.locale}
295
- @date-range-select=${this._handleRangeSelect}
360
+ @date-range-select=${this.handleRangeSelect}
296
361
  ></ui-date-picker-calendar>
297
362
  `;
298
363
  }
299
- _renderInputMode() {
300
- // For now, we'll show a placeholder for input mode
301
- // This could be enhanced with actual date input fields
364
+ renderInputMode() {
302
365
  return html `
303
- <div style="padding: 24px; text-align: center; color: var(--ui-color-on-surface-variant);">
304
- <ui-icon icon="edit" style="font-size: 48px; margin-bottom: 16px;"></ui-icon>
305
- <p>Manual date input mode</p>
306
- <p>This feature can be enhanced with date input fields</p>
307
- </div>
366
+ <section class="input-mode-placeholder" role="status" aria-live="polite">
367
+ <ui-icon icon="edit" class="input-mode-icon" aria-hidden="true"></ui-icon>
368
+ <h3>Manual date input mode</h3>
369
+ <p>This feature can be enhanced with date input fields for direct text entry</p>
370
+ <p><em>Use the calendar toggle button to return to calendar view</em></p>
371
+ </section>
308
372
  `;
309
373
  }
310
- _renderContent() {
374
+ renderContent() {
311
375
  return html `
312
- <div class="modal-content">
313
- ${this._renderDateDisplay()} ${this._isInputMode ? this._renderInputMode() : this._renderCalendar()}
314
- </div>
376
+ <main id="modal-content" class="modal-content">
377
+ ${this.renderDateDisplay()} ${this.isInputMode ? this.renderInputMode() : this.renderCalendar()}
378
+ </main>
315
379
  `;
316
380
  }
317
- _renderActions() {
381
+ renderActions() {
318
382
  const hasValidRange = this.selectedRange?.start && this.selectedRange?.end;
319
383
  return html `
320
- <div class="modal-actions">
321
- <ui-button color="text" @click=${this._handleCancel}>Cancel</ui-button>
322
- <ui-button color="filled" @click=${this._handleConfirm} .disabled=${!hasValidRange}> Confirm </ui-button>
323
- </div>
384
+ <footer class="modal-actions" role="group" aria-label="Date picker actions">
385
+ <ui-button color="text" @click=${this.handleCancel} aria-describedby="cancel-description"> Cancel </ui-button>
386
+ <ui-button
387
+ color="filled"
388
+ @click=${this.handleConfirm}
389
+ .disabled=${!hasValidRange}
390
+ aria-describedby="confirm-description"
391
+ >
392
+ Confirm
393
+ </ui-button>
394
+ <div id="cancel-description" class="visually-hidden">Close the date picker without saving changes</div>
395
+ <div id="confirm-description" class="visually-hidden">
396
+ ${hasValidRange
397
+ ? 'Save the selected date range and close the picker'
398
+ : 'Select both start and end dates to confirm the selection'}
399
+ </div>
400
+ </footer>
324
401
  `;
325
402
  }
326
403
  render() {
327
404
  return html `
328
- <ui-dialog .open=${this.open} @close=${this._handleCancel}>
329
- ${this._renderHeader()} ${this._renderContent()} ${this._renderActions()}
405
+ <ui-dialog
406
+ .open=${this.open}
407
+ @close=${this.handleCancel}
408
+ role="dialog"
409
+ aria-labelledby="modal-title"
410
+ aria-describedby="modal-content"
411
+ >
412
+ ${this.renderHeader()} ${this.renderContent()} ${this.renderActions()}
330
413
  </ui-dialog>
331
414
  `;
332
415
  }
333
- constructor() {
334
- super(...arguments);
335
- __runInitializers(this, __isInputMode_extraInitializers);
336
- }
337
416
  static {
338
417
  __runInitializers(_classThis, _classExtraInitializers);
339
418
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ui-date-picker-modal.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal.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 } from './internals/DatePickerUtils.js'\nimport type { DateRangeSelectEvent } from './internals/DatePickerCalendar.js'\nimport './internals/DatePickerCalendar.js'\nimport '../../md/dialog/ui-dialog.js'\nimport '../../md/button/ui-button.js'\nimport '../../md/icon-button/ui-icon-button.js'\nimport '../../md/icons/ui-icon.js'\n\nexport interface ModalDatePickerChangeEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * A modal date picker for selecting date ranges.\n * Extends full-screen and is ideal for date range selection like flight bookings.\n *\n * ## Usage\n *\n * ```html\n * <ui-date-picker-modal\n * .open=${true}\n * .selectedRange=${{ start: new Date(), end: null }}\n * @change=${this.handleRangeChange}\n * @close=${this.handleClose}\n * ></ui-date-picker-modal>\n * ```\n *\n * ### Custom labels\n * ```html\n * <ui-date-picker-modal\n * title=\"Select travel dates\"\n * startLabel=\"Check-in\"\n * endLabel=\"Check-out\"\n * ></ui-date-picker-modal>\n * ```\n */\n@customElement('ui-date-picker-modal')\nexport class UiDatePickerModal 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 = 'Select dates'\n\n /**\n * Label for the start date\n */\n @property({ type: String }) accessor startLabel = 'Start date'\n\n /**\n * Label for the end date\n */\n @property({ type: String }) accessor endLabel = 'End date'\n\n /**\n * The selected date range\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 * 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 * Whether to show edit/calendar toggle button\n */\n @property({ type: Boolean }) accessor showModeToggle = true\n\n @state() private accessor _isInputMode = false\n\n private _handleRangeSelect(event: CustomEvent<DateRangeSelectEvent>): void {\n this.selectedRange = event.detail.range\n this._dispatchChangeEvent()\n }\n\n private _handleCancel(): void {\n this._dispatchCloseEvent(false)\n }\n\n private _handleConfirm(): void {\n this._dispatchCloseEvent(true)\n }\n\n private _handleModeToggle(): void {\n this._isInputMode = !this._isInputMode\n }\n\n private _dispatchChangeEvent(): void {\n if (!this.selectedRange) return\n\n const event: ModalDatePickerChangeEvent = {\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-range-change', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private _dispatchCloseEvent(confirmed: boolean): void {\n this.dispatchEvent(\n new CustomEvent('close', {\n detail: {\n confirmed,\n range: confirmed ? 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 <div style=\"display: flex; gap: 8px;\">\n ${this.showModeToggle\n ? html`\n <ui-icon-button\n @click=${this._handleModeToggle}\n aria-label=${this._isInputMode ? 'Show calendar' : 'Show date input'}\n title=${this._isInputMode ? 'Show calendar' : 'Show date input'}\n >\n <ui-icon icon=${this._isInputMode ? 'calendarToday' : 'edit'}></ui-icon>\n </ui-icon-button>\n `\n : ''}\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 </div>\n `\n }\n\n private _renderDateDisplay(): TemplateResult {\n const startDate = this.selectedRange?.start\n const endDate = this.selectedRange?.end\n\n return html`\n <div class=\"date-range-display\">\n <div class=\"date-display\">\n <div class=\"date-label\">${this.startLabel}</div>\n <div class=\"date-value\">${startDate ? formatDate(startDate, this.locale) : 'Select date'}</div>\n </div>\n <div class=\"date-separator\">—</div>\n <div class=\"date-display\">\n <div class=\"date-label\">${this.endLabel}</div>\n <div class=\"date-value\">${endDate ? formatDate(endDate, this.locale) : 'Select date'}</div>\n </div>\n </div>\n `\n }\n\n private _renderCalendar(): TemplateResult {\n const currentDate = this.selectedRange?.start || new Date()\n\n return html`\n <ui-date-picker-calendar\n .year=${currentDate.getFullYear()}\n .month=${currentDate.getMonth()}\n .selectedRange=${this.selectedRange}\n .rangeSelection=${true}\n .minDate=${this.minDate}\n .maxDate=${this.maxDate}\n .disabledDates=${this.disabledDates}\n .locale=${this.locale}\n @date-range-select=${this._handleRangeSelect}\n ></ui-date-picker-calendar>\n `\n }\n\n private _renderInputMode(): TemplateResult {\n // For now, we'll show a placeholder for input mode\n // This could be enhanced with actual date input fields\n return html`\n <div style=\"padding: 24px; text-align: center; color: var(--ui-color-on-surface-variant);\">\n <ui-icon icon=\"edit\" style=\"font-size: 48px; margin-bottom: 16px;\"></ui-icon>\n <p>Manual date input mode</p>\n <p>This feature can be enhanced with date input fields</p>\n </div>\n `\n }\n\n private _renderContent(): TemplateResult {\n return html`\n <div class=\"modal-content\">\n ${this._renderDateDisplay()} ${this._isInputMode ? this._renderInputMode() : this._renderCalendar()}\n </div>\n `\n }\n\n private _renderActions(): TemplateResult {\n const hasValidRange = this.selectedRange?.start && this.selectedRange?.end\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=${!hasValidRange}> 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._renderContent()} ${this._renderActions()}\n </ui-dialog>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-modal': UiDatePickerModal\n }\n\n interface HTMLElementEventMap {\n 'date-range-change': CustomEvent<ModalDatePickerChangeEvent>\n 'close': CustomEvent<{\n confirmed: boolean\n range: DateRange | null\n }>\n }\n}\n"]}
1
+ {"version":3,"file":"ui-date-picker-modal.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal.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 } from './internals/DatePickerUtils.js'\nimport type { DateRangeSelectEvent } from './internals/DatePickerCalendar.js'\nimport './internals/DatePickerCalendar.js'\nimport '../../md/dialog/ui-dialog.js'\nimport '../../md/button/ui-button.js'\nimport '../../md/icon-button/ui-icon-button.js'\nimport '../../md/icons/ui-icon.js'\n\nexport interface ModalDatePickerChangeEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * A modal date picker for selecting date ranges.\n * Extends full-screen and is ideal for date range selection like flight bookings.\n *\n * ## Features\n * - Full-screen modal interface\n * - Date range selection with visual feedback\n * - Calendar and input mode toggle\n * - Min/max date constraints\n * - Disabled dates support\n * - Accessible design with proper ARIA attributes and semantic HTML\n * - Real-time date range validation\n *\n * ## Events\n *\n * ### `date-range-change`\n * Fired when a date range is selected or changed.\n *\n * **Detail:**\n * ```typescript\n * {\n * range: DateRange,\n * formattedRange: {\n * start: string | null,\n * end: string | null\n * }\n * }\n * ```\n *\n * ### `close`\n * Fired when the modal is closed.\n *\n * **Detail:**\n * ```typescript\n * {\n * confirmed: boolean,\n * range: DateRange | null\n * }\n * ```\n *\n * ## Usage\n *\n * ### Basic usage\n * ```html\n * <ui-date-picker-modal\n * .open=${true}\n * .selectedRange=${{ start: new Date(), end: null }}\n * @date-range-change=${this.handleRangeChange}\n * @close=${this.handleClose}\n * ></ui-date-picker-modal>\n * ```\n *\n * ### Custom labels and constraints\n * ```html\n * <ui-date-picker-modal\n * title=\"Select travel dates\"\n * startLabel=\"Check-in\"\n * endLabel=\"Check-out\"\n * .minDate=${new Date()}\n * .maxDate=${new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)}\n * .disabledDates=${[new Date('2024-12-25')]}\n * ></ui-date-picker-modal>\n * ```\n *\n * ### With mode toggle disabled\n * ```html\n * <ui-date-picker-modal\n * .showModeToggle=${false}\n * ></ui-date-picker-modal>\n * ```\n */\n@customElement('ui-date-picker-modal')\nexport class UiDatePickerModal 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 = 'Select dates'\n\n /**\n * Label for the start date\n */\n @property({ type: String }) accessor startLabel = 'Start date'\n\n /**\n * Label for the end date\n */\n @property({ type: String }) accessor endLabel = 'End date'\n\n /**\n * The selected date range\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 * 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 * Whether to show edit/calendar toggle button\n */\n @property({ type: Boolean }) accessor showModeToggle = true\n\n @state() private accessor isInputMode = false\n\n constructor() {\n super()\n // Initialize boolean properties to false as per Lit best practices\n this.open = false\n this.showModeToggle = true\n }\n\n private handleRangeSelect(event: CustomEvent<DateRangeSelectEvent>): void {\n this.selectedRange = event.detail.range\n this.dispatchChangeEvent()\n }\n\n private handleCancel(): void {\n this.dispatchCloseEvent(false)\n }\n\n private handleConfirm(): void {\n this.dispatchCloseEvent(true)\n }\n\n private handleModeToggle(): void {\n this.isInputMode = !this.isInputMode\n }\n\n private dispatchChangeEvent(): void {\n if (!this.selectedRange) return\n\n const event: ModalDatePickerChangeEvent = {\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-range-change', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private dispatchCloseEvent(confirmed: boolean): void {\n this.dispatchEvent(\n new CustomEvent('close', {\n detail: {\n confirmed,\n range: confirmed ? this.selectedRange : null,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private renderHeader(): TemplateResult {\n return html`\n <header class=\"modal-header\">\n <h2 id=\"modal-title\" class=\"modal-title\">${this.title}</h2>\n <div class=\"header-actions\">\n ${this.showModeToggle\n ? html`\n <ui-icon-button\n @click=${this.handleModeToggle}\n aria-label=${this.isInputMode ? 'Show calendar' : 'Show date input'}\n title=${this.isInputMode ? 'Show calendar' : 'Show date input'}\n >\n <ui-icon icon=${this.isInputMode ? 'calendarToday' : 'edit'}></ui-icon>\n </ui-icon-button>\n `\n : ''}\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 </header>\n `\n }\n\n private renderDateDisplay(): TemplateResult {\n const startDate = this.selectedRange?.start\n const endDate = this.selectedRange?.end\n\n return html`\n <section class=\"date-range-display\" role=\"status\" aria-live=\"polite\" aria-label=\"Selected date range\">\n <div class=\"date-display\">\n <div class=\"date-label\" id=\"start-label\">${this.startLabel}</div>\n <div class=\"date-value\" aria-labelledby=\"start-label\" aria-describedby=\"start-description\">\n ${startDate ? formatDate(startDate, this.locale) : 'Select date'}\n </div>\n <div id=\"start-description\" class=\"visually-hidden\">\n ${startDate ? `Start date selected: ${formatDate(startDate, this.locale)}` : 'No start date selected'}\n </div>\n </div>\n <div class=\"date-separator\" aria-hidden=\"true\">—</div>\n <div class=\"date-display\">\n <div class=\"date-label\" id=\"end-label\">${this.endLabel}</div>\n <div class=\"date-value\" aria-labelledby=\"end-label\" aria-describedby=\"end-description\">\n ${endDate ? formatDate(endDate, this.locale) : 'Select date'}\n </div>\n <div id=\"end-description\" class=\"visually-hidden\">\n ${endDate ? `End date selected: ${formatDate(endDate, this.locale)}` : 'No end date selected'}\n </div>\n </div>\n </section>\n `\n }\n\n private renderCalendar(): TemplateResult {\n const currentDate = this.selectedRange?.start || new Date()\n\n return html`\n <ui-date-picker-calendar\n .year=${currentDate.getFullYear()}\n .month=${currentDate.getMonth()}\n .rangeStart=${this.selectedRange?.start || null}\n .rangeEnd=${this.selectedRange?.end || null}\n .rangeSelection=${true}\n .minDate=${this.minDate}\n .maxDate=${this.maxDate}\n .disabledDates=${this.disabledDates}\n .locale=${this.locale}\n @date-range-select=${this.handleRangeSelect}\n ></ui-date-picker-calendar>\n `\n }\n\n private renderInputMode(): TemplateResult {\n return html`\n <section class=\"input-mode-placeholder\" role=\"status\" aria-live=\"polite\">\n <ui-icon icon=\"edit\" class=\"input-mode-icon\" aria-hidden=\"true\"></ui-icon>\n <h3>Manual date input mode</h3>\n <p>This feature can be enhanced with date input fields for direct text entry</p>\n <p><em>Use the calendar toggle button to return to calendar view</em></p>\n </section>\n `\n }\n\n private renderContent(): TemplateResult {\n return html`\n <main id=\"modal-content\" class=\"modal-content\">\n ${this.renderDateDisplay()} ${this.isInputMode ? this.renderInputMode() : this.renderCalendar()}\n </main>\n `\n }\n\n private renderActions(): TemplateResult {\n const hasValidRange = this.selectedRange?.start && this.selectedRange?.end\n\n return html`\n <footer class=\"modal-actions\" role=\"group\" aria-label=\"Date picker actions\">\n <ui-button color=\"text\" @click=${this.handleCancel} aria-describedby=\"cancel-description\"> Cancel </ui-button>\n <ui-button\n color=\"filled\"\n @click=${this.handleConfirm}\n .disabled=${!hasValidRange}\n aria-describedby=\"confirm-description\"\n >\n Confirm\n </ui-button>\n <div id=\"cancel-description\" class=\"visually-hidden\">Close the date picker without saving changes</div>\n <div id=\"confirm-description\" class=\"visually-hidden\">\n ${hasValidRange\n ? 'Save the selected date range and close the picker'\n : 'Select both start and end dates to confirm the selection'}\n </div>\n </footer>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <ui-dialog\n .open=${this.open}\n @close=${this.handleCancel}\n role=\"dialog\"\n aria-labelledby=\"modal-title\"\n aria-describedby=\"modal-content\"\n >\n ${this.renderHeader()} ${this.renderContent()} ${this.renderActions()}\n </ui-dialog>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-modal': UiDatePickerModal\n }\n\n interface HTMLElementEventMap {\n 'date-range-change': CustomEvent<ModalDatePickerChangeEvent>\n 'close': CustomEvent<{\n confirmed: boolean\n range: DateRange | null\n }>\n }\n}\n"]}
@@ -0,0 +1,91 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
7
+ <title>Currency Picker</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
12
+ rel="stylesheet"
13
+ />
14
+ <link href="../../../src/styles/m3/tokens.css" rel="stylesheet" type="text/css" />
15
+ <link href="../../../src/styles/m3/theme.css" rel="stylesheet" type="text/css" />
16
+ <link href="../../page.css" rel="stylesheet" type="text/css" />
17
+ <style>
18
+ .demo-section {
19
+ margin: 2rem 0;
20
+ padding: 1.5rem;
21
+ border: 1px solid var(--md-sys-color-outline-variant);
22
+ border-radius: 12px;
23
+ background: var(--md-sys-color-surface-container-lowest);
24
+ }
25
+
26
+ .demo-section h3 {
27
+ margin-top: 0;
28
+ color: var(--md-sys-color-on-surface);
29
+ font-weight: 500;
30
+ }
31
+
32
+ .demo-section p {
33
+ margin-bottom: 1rem;
34
+ color: var(--md-sys-color-on-surface-variant);
35
+ }
36
+
37
+ .output-section {
38
+ margin-top: 1rem;
39
+ padding: 1rem;
40
+ background: var(--md-sys-color-surface-container);
41
+ border-radius: 8px;
42
+ border-left: 4px solid var(--md-sys-color-primary);
43
+ }
44
+
45
+ .output-section h4 {
46
+ margin: 0 0 0.5rem 0;
47
+ font-size: 0.875rem;
48
+ font-weight: 500;
49
+ color: var(--md-sys-color-primary);
50
+ text-transform: uppercase;
51
+ letter-spacing: 0.1em;
52
+ }
53
+
54
+ .output-content {
55
+ font-family: 'Roboto Mono', monospace;
56
+ font-size: 0.875rem;
57
+ color: var(--md-sys-color-on-surface);
58
+ white-space: pre-wrap;
59
+ word-wrap: break-word;
60
+ }
61
+
62
+ .demo-controls {
63
+ display: flex;
64
+ flex-wrap: wrap;
65
+ gap: 1rem;
66
+ margin-bottom: 1rem;
67
+ }
68
+
69
+ .demo-controls currency-picker {
70
+ flex: 1;
71
+ min-width: 200px;
72
+ }
73
+
74
+ @media (max-width: 768px) {
75
+ .demo-controls {
76
+ flex-direction: column;
77
+ }
78
+
79
+ .demo-controls currency-picker {
80
+ min-width: unset;
81
+ }
82
+ }
83
+ </style>
84
+ </head>
85
+
86
+ <body>
87
+ <div id="app"></div>
88
+ <script type="module" src="/.tmp/demo/elements/currency/index.js"></script>
89
+ </body>
90
+
91
+ </html>