@helixui/library 3.2.0-next.102 → 3.2.0-next.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/custom-elements.json +17 -5
  2. package/dist/components/hx-button/hx-button.d.ts +3 -1
  3. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  4. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  5. package/dist/components/hx-button/index.js +1 -1
  6. package/dist/components/hx-side-nav/hx-side-nav.d.ts +1 -0
  7. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  8. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  9. package/dist/components/hx-side-nav/index.js +1 -1
  10. package/dist/components/hx-theme/hx-theme.d.ts +14 -2
  11. package/dist/components/hx-theme/hx-theme.d.ts.map +1 -1
  12. package/dist/components/hx-theme/index.js +1 -1
  13. package/dist/css/helix-all.css +51 -11
  14. package/dist/css/helix-core.css +35 -7
  15. package/dist/css/helix-navigation.css +16 -4
  16. package/dist/css/hx-button.css +35 -7
  17. package/dist/css/hx-side-nav.css +16 -4
  18. package/dist/css/index.css +1 -1
  19. package/dist/css/manifest.json +2 -1
  20. package/dist/index.js +3 -3
  21. package/dist/shared/{hx-button-CHlkRQTe.js → hx-button-DPY6SPVT.js} +47 -19
  22. package/dist/shared/hx-button-DPY6SPVT.js.map +1 -0
  23. package/dist/shared/{hx-nav-item-Dap3DYgB.js → hx-nav-item-xqRPOCWX.js} +47 -35
  24. package/dist/shared/hx-nav-item-xqRPOCWX.js.map +1 -0
  25. package/dist/shared/{hx-theme-BiyQ7UUK.js → hx-theme-BsefFWTO.js} +83 -113
  26. package/dist/shared/hx-theme-BsefFWTO.js.map +1 -0
  27. package/figma-inventory.json +17 -2
  28. package/package.json +2 -2
  29. package/dist/shared/hx-button-CHlkRQTe.js.map +0 -1
  30. package/dist/shared/hx-nav-item-Dap3DYgB.js.map +0 -1
  31. package/dist/shared/hx-theme-BiyQ7UUK.js.map +0 -1
@@ -2826,7 +2826,7 @@
2826
2826
  "name": "HelixButton",
2827
2827
  "cssProperties": [
2828
2828
  {
2829
- "description": "Button background color (3.2.1 cascade variant rules route through action.{primary,secondary,ghost,danger}.bg).",
2829
+ "description": "Button background color. **Variant-shadowed**: every `.button--{variant}` rule rebinds this property at descendant scope, so a host-level override (`style=\"--hx-button-bg: …\"` or `:host`-targeting CSS) does not reach paint for primary/secondary/tertiary/danger/ghost/outline buttons. To recolor a variant fill, override the upstream semantic instead — e.g. `--hx-color-action-primary-bg` (light primary), `--hx-color-action-primary-bg-inverted-rest` (inverted primary), `--hx-color-action-danger-bg` (danger), or the inverted overlay tokens for tertiary/secondary/ghost/outline. The `--hx-button-bg` hook still works for the rare case of an unstyled base button without a `variant` class, and is internally rebound by the variant rules to participate in the active/hover override chain.",
2830
2830
  "name": "--hx-button-bg",
2831
2831
  "default": "var(--hx-color-action-primary-bg)"
2832
2832
  },
@@ -2984,6 +2984,14 @@
2984
2984
  {
2985
2985
  "description": "Inverted-secondary/outline border + inverted focus-visible outline (overlay-white-70 ≈ 5:1 — clears WCAG 1.4.11 3:1 floor).",
2986
2986
  "name": "--hx-color-border-on-dark-strong"
2987
+ },
2988
+ {
2989
+ "description": "DEPRECATED 3.2.2; renamed to --hx-color-surface-on-dark-overlay-subtle (the value paints a translucent fill, not a border). Consume sites read both names via deprecated-first fallback so existing overrides keep working until removal in 4.0.0.",
2990
+ "name": "--hx-color-border-on-dark-subtle"
2991
+ },
2992
+ {
2993
+ "description": "DEPRECATED 3.2.2; renamed to --hx-color-surface-on-dark-overlay-default (the value paints a translucent fill, not a border). Consume sites read both names via deprecated-first fallback so existing overrides keep working until removal in 4.0.0.",
2994
+ "name": "--hx-color-border-on-dark-default"
2987
2995
  }
2988
2996
  ],
2989
2997
  "cssParts": [
@@ -23043,6 +23051,10 @@
23043
23051
  {
23044
23052
  "description": "Toggle button hover surface (overlay-white-10 primitive — translucent fill, not a border).",
23045
23053
  "name": "--hx-color-surface-on-dark-overlay-subtle"
23054
+ },
23055
+ {
23056
+ "description": "DEPRECATED 3.2.2; renamed to --hx-color-surface-on-dark-overlay-subtle (the value paints a translucent fill, not a border). Toggle-hover rule reads both names via deprecated-first fallback so existing overrides keep working until removal in 4.0.0.",
23057
+ "name": "--hx-color-border-on-dark-subtle"
23046
23058
  }
23047
23059
  ],
23048
23060
  "cssParts": [
@@ -31020,7 +31032,7 @@
31020
31032
  "text": "string"
31021
31033
  },
31022
31034
  "default": "''",
