@aurodesignsystem/auro-formkit 3.4.1-rc-602.2.1 → 3.5.0-rc-627.1

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 (57) hide show
  1. package/components/checkbox/demo/api.md +1 -1
  2. package/components/checkbox/demo/api.min.js +31 -8
  3. package/components/checkbox/demo/index.min.js +31 -8
  4. package/components/checkbox/dist/auro-checkbox.d.ts +13 -6
  5. package/components/checkbox/dist/index.js +31 -8
  6. package/components/checkbox/dist/registered.js +31 -8
  7. package/components/combobox/demo/api.md +25 -25
  8. package/components/combobox/demo/api.min.js +48 -13
  9. package/components/combobox/demo/index.min.js +48 -13
  10. package/components/combobox/dist/auro-combobox.d.ts +2 -4
  11. package/components/combobox/dist/index.js +47 -12
  12. package/components/combobox/dist/registered.js +47 -12
  13. package/components/counter/demo/api.min.js +14 -1
  14. package/components/counter/demo/index.min.js +14 -1
  15. package/components/counter/dist/index.js +14 -1
  16. package/components/counter/dist/registered.js +14 -1
  17. package/components/datepicker/demo/api.min.js +45 -12
  18. package/components/datepicker/demo/index.min.js +45 -12
  19. package/components/datepicker/dist/index.js +45 -12
  20. package/components/datepicker/dist/registered.js +45 -12
  21. package/components/form/demo/api.md +1 -5
  22. package/components/form/demo/api.min.js +8 -2
  23. package/components/form/demo/index.html +1 -0
  24. package/components/form/demo/index.md +321 -27
  25. package/components/form/demo/index.min.js +8 -2
  26. package/components/form/demo/registerDemoDeps.js +1 -0
  27. package/components/form/dist/auro-form.d.ts +12 -6
  28. package/components/form/dist/index.js +8 -2
  29. package/components/form/dist/registered.js +8 -2
  30. package/components/input/demo/api.md +1 -1
  31. package/components/input/demo/api.min.js +31 -11
  32. package/components/input/demo/index.min.js +31 -11
  33. package/components/input/dist/base-input.d.ts +13 -6
  34. package/components/input/dist/index.js +31 -11
  35. package/components/input/dist/registered.js +31 -11
  36. package/components/menu/demo/api.md +11 -17
  37. package/components/menu/demo/api.min.js +1 -1
  38. package/components/menu/demo/index.min.js +1 -1
  39. package/components/menu/dist/auro-menu.d.ts +1 -1
  40. package/components/menu/dist/index.js +1 -1
  41. package/components/menu/dist/registered.js +1 -1
  42. package/components/radio/demo/api.md +1 -1
  43. package/components/radio/demo/api.min.js +32 -4
  44. package/components/radio/demo/index.min.js +32 -4
  45. package/components/radio/dist/auro-radio.d.ts +14 -3
  46. package/components/radio/dist/index.js +32 -4
  47. package/components/radio/dist/registered.js +32 -4
  48. package/components/select/demo/api.html +15 -0
  49. package/components/select/demo/api.md +178 -0
  50. package/components/select/demo/api.min.js +84 -3
  51. package/components/select/demo/index.html +15 -0
  52. package/components/select/demo/index.md +177 -0
  53. package/components/select/demo/index.min.js +84 -3
  54. package/components/select/dist/auro-select.d.ts +27 -0
  55. package/components/select/dist/index.js +84 -2
  56. package/components/select/dist/registered.js +84 -2
  57. package/package.json +1 -1
@@ -17,23 +17,89 @@ It automatically "scrapes" its inner content for any auro form elements, and sur
17
17
  them (along with events) to the parent form element as a JSON object.
18
18
  <!-- AURO-GENERATED-CONTENT:END -->
19
19
 
20
- ## Form data generation
20
+ ## Form value generation
21
21
 
