@helixui/library 3.6.0 → 3.7.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 (71) hide show
  1. package/custom-elements.json +1561 -1356
  2. package/dist/components/hx-alert/hx-alert.d.ts +18 -0
  3. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  4. package/dist/components/hx-badge/index.js +1 -1
  5. package/dist/components/hx-button/hx-button.d.ts +18 -0
  6. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  7. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  8. package/dist/components/hx-button/index.js +1 -1
  9. package/dist/components/hx-checkbox/hx-checkbox.d.ts +18 -0
  10. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  11. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  12. package/dist/components/hx-checkbox/index.js +1 -1
  13. package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
  14. package/dist/components/hx-date-picker/index.js +1 -1
  15. package/dist/components/hx-dialog/hx-dialog.d.ts +18 -0
  16. package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
  17. package/dist/components/hx-icon-button/hx-icon-button.styles.d.ts.map +1 -1
  18. package/dist/components/hx-icon-button/index.js +1 -1
  19. package/dist/components/hx-pagination/hx-pagination.styles.d.ts.map +1 -1
  20. package/dist/components/hx-pagination/index.js +1 -1
  21. package/dist/components/hx-radio-group/index.js +1 -1
  22. package/dist/components/hx-steps/index.js +1 -1
  23. package/dist/components/hx-text-input/hx-text-input.d.ts +18 -0
  24. package/dist/components/hx-text-input/hx-text-input.d.ts.map +1 -1
  25. package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
  26. package/dist/components/hx-toggle-button/index.js +1 -1
  27. package/dist/css/helix-all.css +59 -34
  28. package/dist/css/helix-core.css +20 -14
  29. package/dist/css/helix-forms.css +33 -17
  30. package/dist/css/helix-navigation.css +6 -3
  31. package/dist/css/helix-tokens.css +5 -4
  32. package/dist/css/hx-badge.css +5 -5
  33. package/dist/css/hx-button.css +11 -4
  34. package/dist/css/hx-checkbox.css +10 -4
  35. package/dist/css/hx-date-picker.css +5 -2
  36. package/dist/css/hx-icon-button.css +4 -5
  37. package/dist/css/hx-pagination.css +6 -3
  38. package/dist/css/hx-toggle-button.css +18 -11
  39. package/dist/css/index.css +1 -1
  40. package/dist/css/manifest.json +18 -9
  41. package/dist/index.js +9 -9
  42. package/dist/shared/hx-alert-Bto8-TIi.js.map +1 -1
  43. package/dist/shared/{hx-badge-JlFtAdxS.js → hx-badge-DFL35nzi.js} +16 -16
  44. package/dist/shared/hx-badge-DFL35nzi.js.map +1 -0
  45. package/dist/shared/{hx-button-BOwAEcF1.js → hx-button-rRNmD4fd.js} +12 -5
  46. package/dist/shared/hx-button-rRNmD4fd.js.map +1 -0
  47. package/dist/shared/{hx-checkbox-CYd0YV_u.js → hx-checkbox-hPlIw6Lb.js} +25 -19
  48. package/dist/shared/hx-checkbox-hPlIw6Lb.js.map +1 -0
  49. package/dist/shared/{hx-date-picker-B49yo4Vm.js → hx-date-picker-DSKDkCy1.js} +6 -3
  50. package/dist/shared/hx-date-picker-DSKDkCy1.js.map +1 -0
  51. package/dist/shared/hx-dialog-B4weoj_1.js.map +1 -1
  52. package/dist/shared/{hx-icon-button-a6OpeQz5.js → hx-icon-button-B2BdVdyK.js} +10 -11
  53. package/dist/shared/hx-icon-button-B2BdVdyK.js.map +1 -0
  54. package/dist/shared/{hx-pagination-C7y8GVyU.js → hx-pagination-D726PyTM.js} +7 -4
  55. package/dist/shared/hx-pagination-D726PyTM.js.map +1 -0
  56. package/dist/shared/{hx-radio-C7eTj5YI.js → hx-radio-CY4kQfZw.js} +44 -44
  57. package/dist/shared/{hx-radio-C7eTj5YI.js.map → hx-radio-CY4kQfZw.js.map} +1 -1
  58. package/dist/shared/{hx-step-R2rjp1fT.js → hx-step-CUzliIK_.js} +3 -3
  59. package/dist/shared/hx-step-CUzliIK_.js.map +1 -0
  60. package/dist/shared/hx-text-input-D6FlOZM-.js.map +1 -1
  61. package/dist/shared/{hx-toggle-button-DwBers3A.js → hx-toggle-button-DSJeFlb0.js} +52 -45
  62. package/dist/shared/{hx-toggle-button-DwBers3A.js.map → hx-toggle-button-DSJeFlb0.js.map} +1 -1
  63. package/figma-inventory.json +144 -48
  64. package/package.json +2 -2
  65. package/dist/shared/hx-badge-JlFtAdxS.js.map +0 -1
  66. package/dist/shared/hx-button-BOwAEcF1.js.map +0 -1
  67. package/dist/shared/hx-checkbox-CYd0YV_u.js.map +0 -1
  68. package/dist/shared/hx-date-picker-B49yo4Vm.js.map +0 -1
  69. package/dist/shared/hx-icon-button-a6OpeQz5.js.map +0 -1
  70. package/dist/shared/hx-pagination-C7y8GVyU.js.map +0 -1
  71. package/dist/shared/hx-step-R2rjp1fT.js.map +0 -1
@@ -4,462 +4,196 @@
4
4
  "modules": [
5
5
  {
6
6
  "kind": "javascript-module",
7
- "path": "src/components/hx-action-bar/hx-action-bar.ts",
7
+ "path": "src/components/hx-accordion/hx-accordion-item.ts",
8
8
  "declarations": [
9
9
  {
10
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",
11
+ "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
+ "name": "HelixAccordionItem",
13
13
  "cssProperties": [
14
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"
15
+ "description": "Border color between items.",
16
+ "name": "--hx-accordion-border-color",
17
+ "default": "var(--hx-color-neutral-200)"
68
18
  },
69
19
  {
70
- "description": "Size token.",
71
- "name": "--hx-size-8"
20
+ "description": "Trigger padding.",
21
+ "name": "--hx-accordion-trigger-padding",
22
+ "default": "var(--hx-space-4)"
72
23
  },
73
24
  {
74
- "description": "Size token.",
75
- "name": "--hx-size-10"
25
+ "description": "Trigger text color.",
26
+ "name": "--hx-accordion-trigger-color",
27
+ "default": "var(--hx-color-neutral-800)"
76
28
  },
77
29
  {
78
- "description": "Size token.",
79
- "name": "--hx-size-12"
30
+ "description": "Trigger background color.",
31
+ "name": "--hx-accordion-trigger-bg",
32
+ "default": "transparent"
80
33
  },
81
34
  {
82
- "description": "Spacing token.",
83
- "name": "--hx-space-1"
35
+ "description": "Trigger hover background.",
36
+ "name": "--hx-accordion-trigger-hover-bg",
37
+ "default": "var(--hx-color-neutral-50)"
84
38
  },
85
39
  {
86
- "description": "Spacing token.",
87
- "name": "--hx-space-2"
40
+ "description": "Icon color.",
41
+ "name": "--hx-accordion-icon-color",
42
+ "default": "var(--hx-color-neutral-500)"
88
43
  },
89
44
  {
90
- "description": "Spacing token.",
91
- "name": "--hx-space-3"
45
+ "description": "Content padding.",
46
+ "name": "--hx-accordion-content-padding",
47
+ "default": "0 var(--hx-space-4) var(--hx-space-4)"
92
48
  },
93
49
  {
94
- "description": "Spacing token.",
95
- "name": "--hx-space-4"
50
+ "description": "Content text color.",
51
+ "name": "--hx-accordion-content-color",
52
+ "default": "var(--hx-color-neutral-600)"
96
53
  }
97
54
  ],
98
55
  "cssParts": [
99
56
  {
100
- "description": "The root toolbar container element.",
101
- "name": "base"
102
- },
103
- {
104
- "description": "The start (left) slot wrapper.",
105
- "name": "start"
57
+ "description": "The outer details element container.",
58
+ "name": "item"
106
59
  },
107
60
  {
108
- "description": "The center (default) slot wrapper.",
109
- "name": "center"
61
+ "description": "The summary/trigger element.",
62
+ "name": "trigger"
110
63
  },
111
64
  {
112
- "description": "The end (right) slot wrapper.",
113
- "name": "end"
65
+ "description": "The collapsible content area.",
66
+ "name": "content"
114
67
  },
115
68
  {
116
- "description": "The overflow slot wrapper (hidden when no overflow content).",
117
- "name": "overflow"
69
+ "description": "The expand/collapse icon.",
70
+ "name": "icon"
118
71
  }
119
72
  ],
120
73
  "slots": [
121
74
  {
122
- "description": "Left-aligned actions.",
123
- "name": "start"
75
+ "description": "The heading/trigger content for this item.",
76
+ "name": "trigger"
124
77
  },
125
78
  {
126
- "description": "Center content (default slot).",
79
+ "description": "Default slot for the collapsible body content.",
127
80
  "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
81
  }
137
82
  ],
138
83
  "members": [
139
84
  {
140
85
  "kind": "field",
141
- "name": "size",
86
+ "name": "expanded",
142
87
  "type": {
143
- "text": "'sm' | 'md' | 'lg'"
88
+ "text": "boolean"
144
89
  },
145
- "default": "'md'",
146
- "description": "Size of the action bar — propagated as a data attribute to slotted children.",
147
- "attribute": "hx-size",
90
+ "default": "false",
91
+ "description": "Whether this item is expanded.",
92
+ "attribute": "expanded",
148
93
  "reflects": true
149
94
  },
150
95
  {
151
96
  "kind": "field",
152
- "name": "variant",
97
+ "name": "disabled",
153
98
  "type": {
154
- "text": "'default' | 'outlined' | 'filled'"
99
+ "text": "boolean"
155
100
  },
156
- "default": "'default'",
157
- "description": "Visual variant controlling the bar background.",
158
- "attribute": "variant",
101
+ "default": "false",
102
+ "description": "Whether this item is disabled (cannot be toggled).",
103
+ "attribute": "disabled",
159
104
  "reflects": true
160
105
  },
161
106
  {
162
107
  "kind": "field",
163
- "name": "position",
108
+ "name": "level",
164
109
  "type": {
165
- "text": "'top' | 'bottom' | 'sticky'"
110
+ "text": "1 | 2 | 3 | 4 | 5 | 6"
166
111
  },
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
112
+ "default": "3",
113
+ "description": "Heading level (1–6) applied via `role=\"heading\" aria-level` on the summary\ntrigger. Defaults to 3. Set to match the document outline around the\naccordion so screen readers surface accordion items in the heading list.",
114
+ "attribute": "level"
115
+ }
116
+ ],
117
+ "events": [
118
+ {
119
+ "name": "hx-expand",
120
+ "type": {
121
+ "text": "CustomEvent<{expanded: boolean, itemId: string}>"
122
+ },
123
+ "description": "Dispatched when the item is expanded."
171
124
  },
172
125
  {
173
- "kind": "field",
174
- "name": "accessibleLabel",
126
+ "name": "hx-collapse",
175
127
  "type": {
176
- "text": "string"
128
+ "text": "CustomEvent<{expanded: boolean, itemId: string}>"
177
129
  },
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"
130
+ "description": "Dispatched when the item is collapsed."
181
131
  }
182
132
  ],
183
133
  "attributes": [
184
134
  {
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",
135
+ "name": "expanded",
196
136
  "type": {
197
- "text": "'default' | 'outlined' | 'filled'"
137
+ "text": "boolean"
198
138
  },
199
- "default": "'default'",
200
- "description": "Visual variant controlling the bar background.",
201
- "fieldName": "variant",
202
- "attribute": "variant"
139
+ "default": "false",
140
+ "description": "Whether this item is expanded.",
141
+ "fieldName": "expanded",
142
+ "attribute": "expanded"
203
143
  },
204
144
  {
205
- "name": "position",
145
+ "name": "disabled",
206
146
  "type": {
207
- "text": "'top' | 'bottom' | 'sticky'"
147
+ "text": "boolean"
208
148
  },
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"
149
+ "default": "false",
150
+ "description": "Whether this item is disabled (cannot be toggled).",
151
+ "fieldName": "disabled",
152
+ "attribute": "disabled"
213
153
  },
214
154
  {
215
- "name": "accessible-label",
155
+ "name": "level",
216
156
  "type": {
217
- "text": "string"
157
+ "text": "1 | 2 | 3 | 4 | 5 | 6"
218
158
  },
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"
159
+ "default": "3",
160
+ "description": "Heading level (1–6) applied via `role=\"heading\" aria-level` on the summary\ntrigger. Defaults to 3. Set to match the document outline around the\naccordion so screen readers surface accordion items in the heading list.",
161
+ "fieldName": "level",
162
+ "attribute": "level"
223
163
  }
224
164
  ],
225
165
  "superclass": {
226
166
  "name": "HelixElement",
227
167
  "module": "/src/base/index.js"
228
168
  },
229
- "tagName": "hx-action-bar",
169
+ "tagName": "hx-accordion-item",
230
170
  "customElement": true,
231
- "summary": "Horizontal action bar for grouping related controls.",
232
- "helixMeta": {
233
- "priorityTier": "P0"
234
- }
171
+ "summary": "Collapsible panel that can be expanded or collapsed."
172
+ },
173
+ {
174
+ "kind": "variable",
175
+ "name": "detail",
176
+ "type": {
177
+ "text": "object"
178
+ },
179
+ "default": "{ expanded, itemId: this.id || '' }"
235
180
  }
236
181
  ],
237
182
  "exports": [
238
183
  {
239
184
  "kind": "js",
240
- "name": "HelixActionBar",
185
+ "name": "HelixAccordionItem",
241
186
  "declaration": {
242
- "name": "HelixActionBar",
243
- "module": "src/components/hx-action-bar/hx-action-bar.ts"
187
+ "name": "HelixAccordionItem",
188
+ "module": "src/components/hx-accordion/hx-accordion-item.ts"
244
189
  }
245
190
  },
246
191
  {
247
192
  "kind": "custom-element-definition",
248
- "name": "hx-action-bar",
193
+ "name": "hx-accordion-item",
249
194
  "declaration": {
250
- "name": "HelixActionBar",
251
- "module": "src/components/hx-action-bar/hx-action-bar.ts"
252
- }
253
- }
254
- ]
255
- },
256
- {
257
- "kind": "javascript-module",
258
- "path": "src/components/hx-action-bar/index.ts",
259
- "declarations": [],
260
- "exports": [
261
- {
262
- "kind": "js",
263
- "name": "HelixActionBar",
264
- "declaration": {
265
- "name": "HelixActionBar",
266
- "module": "./hx-action-bar.js"
267
- }
268
- }
269
- ]
270
- },
271
- {
272
- "kind": "javascript-module",
273
- "path": "src/components/hx-accordion/hx-accordion-item.ts",
274
- "declarations": [
275
- {
276
- "kind": "class",
277
- "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).",
278
- "name": "HelixAccordionItem",
279
- "cssProperties": [
280
- {
281
- "description": "Border color between items.",
282
- "name": "--hx-accordion-border-color",
283
- "default": "var(--hx-color-neutral-200)"
284
- },
285
- {
286
- "description": "Trigger padding.",
287
- "name": "--hx-accordion-trigger-padding",
288
- "default": "var(--hx-space-4)"
289
- },
290
- {
291
- "description": "Trigger text color.",
292
- "name": "--hx-accordion-trigger-color",
293
- "default": "var(--hx-color-neutral-800)"
294
- },
295
- {
296
- "description": "Trigger background color.",
297
- "name": "--hx-accordion-trigger-bg",
298
- "default": "transparent"
299
- },
300
- {
301
- "description": "Trigger hover background.",
302
- "name": "--hx-accordion-trigger-hover-bg",
303
- "default": "var(--hx-color-neutral-50)"
304
- },
305
- {
306
- "description": "Icon color.",
307
- "name": "--hx-accordion-icon-color",
308
- "default": "var(--hx-color-neutral-500)"
309
- },
310
- {
311
- "description": "Content padding.",
312
- "name": "--hx-accordion-content-padding",
313
- "default": "0 var(--hx-space-4) var(--hx-space-4)"
314
- },
315
- {
316
- "description": "Content text color.",
317
- "name": "--hx-accordion-content-color",
318
- "default": "var(--hx-color-neutral-600)"
319
- }
320
- ],
321
- "cssParts": [
322
- {
323
- "description": "The outer details element container.",
324
- "name": "item"
325
- },
326
- {
327
- "description": "The summary/trigger element.",
328
- "name": "trigger"
329
- },
330
- {
331
- "description": "The collapsible content area.",
332
- "name": "content"
333
- },
334
- {
335
- "description": "The expand/collapse icon.",
336
- "name": "icon"
337
- }
338
- ],
339
- "slots": [
340
- {
341
- "description": "The heading/trigger content for this item.",
342
- "name": "trigger"
343
- },
344
- {
345
- "description": "Default slot for the collapsible body content.",
346
- "name": ""
347
- }
348
- ],
349
- "members": [
350
- {
351
- "kind": "field",
352
- "name": "expanded",
353
- "type": {
354
- "text": "boolean"
355
- },
356
- "default": "false",
357
- "description": "Whether this item is expanded.",
358
- "attribute": "expanded",
359
- "reflects": true
360
- },
361
- {
362
- "kind": "field",
363
- "name": "disabled",
364
- "type": {
365
- "text": "boolean"
366
- },
367
- "default": "false",
368
- "description": "Whether this item is disabled (cannot be toggled).",
369
- "attribute": "disabled",
370
- "reflects": true
371
- },
372
- {
373
- "kind": "field",
374
- "name": "level",
375
- "type": {
376
- "text": "1 | 2 | 3 | 4 | 5 | 6"
377
- },
378
- "default": "3",
379
- "description": "Heading level (1–6) applied via `role=\"heading\" aria-level` on the summary\ntrigger. Defaults to 3. Set to match the document outline around the\naccordion so screen readers surface accordion items in the heading list.",
380
- "attribute": "level"
381
- }
382
- ],
383
- "events": [
384
- {
385
- "name": "hx-expand",
386
- "type": {
387
- "text": "CustomEvent<{expanded: boolean, itemId: string}>"
388
- },
389
- "description": "Dispatched when the item is expanded."
390
- },
391
- {
392
- "name": "hx-collapse",
393
- "type": {
394
- "text": "CustomEvent<{expanded: boolean, itemId: string}>"
395
- },
396
- "description": "Dispatched when the item is collapsed."
397
- }
398
- ],
399
- "attributes": [
400
- {
401
- "name": "expanded",
402
- "type": {
403
- "text": "boolean"
404
- },
405
- "default": "false",
406
- "description": "Whether this item is expanded.",
407
- "fieldName": "expanded",
408
- "attribute": "expanded"
409
- },
410
- {
411
- "name": "disabled",
412
- "type": {
413
- "text": "boolean"
414
- },
415
- "default": "false",
416
- "description": "Whether this item is disabled (cannot be toggled).",
417
- "fieldName": "disabled",
418
- "attribute": "disabled"
419
- },
420
- {
421
- "name": "level",
422
- "type": {
423
- "text": "1 | 2 | 3 | 4 | 5 | 6"
424
- },
425
- "default": "3",
426
- "description": "Heading level (1–6) applied via `role=\"heading\" aria-level` on the summary\ntrigger. Defaults to 3. Set to match the document outline around the\naccordion so screen readers surface accordion items in the heading list.",
427
- "fieldName": "level",
428
- "attribute": "level"
429
- }
430
- ],
431
- "superclass": {
432
- "name": "HelixElement",
433
- "module": "/src/base/index.js"
434
- },
435
- "tagName": "hx-accordion-item",
436
- "customElement": true,
437
- "summary": "Collapsible panel that can be expanded or collapsed."
438
- },
439
- {
440
- "kind": "variable",
441
- "name": "detail",
442
- "type": {
443
- "text": "object"
444
- },
445
- "default": "{ expanded, itemId: this.id || '' }"
446
- }
447
- ],
448
- "exports": [
449
- {
450
- "kind": "js",
451
- "name": "HelixAccordionItem",
452
- "declaration": {
453
- "name": "HelixAccordionItem",
454
- "module": "src/components/hx-accordion/hx-accordion-item.ts"
455
- }
456
- },
457
- {
458
- "kind": "custom-element-definition",
459
- "name": "hx-accordion-item",
460
- "declaration": {
461
- "name": "HelixAccordionItem",
462
- "module": "src/components/hx-accordion/hx-accordion-item.ts"
195
+ "name": "HelixAccordionItem",
196
+ "module": "src/components/hx-accordion/hx-accordion-item.ts"
463
197
  }
464
198
  }
465
199
  ]
@@ -593,187 +327,79 @@
593
327
  },
