@api-client/ui 0.5.5 → 0.5.7

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 (114) 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/highlight/MarkdownStyles.d.ts.map +1 -1
  18. package/build/src/elements/highlight/MarkdownStyles.js +0 -13
  19. package/build/src/elements/highlight/MarkdownStyles.js.map +1 -1
  20. package/build/src/elements/http/BodyEditor.d.ts +0 -13
  21. package/build/src/elements/http/BodyEditor.d.ts.map +1 -1
  22. package/build/src/elements/http/BodyEditor.js +0 -13
  23. package/build/src/elements/http/BodyEditor.js.map +1 -1
  24. package/build/src/elements/http/BodyTextEditor.d.ts +0 -13
  25. package/build/src/elements/http/BodyTextEditor.d.ts.map +1 -1
  26. package/build/src/elements/http/BodyTextEditor.js +0 -13
  27. package/build/src/elements/http/BodyTextEditor.js.map +1 -1
  28. package/build/src/elements/http/BodyUrlEncodedEditor.d.ts +0 -13
  29. package/build/src/elements/http/BodyUrlEncodedEditor.d.ts.map +1 -1
  30. package/build/src/elements/http/BodyUrlEncodedEditor.js +0 -13
  31. package/build/src/elements/http/BodyUrlEncodedEditor.js.map +1 -1
  32. package/build/src/elements/http/UrlInput.d.ts +0 -13
  33. package/build/src/elements/http/UrlInput.d.ts.map +1 -1
  34. package/build/src/elements/http/UrlInput.js +0 -13
  35. package/build/src/elements/http/UrlInput.js.map +1 -1
  36. package/build/src/index.d.ts +2 -0
  37. package/build/src/index.d.ts.map +1 -1
  38. package/build/src/index.js +2 -0
  39. package/build/src/index.js.map +1 -1
  40. package/build/src/md/button/internals/base.d.ts +1 -0
  41. package/build/src/md/button/internals/base.d.ts.map +1 -1
  42. package/build/src/md/button/internals/base.js +7 -0
  43. package/build/src/md/button/internals/base.js.map +1 -1
  44. package/build/src/md/button/internals/button.styles.js +1 -1
  45. package/build/src/md/button/internals/button.styles.js.map +1 -1
  46. package/build/src/md/date/internals/DateTime.d.ts +0 -13
  47. package/build/src/md/date/internals/DateTime.d.ts.map +1 -1
  48. package/build/src/md/date/internals/DateTime.js +0 -13
  49. package/build/src/md/date/internals/DateTime.js.map +1 -1
  50. package/build/src/md/date-picker/index.d.ts +13 -0
  51. package/build/src/md/date-picker/index.d.ts.map +1 -0
  52. package/build/src/md/date-picker/index.js +13 -0
  53. package/build/src/md/date-picker/index.js.map +1 -0
  54. package/build/src/md/date-picker/internals/DatePicker.styles.d.ts +4 -0
  55. package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -0
  56. package/build/src/md/date-picker/internals/DatePicker.styles.js +409 -0
  57. package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -0
  58. package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +272 -0
  59. package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -0
  60. package/build/src/md/date-picker/internals/DatePickerCalendar.js +1062 -0
  61. package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -0
  62. package/build/src/md/date-picker/internals/DatePickerUtils.d.ts +93 -0
  63. package/build/src/md/date-picker/internals/DatePickerUtils.d.ts.map +1 -0
  64. package/build/src/md/date-picker/internals/DatePickerUtils.js +221 -0
  65. package/build/src/md/date-picker/internals/DatePickerUtils.js.map +1 -0
  66. package/build/src/md/date-picker/ui-date-picker-input.d.ts +160 -0
  67. package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -0
  68. package/build/src/md/date-picker/ui-date-picker-input.js +464 -0
  69. package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -0
  70. package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +178 -0
  71. package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -0
  72. package/build/src/md/date-picker/ui-date-picker-modal-input.js +538 -0
  73. package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -0
  74. package/build/src/md/date-picker/ui-date-picker-modal.d.ts +156 -0
  75. package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -0
  76. package/build/src/md/date-picker/ui-date-picker-modal.js +423 -0
  77. package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -0
  78. package/build/src/md/dialog/internals/Dialog.styles.d.ts.map +1 -1
  79. package/build/src/md/dialog/internals/Dialog.styles.js +1 -0
  80. package/build/src/md/dialog/internals/Dialog.styles.js.map +1 -1
  81. package/demo/elements/currency/index.html +91 -0
  82. package/demo/elements/currency/index.ts +272 -0
  83. package/demo/elements/har/har2.json +1 -1
  84. package/demo/elements/index.html +3 -0
  85. package/demo/md/date-picker/date-picker.ts +336 -0
  86. package/demo/md/date-picker/index.html +171 -0
  87. package/demo/md/index.html +2 -0
  88. package/package.json +1 -1
  89. package/src/elements/currency/currency-picker.ts +14 -0
  90. package/src/elements/currency/internals/Picker.styles.ts +58 -0
  91. package/src/elements/currency/internals/Picker.ts +846 -0
  92. package/src/elements/highlight/MarkdownStyles.ts +0 -13
  93. package/src/elements/http/BodyEditor.ts +0 -13
  94. package/src/elements/http/BodyTextEditor.ts +0 -13
  95. package/src/elements/http/BodyUrlEncodedEditor.ts +0 -13
  96. package/src/elements/http/UrlInput.ts +0 -13
  97. package/src/index.ts +17 -0
  98. package/src/md/button/internals/base.ts +7 -0
  99. package/src/md/button/internals/button.styles.ts +1 -1
  100. package/src/md/date/internals/DateTime.ts +0 -14
  101. package/src/md/date-picker/README.md +184 -0
  102. package/src/md/date-picker/index.ts +17 -0
  103. package/src/md/date-picker/internals/DatePicker.styles.ts +411 -0
  104. package/src/md/date-picker/internals/DatePickerCalendar.ts +1031 -0
  105. package/src/md/date-picker/internals/DatePickerUtils.ts +288 -0
  106. package/src/md/date-picker/ui-date-picker-input.ts +333 -0
  107. package/src/md/date-picker/ui-date-picker-modal-input.ts +440 -0
  108. package/src/md/date-picker/ui-date-picker-modal.ts +346 -0
  109. package/src/md/dialog/internals/Dialog.styles.ts +1 -0
  110. package/test/README.md +3 -2
  111. package/test/elements/currency/CurrencyPicker.accessibility.test.ts +328 -0
  112. package/test/elements/currency/CurrencyPicker.core.test.ts +318 -0
  113. package/test/elements/currency/CurrencyPicker.integration.test.ts +482 -0
  114. package/test/elements/currency/CurrencyPicker.test.ts +486 -0
