srcdev-nuxt-components 9.6.0 → 9.6.1

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 (107) hide show
  1. package/.claude/skills/component-compliance-checklist.md +8 -2
  2. package/.claude/skills/component-dynamic-slots.md +3 -3
  3. package/.claude/skills/component-export-types.md +10 -16
  4. package/.claude/skills/component-naming.md +1 -1
  5. package/.claude/skills/components/alert-content.md +9 -1
  6. package/.claude/skills/components/container-glow.md +21 -8
  7. package/.claude/skills/components/display-avatar.md +13 -7
  8. package/.claude/skills/components/display-chip.md +37 -24
  9. package/.claude/skills/components/display-pill.md +58 -10
  10. package/.claude/skills/components/display-prompt.md +8 -5
  11. package/.claude/skills/components/display-toast.md +21 -4
  12. package/.claude/skills/components/glowing-border.md +20 -2
  13. package/.claude/skills/components/responsive-header.md +11 -1
  14. package/.claude/skills/components/select-menu.md +54 -5
  15. package/.claude/skills/components/site-header.md +2 -2
  16. package/.claude/skills/components/tabbed-content.md +300 -0
  17. package/.claude/skills/composable-anchor-scroll.md +16 -15
  18. package/.claude/skills/index.md +4 -4
  19. package/.claude/skills/storybook-add-story.md +53 -0
  20. package/.claude/skills/theming-status-tokens.md +60 -0
  21. package/.vscode/srcdev-component-display-avatar.code-snippets +2 -1
  22. package/.vscode/srcdev-component-display-chip.code-snippets +3 -2
  23. package/.vscode/srcdev-component-display-pill.code-snippets +10 -0
  24. package/.vscode/srcdev-component-responsive-header.code-snippets +6 -0
  25. package/.vscode/srcdev-component-select-menu.code-snippets +28 -0
  26. package/.vscode/{srcdev-component-tabs-core.code-snippets → srcdev-component-tabbed-content.code-snippets} +35 -16
  27. package/app/assets/styles/setup/03.theming/_status.css +24 -0
  28. package/app/assets/styles/setup/03.theming/index.css +1 -0
  29. package/app/components/01.atoms/animations/container-glow/CONSUMER-STYLING.md +39 -35
  30. package/app/components/01.atoms/animations/container-glow/ContainerGlow.vue +25 -15
  31. package/app/components/01.atoms/animations/container-glow/stories/ContainerGlow.stories.ts +130 -24
  32. package/app/components/01.atoms/animations/container-glow/tests/ContainerGlow.spec.ts +45 -0
  33. package/app/components/01.atoms/animations/container-glow/tests/__snapshots__/ContainerGlow.spec.ts.snap +2 -2
  34. package/app/components/01.atoms/animations/glowing-border/CONSUMER-STYLING.md +76 -19
  35. package/app/components/01.atoms/animations/glowing-border/GlowingBorder.vue +12 -10
  36. package/app/components/01.atoms/animations/glowing-border/stories/GlowingBorder.stories.ts +201 -42
  37. package/app/components/01.atoms/animations/glowing-border/tests/GlowingBorder.spec.ts +15 -4
  38. package/app/components/01.atoms/animations/glowing-border/tests/__snapshots__/GlowingBorder.spec.ts.snap +1 -1
  39. package/app/components/01.atoms/display-pill/CONSUMER-STYLING.md +75 -9
  40. package/app/components/01.atoms/display-pill/DisplayPill.vue +57 -24
  41. package/app/components/01.atoms/display-pill/stories/DisplayPill.stories.ts +240 -16
  42. package/app/components/01.atoms/display-pill/tests/DisplayPill.spec.ts +43 -14
  43. package/app/components/01.atoms/display-pill/tests/__snapshots__/DisplayPill.spec.ts.snap +3 -3
  44. package/app/components/01.atoms/tabbed-content/CONSUMER-STYLING.md +201 -0
  45. package/app/components/01.atoms/tabbed-content/TabbedContent.vue +750 -0
  46. package/app/components/01.atoms/tabbed-content/stories/TabbedContent.stories.ts +279 -0
  47. package/app/components/01.atoms/tabbed-content/tests/TabbedContent.spec.ts +816 -0
  48. package/app/components/02.molecules/alert-content/AlertContent.vue +11 -2
  49. package/app/components/02.molecules/alert-content/AlertContentInner.vue +19 -0
  50. package/app/components/02.molecules/alert-content/CONSUMER-STYLING.md +17 -4
  51. package/app/components/02.molecules/alert-content/stories/AlertContent.stories.ts +200 -17
  52. package/app/components/02.molecules/alert-content/tests/AlertContent.spec.ts +33 -0
  53. package/app/components/02.molecules/display-avatar/CONSUMER-STYLING.md +7 -5
  54. package/app/components/02.molecules/display-avatar/DisplayAvatar.vue +6 -2
  55. package/app/components/02.molecules/display-avatar/stories/DisplayAvatar.stories.ts +24 -3
  56. package/app/components/02.molecules/display-avatar/tests/DisplayAvatar.spec.ts +19 -0
  57. package/app/components/02.molecules/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +2 -1
  58. package/app/components/02.molecules/display-chip/CONSUMER-STYLING.md +52 -19
  59. package/app/components/02.molecules/display-chip/DisplayChip.vue +72 -54
  60. package/app/components/02.molecules/display-chip/stories/DisplayChip.stories.ts +103 -6
  61. package/app/components/02.molecules/display-chip/tests/DisplayChip.spec.ts +98 -29
  62. package/app/components/02.molecules/display-chip/tests/__snapshots__/DisplayChip.spec.ts.snap +8 -4
  63. package/app/components/02.molecules/prompt/CONSUMER-STYLING.md +9 -1
  64. package/app/components/02.molecules/prompt/DisplayPrompt.vue +2 -2
  65. package/app/components/02.molecules/prompt/stories/DisplayPrompt.stories.ts +208 -71
  66. package/app/components/02.molecules/prompt/tests/DisplayPrompt.spec.ts +19 -6
  67. package/app/components/02.molecules/select-menu/CONSUMER-STYLING.md +66 -8
  68. package/app/components/02.molecules/select-menu/SelectMenu.vue +141 -18
  69. package/app/components/02.molecules/select-menu/stories/SelectMenu.stories.ts +232 -2
  70. package/app/components/02.molecules/select-menu/tests/SelectMenu.spec.ts +151 -0
  71. package/app/components/02.molecules/select-menu/tests/__snapshots__/SelectMenu.spec.ts.snap +6 -2
  72. package/app/components/02.molecules/toast/CONSUMER-STYLING.md +91 -27
  73. package/app/components/02.molecules/toast/DisplayToast.vue +109 -50
  74. package/app/components/02.molecules/toast/DisplayToastProvider.vue +109 -45
  75. package/app/components/02.molecules/toast/stories/DisplayToast.stories.ts +23 -0
  76. package/app/components/02.molecules/toast/stories/DisplayToastProvider.stories.ts +73 -0
  77. package/app/components/02.molecules/toast/tests/DisplayToast.spec.ts +132 -18
  78. package/app/components/02.molecules/toast/tests/DisplayToastProvider.spec.ts +105 -39
  79. package/app/components/03.organisms/responsive-header/CONSUMER-STYLING.md +38 -11
  80. package/app/components/03.organisms/responsive-header/NavigationItems.vue +27 -12
  81. package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +35 -20
  82. package/app/components/03.organisms/responsive-header/stories/ResponsiveHeader.stories.ts +1 -1
  83. package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +1 -1
  84. package/app/components/03.organisms/services/service-summary/tests/__snapshots__/ServiceSummary.spec.ts.snap +1 -1
  85. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServiceSummaryGrid.spec.ts.snap +3 -3
  86. package/app/composables/useTabs.ts +148 -206
  87. package/app/types/components/display-chip.d.ts +8 -4
  88. package/app/types/components/display-toast.d.ts +2 -0
  89. package/app/types/components/index.ts +0 -1
  90. package/app/types/components/select-menu.d.ts +2 -0
  91. package/app/utils/pausableTimeout.ts +41 -0
  92. package/nuxt.config.ts +1 -1
  93. package/package.json +1 -1
  94. package/.claude/skills/components/tab-navigation.md +0 -288
  95. package/.claude/skills/components/tabs-core.md +0 -187
  96. package/.vscode/srcdev-component-tab-navigation.code-snippets +0 -30
  97. package/app/components/01.atoms/navigation/tabs/CONSUMER-STYLING.md +0 -120
  98. package/app/components/01.atoms/navigation/tabs/TabsCore.vue +0 -272
  99. package/app/components/01.atoms/navigation/tabs/stories/TabsCore.stories.ts +0 -199
  100. package/app/components/01.atoms/navigation/tabs/tests/TabsCore.spec.ts +0 -274
  101. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +0 -191
  102. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +0 -550
  103. package/app/components/02.molecules/navigation/tab-navigation/stories/TabNavigation.stories.ts +0 -259
  104. package/app/components/02.molecules/navigation/tab-navigation/tests/TabNavigation.spec.ts +0 -379
  105. package/app/components/02.molecules/navigation/tab-navigation/tests/__snapshots__/TabNavigation.spec.ts.snap +0 -33
  106. package/app/composables/useNavCollapse.ts +0 -86
  107. package/app/types/components/nav-item.d.ts +0 -11
