@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
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { css as b, nothing as
|
|
2
|
-
import { property as l, state as
|
|
3
|
-
import { classMap as
|
|
1
|
+
import { css as b, nothing as p, html as h } from "lit";
|
|
2
|
+
import { property as l, state as m, query as v, customElement as _ } from "lit/decorators.js";
|
|
3
|
+
import { classMap as f } from "lit/directives/class-map.js";
|
|
4
4
|
import { ifDefined as u } from "lit/directives/if-defined.js";
|
|
5
|
-
import { live as
|
|
6
|
-
import { styleMap as
|
|
5
|
+
import { live as x } from "lit/directives/live.js";
|
|
6
|
+
import { styleMap as c } from "lit/directives/style-map.js";
|
|
7
7
|
import { F as g } from "./FormMixin-B8PXk5RQ.js";
|
|
8
8
|
import { f as y } from "./forced-colors-CTEDFRGa.js";
|
|
9
9
|
import { d as w } from "./dev-warn-YlwPHjtX.js";
|
|
10
10
|
import { H as S } from "./helix-element-BNEYeiys.js";
|
|
11
11
|
import { c as k } from "./id-counter-DuX8vsui.js";
|
|
12
|
-
const
|
|
12
|
+
const $ = b`
|
|
13
13
|
:host {
|
|
14
14
|
display: block;
|
|
15
15
|
}
|
|
@@ -302,10 +302,10 @@ const z = b`
|
|
|
302
302
|
);
|
|
303
303
|
}
|
|
304
304
|
`;
|
|
305
|
-
var
|
|
305
|
+
var z = Object.defineProperty, T = Object.getOwnPropertyDescriptor, s = (e, t, a, r) => {
|
|
306
306
|
for (var o = r > 1 ? void 0 : r ? T(t, a) : t, n = e.length - 1, d; n >= 0; n--)
|
|
307
307
|
(d = e[n]) && (o = (r ? d(t, a, o) : d(o)) || o);
|
|
308
|
-
return r && o &&
|
|
308
|
+
return r && o && z(t, a, o), o;
|
|
309
309
|
};
|
|
310
310
|
const C = k("hx-slider");
|
|
311
311
|
let i = class extends g(S) {
|
|
@@ -354,10 +354,70 @@ let i = class extends g(S) {
|
|
|
354
354
|
e.has("disabled") && (this.disabled ? this.setAttribute("aria-disabled", "true") : this.removeAttribute("aria-disabled"));
|
|
355
355
|
}
|
|
356
356
|
// ─── Form Integration ───
|
|
357
|
+
/**
|
|
358
|
+
* Constraint validation: surfaces native `validity` flags through
|
|
359
|
+
* `ElementInternals.setValidity()` so the slider participates in
|
|
360
|
+
* `form.checkValidity()` / `form.reportValidity()`.
|
|
361
|
+
*
|
|
362
|
+
* Flags applied (in priority order):
|
|
363
|
+
* - `rangeUnderflow` when `value < min`.
|
|
364
|
+
* - `rangeOverflow` when `value > max`.
|
|
365
|
+
* - `stepMismatch` when `step` is finite/positive and `value` is not
|
|
366
|
+
* aligned to `min + n*step` within `step / 1000` floating-point
|
|
367
|
+
* tolerance.
|
|
368
|
+
*
|
|
369
|
+
* Note: a `required` flag is intentionally NOT exposed on the slider
|
|
370
|
+
* public API. The `value` property defaults to `0` (a numerically valid
|
|
371
|
+
* value), so a `required` slider cannot meaningfully report
|
|
372
|
+
* `valueMissing` without an additional "user-touched" interaction
|
|
373
|
+
* tracker — exposing the flag would advertise validation behavior the
|
|
374
|
+
* leaf component cannot deliver. Consumers needing required-on-touch
|
|
375
|
+
* semantics should wire that at the form level rather than the leaf.
|
|
376
|
+
*
|
|
377
|
+
* The validity anchor is the native range input so browser
|
|
378
|
+
* `reportValidity()` focuses the correct element. If the input has not
|
|
379
|
+
* yet rendered (firstUpdated has not run), the anchor is omitted.
|
|
380
|
+
*
|
|
381
|
+
* Called automatically by `FormMixin.updated()` after every Lit cycle.
|
|
382
|
+
* @internal
|
|
383
|
+
*/
|
|
384
|
+
_updateValidity() {
|
|
385
|
+
const e = this._input, t = this.value;
|
|
386
|
+
if (typeof t == "number" && Number.isFinite(t)) {
|
|
387
|
+
if (t < this.min) {
|
|
388
|
+
this._internals.setValidity(
|
|
389
|
+
{ rangeUnderflow: !0 },
|
|
390
|
+
`Value must be at least ${this.min}.`,
|
|
391
|
+
e ?? void 0
|
|
392
|
+
);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (t > this.max) {
|
|
396
|
+
this._internals.setValidity(
|
|
397
|
+
{ rangeOverflow: !0 },
|
|
398
|
+
`Value must be at most ${this.max}.`,
|
|
399
|
+
e ?? void 0
|
|
400
|
+
);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (Number.isFinite(this.step) && this.step > 0) {
|
|
404
|
+
const a = t - this.min, r = Math.round(a / this.step) * this.step, o = this.step / 1e3;
|
|
405
|
+
if (Math.abs(a - r) > o) {
|
|
406
|
+
this._internals.setValidity(
|
|
407
|
+
{ stepMismatch: !0 },
|
|
408
|
+
`Value must be a multiple of ${this.step} starting from ${this.min}.`,
|
|
409
|
+
e ?? void 0
|
|
410
|
+
);
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
this._internals.setValidity({});
|
|
416
|
+
}
|
|
357
417
|
/** @internal */
|
|
358
418
|
_onFormReset() {
|
|
359
419
|
const e = this._clamp(this._defaultValue ?? this.min);
|
|
360
|
-
this.value = e, this._internals.setFormValue(String(e)), this._resetInteractionState();
|
|
420
|
+
this.value = e, this._internals.setFormValue(String(e)), this._resetInteractionState(), this._updateValidity();
|
|
361
421
|
}
|
|
362
422
|
/** @internal */
|
|
363
423
|
_onFormStateRestore(e, t) {
|
|
@@ -430,7 +490,7 @@ let i = class extends g(S) {
|
|
|
430
490
|
"slider--has-ticks": this.showTicks
|
|
431
491
|
}, n = [this.helpText || this._hasHelpSlot ? this._helpId : null].filter(Boolean).join(" ") || void 0;
|
|
432
492
|
return h`
|
|
433
|
-
<div part="slider" class=${
|
|
493
|
+
<div part="slider" class=${f(o)}>
|
|
434
494
|
<!-- Label row -->
|
|
435
495
|
<div class="slider__label-row">
|
|
436
496
|
${a ? h`<label
|
|
@@ -441,7 +501,7 @@ let i = class extends g(S) {
|
|
|
441
501
|
>
|
|
442
502
|
<slot name="label" @slotchange=${this._handleLabelSlotChange}>${this.label}</slot>
|
|
443
503
|
</label>` : h`<slot name="label" @slotchange=${this._handleLabelSlotChange}></slot>`}
|
|
444
|
-
${this.showValue ? h`<span part="value-display" class="slider__value-display"> ${this.value} </span>` :
|
|
504
|
+
${this.showValue ? h`<span part="value-display" class="slider__value-display"> ${this.value} </span>` : p}
|
|
445
505
|
</div>
|
|
446
506
|
|
|
447
507
|
<!-- Track -->
|
|
@@ -450,14 +510,14 @@ let i = class extends g(S) {
|
|
|
450
510
|
<div
|
|
451
511
|
part="fill"
|
|
452
512
|
class="slider__fill"
|
|
453
|
-
style=${
|
|
513
|
+
style=${c({ "--_fill-ratio": String(e / 100) })}
|
|
454
514
|
></div>
|
|
455
515
|
|
|
456
516
|
<input
|
|
457
517
|
class="slider__input"
|
|
458
518
|
id=${this._sliderId}
|
|
459
519
|
type="range"
|
|
460
|
-
.value=${
|
|
520
|
+
.value=${x(String(this.value))}
|
|
461
521
|
min=${this.min}
|
|
462
522
|
max=${this.max}
|
|
463
523
|
step=${this.step}
|
|
@@ -475,7 +535,7 @@ let i = class extends g(S) {
|
|
|
475
535
|
<span
|
|
476
536
|
part="thumb"
|
|
477
537
|
class="slider__thumb-visual"
|
|
478
|
-
style=${
|
|
538
|
+
style=${c({ "--fill-pct": String(e) })}
|
|
479
539
|
aria-hidden="true"
|
|
480
540
|
></span>
|
|
481
541
|
</div>
|
|
@@ -487,10 +547,10 @@ let i = class extends g(S) {
|
|
|
487
547
|
(d) => h`<span
|
|
488
548
|
part="tick"
|
|
489
549
|
class="slider__tick"
|
|
490
|
-
style=${
|
|
550
|
+
style=${c({ left: `${d}%` })}
|
|
491
551
|
></span>`
|
|
492
552
|
)}
|
|
493
|
-
</div>` :
|
|
553
|
+
</div>` : p}
|
|
494
554
|
|
|
495
555
|
<!-- Range labels -->
|
|
496
556
|
${r ? h`<div class="slider__range-labels">
|
|
@@ -507,14 +567,14 @@ let i = class extends g(S) {
|
|
|
507
567
|
regardless of whether help content comes from the slot or the property. -->
|
|
508
568
|
<div id=${this._helpId}>
|
|
509
569
|
<slot name="help-text" @slotchange=${this._handleHelpSlotChange}>
|
|
510
|
-
${this.helpText ? h`<div part="help-text" class="slider__help-text">${this.helpText}</div>` :
|
|
570
|
+
${this.helpText ? h`<div part="help-text" class="slider__help-text">${this.helpText}</div>` : p}
|
|
511
571
|
</slot>
|
|
512
572
|
</div>
|
|
513
573
|
</div>
|
|
514
574
|
`;
|
|
515
575
|
}
|
|
516
576
|
};
|
|
517
|
-
i.styles = [
|
|
577
|
+
i.styles = [$, y];
|
|
518
578
|
i.formAssociated = !0;
|
|
519
579
|
s([
|
|
520
580
|
l({ type: String, reflect: !0 })
|
|
@@ -553,16 +613,16 @@ s([
|
|
|
553
613
|
l({ type: String, attribute: "aria-valuetext" })
|
|
554
614
|
], i.prototype, "valueText", 2);
|
|
555
615
|
s([
|
|
556
|
-
|
|
616
|
+
m()
|
|
557
617
|
], i.prototype, "_hasLabelSlot", 2);
|
|
558
618
|
s([
|
|
559
|
-
|
|
619
|
+
m()
|
|
560
620
|
], i.prototype, "_hasMinLabelSlot", 2);
|
|
561
621
|
s([
|
|
562
|
-
|
|
622
|
+
m()
|
|
563
623
|
], i.prototype, "_hasMaxLabelSlot", 2);
|
|
564
624
|
s([
|
|
565
|
-
|
|
625
|
+
m()
|
|
566
626
|
], i.prototype, "_hasHelpSlot", 2);
|
|
567
627
|
s([
|
|
568
628
|
v(".slider__input")
|
|
@@ -573,4 +633,4 @@ i = s([
|
|
|
573
633
|
export {
|
|
574
634
|
i as H
|
|
575
635
|
};
|
|
576
|
-
//# sourceMappingURL=hx-slider-
|
|
636
|
+
//# sourceMappingURL=hx-slider-CkOk5BCY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hx-slider-CkOk5BCY.js","sources":["../../src/components/hx-slider/hx-slider.styles.ts","../../src/components/hx-slider/hx-slider.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixSliderStyles = css`\n :host {\n display: block;\n }\n\n :host([disabled]) {\n opacity: var(--hx-opacity-disabled, 0.5);\n pointer-events: none;\n }\n\n * {\n box-sizing: border-box;\n }\n\n /* ─── Container ─── */\n\n .slider {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n font-family: var(--hx-slider-font-family, var(--hx-font-family-sans, sans-serif));\n }\n\n /* ─── Label Row ─── */\n\n .slider__label-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--hx-space-2, 0.5rem);\n }\n\n .slider__label {\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-slider-label-color, var(--hx-color-text-strong, #202b39));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n .slider__value-display {\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-slider-value-color, var(--hx-color-text-secondary, #313e4b));\n line-height: var(--hx-line-height-normal, 1.5);\n font-variant-numeric: tabular-nums;\n min-width: var(--hx-size-8, 2rem);\n text-align: end;\n }\n\n /* ─── Track Container ─── */\n\n .slider__track-container {\n position: relative;\n width: 100%;\n }\n\n .slider__track {\n position: relative;\n width: 100%;\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-slider-track-bg, var(--hx-color-border-default, #d6dbd5));\n overflow: visible;\n }\n\n /* ─── Size: sm ─── */\n\n .slider--sm .slider__track {\n height: var(--hx-slider-track-height-sm, var(--hx-size-1, 0.25rem));\n }\n\n .slider--sm .slider__input {\n height: var(--hx-slider-track-height-sm, var(--hx-size-1, 0.25rem));\n }\n\n /* ─── Size: md ─── */\n\n .slider--md .slider__track {\n height: var(--hx-slider-track-height-md, var(--hx-size-1-5, 0.375rem));\n }\n\n .slider--md .slider__input {\n height: var(--hx-slider-track-height-md, var(--hx-size-1-5, 0.375rem));\n }\n\n /* ─── Size: lg ─── */\n\n .slider--lg .slider__track {\n height: var(--hx-slider-track-height-lg, var(--hx-space-2, 0.5rem));\n }\n\n .slider--lg .slider__input {\n height: var(--hx-slider-track-height-lg, var(--hx-space-2, 0.5rem));\n }\n\n /* ─── Fill ─── */\n\n .slider__fill {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-slider-fill-bg, var(--hx-color-primary-500, #429797));\n pointer-events: none;\n transform-origin: left center;\n transform: scaleX(var(--_fill-ratio, 0));\n transition: transform var(--hx-transition-fast, 150ms ease);\n }\n\n /* Suppress fill animation on initial render — only animate on user interaction */\n :host(:not([data-ready])) .slider__fill {\n transition: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .slider__fill {\n transition: none;\n }\n }\n\n /* ─── Native Range Input ─── */\n\n .slider__input {\n position: absolute;\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n width: 100%;\n margin: 0;\n padding: 0;\n opacity: 0;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n background: transparent;\n border: none;\n outline: none;\n /* Expand the hit area so the thumb meets WCAG 2.5.8 touch target (44px).\n The input's total height = track height + 2 * padding-block. With 0.75rem\n (~12px) padding on each side and a track of ~6px, the total target area is\n ~30px. We increase to 1rem (~16px) per side for a ~38px minimum, supplemented\n by the visual thumb size. */\n padding-block: var(--hx-slider-input-padding-block, 1rem);\n min-height: var(--hx-touch-target-min, 2.75rem);\n }\n\n /* In forced-color mode, restore native outline so the input remains focusable */\n @media (forced-colors: active) {\n .slider__input {\n outline: revert;\n opacity: 1;\n }\n .slider__input:focus-visible {\n outline: 2px solid ButtonText;\n }\n }\n\n .slider__input:disabled {\n cursor: not-allowed;\n }\n\n /* ─── Thumb (visual, :before on a wrapper or via ::after on track) ─── */\n /*\n * The native thumb is hidden (opacity 0 on the input). We render a visible\n * thumb element positioned by --fill-pct (a raw 0–100 number set in JS).\n *\n * Correct alignment formula keeps the thumb centered within the track at\n * both extremes, preventing the left/right halves from clipping outside:\n * left = fillPct% * (1 – thumbSize/100%) + thumbSize * (1 – fillPct/100)\n * Simplified: left = calc(var(--fill-pct,0)*1% + var(--_thumb-size)*(1 - var(--fill-pct,0)/100))\n * Combined with translate(-50%,-50%) this places the thumb center correctly\n * at every position from min to max.\n */\n\n .slider__thumb-visual {\n position: absolute;\n top: 50%;\n /* Corrected position: thumb stays within track at all fill values */\n left: calc(var(--fill-pct, 0) * 1% + var(--_thumb-size, 1rem) * (1 - var(--fill-pct, 0) / 100));\n transform: translate(-50%, -50%);\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-slider-thumb-bg, var(--hx-color-surface-default, #ffffff));\n border: var(--hx-slider-thumb-border-width, 2px) solid\n var(--hx-slider-thumb-border-color, var(--hx-color-primary-500, #429797));\n box-shadow: var(--hx-slider-thumb-shadow, var(--hx-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)));\n pointer-events: none;\n transition:\n box-shadow var(--hx-transition-fast, 150ms ease),\n transform var(--hx-transition-fast, 150ms ease);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .slider__thumb-visual {\n transition: none;\n }\n }\n\n .slider__input:focus-visible ~ .slider__thumb-visual {\n box-shadow:\n 0 0 0 var(--hx-focus-ring-width, 2px)\n var(--hx-slider-focus-ring-color, var(--hx-focus-ring-color, #0f7078)),\n var(--hx-slider-thumb-shadow, var(--hx-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)));\n }\n\n /* ─── Thumb sizes ─── */\n\n .slider--sm .slider__thumb-visual {\n --_thumb-size: var(--hx-slider-thumb-size-sm, var(--hx-size-3, 0.75rem));\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n }\n\n .slider--md .slider__thumb-visual {\n --_thumb-size: var(--hx-slider-thumb-size-md, var(--hx-size-4, 1rem));\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n }\n\n .slider--lg .slider__thumb-visual {\n --_thumb-size: var(--hx-slider-thumb-size-lg, var(--hx-size-5, 1.25rem));\n width: var(--_thumb-size);\n height: var(--_thumb-size);\n }\n\n /* ─── Forced colors (Windows High Contrast) ─── */\n @media (forced-colors: active) {\n .slider__fill {\n background-color: Highlight;\n }\n .slider__track {\n background-color: ButtonFace;\n border: 1px solid ButtonText;\n }\n .slider__thumb-visual {\n background-color: ButtonText;\n border-color: ButtonText;\n }\n .slider__input:focus-visible ~ .slider__thumb-visual {\n outline: 2px solid Highlight;\n }\n }\n\n /* ─── Ticks ─── */\n\n .slider__ticks {\n position: relative;\n width: 100%;\n height: var(--hx-space-2, 0.5rem);\n margin-top: var(--hx-space-1, 0.25rem);\n }\n\n .slider__tick {\n position: absolute;\n top: 0;\n width: var(--hx-border-width-thin, 1px);\n height: 100%;\n background-color: var(--hx-slider-tick-color, var(--hx-color-border-strong, #66787b));\n transform: translateX(-50%);\n }\n\n /* ─── Range Labels ─── */\n\n .slider__range-labels {\n display: flex;\n justify-content: space-between;\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-slider-range-label-color, var(--hx-color-text-muted, #4a5362));\n line-height: var(--hx-line-height-normal, 1.5);\n margin-top: var(--hx-space-0-5, 0.125rem);\n }\n\n /* ─── Help Text ─── */\n\n .slider__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-slider-help-text-color, var(--hx-color-text-muted, #4a5362));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n /* ─── Disabled state ─── */\n\n .slider--disabled .slider__fill {\n background-color: var(--hx-slider-disabled-fill-bg, var(--hx-color-border-strong, #66787b));\n }\n\n .slider--disabled .slider__thumb-visual {\n border-color: var(\n --hx-slider-disabled-thumb-border-color,\n var(--hx-color-border-strong, #66787b)\n );\n }\n`;\n","import { TemplateResult, 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 { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { HelixElement, createIdCounter } from '../../base/index.js';\nimport { FormMixin } from '../../mixins/FormMixin.js';\nimport { helixSliderStyles } from './hx-slider.styles.js';\nimport { forcedColorsInteractive } from '../../styles/forced-colors.js';\nimport { devWarn } from '../../utils/dev-warn.js';\n\nconst _nextSliderId = createIdCounter('hx-slider');\n\n/** Detail for hx-input and hx-change events dispatched by hx-slider. */\nexport interface HxSliderDetail {\n value: number;\n}\n\n/**\n * A range slider component for selecting a numeric value within a min/max boundary.\n * Supports tick marks, value display, range labels, and native form participation\n * via ElementInternals.\n *\n * The native `<input type=\"range\">` receives `role=\"slider\"` with `aria-valuenow`,\n * `aria-valuemin`, and `aria-valuemax`. Label association uses `aria-labelledby`\n * when a label is present, or `aria-label` as a fallback. Help text is linked via\n * `aria-describedby`. Keyboard navigation follows the native range behavior:\n * Arrow keys increment/decrement by step, Home jumps to min, End jumps to max.\n *\n * @summary Form-associated range slider with label, ticks, and value display.\n *\n * @tag hx-slider\n *\n * @slot label - Custom label content (overrides the label property).\n * @slot help-text - Custom help text content (overrides the helpText property).\n * @slot min-label - Label rendered at the minimum end of the slider.\n * @slot max-label - Label rendered at the maximum end of the slider.\n *\n * @fires {CustomEvent<{value: number}>} hx-input - Dispatched continuously while the user drags.\n * @fires {CustomEvent<{value: number}>} hx-change - Dispatched when the user releases the thumb.\n *\n * @csspart slider - The outer container element.\n * @csspart track - The track background element.\n * @csspart fill - The filled portion of the track showing progress.\n * @csspart thumb - The draggable thumb overlay element.\n * @csspart label - The label element.\n * @csspart value-display - The element displaying the current numeric value.\n * @csspart tick - Each individual tick mark element.\n * @csspart help-text - The help text element displayed below the slider.\n *\n * @cssprop [--hx-slider-track-bg=var(--hx-color-neutral-200)] - Track background color.\n * @cssprop [--hx-slider-fill-bg=var(--hx-color-primary-500)] - Fill/progress color.\n * @cssprop [--hx-slider-thumb-bg=var(--hx-color-neutral-0)] - Thumb background color.\n * @cssprop [--hx-slider-thumb-border-color=var(--hx-color-primary-500)] - Thumb border color.\n * @cssprop [--hx-slider-thumb-border-width=2px] - Thumb border width.\n * @cssprop [--hx-slider-thumb-shadow=var(--hx-shadow-sm)] - Thumb box shadow.\n * @cssprop [--hx-slider-focus-ring-color=var(--hx-focus-ring-color)] - Focus ring color.\n * @cssprop [--hx-slider-label-color=var(--hx-color-neutral-700)] - Label text color.\n * @cssprop [--hx-slider-value-color=var(--hx-color-neutral-600)] - Value display text color.\n * @cssprop [--hx-slider-tick-color=var(--hx-color-neutral-400)] - Tick mark color.\n * @cssprop [--hx-slider-range-label-color=var(--hx-color-neutral-500)] - Range label text color.\n * @cssprop [--hx-slider-help-text-color=var(--hx-color-neutral-500)] - Help text color.\n * @cssprop [--hx-opacity-disabled] - Opacity.\n * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-slider-font-family=var(--hx-font-family-sans)] - CSS custom property.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-space-2] - Spacing token.\n * @cssprop [--hx-font-size-sm] - Font size.\n * @cssprop [--hx-font-weight-medium] - Font weight.\n * @cssprop [--hx-color-neutral-700] - Color.\n * @cssprop [--hx-line-height-normal] - Line height.\n * @cssprop [--hx-color-neutral-600] - Color.\n * @cssprop [--hx-size-8] - Size token.\n * @cssprop [--hx-border-radius-full] - CSS custom property.\n * @cssprop [--hx-color-neutral-200] - Color.\n * @cssprop [--hx-slider-track-height-sm=var(--hx-size-1)] - Height.\n * @cssprop [--hx-size-1] - Size token.\n * @cssprop [--hx-slider-track-height-md=var(--hx-size-1-5)] - Height.\n * @cssprop [--hx-size-1-5] - Size token.\n * @cssprop [--hx-slider-track-height-lg=var(--hx-space-2)] - Height.\n * @cssprop [--hx-color-primary-500] - Color.\n * @cssprop [--hx-transition-fast] - Transition timing.\n * @cssprop [--hx-slider-input-padding-block=1rem] - Padding.\n * @cssprop [--hx-touch-target-min] - Minimum touch target size.\n * @cssprop [--hx-color-neutral-0] - Color.\n * @cssprop [--hx-shadow-sm] - Box shadow.\n * @cssprop [--hx-focus-ring-width] - Width.\n * @cssprop [--hx-focus-ring-color] - Color.\n * @cssprop [--hx-color-primary-400] - Color.\n * @cssprop [--hx-slider-thumb-size-sm=var(--hx-size-3)] - CSS custom property.\n * @cssprop [--hx-size-3] - Size token.\n * @cssprop [--hx-slider-thumb-size-md=var(--hx-size-4)] - CSS custom property.\n * @cssprop [--hx-size-4] - Size token.\n * @cssprop [--hx-slider-thumb-size-lg=var(--hx-size-5)] - CSS custom property.\n * @cssprop [--hx-size-5] - Size token.\n * @cssprop [--hx-border-width-thin] - Width.\n * @cssprop [--hx-color-neutral-400] - Color.\n * @cssprop [--hx-font-size-xs] - Font size.\n * @cssprop [--hx-color-neutral-500] - Color.\n * @cssprop [--hx-space-0-5] - Spacing token.\n *\n * @aaa-certified 2026-05-09\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-slider/AAA-AUDIT.md\n * @keyboard-contract navigate=Arrow,Home,End,PageUp,PageDown; disabled-suppresses=true\n * @aria-pattern slider\n * @aria-pattern-source https://www.w3.org/WAI/ARIA/apg/patterns/slider/\n * @forced-colors-supported true\n * @stability stable\n * @since 3.7.0\n * @form-associated true\n * @theme-aware true\n * @brand-aware true\n * @drupal-sdc-eligible true\n * @react-wrapper-status complete\n * @figma-component-name hx-slider\n * @priority-tier P0\n * @phi-handles false\n * @clinical-context none\n */\n@customElement('hx-slider')\nexport class HelixSlider extends FormMixin(HelixElement) {\n static override styles = [helixSliderStyles, forcedColorsInteractive];\n\n // ─── Form Association ───\n\n /** @internal */\n static override formAssociated = true;\n\n // ─── Properties ───\n\n /**\n * The name submitted with the form.\n * @attr name\n */\n @property({ type: String, reflect: true })\n name = '';\n\n /**\n * The current numeric value of the slider.\n * @attr value\n */\n @property({ type: Number, reflect: true })\n value = 0;\n\n /**\n * The minimum allowed value.\n * @attr min\n */\n @property({ type: Number })\n min = 0;\n\n /**\n * The maximum allowed value.\n * @attr max\n */\n @property({ type: Number })\n max = 100;\n\n /**\n * The stepping interval between values.\n * @attr step\n */\n @property({ type: Number })\n step = 1;\n\n /**\n * Whether the slider is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * The visible label text for the slider.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Help text displayed below the slider for guidance.\n * @attr help-text\n */\n @property({ type: String, attribute: 'help-text' })\n helpText = '';\n\n /**\n * When true, the current value is shown next to the label.\n * @attr show-value\n */\n @property({ type: Boolean, attribute: 'show-value' })\n showValue = false;\n\n /**\n * When true, tick marks are rendered at each step interval.\n * @attr show-ticks\n */\n @property({ type: Boolean, attribute: 'show-ticks' })\n showTicks = false;\n\n /**\n * The size variant of the slider.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Human-readable text alternative for the current value, announced by screen readers\n * instead of the numeric value. For example, on a pain scale: \"7 — Moderate-Severe\".\n * @attr aria-valuetext\n */\n @property({ type: String, attribute: 'aria-valuetext' })\n valueText = '';\n\n // ─── Internal State ───\n\n /** Whether the label slot has assigned content. */\n /** @internal */\n @state() private _hasLabelSlot = false;\n /** Whether the min-label slot has assigned content. */\n /** @internal */\n @state() private _hasMinLabelSlot = false;\n /** Whether the max-label slot has assigned content. */\n /** @internal */\n @state() private _hasMaxLabelSlot = false;\n /** Whether the help slot has assigned content. */\n /** @internal */\n @state() private _hasHelpSlot = false;\n\n // ─── Internal References ───\n\n /**\n * Reference to the native range `<input>` inside shadow DOM.\n * @internal\n */\n @query('.slider__input')\n private _input: HTMLInputElement | undefined;\n\n // ─── Unique IDs ───\n\n /** Unique ID for the native range input element. */\n /** @internal */\n private readonly _sliderId = _nextSliderId();\n /** Unique ID for the label element, derived from _sliderId. */\n /** @internal */\n private readonly _labelId = `${this._sliderId}-label`;\n /** Unique ID for the help text element, derived from _sliderId. */\n /** @internal */\n private readonly _helpId = `${this._sliderId}-help`;\n\n /** Stored default value for form reset (captured in firstUpdated). */\n /** @internal */\n private _defaultValue: number | null = null;\n\n // ─── Computed Values ───\n\n /** @internal */\n private _clamp(v: number): number {\n return Math.min(Math.max(v, this.min), this.max);\n }\n\n /** @internal */\n private _fillPercent(): number {\n const clamped = this._clamp(this.value);\n const range = this.max - this.min;\n if (range === 0) return 0;\n return ((clamped - this.min) / range) * 100;\n }\n\n // Cached tick array — recomputed only when showTicks, min, max, or step change.\n // Avoids redundant array allocation on every render during continuous drag updates.\n /** @internal */\n private _cachedTicks: number[] = [];\n\n /** @internal */\n private _computeTicks(): number[] {\n if (!this.showTicks) return [];\n const ticks: number[] = [];\n const range = this.max - this.min;\n if (range <= 0 || this.step <= 0) return ticks;\n const count = Math.round(range / this.step);\n for (let i = 0; i <= count; i++) {\n ticks.push((i / count) * 100);\n }\n return ticks;\n }\n\n // ─── Lifecycle ───\n\n override willUpdate(changedProperties: PropertyValues<this>): void {\n super.willUpdate(changedProperties);\n if (\n changedProperties.has('showTicks') ||\n changedProperties.has('min') ||\n changedProperties.has('max') ||\n changedProperties.has('step')\n ) {\n this._cachedTicks = this._computeTicks();\n }\n }\n\n override firstUpdated(): void {\n // Capture the initial value for form reset (before any user interaction)\n this._defaultValue = this.value;\n // Enable fill transition after initial render to suppress animation on mount\n requestAnimationFrame(() => this.setAttribute('data-ready', ''));\n // WCAG 4.1.2: warn when no accessible name is available for the range input\n if (!this.label && !this._hasLabelSlot) {\n devWarn(\n 'hx-slider',\n 'No accessible label provided. Set the `label` attribute or use the label slot. An unlabeled slider violates WCAG 2.1 AA (4.1.2 Name, Role, Value).',\n );\n }\n }\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n // Guard: min must be less than max\n if (changedProperties.has('min') || changedProperties.has('max')) {\n if (this.min >= this.max) {\n devWarn(\n 'hx-slider',\n `Invalid configuration: min (${this.min}) must be less than max (${this.max}). Slider behavior is undefined when min >= max.`,\n );\n }\n }\n // Clamp value to [min, max] after any relevant property change\n if (\n changedProperties.has('value') ||\n changedProperties.has('min') ||\n changedProperties.has('max')\n ) {\n const clamped = this._clamp(this.value);\n if (clamped !== this.value) {\n this.value = clamped;\n return;\n }\n this._internals.setFormValue(String(this.value));\n } else if (changedProperties.has('name')) {\n this._internals.setFormValue(String(this.value));\n }\n // Reflect aria-disabled on host for AT traversal\n if (changedProperties.has('disabled')) {\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n }\n }\n\n // ─── Form Integration ───\n\n /**\n * Constraint validation: surfaces native `validity` flags through\n * `ElementInternals.setValidity()` so the slider participates in\n * `form.checkValidity()` / `form.reportValidity()`.\n *\n * Flags applied (in priority order):\n * - `rangeUnderflow` when `value < min`.\n * - `rangeOverflow` when `value > max`.\n * - `stepMismatch` when `step` is finite/positive and `value` is not\n * aligned to `min + n*step` within `step / 1000` floating-point\n * tolerance.\n *\n * Note: a `required` flag is intentionally NOT exposed on the slider\n * public API. The `value` property defaults to `0` (a numerically valid\n * value), so a `required` slider cannot meaningfully report\n * `valueMissing` without an additional \"user-touched\" interaction\n * tracker — exposing the flag would advertise validation behavior the\n * leaf component cannot deliver. Consumers needing required-on-touch\n * semantics should wire that at the form level rather than the leaf.\n *\n * The validity anchor is the native range input so browser\n * `reportValidity()` focuses the correct element. If the input has not\n * yet rendered (firstUpdated has not run), the anchor is omitted.\n *\n * Called automatically by `FormMixin.updated()` after every Lit cycle.\n * @internal\n */\n override _updateValidity(): void {\n const anchor = this._input;\n const v = this.value;\n\n if (typeof v === 'number' && Number.isFinite(v)) {\n if (v < this.min) {\n this._internals.setValidity(\n { rangeUnderflow: true },\n `Value must be at least ${this.min}.`,\n anchor ?? undefined,\n );\n return;\n }\n if (v > this.max) {\n this._internals.setValidity(\n { rangeOverflow: true },\n `Value must be at most ${this.max}.`,\n anchor ?? undefined,\n );\n return;\n }\n if (Number.isFinite(this.step) && this.step > 0) {\n const offset = v - this.min;\n const nearest = Math.round(offset / this.step) * this.step;\n const tolerance = this.step / 1000;\n if (Math.abs(offset - nearest) > tolerance) {\n this._internals.setValidity(\n { stepMismatch: true },\n `Value must be a multiple of ${this.step} starting from ${this.min}.`,\n anchor ?? undefined,\n );\n return;\n }\n }\n }\n\n this._internals.setValidity({});\n }\n\n /** @internal */\n protected override _onFormReset(): void {\n const resetTo = this._clamp(this._defaultValue ?? this.min);\n this.value = resetTo;\n this._internals.setFormValue(String(resetTo));\n this._resetInteractionState();\n this._updateValidity();\n }\n\n /** @internal */\n protected override _onFormStateRestore(\n state: File | string | FormData | null,\n _mode: 'restore' | 'autocomplete',\n ): void {\n if (typeof state !== 'string' || state === null) return;\n const parsed = parseFloat(state);\n if (!isNaN(parsed)) {\n this.value = this._clamp(parsed);\n }\n }\n\n /** @internal */\n protected override _onFormDisabled(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n // ─── Public Methods ───\n\n /** Moves focus to the native range input. */\n override focus(options?: FocusOptions): void {\n this._input?.focus(options);\n }\n\n // ─── Slot Handlers ───\n\n /** @internal */\n private _handleLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasLabelSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** @internal */\n private _handleHelpSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasHelpSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** @internal */\n private _handleMinLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasMinLabelSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** @internal */\n private _handleMaxLabelSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasMaxLabelSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Event Handling ───\n\n /** @internal */\n private _handleInput(e: Event): void {\n if (this.disabled) return;\n const target = e.target as HTMLInputElement;\n this.value = parseFloat(target.value);\n this._internals.setFormValue(String(this.value));\n this._handleInteractionInput();\n\n /**\n * Dispatched continuously while the user drags the thumb.\n * @event hx-input\n */\n this.dispatchEvent(\n new CustomEvent<{ value: number }>('hx-input', {\n bubbles: true,\n composed: true,\n detail: { value: this.value },\n }),\n );\n }\n\n /** @internal */\n private _handleChange(e: Event): void {\n if (this.disabled) return;\n const target = e.target as HTMLInputElement;\n this.value = parseFloat(target.value);\n this._internals.setFormValue(String(this.value));\n this._handleInteractionBlur();\n\n /**\n * Dispatched when the user releases the thumb after dragging.\n * @event hx-change\n */\n this.dispatchEvent(\n new CustomEvent<{ value: number }>('hx-change', {\n bubbles: true,\n composed: true,\n detail: { value: this.value },\n }),\n );\n }\n\n // ─── Render ───\n\n override render(): TemplateResult {\n const fillPct = this._fillPercent();\n const ticks = this._cachedTicks;\n const hasLabel = !!this.label || this._hasLabelSlot;\n const showRangeLabels = this._hasMinLabelSlot || this._hasMaxLabelSlot;\n\n const containerClasses = {\n slider: true,\n [`slider--${this.size}`]: true,\n 'slider--disabled': this.disabled,\n 'slider--has-ticks': this.showTicks,\n };\n\n const describedBy =\n [this.helpText || this._hasHelpSlot ? this._helpId : null].filter(Boolean).join(' ') ||\n undefined;\n\n return html`\n <div part=\"slider\" class=${classMap(containerClasses)}>\n <!-- Label row -->\n <div class=\"slider__label-row\">\n ${hasLabel\n ? html`<label\n part=\"label\"\n class=\"slider__label\"\n id=${this._labelId}\n for=${this._sliderId}\n >\n <slot name=\"label\" @slotchange=${this._handleLabelSlotChange}>${this.label}</slot>\n </label>`\n : html`<slot name=\"label\" @slotchange=${this._handleLabelSlotChange}></slot>`}\n ${this.showValue\n ? html`<span part=\"value-display\" class=\"slider__value-display\"> ${this.value} </span>`\n : nothing}\n </div>\n\n <!-- Track -->\n <div class=\"slider__track-container\">\n <div part=\"track\" class=\"slider__track\">\n <div\n part=\"fill\"\n class=\"slider__fill\"\n style=${styleMap({ '--_fill-ratio': String(fillPct / 100) })}\n ></div>\n\n <input\n class=\"slider__input\"\n id=${this._sliderId}\n type=\"range\"\n .value=${live(String(this.value))}\n min=${this.min}\n max=${this.max}\n step=${this.step}\n ?disabled=${this.disabled}\n name=${ifDefined(this.name || undefined)}\n aria-labelledby=${ifDefined(hasLabel ? this._labelId : undefined)}\n aria-label=${ifDefined(!hasLabel ? 'Slider' : undefined)}\n aria-valuetext=${ifDefined(this.valueText || undefined)}\n aria-describedby=${ifDefined(describedBy)}\n @input=${this._handleInput}\n @change=${this._handleChange}\n />\n\n <!-- Visual thumb positioned by fill percentage (--fill-pct drives CSS calc) -->\n <span\n part=\"thumb\"\n class=\"slider__thumb-visual\"\n style=${styleMap({ '--fill-pct': String(fillPct) })}\n aria-hidden=\"true\"\n ></span>\n </div>\n </div>\n\n <!-- Tick marks -->\n ${this.showTicks && ticks.length > 0\n ? html`<div class=\"slider__ticks\">\n ${ticks.map(\n (pct) =>\n html`<span\n part=\"tick\"\n class=\"slider__tick\"\n style=${styleMap({ left: `${pct}%` })}\n ></span>`,\n )}\n </div>`\n : nothing}\n\n <!-- Range labels -->\n ${showRangeLabels\n ? html`<div class=\"slider__range-labels\">\n <slot name=\"min-label\" @slotchange=${this._handleMinLabelSlotChange}></slot>\n <slot name=\"max-label\" @slotchange=${this._handleMaxLabelSlotChange}></slot>\n </div>`\n : html`\n <!-- Always observe slot changes even when not rendered -->\n <slot name=\"min-label\" hidden @slotchange=${this._handleMinLabelSlotChange}></slot>\n <slot name=\"max-label\" hidden @slotchange=${this._handleMaxLabelSlotChange}></slot>\n `}\n\n <!-- Help text -->\n <!-- WCAG 1.3.1: wrap slot in a persistent container so _helpId stays stable\n regardless of whether help content comes from the slot or the property. -->\n <div id=${this._helpId}>\n <slot name=\"help-text\" @slotchange=${this._handleHelpSlotChange}>\n ${this.helpText\n ? html`<div part=\"help-text\" class=\"slider__help-text\">${this.helpText}</div>`\n : nothing}\n </slot>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-slider': HelixSlider;\n }\n}\n"],"names":["helixSliderStyles","css","_nextSliderId","createIdCounter","HelixSlider","FormMixin","HelixElement","v","clamped","range","ticks","count","i","changedProperties","devWarn","anchor","offset","nearest","tolerance","resetTo","state","_mode","parsed","disabled","options","_a","slot","target","fillPct","hasLabel","showRangeLabels","containerClasses","describedBy","html","classMap","nothing","styleMap","live","ifDefined","pct","forcedColorsInteractive","__decorateClass","property","query","customElement"],"mappings":";;;;;;;;;;;AAEO,MAAMA,IAAoBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { css as f, nothing as
|
|
2
|
-
import { query as
|
|
3
|
-
import { classMap as
|
|
1
|
+
import { css as f, nothing as g, html as p } from "lit";
|
|
2
|
+
import { query as c, state as b, property as u, customElement as v } from "lit/decorators.js";
|
|
3
|
+
import { classMap as h } from "lit/directives/class-map.js";
|
|
4
4
|
import { f as x } from "./forced-colors-CTEDFRGa.js";
|
|
5
|
-
import { f as
|
|
5
|
+
import { f as _ } from "./aria-flatten-DY6v2vah.js";
|
|
6
6
|
import { f as d, g as y } from "./menu-tree-BNM0SYYq.js";
|
|
7
7
|
import { i as w, r as k } from "./aria-idref-DCuEaknC.js";
|
|
8
8
|
import { H as M } from "./helix-element-BNEYeiys.js";
|
|
@@ -130,6 +130,11 @@ const T = f`
|
|
|
130
130
|
transform: rotate(180deg);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
/* hx-icon glyph sizing for the migrated chevron (12x8 → 12px). */
|
|
134
|
+
.split-button__chevron-glyph {
|
|
135
|
+
--hx-icon-size: 12px;
|
|
136
|
+
}
|
|
137
|
+
|
|
133
138
|
/* ─── Size Variants ─── */
|
|
134
139
|
|
|
135
140
|
/* sm */
|
|
@@ -144,16 +149,22 @@ const T = f`
|
|
|
144
149
|
min-height: var(--hx-size-8, 2rem);
|
|
145
150
|
}
|
|
146
151
|
|
|
147
|
-
/* md
|
|
152
|
+
/* md — WCAG 2.5.5 AAA Target Size (Enhanced): 44×44 minimum.
|
|
153
|
+
Bound to --hx-touch-target-min so the default md variant clears the
|
|
154
|
+
AAA-strict floor without requiring consumers to opt into sm or lg. */
|
|
148
155
|
.split-button--md .split-button__primary {
|
|
149
156
|
padding: var(--hx-space-2, 0.5rem) var(--hx-space-4, 1rem);
|
|
150
157
|
font-size: var(--hx-font-size-md, 1rem);
|
|
151
|
-
min-height: var(--hx-
|
|
158
|
+
min-height: var(--hx-touch-target-min, 2.75rem);
|
|
152
159
|
}
|
|
153
160
|
|
|
154
161
|
.split-button--md .split-button__trigger {
|
|
155
162
|
padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);
|
|
156
|
-
|
|
163
|
+
/* WCAG 2.5.5 (Enhanced) AAA — chevron trigger must clear 44×44 in
|
|
164
|
+
BOTH dimensions. Without min-width, the trigger collapses to its
|
|
165
|
+
icon width (~38 px) and fails the brand-theme matrix audit. */
|
|
166
|
+
min-width: var(--hx-touch-target-min, 2.75rem);
|
|
167
|
+
min-height: var(--hx-touch-target-min, 2.75rem);
|
|
157
168
|
}
|
|
158
169
|
|
|
159
170
|
/* lg */
|
|
@@ -170,21 +181,27 @@ const T = f`
|
|
|
170
181
|
|
|
171
182
|
/* ─── Variant: primary ─── */
|
|
172
183
|
|
|
184
|
+
/* Primary resting — bind through action.primary.bg (resolves to primary-600
|
|
185
|
+
across all 6 brands) coordinated with text.on-primary. Inline fallback
|
|
186
|
+
#0d1825 matches text.on-primary's resolved primitive (neutral-900) so a
|
|
187
|
+
cold-start without semantic tokens paints AA-tuned dark-on-teal (5.20:1)
|
|
188
|
+
rather than white-on-teal (3.43:1 fail). Mirrors hx-button precedent
|
|
189
|
+
(hx-button.styles.ts ~line 88) and Phase C structural fix. */
|
|
173
190
|
.split-button--primary .split-button__primary,
|
|
174
191
|
.split-button--primary .split-button__trigger {
|
|
175
|
-
--hx-split-button-bg: var(--hx-color-primary-
|
|
176
|
-
--hx-split-button-color: var(--hx-color-text-on-primary, #
|
|
192
|
+
--hx-split-button-bg: var(--hx-color-action-primary-bg, #429797);
|
|
193
|
+
--hx-split-button-color: var(--hx-color-text-on-primary, #0d1825);
|
|
177
194
|
--hx-split-button-border-color: transparent;
|
|
178
195
|
--hx-split-button-divider-color: var(--hx-color-primary-900, #0b3232);
|
|
179
196
|
}
|
|
180
197
|
|
|
181
|
-
/* primary:hover —
|
|
182
|
-
|
|
183
|
-
|
|
198
|
+
/* primary:hover — lift to action.primary.bg-hover (primary-700) with
|
|
199
|
+
text.on-primary-strong (neutral-0). Replaces the universal brightness(0.9)
|
|
200
|
+
filter which would degrade contrast on the resting pair. */
|
|
184
201
|
.split-button--primary .split-button__primary:hover,
|
|
185
202
|
.split-button--primary .split-button__trigger:hover {
|
|
186
|
-
--hx-split-button-bg: var(--hx-color-primary-
|
|
187
|
-
--hx-split-button-color: var(--hx-color-
|
|
203
|
+
--hx-split-button-bg: var(--hx-color-action-primary-bg-hover, #0f7078);
|
|
204
|
+
--hx-split-button-color: var(--hx-color-text-on-primary-strong, #ffffff);
|
|
188
205
|
filter: none;
|
|
189
206
|
}
|
|
190
207
|
|
|
@@ -360,15 +377,15 @@ const T = f`
|
|
|
360
377
|
}
|
|
361
378
|
}
|
|
362
379
|
`;
|
|
363
|
-
var I = Object.defineProperty, L = Object.getOwnPropertyDescriptor, a = (t, e, r,
|
|
364
|
-
for (var
|
|
365
|
-
(l = t[n]) && (
|
|
366
|
-
return
|
|
380
|
+
var I = Object.defineProperty, L = Object.getOwnPropertyDescriptor, a = (t, e, r, o) => {
|
|
381
|
+
for (var i = o > 1 ? void 0 : o ? L(e, r) : e, n = t.length - 1, l; n >= 0; n--)
|
|
382
|
+
(l = t[n]) && (i = (o ? l(e, r, i) : l(i)) || i);
|
|
383
|
+
return o && i && I(e, r, i), i;
|
|
367
384
|
};
|
|
368
|
-
const
|
|
385
|
+
const A = C("hx-split-button");
|
|
369
386
|
let s = class extends M {
|
|
370
387
|
constructor() {
|
|
371
|
-
super(...arguments), this._open = !1, this.variant = "primary", this.size = "md", this.disabled = !1, this.label = void 0, this.accessibleLabel = "", this.labelTrigger = "More actions", this.labelMenu = "Secondary actions", this._menuId = `${
|
|
388
|
+
super(...arguments), this._open = !1, this.variant = "primary", this.size = "md", this.disabled = !1, this.label = void 0, this.accessibleLabel = "", this.labelTrigger = "More actions", this.labelMenu = "Secondary actions", this._menuId = `${A()}-menu`, this._resolvedPrimaryLabel = null, this._ariaMirror = null, this._rovingIndex = -1, this._typeaheadBuffer = "", this._typeaheadTimer = null, this._deprecatedAccessibleLabelWarned = !1, this._handleOutsideClick = (t) => {
|
|
372
389
|
if (!this._open) return;
|
|
373
390
|
const e = t.target;
|
|
374
391
|
!this.contains(e) && e !== this && this._closeMenu();
|
|
@@ -380,16 +397,16 @@ let s = class extends M {
|
|
|
380
397
|
r && d(r) === null && queueMicrotask(() => {
|
|
381
398
|
t.defaultPrevented || (r.setSubmenuOpen(!0), r.updateComplete.then(() => {
|
|
382
399
|
var n, l;
|
|
383
|
-
const
|
|
384
|
-
(l =
|
|
400
|
+
const o = (n = r.shadowRoot) == null ? void 0 : n.querySelector('slot[name="submenu"]'), i = o == null ? void 0 : o.assignedElements({ flatten: !0 }).find((m) => m.tagName.toLowerCase() === "hx-menu");
|
|
401
|
+
(l = i == null ? void 0 : i.focusFirst) == null || l.call(i);
|
|
385
402
|
}).catch(() => {
|
|
386
403
|
}));
|
|
387
404
|
});
|
|
388
405
|
}, this._handleMenuSubmenuClose = (t) => {
|
|
389
|
-
var
|
|
406
|
+
var o;
|
|
390
407
|
if (!(t instanceof CustomEvent)) return;
|
|
391
408
|
const e = t.detail, r = e == null ? void 0 : e.item;
|
|
392
|
-
r && d(r) === null && (t.defaultPrevented || (this._closeMenu(), (
|
|
409
|
+
r && d(r) === null && (t.defaultPrevented || (this._closeMenu(), (o = this._triggerButton) == null || o.focus()));
|
|
393
410
|
};
|
|
394
411
|
}
|
|
395
412
|
// ─── Lifecycle ───
|
|
@@ -412,9 +429,9 @@ let s = class extends M {
|
|
|
412
429
|
* @internal
|
|
413
430
|
*/
|
|
414
431
|
_syncResolvedPrimaryLabel() {
|
|
415
|
-
const t = this.getAttribute("aria-labelledby"), r = k(this, t).map((l) =>
|
|
432
|
+
const t = this.getAttribute("aria-labelledby"), r = k(this, t).map((l) => _(l)).filter((l) => l.length > 0).join(" ").replace(/\s+/g, " ").trim(), o = this.getAttribute("aria-label"), i = o !== null ? o.trim() : "";
|
|
416
433
|
let n = null;
|
|
417
|
-
r ? n = r :
|
|
434
|
+
r ? n = r : i ? n = i : this.accessibleLabel ? (this._deprecatedAccessibleLabelWarned || (this._deprecatedAccessibleLabelWarned = !0), n = this.accessibleLabel) : this.label ? n = this.label : n = null, this._resolvedPrimaryLabel = n;
|
|
418
435
|
}
|
|
419
436
|
// ─── Primary Button Handlers ───
|
|
420
437
|
/** @internal */
|
|
@@ -451,25 +468,25 @@ let s = class extends M {
|
|
|
451
468
|
// ─── Menu Key Navigation ───
|
|
452
469
|
/** @internal */
|
|
453
470
|
_handleMenuKeydown(t) {
|
|
454
|
-
var
|
|
471
|
+
var o;
|
|
455
472
|
const e = this._getMenuItems();
|
|
456
473
|
if (e.length === 0) return;
|
|
457
|
-
const r = e.findIndex((
|
|
474
|
+
const r = e.findIndex((i) => i === document.activeElement);
|
|
458
475
|
switch (t.key) {
|
|
459
476
|
case "ArrowDown": {
|
|
460
477
|
t.preventDefault();
|
|
461
|
-
const
|
|
462
|
-
this._focusMenuItem(e,
|
|
478
|
+
const i = r < e.length - 1 ? r + 1 : 0;
|
|
479
|
+
this._focusMenuItem(e, i);
|
|
463
480
|
break;
|
|
464
481
|
}
|
|
465
482
|
case "ArrowUp": {
|
|
466
483
|
t.preventDefault();
|
|
467
|
-
const
|
|
468
|
-
this._focusMenuItem(e,
|
|
484
|
+
const i = r > 0 ? r - 1 : e.length - 1;
|
|
485
|
+
this._focusMenuItem(e, i);
|
|
469
486
|
break;
|
|
470
487
|
}
|
|
471
488
|
case "Escape": {
|
|
472
|
-
t.preventDefault(), this._closeMenu(), (
|
|
489
|
+
t.preventDefault(), this._closeMenu(), (o = this._triggerButton) == null || o.focus();
|
|
473
490
|
break;
|
|
474
491
|
}
|
|
475
492
|
case "Home": {
|
|
@@ -508,22 +525,22 @@ let s = class extends M {
|
|
|
508
525
|
this._typeaheadTimer !== null && clearTimeout(this._typeaheadTimer), this._typeaheadBuffer += t.toLowerCase(), this._typeaheadTimer = setTimeout(() => {
|
|
509
526
|
this._typeaheadBuffer = "", this._typeaheadTimer = null;
|
|
510
527
|
}, 500);
|
|
511
|
-
const r = e.findIndex((
|
|
528
|
+
const r = e.findIndex((o) => y(o).toLowerCase().startsWith(this._typeaheadBuffer));
|
|
512
529
|
r !== -1 && this._focusMenuItem(e, r);
|
|
513
530
|
}
|
|
514
531
|
// ─── Menu Item Selection ───
|
|
515
532
|
/** @internal */
|
|
516
533
|
_handleMenuItemSelect(t) {
|
|
517
|
-
var
|
|
534
|
+
var i, n;
|
|
518
535
|
if (!(t instanceof CustomEvent)) return;
|
|
519
536
|
const e = t;
|
|
520
|
-
this._closeMenu(), (
|
|
521
|
-
const r = e.detail.item,
|
|
537
|
+
this._closeMenu(), (i = this._triggerButton) == null || i.focus();
|
|
538
|
+
const r = e.detail.item, o = ((n = r == null ? void 0 : r.textContent) == null ? void 0 : n.trim()) ?? "";
|
|
522
539
|
this.dispatchEvent(
|
|
523
540
|
new CustomEvent("hx-select", {
|
|
524
541
|
bubbles: !0,
|
|
525
542
|
composed: !0,
|
|
526
|
-
detail: { value: e.detail.value, label:
|
|
543
|
+
detail: { value: e.detail.value, label: o }
|
|
527
544
|
})
|
|
528
545
|
);
|
|
529
546
|
}
|
|
@@ -572,19 +589,19 @@ let s = class extends M {
|
|
|
572
589
|
"split-button__chevron": !0,
|
|
573
590
|
"split-button__chevron--open": this._open
|
|
574
591
|
};
|
|
575
|
-
return
|
|
576
|
-
<div class=${
|
|
592
|
+
return p`
|
|
593
|
+
<div class=${h(t)}>
|
|
577
594
|
<!-- Primary action button -->
|
|
578
595
|
<button
|
|
579
596
|
part="button"
|
|
580
597
|
class="split-button__primary"
|
|
581
598
|
?disabled=${this.disabled}
|
|
582
599
|
type="button"
|
|
583
|
-
aria-label=${this._resolvedPrimaryLabel ??
|
|
600
|
+
aria-label=${this._resolvedPrimaryLabel ?? g}
|
|
584
601
|
@click=${this._handlePrimaryClick}
|
|
585
602
|
@keydown=${this._handlePrimaryKeydown}
|
|
586
603
|
>
|
|
587
|
-
${this.label !== void 0 ? this.label :
|
|
604
|
+
${this.label !== void 0 ? this.label : p`<slot></slot>`}
|
|
588
605
|
</button>
|
|
589
606
|
|
|
590
607
|
<!-- Dropdown trigger button -->
|
|
@@ -600,22 +617,13 @@ let s = class extends M {
|
|
|
600
617
|
@click=${this._handleTriggerClick}
|
|
601
618
|
@keydown=${this._handleTriggerKeydown}
|
|
602
619
|
>
|
|
603
|
-
<span class=${
|
|
604
|
-
<
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
>
|
|
611
|
-
<path
|
|
612
|
-
d="M1 1.5L6 6.5L11 1.5"
|
|
613
|
-
stroke="currentColor"
|
|
614
|
-
stroke-width="1.5"
|
|
615
|
-
stroke-linecap="round"
|
|
616
|
-
stroke-linejoin="round"
|
|
617
|
-
/>
|
|
618
|
-
</svg>
|
|
620
|
+
<span class=${h(r)} aria-hidden="true">
|
|
621
|
+
<hx-icon
|
|
622
|
+
class="split-button__chevron-glyph"
|
|
623
|
+
library="helix"
|
|
624
|
+
name="chevron-down"
|
|
625
|
+
aria-hidden="true"
|
|
626
|
+
></hx-icon>
|
|
619
627
|
</span>
|
|
620
628
|
</button>
|
|
621
629
|
|
|
@@ -623,7 +631,7 @@ let s = class extends M {
|
|
|
623
631
|
<div
|
|
624
632
|
part="menu"
|
|
625
633
|
id=${this._menuId}
|
|
626
|
-
class=${
|
|
634
|
+
class=${h(e)}
|
|
627
635
|
role="menu"
|
|
628
636
|
aria-label=${this.labelMenu}
|
|
629
637
|
@keydown=${this._handleMenuKeydown}
|
|
@@ -639,13 +647,13 @@ let s = class extends M {
|
|
|
639
647
|
};
|
|
640
648
|
s.styles = [T, x];
|
|
641
649
|
a([
|
|
642
|
-
|
|
650
|
+
c(".split-button__menu")
|
|
643
651
|
], s.prototype, "_menuPanel", 2);
|
|
644
652
|
a([
|
|
645
|
-
|
|
653
|
+
c(".split-button__trigger")
|
|
646
654
|
], s.prototype, "_triggerButton", 2);
|
|
647
655
|
a([
|
|
648
|
-
|
|
656
|
+
b()
|
|
649
657
|
], s.prototype, "_open", 2);
|
|
650
658
|
a([
|
|
651
659
|
u({ type: String, reflect: !0 })
|
|
@@ -669,12 +677,12 @@ a([
|
|
|
669
677
|
u({ type: String, attribute: "label-menu" })
|
|
670
678
|
], s.prototype, "labelMenu", 2);
|
|
671
679
|
a([
|
|
672
|
-
|
|
680
|
+
b()
|
|
673
681
|
], s.prototype, "_resolvedPrimaryLabel", 2);
|
|
674
682
|
s = a([
|
|
675
|
-
|
|
683
|
+
v("hx-split-button")
|
|
676
684
|
], s);
|
|
677
685
|
export {
|
|
678
686
|
s as H
|
|
679
687
|
};
|
|
680
|
-
//# sourceMappingURL=hx-split-button-
|
|
688
|
+
//# sourceMappingURL=hx-split-button-Bg9FHrFK.js.map
|