@helixui/react 3.3.0 → 3.4.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 (108) hide show
  1. package/dist/components/HxAccordionItem/HxAccordionItem.d.ts +35 -0
  2. package/dist/components/HxAccordionItem/HxAccordionItem.d.ts.map +1 -1
  3. package/dist/components/HxColorPicker/types.d.ts +16 -1
  4. package/dist/components/HxColorPicker/types.d.ts.map +1 -1
  5. package/dist/components/HxCombobox/types.d.ts +1 -1
  6. package/dist/components/HxCombobox/types.d.ts.map +1 -1
  7. package/dist/components/HxDatePicker/types.d.ts +4 -0
  8. package/dist/components/HxDatePicker/types.d.ts.map +1 -1
  9. package/dist/components/HxDialog/HxDialog.d.ts +78 -0
  10. package/dist/components/HxDialog/HxDialog.d.ts.map +1 -1
  11. package/dist/components/HxDrawer/HxDrawer.d.ts +53 -0
  12. package/dist/components/HxDrawer/HxDrawer.d.ts.map +1 -1
  13. package/dist/components/HxDropdown/HxDropdown.d.ts +45 -0
  14. package/dist/components/HxDropdown/HxDropdown.d.ts.map +1 -1
  15. package/dist/components/HxField/HxField.d.ts +20 -0
  16. package/dist/components/HxField/HxField.d.ts.map +1 -1
  17. package/dist/components/HxIconButton/types.d.ts +5 -0
  18. package/dist/components/HxIconButton/types.d.ts.map +1 -1
  19. package/dist/components/HxLink/types.d.ts +4 -0
  20. package/dist/components/HxLink/types.d.ts.map +1 -1
  21. package/dist/components/HxList/HxList.d.ts +6 -0
  22. package/dist/components/HxList/HxList.d.ts.map +1 -1
  23. package/dist/components/HxListItem/HxListItem.d.ts +8 -0
  24. package/dist/components/HxListItem/HxListItem.d.ts.map +1 -1
  25. package/dist/components/HxMenu/HxMenu.d.ts +15 -0
  26. package/dist/components/HxMenu/HxMenu.d.ts.map +1 -1
  27. package/dist/components/HxMenu/types.d.ts +4 -2
  28. package/dist/components/HxMenu/types.d.ts.map +1 -1
  29. package/dist/components/HxMenuDivider/HxMenuDivider.d.ts +7 -0
  30. package/dist/components/HxMenuDivider/HxMenuDivider.d.ts.map +1 -1
  31. package/dist/components/HxMenuItem/HxMenuItem.d.ts +15 -1
  32. package/dist/components/HxMenuItem/HxMenuItem.d.ts.map +1 -1
  33. package/dist/components/HxMeter/HxMeter.d.ts +10 -0
  34. package/dist/components/HxMeter/HxMeter.d.ts.map +1 -1
  35. package/dist/components/HxOverflowMenu/HxOverflowMenu.d.ts +19 -0
  36. package/dist/components/HxOverflowMenu/HxOverflowMenu.d.ts.map +1 -1
  37. package/dist/components/HxOverflowMenu/types.d.ts +3 -1
  38. package/dist/components/HxOverflowMenu/types.d.ts.map +1 -1
  39. package/dist/components/HxPopover/HxPopover.d.ts +40 -0
  40. package/dist/components/HxPopover/HxPopover.d.ts.map +1 -1
  41. package/dist/components/HxProgressBar/HxProgressBar.d.ts +12 -0
  42. package/dist/components/HxProgressBar/HxProgressBar.d.ts.map +1 -1
  43. package/dist/components/HxSelect/HxSelect.d.ts +1 -0
  44. package/dist/components/HxSelect/HxSelect.d.ts.map +1 -1
  45. package/dist/components/HxSelect/index.js +1 -1
  46. package/dist/components/HxSelect/types.d.ts +2 -0
  47. package/dist/components/HxSelect/types.d.ts.map +1 -1
  48. package/dist/components/HxSplitButton/HxSplitButton.d.ts +21 -0
  49. package/dist/components/HxSplitButton/HxSplitButton.d.ts.map +1 -1
  50. package/dist/components/HxSplitButton/types.d.ts +0 -8
  51. package/dist/components/HxSplitButton/types.d.ts.map +1 -1
  52. package/dist/components/HxStat/HxStat.d.ts +7 -0
  53. package/dist/components/HxStat/HxStat.d.ts.map +1 -1
  54. package/dist/components/HxTab/HxTab.d.ts +10 -0
  55. package/dist/components/HxTab/HxTab.d.ts.map +1 -1
  56. package/dist/components/HxTabPanel/HxTabPanel.d.ts +6 -0
  57. package/dist/components/HxTabPanel/HxTabPanel.d.ts.map +1 -1
  58. package/dist/components/HxTabs/HxTabs.d.ts +10 -0
  59. package/dist/components/HxTabs/HxTabs.d.ts.map +1 -1
  60. package/dist/components/HxTabs/types.d.ts +10 -3
  61. package/dist/components/HxTabs/types.d.ts.map +1 -1
  62. package/dist/components/HxTd/HxTd.d.ts +5 -0
  63. package/dist/components/HxTd/HxTd.d.ts.map +1 -1
  64. package/dist/components/HxTd/types.d.ts +7 -3
  65. package/dist/components/HxTd/types.d.ts.map +1 -1
  66. package/dist/components/HxTh/HxTh.d.ts +6 -0
  67. package/dist/components/HxTh/HxTh.d.ts.map +1 -1
  68. package/dist/components/HxTimePicker/types.d.ts +4 -0
  69. package/dist/components/HxTimePicker/types.d.ts.map +1 -1
  70. package/dist/components/HxTooltip/HxTooltip.d.ts +31 -0
  71. package/dist/components/HxTooltip/HxTooltip.d.ts.map +1 -1
  72. package/dist/components/HxTr/HxTr.d.ts +8 -0
  73. package/dist/components/HxTr/HxTr.d.ts.map +1 -1
  74. package/dist/components/HxTreeItem/HxTreeItem.d.ts +21 -0
  75. package/dist/components/HxTreeItem/HxTreeItem.d.ts.map +1 -1
  76. package/dist/components/HxTreeView/HxTreeView.d.ts +14 -4
  77. package/dist/components/HxTreeView/HxTreeView.d.ts.map +1 -1
  78. package/dist/components/HxTreeView/types.d.ts +5 -2
  79. package/dist/components/HxTreeView/types.d.ts.map +1 -1
  80. package/dist/index.js +1 -1
  81. package/dist/shared/HxAccordionItem-C26EIvJG.js.map +1 -1
  82. package/dist/shared/HxDialog-DMF3crTa.js.map +1 -1
  83. package/dist/shared/HxDrawer-Y1QnaHrU.js.map +1 -1
  84. package/dist/shared/HxDropdown-DJiYTVXP.js.map +1 -1
  85. package/dist/shared/HxField-CbrmkDYu.js.map +1 -1
  86. package/dist/shared/HxList-B35ueWrO.js.map +1 -1
  87. package/dist/shared/HxListItem-DegXnlK0.js.map +1 -1
  88. package/dist/shared/HxMenu-B1tRT8Lm.js.map +1 -1
  89. package/dist/shared/HxMenuDivider-RE1AMxqi.js.map +1 -1
  90. package/dist/shared/HxMenuItem-CLdUUCJS.js.map +1 -1
  91. package/dist/shared/HxMeter-C3R4U7cD.js.map +1 -1
  92. package/dist/shared/HxOverflowMenu-CdTWx4X5.js.map +1 -1
  93. package/dist/shared/HxPopover-D0zfUXPF.js.map +1 -1
  94. package/dist/shared/HxProgressBar-FupceIzI.js.map +1 -1
  95. package/dist/shared/{HxSelect-BEm8srcF.js → HxSelect-BAt_veRr.js} +3 -2
  96. package/dist/shared/{HxSelect-BEm8srcF.js.map → HxSelect-BAt_veRr.js.map} +1 -1
  97. package/dist/shared/HxSplitButton-BVNWYaAl.js.map +1 -1
  98. package/dist/shared/HxStat-C_colBF2.js.map +1 -1
  99. package/dist/shared/HxTab-Dhb27BDp.js.map +1 -1
  100. package/dist/shared/HxTabPanel-CmFKupoK.js.map +1 -1
  101. package/dist/shared/HxTabs-DIIy0X3K.js.map +1 -1
  102. package/dist/shared/HxTd-l5ZrD1Ai.js.map +1 -1
  103. package/dist/shared/HxTh-Bo7R_MVI.js.map +1 -1
  104. package/dist/shared/HxTooltip-DD8Uc78f.js.map +1 -1
  105. package/dist/shared/HxTr-CjhQyD3e.js.map +1 -1
  106. package/dist/shared/HxTreeItem-B2_rGgy6.js.map +1 -1
  107. package/dist/shared/HxTreeView-BKbPPPhF.js.map +1 -1
  108. package/package.json +2 -2