594
328
  {
595
329
  "kind": "javascript-module",
596
- "path": "src/components/hx-alert/hx-alert.ts",
330
+ "path": "src/components/hx-action-bar/hx-action-bar.ts",
597
331
  "declarations": [
598
332
  {
599
333
  "kind": "class",
600
- "description": "A feedback component for communicating status messages, warnings, and errors.\nCritical for healthcare patient safety alerts.",
601
- "name": "HelixAlert",
334
+ "description": "A horizontal toolbar container for grouping related action buttons and controls.\nImplements the ARIA toolbar pattern with roving tabindex keyboard navigation.",
335
+ "name": "HelixActionBar",
602
336
  "cssProperties": [
603
337
  {
604
- "description": "Alert background color.",
605
- "name": "--hx-alert-bg",
606
- "default": "var(--hx-color-info-50)"
338
+ "description": "Bar background color (default variant).",
339
+ "name": "--hx-action-bar-bg",
340
+ "default": "transparent"
607
341
  },
608
342
  {
609
- "description": "Alert text color.",
610
- "name": "--hx-alert-color",
611
- "default": "var(--hx-color-info-800)"
343
+ "description": "Bar border (default variant).",
344
+ "name": "--hx-action-bar-border",
345
+ "default": "none"
612
346
  },
613
347
  {
614
- "description": "Alert border color.",
615
- "name": "--hx-alert-border-color",
616
- "default": "var(--hx-color-info-200)"
348
+ "description": "Inner padding.",
349
+ "name": "--hx-action-bar-padding",
350
+ "default": "var(--hx-space-2,0.5rem) var(--hx-space-3,0.75rem)"
617
351
  },
618
352
  {
619
- "description": "Alert border radius.",
620
- "name": "--hx-alert-border-radius",
621
- "default": "var(--hx-border-radius-md)"
353
+ "description": "Gap between slotted items.",
354
+ "name": "--hx-action-bar-gap",
355
+ "default": "var(--hx-space-2,0.5rem)"
622
356
  },
623
357
  {
624
- "description": "Alert border width.",
625
- "name": "--hx-alert-border-width",
626
- "default": "var(--hx-border-width-thin)"
358
+ "description": "Z-index when sticky or bottom position.",
359
+ "name": "--hx-action-bar-z-index",
360
+ "default": "10"
627
361
  },
628
362
  {
629
- "description": "Alert padding.",
630
- "name": "--hx-alert-padding",
631
- "default": "var(--hx-space-4)"
363
+ "description": "Padding.",
364
+ "name": "--hx-action-bar-padding-block-start",
365
+ "default": "0px"
632
366
  },
633
367
  {
634
- "description": "Gap between alert elements.",
635
- "name": "--hx-alert-gap",
636
- "default": "var(--hx-space-3)"
637
- },
638
- {
639
- "description": "Alert icon color.",
640
- "name": "--hx-alert-icon-color",
641
- "default": "var(--hx-color-info-500)"
642
- },
643
- {
644
- "description": "Alert font family.",
645
- "name": "--hx-alert-font-family",
646
- "default": "var(--hx-font-family-sans)"
647
- },
648
- {
649
- "description": "Minimum touch target size for the close button.",
650
- "name": "--hx-touch-target-size",
651
- "default": "44px"
652
- },
653
- {
654
- "description": "Width of the left border accent stripe.",
655
- "name": "--hx-alert-accent-width",
656
- "default": "4px"
368
+ "description": "Padding.",
369
+ "name": "--hx-action-bar-padding-block-end",
370
+ "default": "0px"
657
371
  },
658
372
  {
659
373
  "description": "CSS custom property.",
660
374
  "name": "--hx-border-radius-md"
661
375
  },
662
- {
663
- "description": "CSS custom property.",
664
- "name": "--hx-border-radius-sm"
665
- },
666
376
  {
667
377
  "description": "Width.",
668
378
  "name": "--hx-border-width-thin"
669
379
  },
670
380
  {
671
381
  "description": "Color.",
672
- "name": "--hx-color-error-200"
673
- },
674
- {
675
- "description": "Color.",
676
- "name": "--hx-color-error-50"
677
- },
678
- {
679
- "description": "Color.",
680
- "name": "--hx-color-error-500"
681
- },
682
- {
683
- "description": "Color.",
684
- "name": "--hx-color-error-800"
685
- },
686
- {
687
- "description": "Color.",
688
- "name": "--hx-color-info-200"
689
- },
690
- {
691
- "description": "Color.",
692
- "name": "--hx-color-info-50"
693
- },
694
- {
695
- "description": "Color.",
696
- "name": "--hx-color-info-500"
697
- },
698
- {
699
- "description": "Color.",
700
- "name": "--hx-color-info-800"
701
- },
702
- {
703
- "description": "Color.",
704
- "name": "--hx-color-primary-400"
705
- },
706
- {
707
- "description": "Color.",
708
- "name": "--hx-color-success-200"
709
- },
710
- {
711
- "description": "Color.",
712
- "name": "--hx-color-success-50"
713
- },
714
- {
715
- "description": "Color.",
716
- "name": "--hx-color-success-500"
717
- },
718
- {
719
- "description": "Color.",
720
- "name": "--hx-color-success-800"
721
- },
722
- {
723
- "description": "Color.",
724
- "name": "--hx-color-warning-200"
725
- },
726
- {
727
- "description": "Color.",
728
- "name": "--hx-color-warning-50"
729
- },
730
- {
731
- "description": "Color.",
732
- "name": "--hx-color-warning-500"
382
+ "name": "--hx-color-neutral-0"
733
383
  },
734
384
  {
735
385
  "description": "Color.",
736
- "name": "--hx-color-warning-800"
386
+ "name": "--hx-color-neutral-200"
737
387
  },
738
388
  {
739
389
  "description": "Color.",
740
- "name": "--hx-focus-ring-color"
741
- },
742
- {
743
- "description": "CSS custom property.",
744
- "name": "--hx-focus-ring-offset"
745
- },
746
- {
747
- "description": "Width.",
748
- "name": "--hx-focus-ring-width"
749
- },
750
- {
751
- "description": "Font family.",
752
- "name": "--hx-font-family-sans"
753
- },
754
- {
755
- "description": "Font size.",
756
- "name": "--hx-font-size-md"
757
- },
758
- {
759
- "description": "Font size.",
760
- "name": "--hx-font-size-sm"
761
- },
762
- {
763
- "description": "Font weight.",
764
- "name": "--hx-font-weight-semibold"
390
+ "name": "--hx-color-neutral-50"
765
391
  },
766
392
  {
767
- "description": "Line height.",
768
- "name": "--hx-line-height-normal"
393
+ "description": "Size token.",
394
+ "name": "--hx-size-8"
769
395
  },
770
396
  {
771
- "description": "Opacity.",
772
- "name": "--hx-opacity-100"
397
+ "description": "Size token.",
398
+ "name": "--hx-size-10"
773
399
  },
774
400
  {
775
- "description": "Opacity.",
776
- "name": "--hx-opacity-75"
401
+ "description": "Size token.",
402
+ "name": "--hx-size-12"
777
403
  },
778
404
  {
779
405
  "description": "Spacing token.",
@@ -790,135 +416,509 @@
790
416
  {
791
417
  "description": "Spacing token.",
792
418
  "name": "--hx-space-4"
793
- },
794
- {
795
- "description": "Spacing token.",
796
- "name": "--hx-space-5"
797
- },
798
- {
799
- "description": "Transition timing.",
800
- "name": "--hx-transition-fast"
801
419
  }
802
420
  ],
803
421
  "cssParts": [
804
422
  {
805
- "description": "The outer alert container.",
806
- "name": "alert"
807
- },
808
- {
809
- "description": "The title/headline container.",
810
- "name": "title"
423
+ "description": "The root toolbar container element.",
424
+ "name": "base"
811
425
  },
812
426
  {
813
- "description": "The icon container.",
814
- "name": "icon"
427
+ "description": "The start (left) slot wrapper.",
428
+ "name": "start"
815
429
  },
816
430
  {
817
- "description": "The message content area.",
818
- "name": "message"
431
+ "description": "The center (default) slot wrapper.",
432
+ "name": "center"
819
433
  },
820
434
  {
821
- "description": "The dismiss button (only rendered when dismissible).",
822
- "name": "close-button"
435
+ "description": "The end (right) slot wrapper.",
436
+ "name": "end"
823
437
  },
824
438
  {
825
- "description": "The actions container.",
826
- "name": "actions"
439
+ "description": "The overflow slot wrapper (hidden when no overflow content).",
440
+ "name": "overflow"
827
441
  }
828
442
  ],
829
443
  "slots": [
830
444
  {
831
- "description": "Default slot for alert message content.",
832
- "name": ""
445
+ "description": "Left-aligned actions.",
446
+ "name": "start"
833
447
  },
834
448
  {
835
- "description": "Optional title/headline for the alert.",
836
- "name": "title"
449
+ "description": "Center content (default slot).",
450
+ "name": ""
837
451
  },
838
452
  {
839
- "description": "Custom icon to override the default variant icon.",
840
- "name": "icon"
453
+ "description": "Right-aligned actions.",
454
+ "name": "end"
841
455
  },
842
456
  {
843
- "description": "Action buttons rendered within the alert.",
844
- "name": "actions"
457
+ "description": "Actions revealed when the bar is constrained for space.",
458
+ "name": "overflow"
845
459
  }
846
460
  ],
847
461
  "members": [
848
462
  {
849
463
  "kind": "field",
850
- "name": "variant",
464
+ "name": "size",
851
465
  "type": {
852
- "text": "'info' | 'success' | 'warning' | 'error'"
466
+ "text": "'sm' | 'md' | 'lg'"
853
467
  },
854
- "default": "'info'",
855
- "description": "Visual variant of the alert that determines colors and ARIA semantics.",
856
- "attribute": "variant",
468
+ "default": "'md'",
469
+ "description": "Size of the action bar propagated as a data attribute to slotted children.",
470
+ "attribute": "hx-size",
857
471
  "reflects": true
858
472
  },
859
473
  {
860
474
  "kind": "field",
861
- "name": "dismissible",
475
+ "name": "variant",
862
476
  "type": {
863
- "text": "boolean"
477
+ "text": "'default' | 'outlined' | 'filled'"
864
478
  },
865
- "default": "false",
866
- "description": "Whether the alert can be dismissed by the user.",
867
- "attribute": "dismissible",
479
+ "default": "'default'",
480
+ "description": "Visual variant controlling the bar background.",
481
+ "attribute": "variant",
868
482
  "reflects": true
869
483
  },
870
484
  {
871
485
  "kind": "field",
872
- "name": "heading",
486
+ "name": "position",
873
487
  "type": {
874
- "text": "string"
488
+ "text": "'top' | 'bottom' | 'sticky'"
875
489
  },
876
- "default": "''",
877
- "description": "Optional heading text that provides context for the close button's accessible label.\nWhen provided, the close button is announced as \"Close [heading] alert\".\nWhen absent, the close button falls back to \"Close alert\".",
878
- "attribute": "heading"
490
+ "default": "'top'",
491
+ "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",
492
+ "attribute": "position",
493
+ "reflects": true
879
494
  },
880
495
  {
881
496
  "kind": "field",
882
- "name": "labelClose",
497
+ "name": "accessibleLabel",
883
498
  "type": {
884
499
  "text": "string"
885
500
  },
886
- "default": "'Close alert'",
887
- "description": "Accessible label for the close button. Override for i18n.",
888
- "attribute": "label-close"
889
- },
501
+ "default": "''",
502
+ "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.",
503
+ "attribute": "accessible-label"
504
+ }
505
+ ],
506
+ "attributes": [
890
507
  {
891
- "kind": "field",
892
- "name": "open",
508
+ "name": "hx-size",
893
509
  "type": {
894
- "text": "boolean"
510
+ "text": "'sm' | 'md' | 'lg'"
895
511
  },
896
- "default": "false",
897
- "description": "Whether the alert is visible. Add the `open` attribute to show the alert.",
898
- "attribute": "open",
899
- "reflects": true
512
+ "default": "'md'",
513
+ "description": "Size of the action bar propagated as a data attribute to slotted children.",
514
+ "fieldName": "size",
515
+ "attribute": "hx-size"
900
516
  },
901
517
  {
902
- "kind": "field",
903
- "name": "showIcon",
518
+ "name": "variant",
904
519
  "type": {
905
- "text": "boolean"
520
+ "text": "'default' | 'outlined' | 'filled'"
906
521
  },
907
- "default": "false",
908
- "description": "Whether to show the default variant icon. Add `show-icon` attribute to display the icon.",
909
- "attribute": "show-icon",
910
- "reflects": true
522
+ "default": "'default'",
523
+ "description": "Visual variant controlling the bar background.",
524
+ "fieldName": "variant",
525
+ "attribute": "variant"
911
526
  },
912
527
  {
913
- "kind": "field",
914
- "name": "accent",
528
+ "name": "position",
915
529
  "type": {
916
- "text": "boolean"
530
+ "text": "'top' | 'bottom' | 'sticky'"
917
531
  },
918
- "default": "false",
919
- "description": "When true, applies a left border accent stripe instead of a full border.\nCommon healthcare/enterprise dashboard pattern for visual distinction of alert types.",
920
- "attribute": "accent",
921
- "reflects": true
532
+ "default": "'top'",
533
+ "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",
534
+ "fieldName": "position",
535
+ "attribute": "position"
536
+ },
537
+ {
538
+ "name": "accessible-label",
539
+ "type": {
540
+ "text": "string"
541
+ },
542
+ "default": "''",
543
+ "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.",
544
+ "fieldName": "accessibleLabel",
545
+ "attribute": "accessible-label"
546
+ }
547
+ ],
548
+ "superclass": {
549
+ "name": "HelixElement",
550
+ "module": "/src/base/index.js"
551
+ },
552
+ "tagName": "hx-action-bar",
553
+ "customElement": true,
554
+ "summary": "Horizontal action bar for grouping related controls.",
555
+ "helixMeta": {
556
+ "priorityTier": "P0"
557
+ }
558
+ }
559
+ ],
560
+ "exports": [
561
+ {
562
+ "kind": "js",
563
+ "name": "HelixActionBar",
564
+ "declaration": {
565
+ "name": "HelixActionBar",
566
+ "module": "src/components/hx-action-bar/hx-action-bar.ts"
567
+ }
568
+ },
569
+ {
570
+ "kind": "custom-element-definition",
571
+ "name": "hx-action-bar",
572
+ "declaration": {
573
+ "name": "HelixActionBar",
574
+ "module": "src/components/hx-action-bar/hx-action-bar.ts"
575
+ }
576
+ }
577
+ ]
578
+ },
579
+ {
580
+ "kind": "javascript-module",
581
+ "path": "src/components/hx-action-bar/index.ts",
582
+ "declarations": [],
583
+ "exports": [
584
+ {
585
+ "kind": "js",
586
+ "name": "HelixActionBar",
587
+ "declaration": {
588
+ "name": "HelixActionBar",
589
+ "module": "./hx-action-bar.js"
590
+ }
591
+ }
592
+ ]
593
+ },
594
+ {
595
+ "kind": "javascript-module",
596
+ "path": "src/components/hx-alert/hx-alert.ts",
597
+ "declarations": [
598
+ {
599
+ "kind": "class",
600
+ "description": "A feedback component for communicating status messages, warnings, and errors.\nCritical for healthcare patient safety alerts.",
601
+ "name": "HelixAlert",
602
+ "cssProperties": [
603
+ {
604
+ "description": "Alert background color.",
605
+ "name": "--hx-alert-bg",
606
+ "default": "var(--hx-color-info-50)"
607
+ },
608
+ {
609
+ "description": "Alert text color.",
610
+ "name": "--hx-alert-color",
611
+ "default": "var(--hx-color-info-800)"
612
+ },
613
+ {
614
+ "description": "Alert border color.",
615
+ "name": "--hx-alert-border-color",
616
+ "default": "var(--hx-color-info-200)"
617
+ },
618
+ {
619
+ "description": "Alert border radius.",
620
+ "name": "--hx-alert-border-radius",
621
+ "default": "var(--hx-border-radius-md)"
622
+ },
623
+ {
624
+ "description": "Alert border width.",
625
+ "name": "--hx-alert-border-width",
626
+ "default": "var(--hx-border-width-thin)"
627
+ },
628
+ {
629
+ "description": "Alert padding.",
630
+ "name": "--hx-alert-padding",
631
+ "default": "var(--hx-space-4)"
632
+ },
633
+ {
634
+ "description": "Gap between alert elements.",
635
+ "name": "--hx-alert-gap",
636
+ "default": "var(--hx-space-3)"
637
+ },
638
+ {
639
+ "description": "Alert icon color.",
640
+ "name": "--hx-alert-icon-color",
641
+ "default": "var(--hx-color-info-500)"
642
+ },
643
+ {
644
+ "description": "Alert font family.",
645
+ "name": "--hx-alert-font-family",
646
+ "default": "var(--hx-font-family-sans)"
647
+ },
648
+ {
649
+ "description": "Minimum touch target size for the close button.",
650
+ "name": "--hx-touch-target-size",
651
+ "default": "44px"
652
+ },
653
+ {
654
+ "description": "Width of the left border accent stripe.",
655
+ "name": "--hx-alert-accent-width",
656
+ "default": "4px"
657
+ },
658
+ {
659
+ "description": "CSS custom property.",
660
+ "name": "--hx-border-radius-md"
661
+ },
662
+ {
663
+ "description": "CSS custom property.",
664
+ "name": "--hx-border-radius-sm"
665
+ },
666
+ {
667
+ "description": "Width.",
668
+ "name": "--hx-border-width-thin"
669
+ },
670
+ {
671
+ "description": "Color.",
672
+ "name": "--hx-color-error-200"
673
+ },
674
+ {
675
+ "description": "Color.",
676
+ "name": "--hx-color-error-50"
677
+ },
678
+ {
679
+ "description": "Color.",
680
+ "name": "--hx-color-error-500"
681
+ },
682
+ {
683
+ "description": "Color.",
684
+ "name": "--hx-color-error-800"
685
+ },
686
+ {
687
+ "description": "Color.",
688
+ "name": "--hx-color-info-200"
689
+ },
690
+ {
691
+ "description": "Color.",
692
+ "name": "--hx-color-info-50"
693
+ },
694
+ {
695
+ "description": "Color.",
696
+ "name": "--hx-color-info-500"
697
+ },
698
+ {
699
+ "description": "Color.",
700
+ "name": "--hx-color-info-800"
701
+ },
702
+ {
703
+ "description": "Color.",
704
+ "name": "--hx-color-primary-400"
705
+ },
706
+ {
707
+ "description": "Color.",
708
+ "name": "--hx-color-success-200"
709
+ },
710
+ {
711
+ "description": "Color.",
712
+ "name": "--hx-color-success-50"
713
+ },
714
+ {
715
+ "description": "Color.",
716
+ "name": "--hx-color-success-500"
717
+ },
718
+ {
719
+ "description": "Color.",
720
+ "name": "--hx-color-success-800"
721
+ },
722
+ {
723
+ "description": "Color.",
724
+ "name": "--hx-color-warning-200"
725
+ },
726
+ {
727
+ "description": "Color.",
728
+ "name": "--hx-color-warning-50"
729
+ },
730
+ {
731
+ "description": "Color.",
732
+ "name": "--hx-color-warning-500"
733
+ },
734
+ {
735
+ "description": "Color.",
736
+ "name": "--hx-color-warning-800"
737
+ },
738
+ {
739
+ "description": "Color.",
740
+ "name": "--hx-focus-ring-color"
741
+ },
742
+ {
743
+ "description": "CSS custom property.",
744
+ "name": "--hx-focus-ring-offset"
745
+ },
746
+ {
747
+ "description": "Width.",
748
+ "name": "--hx-focus-ring-width"
749
+ },
750
+ {
751
+ "description": "Font family.",
752
+ "name": "--hx-font-family-sans"
753
+ },
754
+ {
755
+ "description": "Font size.",
756
+ "name": "--hx-font-size-md"
757
+ },
758
+ {
759
+ "description": "Font size.",
760
+ "name": "--hx-font-size-sm"
761
+ },
762
+ {
763
+ "description": "Font weight.",
764
+ "name": "--hx-font-weight-semibold"
765
+ },
766
+ {
767
+ "description": "Line height.",
768
+ "name": "--hx-line-height-normal"
769
+ },
770
+ {
771
+ "description": "Opacity.",
772
+ "name": "--hx-opacity-100"
773
+ },
774
+ {
775
+ "description": "Opacity.",
776
+ "name": "--hx-opacity-75"
777
+ },
778
+ {
779
+ "description": "Spacing token.",
780
+ "name": "--hx-space-1"
781
+ },
782
+ {
783
+ "description": "Spacing token.",
784
+ "name": "--hx-space-2"
785
+ },
786
+ {
787
+ "description": "Spacing token.",
788
+ "name": "--hx-space-3"
789
+ },
790
+ {
791
+ "description": "Spacing token.",
792
+ "name": "--hx-space-4"
793
+ },
794
+ {
795
+ "description": "Spacing token.",
796
+ "name": "--hx-space-5"
797
+ },
798
+ {
799
+ "description": "Transition timing.",
800
+ "name": "--hx-transition-fast"
801
+ }
802
+ ],
803
+ "cssParts": [
804
+ {
805
+ "description": "The outer alert container.",
806
+ "name": "alert"
807
+ },
808
+ {
809
+ "description": "The title/headline container.",
810
+ "name": "title"
811
+ },
812
+ {
813
+ "description": "The icon container.",
814
+ "name": "icon"
815
+ },
816
+ {
817
+ "description": "The message content area.",
818
+ "name": "message"
819
+ },
820
+ {
821
+ "description": "The dismiss button (only rendered when dismissible).",
822
+ "name": "close-button"
823
+ },
824
+ {
825
+ "description": "The actions container.",
826
+ "name": "actions"
827
+ }
828
+ ],
829
+ "slots": [
830
+ {
831
+ "description": "Default slot for alert message content.",
832
+ "name": ""
833
+ },
834
+ {
835
+ "description": "Optional title/headline for the alert.",
836
+ "name": "title"
837
+ },
838
+ {
839
+ "description": "Custom icon to override the default variant icon.",
840
+ "name": "icon"
841
+ },
842
+ {
843
+ "description": "Action buttons rendered within the alert.",
844
+ "name": "actions"
845
+ }
846
+ ],
847
+ "members": [
848
+ {
849
+ "kind": "field",
850
+ "name": "variant",
851
+ "type": {
852
+ "text": "'info' | 'success' | 'warning' | 'error'"
853
+ },
854
+ "default": "'info'",
855
+ "description": "Visual variant of the alert that determines colors and ARIA semantics.",
856
+ "attribute": "variant",
857
+ "reflects": true
858
+ },
859
+ {
860
+ "kind": "field",
861
+ "name": "dismissible",
862
+ "type": {
863
+ "text": "boolean"
864
+ },
865
+ "default": "false",
866
+ "description": "Whether the alert can be dismissed by the user.",
867
+ "attribute": "dismissible",
868
+ "reflects": true
869
+ },
870
+ {
871
+ "kind": "field",
872
+ "name": "heading",
873
+ "type": {
874
+ "text": "string"
875
+ },
876
+ "default": "''",
877
+ "description": "Optional heading text that provides context for the close button's accessible label.\nWhen provided, the close button is announced as \"Close [heading] alert\".\nWhen absent, the close button falls back to \"Close alert\".",
878
+ "attribute": "heading"
879
+ },
880
+ {
881
+ "kind": "field",
882
+ "name": "labelClose",
883
+ "type": {
884
+ "text": "string"
885
+ },
886
+ "default": "'Close alert'",
887
+ "description": "Accessible label for the close button. Override for i18n.",
888
+ "attribute": "label-close"
889
+ },
890
+ {
891
+ "kind": "field",
892
+ "name": "open",
893
+ "type": {
894
+ "text": "boolean"
895
+ },
896
+ "default": "false",
897
+ "description": "Whether the alert is visible. Add the `open` attribute to show the alert.",
898
+ "attribute": "open",
899
+ "reflects": true
900
+ },
901
+ {
902
+ "kind": "field",
903
+ "name": "showIcon",
904
+ "type": {
905
+ "text": "boolean"
906
+ },
907
+ "default": "false",
908
+ "description": "Whether to show the default variant icon. Add `show-icon` attribute to display the icon.",
909
+ "attribute": "show-icon",
910
+ "reflects": true
911
+ },
912
+ {
913
+ "kind": "field",
914
+ "name": "accent",
915
+ "type": {
916
+ "text": "boolean"
917
+ },
918
+ "default": "false",
919
+ "description": "When true, applies a left border accent stripe instead of a full border.\nCommon healthcare/enterprise dashboard pattern for visual distinction of alert types.",
920
+ "attribute": "accent",
921
+ "reflects": true
922
922
  },
923
923
  {
924
924
  "kind": "field",
@@ -1054,8 +1054,48 @@
1054
1054
  "tagName": "hx-alert",
1055
1055
  "customElement": true,
1056
1056
  "summary": "Feedback alert for status messages with variant-based styling and ARIA live regions.",
1057
+ "aaaCertified": true,
1058
+ "aaaCertifiedDate": "2026-05-08",
1057
1059
  "helixMeta": {
1058
- "priorityTier": "P0"
1060
+ "keyboardContract": {
1061
+ "dismiss": [
1062
+ "Escape"
1063
+ ]
1064
+ },
1065
+ "ariaPattern": "alert",
1066
+ "ariaPatternSource": "https://www.w3.org/WAI/ARIA/apg/patterns/alert/",
1067
+ "forcedColorsSupported": true,
1068
+ "stability": "stable",
1069
+ "since": "3.6.0",
1070
+ "formAssociated": false,
1071
+ "themeAware": true,
1072
+ "brandAware": true,
1073
+ "drupalSdcEligible": true,
1074
+ "reactWrapperStatus": "complete",
1075
+ "priorityTier": "P0",
1076
+ "phiHandles": false,
1077
+ "clinicalContext": "none",
1078
+ "aaa": {
1079
+ "certified": true,
1080
+ "certifiedDate": "2026-05-08",
1081
+ "criteria": [
1082
+ "1.4.6",
1083
+ "1.4.9",
1084
+ "2.1.3",
1085
+ "2.3.3",
1086
+ "2.4.12",
1087
+ "2.4.13",
1088
+ "2.5.5",
1089
+ "3.2.5",
1090
+ "3.3.6",
1091
+ "forced-colors",
1092
+ "apg-keyboard"
1093
+ ],
1094
+ "auditUrl": "src/components/hx-alert/AAA-AUDIT.md"
1095
+ },
1096
+ "figma": {
1097
+ "componentName": "hx-alert"
1098
+ }
1059
1099
  }
1060
1100
  }
1061
1101
  ],
@@ -3350,8 +3390,50 @@
3350
3390
  "tagName": "hx-button",
3351
3391
  "customElement": true,
3352
3392
  "summary": "Primary interactive element for triggering actions and form submission.",
3393
+ "aaaCertified": true,
3394
+ "aaaCertifiedDate": "2026-05-08",
3353
3395
  "helixMeta": {
3354
- "priorityTier": "P0"
3396
+ "keyboardContract": {
3397
+ "activate": [
3398
+ "Enter",
3399
+ "Space"
3400
+ ],
3401
+ "disabledSuppresses": true
3402
+ },
3403
+ "ariaPattern": "button",
3404
+ "ariaPatternSource": "https://www.w3.org/WAI/ARIA/apg/patterns/button/",
3405
+ "forcedColorsSupported": true,
3406
+ "stability": "stable",
3407
+ "since": "3.6.0",
3408
+ "formAssociated": true,
3409
+ "themeAware": true,
3410
+ "brandAware": true,
3411
+ "drupalSdcEligible": true,
3412
+ "reactWrapperStatus": "complete",
3413
+ "priorityTier": "P0",
3414
+ "phiHandles": false,
3415
+ "clinicalContext": "none",
3416
+ "aaa": {
3417
+ "certified": true,
3418
+ "certifiedDate": "2026-05-08",
3419
+ "criteria": [
3420
+ "1.4.6",
3421
+ "1.4.9",
3422
+ "2.1.3",
3423
+ "2.3.3",
3424
+ "2.4.12",
3425
+ "2.4.13",
3426
+ "2.5.5",
3427
+ "3.2.5",
3428
+ "3.3.6",
3429
+ "forced-colors",
3430
+ "apg-keyboard"
3431
+ ],
3432
+ "auditUrl": "src/components/hx-button/AAA-AUDIT.md"
3433
+ },
3434
+ "figma": {
3435
+ "componentName": "hx-button"
3436
+ }
3355
3437
  }
3356
3438
  }
3357
3439
  ],
@@ -5143,8 +5225,49 @@
5143
5225
  "tagName": "hx-checkbox",
5144
5226
  "customElement": true,
5145
5227
  "summary": "Form-associated checkbox with built-in label, error, and help text.",
5228
+ "aaaCertified": true,
5229
+ "aaaCertifiedDate": "2026-05-08",
5146
5230
  "helixMeta": {
5147
- "priorityTier": "P0"
5231
+ "keyboardContract": {
5232
+ "activate": [
5233
+ "Space"
5234
+ ],
5235
+ "disabledSuppresses": true
5236
+ },
5237
+ "ariaPattern": "checkbox",
5238
+ "ariaPatternSource": "https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/",
5239
+ "forcedColorsSupported": true,
5240
+ "stability": "stable",
5241
+ "since": "3.6.0",
5242
+ "formAssociated": true,
5243
+ "themeAware": true,
5244
+ "brandAware": true,
5245
+ "drupalSdcEligible": true,
5246
+ "reactWrapperStatus": "complete",
5247
+ "priorityTier": "P0",
5248
+ "phiHandles": false,
5249
+ "clinicalContext": "none",
5250
+ "aaa": {
5251
+ "certified": true,
5252
+ "certifiedDate": "2026-05-08",
5253
+ "criteria": [
5254
+ "1.4.6",
5255
+ "1.4.9",
5256
+ "2.1.3",
5257
+ "2.3.3",
5258
+ "2.4.12",
5259
+ "2.4.13",
5260
+ "2.5.5",
5261
+ "3.2.5",
5262
+ "3.3.6",
5263
+ "forced-colors",
5264
+ "apg-keyboard"
5265
+ ],
5266
+ "auditUrl": "src/components/hx-checkbox/AAA-AUDIT.md"
5267
+ },
5268
+ "figma": {
5269
+ "componentName": "hx-checkbox"
5270
+ }
5148
5271
  }
5149
5272
  }