@@ -20,25 +20,51 @@ are documented alongside it since that's where they're consumed.
20
20
  | `--responsive-header-padding-block` / `--responsive-header-padding-inline` | `0` | Root element padding. |
21
21
  | `--responsive-header-max-height` | `none` | Root element max-height. |
22
22
  | `--responsive-header-inline-size` | `100%` | Root element inline-size. |
23
- | `--responsive-header-sub-nav-bg` / `-border` / `-border-radius` / `-padding` | `Canvas` / `1px solid #efefef75` / `8px` / `12px` | Top-bar dropdown panel (`.main-navigation-sub-nav`). |
23
+ | `--responsive-header-link-color-hover` | `--responsive-header-link-color` | Top-bar link/summary colour on the hovered item. Unset, an active item keeps its active colour. |
24
+ | `--responsive-header-link-color-active` | `--responsive-header-link-color` | Top-bar link/summary colour on the active item (current route or hash). |
25
+ | `--responsive-header-sub-nav-bg` / `-border` / `-border-radius` / `-padding` | `var(--page-bg, var(--theme-surface-subtle))` / `1px solid color-mix(in oklch, var(--theme-text) 20%, transparent)` / `8px` / `12px` | Top-bar dropdown panel (`.main-navigation-sub-nav`). |
24
26
  | `--responsive-header-sub-nav-max-inline-size` | `min(48rem, calc(100vw - 3.2rem))` | Widest the top-bar dropdown panel gets; long child names wrap inside it. |