22
- As covered in the description, `auro-form` makes a developer's life easier by surfacing Auro form elements as a JSON object.
23
- The most common use case the Auro team identified when building Form was the need to collect form data in a structured way.
22
+ Auro form exists to make a developer's life easier through surfacing all Auro form elements in a given form as a single
23
+ JSON object.
24
+ The most common use case the Auro team identified when building Form was the need to collect form data in
25
+ a structured way.
24
26
 
25
- The following is required for an Auro form element to be collected automatically:
27
+ The following is required on each Auro form element in a form for it to be collected automatically:
26
28
 
27
- 1. It _must_ have a `name` attribute. This is required if vanilla HTML forms, and we follow the same pattern.
28
- 2. It _must_ be an Auro form element. See note below for custom elements.
29
+ 1. It **must** have a `name` attribute. This is required if vanilla HTML forms, and we follow the same pattern.
30
+ 2. It **must** be an Auro form element. See the section on custom elements for more information.
29
31
 
30
32
  That being said, we do _not_ require form elements to be direct children of `auro-form`.
31
33
  They can be nested within other elements for styling, such as a `div`, `span` or `fieldset`.
32
34
 
35
+ ### Form data structure
36
+
37
+ In a correctly registered scenario, `auro-form`
38
+ will automatically recognize the auro form elements and collect data from each on the form's `value` key as a JSON object.
39
+
40
+ Each element will be added using the element's `name` attribute as the key, and the element's `value` as the value.
41
+
42
+ A real-world example of this might be:
43
+
44
+ ```json
45
+ {
46
+ "hotelCity": "New York",
47
+ "dates": ["2022-01-01", "2022-01-15"],
48
+ "numberOfGuests": 2
49
+ }
50
+ ```
51
+
52
+ If your project uses TypeScript, consider using a type like this to represent the form data:
53
+
54
+ ```typescript
55
+ // Generic type for form values
56
+ type AuroFormValue<T> = T | null;
57
+
58
+ // Example types
59
+ type AuroInputValue = AuroFormValue<string | number>;
60
+ type AuroDatePickerValue = AuroFormValue<string[]>;
61
+
62
+ // This is the type returned from the `AuroForm.value` getter
63
+ interface AuroFormState {
64
+ // value varies based on form element
65
+ hotelCity: AuroInputValue;
66
+ dates: AuroDatePickerValue;
67
+ numberOfGuests: AuroInputValue;
68
+ }
69
+ ```
70
+
71
+ ## Accessing form data
72
+
73
+ As Auro components are designed to be framework-agnostic, data can be retrieved using simple vanilla JavaScript patterns.
74
+ If you have ever worked with a standard HTML5 form, you are already equipped to work with Auro forms!
75
+
76
+ Once you have a reference to the form element (React ref, querySelector, etc.),
77
+ you can access the form data using the following methods:
78
+
79
+ **Data keys + get methods**:
80
+ - `.value` - Getter which returns the current form data as a JSON object.
81
+ - `.validity` - Returns the current validity state of the form (`valid` or `invalid`).
82
+
83
+ **Extra information**:
84
+ - `.isInitialState` - Returns a boolean indicating if the form is in its initial state.
85
+
86
+ **Events**
87
+ - `input` - Fires when the form state changes.
88
+ - `reset` - Fires when the form is reset.
89
+ - `submit` - Fires when the form is submitted.
90
+
91
+ **Advanced features**:
92
+ - `.formState` - This is the internal form state. It includes extra `required` and `validity` information for each form element.
93
+ This key is not required for normal form usage, but can add additional context for more complex forms.
94
+
33
95
  ## Important note for custom elements
34
96
 
35
- When consuming custom-named Auro form elements (like `auro-input` as `my-custom-input`), these elements _must_ be registered
36
- BEFORE auro-form due to rendering order and Shadown DOM limitations.
97
+ This **only applies to custom-named elements**.
98
+
99
+ When consuming custom-named Auro form elements (like `auro-input` registered as `my-custom-input`),
100
+ these elements _must_ be registered BEFORE auro-form due to rendering order limitations.
101
+ Auro form elements are automatically recognized based on their tag name (e.g. `auro-input`) or special auro attributes
102
+ which are only assigned during the initial render.
37
103
 