5150
5273
  ],
@@ -9171,1349 +9294,1349 @@
9171
9294
  },
9172
9295
  {
9173
9296
  "kind": "javascript-module",
9174
- "path": "src/components/hx-date-picker/hx-date-picker.ts",
9175
- "declarations": [
9176
- {
9177
- "kind": "class",
9178
- "description": "Date picker component for selecting dates with keyboard-accessible calendar popup.",
9179
- "name": "HelixDatePicker",
9180
- "cssProperties": [
9181
- {
9182
- "description": "Input background color.",
9183
- "name": "--hx-date-picker-bg",
9184
- "default": "var(--hx-color-neutral-0)"
9185
- },
9186
- {
9187
- "description": "Input text color.",
9188
- "name": "--hx-date-picker-color",
9189
- "default": "var(--hx-color-neutral-800)"
9190
- },
9191
- {
9192
- "description": "Border color.",
9193
- "name": "--hx-date-picker-border-color",
9194
- "default": "var(--hx-color-neutral-300)"
9195
- },
9297
+ "path": "src/components/hx-data-table/hx-data-table.ts",
9298
+ "declarations": [
9299
+ {
9300
+ "kind": "class",
9301
+ "description": "An enterprise data table with sorting, row selection, and keyboard navigation.",
9302
+ "name": "HelixDataTable",
9303
+ "cssProperties": [
9196
9304
  {
9197
- "description": "Border radius.",
9198
- "name": "--hx-date-picker-border-radius",
9199
- "default": "var(--hx-border-radius-md)"
9305
+ "description": "Header background color.",
9306
+ "name": "--hx-data-table-header-bg",
9307
+ "default": "var(--hx-color-neutral-50)"
9200
9308
  },
9201
9309
  {
9202
- "description": "Font family.",
9203
- "name": "--hx-date-picker-font-family",
9204
- "default": "var(--hx-font-family-sans)"
9310
+ "description": "Header text color.",
9311
+ "name": "--hx-data-table-header-color",
9312
+ "default": "var(--hx-color-neutral-700)"
9205
9313
  },
9206
9314
  {
9207
- "description": "Focus ring color.",
9208
- "name": "--hx-date-picker-focus-ring-color",
9209
- "default": "var(--hx-focus-ring-color)"
9315
+ "description": "Cell text color.",
9316
+ "name": "--hx-data-table-cell-color",
9317
+ "default": "var(--hx-color-neutral-900)"
9210
9318
  },
9211
9319
  {
9212
- "description": "Error state color.",
9213
- "name": "--hx-date-picker-error-color",
9214
- "default": "var(--hx-color-error-500)"
9320
+ "description": "Row border color.",
9321
+ "name": "--hx-data-table-border-color",
9322
+ "default": "var(--hx-color-neutral-200)"
9215
9323
  },
9216
9324
  {
9217
- "description": "Label text color.",
9218
- "name": "--hx-date-picker-label-color",
9219
- "default": "var(--hx-color-neutral-700)"
9325
+ "description": "Row hover background.",
9326
+ "name": "--hx-data-table-row-hover-bg",
9327
+ "default": "var(--hx-color-neutral-50)"
9220
9328
  },
9221
9329
  {
9222
- "description": "Trigger icon color.",
9223
- "name": "--hx-date-picker-trigger-color",
9224
- "default": "var(--hx-color-neutral-500)"
9330
+ "description": "Selected row background.",
9331
+ "name": "--hx-data-table-row-selected-bg",
9332
+ "default": "var(--hx-color-primary-50)"
9225
9333
  },
9226
9334
  {
9227
- "description": "Calendar background color.",
9228
- "name": "--hx-date-picker-calendar-bg",
9229
- "default": "var(--hx-color-neutral-0)"
9335
+ "description": "Empty state text color.",
9336
+ "name": "--hx-data-table-empty-color",
9337
+ "default": "var(--hx-color-neutral-600)"
9230
9338
  },
9231
9339
  {
9232
- "description": "Calendar border color.",
9233
- "name": "--hx-date-picker-calendar-border-color",
9234
- "default": "var(--hx-color-neutral-200)"
9340
+ "description": "Minimum table width before horizontal scrolling.",
9341
+ "name": "--hx-data-table-min-width",
9342
+ "default": "600px"
9235
9343
  },
9236
9344
  {
9237
- "description": "Calendar minimum width.",
9238
- "name": "--hx-date-picker-calendar-min-width",
9239
- "default": "18rem"
9345
+ "description": "CSS custom property.",
9346
+ "name": "--hx-data-table-font-family",
9347
+ "default": "var(--hx-font-family-sans)"
9240
9348
  },
9241
9349
  {
9242
- "description": "Selected day background.",
9243
- "name": "--hx-date-picker-selected-bg",
9244
- "default": "var(--hx-color-primary-500)"
9350
+ "description": "CSS custom property.",
9351
+ "name": "--hx-data-table-shimmer-duration",
9352
+ "default": "1.5s"
9245
9353
  },
9246
9354
  {
9247
- "description": "Selected day text color.",
9248
- "name": "--hx-date-picker-selected-color",
9249
- "default": "var(--hx-color-neutral-0)"
9355
+ "description": "Font family.",
9356
+ "name": "--hx-font-family-sans"
9250
9357
  },
9251
9358
  {
9252
- "description": "Today indicator color.",
9253
- "name": "--hx-date-picker-today-color",
9254
- "default": "var(--hx-color-primary-600)"
9359
+ "description": "Font size.",
9360
+ "name": "--hx-font-size-sm"
9255
9361
  },
9256
9362
  {
9257
- "description": "Calendar popup box shadow.",
9258
- "name": "--hx-date-picker-calendar-shadow",
9259
- "default": "0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -2px rgba(0,0,0,0.1)"
9363
+ "description": "Spacing token.",
9364
+ "name": "--hx-space-3"
9260
9365
  },
9261
9366
  {
9262
- "description": "Border radius.",
9263
- "name": "--hx-date-picker-calendar-border-radius",
9264
- "default": "var(--hx-border-radius-lg)"
9367
+ "description": "Spacing token.",
9368
+ "name": "--hx-space-4"
9265
9369
  },
9266
9370
  {
9267
- "description": "Background color.",
9268
- "name": "--hx-date-picker-selected-hover-bg",
9269
- "default": "var(--hx-color-primary-600)"
9371
+ "description": "Width.",
9372
+ "name": "--hx-border-width-thin"
9270
9373
  },
9271
9374
  {
9272
- "description": "Color.",
9273
- "name": "--hx-date-picker-trigger-hover-color",
9274
- "default": "var(--hx-color-neutral-700)"
9375
+ "description": "Font weight.",
9376
+ "name": "--hx-font-weight-semibold"
9275
9377
  },
9276
9378
  {
9277
- "description": "CSS custom property.",
9278
- "name": "--hx-border-radius-lg"
9379
+ "description": "Minimum touch target size.",
9380
+ "name": "--hx-touch-target-min"
9279
9381
  },
9280
9382
  {
9281
- "description": "CSS custom property.",
9282
- "name": "--hx-border-radius-md"
9383
+ "description": "Spacing token.",
9384
+ "name": "--hx-space-2"
9283
9385
  },
9284
9386
  {
9285
- "description": "CSS custom property.",
9286
- "name": "--hx-border-radius-sm"
9387
+ "description": "Spacing token.",
9388
+ "name": "--hx-space-1"
9287
9389
  },
9288
9390
  {
9289
9391
  "description": "Width.",
9290
- "name": "--hx-border-width-thin"
9291
- },
9292
- {
9293
- "description": "Color.",
9294
- "name": "--hx-color-error-500"
9392
+ "name": "--hx-focus-ring-width"
9295
9393
  },
9296
9394
  {
9297
9395
  "description": "Color.",
9298
- "name": "--hx-color-error-text"
9396
+ "name": "--hx-focus-ring-color"
9299
9397
  },
9300
9398
  {
9301
- "description": "Color.",
9302
- "name": "--hx-color-neutral-0"
9399
+ "description": "CSS custom property.",
9400
+ "name": "--hx-focus-ring-offset"
9303
9401
  },
9304
9402
  {
9305
- "description": "Color.",
9306
- "name": "--hx-color-neutral-100"
9403
+ "description": "CSS custom property.",
9404
+ "name": "--hx-border-radius-sm"
9307
9405
  },
9308
9406
  {
9309
- "description": "Color.",
9310
- "name": "--hx-color-neutral-200"
9407
+ "description": "Opacity.",
9408
+ "name": "--hx-opacity-25"
9311
9409
  },
9312
9410
  {
9313
- "description": "Color.",
9314
- "name": "--hx-color-neutral-300"
9411
+ "description": "Transition timing.",
9412
+ "name": "--hx-transition-fast"
9315
9413
  },
9316
9414
  {
9317
- "description": "Color.",
9318
- "name": "--hx-color-neutral-400"
9415
+ "description": "Opacity.",
9416
+ "name": "--hx-opacity-100"
9319
9417
  },
9320
9418
  {
9321
9419
  "description": "Color.",
9322
- "name": "--hx-color-neutral-500"
9420
+ "name": "--hx-color-primary-500"
9323
9421
  },
9324
9422
  {
9325
- "description": "Color.",
9326
- "name": "--hx-color-neutral-600"
9423
+ "description": "Size token.",
9424
+ "name": "--hx-size-4"
9327
9425
  },
9328
9426
  {
9329
9427
  "description": "Color.",
9330
- "name": "--hx-color-neutral-700"
9428
+ "name": "--hx-color-neutral-50"
9331
9429
  },
9332
9430
  {
9333
9431
  "description": "Color.",
9334
- "name": "--hx-color-neutral-800"
9432
+ "name": "--hx-color-neutral-200"
9335
9433
  },
9336
9434
  {
9337
9435
  "description": "Color.",
9338
- "name": "--hx-color-neutral-900"
9436
+ "name": "--hx-color-neutral-100"
9339
9437
  },
9340
9438
  {
9341
9439
  "description": "Color.",
9342
- "name": "--hx-color-primary-400"
9440
+ "name": "--hx-color-neutral-700"
9343
9441
  },
9344
9442
  {
9345
9443
  "description": "Color.",
9346
- "name": "--hx-color-primary-500"
9444
+ "name": "--hx-color-neutral-900"
9347
9445
  },
9348
9446
  {
9349
9447
  "description": "Color.",
9350
- "name": "--hx-color-primary-600"
9448
+ "name": "--hx-color-neutral-600"
9351
9449
  },
9352
9450
  {
9353
9451
  "description": "Color.",
9354
- "name": "--hx-focus-ring-color"
9355
- },
9356
- {
9357
- "description": "CSS custom property.",
9358
- "name": "--hx-focus-ring-opacity"
9359
- },
9360
- {
9361
- "description": "Width.",
9362
- "name": "--hx-focus-ring-width"
9363
- },
9364
- {
9365
- "description": "Font family.",
9366
- "name": "--hx-font-family-sans"
9367
- },
9368
- {
9369
- "description": "Font size.",
9370
- "name": "--hx-font-size-lg"
9371
- },
9372
- {
9373
- "description": "Font size.",
9374
- "name": "--hx-font-size-md"
9375
- },
9376
- {
9377
- "description": "Font size.",
9378
- "name": "--hx-font-size-sm"
9379
- },
9380
- {
9381
- "description": "Font size.",
9382
- "name": "--hx-font-size-xs"
9383
- },
9384
- {
9385
- "description": "Font weight.",
9386
- "name": "--hx-font-weight-bold"
9387
- },
9388
- {
9389
- "description": "Font weight.",
9390
- "name": "--hx-font-weight-medium"
9391
- },
9392
- {
9393
- "description": "Font weight.",
9394
- "name": "--hx-font-weight-semibold"
9395
- },
9396
- {
9397
- "description": "Line height.",
9398
- "name": "--hx-line-height-normal"
9452
+ "name": "--hx-color-primary-50"
9399
9453
  },
9400
9454
  {
9401
9455
  "description": "Opacity.",
9402
- "name": "--hx-opacity-disabled"
9403
- },
9404
- {
9405
- "description": "Box shadow.",
9406
- "name": "--hx-shadow-md"
9407
- },
9408
- {
9409
- "description": "Size token.",
9410
- "name": "--hx-size-10"
9411
- },
9412
- {
9413
- "description": "Size token.",
9414
- "name": "--hx-size-8"
9415
- },
9416
- {
9417
- "description": "Spacing token.",
9418
- "name": "--hx-space-1"
9419
- },
9420
- {
9421
- "description": "Spacing token.",
9422
- "name": "--hx-space-2"
9456
+ "name": "--hx-opacity-50"
9423
9457
  },
9424
9458
  {
9425
9459
  "description": "Spacing token.",
9426
- "name": "--hx-space-3"
9427
- },
9428
- {
9429
- "description": "Minimum touch target size.",
9430
- "name": "--hx-touch-target-min"
9431
- },
9432
- {
9433
- "description": "Transition timing.",
9434
- "name": "--hx-transition-fast"
9435
- },
9436
- {
9437
- "description": "Z-index layer.",
9438
- "name": "--hx-z-index-dropdown"
9460
+ "name": "--hx-space-8"
9439
9461
  }
9440
9462
  ],
9441
9463
  "cssParts": [
9442
9464
  {
9443
- "description": "The outer field container.",
9444
- "name": "field"
9445
- },
9446
- {
9447
- "description": "The label element.",
9448
- "name": "label"
9449
- },
9450
- {
9451
- "description": "The wrapper around input and trigger.",
9452
- "name": "input-wrapper"
9465
+ "description": "The `<table>` element.",
9466
+ "name": "table"
9453
9467
  },
9454
9468
  {
9455
- "description": "The readonly text input displaying the formatted date.",
9456
- "name": "input"
9469
+ "description": "The `<thead>` element.",
9470
+ "name": "thead"
9457
9471
  },
9458
9472
  {
9459
- "description": "The calendar icon button.",
9460
- "name": "trigger"
9473
+ "description": "The `<tbody>` element.",
9474
+ "name": "tbody"
9461
9475
  },
9462
9476
  {
9463
- "description": "The calendar popup dialog.",
9464
- "name": "calendar"
9477
+ "description": "Each `<tr>` element.",
9478
+ "name": "tr"
9465
9479
  },
9466
9480
  {
9467
- "description": "The month navigation header.",
9468
- "name": "month-nav"
9481
+ "description": "Each `<th>` element.",
9482
+ "name": "th"
9469
9483
  },
9470
9484
  {
9471
- "description": "An individual day button in the calendar grid.",
9472
- "name": "day"
9485
+ "description": "Each `<td>` element.",
9486
+ "name": "td"
9473
9487
  },
9474
9488
  {
9475
- "description": "The help text container.",
9476
- "name": "help-text"
9489
+ "description": "The sort indicator icon `<span>` inside sortable headers.",
9490
+ "name": "sort-icon"
9477
9491
  },
9478
9492
  {
9479
- "description": "The error message container.",
9480
- "name": "error"
9493
+ "description": "Each `<input type=\"checkbox\">` element.",
9494
+ "name": "checkbox"
9481
9495
  }
9482
9496
  ],
9483
9497
  "slots": [
9484
9498
  {
9485
- "description": "Custom label content (overrides the label property).",
9486
- "name": "label"
9499
+ "description": "Content rendered above the table (e.g., search, actions).",
9500
+ "name": "toolbar"
9487
9501
  },
9488
9502
  {
9489
- "description": "Custom help text content (overrides the helpText property).",
9490
- "name": "help-text"
9503
+ "description": "Custom empty-state content rendered when `rows` is empty and not loading.",
9504
+ "name": "empty"
9491
9505
  },
9492
9506
  {
9493
- "description": "Custom error content (overrides the error property).",
9494
- "name": "error"
9507
+ "description": "Custom loading content rendered when `loading` is true.",
9508
+ "name": "loading"
9495
9509
  }
9496
9510
  ],
9497
9511
  "members": [
9498
9512
  {
9499
9513
  "kind": "field",
9500
- "name": "name",
9501
- "type": {
9502
- "text": "string"
9503
- },
9504
- "default": "''",
9505
- "description": "The name of the field, used for form submission.",
9506
- "attribute": "name",
9507
- "reflects": true
9508
- },
9509
- {
9510
- "kind": "field",
9511
- "name": "value",
9514
+ "name": "columns",
9512
9515
  "type": {
9513
- "text": "string"
9516
+ "text": "HxDataTableColumn[]"
9514
9517
  },
9515
- "default": "''",
9516
- "description": "The current value as an ISO 8601 date string (e.g. 2026-03-04).",
9517
- "attribute": "value"
9518
+ "default": "[]",
9519
+ "description": "Column definitions. Each item: `{ key, label, sortable?, width? }`.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
9520
+ "attribute": "columns"
9518
9521
  },
9519
9522
  {
9520
9523
  "kind": "field",
9521
- "name": "min",
9524
+ "name": "rows",
9522
9525
  "type": {
9523
- "text": "string"
9526
+ "text": "Record<string, unknown>[]"
9524
9527
  },
9525
- "default": "''",
9526
- "description": "The minimum selectable date as an ISO 8601 string.",
9527
- "attribute": "min"
9528
+ "default": "[]",
9529
+ "description": "Row data. Each item is a plain object keyed by column `key` values.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
9530
+ "attribute": "rows"
9528
9531
  },
9529
9532
  {
9530
9533
  "kind": "field",
9531
- "name": "max",
9534
+ "name": "selectable",
9532
9535
  "type": {
9533
- "text": "string"
9536
+ "text": "boolean"
9534
9537
  },
9535
- "default": "''",
9536
- "description": "The maximum selectable date as an ISO 8601 string.",
9537
- "attribute": "max"
9538
+ "default": "false",
9539
+ "description": "When true, renders a checkbox column for row selection.",
9540
+ "attribute": "selectable",
9541
+ "reflects": true
9538
9542
  },
9539
9543
  {
9540
9544
  "kind": "field",
9541
- "name": "label",
9545
+ "name": "sortKey",
9542
9546
  "type": {
9543
9547
  "text": "string"
9544
9548
  },
9545
9549
  "default": "''",
9546
- "description": "The visible label text.",
9547
- "attribute": "label"
9550
+ "description": "The column key currently used for sorting.",
9551
+ "attribute": "sort-key"
9548
9552
  },
9549
9553
  {
9550
9554
  "kind": "field",
9551
- "name": "required",
9555
+ "name": "sortDirection",
9552
9556
  "type": {
9553
- "text": "boolean"
9557
+ "text": "'asc' | 'desc'"
9554
9558
  },
9555
- "default": "false",
9556
- "description": "Whether the field is required for form submission.",
9557
- "attribute": "required",
9558
- "reflects": true
9559
+ "default": "'asc'",
9560
+ "description": "Current sort direction.",
9561
+ "attribute": "sort-direction"
9559
9562
  },
9560
9563
  {
9561
9564
  "kind": "field",
9562
- "name": "disabled",
9565
+ "name": "loading",
9563
9566
  "type": {
9564
9567
  "text": "boolean"
9565
9568
  },
9566
9569
  "default": "false",
9567
- "description": "Whether the field is disabled.",
9568
- "attribute": "disabled",
9570
+ "description": "When true, renders a loading skeleton and sets `aria-busy=\"true\"` on the host.",
9571
+ "attribute": "loading",
9569
9572
  "reflects": true
9570
9573
  },
9571
9574
  {
9572
9575
  "kind": "field",
9573
- "name": "error",
9576
+ "name": "emptyLabel",
9574
9577
  "type": {
9575
9578
  "text": "string"
9576
9579
  },
9577
- "default": "''",
9578
- "description": "Error message to display. When set, the field enters an error state.",
9579
- "attribute": "error"
9580
+ "default": "'No data'",
9581
+ "description": "Text displayed in the default empty state when `rows` is empty and not loading.",
9582
+ "attribute": "empty-label"
9580
9583
  },
9581
9584
  {
9582
9585
  "kind": "field",
9583
- "name": "helpText",
9586
+ "name": "label",
9584
9587
  "type": {
9585
9588
  "text": "string"
9586
9589
  },
9587
9590
  "default": "''",
9588
- "description": "Help text displayed below the field for guidance.",
9589
- "attribute": "help-text"
9590
- },
9591
- {
9592
- "kind": "field",
9593
- "name": "format",
9594
- "type": {
9595
- "text": "string"
9596
- },
9597
- "default": "'MM/DD/YYYY'",
9598
- "description": "Display format hint shown as placeholder (e.g. MM/DD/YYYY).",
9599
- "attribute": "format"
9600
- },
9601
- {
9602
- "kind": "field",
9603
- "name": "locale",
9604
- "type": {
9605
- "text": "string"
9606
- },
9607
- "default": "'en-US'",
9608
- "description": "Locale string used for formatting the display value.",
9609
- "attribute": "locale"
9610
- },
9611
- {
9612
- "kind": "field",
9613
- "name": "requiredMessage",
9614
- "type": {
9615
- "text": "string"
9616
- },
9617
- "default": "'This field is required.'",
9618
- "description": "Validation message shown when the field is required but empty.",
9619
- "attribute": "required-message"
9620
- },
9621
- {
9622
- "kind": "field",
9623
- "name": "chooseDateLabel",
9624
- "type": {
9625
- "text": "string"
9626
- },
9627
- "default": "'Choose a date'",
9628
- "description": "Accessible label for the calendar dialog.",
9629
- "attribute": "choose-date-label"
9630
- },
9631
- {
9632
- "kind": "field",
9633
- "name": "openCalendarLabel",
9634
- "type": {
9635
- "text": "string"
9636
- },
9637
- "default": "'Open calendar'",
9638
- "description": "Accessible label for the calendar trigger button when the calendar is closed.",
9639
- "attribute": "open-calendar-label"
9640
- },
9641
- {
9642
- "kind": "field",
9643
- "name": "closeCalendarLabel",
9644
- "type": {
9645
- "text": "string"
9646
- },
9647
- "default": "'Close calendar'",
9648
- "description": "Accessible label for the calendar trigger button when the calendar is open.",
9649
- "attribute": "close-calendar-label"
9650
- },
9651
- {
9652
- "kind": "field",
9653
- "name": "previousMonthLabel",
9654
- "type": {
9655
- "text": "string"
9656
- },
9657
- "default": "'Previous month'",
9658
- "description": "Accessible label for the previous month navigation button.",
9659
- "attribute": "previous-month-label"
9591
+ "description": "Accessible name for the table. Exposed via `aria-label` on the `<table>` element.\nRequired when the table has columns — a missing label is a WCAG 4.1.2 violation.",
9592
+ "attribute": "label"
9660
9593
  },
9661
9594
  {
9662
9595
  "kind": "field",
9663
- "name": "nextMonthLabel",
9596
+ "name": "selectAllLabel",
9664
9597
  "type": {
9665
9598
  "text": "string"
9666
9599
  },
9667
- "default": "'Next month'",
9668
- "description": "Accessible label for the next month navigation button.",
9669
- "attribute": "next-month-label"
9600
+ "default": "'Select all rows'",
9601
+ "description": "Accessible label for the \"select all rows\" checkbox in the table header.",
9602
+ "attribute": "select-all-label"
9670
9603
  },
9671
9604
  {
9672
9605
  "kind": "field",
9673
- "name": "accessibleLabel",
9606
+ "name": "stickyHeader",
9674
9607
  "type": {
9675
- "text": "string | null"
9608
+ "text": "boolean"
9676
9609
  },
9677
- "default": "null",
9678
- "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.",
9679
- "attribute": "accessible-label"
9610
+ "default": "false",
9611
+ "description": "When true, the header row is sticky (position: sticky; top: 0).",
9612
+ "attribute": "sticky-header",
9613
+ "reflects": true
9680
9614
  },
9681
9615
  {
9682
9616
  "kind": "field",
9683
- "name": "_handleDocumentClick",
9684
- "privacy": "private",
9685
- "readonly": true
9686
- },
9687
- {
9688
- "kind": "method",
9689
- "name": "focus",
9690
- "return": {
9691
- "type": {
9692
- "text": "void"
9693
- }
9694
- },
9695
- "parameters": [
9696
- {
9697
- "name": "options",
9698
- "optional": true,
9699
- "type": {
9700
- "text": "FocusOptions"
9701
- }
9702
- }
9703
- ]
9704
- }
9705
- ],
9706
- "events": [
9707
- {
9708
- "name": "hx-change",
9709
- "type": {
9710
- "text": "CustomEvent<{value: string, date: Date | null}>"
9711
- },
9712
- "description": "Emitted when the selected date changes."
9713
- }
9714
- ],
9715
- "attributes": [
9716
- {
9717
- "name": "name",
9718
- "type": {
9719
- "text": "string"
9720
- },
9721
- "default": "''",
9722
- "description": "The name of the field, used for form submission.",
9723
- "fieldName": "name",
9724
- "attribute": "name"
9725
- },
9726
- {
9727
- "name": "value",
9617
+ "name": "page",
9728
9618
  "type": {
9729
- "text": "string"
9619
+ "text": "number"
9730
9620
  },
9731
- "default": "''",
9732
- "description": "The current value as an ISO 8601 date string (e.g. 2026-03-04).",
9733
- "fieldName": "value",
9734
- "attribute": "value"
9621
+ "default": "1",
9622
+ "description": "Current page (1-based). Set to 0 or leave at default (0) to disable pagination.",
9623
+ "attribute": "page"
9735
9624
  },
9736
9625
  {
9737
- "name": "min",
9626
+ "kind": "field",
9627
+ "name": "pageSize",
9738
9628
  "type": {
9739
- "text": "string"
9629
+ "text": "number"
9740
9630
  },
9741
- "default": "''",
9742
- "description": "The minimum selectable date as an ISO 8601 string.",
9743
- "fieldName": "min",
9744
- "attribute": "min"
9745
- },
9631
+ "default": "0",
9632
+ "description": "Number of rows per page. Set to 0 to disable pagination (show all rows).",
9633
+ "attribute": "page-size"
9634
+ }
9635
+ ],
9636
+ "events": [
9746
9637
  {
9747
- "name": "max",
9638
+ "name": "hx-sort",
9748
9639
  "type": {
9749
- "text": "string"
9640
+ "text": "CustomEvent<HxDataTableSortState>"
9750
9641
  },
9751
- "default": "''",
9752
- "description": "The maximum selectable date as an ISO 8601 string.",
9753
- "fieldName": "max",
9754
- "attribute": "max"
9642
+ "description": "Dispatched when a sortable column header is clicked."
9755
9643
  },
9756
9644
  {
9757
- "name": "label",
9645
+ "name": "hx-row-click",
9758
9646
  "type": {
9759
- "text": "string"
9647
+ "text": "CustomEvent<{row: Record<string, unknown>, index: number}>"
9760
9648
  },
9761
- "default": "''",
9762
- "description": "The visible label text.",
9763
- "fieldName": "label",
9764
- "attribute": "label"
9649
+ "description": "Dispatched when a data row is clicked."
9765
9650
  },
9766
9651
  {
9767
- "name": "required",
9652
+ "name": "hx-select",
9768
9653
  "type": {
9769
- "text": "boolean"
9654
+ "text": "CustomEvent<{selectedRows: Record<string, unknown>[]}>"
9770
9655
  },
9771
- "default": "false",
9772
- "description": "Whether the field is required for form submission.",
9773
- "fieldName": "required",
9774
- "attribute": "required"
9775
- },
9656
+ "description": "Dispatched when row selection changes."
9657
+ }
9658
+ ],
9659
+ "attributes": [
9776
9660
  {
9777
- "name": "disabled",
9661
+ "name": "columns",
9778
9662
  "type": {
9779
- "text": "boolean"
9663
+ "text": "HxDataTableColumn[]"
9780
9664
  },
9781
- "default": "false",
9782
- "description": "Whether the field is disabled.",
9783
- "fieldName": "disabled",
9784
- "attribute": "disabled"
9665
+ "default": "[]",
9666
+ "description": "Column definitions. Each item: `{ key, label, sortable?, width? }`.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
9667
+ "fieldName": "columns",
9668
+ "attribute": "columns"
9785
9669
  },
9786
9670
  {
9787
- "name": "error",
9671
+ "name": "rows",
9788
9672
  "type": {
9789
- "text": "string"
9673
+ "text": "Record<string, unknown>[]"
9790
9674
  },
9791
- "default": "''",
9792
- "description": "Error message to display. When set, the field enters an error state.",
9793
- "fieldName": "error",
9794
- "attribute": "error"
9675
+ "default": "[]",
9676
+ "description": "Row data. Each item is a plain object keyed by column `key` values.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
9677
+ "fieldName": "rows",
9678
+ "attribute": "rows"
9795
9679
  },
9796
9680
  {
9797
- "name": "help-text",
9681
+ "name": "selectable",
9798
9682
  "type": {
9799
- "text": "string"
9683
+ "text": "boolean"
9800
9684
  },
9801
- "default": "''",
9802
- "description": "Help text displayed below the field for guidance.",
9803
- "fieldName": "helpText",
9804
- "attribute": "help-text"
9685
+ "default": "false",
9686
+ "description": "When true, renders a checkbox column for row selection.",
9687
+ "fieldName": "selectable",
9688
+ "attribute": "selectable"
9805
9689
  },
9806
9690
  {
9807
- "name": "format",
9691
+ "name": "sort-key",
9808
9692
  "type": {
9809
9693
  "text": "string"
9810
9694
  },
9811
- "default": "'MM/DD/YYYY'",
9812
- "description": "Display format hint shown as placeholder (e.g. MM/DD/YYYY).",
9813
- "fieldName": "format",
9814
- "attribute": "format"
9695
+ "default": "''",
9696
+ "description": "The column key currently used for sorting.",
9697
+ "fieldName": "sortKey",
9698
+ "attribute": "sort-key"
9815
9699
  },
9816
9700
  {
9817
- "name": "locale",
9701
+ "name": "sort-direction",
9818
9702
  "type": {
9819
- "text": "string"
9703
+ "text": "'asc' | 'desc'"
9820
9704
  },
9821
- "default": "'en-US'",
9822
- "description": "Locale string used for formatting the display value.",
9823
- "fieldName": "locale",
9824
- "attribute": "locale"
9705
+ "default": "'asc'",
9706
+ "description": "Current sort direction.",
9707
+ "fieldName": "sortDirection",
9708
+ "attribute": "sort-direction"
9825
9709
  },
9826
9710
  {
9827
- "name": "required-message",
9711
+ "name": "loading",
9828
9712
  "type": {
9829
- "text": "string"
9713
+ "text": "boolean"
9830
9714
  },
9831
- "default": "'This field is required.'",
9832
- "description": "Validation message shown when the field is required but empty.",
9833
- "fieldName": "requiredMessage",
9834
- "attribute": "required-message"
9715
+ "default": "false",
9716
+ "description": "When true, renders a loading skeleton and sets `aria-busy=\"true\"` on the host.",
9717
+ "fieldName": "loading",
9718
+ "attribute": "loading"
9835
9719
  },
9836
9720
  {
9837
- "name": "choose-date-label",
9721
+ "name": "empty-label",
9838
9722
  "type": {
9839
9723
  "text": "string"
9840
9724
  },
9841
- "default": "'Choose a date'",
9842
- "description": "Accessible label for the calendar dialog.",
9843
- "fieldName": "chooseDateLabel",
9844
- "attribute": "choose-date-label"
9725
+ "default": "'No data'",
9726
+ "description": "Text displayed in the default empty state when `rows` is empty and not loading.",
9727
+ "fieldName": "emptyLabel",
9728
+ "attribute": "empty-label"
9845
9729
  },
9846
9730
  {
9847
- "name": "open-calendar-label",
9731
+ "name": "label",
9848
9732
  "type": {
9849
9733
  "text": "string"
9850
9734
  },
9851
- "default": "'Open calendar'",
9852
- "description": "Accessible label for the calendar trigger button when the calendar is closed.",
9853
- "fieldName": "openCalendarLabel",
9854
- "attribute": "open-calendar-label"
9735
+ "default": "''",
9736
+ "description": "Accessible name for the table. Exposed via `aria-label` on the `<table>` element.\nRequired when the table has columns — a missing label is a WCAG 4.1.2 violation.",
9737
+ "fieldName": "label",
9738
+ "attribute": "label"
9855
9739
  },
9856
9740
  {
9857
- "name": "close-calendar-label",
9741
+ "name": "select-all-label",
9858
9742
  "type": {
9859
9743
  "text": "string"
9860
9744
  },
9861
- "default": "'Close calendar'",
9862
- "description": "Accessible label for the calendar trigger button when the calendar is open.",
9863
- "fieldName": "closeCalendarLabel",
9864
- "attribute": "close-calendar-label"
9745
+ "default": "'Select all rows'",
9746
+ "description": "Accessible label for the \"select all rows\" checkbox in the table header.",
9747
+ "fieldName": "selectAllLabel",
9748
+ "attribute": "select-all-label"
9865
9749
  },
9866
9750
  {
9867
- "name": "previous-month-label",
9751
+ "name": "sticky-header",
9868
9752
  "type": {
9869
- "text": "string"
9753
+ "text": "boolean"
9870
9754
  },
9871
- "default": "'Previous month'",
9872
- "description": "Accessible label for the previous month navigation button.",
9873
- "fieldName": "previousMonthLabel",
9874
- "attribute": "previous-month-label"
9755
+ "default": "false",
9756
+ "description": "When true, the header row is sticky (position: sticky; top: 0).",
9757
+ "fieldName": "stickyHeader",
9758
+ "attribute": "sticky-header"
9875
9759
  },
9876
9760
  {
9877
- "name": "next-month-label",
9761
+ "name": "page",
9878
9762
  "type": {
9879
- "text": "string"
9763
+ "text": "number"
9880
9764
  },
9881
- "default": "'Next month'",
9882
- "description": "Accessible label for the next month navigation button.",
9883
- "fieldName": "nextMonthLabel",
9884
- "attribute": "next-month-label"
9765
+ "default": "1",
9766
+ "description": "Current page (1-based). Set to 0 or leave at default (0) to disable pagination.",
9767
+ "fieldName": "page",
9768
+ "attribute": "page"
9885
9769
  },
9886
9770
  {
9887
- "name": "accessible-label",
9771
+ "name": "page-size",
9888
9772
  "type": {
9889
- "text": "string | null"
9773
+ "text": "number"
9890
9774
  },
9891
- "default": "null",
9892
- "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.",
9893
- "fieldName": "accessibleLabel",
9894
- "attribute": "accessible-label"
9895
- }
9896
- ],
9897
- "mixins": [
9898
- {
9899
- "name": "FormMixin",
9900
- "module": "/src/mixins/FormMixin.js"
9775
+ "default": "0",
9776
+ "description": "Number of rows per page. Set to 0 to disable pagination (show all rows).",
9777
+ "fieldName": "pageSize",
9778
+ "attribute": "page-size"
9901
9779
  }
9902
9780
  ],
9903
9781
  "superclass": {
9904
9782
  "name": "HelixElement",
9905
9783
  "module": "/src/base/index.js"
9906
9784
  },
9907
- "tagName": "hx-date-picker",
9785
+ "tagName": "hx-data-table",
9908
9786
  "customElement": true,
9909
- "summary": "Form-associated date picker with calendar popup and WCAG 2.1 AA accessibility.",
9787
+ "summary": "Enterprise data table with sorting, selection, and responsive scroll.",
9910
9788
  "helixMeta": {
9911
- "priorityTier": "P0"
9789
+ "priorityTier": "P1"
9912
9790
  }
9913
9791
  }
9914
9792
  ],
9915
9793
  "exports": [
9916
9794
  {
9917
9795
  "kind": "js",
9918
- "name": "HelixDatePicker",
9796
+ "name": "HelixDataTable",
9919
9797
  "declaration": {
9920
- "name": "HelixDatePicker",
9921
- "module": "src/components/hx-date-picker/hx-date-picker.ts"
9798
+ "name": "HelixDataTable",
9799
+ "module": "src/components/hx-data-table/hx-data-table.ts"
9922
9800
  }
9923
9801
  },
9924
9802
  {
9925
9803
  "kind": "custom-element-definition",
9926
- "name": "hx-date-picker",
9804
+ "name": "hx-data-table",
9927
9805
  "declaration": {
9928
- "name": "HelixDatePicker",
9929
- "module": "src/components/hx-date-picker/hx-date-picker.ts"
9806
+ "name": "HelixDataTable",
9807
+ "module": "src/components/hx-data-table/hx-data-table.ts"
9930
9808
  }
9931
9809
  }
9932
9810
  ]
9933
9811
  },
9934
9812
  {
9935
9813
  "kind": "javascript-module",
9936
- "path": "src/components/hx-date-picker/index.ts",
9814
+ "path": "src/components/hx-data-table/index.ts",
9937
9815
  "declarations": [],
9938
9816
  "exports": [
9939
9817
  {
9940
9818
  "kind": "js",
9941
- "name": "HelixDatePicker",
9819
+ "name": "HelixDataTable",
9942
9820
  "declaration": {
9943
- "name": "HelixDatePicker",
9944
- "module": "./hx-date-picker.js"
9821
+ "name": "HelixDataTable",
9822
+ "module": "./hx-data-table.js"
9945
9823
  }
9946
9824
  },
9947
9825
  {
9948
9826
  "kind": "js",
9949
- "name": "HxDatePickerChangeDetail",
9827
+ "name": "HxDataTableColumn",
9950
9828
  "declaration": {
9951
- "name": "HxDatePickerChangeDetail",
9952
- "module": "./hx-date-picker.js"
9829
+ "name": "HxDataTableColumn",
9830
+ "module": "./hx-data-table.js"
9831
+ }
9832
+ },
9833
+ {
9834
+ "kind": "js",
9835
+ "name": "HxDataTableSortState",
9836
+ "declaration": {
9837
+ "name": "HxDataTableSortState",
9838
+ "module": "./hx-data-table.js"
9839
+ }
9840
+ },
9841
+ {
9842
+ "kind": "js",
9843
+ "name": "HxDataTableSelectDetail",
9844
+ "declaration": {
9845
+ "name": "HxDataTableSelectDetail",
9846
+ "module": "./hx-data-table.js"
9847
+ }
9848
+ },
9849
+ {
9850
+ "kind": "js",
9851
+ "name": "HxDataTableRowClickDetail",
9852
+ "declaration": {
9853
+ "name": "HxDataTableRowClickDetail",
9854
+ "module": "./hx-data-table.js"
9953
9855
  }
9954
9856
  }
9955
9857
  ]
9956
9858
  },
9957
9859
  {
9958
9860
  "kind": "javascript-module",
9959
- "path": "src/components/hx-data-table/hx-data-table.ts",
9861
+ "path": "src/components/hx-date-picker/hx-date-picker.ts",
9960
9862
  "declarations": [
9961
9863
  {
9962
9864
  "kind": "class",
9963
- "description": "An enterprise data table with sorting, row selection, and keyboard navigation.",
9964
- "name": "HelixDataTable",
9865
+ "description": "Date picker component for selecting dates with keyboard-accessible calendar popup.",
9866
+ "name": "HelixDatePicker",
9965
9867
  "cssProperties": [
9966
9868
  {
9967
- "description": "Header background color.",
9968
- "name": "--hx-data-table-header-bg",
9969
- "default": "var(--hx-color-neutral-50)"
9970
- },
9971
- {
9972
- "description": "Header text color.",
9973
- "name": "--hx-data-table-header-color",
9974
- "default": "var(--hx-color-neutral-700)"
9869
+ "description": "Input background color.",
9870
+ "name": "--hx-date-picker-bg",
9871
+ "default": "var(--hx-color-neutral-0)"
9975
9872
  },
9976
9873
  {
9977
- "description": "Cell text color.",
9978
- "name": "--hx-data-table-cell-color",
9979
- "default": "var(--hx-color-neutral-900)"
9874
+ "description": "Input text color.",
9875
+ "name": "--hx-date-picker-color",
9876
+ "default": "var(--hx-color-neutral-800)"
9980
9877
  },
9981
9878
  {
9982
- "description": "Row border color.",
9983
- "name": "--hx-data-table-border-color",
9984
- "default": "var(--hx-color-neutral-200)"
9879
+ "description": "Border color.",
9880
+ "name": "--hx-date-picker-border-color",
9881
+ "default": "var(--hx-color-neutral-300)"
9985
9882
  },
9986
9883
  {
9987
- "description": "Row hover background.",
9988
- "name": "--hx-data-table-row-hover-bg",
9989
- "default": "var(--hx-color-neutral-50)"
9884
+ "description": "Border radius.",
9885
+ "name": "--hx-date-picker-border-radius",
9886
+ "default": "var(--hx-border-radius-md)"
9990
9887
  },
9991
9888
  {
9992
- "description": "Selected row background.",
9993
- "name": "--hx-data-table-row-selected-bg",
9994
- "default": "var(--hx-color-primary-50)"
9889
+ "description": "Font family.",
9890
+ "name": "--hx-date-picker-font-family",
9891
+ "default": "var(--hx-font-family-sans)"
9995
9892
  },
9996
9893
  {
9997
- "description": "Empty state text color.",
9998
- "name": "--hx-data-table-empty-color",
9999
- "default": "var(--hx-color-neutral-600)"
9894
+ "description": "Focus ring color.",
9895
+ "name": "--hx-date-picker-focus-ring-color",
9896
+ "default": "var(--hx-focus-ring-color)"
10000
9897
  },
10001
9898
  {
10002
- "description": "Minimum table width before horizontal scrolling.",
10003
- "name": "--hx-data-table-min-width",
10004
- "default": "600px"
9899
+ "description": "Error state color.",
9900
+ "name": "--hx-date-picker-error-color",
9901
+ "default": "var(--hx-color-error-500)"
10005
9902
  },
10006
9903
  {
10007
- "description": "CSS custom property.",
10008
- "name": "--hx-data-table-font-family",
10009
- "default": "var(--hx-font-family-sans)"
9904
+ "description": "Label text color.",
9905
+ "name": "--hx-date-picker-label-color",
9906
+ "default": "var(--hx-color-neutral-700)"
10010
9907
  },
10011
9908
  {
10012
- "description": "CSS custom property.",
10013
- "name": "--hx-data-table-shimmer-duration",
10014
- "default": "1.5s"
9909
+ "description": "Trigger icon color.",
9910
+ "name": "--hx-date-picker-trigger-color",
9911
+ "default": "var(--hx-color-neutral-500)"
10015
9912
  },
10016
9913
  {
10017
- "description": "Font family.",
10018
- "name": "--hx-font-family-sans"
9914
+ "description": "Calendar background color.",
9915
+ "name": "--hx-date-picker-calendar-bg",
9916
+ "default": "var(--hx-color-neutral-0)"
10019
9917
  },
10020
9918
  {
10021
- "description": "Font size.",
10022
- "name": "--hx-font-size-sm"
9919
+ "description": "Calendar border color.",
9920
+ "name": "--hx-date-picker-calendar-border-color",
9921
+ "default": "var(--hx-color-neutral-200)"
10023
9922
  },
10024
9923
  {
10025
- "description": "Spacing token.",
10026
- "name": "--hx-space-3"
9924
+ "description": "Calendar minimum width.",
9925
+ "name": "--hx-date-picker-calendar-min-width",
9926
+ "default": "18rem"
10027
9927
  },
10028
9928
  {
10029
- "description": "Spacing token.",
10030
- "name": "--hx-space-4"
9929
+ "description": "Selected day background.",
9930
+ "name": "--hx-date-picker-selected-bg",
9931
+ "default": "var(--hx-color-primary-500)"
10031
9932
  },
10032
9933
  {
10033
- "description": "Width.",
10034
- "name": "--hx-border-width-thin"
9934
+ "description": "Selected day text color.",
9935
+ "name": "--hx-date-picker-selected-color",
9936
+ "default": "var(--hx-color-neutral-0)"
10035
9937
  },
10036
9938
  {
10037
- "description": "Font weight.",
10038
- "name": "--hx-font-weight-semibold"
9939
+ "description": "Today indicator color.",
9940
+ "name": "--hx-date-picker-today-color",
9941
+ "default": "var(--hx-color-primary-600)"
10039
9942
  },
10040
9943
  {
10041
- "description": "Minimum touch target size.",
10042
- "name": "--hx-touch-target-min"
9944
+ "description": "Calendar popup box shadow.",
9945
+ "name": "--hx-date-picker-calendar-shadow",
9946
+ "default": "0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -2px rgba(0,0,0,0.1)"
10043
9947
  },
10044
9948
  {
10045
- "description": "Spacing token.",
10046
- "name": "--hx-space-2"
9949
+ "description": "Border radius.",
9950
+ "name": "--hx-date-picker-calendar-border-radius",
9951
+ "default": "var(--hx-border-radius-lg)"
10047
9952
  },
10048
9953
  {
10049
- "description": "Spacing token.",
10050
- "name": "--hx-space-1"
9954
+ "description": "Background color.",
9955
+ "name": "--hx-date-picker-selected-hover-bg",
9956
+ "default": "var(--hx-color-primary-600)"
10051
9957
  },
10052
9958
  {
10053
- "description": "Width.",
10054
- "name": "--hx-focus-ring-width"
9959
+ "description": "Color.",
9960
+ "name": "--hx-date-picker-trigger-hover-color",
9961
+ "default": "var(--hx-color-neutral-700)"
10055
9962
  },
10056
9963
  {
10057
- "description": "Color.",
10058
- "name": "--hx-focus-ring-color"
9964
+ "description": "CSS custom property.",
9965
+ "name": "--hx-border-radius-lg"
10059
9966
  },
10060
9967
  {
10061
9968
  "description": "CSS custom property.",
10062
- "name": "--hx-focus-ring-offset"
9969
+ "name": "--hx-border-radius-md"
10063
9970
  },
10064
9971
  {
10065
9972
  "description": "CSS custom property.",
10066
9973
  "name": "--hx-border-radius-sm"
10067
9974
  },
10068
9975
  {
10069
- "description": "Opacity.",
10070
- "name": "--hx-opacity-25"
9976
+ "description": "Width.",
9977
+ "name": "--hx-border-width-thin"
10071
9978
  },
10072
9979
  {
10073
- "description": "Transition timing.",
10074
- "name": "--hx-transition-fast"
9980
+ "description": "Color.",
9981
+ "name": "--hx-color-error-500"
10075
9982
  },
10076
9983
  {
10077
- "description": "Opacity.",
10078
- "name": "--hx-opacity-100"
9984
+ "description": "Color.",
9985
+ "name": "--hx-color-error-text"
10079
9986
  },
10080
9987
  {
10081
9988
  "description": "Color.",
10082
- "name": "--hx-color-primary-500"
9989
+ "name": "--hx-color-neutral-0"
10083
9990
  },
10084
9991
  {
10085
- "description": "Size token.",
10086
- "name": "--hx-size-4"
9992
+ "description": "Color.",
9993
+ "name": "--hx-color-neutral-100"
10087
9994
  },
10088
9995
  {
10089
9996
  "description": "Color.",
10090
- "name": "--hx-color-neutral-50"
9997
+ "name": "--hx-color-neutral-200"
10091
9998
  },
10092
9999
  {
10093
10000
  "description": "Color.",
10094
- "name": "--hx-color-neutral-200"
10001
+ "name": "--hx-color-neutral-300"
10095
10002
  },
10096
10003
  {
10097
10004
  "description": "Color.",
10098
- "name": "--hx-color-neutral-100"
10005
+ "name": "--hx-color-neutral-400"
10006
+ },
10007
+ {
10008
+ "description": "Color.",
10009
+ "name": "--hx-color-neutral-500"
10010
+ },
10011
+ {
10012
+ "description": "Color.",
10013
+ "name": "--hx-color-neutral-600"
10099
10014
  },
10100
10015
  {
10101
10016
  "description": "Color.",
10102
10017
  "name": "--hx-color-neutral-700"
10103
10018
  },
10019
+ {
10020
+ "description": "Color.",
10021
+ "name": "--hx-color-neutral-800"
10022
+ },
10104
10023
  {
10105
10024
  "description": "Color.",
10106
10025
  "name": "--hx-color-neutral-900"
10107
10026
  },
10108
10027
  {
10109
10028
  "description": "Color.",
10110
- "name": "--hx-color-neutral-600"
10029
+ "name": "--hx-color-primary-400"
10111
10030
  },
10112
10031
  {
10113
10032
  "description": "Color.",
10114
- "name": "--hx-color-primary-50"
10033
+ "name": "--hx-color-primary-500"
10034
+ },
10035
+ {
10036
+ "description": "Color.",
10037
+ "name": "--hx-color-primary-600"
10038
+ },
10039
+ {
10040
+ "description": "Color.",
10041
+ "name": "--hx-focus-ring-color"
10042
+ },
10043
+ {
10044
+ "description": "CSS custom property.",
10045
+ "name": "--hx-focus-ring-opacity"
10046
+ },
10047
+ {
10048
+ "description": "Width.",
10049
+ "name": "--hx-focus-ring-width"
10050
+ },
10051
+ {
10052
+ "description": "Font family.",
10053
+ "name": "--hx-font-family-sans"
10054
+ },
10055
+ {
10056
+ "description": "Font size.",
10057
+ "name": "--hx-font-size-lg"
10058
+ },
10059
+ {
10060
+ "description": "Font size.",
10061
+ "name": "--hx-font-size-md"
10062
+ },
10063
+ {
10064
+ "description": "Font size.",
10065
+ "name": "--hx-font-size-sm"
10066
+ },
10067
+ {
10068
+ "description": "Font size.",
10069
+ "name": "--hx-font-size-xs"
10070
+ },
10071
+ {
10072
+ "description": "Font weight.",
10073
+ "name": "--hx-font-weight-bold"
10074
+ },
10075
+ {
10076
+ "description": "Font weight.",
10077
+ "name": "--hx-font-weight-medium"
10078
+ },
10079
+ {
10080
+ "description": "Font weight.",
10081
+ "name": "--hx-font-weight-semibold"
10082
+ },
10083
+ {
10084
+ "description": "Line height.",
10085
+ "name": "--hx-line-height-normal"
10115
10086
  },
10116
10087
  {
10117
10088
  "description": "Opacity.",
10118
- "name": "--hx-opacity-50"
10089
+ "name": "--hx-opacity-disabled"
10090
+ },
10091
+ {
10092
+ "description": "Box shadow.",
10093
+ "name": "--hx-shadow-md"
10094
+ },
10095
+ {
10096
+ "description": "Size token.",
10097
+ "name": "--hx-size-10"
10098
+ },
10099
+ {
10100
+ "description": "Size token.",
10101
+ "name": "--hx-size-8"
10119
10102
  },
10120
10103
  {
10121
10104
  "description": "Spacing token.",
10122
- "name": "--hx-space-8"
10105
+ "name": "--hx-space-1"
10106
+ },
10107
+ {
10108
+ "description": "Spacing token.",
10109
+ "name": "--hx-space-2"
10110
+ },
10111
+ {
10112
+ "description": "Spacing token.",
10113
+ "name": "--hx-space-3"
10114
+ },
10115
+ {
10116
+ "description": "Minimum touch target size.",
10117
+ "name": "--hx-touch-target-min"
10118
+ },
10119
+ {
10120
+ "description": "Transition timing.",
10121
+ "name": "--hx-transition-fast"
10122
+ },
10123
+ {
10124
+ "description": "Z-index layer.",
10125
+ "name": "--hx-z-index-dropdown"
10123
10126
  }
10124
10127
  ],
10125
10128
  "cssParts": [
10126
10129
  {
10127
- "description": "The `<table>` element.",
10128
- "name": "table"
10130
+ "description": "The outer field container.",
10131
+ "name": "field"
10129
10132
  },
10130
10133
  {
10131
- "description": "The `<thead>` element.",
10132
- "name": "thead"
10134
+ "description": "The label element.",
10135
+ "name": "label"
10133
10136
  },
10134
10137
  {
10135
- "description": "The `<tbody>` element.",
10136
- "name": "tbody"
10138
+ "description": "The wrapper around input and trigger.",
10139
+ "name": "input-wrapper"
10140
+ },
10141
+ {
10142
+ "description": "The readonly text input displaying the formatted date.",
10143
+ "name": "input"
10144
+ },
10145
+ {
10146
+ "description": "The calendar icon button.",
10147
+ "name": "trigger"
10137
10148
  },
10138
10149
  {
10139
- "description": "Each `<tr>` element.",
10140
- "name": "tr"
10150
+ "description": "The calendar popup dialog.",
10151
+ "name": "calendar"
10141
10152
  },
10142
10153
  {
10143
- "description": "Each `<th>` element.",
10144
- "name": "th"
10154
+ "description": "The month navigation header.",
10155
+ "name": "month-nav"
10145
10156
  },
10146
10157
  {
10147
- "description": "Each `<td>` element.",
10148
- "name": "td"
10158
+ "description": "An individual day button in the calendar grid.",
10159
+ "name": "day"
10149
10160
  },
10150
10161
  {
10151
- "description": "The sort indicator icon `<span>` inside sortable headers.",
10152
- "name": "sort-icon"
10162
+ "description": "The help text container.",
10163
+ "name": "help-text"
10153
10164
  },
10154
10165
  {
10155
- "description": "Each `<input type=\"checkbox\">` element.",
10156
- "name": "checkbox"
10166
+ "description": "The error message container.",
10167
+ "name": "error"
10157
10168
  }
10158
10169
  ],
10159
10170
  "slots": [
10160
10171
  {
10161
- "description": "Content rendered above the table (e.g., search, actions).",
10162
- "name": "toolbar"
10172
+ "description": "Custom label content (overrides the label property).",
10173
+ "name": "label"
10163
10174
  },
10164
10175
  {
10165
- "description": "Custom empty-state content rendered when `rows` is empty and not loading.",
10166
- "name": "empty"
10176
+ "description": "Custom help text content (overrides the helpText property).",
10177
+ "name": "help-text"
10167
10178
  },
10168
10179
  {
10169
- "description": "Custom loading content rendered when `loading` is true.",
10170
- "name": "loading"
10180
+ "description": "Custom error content (overrides the error property).",
10181
+ "name": "error"
10171
10182
  }
10172
10183
  ],
10173
10184
  "members": [
10174
10185
  {
10175
10186
  "kind": "field",
10176
- "name": "columns",
10187
+ "name": "name",
10177
10188
  "type": {
10178
- "text": "HxDataTableColumn[]"
10189
+ "text": "string"
10179
10190
  },
10180
- "default": "[]",
10181
- "description": "Column definitions. Each item: `{ key, label, sortable?, width? }`.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
10182
- "attribute": "columns"
10191
+ "default": "''",
10192
+ "description": "The name of the field, used for form submission.",
10193
+ "attribute": "name",
10194
+ "reflects": true
10183
10195
  },
10184
10196
  {
10185
10197
  "kind": "field",
10186
- "name": "rows",
10198
+ "name": "value",
10187
10199
  "type": {
10188
- "text": "Record<string, unknown>[]"
10200
+ "text": "string"
10189
10201
  },
10190
- "default": "[]",
10191
- "description": "Row data. Each item is a plain object keyed by column `key` values.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
10192
- "attribute": "rows"
10202
+ "default": "''",
10203
+ "description": "The current value as an ISO 8601 date string (e.g. 2026-03-04).",
10204
+ "attribute": "value"
10193
10205
  },
10194
10206
  {
10195
10207
  "kind": "field",
10196
- "name": "selectable",
10208
+ "name": "min",
10197
10209
  "type": {
10198
- "text": "boolean"
10210
+ "text": "string"
10199
10211
  },
10200
- "default": "false",
10201
- "description": "When true, renders a checkbox column for row selection.",
10202
- "attribute": "selectable",
10203
- "reflects": true
10212
+ "default": "''",
10213
+ "description": "The minimum selectable date as an ISO 8601 string.",
10214
+ "attribute": "min"
10204
10215
  },
10205
10216
  {
10206
10217
  "kind": "field",
10207
- "name": "sortKey",
10218
+ "name": "max",
10208
10219
  "type": {
10209
10220
  "text": "string"
10210
10221
  },
10211
10222
  "default": "''",
10212
- "description": "The column key currently used for sorting.",
10213
- "attribute": "sort-key"
10223
+ "description": "The maximum selectable date as an ISO 8601 string.",
10224
+ "attribute": "max"
10214
10225
  },
10215
10226
  {
10216
10227
  "kind": "field",
10217
- "name": "sortDirection",
10228
+ "name": "label",
10218
10229
  "type": {
10219
- "text": "'asc' | 'desc'"
10230
+ "text": "string"
10220
10231
  },
10221
- "default": "'asc'",
10222
- "description": "Current sort direction.",
10223
- "attribute": "sort-direction"
10232
+ "default": "''",
10233
+ "description": "The visible label text.",
10234
+ "attribute": "label"
10224
10235
  },
10225
10236
  {
10226
10237
  "kind": "field",
10227
- "name": "loading",
10238
+ "name": "required",
10228
10239
  "type": {
10229
10240
  "text": "boolean"
10230
10241
  },
10231
10242
  "default": "false",
10232
- "description": "When true, renders a loading skeleton and sets `aria-busy=\"true\"` on the host.",
10233
- "attribute": "loading",
10243
+ "description": "Whether the field is required for form submission.",
10244
+ "attribute": "required",
10234
10245
  "reflects": true
10235
10246
  },
10236
10247
  {
10237
10248
  "kind": "field",
10238
- "name": "emptyLabel",
10249
+ "name": "disabled",
10250
+ "type": {
10251
+ "text": "boolean"
10252
+ },
10253
+ "default": "false",
10254
+ "description": "Whether the field is disabled.",
10255
+ "attribute": "disabled",
10256
+ "reflects": true
10257
+ },
10258
+ {
10259
+ "kind": "field",
10260
+ "name": "error",
10239
10261
  "type": {
10240
10262
  "text": "string"
10241
10263
  },
10242
- "default": "'No data'",
10243
- "description": "Text displayed in the default empty state when `rows` is empty and not loading.",
10244
- "attribute": "empty-label"
10264
+ "default": "''",
10265
+ "description": "Error message to display. When set, the field enters an error state.",
10266
+ "attribute": "error"
10245
10267
  },
10246
10268
  {
10247
10269
  "kind": "field",
10248
- "name": "label",
10270
+ "name": "helpText",
10249
10271
  "type": {
10250
10272
  "text": "string"
10251
10273
  },
10252
10274
  "default": "''",
10253
- "description": "Accessible name for the table. Exposed via `aria-label` on the `<table>` element.\nRequired when the table has columns — a missing label is a WCAG 4.1.2 violation.",
10254
- "attribute": "label"
10275
+ "description": "Help text displayed below the field for guidance.",
10276
+ "attribute": "help-text"
10255
10277
  },
10256
10278
  {
10257
10279
  "kind": "field",
10258
- "name": "selectAllLabel",
10280
+ "name": "format",
10259
10281
  "type": {
10260
10282
  "text": "string"
10261
10283
  },
10262
- "default": "'Select all rows'",
10263
- "description": "Accessible label for the \"select all rows\" checkbox in the table header.",
10264
- "attribute": "select-all-label"
10284
+ "default": "'MM/DD/YYYY'",
10285
+ "description": "Display format hint shown as placeholder (e.g. MM/DD/YYYY).",
10286
+ "attribute": "format"
10265
10287
  },
10266
10288
  {
10267
10289
  "kind": "field",
10268
- "name": "stickyHeader",
10290
+ "name": "locale",
10269
10291
  "type": {
10270
- "text": "boolean"
10292
+ "text": "string"
10271
10293
  },
10272
- "default": "false",
10273
- "description": "When true, the header row is sticky (position: sticky; top: 0).",
10274
- "attribute": "sticky-header",
10275
- "reflects": true
10294
+ "default": "'en-US'",
10295
+ "description": "Locale string used for formatting the display value.",
10296
+ "attribute": "locale"
10276
10297
  },
10277
10298
  {
10278
10299
  "kind": "field",
10279
- "name": "page",
10300
+ "name": "requiredMessage",
10280
10301
  "type": {
10281
- "text": "number"
10302
+ "text": "string"
10282
10303
  },
10283
- "default": "1",
10284
- "description": "Current page (1-based). Set to 0 or leave at default (0) to disable pagination.",
10285
- "attribute": "page"
10304
+ "default": "'This field is required.'",
10305
+ "description": "Validation message shown when the field is required but empty.",
10306
+ "attribute": "required-message"
10307
+ },
10308
+ {
10309
+ "kind": "field",
10310
+ "name": "chooseDateLabel",
10311
+ "type": {
10312
+ "text": "string"
10313
+ },
10314
+ "default": "'Choose a date'",
10315
+ "description": "Accessible label for the calendar dialog.",
10316
+ "attribute": "choose-date-label"
10317
+ },
10318
+ {
10319
+ "kind": "field",
10320
+ "name": "openCalendarLabel",
10321
+ "type": {
10322
+ "text": "string"
10323
+ },
10324
+ "default": "'Open calendar'",
10325
+ "description": "Accessible label for the calendar trigger button when the calendar is closed.",
10326
+ "attribute": "open-calendar-label"
10327
+ },
10328
+ {
10329
+ "kind": "field",
10330
+ "name": "closeCalendarLabel",
10331
+ "type": {
10332
+ "text": "string"
10333
+ },
10334
+ "default": "'Close calendar'",
10335
+ "description": "Accessible label for the calendar trigger button when the calendar is open.",
10336
+ "attribute": "close-calendar-label"
10337
+ },
10338
+ {
10339
+ "kind": "field",
10340
+ "name": "previousMonthLabel",
10341
+ "type": {
10342
+ "text": "string"
10343
+ },
10344
+ "default": "'Previous month'",
10345
+ "description": "Accessible label for the previous month navigation button.",
10346
+ "attribute": "previous-month-label"
10347
+ },
10348
+ {
10349
+ "kind": "field",
10350
+ "name": "nextMonthLabel",
10351
+ "type": {
10352
+ "text": "string"
10353
+ },
10354
+ "default": "'Next month'",
10355
+ "description": "Accessible label for the next month navigation button.",
10356
+ "attribute": "next-month-label"
10357
+ },
10358
+ {
10359
+ "kind": "field",
10360
+ "name": "accessibleLabel",
10361
+ "type": {
10362
+ "text": "string | null"
10363
+ },
10364
+ "default": "null",
10365
+ "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.",
10366
+ "attribute": "accessible-label"
10367
+ },
10368
+ {
10369
+ "kind": "field",
10370
+ "name": "_handleDocumentClick",
10371
+ "privacy": "private",
10372
+ "readonly": true
10373
+ },
10374
+ {
10375
+ "kind": "method",
10376
+ "name": "focus",
10377
+ "return": {
10378
+ "type": {
10379
+ "text": "void"
10380
+ }
10381
+ },
10382
+ "parameters": [
10383
+ {
10384
+ "name": "options",
10385
+ "optional": true,
10386
+ "type": {
10387
+ "text": "FocusOptions"
10388
+ }
10389
+ }
10390
+ ]
10391
+ }
10392
+ ],
10393
+ "events": [
10394
+ {
10395
+ "name": "hx-change",
10396
+ "type": {
10397
+ "text": "CustomEvent<{value: string, date: Date | null}>"
10398
+ },
10399
+ "description": "Emitted when the selected date changes."
10400
+ }
10401
+ ],
10402
+ "attributes": [
10403
+ {
10404
+ "name": "name",
10405
+ "type": {
10406
+ "text": "string"
10407
+ },
10408
+ "default": "''",
10409
+ "description": "The name of the field, used for form submission.",
10410
+ "fieldName": "name",
10411
+ "attribute": "name"
10412
+ },
10413
+ {
10414
+ "name": "value",
10415
+ "type": {
10416
+ "text": "string"
10417
+ },
10418
+ "default": "''",
10419
+ "description": "The current value as an ISO 8601 date string (e.g. 2026-03-04).",
10420
+ "fieldName": "value",
10421
+ "attribute": "value"
10286
10422
  },
10287
10423
  {
10288
- "kind": "field",
10289
- "name": "pageSize",
10424
+ "name": "min",
10290
10425
  "type": {
10291
- "text": "number"
10426
+ "text": "string"
10292
10427
  },
10293
- "default": "0",
10294
- "description": "Number of rows per page. Set to 0 to disable pagination (show all rows).",
10295
- "attribute": "page-size"
10296
- }
10297
- ],
10298
- "events": [
10428
+ "default": "''",
10429
+ "description": "The minimum selectable date as an ISO 8601 string.",
10430
+ "fieldName": "min",
10431
+ "attribute": "min"
10432
+ },
10299
10433
  {
10300
- "name": "hx-sort",
10434
+ "name": "max",
10301
10435
  "type": {
10302
- "text": "CustomEvent<HxDataTableSortState>"
10436
+ "text": "string"
10303
10437
  },
10304
- "description": "Dispatched when a sortable column header is clicked."
10438
+ "default": "''",
10439
+ "description": "The maximum selectable date as an ISO 8601 string.",
10440
+ "fieldName": "max",
10441
+ "attribute": "max"
10305
10442
  },
10306
10443
  {
10307
- "name": "hx-row-click",
10444
+ "name": "label",
10308
10445
  "type": {
10309
- "text": "CustomEvent<{row: Record<string, unknown>, index: number}>"
10446
+ "text": "string"
10310
10447
  },
10311
- "description": "Dispatched when a data row is clicked."
10448
+ "default": "''",
10449
+ "description": "The visible label text.",
10450
+ "fieldName": "label",
10451
+ "attribute": "label"
10312
10452
  },
10313
10453
  {
10314
- "name": "hx-select",
10454
+ "name": "required",
10315
10455
  "type": {
10316
- "text": "CustomEvent<{selectedRows: Record<string, unknown>[]}>"
10456
+ "text": "boolean"
10317
10457
  },
10318
- "description": "Dispatched when row selection changes."
10319
- }
10320
- ],
10321
- "attributes": [
10458
+ "default": "false",
10459
+ "description": "Whether the field is required for form submission.",
10460
+ "fieldName": "required",
10461
+ "attribute": "required"
10462
+ },
10322
10463
  {
10323
- "name": "columns",
10464
+ "name": "disabled",
10324
10465
  "type": {
10325
- "text": "HxDataTableColumn[]"
10466
+ "text": "boolean"
10326
10467
  },
10327
- "default": "[]",
10328
- "description": "Column definitions. Each item: `{ key, label, sortable?, width? }`.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
10329
- "fieldName": "columns",
10330
- "attribute": "columns"
10468
+ "default": "false",
10469
+ "description": "Whether the field is disabled.",
10470
+ "fieldName": "disabled",
10471
+ "attribute": "disabled"
10331
10472
  },
10332
10473
  {
10333
- "name": "rows",
10474
+ "name": "error",
10334
10475
  "type": {
10335
- "text": "Record<string, unknown>[]"
10476
+ "text": "string"
10336
10477
  },
10337
- "default": "[]",
10338
- "description": "Row data. Each item is a plain object keyed by column `key` values.\nCan be set as a JS array or a JSON string (e.g., from a Drupal Twig attribute).",
10339
- "fieldName": "rows",
10340
- "attribute": "rows"
10478
+ "default": "''",
10479
+ "description": "Error message to display. When set, the field enters an error state.",
10480
+ "fieldName": "error",
10481
+ "attribute": "error"
10341
10482
  },
10342
10483
  {
10343
- "name": "selectable",
10484
+ "name": "help-text",
10344
10485
  "type": {
10345
- "text": "boolean"
10486
+ "text": "string"
10346
10487
  },
10347
- "default": "false",
10348
- "description": "When true, renders a checkbox column for row selection.",
10349
- "fieldName": "selectable",
10350
- "attribute": "selectable"
10488
+ "default": "''",
10489
+ "description": "Help text displayed below the field for guidance.",
10490
+ "fieldName": "helpText",
10491
+ "attribute": "help-text"
10351
10492
  },
10352
10493
  {
10353
- "name": "sort-key",
10494
+ "name": "format",
10354
10495
  "type": {
10355
10496
  "text": "string"
10356
10497
  },
10357
- "default": "''",
10358
- "description": "The column key currently used for sorting.",
10359
- "fieldName": "sortKey",
10360
- "attribute": "sort-key"
10498
+ "default": "'MM/DD/YYYY'",
10499
+ "description": "Display format hint shown as placeholder (e.g. MM/DD/YYYY).",
10500
+ "fieldName": "format",
10501
+ "attribute": "format"
10361
10502
  },
10362
10503
  {
10363
- "name": "sort-direction",
10504
+ "name": "locale",
10364
10505
  "type": {
10365
- "text": "'asc' | 'desc'"
10506
+ "text": "string"
10366
10507
  },
10367
- "default": "'asc'",
10368
- "description": "Current sort direction.",
10369
- "fieldName": "sortDirection",
10370
- "attribute": "sort-direction"
10508
+ "default": "'en-US'",
10509
+ "description": "Locale string used for formatting the display value.",
10510
+ "fieldName": "locale",
10511
+ "attribute": "locale"
10371
10512
  },
10372
10513
  {
10373
- "name": "loading",
10514
+ "name": "required-message",
10374
10515
  "type": {
10375
- "text": "boolean"
10516
+ "text": "string"
10376
10517
  },
10377
- "default": "false",
10378
- "description": "When true, renders a loading skeleton and sets `aria-busy=\"true\"` on the host.",
10379
- "fieldName": "loading",
10380
- "attribute": "loading"
10518
+ "default": "'This field is required.'",
10519
+ "description": "Validation message shown when the field is required but empty.",
10520
+ "fieldName": "requiredMessage",
10521
+ "attribute": "required-message"
10381
10522
  },
10382
10523
  {
10383
- "name": "empty-label",
10524
+ "name": "choose-date-label",
10384
10525
  "type": {
10385
10526
  "text": "string"
10386
10527
  },
10387
- "default": "'No data'",
10388
- "description": "Text displayed in the default empty state when `rows` is empty and not loading.",
10389
- "fieldName": "emptyLabel",
10390
- "attribute": "empty-label"
10528
+ "default": "'Choose a date'",
10529
+ "description": "Accessible label for the calendar dialog.",
10530
+ "fieldName": "chooseDateLabel",
10531
+ "attribute": "choose-date-label"
10391
10532
  },
10392
10533
  {
10393
- "name": "label",
10534
+ "name": "open-calendar-label",
10394
10535
  "type": {
10395
10536
  "text": "string"
10396
10537
  },
10397
- "default": "''",
10398
- "description": "Accessible name for the table. Exposed via `aria-label` on the `<table>` element.\nRequired when the table has columns — a missing label is a WCAG 4.1.2 violation.",
10399
- "fieldName": "label",
10400
- "attribute": "label"
10538
+ "default": "'Open calendar'",
10539
+ "description": "Accessible label for the calendar trigger button when the calendar is closed.",
10540
+ "fieldName": "openCalendarLabel",
10541
+ "attribute": "open-calendar-label"
10401
10542
  },
10402
10543
  {
10403
- "name": "select-all-label",
10544
+ "name": "close-calendar-label",
10404
10545
  "type": {
10405
10546
  "text": "string"
10406
10547
  },
10407
- "default": "'Select all rows'",
10408
- "description": "Accessible label for the \"select all rows\" checkbox in the table header.",
10409
- "fieldName": "selectAllLabel",
10410
- "attribute": "select-all-label"
10548
+ "default": "'Close calendar'",
10549
+ "description": "Accessible label for the calendar trigger button when the calendar is open.",
10550
+ "fieldName": "closeCalendarLabel",
10551
+ "attribute": "close-calendar-label"
10411
10552
  },
10412
10553
  {
10413
- "name": "sticky-header",
10554
+ "name": "previous-month-label",
10414
10555
  "type": {
10415
- "text": "boolean"
10556
+ "text": "string"
10416
10557
  },
10417
- "default": "false",
10418
- "description": "When true, the header row is sticky (position: sticky; top: 0).",
10419
- "fieldName": "stickyHeader",
10420
- "attribute": "sticky-header"
10558
+ "default": "'Previous month'",
10559
+ "description": "Accessible label for the previous month navigation button.",
10560
+ "fieldName": "previousMonthLabel",
10561
+ "attribute": "previous-month-label"
10421
10562
  },
10422
10563
  {
10423
- "name": "page",
10564
+ "name": "next-month-label",
10424
10565
  "type": {
10425
- "text": "number"
10566
+ "text": "string"
10426
10567
  },
10427
- "default": "1",
10428
- "description": "Current page (1-based). Set to 0 or leave at default (0) to disable pagination.",
10429
- "fieldName": "page",
10430
- "attribute": "page"
10568
+ "default": "'Next month'",
10569
+ "description": "Accessible label for the next month navigation button.",
10570
+ "fieldName": "nextMonthLabel",
10571
+ "attribute": "next-month-label"
10431
10572
  },
10432
10573
  {
10433
- "name": "page-size",
10574
+ "name": "accessible-label",
10434
10575
  "type": {
10435
- "text": "number"
10576
+ "text": "string | null"
10436
10577
  },
10437
- "default": "0",
10438
- "description": "Number of rows per page. Set to 0 to disable pagination (show all rows).",
10439
- "fieldName": "pageSize",
10440
- "attribute": "page-size"
10578
+ "default": "null",
10579
+ "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.",
10580
+ "fieldName": "accessibleLabel",
10581
+ "attribute": "accessible-label"
10582
+ }
10583
+ ],
10584
+ "mixins": [
10585
+ {
10586
+ "name": "FormMixin",
10587
+ "module": "/src/mixins/FormMixin.js"
10441
10588
  }
10442
10589
  ],
10443
10590
  "superclass": {
10444
10591
  "name": "HelixElement",
10445
10592
  "module": "/src/base/index.js"
10446
10593
  },
10447
- "tagName": "hx-data-table",
10594
+ "tagName": "hx-date-picker",
10448
10595
  "customElement": true,
10449
- "summary": "Enterprise data table with sorting, selection, and responsive scroll.",
10596
+ "summary": "Form-associated date picker with calendar popup and WCAG 2.1 AA accessibility.",
10450
10597
  "helixMeta": {
10451
- "priorityTier": "P1"
10598
+ "priorityTier": "P0"
10452
10599
  }
10453
10600
  }
10454
10601
  ],
