@aurodesignsystem-dev/auro-formkit 0.0.0-pr1581.0 → 0.0.0-pr1582.0

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 (72) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +15 -6
  7. package/components/combobox/demo/getting-started.min.js +15 -6
  8. package/components/combobox/demo/index.min.js +15 -6
  9. package/components/combobox/dist/index.js +15 -6
  10. package/components/combobox/dist/registered.js +15 -6
  11. package/components/counter/demo/customize.min.js +2 -2
  12. package/components/counter/demo/index.min.js +2 -2
  13. package/components/counter/dist/index.js +2 -2
  14. package/components/counter/dist/registered.js +2 -2
  15. package/components/datepicker/demo/customize.min.js +15 -6
  16. package/components/datepicker/demo/index.min.js +15 -6
  17. package/components/datepicker/dist/index.js +15 -6
  18. package/components/datepicker/dist/registered.js +15 -6
  19. package/components/dropdown/demo/customize.min.js +1 -1
  20. package/components/dropdown/demo/getting-started.min.js +14 -5
  21. package/components/dropdown/demo/index.min.js +1 -1
  22. package/components/dropdown/dist/index.js +1 -1
  23. package/components/dropdown/dist/registered.js +1 -1
  24. package/components/form/demo/customize.min.js +49 -22
  25. package/components/form/demo/getting-started.min.js +49 -22
  26. package/components/form/demo/index.min.js +49 -22
  27. package/components/form/demo/registerDemoDeps.min.js +49 -22
  28. package/components/input/demo/api.md +1 -1
  29. package/components/input/demo/customize.md +1 -1
  30. package/components/input/demo/customize.min.js +13 -4
  31. package/components/input/demo/getting-started.min.js +13 -4
  32. package/components/input/demo/index.min.js +13 -4
  33. package/components/input/dist/base-input.d.ts +2 -0
  34. package/components/input/dist/index.js +13 -4
  35. package/components/input/dist/registered.js +13 -4
  36. package/components/radio/demo/customize.min.js +1 -1
  37. package/components/radio/demo/getting-started.min.js +1 -1
  38. package/components/radio/demo/index.min.js +1 -1
  39. package/components/radio/dist/index.js +1 -1
  40. package/components/radio/dist/registered.js +1 -1
  41. package/components/select/demo/customize.min.js +2 -2
  42. package/components/select/demo/getting-started.min.js +2 -2
  43. package/components/select/demo/index.min.js +2 -2
  44. package/components/select/dist/index.js +2 -2
  45. package/components/select/dist/registered.js +2 -2
  46. package/custom-elements.json +4 -4
  47. package/package.json +3 -6
  48. package/ai/README.md +0 -142
  49. package/ai/_a11y-baseline.md +0 -27
  50. package/ai/_authored/_defaults.overlay.yaml +0 -81
  51. package/ai/_authored/auro-checkbox.overlay.yaml +0 -22
  52. package/ai/_authored/auro-combobox.overlay.yaml +0 -37
  53. package/ai/_authored/auro-counter.overlay.yaml +0 -23
  54. package/ai/_authored/auro-datepicker.overlay.yaml +0 -44
  55. package/ai/_authored/auro-dropdown.overlay.yaml +0 -35
  56. package/ai/_authored/auro-form.overlay.yaml +0 -12
  57. package/ai/_authored/auro-input.overlay.yaml +0 -33
  58. package/ai/_authored/auro-menu.overlay.yaml +0 -21
  59. package/ai/_authored/auro-radio.overlay.yaml +0 -19
  60. package/ai/_authored/auro-select.overlay.yaml +0 -37
  61. package/ai/_prompt-template.md +0 -33
  62. package/ai/llms.txt +0 -26
  63. package/ai/specs/auro-checkbox.spec.yaml +0 -181
  64. package/ai/specs/auro-combobox.spec.yaml +0 -349
  65. package/ai/specs/auro-counter.spec.yaml +0 -215
  66. package/ai/specs/auro-datepicker.spec.yaml +0 -395
  67. package/ai/specs/auro-dropdown.spec.yaml +0 -295
  68. package/ai/specs/auro-form.spec.yaml +0 -148
  69. package/ai/specs/auro-input.spec.yaml +0 -392
  70. package/ai/specs/auro-menu.spec.yaml +0 -213
  71. package/ai/specs/auro-radio.spec.yaml +0 -184
  72. package/ai/specs/auro-select.spec.yaml +0 -324