38
104
  For example, the following is correct:
39
105
 
@@ -53,25 +119,6 @@ import {AuroForm} from '@aurodesignsystem/auro-form';
53
119
 
54
120
  AuroForm.register(); // forms start rendering, looking for auro inputs, or custom-named inputs
55
121
  AuroInput.register('my-custom-input'); // too late, form has already rendered and did not find the custom element
56
- ```
57
-
58
- In a correctly registered scenario, `auro-form` will automatically recognize the custom element and collect its data in the following shape:
59
-
60
- ```typescript
61
- interface AuroFormState {
62
- // value varies based on form element
63
- [key: string]: string | string[] | number | boolean | null;
64
- }
65
- ```
66
-
67
- A real-world example of this might be:
68
-
69
- ```json
70
- {
71
- "hotelCity": "New York",
72
- "dates": ["2022-01-01", "2022-01-15"],
73
- "numberOfGuests": 2
74
- }
75
122
  ```
76
123
 
77
124
  ## Examples
@@ -106,4 +153,251 @@ By default, Auro Form connects a `submit` event to all `type="submit"` buttons w
106
153
  </auro-form>
107
154
  ```
108
155
  <!-- AURO-GENERATED-CONTENT:END -->
156
+ </auro-accordion>
157
+
158
+ ### Form with column layout
159
+ Auro Form is designed to be completely unstyled by default, allowing developers to use divs, structural elements, or
160
+ custom CSS to style the form.
161
+
162
+ This example shows that you can use advanced layouts with Auro Form, such as a column layout.
163
+
164
+ <div class="exampleWrapper">
165
+ <!-- AURO-GENERATED-CONTENT:START (FILE:src=./../apiExamples/column-layout.html) -->
166
+ <!-- The below content is automatically added from ./../apiExamples/column-layout.html -->
167
+ <style>
168
+ .columned-form {
169
+ display: grid;
170
+ grid-template-columns: 1fr 1fr;
171
+ gap: 1rem;
172
+ }
173
+
174
+ .columned-form div {
175
+ display: flex;
176
+ flex-direction: column;
177
+ padding: 1rem;
178
+ }
179
+
180
+ .controls {
181
+ display: flex;
182
+ justify-content: flex-end;
183
+ margin-top: 1rem;
184
+ }
185
+ </style>
186
+ <auro-form>
187
+ <div class="columned-form">
188
+ <div>
189
+ <auro-input id="search-box" name="searchBox" required>
190
+ <span slot="label">Search flights</span>
191
+ </auro-input>
192
+ <auro-input id="last-name" name="lastName" required>
193
+ <span slot="label">Last Name</span>
194
+ </auro-input>
195
+ </div>
196
+ <div>
197
+ <div class="datepickerBlock">
198
+ <h4>Pick a date range</h4>
199
+ <auro-datepicker id="date-range" name="dateRange" required range>
200
+ <span slot="fromLabel">Start</span>
201
+ <span slot="toLabel">End</span>
202
+ <span slot="bib.fullscreen.dateLabel">Choose a range</span>
203
+ </auro-datepicker>
204
+ </div>
205
+ <div class="controls">
206
+ <auro-button type="submit">Submit</auro-button>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </auro-form>
211
+ <!-- AURO-GENERATED-CONTENT:END -->
212
+ </div>
213
+ <auro-accordion alignRight>
214
+ <span slot="trigger">See code</span>
215
+ <!-- AURO-GENERATED-CONTENT:START (CODE:src=./../apiExamples/column-layout.html) -->
216
+ <!-- The below code snippet is automatically added from ./../apiExamples/column-layout.html -->
217
+
218
+ ```html
219
+ <style>
220
+ .columned-form {
221
+ display: grid;
222
+ grid-template-columns: 1fr 1fr;
223
+ gap: 1rem;
224
+ }
225
+
226
+ .columned-form div {
227
+ display: flex;
228
+ flex-direction: column;
229
+ padding: 1rem;
230
+ }
231
+
232
+ .controls {
233
+ display: flex;
234
+ justify-content: flex-end;
235
+ margin-top: 1rem;
236
+ }
237
+ </style>
238
+ <auro-form>
239
+ <div class="columned-form">
240
+ <div>
241
+ <auro-input id="search-box" name="searchBox" required>
242
+ <span slot="label">Search flights</span>
243
+ </auro-input>
244
+ <auro-input id="last-name" name="lastName" required>
245
+ <span slot="label">Last Name</span>
246
+ </auro-input>
247
+ </div>
248
+ <div>
249
+ <div class="datepickerBlock">
250
+ <h4>Pick a date range</h4>
251
+ <auro-datepicker id="date-range" name="dateRange" required range>
252
+ <span slot="fromLabel">Start</span>
253
+ <span slot="toLabel">End</span>
254
+ <span slot="bib.fullscreen.dateLabel">Choose a range</span>
255
+ </auro-datepicker>
256
+ </div>
257
+ <div class="controls">
258
+ <auro-button type="submit">Submit</auro-button>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ </auro-form>
263
+ ```
264
+ <!-- AURO-GENERATED-CONTENT:END -->
265
+ </auro-accordion>
266
+
267
+ ### Complex form
268
+ Finally, a more complex form example with multiple form elements, including a date picker and a select element.
269
+
270
+ <div class="exampleWrapper">
271
+ <!-- AURO-GENERATED-CONTENT:START (FILE:src=./../apiExamples/complex.html) -->
272
+ <!-- The below content is automatically added from ./../apiExamples/complex.html -->
273
+ <style>
274
+ .submitBlock {
275
+ margin-top: 1rem;
276
+ display: flex;
277
+ justify-content: flex-end;
278
+ gap: 1rem;
279
+ }
280
+
281
+ .datepickerBlock {
282
+ margin-top: 1rem;
283
+ }
284
+
285
+ .complex-form {
286
+ display: block;
287
+ width: 100%;
288
+ padding: 1rem;
289
+ border: 1px solid #2a2a2a;
290
+ border-radius: 1rem;
291
+ }
292
+ </style>
293
+ <h2>auro-form testing</h2>
294
+ <auro-form class="complex-form">
295
+ <auro-input id="first-name" name="firstName" required>
296
+ <span slot="label">First Name</span>
297
+ </auro-input>
298
+ <div>
299
+ <auro-input id="last-name" name="lastName" required>
300
+ <span slot="label">Last Name</span>
301
+ </auro-input>
302
+ </div>
303
+ <div>
304
+ <div>
305
+ <auro-input id="occupation" name="occupation" required>
306
+ <span slot="label">Occupation</span>
307
+ </auro-input>
308
+ </div>
309
+ </div>
310
+ <auro-input-two id="cool-fact" name="coolFact" required>
311
+ <span slot="label">Cool Fact</span>
312
+ </auro-input-two>
313
+ <div class="datepickerBlock">
314
+ <h4>Pick a cool date</h4>
315
+ <auro-datepicker id="date-example" name="dateExample" required>
316
+ <span slot="fromLabel">Choose a date</span>
317
+ <span slot="bib.fullscreen.dateLabel">Choose a date</span>
318
+ </auro-datepicker>
319
+ </div>
320
+ <div class="datepickerBlock">
321
+ <h4>Pick a date range</h4>
322
+ <auro-datepicker id="date-range" name="dateRange" required range>
323
+ <span slot="fromLabel">Start</span>
324
+ <span slot="toLabel">End</span>
325
+ <span slot="bib.fullscreen.dateLabel">Choose a range</span>
326
+ </auro-datepicker>
327
+ </div>
328
+ <div class="submitBlock">
329
+ <auro-button type="reset">Reset</auro-button>
330
+ <auro-button type="submit">Submit</auro-button>
331
+ </div>
332
+ </auro-form>
333
+ <!-- AURO-GENERATED-CONTENT:END -->
334
+ </div>
335
+ <auro-accordion alignRight>
336
+ <span slot="trigger">See code</span>
337
+ <!-- AURO-GENERATED-CONTENT:START (CODE:src=./../apiExamples/complex.html) -->
338
+ <!-- The below code snippet is automatically added from ./../apiExamples/complex.html -->
339
+
340
+ ```html
341
+ <style>
342
+ .submitBlock {
343
+ margin-top: 1rem;
344
+ display: flex;
345
+ justify-content: flex-end;
346
+ gap: 1rem;
347
+ }
348
+
349
+ .datepickerBlock {
350
+ margin-top: 1rem;
351
+ }
352
+
353
+ .complex-form {
354
+ display: block;
355
+ width: 100%;
356
+ padding: 1rem;
357
+ border: 1px solid #2a2a2a;
358
+ border-radius: 1rem;
359
+ }
360
+ </style>
361
+ <h2>auro-form testing</h2>
362
+ <auro-form class="complex-form">
363
+ <auro-input id="first-name" name="firstName" required>
364
+ <span slot="label">First Name</span>
365
+ </auro-input>
366
+ <div>
367
+ <auro-input id="last-name" name="lastName" required>
368
+ <span slot="label">Last Name</span>
369
+ </auro-input>
370
+ </div>
371
+ <div>
372
+ <div>
373
+ <auro-input id="occupation" name="occupation" required>
374
+ <span slot="label">Occupation</span>
375
+ </auro-input>
376
+ </div>
377
+ </div>
378
+ <auro-input-two id="cool-fact" name="coolFact" required>
379
+ <span slot="label">Cool Fact</span>
380
+ </auro-input-two>
381
+ <div class="datepickerBlock">
382
+ <h4>Pick a cool date</h4>
383
+ <auro-datepicker id="date-example" name="dateExample" required>
384
+ <span slot="fromLabel">Choose a date</span>
385
+ <span slot="bib.fullscreen.dateLabel">Choose a date</span>
386
+ </auro-datepicker>
387
+ </div>
388
+ <div class="datepickerBlock">
389
+ <h4>Pick a date range</h4>
390
+ <auro-datepicker id="date-range" name="dateRange" required range>
391
+ <span slot="fromLabel">Start</span>
392
+ <span slot="toLabel">End</span>
393
+ <span slot="bib.fullscreen.dateLabel">Choose a range</span>
394
+ </auro-datepicker>
395
+ </div>
396
+ <div class="submitBlock">
397
+ <auro-button type="reset">Reset</auro-button>
398
+ <auro-button type="submit">Submit</auro-button>
399
+ </div>
400
+ </auro-form>
401
+ ```
402
+ <!-- AURO-GENERATED-CONTENT:END -->
109
403
  </auro-accordion>