25
27
  | `--responsive-header-sub-nav-max-block-size` | `70vh` | Tallest the top-bar dropdown panel gets before it scrolls, so a long child list stays reachable under a sticky header. |
26
- | `--responsive-header-overflow-btn-bg` / `-size` / `-border` / `-outline` / `-icon-color` / `-hover-outline` | `Canvas` / `20px` / `1px solid #ffffff90` / `1px solid #ffffff10` / `inherit` / `1px solid #ffffff` | Overflow burger button. |
27
- | `--responsive-header-overflow-nav-bg` / `-border` / `-border-radius` / `-padding-block` | `Canvas` / `1px solid #ffffff90` / `8px` / `12px` | Overflow panel container. |
28
+ | `--responsive-header-overflow-btn-bg` / `-size` / `-border` / `-outline` / `-icon-color` / `-hover-outline` | `transparent` / `20px` / `1px solid color-mix(in oklch, var(--theme-text) 20%, transparent)` / `1px solid transparent` / `inherit` / `1px solid var(--theme-border-focus)` | Overflow burger button. |
29
+ | `--responsive-header-overflow-nav-bg` / `-border` / `-border-radius` / `-padding-block` | `var(--page-bg, var(--theme-surface-subtle))` / `1px solid color-mix(in oklch, var(--theme-text) 20%, transparent)` / `8px` / `12px` | Overflow panel container. |
28
30
  | `--responsive-header-overflow-nav-max-block-size` | `70vh` | Tallest the overflow panel gets before it scrolls. |