10455
10602
  "exports": [
10456
10603
  {
10457
10604
  "kind": "js",
10458
- "name": "HelixDataTable",
10605
+ "name": "HelixDatePicker",
10459
10606
  "declaration": {
10460
- "name": "HelixDataTable",
10461
- "module": "src/components/hx-data-table/hx-data-table.ts"
10607
+ "name": "HelixDatePicker",
10608
+ "module": "src/components/hx-date-picker/hx-date-picker.ts"
10462
10609
  }
10463
10610
  },
10464
10611
  {
10465
10612
  "kind": "custom-element-definition",
10466
- "name": "hx-data-table",
10613
+ "name": "hx-date-picker",
10467
10614
  "declaration": {
10468
- "name": "HelixDataTable",
10469
- "module": "src/components/hx-data-table/hx-data-table.ts"
10615
+ "name": "HelixDatePicker",
10616
+ "module": "src/components/hx-date-picker/hx-date-picker.ts"
10470
10617
  }
10471
10618
  }
10472
10619
  ]
10473
10620
  },
10474
10621
  {
10475
10622
  "kind": "javascript-module",
10476
- "path": "src/components/hx-data-table/index.ts",
10623
+ "path": "src/components/hx-date-picker/index.ts",
10477
10624
  "declarations": [],
10478
10625
  "exports": [
10479
10626
  {
10480
10627
  "kind": "js",
10481
- "name": "HelixDataTable",
10482
- "declaration": {
10483
- "name": "HelixDataTable",
10484
- "module": "./hx-data-table.js"
10485
- }
10486
- },
10487
- {
10488
- "kind": "js",
10489
- "name": "HxDataTableColumn",
10490
- "declaration": {
10491
- "name": "HxDataTableColumn",
10492
- "module": "./hx-data-table.js"
10493
- }
10494
- },
10495
- {
10496
- "kind": "js",
10497
- "name": "HxDataTableSortState",
10498
- "declaration": {
10499
- "name": "HxDataTableSortState",
10500
- "module": "./hx-data-table.js"
10501
- }
10502
- },
10503
- {
10504
- "kind": "js",
10505
- "name": "HxDataTableSelectDetail",
10628
+ "name": "HelixDatePicker",
10506
10629
  "declaration": {
10507
- "name": "HxDataTableSelectDetail",
10508
- "module": "./hx-data-table.js"
10630
+ "name": "HelixDatePicker",
10631
+ "module": "./hx-date-picker.js"
10509
10632
  }
10510
10633
  },
10511
10634
  {
10512
10635
  "kind": "js",
10513
- "name": "HxDataTableRowClickDetail",
10636
+ "name": "HxDatePickerChangeDetail",
10514
10637
  "declaration": {
10515
- "name": "HxDataTableRowClickDetail",
10516
- "module": "./hx-data-table.js"
10638
+ "name": "HxDatePickerChangeDetail",
10639
+ "module": "./hx-date-picker.js"
10517
10640
  }
10518
10641
  }
10519
10642
  ]
@@ -10985,8 +11108,49 @@
10985
11108
  "tagName": "hx-dialog",
10986
11109
  "customElement": true,
10987
11110
  "summary": "Accessible dialog overlay for confirmations, forms, and detailed content.",
11111
+ "aaaCertified": true,
11112
+ "aaaCertifiedDate": "2026-05-08",
10988
11113
  "helixMeta": {
10989
- "priorityTier": "P0"
11114
+ "keyboardContract": {
11115
+ "dismiss": [
11116
+ "Escape"
11117
+ ],
11118
+ "trapFocus": "true"
11119
+ },
11120
+ "ariaPattern": "dialog",
11121
+ "ariaPatternSource": "https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/",
11122
+ "forcedColorsSupported": true,
11123
+ "stability": "stable",
11124
+ "since": "3.6.0",
11125
+ "formAssociated": false,
11126
+ "themeAware": true,
11127
+ "brandAware": true,
11128
+ "drupalSdcEligible": true,
11129
+ "reactWrapperStatus": "complete",
11130
+ "priorityTier": "P0",
11131
+ "phiHandles": false,
11132
+ "clinicalContext": "none",
11133
+ "aaa": {
11134
+ "certified": true,
11135
+ "certifiedDate": "2026-05-08",
11136
+ "criteria": [
11137
+ "1.4.6",
11138
+ "1.4.9",
11139
+ "2.1.3",
11140
+ "2.3.3",
11141
+ "2.4.12",
11142
+ "2.4.13",
11143
+ "2.5.5",
11144
+ "3.2.5",
11145
+ "3.3.6",
11146
+ "forced-colors",
11147
+ "apg-keyboard"
11148
+ ],
11149
+ "auditUrl": "src/components/hx-dialog/AAA-AUDIT.md"
11150
+ },
11151
+ "figma": {
11152
+ "componentName": "hx-dialog"
11153
+ }
10990
11154
  }
10991
11155
  }
