@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
@@ -8,12 +8,11 @@ import '../../../src/md/button/ui-button.js'
8
8
  class DatePickerDemoPage extends DemoPage {
9
9
  override accessor componentName = 'Date Picker'
10
10
 
11
- @reactive() accessor rangeMode = false
12
- @reactive() accessor showConstraints = false
13
11
  @reactive() accessor selectedDate: Date | null = null
14
12
  @reactive() accessor selectedRange: { start: Date | null; end: Date | null } = { start: null, end: null }
15
13
  @reactive() accessor modalOpen = false
16
14
  @reactive() accessor modalInputOpen = false
15
+ @reactive() accessor modalInputRangeOpen = false
17
16
  @reactive() accessor formValues: string | undefined
18
17
 
19
18
  private get today(): Date {
@@ -32,16 +31,6 @@ class DatePickerDemoPage extends DemoPage {
32
31
  return date
33
32
  }
34
33
 
35
- handleRangeModeChange(e: Event): void {
36
- const checkbox = e.target as HTMLInputElement
37
- this.rangeMode = checkbox.checked
38
- }
39
-
40
- handleConstraintsChange(e: Event): void {
41
- const checkbox = e.target as HTMLInputElement
42
- this.showConstraints = checkbox.checked
43
- }
44
-
45
34
  handleDateChange(e: CustomEvent): void {
46
35
  this.selectedDate = e.detail.value
47
36
  }
@@ -70,6 +59,10 @@ class DatePickerDemoPage extends DemoPage {
70
59
  this.modalInputOpen = true
71
60
  }
72
61
 
62
+ openModalInputRange(): void {
63
+ this.modalInputRangeOpen = true
64
+ }
65
+
73
66
  handleModalClose(e: CustomEvent): void {
74
67
  this.modalOpen = false
75
68
  if (e.detail.confirmed && e.detail.range) {
@@ -79,15 +72,27 @@ class DatePickerDemoPage extends DemoPage {
79
72
 
80
73
  handleModalInputClose(e: CustomEvent): void {
81
74
  this.modalInputOpen = false
82
- if (e.detail.confirmed) {
83
- if (this.rangeMode && e.detail.range) {
84
- this.selectedRange = e.detail.range
85
- } else if (!this.rangeMode && e.detail.date) {
86
- this.selectedDate = e.detail.date
87
- }
75
+ if (e.detail.confirmed && e.detail.date) {
76
+ this.selectedDate = e.detail.date
77
+ }
78
+ }
79
+
80
+ handleModalInputRangeClose(e: CustomEvent): void {
81
+ this.modalInputRangeOpen = false
82
+ if (e.detail.confirmed && e.detail.range) {
83
+ this.selectedRange = e.detail.range
88
84
  }
89
85
  }
90
86
 
87
+ private formatDateRange(start: Date | null, end: Date | null, defaultMessage = 'No range selected'): string {
88
+ if (!start || !end) return defaultMessage
89
+ return `${start.toDateString()} - ${end.toDateString()}`
90
+ }
91
+
92
+ private formatSingleDate(date: Date | null, defaultMessage = 'No date selected'): string {
93
+ return date ? date.toDateString() : defaultMessage
94
+ }
95
+
91
96
  handleFormSubmit(e: SubmitEvent): void {
92
97
  e.preventDefault()
93
98
  const form = e.target as HTMLFormElement
@@ -98,14 +103,16 @@ class DatePickerDemoPage extends DemoPage {
98
103
 
99
104
  contentTemplate(): TemplateResult {
100
105
  return html`
101
- <a href="../">Back</a>
102
- ${this.renderConfigurationSection()} ${this.renderInputs()} ${this.renderCalendars()}
103
- ${this.renderModalDatePickers()} ${this.renderFormIntegration()} ${this.renderModalComponents()}
106
+ <nav>
107
+ <a href="../" class="back-link">← Back to Components</a>
108
+ </nav>
109
+ ${this.renderInputs()} ${this.renderCalendars()} ${this.renderModalDatePickers()} ${this.renderFormIntegration()}
110
+ ${this.renderModalComponents()}
104
111
  ${this.formValues
105
112
  ? html`
106
113
  <section class="demo-section">
107
114
  <h3 class="headline-medium">Form Output</h3>
108
- <output>
115
+ <output role="status" aria-live="polite" aria-label="Form submission result">
109
116
  <code><pre>${this.formValues}</pre></code>
110
117
  </output>
111
118
  </section>
@@ -115,10 +122,9 @@ class DatePickerDemoPage extends DemoPage {
115
122
  }
116
123
 
117
124
  renderInputs(): TemplateResult {
118
- const { showConstraints: sc } = this
119
125
  return html`<section class="demo-section">
120
126
  <h2 class="display-large">Date Picker Input</h2>
121
- <div class="variant-grid">
127
+ <div class="variant-grid" role="group" aria-labelledby="input-variants-heading">
122
128
  <span>&nbsp;</span>
123
129
  <span class="legend-marker">1</span>
124
130
  <span class="legend-marker">2</span>
@@ -128,24 +134,40 @@ class DatePickerDemoPage extends DemoPage {
128
134
  <ui-date-picker-input
129
135
  label="Basic input"
130
136
  placeholder="Select date"
137
+ name="basic-date-picker"
131
138
  .value="${this.selectedDate}"
132
139
  @change="${this.handleDateChange}"
140
+ aria-describedby="basic-input-help"
133
141
  ></ui-date-picker-input>
134
142
  <ui-date-picker-input
135
- label="Constrained input"
143
+ label="With constraints"
136
144
  placeholder="Select date"
137
- .minDate="${sc ? this.today : undefined}"
138
- .maxDate="${sc ? this.oneMonthFromNow : undefined}"
145
+ name="constrained-date-picker"
146
+ .minDate="${this.today}"
147
+ .maxDate="${this.oneMonthFromNow}"
139
148
  .value="${this.selectedDate}"
140
149
  @change="${this.handleDateChange}"
150
+ aria-describedby="constrained-input-help"
151
+ ></ui-date-picker-input>
152
+ <ui-date-picker-input
153
+ label="Disabled input"
154
+ placeholder="Select date"
155
+ disabled
156
+ name="disabled-date-picker"
157
+ aria-describedby="disabled-input-help"
141
158
  ></ui-date-picker-input>
142
- <ui-date-picker-input label="Disabled input" placeholder="Select date" disabled></ui-date-picker-input>
143
159
  </div>
160
+ <div id="input-variants-heading" class="visually-hidden">Date input variants demonstration</div>
161
+ <div id="basic-input-help" class="visually-hidden">Basic date picker with no restrictions</div>
162
+ <div id="constrained-input-help" class="visually-hidden">
163
+ Date picker with date constraints applied (today to one month from now)
164
+ </div>
165
+ <div id="disabled-input-help" class="visually-hidden">Disabled date picker for demonstration</div>
144
166
  <p class="body-medium">A. Input variants</p>
145
167
  <ol class="decimal body-medium">
146
- <li>Basic</li>
147
- <li>With constraints</li>
148
- <li>Disabled / Range selection</li>
168
+ <li>Basic input</li>
169
+ <li>With date constraints</li>
170
+ <li>Disabled state</li>
149
171
  </ol>
150
172
  </section>`
151
173
  }
@@ -153,7 +175,7 @@ class DatePickerDemoPage extends DemoPage {
153
175
  renderCalendars(): TemplateResult {
154
176
  return html`<section class="demo-section xl">
155
177
  <h2 class="display-large">Date Picker Calendar</h2>
156
- <div class="variant-grid">
178
+ <div class="variant-grid" role="group" aria-labelledby="calendar-variants-heading">
157
179
  <span>&nbsp;</span>
158
180
  <span class="legend-marker">1</span>
159
181
  <span class="legend-marker">2</span>
@@ -163,65 +185,82 @@ class DatePickerDemoPage extends DemoPage {
163
185
  <ui-date-picker-calendar
164
186
  showActions
165
187
  .selectedDate="${this.selectedDate}"
166
- @date-confirm="${this.handleDateConfirm}"
188
+ @date-select="${this.handleDateConfirm}"
167
189
  @date-cancel="${this.handleDateCancel}"
190
+ aria-describedby="basic-calendar-help"
168
191
  ></ui-date-picker-calendar>
169
192
  <ui-date-picker-calendar
170
193
  showActions
171
- ?rangeSelection="${true}"
172
- .selectedRange="${this.selectedRange}"
194
+ rangeSelection
195
+ .rangeStart="${this.selectedRange.start}"
196
+ .rangeEnd="${this.selectedRange.end}"
173
197
  @date-range-confirm="${this.handleRangeConfirm}"
174
198
  @date-cancel="${this.handleDateCancel}"
199
+ aria-describedby="range-calendar-help"
175
200
  ></ui-date-picker-calendar>
176
201
  <ui-date-picker-calendar
177
202
  showActions
178
203
  .minDate="${this.today}"
179
204
  .maxDate="${this.oneMonthFromNow}"
180
205
  .selectedDate="${this.selectedDate}"
181
- @date-confirm="${this.handleDateConfirm}"
206
+ @date-select="${this.handleDateConfirm}"
182
207
  @date-cancel="${this.handleDateCancel}"
208
+ aria-describedby="constrained-calendar-help"
183
209
  ></ui-date-picker-calendar>
184
210
  </div>
211
+ <div id="calendar-variants-heading" class="visually-hidden">Calendar variants demonstration</div>
212
+ <div id="basic-calendar-help" class="visually-hidden">Basic calendar for single date selection</div>
213
+ <div id="range-calendar-help" class="visually-hidden">Calendar configured for date range selection</div>
214
+ <div id="constrained-calendar-help" class="visually-hidden">
215
+ Calendar with date constraints limiting selectable dates
216
+ </div>
185
217
  <p class="body-medium">B. Calendar variants</p>
186
218
  <ol class="decimal body-medium">
187
- <li>Basic</li>
188
- <li>With constraints</li>
189
- <li>Disabled / Range selection</li>
219
+ <li>Single date selection</li>
220
+ <li>Range selection</li>
221
+ <li>With date constraints</li>
190
222
  </ol>
191
223
  </section>`
192
224
  }
193
225
 
194
226
  renderModalDatePickers(): TemplateResult {
195
- const { rangeMode: rm } = this
196
227
  return html`
197
228
  <section class="demo-section">
198
229
  <h2 class="display-large">Modal Date Pickers</h2>
199
230
  <div class="modal-demo-grid">
200
- <div class="modal-demo-item">
231
+ <article class="modal-demo-item">
201
232
  <h3 class="headline-small">Range Selection Modal</h3>
202
- <ui-button @click="${this.openModal}" color="filled">Open Date Range Picker</ui-button>
203
- <div class="demo-output">
204
- ${this.selectedRange.start && this.selectedRange.end
205
- ? html`Range: ${this.selectedRange.start.toDateString()} - ${this.selectedRange.end.toDateString()}`
206
- : 'No range selected'}
233
+ <p class="body-medium">Full-screen modal for selecting date ranges</p>
234
+ <ui-button @click="${this.openModal}" color="filled" aria-describedby="range-modal-output">
235
+ Open Date Range Picker
236
+ </ui-button>
237
+ <div id="range-modal-output" class="demo-output" role="status" aria-live="polite">
238
+ Selected range: ${this.formatDateRange(this.selectedRange.start, this.selectedRange.end)}
207
239
  </div>
208
- </div>
240
+ </article>
209
241
 
210
- <div class="modal-demo-item">
211
- <h3 class="headline-small">Input Modal</h3>
212
- <ui-button @click="${this.openModalInput}" color="filled">
213
- Open ${rm ? 'Range' : 'Single'} Date Input
242
+ <article class="modal-demo-item">
243
+ <h3 class="headline-small">Single Date Input Modal</h3>
244
+ <p class="body-medium">Modal with single date input field</p>
245
+ <ui-button @click="${this.openModalInput}" color="filled" aria-describedby="input-modal-output">
246
+ Open Single Date Input
214
247
  </ui-button>
215
- <div class="demo-output">
216
- ${rm
217
- ? this.selectedRange.start && this.selectedRange.end
218
- ? html`Range: ${this.selectedRange.start.toDateString()} - ${this.selectedRange.end.toDateString()}`
219
- : 'No range entered'
220
- : this.selectedDate
221
- ? html`Date: ${this.selectedDate.toDateString()}`
222
- : 'No date entered'}
248
+ <div id="input-modal-output" class="demo-output" role="status" aria-live="polite">
249
+ Selected date: ${this.formatSingleDate(this.selectedDate, 'No date entered')}
223
250
  </div>
224
- </div>
251
+ </article>
252
+
253
+ <article class="modal-demo-item">
254
+ <h3 class="headline-small">Range Input Modal</h3>
255
+ <p class="body-medium">Modal with date range input fields</p>
256
+ <ui-button @click="${this.openModalInputRange}" color="filled" aria-describedby="input-range-modal-output">
257
+ Open Range Date Input
258
+ </ui-button>
259
+ <div id="input-range-modal-output" class="demo-output" role="status" aria-live="polite">
260
+ Selected range:
261
+ ${this.formatDateRange(this.selectedRange.start, this.selectedRange.end, 'No range entered')}
262
+ </div>
263
+ </article>
225
264
  </div>
226
265
  </section>
227
266
  `
@@ -231,21 +270,33 @@ class DatePickerDemoPage extends DemoPage {
231
270
  return html`<section class="demo-section">
232
271
  <h2 class="display-large">Form Integration</h2>
233
272
  <div class="frame">
234
- <form @submit="${this.handleFormSubmit}">
235
- <div class="form-row">
236
- <ui-date-picker-input required label="Event date" placeholder="Select event date"></ui-date-picker-input>
237
- </div>
238
- <div class="form-row">
239
- <ui-date-picker-input
240
- label="Deadline (optional)"
241
- placeholder="Select deadline"
242
- .minDate="${this.today}"
243
- required
244
- ></ui-date-picker-input>
245
- </div>
246
- <div class="form-actions">
247
- <ui-button type="submit" color="filled" type="submit">Submit Form</ui-button>
248
- <ui-button type="reset" color="outlined" type="reset">Reset</ui-button>
273
+ <form @submit="${this.handleFormSubmit}" novalidate>
274
+ <fieldset>
275
+ <legend class="visually-hidden">Event scheduling form</legend>
276
+ <div class="form-row">
277
+ <ui-date-picker-input
278
+ required
279
+ label="Event date"
280
+ placeholder="Select event date"
281
+ name="event-date"
282
+ aria-describedby="event-date-help"
283
+ ></ui-date-picker-input>
284
+ <div id="event-date-help" class="form-help">Choose the date when the event will take place</div>
285
+ </div>
286
+ <div class="form-row">
287
+ <ui-date-picker-input
288
+ label="Deadline (optional)"
289
+ placeholder="Select deadline"
290
+ name="deadline"
291
+ .minDate="${this.today}"
292
+ aria-describedby="deadline-help"
293
+ ></ui-date-picker-input>
294
+ <div id="deadline-help" class="form-help">Optional deadline for event preparation</div>
295
+ </div>
296
+ </fieldset>
297
+ <div class="form-actions" role="group" aria-label="Form actions">
298
+ <ui-button type="submit" color="filled">Submit Form</ui-button>
299
+ <ui-button type="reset" color="outlined">Reset</ui-button>
249
300
  </div>
250
301
  </form>
251
302
  </div>
@@ -253,7 +304,6 @@ class DatePickerDemoPage extends DemoPage {
253
304
  }
254
305
 
255
306
  renderModalComponents(): TemplateResult {
256
- const { rangeMode: rm } = this
257
307
  return html`<!-- Modal Components -->
258
308
  <ui-date-picker-modal
259
309
  ?open="${this.modalOpen}"
@@ -265,35 +315,20 @@ class DatePickerDemoPage extends DemoPage {
265
315
 
266
316
  <ui-date-picker-modal-input
267
317
  ?open="${this.modalInputOpen}"
268
- title="${rm ? 'Enter date range' : 'Enter date'}"
269
- .rangeMode="${rm}"
270
- startLabel="${rm ? 'Start date' : 'Date'}"
271
- endLabel="${rm ? 'End date' : ''}"
318
+ title="Enter date"
319
+ .rangeMode="${false}"
320
+ startLabel="Date"
272
321
  @modal-input-close="${this.handleModalInputClose}"
273
- ></ui-date-picker-modal-input>`
274
- }
322
+ ></ui-date-picker-modal-input>
275
323
 
276
- renderConfigurationSection(): TemplateResult {
277
- const { rangeMode: rm, showConstraints: sc } = this
278
- return html`
279
- <section class="demo-section">
280
- <h2 class="title-large">Configuration</h2>
281
- <div class="config-grid">
282
- <div class="config-item">
283
- <label class="checkbox-label">
284
- <input type="checkbox" .checked="${rm}" @change="${this.handleRangeModeChange}" />
285
- Range selection mode
286
- </label>
287
- </div>
288
- <div class="config-item">
289
- <label class="checkbox-label">
290
- <input type="checkbox" .checked="${sc}" @change="${this.handleConstraintsChange}" />
291
- Show date constraints
292
- </label>
293
- </div>
294
- </div>
295
- </section>
296
- `
324
+ <ui-date-picker-modal-input
325
+ ?open="${this.modalInputRangeOpen}"
326
+ title="Enter date range"
327
+ .rangeMode="${true}"
328
+ startLabel="Start date"
329
+ endLabel="End date"
330
+ @modal-input-close="${this.handleModalInputRangeClose}"
331
+ ></ui-date-picker-modal-input>`
297
332
  }
298
333
  }
299
334
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@api-client/ui",
3
- "version": "0.5.6",
3
+ "version": "0.5.8",
4
4
  "description": "Internal UI component library for the API Client ecosystem.",
5
5
  "license": "UNLICENSED",
6
6
  "main": "build/src/index.js",
@@ -222,7 +222,7 @@
222
222
  "oauth2-mock-server": "^8.0.0",
223
223
  "prettier": "^3.5.1",
224
224
  "sinon": "^21.0.0",
225
- "ts-lit-plugin": "^2.0.2",
225
+ "@jarrodek/ts-lit-plugin": "^3.0.0",
226
226
  "typescript": "^5.5.2",
227
227
  "typescript-eslint": "^8.24.1",
228
228
  "wireit": "^0.14.4"
@@ -0,0 +1,14 @@
1
+ import { customElement } from 'lit/decorators.js'
2
+ import Element from './internals/Picker.js'
3
+ import elementStyles from './internals/Picker.styles.js'
4
+
5
+ @customElement('currency-picker')
6
+ export class CurrencyPickerElement extends Element {
7
+ static override styles = [elementStyles]
8
+ }
9
+
10
+ declare global {
11
+ interface HTMLElementTagNameMap {
12
+ 'currency-picker': CurrencyPickerElement
13
+ }
14
+ }
@@ -0,0 +1,58 @@
1
+ import { css } from 'lit'
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ max-width: 600px;
7
+ }
8
+
9
+ .currency-picker {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: 8px;
13
+ }
14
+
15
+ md-outlined-select {
16
+ flex: 1;
17
+ min-width: 200px;
18
+ }
19
+
20
+ .flag {
21
+ font-size: 20px;
22
+ width: 24px;
23
+ text-align: center;
24
+ }
25
+
26
+ .currency-symbol {
27
+ color: var(--md-sys-color-primary);
28
+ font-size: 1rem;
29
+ }
30
+
31
+ /* Error states using ElementInternals */
32
+ .error {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 8px;
36
+ padding: 8px 12px;
37
+ margin-top: 4px;
38
+ border-radius: 4px;
39
+ font-size: 0.875rem;
40
+ line-height: 1.25rem;
41
+ background: var(--md-sys-color-error-container);
42
+ color: var(--md-sys-color-on-error-container);
43
+ border: 1px solid var(--md-sys-color-error);
44
+ }
45
+
46
+ .error-message {
47
+ font-weight: 500;
48
+ }
49
+
50
+ /* Host error state using ElementInternals validity */
51
+ :host([data-error]) {
52
+ --md-outlined-select-outline-color: var(--md-sys-color-error);
53
+ }
54
+
55
+ :host([data-error]) md-outlined-select {
56
+ --md-outlined-select-focus-outline-color: var(--md-sys-color-error);
57
+ }
58
+ `