29
- | `--overflow-nav-max-inline-size` | `calc(100vw - 3.2rem)` | Widest the overflow panel's content gets (set on `NavigationItems`); long names wrap inside it. |
31
+ | `--responsive-nav-decorator-indicator-color` | `currentColor` | Active-item indicator bar/underline. |
32
+ | `--responsive-nav-decorator-hovered-indicator-color` | inherits the above | Indicator colour while hovering. |
33
+ | `--responsive-nav-decorator-hovered-bg` | `color-mix(in oklch, var(--theme-text) 8%, transparent)` | Hover highlight background behind the hovered item. |
34
+
35
+ ### Overflow panel content (`NavigationItems`)
36
+
37
+ | Token | Default | Controls |
38
+ |---|---|---|
39
+ | `--overflow-nav-link-color` | `inherit` | Link/summary colour in the overflow panel. |
40
+ | `--overflow-nav-link-color-hover` | `--overflow-nav-link-color` | Colour on the hovered item. Unset, an active item keeps its active colour. |
41
+ | `--overflow-nav-link-color-active` | `--overflow-nav-link-color` | Colour on the active item. |
42
+ | `--overflow-nav-link-border-color` | `color-mix(in oklch, var(--theme-text) 12%, transparent)` | Divider under each row. |
43
+ | `--overflow-nav-sub-item-color` / `--overflow-nav-sub-item-font-size` | `inherit` / `inherit` | Child links inside a group. |
44
+ | `--overflow-nav-decorator-indicator-color` | `currentColor` | Active-row indicator bar. |
45
+ | `--overflow-nav-decorator-hovered-indicator-color` | inherits the above | Indicator colour while hovering. |
46
+ | `--overflow-nav-decorator-hovered-bg` | `color-mix(in oklch, var(--theme-text) 6%, transparent)` | Hover highlight behind a row. |
47
+ | `--overflow-nav-padding-inline` / `--overflow-nav-items-padding-block` / `--overflow-nav-items-gap` | `0.8rem` / `0.8rem` / `0px` | Row spacing. |
48
+ | `--overflow-nav-max-inline-size` | `calc(100vw - 3.2rem)` | Widest the overflow panel's content gets; long names wrap inside it. |
49
+
50
+ Private: `--_link-color` / `--_overflow-link-color` carry the per-state (hover/active) link colour
51
+ from the item to its link and summary. Not public API.
30
52
 
31
53
  Link and dropdown text is never line-clamped: it names where the link goes. Long unbroken names
32
54
  wrap inside the dropdown and overflow panels; in the top bar, an item too wide to fit moves to the
33
55
  overflow menu.
34
56
 
57
+ > **Changed 2026-10-07**: the defaults assumed a dark bar: `Canvas` panel and button backgrounds,
58
+ > translucent white borders (`#ffffff90`, `#efefef75`), a white button outline/hover outline and
59
+ > white-tint hover highlights, all near-invisible on a light header. They now come from the
60
+ > `--theme-*` slots and `--page-bg` (see the tables). A dark header sets these tokens. Also added
61
+ > the `-link-color-hover` / `-link-color-active` tokens (top bar and overflow panel), which
62
+ > TabNavigation had and ResponsiveHeader lacked.
63
+
35
64
  > **Changed 2026-10-05**: the dropdown and overflow panels had no maximum size, so a long child
36
- > name or a long child list ran off-screen. They are now capped by the four tokens above.
65
+ > name or a long child list ran off-screen. They are now capped by the max-size tokens above.
37
66
  > `--_overflow-drop-down-width`, a private token nothing ever set, is gone (`min-width: fit-content`
38
67
  > directly).
39
- | `--responsive-nav-decorator-indicator-color` | `currentColor` | Active-item indicator bar/underline. |
40
- | `--responsive-nav-decorator-hovered-indicator-color` | inherits the above | Indicator colour while hovering. |
41
- | `--responsive-nav-decorator-hovered-bg` | `oklch(100% 0 0 / 8%)` | Hover highlight background behind the hovered item. |
42
68
 
43
69
  ---
44
70
 