@@ -14,7 +14,9 @@ export interface HxOverflowMenuProps {
14
14
  disabled?: boolean;
15
15
  /** Icon orientation: vertical (kebab ⋮) or horizontal (meatball ···). */
16
16
  icon?: 'vertical' | 'horizontal';
17
- /** Accessible label for the trigger button. */
17
+ /** Accessible label for the trigger button. Used as a fallback when no
18
+ consumer-supplied `aria-label` / `aria-labelledby` is present on the
19
+ host. Consumer host attributes win in the AccName 1.2 §4.3.1 cascade. */
18
20
  label?: string;
19
21
  /** Accessible label for the menu panel. Reflected as `label-menu`. */
20
22
  labelMenu?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxOverflowMenu/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,yEAAyE;IACzE,SAAS,CAAC,EACN,MAAM,GACN,KAAK,GACL,WAAW,GACX,SAAS,GACT,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,MAAM,GACN,YAAY,GACZ,UAAU,GACV,OAAO,GACP,aAAa,GACb,WAAW,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACjC,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxOverflowMenu/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,yEAAyE;IACzE,SAAS,CAAC,EACN,MAAM,GACN,KAAK,GACL,WAAW,GACX,SAAS,GACT,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,MAAM,GACN,YAAY,GACZ,UAAU,GACV,OAAO,GACP,aAAa,GACb,WAAW,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACjC;;0EAEsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
@@ -3,6 +3,46 @@ import { HxPopoverProps } from './types.js';
3
3
  export type { HxPopoverProps };
4
4
  /**
5
5
  * A popover that displays rich floating content attached to a trigger element.
6
+
7
+ ## Architecture Note: Host-Attribute Label Mirror (group-4 round-1)
8
+
9
+ Unlike modal dialogs (`hx-dialog` / `hx-drawer`) where the HOST is the
10
+ announced surface and `ElementInternals` projects consumer IDREFs across
11
+ the shadow boundary, `hx-popover`'s announced surface is the inner
12
+ `[part="body"]` element which carries `role="dialog"`. The host does not
13
+ claim a role — it is a structural wrapper around an anchor slot and a
14
+ separate floating panel.
15
+
16
+ IDL element references on `internals.ariaLabelledByElements` therefore
17
+ cannot help: AT walks the inner body's accessibility node, and IDL refs
18
+ declared on the host are not visible from a shadow-internal descendant
19
+ looking up. The viable cross-shadow path is the host-attribute mirror:
20
+
21
+ 1. The host observes `aria-label` / `aria-labelledby` mutations.
22
+ 2. On every sync, `aria-labelledby` IDREFs are resolved via
23
+ `resolveIdrefTokens` (composed-tree walk: host root → ancestor
24
+ shadow hosts → owner document) and **text-flattened** via
25
+ `flattenAccName` (AccName 1.2 §4.3.10 hidden-aware).
26
+ 3. The flattened name is written to the inner body's `aria-label`,
27
+ overriding the `label` property only when consumer naming is set.
28
+
29
+ Naming precedence (W3C AccName 1.2 §4.3.1):
30
+
31
+ 1. Host `aria-labelledby` (resolved IDREFs, text-flattened)
32
+ 2. Host `aria-label`
33
+ 3. `label` property
34
+ 4. Hard-coded literal `"Popover"` (last-resort accessible name)
35
+
36
+ The text-flatten approach forfeits live IDL-ref tracking (mutating a
37
+ referenced element's text re-fires through the shared root observer; see
38
+ `installAriaIdrefMirror`). `aria-controls` is intentionally omitted on
39
+ the trigger — the body lives in shadow DOM and consumer IDREFs cannot
40
+ resolve cross-root from light-DOM (axe-core flags this as a critical
41
+ violation if attempted; see line documenting this exception below).
42
+
43
+ Slotted label support (e.g. `<slot name="title">`) is deliberately NOT
44
+ added in this round — it would expand the public API surface and is
45
+ tracked as a follow-up enhancement.
6
46
  *
7
47
  * @example
8
48
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxPopover.d.ts","sourceRoot":"","sources":["../../../src/components/HxPopover/HxPopover.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS;;;;;EAWpB,CAAC;AAEH,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"HxPopover.d.ts","sourceRoot":"","sources":["../../../src/components/HxPopover/HxPopover.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,eAAO,MAAM,SAAS;;;;;EAWpB,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -3,6 +3,18 @@ import { HxProgressBarProps } from './types.js';
3
3
  export type { HxProgressBarProps };
4
4
  /**
5
5
  * A linear progress indicator for determinate and indeterminate states.
6
+
7
+ Group 7 host-canonical: `role="progressbar"` is mirrored onto the **host**
8
+ via `_internals.role` (cross-shadow IDREF wiring) AND kept on the inner
9
+ `[role="progressbar"]` track for legacy AT and consumer queries. This is
10
+ the hx-progress-ring dual-surface pattern (Group 7 gold-standard).
11
+ Consumer-supplied `aria-labelledby` / `aria-describedby` on the host
12
+ resolves through the shared IDREF mirror so cross-shadow naming reaches
13
+ the announced surface even when the labels live in another shadow tree.
14
+
15
+ The internal `aria-live="polite"` announcer for the "Complete" milestone
16
+ is preserved (`role="progressbar"` does NOT imply a live region — an
17
+ explicit live announcer is required for value-update announcements).
6
18
  *
7
19
  * @example
8
20
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxProgressBar.d.ts","sourceRoot":"","sources":["../../../src/components/HxProgressBar/HxProgressBar.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa;;EAQxB,CAAC;AAEH,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"HxProgressBar.d.ts","sourceRoot":"","sources":["../../../src/components/HxProgressBar/HxProgressBar.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,aAAa;;EAQxB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -17,6 +17,7 @@ cross-browser styling.
17
17
  */
18
18
  export declare const HxSelect: import('@lit/react').ReactWebComponent<HelixSelect, {
19
19
  onHxChange: string;
20
+ onInvalid: string;
20
21
  }>;
21
22
  export default HxSelect;
22
23
  //# sourceMappingURL=HxSelect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HxSelect.d.ts","sourceRoot":"","sources":["../../../src/components/HxSelect/HxSelect.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ;;EAQnB,CAAC;AAEH,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"HxSelect.d.ts","sourceRoot":"","sources":["../../../src/components/HxSelect/HxSelect.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ;;;EASnB,CAAC;AAEH,eAAe,QAAQ,CAAC"}
@@ -1,4 +1,4 @@
1
- import { H, H as H2 } from "../../shared/HxSelect-BEm8srcF.js";
1
+ import { H, H as H2 } from "../../shared/HxSelect-BAt_veRr.js";
2
2
  export {
3
3
  H as HxSelect,
4
4
  H2 as default
@@ -42,5 +42,7 @@ export interface HxSelectProps {
42
42
  labelNoOptions?: string;
43
43
  /** Dispatched when the selected option changes. */
44
44
  onHxChange?: (event: Event) => void;
45
+ /** Platform constraint-validation event fired when checkValidity() / reportValidity() determine the value is invalid (form-associated component contract via ElementInternals.setValidity). */
46
+ onInvalid?: (event: Event) => void;
45
47
  }
46
48
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxSelect/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;;;;;;;;4CAQwC;IACxC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxSelect/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;;;;;;;;4CAQwC;IACxC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,+LAA+L;IAC/L,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACpC"}
@@ -5,6 +5,27 @@ export type { HxSplitButtonProps };
5
5
  * A split button combining a primary action button with an attached dropdown
6
6
  menu for secondary actions. Implements the ARIA menu button pattern for
7
7
  full keyboard and screen reader support.
8
+
9
+ ## Architecture Note: Composite host with two interactive children (Group 5b)
10
+
11
+ The host wraps a primary `<button>`, a dropdown trigger `<button>`, and a
12
+ panel `<div role="menu">` — three ARIA-bearing surfaces that cannot all
13
+ collapse onto the host. Group 5b keeps role placement on the inner
14
+ elements (consistent with `hx-overflow-menu`). The host carries no role.
15
+
16
+ What Group 5b adds:
17
+ - **Host-attribute label mirror** via `installAriaIdrefMirror`: consumer
18
+ `aria-label` / `aria-labelledby` on the host flow to the inner primary
19
+ button's `aria-label`. Replaces the legacy `accessible-label` shim,
20
+ which was a workaround for ARIAMixin shadowing on the host. The shim
21
+ is preserved with a one-time devWarn for one minor version of back-
22
+ compat; new code should use the standard `aria-label` attribute.
23
+ - **Roving tabindex** on slotted `hx-menu-item` children inside the
24
+ panel. Only the focused item carries `tabindex=0`; arrow key
25
+ navigation rewrites the tabindex map via `_applyRovingTabIndex()`.
26
+ `setRovingTabIndex` is the same setter used by `hx-menu` for cross-
27
+ family pattern alignment.
28
+ - **First-character typeahead** with 500ms timeout matching `hx-menu`.
8
29
  *
9
30
  * @example
10
31
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxSplitButton.d.ts","sourceRoot":"","sources":["../../../src/components/HxSplitButton/HxSplitButton.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa;;;EASxB,CAAC;AAEH,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"HxSplitButton.d.ts","sourceRoot":"","sources":["../../../src/components/HxSplitButton/HxSplitButton.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,aAAa;;;EASxB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -15,14 +15,6 @@ export interface HxSplitButtonProps {
15
15
  disabled?: boolean;
16
16
  /** Primary button label text. When set, overrides the default slot content. */
17
17
  label?: string | undefined;
18
- /** Accessible label for the primary action button. Required for icon-only usage
19
- or when the button label alone is insufficient context.
20
- Uses `accessible-label` attribute instead of `aria-label` to avoid
21
- ARIAMixin shadowing on the host element.
22
-
23
- Note: `mixinDelegatesAria` is not applied to this component because the
24
- `accessible-label` attribute approach avoids the ARIAMixin property conflict
25
- without requiring mixin overhead. */
26
18
  accessibleLabel?: string;
27
19
  /** Accessible label for the dropdown trigger button. Override for localization. */
28
20
  labelTrigger?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxSplitButton/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IAChF,gCAAgC;IAChC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;4CACwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;;;;sCAOkC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxSplitButton/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IAChF,gCAAgC;IAChC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;4CACwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
@@ -3,6 +3,13 @@ import { HxStatProps } from './types.js';
3
3
  export type { HxStatProps };
4
4
  /**
5
5
  * A static stat display component for presenting key metrics in a healthcare dashboard.
6
+
7
+ Group 7 host-canonical: `role="group"` lives on the **host** via
8
+ `_internals.role`. The host carries the resolved accessible name so AT
9
+ walks `<hx-stat>` (role=group, label="value: label") directly. The
10
+ internal `aria-live="polite"` announcer remains in the shadow tree —
11
+ `role="group"` does NOT imply a live region, so the announcer is required
12
+ for value/label/trend update announcements.
6
13
  *
7
14
  * @example
8
15
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxStat.d.ts","sourceRoot":"","sources":["../../../src/components/HxStat/HxStat.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,uDAMjB,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"HxStat.d.ts","sourceRoot":"","sources":["../../../src/components/HxStat/HxStat.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,MAAM,uDAMjB,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -4,6 +4,16 @@ export type { HxTabProps };
4
4
  /**
5
5
  * An individual tab button, designed to be used inside an `<hx-tabs>` container.
6
6
  Must be placed in the `tab` named slot of `<hx-tabs>`.
7
+
8
+ Group 5a host-canonical: `role="tab"` lives on the **host** via
9
+ `_internals.role`. The host is the focusable surface (carries the roving
10
+ tabindex); the inner `<button>` retains click activation semantics
11
+ (Enter/Space and pointer events) but is no longer the AT-announced surface
12
+ — its role and ARIA state are stripped on the modern path so the host's
13
+ canonical surface wins. `internals.ariaSelected`, `ariaDisabled`, and
14
+ `ariaControlsElements` mirror reactive state. The host `aria-label` /
15
+ `aria-labelledby` resolved via the shared IDREF mirror name the tab
16
+ cross-shadow.
7
17
  *
8
18
  * @example
9
19
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTab.d.ts","sourceRoot":"","sources":["../../../src/components/HxTab/HxTab.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK,sDAMhB,CAAC;AAEH,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"HxTab.d.ts","sourceRoot":"","sources":["../../../src/components/HxTab/HxTab.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,KAAK,sDAMhB,CAAC;AAEH,eAAe,KAAK,CAAC"}
@@ -3,6 +3,12 @@ import { HxTabPanelProps } from './types.js';
3
3
  export type { HxTabPanelProps };
4
4
  /**
5
5
  * A content panel associated with an `<hx-tab>`, managed by a parent `<hx-tabs>`.
6
+ Group 5a host-canonical: `role="tabpanel"` lives on the host via
7
+ `_internals.role`. The host carries the canonical AT surface — consumer
8
+ `aria-labelledby` / `aria-describedby` on the host resolve through the
9
+ shared IDREF mirror. The parent `hx-tabs` writes `internals.ariaLabelledByElements`
10
+ referencing the corresponding `<hx-tab>` host so cross-shadow naming works
11
+ via IDL element references (the modern path) without serializing tab text.
6
12
  *
7
13
  * @example
8
14
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTabPanel.d.ts","sourceRoot":"","sources":["../../../src/components/HxTabPanel/HxTabPanel.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,2DAMrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"HxTabPanel.d.ts","sourceRoot":"","sources":["../../../src/components/HxTabPanel/HxTabPanel.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,UAAU,2DAMrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -5,6 +5,16 @@ export type { HxTabsProps };
5
5
  * A tabbed content organizer that manages a set of `<hx-tab>` and `<hx-tab-panel>` children.
6
6
  Supports horizontal and vertical orientations, automatic and manual activation modes,
7
7
  and full keyboard navigation per the ARIA Authoring Practices Guide.
8
+
9
+ Group 5a host-canonical: `role="tablist"` lives on the host via
10
+ `_internals.role`. `aria-orientation`, `aria-label`, and consumer
11
+ `aria-labelledby` resolve through the host. Per-tab `role="tab"` and
12
+ per-panel `role="tabpanel"` likewise live on their respective hosts.
13
+
14
+ Activation defaults to **manual** per healthcare patterns — keyboard arrow
15
+ keys move focus only; Enter/Space activates. APG explicitly allows both
16
+ automatic and manual activation; manual is safer when panels are heavy or
17
+ announce changes via live regions.
8
18
  *
9
19
  * @example
10
20
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTabs.d.ts","sourceRoot":"","sources":["../../../src/components/HxTabs/HxTabs.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM;;EAQjB,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"HxTabs.d.ts","sourceRoot":"","sources":["../../../src/components/HxTabs/HxTabs.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,MAAM;;EAQjB,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -10,10 +10,17 @@ export interface HxTabsProps {
10
10
  orientation?: 'horizontal' | 'vertical';
11
11
  /** Controls how keyboard navigation activates tabs.
12
12
  In `automatic` mode, focus also activates the tab.
13
- In `manual` mode, focus moves independently; Space or Enter activates. */
13
+ In `manual` mode, focus moves independently; Space or Enter activates.
14
+
15
+ Group 5a default: `manual` — safer for healthcare patterns where panel
16
+ content may be heavy or announce updates via live regions. APG explicitly
17
+ allows both modes; manual avoids disorienting auto-activation when users
18
+ scan tabs with arrow keys. */
14
19
  activation?: 'manual' | 'automatic';
15
- /** Accessible label for the tablist. Rendered as `aria-label` on the tablist container.
16
- Provide a brief description of what the tabs represent (e.g., "Patient record sections"). */
20
+ /** Accessible label for the tablist. Drives the host `internals.ariaLabel`.
21
+ Provide a brief description of what the tabs represent (e.g., "Patient
22
+ record sections"). Consumer `aria-label` / `aria-labelledby` on the host
23
+ override this property when present. */
17
24
  label?: string;
18
25
  /** Gets or sets the zero-based index of the currently selected tab.
19
26
  Setting this programmatically activates the tab at the given index.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTabs/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC;;2EAEuE;IACvE,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACpC;8FAC0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;gDAG4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTabs/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC;;;;;;;+BAO2B;IAC3B,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACpC;;;yCAGqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;gDAG4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC"}
@@ -3,6 +3,11 @@ import { HxTdProps } from './types.js';
3
3
  export type { HxTdProps };
4
4
  /**
5
5
  * Semantic table data cell. Must be a child of `hx-tr`.
6
+
7
+ Group 7 host-canonical: `role="cell"` lives on the **host** via
8
+ `_internals.role`. The host carries the cell's accessible name (resolved
9
+ from the `label` property — fixing audit B-A1, where mobile screen reader
10
+ users lost column context because `data-label` was visual-only).
6
11
  *
7
12
  * @example
8
13
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTd.d.ts","sourceRoot":"","sources":["../../../src/components/HxTd/HxTd.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,4DAMf,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"HxTd.d.ts","sourceRoot":"","sources":["../../../src/components/HxTd/HxTd.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,IAAI,4DAMf,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -12,9 +12,13 @@ export interface HxTdProps {
12
12
  colspan?: number;
13
13
  /** Number of rows this cell spans. */
14
14
  rowspan?: number;
15
- /** Column header label for this cell. Forwarded as `data-label` on the native `<td>` for
16
- the mobile card layout (`td::before { content: attr(data-label) }`) and as `aria-label`
17
- so screen readers identify the column when the header row is hidden. */
15
+ /** Column header label for this cell. Forwarded as `data-label` on the native
16
+ `<td>` for the mobile card layout (`td::before { content: attr(data-label) }`)
17
+ AND projected to `aria-label` so screen readers identify the column when
18
+ the header row is hidden via the mobile breakpoint. Group 7 audit B-A1
19
+ fix: prior to migration, the JSDoc claimed aria-label projection but the
20
+ implementation only set `data-label` — `::before { content: attr(...) }`
21
+ is not reliably announced by VoiceOver / NVDA across versions. */
18
22
  label?: string;
19
23
  }
20
24
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTd/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;yEAEqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTd/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;mEAM+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -4,6 +4,12 @@ export type { HxThProps };
4
4
  /**
5
5
  * Semantic table header cell. Must be a child of `hx-tr`.
6
6
  Supports sortable columns with accessible sort state.
7
+
8
+ Group 7 host-canonical: `role="columnheader"` lives on the **host** via
9
+ `_internals.role`. The host carries `aria-sort` reflecting the current
10
+ sort direction (when `sortable` is true). The sort `<button>` aria-label
11
+ incorporates the slotted column text so AT users hear "Sort by Patient
12
+ name, currently sorted ascending" rather than just "Sort ascending".
7
13
  *
8
14
  * @example
9
15
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTh.d.ts","sourceRoot":"","sources":["../../../src/components/HxTh/HxTh.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI;;EAQf,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"HxTh.d.ts","sourceRoot":"","sources":["../../../src/components/HxTh/HxTh.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,IAAI;;EAQf,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -26,6 +26,10 @@ export interface HxTimePickerProps {
26
26
  error?: string;
27
27
  /** Display format for the time input. '12h' shows AM/PM; '24h' is bare HH:MM. */
28
28
  format?: '12h' | '24h';
29
+ /** Accessible name for screen readers, if different from the visible label.
30
+ Uses `accessible-label` attribute instead of `aria-label` to avoid
31
+ ARIAMixin shadowing on the host element. Highest-precedence naming source. */
32
+ accessibleLabel?: string | null;
29
33
  /** Dispatched when the selected time changes. Detail value is HH:MM (24h). */
30
34
  onHxChange?: (event: Event) => void;
31
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTimePicker/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAGvB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTimePicker/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB;;+EAE2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGhC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
@@ -3,6 +3,37 @@ import { HxTooltipProps } from './types.js';
3
3
  export type { HxTooltipProps };
4
4
  /**
5
5
  * A tooltip that displays contextual help text on hover or focus.
6
+
7
+ ## Architecture Note: Light-DOM Description Shim (group-4 round-1)
8
+
9
+ `aria-describedby` IDREFs cannot resolve across the Shadow DOM boundary —
10
+ the trigger lives in the consumer's light DOM and references a tooltip
11
+ whose body is in this component's shadow root. The tooltip text must
12
+ therefore be exposed in DOCUMENT scope.
13
+
14
+ The shim is a single visually-hidden `<span>` appended to `document.body`
15
+ with the `_tooltipId` as its `id`. The trigger's `aria-describedby` points
16
+ at this span. The text content is mirrored from the slotted `content`
17
+ slot on every relevant signal:
18
+
19
+ 1. `firstUpdated` (initial wiring)
20
+ 2. `slotchange` on the default slot AND the `content` slot (the slotted
21
+ element list changes)
22
+ 3. **Text-content mutations on the assigned `content` slot elements**
23
+ (round-23 P2 pattern). Without this observer a framework that
24
+ rewrites the slotted `<span slot="content">` `textContent` IN PLACE
25
+ (Vue / React keyed text rerender) would leave the shim stale.
26
+
27
+ Cleanup: `disconnectedCallback` removes the shim from `document.body`,
28
+ disconnects the slot-text observer, and clears the timers. SSR is
29
+ sidestepped by guarding `document` access — the shim is created lazily
30
+ the first time `_setupTriggerAria()` runs in a browser environment.
31
+
32
+ `role="tooltip"` is the correct APG role and is NEVER promoted to
33
+ `role="dialog"` — APG explicitly forbids tooltips from holding focus and
34
+ the tooltip body is not a focus target. No host-canonical `_internals`
35
+ work is owed: the trigger is the announced surface, and it correctly
36
+ references the tooltip via `aria-describedby`.
6
37
  *
7
38
  * @example
8
39
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/HxTooltip/HxTooltip.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,0DAMpB,CAAC;AAEH,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"HxTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/HxTooltip/HxTooltip.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,SAAS,0DAMpB,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -4,6 +4,14 @@ export type { HxTrProps };
4
4
  /**
5
5
  * Semantic table row. Must be a child of `hx-thead`, `hx-tbody`, or `hx-tfoot`.
6
6
  Contains `hx-th` or `hx-td` cells.
7
+
8
+ Group 7 host-canonical: `role="row"` lives on the **host** via
9
+ `_internals.role`. The host carries `aria-selected` / `aria-disabled`
10
+ mirroring `selected` / `disabled` reflected attributes. Consumer-supplied
11
+ `aria-label` / `aria-labelledby` on the host project to the host's
12
+ announced surface so AT walks `<hx-tr>` (role=row) directly. Fallback
13
+ path keeps the inner `<tr role="row">` as the announced surface for
14
+ engines without IDL element references.
7
15
  *
8
16
  * @example
9
17
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTr.d.ts","sourceRoot":"","sources":["../../../src/components/HxTr/HxTr.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI,2DAMf,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"HxTr.d.ts","sourceRoot":"","sources":["../../../src/components/HxTr/HxTr.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,IAAI,2DAMf,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -4,6 +4,27 @@ export type { HxTreeItemProps };
4
4
  /**
5
5
  * A tree item used within an hx-tree-view component.
6
6
  Supports expand/collapse, selection, keyboard navigation, and icon/children slots.
7
+
8
+ Group 5c host-canonical: `role="treeitem"` lives on the **host** via
9
+ `_internals.role`. The roving tabindex is written to the host on the
10
+ modern path so the host is the focusable surface and lands directly
11
+ under the parent `<hx-tree-view>` (which carries `role="tree"`) in the
12
+ AT-walked tree. The inner `.item-row` is presentational on the modern
13
+ path — no role, no aria-* attributes — and carries only click/keyboard
14
+ event handlers. Keyboard activation (Enter/Space) and expand/collapse
15
+ (ArrowLeft/Right at the leaf level) are owned by the host's `keydown`
16
+ handler; ArrowUp/Down/Home/End and typeahead bubble to the parent
17
+ `<hx-tree-view>` for navigation.
18
+
19
+ The nested `[role="group"]` element that wraps the `slot="children"`
20
+ stays in the inner shadow DOM regardless of path — that group is a
21
+ separate sub-surface for the children, not a duplicate of the
22
+ treeitem role.
23
+
24
+ On the legacy fallback path the inner `.item-row` carries
25
+ `role="treeitem"` + aria-* state, the host role is suppressed, and the
26
+ roving tabindex is written to the inner element so there is only ONE
27
+ focusable surface per item (mirrors hx-menu-item round-8).
7
28
  *
8
29
  * @example
9
30
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HxTreeItem.d.ts","sourceRoot":"","sources":["../../../src/components/HxTreeItem/HxTreeItem.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU;;EAQrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"HxTreeItem.d.ts","sourceRoot":"","sources":["../../../src/components/HxTreeItem/HxTreeItem.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU;;EAQrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -5,10 +5,20 @@ export type { HxTreeViewProps };
5
5
  * A hierarchical tree component for navigating nested data structures.
6
6
  Used in healthcare applications for org charts, ICD-10 code hierarchies, and department navigation.
7
7
 
8
- Implements WAI-ARIA tree view pattern with `role="tree"` on the container
9
- and `role="treeitem"` on each item. Supports `aria-label` via the `label` property
10
- for screen reader identification. Full keyboard navigation: Arrow keys for movement,
11
- Enter/Space for selection, Home/End for first/last item.
8
+ Group 5c host-canonical: `role="tree"` lives on the **host** via
9
+ `_internals.role` on the modern path. The host carries the announced
10
+ surface so AT walks `<hx-tree-view>` (role=tree) slotted
11
+ `<hx-tree-item>` (role=treeitem on host) directly without two layers of
12
+ indirection. Consumer-supplied `aria-label` / `aria-labelledby` on the
13
+ host are resolved via the shared IDREF mirror; cross-shadow naming uses
14
+ `ariaLabelledByElements` (modern) with a flattened-string fallback
15
+ (legacy). On the legacy fallback path the inner `[role="tree"]` carries
16
+ the role + accessible name and the host role is suppressed so AT only
17
+ sees one tree per logical surface (mirrors `hx-menu` round-8).
18
+
19
+ Full keyboard navigation: Arrow keys for movement, Enter/Space for
20
+ selection, Home/End for first/last item, ArrowRight/Left for
21
+ expand/collapse + parent/child traversal, typeahead.
12
22
 
13
23
  ## Scale Limits
14
24
 
@@ -1 +1 @@
1
- {"version":3,"file":"HxTreeView.d.ts","sourceRoot":"","sources":["../../../src/components/HxTreeView/HxTreeView.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,UAAU;;EAQrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"HxTreeView.d.ts","sourceRoot":"","sources":["../../../src/components/HxTreeView/HxTreeView.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,UAAU;;EAQrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -6,8 +6,11 @@ export interface HxTreeViewProps {
6
6
  className?: string;
7
7
  /** Inline styles */
8
8
  style?: React.CSSProperties;
9
- /** Accessible label for the tree. Applied as `aria-label` on the tree container.
10
- Provides context to screen readers about the tree's purpose. */
9
+ /** Accessible label for the tree. Used as a fallback when no
10
+ consumer-supplied `aria-label` / `aria-labelledby` is present on the
11
+ host. On the modern host-canonical path this projects onto
12
+ `internals.ariaLabel`; on the legacy fallback path it appears as
13
+ `aria-label` on the inner `[role="tree"]` element. */
11
14
  label?: string;
12
15
  /** Selection mode for the tree.
13
16
  - `none` — items cannot be selected
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTreeView/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B;iEAC6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;kDAG8C;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;IAG3C,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/HxTreeView/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B;;;;uDAImD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;kDAG8C;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;IAG3C,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC"}
package/dist/index.js CHANGED
@@ -60,7 +60,7 @@ import { H as H59 } from "./shared/HxProse-CVNyZuax.js";
60
60
  import { H as H60 } from "./shared/HxRadio-YLIQfNL9.js";
61
61
  import { H as H61 } from "./shared/HxRadioGroup-D0xVuMDM.js";
62
62
  import { H as H62 } from "./shared/HxRating-Ba5zWXvJ.js";
63
- import { H as H63 } from "./shared/HxSelect-BEm8srcF.js";
63
+ import { H as H63 } from "./shared/HxSelect-BAt_veRr.js";
64
64
  import { H as H64 } from "./shared/HxSideNav-Bsna09yU.js";
65
65
  import { H as H65 } from "./shared/HxSkeleton-CCMzx9TK.js";
66
66
  import { H as H66 } from "./shared/HxSlider-BC8SGKvf.js";
@@ -1 +1 @@
1
- {"version":3,"file":"HxAccordionItem-C26EIvJG.js","sources":["../../src/components/HxAccordionItem/HxAccordionItem.ts"],"sourcesContent":["'use client';\n/**\n * React wrapper for <hx-accordion-item> web component.\n * Auto-generated by scripts/generate-react-wrappers.ts — DO NOT EDIT MANUALLY.\n * Re-run: pnpm --filter=@helixui/react run generate\n */\n\nimport React from 'react';\nimport { createComponent } from '@lit/react';\nimport { HelixAccordionItem } from '@helixui/library/components/hx-accordion';\n\nimport type { HxAccordionItemProps } from './types.js';\n\nexport type { HxAccordionItemProps };\n\n/**\n * An individual accordion item with collapsible content.\n *\n * @example\n * ```tsx\n * import { HxAccordionItem } from '@helixui/react';\n *\n * <HxAccordionItem />\n * ```\n */\nexport const HxAccordionItem = createComponent({\n tagName: 'hx-accordion-item',\n elementClass: HelixAccordionItem,\n react: React,\n events: {\n onHxExpand: 'hx-expand',\n onHxCollapse: 'hx-collapse',\n },\n displayName: 'HxAccordionItem',\n});\n\nexport default HxAccordionItem;\n"],"names":[],"mappings":";;;AAyBO,MAAM,kBAAkB,gBAAgB;AAAA,EAC7C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AACf,CAAC;"}
1
+ {"version":3,"file":"HxAccordionItem-C26EIvJG.js","sources":["../../src/components/HxAccordionItem/HxAccordionItem.ts"],"sourcesContent":["'use client';\n/**\n * React wrapper for <hx-accordion-item> web component.\n * Auto-generated by scripts/generate-react-wrappers.ts — DO NOT EDIT MANUALLY.\n * Re-run: pnpm --filter=@helixui/react run generate\n */\n\nimport React from 'react';\nimport { createComponent } from '@lit/react';\nimport { HelixAccordionItem } from '@helixui/library/components/hx-accordion';\n\nimport type { HxAccordionItemProps } from './types.js';\n\nexport type { HxAccordionItemProps };\n\n/**\n * 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).\n *\n * @example\n * ```tsx\n * import { HxAccordionItem } from '@helixui/react';\n *\n * <HxAccordionItem />\n * ```\n */\nexport const HxAccordionItem = createComponent({\n tagName: 'hx-accordion-item',\n elementClass: HelixAccordionItem,\n react: React,\n events: {\n onHxExpand: 'hx-expand',\n onHxCollapse: 'hx-collapse',\n },\n displayName: 'HxAccordionItem',\n});\n\nexport default HxAccordionItem;\n"],"names":[],"mappings":";;;AA4DO,MAAM,kBAAkB,gBAAgB;AAAA,EAC7C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AACf,CAAC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HxDialog-DMF3crTa.js","sources":["../../src/components/HxDialog/HxDialog.ts"],"sourcesContent":["'use client';\n/**\n * React wrapper for <hx-dialog> web component.\n * Auto-generated by scripts/generate-react-wrappers.ts — DO NOT EDIT MANUALLY.\n * Re-run: pnpm --filter=@helixui/react run generate\n */\n\nimport React from 'react';\nimport { createComponent } from '@lit/react';\nimport { HelixDialog } from '@helixui/library/components/hx-dialog';\n\nimport type { HxDialogProps } from './types.js';\n\nexport type { HxDialogProps };\n\n/**\n * A modal and non-modal dialog component built on the native HTML `<dialog>` element.\nProvides focus trapping, backdrop interaction, keyboard navigation, and full\nARIA labelling for enterprise healthcare accessibility requirements.\n *\n * @example\n * ```tsx\n * import { HxDialog } from '@helixui/react';\n *\n * <HxDialog />\n * ```\n */\nexport const HxDialog = createComponent({\n tagName: 'hx-dialog',\n elementClass: HelixDialog,\n react: React,\n events: {\n onHxOpen: 'hx-open',\n onHxClose: 'hx-close',\n onHxCancel: 'hx-cancel',\n },\n displayName: 'HxDialog',\n});\n\nexport default HxDialog;\n"],"names":[],"mappings":";;;AA2BO,MAAM,WAAW,gBAAgB;AAAA,EACtC,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,EAAA;AAAA,EAEd,aAAa;AACf,CAAC;"}
1
+ {"version":3,"file":"HxDialog-DMF3crTa.js","sources":["../../src/components/HxDialog/HxDialog.ts"],"sourcesContent":["'use client';\n/**\n * React wrapper for <hx-dialog> web component.\n * Auto-generated by scripts/generate-react-wrappers.ts — DO NOT EDIT MANUALLY.\n * Re-run: pnpm --filter=@helixui/react run generate\n */\n\nimport React from 'react';\nimport { createComponent } from '@lit/react';\nimport { HelixDialog } from '@helixui/library/components/hx-dialog';\n\nimport type { HxDialogProps } from './types.js';\n\nexport type { HxDialogProps };\n\n/**\n * A modal and non-modal dialog component built on the native HTML `<dialog>` element.\nProvides focus trapping, backdrop interaction, keyboard navigation, and full\nARIA labelling for enterprise healthcare accessibility requirements.\n\n## Architecture Note: Host-Canonical ARIA (group-4a round-1, Path A — native-dialog adaptation)\n\nUnlike `hx-drawer` (which uses an inner `<div role=\"dialog\">` and can fully\nhost-canonicalize the role), `hx-dialog` is built on the native\n`<dialog>` HTMLDialogElement. The native element has an **implicit\n`role=\"dialog\"`** baked in by the browser that **cannot be stripped**, so\nfull host-canonical role takeover would create nested-dialog announcements.\n\n**Path A (adopted):** the host owns label / description projection via\n`ElementInternals` (`internals.ariaLabelledByElements`,\n`internals.ariaDescribedByElements`, `internals.ariaLabel`) but **does NOT**\nset `internals.role`. The native inner `<dialog>` continues to be the\nannounced surface. Consumer light-DOM IDREFs project across the shadow\nboundary via `internals.aria*Elements` on the host.\n\n**Hybrid fallback (always-on belt-and-suspenders):** because some assistive\ntechnologies may walk the native `<dialog>` first and ignore host\n`internals.aria*Elements`, the resolved label / description text is **also**\nserialized into `aria-label` / `aria-describedby` on the inner native\n`<dialog>` element. Consumers therefore get name/description on every AT,\nwith the IDL-ref path providing live DOM-text-update tracking when the AT\nhonours it. This forfeits live-text tracking on the inner-dialog fallback\n(the serialized text is recomputed on every sync, which is good enough since\nmutation observers re-fire `_syncHostAriaSemantics` on consumer text edits).\n\nWhy we do NOT set `internals.role = 'alertdialog'` either: setting role on\nthe host while the native `<dialog>` keeps `role=\"dialog\"` would announce\nBOTH a host alertdialog AND an inner dialog. Instead, the alertdialog\nvariant continues to write `role=\"alertdialog\"` directly on the inner\n`<dialog>` element (the platform allows overriding the implicit `dialog`\nrole with the more specific `alertdialog`).\n\nNaming precedence (W3C AccName 1.2 §4.3.1):\n\n 1. Consumer `aria-labelledby` on the host — IDREFs resolved across the\n shadow boundary via `resolveIdrefTokens` (closest scope first, then\n ancestor shadow hosts, then owner document).\n 2. Consumer `aria-label` on the host.\n 3. `<slot name=\"header\">` text content (multi-node aggregation per\n AccName 1.2 §4.3.10 — decorative `aria-hidden` / `[hidden]` subtrees\n contribute zero to the name).\n 4. `heading` property — explicit author-provided heading text.\n 5. Hard-coded literal `\"Dialog\"` (last-resort accessible name).\n\nDescription channel: the host's `internals.ariaDescribedByElements` carries\nthe resolved IDREF chain on the modern path. The inner native `<dialog>` ALSO\nreceives a serialized `aria-describedby` chain — when a consumer description\nresolves, a synthesized in-shadow `<span id=\"${id}-consumer-desc\">` is\nappended to the existing `description` span (if any) and the inner\n`<dialog>`'s `aria-describedby` references both same-root ids. `aria-description`\nis intentionally NEVER written — W3C AccName ignores it whenever\n`aria-describedby` is also present.\n\nSlot mutation observers track:\n 1. The header slot's text content (in-place i18n re-renders).\n 2. Consumer-resolved external IDREF targets (so a consumer mutating\n `<label id=\"x\">Patient</label>` in place re-flows the name).\n 3. Host attribute mutations (delegated to `installAriaIdrefMirror`,\n which also catches late-inserted IDREF targets and id renames in\n every relevant root).\n 4. Authentic consumer `aria-describedby` retraction (oldValue !== null &&\n newValue === null) via a dedicated `attributeOldValue: true` observer.\n\n**First-paint slot state seeding intentionally omitted:** seeding\n`_hasHeaderSlot` / `_headerSlotText` from `firstUpdated()` would schedule an\nextra Lit re-render that subtly reorders the open-dialog promise chain\n(`updateComplete.then(...) → showModal() → updateComplete.then(...) →\nfocus first focusable`). On Chromium, that reordering interleaves the\nnative dialog's modal activation with the focus-restore step and causes\nfocus-trap test failures. The slotchange handler runs one microtask later\nand `_syncHostAriaSemantics()` from `updated()` picks up the resolved state\non the next paint — close enough that AT never observes the unnamed window.\nMirrors the same intentional decision documented in hx-drawer round-1.\n\nFocus trap, ESC dismiss with `hx-cancel` BEFORE `hx-close`, focus-restore\nvia `_triggerElement`, and native `showModal()` semantics are unchanged\nfrom the pre-host-canonical implementation.\n *\n * @example\n * ```tsx\n * import { HxDialog } from '@helixui/react';\n *\n * <HxDialog />\n * ```\n */\nexport const HxDialog = createComponent({\n tagName: 'hx-dialog',\n elementClass: HelixDialog,\n react: React,\n events: {\n onHxOpen: 'hx-open',\n onHxClose: 'hx-close',\n onHxCancel: 'hx-cancel',\n },\n displayName: 'HxDialog',\n});\n\nexport default HxDialog;\n"],"names":[],"mappings":";;;AAyGO,MAAM,WAAW,gBAAgB;AAAA,EACtC,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,EAAA;AAAA,EAEd,aAAa;AACf,CAAC;"}