@@ -153,7 +153,10 @@ class AuroForm extends i {
153
153
  /** @type {HTMLButtonElement[]} */
154
154
  this._resetElements = [];
155
155
 
156
- /** @type {MutationObserver[]} */
156
+ /**
157
+ * @private
158
+ * @type {MutationObserver[]}
159
+ */
157
160
  this.mutationObservers = [];
158
161
 
159
162
  // Bind listeners
@@ -268,7 +271,7 @@ class AuroForm extends i {
268
271
  }
269
272
 
270
273
  /**
271
- * Getter for internal _resetElements.
274
+ * Returns a collection of elements that will reset the form
272
275
  * @returns {HTMLButtonElement[]}
273
276
  */
274
277
  get resetElements() {
@@ -498,6 +501,7 @@ class AuroForm extends i {
498
501
 
499
502
  /**
500
503
  * Shared input listener for all form elements.
504
+ * @private
501
505
  * @param {Event} event - The event that is fired from the form element.
502
506
  */
503
507
  sharedInputListener(event) {
@@ -530,6 +534,7 @@ class AuroForm extends i {
530
534
 
531
535
  /**
532
536
  * Shared validation listener for all form elements.
537
+ * @private
533
538
  * @param {Event} event - The event that is fired from the form element.
534
539
  */
535
540
  sharedValidationListener(event) {
@@ -585,6 +590,7 @@ class AuroForm extends i {
585
590
  * root-level elements are added/removed. This is a workaround to ensure
586
591
  * nested form elements are also observed.
587
592
  *
593
+ * @private
588
594
  * @returns {void}
589
595
  */
590
596
  mutationEventListener() {
@@ -1,3 +1,4 @@
1
+ import "@aurodesignsystem/auro-button";
1
2
  import {AuroInput} from "@aurodesignsystem/auro-input";
2
3
  import {AuroDatePicker} from "@aurodesignsystem/auro-datepicker";
3
4
  import {AuroCounter, AuroCounterGroup} from "@aurodesignsystem/auro-counter";
@@ -61,8 +61,11 @@ export class AuroForm extends LitElement {
61
61
  _submitelements: HTMLButtonElement[];
62
62
  /** @type {HTMLButtonElement[]} */
63
63
  _resetElements: HTMLButtonElement[];
64
- /** @type {MutationObserver[]} */
65
- mutationObservers: MutationObserver[];
64
+ /**
65
+ * @private
66
+ * @type {MutationObserver[]}
67
+ */
68
+ private mutationObservers;
66
69
  /**
67
70
  * Reset fires an event called `reset` - just as you would expect from a normal form.
68
71
  */
@@ -73,22 +76,25 @@ export class AuroForm extends LitElement {
73
76
  submit(): void;
74
77
  /**
75
78
  * Shared input listener for all form elements.
79
+ * @private
76
80
  * @param {Event} event - The event that is fired from the form element.
77
81
  */
78
- sharedInputListener(event: Event): void;
82
+ private sharedInputListener;
79
83
  /**
80
84
  * Shared validation listener for all form elements.
85
+ * @private
81
86
  * @param {Event} event - The event that is fired from the form element.
82
87
  */
83
- sharedValidationListener(event: Event): void;
88
+ private sharedValidationListener;
84
89
  /**
85
90
  * Mutation observer for form elements. Slot change does not trigger unless
86
91
  * root-level elements are added/removed. This is a workaround to ensure
87
92
  * nested form elements are also observed.
88
93
  *
94
+ * @private
89
95
  * @returns {void}
90
96
  */
91
- mutationEventListener(): void;
97
+ private mutationEventListener;
92
98
  /**
93
99
  * Compare tag name with element to identify it (for API purposes).
94
100
  * @param {string} elementTag - The HTML tag name like `auro-datepicker`.
@@ -140,7 +146,7 @@ export class AuroForm extends LitElement {
140
146
  */
141
147
  get submitElements(): HTMLButtonElement[];
142
148
  /**
143
- * Getter for internal _resetElements.
149
+ * Returns a collection of elements that will reset the form
144
150
  * @returns {HTMLButtonElement[]}
145
151
  */
146
152
  get resetElements(): HTMLButtonElement[];
@@ -129,7 +129,10 @@ class AuroForm extends LitElement {
129
129
  /** @type {HTMLButtonElement[]} */
130
130
  this._resetElements = [];
131
131
 
132
- /** @type {MutationObserver[]} */
132
+ /**
133
+ * @private
134
+ * @type {MutationObserver[]}
135
+ */
133
136
  this.mutationObservers = [];
134
137
 
135
138
  // Bind listeners
@@ -244,7 +247,7 @@ class AuroForm extends LitElement {
244
247
  }
245
248
 
246
249
  /**
247
- * Getter for internal _resetElements.
250
+ * Returns a collection of elements that will reset the form
248
251
  * @returns {HTMLButtonElement[]}
249
252
  */
250
253
  get resetElements() {
@@ -474,6 +477,7 @@ class AuroForm extends LitElement {
474
477
 
475
478
  /**
476
479
  * Shared input listener for all form elements.
480
+ * @private
477
481
  * @param {Event} event - The event that is fired from the form element.
478
482
  */
479
483
  sharedInputListener(event) {
@@ -506,6 +510,7 @@ class AuroForm extends LitElement {
506
510
 
507
511
  /**
508
512
  * Shared validation listener for all form elements.
513
+ * @private
509
514
  * @param {Event} event - The event that is fired from the form element.
510
515
  */
511
516
  sharedValidationListener(event) {
@@ -561,6 +566,7 @@ class AuroForm extends LitElement {
561
566
  * root-level elements are added/removed. This is a workaround to ensure
562
567
  * nested form elements are also observed.
563
568
  *
569
+ * @private
564
570
  * @returns {void}
565
571
  */
566
572
  mutationEventListener() {
@@ -129,7 +129,10 @@ class AuroForm extends LitElement {
129
129
  /** @type {HTMLButtonElement[]} */
130
130
  this._resetElements = [];
131
131
 
132
- /** @type {MutationObserver[]} */
132
+ /**
133
+ * @private
134
+ * @type {MutationObserver[]}
135
+ */
133
136
  this.mutationObservers = [];
134
137
 
135
138
  // Bind listeners
@@ -244,7 +247,7 @@ class AuroForm extends LitElement {
244
247
  }
245
248
 
246
249
  /**
247
- * Getter for internal _resetElements.
250
+ * Returns a collection of elements that will reset the form
248
251
  * @returns {HTMLButtonElement[]}
249
252
  */
250
253
  get resetElements() {
@@ -474,6 +477,7 @@ class AuroForm extends LitElement {
474
477
 
475
478
  /**
476
479
  * Shared input listener for all form elements.
480
+ * @private
477
481
  * @param {Event} event - The event that is fired from the form element.
478
482
  */
479
483
  sharedInputListener(event) {
@@ -506,6 +510,7 @@ class AuroForm extends LitElement {
506
510
 
507
511
  /**
508
512
  * Shared validation listener for all form elements.
513
+ * @private
509
514
  * @param {Event} event - The event that is fired from the form element.
510
515
  */
511
516
  sharedValidationListener(event) {
@@ -561,6 +566,7 @@ class AuroForm extends LitElement {
561
566
  * root-level elements are added/removed. This is a workaround to ensure
562
567
  * nested form elements are also observed.
563
568
  *
569
+ * @private
564
570
  * @returns {void}
565
571
  */
566
572
  mutationEventListener() {
@@ -29,7 +29,7 @@ Generate unique names for dependency components.
29
29
  | [errorMessage](#errorMessage) | `errorMessage` | `string` | | Contains the help text message for the current validity error. |
30
30
  | [format](#format) | `format` | `string` | | Specifies the input mask format. |
31
31
  | [icon](#icon) | `icon` | `boolean` | false | If set, will render an icon inside the input to the left of the value. Support is limited to auro-input instances with credit card format. |
32
- | [id](#id) | `id` | `string` | | Sets the unique ID of the element. |
32
+ | [id](#id) | `id` | `string` | | The id global attribute defines an identifier (ID) which must be unique in the whole document. |
33
33
  | [inputmode](#inputmode) | `inputmode` | `string` | | Exposes inputmode attribute for input. |
34
34
  | [lang](#lang) | `lang` | `string` | | Defines the language of an element. |
35
35
  | [max](#max) | `max` | `string` | "undefined" | The maximum value allowed. This only applies for inputs with a type of `number` and all date formats. |
@@ -4851,7 +4851,20 @@ class AuroFormValidation {
4851
4851
  * The validityState definitions are located at https://developer.mozilla.org/en-US/docs/Web/API/ValidityState.
4852
4852
  */
4853
4853
 
4854
- let hasValue = elem.value && elem.value.length > 0;
4854
+ let hasValue = false;
4855
+
4856
+ // Check string for having a value
4857
+ if (typeof elem.value === "string") {
4858
+ hasValue = elem.value && elem.value.length > 0;
4859
+ }
4860
+
4861
+ // Check array value types for having a value
4862
+ if (Array.isArray(elem.value)) {
4863
+ hasValue = Boolean(
4864
+ elem.value.length > 0 &&
4865
+ elem.value.some((value) => typeof value === "string" && value.length > 0)
4866
+ );
4867
+ }
4855
4868
 
4856
4869
  // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
4857
4870
  if (this.auroInputElements?.length === 2) {
@@ -4965,6 +4978,9 @@ class AuroFormValidation {
4965
4978
  * @attr {Boolean} bordered - Applies bordered UI variant.
4966
4979
  * @attr {Boolean} borderless - Applies borderless UI variant.
4967
4980
  *
4981
+ * @prop {string} id - The id global attribute defines an identifier (ID) which must be unique in the whole document.
4982
+ * @attr id
4983
+ *
4968
4984
  * @slot helptext - Sets the help text displayed below the input.
4969
4985
  * @slot label - Sets the label text for the input.
4970
4986
  *
@@ -5155,13 +5171,6 @@ class BaseInput extends i {
5155
5171
  reflect: true
5156
5172
  },
5157
5173
 
5158
- /**
5159
- * Sets the unique ID of the element.
5160
- */
5161
- id: {
5162
- type: String
5163
- },
5164
-
5165
5174
  /** Exposes inputmode attribute for input. */
5166
5175
  inputmode: {
5167
5176
  type: String,
@@ -5382,6 +5391,16 @@ class BaseInput extends i {
5382
5391
  type: Boolean,
5383
5392
  reflect: true,
5384
5393
  attribute: false
5394
+ },
5395
+
5396
+ /**
5397
+ * @private
5398
+ * id for input node
5399
+ */
5400
+ inputId: {
5401
+ type: String,
5402
+ reflect: false,
5403
+ attribute: false
5385
5404
  }
5386
5405
  };
5387
5406
  }
@@ -5413,6 +5432,7 @@ class BaseInput extends i {
5413
5432
  if (this.tagName.toLowerCase() !== 'auro-input') {
5414
5433
  this.setAttribute('auro-input', true);
5415
5434
  }
5435
+ this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
5416
5436
 
5417
5437
  this.inputElement = this.renderRoot.querySelector('input');
5418
5438
  this.labelElement = this.shadowRoot.querySelector('label');
@@ -7078,7 +7098,7 @@ class AuroInput extends BaseInput {
7078
7098
  : undefined
7079
7099
  }
7080
7100
  </div>
7081
- <label for=${this.id} class="${e$2(labelClasses)}" part="label">
7101
+ <label for=${this.inputId} class="${e$2(labelClasses)}" part="label">
7082
7102
  <slot name="label">
7083
7103
  ${this.label}
7084
7104
  </slot>
@@ -7088,7 +7108,7 @@ class AuroInput extends BaseInput {
7088
7108
  @input="${this.handleInput}"
7089
7109
  @focusin="${this.handleFocusin}"
7090
7110
  @blur="${this.handleBlur}"
7091
- id="${this.id}"
7111
+ id="${this.inputId}"
7092
7112
  name="${o$3(this.name)}"
7093
7113
  type="${this.type === 'password' && this.showPassword ? 'text' : this.getInputType(this.type)}"
7094
7114
  pattern="${o$3(this.definePattern())}"
@@ -7156,7 +7176,7 @@ class AuroInput extends BaseInput {
7156
7176
  variant="flat"
7157
7177
  ?onDark="${this.onDark}"
7158
7178
  class="notificationBtn clearBtn"
7159
- aria-label="${i18n(this.lang, 'clearInput')}"
7179
+ arialabel="${i18n(this.lang, 'clearInput')}"
7160
7180
  @click="${this.handleClickClear}">
7161
7181
  <${this.iconTag}
7162
7182
  customColor