@@ -50,8 +76,9 @@ tokens on a scope class matching the one passed via `styleClassPassthrough`:
50
76
  ```css
51
77
  /* assets/styles/setup/07.components/responsive-header.css */
52
78
  .site-header-nav {
53
- --responsive-header-link-color: var(--slate-00);
54
- --responsive-header-bg: #efefef05;
79
+ --responsive-header-link-color: var(--theme-text);
80
+ --responsive-header-link-color-hover: var(--theme-accent);
81
+ --responsive-header-link-color-active: var(--theme-accent);
55
82
  --responsive-header-padding-inline: 1.2rem;
56
83
 
57
84
  /* Fixed, NOT a fluid var(--step-*) token — see the token table above. */
@@ -89,7 +116,7 @@ Set the tokens above on an element you own (a page or section class, or a class
89
116
  `0` during the initial geometry pass and then pops in afterward with nothing to detect it.
90
117
  See `.decorator-icon`/the chevron `.icon` in the component's own `<style>` block for the
91
118
  pattern (`1.35em` square, `flex-shrink: 0`).
92
- - `NavigationItems`' own tokens (`--overflow-nav-*`) are documented in its own skill doc since
119
+ - `NavigationItems`' own tokens (`--overflow-nav-*`) have their own table above since
93
120
  they style the overflow-panel's *content*, distinct from `ResponsiveHeader`'s own tokens
94
121
  above which style the top bar and the overflow *button*/*container*.
95
122
 
@@ -240,13 +240,15 @@ watch(
240
240
  --overflow-nav-items-padding-block (default: 0.8rem)
241
241
 
242
242
  --overflow-nav-link-color (default: inherit)
243
- --overflow-nav-link-border-color (default: #efefef75)
243
+ --overflow-nav-link-color-hover (default: --overflow-nav-link-color)
244
+ --overflow-nav-link-color-active (default: --overflow-nav-link-color)
245
+ --overflow-nav-link-border-color (default: color-mix(in oklch, var(--theme-text) 12%, transparent))
244
246
  --overflow-nav-sub-item-color (default: inherit)
245
247
  --overflow-nav-sub-item-font-size (default: inherit)
246
248
 
247
249
  --overflow-nav-decorator-indicator-color (default: currentColor)
248
250
  --overflow-nav-decorator-hovered-indicator-color (default: inherits --overflow-nav-decorator-indicator-color)
249
- --overflow-nav-decorator-hovered-bg (default: oklch(100% 0 0 / 6%))
251
+ --overflow-nav-decorator-hovered-bg (default: color-mix(in oklch, var(--theme-text) 6%, transparent))
250
252
  ──────────────────────────────────────────────────────────────────────── */
251
253
 
252
254
  --_max-inline-size: var(--overflow-nav-max-inline-size, calc(100vw - 3.2rem));
@@ -276,13 +278,26 @@ watch(
276
278
  display: block;
277
279
  }
278
280
 
281
+ /* Per-state link colour; hover falls back to the item's current state. Unset means the resting colour. */
282
+ &.is-active {
283
+ --_overflow-link-color: var(--overflow-nav-link-color-active);
284
+ }
285
+
286
+ &.is-hovered {
287
+ --_overflow-link-color: var(--overflow-nav-link-color-hover, var(--overflow-nav-link-color-active));
288
+ }
289
+
290
+ &.is-hovered:not(.is-active) {
291
+ --_overflow-link-color: var(--overflow-nav-link-color-hover);
292
+ }
293
+
279
294
  .overflow-navigation-link {
280
295
  text-decoration: none;
281
- color: var(--overflow-nav-link-color, inherit);
296
+ color: var(--_overflow-link-color, var(--overflow-nav-link-color, inherit));
282
297
  padding-block: var(--overflow-nav-items-padding-block, 0.8rem);
283
298
  padding-inline: var(--overflow-nav-padding-inline, 0.8rem);
284
299
  display: flex;
285
- border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, #efefef75);
300
+ border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, color-mix(in oklch, var(--theme-text) 12%, transparent));
286
301
  }
287
302
 
288
303
  .overflow-navigation-details {
@@ -300,8 +315,8 @@ watch(
300
315
  padding-block: var(--overflow-nav-items-padding-block, 0.8rem);
301
316
  padding-inline: var(--overflow-nav-padding-inline, 0.8rem);
302
317
  gap: 1rem;
303
- color: var(--overflow-nav-link-color, inherit);
304
- border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, #efefef75);
318
+ color: var(--_overflow-link-color, var(--overflow-nav-link-color, inherit));
319
+ border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, color-mix(in oklch, var(--theme-text) 12%, transparent));
305
320
 
306
321
  .label-wrapper {
307
322
  min-inline-size: 0;
@@ -316,7 +331,7 @@ watch(
316
331
  border-bottom: 0.1rem solid transparent;
317
332
  }
318
333
  + .expanding-panel-content {
319
- border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, #efefef75);
334
+ border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, color-mix(in oklch, var(--theme-text) 12%, transparent));
320
335
  .overflow-navigation-sub-nav-inner {
321
336
  margin-top: var(--overflow-nav-items-gap, 0px);
322
337
  }
@@ -361,8 +376,8 @@ watch(
361
376
  padding-block: var(--overflow-nav-items-padding-block, 0.8rem);
362
377
  padding-inline: var(--overflow-nav-padding-inline, 0.8rem);
363
378
  gap: 1rem;
364
- color: var(--overflow-nav-link-color, inherit);
365
- border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, #efefef75);
379
+ color: var(--_overflow-link-color, var(--overflow-nav-link-color, inherit));
380
+ border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, color-mix(in oklch, var(--theme-text) 12%, transparent));
366
381
 
367
382
  .label-wrapper {
368
383
  min-inline-size: 0;
@@ -377,7 +392,7 @@ watch(
377
392
  border-bottom: 0.1rem solid transparent;
378
393
  }
379
394
  + .expanding-panel-classic-content {
380
- border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, #efefef75);
395
+ border-bottom: 0.1rem solid var(--overflow-nav-link-border-color, color-mix(in oklch, var(--theme-text) 12%, transparent));
381
396
  .overflow-navigation-sub-nav-inner {
382
397
  margin-top: var(--overflow-nav-items-gap, 0px);
383
398
  }
@@ -486,7 +501,7 @@ watch(
486
501
  right: 0;
487
502
  top: anchor(top);
488
503
  bottom: anchor(bottom);
489
- background: var(--overflow-nav-decorator-hovered-bg, oklch(100% 0 0 / 6%));
504
+ background: var(--overflow-nav-decorator-hovered-bg, color-mix(in oklch, var(--theme-text) 6%, transparent));
490
505
  z-index: 1;
491
506
  opacity: 0;
492
507
  transition:
@@ -552,7 +567,7 @@ watch(
552
567
  right: 0;
553
568
  top: anchor(top);
554
569
  bottom: anchor(bottom);
555
- background: var(--overflow-nav-decorator-hovered-bg, oklch(100% 0 0 / 6%));
570
+ background: var(--overflow-nav-decorator-hovered-bg, color-mix(in oklch, var(--theme-text) 6%, transparent));
556
571
  border-inline-start: 2px solid var(
557
572
  --overflow-nav-decorator-hovered-indicator-color,
558
573
  var(--overflow-nav-decorator-indicator-color, currentColor)
@@ -751,30 +751,32 @@ watch(
751
751
 
752
752
  --responsive-header-color (default: inherit)
753
753
  --responsive-header-link-color (default: inherit)
754
+ --responsive-header-link-color-hover (default: --responsive-header-link-color)
755
+ --responsive-header-link-color-active (default: --responsive-header-link-color)
754
756
 
755
- --responsive-header-sub-nav-bg (default: Canvas)
756
- --responsive-header-sub-nav-border (default: 1px solid #efefef75)
757
+ --responsive-header-sub-nav-bg (default: var(--page-bg, var(--theme-surface-subtle)))
758
+ --responsive-header-sub-nav-border (default: 1px solid color-mix(in oklch, var(--theme-text) 20%, transparent))
757
759
  --responsive-header-sub-nav-border-radius (default: 8px)
758
760
  --responsive-header-sub-nav-padding (default: 12px)
759
761
  --responsive-header-sub-nav-max-inline-size (default: min(48rem, calc(100vw - 3.2rem)))
760
762
  --responsive-header-sub-nav-max-block-size (default: 70vh)
761
763
 
762
- --responsive-header-overflow-btn-bg (default: Canvas)
764
+ --responsive-header-overflow-btn-bg (default: transparent)
763
765
  --responsive-header-overflow-btn-size (default: 20px)
764
- --responsive-header-overflow-btn-border (default: 1px solid #ffffff90)
765
- --responsive-header-overflow-btn-outline (default: 1px solid #ffffff10)
766
+ --responsive-header-overflow-btn-border (default: 1px solid color-mix(in oklch, var(--theme-text) 20%, transparent))
767
+ --responsive-header-overflow-btn-outline (default: 1px solid transparent)
766
768
  --responsive-header-overflow-btn-icon-color (default: inherit)
767
- --responsive-header-overflow-btn-hover-outline (default: 1px solid #ffffff)
769
+ --responsive-header-overflow-btn-hover-outline (default: 1px solid var(--theme-border-focus))
768
770
 
769
- --responsive-header-overflow-nav-bg (default: Canvas)
770
- --responsive-header-overflow-nav-border (default: 1px solid #ffffff90)
771
+ --responsive-header-overflow-nav-bg (default: var(--page-bg, var(--theme-surface-subtle)))
772
+ --responsive-header-overflow-nav-border (default: 1px solid color-mix(in oklch, var(--theme-text) 20%, transparent))
771
773
  --responsive-header-overflow-nav-border-radius (default: 8px)
772
774
  --responsive-header-overflow-nav-padding-block (default: 12px)
773
775
  --responsive-header-overflow-nav-max-block-size (default: 70vh)
774
776
 
775
777
  --responsive-nav-decorator-indicator-color (default: currentColor)
776
778
  --responsive-nav-decorator-hovered-indicator-color (default: inherits --responsive-nav-decorator-indicator-color)
777
- --responsive-nav-decorator-hovered-bg (default: oklch(100% 0 0 / 8%))
779
+ --responsive-nav-decorator-hovered-bg (default: color-mix(in oklch, var(--theme-text) 8%, transparent))
778
780
 
779
781
  --responsive-header-link-font-size (default: inherit)
780
782
  --responsive-header-main-nav-justify-content (default: space-between)
@@ -854,7 +856,7 @@ watch(
854
856
  gap: 6px;
855
857
  white-space: nowrap;
856
858
  font-size: var(--responsive-header-link-font-size, inherit);
857
- color: var(--responsive-header-link-color, inherit);
859
+ color: var(--_link-color, var(--responsive-header-link-color, inherit));
858
860
  text-decoration: none;
859
861
  cursor: pointer;
860
862
  margin-inline-start: 0;
@@ -916,7 +918,7 @@ watch(
916
918
  position: relative;
917
919
  z-index: 4;
918
920
  font-size: var(--responsive-header-link-font-size, inherit);
919
- color: var(--responsive-header-link-color, inherit);
921
+ color: var(--_link-color, var(--responsive-header-link-color, inherit));
920
922
 
921
923
  &::-webkit-details-marker,
922
924
  &::marker {
@@ -932,9 +934,9 @@ watch(
932
934
  position: absolute;
933
935
 
934
936
  padding: var(--responsive-header-sub-nav-padding, 12px);
935
- border: var(--responsive-header-sub-nav-border, 1px solid #efefef75);
937
+ border: var(--responsive-header-sub-nav-border, 1px solid color-mix(in oklch, var(--theme-text) 20%, transparent));
936
938
  border-radius: var(--responsive-header-sub-nav-border-radius, 8px);
937
- background-color: var(--responsive-header-sub-nav-bg, Canvas);
939
+ background-color: var(--responsive-header-sub-nav-bg, var(--page-bg, var(--theme-surface-subtle)));
938
940
  translate: 0 12px;
939
941
 
940
942
  min-width: var(--_main-navigation-item-width);
@@ -980,6 +982,19 @@ watch(
980
982
  margin-inline-start: var(--_main-navigation-item-width);
981
983
  }
982
984
  }
985
+
986
+ /* Per-state link colour; hover falls back to the item's current state. Unset means the resting colour. */
987
+ &.is-active {
988
+ --_link-color: var(--responsive-header-link-color-active);
989
+ }
990
+
991
+ &.is-hovered {
992
+ --_link-color: var(--responsive-header-link-color-hover, var(--responsive-header-link-color-active));
993
+ }
994
+
995
+ &.is-hovered:not(.is-active) {
996
+ --_link-color: var(--responsive-header-link-color-hover);
997
+ }
983
998
  }
984
999
 
985
1000
  &:last-child {
@@ -1071,9 +1086,9 @@ watch(
1071
1086
 
1072
1087
  aspect-ratio: 1;
1073
1088
  border-radius: 4px;
1074
- border: var(--responsive-header-overflow-btn-border, 1px solid #ffffff90);
1075
- outline: var(--responsive-header-overflow-btn-outline, 1px solid #ffffff10);
1076
- background-color: var(--responsive-header-overflow-btn-bg, Canvas);
1089
+ border: var(--responsive-header-overflow-btn-border, 1px solid color-mix(in oklch, var(--theme-text) 20%, transparent));
1090
+ outline: var(--responsive-header-overflow-btn-outline, 1px solid transparent);
1091
+ background-color: var(--responsive-header-overflow-btn-bg, transparent);
1077
1092
 
1078
1093
  width: var(--_icon-size);
1079
1094
  overflow: hidden;
@@ -1089,7 +1104,7 @@ watch(
1089
1104
  &:hover,
1090
1105
  &:focus-visible {
1091
1106
  --_icon-zoom: 1.2;
1092
- outline: var(--responsive-header-overflow-btn-hover-outline, 1px solid #ffffff);
1107
+ outline: var(--responsive-header-overflow-btn-hover-outline, 1px solid var(--theme-border-focus));
1093
1108
  }
1094
1109
 
1095
1110
  .icon {
@@ -1115,8 +1130,8 @@ watch(
1115
1130
  position: absolute;
1116
1131
  top: 135%;
1117
1132
  right: 0;
1118
- background-color: var(--responsive-header-overflow-nav-bg, Canvas);
1119
- border: var(--responsive-header-overflow-nav-border, 1px solid #ffffff90);
1133
+ background-color: var(--responsive-header-overflow-nav-bg, var(--page-bg, var(--theme-surface-subtle)));
1134
+ border: var(--responsive-header-overflow-nav-border, 1px solid color-mix(in oklch, var(--theme-text) 20%, transparent));
1120
1135
  border-radius: var(--responsive-header-overflow-nav-border-radius, 8px);
1121
1136
  padding-block: var(--responsive-header-overflow-nav-padding-block, 12px);
1122
1137
  margin: 0;
@@ -1172,7 +1187,7 @@ watch(
1172
1187
  right: anchor(right);
1173
1188
  top: anchor(top);
1174
1189
  bottom: anchor(bottom);
1175
- background: var(--responsive-nav-decorator-hovered-bg, oklch(100% 0 0 / 8%));
1190
+ background: var(--responsive-nav-decorator-hovered-bg, color-mix(in oklch, var(--theme-text) 8%, transparent));
1176
1191
  border-radius: 4px;
1177
1192
  z-index: 1;
1178
1193
  opacity: 0;
@@ -246,7 +246,7 @@ export const SamePageAnchorLinks: Story = {
246
246
  "smooth-scroll to the section (an instant jump under reduced motion), and are active by hash rather than by " +
247
247
  "route; the first anchor is active on load. `anchorScrollOffset` (80 here) leaves room for the sticky header. " +
248
248
  "Route links like Blog mix in as normal. Narrow the canvas so items move into the overflow menu: anchor links " +
249
- "there scroll the same way and close the menu. This replaces TabNavigation's anchor mode.",
249
+ "there scroll the same way and close the menu.",
250
250
  },
251
251
  },
252
252
  },
@@ -21,7 +21,7 @@ exports[`ServiceDetail > renders correct HTML structure 1`] = `
21
21
  <h1 id="v-0-0" class="hero-text display axis-horizontal">
