@helixui/library 3.7.0 → 3.8.0-next.145
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/aaa-verdicts.json +2036 -0
- package/custom-elements.json +1657 -71
- package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
- package/dist/components/hx-accordion/hx-accordion-item.styles.d.ts.map +1 -1
- package/dist/components/hx-accordion/index.js +1 -1
- package/dist/components/hx-action-bar/hx-action-bar.d.ts +18 -0
- package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
- package/dist/components/hx-action-bar/hx-action-bar.styles.d.ts.map +1 -1
- package/dist/components/hx-action-bar/index.js +1 -1
- package/dist/components/hx-alert/hx-alert.d.ts +0 -8
- package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
- package/dist/components/hx-alert/hx-alert.styles.d.ts.map +1 -1
- package/dist/components/hx-alert/index.js +1 -1
- package/dist/components/hx-avatar/hx-avatar.d.ts +4 -1
- package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
- package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
- package/dist/components/hx-avatar/index.js +1 -1
- package/dist/components/hx-badge/hx-badge.d.ts.map +1 -1
- package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
- package/dist/components/hx-badge/index.js +1 -1
- package/dist/components/hx-banner/hx-banner.d.ts +19 -8
- package/dist/components/hx-banner/hx-banner.d.ts.map +1 -1
- package/dist/components/hx-banner/hx-banner.styles.d.ts.map +1 -1
- package/dist/components/hx-banner/index.js +1 -1
- package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
- package/dist/components/hx-breadcrumb/hx-breadcrumb-item.styles.d.ts.map +1 -1
- package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +18 -0
- package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
- package/dist/components/hx-breadcrumb/index.js +1 -1
- package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
- package/dist/components/hx-button/index.js +1 -1
- package/dist/components/hx-button-group/hx-button-group.d.ts +47 -0
- package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
- package/dist/components/hx-button-group/index.js +1 -1
- package/dist/components/hx-carousel/hx-carousel.d.ts.map +1 -1
- package/dist/components/hx-carousel/hx-carousel.styles.d.ts.map +1 -1
- package/dist/components/hx-carousel/index.js +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
- package/dist/components/hx-checkbox/index.js +1 -1
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +36 -0
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
- package/dist/components/hx-checkbox-group/hx-checkbox-group.styles.d.ts.map +1 -1
- package/dist/components/hx-checkbox-group/index.js +1 -1
- package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +26 -9
- package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
- package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
- package/dist/components/hx-clinical-status/index.js +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.d.ts +18 -0
- package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-color-picker/index.js +1 -1
- package/dist/components/hx-combobox/hx-combobox.d.ts +18 -0
- package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
- package/dist/components/hx-combobox/hx-combobox.styles.d.ts.map +1 -1
- package/dist/components/hx-combobox/index.js +1 -1
- package/dist/components/hx-copy-button/hx-copy-button.d.ts +18 -0
- package/dist/components/hx-copy-button/hx-copy-button.d.ts.map +1 -1
- package/dist/components/hx-copy-button/hx-copy-button.styles.d.ts.map +1 -1
- package/dist/components/hx-copy-button/index.js +1 -1
- package/dist/components/hx-date-picker/hx-date-picker.d.ts +18 -0
- package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
- package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-date-picker/index.js +1 -1
- package/dist/components/hx-drawer/hx-drawer.d.ts +18 -0
- package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
- package/dist/components/hx-drawer/hx-drawer.styles.d.ts.map +1 -1
- package/dist/components/hx-drawer/index.js +1 -1
- package/dist/components/hx-dropdown/hx-dropdown.d.ts +18 -0
- package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
- package/dist/components/hx-dropdown/hx-dropdown.styles.d.ts.map +1 -1
- package/dist/components/hx-dropdown/index.js +1 -1
- package/dist/components/hx-field/hx-field.d.ts +17 -0
- package/dist/components/hx-field/hx-field.d.ts.map +1 -1
- package/dist/components/hx-field-label/hx-field-label.d.ts +17 -0
- package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
- package/dist/components/hx-file-upload/hx-file-upload.d.ts +46 -0
- package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
- package/dist/components/hx-file-upload/hx-file-upload.styles.d.ts.map +1 -1
- package/dist/components/hx-file-upload/index.js +1 -1
- package/dist/components/hx-form/hx-form.d.ts +19 -0
- package/dist/components/hx-form/hx-form.d.ts.map +1 -1
- package/dist/components/hx-help-text/hx-help-text.d.ts +17 -0
- package/dist/components/hx-help-text/hx-help-text.d.ts.map +1 -1
- package/dist/components/hx-help-text/hx-help-text.styles.d.ts.map +1 -1
- package/dist/components/hx-help-text/index.js +1 -1
- package/dist/components/hx-icon/hx-icon.d.ts +108 -12
- package/dist/components/hx-icon/hx-icon.d.ts.map +1 -1
- package/dist/components/hx-icon/hx-icon.styles.d.ts.map +1 -1
- package/dist/components/hx-icon/index.js +1 -1
- package/dist/components/hx-icon-button/hx-icon-button.d.ts +18 -0
- package/dist/components/hx-icon-button/hx-icon-button.d.ts.map +1 -1
- package/dist/components/hx-link/hx-link.d.ts.map +1 -1
- package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
- package/dist/components/hx-link/index.js +1 -1
- package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu.d.ts +18 -0
- package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
- package/dist/components/hx-menu/index.js +1 -1
- package/dist/components/hx-nav/hx-nav.d.ts +18 -0
- package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
- package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
- package/dist/components/hx-nav/index.js +1 -1
- package/dist/components/hx-number-input/hx-number-input.d.ts +18 -0
- package/dist/components/hx-number-input/hx-number-input.d.ts.map +1 -1
- package/dist/components/hx-number-input/hx-number-input.styles.d.ts.map +1 -1
- package/dist/components/hx-number-input/index.js +1 -1
- package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +23 -1
- package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +1 -1
- package/dist/components/hx-overflow-menu/hx-overflow-menu.styles.d.ts.map +1 -1
- package/dist/components/hx-overflow-menu/index.js +1 -1
- package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
- package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
- package/dist/components/hx-phi-field/index.js +1 -1
- package/dist/components/hx-popover/hx-popover.d.ts +18 -0
- package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
- package/dist/components/hx-popover/hx-popover.styles.d.ts.map +1 -1
- package/dist/components/hx-popover/index.js +1 -1
- package/dist/components/hx-popup/hx-popup.d.ts +18 -0
- package/dist/components/hx-popup/hx-popup.d.ts.map +1 -1
- package/dist/components/hx-popup/hx-popup.styles.d.ts.map +1 -1
- package/dist/components/hx-popup/index.js +1 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts +18 -0
- package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
- package/dist/components/hx-radio-group/hx-radio-group.styles.d.ts.map +1 -1
- package/dist/components/hx-radio-group/hx-radio.styles.d.ts.map +1 -1
- package/dist/components/hx-radio-group/index.js +1 -1
- package/dist/components/hx-rating/hx-rating.d.ts +19 -0
- package/dist/components/hx-rating/hx-rating.d.ts.map +1 -1
- package/dist/components/hx-rating/hx-rating.styles.d.ts.map +1 -1
- package/dist/components/hx-rating/index.js +1 -1
- package/dist/components/hx-select/hx-select.d.ts +18 -0
- package/dist/components/hx-select/hx-select.d.ts.map +1 -1
- package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
- package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
- package/dist/components/hx-side-nav/hx-side-nav.d.ts +18 -0
- package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
- package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
- package/dist/components/hx-side-nav/index.js +1 -1
- package/dist/components/hx-slider/hx-slider.d.ts +47 -0
- package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
- package/dist/components/hx-slider/index.js +1 -1
- package/dist/components/hx-split-button/hx-split-button.d.ts +18 -0
- package/dist/components/hx-split-button/hx-split-button.d.ts.map +1 -1
- package/dist/components/hx-split-button/hx-split-button.styles.d.ts.map +1 -1
- package/dist/components/hx-split-button/index.js +1 -1
- package/dist/components/hx-stat/hx-stat.d.ts.map +1 -1
- package/dist/components/hx-stat/hx-stat.styles.d.ts.map +1 -1
- package/dist/components/hx-stat/index.js +1 -1
- package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
- package/dist/components/hx-steps/hx-step.styles.d.ts.map +1 -1
- package/dist/components/hx-steps/index.js +1 -1
- package/dist/components/hx-switch/hx-switch.d.ts +18 -0
- package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
- package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
- package/dist/components/hx-switch/index.js +1 -1
- package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
- package/dist/components/hx-tabs/hx-tabs.d.ts +18 -0
- package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
- package/dist/components/hx-tabs/index.js +1 -1
- package/dist/components/hx-tag/hx-tag.d.ts.map +1 -1
- package/dist/components/hx-tag/hx-tag.styles.d.ts.map +1 -1
- package/dist/components/hx-tag/index.js +1 -1
- package/dist/components/hx-text-input/hx-text-input.styles.d.ts.map +1 -1
- package/dist/components/hx-text-input/index.js +1 -1
- package/dist/components/hx-textarea/hx-textarea.d.ts +18 -0
- package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
- package/dist/components/hx-time-picker/hx-time-picker.d.ts +18 -0
- package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
- package/dist/components/hx-time-picker/hx-time-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-time-picker/index.js +1 -1
- package/dist/components/hx-toast/hx-toast.d.ts +19 -8
- package/dist/components/hx-toast/hx-toast.d.ts.map +1 -1
- package/dist/components/hx-toast/hx-toast.styles.d.ts.map +1 -1
- package/dist/components/hx-toast/index.js +1 -1
- package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +18 -0
- package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
- package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
- package/dist/components/hx-toggle-button/index.js +1 -1
- package/dist/components/hx-tooltip/hx-tooltip.d.ts +18 -0
- package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
- package/dist/components/hx-tooltip/hx-tooltip.styles.d.ts.map +1 -1
- package/dist/components/hx-tooltip/index.js +1 -1
- package/dist/components/hx-top-nav/hx-top-nav.d.ts +18 -0
- package/dist/components/hx-top-nav/hx-top-nav.d.ts.map +1 -1
- package/dist/components/hx-top-nav/hx-top-nav.styles.d.ts.map +1 -1
- package/dist/components/hx-top-nav/index.js +1 -1
- package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
- package/dist/components/hx-tree-view/hx-tree-item.styles.d.ts.map +1 -1
- package/dist/components/hx-tree-view/index.js +1 -1
- package/dist/css/helix-all.css +355 -84
- package/dist/css/helix-core.css +23 -5
- package/dist/css/helix-feedback.css +15 -18
- package/dist/css/helix-forms.css +139 -27
- package/dist/css/helix-media.css +6 -3
- package/dist/css/helix-navigation.css +59 -9
- package/dist/css/helix-overlay.css +63 -0
- package/dist/css/helix-tokens.css +16 -14
- package/dist/css/helix-utility.css +44 -12
- package/dist/css/hx-action-bar.css +12 -0
- package/dist/css/hx-alert.css +4 -8
- package/dist/css/hx-avatar.css +1 -2
- package/dist/css/hx-badge.css +5 -0
- package/dist/css/hx-banner.css +4 -8
- package/dist/css/hx-button.css +4 -1
- package/dist/css/hx-carousel.css +6 -3
- package/dist/css/hx-checkbox-group.css +11 -0
- package/dist/css/hx-checkbox.css +14 -9
- package/dist/css/hx-clinical-status.css +4 -7
- package/dist/css/hx-color-picker.css +14 -1
- package/dist/css/hx-combobox.css +8 -0
- package/dist/css/hx-copy-button.css +5 -2
- package/dist/css/hx-date-picker.css +11 -1
- package/dist/css/hx-drawer.css +5 -0
- package/dist/css/hx-dropdown.css +18 -0
- package/dist/css/hx-file-upload.css +4 -0
- package/dist/css/hx-help-text.css +5 -0
- package/dist/css/hx-icon.css +7 -0
- package/dist/css/hx-link.css +1 -2
- package/dist/css/hx-nav.css +31 -2
- package/dist/css/hx-number-input.css +10 -11
- package/dist/css/hx-overflow-menu.css +5 -0
- package/dist/css/hx-phi-field.css +2 -3
- package/dist/css/hx-popover.css +13 -0
- package/dist/css/hx-popup.css +14 -0
- package/dist/css/hx-radio-group.css +10 -0
- package/dist/css/hx-rating.css +6 -0
- package/dist/css/hx-side-nav.css +10 -5
- package/dist/css/hx-split-button.css +27 -10
- package/dist/css/hx-stat.css +1 -2
- package/dist/css/hx-switch.css +19 -1
- package/dist/css/hx-tag.css +5 -0
- package/dist/css/hx-text-input.css +4 -1
- package/dist/css/hx-time-picker.css +12 -2
- package/dist/css/hx-toast.css +6 -0
- package/dist/css/hx-toggle-button.css +11 -1
- package/dist/css/hx-tooltip.css +13 -0
- package/dist/css/hx-top-nav.css +13 -2
- package/dist/css/index.css +1 -1
- package/dist/css/manifest.json +43 -12
- package/dist/index.js +47 -47
- package/dist/shared/{hx-accordion-ZVzgDzTG.js → hx-accordion-DR--Ev4t.js} +48 -54
- package/dist/shared/hx-accordion-DR--Ev4t.js.map +1 -0
- package/dist/shared/{hx-action-bar-CitgcpGv.js → hx-action-bar-BlEG4aZv.js} +41 -29
- package/dist/shared/hx-action-bar-BlEG4aZv.js.map +1 -0
- package/dist/shared/{hx-alert-Bto8-TIi.js → hx-alert-C0axS32J.js} +40 -79
- package/dist/shared/hx-alert-C0axS32J.js.map +1 -0
- package/dist/shared/{hx-avatar-C9hOmlAb.js → hx-avatar-ChAYWnK8.js} +22 -24
- package/dist/shared/hx-avatar-ChAYWnK8.js.map +1 -0
- package/dist/shared/{hx-badge-DFL35nzi.js → hx-badge-vX-1cuLA.js} +16 -11
- package/dist/shared/hx-badge-vX-1cuLA.js.map +1 -0
- package/dist/shared/{hx-banner-fpRnciIO.js → hx-banner-PbHwFNSb.js} +51 -90
- package/dist/shared/hx-banner-PbHwFNSb.js.map +1 -0
- package/dist/shared/{hx-breadcrumb-item-3tKppF9h.js → hx-breadcrumb-item-D8xYqe3s.js} +56 -43
- package/dist/shared/hx-breadcrumb-item-D8xYqe3s.js.map +1 -0
- package/dist/shared/{hx-button-rRNmD4fd.js → hx-button-DOZTZnz-.js} +18 -15
- package/dist/shared/hx-button-DOZTZnz-.js.map +1 -0
- package/dist/shared/hx-button-group-D3QUmSzl.js +248 -0
- package/dist/shared/hx-button-group-D3QUmSzl.js.map +1 -0
- package/dist/shared/{hx-carousel-item-z1Lc24op.js → hx-carousel-item-BVIKgQ4i.js} +72 -102
- package/dist/shared/hx-carousel-item-BVIKgQ4i.js.map +1 -0
- package/dist/shared/{hx-checkbox-hPlIw6Lb.js → hx-checkbox-DDSXXhps.js} +33 -30
- package/dist/shared/hx-checkbox-DDSXXhps.js.map +1 -0
- package/dist/shared/{hx-checkbox-group-D5piJLY8.js → hx-checkbox-group-C0q6HDqn.js} +101 -58
- package/dist/shared/hx-checkbox-group-C0q6HDqn.js.map +1 -0
- package/dist/shared/{hx-clinical-status-D3XQIOqX.js → hx-clinical-status-ZSVEc3Qg.js} +68 -87
- package/dist/shared/hx-clinical-status-ZSVEc3Qg.js.map +1 -0
- package/dist/shared/{hx-color-picker-DBwJzT5f.js → hx-color-picker-CYjx8i8R.js} +97 -84
- package/dist/shared/hx-color-picker-CYjx8i8R.js.map +1 -0
- package/dist/shared/{hx-combobox-NgJaLbs2.js → hx-combobox-Be-mqOv4.js} +35 -45
- package/dist/shared/hx-combobox-Be-mqOv4.js.map +1 -0
- package/dist/shared/{hx-copy-button-sUVuikyH.js → hx-copy-button-DJirFCUL.js} +18 -15
- package/dist/shared/hx-copy-button-DJirFCUL.js.map +1 -0
- package/dist/shared/{hx-date-picker-DSKDkCy1.js → hx-date-picker-CziP3Hm1.js} +80 -82
- package/dist/shared/hx-date-picker-CziP3Hm1.js.map +1 -0
- package/dist/shared/{hx-drawer-CM_upadk.js → hx-drawer-BlU2oX8-.js} +32 -36
- package/dist/shared/hx-drawer-BlU2oX8-.js.map +1 -0
- package/dist/shared/{hx-dropdown-D626S2ZG.js → hx-dropdown-DREqpIpm.js} +51 -33
- package/dist/shared/hx-dropdown-DREqpIpm.js.map +1 -0
- package/dist/shared/hx-field-label-BVRyyKeh.js.map +1 -1
- package/dist/shared/hx-field-zw0U1KVi.js.map +1 -1
- package/dist/shared/{hx-file-upload-D3rKROK5.js → hx-file-upload-CU5QGZSP.js} +137 -80
- package/dist/shared/hx-file-upload-CU5QGZSP.js.map +1 -0
- package/dist/shared/hx-form-CkChEATa.js.map +1 -1
- package/dist/shared/hx-help-text-CNaZ82LT.js +137 -0
- package/dist/shared/hx-help-text-CNaZ82LT.js.map +1 -0
- package/dist/shared/hx-icon-button-B2BdVdyK.js.map +1 -1
- package/dist/shared/hx-icon-bxz9eB9a.js +386 -0
- package/dist/shared/hx-icon-bxz9eB9a.js.map +1 -0
- package/dist/shared/{hx-link-CMnZRUtQ.js → hx-link-BURSdYLp.js} +19 -26
- package/dist/shared/hx-link-BURSdYLp.js.map +1 -0
- package/dist/shared/{hx-menu-divider-A6Guuzi_.js → hx-menu-divider-g0grbWV9.js} +19 -31
- package/dist/shared/hx-menu-divider-g0grbWV9.js.map +1 -0
- package/dist/shared/{hx-nav-ldFM3Fle.js → hx-nav-GTsAZGOx.js} +94 -85
- package/dist/shared/hx-nav-GTsAZGOx.js.map +1 -0
- package/dist/shared/{hx-nav-item-CODtUlew.js → hx-nav-item-CxE7Mp3M.js} +46 -41
- package/dist/shared/hx-nav-item-CxE7Mp3M.js.map +1 -0
- package/dist/shared/{hx-number-input-yUzFOSC1.js → hx-number-input-Bvyc9kOi.js} +59 -64
- package/dist/shared/hx-number-input-Bvyc9kOi.js.map +1 -0
- package/dist/shared/{hx-overflow-menu-DFjJAziP.js → hx-overflow-menu-LrTteeR1.js} +32 -39
- package/dist/shared/{hx-overflow-menu-DFjJAziP.js.map → hx-overflow-menu-LrTteeR1.js.map} +1 -1
- package/dist/shared/{hx-phi-field-C19oxlrr.js → hx-phi-field-sZt_rYIL.js} +46 -66
- package/dist/shared/hx-phi-field-sZt_rYIL.js.map +1 -0
- package/dist/shared/{hx-popover-BAlAFOH9.js → hx-popover-BjB0nkcq.js} +51 -38
- package/dist/shared/hx-popover-BjB0nkcq.js.map +1 -0
- package/dist/shared/{hx-popup-COUXXZ9X.js → hx-popup-BiV_2evC.js} +59 -45
- package/dist/shared/hx-popup-BiV_2evC.js.map +1 -0
- package/dist/shared/{hx-radio-CY4kQfZw.js → hx-radio-BD_c9NJy.js} +83 -70
- package/dist/shared/hx-radio-BD_c9NJy.js.map +1 -0
- package/dist/shared/{hx-rating-C3QP53k9.js → hx-rating-BGK4AxvI.js} +45 -71
- package/dist/shared/hx-rating-BGK4AxvI.js.map +1 -0
- package/dist/shared/hx-select-DahFehiZ.js.map +1 -1
- package/dist/shared/{hx-slider-Blmv_rwS.js → hx-slider-CkOk5BCY.js} +83 -23
- package/dist/shared/hx-slider-CkOk5BCY.js.map +1 -0
- package/dist/shared/{hx-split-button-Ddle8iVx.js → hx-split-button-Bg9FHrFK.js} +73 -65
- package/dist/shared/hx-split-button-Bg9FHrFK.js.map +1 -0
- package/dist/shared/{hx-stat-Gtw_SpK8.js → hx-stat-wKxbyep6.js} +22 -55
- package/dist/shared/hx-stat-wKxbyep6.js.map +1 -0
- package/dist/shared/{hx-step-CUzliIK_.js → hx-step-CyGQAuiB.js} +5 -25
- package/dist/shared/hx-step-CyGQAuiB.js.map +1 -0
- package/dist/shared/{hx-switch-TvKGvZJz.js → hx-switch-BCXuNxEH.js} +42 -24
- package/dist/shared/hx-switch-BCXuNxEH.js.map +1 -0
- package/dist/shared/{hx-tab-panel-DzsX8BHV.js → hx-tab-panel-BfisavKo.js} +47 -32
- package/dist/shared/hx-tab-panel-BfisavKo.js.map +1 -0
- package/dist/shared/{hx-tag-C5aCUpVi.js → hx-tag-BqO6HY6V.js} +26 -21
- package/dist/shared/hx-tag-BqO6HY6V.js.map +1 -0
- package/dist/shared/{hx-text-input-D6FlOZM-.js → hx-text-input-V5sQOpDh.js} +5 -2
- package/dist/shared/hx-text-input-V5sQOpDh.js.map +1 -0
- package/dist/shared/hx-textarea-CNG590KY.js.map +1 -1
- package/dist/shared/{hx-time-picker-Bo7FWzmf.js → hx-time-picker-if5Cl0Ei.js} +42 -43
- package/dist/shared/hx-time-picker-if5Cl0Ei.js.map +1 -0
- package/dist/shared/{hx-toggle-button-DSJeFlb0.js → hx-toggle-button-xNVYeA3X.js} +37 -27
- package/dist/shared/hx-toggle-button-xNVYeA3X.js.map +1 -0
- package/dist/shared/{hx-tooltip-DVqtKPCD.js → hx-tooltip-CamO-9nd.js} +24 -11
- package/dist/shared/hx-tooltip-CamO-9nd.js.map +1 -0
- package/dist/shared/{hx-top-nav-DP6OFS8C.js → hx-top-nav-vP6oDWMV.js} +42 -44
- package/dist/shared/hx-top-nav-vP6oDWMV.js.map +1 -0
- package/dist/shared/{hx-tree-item-CXyspGxI.js → hx-tree-item-D8hwKd5m.js} +54 -57
- package/dist/shared/hx-tree-item-D8hwKd5m.js.map +1 -0
- package/dist/shared/{toast-factory-Dht3pVsw.js → toast-factory-DgnbFxVs.js} +127 -153
- package/dist/shared/toast-factory-DgnbFxVs.js.map +1 -0
- package/figma-inventory.json +1166 -411
- package/package.json +8 -4
- package/dist/shared/hx-accordion-ZVzgDzTG.js.map +0 -1
- package/dist/shared/hx-action-bar-CitgcpGv.js.map +0 -1
- package/dist/shared/hx-alert-Bto8-TIi.js.map +0 -1
- package/dist/shared/hx-avatar-C9hOmlAb.js.map +0 -1
- package/dist/shared/hx-badge-DFL35nzi.js.map +0 -1
- package/dist/shared/hx-banner-fpRnciIO.js.map +0 -1
- package/dist/shared/hx-breadcrumb-item-3tKppF9h.js.map +0 -1
- package/dist/shared/hx-button-group-4NUBpkyC.js +0 -181
- package/dist/shared/hx-button-group-4NUBpkyC.js.map +0 -1
- package/dist/shared/hx-button-rRNmD4fd.js.map +0 -1
- package/dist/shared/hx-carousel-item-z1Lc24op.js.map +0 -1
- package/dist/shared/hx-checkbox-group-D5piJLY8.js.map +0 -1
- package/dist/shared/hx-checkbox-hPlIw6Lb.js.map +0 -1
- package/dist/shared/hx-clinical-status-D3XQIOqX.js.map +0 -1
- package/dist/shared/hx-color-picker-DBwJzT5f.js.map +0 -1
- package/dist/shared/hx-combobox-NgJaLbs2.js.map +0 -1
- package/dist/shared/hx-copy-button-sUVuikyH.js.map +0 -1
- package/dist/shared/hx-date-picker-DSKDkCy1.js.map +0 -1
- package/dist/shared/hx-drawer-CM_upadk.js.map +0 -1
- package/dist/shared/hx-dropdown-D626S2ZG.js.map +0 -1
- package/dist/shared/hx-file-upload-D3rKROK5.js.map +0 -1
- package/dist/shared/hx-help-text-Xb2Yr8x2.js +0 -156
- package/dist/shared/hx-help-text-Xb2Yr8x2.js.map +0 -1
- package/dist/shared/hx-icon-fuVm4-bk.js +0 -283
- package/dist/shared/hx-icon-fuVm4-bk.js.map +0 -1
- package/dist/shared/hx-link-CMnZRUtQ.js.map +0 -1
- package/dist/shared/hx-menu-divider-A6Guuzi_.js.map +0 -1
- package/dist/shared/hx-nav-item-CODtUlew.js.map +0 -1
- package/dist/shared/hx-nav-ldFM3Fle.js.map +0 -1
- package/dist/shared/hx-number-input-yUzFOSC1.js.map +0 -1
- package/dist/shared/hx-phi-field-C19oxlrr.js.map +0 -1
- package/dist/shared/hx-popover-BAlAFOH9.js.map +0 -1
- package/dist/shared/hx-popup-COUXXZ9X.js.map +0 -1
- package/dist/shared/hx-radio-CY4kQfZw.js.map +0 -1
- package/dist/shared/hx-rating-C3QP53k9.js.map +0 -1
- package/dist/shared/hx-slider-Blmv_rwS.js.map +0 -1
- package/dist/shared/hx-split-button-Ddle8iVx.js.map +0 -1
- package/dist/shared/hx-stat-Gtw_SpK8.js.map +0 -1
- package/dist/shared/hx-step-CUzliIK_.js.map +0 -1
- package/dist/shared/hx-switch-TvKGvZJz.js.map +0 -1
- package/dist/shared/hx-tab-panel-DzsX8BHV.js.map +0 -1
- package/dist/shared/hx-tag-C5aCUpVi.js.map +0 -1
- package/dist/shared/hx-text-input-D6FlOZM-.js.map +0 -1
- package/dist/shared/hx-time-picker-Bo7FWzmf.js.map +0 -1
- package/dist/shared/hx-toggle-button-DSJeFlb0.js.map +0 -1
- package/dist/shared/hx-tooltip-DVqtKPCD.js.map +0 -1
- package/dist/shared/hx-top-nav-DP6OFS8C.js.map +0 -1
- package/dist/shared/hx-tree-item-CXyspGxI.js.map +0 -1
- package/dist/shared/toast-factory-Dht3pVsw.js.map +0 -1
|
@@ -353,6 +353,11 @@ const N = _`
|
|
|
353
353
|
margin-inline-start: auto;
|
|
354
354
|
}
|
|
355
355
|
|
|
356
|
+
/* hx-icon glyph sizing for migrated checked / submenu indicators (1em parity). */
|
|
357
|
+
.menu-item__glyph {
|
|
358
|
+
--hx-icon-size: 1em;
|
|
359
|
+
}
|
|
360
|
+
|
|
356
361
|
.menu-item__spinner {
|
|
357
362
|
width: 1em;
|
|
358
363
|
height: 1em;
|
|
@@ -415,10 +420,10 @@ const N = _`
|
|
|
415
420
|
}
|
|
416
421
|
}
|
|
417
422
|
`;
|
|
418
|
-
var
|
|
419
|
-
for (var i = n > 1 ? void 0 : n ?
|
|
423
|
+
var K = Object.defineProperty, j = Object.getOwnPropertyDescriptor, h = (e, t, s, n) => {
|
|
424
|
+
for (var i = n > 1 ? void 0 : n ? j(t, s) : t, r = e.length - 1, a; r >= 0; r--)
|
|
420
425
|
(a = e[r]) && (i = (n ? a(t, s, i) : a(i)) || i);
|
|
421
|
-
return n && i &&
|
|
426
|
+
return n && i && K(t, s, i), i;
|
|
422
427
|
};
|
|
423
428
|
let l = class extends I {
|
|
424
429
|
constructor() {
|
|
@@ -598,18 +603,7 @@ let l = class extends I {
|
|
|
598
603
|
_renderCheckedIcon() {
|
|
599
604
|
return u`
|
|
600
605
|
<span part="checked-icon" class="menu-item__checked-icon" aria-hidden="true">
|
|
601
|
-
<
|
|
602
|
-
width="1em"
|
|
603
|
-
height="1em"
|
|
604
|
-
viewBox="0 0 24 24"
|
|
605
|
-
fill="none"
|
|
606
|
-
stroke="currentColor"
|
|
607
|
-
stroke-width="3"
|
|
608
|
-
stroke-linecap="round"
|
|
609
|
-
stroke-linejoin="round"
|
|
610
|
-
>
|
|
611
|
-
<polyline points="20 6 9 17 4 12" />
|
|
612
|
-
</svg>
|
|
606
|
+
<hx-icon class="menu-item__glyph" library="helix" name="check" aria-hidden="true"></hx-icon>
|
|
613
607
|
</span>
|
|
614
608
|
`;
|
|
615
609
|
}
|
|
@@ -617,18 +611,12 @@ let l = class extends I {
|
|
|
617
611
|
_renderSubmenuIcon() {
|
|
618
612
|
return u`
|
|
619
613
|
<span part="submenu-icon" class="menu-item__submenu-icon" aria-hidden="true">
|
|
620
|
-
<
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
stroke-width="2"
|
|
627
|
-
stroke-linecap="round"
|
|
628
|
-
stroke-linejoin="round"
|
|
629
|
-
>
|
|
630
|
-
<polyline points="9 18 15 12 9 6" />
|
|
631
|
-
</svg>
|
|
614
|
+
<hx-icon
|
|
615
|
+
class="menu-item__glyph"
|
|
616
|
+
library="helix"
|
|
617
|
+
name="chevron-right"
|
|
618
|
+
aria-hidden="true"
|
|
619
|
+
></hx-icon>
|
|
632
620
|
</span>
|
|
633
621
|
`;
|
|
634
622
|
}
|
|
@@ -762,8 +750,8 @@ const q = _`
|
|
|
762
750
|
}
|
|
763
751
|
}
|
|
764
752
|
`;
|
|
765
|
-
var
|
|
766
|
-
for (var i = n > 1 ? void 0 : n ?
|
|
753
|
+
var z = Object.getOwnPropertyDescriptor, P = (e, t, s, n) => {
|
|
754
|
+
for (var i = n > 1 ? void 0 : n ? z(t, s) : t, r = e.length - 1, a; r >= 0; r--)
|
|
767
755
|
(a = e[r]) && (i = a(i) || i);
|
|
768
756
|
return i;
|
|
769
757
|
};
|
|
@@ -786,7 +774,7 @@ let b = class extends I {
|
|
|
786
774
|
}
|
|
787
775
|
};
|
|
788
776
|
b.styles = [q, g];
|
|
789
|
-
b =
|
|
777
|
+
b = P([
|
|
790
778
|
v("hx-menu-divider")
|
|
791
779
|
], b);
|
|
792
780
|
export {
|
|
@@ -794,4 +782,4 @@ export {
|
|
|
794
782
|
b as a,
|
|
795
783
|
l as b
|
|
796
784
|
};
|
|
797
|
-
//# sourceMappingURL=hx-menu-divider-
|
|
785
|
+
//# sourceMappingURL=hx-menu-divider-g0grbWV9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hx-menu-divider-g0grbWV9.js","sources":["../../src/components/hx-menu/hx-menu.styles.ts","../../src/components/hx-menu/hx-menu.ts","../../src/components/hx-menu/hx-menu-item.styles.ts","../../src/components/hx-menu/hx-menu-item.ts","../../src/components/hx-menu/hx-menu-divider.styles.ts","../../src/components/hx-menu/hx-menu-divider.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixMenuStyles = css`\n :host {\n display: block;\n }\n\n .menu {\n display: flex;\n flex-direction: column;\n padding: var(--hx-space-1, 0.25rem);\n background: var(--hx-menu-bg, var(--hx-color-surface-default, #ffffff));\n border: var(--hx-border-width-thin, 1px) solid\n var(--hx-menu-border-color, var(--hx-color-border-default, #d6dbd5));\n border-radius: var(--hx-menu-border-radius, var(--hx-border-radius-md, 0.375rem));\n box-shadow: var(\n --hx-menu-shadow,\n var(--hx-shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1))\n );\n min-width: var(--hx-menu-min-width, 10rem);\n max-height: var(--hx-menu-max-height, 20rem);\n overflow-y: auto;\n outline: none;\n }\n\n /* ─── High Contrast Mode (forced-colors) ─── */\n\n @media (forced-colors: active) {\n .menu {\n background-color: Canvas;\n border: 2px solid CanvasText;\n }\n }\n`;\n","import { html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { HelixElement } from '../../base/index.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { helixMenuStyles } from './hx-menu.styles.js';\nimport type { HelixMenuItem } from './hx-menu-item.js';\nimport { devWarn } from '../../utils/dev-warn.js';\nimport {\n installAriaIdrefMirror,\n resolveIdrefTokens,\n supportsIdrefElementReferences,\n type AriaIdrefMirrorHandle,\n} from '../../utils/aria-idref.js';\nimport { flattenAccName } from '../../utils/aria-flatten.js';\nimport { getMenuItemTypeaheadLabel } from '../../utils/menu-label.js';\nimport {\n findClosestMenuAncestor as findClosestMenuAncestorElement,\n findOwningMenuItem as findOwningMenuItemElement,\n} from '../../utils/menu-tree.js';\n\n/**\n * Typed wrapper around the shared `findClosestMenuAncestor` walker that\n * narrows the result to `HelixMenu` for in-file consumers. Codex push-gate\n * round-4 (logic) + round-9 (extraction).\n * @internal\n */\nfunction findClosestMenuAncestor(start: Element): HelixMenu | null {\n const found = findClosestMenuAncestorElement(start);\n return found instanceof Element && found.tagName.toLowerCase() === 'hx-menu'\n ? (found as HelixMenu)\n : null;\n}\n\n/**\n * Typed wrapper around the shared `findOwningMenuItem` walker. Codex\n * push-gate round-4 (logic) + round-9 (extraction).\n * @internal\n */\nfunction findOwningMenuItem(menu: HelixMenu): HelixMenuItem | null {\n const found = findOwningMenuItemElement(menu);\n return found instanceof Element && found.tagName.toLowerCase() === 'hx-menu-item'\n ? (found as HelixMenuItem)\n : null;\n}\n\n/**\n * A menu container that manages keyboard navigation over a list of menu items.\n * Use with `hx-menu-item` and `hx-menu-divider`.\n *\n * Group 5b host-canonical: `role=\"menu\"` lives on the **host** via\n * `_internals.role`. The host carries the announced surface so AT walks\n * `<hx-menu>` (role=menu) → slotted `<hx-menu-item>` (role=menuitem on host)\n * directly without two layers of indirection. Consumer-supplied\n * `aria-label` / `aria-labelledby` on the host are resolved via the shared\n * IDREF mirror; cross-shadow naming uses `ariaLabelledByElements` (modern)\n * with a flattened-string fallback (legacy).\n *\n * Submenu coordination: when an `hx-menu-item` emits `hx-item-submenu-open`\n * or `hx-item-submenu-close`, the parent menu auto-handles the toggle by\n * calling `setSubmenuOpen()` on the item — UNLESS the consumer has called\n * `event.preventDefault()` on the bubbled event, signaling that they own the\n * submenu lifecycle. This matches APG-mandated behaviour while leaving an\n * opt-out for advanced consumers.\n *\n * @summary Context/action menu with keyboard-navigable items.\n *\n * @tag hx-menu\n *\n * @slot - Default slot for hx-menu-item and hx-menu-divider elements.\n *\n * @fires {CustomEvent<{item: HelixMenuItem, value: string}>} hx-select - Dispatched when an item is selected.\n * @fires {CustomEvent<void>} hx-close - Dispatched when Escape is pressed.\n *\n * @csspart base - The root menu element.\n *\n * @cssprop [--hx-menu-bg=var(--hx-color-neutral-0)] - Menu background color.\n * @cssprop [--hx-menu-border-color=var(--hx-color-neutral-200)] - Menu border color.\n * @cssprop [--hx-menu-border-radius=var(--hx-border-radius-md)] - Menu border radius.\n * @cssprop [--hx-menu-shadow] - Menu box shadow.\n * @cssprop [--hx-menu-min-width=10rem] - Minimum menu width.\n * @cssprop [--hx-menu-max-height=20rem] - Maximum menu height before vertical scroll is activated.\n * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-color-neutral-0] - Color.\n * @cssprop [--hx-border-width-thin] - Width.\n * @cssprop [--hx-color-neutral-200] - Color.\n * @cssprop [--hx-border-radius-md] - CSS custom property.\n * @cssprop [--hx-shadow-md] - Box shadow.\n * @aaa-certified 2026-05-08\n * @aaa-criteria 1.4.6, 1.4.9, 2.1.3, 2.3.3, 2.4.12, 2.4.13, 2.5.5, 3.2.5, 3.3.6, forced-colors, apg-keyboard\n * @aaa-audit src/components/hx-menu/AAA-AUDIT.md\n * @keyboard-contract navigate=Arrow,Home,End; activate=Enter,Space; dismiss=Escape; disabled-suppresses=true\n * @aria-pattern menu\n * @aria-pattern-source https://www.w3.org/WAI/ARIA/apg/patterns/menubar/\n * @forced-colors-supported true\n * @stability stable\n * @since 3.7.0\n * @form-associated false\n * @theme-aware true\n * @brand-aware true\n * @drupal-sdc-eligible true\n * @react-wrapper-status complete\n * @figma-component-name hx-menu\n * @priority-tier P0\n * @phi-handles false\n * @clinical-context none\n */\n@customElement('hx-menu')\nexport class HelixMenu extends HelixElement {\n static override styles = [helixMenuStyles, forcedColorsInteractive];\n\n /**\n * Accessible label for the menu. Used as a fallback when no consumer-supplied\n * `aria-label` / `aria-labelledby` is present on the host. On the modern\n * host-canonical path this projects onto `internals.ariaLabel`; on the\n * legacy fallback path it appears as `aria-label` on the inner div.\n * @attr label\n */\n @property({ type: String, reflect: true })\n label = '';\n\n /**\n * Index of the currently focused menu item within the list of enabled items.\n * @internal\n */\n private _focusedIndex = -1;\n\n /**\n * Accumulated character buffer for typeahead search within menu items.\n * @internal\n */\n private _typeaheadBuffer = '';\n\n /**\n * Timer handle that clears the typeahead buffer after a period of inactivity.\n * @internal\n */\n private _typeaheadTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ─── Host-canonical ARIA bookkeeping ───\n\n /**\n * Test seam (codex push-gate round-2 finding 1): when set to `true` or\n * `false`, overrides the platform `supportsIdrefElementReferences` probe\n * before `connectedCallback` seeds `_supportsIdrefRefs`. Mirrors the\n * hx-select / hx-menu-item seam — required so tests can deterministically\n * exercise the legacy fallback render branch (where the inner\n * `div[role=\"menu\"]` is the announced surface and must mirror the\n * resolved accessible name).\n *\n * Production code MUST NOT touch this field. It is `static` so the test\n * stub cleanup is global and obvious.\n * @internal\n */\n static __testSupportsIdrefRefsOverride: boolean | null = null;\n\n /** @internal */\n private _supportsIdrefRefs = true;\n\n /** @internal */\n private _ariaMirror: AriaIdrefMirrorHandle | null = null;\n\n /**\n * Resolved accessible name for the menu — the single source of truth that\n * both `_syncHostAriaSemantics()` (modern path: writes to\n * `internals.ariaLabel`) and the fallback `render()` branch (legacy path:\n * writes to inner `div[role=\"menu\"]` `aria-label`) read. Recomputed by\n * `_syncHostAriaSemantics()` whenever host aria-* or `label` changes via\n * the shared IDREF mirror. AccName 1.2 §4.3.1 precedence: consumer host\n * `aria-labelledby` (flattened) > consumer host `aria-label` > `label`\n * property > literal \"Menu\".\n * @internal\n */\n private _resolvedAccessibleName = '';\n\n /**\n * Return the menu's enabled, top-level `hx-menu-item` children.\n *\n * Codex push-gate round-6 finding 3: `querySelectorAll('hx-menu-item')`\n * walks the entire descendant tree, which on a parent menuitem\n * includes the slotted nested `<hx-menu>` and ITS items. Treating\n * those as top-level options corrupts roving tabindex, ArrowUp/Down\n * navigation, and typeahead matching (typing the first letter of a\n * grandchild item lands focus there instead of on the next sibling).\n * Restrict to direct children of `this` so each menu owns only its\n * own items.\n *\n * @internal\n */\n private _getItems(): HelixMenuItem[] {\n return Array.from(this.children).filter(\n (el): el is HelixMenuItem =>\n el.tagName.toLowerCase() === 'hx-menu-item' &&\n !(el as HelixMenuItem).disabled &&\n !(el as HelixMenuItem).loading,\n );\n }\n\n /**\n * Synchronize roving tabindex across all enabled items.\n * Only the active item (or first item if none active) gets tabindex=0.\n */\n /** @internal */\n private _syncRovingTabIndex(): void {\n const items = this._getItems();\n const activeIndex = this._focusedIndex >= 0 ? this._focusedIndex : 0;\n items.forEach((item, i) => {\n item.setRovingTabIndex(i === activeIndex ? 0 : -1);\n });\n }\n\n /** Focus the first menu item. */\n focusFirst(): void {\n const items = this._getItems();\n const first = items[0];\n if (first !== undefined) {\n this._focusedIndex = 0;\n this._syncRovingTabIndex();\n first.focus();\n }\n }\n\n /** Focus the last menu item. */\n focusLast(): void {\n const items = this._getItems();\n const last = items[items.length - 1];\n if (last !== undefined) {\n this._focusedIndex = items.length - 1;\n this._syncRovingTabIndex();\n last.focus();\n }\n }\n\n /** @internal */\n private _focusItem(index: number): void {\n const items = this._getItems();\n if (items.length === 0) return;\n this._focusedIndex = Math.max(0, Math.min(index, items.length - 1));\n this._syncRovingTabIndex();\n const target = items[this._focusedIndex];\n if (target !== undefined) target.focus();\n }\n\n /** @internal */\n private _updateFocusedIndex(): void {\n const items = this._getItems();\n const active = this.shadowRoot?.activeElement ?? document.activeElement;\n // Find the active item by checking if any item's shadow root contains the active element\n const idx = items.findIndex((item) => item.matches(':focus-within') || item === active);\n if (idx !== -1) this._focusedIndex = idx;\n }\n\n /** @internal */\n private _handleKeyDown(e: KeyboardEvent): void {\n this._updateFocusedIndex();\n const items = this._getItems();\n if (items.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n this._focusItem(this._focusedIndex + 1 < items.length ? this._focusedIndex + 1 : 0);\n break;\n case 'ArrowUp':\n e.preventDefault();\n this._focusItem(this._focusedIndex > 0 ? this._focusedIndex - 1 : items.length - 1);\n break;\n case 'Home':\n e.preventDefault();\n this._focusItem(0);\n break;\n case 'End':\n e.preventDefault();\n this._focusItem(items.length - 1);\n break;\n case 'Escape':\n e.preventDefault();\n this.dispatchEvent(new CustomEvent<void>('hx-close', { bubbles: true, composed: true }));\n break;\n default:\n if (e.key.length === 1 && e.key !== ' ' && !e.ctrlKey && !e.metaKey && !e.altKey) {\n this._handleTypeahead(e.key, items);\n }\n break;\n }\n }\n\n /** @internal */\n private _handleTypeahead(char: string, items: HelixMenuItem[]): void {\n if (this._typeaheadTimer !== null) {\n clearTimeout(this._typeaheadTimer);\n }\n this._typeaheadBuffer += char.toLowerCase();\n this._typeaheadTimer = setTimeout(() => {\n this._typeaheadBuffer = '';\n this._typeaheadTimer = null;\n }, 500);\n\n const match = items.findIndex((item) => {\n if (item.disabled || item.hasAttribute('disabled')) return false;\n const text = this._getTypeaheadLabel(item).toLowerCase();\n return text.startsWith(this._typeaheadBuffer);\n });\n\n if (match !== -1) {\n this._focusItem(match);\n }\n }\n\n /**\n * Read the typeahead label for an item — delegates to the shared\n * `getMenuItemTypeaheadLabel` util so all four menu-bearing components\n * (`hx-menu`, `hx-dropdown`, `hx-overflow-menu`, `hx-split-button`)\n * share one submenu-aware extractor. Codex push-gate round-7 finding 3\n * extracted this helper from its original home here in `hx-menu.ts`.\n *\n * @internal\n */\n private _getTypeaheadLabel(item: HelixMenuItem): string {\n return getMenuItemTypeaheadLabel(item);\n }\n\n /** @internal */\n private _handleSlotChange(e: Event): void {\n const slot = e.target;\n if (!(slot instanceof HTMLSlotElement)) return;\n const validTags = new Set(['hx-menu-item', 'hx-menu-divider']);\n const invalid = slot\n .assignedElements()\n .filter((el) => !validTags.has(el.tagName.toLowerCase()));\n if (invalid.length > 0) {\n devWarn(\n 'hx-menu',\n `Default slot expects <hx-menu-item> or <hx-menu-divider> elements. Found unexpected: ${invalid.map((el) => `<${el.tagName.toLowerCase()}>`).join(', ')}`,\n );\n }\n // Initialize roving tabindex when items are slotted\n this._syncRovingTabIndex();\n }\n\n /** @internal */\n private _handleItemSelect(e: Event): void {\n if (!(e instanceof CustomEvent)) return;\n const detail = (e as CustomEvent<{ item: HelixMenuItem; value: string }>).detail;\n const items = this._getItems();\n this._focusedIndex = items.indexOf(detail.item);\n\n this.dispatchEvent(\n new CustomEvent<{ item: HelixMenuItem; value: string }>('hx-select', {\n bubbles: true,\n composed: true,\n detail: { item: detail.item, value: detail.value },\n }),\n );\n }\n\n /**\n * Auto-handle submenu open/close events emitted by child `hx-menu-item`\n * children. APG-mandated behaviour: ArrowRight on a parent item opens the\n * nested submenu and focuses its first item; ArrowLeft closes the submenu\n * and returns focus to the parent item. Consumers that own submenu\n * lifecycle themselves can `event.preventDefault()` to opt out.\n * @internal\n */\n private _handleSubmenuOpen = (e: Event): void => {\n if (!(e instanceof CustomEvent)) return;\n const detail = (e as CustomEvent<{ item: HelixMenuItem }>).detail;\n const item = detail?.item;\n if (!item) return;\n // Defer to a microtask so consumer listeners (which may be registered\n // AFTER the menu's auto-handler in event order) get a chance to call\n // `event.preventDefault()` and opt out of default submenu lifecycle\n // handling. APG-mandated default: open the nested submenu and focus\n // its first item; consumers that own this themselves cancel the\n // default by calling preventDefault on the event.\n queueMicrotask(() => {\n if (e.defaultPrevented) return;\n item.setSubmenuOpen(true);\n void item.updateComplete\n .then(() => {\n const submenuSlot =\n item.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"submenu\"]');\n const nested = submenuSlot\n ?.assignedElements({ flatten: true })\n .find((el) => el.tagName.toLowerCase() === 'hx-menu') as HelixMenu | undefined;\n nested?.focusFirst();\n })\n .catch(() => undefined);\n });\n };\n\n /** @internal */\n private _handleSubmenuClose = (e: Event): void => {\n if (!(e instanceof CustomEvent)) return;\n const detail = (e as CustomEvent<{ item: HelixMenuItem }>).detail;\n const item = detail?.item;\n if (!item) return;\n // The bubbled event reaches every enclosing `hx-menu` — outer menus\n // would otherwise re-handle a Child's ArrowLeft and stomp on the inner\n // menu's close. Only act when THIS menu is the closest enclosing menu\n // of the dispatching item; outer menus defer to whichever inner menu\n // is responsible. Codex push-gate round-4 P1: previously the outer\n // menu handled the event and called `child.setSubmenuOpen(false)` —\n // a no-op since the child has no submenu — leaving the parent's\n // submenu open and focus stuck on the child.\n const closestMenu = findClosestMenuAncestor(item);\n if (closestMenu !== this) return;\n // Determine which menu-item owns the submenu we should close. When\n // THIS menu is itself slotted into a parent menu-item's `slot=\"submenu\"`\n // (i.e. THIS is a nested submenu), the parent item is the owner —\n // ArrowLeft from any descendant closes the parent's submenu and\n // returns focus to the parent. When THIS menu has no parent menu-item\n // (top-level menu), the dispatching item itself is the only sensible\n // target: a no-op for plain items, a self-close for items with their\n // own submenu open.\n const ownerItem = findOwningMenuItem(this) ?? item;\n queueMicrotask(() => {\n if (e.defaultPrevented) return;\n ownerItem.setSubmenuOpen(false);\n ownerItem.focus();\n });\n };\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Honour the static test override so synthetic environments choose the\n // path BEFORE connect runs — the fallback render branch needs to be\n // selected at first paint so the inner `[role=\"menu\"]` carries the\n // resolved accessible name without a mid-life flag flip.\n const ctor = this.constructor as typeof HelixMenu;\n this._supportsIdrefRefs =\n ctor.__testSupportsIdrefRefsOverride !== null\n ? ctor.__testSupportsIdrefRefsOverride\n : supportsIdrefElementReferences(this._internals);\n // Keydown is bound on the HOST so events from focused host-canonical\n // menu items (which keep keydown out of this menu's shadow DOM)\n // still reach the navigation handler. hx-item-select bubbles\n // through the composed path and is caught here as well.\n this.addEventListener('keydown', this._handleHostKeyDown);\n this.addEventListener('hx-item-select', this._handleItemSelectHost);\n this.addEventListener('hx-item-submenu-open', this._handleSubmenuOpen);\n this.addEventListener('hx-item-submenu-close', this._handleSubmenuClose);\n // Seed host-canonical semantics so role/label appear before first paint.\n this._syncHostAriaSemantics();\n this._ariaMirror = installAriaIdrefMirror(this, () => {\n this._syncHostAriaSemantics();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._typeaheadTimer !== null) {\n clearTimeout(this._typeaheadTimer);\n this._typeaheadTimer = null;\n }\n this.removeEventListener('keydown', this._handleHostKeyDown);\n this.removeEventListener('hx-item-select', this._handleItemSelectHost);\n this.removeEventListener('hx-item-submenu-open', this._handleSubmenuOpen);\n this.removeEventListener('hx-item-submenu-close', this._handleSubmenuClose);\n this._ariaMirror?.disconnect();\n this._ariaMirror = null;\n }\n\n /**\n * Codex push-gate round-7 finding 1: keydown bound on the HOST receives\n * events that bubble out of nested submenus. When a child submenu is\n * open and focus lives inside it, ArrowUp/Down/Home/End/Escape on the\n * inner item bubbles to EVERY enclosing `hx-menu`. Without this guard\n * the outer menu would run `_focusItem(...)` against its OWN top-level\n * items and steal focus back out of the child submenu, and Escape would\n * dispatch one `hx-close` per enclosing menu. Mirrors the\n * `findClosestMenuAncestor` pattern already used by the submenu\n * open/close handlers.\n * @internal\n */\n private _handleHostKeyDown = (e: KeyboardEvent): void => {\n const target = e.target;\n if (target instanceof Element && findClosestMenuAncestor(target) !== this) {\n return;\n }\n this._handleKeyDown(e);\n };\n\n /**\n * Codex push-gate round-7 finding 2: `hx-item-select` bubbles composed\n * through every enclosing `hx-menu`. The outer menu would otherwise\n * (a) corrupt `_focusedIndex` to `-1` because the bubbled item is not\n * a member of the outer menu's items, and (b) re-emit a duplicate\n * `hx-select`. Only act when THIS menu is the closest enclosing menu\n * of the dispatching item.\n * @internal\n */\n private _handleItemSelectHost = (e: Event): void => {\n if (!(e instanceof CustomEvent)) return;\n const detail = (e as CustomEvent<{ item: HelixMenuItem; value: string }>).detail;\n const item = detail?.item;\n if (item && findClosestMenuAncestor(item) !== this) {\n return;\n }\n this._handleItemSelect(e);\n };\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('label')) {\n this._syncHostAriaSemantics();\n }\n }\n\n override firstUpdated(): void {\n const hasEffectiveLabel =\n this.hasAttribute('aria-label') ||\n this.hasAttribute('aria-labelledby') ||\n Boolean(this.label);\n if (!hasEffectiveLabel) {\n devWarn(\n 'hx-menu',\n 'No accessible label provided. Set the `label` attribute, or supply `aria-label` / `aria-labelledby` on hx-menu so screen readers can identify this menu (WCAG 4.1.2).',\n );\n }\n }\n\n /**\n * Mirror menu semantics onto the host via ElementInternals so consumer-\n * supplied `aria-label`, `aria-labelledby`, and the `label` property all\n * reach the announced control. Falls back to a flattened-string label on\n * engines that do not implement `ariaLabelledByElements`.\n * @internal\n */\n private _syncHostAriaSemantics(): void {\n const internals = this._internals;\n\n // Codex push-gate round-8 finding 1 (mirrors round-6 finding 2 in\n // hx-menu-item): on the legacy fallback path the inner\n // `<div role=\"menu\" aria-label=\"…\">` is the announced surface. If we\n // ALSO write `internals.role = 'menu'` (and ariaLabel) onto the host,\n // AT sees TWO menus for one logical surface — the duplicate-surface\n // problem host-canonical migration is meant to eliminate. Suppress\n // host role + label writes on the fallback path; the inner element\n // is the canonical announced surface there. Modern path keeps the\n // host as the canonical surface and clears the inner role.\n if (!this._supportsIdrefRefs) {\n internals.role = null;\n internals.ariaLabel = null;\n } else {\n internals.role = 'menu';\n }\n\n const hostAriaLabel = this.getAttribute('aria-label')?.trim() || '';\n const consumerLabelledBy = this.getAttribute('aria-labelledby');\n const labelEls = resolveIdrefTokens(this, consumerLabelledBy);\n const hasEffectiveLabelledBy = labelEls.length > 0;\n\n type InternalsWithRefs = ElementInternals & {\n ariaLabelledByElements: Element[] | null;\n };\n\n if (this._supportsIdrefRefs) {\n const refsInternals = internals as InternalsWithRefs;\n refsInternals.ariaLabelledByElements = hasEffectiveLabelledBy ? labelEls : null;\n }\n\n // AccName 1.2 §4.3.1 precedence: consumer aria-labelledby (resolved) >\n // consumer aria-label > `label` property > literal \"Menu\" (last-resort).\n // The resolved string is cached on `_resolvedAccessibleName` so the\n // fallback render branch (legacy path: AT reads inner div) can mirror\n // the same name without duplicating the precedence ladder.\n let resolved = '';\n if (hasEffectiveLabelledBy) {\n const flattened =\n labelEls\n .map((el) => flattenAccName(el))\n .filter(Boolean)\n .join(' ') ||\n hostAriaLabel ||\n this.label ||\n 'Menu';\n resolved = flattened;\n if (this._supportsIdrefRefs) {\n // Modern path: element refs win; clear ariaLabel so they aren't\n // shadowed by a stale string. Fallback branch reads\n // `_resolvedAccessibleName` for its inner-div mirror — host\n // ariaLabel is already cleared above on the fallback path.\n internals.ariaLabel = null;\n }\n } else if (hostAriaLabel) {\n resolved = hostAriaLabel;\n if (this._supportsIdrefRefs) {\n internals.ariaLabel = hostAriaLabel;\n }\n } else {\n resolved = this.label || 'Menu';\n if (this._supportsIdrefRefs) {\n internals.ariaLabel = resolved;\n }\n }\n\n // Codex push-gate round-2 finding 1: keep the resolved name available\n // for the legacy render branch. Request a re-render so the fallback\n // `<div role=\"menu\" aria-label=...>` picks up the new value when host\n // aria-* changes after first paint.\n if (this._resolvedAccessibleName !== resolved) {\n this._resolvedAccessibleName = resolved;\n if (!this._supportsIdrefRefs) {\n this.requestUpdate();\n }\n }\n }\n\n override render() {\n // Host-canonical Path A: `role=\"menu\"` and the resolved label live on\n // the host via `_internals`. The inner div is roleless on the modern\n // path so AT does not see a duplicated container role nested inside\n // the host. Legacy fallback keeps the inner role + aria-label so AT\n // without IDL element references still announces the menu.\n // Keydown + hx-item-select listeners are bound on the host in\n // connectedCallback() — keydown does not propagate INTO this menu's\n // shadow DOM, so events from focused host-canonical menu items\n // would never fire on inner-div bindings. hx-item-select bubbles\n // composed through the host either way; we listen on the host for\n // symmetry.\n if (this._supportsIdrefRefs) {\n return html`\n <div part=\"base\" class=\"menu\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n\n // Codex push-gate round-2 finding 1: AT on the fallback path announces\n // the inner div, so it MUST mirror the same accessible name resolved\n // by `_syncHostAriaSemantics()` (consumer host aria-label / aria-\n // labelledby flatten / `label` property). Fall back to `this.label`\n // if the mirror has not run yet (pre-connect render).\n const fallbackLabel = this._resolvedAccessibleName || this.label || nothing;\n return html`\n <div part=\"base\" class=\"menu\" role=\"menu\" aria-label=${fallbackLabel}>\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-menu': HelixMenu;\n }\n}\n","import { css } from 'lit';\n\nexport const helixMenuItemStyles = css`\n :host {\n display: block;\n /* Host carries the roving tabindex on the modern host-canonical path,\n so it becomes the focusable surface. Strip the default focus outline\n from the host so the inner .menu-item:focus-visible (and the host\n :focus-visible rule below) own the visual treatment. */\n outline: none;\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n /* Host is the Tab stop on the modern path; mirror the inner focus-ring\n onto the host so keyboard focus is visible on whichever surface the\n UA paints. The inner-element rule below still applies on the legacy\n fallback path (where the inner div carries the role + tabindex). */\n :host(:focus-visible) .menu-item {\n background-color: var(--hx-menu-item-hover-bg, var(--hx-color-surface-sunken, #ebeee9));\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-menu-item-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-menu-item-focus-ring-offset, 0px);\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n min-height: var(--hx-touch-target-min, 44px);\n padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n cursor: pointer;\n color: var(--hx-menu-item-color, var(--hx-color-text-primary, #0d1825));\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-family: var(--hx-menu-item-font-family, var(--hx-font-family-sans, sans-serif));\n line-height: var(--hx-line-height-tight, 1.25);\n user-select: none;\n -webkit-user-select: none;\n outline: none;\n background: none;\n width: 100%;\n box-sizing: border-box;\n transition: background-color var(--hx-transition-fast, 150ms ease);\n }\n\n .menu-item:hover,\n .menu-item:focus-visible {\n background-color: var(--hx-menu-item-hover-bg, var(--hx-color-surface-sunken, #ebeee9));\n }\n\n .menu-item:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-menu-item-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-menu-item-focus-ring-offset, 0px);\n }\n\n .menu-item__prefix,\n .menu-item__suffix {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .menu-item__label {\n flex: 1 1 auto;\n }\n\n .menu-item__checked-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n width: 1em;\n opacity: 0;\n transition: opacity var(--hx-transition-fast, 150ms ease);\n }\n\n .menu-item--checked .menu-item__checked-icon {\n opacity: 1;\n }\n\n .menu-item__submenu-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n margin-inline-start: auto;\n }\n\n /* hx-icon glyph sizing for migrated checked / submenu indicators (1em parity). */\n .menu-item__glyph {\n --hx-icon-size: 1em;\n }\n\n .menu-item__spinner {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n animation: hx-menu-spin var(--hx-duration-spinner, 750ms) linear infinite;\n }\n\n @keyframes hx-menu-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .menu-item {\n transition: none;\n }\n\n .menu-item__checked-icon {\n transition: none;\n }\n\n .menu-item__spinner {\n animation: none;\n opacity: var(--hx-opacity-muted, 0.6);\n }\n }\n\n /* ─── High Contrast Mode (forced-colors) ─── */\n\n @media (forced-colors: active) {\n .menu-item {\n forced-color-adjust: none;\n color: CanvasText;\n background-color: Canvas;\n }\n\n .menu-item:hover,\n .menu-item:focus-visible {\n background-color: Highlight;\n color: HighlightText;\n }\n\n .menu-item:focus-visible {\n outline: 2px solid Highlight;\n outline-offset: -2px;\n }\n\n /* Host-canonical focus parity in forced-colors mode. */\n :host(:focus-visible) .menu-item {\n background-color: Highlight;\n color: HighlightText;\n outline: 2px solid Highlight;\n outline-offset: -2px;\n }\n\n :host([disabled]) .menu-item {\n color: GrayText;\n opacity: 1;\n }\n }\n`;\n","import { html, nothing, type PropertyValues } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport '../hx-icon/hx-icon.js';\nimport { HelixElement } from '../../base/index.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { helixMenuItemStyles } from './hx-menu-item.styles.js';\nimport { devWarn } from '../../utils/dev-warn.js';\nimport {\n installAriaIdrefMirror,\n resolveIdrefTokens,\n supportsIdrefElementReferences,\n type AriaIdrefMirrorHandle,\n} from '../../utils/aria-idref.js';\nimport { flattenAccName } from '../../utils/aria-flatten.js';\n\n/**\n * A single interactive item for use inside `hx-menu`. Supports normal, checkbox,\n * and radio types, loading state, prefix/suffix slots, and submenu nesting.\n *\n * Group 5b host-canonical: `role=\"menuitem\"` (or `menuitemcheckbox` /\n * `menuitemradio` based on `type`) lives on the **host** via\n * `_internals.role`. The roving tabindex is written to the host, so the host\n * is the focusable surface and lands directly under the parent `<hx-menu>`\n * (which carries `role=\"menu\"`) in the AT walked tree. The inner element is\n * presentational on the modern path — no role, no aria-* attributes — and\n * carries only click/keyboard event handlers. Keyboard activation\n * (Enter/Space) is owned by the host's `keydown` handler.\n *\n * Cross-shadow naming: consumer-supplied `aria-label` / `aria-labelledby` on\n * the host project to `internals.ariaLabel` / `internals.ariaLabelledByElements`\n * via the shared IDREF mirror. The slotted text content is used as the default\n * accessible name when no override is set (AT walks slotted children\n * automatically through the host's role).\n *\n * @summary Interactive item within an hx-menu.\n *\n * @tag hx-menu-item\n *\n * @slot - Default slot for the item label.\n * @slot prefix - Icon or content rendered before the label.\n * @slot suffix - Shortcut text or icon rendered after the label.\n * @slot submenu - A nested hx-menu for submenu content.\n *\n * @fires {CustomEvent<{item: HelixMenuItem, value: string}>} hx-item-select - Dispatched when the item is activated via click, Enter, or Space.\n * @fires {CustomEvent<{item: HelixMenuItem}>} hx-item-submenu-open - Dispatched when ArrowRight is pressed on an item with a submenu.\n * @fires {CustomEvent<{item: HelixMenuItem}>} hx-item-submenu-close - Dispatched when ArrowLeft is pressed on an item, signaling the parent to close the submenu and return focus.\n *\n * @csspart base - The root item element.\n * @csspart prefix - Prefix slot wrapper.\n * @csspart label - Label slot wrapper.\n * @csspart suffix - Suffix slot wrapper.\n * @csspart submenu-icon - The chevron icon indicating a submenu.\n * @csspart checked-icon - The checkmark icon for checkbox-type items.\n *\n * @cssprop [--hx-menu-item-color=var(--hx-color-neutral-900)] - Item text color.\n * @cssprop [--hx-menu-item-hover-bg=var(--hx-color-neutral-100)] - Item hover/focus background.\n */\n@customElement('hx-menu-item')\nexport class HelixMenuItem extends HelixElement {\n static override styles = [helixMenuItemStyles, forcedColorsInteractive];\n\n /**\n * Test seam (codex push-gate round-1 finding 3 mirror of hx-select\n * pattern): when set to `true` or `false`, overrides the platform\n * `supportsIdrefElementReferences` probe before `connectedCallback`\n * seeds `_supportsIdrefRefs`. Tests that need to exercise the fallback\n * path must select it BEFORE the host connects so tabindex / role\n * placement matches a legacy engine for the entire lifecycle.\n *\n * Production code MUST NOT touch this field. It is `static` so the test\n * stub cleanup is global and obvious.\n * @internal\n */\n static __testSupportsIdrefRefsOverride: boolean | null = null;\n\n /**\n * @internal Managed by parent hx-menu for roving tabindex.\n * Only the active item in the menu has tabindex=0; all others have -1.\n */\n @state()\n private _rovingTabIndex = -1;\n\n /** @internal Set the roving tabindex value. Called by parent hx-menu. */\n setRovingTabIndex(value: number): void {\n this._rovingTabIndex = value;\n this._applyHostTabIndex();\n }\n\n /** Set whether the nested submenu is open. Called by the component managing submenu visibility. */\n setSubmenuOpen(open: boolean): void {\n this._submenuOpen = open;\n }\n\n /**\n * The value associated with this item, emitted in the hx-select event.\n * @attr value\n */\n @property({ type: String })\n value = '';\n\n /**\n * Whether the item is disabled. Prevents interaction and event dispatch.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the item is checked. Only meaningful when type=\"checkbox\".\n * @attr checked\n */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * The type of menu item. \"checkbox\" renders a checkmark and toggles checked state.\n * \"radio\" renders a checkmark and emits selection for radio-group behavior.\n * @attr type\n */\n @property({ type: String, reflect: true })\n type: 'normal' | 'checkbox' | 'radio' = 'normal';\n\n /**\n * Whether the item is in a loading state. Shows a spinner and prevents interaction.\n * @attr loading\n */\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n /** @internal */\n @state()\n private _hasSubmenu = false;\n\n /** @internal Tracks whether the nested submenu is currently open. */\n @state()\n private _submenuOpen = false;\n\n /** @internal */\n @query('.menu-item') private _menuItemEl!: HTMLElement | null;\n\n // ─── Host-canonical ARIA bookkeeping ───\n\n /** @internal */\n private _supportsIdrefRefs = true;\n\n /** @internal */\n private _ariaMirror: AriaIdrefMirrorHandle | null = null;\n\n /**\n * Resolved accessible name for the menu item — read by both\n * `_syncHostAriaSemantics()` (modern path: host `internals.ariaLabel`)\n * and the fallback `render()` branch (legacy path: inner\n * `div[role=\"menuitem*\"]` `aria-label`). Empty string means \"no\n * override\" — slotted text content provides the implicit name through\n * the announced surface (host on modern; inner div on fallback). AccName\n * 1.2 §4.3.1 precedence: consumer host `aria-labelledby` (flattened) >\n * consumer host `aria-label` > implicit slotted text.\n * @internal\n */\n private _resolvedAccessibleName = '';\n\n /**\n * Focus the menu item. On the modern host-canonical path, focus lands on\n * the host (which carries the roving tabindex and announced role). On the\n * legacy fallback path, focus delegates to the inner element which still\n * carries the role.\n */\n override focus(options?: FocusOptions): void {\n if (this._supportsIdrefRefs) {\n // Host is the canonical Tab stop on the modern path.\n HTMLElement.prototype.focus.call(this, options);\n } else {\n this._menuItemEl?.focus(options);\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Honour the static test override so synthetic environments choose the\n // path BEFORE connect runs (mirrors hx-select's seam — codex push-gate\n // round-1 finding 3 needs deterministic fallback-path entry to assert\n // host.tabIndex stays out of the tab order).\n const ctor = this.constructor as typeof HelixMenuItem;\n this._supportsIdrefRefs =\n ctor.__testSupportsIdrefRefsOverride !== null\n ? ctor.__testSupportsIdrefRefsOverride\n : supportsIdrefElementReferences(this._internals);\n // WCAG 4.1.2: menuitem role is only valid inside a role=\"menu\" or role=\"menubar\" container.\n // Check the closest ancestor with a menu role.\n const menuHost = this.closest('hx-menu, hx-split-button, [role=\"menu\"], [role=\"menubar\"]');\n if (!menuHost) {\n devWarn(\n 'hx-menu-item',\n 'hx-menu-item must be used inside an hx-menu or an element with role=\"menu\". ' +\n 'An orphaned menuitem violates WCAG 1.3.1 (Info and Relationships).',\n );\n }\n // Keyboard handling lives on the HOST so the active surface (the host\n // on the modern path; either the host or the inner div in delegating\n // engines) receives keydown events. Activation (Enter/Space) and\n // submenu navigation (ArrowLeft/ArrowRight) are routed here; the\n // parent hx-menu owns ArrowUp/ArrowDown/Home/End/typeahead.\n this.addEventListener('keydown', this._handleKeyDown);\n this.addEventListener('click', this._handleClick);\n this._syncHostAriaSemantics();\n this._applyHostTabIndex();\n this._ariaMirror = installAriaIdrefMirror(this, () => {\n this._syncHostAriaSemantics();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeyDown);\n this.removeEventListener('click', this._handleClick);\n this._ariaMirror?.disconnect();\n this._ariaMirror = null;\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (\n changedProperties.has('disabled') ||\n changedProperties.has('checked') ||\n changedProperties.has('type') ||\n changedProperties.has('loading') ||\n (changedProperties as Map<PropertyKey, unknown>).has('_hasSubmenu') ||\n (changedProperties as Map<PropertyKey, unknown>).has('_submenuOpen')\n ) {\n this._syncHostAriaSemantics();\n }\n if (\n (changedProperties as Map<PropertyKey, unknown>).has('_rovingTabIndex') ||\n changedProperties.has('disabled')\n ) {\n this._applyHostTabIndex();\n }\n }\n\n /**\n * Apply the roving tabindex to the host (modern path) so the host is the\n * Tab stop. Disabled items are non-tabbable.\n *\n * Codex push-gate round-1 finding 3: on the fallback path\n * (`_supportsIdrefRefs === false`), the inner `.menu-item` element\n * carries `role=\"menuitem\"` and the roving tabindex via the template\n * (see `render()`'s legacy branch). If we ALSO assign a non-negative\n * tabindex to the host, the user gets two focusable surfaces per item —\n * Tab can land on the host even though the AT-announced role/aria-* live\n * on the inner element. The host MUST be removed from the tab order on\n * the fallback path; the inner element is the canonical Tab stop.\n * @internal\n */\n private _applyHostTabIndex(): void {\n if (!this._supportsIdrefRefs) {\n // Fallback path: inner `.menu-item` is the focusable surface. Keep\n // the host out of the sequential focus order entirely.\n this.tabIndex = -1;\n return;\n }\n if (this.disabled) {\n this.tabIndex = -1;\n } else {\n this.tabIndex = this._rovingTabIndex;\n }\n }\n\n /**\n * Mirror menuitem semantics onto the host via ElementInternals. Role is\n * derived from `type` (normal → menuitem, checkbox → menuitemcheckbox,\n * radio → menuitemradio). aria-disabled, aria-checked, aria-haspopup,\n * aria-expanded, and aria-busy reactively follow component state.\n * Consumer-supplied `aria-label` / `aria-labelledby` on the host project\n * onto `internals.ariaLabel` / `internals.ariaLabelledByElements`.\n * @internal\n */\n private _syncHostAriaSemantics(): void {\n const internals = this._internals;\n const role = this._getRole();\n\n // Codex push-gate round-6 finding 2: on the legacy fallback path\n // (`_supportsIdrefRefs === false`) the inner `.menu-item` element\n // already exposes role=\"menuitem*\" + aria-disabled / aria-checked /\n // aria-haspopup / aria-expanded / aria-busy via the template. If we\n // ALSO write those onto the host's ElementInternals, AT sees TWO\n // menuitems for one logical option — the duplicate-surface problem\n // host-canonical migration is meant to eliminate. Suppress all of\n // these state writes on the host when the fallback path is in\n // effect; the inner element is the canonical announced surface.\n if (!this._supportsIdrefRefs) {\n internals.role = null;\n internals.ariaDisabled = null;\n internals.ariaChecked = null;\n internals.ariaHasPopup = null;\n internals.ariaExpanded = null;\n internals.ariaBusy = null;\n } else {\n internals.role = role;\n internals.ariaDisabled = this.disabled ? 'true' : null;\n\n const hasCheckableRole = this.type === 'checkbox' || this.type === 'radio';\n internals.ariaChecked = hasCheckableRole ? (this.checked ? 'true' : 'false') : null;\n\n internals.ariaHasPopup = this._hasSubmenu ? 'menu' : null;\n internals.ariaExpanded = this._hasSubmenu ? (this._submenuOpen ? 'true' : 'false') : null;\n internals.ariaBusy = this.loading ? 'true' : null;\n }\n\n const hostAriaLabel = this.getAttribute('aria-label')?.trim() || '';\n const consumerLabelledBy = this.getAttribute('aria-labelledby');\n const labelEls = resolveIdrefTokens(this, consumerLabelledBy);\n const hasEffectiveLabelledBy = labelEls.length > 0;\n\n type InternalsWithRefs = ElementInternals & {\n ariaLabelledByElements: Element[] | null;\n };\n\n if (this._supportsIdrefRefs) {\n const refsInternals = internals as InternalsWithRefs;\n refsInternals.ariaLabelledByElements = hasEffectiveLabelledBy ? labelEls : null;\n }\n\n // AccName 1.2 §4.3.1 precedence: consumer aria-labelledby (resolved) >\n // consumer aria-label > implicit slotted text (left to AccName\n // computation through the host's role). When neither override is\n // supplied, ariaLabel is cleared so AT walks slotted children for the\n // accessible name. The resolved string is cached on\n // `_resolvedAccessibleName` so the fallback render branch (legacy path:\n // AT reads inner div) can mirror the same override without duplicating\n // the precedence ladder.\n let resolved = '';\n if (hasEffectiveLabelledBy) {\n const flattened =\n labelEls\n .map((el) => flattenAccName(el))\n .filter(Boolean)\n .join(' ') ||\n hostAriaLabel ||\n '';\n resolved = flattened;\n if (this._supportsIdrefRefs) {\n // Modern path: element refs win; clear ariaLabel so they aren't\n // shadowed by a stale string. Fallback branch reads\n // `_resolvedAccessibleName` for its inner-div mirror.\n internals.ariaLabel = null;\n } else {\n internals.ariaLabel = flattened || null;\n }\n } else if (hostAriaLabel) {\n resolved = hostAriaLabel;\n if (this._supportsIdrefRefs) {\n // Modern path: host carries the accessible name directly.\n internals.ariaLabel = hostAriaLabel;\n } else {\n // Fallback path: the inner [role=\"menuitem*\"] div is the named\n // surface (it mirrors `_resolvedAccessibleName` via aria-label).\n // Suppress the host aria-label so AT does not announce a second\n // duplicate name (CodeRabbit MUST-FIX: leaked duplicate name).\n internals.ariaLabel = null;\n }\n } else {\n // No override — leave the announced surface to walk slotted text.\n internals.ariaLabel = null;\n }\n\n // Codex push-gate round-2 finding 2: keep the resolved override\n // available for the legacy render branch. Request a re-render so the\n // fallback `<div role=\"menuitem*\" aria-label=...>` picks up the new\n // value when host aria-* changes after first paint.\n if (this._resolvedAccessibleName !== resolved) {\n this._resolvedAccessibleName = resolved;\n if (!this._supportsIdrefRefs) {\n this.requestUpdate();\n }\n }\n }\n\n /** @internal */\n private _handleSubmenuSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasSubmenu = slot.assignedElements().length > 0;\n }\n\n /** @internal */\n private _activate(): void {\n if (this.disabled || this.loading) return;\n\n if (this.type === 'checkbox') {\n this.checked = !this.checked;\n } else if (this.type === 'radio') {\n const menu = this.closest('hx-menu');\n if (menu) {\n menu\n .querySelectorAll<HelixMenuItem>(':scope > hx-menu-item[type=\"radio\"]')\n .forEach((sibling) => {\n sibling.checked = sibling === this;\n });\n } else {\n this.checked = true;\n }\n }\n\n this.dispatchEvent(\n new CustomEvent<{ item: HelixMenuItem; value: string }>('hx-item-select', {\n bubbles: true,\n composed: true,\n detail: { item: this, value: this.value },\n }),\n );\n }\n\n /**\n * Origin guard for host-bound click/keydown handlers. Returns `true` only\n * when the event originated on THIS host (its shadow tree) and not on a\n * nested `hx-menu-item` projected into the `submenu` slot.\n *\n * Codex push-gate round-5 P1: nested submenu items are slotted descendants\n * in the parent's light DOM. Click/keydown events from a Child item bubble\n * through the parent host's listeners — without this guard, selecting Child\n * also activates Parent (double `hx-item-select`) and Enter/Space/ArrowRight\n * on Child re-trigger Parent's handlers (wrong-level activation, second\n * submenu reopen).\n *\n * Walks `composedPath()` and returns the closest `hx-menu-item` ancestor of\n * the original target; the event is \"ours\" iff that ancestor is `this`.\n * Mirrors the inner-vs-host origin discipline used by `hx-checkbox`,\n * `hx-switch`, and `hx-toggle-button`'s host handlers (`path[0] !== this`)\n * but adapts for hx-menu-item's nested-host case where path[0] is the\n * deepest inner element of a slotted child's own shadow tree.\n * @internal\n */\n private _isOwnEvent(e: Event): boolean {\n const path = e.composedPath();\n for (const node of path) {\n if (!(node instanceof Element)) continue;\n if (node.tagName === 'HX-MENU-ITEM') {\n return node === this;\n }\n }\n return false;\n }\n\n /** @internal */\n private _handleClick = (e: MouseEvent): void => {\n // Codex push-gate round-5 finding 1 (P1): clicks on a nested submenu's\n // child item bubble through this host. Without an origin guard, both\n // Child and Parent activate — wrong value emitted, possibly closes menu.\n if (!this._isOwnEvent(e)) return;\n if (this.disabled || this.loading) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n this._activate();\n };\n\n /** @internal */\n private _handleKeyDown = (e: KeyboardEvent): void => {\n // Codex push-gate round-5 finding 2 (P1): Enter / Space / ArrowRight\n // dispatched at a focused Child item inside an open submenu bubble\n // through this host. Without an origin guard, Parent treats them as its\n // own — double activation and wrong-level submenu reopen. The original\n // JSDoc on this handler described this guard but never enforced it.\n if (!this._isOwnEvent(e)) return;\n\n // Only handle keys whose target is THIS host (or its shadow). The\n // parent hx-menu's keydown handler runs first via bubbling and may\n // already have moved focus; we ignore events that aren't aimed at us.\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._activate();\n return;\n }\n\n if (e.key === 'ArrowRight' && this._hasSubmenu) {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent<{ item: HelixMenuItem }>('hx-item-submenu-open', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: { item: this },\n }),\n );\n return;\n }\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent<{ item: HelixMenuItem }>('hx-item-submenu-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: { item: this },\n }),\n );\n }\n };\n\n /** @internal */\n private _renderCheckedIcon() {\n return html`\n <span part=\"checked-icon\" class=\"menu-item__checked-icon\" aria-hidden=\"true\">\n <hx-icon class=\"menu-item__glyph\" library=\"helix\" name=\"check\" aria-hidden=\"true\"></hx-icon>\n </span>\n `;\n }\n\n /** @internal */\n private _renderSubmenuIcon() {\n return html`\n <span part=\"submenu-icon\" class=\"menu-item__submenu-icon\" aria-hidden=\"true\">\n <hx-icon\n class=\"menu-item__glyph\"\n library=\"helix\"\n name=\"chevron-right\"\n aria-hidden=\"true\"\n ></hx-icon>\n </span>\n `;\n }\n\n /** @internal */\n private _renderSpinner() {\n return html`\n <svg class=\"menu-item__spinner\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" opacity=\"0.3\" />\n <path\n d=\"M12 2a10 10 0 0 1 10 10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n />\n </svg>\n `;\n }\n\n /** @internal */\n private _getRole(): 'menuitem' | 'menuitemcheckbox' | 'menuitemradio' {\n switch (this.type) {\n case 'checkbox':\n return 'menuitemcheckbox';\n case 'radio':\n return 'menuitemradio';\n default:\n return 'menuitem';\n }\n }\n\n override render() {\n const role = this._getRole();\n const hasCheckableRole = this.type === 'checkbox' || this.type === 'radio';\n const classes = {\n 'menu-item': true,\n 'menu-item--checked': this.checked,\n };\n\n // Modern host-canonical path: role/aria-* and tabindex live on the\n // host via `_internals` and the `_applyHostTabIndex()` helper. The\n // inner element is a presentational div (ARIA 1.2 forbids\n // role=\"presentation\" on focusable elements; non-focusable plain div\n // is the cleanest strip). Click + keydown handlers stay on the host\n // via the wrapper div for delegation; this preserves keyboard\n // activation while leaving the host as the AT-announced surface.\n if (this._supportsIdrefRefs) {\n // Click + keydown handlers are bound on the host in\n // connectedCallback() — keydown does not propagate INTO shadow\n // DOM, so binding inside the template would miss host-focused\n // events on the modern path.\n return html`\n <div part=\"base\" class=${classMap(classes)}>\n ${this.loading ? this._renderSpinner() : nothing}\n ${hasCheckableRole ? this._renderCheckedIcon() : nothing}\n <span part=\"prefix\" class=\"menu-item__prefix\">\n <slot name=\"prefix\"></slot>\n </span>\n <span part=\"label\" class=\"menu-item__label\">\n <slot></slot>\n </span>\n <span part=\"suffix\" class=\"menu-item__suffix\">\n <slot name=\"suffix\"></slot>\n </span>\n ${this._hasSubmenu ? this._renderSubmenuIcon() : nothing}\n <slot name=\"submenu\" @slotchange=${this._handleSubmenuSlotChange}></slot>\n </div>\n `;\n }\n\n // Legacy fallback: keep role/aria-* on inner div for AT without IDL\n // element references on ElementInternals. Click + keydown still\n // listen on the host (see connectedCallback) so behaviour is uniform.\n //\n // Codex push-gate round-2 finding 2: AT on the fallback path\n // announces the inner div, so it MUST mirror the same accessible name\n // resolved by `_syncHostAriaSemantics()` (consumer host aria-label /\n // aria-labelledby flatten). Empty string means \"no override\" — let AT\n // walk slotted text content for the implicit name.\n const fallbackAriaLabel = this._resolvedAccessibleName || nothing;\n return html`\n <div\n part=\"base\"\n class=${classMap(classes)}\n role=${role}\n tabindex=${this.disabled ? '-1' : String(this._rovingTabIndex)}\n aria-label=${fallbackAriaLabel}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-checked=${hasCheckableRole ? (this.checked ? 'true' : 'false') : nothing}\n aria-haspopup=${this._hasSubmenu ? 'menu' : nothing}\n aria-expanded=${this._hasSubmenu ? (this._submenuOpen ? 'true' : 'false') : nothing}\n aria-busy=${this.loading ? 'true' : nothing}\n >\n ${this.loading ? this._renderSpinner() : nothing}\n ${hasCheckableRole ? this._renderCheckedIcon() : nothing}\n <span part=\"prefix\" class=\"menu-item__prefix\">\n <slot name=\"prefix\"></slot>\n </span>\n <span part=\"label\" class=\"menu-item__label\">\n <slot></slot>\n </span>\n <span part=\"suffix\" class=\"menu-item__suffix\">\n <slot name=\"suffix\"></slot>\n </span>\n ${this._hasSubmenu ? this._renderSubmenuIcon() : nothing}\n <slot name=\"submenu\" @slotchange=${this._handleSubmenuSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-menu-item': HelixMenuItem;\n }\n}\n","import { css } from 'lit';\n\nexport const helixMenuDividerStyles = css`\n :host {\n display: block;\n }\n\n .menu-divider {\n height: var(--hx-border-width-thin, 1px);\n background-color: var(--hx-menu-divider-color, var(--hx-color-border-default, #d6dbd5));\n margin: var(--hx-space-1, 0.25rem) calc(-1 * var(--hx-space-1, 0.25rem));\n }\n\n /* ─── High Contrast Mode (forced-colors) ─── */\n\n @media (forced-colors: active) {\n .menu-divider {\n background-color: GrayText;\n }\n }\n`;\n","import { html } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement } from 'lit/decorators.js';\nimport { HelixElement } from '../../base/index.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { helixMenuDividerStyles } from './hx-menu-divider.styles.js';\nimport { supportsIdrefElementReferences } from '../../utils/aria-idref.js';\n\n/**\n * A visual separator for grouping items within an `hx-menu`.\n *\n * Group 5b host-canonical: `role=\"separator\"` lives on the **host** via\n * `_internals.role` so the parent `<hx-menu>` (`role=\"menu\"`) sees the\n * separator as a direct child. `aria-orientation` is mirrored onto the host\n * via `internals.ariaOrientation`. The inner div is presentational on the\n * modern path and stripped of its role; the legacy fallback keeps the\n * inner role for engines without ElementInternals IDL accessors.\n *\n * @summary Horizontal divider between menu sections.\n *\n * @tag hx-menu-divider\n *\n * @csspart base - The root separator element.\n *\n * @cssprop [--hx-menu-divider-color=var(--hx-color-neutral-200)] - Divider line color.\n */\n@customElement('hx-menu-divider')\nexport class HelixMenuDivider extends HelixElement {\n static override styles = [helixMenuDividerStyles, forcedColorsInteractive];\n\n /** @internal */\n private _supportsIdrefRefs = true;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._supportsIdrefRefs = supportsIdrefElementReferences(this._internals);\n const internals = this._internals;\n internals.role = 'separator';\n internals.ariaOrientation = 'horizontal';\n }\n\n override render() {\n if (this._supportsIdrefRefs) {\n // Modern path: role lives on host via internals; inner div is\n // presentational.\n return html`<div part=\"base\" class=\"menu-divider\"></div>`;\n }\n // Legacy fallback: keep role/aria-orientation on the inner div for AT\n // without IDL accessors on ElementInternals.\n return html`<div\n part=\"base\"\n class=\"menu-divider\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n ></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-menu-divider': HelixMenuDivider;\n }\n}\n"],"names":["helixMenuStyles","css","findClosestMenuAncestor","start","found","findClosestMenuAncestorElement","findOwningMenuItem","menu","findOwningMenuItemElement","HelixMenu","HelixElement","detail","item","submenuSlot","_a","nested","el","ownerItem","target","items","activeIndex","i","first","last","index","active","idx","char","match","getMenuItemTypeaheadLabel","slot","validTags","invalid","devWarn","ctor","supportsIdrefElementReferences","installAriaIdrefMirror","changedProperties","internals","hostAriaLabel","consumerLabelledBy","labelEls","resolveIdrefTokens","hasEffectiveLabelledBy","refsInternals","resolved","flattenAccName","html","fallbackLabel","nothing","forcedColorsInteractive","__decorateClass","property","customElement","helixMenuItemStyles","HelixMenuItem","value","open","options","role","hasCheckableRole","flattened","sibling","path","node","classes","classMap","fallbackAriaLabel","state","query","helixMenuDividerStyles","HelixMenuDivider"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { property as
|
|
3
|
-
import { classMap as
|
|
4
|
-
import { repeat as
|
|
5
|
-
import { f as
|
|
6
|
-
import { H as
|
|
7
|
-
const
|
|
1
|
+
import { css as k, html as u, nothing as b } from "lit";
|
|
2
|
+
import { property as m, state as g, customElement as y } from "lit/decorators.js";
|
|
3
|
+
import { classMap as x } from "lit/directives/class-map.js";
|
|
4
|
+
import { repeat as w } from "lit/directives/repeat.js";
|
|
5
|
+
import { f as C } from "./forced-colors-CTEDFRGa.js";
|
|
6
|
+
import { H as A } from "./helix-element-BNEYeiys.js";
|
|
7
|
+
const I = k`
|
|
8
8
|
:host {
|
|
9
9
|
display: block;
|
|
10
10
|
font-family: var(--hx-nav-font-family, var(--hx-font-family-sans, sans-serif));
|
|
@@ -76,6 +76,16 @@ const O = y`
|
|
|
76
76
|
align-items: center;
|
|
77
77
|
gap: var(--hx-space-1, 0.25rem);
|
|
78
78
|
padding: var(--hx-nav-item-padding, var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem));
|
|
79
|
+
/*
|
|
80
|
+
* WCAG 2.5.5 (Enhanced) AAA — nav links rendered with default padding
|
|
81
|
+
* land at ~37 px tall (8 px + 1.5 line-height + 8 px). The link
|
|
82
|
+
* content is first-party (rendered via consumer-supplied props on
|
|
83
|
+
* <hx-nav-item>), so the slotted-content carve-out does not apply —
|
|
84
|
+
* this is a real component obligation. Bind --hx-nav-link-min-height
|
|
85
|
+
* to --hx-touch-target-min (2.75rem / 44 px) to grow the interactive
|
|
86
|
+
* area without enlarging the visible label.
|
|
87
|
+
*/
|
|
88
|
+
min-height: var(--hx-nav-link-min-height, var(--hx-touch-target-min, 2.75rem));
|
|
79
89
|
color: var(--hx-nav-link-color, var(--hx-color-neutral-100, #ebeee9));
|
|
80
90
|
text-decoration: none;
|
|
81
91
|
border-radius: var(--hx-nav-border-radius, var(--hx-border-radius-sm, 0.25rem));
|
|
@@ -104,13 +114,26 @@ const O = y`
|
|
|
104
114
|
}
|
|
105
115
|
|
|
106
116
|
.nav__link--active {
|
|
107
|
-
background-color: var(--hx-nav-link-active-bg, var(--hx-color-primary-
|
|
108
|
-
|
|
117
|
+
background-color: var(--hx-nav-link-active-bg, var(--hx-color-action-primary-bg, #0f6363));
|
|
118
|
+
/* Use --hx-color-text-on-primary so the active-link text inherits the
|
|
119
|
+
* action-surface AAA-strict pairing (white on primary-700 in default
|
|
120
|
+
* themes; black on lighter primary-700 in the high-contrast theme).
|
|
121
|
+
* Pre-3.4.0 this consumed --hx-color-primary-600 directly which
|
|
122
|
+
* resolved to Apex #0F7078 + white = 5.82:1 — AAA-large only, AAA
|
|
123
|
+
* normal fail under WCAG 1.4.6 for body-text-sized link labels. The
|
|
124
|
+
* Phase 4 Tier 3 chain shift moved action.primary.bg to primary-700
|
|
125
|
+
* (Apex 7.03:1 with white) and consuming the action semantic here
|
|
126
|
+
* picks up the AAA-strict pairing across the full 6-brand matrix.
|
|
127
|
+
* Hardcoding white previously failed AAA-large in high-contrast
|
|
128
|
+
* (ratio 2.54 vs. 4.5 floor); the on-primary token resolves correctly
|
|
129
|
+
* in HC mode. */
|
|
130
|
+
color: var(--hx-nav-link-active-color, var(--hx-color-text-on-primary, #ffffff));
|
|
109
131
|
}
|
|
110
132
|
|
|
111
133
|
/* ─── Chevron Icon ─── */
|
|
112
134
|
|
|
113
135
|
.nav__chevron {
|
|
136
|
+
--hx-icon-size: 16px;
|
|
114
137
|
transition: transform var(--hx-transition-normal, 200ms) ease;
|
|
115
138
|
flex-shrink: 0;
|
|
116
139
|
}
|
|
@@ -119,6 +142,12 @@ const O = y`
|
|
|
119
142
|
transform: rotate(180deg);
|
|
120
143
|
}
|
|
121
144
|
|
|
145
|
+
/* ─── Hamburger Icon (mobile menu trigger) ─── */
|
|
146
|
+
|
|
147
|
+
.nav__hamburger-glyph {
|
|
148
|
+
--hx-icon-size: 24px;
|
|
149
|
+
}
|
|
150
|
+
|
|
122
151
|
/* ─── Submenu ─── */
|
|
123
152
|
|
|
124
153
|
.nav__submenu {
|
|
@@ -262,12 +291,12 @@ const O = y`
|
|
|
262
291
|
}
|
|
263
292
|
}
|
|
264
293
|
`;
|
|
265
|
-
var
|
|
266
|
-
for (var t =
|
|
267
|
-
(l = e[
|
|
268
|
-
return
|
|
294
|
+
var $ = Object.defineProperty, O = Object.getOwnPropertyDescriptor, p = (e, n, r, i) => {
|
|
295
|
+
for (var t = i > 1 ? void 0 : i ? O(n, r) : n, o = e.length - 1, l; o >= 0; o--)
|
|
296
|
+
(l = e[o]) && (t = (i ? l(n, r, t) : l(t)) || t);
|
|
297
|
+
return i && t && $(n, r, t), t;
|
|
269
298
|
};
|
|
270
|
-
let c = class extends
|
|
299
|
+
let c = class extends A {
|
|
271
300
|
constructor() {
|
|
272
301
|
super(...arguments), this.items = [], this.orientation = "horizontal", this.label = "Main navigation", this.labelOpenMenu = "Open navigation menu", this.labelCloseMenu = "Close navigation menu", this._mobileOpen = !1, this._expandedIndex = null, this._boundOutsideClick = this._handleOutsideClick.bind(this), this._boundFocusout = this._handleFocusout.bind(this);
|
|
273
302
|
}
|
|
@@ -294,8 +323,8 @@ let c = class extends I {
|
|
|
294
323
|
}
|
|
295
324
|
/** @internal */
|
|
296
325
|
_handleItemClick(e, n, r) {
|
|
297
|
-
var
|
|
298
|
-
r.preventDefault(), (
|
|
326
|
+
var i;
|
|
327
|
+
r.preventDefault(), (i = e.children) != null && i.length ? this._expandedIndex = this._expandedIndex === n ? null : n : (this._mobileOpen = !1, this._expandedIndex = null, this.dispatchEvent(
|
|
299
328
|
new CustomEvent("hx-nav-select", {
|
|
300
329
|
bubbles: !0,
|
|
301
330
|
composed: !0,
|
|
@@ -315,16 +344,16 @@ let c = class extends I {
|
|
|
315
344
|
}
|
|
316
345
|
/** @internal */
|
|
317
346
|
_handleKeydown(e, n, r) {
|
|
318
|
-
var l,
|
|
319
|
-
const
|
|
347
|
+
var l, h, d, a, _;
|
|
348
|
+
const i = (l = this.shadowRoot) == null ? void 0 : l.querySelectorAll(
|
|
320
349
|
'[part="list"] > [part="item"] > [part="link"]'
|
|
321
350
|
);
|
|
322
|
-
if (!
|
|
323
|
-
const t = Array.from(
|
|
351
|
+
if (!i) return;
|
|
352
|
+
const t = Array.from(i), o = t[n];
|
|
324
353
|
switch (e.key) {
|
|
325
354
|
case "ArrowRight":
|
|
326
355
|
case "ArrowDown": {
|
|
327
|
-
if (e.preventDefault(), (
|
|
356
|
+
if (e.preventDefault(), (h = r.children) != null && h.length && e.key === "ArrowDown" && this.orientation === "horizontal")
|
|
328
357
|
this._expandedIndex = n, this.updateComplete.then(() => {
|
|
329
358
|
var v;
|
|
330
359
|
const s = (v = this.shadowRoot) == null ? void 0 : v.querySelector(
|
|
@@ -346,7 +375,7 @@ let c = class extends I {
|
|
|
346
375
|
break;
|
|
347
376
|
}
|
|
348
377
|
case "Home": {
|
|
349
|
-
e.preventDefault(), (
|
|
378
|
+
e.preventDefault(), (d = t[0]) == null || d.focus();
|
|
350
379
|
break;
|
|
351
380
|
}
|
|
352
381
|
case "End": {
|
|
@@ -354,12 +383,12 @@ let c = class extends I {
|
|
|
354
383
|
break;
|
|
355
384
|
}
|
|
356
385
|
case "Escape": {
|
|
357
|
-
this._expandedIndex = null,
|
|
386
|
+
this._expandedIndex = null, o == null || o.focus();
|
|
358
387
|
break;
|
|
359
388
|
}
|
|
360
389
|
case "Enter":
|
|
361
390
|
case " ": {
|
|
362
|
-
if ((
|
|
391
|
+
if ((_ = r.children) != null && _.length) {
|
|
363
392
|
e.preventDefault();
|
|
364
393
|
const s = this._expandedIndex === n;
|
|
365
394
|
this._expandedIndex = s ? null : n, s || this.updateComplete.then(() => {
|
|
@@ -376,31 +405,31 @@ let c = class extends I {
|
|
|
376
405
|
}
|
|
377
406
|
/** @internal */
|
|
378
407
|
_handleSubKeydown(e, n) {
|
|
379
|
-
var l,
|
|
408
|
+
var l, h, d;
|
|
380
409
|
const r = (l = this.shadowRoot) == null ? void 0 : l.querySelectorAll(
|
|
381
410
|
'.nav__submenu:not([hidden]) [part="link"]'
|
|
382
411
|
);
|
|
383
412
|
if (!r) return;
|
|
384
|
-
const
|
|
413
|
+
const i = Array.from(r), t = e.currentTarget ?? e.target, o = i.indexOf(t);
|
|
385
414
|
switch (e.key) {
|
|
386
415
|
case "ArrowDown": {
|
|
387
416
|
e.preventDefault();
|
|
388
|
-
const a = o
|
|
417
|
+
const a = i[o + 1] ?? i[0];
|
|
389
418
|
a == null || a.focus();
|
|
390
419
|
break;
|
|
391
420
|
}
|
|
392
421
|
case "ArrowUp": {
|
|
393
422
|
e.preventDefault();
|
|
394
|
-
const a = o
|
|
423
|
+
const a = i[o - 1] ?? i[i.length - 1];
|
|
395
424
|
a == null || a.focus();
|
|
396
425
|
break;
|
|
397
426
|
}
|
|
398
427
|
case "Escape": {
|
|
399
428
|
e.preventDefault(), this._expandedIndex = null;
|
|
400
|
-
const a = (
|
|
429
|
+
const a = (h = this.shadowRoot) == null ? void 0 : h.querySelectorAll(
|
|
401
430
|
'[part="list"] > [part="item"] > [part="link"]'
|
|
402
431
|
);
|
|
403
|
-
(
|
|
432
|
+
(d = a == null ? void 0 : a[n]) == null || d.focus();
|
|
404
433
|
break;
|
|
405
434
|
}
|
|
406
435
|
}
|
|
@@ -428,60 +457,40 @@ let c = class extends I {
|
|
|
428
457
|
// ─── Render Helpers ───
|
|
429
458
|
/** @internal */
|
|
430
459
|
_renderHamburgerIcon() {
|
|
431
|
-
return u`<
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
fill="none"
|
|
436
|
-
stroke="currentColor"
|
|
437
|
-
stroke-width="2"
|
|
438
|
-
stroke-linecap="round"
|
|
460
|
+
return u`<hx-icon
|
|
461
|
+
class="nav__hamburger-glyph"
|
|
462
|
+
library="helix"
|
|
463
|
+
name=${this._mobileOpen ? "close" : "menu"}
|
|
439
464
|
aria-hidden="true"
|
|
440
|
-
|
|
441
|
-
${this._mobileOpen ? g`<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
442
|
-
<line x1="6" y1="6" x2="18" y2="18"></line>` : g`<line x1="3" y1="12" x2="21" y2="12"></line>
|
|
443
|
-
<line x1="3" y1="6" x2="21" y2="6"></line>
|
|
444
|
-
<line x1="3" y1="18" x2="21" y2="18"></line>`}
|
|
445
|
-
</svg>`;
|
|
465
|
+
></hx-icon>`;
|
|
446
466
|
}
|
|
447
467
|
/** @internal */
|
|
448
468
|
_renderChevronIcon() {
|
|
449
|
-
return u`<
|
|
469
|
+
return u`<hx-icon
|
|
450
470
|
class="nav__chevron"
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
viewBox="0 0 16 16"
|
|
454
|
-
fill="currentColor"
|
|
471
|
+
library="helix"
|
|
472
|
+
name="chevron-down"
|
|
455
473
|
aria-hidden="true"
|
|
456
|
-
|
|
457
|
-
<path
|
|
458
|
-
d="M4.5 6L8 9.5 11.5 6"
|
|
459
|
-
stroke="currentColor"
|
|
460
|
-
stroke-width="1.5"
|
|
461
|
-
fill="none"
|
|
462
|
-
stroke-linecap="round"
|
|
463
|
-
stroke-linejoin="round"
|
|
464
|
-
/>
|
|
465
|
-
</svg>`;
|
|
474
|
+
></hx-icon>`;
|
|
466
475
|
}
|
|
467
476
|
/** @internal */
|
|
468
477
|
_renderSubMenu(e, n, r) {
|
|
469
|
-
const
|
|
478
|
+
const i = this._expandedIndex === n;
|
|
470
479
|
return u`
|
|
471
|
-
<ul class="nav__submenu" aria-label="${r} submenu" ?hidden=${!
|
|
480
|
+
<ul class="nav__submenu" aria-label="${r} submenu" ?hidden=${!i}>
|
|
472
481
|
${e.map(
|
|
473
482
|
(t) => u`
|
|
474
483
|
<li class="nav__submenu-item">
|
|
475
484
|
<a
|
|
476
485
|
part="link"
|
|
477
486
|
href=${this._sanitizeHref(t.href)}
|
|
478
|
-
class=${
|
|
487
|
+
class=${x({
|
|
479
488
|
nav__link: !0,
|
|
480
489
|
"nav__link--active": !!t.current
|
|
481
490
|
})}
|
|
482
|
-
aria-current=${t.current ? "page" :
|
|
483
|
-
@click=${(
|
|
484
|
-
@keydown=${(
|
|
491
|
+
aria-current=${t.current ? "page" : b}
|
|
492
|
+
@click=${(o) => this._handleSubItemClick(t, o)}
|
|
493
|
+
@keydown=${(o) => this._handleSubKeydown(o, n)}
|
|
485
494
|
>
|
|
486
495
|
${t.label}
|
|
487
496
|
</a>
|
|
@@ -493,18 +502,18 @@ let c = class extends I {
|
|
|
493
502
|
}
|
|
494
503
|
/** @internal */
|
|
495
504
|
_renderItem(e, n) {
|
|
496
|
-
var
|
|
497
|
-
const r = !!((
|
|
505
|
+
var h, d;
|
|
506
|
+
const r = !!((h = e.children) != null && h.length), i = this._expandedIndex === n, t = r && !!((d = e.children) != null && d.some((a) => a.current)), o = {
|
|
498
507
|
nav__link: !0,
|
|
499
508
|
"nav__link--active": !!e.current || t,
|
|
500
509
|
"nav__link--has-submenu": r,
|
|
501
|
-
"nav__link--expanded":
|
|
510
|
+
"nav__link--expanded": i
|
|
502
511
|
}, l = r ? u`
|
|
503
512
|
<button
|
|
504
513
|
part="link"
|
|
505
|
-
class=${
|
|
506
|
-
aria-expanded=${
|
|
507
|
-
aria-current=${t ? "true" :
|
|
514
|
+
class=${x(o)}
|
|
515
|
+
aria-expanded=${i ? "true" : "false"}
|
|
516
|
+
aria-current=${t ? "true" : b}
|
|
508
517
|
@click=${(a) => this._handleItemClick(e, n, a)}
|
|
509
518
|
@keydown=${(a) => this._handleKeydown(a, n, e)}
|
|
510
519
|
>
|
|
@@ -515,8 +524,8 @@ let c = class extends I {
|
|
|
515
524
|
<a
|
|
516
525
|
part="link"
|
|
517
526
|
href=${this._sanitizeHref(e.href)}
|
|
518
|
-
class=${
|
|
519
|
-
aria-current=${e.current ? "page" :
|
|
527
|
+
class=${x(o)}
|
|
528
|
+
aria-current=${e.current ? "page" : b}
|
|
520
529
|
@click=${(a) => this._handleItemClick(e, n, a)}
|
|
521
530
|
@keydown=${(a) => this._handleKeydown(a, n, e)}
|
|
522
531
|
>
|
|
@@ -544,8 +553,8 @@ let c = class extends I {
|
|
|
544
553
|
${this._renderHamburgerIcon()}
|
|
545
554
|
</button>
|
|
546
555
|
|
|
547
|
-
<ul part="list" id="nav-list" class=${
|
|
548
|
-
${
|
|
556
|
+
<ul part="list" id="nav-list" class=${x(e)} role="list">
|
|
557
|
+
${w(
|
|
549
558
|
this.items,
|
|
550
559
|
(n, r) => r,
|
|
551
560
|
(n, r) => this._renderItem(n, r)
|
|
@@ -555,9 +564,9 @@ let c = class extends I {
|
|
|
555
564
|
`;
|
|
556
565
|
}
|
|
557
566
|
};
|
|
558
|
-
c.styles = [
|
|
567
|
+
c.styles = [I, C];
|
|
559
568
|
p([
|
|
560
|
-
|
|
569
|
+
m({
|
|
561
570
|
type: Array,
|
|
562
571
|
converter: {
|
|
563
572
|
fromAttribute(e) {
|
|
@@ -573,27 +582,27 @@ p([
|
|
|
573
582
|
})
|
|
574
583
|
], c.prototype, "items", 2);
|
|
575
584
|
p([
|
|
576
|
-
|
|
585
|
+
m({ type: String, reflect: !0 })
|
|
577
586
|
], c.prototype, "orientation", 2);
|
|
578
587
|
p([
|
|
579
|
-
|
|
588
|
+
m({ type: String })
|
|
580
589
|
], c.prototype, "label", 2);
|
|
581
590
|
p([
|
|
582
|
-
|
|
591
|
+
m({ type: String, attribute: "label-open-menu" })
|
|
583
592
|
], c.prototype, "labelOpenMenu", 2);
|
|
584
593
|
p([
|
|
585
|
-
|
|
594
|
+
m({ type: String, attribute: "label-close-menu" })
|
|
586
595
|
], c.prototype, "labelCloseMenu", 2);
|
|
587
596
|
p([
|
|
588
|
-
|
|
597
|
+
g()
|
|
589
598
|
], c.prototype, "_mobileOpen", 2);
|
|
590
599
|
p([
|
|
591
|
-
|
|
600
|
+
g()
|
|
592
601
|
], c.prototype, "_expandedIndex", 2);
|
|
593
602
|
c = p([
|
|
594
|
-
|
|
603
|
+
y("hx-nav")
|
|
595
604
|
], c);
|
|
596
605
|
export {
|
|
597
606
|
c as H
|
|
598
607
|
};
|
|
599
|
-
//# sourceMappingURL=hx-nav-
|
|
608
|
+
//# sourceMappingURL=hx-nav-GTsAZGOx.js.map
|