31023
- "description": "The registered brand name to apply on top of the base theme.\nWhen set, brand-specific CSS custom property overrides are merged\nafter the base theme tokens in the adopted stylesheet, enabling\nhospital system white-label implementations.\n\nThe brand must first be registered via `HelixBrandRegistry.register()`.\nIf the brand name is non-empty but not registered, a warning is logged\nand the base theme is applied without brand overrides.",
31035
+ "description": "The registered brand name to apply on top of the base theme.\nWhen set, brand-specific CSS custom property overrides are merged\nafter the base theme tokens in the adopted stylesheet, enabling\nhospital system white-label implementations.\n\nThe brand must first be registered via `HelixBrandRegistry.register()`.\nIf the brand name is non-empty but not registered, a warning is logged\nand the base theme is applied without brand overrides.\n\n**High-contrast suppression:** When `theme=\"high-contrast\"`, the brand\nmerge is intentionally skipped to preserve the WCAG 1.4.6 Enhanced\nContrast (7:1+) guarantee that the HC token set is tuned for. A\nregistered brand applied under HC emits a `console.info` to surface\nthe suppression in development. Brand merging on `light` and `dark`\nis unaffected. See `BRAND_THEMING.md`.",
31024
31036
  "attribute": "brand",
31025
31037
  "reflects": true
31026
31038
  },
@@ -31050,9 +31062,9 @@
31050
31062
  "kind": "field",
31051
31063
  "name": "effectiveTheme",
31052
31064
  "type": {
31053
- "text": "'light' | 'dark' | 'high-contrast' | 'auto'"
31065
+ "text": "'light' | 'dark' | 'high-contrast'"
31054
31066
  },
31055
- "description": "Returns the currently active theme name.\nWhen `system=true` or `theme=\"auto\"`, reflects the OS preference (`\"light\"` or `\"dark\"`).\nOtherwise returns the `theme` property value.",
31067
+ "description": "Returns the currently active theme name.\nWhen `theme=\"auto\"`, reflects the OS preference (`\"light\"` or `\"dark\"`).\nOtherwise returns the `theme` property value.",
31056
31068
  "readonly": true
31057
31069
  },
31058
31070
  {
@@ -31082,7 +31094,7 @@
31082
31094
  "text": "string"
31083
31095
  },
31084
31096
  "default": "''",
31085
- "description": "The registered brand name to apply on top of the base theme.\nWhen set, brand-specific CSS custom property overrides are merged\nafter the base theme tokens in the adopted stylesheet, enabling\nhospital system white-label implementations.\n\nThe brand must first be registered via `HelixBrandRegistry.register()`.\nIf the brand name is non-empty but not registered, a warning is logged\nand the base theme is applied without brand overrides.",
31097
+ "description": "The registered brand name to apply on top of the base theme.\nWhen set, brand-specific CSS custom property overrides are merged\nafter the base theme tokens in the adopted stylesheet, enabling\nhospital system white-label implementations.\n\nThe brand must first be registered via `HelixBrandRegistry.register()`.\nIf the brand name is non-empty but not registered, a warning is logged\nand the base theme is applied without brand overrides.\n\n**High-contrast suppression:** When `theme=\"high-contrast\"`, the brand\nmerge is intentionally skipped to preserve the WCAG 1.4.6 Enhanced\nContrast (7:1+) guarantee that the HC token set is tuned for. A\nregistered brand applied under HC emits a `console.info` to surface\nthe suppression in development. Brand merging on `light` and `dark`\nis unaffected. See `BRAND_THEMING.md`.",
31086
31098
  "fieldName": "brand",
31087
31099
  "attribute": "brand"
31088
31100
  },
@@ -27,7 +27,7 @@ declare const HelixButton_base: typeof HelixElement;
27
27
  * @csspart suffix - The suffix slot container span.
28
28
  * @csspart spinner - The loading spinner SVG element.
29
29
  *
30
- * @cssprop [--hx-button-bg=var(--hx-color-action-primary-bg)] - Button background color (3.2.1 cascade variant rules route through action.{primary,secondary,ghost,danger}.bg).
30
+ * @cssprop [--hx-button-bg=var(--hx-color-action-primary-bg)] - Button background color. **Variant-shadowed**: every `.button--{variant}` rule rebinds this property at descendant scope, so a host-level override (`style="--hx-button-bg: …"` or `:host`-targeting CSS) does not reach paint for primary/secondary/tertiary/danger/ghost/outline buttons. To recolor a variant fill, override the upstream semantic instead — e.g. `--hx-color-action-primary-bg` (light primary), `--hx-color-action-primary-bg-inverted-rest` (inverted primary), `--hx-color-action-danger-bg` (danger), or the inverted overlay tokens for tertiary/secondary/ghost/outline. The `--hx-button-bg` hook still works for the rare case of an unstyled base button without a `variant` class, and is internally rebound by the variant rules to participate in the active/hover override chain.
31
31
  * @cssprop [--hx-button-hover-bg] - Hover background override (primary and danger variants only). Other variants (secondary/outline, ghost) keep their hover fills routed through their semantic action.* tokens and do not consume this hook. Under [inverted] for primary/danger, hover and active share a paint (combined :hover, :active rule), so this override applies to both states unless --hx-button-active-bg also takes precedence.
32
32
  * @cssprop [--hx-button-active-bg] - Pressed/active background override (primary and danger variants only, including their inverted modes). Takes precedence over --hx-button-hover-bg in the fallback chain. Standard-mode primary/danger default to action.{primary,danger}.bg-active (with filter:none) for AA-pinned pressed contrast. Inverted-mode primary/danger reuse action.{primary,danger}.bg-inverted-hover (combined :hover, :active rule); setting --hx-button-active-bg under [inverted] therefore overrides the lifted hover fill as well as the pressed fill — the two share a paint in inverted mode. Other variants do not consume this hook.
33
33
  * @cssprop [--hx-button-color=var(--hx-color-text-on-primary)] - Button text color (variants route through text.on-{role} / text.on-{role}-strong).