22
22
  <!--v-if--><span class="text-block-0 normal">Balayage</span>
23
23
  </h1>
24
- <div class="service-detail__hero-pills"><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">2.5 - 3.5 hours</span></span><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">From £95</span></span></div>
24
+ <div class="service-detail__hero-pills"><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">2.5 - 3.5 hours</span></span><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">From £95</span></span></div>
25
25
  </div>
26
26
  </div>
27
27
  </div>
@@ -9,7 +9,7 @@ exports[`ServiceSummary > renders correct HTML structure 1`] = `
9
9
  <h2 id="v-0-0" class="hero-text mb-20 title axis-horizontal">
10
10
  <!--v-if--><span class="text-block-0 normal">Test Service</span>
11
11
  </h2>
12
- <div class="service-summary__pills"><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
12
+ <div class="service-summary__pills"><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
13
13
  <p class="page-body-normal">What this service is</p>
14
14
  </div>
15
15
  </div>
@@ -10,7 +10,7 @@ exports[`ServiceSummaryGrid > renders correct HTML structure 1`] = `
10
10
  <h2 id="v-0-0-0" class="hero-text mb-20 title axis-horizontal">
11
11
  <!--v-if--><span class="text-block-0 normal">Locs Installation</span>
12
12
  </h2>
13
- <div class="service-summary__pills"><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
13
+ <div class="service-summary__pills"><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
14
14
  <p class="page-body-normal">What this service is.</p>
