@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
|
@@ -11,13 +11,52 @@ import '../../md/icons/ui-icon.js'
|
|
|
11
11
|
* A docked date picker that opens from a text field input.
|
|
12
12
|
* Ideal for forms and date selection in medium to large layouts.
|
|
13
13
|
*
|
|
14
|
+
* ## Features
|
|
15
|
+
* - Text field input with calendar dropdown
|
|
16
|
+
* - Keyboard navigation support (Arrow Down, Enter, Escape)
|
|
17
|
+
* - Custom date formatting
|
|
18
|
+
* - Input validation and error handling
|
|
19
|
+
* - Min/max date constraints
|
|
20
|
+
* - Disabled dates support
|
|
21
|
+
* - Accessible design with proper ARIA attributes
|
|
22
|
+
* - CSS Anchor Positioning API for dropdown placement
|
|
23
|
+
*
|
|
24
|
+
* ## Events
|
|
25
|
+
*
|
|
26
|
+
* ### `change`
|
|
27
|
+
* Fired when the selected date changes.
|
|
28
|
+
*
|
|
29
|
+
* **Detail:**
|
|
30
|
+
* ```typescript
|
|
31
|
+
* {
|
|
32
|
+
* value: Date | null,
|
|
33
|
+
* formattedValue: string
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
14
37
|
* ## Usage
|
|
15
38
|
*
|
|
39
|
+
* ### Basic usage
|
|
16
40
|
* ```html
|
|
17
41
|
* <ui-date-picker-input
|
|
18
42
|
* label="Select date"
|
|
43
|
+
* name="birthDate"
|
|
19
44
|
* placeholder="MM/DD/YYYY"
|
|
20
45
|
* .value=${new Date()}
|
|
46
|
+
* @change=${this.handleDateChange}
|
|
47
|
+
* ></ui-date-picker-input>
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* ### With validation
|
|
51
|
+
* ```html
|
|
52
|
+
* <ui-date-picker-input
|
|
53
|
+
* label="Birth date"
|
|
54
|
+
* name="birthDate"
|
|
55
|
+
* required
|
|
56
|
+
* .error=${this.hasError}
|
|
57
|
+
* .errorMessage=${"Please select a valid date"}
|
|
58
|
+
* .minDate=${new Date('1900-01-01')}
|
|
59
|
+
* .maxDate=${new Date()}
|
|
21
60
|
* ></ui-date-picker-input>
|
|
22
61
|
* ```
|
|
23
62
|
*
|
|
@@ -28,6 +67,14 @@ import '../../md/icons/ui-icon.js'
|
|
|
28
67
|
* .dateFormat=${date => date.toLocaleDateString('en-GB')}
|
|
29
68
|
* ></ui-date-picker-input>
|
|
30
69
|
* ```
|
|
70
|
+
*
|
|
71
|
+
* ### With disabled dates
|
|
72
|
+
* ```html
|
|
73
|
+
* <ui-date-picker-input
|
|
74
|
+
* label="Appointment date"
|
|
75
|
+
* .disabledDates=${[new Date('2024-12-25'), new Date('2024-01-01')]}
|
|
76
|
+
* ></ui-date-picker-input>
|
|
77
|
+
* ```
|
|
31
78
|
*/
|
|
32
79
|
@customElement('ui-date-picker-input')
|
|
33
80
|
export class UiDatePickerInput extends LitElement {
|
|
@@ -42,6 +89,11 @@ export class UiDatePickerInput extends LitElement {
|
|
|
42
89
|
*/
|
|
43
90
|
@property({ type: String }) accessor label = ''
|
|
44
91
|
|
|
92
|
+
/**
|
|
93
|
+
* The name attribute for the input field (for form handling)
|
|
94
|
+
*/
|
|
95
|
+
@property({ type: String }) accessor name = ''
|
|
96
|
+
|
|
45
97
|
/**
|
|
46
98
|
* Placeholder text for the input
|
|
47
99
|
*/
|
|
@@ -97,106 +149,114 @@ export class UiDatePickerInput extends LitElement {
|
|
|
97
149
|
*/
|
|
98
150
|
@property({ type: Object }) accessor dateFormat: ((date: Date) => string) | undefined = undefined
|
|
99
151
|
|
|
100
|
-
@state() private accessor
|
|
152
|
+
@state() private accessor isOpen = false
|
|
101
153
|
|
|
102
|
-
@state() private accessor
|
|
154
|
+
@state() private accessor inputValue = ''
|
|
103
155
|
|
|
104
|
-
@query('ui-outlined-text-field') private accessor
|
|
156
|
+
@query('ui-outlined-text-field') private accessor textField!: HTMLElement
|
|
157
|
+
|
|
158
|
+
constructor() {
|
|
159
|
+
super()
|
|
160
|
+
// Initialize boolean properties to false as per Lit best practices
|
|
161
|
+
this.disabled = false
|
|
162
|
+
this.required = false
|
|
163
|
+
this.error = false
|
|
164
|
+
}
|
|
105
165
|
|
|
106
166
|
override connectedCallback(): void {
|
|
107
167
|
super.connectedCallback()
|
|
108
|
-
this.
|
|
109
|
-
document.addEventListener('click', this.
|
|
168
|
+
this.updateInputValue()
|
|
169
|
+
document.addEventListener('click', this.handleDocumentClick.bind(this))
|
|
110
170
|
}
|
|
111
171
|
|
|
112
172
|
override disconnectedCallback(): void {
|
|
113
173
|
super.disconnectedCallback()
|
|
114
|
-
document.removeEventListener('click', this.
|
|
174
|
+
document.removeEventListener('click', this.handleDocumentClick.bind(this))
|
|
115
175
|
}
|
|
116
176
|
|
|
117
177
|
override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {
|
|
118
178
|
if (changedProperties.has('value')) {
|
|
119
|
-
this.
|
|
179
|
+
this.updateInputValue()
|
|
120
180
|
}
|
|
121
181
|
}
|
|
122
182
|
|
|
123
183
|
override updated(changedProperties: Map<string | number | symbol, unknown>): void {
|
|
124
|
-
if (changedProperties.has('
|
|
184
|
+
if (changedProperties.has('isOpen') && this.isOpen) {
|
|
125
185
|
// Set anchor name on text field for CSS Anchor Positioning API
|
|
126
|
-
if (this.
|
|
186
|
+
if (this.textField) {
|
|
127
187
|
// Using setProperty since anchorName is not in TypeScript types yet
|
|
128
|
-
this.
|
|
188
|
+
this.textField.style.setProperty('anchor-name', '--ui-date-picker-anchor')
|
|
129
189
|
}
|
|
130
190
|
}
|
|
131
191
|
}
|
|
132
192
|
|
|
133
|
-
private
|
|
193
|
+
private updateInputValue(): void {
|
|
134
194
|
if (this.value) {
|
|
135
|
-
this.
|
|
195
|
+
this.inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale)
|
|
136
196
|
} else {
|
|
137
|
-
this.
|
|
197
|
+
this.inputValue = ''
|
|
138
198
|
}
|
|
139
199
|
}
|
|
140
200
|
|
|
141
|
-
private
|
|
201
|
+
private handleDocumentClick(event: Event): void {
|
|
142
202
|
if (!this.contains(event.target as Node)) {
|
|
143
|
-
this.
|
|
203
|
+
this.isOpen = false
|
|
144
204
|
}
|
|
145
205
|
}
|
|
146
206
|
|
|
147
|
-
private
|
|
207
|
+
private handleInputClick(): void {
|
|
148
208
|
if (!this.disabled) {
|
|
149
|
-
this.
|
|
209
|
+
this.isOpen = !this.isOpen
|
|
150
210
|
}
|
|
151
211
|
}
|
|
152
212
|
|
|
153
|
-
private
|
|
213
|
+
private handleInputChange(event: Event): void {
|
|
154
214
|
const target = event.target as HTMLInputElement
|
|
155
|
-
this.
|
|
215
|
+
this.inputValue = target.value
|
|
156
216
|
|
|
157
|
-
const parsedDate = parseDate(this.
|
|
217
|
+
const parsedDate = parseDate(this.inputValue)
|
|
158
218
|
if (parsedDate) {
|
|
159
219
|
this.value = parsedDate
|
|
160
|
-
this.
|
|
220
|
+
this.dispatchChangeEvent()
|
|
161
221
|
}
|
|
162
222
|
}
|
|
163
223
|
|
|
164
|
-
private
|
|
224
|
+
private handleCalendarDateSelect(event: CustomEvent<DateSelectEvent>): void {
|
|
165
225
|
this.value = event.detail.date
|
|
166
|
-
this.
|
|
167
|
-
this.
|
|
226
|
+
this.isOpen = false
|
|
227
|
+
this.dispatchChangeEvent()
|
|
168
228
|
}
|
|
169
229
|
|
|
170
|
-
private
|
|
171
|
-
this.
|
|
230
|
+
private handleCalendarDateCancel(): void {
|
|
231
|
+
this.isOpen = false
|
|
172
232
|
}
|
|
173
233
|
|
|
174
|
-
private
|
|
234
|
+
private handleKeyDown(event: KeyboardEvent): void {
|
|
175
235
|
switch (event.key) {
|
|
176
236
|
case 'Escape':
|
|
177
|
-
this.
|
|
237
|
+
this.isOpen = false
|
|
178
238
|
break
|
|
179
239
|
case 'ArrowDown':
|
|
180
|
-
if (!this.
|
|
240
|
+
if (!this.isOpen) {
|
|
181
241
|
event.preventDefault()
|
|
182
|
-
this.
|
|
242
|
+
this.isOpen = true
|
|
183
243
|
}
|
|
184
244
|
break
|
|
185
245
|
case 'Enter':
|
|
186
|
-
if (this.
|
|
246
|
+
if (this.isOpen) {
|
|
187
247
|
event.preventDefault()
|
|
188
|
-
this.
|
|
248
|
+
this.isOpen = false
|
|
189
249
|
}
|
|
190
250
|
break
|
|
191
251
|
}
|
|
192
252
|
}
|
|
193
253
|
|
|
194
|
-
private
|
|
254
|
+
private dispatchChangeEvent(): void {
|
|
195
255
|
this.dispatchEvent(
|
|
196
256
|
new CustomEvent('change', {
|
|
197
257
|
detail: {
|
|
198
258
|
value: this.value,
|
|
199
|
-
formattedValue: this.
|
|
259
|
+
formattedValue: this.inputValue,
|
|
200
260
|
},
|
|
201
261
|
bubbles: true,
|
|
202
262
|
composed: true,
|
|
@@ -204,14 +264,14 @@ export class UiDatePickerInput extends LitElement {
|
|
|
204
264
|
)
|
|
205
265
|
}
|
|
206
266
|
|
|
207
|
-
private
|
|
267
|
+
private renderCalendarIcon(): TemplateResult {
|
|
208
268
|
return html`
|
|
209
|
-
<ui-icon slot="suffix" icon="calendarToday" @click=${this.
|
|
269
|
+
<ui-icon slot="suffix" icon="calendarToday" @click=${this.handleInputClick} class="calendar-icon"></ui-icon>
|
|
210
270
|
`
|
|
211
271
|
}
|
|
212
272
|
|
|
213
|
-
private
|
|
214
|
-
if (!this.
|
|
273
|
+
private renderDropdown(): TemplateResult | null {
|
|
274
|
+
if (!this.isOpen) return null
|
|
215
275
|
|
|
216
276
|
const currentDate = this.value || new Date()
|
|
217
277
|
|
|
@@ -226,8 +286,8 @@ export class UiDatePickerInput extends LitElement {
|
|
|
226
286
|
.disabledDates=${this.disabledDates}
|
|
227
287
|
.locale=${this.locale}
|
|
228
288
|
showActions
|
|
229
|
-
@date-select=${this.
|
|
230
|
-
@date-cancel=${this.
|
|
289
|
+
@date-select=${this.handleCalendarDateSelect}
|
|
290
|
+
@date-cancel=${this.handleCalendarDateCancel}
|
|
231
291
|
></ui-date-picker-calendar>
|
|
232
292
|
</div>
|
|
233
293
|
`
|
|
@@ -236,23 +296,24 @@ export class UiDatePickerInput extends LitElement {
|
|
|
236
296
|
override render(): TemplateResult {
|
|
237
297
|
return html`
|
|
238
298
|
<div class="input-container">
|
|
239
|
-
${this.
|
|
299
|
+
${this.isOpen ? html`<div class="backdrop" @click=${() => (this.isOpen = false)}></div>` : ''}
|
|
240
300
|
<ui-outlined-text-field
|
|
241
301
|
.label=${this.label}
|
|
302
|
+
.name=${this.name}
|
|
242
303
|
.placeholder=${this.placeholder}
|
|
243
|
-
.value=${this.
|
|
304
|
+
.value=${this.inputValue}
|
|
244
305
|
.disabled=${this.disabled}
|
|
245
306
|
.required=${this.required}
|
|
246
|
-
|
|
247
|
-
.
|
|
307
|
+
?invalid=${this.error}
|
|
308
|
+
.invalidText=${this.errorMessage}
|
|
248
309
|
readonly
|
|
249
|
-
@click=${this.
|
|
250
|
-
@input=${this.
|
|
251
|
-
@keydown=${this.
|
|
310
|
+
@click=${this.handleInputClick}
|
|
311
|
+
@input=${this.handleInputChange}
|
|
312
|
+
@keydown=${this.handleKeyDown}
|
|
252
313
|
>
|
|
253
|
-
${this.
|
|
314
|
+
${this.renderCalendarIcon()}
|
|
254
315
|
</ui-outlined-text-field>
|
|
255
|
-
${this.
|
|
316
|
+
${this.renderDropdown()}
|
|
256
317
|
</div>
|
|
257
318
|
`
|
|
258
319
|
}
|