@@ -66,6 +66,8 @@ declare const HelixButton_base: typeof HelixElement;
66
66
  * @cssprop [--hx-color-surface-on-dark-overlay-subtle] - Inverted-tertiary resting fill (overlay-white-10 — translucent fill, not a border).
67
67
  * @cssprop [--hx-color-surface-on-dark-overlay-default] - Inverted-tertiary hover fill + inverted-secondary/ghost/outline hover fill (overlay-white-30 — translucent fill, not a border).
68
68
  * @cssprop [--hx-color-border-on-dark-strong] - Inverted-secondary/outline border + inverted focus-visible outline (overlay-white-70 ≈ 5:1 — clears WCAG 1.4.11 3:1 floor).
69
+ * @cssprop [--hx-color-border-on-dark-subtle] - DEPRECATED 3.2.2; renamed to --hx-color-surface-on-dark-overlay-subtle (the value paints a translucent fill, not a border). Consume sites read both names via deprecated-first fallback so existing overrides keep working until removal in 4.0.0.
70
+ * @cssprop [--hx-color-border-on-dark-default] - DEPRECATED 3.2.2; renamed to --hx-color-surface-on-dark-overlay-default (the value paints a translucent fill, not a border). Consume sites read both names via deprecated-first fallback so existing overrides keep working until removal in 4.0.0.
69
71
  */
