@helixui/library 3.7.0 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +1926 -303
- 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-banner/hx-banner.d.ts +19 -0
- package/dist/components/hx-banner/hx-banner.d.ts.map +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-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 +19 -0
- package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +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-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-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 +18 -0
- package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +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-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-menu/hx-menu.d.ts +18 -0
- package/dist/components/hx-menu/hx-menu.d.ts.map +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/index.js +1 -1
- package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts +18 -0
- package/dist/components/hx-overflow-menu/hx-overflow-menu.d.ts.map +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-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-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 +19 -0
- package/dist/components/hx-slider/hx-slider.d.ts.map +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-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-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 -0
- package/dist/components/hx-toast/hx-toast.d.ts.map +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/css/helix-all.css +239 -30
- package/dist/css/helix-core.css +4 -1
- package/dist/css/helix-forms.css +100 -15
- package/dist/css/helix-navigation.css +43 -2
- package/dist/css/helix-overlay.css +53 -0
- package/dist/css/helix-tokens.css +13 -12
- package/dist/css/helix-utility.css +39 -12
- package/dist/css/hx-action-bar.css +12 -0
- package/dist/css/hx-button.css +4 -1
- package/dist/css/hx-checkbox-group.css +11 -0
- package/dist/css/hx-checkbox.css +10 -0
- package/dist/css/hx-color-picker.css +14 -1
- package/dist/css/hx-copy-button.css +5 -2
- package/dist/css/hx-date-picker.css +6 -1
- package/dist/css/hx-dropdown.css +13 -0
- package/dist/css/hx-nav.css +24 -2
- package/dist/css/hx-number-input.css +8 -8
- 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-side-nav.css +7 -0
- package/dist/css/hx-split-button.css +22 -10
- package/dist/css/hx-switch.css +19 -1
- package/dist/css/hx-text-input.css +4 -1
- package/dist/css/hx-time-picker.css +7 -2
- package/dist/css/hx-toggle-button.css +11 -1
- package/dist/css/hx-tooltip.css +13 -0
- package/dist/css/hx-top-nav.css +12 -0
- package/dist/css/index.css +1 -1
- package/dist/css/manifest.json +40 -12
- package/dist/index.js +24 -24
- 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-banner-fpRnciIO.js.map +1 -1
- 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-checkbox-hPlIw6Lb.js → hx-checkbox-DcgyGS9V.js} +30 -20
- package/dist/shared/hx-checkbox-DcgyGS9V.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.map +1 -1
- 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.map +1 -1
- 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-0PtEav0K.js} +66 -61
- package/dist/shared/hx-date-picker-0PtEav0K.js.map +1 -0
- package/dist/shared/hx-drawer-CM_upadk.js.map +1 -1
- package/dist/shared/{hx-dropdown-D626S2ZG.js → hx-dropdown-xHwTJecv.js} +44 -31
- package/dist/shared/hx-dropdown-xHwTJecv.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.map +1 -1
- package/dist/shared/hx-form-CkChEATa.js.map +1 -1
- package/dist/shared/hx-help-text-Xb2Yr8x2.js.map +1 -1
- package/dist/shared/hx-icon-button-B2BdVdyK.js.map +1 -1
- package/dist/shared/hx-menu-divider-A6Guuzi_.js.map +1 -1
- package/dist/shared/{hx-nav-ldFM3Fle.js → hx-nav-ChMTfn7o.js} +66 -44
- package/dist/shared/hx-nav-ChMTfn7o.js.map +1 -0
- package/dist/shared/{hx-nav-item-CODtUlew.js → hx-nav-item-ClN17f1y.js} +62 -55
- package/dist/shared/hx-nav-item-ClN17f1y.js.map +1 -0
- package/dist/shared/{hx-number-input-yUzFOSC1.js → hx-number-input-MggsT7F0.js} +13 -13
- package/dist/shared/hx-number-input-MggsT7F0.js.map +1 -0
- package/dist/shared/hx-overflow-menu-DFjJAziP.js.map +1 -1
- 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-BY4zpwdh.js} +45 -27
- package/dist/shared/hx-radio-BY4zpwdh.js.map +1 -0
- package/dist/shared/hx-rating-C3QP53k9.js.map +1 -1
- package/dist/shared/hx-select-DahFehiZ.js.map +1 -1
- package/dist/shared/hx-slider-Blmv_rwS.js.map +1 -1
- package/dist/shared/{hx-split-button-Ddle8iVx.js → hx-split-button-CdNz1XAu.js} +62 -50
- package/dist/shared/hx-split-button-CdNz1XAu.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-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-DfJkBwcX.js} +41 -36
- package/dist/shared/hx-time-picker-DfJkBwcX.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-CsTxOtVI.js} +26 -14
- package/dist/shared/hx-top-nav-CsTxOtVI.js.map +1 -0
- package/dist/shared/toast-factory-Dht3pVsw.js.map +1 -1
- package/figma-inventory.json +1121 -345
- package/package.json +2 -2
- package/dist/shared/hx-action-bar-CitgcpGv.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-checkbox-group-D5piJLY8.js.map +0 -1
- package/dist/shared/hx-checkbox-hPlIw6Lb.js.map +0 -1
- package/dist/shared/hx-color-picker-DBwJzT5f.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-dropdown-D626S2ZG.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-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-split-button-Ddle8iVx.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-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
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { property as a, state as n, query as
|
|
3
|
-
import { classMap as
|
|
4
|
-
import { ifDefined as
|
|
1
|
+
import { css as A, nothing as b, html as k } from "lit";
|
|
2
|
+
import { property as a, state as n, query as S, customElement as T } from "lit/decorators.js";
|
|
3
|
+
import { classMap as z } from "lit/directives/class-map.js";
|
|
4
|
+
import { ifDefined as x } from "lit/directives/if-defined.js";
|
|
5
5
|
import { F as E } from "./FormMixin-B8PXk5RQ.js";
|
|
6
6
|
import { b as L } from "./forced-colors-CTEDFRGa.js";
|
|
7
7
|
import { s as D, i as $, r as y } from "./aria-idref-DCuEaknC.js";
|
|
8
8
|
import { H as B } from "./helix-element-BNEYeiys.js";
|
|
9
9
|
import { c as H } from "./id-counter-DuX8vsui.js";
|
|
10
|
-
const C =
|
|
10
|
+
const C = A`
|
|
11
11
|
:host {
|
|
12
12
|
display: block;
|
|
13
|
+
/*
|
|
14
|
+
* Suppress the browser default ~1px host outline. Without this the formal
|
|
15
|
+
* AAA audit harness (which measures computed outline-width on the focused
|
|
16
|
+
* host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.
|
|
17
|
+
* The visual focus indicator is rendered on the inner .switch__track below.
|
|
18
|
+
*/
|
|
19
|
+
outline: none;
|
|
13
20
|
}
|
|
14
21
|
|
|
15
22
|
:host([disabled]) {
|
|
@@ -81,7 +88,18 @@ const C = S`
|
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
.switch--checked .switch__track {
|
|
84
|
-
|
|
91
|
+
/* WCAG 1.4.6 AAA-strict 7:1: consume action.primary.bg (primary-700 since
|
|
92
|
+
3.4.0) so the checked track inherits the elevated AAA-strict action
|
|
93
|
+
surface contract used by every other primary interactive surface
|
|
94
|
+
(hx-button, hx-checkbox checked-bg, hx-radio checked-bg, etc.). The
|
|
95
|
+
prior primary-500 fallback (#429797 in Apex) clears AA (5.20:1) but
|
|
96
|
+
only resolves to ~6.11:1 in the formal harness's contrast probe —
|
|
97
|
+
below the 7:1 AAA-strict floor. action.primary.bg = primary-700
|
|
98
|
+
(#0F6363 in Apex) clears 7.03:1 across all 6 brands. */
|
|
99
|
+
background-color: var(
|
|
100
|
+
--hx-switch-track-checked-bg,
|
|
101
|
+
var(--hx-color-action-primary-bg, var(--hx-color-primary-700, #0f7078))
|
|
102
|
+
);
|
|
85
103
|
}
|
|
86
104
|
|
|
87
105
|
.switch:not(.switch--checked) .switch__track:hover {
|
|
@@ -261,10 +279,10 @@ const C = S`
|
|
|
261
279
|
}
|
|
262
280
|
}
|
|
263
281
|
`;
|
|
264
|
-
var R = Object.defineProperty, q = Object.getOwnPropertyDescriptor, s = (e, t,
|
|
265
|
-
for (var i = h > 1 ? void 0 : h ? q(t,
|
|
266
|
-
(c = e[
|
|
267
|
-
return h && i && R(t,
|
|
282
|
+
var R = Object.defineProperty, q = Object.getOwnPropertyDescriptor, s = (e, t, o, h) => {
|
|
283
|
+
for (var i = h > 1 ? void 0 : h ? q(t, o) : t, l = e.length - 1, c; l >= 0; l--)
|
|
284
|
+
(c = e[l]) && (i = (h ? c(t, o, i) : c(i)) || i);
|
|
285
|
+
return h && i && R(t, o, i), i;
|
|
268
286
|
};
|
|
269
287
|
const M = H("hx-switch");
|
|
270
288
|
let r = class extends E(B) {
|
|
@@ -308,15 +326,15 @@ let r = class extends E(B) {
|
|
|
308
326
|
*/
|
|
309
327
|
_syncHostAriaSemantics() {
|
|
310
328
|
var c, u, f, d;
|
|
311
|
-
const e = this._internals, t = ((c = this.getAttribute("aria-label")) == null ? void 0 : c.trim()) || "",
|
|
329
|
+
const e = this._internals, t = ((c = this.getAttribute("aria-label")) == null ? void 0 : c.trim()) || "", o = this.getAttribute("aria-labelledby"), h = this.getAttribute("aria-describedby"), i = y(this, o), l = i.length > 0;
|
|
312
330
|
if (this._supportsIdrefRefs) {
|
|
313
|
-
e.role = "switch", e.ariaChecked = this.checked ? "true" : "false", e.ariaRequired = this.required ? "true" : "false", e.ariaInvalid = e.validity.valid ? "false" : "true", e.ariaDisabled = this.disabled ? "true" : "false", t ? e.ariaLabel = t :
|
|
331
|
+
e.role = "switch", e.ariaChecked = this.checked ? "true" : "false", e.ariaRequired = this.required ? "true" : "false", e.ariaInvalid = e.validity.valid ? "false" : "true", e.ariaDisabled = this.disabled ? "true" : "false", t ? e.ariaLabel = t : l ? e.ariaLabel = null : e.ariaLabel = this.label || null;
|
|
314
332
|
const p = e, _ = (u = this.shadowRoot) == null ? void 0 : u.getElementById(this._labelId), I = !!this.label || this._hasDefaultSlot;
|
|
315
333
|
i.length === 0 && !t && I && _ && i.push(_), p.ariaLabelledByElements = i.length > 0 ? i : null;
|
|
316
|
-
const
|
|
317
|
-
w && !g && (this.helpText || this._hasHelpTextSlot) &&
|
|
334
|
+
const m = y(this, h), w = (f = this.shadowRoot) == null ? void 0 : f.getElementById(this._helpTextId), v = (d = this.shadowRoot) == null ? void 0 : d.getElementById(this._errorId), g = !!(this.error || this._hasErrorSlot);
|
|
335
|
+
w && !g && (this.helpText || this._hasHelpTextSlot) && m.push(w), v && g && m.push(v), p.ariaDescribedByElements = m.length > 0 ? m : null, this._fallbackAriaLabelledBy = null, this._fallbackAriaDescribedBy = null, this._fallbackAriaLabel = null;
|
|
318
336
|
} else
|
|
319
|
-
e.role = null, e.ariaChecked = null, e.ariaRequired = null, e.ariaInvalid = null, e.ariaDisabled = null, e.ariaLabel = null, this._fallbackAriaLabelledBy =
|
|
337
|
+
e.role = null, e.ariaChecked = null, e.ariaRequired = null, e.ariaInvalid = null, e.ariaDisabled = null, e.ariaLabel = null, this._fallbackAriaLabelledBy = l ? o : null, this._fallbackAriaDescribedBy = h || null, this._fallbackAriaLabel = l ? null : t || this.label || null;
|
|
320
338
|
}
|
|
321
339
|
// ─── Form Integration ───
|
|
322
340
|
/** Recalculates and sets the validity state based on required and checked. */
|
|
@@ -403,16 +421,16 @@ let r = class extends E(B) {
|
|
|
403
421
|
(t = this._trackEl) == null || t.focus(e);
|
|
404
422
|
}
|
|
405
423
|
render() {
|
|
406
|
-
const e = !!this.error || this._hasErrorSlot, t = !!this.helpText || this._hasHelpTextSlot,
|
|
424
|
+
const e = !!this.error || this._hasErrorSlot, t = !!this.helpText || this._hasHelpTextSlot, o = !!this.label || this._hasDefaultSlot, h = e || this.required && !this.checked, i = {
|
|
407
425
|
switch: !0,
|
|
408
426
|
"switch--checked": this.checked,
|
|
409
427
|
"switch--disabled": this.disabled,
|
|
410
428
|
"switch--required": this.required,
|
|
411
429
|
"switch--error": e,
|
|
412
430
|
[`switch--${this.size}`]: !0
|
|
413
|
-
}, c = [([!e && t ? this._helpTextId : null, e ? this._errorId : null].filter(Boolean).join(" ") || void 0) ?? null, this._fallbackAriaDescribedBy].filter(Boolean).join(" ") || void 0, u = this._fallbackAriaLabel ?? void 0, f = this._fallbackAriaLabelledBy ? this._fallbackAriaLabelledBy : u ? void 0 :
|
|
431
|
+
}, c = [([!e && t ? this._helpTextId : null, e ? this._errorId : null].filter(Boolean).join(" ") || void 0) ?? null, this._fallbackAriaDescribedBy].filter(Boolean).join(" ") || void 0, u = this._fallbackAriaLabel ?? void 0, f = this._fallbackAriaLabelledBy ? this._fallbackAriaLabelledBy : u ? void 0 : o ? this._labelId : void 0, d = !this._supportsIdrefRefs, p = d && !this.disabled ? "0" : "-1", _ = d ? "switch" : b;
|
|
414
432
|
return k`
|
|
415
|
-
<div part="switch" class=${
|
|
433
|
+
<div part="switch" class=${z(i)}>
|
|
416
434
|
<div class="switch__control-row">
|
|
417
435
|
<button
|
|
418
436
|
part="track"
|
|
@@ -422,9 +440,9 @@ let r = class extends E(B) {
|
|
|
422
440
|
role=${_}
|
|
423
441
|
tabindex=${p}
|
|
424
442
|
aria-checked=${this.checked ? "true" : "false"}
|
|
425
|
-
aria-labelledby=${
|
|
426
|
-
aria-describedby=${
|
|
427
|
-
aria-label=${
|
|
443
|
+
aria-labelledby=${x(f)}
|
|
444
|
+
aria-describedby=${x(c)}
|
|
445
|
+
aria-label=${x(u)}
|
|
428
446
|
aria-invalid=${h ? "true" : b}
|
|
429
447
|
aria-required=${this.required ? "true" : b}
|
|
430
448
|
aria-hidden=${d ? b : "true"}
|
|
@@ -520,7 +538,7 @@ s([
|
|
|
520
538
|
n()
|
|
521
539
|
], r.prototype, "_supportsIdrefRefs", 2);
|
|
522
540
|
s([
|
|
523
|
-
|
|
541
|
+
S(".switch__track")
|
|
524
542
|
], r.prototype, "_trackEl", 2);
|
|
525
543
|
s([
|
|
526
544
|
n()
|
|
@@ -532,9 +550,9 @@ s([
|
|
|
532
550
|
n()
|
|
533
551
|
], r.prototype, "_hasHelpTextSlot", 2);
|
|
534
552
|
r = s([
|
|
535
|
-
|
|
553
|
+
T("hx-switch")
|
|
536
554
|
], r);
|
|
537
555
|
export {
|
|
538
556
|
r as H
|
|
539
557
|
};
|
|
540
|
-
//# sourceMappingURL=hx-switch-
|
|
558
|
+
//# sourceMappingURL=hx-switch-BCXuNxEH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hx-switch-BCXuNxEH.js","sources":["../../src/components/hx-switch/hx-switch.styles.ts","../../src/components/hx-switch/hx-switch.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixSwitchStyles = css`\n :host {\n display: block;\n /*\n * Suppress the browser default ~1px host outline. Without this the formal\n * AAA audit harness (which measures computed outline-width on the focused\n * host) records a sub-2px outline and reports WCAG 2.4.13 Partially Supports.\n * The visual focus indicator is rendered on the inner .switch__track below.\n */\n outline: none;\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 /* --- Layout --- */\n\n .switch {\n display: flex;\n flex-direction: column;\n gap: var(--hx-space-1, 0.25rem);\n font-family: var(--hx-switch-font-family, var(--hx-font-family-sans, sans-serif));\n }\n\n /* WCAG 2.5.5 (healthcare mandate): minimum 44px touch target height.\n The track itself is smaller visually, but the row must meet the\n interactive touch target threshold for all size variants. */\n .switch__control-row {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n min-height: var(--hx-touch-target-min, 2.75rem);\n }\n\n /* --- Track --- */\n\n .switch__track {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n border: none;\n padding: 0;\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-switch-track-bg, var(--hx-color-border-strong, #66787b));\n cursor: pointer;\n transition: background-color var(--hx-transition-fast, 150ms ease);\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n }\n\n /*\n * Host-focus path: on the modern (IDL element-references) render branch the\n * host is the tabbable surface (tabindex=0) and the inner track button is\n * demoted to tabindex=-1. Drive the focus ring from ':host(:focus-visible)'\n * so keyboard users still see a visible affordance. Codex round-11 P1.\n */\n :host(:focus-visible) .switch__track {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-switch-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n /*\n * Fallback (no-IDL-ref) path: the host carries tabindex=-1 and the inner\n * track button is the tab target. Native :focus-visible drives the ring.\n */\n .switch__track:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-switch-focus-ring-color, var(--hx-focus-ring-color, #0f7078));\n outline-offset: var(--hx-focus-ring-offset, 2px);\n }\n\n .switch--checked .switch__track {\n /* WCAG 1.4.6 AAA-strict 7:1: consume action.primary.bg (primary-700 since\n 3.4.0) so the checked track inherits the elevated AAA-strict action\n surface contract used by every other primary interactive surface\n (hx-button, hx-checkbox checked-bg, hx-radio checked-bg, etc.). The\n prior primary-500 fallback (#429797 in Apex) clears AA (5.20:1) but\n only resolves to ~6.11:1 in the formal harness's contrast probe —\n below the 7:1 AAA-strict floor. action.primary.bg = primary-700\n (#0F6363 in Apex) clears 7.03:1 across all 6 brands. */\n background-color: var(\n --hx-switch-track-checked-bg,\n var(--hx-color-action-primary-bg, var(--hx-color-primary-700, #0f7078))\n );\n }\n\n .switch:not(.switch--checked) .switch__track:hover {\n background-color: var(--hx-switch-track-hover-bg, var(--hx-color-border-strong, #66787b));\n }\n\n .switch--checked .switch__track:hover {\n background-color: var(--hx-switch-track-checked-hover-bg, var(--hx-color-primary-600, #0f7078));\n }\n\n /* --- Thumb --- */\n\n .switch__thumb {\n position: absolute;\n border-radius: var(--hx-border-radius-full, 9999px);\n background-color: var(--hx-switch-thumb-bg, var(--hx-color-surface-default, #ffffff));\n box-shadow: var(--hx-switch-thumb-shadow, var(--hx-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05)));\n transition: transform var(--hx-transition-fast, 150ms ease);\n }\n\n /* --- Size: sm (track 32x18, thumb 14px) --- */\n\n .switch--sm .switch__track {\n width: var(--hx-switch-track-width-sm, var(--hx-size-8, 2rem));\n height: var(--hx-switch-track-height-sm, var(--hx-size-4-5, 1.125rem));\n }\n\n .switch--sm .switch__thumb {\n width: var(--hx-switch-thumb-size-sm, var(--hx-size-3-5, 0.875rem));\n height: var(--hx-switch-thumb-size-sm, var(--hx-size-3-5, 0.875rem));\n top: 50%;\n left: var(--hx-switch-thumb-offset, var(--hx-space-0-5, 0.125rem));\n transform: translateY(-50%);\n }\n\n .switch--sm.switch--checked .switch__thumb {\n transform: translateY(-50%)\n translateX(var(--hx-switch-thumb-size-sm, var(--hx-size-3-5, 0.875rem)));\n }\n\n /* --- Size: md (track 40x22, thumb 18px) --- */\n\n .switch--md .switch__track {\n width: var(--hx-switch-track-width-md, var(--hx-size-10, 2.5rem));\n height: var(--hx-switch-track-height-md, var(--hx-size-5-5, 1.375rem));\n }\n\n .switch--md .switch__thumb {\n width: var(--hx-switch-thumb-size-md, var(--hx-size-4-5, 1.125rem));\n height: var(--hx-switch-thumb-size-md, var(--hx-size-4-5, 1.125rem));\n top: 50%;\n left: var(--hx-switch-thumb-offset, var(--hx-space-0-5, 0.125rem));\n transform: translateY(-50%);\n }\n\n .switch--md.switch--checked .switch__thumb {\n transform: translateY(-50%)\n translateX(var(--hx-switch-thumb-size-md, var(--hx-size-4-5, 1.125rem)));\n }\n\n /* --- Size: lg (track 48x26, thumb 22px) --- */\n\n .switch--lg .switch__track {\n width: var(--hx-switch-track-width-lg, var(--hx-size-12, 3rem));\n height: var(--hx-switch-track-height-lg, var(--hx-size-6-5, 1.625rem));\n }\n\n .switch--lg .switch__thumb {\n width: var(--hx-switch-thumb-size-lg, var(--hx-size-5-5, 1.375rem));\n height: var(--hx-switch-thumb-size-lg, var(--hx-size-5-5, 1.375rem));\n top: 50%;\n left: var(--hx-switch-thumb-offset, var(--hx-space-0-5, 0.125rem));\n transform: translateY(-50%);\n }\n\n .switch--lg.switch--checked .switch__thumb {\n transform: translateY(-50%)\n translateX(var(--hx-switch-thumb-size-lg, var(--hx-size-5-5, 1.375rem)));\n }\n\n /* --- Label --- */\n\n .switch__label {\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-weight: var(--hx-font-weight-medium, 500);\n color: var(--hx-switch-label-color, var(--hx-color-text-strong, #202b39));\n line-height: var(--hx-line-height-normal, 1.5);\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n }\n\n .switch__required-marker {\n color: var(--hx-switch-error-color, var(--hx-color-error-text, #c92a2a));\n font-weight: var(--hx-font-weight-bold, 700);\n }\n\n /* --- Help Text & Error --- */\n\n .switch__help-text {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-switch-help-text-color, var(--hx-color-text-muted, #4a5362));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n .switch__error {\n font-size: var(--hx-font-size-xs, 0.75rem);\n color: var(--hx-switch-error-color, var(--hx-color-error-text, #c92a2a));\n line-height: var(--hx-line-height-normal, 1.5);\n }\n\n /* --- Reduced Motion --- */\n\n @media (prefers-reduced-motion: reduce) {\n .switch__track,\n .switch__thumb {\n transition: none;\n }\n }\n\n /* ─── High Contrast Mode (forced-colors) ─── */\n\n @media (forced-colors: active) {\n .switch__track {\n forced-color-adjust: none;\n background-color: ButtonFace;\n border: 2px solid ButtonText;\n }\n\n :host(:focus-visible) .switch__track,\n .switch__track:focus-visible {\n outline: 3px solid Highlight;\n outline-offset: 2px;\n }\n\n .switch__thumb {\n background-color: ButtonText;\n box-shadow: none;\n }\n\n .switch--checked .switch__track {\n background-color: Highlight;\n border-color: Highlight;\n }\n\n .switch--checked .switch__thumb {\n background-color: HighlightText;\n }\n\n :host([disabled]) {\n opacity: 1;\n }\n\n :host([disabled]) .switch__track {\n border-color: GrayText;\n background-color: ButtonFace;\n }\n\n :host([disabled]) .switch__thumb {\n background-color: GrayText;\n }\n\n :host([disabled]) .switch__label {\n color: GrayText;\n }\n\n .switch__label {\n color: CanvasText;\n }\n\n .switch__help-text {\n color: GrayText;\n }\n\n .switch__error {\n color: LinkText;\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 { ifDefined } from 'lit/directives/if-defined.js';\nimport { HelixElement, createIdCounter } from '../../base/index.js';\nimport { FormMixin } from '../../mixins/FormMixin.js';\nimport { helixSwitchStyles } from './hx-switch.styles.js';\nimport { forcedColorsField } from '../../styles/forced-colors.js';\nimport {\n installAriaIdrefMirror,\n resolveIdrefTokens,\n supportsIdrefElementReferences,\n type AriaIdrefMirrorHandle,\n} from '../../utils/aria-idref.js';\n\nconst _nextSwitchId = createIdCounter('hx-switch');\n\n/** Detail for the hx-change event dispatched by hx-switch. */\nexport interface HxSwitchChangeDetail {\n checked: boolean;\n value: string;\n}\n\n/**\n * A toggle switch component for on/off states.\n *\n * Uses `role=\"switch\"` with `aria-checked` to convey toggle state.\n * Supports keyboard activation via Space key (per ARIA APG switch pattern).\n * Label association is handled through `aria-labelledby`, and\n * error/help text are linked via `aria-describedby`.\n *\n * @summary Form-associated toggle switch with label, error, and help text.\n *\n * @tag hx-switch\n *\n * @slot - Custom label content (overrides the label property).\n * @slot error - Custom error content (overrides the error property).\n * @slot help-text - Custom help text content (overrides the helpText property).\n *\n * @fires {CustomEvent<{checked: boolean, value: string}>} hx-change - Dispatched when the switch is toggled. Boolean-selection controls (`hx-switch`, `hx-checkbox`) include both `checked` (boolean state) and `value` (form value) in the detail; text-value controls (`hx-text-input`, `hx-combobox`, `hx-select`) emit only `{value}`.\n *\n * @csspart switch - The switch container (track + thumb wrapper).\n * @csspart track - The track background element.\n * @csspart thumb - The sliding thumb element.\n * @csspart label - The label text element.\n * @csspart help-text - The help text container.\n * @csspart error - The error message container.\n *\n * @cssprop [--hx-switch-track-bg=var(--hx-color-neutral-300)] - Track background color.\n * @cssprop [--hx-switch-track-checked-bg=var(--hx-color-primary-500)] - Track background when checked.\n * @cssprop [--hx-switch-thumb-bg=var(--hx-color-neutral-0)] - Thumb background color.\n * @cssprop [--hx-switch-thumb-shadow=var(--hx-shadow-sm)] - Thumb box shadow.\n * @cssprop [--hx-switch-focus-ring-color=var(--hx-focus-ring-color)] - Focus ring color.\n * @cssprop [--hx-switch-label-color=var(--hx-color-neutral-700)] - Label text color.\n * @cssprop [--hx-switch-error-color=var(--hx-color-error-500)] - Error message color.\n * @cssprop [--hx-switch-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-switch-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-touch-target-min] - Minimum touch target size.\n * @cssprop [--hx-border-radius-full] - CSS custom property.\n * @cssprop [--hx-color-neutral-300] - Color.\n * @cssprop [--hx-transition-fast] - Transition timing.\n * @cssprop [--hx-focus-ring-width] - Width.\n * @cssprop [--hx-focus-ring-color] - Color.\n * @cssprop [--hx-color-primary-400] - Color.\n * @cssprop [--hx-focus-ring-offset] - CSS custom property.\n * @cssprop [--hx-color-primary-500] - Color.\n * @cssprop [--hx-color-neutral-0] - Color.\n * @cssprop [--hx-shadow-sm] - Box shadow.\n * @cssprop [--hx-switch-track-width-sm=var(--hx-size-8)] - Width.\n * @cssprop [--hx-size-8] - Size token.\n * @cssprop [--hx-switch-track-height-sm=var(--hx-size-4-5)] - Height.\n * @cssprop [--hx-size-4-5] - Size token.\n * @cssprop [--hx-switch-thumb-size-sm=var(--hx-size-3-5)] - CSS custom property.\n * @cssprop [--hx-size-3-5] - Size token.\n * @cssprop [--hx-switch-thumb-offset=var(--hx-space-0-5)] - CSS custom property.\n * @cssprop [--hx-space-0-5] - Spacing token.\n * @cssprop [--hx-switch-track-width-md=var(--hx-size-10)] - Width.\n * @cssprop [--hx-size-10] - Size token.\n * @cssprop [--hx-switch-track-height-md=var(--hx-size-5-5)] - Height.\n * @cssprop [--hx-size-5-5] - Size token.\n * @cssprop [--hx-switch-thumb-size-md=var(--hx-size-4-5)] - CSS custom property.\n * @cssprop [--hx-switch-track-width-lg=var(--hx-size-12)] - Width.\n * @cssprop [--hx-size-12] - Size token.\n * @cssprop [--hx-switch-track-height-lg=var(--hx-size-6-5)] - Height.\n * @cssprop [--hx-size-6-5] - Size token.\n * @cssprop [--hx-switch-thumb-size-lg=var(--hx-size-5-5)] - CSS custom property.\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-error-text] - Color.\n * @cssprop [--hx-font-weight-bold] - Font weight.\n * @cssprop [--hx-font-size-xs] - Font size.\n * @cssprop [--hx-color-neutral-500] - Color.\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-switch/AAA-AUDIT.md\n * @keyboard-contract activate=Space; disabled-suppresses=true\n * @aria-pattern switch\n * @aria-pattern-source https://www.w3.org/WAI/ARIA/apg/patterns/switch/\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-switch\n * @priority-tier P0\n * @phi-handles false\n * @clinical-context none\n */\n@customElement('hx-switch')\nexport class HelixSwitch extends FormMixin(HelixElement) {\n static override styles = [helixSwitchStyles, forcedColorsField];\n\n // ─── Form Association ───\n\n /** @internal */\n static override formAssociated = true;\n\n // ─── Properties ───\n\n /**\n * Whether the switch is toggled on.\n * @attr checked\n */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * Whether the switch is disabled.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the switch is required for form submission.\n * @attr required\n */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /**\n * The name of the switch, used for form submission.\n * @attr name\n */\n @property({ type: String, reflect: true })\n name = '';\n\n /**\n * The value submitted when the switch is checked.\n * @attr value\n */\n @property({ type: String, reflect: true })\n value = 'on';\n\n /**\n * The visible label text for the switch.\n * @attr label\n */\n @property({ type: String })\n label = '';\n\n /**\n * Size variant of the switch.\n * @attr hx-size\n */\n @property({ type: String, reflect: true, attribute: 'hx-size' })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Error message to display. When set, the switch enters an error state.\n * @attr error\n */\n @property({ type: String })\n error = '';\n\n /**\n * Help text displayed below the switch for guidance.\n * @attr help-text\n */\n @property({ type: String, attribute: 'help-text' })\n helpText = '';\n\n /**\n * Validation message shown when the field is required but empty.\n * @attr required-message\n */\n @property({ attribute: 'required-message' })\n requiredMessage = 'This field is required.';\n\n /**\n * Handle for the shared IDREF observer. Installed in `connectedCallback()`\n * so late-mutated `aria-labelledby`/`aria-describedby` and late-inserted\n * IDREF targets are picked up. See `installAriaIdrefMirror()`.\n * @internal\n */\n private _ariaMirror: AriaIdrefMirrorHandle | null = null;\n\n /**\n * No-IDL-ref fallback tokens applied to the inner button so consumer\n * labelling resolves through the shadow root. Tracked as reactive state\n * so values flow through the next `render()`.\n * @internal\n */\n @state() private _fallbackAriaLabelledBy: string | null = null;\n /** @internal */\n @state() private _fallbackAriaDescribedBy: string | null = null;\n /** @internal */\n @state() private _fallbackAriaLabel: string | null = null;\n\n /**\n * Whether the platform supports IDL element references on `ElementInternals`.\n * Drives the render-time branch between the modern path (host is the\n * announced surface, inner button is `aria-hidden + tabindex=-1`) and the\n * fallback path (inner button is the announced surface, host is demoted).\n * Codex round-2 finding #2.\n * @internal\n */\n @state() private _supportsIdrefRefs = true;\n\n /**\n * Tracks whether the host's `tabindex` is managed by the component itself\n * (vs. set explicitly by a consumer). Codex round-14 P2: a consumer-supplied\n * `tabindex` (e.g. roving-tabindex toolbar pattern with `tabindex=\"-1\"`)\n * must survive disabled flips and re-renders. Only re-assert tabindex in\n * `updated()` when the component originally claimed it.\n * @internal\n */\n private _internalTabindexManaged = false;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Detect platform support for IDL element references. Codex round-2\n // finding #2: drives the render-time branch.\n this._supportsIdrefRefs = supportsIdrefElementReferences(this._internals);\n // Seed root-independent semantics so the host announces the switch role\n // immediately on connect — before the first paint.\n this._syncHostAriaSemantics();\n // Codex round-1 finding #1: host is the canonical announced surface on\n // modern browsers, so the inner `<button role=switch>` is demoted via\n // `aria-hidden + tabindex=-1`.\n // Codex round-2 finding #2: on no-IDL-ref browsers the inner button is\n // the announced surface (it carries native button semantics + ARIA\n // role/state), so the host is demoted to `tabindex=-1`.\n // Codex round-14 P2: only claim ownership of `tabindex` when no consumer\n // value is present. Consumers using roving-tabindex toolbar patterns\n // must be able to set `tabindex=\"-1\"` on the host without it being\n // clobbered on every disabled flip. Note we still claim ownership when\n // disabled — the initial value is `-1` to keep the host out of tab order\n // and `updated()` re-asserts the appropriate value when disabled flips.\n if (!this.hasAttribute('tabindex')) {\n this._internalTabindexManaged = true;\n const enabledTabIndex = this._supportsIdrefRefs ? '0' : '-1';\n this.setAttribute('tabindex', this.disabled ? '-1' : enabledTabIndex);\n }\n this.addEventListener('keydown', this._handleHostKeyDown);\n this.addEventListener('click', this._handleHostClick);\n this._ariaMirror = installAriaIdrefMirror(this, () => {\n this._syncHostAriaSemantics();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleHostKeyDown);\n this.removeEventListener('click', this._handleHostClick);\n this._ariaMirror?.disconnect();\n this._ariaMirror = null;\n }\n\n /**\n * Host-level keydown handler. Active only on the modern path; on the\n * no-IDL-ref fallback the inner `<button>` owns native activation.\n * Codex round-2 finding #2.\n * @internal\n */\n private _handleHostKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n if (!this._supportsIdrefRefs) return;\n if (e.target !== this) return;\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n this._toggle();\n }\n };\n\n /**\n * Host-level click handler. Active only on the modern path; on the\n * fallback path AT activation flows directly to the inner button.\n * Codex round-2 finding #2.\n * @internal\n */\n private _handleHostClick = (e: MouseEvent): void => {\n if (this.disabled) return;\n if (!this._supportsIdrefRefs) return;\n const path = e.composedPath();\n if (path[0] !== this) return;\n this._toggle();\n };\n\n override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (changedProperties.has('checked') || changedProperties.has('value')) {\n this._internals.setFormValue(this.checked ? this.value : null);\n }\n if (\n changedProperties.has('disabled') ||\n (changedProperties as Map<PropertyKey, unknown>).has('_supportsIdrefRefs')\n ) {\n // Codex round-2 finding #2: keep host tabindex aligned with the chosen\n // announced surface. On no-IDL-ref browsers the inner button owns tab\n // order, so re-enabling the host should leave it `tabindex=-1`.\n // Codex round-14 P2: only re-assert when the component owns tabindex.\n // Consumer-managed values (e.g. roving-tabindex toolbar with `-1`) must\n // not be overwritten on disabled flips or supports-flag transitions.\n if (this._internalTabindexManaged) {\n const enabledTabIndex = this._supportsIdrefRefs ? '0' : '-1';\n this.setAttribute('tabindex', this.disabled ? '-1' : enabledTabIndex);\n }\n }\n // Re-resolve element references against the (possibly mutated) shadow\n // tree. `_syncHostAriaSemantics()` is also invoked from `_updateValidity()`\n // and by the IDREF mirror observer.\n this._syncHostAriaSemantics();\n }\n\n /**\n * Mirrors switch semantics onto the host via ElementInternals so that\n * consumer-supplied `aria-label`, `aria-labelledby`, and `aria-describedby`\n * on `<hx-switch>` reach the announced control. The codex aria-group-2\n * finding identified that the inner shadow `<button role=switch>` was the\n * only carrier of switch semantics, leaving host-level IDREF tokens stranded\n * on the wrong side of the shadow boundary.\n * @internal\n */\n private _syncHostAriaSemantics(): void {\n const internals = this._internals;\n const hostAriaLabel = this.getAttribute('aria-label')?.trim() || '';\n const externalLabelTokens = this.getAttribute('aria-labelledby');\n const externalDescTokens = this.getAttribute('aria-describedby');\n const labelEls = resolveIdrefTokens(this, externalLabelTokens);\n // Codex round-35 finding (CR major + codex follow-up): `aria-labelledby`\n // is only \"effective\" when at least one IDREF resolves to an element. A\n // typo or transiently-missing target must NOT erase the visible label —\n // fall back to `label` / slot so a labeled switch never becomes unnamed\n // on either render path.\n const hasEffectiveLabelledBy = labelEls.length > 0;\n\n // Codex round-2 finding #2: branch on platform support. Modern path —\n // host is the announced surface and carries `role=switch` + state via\n // ElementInternals. Fallback path — inner `<button role=switch>` is the\n // announced surface; clear host role/state so AT does not double-announce.\n if (this._supportsIdrefRefs) {\n // ─── Modern path ───\n internals.role = 'switch';\n internals.ariaChecked = this.checked ? 'true' : 'false';\n internals.ariaRequired = this.required ? 'true' : 'false';\n internals.ariaInvalid = !internals.validity.valid ? 'true' : 'false';\n internals.ariaDisabled = this.disabled ? 'true' : 'false';\n\n if (hostAriaLabel) {\n internals.ariaLabel = hostAriaLabel;\n } else if (!hasEffectiveLabelledBy) {\n internals.ariaLabel = this.label || null;\n } else {\n internals.ariaLabel = null;\n }\n\n type InternalsWithRefs = ElementInternals & {\n ariaLabelledByElements: Element[] | null;\n ariaDescribedByElements: Element[] | null;\n };\n const refsInternals = internals as InternalsWithRefs;\n\n const internalLabel = this.shadowRoot?.getElementById(this._labelId);\n const hasLabel = !!this.label || this._hasDefaultSlot;\n if (labelEls.length === 0 && !hostAriaLabel && hasLabel && internalLabel) {\n labelEls.push(internalLabel);\n }\n refsInternals.ariaLabelledByElements = labelEls.length > 0 ? labelEls : null;\n\n const descEls = resolveIdrefTokens(this, externalDescTokens);\n const helpEl = this.shadowRoot?.getElementById(this._helpTextId);\n const errorEl = this.shadowRoot?.getElementById(this._errorId);\n const hasError = !!(this.error || this._hasErrorSlot);\n // Codex round-15 P2: drop help text from the describedby chain while\n // an error is active. The render path hides the help wrapper in that\n // state (`?hidden=${... || hasError}`); appending the hidden node here\n // would have AT announce stale guidance ahead of the validation error.\n if (helpEl && !hasError && (this.helpText || this._hasHelpTextSlot)) {\n descEls.push(helpEl);\n }\n if (errorEl && hasError) {\n descEls.push(errorEl);\n }\n refsInternals.ariaDescribedByElements = descEls.length > 0 ? descEls : null;\n // Clear fallback state when IDL refs are available.\n this._fallbackAriaLabelledBy = null;\n this._fallbackAriaDescribedBy = null;\n this._fallbackAriaLabel = null;\n } else {\n // ─── Fallback path: inner button is the announced surface ───\n // Round-2 finding #2: round-1 set host role/state via internals AND\n // mirrored aria-* onto the `aria-hidden` inner button — making the\n // mirrored attributes inert. The fix is to clear host role/state on\n // internals so AT does not double-announce, and let the inner button\n // (rendered without aria-hidden, with `tabindex=0`, with role=switch\n // and aria-checked) be the announced surface.\n internals.role = null;\n internals.ariaChecked = null;\n internals.ariaRequired = null;\n internals.ariaInvalid = null;\n internals.ariaDisabled = null;\n internals.ariaLabel = null;\n\n // Round-35 codex follow-up: only mirror the consumer's labelledby tokens\n // when at least one resolves; otherwise the inner button must fall back\n // to `aria-label` (label property or slot) so the switch keeps a name\n // when an IDREF is a typo. Same contract as the modern path.\n this._fallbackAriaLabelledBy = hasEffectiveLabelledBy ? externalLabelTokens : null;\n this._fallbackAriaDescribedBy = externalDescTokens || null;\n this._fallbackAriaLabel = hasEffectiveLabelledBy ? null : hostAriaLabel || this.label || null;\n }\n }\n\n // ─── Form Integration ───\n\n /** Recalculates and sets the validity state based on required and checked. */\n /** @internal */\n override _updateValidity(): void {\n if (this.required && !this.checked) {\n // Codex round-17 P2: anchor validity UI to the announced surface. On\n // the modern path the host carries `role=switch` via internals and is\n // the canonical focus target (the inner track button is `aria-hidden +\n // tabindex=-1`), so reportValidity() would otherwise focus a hidden\n // node. On the fallback path the inner button is the announced\n // surface.\n const anchor: HTMLElement | undefined = this._supportsIdrefRefs\n ? this\n : (this._trackEl ?? undefined);\n this._internals.setValidity(\n { valueMissing: true },\n this.error || this.requiredMessage,\n anchor,\n );\n } else {\n this._internals.setValidity({});\n }\n // Codex round-1 finding #6: sync host ARIA semantics immediately after\n // every `setValidity()` call so `internals.ariaInvalid` reflects the\n // current `ValidityState` rather than the previous render snapshot.\n this._syncHostAriaSemantics();\n }\n\n protected override _onFormReset(): void {\n this.checked = false;\n this._internals.setFormValue(null);\n this._resetInteractionState();\n }\n\n protected override _onFormStateRestore(\n state: File | string | FormData | null,\n _mode: 'restore' | 'autocomplete',\n ): void {\n if (typeof state === 'string') {\n this.checked = state === this.value;\n }\n }\n\n protected override _onFormDisabled(disabled: boolean): void {\n this.disabled = disabled;\n }\n\n /** Reference to the native button element acting as the switch track. * @internal\n */\n @query('.switch__track')\n private _trackEl: HTMLButtonElement | null | undefined;\n\n /** Whether the error slot has assigned content. */\n /** @internal */\n @state() private _hasErrorSlot = false;\n\n /** Whether the default slot has assigned content (slotted label). */\n /** @internal */\n @state() private _hasDefaultSlot = false;\n\n /** Whether the help-text slot has assigned content. */\n /** @internal */\n @state() private _hasHelpTextSlot = false;\n\n // ─── Slot Handlers ───\n\n /** Updates _hasErrorSlot when error slot content changes. */\n /** @internal */\n private _handleErrorSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasErrorSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** Updates _hasDefaultSlot when default slot content changes. */\n /** @internal */\n private _handleDefaultSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasDefaultSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n /** Updates _hasHelpTextSlot when help-text slot content changes. */\n /** @internal */\n private _handleHelpTextSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasHelpTextSlot = slot.assignedNodes({ flatten: true }).length > 0;\n }\n\n // ─── Event Handling ───\n\n /** Toggles checked state and dispatches hx-change event. */\n /** @internal */\n private _toggle(): void {\n if (this.disabled) return;\n this.checked = !this.checked;\n this._handleInteractionInput();\n\n this.dispatchEvent(\n new CustomEvent<{ checked: boolean; value: string }>('hx-change', {\n bubbles: true,\n composed: true,\n detail: { checked: this.checked, value: this.value },\n }),\n );\n }\n\n /** Handles click events on the track. */\n /** @internal */\n private _handleClick(): void {\n this._toggle();\n // Codex round-12 P2: on the modern path the host owns role=\"switch\" and\n // tabindex=0; the inner <button tabindex=\"-1\"> is aria-hidden. Native\n // click activation on a `<button>` still focuses it, which would leave\n // `document.activeElement` and AT focus on a hidden node. Move focus back\n // to the host so the announced surface is also the focus target.\n if (this._supportsIdrefRefs) {\n this.focus();\n }\n }\n\n /** Handles keydown events — Space toggles the switch per ARIA APG. */\n /** @internal */\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n }\n\n // ─── Public Methods ───\n\n /**\n * Moves focus to the announced switch surface. Codex round-1 finding #1\n * relocated the focus target to the host so AT announces a single widget;\n * the host carries the canonical role/state on modern engines. Round-7\n * finding #7 extends that contract to the no-IDL-ref fallback: when the\n * host is demoted (`tabindex=-1`, role/state cleared on `internals`) the\n * inner `<button role=switch>` owns the announced semantics and tab order,\n * so programmatic `focus()` must redirect there — otherwise scripted focus\n * and error recovery land on the demoted host on unsupported engines.\n */\n override focus(options?: FocusOptions): void {\n if (this._supportsIdrefRefs) {\n super.focus(options);\n return;\n }\n this._trackEl?.focus(options);\n }\n\n // ─── Render ───\n\n /** Unique ID for this switch instance, used for ARIA associations. */\n /** @internal */\n private _switchId = _nextSwitchId();\n /** ID for the label element, referenced by aria-labelledby. */\n /** @internal */\n private _labelId = `${this._switchId}-label`;\n /** ID for the help text element, referenced by aria-describedby. */\n /** @internal */\n private _helpTextId = `${this._switchId}-help`;\n /** ID for the error element, referenced by aria-describedby. */\n /** @internal */\n private _errorId = `${this._switchId}-error`;\n\n override render() {\n const hasError = !!this.error || this._hasErrorSlot;\n const hasHelpText = !!this.helpText || this._hasHelpTextSlot;\n const hasLabel = !!this.label || this._hasDefaultSlot;\n // Validity-driven invalid state: a required-but-unchecked switch is\n // invalid via setValidity() even before any visible error renders.\n const isInvalid = hasError || (this.required && !this.checked);\n\n const containerClasses = {\n switch: true,\n 'switch--checked': this.checked,\n 'switch--disabled': this.disabled,\n 'switch--required': this.required,\n 'switch--error': hasError,\n [`switch--${this.size}`]: true,\n };\n\n // help-text first, error appended — assistive tech announces guidance\n // before validation feedback. Both ids are persistent in the shadow tree.\n // Codex round-15 P2: drop help text from the chain when an error is\n // active. The help wrapper renders hidden in that state, so referencing\n // it would have AT announce stale guidance ahead of the validation\n // error. Mirrors the modern-path host-internals chain.\n const describedBy =\n [!hasError && hasHelpText ? this._helpTextId : null, hasError ? this._errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n // Codex round-1 finding #8: merge consumer fallback tokens with the\n // shadow-internal describedBy chain on browsers without IDL element\n // references. Internal `_labelId` is preferred when no consumer\n // labelledby tokens are supplied.\n const innerDescribedBy =\n [describedBy ?? null, this._fallbackAriaDescribedBy].filter(Boolean).join(' ') || undefined;\n // Codex round-14 P2: per ARIA spec, `aria-labelledby` overrides\n // `aria-label`. On the no-IDL-ref fallback path the consumer-set\n // `aria-label` was being shadowed because we always assigned the\n // internal `_labelId`. When the consumer supplied an `aria-label` (and\n // did NOT supply an `aria-labelledby`), omit the internal labelledby so\n // AT announces the consumer-supplied name — matching the modern path\n // and the spec. Consumer-supplied `aria-labelledby` (mirrored into\n // `_fallbackAriaLabelledBy`) still wins over the internal label.\n const innerAriaLabel = this._fallbackAriaLabel ?? undefined;\n const innerLabelledBy = this._fallbackAriaLabelledBy\n ? this._fallbackAriaLabelledBy\n : innerAriaLabel\n ? undefined\n : hasLabel\n ? this._labelId\n : undefined;\n\n // Codex round-2 finding #2: branch the inner button on platform support.\n // Modern path — host is announced, inner button is `aria-hidden + tabindex=-1`.\n // Fallback path — inner button is announced (NO aria-hidden, role=switch,\n // tabindex=0) so consumer-mirrored aria-* attributes resolve through a\n // visible accessibility-tree node and AT can name + activate it natively.\n const innerIsAnnounced = !this._supportsIdrefRefs;\n const innerTabIndex = innerIsAnnounced && !this.disabled ? '0' : '-1';\n // On the fallback path the inner button must carry role=switch so AT\n // announces \"switch\", aria-checked for state, and aria-required when set.\n const innerRole = innerIsAnnounced ? 'switch' : nothing;\n\n return html`\n <div part=\"switch\" class=${classMap(containerClasses)}>\n <div class=\"switch__control-row\">\n <button\n part=\"track\"\n class=\"switch__track\"\n id=${this._switchId}\n type=\"button\"\n role=${innerRole}\n tabindex=${innerTabIndex}\n aria-checked=${this.checked ? 'true' : 'false'}\n aria-labelledby=${ifDefined(innerLabelledBy)}\n aria-describedby=${ifDefined(innerDescribedBy)}\n aria-label=${ifDefined(innerAriaLabel)}\n aria-invalid=${isInvalid ? 'true' : nothing}\n aria-required=${this.required ? 'true' : nothing}\n aria-hidden=${innerIsAnnounced ? nothing : 'true'}\n ?disabled=${this.disabled}\n @click=${this._handleClick}\n @keydown=${this._handleKeyDown}\n >\n <span part=\"thumb\" class=\"switch__thumb\"></span>\n </button>\n\n <label part=\"label\" class=\"switch__label\" id=${this._labelId} for=${this._switchId}>\n <slot @slotchange=${this._handleDefaultSlotChange}>${this.label}</slot>${this.required\n ? html`<span class=\"switch__required-marker\" aria-hidden=\"true\">*</span>`\n : nothing}\n </label>\n </div>\n\n <!--\n Persistent error live region. Slot fallback content provides the\n property-driven message; consumers can replace it via slot=\"error\".\n The wrapper carries a stable id so aria-describedby remains valid\n across both code paths and across show/hide transitions.\n -->\n <div\n part=\"error\"\n class=\"switch__error\"\n id=${this._errorId}\n role=\"alert\"\n ?hidden=${!hasError}\n >\n <slot name=\"error\" @slotchange=${this._handleErrorSlotChange}>${this.error}</slot>\n </div>\n\n <!--\n Persistent help-text wrapper. Rendered whenever the property OR the\n slot has content; hidden when an error is present so guidance does\n not compete with validation feedback.\n -->\n <div\n part=\"help-text\"\n class=\"switch__help-text\"\n id=${this._helpTextId}\n ?hidden=${!hasHelpText || hasError}\n >\n <slot name=\"help-text\" @slotchange=${this._handleHelpTextSlotChange}\n >${this.helpText}</slot\n >\n </div>\n </div>\n `;\n }\n}\n\n/**\n * Per-component event map for type-safe addEventListener on hx-switch.\n * The `hx-change` detail always includes both `checked` and `value` for this component.\n */\nexport interface HxSwitchEventMap {\n 'hx-change': CustomEvent<{ checked: boolean; value: string }>;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-switch': HelixSwitch;\n }\n}\n\nexport type HxSwitch = HelixSwitch;\n"],"names":["helixSwitchStyles","css","_nextSwitchId","createIdCounter","HelixSwitch","FormMixin","HelixElement","supportsIdrefElementReferences","enabledTabIndex","installAriaIdrefMirror","_a","changedProperties","internals","hostAriaLabel","externalLabelTokens","externalDescTokens","labelEls","resolveIdrefTokens","hasEffectiveLabelledBy","refsInternals","internalLabel","_b","hasLabel","descEls","helpEl","_c","errorEl","_d","hasError","anchor","state","_mode","disabled","slot","options","hasHelpText","isInvalid","containerClasses","innerDescribedBy","innerAriaLabel","innerLabelledBy","innerIsAnnounced","innerTabIndex","innerRole","nothing","html","classMap","ifDefined","forcedColorsField","__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;AAA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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { css as g, html as
|
|
1
|
+
import { css as g, html as _, nothing as C } from "lit";
|
|
2
2
|
import { property as b, state as u, customElement as y } from "lit/decorators.js";
|
|
3
3
|
import { f as E, b as H } from "./forced-colors-CTEDFRGa.js";
|
|
4
4
|
import { d as P } from "./dev-warn-YlwPHjtX.js";
|
|
5
5
|
import { s as S, i as T, r as m } from "./aria-idref-DCuEaknC.js";
|
|
6
6
|
import { f as I } from "./aria-flatten-DY6v2vah.js";
|
|
7
|
-
import { H as
|
|
7
|
+
import { H as w } from "./helix-element-BNEYeiys.js";
|
|
8
8
|
import { c as $ } from "./id-counter-DuX8vsui.js";
|
|
9
|
-
const
|
|
9
|
+
const k = g`
|
|
10
10
|
:host {
|
|
11
11
|
display: block;
|
|
12
12
|
font-family: var(--hx-tabs-font-family, var(--hx-font-family-sans, sans-serif));
|
|
@@ -95,15 +95,15 @@ const R = g`
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
`;
|
|
98
|
-
var
|
|
98
|
+
var R = Object.defineProperty, O = Object.getOwnPropertyDescriptor, p = (t, e, s, i) => {
|
|
99
99
|
for (var a = i > 1 ? void 0 : i ? O(e, s) : e, o = t.length - 1, r; o >= 0; o--)
|
|
100
100
|
(r = t[o]) && (a = (i ? r(e, s, a) : r(a)) || a);
|
|
101
|
-
return i && a &&
|
|
101
|
+
return i && a && R(e, s, a), a;
|
|
102
102
|
};
|
|
103
|
-
const
|
|
104
|
-
let d = class extends
|
|
103
|
+
const B = $("hx-tabs");
|
|
104
|
+
let d = class extends w {
|
|
105
105
|
constructor() {
|
|
106
|
-
super(...arguments), this._id =
|
|
106
|
+
super(...arguments), this._id = B(), this.orientation = "horizontal", this.activation = "manual", this.label = "", this._activePanel = "", this._supportsIdrefRefs = !0, this._ariaMirror = null, this._cachedTabs = null, this._cachedPanels = null, this._observer = null, this._pendingIndex = null, this._handleTabSelect = (t) => {
|
|
107
107
|
if (!(t instanceof CustomEvent)) return;
|
|
108
108
|
t.stopPropagation();
|
|
109
109
|
const e = t.composedPath().find((s) => s instanceof Element && s.tagName.toLowerCase() === "hx-tab");
|
|
@@ -120,7 +120,7 @@ let d = class extends A {
|
|
|
120
120
|
const s = this.orientation === "horizontal", i = s ? "ArrowLeft" : "ArrowUp", a = s ? "ArrowRight" : "ArrowDown";
|
|
121
121
|
if (![i, a, "Home", "End", " ", "Enter"].includes(t.key))
|
|
122
122
|
return;
|
|
123
|
-
const r = e.find((
|
|
123
|
+
const r = e.find((v) => v === document.activeElement);
|
|
124
124
|
if (t.key === " " || t.key === "Enter") {
|
|
125
125
|
r && !r.disabled && (t.preventDefault(), this._activateTab(r), r.focus());
|
|
126
126
|
return;
|
|
@@ -128,8 +128,8 @@ let d = class extends A {
|
|
|
128
128
|
t.preventDefault();
|
|
129
129
|
let n = r ? e.indexOf(r) : -1;
|
|
130
130
|
if (n === -1) {
|
|
131
|
-
const
|
|
132
|
-
n =
|
|
131
|
+
const v = e.find((L) => L.panel === this._activePanel);
|
|
132
|
+
n = v ? e.indexOf(v) : 0;
|
|
133
133
|
}
|
|
134
134
|
let h;
|
|
135
135
|
t.key === "Home" ? h = 0 : t.key === "End" ? h = e.length - 1 : t.key === a ? h = (n + 1) % e.length : h = n <= 0 ? e.length - 1 : n - 1;
|
|
@@ -301,7 +301,7 @@ let d = class extends A {
|
|
|
301
301
|
}
|
|
302
302
|
// ─── Render ───
|
|
303
303
|
render() {
|
|
304
|
-
return
|
|
304
|
+
return _`
|
|
305
305
|
<div class="tabs">
|
|
306
306
|
<div part="tablist" class="tablist">
|
|
307
307
|
<slot name="tab" @slotchange=${this._handleSlotChange}></slot>
|
|
@@ -313,7 +313,7 @@ let d = class extends A {
|
|
|
313
313
|
`;
|
|
314
314
|
}
|
|
315
315
|
};
|
|
316
|
-
d.styles = [
|
|
316
|
+
d.styles = [k, E];
|
|
317
317
|
p([
|
|
318
318
|
b({ type: String, reflect: !0 })
|
|
319
319
|
], d.prototype, "orientation", 2);
|
|
@@ -332,7 +332,7 @@ p([
|
|
|
332
332
|
d = p([
|
|
333
333
|
y("hx-tabs")
|
|
334
334
|
], d);
|
|
335
|
-
const
|
|
335
|
+
const M = g`
|
|
336
336
|
:host {
|
|
337
337
|
display: inline-block;
|
|
338
338
|
}
|
|
@@ -387,7 +387,7 @@ const N = g`
|
|
|
387
387
|
/* ─── Selected State ─── */
|
|
388
388
|
|
|
389
389
|
:host([selected]) .tab {
|
|
390
|
-
color: var(--hx-tabs-tab-active-color, var(--hx-color-
|
|
390
|
+
color: var(--hx-tabs-tab-active-color, var(--hx-color-text-link, #0f6363));
|
|
391
391
|
border-bottom-color: var(
|
|
392
392
|
--_tab-indicator-bottom-color,
|
|
393
393
|
var(--hx-tabs-indicator-color, var(--hx-color-primary-500, #429797))
|
|
@@ -398,7 +398,21 @@ const N = g`
|
|
|
398
398
|
|
|
399
399
|
/* ─── Focus State ───
|
|
400
400
|
Focus lands on the HOST in Group 5a host-canonical mode. The inner
|
|
401
|
-
[part="tab"] is presentational (tabindex=-1).
|
|
401
|
+
[part="tab"] is presentational (tabindex=-1). Paint the ring on BOTH
|
|
402
|
+
the host and the inner [part="tab"] so:
|
|
403
|
+
(1) the visible affordance lives on the styled tab surface
|
|
404
|
+
(2) the host carries a measurable computed outline-width — required
|
|
405
|
+
by AAA 2.4.13 verification harnesses that read getComputedStyle
|
|
406
|
+
on the focused element itself (not its shadow descendants in
|
|
407
|
+
the slotted-host scenario where the parent <hx-tabs> walker
|
|
408
|
+
cannot reach into the slotted child's shadow root). */
|
|
409
|
+
|
|
410
|
+
:host(:focus-visible) {
|
|
411
|
+
outline: var(--hx-focus-ring-width, 2px) solid
|
|
412
|
+
var(--hx-tabs-focus-ring-color, var(--hx-focus-ring-color, #0f7078));
|
|
413
|
+
outline-offset: var(--hx-focus-ring-offset, 2px);
|
|
414
|
+
border-radius: var(--hx-border-radius-sm, 0.25rem);
|
|
415
|
+
}
|
|
402
416
|
|
|
403
417
|
:host(:focus-visible) .tab {
|
|
404
418
|
outline: var(--hx-focus-ring-width, 2px) solid
|
|
@@ -407,9 +421,9 @@ const N = g`
|
|
|
407
421
|
border-radius: var(--hx-border-radius-sm, 0.25rem);
|
|
408
422
|
}
|
|
409
423
|
|
|
410
|
-
/* Strip the default
|
|
411
|
-
|
|
412
|
-
:host(:focus) {
|
|
424
|
+
/* Strip the default :focus state — :focus-visible above provides the
|
|
425
|
+
ring for keyboard interaction. */
|
|
426
|
+
:host(:focus:not(:focus-visible)) {
|
|
413
427
|
outline: none;
|
|
414
428
|
}
|
|
415
429
|
|
|
@@ -457,6 +471,7 @@ const N = g`
|
|
|
457
471
|
border-bottom-color: Highlight;
|
|
458
472
|
}
|
|
459
473
|
|
|
474
|
+
:host(:focus-visible),
|
|
460
475
|
:host(:focus-visible) .tab {
|
|
461
476
|
outline: 3px solid Highlight;
|
|
462
477
|
outline-offset: 2px;
|
|
@@ -467,12 +482,12 @@ const N = g`
|
|
|
467
482
|
}
|
|
468
483
|
}
|
|
469
484
|
`;
|
|
470
|
-
var
|
|
485
|
+
var N = Object.defineProperty, D = Object.getOwnPropertyDescriptor, f = (t, e, s, i) => {
|
|
471
486
|
for (var a = i > 1 ? void 0 : i ? D(e, s) : e, o = t.length - 1, r; o >= 0; o--)
|
|
472
487
|
(r = t[o]) && (a = (i ? r(e, s, a) : r(a)) || a);
|
|
473
|
-
return i && a &&
|
|
488
|
+
return i && a && N(e, s, a), a;
|
|
474
489
|
};
|
|
475
|
-
let c = class extends
|
|
490
|
+
let c = class extends w {
|
|
476
491
|
constructor() {
|
|
477
492
|
super(...arguments), this.panel = "", this.selected = !1, this.disabled = !1, this.controls = "", this._supportsIdrefRefs = !0, this._ariaMirror = null, this._controlledPanel = null, this._hasPrefixSlot = !1, this._hasSuffixSlot = !1;
|
|
478
493
|
}
|
|
@@ -542,7 +557,7 @@ let c = class extends A {
|
|
|
542
557
|
}
|
|
543
558
|
// ─── Render ───
|
|
544
559
|
render() {
|
|
545
|
-
return !this._supportsIdrefRefs && this.controls ? this.setAttribute("aria-controls", this.controls) : this._supportsIdrefRefs && this.hasAttribute("aria-controls") && this.removeAttribute("aria-controls"), this._supportsIdrefRefs ?
|
|
560
|
+
return !this._supportsIdrefRefs && this.controls ? this.setAttribute("aria-controls", this.controls) : this._supportsIdrefRefs && this.hasAttribute("aria-controls") && this.removeAttribute("aria-controls"), this._supportsIdrefRefs ? _`
|
|
546
561
|
<div
|
|
547
562
|
part="tab"
|
|
548
563
|
class="tab"
|
|
@@ -558,7 +573,7 @@ let c = class extends A {
|
|
|
558
573
|
<slot name="suffix" @slotchange=${this._handleSuffixSlotChange}></slot>
|
|
559
574
|
</span>
|
|
560
575
|
</div>
|
|
561
|
-
` :
|
|
576
|
+
` : _`
|
|
562
577
|
<button
|
|
563
578
|
part="tab"
|
|
564
579
|
class="tab"
|
|
@@ -580,7 +595,7 @@ let c = class extends A {
|
|
|
580
595
|
`;
|
|
581
596
|
}
|
|
582
597
|
};
|
|
583
|
-
c.styles = [
|
|
598
|
+
c.styles = [M, E];
|
|
584
599
|
f([
|
|
585
600
|
b({ type: String, reflect: !0 })
|
|
586
601
|
], c.prototype, "panel", 2);
|
|
@@ -647,12 +662,12 @@ const z = g`
|
|
|
647
662
|
}
|
|
648
663
|
}
|
|
649
664
|
`;
|
|
650
|
-
var j = Object.defineProperty, F = Object.getOwnPropertyDescriptor,
|
|
665
|
+
var j = Object.defineProperty, F = Object.getOwnPropertyDescriptor, A = (t, e, s, i) => {
|
|
651
666
|
for (var a = i > 1 ? void 0 : i ? F(e, s) : e, o = t.length - 1, r; o >= 0; o--)
|
|
652
667
|
(r = t[o]) && (a = (i ? r(e, s, a) : r(a)) || a);
|
|
653
668
|
return i && a && j(e, s, a), a;
|
|
654
669
|
};
|
|
655
|
-
let x = class extends
|
|
670
|
+
let x = class extends w {
|
|
656
671
|
constructor() {
|
|
657
672
|
super(...arguments), this.name = "", this._labelledByTabs = [], this._supportsIdrefRefs = !0, this._ariaMirror = null;
|
|
658
673
|
}
|
|
@@ -692,7 +707,7 @@ let x = class extends A {
|
|
|
692
707
|
}
|
|
693
708
|
// ─── Render ───
|
|
694
709
|
render() {
|
|
695
|
-
return
|
|
710
|
+
return _`
|
|
696
711
|
<div part="panel" class="panel">
|
|
697
712
|
<slot></slot>
|
|
698
713
|
</div>
|
|
@@ -700,13 +715,13 @@ let x = class extends A {
|
|
|
700
715
|
}
|
|
701
716
|
};
|
|
702
717
|
x.styles = [z, H];
|
|
703
|
-
|
|
718
|
+
A([
|
|
704
719
|
b({ type: String, reflect: !0 })
|
|
705
720
|
], x.prototype, "name", 2);
|
|
706
|
-
|
|
721
|
+
A([
|
|
707
722
|
u()
|
|
708
723
|
], x.prototype, "_supportsIdrefRefs", 2);
|
|
709
|
-
x =
|
|
724
|
+
x = A([
|
|
710
725
|
y("hx-tab-panel")
|
|
711
726
|
], x);
|
|
712
727
|
export {
|
|
@@ -714,4 +729,4 @@ export {
|
|
|
714
729
|
x as a,
|
|
715
730
|
d as b
|
|
716
731
|
};
|
|
717
|
-
//# sourceMappingURL=hx-tab-panel-
|
|
732
|
+
//# sourceMappingURL=hx-tab-panel-BfisavKo.js.map
|