10992
11156
  ],
@@ -30719,8 +30883,49 @@
30719
30883
  "tagName": "hx-text-input",
30720
30884
  "customElement": true,
30721
30885
  "summary": "Form-associated text input with built-in label, error, and help text.",
30886
+ "aaaCertified": true,
30887
+ "aaaCertifiedDate": "2026-05-08",
30722
30888
  "helixMeta": {
30723
- "priorityTier": "P0"
30889
+ "keyboardContract": {
30890
+ "activate": [
30891
+ "character-input"
30892
+ ],
30893
+ "disabledSuppresses": true
30894
+ },
30895
+ "ariaPattern": "textbox",
30896
+ "ariaPatternSource": "https://www.w3.org/TR/wai-aria-1.2/#textbox",
30897
+ "forcedColorsSupported": true,
30898
+ "stability": "stable",
30899
+ "since": "3.6.0",
30900
+ "formAssociated": true,
30901
+ "themeAware": true,
30902
+ "brandAware": true,
30903
+ "drupalSdcEligible": true,
30904
+ "reactWrapperStatus": "complete",
30905
+ "priorityTier": "P0",
30906
+ "phiHandles": false,
30907
+ "clinicalContext": "none",
30908
+ "aaa": {
30909
+ "certified": true,
30910
+ "certifiedDate": "2026-05-08",
30911
+ "criteria": [
30912
+ "1.4.6",
30913
+ "1.4.9",
30914
+ "2.1.3",
30915
+ "2.3.3",
30916
+ "2.4.12",
30917
+ "2.4.13",
30918
+ "2.5.5",
30919
+ "3.2.5",
30920
+ "3.3.6",
30921
+ "forced-colors",
30922
+ "apg-keyboard"
30923
+ ],
30924
+ "auditUrl": "src/components/hx-text-input/AAA-AUDIT.md"
30925
+ },
30926
+ "figma": {
30927
+ "componentName": "hx-text-input"
30928
+ }
30724
30929
  }
30725
30930
  }
30726
30931
  ],