@@ -0,0 +1,857 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { LitElement, html, nothing } from 'lit';
3
+ import { property, state, query } from 'lit/decorators.js';
4
+ import { repeat } from 'lit/directives/repeat.js';
5
+ import '@material/web/select/outlined-select.js';
6
+ import '@material/web/select/select-option.js';
7
+ import '../../../md/chip/ui-chip-set.js';
8
+ import '../../../md/chip/ui-chip.js';
9
+ let CurrencyPicker = (() => {
10
+ let _classSuper = LitElement;
11
+ let _selected_decorators;
12
+ let _selected_initializers = [];
13
+ let _selected_extraInitializers = [];
14
+ let _allowedCurrencies_decorators;
15
+ let _allowedCurrencies_initializers = [];
16
+ let _allowedCurrencies_extraInitializers = [];
17
+ let _label_decorators;
18
+ let _label_initializers = [];
19
+ let _label_extraInitializers = [];
20
+ let _name_decorators;
21
+ let _name_initializers = [];
22
+ let _name_extraInitializers = [];
23
+ let _supportingText_decorators;
24
+ let _supportingText_initializers = [];
25
+ let _supportingText_extraInitializers = [];
26
+ let _required_decorators;
27
+ let _required_initializers = [];
28
+ let _required_extraInitializers = [];
29
+ let _disabled_decorators;
30
+ let _disabled_initializers = [];
31
+ let _disabled_extraInitializers = [];
32
+ let _multi_decorators;
33
+ let _multi_initializers = [];
34
+ let _multi_extraInitializers = [];
35
+ let _showErrors_decorators;
36
+ let _showErrors_initializers = [];
37
+ let _showErrors_extraInitializers = [];
38
+ let _selectableCurrencies_decorators;
39
+ let _selectableCurrencies_initializers = [];
40
+ let _selectableCurrencies_extraInitializers = [];
41
+ let _selectElement_decorators;
42
+ let _selectElement_initializers = [];
43
+ let _selectElement_extraInitializers = [];
44
+ return class CurrencyPicker extends _classSuper {
45
+ static {
46
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
47
+ _selected_decorators = [property({ type: Array })];
48
+ _allowedCurrencies_decorators = [property({ type: Array })];
49
+ _label_decorators = [property({ type: String })];
50
+ _name_decorators = [property({ type: String })];
51
+ _supportingText_decorators = [property({ type: String })];
52
+ _required_decorators = [property({ type: Boolean })];
53
+ _disabled_decorators = [property({ type: Boolean })];
54
+ _multi_decorators = [property({ type: Boolean })];
55
+ _showErrors_decorators = [property({ type: Boolean })];
56
+ _selectableCurrencies_decorators = [state()];
57
+ _selectElement_decorators = [query('md-outlined-select')];
58
+ __esDecorate(this, null, _selected_decorators, { kind: "accessor", name: "selected", static: false, private: false, access: { has: obj => "selected" in obj, get: obj => obj.selected, set: (obj, value) => { obj.selected = value; } }, metadata: _metadata }, _selected_initializers, _selected_extraInitializers);
59
+ __esDecorate(this, null, _allowedCurrencies_decorators, { kind: "accessor", name: "allowedCurrencies", static: false, private: false, access: { has: obj => "allowedCurrencies" in obj, get: obj => obj.allowedCurrencies, set: (obj, value) => { obj.allowedCurrencies = value; } }, metadata: _metadata }, _allowedCurrencies_initializers, _allowedCurrencies_extraInitializers);
60
+ __esDecorate(this, null, _label_decorators, { kind: "accessor", name: "label", static: false, private: false, access: { has: obj => "label" in obj, get: obj => obj.label, set: (obj, value) => { obj.label = value; } }, metadata: _metadata }, _label_initializers, _label_extraInitializers);
61
+ __esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
62
+ __esDecorate(this, null, _supportingText_decorators, { kind: "accessor", name: "supportingText", static: false, private: false, access: { has: obj => "supportingText" in obj, get: obj => obj.supportingText, set: (obj, value) => { obj.supportingText = value; } }, metadata: _metadata }, _supportingText_initializers, _supportingText_extraInitializers);
63
+ __esDecorate(this, null, _required_decorators, { kind: "accessor", name: "required", static: false, private: false, access: { has: obj => "required" in obj, get: obj => obj.required, set: (obj, value) => { obj.required = value; } }, metadata: _metadata }, _required_initializers, _required_extraInitializers);
64
+ __esDecorate(this, null, _disabled_decorators, { kind: "accessor", name: "disabled", static: false, private: false, access: { has: obj => "disabled" in obj, get: obj => obj.disabled, set: (obj, value) => { obj.disabled = value; } }, metadata: _metadata }, _disabled_initializers, _disabled_extraInitializers);
65
+ __esDecorate(this, null, _multi_decorators, { kind: "accessor", name: "multi", static: false, private: false, access: { has: obj => "multi" in obj, get: obj => obj.multi, set: (obj, value) => { obj.multi = value; } }, metadata: _metadata }, _multi_initializers, _multi_extraInitializers);
66
+ __esDecorate(this, null, _showErrors_decorators, { kind: "accessor", name: "showErrors", static: false, private: false, access: { has: obj => "showErrors" in obj, get: obj => obj.showErrors, set: (obj, value) => { obj.showErrors = value; } }, metadata: _metadata }, _showErrors_initializers, _showErrors_extraInitializers);
67
+ __esDecorate(this, null, _selectableCurrencies_decorators, { kind: "accessor", name: "selectableCurrencies", static: false, private: false, access: { has: obj => "selectableCurrencies" in obj, get: obj => obj.selectableCurrencies, set: (obj, value) => { obj.selectableCurrencies = value; } }, metadata: _metadata }, _selectableCurrencies_initializers, _selectableCurrencies_extraInitializers);
68
+ __esDecorate(this, null, _selectElement_decorators, { kind: "accessor", name: "selectElement", static: false, private: false, access: { has: obj => "selectElement" in obj, get: obj => obj.selectElement, set: (obj, value) => { obj.selectElement = value; } }, metadata: _metadata }, _selectElement_initializers, _selectElement_extraInitializers);
69
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
70
+ }
71
+ /**
72
+ * Indicates that this custom element is form-associated and can participate in form submission.
73
+ * This enables the component to work with native HTML forms and use ElementInternals.
74
+ */
75
+ static formAssociated = true;
76
+ /**
77
+ * Private ElementInternals instance for form integration and validation.
78
+ * Provides access to form APIs like setFormValue, setValidity, etc.
79
+ */
80
+ internals;
81
+ /**
82
+ * Shadow root configuration for the component.
83
+ * Uses 'open' mode for accessibility and delegates focus to enable proper focus management.
84
+ */
85
+ static shadowRootOptions = {
86
+ mode: 'open',
87
+ delegatesFocus: true,
88
+ };
89
+ #selected_accessor_storage = __runInitializers(this, _selected_initializers, []
90
+ /**
91
+ * The currencies that should be available for selection.
92
+ * If not specified, all supported currencies will be available.
93
+ * This is an array of ISO 4217 currency codes (e.g., 'USD', 'EUR').
94
+ */
95
+ );
96
+ /**
97
+ * The currently selected currency codes.
98
+ * This is an array of ISO 4217 currency codes (e.g., 'USD', 'EUR').
99
+ */
100
+ get selected() { return this.#selected_accessor_storage; }
101
+ set selected(value) { this.#selected_accessor_storage = value; }
102
+ #allowedCurrencies_accessor_storage = (__runInitializers(this, _selected_extraInitializers), __runInitializers(this, _allowedCurrencies_initializers, []
103
+ /**
104
+ * The label for the currency selection dropdown.
105
+ * This is displayed as the label for the select input.
106
+ * @attribute
107
+ */
108
+ ));
109
+ /**
110
+ * The currencies that should be available for selection.
111
+ * If not specified, all supported currencies will be available.
112
+ * This is an array of ISO 4217 currency codes (e.g., 'USD', 'EUR').
113
+ */
114
+ get allowedCurrencies() { return this.#allowedCurrencies_accessor_storage; }
115
+ set allowedCurrencies(value) { this.#allowedCurrencies_accessor_storage = value; }
116
+ #label_accessor_storage = (__runInitializers(this, _allowedCurrencies_extraInitializers), __runInitializers(this, _label_initializers, 'Add Currency'
117
+ /**
118
+ * The name attribute for the currency selection dropdown.
119
+ * This is used when submitting forms that include this component.
120
+ * @attribute
121
+ */
122
+ ));
123
+ /**
124
+ * The label for the currency selection dropdown.
125
+ * This is displayed as the label for the select input.
126
+ * @attribute
127
+ */
128
+ get label() { return this.#label_accessor_storage; }
129
+ set label(value) { this.#label_accessor_storage = value; }
130
+ #name_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _name_initializers, void 0));
131
+ /**
132
+ * The name attribute for the currency selection dropdown.
133
+ * This is used when submitting forms that include this component.
134
+ * @attribute
135
+ */
136
+ get name() { return this.#name_accessor_storage; }
137
+ set name(value) { this.#name_accessor_storage = value; }
138
+ #supportingText_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _supportingText_initializers, void 0));
139
+ /**
140
+ * Supporting text for the currency selection dropdown.
141
+ * This is displayed below the select input.
142
+ * @attribute
143
+ */
144
+ get supportingText() { return this.#supportingText_accessor_storage; }
145
+ set supportingText(value) { this.#supportingText_accessor_storage = value; }
146
+ #required_accessor_storage = (__runInitializers(this, _supportingText_extraInitializers), __runInitializers(this, _required_initializers, false
147
+ /**
148
+ * Whether the currency selection is disabled.
149
+ * If true, the component will not allow any changes to the selected currencies.
150
+ * @attribute
151
+ */
152
+ ));
153
+ /**
154
+ * Whether the currency selection is required.
155
+ * If true, the component will enforce at least one currency to be selected.
156
+ * @attribute
157
+ */
158
+ get required() { return this.#required_accessor_storage; }
159
+ set required(value) { this.#required_accessor_storage = value; }
160
+ #disabled_accessor_storage = (__runInitializers(this, _required_extraInitializers), __runInitializers(this, _disabled_initializers, false
161
+ /**
162
+ * Whether multiple currencies can be selected.
163
+ * If true, the component allows selecting multiple currencies.
164
+ * If false, only one currency can be selected at a time.
165
+ * @attribute
166
+ */
167
+ ));
168
+ /**
169
+ * Whether the currency selection is disabled.
170
+ * If true, the component will not allow any changes to the selected currencies.
171
+ * @attribute
172
+ */
173
+ get disabled() { return this.#disabled_accessor_storage; }
174
+ set disabled(value) { this.#disabled_accessor_storage = value; }
175
+ #multi_accessor_storage = (__runInitializers(this, _disabled_extraInitializers), __runInitializers(this, _multi_initializers, false
176
+ /**
177
+ * Whether to show errors inline within the component.
178
+ * If true, errors will be displayed below the component.
179
+ * If false, errors will only be dispatched as events.
180
+ * @attribute
181
+ */
182
+ ));
183
+ /**
184
+ * Whether multiple currencies can be selected.
185
+ * If true, the component allows selecting multiple currencies.
186
+ * If false, only one currency can be selected at a time.
187
+ * @attribute
188
+ */
189
+ get multi() { return this.#multi_accessor_storage; }
190
+ set multi(value) { this.#multi_accessor_storage = value; }
191
+ #showErrors_accessor_storage = (__runInitializers(this, _multi_extraInitializers), __runInitializers(this, _showErrors_initializers, true
192
+ /**
193
+ * The currently selectable currencies (filtered based on selection and allowed currencies).
194
+ * This is automatically updated based on the selected currencies and allowedCurrencies property.
195
+ */
196
+ ));
197
+ /**
198
+ * Whether to show errors inline within the component.
199
+ * If true, errors will be displayed below the component.
200
+ * If false, errors will only be dispatched as events.
201
+ * @attribute
202
+ */
203
+ get showErrors() { return this.#showErrors_accessor_storage; }
204
+ set showErrors(value) { this.#showErrors_accessor_storage = value; }
205
+ #selectableCurrencies_accessor_storage = (__runInitializers(this, _showErrors_extraInitializers), __runInitializers(this, _selectableCurrencies_initializers, []
206
+ /**
207
+ * Reference to the Material Design outlined select element.
208
+ * Used to manage the select's internal state and keep it synchronized with the component's selected property.
209
+ */
210
+ ));
211
+ /**
212
+ * The currently selectable currencies (filtered based on selection and allowed currencies).
213
+ * This is automatically updated based on the selected currencies and allowedCurrencies property.
214
+ */
215
+ get selectableCurrencies() { return this.#selectableCurrencies_accessor_storage; }
216
+ set selectableCurrencies(value) { this.#selectableCurrencies_accessor_storage = value; }
217
+ #selectElement_accessor_storage = (__runInitializers(this, _selectableCurrencies_extraInitializers), __runInitializers(this, _selectElement_initializers, void 0));
218
+ /**
219
+ * Reference to the Material Design outlined select element.
220
+ * Used to manage the select's internal state and keep it synchronized with the component's selected property.
221
+ */
222
+ get selectElement() { return this.#selectElement_accessor_storage; }
223
+ set selectElement(value) { this.#selectElement_accessor_storage = value; }
224
+ /**
225
+ * Returns the form element that contains this component, if any.
226
+ * Part of the ElementInternals API for form-associated custom elements.
227
+ */
228
+ get form() {
229
+ return this.internals.form;
230
+ }
231
+ /**
232
+ * Returns the validity state of the component.
233
+ * Part of the ElementInternals API for form-associated custom elements.
234
+ */
235
+ get validity() {
236
+ return this.internals.validity;
237
+ }
238
+ /**
239
+ * Returns the validation message for the component.
240
+ * Part of the ElementInternals API for form-associated custom elements.
241
+ */
242
+ get validationMessage() {
243
+ return this.internals.validationMessage;
244
+ }
245
+ /**
246
+ * Returns whether the component will be validated when the form is submitted.
247
+ * Part of the ElementInternals API for form-associated custom elements.
248
+ */
249
+ get willValidate() {
250
+ return this.internals.willValidate;
251
+ }
252
+ /**
253
+ * Checks the validity of the component without displaying validation UI.
254
+ * Part of the ElementInternals API for form-associated custom elements.
255
+ * @returns True if the component is valid, false otherwise
256
+ */
257
+ checkValidity() {
258
+ return this.internals.checkValidity();
259
+ }
260
+ /**
261
+ * Checks the validity of the component and displays validation UI if invalid.
262
+ * Part of the ElementInternals API for form-associated custom elements.
263
+ * @returns True if the component is valid, false otherwise
264
+ */
265
+ reportValidity() {
266
+ return this.internals.reportValidity();
267
+ }
268
+ /**
269
+ * Master list of supported currencies with their display information.
270
+ * This includes popular currencies with their ISO codes, names, symbols, countries, and flag emojis.
271
+ * Private and readonly to ensure data integrity.
272
+ */
273
+ currencies = (__runInitializers(this, _selectElement_extraInitializers), [
274
+ { code: 'USD', name: 'US Dollar', symbol: '$', country: 'United States', flag: '🇺🇸' },
275
+ { code: 'EUR', name: 'Euro', symbol: '€', country: 'European Union', flag: '🇪🇺' },
276
+ { code: 'GBP', name: 'British Pound', symbol: '£', country: 'United Kingdom', flag: '🇬🇧' },
277
+ { code: 'JPY', name: 'Japanese Yen', symbol: '¥', country: 'Japan', flag: '🇯🇵' },
278
+ { code: 'CAD', name: 'Canadian Dollar', symbol: 'C$', country: 'Canada', flag: '🇨🇦' },
279
+ { code: 'AUD', name: 'Australian Dollar', symbol: 'A$', country: 'Australia', flag: '🇦🇺' },
280
+ { code: 'CHF', name: 'Swiss Franc', symbol: 'Fr', country: 'Switzerland', flag: '🇨🇭' },
281
+ { code: 'CNY', name: 'Chinese Yuan', symbol: '¥', country: 'China', flag: '🇨🇳' },
282
+ { code: 'INR', name: 'Indian Rupee', symbol: '₹', country: 'India', flag: '🇮🇳' },
283
+ { code: 'KRW', name: 'South Korean Won', symbol: '₩', country: 'South Korea', flag: '🇰🇷' },
284
+ { code: 'BRL', name: 'Brazilian Real', symbol: 'R$', country: 'Brazil', flag: '🇧🇷' },
285
+ { code: 'MXN', name: 'Mexican Peso', symbol: '$', country: 'Mexico', flag: '🇲🇽' },
286
+ { code: 'SGD', name: 'Singapore Dollar', symbol: 'S$', country: 'Singapore', flag: '🇸🇬' },
287
+ { code: 'HKD', name: 'Hong Kong Dollar', symbol: 'HK$', country: 'Hong Kong', flag: '🇭🇰' },
288
+ { code: 'NOK', name: 'Norwegian Krone', symbol: 'kr', country: 'Norway', flag: '🇳🇴' },
289
+ { code: 'SEK', name: 'Swedish Krona', symbol: 'kr', country: 'Sweden', flag: '🇸🇪' },
290
+ { code: 'DKK', name: 'Danish Krone', symbol: 'kr', country: 'Denmark', flag: '🇩🇰' },
291
+ { code: 'PLN', name: 'Polish Zloty', symbol: 'zł', country: 'Poland', flag: '🇵🇱' },
292
+ { code: 'RUB', name: 'Russian Ruble', symbol: '₽', country: 'Russia', flag: '🇷🇺' },
293
+ { code: 'ZAR', name: 'South African Rand', symbol: 'R', country: 'South Africa', flag: '🇿🇦' },
294
+ { code: 'TRY', name: 'Turkish Lira', symbol: '₺', country: 'Turkey', flag: '🇹🇷' },
295
+ { code: 'NZD', name: 'New Zealand Dollar', symbol: 'NZ$', country: 'New Zealand', flag: '🇳🇿' },
296
+ { code: 'THB', name: 'Thai Baht', symbol: '฿', country: 'Thailand', flag: '🇹🇭' },
297
+ { code: 'ILS', name: 'Israeli Shekel', symbol: '₪', country: 'Israel', flag: '🇮🇱' },
298
+ { code: 'AED', name: 'UAE Dirham', symbol: 'د.إ', country: 'United Arab Emirates', flag: '🇦🇪' },
299
+ ]);
300
+ constructor() {
301
+ super();
302
+ this.internals = this.attachInternals();
303
+ }
304
+ connectedCallback() {
305
+ super.connectedCallback();
306
+ this.updateSelectableCurrencies();
307
+ this.updateFormValue();
308
+ }
309
+ /**
310
+ * Updates the form value using ElementInternals.
311
+ */
312
+ updateFormValue() {
313
+ const value = this.selected.length > 0 ? this.selected.join(',') : null;
314
+ this.internals.setFormValue(value);
315
+ }
316
+ willUpdate(changed) {
317
+ super.willUpdate(changed);
318
+ // Validate selected currencies with error handling
319
+ if (changed.has('selected')) {
320
+ this.selected = this.safeCurrencyValidation(this.selected, 'selected');
321
+ // Also validate against allowedCurrencies if specified
322
+ if (this.allowedCurrencies.length > 0) {
323
+ const allowedSet = new Set(this.allowedCurrencies);
324
+ const invalidSelectedCodes = this.selected.filter((code) => !allowedSet.has(code));
325
+ if (invalidSelectedCodes.length > 0) {
326
+ this.setError({
327
+ type: 'validation',
328
+ message: `Selected currencies not in allowed list: ${invalidSelectedCodes.join(', ')}`,
329
+ details: {
330
+ property: 'selected',
331
+ invalidCodes: invalidSelectedCodes,
332
+ allowedCurrencies: this.allowedCurrencies,
333
+ },
334
+ });
335
+ // Filter out invalid codes
336
+ this.selected = this.selected.filter((code) => allowedSet.has(code));
337
+ }
338
+ }
339
+ // Also validate selection constraints when property changes
340
+ if (!this.multi && this.selected.length > 1) {
341
+ // In single-select mode, keep only the first valid selection
342
+ this.selected = this.selected.slice(0, 1);
343
+ this.setError({
344
+ type: 'selection',
345
+ message: 'Multiple currency selection is not allowed when multi=false. Only first selection kept.',
346
+ details: { multi: this.multi, originalSelection: changed.get('selected') },
347
+ });
348
+ }
349
+ // Validate required constraint
350
+ if (this.required && this.selected.length === 0) {
351
+ this.internals.setValidity({ valueMissing: true }, 'At least one currency must be selected');
352
+ this.setAttribute('aria-invalid', 'true');
353
+ this.dispatchErrorEvent({
354
+ type: 'selection',
355
+ message: 'At least one currency must be selected when required=true',
356
+ details: { required: this.required, currentSelection: this.selected },
357
+ });
358
+ }
359
+ else if (!this.required || this.selected.length > 0) {
360
+ // Clear validation if not required or has selection
361
+ this.internals.setValidity({});
362
+ this.setAttribute('aria-invalid', 'false');
363
+ }
364
+ }
365
+ // Validate allowed currencies with error handling
366
+ if (changed.has('allowedCurrencies')) {
367
+ this.allowedCurrencies = this.safeCurrencyValidation(this.allowedCurrencies, 'allowedCurrencies');
368
+ // Filter selected currencies to only include allowed ones
369
+ if (this.allowedCurrencies.length > 0) {
370
+ const allowedSet = new Set(this.allowedCurrencies);
371
+ const filteredSelected = this.selected.filter((code) => allowedSet.has(code));
372
+ if (filteredSelected.length !== this.selected.length) {
373
+ this.selected = filteredSelected;
374
+ }
375
+ }
376
+ }
377
+ if (changed.has('selected') || changed.has('allowedCurrencies') || changed.has('multi')) {
378
+ this.updateSelectableCurrencies();
379
+ }
380
+ // Update form value when selected changes
381
+ if (changed.has('selected')) {
382
+ this.updateFormValue();
383
+ }
384
+ // Synchronize the select element's value with the component's selected state
385
+ if (changed.has('selected') && this.selectElement) {
386
+ // In single-select mode, set the select value to the first selected currency or empty
387
+ // In multi-select mode, always clear the select after selection to allow adding more
388
+ if (!this.multi) {
389
+ this.selectElement.value = this.selected.length > 0 ? this.selected[0] : '';
390
+ }
391
+ else {
392
+ // For multi-select, always keep the select cleared to allow adding more currencies
393
+ this.selectElement.value = '';
394
+ }
395
+ }
396
+ }
397
+ /**
398
+ * Called after the component has been updated and rendered.
399
+ * Ensures the select element's value stays synchronized with the component's selected state.
400
+ */
401
+ updated(changed) {
402
+ super.updated(changed);
403
+ // Ensure select element is synchronized after rendering
404
+ if (this.selectElement && (changed.has('selected') || changed.has('multi'))) {
405
+ if (!this.multi) {
406
+ // In single-select mode, show the selected currency or clear the select
407
+ this.selectElement.value = this.selected.length > 0 ? this.selected[0] : '';
408
+ }
409
+ else {
410
+ // In multi-select mode, always keep the select cleared to allow adding more currencies
411
+ this.selectElement.value = '';
412
+ }
413
+ }
414
+ }
415
+ /**
416
+ * Sets an error state using ElementInternals and optionally dispatches an error event.
417
+ * @param error The error to set
418
+ * @param dispatch Whether to dispatch an error event (default: true)
419
+ */
420
+ setError(error, dispatch = true) {
421
+ // Use ElementInternals for native form validation
422
+ this.internals.setValidity({ customError: true }, error.message);
423
+ this.setAttribute('aria-invalid', 'true');
424
+ if (dispatch) {
425
+ this.dispatchErrorEvent(error);
426
+ }
427
+ }
428
+ /**
429
+ * Dispatches an error event.
430
+ * @param error The error to dispatch
431
+ */
432
+ dispatchErrorEvent(error) {
433
+ this.dispatchEvent(new CustomEvent('error', {
434
+ detail: { error },
435
+ bubbles: false,
436
+ }));
437
+ }
438
+ /**
439
+ * Clears the current error state using ElementInternals.
440
+ */
441
+ clearError() {
442
+ this.internals.setValidity({});
443
+ this.setAttribute('aria-invalid', 'false');
444
+ }
445
+ /**
446
+ * Validates currency codes against the supported currencies.
447
+ * @param codes Array of currency codes to validate
448
+ * @returns Array of invalid currency codes
449
+ */
450
+ validateCurrencyCodes(codes) {
451
+ return codes.filter((code) => !this.currencies.some((c) => c.code === code));
452
+ }
453
+ /**
454
+ * Safely validates and filters currency codes, setting errors for invalid codes.
455
+ * @param codes Array of currency codes to validate
456
+ * @param property Name of the property being validated
457
+ * @returns Array of valid currency codes
458
+ */
459
+ safeCurrencyValidation(codes, property) {
460
+ if (!Array.isArray(codes)) {
461
+ this.setError({
462
+ type: 'validation',
463
+ message: `Invalid ${property}: expected array of currency codes`,
464
+ details: { property, value: codes },
465
+ });
466
+ return [];
467
+ }
468
+ const invalidCodes = this.validateCurrencyCodes(codes);
469
+ if (invalidCodes.length > 0) {
470
+ this.setError({
471
+ type: 'validation',
472
+ message: `Invalid currency codes in ${property}: ${invalidCodes.join(', ')}`,
473
+ details: { property, invalidCodes, validCodes: this.currencies.map((c) => c.code) },
474
+ }); // Dispatch error event for validation errors
475
+ // Return only valid codes
476
+ return codes.filter((code) => !invalidCodes.includes(code));
477
+ }
478
+ // Clear any previous validation errors for this property
479
+ if (!this.internals.validity.valid) {
480
+ this.clearError();
481
+ }
482
+ return codes;
483
+ }
484
+ /**
485
+ * Validates selection constraints using ElementInternals.
486
+ * @param newSelection The new selection to validate
487
+ * @returns Whether the selection is valid
488
+ */
489
+ validateSelectionConstraints(newSelection) {
490
+ if (!this.multi && newSelection.length > 1) {
491
+ this.setError({
492
+ type: 'selection',
493
+ message: 'Multiple currency selection is not allowed when multi=false',
494
+ details: { multi: this.multi, attemptedSelection: newSelection },
495
+ });
496
+ return false;
497
+ }
498
+ if (this.required && newSelection.length === 0) {
499
+ this.internals.setValidity({ valueMissing: true }, 'At least one currency must be selected');
500
+ this.setAttribute('aria-invalid', 'true');
501
+ this.dispatchErrorEvent({
502
+ type: 'selection',
503
+ message: 'At least one currency must be selected when required=true',
504
+ details: { required: this.required, currentSelection: newSelection },
505
+ });
506
+ return false;
507
+ }
508
+ return true;
509
+ }
510
+ updateSelectableCurrencies() {
511
+ const selectedCodes = new Set(this.selected);
512
+ // If allowedCurrencies is specified, filter the master list by it
513
+ let availableCurrencies = this.currencies;
514
+ if (this.allowedCurrencies.length > 0) {
515
+ const allowedSet = new Set(this.allowedCurrencies);
516
+ availableCurrencies = this.currencies.filter((c) => allowedSet.has(c.code));
517
+ }
518
+ if (this.multi) {
519
+ // Then filter out already selected currencies
520
+ this.selectableCurrencies = availableCurrencies.filter((c) => !selectedCodes.has(c.code));
521
+ }
522
+ else {
523
+ // If single-select, just use the available currencies
524
+ this.selectableCurrencies = availableCurrencies;
525
+ }
526
+ }
527
+ handleCurrencySelect(event) {
528
+ try {
529
+ const select = event.target;
530
+ const selectedCode = select.value;
531
+ if (!selectedCode)
532
+ return;
533
+ const currency = this.currencies.find((c) => c.code === selectedCode);
534
+ if (!currency) {
535
+ this.setError({
536
+ type: 'selection',
537
+ message: `Currency not found: ${selectedCode}`,
538
+ details: { attemptedCode: selectedCode },
539
+ });
540
+ return;
541
+ }
542
+ let newSelection;
543
+ if (this.multi) {
544
+ // If multi-select, add the currency to the selection
545
+ if (!this.selected.includes(currency.code)) {
546
+ newSelection = [...this.selected, currency.code];
547
+ }
548
+ else {
549
+ // Currency already selected, clear any selection errors but don't add duplicate
550
+ if (!this.internals.validity.valid) {
551
+ this.clearError();
552
+ }
553
+ return;
554
+ }
555
+ }
556
+ else {
557
+ // If single-select, replace the current selection
558
+ newSelection = [currency.code];
559
+ }
560
+ // Validate the new selection
561
+ if (!this.validateSelectionConstraints(newSelection)) {
562
+ return; // Error was set in validateSelectionConstraints
563
+ }
564
+ this.selected = newSelection;
565
+ this.updateSelectableCurrencies();
566
+ // Reset the select for multi-select mode
567
+ if (this.multi) {
568
+ select.value = '';
569
+ }
570
+ // Clear any previous errors on successful selection
571
+ this.clearError();
572
+ this.dispatchChangeEvent();
573
+ }
574
+ catch (error) {
575
+ this.setError({
576
+ type: 'internal',
577
+ message: `Internal error during currency selection: ${error instanceof Error ? error.message : String(error)}`,
578
+ details: { originalError: error },
579
+ });
580
+ }
581
+ }
582
+ handleRemoveCurrency(event) {
583
+ try {
584
+ const chip = event.target;
585
+ const currencyCode = chip.dataset.code;
586
+ if (!currencyCode) {
587
+ this.setError({
588
+ type: 'internal',
589
+ message: 'Unable to determine currency code from chip element',
590
+ details: { chipElement: chip },
591
+ });
592
+ return;
593
+ }
594
+ const newSelection = this.selected.filter((code) => code !== currencyCode);
595
+ // Validate the new selection (e.g., required constraint)
596
+ if (!this.validateSelectionConstraints(newSelection)) {
597
+ return; // Error was set in validateSelectionConstraints
598
+ }
599
+ this.selected = newSelection;
600
+ this.updateSelectableCurrencies();
601
+ // Clear any previous errors on successful removal
602
+ this.clearError();
603
+ this.dispatchChangeEvent();
604
+ }
605
+ catch (error) {
606
+ this.setError({
607
+ type: 'internal',
608
+ message: `Internal error during currency removal: ${error instanceof Error ? error.message : String(error)}`,
609
+ details: { originalError: error },
610
+ });
611
+ }
612
+ }
613
+ dispatchChangeEvent() {
614
+ const selectedCurrencies = this.getSelectedCurrencies();
615
+ // Update form value using ElementInternals
616
+ this.updateFormValue();
617
+ this.dispatchEvent(new CustomEvent('change', {
618
+ detail: {
619
+ currencies: selectedCurrencies,
620
+ codes: this.selected,
621
+ },
622
+ bubbles: false,
623
+ }));
624
+ }
625
+ /**
626
+ * Get the currently selected currency codes as a copy of the array.
627
+ * This is a read-only getter that returns a shallow copy to prevent external modification.
628
+ * @returns Array of selected ISO 4217 currency codes
629
+ */
630
+ get selectedCurrencyCodes() {
631
+ return [...this.selected];
632
+ }
633
+ /**
634
+ * Get the full currency objects for currently selected currencies.
635
+ * This method looks up each selected currency code in the master currencies list
636
+ * and returns the complete currency information including name, symbol, country, and flag.
637
+ * @returns Array of complete Currency objects for selected currencies
638
+ */
639
+ getSelectedCurrencies() {
640
+ const result = [];
641
+ for (const code of this.selected) {
642
+ const currency = this.currencies.find((c) => c.code === code);
643
+ if (currency) {
644
+ result.push(currency);
645
+ }
646
+ }
647
+ return result;
648
+ }
649
+ /**
650
+ * Clear all selected currencies.
651
+ * This method removes all selections, validates constraints (such as required),
652
+ * updates the UI, and dispatches a change event. If validation fails (e.g.,
653
+ * component is required), the operation will be cancelled and an error will be set.
654
+ * @throws Will dispatch an error event if validation fails or an internal error occurs
655
+ */
656
+ clearSelection() {
657
+ try {
658
+ const newSelection = [];
659
+ // Validate clearing selection (e.g., required constraint)
660
+ if (!this.validateSelectionConstraints(newSelection)) {
661
+ return; // Error was set in validateSelectionConstraints
662
+ }
663
+ this.selected = newSelection;
664
+ this.updateSelectableCurrencies();
665
+ // Clear any previous errors on successful clear
666
+ this.clearError();
667
+ this.dispatchChangeEvent();
668
+ // Synchronize the select element to show no selection
669
+ if (this.selectElement) {
670
+ this.selectElement.value = '';
671
+ }
672
+ }
673
+ catch (error) {
674
+ this.setError({
675
+ type: 'internal',
676
+ message: `Internal error during selection clear: ${error instanceof Error ? error.message : String(error)}`,
677
+ details: { originalError: error },
678
+ });
679
+ }
680
+ finally {
681
+ this.requestUpdate();
682
+ }
683
+ }
684
+ /**
685
+ * Form state restore callback for ElementInternals.
686
+ * This method is called by the browser when form state is being restored
687
+ * (e.g., browser back/forward navigation, form autofill).
688
+ * It parses a comma-separated string of currency codes and restores the selection.
689
+ * @param state The state to restore - typically a comma-separated string of currency codes
690
+ * @param _mode The restore mode (unused in this implementation)
691
+ */
692
+ formStateRestoreCallback(state) {
693
+ if (typeof state === 'string' && state) {
694
+ this.selected = state.split(',').filter(Boolean);
695
+ this.updateSelectableCurrencies();
696
+ // Synchronize the select element with restored state
697
+ if (this.selectElement) {
698
+ if (!this.multi && this.selected.length > 0) {
699
+ this.selectElement.value = this.selected[0];
700
+ }
701
+ else {
702
+ this.selectElement.value = '';
703
+ }
704
+ }
705
+ }
706
+ }
707
+ /**
708
+ * Form reset callback for ElementInternals.
709
+ * This method is called by the browser when the containing form is reset.
710
+ * It clears all selections, updates the UI, clears any errors, and updates the form value.
711
+ */
712
+ formResetCallback() {
713
+ this.selected = [];
714
+ this.updateSelectableCurrencies();
715
+ this.clearError();
716
+ this.updateFormValue();
717
+ // Synchronize the select element to show no selection
718
+ if (this.selectElement) {
719
+ this.selectElement.value = '';
720
+ }
721
+ this.requestUpdate();
722
+ }
723
+ /**
724
+ * Main render method for the component.
725
+ * Renders the currency selector with dropdown, selected chips (if multi-select), and error display.
726
+ * Updates ARIA attributes and error states based on current component state.
727
+ * @returns TemplateResult containing the complete component HTML
728
+ */
729
+ render() {
730
+ const ariaLabel = this.multi
731
+ ? `Currency selector. ${this.selected.length} currencies selected.`
732
+ : `Currency selector. ${this.selected.length > 0 ? this.selected[0] + ' selected' : 'No currency selected'}.`;
733
+ const hasError = !this.internals.validity.valid;
734
+ return html `
735
+ <div class="currency-picker" role="group" aria-label="${ariaLabel}">
736
+ <md-outlined-select
737
+ label="${this.label}"
738
+ @change="${this.handleCurrencySelect}"
739
+ menuPositioning="popover"
740
+ ?disabled="${this.disabled}"
741
+ ?required="${this.required}"
742
+ .supportingText="${this.supportingText || ''}"
743
+ .name="${this.name || ''}"
744
+ aria-describedby="${this.supportingText ? 'supporting-text' : ''}"
745
+ aria-invalid="${hasError ? 'true' : 'false'}"
746
+ >
747
+ <md-select-option value="">
748
+ <div slot="headline">Select a currency...</div>
749
+ </md-select-option>
750
+ ${repeat(this.selectableCurrencies, (currency) => currency.code, (currency) => html `
751
+ <md-select-option value="${currency.code}">
752
+ <div slot="overline">${currency.country}</div>
753
+ <div slot="supporting-text">${currency.name}</div>
754
+ <div slot="trailing-supporting-text" class="currency-symbol">${currency.symbol}</div>
755
+ <div slot="start" class="flag">${currency.flag}</div>
756
+ <div slot="headline">${currency.code}</div>
757
+ </md-select-option>
758
+ `)}
759
+ </md-outlined-select>
760
+ ${this.renderSelected()}${this.renderError()}
761
+ </div>
762
+ `;
763
+ }
764
+ /**
765
+ * Renders error messages when showErrors is true and the component is invalid.
766
+ * The error display uses ARIA live regions for accessibility.
767
+ * @returns TemplateResult with error display or nothing if no errors should be shown
768
+ */
769
+ renderError() {
770
+ if (!this.showErrors || this.internals.validity.valid) {
771
+ return nothing;
772
+ }
773
+ return html `
774
+ <div class="error" role="alert" aria-live="polite">
775
+ <span class="error-message">${this.internals.validationMessage}</span>
776
+ </div>
777
+ `;
778
+ }
779
+ /**
780
+ * Renders the selected currencies as removable chips in multi-select mode.
781
+ * Only renders when multi=true and there are selected currencies.
782
+ * Each chip displays the currency flag and code, and can be removed by the user.
783
+ * @returns TemplateResult with chip display or nothing if not applicable
784
+ */
785
+ renderSelected() {
786
+ if (!this.multi) {
787
+ return nothing;
788
+ }
789
+ const selected = this.getSelectedCurrencies();
790
+ if (selected.length === 0)
791
+ return nothing;
792
+ return html `
793
+ <ui-chip-set>
794
+ ${repeat(selected, (currency) => currency.code, (currency) => html `
795
+ <ui-chip
796
+ data-code="${currency.code}"
797
+ type="input"
798
+ @remove="${this.handleRemoveCurrency}"
799
+ ?removable="${true}"
800
+ >
801
+ <span slot="icon" class="chip-flag">${currency.flag}</span>
802
+ <span class="chip-code">${currency.code}</span>
803
+ </ui-chip>
804
+ `)}
805
+ </ui-chip-set>
806
+ `;
807
+ }
808
+ };
809
+ })();
810
+ /**
811
+ * A web component for selecting currencies with chips display.
812
+ * Provides a searchable interface with country flags and currency information.
813
+ *
814
+ * This component uses ElementInternals for native form integration and
815
+ * follows web standards for error handling and validation.
816
+ *
817
+ * ## Features
818
+ * - Single or multi-select currency selection
819
+ * - Visual chips display for selected currencies
820
+ * - Native form integration with ElementInternals
821
+ * - Comprehensive validation and error handling
822
+ * - Accessibility support with ARIA attributes
823
+ * - Keyboard navigation support
824
+ * - Currency filtering based on allowed currencies
825
+ *
826
+ * ## Usage
827
+ * ```html
828
+ * <!-- Basic usage -->
829
+ * <currency-picker></currency-picker>
830
+ *
831
+ * <!-- Multi-select with allowed currencies -->
832
+ * <currency-picker multi .allowedCurrencies="${['USD', 'EUR', 'GBP']}"></currency-picker>
833
+ *
834
+ * <!-- Form integration -->
835
+ * <form>
836
+ * <currency-picker name="currencies" required></currency-picker>
837
+ * </form>
838
+ * ```
839
+ *
840
+ * @fires change - Dispatched when selected currencies change due to user interaction.
841
+ * Contains {currencies: Currency[], codes: string[]} in event.detail
842
+ * @fires error - Dispatched when validation or other errors occur.
843
+ * Contains {error: CurrencyPickerError} in event.detail
844
+ *
845
+ * @example
846
+ * ```typescript
847
+ * const picker = document.querySelector('currency-picker');
848
+ * picker.addEventListener('change', (e) => {
849
+ * console.log('Selected currencies:', e.detail.currencies);
850
+ * });
851
+ * picker.addEventListener('error', (e) => {
852
+ * console.error('Picker error:', e.detail.error.message);
853
+ * });
854
+ * ```
855
+ */
856
+ export default CurrencyPicker;
857
+ //# sourceMappingURL=Picker.js.map