@helixui/library 3.3.1-next.115 → 3.3.1-next.118
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +445 -276
- package/dist/components/hx-accordion/hx-accordion-item.d.ts +35 -0
- package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.d.ts +153 -1
- package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
- package/dist/components/hx-checkbox/index.js +1 -1
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +151 -2
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
- package/dist/components/hx-checkbox-group/index.js +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.d.ts +163 -1
- package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-color-picker/index.js +1 -1
- package/dist/components/hx-combobox/hx-combobox.d.ts +311 -2
- package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
- package/dist/components/hx-combobox/index.js +1 -1
- package/dist/components/hx-date-picker/hx-date-picker.d.ts +182 -56
- package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
- package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-date-picker/index.js +1 -1
- package/dist/components/hx-dialog/hx-dialog.d.ts +240 -0
- package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
- package/dist/components/hx-dialog/index.js +1 -1
- package/dist/components/hx-dropdown/hx-dropdown.d.ts +80 -0
- package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
- package/dist/components/hx-dropdown/index.js +1 -1
- package/dist/components/hx-field/hx-field.d.ts +109 -0
- package/dist/components/hx-field/hx-field.d.ts.map +1 -1
- package/dist/components/hx-field/index.js +1 -1
- package/dist/components/hx-popover/hx-popover.d.ts +91 -0
- package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
- package/dist/components/hx-popover/index.js +1 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts +152 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
- package/dist/components/hx-radio-group/hx-radio.d.ts +14 -0
- package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
- package/dist/components/hx-radio-group/index.js +1 -1
- package/dist/components/hx-select/hx-select.d.ts +303 -2
- package/dist/components/hx-select/hx-select.d.ts.map +1 -1
- package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
- package/dist/components/hx-select/index.js +1 -1
- package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
- package/dist/components/hx-side-nav/index.js +1 -1
- package/dist/components/hx-switch/hx-switch.d.ts +78 -1
- package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
- package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
- package/dist/components/hx-switch/index.js +1 -1
- package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +110 -0
- package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
- package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
- package/dist/components/hx-toggle-button/index.js +1 -1
- package/dist/components/hx-tooltip/hx-tooltip.d.ts +52 -0
- package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
- package/dist/components/hx-tooltip/index.js +1 -1
- package/dist/css/helix-all.css +98 -1
- package/dist/css/helix-forms.css +98 -1
- package/dist/css/hx-checkbox.css +18 -0
- package/dist/css/hx-color-picker.css +25 -0
- package/dist/css/hx-date-picker.css +2 -1
- package/dist/css/hx-select.css +19 -0
- package/dist/css/hx-switch.css +17 -0
- package/dist/css/hx-toggle-button.css +17 -0
- package/dist/css/index.css +1 -1
- package/dist/css/manifest.json +2 -1
- package/dist/index.js +15 -15
- package/dist/shared/aria-flatten-DY6v2vah.js +22 -0
- package/dist/shared/aria-flatten-DY6v2vah.js.map +1 -0
- package/dist/shared/aria-idref-Q0yiSR3p.js +104 -0
- package/dist/shared/aria-idref-Q0yiSR3p.js.map +1 -0
- package/dist/shared/hx-accordion-ZVzgDzTG.js.map +1 -1
- package/dist/shared/hx-checkbox-BdgoUeWi.js +696 -0
- package/dist/shared/hx-checkbox-BdgoUeWi.js.map +1 -0
- package/dist/shared/hx-checkbox-group-LWezHrvS.js +496 -0
- package/dist/shared/hx-checkbox-group-LWezHrvS.js.map +1 -0
- package/dist/shared/hx-color-picker-DVhZl88b.js +1221 -0
- package/dist/shared/hx-color-picker-DVhZl88b.js.map +1 -0
- package/dist/shared/hx-combobox-DvlezcDV.js +1359 -0
- package/dist/shared/hx-combobox-DvlezcDV.js.map +1 -0
- package/dist/shared/{hx-date-picker-2iRG1p74.js → hx-date-picker-N-0aG5XL.js} +542 -206
- package/dist/shared/hx-date-picker-N-0aG5XL.js.map +1 -0
- package/dist/shared/hx-dialog-DzB7VytW.js +717 -0
- package/dist/shared/hx-dialog-DzB7VytW.js.map +1 -0
- package/dist/shared/{hx-dropdown-LyaRc8Rf.js → hx-dropdown-DJWlF94E.js} +130 -77
- package/dist/shared/hx-dropdown-DJWlF94E.js.map +1 -0
- package/dist/shared/{hx-field-B3Qo8OLS.js → hx-field-zw0U1KVi.js} +99 -38
- package/dist/shared/hx-field-zw0U1KVi.js.map +1 -0
- package/dist/shared/{hx-nav-item-xqRPOCWX.js → hx-nav-item-CODtUlew.js} +13 -9
- package/dist/shared/{hx-nav-item-xqRPOCWX.js.map → hx-nav-item-CODtUlew.js.map} +1 -1
- package/dist/shared/{hx-popover-B-FP3-wW.js → hx-popover-CHxWY_cd.js} +123 -66
- package/dist/shared/hx-popover-CHxWY_cd.js.map +1 -0
- package/dist/shared/hx-radio-CeGzARNk.js +822 -0
- package/dist/shared/hx-radio-CeGzARNk.js.map +1 -0
- package/dist/shared/hx-select-DrcS-YRJ.js +1089 -0
- package/dist/shared/hx-select-DrcS-YRJ.js.map +1 -0
- package/dist/shared/hx-switch-BX_8uNUs.js +540 -0
- package/dist/shared/hx-switch-BX_8uNUs.js.map +1 -0
- package/dist/shared/{hx-toggle-button-iLiYrMbD.js → hx-toggle-button-Dcz9IlUm.js} +226 -65
- package/dist/shared/hx-toggle-button-Dcz9IlUm.js.map +1 -0
- package/dist/shared/{hx-tooltip-nYOv9OLu.js → hx-tooltip-DVqtKPCD.js} +68 -46
- package/dist/shared/hx-tooltip-DVqtKPCD.js.map +1 -0
- package/dist/utils/aria-flatten.d.ts +56 -0
- package/dist/utils/aria-flatten.d.ts.map +1 -0
- package/dist/utils/aria-idref.d.ts +127 -0
- package/dist/utils/aria-idref.d.ts.map +1 -0
- package/figma-inventory.json +64 -1
- package/package.json +2 -2
- package/dist/shared/hx-checkbox-D7xma9YH.js +0 -524
- package/dist/shared/hx-checkbox-D7xma9YH.js.map +0 -1
- package/dist/shared/hx-checkbox-group-C9n315Ju.js +0 -323
- package/dist/shared/hx-checkbox-group-C9n315Ju.js.map +0 -1
- package/dist/shared/hx-color-picker-uRc865FJ.js +0 -882
- package/dist/shared/hx-color-picker-uRc865FJ.js.map +0 -1
- package/dist/shared/hx-combobox-DDzqNKEW.js +0 -924
- package/dist/shared/hx-combobox-DDzqNKEW.js.map +0 -1
- package/dist/shared/hx-date-picker-2iRG1p74.js.map +0 -1
- package/dist/shared/hx-dialog-DRN_1-Y-.js +0 -514
- package/dist/shared/hx-dialog-DRN_1-Y-.js.map +0 -1
- package/dist/shared/hx-dropdown-LyaRc8Rf.js.map +0 -1
- package/dist/shared/hx-field-B3Qo8OLS.js.map +0 -1
- package/dist/shared/hx-popover-B-FP3-wW.js.map +0 -1
- package/dist/shared/hx-radio-CJvNU2yP.js +0 -621
- package/dist/shared/hx-radio-CJvNU2yP.js.map +0 -1
- package/dist/shared/hx-select-C8fEHQhC.js +0 -807
- package/dist/shared/hx-select-C8fEHQhC.js.map +0 -1
- package/dist/shared/hx-switch-BrZFaRue.js +0 -420
- package/dist/shared/hx-switch-BrZFaRue.js.map +0 -1
- package/dist/shared/hx-toggle-button-iLiYrMbD.js.map +0 -1
- package/dist/shared/hx-tooltip-nYOv9OLu.js.map +0 -1
package/custom-elements.json
CHANGED
|
@@ -2,13 +2,276 @@
|
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
3
|
"readme": "",
|
|
4
4
|
"modules": [
|
|
5
|
+
{
|
|
6
|
+
"kind": "javascript-module",
|
|
7
|
+
"path": "src/components/hx-action-bar/hx-action-bar.ts",
|
|
8
|
+
"declarations": [
|
|
9
|
+
{
|
|
10
|
+
"kind": "class",
|
|
11
|
+
"description": "A horizontal toolbar container for grouping related action buttons and controls.\nImplements the ARIA toolbar pattern with roving tabindex keyboard navigation.",
|
|
12
|
+
"name": "HelixActionBar",
|
|
13
|
+
"cssProperties": [
|
|
14
|
+
{
|
|
15
|
+
"description": "Bar background color (default variant).",
|
|
16
|
+
"name": "--hx-action-bar-bg",
|
|
17
|
+
"default": "transparent"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"description": "Bar border (default variant).",
|
|
21
|
+
"name": "--hx-action-bar-border",
|
|
22
|
+
"default": "none"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"description": "Inner padding.",
|
|
26
|
+
"name": "--hx-action-bar-padding",
|
|
27
|
+
"default": "var(--hx-space-2,0.5rem) var(--hx-space-3,0.75rem)"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"description": "Gap between slotted items.",
|
|
31
|
+
"name": "--hx-action-bar-gap",
|
|
32
|
+
"default": "var(--hx-space-2,0.5rem)"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"description": "Z-index when sticky or bottom position.",
|
|
36
|
+
"name": "--hx-action-bar-z-index",
|
|
37
|
+
"default": "10"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"description": "Padding.",
|
|
41
|
+
"name": "--hx-action-bar-padding-block-start",
|
|
42
|
+
"default": "0px"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"description": "Padding.",
|
|
46
|
+
"name": "--hx-action-bar-padding-block-end",
|
|
47
|
+
"default": "0px"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"description": "CSS custom property.",
|
|
51
|
+
"name": "--hx-border-radius-md"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"description": "Width.",
|
|
55
|
+
"name": "--hx-border-width-thin"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"description": "Color.",
|
|
59
|
+
"name": "--hx-color-neutral-0"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"description": "Color.",
|
|
63
|
+
"name": "--hx-color-neutral-200"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"description": "Color.",
|
|
67
|
+
"name": "--hx-color-neutral-50"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"description": "Size token.",
|
|
71
|
+
"name": "--hx-size-8"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"description": "Size token.",
|
|
75
|
+
"name": "--hx-size-10"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"description": "Size token.",
|
|
79
|
+
"name": "--hx-size-12"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"description": "Spacing token.",
|
|
83
|
+
"name": "--hx-space-1"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"description": "Spacing token.",
|
|
87
|
+
"name": "--hx-space-2"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"description": "Spacing token.",
|
|
91
|
+
"name": "--hx-space-3"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"description": "Spacing token.",
|
|
95
|
+
"name": "--hx-space-4"
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"cssParts": [
|
|
99
|
+
{
|
|
100
|
+
"description": "The root toolbar container element.",
|
|
101
|
+
"name": "base"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"description": "The start (left) slot wrapper.",
|
|
105
|
+
"name": "start"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"description": "The center (default) slot wrapper.",
|
|
109
|
+
"name": "center"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"description": "The end (right) slot wrapper.",
|
|
113
|
+
"name": "end"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"description": "The overflow slot wrapper (hidden when no overflow content).",
|
|
117
|
+
"name": "overflow"
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"slots": [
|
|
121
|
+
{
|
|
122
|
+
"description": "Left-aligned actions.",
|
|
123
|
+
"name": "start"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"description": "Center content (default slot).",
|
|
127
|
+
"name": ""
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"description": "Right-aligned actions.",
|
|
131
|
+
"name": "end"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"description": "Actions revealed when the bar is constrained for space.",
|
|
135
|
+
"name": "overflow"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"members": [
|
|
139
|
+
{
|
|
140
|
+
"kind": "field",
|
|
141
|
+
"name": "size",
|
|
142
|
+
"type": {
|
|
143
|
+
"text": "'sm' | 'md' | 'lg'"
|
|
144
|
+
},
|
|
145
|
+
"default": "'md'",
|
|
146
|
+
"description": "Size of the action bar — propagated as a data attribute to slotted children.",
|
|
147
|
+
"attribute": "hx-size",
|
|
148
|
+
"reflects": true
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"kind": "field",
|
|
152
|
+
"name": "variant",
|
|
153
|
+
"type": {
|
|
154
|
+
"text": "'default' | 'outlined' | 'filled'"
|
|
155
|
+
},
|
|
156
|
+
"default": "'default'",
|
|
157
|
+
"description": "Visual variant controlling the bar background.",
|
|
158
|
+
"attribute": "variant",
|
|
159
|
+
"reflects": true
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"kind": "field",
|
|
163
|
+
"name": "position",
|
|
164
|
+
"type": {
|
|
165
|
+
"text": "'top' | 'bottom' | 'sticky'"
|
|
166
|
+
},
|
|
167
|
+
"default": "'top'",
|
|
168
|
+
"description": "Position and sticky behavior of the action bar.\n- `top` — normal flow (default)\n- `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support",
|
|
169
|
+
"attribute": "position",
|
|
170
|
+
"reflects": true
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"kind": "field",
|
|
174
|
+
"name": "accessibleLabel",
|
|
175
|
+
"type": {
|
|
176
|
+
"text": "string"
|
|
177
|
+
},
|
|
178
|
+
"default": "''",
|
|
179
|
+
"description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.\n\nAccepts both `accessible-label` and the standard `aria-label` HTML attribute.\nThe `accessible-label` attribute takes precedence when both are set.\n\nPreviously this was exposed as the `ariaLabel` JS property, which shadowed\nthe native `HTMLElement.ariaLabel`. That shadowing is removed; use\n`accessibleLabel` or the HTML attributes instead.",
|
|
180
|
+
"attribute": "accessible-label"
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
"attributes": [
|
|
184
|
+
{
|
|
185
|
+
"name": "hx-size",
|
|
186
|
+
"type": {
|
|
187
|
+
"text": "'sm' | 'md' | 'lg'"
|
|
188
|
+
},
|
|
189
|
+
"default": "'md'",
|
|
190
|
+
"description": "Size of the action bar — propagated as a data attribute to slotted children.",
|
|
191
|
+
"fieldName": "size",
|
|
192
|
+
"attribute": "hx-size"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"name": "variant",
|
|
196
|
+
"type": {
|
|
197
|
+
"text": "'default' | 'outlined' | 'filled'"
|
|
198
|
+
},
|
|
199
|
+
"default": "'default'",
|
|
200
|
+
"description": "Visual variant controlling the bar background.",
|
|
201
|
+
"fieldName": "variant",
|
|
202
|
+
"attribute": "variant"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "position",
|
|
206
|
+
"type": {
|
|
207
|
+
"text": "'top' | 'bottom' | 'sticky'"
|
|
208
|
+
},
|
|
209
|
+
"default": "'top'",
|
|
210
|
+
"description": "Position and sticky behavior of the action bar.\n- `top` — normal flow (default)\n- `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support",
|
|
211
|
+
"fieldName": "position",
|
|
212
|
+
"attribute": "position"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "accessible-label",
|
|
216
|
+
"type": {
|
|
217
|
+
"text": "string"
|
|
218
|
+
},
|
|
219
|
+
"default": "''",
|
|
220
|
+
"description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.\n\nAccepts both `accessible-label` and the standard `aria-label` HTML attribute.\nThe `accessible-label` attribute takes precedence when both are set.\n\nPreviously this was exposed as the `ariaLabel` JS property, which shadowed\nthe native `HTMLElement.ariaLabel`. That shadowing is removed; use\n`accessibleLabel` or the HTML attributes instead.",
|
|
221
|
+
"fieldName": "accessibleLabel",
|
|
222
|
+
"attribute": "accessible-label"
|
|
223
|
+
}
|
|
224
|
+
],
|
|
225
|
+
"superclass": {
|
|
226
|
+
"name": "HelixElement",
|
|
227
|
+
"module": "/src/base/index.js"
|
|
228
|
+
},
|
|
229
|
+
"tagName": "hx-action-bar",
|
|
230
|
+
"customElement": true,
|
|
231
|
+
"summary": "Horizontal action bar for grouping related controls."
|
|
232
|
+
}
|
|
233
|
+
],
|
|
234
|
+
"exports": [
|
|
235
|
+
{
|
|
236
|
+
"kind": "js",
|
|
237
|
+
"name": "HelixActionBar",
|
|
238
|
+
"declaration": {
|
|
239
|
+
"name": "HelixActionBar",
|
|
240
|
+
"module": "src/components/hx-action-bar/hx-action-bar.ts"
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"kind": "custom-element-definition",
|
|
245
|
+
"name": "hx-action-bar",
|
|
246
|
+
"declaration": {
|
|
247
|
+
"name": "HelixActionBar",
|
|
248
|
+
"module": "src/components/hx-action-bar/hx-action-bar.ts"
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
]
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"kind": "javascript-module",
|
|
255
|
+
"path": "src/components/hx-action-bar/index.ts",
|
|
256
|
+
"declarations": [],
|
|
257
|
+
"exports": [
|
|
258
|
+
{
|
|
259
|
+
"kind": "js",
|
|
260
|
+
"name": "HelixActionBar",
|
|
261
|
+
"declaration": {
|
|
262
|
+
"name": "HelixActionBar",
|
|
263
|
+
"module": "./hx-action-bar.js"
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
]
|
|
267
|
+
},
|
|
5
268
|
{
|
|
6
269
|
"kind": "javascript-module",
|
|
7
270
|
"path": "src/components/hx-accordion/hx-accordion-item.ts",
|
|
8
271
|
"declarations": [
|
|
9
272
|
{
|
|
10
273
|
"kind": "class",
|
|
11
|
-
"description": "An individual accordion item with collapsible content.",
|
|
274
|
+
"description": "An individual accordion item with collapsible content.\n\n## Architecture Note: Slot Projection vs. Host-Canonical (group-4 round-1)\n\n`hx-accordion-item` deliberately does NOT participate in the\nhost-canonical / `internals.ariaLabelledByElements` pattern used by every\nother group-2/3/4 component. Rationale:\n\n 1. The trigger label comes from `<slot name=\"trigger\">` — consumer\n light-DOM projected directly into the `<summary>` element. AT reads\n the slot-projected text natively because slot projection preserves\n accessible name (the `<summary>` IS the heading and consumes the\n slotted text in its own accessible name computation).\n 2. `aria-labelledby=\"${_uid}-trigger\"` on the inner content region and\n `aria-controls=\"${_uid}-content\"` on the summary BOTH resolve\n same-shadow-root, which works correctly across every AT — these\n IDREFs never cross a shadow boundary.\n 3. Pushing these ids through `internals.ariaLabelledByElements` would\n either duplicate the wiring (heading announced twice) or break the\n native `<details>/<summary>` toggle semantics (the host carrying\n `role=\"heading\"` would shadow the summary's own heading projection).\n\n`role=\"heading\"` on `<summary>` (with `aria-level=N`) is the APG-canonical\nAccordion pattern. Per the APG note, `<summary>` MUST be a direct child\nof `<details>` for the native toggle to function — wrapping it in an\n`<h3>` would forfeit native disclosure. The role-on-summary approach is\nthe authoritative compromise. NVDA, JAWS, and VoiceOver all announce the\nsummary as a heading at the configured level when this pattern is used.\n\n`aria-controls` on the summary points at the shadow-internal content\nregion; APG marks the relationship as implicit via the heading + region\nstructure, so AT not following the IDREF still announces correctly. The\nIDREF is a hint, not a requirement — and because both ids are in the\nsame shadow root, it resolves cleanly when AT does follow it. This\nmatches the popover/dropdown intentional `aria-controls` omission for\nthe cross-shadow case (see those components' code comments).",
|
|
12
275
|
"name": "HelixAccordionItem",
|
|
13
276
|
"cssProperties": [
|
|
14
277
|
{
|
|
@@ -322,269 +585,6 @@
|
|
|
322
585
|
}
|
|
323
586
|
]
|
|
324
587
|
},
|
|
325
|
-
{
|
|
326
|
-
"kind": "javascript-module",
|
|
327
|
-
"path": "src/components/hx-action-bar/hx-action-bar.ts",
|
|
328
|
-
"declarations": [
|
|
329
|
-
{
|
|
330
|
-
"kind": "class",
|
|
331
|
-
"description": "A horizontal toolbar container for grouping related action buttons and controls.\nImplements the ARIA toolbar pattern with roving tabindex keyboard navigation.",
|
|
332
|
-
"name": "HelixActionBar",
|
|
333
|
-
"cssProperties": [
|
|
334
|
-
{
|
|
335
|
-
"description": "Bar background color (default variant).",
|
|
336
|
-
"name": "--hx-action-bar-bg",
|
|
337
|
-
"default": "transparent"
|
|
338
|
-
},
|
|
339
|
-
{
|
|
340
|
-
"description": "Bar border (default variant).",
|
|
341
|
-
"name": "--hx-action-bar-border",
|
|
342
|
-
"default": "none"
|
|
343
|
-
},
|
|
344
|
-
{
|
|
345
|
-
"description": "Inner padding.",
|
|
346
|
-
"name": "--hx-action-bar-padding",
|
|
347
|
-
"default": "var(--hx-space-2,0.5rem) var(--hx-space-3,0.75rem)"
|
|
348
|
-
},
|
|
349
|
-
{
|
|
350
|
-
"description": "Gap between slotted items.",
|
|
351
|
-
"name": "--hx-action-bar-gap",
|
|
352
|
-
"default": "var(--hx-space-2,0.5rem)"
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
"description": "Z-index when sticky or bottom position.",
|
|
356
|
-
"name": "--hx-action-bar-z-index",
|
|
357
|
-
"default": "10"
|
|
358
|
-
},
|
|
359
|
-
{
|
|
360
|
-
"description": "Padding.",
|
|
361
|
-
"name": "--hx-action-bar-padding-block-start",
|
|
362
|
-
"default": "0px"
|
|
363
|
-
},
|
|
364
|
-
{
|
|
365
|
-
"description": "Padding.",
|
|
366
|
-
"name": "--hx-action-bar-padding-block-end",
|
|
367
|
-
"default": "0px"
|
|
368
|
-
},
|
|
369
|
-
{
|
|
370
|
-
"description": "CSS custom property.",
|
|
371
|
-
"name": "--hx-border-radius-md"
|
|
372
|
-
},
|
|
373
|
-
{
|
|
374
|
-
"description": "Width.",
|
|
375
|
-
"name": "--hx-border-width-thin"
|
|
376
|
-
},
|
|
377
|
-
{
|
|
378
|
-
"description": "Color.",
|
|
379
|
-
"name": "--hx-color-neutral-0"
|
|
380
|
-
},
|
|
381
|
-
{
|
|
382
|
-
"description": "Color.",
|
|
383
|
-
"name": "--hx-color-neutral-200"
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
"description": "Color.",
|
|
387
|
-
"name": "--hx-color-neutral-50"
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
"description": "Size token.",
|
|
391
|
-
"name": "--hx-size-8"
|
|
392
|
-
},
|
|
393
|
-
{
|
|
394
|
-
"description": "Size token.",
|
|
395
|
-
"name": "--hx-size-10"
|
|
396
|
-
},
|
|
397
|
-
{
|
|
398
|
-
"description": "Size token.",
|
|
399
|
-
"name": "--hx-size-12"
|
|
400
|
-
},
|
|
401
|
-
{
|
|
402
|
-
"description": "Spacing token.",
|
|
403
|
-
"name": "--hx-space-1"
|
|
404
|
-
},
|
|
405
|
-
{
|
|
406
|
-
"description": "Spacing token.",
|
|
407
|
-
"name": "--hx-space-2"
|
|
408
|
-
},
|
|
409
|
-
{
|
|
410
|
-
"description": "Spacing token.",
|
|
411
|
-
"name": "--hx-space-3"
|
|
412
|
-
},
|
|
413
|
-
{
|
|
414
|
-
"description": "Spacing token.",
|
|
415
|
-
"name": "--hx-space-4"
|
|
416
|
-
}
|
|
417
|
-
],
|
|
418
|
-
"cssParts": [
|
|
419
|
-
{
|
|
420
|
-
"description": "The root toolbar container element.",
|
|
421
|
-
"name": "base"
|
|
422
|
-
},
|
|
423
|
-
{
|
|
424
|
-
"description": "The start (left) slot wrapper.",
|
|
425
|
-
"name": "start"
|
|
426
|
-
},
|
|
427
|
-
{
|
|
428
|
-
"description": "The center (default) slot wrapper.",
|
|
429
|
-
"name": "center"
|
|
430
|
-
},
|
|
431
|
-
{
|
|
432
|
-
"description": "The end (right) slot wrapper.",
|
|
433
|
-
"name": "end"
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
"description": "The overflow slot wrapper (hidden when no overflow content).",
|
|
437
|
-
"name": "overflow"
|
|
438
|
-
}
|
|
439
|
-
],
|
|
440
|
-
"slots": [
|
|
441
|
-
{
|
|
442
|
-
"description": "Left-aligned actions.",
|
|
443
|
-
"name": "start"
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
"description": "Center content (default slot).",
|
|
447
|
-
"name": ""
|
|
448
|
-
},
|
|
449
|
-
{
|
|
450
|
-
"description": "Right-aligned actions.",
|
|
451
|
-
"name": "end"
|
|
452
|
-
},
|
|
453
|
-
{
|
|
454
|
-
"description": "Actions revealed when the bar is constrained for space.",
|
|
455
|
-
"name": "overflow"
|
|
456
|
-
}
|
|
457
|
-
],
|
|
458
|
-
"members": [
|
|
459
|
-
{
|
|
460
|
-
"kind": "field",
|
|
461
|
-
"name": "size",
|
|
462
|
-
"type": {
|
|
463
|
-
"text": "'sm' | 'md' | 'lg'"
|
|
464
|
-
},
|
|
465
|
-
"default": "'md'",
|
|
466
|
-
"description": "Size of the action bar — propagated as a data attribute to slotted children.",
|
|
467
|
-
"attribute": "hx-size",
|
|
468
|
-
"reflects": true
|
|
469
|
-
},
|
|
470
|
-
{
|
|
471
|
-
"kind": "field",
|
|
472
|
-
"name": "variant",
|
|
473
|
-
"type": {
|
|
474
|
-
"text": "'default' | 'outlined' | 'filled'"
|
|
475
|
-
},
|
|
476
|
-
"default": "'default'",
|
|
477
|
-
"description": "Visual variant controlling the bar background.",
|
|
478
|
-
"attribute": "variant",
|
|
479
|
-
"reflects": true
|
|
480
|
-
},
|
|
481
|
-
{
|
|
482
|
-
"kind": "field",
|
|
483
|
-
"name": "position",
|
|
484
|
-
"type": {
|
|
485
|
-
"text": "'top' | 'bottom' | 'sticky'"
|
|
486
|
-
},
|
|
487
|
-
"default": "'top'",
|
|
488
|
-
"description": "Position and sticky behavior of the action bar.\n- `top` — normal flow (default)\n- `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support",
|
|
489
|
-
"attribute": "position",
|
|
490
|
-
"reflects": true
|
|
491
|
-
},
|
|
492
|
-
{
|
|
493
|
-
"kind": "field",
|
|
494
|
-
"name": "accessibleLabel",
|
|
495
|
-
"type": {
|
|
496
|
-
"text": "string"
|
|
497
|
-
},
|
|
498
|
-
"default": "''",
|
|
499
|
-
"description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.\n\nAccepts both `accessible-label` and the standard `aria-label` HTML attribute.\nThe `accessible-label` attribute takes precedence when both are set.\n\nPreviously this was exposed as the `ariaLabel` JS property, which shadowed\nthe native `HTMLElement.ariaLabel`. That shadowing is removed; use\n`accessibleLabel` or the HTML attributes instead.",
|
|
500
|
-
"attribute": "accessible-label"
|
|
501
|
-
}
|
|
502
|
-
],
|
|
503
|
-
"attributes": [
|
|
504
|
-
{
|
|
505
|
-
"name": "hx-size",
|
|
506
|
-
"type": {
|
|
507
|
-
"text": "'sm' | 'md' | 'lg'"
|
|
508
|
-
},
|
|
509
|
-
"default": "'md'",
|
|
510
|
-
"description": "Size of the action bar — propagated as a data attribute to slotted children.",
|
|
511
|
-
"fieldName": "size",
|
|
512
|
-
"attribute": "hx-size"
|
|
513
|
-
},
|
|
514
|
-
{
|
|
515
|
-
"name": "variant",
|
|
516
|
-
"type": {
|
|
517
|
-
"text": "'default' | 'outlined' | 'filled'"
|
|
518
|
-
},
|
|
519
|
-
"default": "'default'",
|
|
520
|
-
"description": "Visual variant controlling the bar background.",
|
|
521
|
-
"fieldName": "variant",
|
|
522
|
-
"attribute": "variant"
|
|
523
|
-
},
|
|
524
|
-
{
|
|
525
|
-
"name": "position",
|
|
526
|
-
"type": {
|
|
527
|
-
"text": "'top' | 'bottom' | 'sticky'"
|
|
528
|
-
},
|
|
529
|
-
"default": "'top'",
|
|
530
|
-
"description": "Position and sticky behavior of the action bar.\n- `top` — normal flow (default)\n- `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support",
|
|
531
|
-
"fieldName": "position",
|
|
532
|
-
"attribute": "position"
|
|
533
|
-
},
|
|
534
|
-
{
|
|
535
|
-
"name": "accessible-label",
|
|
536
|
-
"type": {
|
|
537
|
-
"text": "string"
|
|
538
|
-
},
|
|
539
|
-
"default": "''",
|
|
540
|
-
"description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.\n\nAccepts both `accessible-label` and the standard `aria-label` HTML attribute.\nThe `accessible-label` attribute takes precedence when both are set.\n\nPreviously this was exposed as the `ariaLabel` JS property, which shadowed\nthe native `HTMLElement.ariaLabel`. That shadowing is removed; use\n`accessibleLabel` or the HTML attributes instead.",
|
|
541
|
-
"fieldName": "accessibleLabel",
|
|
542
|
-
"attribute": "accessible-label"
|
|
543
|
-
}
|
|
544
|
-
],
|
|
545
|
-
"superclass": {
|
|
546
|
-
"name": "HelixElement",
|
|
547
|
-
"module": "/src/base/index.js"
|
|
548
|
-
},
|
|
549
|
-
"tagName": "hx-action-bar",
|
|
550
|
-
"customElement": true,
|
|
551
|
-
"summary": "Horizontal action bar for grouping related controls."
|
|
552
|
-
}
|
|
553
|
-
],
|
|
554
|
-
"exports": [
|
|
555
|
-
{
|
|
556
|
-
"kind": "js",
|
|
557
|
-
"name": "HelixActionBar",
|
|
558
|
-
"declaration": {
|
|
559
|
-
"name": "HelixActionBar",
|
|
560
|
-
"module": "src/components/hx-action-bar/hx-action-bar.ts"
|
|
561
|
-
}
|
|
562
|
-
},
|
|
563
|
-
{
|
|
564
|
-
"kind": "custom-element-definition",
|
|
565
|
-
"name": "hx-action-bar",
|
|
566
|
-
"declaration": {
|
|
567
|
-
"name": "HelixActionBar",
|
|
568
|
-
"module": "src/components/hx-action-bar/hx-action-bar.ts"
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
]
|
|
572
|
-
},
|
|
573
|
-
{
|
|
574
|
-
"kind": "javascript-module",
|
|
575
|
-
"path": "src/components/hx-action-bar/index.ts",
|
|
576
|
-
"declarations": [],
|
|
577
|
-
"exports": [
|
|
578
|
-
{
|
|
579
|
-
"kind": "js",
|
|
580
|
-
"name": "HelixActionBar",
|
|
581
|
-
"declaration": {
|
|
582
|
-
"name": "HelixActionBar",
|
|
583
|
-
"module": "./hx-action-bar.js"
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
]
|
|
587
|
-
},
|
|
588
588
|
{
|
|
589
589
|
"kind": "javascript-module",
|
|
590
590
|
"path": "src/components/hx-alert/hx-alert.ts",
|
|
@@ -4856,6 +4856,13 @@
|
|
|
4856
4856
|
"description": "Accessible label for the checkbox when no visible label text is provided.\nUse when embedding a checkbox in a context where a label element is not practical.\n\nAccepts both `accessible-label` and the standard `aria-label` HTML attribute.\n`accessible-label` takes precedence when both are set.\nWhen set, replaces the visible label as the input's accessible name. Cannot be combined\nwith a visible label — set either `accessible-label` or the `label` slot, not both.",
|
|
4857
4857
|
"attribute": "accessible-label"
|
|
4858
4858
|
},
|
|
4859
|
+
{
|
|
4860
|
+
"kind": "field",
|
|
4861
|
+
"name": "_groupedSuppress",
|
|
4862
|
+
"type": {
|
|
4863
|
+
"text": "boolean"
|
|
4864
|
+
}
|
|
4865
|
+
},
|
|
4859
4866
|
{
|
|
4860
4867
|
"kind": "field",
|
|
4861
4868
|
"name": "form",
|
|
@@ -4952,7 +4959,7 @@
|
|
|
4952
4959
|
}
|
|
4953
4960
|
}
|
|
4954
4961
|
],
|
|
4955
|
-
"description": "Moves focus to the checkbox input
|
|
4962
|
+
"description": "Moves focus to the announced checkbox surface. Codex round-1 finding #1\nrelocated the focus target from the inner `<input>` to the host on\nmodern engines so AT only sees one announced widget. Round-7 finding #3\nextends that contract to the no-IDL-ref fallback: when the host is\ndemoted (`tabindex=-1`, role/state cleared on `internals`) the inner\n`<input>` owns the announced semantics and tab order, so programmatic\n`focus()` must redirect there — otherwise scripted focus and error\nrecovery land on the demoted host on unsupported engines."
|
|
4956
4963
|
}
|
|
4957
4964
|
],
|
|
4958
4965
|
"events": [
|
|
@@ -6898,12 +6905,36 @@
|
|
|
6898
6905
|
{
|
|
6899
6906
|
"description": "The text input area.",
|
|
6900
6907
|
"name": "input"
|
|
6908
|
+
},
|
|
6909
|
+
{
|
|
6910
|
+
"description": "The visible label container above the trigger.",
|
|
6911
|
+
"name": "label"
|
|
6912
|
+
},
|
|
6913
|
+
{
|
|
6914
|
+
"description": "The help-text container rendered below the trigger.",
|
|
6915
|
+
"name": "help-text"
|
|
6916
|
+
},
|
|
6917
|
+
{
|
|
6918
|
+
"description": "The error-message container rendered below help text.",
|
|
6919
|
+
"name": "error"
|
|
6901
6920
|
}
|
|
6902
6921
|
],
|
|
6903
6922
|
"slots": [
|
|
6904
6923
|
{
|
|
6905
6924
|
"description": "Custom trigger element. Default: a color swatch button.",
|
|
6906
6925
|
"name": "trigger"
|
|
6926
|
+
},
|
|
6927
|
+
{
|
|
6928
|
+
"description": "Visible label projected above the trigger; aggregated text contributes to the host's accessible name when no stronger naming source (aria-labelledby/aria-label/accessible-label/label) is supplied.",
|
|
6929
|
+
"name": "label"
|
|
6930
|
+
},
|
|
6931
|
+
{
|
|
6932
|
+
"description": "Help text rendered below the trigger and joined into the host's announced description channel.",
|
|
6933
|
+
"name": "help-text"
|
|
6934
|
+
},
|
|
6935
|
+
{
|
|
6936
|
+
"description": "Error message rendered below help text. When present, marks the trigger as aria-invalid and is announced via a polite live region.",
|
|
6937
|
+
"name": "error"
|
|
6907
6938
|
}
|
|
6908
6939
|
],
|
|
6909
6940
|
"members": [
|
|
@@ -7074,13 +7105,55 @@
|
|
|
7074
7105
|
"description": "Accessible label for the color picker dialog/panel.",
|
|
7075
7106
|
"attribute": "label-picker"
|
|
7076
7107
|
},
|
|
7108
|
+
{
|
|
7109
|
+
"kind": "field",
|
|
7110
|
+
"name": "label",
|
|
7111
|
+
"type": {
|
|
7112
|
+
"text": "string | undefined"
|
|
7113
|
+
},
|
|
7114
|
+
"default": "undefined",
|
|
7115
|
+
"description": "Visible label rendered above the trigger. When set this becomes the\nannounced name of the trigger surface unless a stronger source\n(`aria-labelledby`, `aria-label`, or `accessible-label`) is supplied.",
|
|
7116
|
+
"attribute": "label",
|
|
7117
|
+
"reflects": true
|
|
7118
|
+
},
|
|
7119
|
+
{
|
|
7120
|
+
"kind": "field",
|
|
7121
|
+
"name": "accessibleLabel",
|
|
7122
|
+
"type": {
|
|
7123
|
+
"text": "string | undefined"
|
|
7124
|
+
},
|
|
7125
|
+
"default": "undefined",
|
|
7126
|
+
"description": "Visually-hidden accessible name. Highest-priority self-naming source —\noutranks `label`, slotted label content, and the generated trigger label,\nbut defers to consumer `aria-labelledby` (effective) and `aria-label`.",
|
|
7127
|
+
"attribute": "accessible-label"
|
|
7128
|
+
},
|
|
7129
|
+
{
|
|
7130
|
+
"kind": "field",
|
|
7131
|
+
"name": "helpText",
|
|
7132
|
+
"type": {
|
|
7133
|
+
"text": "string | undefined"
|
|
7134
|
+
},
|
|
7135
|
+
"default": "undefined",
|
|
7136
|
+
"description": "Help text rendered below the trigger and joined into the host's\nannounced description channel.",
|
|
7137
|
+
"attribute": "help-text"
|
|
7138
|
+
},
|
|
7139
|
+
{
|
|
7140
|
+
"kind": "field",
|
|
7141
|
+
"name": "error",
|
|
7142
|
+
"type": {
|
|
7143
|
+
"text": "string | undefined"
|
|
7144
|
+
},
|
|
7145
|
+
"default": "undefined",
|
|
7146
|
+
"description": "Error message. When non-empty, marks the trigger surface as `aria-invalid`\nand joins the host's announced description channel via a live alert.",
|
|
7147
|
+
"attribute": "error",
|
|
7148
|
+
"reflects": true
|
|
7149
|
+
},
|
|
7077
7150
|
{
|
|
7078
7151
|
"kind": "field",
|
|
7079
7152
|
"name": "labelTrigger",
|
|
7080
7153
|
"type": {
|
|
7081
7154
|
"text": "(color: string) => string"
|
|
7082
7155
|
},
|
|
7083
|
-
"description": "Generates the accessible label for the trigger button.",
|
|
7156
|
+
"description": "Generates the accessible label for the trigger button when no other\nnaming source is provided.",
|
|
7084
7157
|
"parameters": [
|
|
7085
7158
|
{
|
|
7086
7159
|
"description": "current color value string",
|
|
@@ -7186,6 +7259,46 @@
|
|
|
7186
7259
|
"fieldName": "required",
|
|
7187
7260
|
"attribute": "required"
|
|
7188
7261
|
},
|
|
7262
|
+
{
|
|
7263
|
+
"name": "label",
|
|
7264
|
+
"type": {
|
|
7265
|
+
"text": "string | undefined"
|
|
7266
|
+
},
|
|
7267
|
+
"default": "undefined",
|
|
7268
|
+
"description": "Visible label rendered above the trigger. When set this becomes the\nannounced name of the trigger surface unless a stronger source\n(`aria-labelledby`, `aria-label`, or `accessible-label`) is supplied.",
|
|
7269
|
+
"fieldName": "label",
|
|
7270
|
+
"attribute": "label"
|
|
7271
|
+
},
|
|
7272
|
+
{
|
|
7273
|
+
"name": "accessible-label",
|
|
7274
|
+
"type": {
|
|
7275
|
+
"text": "string | undefined"
|
|
7276
|
+
},
|
|
7277
|
+
"default": "undefined",
|
|
7278
|
+
"description": "Visually-hidden accessible name. Highest-priority self-naming source —\noutranks `label`, slotted label content, and the generated trigger label,\nbut defers to consumer `aria-labelledby` (effective) and `aria-label`.",
|
|
7279
|
+
"fieldName": "accessibleLabel",
|
|
7280
|
+
"attribute": "accessible-label"
|
|
7281
|
+
},
|
|
7282
|
+
{
|
|
7283
|
+
"name": "help-text",
|
|
7284
|
+
"type": {
|
|
7285
|
+
"text": "string | undefined"
|
|
7286
|
+
},
|
|
7287
|
+
"default": "undefined",
|
|
7288
|
+
"description": "Help text rendered below the trigger and joined into the host's\nannounced description channel.",
|
|
7289
|
+
"fieldName": "helpText",
|
|
7290
|
+
"attribute": "help-text"
|
|
7291
|
+
},
|
|
7292
|
+
{
|
|
7293
|
+
"name": "error",
|
|
7294
|
+
"type": {
|
|
7295
|
+
"text": "string | undefined"
|
|
7296
|
+
},
|
|
7297
|
+
"default": "undefined",
|
|
7298
|
+
"description": "Error message. When non-empty, marks the trigger surface as `aria-invalid`\nand joins the host's announced description channel via a live alert.",
|
|
7299
|
+
"fieldName": "error",
|
|
7300
|
+
"attribute": "error"
|
|
7301
|
+
},
|
|
7189
7302
|
{
|
|
7190
7303
|
"name": "label-gradient",
|
|
7191
7304
|
"type": {
|
|
@@ -7807,7 +7920,7 @@
|
|
|
7807
7920
|
"text": "string | null"
|
|
7808
7921
|
},
|
|
7809
7922
|
"default": "null",
|
|
7810
|
-
"description": "Accessible name for screen readers, if different from the visible label.\nUses `accessible-label` attribute instead of `aria-label` to avoid\nARIAMixin shadowing on the host element.\n\nNote: `mixinDelegatesAria` is not applied to this component because form\ninputs with associated labels delegate accessible naming via `<label>`\nassociation and `aria-labelledby`, not host-level ARIA delegation. The\n`accessible-label` attribute is a fallback for label-free usage. The value is forwarded to the\
|
|
7923
|
+
"description": "Accessible name for screen readers, if different from the visible label.\nUses `accessible-label` attribute instead of `aria-label` to avoid\nARIAMixin shadowing on the host element.\n\nNote: `mixinDelegatesAria` is not applied to this component because form\ninputs with associated labels delegate accessible naming via `<label>`\nassociation and `aria-labelledby`, not host-level ARIA delegation. The\n`accessible-label` attribute is a fallback for label-free usage. The value is forwarded to the\nhost's `internals.ariaLabel` on the modern path.",
|
|
7811
7924
|
"attribute": "accessible-label"
|
|
7812
7925
|
},
|
|
7813
7926
|
{
|
|
@@ -7844,6 +7957,16 @@
|
|
|
7844
7957
|
}
|
|
7845
7958
|
]
|
|
7846
7959
|
},
|
|
7960
|
+
{
|
|
7961
|
+
"kind": "method",
|
|
7962
|
+
"name": "_syncHostAriaSemantics",
|
|
7963
|
+
"privacy": "private",
|
|
7964
|
+
"return": {
|
|
7965
|
+
"type": {
|
|
7966
|
+
"text": "void"
|
|
7967
|
+
}
|
|
7968
|
+
}
|
|
7969
|
+
},
|
|
7847
7970
|
{
|
|
7848
7971
|
"kind": "method",
|
|
7849
7972
|
"name": "focus",
|
|
@@ -7861,7 +7984,7 @@
|
|
|
7861
7984
|
}
|
|
7862
7985
|
}
|
|
7863
7986
|
],
|
|
7864
|
-
"description": "
|
|
7987
|
+
"description": "Routes programmatic focus to the inner text input. Per W3C APG editable\ncombobox pattern, the inner `<input>` carries `role=\"combobox\"` (replacing\nits implicit textbox role) so it IS the canonical announced + focused\nsurface. Shadow DOM focus causes `document.activeElement` to report the\nhost externally, but the input retains focus inside the shadow root and\nAT announces its role/state."
|
|
7865
7988
|
}
|
|
7866
7989
|
],
|
|
7867
7990
|
"events": [
|
|
@@ -8038,7 +8161,7 @@
|
|
|
8038
8161
|
"text": "string | null"
|
|
8039
8162
|
},
|
|
8040
8163
|
"default": "null",
|
|
8041
|
-
"description": "Accessible name for screen readers, if different from the visible label.\nUses `accessible-label` attribute instead of `aria-label` to avoid\nARIAMixin shadowing on the host element.\n\nNote: `mixinDelegatesAria` is not applied to this component because form\ninputs with associated labels delegate accessible naming via `<label>`\nassociation and `aria-labelledby`, not host-level ARIA delegation. The\n`accessible-label` attribute is a fallback for label-free usage. The value is forwarded to the\
|
|
8164
|
+
"description": "Accessible name for screen readers, if different from the visible label.\nUses `accessible-label` attribute instead of `aria-label` to avoid\nARIAMixin shadowing on the host element.\n\nNote: `mixinDelegatesAria` is not applied to this component because form\ninputs with associated labels delegate accessible naming via `<label>`\nassociation and `aria-labelledby`, not host-level ARIA delegation. The\n`accessible-label` attribute is a fallback for label-free usage. The value is forwarded to the\nhost's `internals.ariaLabel` on the modern path.",
|
|
8042
8165
|
"fieldName": "accessibleLabel",
|
|
8043
8166
|
"attribute": "accessible-label"
|
|
8044
8167
|
},
|
|
@@ -10046,6 +10169,16 @@
|
|
|
10046
10169
|
"description": "Accessible label for the next month navigation button.",
|
|
10047
10170
|
"attribute": "next-month-label"
|
|
10048
10171
|
},
|
|
10172
|
+
{
|
|
10173
|
+
"kind": "field",
|
|
10174
|
+
"name": "accessibleLabel",
|
|
10175
|
+
"type": {
|
|
10176
|
+
"text": "string | null"
|
|
10177
|
+
},
|
|
10178
|
+
"default": "null",
|
|
10179
|
+
"description": "Accessible name for screen readers, if different from the visible label.\nUses `accessible-label` attribute instead of `aria-label` to avoid\nARIAMixin shadowing on the host element. Highest-precedence naming source.",
|
|
10180
|
+
"attribute": "accessible-label"
|
|
10181
|
+
},
|
|
10049
10182
|
{
|
|
10050
10183
|
"kind": "field",
|
|
10051
10184
|
"name": "_handleDocumentClick",
|
|
@@ -10250,6 +10383,16 @@
|
|
|
10250
10383
|
"description": "Accessible label for the next month navigation button.",
|
|
10251
10384
|
"fieldName": "nextMonthLabel",
|
|
10252
10385
|
"attribute": "next-month-label"
|
|
10386
|
+
},
|
|
10387
|
+
{
|
|
10388
|
+
"name": "accessible-label",
|
|
10389
|
+
"type": {
|
|
10390
|
+
"text": "string | null"
|
|
10391
|
+
},
|
|
10392
|
+
"default": "null",
|
|
10393
|
+
"description": "Accessible name for screen readers, if different from the visible label.\nUses `accessible-label` attribute instead of `aria-label` to avoid\nARIAMixin shadowing on the host element. Highest-precedence naming source.",
|
|
10394
|
+
"fieldName": "accessibleLabel",
|
|
10395
|
+
"attribute": "accessible-label"
|
|
10253
10396
|
}
|
|
10254
10397
|
],
|
|
10255
10398
|
"mixins": [
|
|
@@ -10315,7 +10458,7 @@
|
|
|
10315
10458
|
"declarations": [
|
|
10316
10459
|
{
|
|
10317
10460
|
"kind": "class",
|
|
10318
|
-
"description": "A modal and non-modal dialog component built on the native HTML `<dialog>` element.\nProvides focus trapping, backdrop interaction, keyboard navigation, and full\nARIA labelling for enterprise healthcare accessibility requirements.",
|
|
10461
|
+
"description": "A modal and non-modal dialog component built on the native HTML `<dialog>` element.\nProvides focus trapping, backdrop interaction, keyboard navigation, and full\nARIA labelling for enterprise healthcare accessibility requirements.\n\n## Architecture Note: Host-Canonical ARIA (group-4a round-1, Path A — native-dialog adaptation)\n\nUnlike `hx-drawer` (which uses an inner `<div role=\"dialog\">` and can fully\nhost-canonicalize the role), `hx-dialog` is built on the native\n`<dialog>` HTMLDialogElement. The native element has an **implicit\n`role=\"dialog\"`** baked in by the browser that **cannot be stripped**, so\nfull host-canonical role takeover would create nested-dialog announcements.\n\n**Path A (adopted):** the host owns label / description projection via\n`ElementInternals` (`internals.ariaLabelledByElements`,\n`internals.ariaDescribedByElements`, `internals.ariaLabel`) but **does NOT**\nset `internals.role`. The native inner `<dialog>` continues to be the\nannounced surface. Consumer light-DOM IDREFs project across the shadow\nboundary via `internals.aria*Elements` on the host.\n\n**Hybrid fallback (always-on belt-and-suspenders):** because some assistive\ntechnologies may walk the native `<dialog>` first and ignore host\n`internals.aria*Elements`, the resolved label / description text is **also**\nserialized into `aria-label` / `aria-describedby` on the inner native\n`<dialog>` element. Consumers therefore get name/description on every AT,\nwith the IDL-ref path providing live DOM-text-update tracking when the AT\nhonours it. This forfeits live-text tracking on the inner-dialog fallback\n(the serialized text is recomputed on every sync, which is good enough since\nmutation observers re-fire `_syncHostAriaSemantics` on consumer text edits).\n\nWhy we do NOT set `internals.role = 'alertdialog'` either: setting role on\nthe host while the native `<dialog>` keeps `role=\"dialog\"` would announce\nBOTH a host alertdialog AND an inner dialog. Instead, the alertdialog\nvariant continues to write `role=\"alertdialog\"` directly on the inner\n`<dialog>` element (the platform allows overriding the implicit `dialog`\nrole with the more specific `alertdialog`).\n\nNaming precedence (W3C AccName 1.2 §4.3.1):\n\n 1. Consumer `aria-labelledby` on the host — IDREFs resolved across the\n shadow boundary via `resolveIdrefTokens` (closest scope first, then\n ancestor shadow hosts, then owner document).\n 2. Consumer `aria-label` on the host.\n 3. `<slot name=\"header\">` text content (multi-node aggregation per\n AccName 1.2 §4.3.10 — decorative `aria-hidden` / `[hidden]` subtrees\n contribute zero to the name).\n 4. `heading` property — explicit author-provided heading text.\n 5. Hard-coded literal `\"Dialog\"` (last-resort accessible name).\n\nDescription channel: the host's `internals.ariaDescribedByElements` carries\nthe resolved IDREF chain on the modern path. The inner native `<dialog>` ALSO\nreceives a serialized `aria-describedby` chain — when a consumer description\nresolves, a synthesized in-shadow `<span id=\"${id}-consumer-desc\">` is\nappended to the existing `description` span (if any) and the inner\n`<dialog>`'s `aria-describedby` references both same-root ids. `aria-description`\nis intentionally NEVER written — W3C AccName ignores it whenever\n`aria-describedby` is also present.\n\nSlot mutation observers track:\n 1. The header slot's text content (in-place i18n re-renders).\n 2. Consumer-resolved external IDREF targets (so a consumer mutating\n `<label id=\"x\">Patient</label>` in place re-flows the name).\n 3. Host attribute mutations (delegated to `installAriaIdrefMirror`,\n which also catches late-inserted IDREF targets and id renames in\n every relevant root).\n 4. Authentic consumer `aria-describedby` retraction (oldValue !== null &&\n newValue === null) via a dedicated `attributeOldValue: true` observer.\n\n**First-paint slot state seeding intentionally omitted:** seeding\n`_hasHeaderSlot` / `_headerSlotText` from `firstUpdated()` would schedule an\nextra Lit re-render that subtly reorders the open-dialog promise chain\n(`updateComplete.then(...) → showModal() → updateComplete.then(...) →\nfocus first focusable`). On Chromium, that reordering interleaves the\nnative dialog's modal activation with the focus-restore step and causes\nfocus-trap test failures. The slotchange handler runs one microtask later\nand `_syncHostAriaSemantics()` from `updated()` picks up the resolved state\non the next paint — close enough that AT never observes the unnamed window.\nMirrors the same intentional decision documented in hx-drawer round-1.\n\nFocus trap, ESC dismiss with `hx-cancel` BEFORE `hx-close`, focus-restore\nvia `_triggerElement`, and native `showModal()` semantics are unchanged\nfrom the pre-host-canonical implementation.",
|
|
10319
10462
|
"name": "HelixDialog",
|
|
10320
10463
|
"cssProperties": [
|
|
10321
10464
|
{
|
|
@@ -11539,7 +11682,7 @@
|
|
|
11539
11682
|
"declarations": [
|
|
11540
11683
|
{
|
|
11541
11684
|
"kind": "class",
|
|
11542
|
-
"description": "A dropdown component — a button that opens a floating panel on click.",
|
|
11685
|
+
"description": "A dropdown component — a button that opens a floating panel on click.\n\n## Architecture Note: Host-Attribute Label Mirror (group-4 round-1)\n\nThe announced surface is the inner `[part=\"panel\"]` element, which carries\n`role=\"menu\"`. The host wraps a slotted trigger and the floating panel and\ndoes NOT claim a role itself (apart from the round-35-style host\n`aria-expanded` fallback used only when the trigger slot is empty).\n\nBecause the panel lives in shadow DOM and `ElementInternals` IDL refs on\nthe host project semantics OUTWARD (host → AT) rather than INWARD\n(host → shadow descendant), we use the **host-attribute mirror** pattern:\nresolve consumer `aria-labelledby` IDREFs against the host's composed-tree\nroots, text-flatten via `flattenAccName`, and write the result to the\npanel's `aria-label`. Host `aria-label` outranks the `label` property in\nthe same precedence used by every host-canonical hx-* control.\n\nNaming precedence (W3C AccName 1.2 §4.3.1):\n 1. Host `aria-labelledby` (resolved IDREFs, text-flattened)\n 2. Host `aria-label`\n 3. `label` property\n 4. Hard-coded literal `\"Menu\"` (last-resort accessible name)\n\n**Group 5 boundary (intentional):** This round is **additive only** — the\nhost-label pipeline is the entire change. The panel's `role=\"menu\"` and\nthe menuitem-roving keyboard pattern are already implemented per APG and\nare NOT touched here. Group 5 (composite navigation: menu, menubar,\nmenuitem, tabs, tree) will own any broader refactor of the menu role and\nroving-tabindex semantics. Codex reviewers: please scope findings to the\nhost-label pipeline; do not flag missing roving-focus / typeahead /\n`aria-orientation` work here.\n\n`aria-controls` is intentionally omitted on the trigger: the panel lives\nin shadow DOM and IDREF values cannot be resolved across shadow\nboundaries by assistive technology (axe-core flags this as a critical\nviolation if attempted). See `_setupTriggerAria` for the inline note.",
|
|
11543
11686
|
"name": "HelixDropdown",
|
|
11544
11687
|
"cssProperties": [
|
|
11545
11688
|
{
|
|
@@ -11804,7 +11947,7 @@
|
|
|
11804
11947
|
"declarations": [
|
|
11805
11948
|
{
|
|
11806
11949
|
"kind": "class",
|
|
11807
|
-
"description": "Layout wrapper providing consistent label + input + help text + validation\nmessage structure for any form control. Use this when wrapping non-HELiX\nform controls or native HTML elements in the HELiX form field pattern.\n\nThis component is NOT form-associated — it is a pure visual layout wrapper.\n\n**Light DOM side effect:** This component injects a visually-hidden `<span>`\ninto its light DOM children for ARIA describedby linkage across the shadow\nDOM boundary. This span has `id=\"${fieldId}-desc\"` and is removed on\n`disconnectedCallback`. This is an intentional, documented accessibility\nmechanism.",
|
|
11950
|
+
"description": "Layout wrapper providing consistent label + input + help text + validation\nmessage structure for any form control. Use this when wrapping non-HELiX\nform controls or native HTML elements in the HELiX form field pattern.\n\nThis component is NOT form-associated — it is a pure visual layout wrapper.\n\n**Light DOM side effect:** This component injects a visually-hidden `<span>`\ninto its light DOM children for ARIA describedby linkage across the shadow\nDOM boundary. This span has `id=\"${fieldId}-desc\"` and is removed on\n`disconnectedCallback`. This is an intentional, documented accessibility\nmechanism.\n\n**`aria-label` ownership model:** When `label` is set and no shadow `<label>`\nis rendered, hx-field writes `aria-label` to the slotted control and stamps\na `data-hx-owns-label=\"true\"` ownership marker.\n\nConsumers have two ways to keep their value safe from hx-field's writes:\n (a) **Suspend** all ARIA bridging by setting `data-aria-managed` on the\n control. While present, hx-field skips every aria-* mutation and\n leaves any existing marker/snapshot in place — removing\n `data-aria-managed` later may resume host ownership of an `aria-label`\n value that still matches the snapshot.\n (b) **Release** ownership permanently by overwriting `aria-label` to a\n different value than the one hx-field last wrote. The mismatch\n triggers `_releaseHostOwnedAriaLabel`, which strips the marker and\n clears the snapshot, transferring ownership to the consumer.\n\n**Limitation:** because release detection is snapshot-based, a consumer\nrewrite to the *exact same value* hx-field last wrote is invisible. To\ngenuinely take ownership in that case the consumer must write a different\nvalue (even briefly), or remove the `data-hx-owns-label` marker themselves.",
|
|
11808
11951
|
"name": "HelixField",
|
|
11809
11952
|
"cssProperties": [
|
|
11810
11953
|
{
|
|
@@ -19469,7 +19612,7 @@
|
|
|
19469
19612
|
"declarations": [
|
|
19470
19613
|
{
|
|
19471
19614
|
"kind": "class",
|
|
19472
|
-
"description": "A popover that displays rich floating content attached to a trigger element.",
|
|
19615
|
+
"description": "A popover that displays rich floating content attached to a trigger element.\n\n## Architecture Note: Host-Attribute Label Mirror (group-4 round-1)\n\nUnlike modal dialogs (`hx-dialog` / `hx-drawer`) where the HOST is the\nannounced surface and `ElementInternals` projects consumer IDREFs across\nthe shadow boundary, `hx-popover`'s announced surface is the inner\n`[part=\"body\"]` element which carries `role=\"dialog\"`. The host does not\nclaim a role — it is a structural wrapper around an anchor slot and a\nseparate floating panel.\n\nIDL element references on `internals.ariaLabelledByElements` therefore\ncannot help: AT walks the inner body's accessibility node, and IDL refs\ndeclared on the host are not visible from a shadow-internal descendant\nlooking up. The viable cross-shadow path is the host-attribute mirror:\n\n 1. The host observes `aria-label` / `aria-labelledby` mutations.\n 2. On every sync, `aria-labelledby` IDREFs are resolved via\n `resolveIdrefTokens` (composed-tree walk: host root → ancestor\n shadow hosts → owner document) and **text-flattened** via\n `flattenAccName` (AccName 1.2 §4.3.10 hidden-aware).\n 3. The flattened name is written to the inner body's `aria-label`,\n overriding the `label` property only when consumer naming is set.\n\nNaming precedence (W3C AccName 1.2 §4.3.1):\n\n 1. Host `aria-labelledby` (resolved IDREFs, text-flattened)\n 2. Host `aria-label`\n 3. `label` property\n 4. Hard-coded literal `\"Popover\"` (last-resort accessible name)\n\nThe text-flatten approach forfeits live IDL-ref tracking (mutating a\nreferenced element's text re-fires through the shared root observer; see\n`installAriaIdrefMirror`). `aria-controls` is intentionally omitted on\nthe trigger — the body lives in shadow DOM and consumer IDREFs cannot\nresolve cross-root from light-DOM (axe-core flags this as a critical\nviolation if attempted; see line documenting this exception below).\n\nSlotted label support (e.g. `<slot name=\"title\">`) is deliberately NOT\nadded in this round — it would expand the public API surface and is\ntracked as a follow-up enhancement.",
|
|
19473
19616
|
"name": "HelixPopover",
|
|
19474
19617
|
"cssProperties": [
|
|
19475
19618
|
{
|
|
@@ -21477,6 +21620,13 @@
|
|
|
21477
21620
|
"description": "Whether this radio is checked. Managed by the parent group.",
|
|
21478
21621
|
"attribute": "checked",
|
|
21479
21622
|
"reflects": true
|
|
21623
|
+
},
|
|
21624
|
+
{
|
|
21625
|
+
"kind": "field",
|
|
21626
|
+
"name": "_groupedSuppress",
|
|
21627
|
+
"type": {
|
|
21628
|
+
"text": "boolean"
|
|
21629
|
+
}
|
|
21480
21630
|
}
|
|
21481
21631
|
],
|
|
21482
21632
|
"attributes": [
|
|
@@ -22535,7 +22685,7 @@
|
|
|
22535
22685
|
}
|
|
22536
22686
|
}
|
|
22537
22687
|
],
|
|
22538
|
-
"description": "Moves focus to the
|
|
22688
|
+
"description": "Moves focus to the host. Round-3 finding 1: the host is the canonical\ncombobox surface (`role=\"combobox\"`, `tabindex=\"0\"`), so programmatic\nfocus must land there to match where AT routes focus and where\n`setValidity()` anchors recovery."
|
|
22539
22689
|
}
|
|
22540
22690
|
],
|
|
22541
22691
|
"events": [
|
|
@@ -27336,7 +27486,7 @@
|
|
|
27336
27486
|
}
|
|
27337
27487
|
}
|
|
27338
27488
|
],
|
|
27339
|
-
"description": "Moves focus to the switch
|
|
27489
|
+
"description": "Moves focus to the announced switch surface. Codex round-1 finding #1\nrelocated the focus target to the host so AT announces a single widget;\nthe host carries the canonical role/state on modern engines. Round-7\nfinding #7 extends that contract to the no-IDL-ref fallback: when the\nhost is demoted (`tabindex=-1`, role/state cleared on `internals`) the\ninner `<button role=switch>` owns the announced semantics and tab order,\nso programmatic `focus()` must redirect there — otherwise scripted focus\nand error recovery land on the demoted host on unsupported engines."
|
|
27340
27490
|
}
|
|
27341
27491
|
],
|
|
27342
27492
|
"events": [
|
|
@@ -32683,6 +32833,25 @@
|
|
|
32683
32833
|
},
|
|
32684
32834
|
"description": "Reports validity and shows the browser's constraint validation UI."
|
|
32685
32835
|
},
|
|
32836
|
+
{
|
|
32837
|
+
"kind": "method",
|
|
32838
|
+
"name": "focus",
|
|
32839
|
+
"return": {
|
|
32840
|
+
"type": {
|
|
32841
|
+
"text": "void"
|
|
32842
|
+
}
|
|
32843
|
+
},
|
|
32844
|
+
"parameters": [
|
|
32845
|
+
{
|
|
32846
|
+
"name": "options",
|
|
32847
|
+
"optional": true,
|
|
32848
|
+
"type": {
|
|
32849
|
+
"text": "FocusOptions"
|
|
32850
|
+
}
|
|
32851
|
+
}
|
|
32852
|
+
],
|
|
32853
|
+
"description": "Moves focus to the announced toggle-button surface. Codex round-1 finding\n`#1` made the host the canonical focus target on modern engines so AT\nannounces a single widget. Round-7 finding `#9` extends that contract to\nthe no-IDL-ref fallback: when the host is demoted (`tabindex=-1`,\nrole/state cleared on `internals`) the inner `<button>` owns the announced\nsemantics and tab order, so programmatic `focus()` must redirect there —\notherwise scripted focus and error recovery land on the demoted host on\nunsupported engines."
|
|
32854
|
+
},
|
|
32686
32855
|
{
|
|
32687
32856
|
"kind": "method",
|
|
32688
32857
|
"name": "_onFormReset",
|
|
@@ -32884,7 +33053,7 @@
|
|
|
32884
33053
|
"declarations": [
|
|
32885
33054
|
{
|
|
32886
33055
|
"kind": "class",
|
|
32887
|
-
"description": "A tooltip that displays contextual help text on hover or focus.",
|
|
33056
|
+
"description": "A tooltip that displays contextual help text on hover or focus.\n\n## Architecture Note: Light-DOM Description Shim (group-4 round-1)\n\n`aria-describedby` IDREFs cannot resolve across the Shadow DOM boundary —\nthe trigger lives in the consumer's light DOM and references a tooltip\nwhose body is in this component's shadow root. The tooltip text must\ntherefore be exposed in DOCUMENT scope.\n\nThe shim is a single visually-hidden `<span>` appended to `document.body`\nwith the `_tooltipId` as its `id`. The trigger's `aria-describedby` points\nat this span. The text content is mirrored from the slotted `content`\nslot on every relevant signal:\n\n 1. `firstUpdated` (initial wiring)\n 2. `slotchange` on the default slot AND the `content` slot (the slotted\n element list changes)\n 3. **Text-content mutations on the assigned `content` slot elements**\n (round-23 P2 pattern). Without this observer a framework that\n rewrites the slotted `<span slot=\"content\">` `textContent` IN PLACE\n (Vue / React keyed text rerender) would leave the shim stale.\n\nCleanup: `disconnectedCallback` removes the shim from `document.body`,\ndisconnects the slot-text observer, and clears the timers. SSR is\nsidestepped by guarding `document` access — the shim is created lazily\nthe first time `_setupTriggerAria()` runs in a browser environment.\n\n`role=\"tooltip\"` is the correct APG role and is NEVER promoted to\n`role=\"dialog\"` — APG explicitly forbids tooltips from holding focus and\nthe tooltip body is not a focus target. No host-canonical `_internals`\nwork is owed: the trigger is the announced surface, and it correctly\nreferences the tooltip via `aria-describedby`.",
|
|
32888
33057
|
"name": "HelixTooltip",
|
|
32889
33058
|
"cssProperties": [
|
|
32890
33059
|
{
|