@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.
- package/.cursor/rules/html-and-css-best-practices.mdc +63 -0
- package/.cursor/rules/lit-best-practices.mdc +78 -0
- package/.github/instructions/html-and-css-best-practices.instructions.md +70 -0
- package/.github/instructions/lit-best-practices.instructions.md +86 -0
- package/build/src/elements/currency/currency-picker.d.ts +10 -0
- package/build/src/elements/currency/currency-picker.d.ts.map +1 -0
- package/build/src/elements/currency/currency-picker.js +27 -0
- package/build/src/elements/currency/currency-picker.js.map +1 -0
- package/build/src/elements/currency/internals/Picker.d.ts +311 -0
- package/build/src/elements/currency/internals/Picker.d.ts.map +1 -0
- package/build/src/elements/currency/internals/Picker.js +857 -0
- package/build/src/elements/currency/internals/Picker.js.map +1 -0
- package/build/src/elements/currency/internals/Picker.styles.d.ts +3 -0
- package/build/src/elements/currency/internals/Picker.styles.d.ts.map +1 -0
- package/build/src/elements/currency/internals/Picker.styles.js +58 -0
- package/build/src/elements/currency/internals/Picker.styles.js.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.d.ts +216 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.d.ts.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.js +1037 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.js.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.d.ts +3 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.d.ts.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.js +274 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.js.map +1 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.d.ts +13 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.d.ts.map +1 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.js +28 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.js.map +1 -0
- package/build/src/md/button/internals/base.d.ts +1 -0
- package/build/src/md/button/internals/base.d.ts.map +1 -1
- package/build/src/md/button/internals/base.js +7 -0
- package/build/src/md/button/internals/base.js.map +1 -1
- package/build/src/md/chip/internals/Chip.styles.d.ts.map +1 -1
- package/build/src/md/chip/internals/Chip.styles.js +2 -0
- package/build/src/md/chip/internals/Chip.styles.js.map +1 -1
- package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -1
- package/build/src/md/date-picker/internals/DatePicker.styles.js +73 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -1
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +164 -51
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -1
- package/build/src/md/date-picker/internals/DatePickerCalendar.js +660 -368
- package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-input.d.ts +65 -13
- package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-input.js +143 -76
- package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +76 -17
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal-input.js +192 -127
- package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts +63 -15
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal.js +143 -64
- package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -1
- package/demo/elements/currency/index.html +91 -0
- package/demo/elements/currency/index.ts +272 -0
- package/demo/elements/index.html +6 -0
- package/demo/elements/mention-textarea/index.html +19 -0
- package/demo/elements/mention-textarea/index.ts +205 -0
- package/demo/md/date-picker/date-picker.ts +138 -103
- package/package.json +2 -2
- package/src/elements/currency/currency-picker.ts +14 -0
- package/src/elements/currency/internals/Picker.styles.ts +58 -0
- package/src/elements/currency/internals/Picker.ts +846 -0
- package/src/elements/mention-textarea/internals/MentionTextArea.styles.ts +274 -0
- package/src/elements/mention-textarea/internals/MentionTextArea.ts +1036 -0
- package/src/elements/mention-textarea/ui-mention-textarea.ts +18 -0
- package/src/md/button/internals/base.ts +7 -0
- package/src/md/chip/internals/Chip.styles.ts +2 -0
- package/src/md/date-picker/internals/DatePicker.styles.ts +73 -0
- package/src/md/date-picker/internals/DatePickerCalendar.ts +643 -309
- package/src/md/date-picker/ui-date-picker-input.ts +110 -49
- package/src/md/date-picker/ui-date-picker-modal-input.ts +168 -99
- package/src/md/date-picker/ui-date-picker-modal.ts +136 -53
- package/test/README.md +3 -2
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +328 -0
- package/test/elements/currency/CurrencyPicker.core.test.ts +318 -0
- package/test/elements/currency/CurrencyPicker.integration.test.ts +482 -0
- package/test/elements/currency/CurrencyPicker.test.ts +486 -0
- package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +63 -0
- package/test/elements/mention-textarea/MentionTextArea.test.ts +321 -0
- 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
|
|
82
|
-
|
|
83
|
-
private
|
|
84
|
-
private
|
|
85
|
-
private
|
|
86
|
-
private
|
|
87
|
-
private
|
|
88
|
-
private
|
|
89
|
-
private
|
|
90
|
-
private
|
|
91
|
-
private
|
|
92
|
-
private
|
|
93
|
-
private
|
|
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
|
|
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
|
|
72
|
-
let
|
|
73
|
-
let
|
|
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
|
-
|
|
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,
|
|
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
|
-
#
|
|
202
|
-
get
|
|
203
|
-
set
|
|
204
|
-
|
|
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.
|
|
260
|
+
this.dispatchChangeEvent();
|
|
207
261
|
}
|
|
208
|
-
|
|
209
|
-
this.
|
|
262
|
+
handleCancel() {
|
|
263
|
+
this.dispatchCloseEvent(false);
|
|
210
264
|
}
|
|
211
|
-
|
|
212
|
-
this.
|
|
265
|
+
handleConfirm() {
|
|
266
|
+
this.dispatchCloseEvent(true);
|
|
213
267
|
}
|
|
214
|
-
|
|
215
|
-
this.
|
|
268
|
+
handleModeToggle() {
|
|
269
|
+
this.isInputMode = !this.isInputMode;
|
|
216
270
|
}
|
|
217
|
-
|
|
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
|
-
|
|
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
|
-
|
|
297
|
+
renderHeader() {
|
|
244
298
|
return html `
|
|
245
|
-
<
|
|
246
|
-
<h2 class="modal-title">${this.title}</h2>
|
|
247
|
-
<div
|
|
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.
|
|
252
|
-
aria-label=${this.
|
|
253
|
-
title=${this.
|
|
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.
|
|
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.
|
|
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
|
-
</
|
|
317
|
+
</header>
|
|
264
318
|
`;
|
|
265
319
|
}
|
|
266
|
-
|
|
320
|
+
renderDateDisplay() {
|
|
267
321
|
const startDate = this.selectedRange?.start;
|
|
268
322
|
const endDate = this.selectedRange?.end;
|
|
269
323
|
return html `
|
|
270
|
-
<
|
|
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"
|
|
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"
|
|
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
|
-
</
|
|
344
|
+
</section>
|
|
281
345
|
`;
|
|
282
346
|
}
|
|
283
|
-
|
|
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
|
-
.
|
|
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.
|
|
360
|
+
@date-range-select=${this.handleRangeSelect}
|
|
296
361
|
></ui-date-picker-calendar>
|
|
297
362
|
`;
|
|
298
363
|
}
|
|
299
|
-
|
|
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
|
-
<
|
|
304
|
-
<ui-icon icon="edit"
|
|
305
|
-
<
|
|
306
|
-
<p>This feature can be enhanced with date input fields</p>
|
|
307
|
-
|
|
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
|
-
|
|
374
|
+
renderContent() {
|
|
311
375
|
return html `
|
|
312
|
-
<
|
|
313
|
-
${this.
|
|
314
|
-
</
|
|
376
|
+
<main id="modal-content" class="modal-content">
|
|
377
|
+
${this.renderDateDisplay()} ${this.isInputMode ? this.renderInputMode() : this.renderCalendar()}
|
|
378
|
+
</main>
|
|
315
379
|
`;
|
|
316
380
|
}
|
|
317
|
-
|
|
381
|
+
renderActions() {
|
|
318
382
|
const hasValidRange = this.selectedRange?.start && this.selectedRange?.end;
|
|
319
383
|
return html `
|
|
320
|
-
<
|
|
321
|
-
<ui-button color="text" @click=${this.
|
|
322
|
-
<ui-button
|
|
323
|
-
|
|
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
|
|
329
|
-
|
|
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>
|