70
72
  export declare class HelixButton extends HelixButton_base {
71
73
  static styles: import('lit').CSSResult[];
@@ -1 +1 @@
1
- {"version":3,"file":"hx-button.d.ts","sourceRoot":"","sources":["../../../src/components/hx-button/hx-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAC9E,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,UAAU,CAAC;CAC3B;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,qBACa,WAAY,SAAQ,gBAAgC;IAM/D,OAAgB,MAAM,4BAAuB;IAI7C,gBAAgB;IAChB,OAAgB,cAAc,UAAQ;IAItC;;;OAGG;IAEH,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAa;IAE3F;;;OAGG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEhC;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;;OAIG;IAEH,OAAO,UAAS;IAEhB;;;OAGG;IAEH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE/C;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAa;IAEvC;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAEtC;;;;OAIG;IAEH,IAAI,UAAS;IAEb;;;;;;;;;;;;;;OAcG;IAEH,QAAQ,UAAS;IAEjB;;;;;;;;OAQG;IAEH,eAAe,EAAE,MAAM,CAAM;IAE7B;;;;OAIG;IACH,OAAO,KAAK,eAAe,GAE1B;cAIkB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAM3D,gBAAgB;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAO5B;IAGX,OAAO,CAAC,qBAAqB,CAAS;IAE7B,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAe3D,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAgB/D,gBAAgB;IAChB,OAAO,CAAC,wBAAwB;IAoBhC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgCpB;;;OAGG;IACH,OAAO,CAAC,cAAc;IA6BtB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAiBX,MAAM;CAyChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,WAAW,CAAC;KAC1B;IACD,UAAU,mBAAmB;QAC3B,UAAU,EAAE,WAAW,CAAC;YAAE,aAAa,EAAE,UAAU,CAAA;SAAE,CAAC,CAAC;KACxD;CACF"}
1
+ {"version":3,"file":"hx-button.d.ts","sourceRoot":"","sources":["../../../src/components/hx-button/hx-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAC9E,OAAO,4CAA4C,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,UAAU,CAAC;CAC3B;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,qBACa,WAAY,SAAQ,gBAAgC;IAM/D,OAAgB,MAAM,4BAAuB;IAI7C,gBAAgB;IAChB,OAAgB,cAAc,UAAQ;IAItC;;;OAGG;IAEH,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAa;IAE3F;;;OAGG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEhC;;;OAGG;IAEH,QAAQ,UAAS;IAEjB;;;;OAIG;IAEH,OAAO,UAAS;IAEhB;;;OAGG;IAEH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE/C;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAa;IAEvC;;;OAGG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAErC;;;OAGG;IAEH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAEtC;;;;OAIG;IAEH,IAAI,UAAS;IAEb;;;;;;;;;;;;;;OAcG;IAEH,QAAQ,UAAS;IAEjB;;;;;;;;OAQG;IAEH,eAAe,EAAE,MAAM,CAAM;IAE7B;;;;OAIG;IACH,OAAO,KAAK,eAAe,GAE1B;cAIkB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAM3D,gBAAgB;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAO5B;IAGX,OAAO,CAAC,qBAAqB,CAAS;IAE7B,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAe3D,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAgB/D,gBAAgB;IAChB,OAAO,CAAC,wBAAwB;IAoBhC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgCpB;;;OAGG;IACH,OAAO,CAAC,cAAc;IA6BtB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAiBX,MAAM;CAyChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,WAAW,CAAC;KAC1B;IACD,UAAU,mBAAmB;QAC3B,UAAU,EAAE,WAAW,CAAC;YAAE,aAAa,EAAE,UAAU,CAAA;SAAE,CAAC,CAAC;KACxD;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hx-button.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-button/hx-button.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,yBAqa7B,CAAC"}
1
+ {"version":3,"file":"hx-button.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-button/hx-button.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,yBAic7B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { H as e } from "../../shared/hx-button-CHlkRQTe.js";
1
+ import { H as e } from "../../shared/hx-button-DPY6SPVT.js";
2
2
  export {
3
3
  e as HelixButton
4
4
  };
@@ -34,6 +34,7 @@ import { HelixElement } from '../../base/index.js';
34
34
  * @cssprop [--hx-color-text-inverse] - Side-nav text color (resolves to neutral-0).
35
35
  * @cssprop [--hx-color-border-on-dark-strong] - Container/header/footer divider border (overlay-white-70 light, overlay-black-50 dark — sized for visibility on the mode-flipped surface-inverse).
36
36
  * @cssprop [--hx-color-surface-on-dark-overlay-subtle] - Toggle button hover surface (overlay-white-10 primitive — translucent fill, not a border).
37
+ * @cssprop [--hx-color-border-on-dark-subtle] - DEPRECATED 3.2.2; renamed to --hx-color-surface-on-dark-overlay-subtle (the value paints a translucent fill, not a border). Toggle-hover rule reads both names via deprecated-first fallback so existing overrides keep working until removal in 4.0.0.
37
38
  */
38
39
  export declare class HelixSideNav extends HelixElement {
39
40
  static styles: import('lit').CSSResult[];
@@ -1 +1 @@
1
- {"version":3,"file":"hx-side-nav.d.ts","sourceRoot":"","sources":["../../../src/components/hx-side-nav/hx-side-nav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,4CAA4C,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBACa,YAAa,SAAQ,YAAY;IAI5C,OAAgB,MAAM,4BAAwB;IAI9C;;;OAGG;IAEH,SAAS,UAAS;IAElB;;;OAGG;IAEH,KAAK,SAAqB;IAIjB,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAS/D;;;;OAIG;IACH,gBAAgB;IAChB,OAAO,CAAC,6BAA6B;IAkBrC;;;OAGG;IACH,gBAAgB;IAChB,OAAO,CAAC,oBAAoB;IAM5B;;;;;OAKG;IACH,gBAAgB;IAChB,OAAO,CAAC,cAAc;IAgItB,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAgCrB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAQhB,MAAM;CA0BhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,YAAY,CAAC;KAC7B;CACF;AAED,YAAY,EAAE,YAAY,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"hx-side-nav.d.ts","sourceRoot":"","sources":["../../../src/components/hx-side-nav/hx-side-nav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,4CAA4C,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBACa,YAAa,SAAQ,YAAY;IAI5C,OAAgB,MAAM,4BAAwB;IAI9C;;;OAGG;IAEH,SAAS,UAAS;IAElB;;;OAGG;IAEH,KAAK,SAAqB;IAIjB,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAS/D;;;;OAIG;IACH,gBAAgB;IAChB,OAAO,CAAC,6BAA6B;IAkBrC;;;OAGG;IACH,gBAAgB;IAChB,OAAO,CAAC,oBAAoB;IAM5B;;;;;OAKG;IACH,gBAAgB;IAChB,OAAO,CAAC,cAAc;IAgItB,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAgCrB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAQhB,MAAM;CA0BhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,YAAY,CAAC;KAC7B;CACF;AAED,YAAY,EAAE,YAAY,IAAI,SAAS,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hx-side-nav.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-side-nav/hx-side-nav.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,yBAgM9B,CAAC"}
1
+ {"version":3,"file":"hx-side-nav.styles.d.ts","sourceRoot":"","sources":["../../../src/components/hx-side-nav/hx-side-nav.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,yBA4M9B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { H as i, a as x } from "../../shared/hx-nav-item-Dap3DYgB.js";
1
+ import { H as i, a as x } from "../../shared/hx-nav-item-xqRPOCWX.js";
2
2
  export {
3
3
  i as HelixNavItem,
4
4
  x as HelixSideNav
@@ -101,6 +101,13 @@ export declare class HelixTheme extends HelixElement {
101
101
  * If the brand name is non-empty but not registered, a warning is logged
102
102
  * and the base theme is applied without brand overrides.
103
103
  *
104
+ * **High-contrast suppression:** When `theme="high-contrast"`, the brand
105
+ * merge is intentionally skipped to preserve the WCAG 1.4.6 Enhanced
106
+ * Contrast (7:1+) guarantee that the HC token set is tuned for. A
107
+ * registered brand applied under HC emits a `console.info` to surface
108
+ * the suppression in development. Brand merging on `light` and `dark`
109
+ * is unaffected. See `BRAND_THEMING.md`.
110
+ *
104
111
  * @attr brand
105
112
  * @example
106
113
  * ```html
@@ -143,15 +150,20 @@ export declare class HelixTheme extends HelixElement {
143
150
  private _motionQuery;
144
151
  /** @internal */
145
152
  private _motionHandler;
153
+ /** @internal — last `${brand}|${effectiveTheme}|${kind}` for which a brand
154
+ * suppression info / unregistered warn was emitted. `_applyEffectiveTheme()`
155
+ * runs on every relevant property change, so without this guard the message
156
+ * fires once per `update()` tick rather than once per applied state. */
157
+ private _lastBrandAdvisoryKey;
146
158
  firstUpdated(changed: PropertyValues<this>): void;
147
159
  updated(changed: PropertyValues<this>): void;
148
160
  disconnectedCallback(): void;
149
161
  /**
150
162
  * Returns the currently active theme name.
151
- * When `system=true` or `theme="auto"`, reflects the OS preference (`"light"` or `"dark"`).
163
+ * When `theme="auto"`, reflects the OS preference (`"light"` or `"dark"`).
152
164
  * Otherwise returns the `theme` property value.
153
165
  */
154
- get effectiveTheme(): 'light' | 'dark' | 'high-contrast' | 'auto';
166
+ get effectiveTheme(): 'light' | 'dark' | 'high-contrast';
155
167
  /**
156
168
  * Returns the resolved motion level after considering the `motion` attribute and OS preference.
157
169
  * When `motion="full"` and the OS reports `prefers-reduced-motion: reduce`, returns `"reduced"`.
@@ -1 +1 @@
1
- {"version":3,"file":"hx-theme.d.ts","sourceRoot":"","sources":["../../../src/components/hx-theme/hx-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,4CAA4C,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC;AAqLpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,qBACa,UAAW,SAAQ,YAAY;IAC1C,OAAgB,MAAM,4BAAsB;IAE5C;;;;;;;OAOG;IAEH,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAW;IAK7D;;;;;;;;;;;;;;;;;OAiBG;IAEH,KAAK,SAAM;IAEX;;;;;;;;;;;OAWG;IAEH,MAAM,EAAE,UAAU,CAAU;IAE5B;;;;;;OAMG;IAEH,OAAO,EAAE,WAAW,CAAiB;IAErC,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAA+B;IAClD,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAA6B;IAClD,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAA8B;IACjD,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAA8B;IACnD,4DAA4D;IAC5D,OAAO,CAAC,YAAY,CAA+B;IACnD,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAA6B;IAE1C,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAWjD,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IA2B5C,oBAAoB,IAAI,IAAI;IAMrC;;;;OAIG;IACH,IAAI,cAAc,IAAI,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAMhE;IAED;;;;OAIG;IACH,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CASxC;IAED,gBAAgB;IAChB,OAAO,CAAC,eAAe;IAcvB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAUzB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAQzB,+EAA+E;IAC/E,OAAO,CAAC,kBAAkB;IAS1B,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAQ1B,+EAA+E;IAC/E,OAAO,CAAC,oBAAoB;IAO5B,gBAAgB;IAChB,OAAO,CAAC,oBAAoB;IAyB5B,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAcZ,MAAM;CAQhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,UAAU,CAAC;KACxB;CACF;AAED,6FAA6F;AAC7F,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"hx-theme.d.ts","sourceRoot":"","sources":["../../../src/components/hx-theme/hx-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,4CAA4C,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUnD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC;AA+HpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,qBACa,UAAW,SAAQ,YAAY;IAC1C,OAAgB,MAAM,4BAAsB;IAE5C;;;;;;;OAOG;IAEH,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAW;IAK7D;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IAEH,KAAK,SAAM;IAEX;;;;;;;;;;;OAWG;IAEH,MAAM,EAAE,UAAU,CAAU;IAE5B;;;;;;OAMG;IAEH,OAAO,EAAE,WAAW,CAAiB;IAErC,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAA+B;IAClD,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAA6B;IAClD,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAA8B;IACjD,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAA8B;IACnD,4DAA4D;IAC5D,OAAO,CAAC,YAAY,CAA+B;IACnD,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAA6B;IACnD;;;4EAGwE;IACxE,OAAO,CAAC,qBAAqB,CAAuB;IAE3C,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IAWjD,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;IA2B5C,oBAAoB,IAAI,IAAI;IAMrC;;;;OAIG;IACH,IAAI,cAAc,IAAI,OAAO,GAAG,MAAM,GAAG,eAAe,CAMvD;IAED;;;;OAIG;IACH,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CASxC;IAED,gBAAgB;IAChB,OAAO,CAAC,eAAe;IAcvB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAUzB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAQzB,+EAA+E;IAC/E,OAAO,CAAC,kBAAkB;IAS1B,gBAAgB;IAChB,OAAO,CAAC,kBAAkB;IAQ1B,+EAA+E;IAC/E,OAAO,CAAC,oBAAoB;IAO5B,gBAAgB;IAChB,OAAO,CAAC,oBAAoB;IAgE5B,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAcZ,MAAM;CAQhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,UAAU,CAAC;KACxB;CACF;AAED,6FAA6F;AAC7F,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC"}
@@ -1,4 +1,4 @@
1
- import { H as o } from "../../shared/hx-theme-BiyQ7UUK.js";
1
+ import { H as o } from "../../shared/hx-theme-BsefFWTO.js";
2
2
  export {
3
3
  o as HelixTheme
4
4
  };
@@ -1289,8 +1289,16 @@
1289
1289
  so dark mode can flip the fill to primary-600. surface.inverse becomes light
1290
1290
  (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
1291
1291
  fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
1292
- (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
1293
- dark surface.inverse). */
1292
+ (AA pass). Light mode tracks action.primary.bg-inverted-rest's base value
1293
+ (primary-500, 5.20:1 on dark surface.inverse).
1294
+
1295
+ Override path note (codex round-11): this binds --hx-button-bg directly,
1296
+ matching the cascade convention every other .button--{variant} rule uses
1297
+ (light primary at line 89, danger at 120, secondary, tertiary, ghost). The
1298
+ consumer override path for inverted-primary rest is
1299
+ --hx-color-action-primary-bg-inverted-rest, NOT --hx-button-bg — the same
1300
+ pattern as light primary (consumers override --hx-color-action-primary-bg).
1301
+ Pinned by dark-mode-resolution.test.ts:185-197 across both modes. */
1294
1302
  :host([inverted]) .button--primary {
1295
1303
  --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
1296
1304
  }
@@ -1342,20 +1350,34 @@
1342
1350
  --hx-button-border-color: var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
1343
1351
  }
1344
1352
 
1353
+ /* Inverted overlay fills read both names so consumer overrides reach paint
1354
+ regardless of which token they target: the deprecated --hx-color-border-on-dark-*
1355
+ names (3.2.0/3.2.1 public API, scheduled for removal in 4.0.0) and the canonical
1356
+ --hx-color-surface-on-dark-overlay-* names (round-8 rename). Deprecated name
1357
+ wins when set; otherwise resolves through the canonical alias chain. */
1345
1358
  :host([inverted]) .button--secondary:hover {
1346
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
1359
+ --hx-button-bg: var(
1360
+ --hx-color-border-on-dark-default,
1361
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
1362
+ );
1347
1363
  }
1348
1364
 
1349
1365
  /* Tertiary inverted — resting at the subtle overlay (10%) lifts to the default
1350
1366
  overlay (30%) on hover so the runtime hover delta is visually distinct, not
1351
1367
  collapsed onto a single token. */
1352
1368
  :host([inverted]) .button--tertiary {
1353
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1));
1369
+ --hx-button-bg: var(
1370
+ --hx-color-border-on-dark-subtle,
1371
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
1372
+ );
1354
1373
  --hx-button-border-color: transparent;
1355
1374
  }
1356
1375
 
1357
1376
  :host([inverted]) .button--tertiary:hover {
1358
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
1377
+ --hx-button-bg: var(
1378
+ --hx-color-border-on-dark-default,
1379
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
1380
+ );
1359
1381
  }
1360
1382
 
1361
1383
  /* Ghost inverted — transparent base, translucent hover bg */
@@ -1367,7 +1389,10 @@
1367
1389
  :host([inverted]) .button--ghost:hover {
1368
1390
  --hx-button-bg: var(
1369
1391
  --hx-button-inverted-ghost-hover-bg,
1370
- var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
1392
+ var(
1393
+ --hx-color-border-on-dark-default,
1394
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
1395
+ )
1371
1396
  );
1372
1397
  }
1373
1398
 
@@ -1377,7 +1402,10 @@
1377
1402
  }
1378
1403
 
1379
1404
  :host([inverted]) .button--outline:hover {
1380
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
1405
+ --hx-button-bg: var(
1406
+ --hx-color-border-on-dark-default,
1407
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
1408
+ );
1381
1409
  }
1382
1410
 
1383
1411
  /* ─── Prefix / Suffix / Label ─── */
@@ -8740,16 +8768,28 @@ export const helixGridItemStyles = css`
8740
8768
  }
8741
8769
 
8742
8770
  .side-nav__toggle:hover {
8771
+ /* Read both deprecated --hx-color-border-on-dark-subtle (3.2.0/3.2.1 API)
8772
+ and canonical --hx-color-surface-on-dark-overlay-subtle so consumer
8773
+ overrides on either name reach paint. Deprecated removal: 4.0.0.
8774
+ Hex fallback for browsers without color-mix(). */
8743
8775
  background-color: var(
8744
- --hx-color-surface-on-dark-overlay-subtle,
8745
- rgba(255, 255, 255, 0.1)
8746
- ); /* fallback for browsers without color-mix() */
8776
+ --hx-color-border-on-dark-subtle,
8777
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
8778
+ );
8747
8779
  color: var(--hx-side-nav-toggle-hover-color, var(--hx-color-text-inverse, #ffffff));
8748
8780
  }
8749
8781
 
8750
8782
  @supports (color: color-mix(in srgb, red 50%, blue)) {
8783
+ /* Fold color-mix() into the same deprecated-first chain so consumer
8784
+ overrides on either token reach paint on the modern path too. */
8751
8785
  .side-nav__toggle:hover {
8752
- background-color: color-mix(in srgb, currentColor 15%, transparent);
8786
+ background-color: var(
8787
+ --hx-color-border-on-dark-subtle,
8788
+ var(
8789
+ --hx-color-surface-on-dark-overlay-subtle,
8790
+ color-mix(in srgb, currentColor 15%, transparent)
8791
+ )
8792
+ );
8753
8793
  }
8754
8794
  }
8755
8795
 
@@ -621,8 +621,16 @@
621
621
  so dark mode can flip the fill to primary-600. surface.inverse becomes light
622
622
  (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
623
623
  fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
624
- (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
625
- dark surface.inverse). */
624
+ (AA pass). Light mode tracks action.primary.bg-inverted-rest's base value
625
+ (primary-500, 5.20:1 on dark surface.inverse).
626
+
627
+ Override path note (codex round-11): this binds --hx-button-bg directly,
628
+ matching the cascade convention every other .button--{variant} rule uses
629
+ (light primary at line 89, danger at 120, secondary, tertiary, ghost). The
630
+ consumer override path for inverted-primary rest is
631
+ --hx-color-action-primary-bg-inverted-rest, NOT --hx-button-bg — the same
632
+ pattern as light primary (consumers override --hx-color-action-primary-bg).
633
+ Pinned by dark-mode-resolution.test.ts:185-197 across both modes. */
626
634
  :host([inverted]) .button--primary {
627
635
  --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
628
636
  }
@@ -674,20 +682,34 @@
674
682
  --hx-button-border-color: var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
675
683
  }
676
684
 
685
+ /* Inverted overlay fills read both names so consumer overrides reach paint
686
+ regardless of which token they target: the deprecated --hx-color-border-on-dark-*
687
+ names (3.2.0/3.2.1 public API, scheduled for removal in 4.0.0) and the canonical
688
+ --hx-color-surface-on-dark-overlay-* names (round-8 rename). Deprecated name
689
+ wins when set; otherwise resolves through the canonical alias chain. */
677
690
  :host([inverted]) .button--secondary:hover {
678
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
691
+ --hx-button-bg: var(
692
+ --hx-color-border-on-dark-default,
693
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
694
+ );
679
695
  }
680
696
 
681
697
  /* Tertiary inverted — resting at the subtle overlay (10%) lifts to the default
682
698
  overlay (30%) on hover so the runtime hover delta is visually distinct, not
683
699
  collapsed onto a single token. */
684
700
  :host([inverted]) .button--tertiary {
685
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1));
701
+ --hx-button-bg: var(
702
+ --hx-color-border-on-dark-subtle,
703
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
704
+ );
686
705
  --hx-button-border-color: transparent;
687
706
  }
688
707
 
689
708
  :host([inverted]) .button--tertiary:hover {
690
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
709
+ --hx-button-bg: var(
710
+ --hx-color-border-on-dark-default,
711
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
712
+ );
691
713
  }
692
714
 
693
715
  /* Ghost inverted — transparent base, translucent hover bg */
@@ -699,7 +721,10 @@
699
721
  :host([inverted]) .button--ghost:hover {
700
722
  --hx-button-bg: var(
701
723
  --hx-button-inverted-ghost-hover-bg,
702
- var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
724
+ var(
725
+ --hx-color-border-on-dark-default,
726
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
727
+ )
703
728
  );
704
729
  }
705
730
 
@@ -709,7 +734,10 @@
709
734
  }
710
735
 
711
736
  :host([inverted]) .button--outline:hover {
712
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
737
+ --hx-button-bg: var(
738
+ --hx-color-border-on-dark-default,
739
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
740
+ );
713
741
  }
714
742
 
715
743
  /* ─── Prefix / Suffix / Label ─── */
@@ -825,16 +825,28 @@
825
825
  }
826
826
 
827
827
  .side-nav__toggle:hover {
828
+ /* Read both deprecated --hx-color-border-on-dark-subtle (3.2.0/3.2.1 API)
829
+ and canonical --hx-color-surface-on-dark-overlay-subtle so consumer
830
+ overrides on either name reach paint. Deprecated removal: 4.0.0.
831
+ Hex fallback for browsers without color-mix(). */
828
832
  background-color: var(
829
- --hx-color-surface-on-dark-overlay-subtle,
830
- rgba(255, 255, 255, 0.1)
831
- ); /* fallback for browsers without color-mix() */
833
+ --hx-color-border-on-dark-subtle,
834
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
835
+ );
832
836
  color: var(--hx-side-nav-toggle-hover-color, var(--hx-color-text-inverse, #ffffff));
833
837
  }
834
838
 
835
839
  @supports (color: color-mix(in srgb, red 50%, blue)) {
840
+ /* Fold color-mix() into the same deprecated-first chain so consumer
841
+ overrides on either token reach paint on the modern path too. */
836
842
  .side-nav__toggle:hover {
837
- background-color: color-mix(in srgb, currentColor 15%, transparent);
843
+ background-color: var(
844
+ --hx-color-border-on-dark-subtle,
845
+ var(
846
+ --hx-color-surface-on-dark-overlay-subtle,
847
+ color-mix(in srgb, currentColor 15%, transparent)
848
+ )
849
+ );
838
850
  }
839
851
  }
840
852
 
@@ -272,8 +272,16 @@
272
272
  so dark mode can flip the fill to primary-600. surface.inverse becomes light
273
273
  (#EBEEE9) in dark mode; primary-500 on #EBEEE9 = 2.94:1 (sub-3:1 UI floor
274
274
  fail for the inverted-button boundary). primary-600 on #EBEEE9 = 4.97:1
275
- (AA pass). Light mode tracks action.primary.bg (primary-500, 5.20:1 on
276
- dark surface.inverse). */
275
+ (AA pass). Light mode tracks action.primary.bg-inverted-rest's base value
276
+ (primary-500, 5.20:1 on dark surface.inverse).
277
+
278
+ Override path note (codex round-11): this binds --hx-button-bg directly,
279
+ matching the cascade convention every other .button--{variant} rule uses
280
+ (light primary at line 89, danger at 120, secondary, tertiary, ghost). The
281
+ consumer override path for inverted-primary rest is
282
+ --hx-color-action-primary-bg-inverted-rest, NOT --hx-button-bg — the same
283
+ pattern as light primary (consumers override --hx-color-action-primary-bg).
284
+ Pinned by dark-mode-resolution.test.ts:185-197 across both modes. */
277
285
  :host([inverted]) .button--primary {
278
286
  --hx-button-bg: var(--hx-color-action-primary-bg-inverted-rest, #429797);
279
287
  }
@@ -325,20 +333,34 @@
325
333
  --hx-button-border-color: var(--hx-color-border-on-dark-strong, rgba(255, 255, 255, 0.7));
326
334
  }
327
335
 
336
+ /* Inverted overlay fills read both names so consumer overrides reach paint
337
+ regardless of which token they target: the deprecated --hx-color-border-on-dark-*
338
+ names (3.2.0/3.2.1 public API, scheduled for removal in 4.0.0) and the canonical
339
+ --hx-color-surface-on-dark-overlay-* names (round-8 rename). Deprecated name
340
+ wins when set; otherwise resolves through the canonical alias chain. */
328
341
  :host([inverted]) .button--secondary:hover {
329
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
342
+ --hx-button-bg: var(
343
+ --hx-color-border-on-dark-default,
344
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
345
+ );
330
346
  }
331
347
 
332
348
  /* Tertiary inverted — resting at the subtle overlay (10%) lifts to the default
333
349
  overlay (30%) on hover so the runtime hover delta is visually distinct, not
334
350
  collapsed onto a single token. */
335
351
  :host([inverted]) .button--tertiary {
336
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1));
352
+ --hx-button-bg: var(
353
+ --hx-color-border-on-dark-subtle,
354
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
355
+ );
337
356
  --hx-button-border-color: transparent;
338
357
  }
339
358
 
340
359
  :host([inverted]) .button--tertiary:hover {
341
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
360
+ --hx-button-bg: var(
361
+ --hx-color-border-on-dark-default,
362
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
363
+ );
342
364
  }
343
365
 
344
366
  /* Ghost inverted — transparent base, translucent hover bg */
@@ -350,7 +372,10 @@
350
372
  :host([inverted]) .button--ghost:hover {
351
373
  --hx-button-bg: var(
352
374
  --hx-button-inverted-ghost-hover-bg,
353
- var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
375
+ var(
376
+ --hx-color-border-on-dark-default,
377
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
378
+ )
354
379
  );
355
380
  }
356
381
 
@@ -360,7 +385,10 @@
360
385
  }
361
386
 
362
387
  :host([inverted]) .button--outline:hover {
363
- --hx-button-bg: var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3));
388
+ --hx-button-bg: var(
389
+ --hx-color-border-on-dark-default,
390
+ var(--hx-color-surface-on-dark-overlay-default, rgba(255, 255, 255, 0.3))
391
+ );
364
392
  }
365
393
 
366
394
  /* ─── Prefix / Suffix / Label ─── */
@@ -112,16 +112,28 @@
112
112
  }
113
113
 
114
114
  .side-nav__toggle:hover {
115
+ /* Read both deprecated --hx-color-border-on-dark-subtle (3.2.0/3.2.1 API)
116
+ and canonical --hx-color-surface-on-dark-overlay-subtle so consumer
117
+ overrides on either name reach paint. Deprecated removal: 4.0.0.
118
+ Hex fallback for browsers without color-mix(). */
115
119
  background-color: var(
116
- --hx-color-surface-on-dark-overlay-subtle,
117
- rgba(255, 255, 255, 0.1)
118
- ); /* fallback for browsers without color-mix() */
120
+ --hx-color-border-on-dark-subtle,
121
+ var(--hx-color-surface-on-dark-overlay-subtle, rgba(255, 255, 255, 0.1))
122
+ );
119
123
  color: var(--hx-side-nav-toggle-hover-color, var(--hx-color-text-inverse, #ffffff));
120
124
  }
121
125
 
122
126
  @supports (color: color-mix(in srgb, red 50%, blue)) {
127
+ /* Fold color-mix() into the same deprecated-first chain so consumer
128
+ overrides on either token reach paint on the modern path too. */
123
129
  .side-nav__toggle:hover {
124
- background-color: color-mix(in srgb, currentColor 15%, transparent);
130
+ background-color: var(
131
+ --hx-color-border-on-dark-subtle,
132
+ var(
133
+ --hx-color-surface-on-dark-overlay-subtle,
134
+ color-mix(in srgb, currentColor 15%, transparent)
135
+ )
136
+ );
125
137
  }
126
138
  }
127
139
 
@@ -1,4 +1,4 @@
1
- /* index.css — generated 2026-04-26T14:24:50.891Z */
1
+ /* index.css — generated 2026-04-27T02:39:11.228Z */
2
2
  /* Imports all per-component CSS files for Drupal asset pipeline */
3
3
 
4
4
  @import './hx-accordion.css';
@@ -1,5 +1,5 @@
1
1
  {
2
- "generated": "2026-04-26T14:24:50.890Z",
2
+ "generated": "2026-04-27T02:39:11.227Z",
3
3
  "components": [
4
4
  {
5
5
  "name": "hx-accordion",
@@ -1771,6 +1771,7 @@
1771
1771
  "--hx-border-width-thin",
1772
1772
  "--hx-color-border-on-dark-strong",
1773
1773
  "--hx-color-surface-inverse",
1774
+ "--hx-color-surface-on-dark-overlay-subtle",
1774
1775
  "--hx-color-text-inverse",
1775
1776
  "--hx-focus-ring-color",
1776
1777
  "--hx-focus-ring-offset",
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { H as v } from "./shared/hx-avatar-C9hOmlAb.js";
6
6
  import { H as E } from "./shared/hx-badge-CQXgOXJM.js";
7
7
  import { H as k } from "./shared/hx-banner-D3DzpfcP.js";
8
8
  import { H as B, a as P } from "./shared/hx-breadcrumb-item-3tKppF9h.js";
9
- import { H as M } from "./shared/hx-button-CHlkRQTe.js";
9
+ import { H as M } from "./shared/hx-button-DPY6SPVT.js";
10
10
  import { H as N } from "./shared/hx-button-group-BI-QBqmO.js";
11
11
  import { H as A } from "./shared/hx-card-qNAM2QNV.js";
12
12
  import { H as G, a as U } from "./shared/hx-carousel-item-z1Lc24op.js";
@@ -53,7 +53,7 @@ import { H as So } from "./shared/hx-prose-BThYcASV.js";
53
53
  import { H as To, a as bo } from "./shared/hx-radio-CJvNU2yP.js";
54
54
  import { H as go } from "./shared/hx-rating-C3QP53k9.js";
55
55
  import { H as vo } from "./shared/hx-select-C8fEHQhC.js";
56
- import { H as Eo, a as Do } from "./shared/hx-nav-item-Dap3DYgB.js";
56
+ import { H as Eo, a as Do } from "./shared/hx-nav-item-xqRPOCWX.js";
57
57
  import { H as wo } from "./shared/hx-skeleton-Cnieh5Uc.js";
58
58
  import { H as Po } from "./shared/hx-slider-Blmv_rwS.js";
59
59
  import { H as Mo } from "./shared/hx-spinner-DL5AYr16.js";
@@ -72,7 +72,7 @@ import { H as ct } from "./shared/hx-tag-CNSmdyaK.js";
72
72
  import { H as ht } from "./shared/hx-text-Bz_9fJ3J.js";
73
73
  import { F as St, H as yt } from "./shared/hx-text-input-D6FlOZM-.js";
74
74
  import { H as bt } from "./shared/hx-textarea-CNG590KY.js";
75
- import { H as gt } from "./shared/hx-theme-BiyQ7UUK.js";
75
+ import { H as gt } from "./shared/hx-theme-BsefFWTO.js";
76
76
  import { H as vt } from "./shared/hx-time-picker-BoEIZwzv.js";
77
77
  import { H as Et, a as Dt, t as kt } from "./shared/toast-factory-YSznocIV.js";
78
78
  import { H as Bt } from "./shared/hx-toggle-button-iLiYrMbD.js";