15
15
  </div>
16
16
  </div>
@@ -23,7 +23,7 @@ exports[`ServiceSummaryGrid > renders correct HTML structure 1`] = `
23
23
  <h2 id="v-0-0-1" class="hero-text mb-20 title axis-horizontal">
24
24
  <!--v-if--><span class="text-block-0 normal">Locs Retwist</span>
25
25
  </h2>
26
- <div class="service-summary__pills"><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
26
+ <div class="service-summary__pills"><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
27
27
  <p class="page-body-normal">What this service is.</p>
28
28
  </div>
29
29
  </div>
@@ -36,7 +36,7 @@ exports[`ServiceSummaryGrid > renders correct HTML structure 1`] = `
36
36
  <h2 id="v-0-0-2" class="hero-text mb-20 title axis-horizontal">
37
37
  <!--v-if--><span class="text-block-0 normal">Colour Treatment</span>
38
38
  </h2>
39
- <div class="service-summary__pills"><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill md neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
39
+ <div class="service-summary__pills"><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">60 mins</span></span><span class="display-pill" data-size="md" data-variant="neutral"><!--v-if--><span class="display-pill-label">From £50</span></span></div>
40
40
  <p class="page-body-normal">What this service is.</p>
41
41
  </div>
42
42
  </div>