@@ -1,295 +0,0 @@
1
- # GENERATED by packages/build-tools/src/aiSpecGenerator.mjs — do not edit by hand.
2
- # Authored inputs live in ai/_authored/auro-dropdown.overlay.yaml
3
- component: auro-dropdown
4
- version: 0.0.0
5
- summary: Generic disclosure — a trigger that toggles a bib/panel of content. Native closest is <details>/<summary> or a <button> with aria-expanded controlling a region.
6
- generatedFrom:
7
- cem: custom-elements.json#auro-dropdown
8
- cssRecipe: components/dropdown/demo/css-only.md
9
- overlay: ai/_authored/auro-dropdown.overlay.yaml
10
- sourceOfTruth:
11
- component: components/dropdown/src/auro-dropdown.js
12
- visual:
13
- tokensImport: ./node_modules/@aurodesignsystem/design-tokens/dist/tokens/CSSCustomProperties.css
14
- rule: NEVER hardcode a hex, px, rem, or font-family value. Every visual value MUST be an Auro --ds-* token via var(--ds-token, fallback). Literal values are allowed only as the second argument (fallback) of var().
15
- css: |-
16
- @import "./node_modules/@aurodesignsystem/design-tokens/dist/tokens/CSSCustomProperties.css";
17
-
18
- .dropdown {
19
- position: relative;
20
- display: inline-block;
21
- }
22
-
23
- .dropdown > summary {
24
- list-style: none;
25
- cursor: pointer;
26
- display: inline-flex;
27
- align-items: center;
28
- gap: var(--ds-size-100, 0.5rem);
29
- padding: var(--ds-size-100, 0.5rem) var(--ds-size-150, 0.75rem);
30
- border: 1px solid var(--ds-color-border-ui-default, #6e767f);
31
- border-radius: var(--ds-border-radius, 4px);
32
- background-color: var(--ds-color-container-primary-default, #ffffff);
33
- color: var(--ds-color-text-primary-default, #1d1d1d);
34
- font-family: var(--ds-font-family-default, sans-serif);
35
- }
36
-
37
- .dropdown > summary::-webkit-details-marker {
38
- display: none;
39
- }
40
-
41
- .dropdown > summary::after {
42
- content: "";
43
- width: var(--ds-size-150, 0.75rem);
44
- height: var(--ds-size-150, 0.75rem);
45
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1d' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
46
- background-repeat: no-repeat;
47
- background-position: center;
48
- transition: transform 150ms ease;
49
- }
50
-
51
- .dropdown[open] > summary::after {
52
- transform: rotate(180deg);
53
- }
54
-
55
- .dropdown > summary:focus-visible {
56
- outline: 2px solid var(--ds-color-border-active-default, #01426a);
57
- outline-offset: 2px;
58
- }
59
-
60
- .dropdown-bib {
61
- position: absolute;
62
- top: calc(100% + var(--ds-size-50, 0.25rem));
63
- left: 0;
64
- z-index: 1;
65
- min-width: 100%;
66
- padding: var(--ds-size-100, 0.5rem);
67
- border: 1px solid var(--ds-color-border-ui-default, #6e767f);
68
- border-radius: var(--ds-border-radius, 4px);
69
- background-color: var(--ds-color-container-primary-default, #ffffff);
70
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
71
- }
72
- api:
73
- attributes:
74
- - name: appearance
75
- tier: wc-only
76
- default: '''default'''
77
- description: Defines whether the component will be on lighter or darker backgrounds.
78
- - name: autoPlacement
79
- tier: wc-only
80
- description: If declared, bib's position will be automatically calculated where to appear.
81
- - name: desktopModal
82
- tier: wc-only
83
- description: If declared, the dropdown will behave as a modal dialog when in a desktop viewport size.
84
- - name: disableEventShow
85
- tier: wc-only
86
- description: If declared, the dropdown will only show by calling the API .show() public method.
87
- - name: simple
88
- tier: wc-only
89
- description: If declared, applies a border around the trigger slot.
90
- - name: chevron
91
- tier: enhanced
92
- description: If declared, the dropdown displays a chevron on the right.
93
- - name: disabled
94
- tier: core
95
- native: disabled
96
- description: If declared, the dropdown is not interactive.
97
- - name: disableKeyboardHandling
98
- tier: wc-only
99
- description: If declared, the dropdown will not handle keyboard events and will require the consumer to manage this behavior.
100
- - name: dropdownWidth
101
- tier: wc-only
102
- - name: error
103
- tier: wc-only
104
- description: If declared, will apply error UI to the dropdown.
105
- - name: errorMessage
106
- tier: wc-only
107
- default: undefined
108
- description: Contains the help text message for the current validity error.
109
- - name: focusShow
110
- tier: wc-only
111
- description: If declared, the bib will display when focus is applied to the trigger.
112
- - name: open
113
- tier: enhanced
114
- default: 'false'
115
- description: If true, the dropdown bib is displayed.
116
- - name: isBibFullscreen
117
- tier: wc-only
118
- default: 'false'
119
- description: If true, the dropdown bib is taking the fullscreen when it's open.
120
- - name: hoverToggle
121
- tier: wc-only
122
- description: If declared, the trigger will toggle the dropdown on mouseover/mouseout.
123
- - name: hasTriggerContent
124
- tier: wc-only
125
- - name: fullscreenBreakpoint
126
- tier: wc-only
127
- default: '''sm'''
128
- description: Defines the screen size breakpoint at which the dropdown switches to fullscreen mode on mobile.
129
- - name: layout
130
- tier: wc-only
131
- default: undefined
132
- description: Sets the layout of the dropdown.
133
- - name: parentBorder
134
- tier: wc-only
135
- default: 'false'
136
- description: Defines if the trigger should size based on the parent element providing the border UI.
137
- - name: matchWidth
138
- tier: wc-only
139
- default: 'false'
140
- description: If declared, the popover and trigger will be set to the same width.
141
- - name: noFlip
142
- tier: wc-only
143
- description: If declared, the bib will NOT flip to an alternate position when there isn't enough space in the specified `placement`.
144
- - name: shift
145
- tier: wc-only
146
- description: If declared, the dropdown will shift its position to avoid being cut off by the viewport.
147
- - name: noHideOnThisFocusLoss
148
- tier: wc-only
149
- default: 'false'
150
- description: If declared, the dropdown will not hide when moving focus outside the element.
151
- - name: noToggle
152
- tier: wc-only
153
- description: If declared, the trigger will only show the dropdown bib.
154
- - name: offset
155
- tier: wc-only
156
- default: '0'
157
- description: Gap between the trigger element and bib.
158
- - name: onDark
159
- tier: wc-only
160
- description: DEPRECATED - use `appearance="inverse"` instead.
161
- - name: onSlotChange
162
- tier: enhanced
163
- description: If declared, and a function is set, that function will execute when the slot content is updated.
164
- - name: placement
165
- tier: wc-only
166
- default: '''bottom-start'''
167
- description: Position where the bib should appear relative to the trigger.
168
- - name: tabIndex
169
- tier: enhanced
170
- - name: shape
171
- tier: wc-only
172
- - name: size
173
- tier: enhanced
174
- - name: ondark
175
- tier: wc-only
176
- slots:
177
- - name: (default)
178
- tier: core
179
- description: Default slot for the dropdown bib content.
180
- - name: helpText
181
- tier: core
182
- description: Defines the content of the helpText.
183
- - name: trigger
184
- tier: core
185
- description: Defines the content of the trigger.
186
- events:
187
- - name: auroDropdown-idAdded
188
- tier: wc-only
189
- description: Notifies consumers that the unique ID for the dropdown bib has been generated.
190
- - name: auroDropdown-triggerClick
191
- tier: wc-only
192
- description: Notifies that the trigger has been clicked.
193
- - name: auroDropdown-toggled
194
- tier: wc-only
195
- description: Notifies that the visibility of the dropdown bib has changed.
196
- methods:
197
- - name: hide
198
- tier: wc-only
199
- - name: show
200
- tier: wc-only
201
- - name: focus
202
- tier: wc-only
203
- - name: register
204
- tier: wc-only
205
- - name: exposeCssParts
206
- tier: wc-only
207
- - name: clearTriggerA11yAttributes
208
- tier: wc-only
209
- - name: resetShapeClasses
210
- tier: wc-only
211
- - name: resetLayoutClasses
212
- tier: wc-only
213
- - name: updateComponentArchitecture
214
- tier: wc-only
215
- behavior:
216
- a11y:
217
- - Every control MUST have a programmatically associated <label> (for/id or wrapping).
218
- - Link help text via aria-describedby so it is announced after the label.
219
- - Reflect invalid state with aria-invalid="true|false" on the control.
220
- - Render validation errors with role="alert" aria-live="assertive" so they announce immediately.
221
- - The trigger is a <button> with aria-expanded and aria-controls pointing to the panel id.
222
- - The panel is a region whose visibility follows aria-expanded.
223
- keyboard:
224
- - All interactive affordances are real, focusable elements in DOM order.
225
- - Enter/Space toggles the panel; Esc closes it and returns focus to the trigger.
226
- validation: []
227
- gaps:
228
- - id: floating-ui-positioning
229
- feature: Floating-UI positioning
230
- guidance: auro-dropdown uses Floating UI to position the bib relative to the trigger and supports a placement attribute with twelve values (top, right, bottom, left, and their -start/-end variants).
231
- - id: auto-placement-and-flip
232
- feature: Auto-placement and flip
233
- guidance: auro-dropdown exposes autoPlacement and the inverse noFlip option so the bib can automatically pick the side of the trigger with the most available space and flip when it would otherwise be clipped by the viewport.
234
- - id: shift-to-stay-on-screen
235
- feature: Shift to stay on-screen
236
- guidance: auro-dropdown supports a shift attribute that nudges the bib along its axis so it remains fully visible inside the viewport.
237
- - id: match-width-and-offset-control
238
- feature: Match-width and offset control
239
- guidance: auro-dropdown exposes matchWidth to size the bib to the trigger and a numeric offset for the gap between trigger and bib.
240
- - id: mobile-fullscreen-behavior
241
- feature: Mobile fullscreen behavior
242
- guidance: auro-dropdown supports a fullscreenBreakpoint (defaulting to sm) that switches the bib into a fullscreen presentation on small viewports, and a desktopModal option for modal behavior on larger viewports.
243
- - id: hover-trigger
244
- feature: Hover trigger
245
- guidance: auro-dropdown supports a hoverToggle attribute that opens the bib on mouseover and closes it on mouseout.
246
- - id: focus-management
247
- feature: Focus management
248
- guidance: auro-dropdown provides a focus() method that moves focus to the first focusable element inside the bib when it is open, or to the trigger when it is closed.
249
- - id: click-outside-and-focus-loss-dismissal
250
- feature: Click-outside and focus-loss dismissal
251
- guidance: auro-dropdown closes the bib when the user clicks outside the component or moves focus out of it, and exposes noHideOnThisFocusLoss to opt out.
252
- - id: keyboard-handling
253
- feature: Keyboard handling
254
- guidance: auro-dropdown includes a keyboard strategy for arrow-key navigation, Escape to close, and Tab behavior coordinated with the bib contents, and lets consumers opt out via disableKeyboardHandling.
255
- - id: aria-wiring
256
- feature: ARIA wiring
257
- guidance: auro-dropdown sets an a11yRole on the trigger, manages aria-expanded, and emits an auroDropdown-idAdded event so consumers can wire aria-controls to the generated bib ID.
258
- - id: chevron-indicator
259
- feature: Chevron indicator
260
- guidance: auro-dropdown supports a chevron attribute that renders a collapsed/expanded indicator with the correct rotation and design-token color.
261
- - id: error-and-help-text-presentation
262
- feature: Error and help-text presentation
263
- guidance: auro-dropdown exposes error, errorMessage, and a helpText slot that renders supporting text below the trigger with the correct error styling.
264
- - id: imperative-show-hide-and-toggle-events
265
- feature: Imperative show/hide and toggle events
266
- guidance: auro-dropdown exposes show() and hide() methods, a disableEventShow option to lock it to programmatic control, and emits auroDropdown-toggled and auroDropdown-triggerClick events.
267
- - id: multi-brand-theming
268
- feature: Multi-brand theming
269
- guidance: auro-dropdown consumes Auro design tokens through its component logic, so it automatically picks up brand-specific theming when token packages are swapped.
270
- examples:
271
- - id: basic-disclosure
272
- html: |-
273
- <details class="dropdown">
274
- <summary>More options</summary>
275
- <div class="dropdown-bib">
276
- <p>Panel content goes here.</p>
277
- </div>
278
- </details>
279
- - id: disclosure-with-a-list-of-actions
280
- html: |-
281
- <details class="dropdown">
282
- <summary>Account</summary>
283
- <div class="dropdown-bib">
284
- <ul>
285
- <li><a href="/profile">Profile</a></li>
286
- <li><a href="/settings">Settings</a></li>
287
- <li><a href="/logout">Log out</a></li>
288
- </ul>
289
- </div>
290
- </details>
291
- verify:
292
- - every color, size, spacing, radius, and font value uses var(--ds-*)
293
- - each control has an associated <label>
294
- - controls with aria-invalid="true" have a role="alert" message referenced by aria-describedby
295
- - 'axe: label, aria-valid-attr-value, color-contrast pass'
@@ -1,148 +0,0 @@
1
- # GENERATED by packages/build-tools/src/aiSpecGenerator.mjs — do not edit by hand.
2
- # Authored inputs live in ai/_authored/auro-form.overlay.yaml
3
- component: auro-form
4
- version: 0.0.0
5
- summary: Form coordinator that validates and manages child fields. Native equivalent is the <form> element with native submit/reset and constraint validation.
6
- generatedFrom:
7
- cem: custom-elements.json#auro-form
8
- cssRecipe: components/form/demo/css-only.md
9
- overlay: ai/_authored/auro-form.overlay.yaml
10
- sourceOfTruth:
11
- component: components/form/src/auro-form.js
12
- visual:
13
- tokensImport: ./node_modules/@aurodesignsystem/design-tokens/dist/tokens/CSSCustomProperties.css
14
- rule: NEVER hardcode a hex, px, rem, or font-family value. Every visual value MUST be an Auro --ds-* token via var(--ds-token, fallback). Literal values are allowed only as the second argument (fallback) of var().
15
- css: |-
16
- @import "./node_modules/@aurodesignsystem/design-tokens/dist/tokens/CSSCustomProperties.css";
17
-
18
- .form {
19
- display: flex;
20
- flex-direction: column;
21
- gap: var(--ds-size-300, 1.5rem);
22
- padding: var(--ds-size-400, 2rem);
23
- }
24
-
25
- .form fieldset {
26
- display: flex;
27
- flex-direction: column;
28
- gap: var(--ds-size-200, 1rem);
29
- border: 0;
30
- padding: 0;
31
- margin: 0;
32
- }
33
-
34
- .form legend {
35
- padding: 0;
36
- margin-bottom: var(--ds-size-100, 0.5rem);
37
- }
38
-
39
- .form .actions {
40
- display: flex;
41
- gap: var(--ds-size-200, 1rem);
42
- margin-top: var(--ds-size-200, 1rem);
43
- }
44
- api:
45
- attributes: []
46
- slots:
47
- - name: default
48
- tier: core
49
- description: The default slot for form elements.
50
- events:
51
- - name: change
52
- tier: core
53
- description: Fires when a child form element's value changes or the form is initialized.
54
- - name: reset
55
- tier: core
56
- description: Fires when the form is reset.
57
- - name: submit
58
- tier: core
59
- description: Fires when the form is submitted.
60
- - name: input
61
- tier: core
62
- description: Fires when a child form element receives user input.
63
- methods:
64
- - name: reset
65
- tier: wc-only
66
- - name: submit
67
- tier: wc-only
68
- - name: register
69
- tier: wc-only
70
- behavior:
71
- a11y:
72
- - Every control MUST have a programmatically associated <label> (for/id or wrapping).
73
- - Link help text via aria-describedby so it is announced after the label.
74
- - Reflect invalid state with aria-invalid="true|false" on the control.
75
- - Render validation errors with role="alert" aria-live="assertive" so they announce immediately.
76
- - Use a native <form>; group related fields in <fieldset>/<legend>; the submit control is a real <button type="submit">.
77
- keyboard:
78
- - All interactive affordances are real, focusable elements in DOM order.
79
- - Enter in a text field submits the form (native).
80
- validation:
81
- - Use native constraint validation (required, pattern, min/max) surfaced on submit.
82
- - auro-form's cross-field coordination and aggregated validity are wc-only — validate each field and aggregate in script.
83
- gaps:
84
- - id: child-element-registration
85
- feature: Child element registration
86
- guidance: auro-form automatically discovers and registers its named Auro form-element children (auro-input, auro-select, auro-datepicker, auro-combobox, auro-checkbox-group, auro-radio-group, auro-counter-group) on slot change and via a MutationObserver, so dynamically added or removed fields are tracked without manual wiring.
87
- - id: aggregated-value-snapshot
88
- feature: Aggregated value snapshot
89
- guidance: auro-form exposes a value getter that returns a single key-value object of every named child's current value, including array values from range datepickers and grouped controls.
90
- - id: aggregated-validity-state
91
- feature: Aggregated validity state
92
- guidance: auro-form exposes a single validity getter that returns 'valid', 'invalid', or null based on the validity of every required and interacted-with child.
93
- - id: initial-state-tracking
94
- feature: Initial-state tracking
95
- guidance: auro-form tracks an isInitialState flag that is true until any child has been interacted with or had its value changed.
96
- - id: auroformelement-validated-event-aggregation
97
- feature: auroFormElement-validated event aggregation
98
- guidance: auro-form listens for auroFormElement-validated events from every registered child and updates its aggregated validity state in response.
99
- - id: submit-coordination
100
- feature: Submit coordination
101
- guidance: auro-form intercepts clicks on child submit buttons (<button type="submit"> or <auro-button type="submit">), forces validation on every registered child, waits for validation to settle, and only then fires a submit event with detail.value containing the full form snapshot.
102
- - id: reset-coordination
103
- feature: Reset coordination
104
- guidance: auro-form intercepts clicks on child reset buttons, calls reset() on every registered child, reinitializes its state, and fires a reset event with detail.previousValue containing the values captured before the reset.
105
- - id: submit-and-reset-button-disabling
106
- feature: Submit and reset button disabling
107
- guidance: auro-form automatically disables submit buttons while the form is in its initial state or invalid, and disables reset buttons while the form is in its initial state.
108
- - id: enter-to-submit-handling
109
- feature: Enter-to-submit handling
110
- guidance: auro-form listens for the Enter key on its registered children and triggers a coordinated submit, while skipping textarea-style fields so they can accept newlines.
111
- - id: mixed-auro-and-native-child-support
112
- feature: Mixed Auro and native child support
113
- guidance: auro-form recognizes its named Auro children and coordinates them as a single form, while still allowing native elements to live alongside them in markup.
114
- - id: multi-brand-theming
115
- feature: Multi-brand theming
116
- guidance: auro-form consumes Auro design tokens through its component logic, so it automatically picks up brand-specific theming when token packages are swapped.
117
- examples:
118
- - id: basic-form
119
- html: |-
120
- <form class="form" action="/subscribe" method="post">
121
- <label>
122
- Email
123
- <input type="email" name="email" required />
124
- </label>
125
- <div class="actions">
126
- <button type="submit">Submit</button>
127
- <button type="reset">Reset</button>
128
- </div>
129
- </form>
130
- - id: form-with-grouped-fields
131
- html: |-
132
- <form class="form">
133
- <fieldset>
134
- <legend>Contact information</legend>
135
- <label>First name <input type="text" name="firstName" required /></label>
136
- <label>Last name <input type="text" name="lastName" required /></label>
137
- <label>Email <input type="email" name="email" required /></label>
138
- </fieldset>
139
- <div class="actions">
140
- <button type="submit">Submit</button>
141
- <button type="reset">Reset</button>
142
- </div>
143
- </form>
144
- verify:
145
- - every color, size, spacing, radius, and font value uses var(--ds-*)
146
- - each control has an associated <label>
147
- - controls with aria-invalid="true" have a role="alert" message referenced by aria-describedby
148
- - 'axe: label, aria-valid-attr-value, color-contrast pass'