srcdev-nuxt-components 9.4.12 → 9.5.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.
Files changed (622) hide show
  1. package/.claude/skills/component-aria-landmark.md +1 -1
  2. package/.claude/skills/component-dynamic-slots.md +0 -1
  3. package/.claude/skills/component-export-types.md +3 -3
  4. package/.claude/skills/component-inline-action-button.md +7 -7
  5. package/.claude/skills/component-local-style-override.md +134 -50
  6. package/.claude/skills/component-naming.md +107 -0
  7. package/.claude/skills/components/action-menu.md +18 -14
  8. package/.claude/skills/components/alert-content.md +110 -0
  9. package/.claude/skills/components/alert-mask-core.md +15 -1
  10. package/.claude/skills/components/alert-masked-content.md +95 -0
  11. package/.claude/skills/components/auto-grid.md +21 -13
  12. package/.claude/skills/components/canvas-switcher.md +3 -3
  13. package/.claude/skills/components/capture-qr-code.md +19 -9
  14. package/.claude/skills/components/carousel-flip.md +3 -3
  15. package/.claude/skills/components/container-glow.md +2 -2
  16. package/.claude/skills/components/content-docs.md +9 -5
  17. package/.claude/skills/components/cookie-consent-banner.md +16 -17
  18. package/.claude/skills/components/dashboard-quad-grid.md +4 -4
  19. package/.claude/skills/components/decode-qr-code.md +15 -9
  20. package/.claude/skills/components/display-avatar.md +16 -31
  21. package/.claude/skills/components/display-chip.md +15 -10
  22. package/.claude/skills/components/display-dialog.md +3 -1
  23. package/.claude/skills/components/display-pill.md +17 -75
  24. package/.claude/skills/components/display-prompt.md +11 -19
  25. package/.claude/skills/components/display-qr-code.md +5 -0
  26. package/.claude/skills/components/display-theme-switch.md +7 -6
  27. package/.claude/skills/components/display-toast.md +5 -6
  28. package/.claude/skills/components/entry-animation.md +2 -5
  29. package/.claude/skills/components/eyebrow-text.md +6 -4
  30. package/.claude/skills/components/form-field.md +79 -0
  31. package/.claude/skills/components/form-fieldset.md +75 -0
  32. package/.claude/skills/components/form-wrapper.md +71 -0
  33. package/.claude/skills/components/glass-panel.md +60 -51
  34. package/.claude/skills/components/grid-stack.md +8 -2
  35. package/.claude/skills/components/header-block.md +1 -1
  36. package/.claude/skills/components/hero-text.md +8 -6
  37. package/.claude/skills/components/input-button.md +72 -0
  38. package/.claude/skills/components/input-checkbox-radio.md +149 -0
  39. package/.claude/skills/components/input-checkbox.md +148 -0
  40. package/.claude/skills/components/input-description.md +102 -0
  41. package/.claude/skills/components/input-error.md +105 -0
  42. package/.claude/skills/components/input-label.md +119 -0
  43. package/.claude/skills/components/{input-number-core.md → input-number.md} +41 -36
  44. package/.claude/skills/components/input-radio.md +95 -0
  45. package/.claude/skills/components/input-range-core.md +4 -4
  46. package/.claude/skills/components/input-select-core.md +1 -1
  47. package/.claude/skills/components/input-text-core.md +8 -6
  48. package/.claude/skills/components/input-textarea-core.md +4 -4
  49. package/.claude/skills/components/layout-grid-by-cols.md +31 -43
  50. package/.claude/skills/components/link-text.md +2 -2
  51. package/.claude/skills/components/opening-hours.md +116 -0
  52. package/.claude/skills/components/page-hero-highlights.md +35 -35
  53. package/.claude/skills/components/page-row.md +1 -1
  54. package/.claude/skills/components/pending-effect.md +63 -0
  55. package/.claude/skills/components/price-list.md +72 -0
  56. package/.claude/skills/components/pricing-card.md +3 -3
  57. package/.claude/skills/components/profile-section.md +6 -4
  58. package/.claude/skills/components/samaritan-prompt.md +140 -0
  59. package/.claude/skills/components/scroll-reveal-frame.md +21 -20
  60. package/.claude/skills/components/scroll-reveal-image.md +31 -21
  61. package/.claude/skills/components/service-detail.md +2 -2
  62. package/.claude/skills/components/services-card-grid.md +5 -4
  63. package/.claude/skills/components/services-card.md +12 -10
  64. package/.claude/skills/components/site-navigation.md +20 -6
  65. package/.claude/skills/components/slider-gallery.md +88 -0
  66. package/.claude/skills/components/social-icons-list.md +12 -6
  67. package/.claude/skills/components/tab-navigation.md +1 -1
  68. package/.claude/skills/components/text-block.md +68 -0
  69. package/.claude/skills/components/toggle-switch-core.md +3 -3
  70. package/.claude/skills/components/triple-toggle-switch.md +85 -0
  71. package/.claude/skills/composable-zod-validation.md +1 -1
  72. package/.claude/skills/consumer-styles-structure.md +153 -0
  73. package/.claude/skills/icon-sets.md +3 -3
  74. package/.claude/skills/icon-sizing.md +66 -0
  75. package/.claude/skills/index.md +35 -16
  76. package/.claude/skills/new-app-scaffold.md +45 -7
  77. package/.claude/skills/pull-request-description.md +1 -0
  78. package/.claude/skills/storybook-add-story.md +53 -5
  79. package/.claude/skills/testing-add-playwright.md +1 -1
  80. package/.claude/skills/theming-colour-ramps.md +25 -3
  81. package/.claude/skills/theming-component-token-pattern.md +16 -16
  82. package/.claude/skills/theming-override-default.md +7 -0
  83. package/.claude/skills/theming-partial-override.md +1 -1
  84. package/.claude/skills/theming-typography-tokens.md +1 -1
  85. package/.claude/skills/vercel-node-version.md +1 -1
  86. package/.vscode/srcdev-component-action-menu.code-snippets +42 -0
  87. package/.vscode/srcdev-component-alert-content.code-snippets +36 -0
  88. package/.vscode/srcdev-component-alert-masked-content.code-snippets +35 -0
  89. package/.vscode/srcdev-component-auto-grid.code-snippets +39 -0
  90. package/.vscode/srcdev-component-capture-decode-qr-code.code-snippets +28 -0
  91. package/.vscode/srcdev-component-content-docs.code-snippets +4 -4
  92. package/.vscode/srcdev-component-cookie-consent-banner.code-snippets +33 -0
  93. package/.vscode/srcdev-component-display-avatar.code-snippets +28 -0
  94. package/.vscode/srcdev-component-display-chip.code-snippets +27 -0
  95. package/.vscode/srcdev-component-display-pill.code-snippets +38 -0
  96. package/.vscode/srcdev-component-display-prompt.code-snippets +10 -54
  97. package/.vscode/srcdev-component-display-qr-code.code-snippets +22 -0
  98. package/.vscode/srcdev-component-eyebrow-text.code-snippets +19 -0
  99. package/.vscode/srcdev-component-form-field.code-snippets +25 -0
  100. package/.vscode/srcdev-component-form-fieldset.code-snippets +36 -0
  101. package/.vscode/srcdev-component-form-wrapper.code-snippets +30 -0
  102. package/.vscode/srcdev-component-glass-panel.code-snippets +38 -0
  103. package/.vscode/srcdev-component-grid-stack.code-snippets +49 -0
  104. package/.vscode/srcdev-component-input-button.code-snippets +27 -0
  105. package/.vscode/srcdev-component-input-checkbox-radio.code-snippets +60 -0
  106. package/.vscode/srcdev-component-input-checkbox.code-snippets +48 -0
  107. package/.vscode/srcdev-component-input-description.code-snippets +44 -0
  108. package/.vscode/srcdev-component-input-error.code-snippets +30 -0
  109. package/.vscode/srcdev-component-input-label.code-snippets +39 -0
  110. package/.vscode/srcdev-component-input-number.code-snippets +11 -11
  111. package/.vscode/srcdev-component-input-radio.code-snippets +58 -0
  112. package/.vscode/srcdev-component-layout-grid-by-cols.code-snippets +46 -0
  113. package/.vscode/srcdev-component-link-text.code-snippets +30 -0
  114. package/.vscode/srcdev-component-opening-hours.code-snippets +40 -0
  115. package/.vscode/srcdev-component-page-hero-highlights.code-snippets +37 -0
  116. package/.vscode/srcdev-component-page-row.code-snippets +47 -0
  117. package/.vscode/srcdev-component-pending-effect.code-snippets +26 -0
  118. package/.vscode/srcdev-component-price-list.code-snippets +37 -0
  119. package/.vscode/srcdev-component-pricing-card.code-snippets +2 -2
  120. package/.vscode/srcdev-component-profile-section.code-snippets +36 -0
  121. package/.vscode/srcdev-component-samaritan-prompt.code-snippets +60 -0
  122. package/.vscode/srcdev-component-scroll-reveal-frame.code-snippets +36 -0
  123. package/.vscode/srcdev-component-scroll-reveal-image.code-snippets +46 -0
  124. package/.vscode/srcdev-component-services-card.code-snippets +4 -4
  125. package/.vscode/srcdev-component-services-grids.code-snippets +36 -0
  126. package/.vscode/srcdev-component-site-navigation.code-snippets +26 -18
  127. package/.vscode/srcdev-component-slider-gallery.code-snippets +9 -0
  128. package/.vscode/srcdev-component-social-icons-list.code-snippets +24 -0
  129. package/.vscode/srcdev-component-stepper-list.code-snippets +39 -0
  130. package/.vscode/srcdev-component-text-block.code-snippets +31 -0
  131. package/.vscode/srcdev-component-triple-toggle-switch.code-snippets +30 -0
  132. package/README.md +2 -2
  133. package/app/app.config.ts +10 -0
  134. package/app/assets/styles/setup/02.colours/_orange.css +11 -11
  135. package/app/assets/styles/setup/02.colours/_theme-params.css +2 -2
  136. package/app/assets/styles/setup/03.theming/_default.css +1 -22
  137. package/app/assets/styles/setup/03.theming/_theme-slots.css +1 -1
  138. package/app/assets/styles/setup/03.theming/_warning.css +8 -10
  139. package/app/assets/styles/setup/04.elements/forms/02.typography.css +0 -14
  140. package/app/assets/styles/setup/04.elements/forms/06.button-geometry.css +1 -1
  141. package/app/assets/styles/setup/index.css +1 -1
  142. package/app/components/01.atoms/alert-mask/AlertMaskCore.vue +23 -5
  143. package/app/components/01.atoms/alert-mask/CONSUMER-STYLING.md +23 -5
  144. package/app/components/01.atoms/alert-mask/stories/AlertMaskCore.stories.ts +45 -19
  145. package/app/components/01.atoms/alert-mask/tests/AlertMaskCore.spec.ts +35 -1
  146. package/app/components/01.atoms/animations/animated-svg-text/CONSUMER-STYLING.md +13 -0
  147. package/app/components/01.atoms/animations/clip-element/CONSUMER-STYLING.md +13 -0
  148. package/app/components/01.atoms/animations/clip-element/ClipElement.vue +2 -2
  149. package/app/components/01.atoms/animations/container-glow/CONSUMER-STYLING.md +26 -5
  150. package/app/components/01.atoms/animations/entry/.nuxt/app.config.mjs +21 -0
  151. package/app/components/01.atoms/animations/entry/.nuxt/components.d.ts +66 -0
  152. package/app/components/01.atoms/animations/entry/.nuxt/imports.d.ts +30 -0
  153. package/app/components/01.atoms/animations/entry/.nuxt/manifest/meta/test.json +1 -0
  154. package/app/components/01.atoms/animations/entry/.nuxt/types/app.config.d.ts +35 -0
  155. package/app/components/01.atoms/animations/entry/.nuxt/types/build.d.ts +23 -0
  156. package/app/components/01.atoms/animations/entry/.nuxt/types/builder-env.d.ts +1 -0
  157. package/app/components/01.atoms/animations/entry/.nuxt/types/components.d.ts +71 -0
  158. package/app/components/01.atoms/animations/entry/.nuxt/types/imports.d.ts +386 -0
  159. package/app/components/01.atoms/animations/entry/.nuxt/types/middleware.d.ts +11 -0
  160. package/app/components/01.atoms/animations/entry/.nuxt/types/modules.d.ts +79 -0
  161. package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-layouts.d.ts +17 -0
  162. package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-nuxt.d.ts +64 -0
  163. package/app/components/01.atoms/animations/entry/.nuxt/types/plugins.d.ts +29 -0
  164. package/app/components/01.atoms/animations/entry/.nuxt/types/runtime-config.d.ts +32 -0
  165. package/app/components/01.atoms/animations/entry/.nuxt/types/shared-imports.d.ts +10 -0
  166. package/app/components/01.atoms/animations/entry/.nuxt/types/vue-shim.d.ts +0 -0
  167. package/app/components/01.atoms/animations/entry/.nuxtrc +1 -0
  168. package/app/components/01.atoms/animations/entry/CONSUMER-STYLING.md +65 -0
  169. package/app/components/01.atoms/animations/entry/EntryAnimation.vue +6 -5
  170. package/app/components/01.atoms/animations/entry/node_modules/.cache/nuxt/chrome-workspace.json +1 -0
  171. package/app/components/01.atoms/animations/entry/node_modules/.cache/vite/client/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  172. package/app/components/01.atoms/animations/entry/stories/EntryAnimation.stories.ts +1 -1
  173. package/app/components/01.atoms/animations/entry/tests/EntryAnimation.spec.ts +25 -0
  174. package/app/components/01.atoms/animations/glowing-border/CONSUMER-STYLING.md +24 -5
  175. package/app/components/01.atoms/animations/marquee-scroller/CONSUMER-STYLING.md +20 -0
  176. package/app/components/01.atoms/animations/rotating-carousel-image/CONSUMER-STYLING.md +17 -0
  177. package/app/components/01.atoms/animations/scroll-reveal-frame/CONSUMER-STYLING.md +77 -0
  178. package/app/components/01.atoms/animations/scroll-reveal-frame/ScrollRevealFrame.vue +37 -78
  179. package/app/components/01.atoms/animations/scroll-reveal-frame/stories/ScrollRevealFrame.stories.ts +48 -0
  180. package/app/components/01.atoms/animations/scroll-reveal-frame/tests/ScrollRevealFrame.spec.ts +40 -33
  181. package/app/components/01.atoms/animations/scroll-reveal-frame/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +4 -4
  182. package/app/components/01.atoms/animations/scroll-reveal-image/CONSUMER-STYLING.md +74 -0
  183. package/app/components/01.atoms/animations/scroll-reveal-image/ScrollRevealImage.vue +14 -44
  184. package/app/components/01.atoms/animations/scroll-reveal-image/stories/ScrollRevealImage.stories.ts +50 -1
  185. package/app/components/01.atoms/animations/scroll-reveal-image/tests/ScrollRevealImage.spec.ts +27 -20
  186. package/app/components/01.atoms/animations/scroll-reveal-image/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +4 -4
  187. package/app/components/01.atoms/animations/section-parallax/CONSUMER-STYLING.md +21 -4
  188. package/app/components/01.atoms/animations/view-timeline/CONSUMER-STYLING.md +25 -0
  189. package/app/components/01.atoms/banner-video/CONSUMER-STYLING.md +12 -5
  190. package/app/components/01.atoms/canvas-switcher/CONSUMER-STYLING.md +20 -7
  191. package/app/components/01.atoms/canvas-switcher/CanvasSwitcher.vue +12 -7
  192. package/app/components/01.atoms/card/CONSUMER-STYLING.md +47 -42
  193. package/app/components/01.atoms/card/CardCore.vue +7 -17
  194. package/app/components/01.atoms/clipped-panel/CONSUMER-STYLING.md +13 -0
  195. package/app/components/01.atoms/content-wrappers/docs-pages/CONSUMER-STYLING.md +127 -0
  196. package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +44 -77
  197. package/app/components/01.atoms/content-wrappers/docs-pages/stories/ContentDocs.stories.ts +3 -3
  198. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/CONSUMER-STYLING.md +14 -1
  199. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/stories/DashboardQuadGrid.stories.ts +2 -0
  200. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/CONSUMER-STYLING.md +13 -0
  201. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/stories/DashboardStatsGrid.stories.ts +2 -0
  202. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/CONSUMER-STYLING.md +72 -0
  203. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/LayoutGridByCols.vue +26 -25
  204. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/stories/LayoutGridByCols.stories.ts +91 -107
  205. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/LayoutGridByCols.spec.ts +50 -15
  206. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +5 -5
  207. package/app/components/01.atoms/display-banner/CONSUMER-STYLING.md +13 -0
  208. package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +82 -54
  209. package/app/components/01.atoms/display-dialog/DisplayDialog.vue +38 -45
  210. package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +25 -0
  211. package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +21 -0
  212. package/app/components/01.atoms/display-pill/CONSUMER-STYLING.md +112 -0
  213. package/app/components/01.atoms/display-pill/DisplayPill.vue +88 -50
  214. package/app/components/01.atoms/display-pill/stories/DisplayPill.stories.ts +56 -3
  215. package/app/components/01.atoms/display-pill/tests/DisplayPill.spec.ts +104 -4
  216. package/app/components/01.atoms/display-pill/tests/__snapshots__/DisplayPill.spec.ts.snap +3 -3
  217. package/app/components/01.atoms/display-tooltip/CONSUMER-STYLING.md +22 -2
  218. package/app/components/01.atoms/display-tooltip/DisplayTooltip.vue +18 -26
  219. package/app/components/01.atoms/glass-panel/CONSUMER-STYLING.md +91 -0
  220. package/app/components/01.atoms/glass-panel/GlassPanel.vue +34 -30
  221. package/app/components/01.atoms/glass-panel/stories/GlassPanel.stories.ts +121 -0
  222. package/app/components/01.atoms/glass-panel/tests/GlassPanel.spec.ts +61 -0
  223. package/app/components/01.atoms/grids/auto-grid/AutoGrid.vue +5 -10
  224. package/app/components/01.atoms/grids/auto-grid/CONSUMER-STYLING.md +76 -0
  225. package/app/components/01.atoms/grids/auto-grid/stories/AutoGrid.stories.ts +5 -4
  226. package/app/components/01.atoms/grids/auto-grid/tests/AutoGrid.spec.ts +8 -0
  227. package/app/components/01.atoms/grids/column-flow-grid/CONSUMER-STYLING.md +11 -2
  228. package/app/components/01.atoms/grids/grid-stack/CONSUMER-STYLING.md +76 -0
  229. package/app/components/01.atoms/grids/grid-stack/GridStack.vue +6 -1
  230. package/app/components/01.atoms/grids/grid-stack/stories/GridStack.stories.ts +1 -1
  231. package/app/components/01.atoms/grids/grid-stack/tests/GridStack.spec.ts +35 -0
  232. package/app/components/01.atoms/grids/masonry-grid/CONSUMER-STYLING.md +11 -2
  233. package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +5 -10
  234. package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +15 -0
  235. package/app/components/01.atoms/navigation/skip-links/CONSUMER-STYLING.md +13 -0
  236. package/app/components/01.atoms/navigation/tabs/CONSUMER-STYLING.md +21 -0
  237. package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +46 -8
  238. package/app/components/01.atoms/page-row/PageRow.vue +17 -13
  239. package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +8 -0
  240. package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +7 -11
  241. package/app/components/01.atoms/pop-over/CONSUMER-STYLING.md +13 -0
  242. package/app/components/01.atoms/qr-code/CONSUMER-STYLING.md +48 -0
  243. package/app/components/01.atoms/qr-code/DisplayQrCode.vue +5 -1
  244. package/app/components/01.atoms/qr-code/stories/DisplayQrCode.stories.ts +11 -3
  245. package/app/components/01.atoms/qr-code/tests/DisplayQrCode.spec.ts +15 -0
  246. package/app/components/01.atoms/text-block/CONSUMER-STYLING.md +49 -0
  247. package/app/components/01.atoms/text-block/TextBlock.vue +13 -5
  248. package/app/components/01.atoms/text-block/stories/TextBlock.stories.ts +84 -0
  249. package/app/components/01.atoms/text-block/tests/TextBlock.spec.ts +78 -0
  250. package/app/components/01.atoms/text-block/tests/__snapshots__/TextBlock.spec.ts.snap +7 -0
  251. package/app/components/01.atoms/text-blocks/eyebrow-text/CONSUMER-STYLING.md +56 -0
  252. package/app/components/01.atoms/text-blocks/eyebrow-text/EyebrowText.vue +10 -5
  253. package/app/components/01.atoms/text-blocks/eyebrow-text/tests/EyebrowText.spec.ts +11 -0
  254. package/app/components/01.atoms/text-blocks/header-block/CONSUMER-STYLING.md +16 -1
  255. package/app/components/01.atoms/text-blocks/hero-text/CONSUMER-STYLING.md +74 -0
  256. package/app/components/01.atoms/text-blocks/hero-text/HeroText.vue +14 -9
  257. package/app/components/01.atoms/text-blocks/hero-text/tests/HeroText.spec.ts +11 -0
  258. package/app/components/01.atoms/text-blocks/link-text/CONSUMER-STYLING.md +45 -0
  259. package/app/components/01.atoms/text-blocks/link-text/LinkText.vue +15 -8
  260. package/app/components/01.atoms/text-blocks/link-text/tests/LinkText.spec.ts +11 -0
  261. package/app/components/01.atoms/ui-block-decorated/CONSUMER-STYLING.md +13 -0
  262. package/app/components/02.molecules/action-menu/ActionMenu.vue +28 -30
  263. package/app/components/02.molecules/action-menu/{ActionMenuItemCore.vue → ActionMenuItem.vue} +12 -14
  264. package/app/components/02.molecules/action-menu/CONSUMER-STYLING.md +90 -76
  265. package/app/components/02.molecules/action-menu/stories/ActionMenu.stories.ts +48 -41
  266. package/app/components/02.molecules/action-menu/tests/ActionMenu.spec.ts +46 -1
  267. package/app/components/02.molecules/action-menu/tests/{ActionMenuItemCore.spec.ts → ActionMenuItem.spec.ts} +11 -5
  268. package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItem.spec.ts.snap +27 -0
  269. package/app/components/02.molecules/alert-content/AlertContent.vue +17 -8
  270. package/app/components/02.molecules/alert-content/AlertContentInner.vue +57 -30
  271. package/app/components/02.molecules/alert-content/CONSUMER-STYLING.md +84 -0
  272. package/app/components/02.molecules/alert-content/stories/AlertContent.stories.ts +39 -0
  273. package/app/components/02.molecules/alert-content/tests/AlertContent.spec.ts +32 -0
  274. package/app/components/02.molecules/alert-content/tests/AlertContentInner.spec.ts +32 -0
  275. package/app/components/02.molecules/alert-masked-content/AlertMaskedContent.vue +9 -5
  276. package/app/components/02.molecules/alert-masked-content/CONSUMER-STYLING.md +73 -0
  277. package/app/components/02.molecules/alert-masked-content/stories/AlertMaskedContent.stories.ts +91 -10
  278. package/app/components/02.molecules/alert-masked-content/tests/AlertMaskedContent.spec.ts +52 -0
  279. package/app/components/02.molecules/cookie-consent-banner/CONSUMER-STYLING.md +95 -0
  280. package/app/components/02.molecules/cookie-consent-banner/CookieConsentBanner.vue +149 -0
  281. package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/stories/CookieConsentBanner.stories.ts +22 -3
  282. package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/tests/CookieConsentBanner.spec.ts +81 -4
  283. package/app/components/02.molecules/display-avatar/CONSUMER-STYLING.md +63 -0
  284. package/app/components/02.molecules/display-avatar/DisplayAvatar.vue +120 -0
  285. package/app/components/{01.atoms → 02.molecules}/display-avatar/stories/DisplayAvatar.stories.ts +56 -14
  286. package/app/components/{01.atoms → 02.molecules}/display-avatar/tests/DisplayAvatar.spec.ts +43 -11
  287. package/app/components/02.molecules/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +11 -0
  288. package/app/components/02.molecules/display-chip/CONSUMER-STYLING.md +57 -0
  289. package/app/components/02.molecules/display-chip/DisplayChip.vue +50 -83
  290. package/app/components/02.molecules/display-chip/tests/DisplayChip.spec.ts +10 -10
  291. package/app/components/02.molecules/display-chip/tests/__snapshots__/DisplayChip.spec.ts.snap +4 -4
  292. package/app/components/02.molecules/display-theme-switch/CONSUMER-STYLING.md +25 -4
  293. package/app/components/02.molecules/display-theme-switch/DisplayThemeSwitch.vue +9 -6
  294. package/app/components/02.molecules/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +6 -1
  295. package/app/components/02.molecules/display-theme-switch/tests/DisplayThemeSwitch.spec.ts +10 -1
  296. package/app/components/02.molecules/display-tooltip-defined/CONSUMER-STYLING.md +11 -0
  297. package/app/components/02.molecules/expandable/accordian/CONSUMER-STYLING.md +11 -4
  298. package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +12 -5
  299. package/app/components/02.molecules/expandable/expanding-panel-classic/CONSUMER-STYLING.md +12 -5
  300. package/app/components/02.molecules/input-copy/CONSUMER-STYLING.md +12 -5
  301. package/app/components/02.molecules/input-copy/InputCopy.vue +12 -25
  302. package/app/components/02.molecules/input-copy/stories/InputCopy.stories.ts +1 -1
  303. package/app/components/02.molecules/input-copy/tests/InputCopy.spec.ts +1 -1
  304. package/app/components/02.molecules/navigation/deep-expanding-menu/CONSUMER-STYLING.md +13 -0
  305. package/app/components/02.molecules/navigation/deep-expanding-menu-classic/CONSUMER-STYLING.md +11 -0
  306. package/app/components/02.molecules/navigation/site-navigation/CONSUMER-STYLING.md +109 -0
  307. package/app/components/02.molecules/navigation/site-navigation/SiteNavigation.vue +37 -55
  308. package/app/components/02.molecules/navigation/site-navigation/stories/SiteNavigation.stories.ts +22 -1
  309. package/app/components/02.molecules/navigation/site-navigation/tests/SiteNavigation.spec.ts +41 -6
  310. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +13 -8
  311. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +18 -36
  312. package/app/components/02.molecules/navigation/tab-navigation/stories/TabNavigation.stories.ts +1 -1
  313. package/app/components/02.molecules/navigation/tab-navigation/tests/TabNavigation.spec.ts +1 -1
  314. package/app/components/02.molecules/opening-hours/CONSUMER-STYLING.md +134 -0
  315. package/app/components/02.molecules/opening-hours/OpeningHours.vue +352 -0
  316. package/app/components/02.molecules/opening-hours/stories/OpeningHours.stories.ts +127 -0
  317. package/app/components/02.molecules/opening-hours/tests/OpeningHours.spec.ts +228 -0
  318. package/app/components/02.molecules/opening-hours/tests/OpeningHours.structuredData.spec.ts +45 -0
  319. package/app/components/02.molecules/opening-hours/tests/__snapshots__/OpeningHours.spec.ts.snap +23 -0
  320. package/app/components/02.molecules/opening-hours/tests/buildOpeningHoursSpecification.spec.ts +52 -0
  321. package/app/components/02.molecules/price-list/CONSUMER-STYLING.md +106 -0
  322. package/app/components/02.molecules/price-list/PriceList.vue +48 -40
  323. package/app/components/02.molecules/price-list/stories/PriceList.stories.ts +15 -2
  324. package/app/components/02.molecules/price-list/tests/PriceList.spec.ts +39 -2
  325. package/app/components/02.molecules/price-list/tests/__snapshots__/PriceList.spec.ts.snap +4 -16
  326. package/app/components/02.molecules/pricing-card/CONSUMER-STYLING.md +12 -5
  327. package/app/components/02.molecules/pricing-card/PricingCard.vue +28 -60
  328. package/app/components/02.molecules/pricing-card/tests/PricingCard.spec.ts +1 -1
  329. package/app/components/02.molecules/profile-section/CONSUMER-STYLING.md +53 -0
  330. package/app/components/02.molecules/profile-section/ProfileSection.vue +53 -66
  331. package/app/components/02.molecules/profile-section/tests/ProfileSection.spec.ts +4 -4
  332. package/app/components/02.molecules/profile-section/tests/__snapshots__/ProfileSection.spec.ts.snap +6 -12
  333. package/app/components/02.molecules/prompt/CONSUMER-STYLING.md +51 -0
  334. package/app/components/{01.atoms → 02.molecules}/prompt/DisplayPrompt.vue +23 -8
  335. package/app/components/{01.atoms → 02.molecules}/prompt/stories/DisplayPrompt.stories.ts +18 -1
  336. package/app/components/{01.atoms → 02.molecules}/prompt/tests/DisplayPrompt.spec.ts +37 -7
  337. package/app/components/02.molecules/qr-code/CONSUMER-STYLING.md +66 -0
  338. package/app/components/02.molecules/qr-code/CaptureQrCode.vue +31 -12
  339. package/app/components/02.molecules/qr-code/DecodeQrCode.vue +55 -19
  340. package/app/components/02.molecules/qr-code/stories/CaptureQrCode.stories.ts +56 -0
  341. package/app/components/02.molecules/qr-code/stories/DecodeQrCode.stories.ts +53 -0
  342. package/app/components/02.molecules/qr-code/tests/CaptureQrCode.spec.ts +68 -20
  343. package/app/components/02.molecules/qr-code/tests/DecodeQrCode.spec.ts +44 -8
  344. package/app/components/02.molecules/samaritan-prompt/CONSUMER-STYLING.md +118 -0
  345. package/app/components/02.molecules/samaritan-prompt/SamaritanPrompt.vue +108 -51
  346. package/app/components/02.molecules/samaritan-prompt/SamaritanPromptMixed.vue +63 -62
  347. package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPrompt.stories.ts +129 -0
  348. package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPromptMixed.stories.ts +124 -0
  349. package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPrompt.spec.ts +66 -0
  350. package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPromptMixed.spec.ts +95 -17
  351. package/app/components/02.molecules/select-menu/CONSUMER-STYLING.md +11 -2
  352. package/app/components/02.molecules/social-icons-list/CONSUMER-STYLING.md +43 -0
  353. package/app/components/02.molecules/social-icons-list/SocialIconsList.vue +15 -15
  354. package/app/components/02.molecules/social-icons-list/stories/SocialIconsList.stories.ts +6 -1
  355. package/app/components/02.molecules/social-icons-list/tests/SocialIconsList.spec.ts +22 -1
  356. package/app/components/02.molecules/social-icons-list/tests/__snapshots__/SocialIconsList.spec.ts.snap +3 -3
  357. package/app/components/02.molecules/stepper-list/CONSUMER-STYLING.md +44 -5
  358. package/app/components/02.molecules/stepper-list/StepperList.vue +23 -43
  359. package/app/components/02.molecules/stepper-list/tests/StepperList.spec.ts +9 -0
  360. package/app/components/{01.atoms → 02.molecules}/toast/CONSUMER-STYLING.md +14 -0
  361. package/app/components/{01.atoms → 02.molecules}/toast/DisplayToast.vue +1 -2
  362. package/app/components/{01.atoms → 02.molecules}/toast/DisplayToastProvider.vue +1 -2
  363. package/app/components/{01.atoms → 02.molecules}/toast/stories/DisplayToast.stories.ts +1 -1
  364. package/app/components/{01.atoms → 02.molecules}/toast/stories/DisplayToastProvider.stories.ts +1 -1
  365. package/app/components/03.organisms/image-galleries/carousel-flip/CONSUMER-STYLING.md +13 -0
  366. package/app/components/03.organisms/image-galleries/slider-gallery/CONSUMER-STYLING.md +137 -0
  367. package/app/components/03.organisms/image-galleries/slider-gallery/SliderGallery.vue +378 -343
  368. package/app/components/03.organisms/image-galleries/slider-gallery/stories/SliderGallery.stories.ts +26 -1
  369. package/app/components/03.organisms/image-galleries/slider-gallery/tests/SliderGallery.spec.ts +102 -23
  370. package/app/components/03.organisms/image-galleries/slider-gallery/tests/__snapshots__/SliderGallery.spec.ts.snap +44 -44
  371. package/app/components/03.organisms/responsive-header/CONSUMER-STYLING.md +12 -1
  372. package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +0 -4
  373. package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +24 -3
  374. package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +3 -3
  375. package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +13 -13
  376. package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +1 -1
  377. package/app/components/03.organisms/services/service-summary/CONSUMER-STYLING.md +24 -7
  378. package/app/components/03.organisms/services/service-summary/ServiceSummary.vue +3 -3
  379. package/app/components/03.organisms/services/service-summary/stories/ServiceSummary.stories.ts +1 -1
  380. package/app/components/03.organisms/services/service-summary/tests/__snapshots__/ServiceSummary.spec.ts.snap +1 -1
  381. package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +11 -2
  382. package/app/components/03.organisms/services/services-card/ServicesCard.vue +17 -26
  383. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +21 -0
  384. package/app/components/03.organisms/services/services-grids/CONSUMER-STYLING.md +50 -0
  385. package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +9 -16
  386. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +6 -0
  387. package/app/components/03.organisms/services/services-grids/tests/ServicesCardGrid.spec.ts +18 -0
  388. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServiceSummaryGrid.spec.ts.snap +3 -3
  389. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +3 -3
  390. package/app/components/03.organisms/site-header/CONSUMER-STYLING.md +12 -1
  391. package/app/components/04.templates/page-hero-highlights/CONSUMER-STYLING.md +103 -0
  392. package/app/components/04.templates/page-hero-highlights/PageHeroHighlights.vue +144 -193
  393. package/app/components/04.templates/page-hero-highlights/PageHeroHighlightsHeader.vue +27 -37
  394. package/app/components/04.templates/page-hero-highlights/stories/PageHeroHighlights.stories.ts +56 -60
  395. package/app/components/04.templates/page-hero-highlights/stories/PageHeroHighlightsHeader.stories.ts +2 -2
  396. package/app/components/04.templates/page-hero-highlights/tests/PageHeroHighlights.spec.ts +10 -10
  397. package/app/components/04.templates/page-hero-highlights/tests/PageHeroHighlightsHeader.spec.ts +7 -7
  398. package/app/components/04.templates/page-hero-highlights/tests/__snapshots__/PageHeroHighlights.spec.ts.snap +6 -6
  399. package/app/components/05.forms/form-errors/CONSUMER-STYLING.md +112 -0
  400. package/app/components/05.forms/form-errors/InputError.vue +101 -122
  401. package/app/components/05.forms/form-errors/stories/InputError.stories.ts +125 -0
  402. package/app/components/05.forms/form-errors/tests/InputError.spec.ts +82 -31
  403. package/app/components/05.forms/form-field/CONSUMER-STYLING.md +91 -0
  404. package/app/components/05.forms/form-field/FormField.vue +26 -35
  405. package/app/components/05.forms/form-field/stories/FormField.stories.ts +104 -0
  406. package/app/components/05.forms/form-field/tests/FormField.spec.ts +75 -0
  407. package/app/components/05.forms/form-fieldset/CONSUMER-STYLING.md +88 -0
  408. package/app/components/05.forms/form-fieldset/FormFieldset.vue +34 -28
  409. package/app/components/05.forms/form-fieldset/stories/FormFieldset.stories.ts +84 -0
  410. package/app/components/05.forms/form-fieldset/tests/FormFieldset.spec.ts +111 -0
  411. package/app/components/05.forms/form-wrapper/CONSUMER-STYLING.md +101 -0
  412. package/app/components/05.forms/form-wrapper/FormWrapper.vue +32 -15
  413. package/app/components/05.forms/form-wrapper/stories/FormWrapper.stories.ts +75 -0
  414. package/app/components/05.forms/form-wrapper/tests/FormWrapper.spec.ts +57 -0
  415. package/app/components/05.forms/input-button/CONSUMER-STYLING.md +52 -7
  416. package/app/components/05.forms/input-button/{InputButtonCore.vue → InputButton.vue} +60 -18
  417. package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts → input-button.playwright.ts} +5 -5
  418. package/app/components/05.forms/input-button/stories/{InputButtonCore.stories.ts → InputButton.stories.ts} +8 -10
  419. package/app/components/05.forms/input-button/tests/{InputButtonCore.spec.ts → InputButton.spec.ts} +75 -19
  420. package/app/components/05.forms/input-button/tests/__snapshots__/{InputButtonCore.spec.ts.snap → InputButton.spec.ts.snap} +18 -18
  421. package/app/components/05.forms/input-checkbox/CONSUMER-STYLING.md +93 -0
  422. package/app/components/05.forms/input-checkbox/MultipleCheckboxes.vue +19 -25
  423. package/app/components/05.forms/input-checkbox/SingleCheckbox.vue +17 -43
  424. package/app/components/05.forms/input-checkbox/stories/MultipleCheckboxes.stories.ts +104 -0
  425. package/app/components/05.forms/input-checkbox/stories/SingleCheckbox.stories.ts +75 -0
  426. package/app/components/05.forms/input-checkbox/tests/MultipleCheckboxes.spec.ts +91 -53
  427. package/app/components/05.forms/input-checkbox/tests/SingleCheckbox.spec.ts +112 -0
  428. package/app/components/05.forms/input-checkbox-radio/CONSUMER-STYLING.md +115 -35
  429. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadio.vue +158 -0
  430. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioButton.vue +102 -101
  431. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioField.vue +100 -0
  432. package/app/components/05.forms/input-checkbox-radio/stories/{InputCheckboxRadioCore.stories.ts → InputCheckboxRadio.stories.ts} +23 -8
  433. package/app/components/05.forms/input-checkbox-radio/stories/InputCheckboxRadioButton.stories.ts +60 -16
  434. package/app/components/05.forms/input-checkbox-radio/stories/InputCheckboxRadioField.stories.ts +93 -0
  435. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadio.spec.ts +174 -0
  436. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioButton.spec.ts +87 -0
  437. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioField.spec.ts +87 -0
  438. package/app/components/05.forms/input-description/CONSUMER-STYLING.md +177 -0
  439. package/app/components/05.forms/input-description/InputDescription.vue +45 -24
  440. package/app/components/05.forms/input-description/stories/InputDescription.stories.ts +160 -0
  441. package/app/components/05.forms/input-description/tests/InputDescription.spec.ts +62 -386
  442. package/app/components/05.forms/input-label/CONSUMER-STYLING.md +134 -0
  443. package/app/components/05.forms/input-label/InputLabel.vue +99 -38
  444. package/app/components/05.forms/input-label/stories/InputLabel.stories.ts +236 -0
  445. package/app/components/05.forms/input-label/tests/InputLabel.spec.ts +113 -342
  446. package/app/components/05.forms/input-number/CONSUMER-STYLING.md +16 -7
  447. package/app/components/05.forms/input-number/{InputNumberCore.vue → InputNumber.vue} +6 -6
  448. package/app/components/05.forms/input-number/{variants/InputNumberDefault.vue → InputNumberField.vue} +12 -15
  449. package/app/components/05.forms/input-number/stories/{InputNumberCore.stories.ts → InputNumber.stories.ts} +6 -6
  450. package/app/components/05.forms/input-number/{variants/stories/InputNumberDefault.stories.ts → stories/InputNumberField.stories.ts} +5 -5
  451. package/app/components/05.forms/input-number/tests/{InputNumberCore.spec.ts → InputNumber.spec.ts} +2 -2
  452. package/app/components/05.forms/input-number/{variants/tests/InputNumberDefault.spec.ts → tests/InputNumberField.spec.ts} +8 -8
  453. package/app/components/05.forms/input-radio/CONSUMER-STYLING.md +70 -0
  454. package/app/components/05.forms/input-radio/MultipleRadiobuttons.vue +19 -30
  455. package/app/components/05.forms/input-radio/stories/MultipleRadiobuttons.stories.ts +116 -0
  456. package/app/components/05.forms/input-radio/tests/MultipleRadioButtons.spec.ts +125 -74
  457. package/app/components/05.forms/input-range/CONSUMER-STYLING.md +13 -0
  458. package/app/components/05.forms/input-range/InputRangeCore.vue +1 -1
  459. package/app/components/05.forms/input-range/{variants/InputRangeDefault.vue → InputRangeDefault.vue} +7 -11
  460. package/app/components/05.forms/input-range/{variants/tests → tests}/InputRangeDefault.spec.ts +1 -1
  461. package/app/components/05.forms/input-select/CONSUMER-STYLING.md +11 -2
  462. package/app/components/05.forms/input-select/{variants/InputSelectWithLabel.vue → InputSelectWithLabel.vue} +6 -9
  463. package/app/components/05.forms/input-select/stories/InputSelectWithLabel.stories.ts +1 -1
  464. package/app/components/05.forms/input-text/CONSUMER-STYLING.md +12 -3
  465. package/app/components/05.forms/input-text/{variants/InputPasswordWithLabel.vue → InputPasswordWithLabel.vue} +3 -3
  466. package/app/components/05.forms/input-text/{variants/InputTextAsNumberWithLabel.vue → InputTextAsNumberWithLabel.vue} +12 -15
  467. package/app/components/05.forms/input-text/InputTextCore.vue +8 -11
  468. package/app/components/05.forms/input-text/{variants/InputTextWithLabel.vue → InputTextWithLabel.vue} +9 -10
  469. package/app/components/05.forms/input-text/stories/InputPasswordWithLabel.stories.ts +1 -1
  470. package/app/components/05.forms/input-text/stories/InputTextAsNumberWithLabel.stories.ts +1 -1
  471. package/app/components/05.forms/input-text/stories/InputTextWithLabel.stories.ts +1 -1
  472. package/app/components/05.forms/input-text/tests/InputPasswordWithLabel.spec.ts +2 -1
  473. package/app/components/05.forms/input-text/tests/InputTextAsNumberWithLabel.spec.ts +1 -1
  474. package/app/components/05.forms/input-text/tests/InputTextWithLabel.spec.ts +2 -1
  475. package/app/components/05.forms/input-textarea/CONSUMER-STYLING.md +11 -2
  476. package/app/components/05.forms/input-textarea/{variants/InputTextareaWithLabel.vue → InputTextareaWithLabel.vue} +3 -7
  477. package/app/components/05.forms/input-textarea/stories/InputTextareaWithLabel.stories.ts +1 -1
  478. package/app/components/05.forms/patterns/stories/ContactForm.stories.ts +9 -10
  479. package/app/components/05.forms/patterns/stories/LoginForm.stories.ts +10 -10
  480. package/app/components/05.forms/patterns/stories/MigratedFieldsForm.stories.ts +246 -101
  481. package/app/components/05.forms/pending-effect/CONSUMER-STYLING.md +92 -0
  482. package/app/components/05.forms/pending-effect/PendingEffect.vue +52 -45
  483. package/app/components/05.forms/pending-effect/stories/PendingEffect.stories.ts +132 -0
  484. package/app/components/05.forms/pending-effect/tests/PendingEffect.spec.ts +67 -0
  485. package/app/components/05.forms/toggle-switch/CONSUMER-STYLING.md +11 -2
  486. package/app/components/05.forms/toggle-switch/ToggleSwitchCore.vue +10 -29
  487. package/app/components/05.forms/toggle-switch/{variants/ToggleSwitchWithLabel.vue → ToggleSwitchWithLabel.vue} +5 -7
  488. package/app/components/05.forms/toggle-switch/{variants/ToggleSwitchWithLabelInline.vue → ToggleSwitchWithLabelInline.vue} +2 -4
  489. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +1 -1
  490. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +4 -1
  491. package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabel.spec.ts +26 -0
  492. package/app/components/05.forms/triple-toggle-switch/CONSUMER-STYLING.md +75 -62
  493. package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitch.vue +243 -0
  494. package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitch.stories.ts +104 -0
  495. package/app/components/05.forms/triple-toggle-switch/tests/TripleToggleSwitch.spec.ts +138 -0
  496. package/app/composables/tests/useCancellableTimer.spec.ts +48 -0
  497. package/app/composables/tests/useMaxChildWidth.spec.ts +67 -0
  498. package/app/composables/useCancellableTimer.ts +27 -7
  499. package/app/composables/useMaxChildWidth.ts +4 -6
  500. package/app/types/app-config.d.ts +10 -0
  501. package/app/types/components/cookie-consent-banner.d.ts +3 -0
  502. package/app/types/components/index.ts +6 -1
  503. package/app/types/components/opening-hours.d.ts +48 -0
  504. package/app/types/components/price-list.d.ts +11 -0
  505. package/app/types/components/profile-section.d.ts +6 -0
  506. package/app/types/components/samaritan-prompt.d.ts +13 -0
  507. package/app/types/components/services-card.d.ts +9 -0
  508. package/app/types/components/slider-gallery.d.ts +2 -0
  509. package/app/types/components/social-icons-list.d.ts +2 -0
  510. package/app/types/forms/types.forms.d.ts +3 -0
  511. package/app/types/forms/types.zodFormControl.d.ts +0 -3
  512. package/app/utils/opening-hours.ts +44 -0
  513. package/nuxt.config.ts +5 -1
  514. package/package.json +2 -2
  515. package/ramps.config.mjs +1 -1
  516. package/.claude/commands/create-commit-message.md +0 -13
  517. package/.claude/commands/create-release-notes.md +0 -34
  518. package/.claude/commands/migrate-component.md +0 -169
  519. package/.claude/commands/run-commit.md +0 -13
  520. package/.claude/component-ledger/artifact-url.txt +0 -1
  521. package/.claude/component-ledger/audit.json +0 -1
  522. package/.claude/component-ledger/build.mjs +0 -164
  523. package/.claude/component-ledger/output.html +0 -569
  524. package/.claude/component-ledger/template.html +0 -569
  525. package/.claude/hooks/check-component-update.sh +0 -95
  526. package/.claude/hooks/refresh-component-ledger.sh +0 -32
  527. package/.claude/settings.json +0 -134
  528. package/.claude/settings.local.json +0 -38
  529. package/.claude/skills/components/alert-content-inner.md +0 -60
  530. package/.claude/skills/components/navigation-horizontal.md +0 -99
  531. package/.claude/skills/components/samaritan-prompt-mixed.md +0 -139
  532. package/app/components/01.atoms/content-wrappers/content-columns-2/ContentColumns2.vue +0 -51
  533. package/app/components/01.atoms/content-wrappers/content-columns-2/stories/ContentColumns2.stories.ts +0 -110
  534. package/app/components/01.atoms/content-wrappers/content-columns-2/tests/ContentColumns2.spec.ts +0 -105
  535. package/app/components/01.atoms/content-wrappers/content-columns-2/tests/__snapshots__/ContentColumns2.spec.ts.snap +0 -14
  536. package/app/components/01.atoms/content-wrappers/content-width/ContentWidth.vue +0 -88
  537. package/app/components/01.atoms/content-wrappers/content-width/stories/ContentWidth.stories.ts +0 -362
  538. package/app/components/01.atoms/content-wrappers/content-width/tests/ContentWidth.spec.ts +0 -132
  539. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGrid.spec.ts.snap +0 -36
  540. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/LayoutGridByWidth.vue +0 -70
  541. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/stories/LayoutGridByWidth.stories.ts +0 -220
  542. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/LayoutGridByWidth.spec.ts +0 -174
  543. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGrid.spec.ts.snap +0 -36
  544. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +0 -36
  545. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGridByWidth.spec.ts.snap +0 -36
  546. package/app/components/01.atoms/cookie-consent-banner/CookieConsentBanner.vue +0 -148
  547. package/app/components/01.atoms/display-avatar/DisplayAvatar.vue +0 -130
  548. package/app/components/01.atoms/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +0 -11
  549. package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItemCore.spec.ts.snap +0 -27
  550. package/app/components/02.molecules/navigation/navigation-horizontal/NavigationHorizontal.vue +0 -162
  551. package/app/components/02.molecules/navigation/navigation-horizontal/stories/NavigationHorizontal.stories.ts +0 -373
  552. package/app/components/02.molecules/navigation/navigation-horizontal/tests/NavigationHorizontal.spec.ts +0 -152
  553. package/app/components/02.molecules/navigation/navigation-horizontal/tests/__snapshots__/NavigationHorizontal.spec.ts.snap +0 -17
  554. package/app/components/02.molecules/qr-code/stories/QrCode.stories.ts +0 -101
  555. package/app/components/03.organisms/colour-finder/ColourFinder.vue +0 -1519
  556. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -202
  557. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -105
  558. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -320
  559. package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -314
  560. package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitchCore.stories.ts +0 -63
  561. package/.vscode/{srcdev-component-dialog.code-snippets → srcdev-component-display-dialog.code-snippets} +0 -0
  562. package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToast.spec.ts +1 -1
  563. /package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToastProvider.spec.ts +0 -0
  564. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-chromium-darwin.png +0 -0
  565. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-firefox-darwin.png +0 -0
  566. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-webkit-darwin.png +0 -0
  567. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-chromium-darwin.png +0 -0
  568. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-firefox-darwin.png +0 -0
  569. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-webkit-darwin.png +0 -0
  570. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-chromium-darwin.png +0 -0
  571. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-firefox-darwin.png +0 -0
  572. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-webkit-darwin.png +0 -0
  573. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-chromium-darwin.png +0 -0
  574. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-firefox-darwin.png +0 -0
  575. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-webkit-darwin.png +0 -0
  576. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-chromium-darwin.png +0 -0
  577. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-firefox-darwin.png +0 -0
  578. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-webkit-darwin.png +0 -0
  579. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-chromium-darwin.png +0 -0
  580. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-firefox-darwin.png +0 -0
  581. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-chromium-darwin.png +0 -0
  582. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-firefox-darwin.png +0 -0
  583. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-webkit-darwin.png +0 -0
  584. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-chromium-darwin.png +0 -0
  585. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-firefox-darwin.png +0 -0
  586. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-webkit-darwin.png +0 -0
  587. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-chromium-darwin.png +0 -0
  588. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-firefox-darwin.png +0 -0
  589. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-webkit-darwin.png +0 -0
  590. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-chromium-darwin.png +0 -0
  591. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-firefox-darwin.png +0 -0
  592. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-webkit-darwin.png +0 -0
  593. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-chromium-darwin.png +0 -0
  594. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-firefox-darwin.png +0 -0
  595. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-webkit-darwin.png +0 -0
  596. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-chromium-darwin.png +0 -0
  597. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-firefox-darwin.png +0 -0
  598. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-webkit-darwin.png +0 -0
  599. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-chromium-darwin.png +0 -0
  600. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-firefox-darwin.png +0 -0
  601. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-webkit-darwin.png +0 -0
  602. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-webkit-darwin.png +0 -0
  603. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/nuxt-icon-only-component-chromium-darwin.png +0 -0
  604. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/nuxt-icon-only-component-firefox-darwin.png +0 -0
  605. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/nuxt-icon-only-component-webkit-darwin.png +0 -0
  606. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-chromium-darwin.png +0 -0
  607. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-firefox-darwin.png +0 -0
  608. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-webkit-darwin.png +0 -0
  609. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-chromium-darwin.png +0 -0
  610. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-firefox-darwin.png +0 -0
  611. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-webkit-darwin.png +0 -0
  612. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-chromium-darwin.png +0 -0
  613. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-firefox-darwin.png +0 -0
  614. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-webkit-darwin.png +0 -0
  615. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-chromium-darwin.png +0 -0
  616. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-firefox-darwin.png +0 -0
  617. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-webkit-darwin.png +0 -0
  618. /package/app/components/05.forms/input-range/{variants/stories → stories}/InputRangeDefault.stories.ts +0 -0
  619. /package/app/components/05.forms/input-select/{variants/tests → tests}/InputSelectWithLabel.spec.ts +0 -0
  620. /package/app/components/05.forms/input-textarea/{variants/tests → tests}/InputTextareaWithLabel.spec.ts +0 -0
  621. /package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabelInline.spec.ts +0 -0
  622. /package/app/types/components/{navigation-horizontal.d.ts → nav-item.d.ts} +0 -0
@@ -2,7 +2,7 @@ import { describe, it, expect, afterEach } from "vitest";
2
2
  import { mountSuspended } from "@nuxt/test-utils/runtime";
3
3
  import { nextTick } from "vue";
4
4
  import SamaritanPromptMixed from "../SamaritanPromptMixed.vue";
5
- import type { MessageConfig } from "../SamaritanPromptMixed.vue";
5
+ import type { SamaritanPromptMessageConfig as MessageConfig } from "~/types/components/samaritan-prompt";
6
6
 
7
7
  // ─── Typewriter ───────────────────────────────────────────────────────────────
8
8
  //
@@ -38,14 +38,14 @@ describe("SamaritanPromptMixed — typewriter", () => {
38
38
  expect(wrapper.find(".samaritan-prompt__stage").exists()).toBe(true);
39
39
  });
40
40
 
41
- it.skip("types the first character immediately on mount", async () => {
42
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
41
+ it("types the first character immediately on mount", async () => {
42
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
43
43
  await nextTick();
44
44
  expect(wrapper.find(".samaritan-prompt__text").text()).toBe("H");
45
45
  });
46
46
 
47
- it.skip("types one character per typeSpeed tick", async () => {
48
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
47
+ it("types one character per typeSpeed tick", async () => {
48
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
49
49
  await nextTick();
50
50
  expect(wrapper.find(".samaritan-prompt__text").text()).toBe("H");
51
51
 
@@ -55,8 +55,8 @@ describe("SamaritanPromptMixed — typewriter", () => {
55
55
  expect(wrapper.find(".samaritan-prompt__text").text()).toBe("HE");
56
56
  });
57
57
 
58
- it.skip("hides cursor when typing starts", async () => {
59
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
58
+ it("hides cursor when typing starts", async () => {
59
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
60
60
  await nextTick();
61
61
  expect(wrapper.find(".samaritan-prompt__cursor").attributes("style")).toContain("opacity: 0");
62
62
  });
@@ -166,16 +166,16 @@ describe("SamaritanPromptMixed — word-pulse", () => {
166
166
  expect(wrapper.find(".samaritan-prompt__text").text()).toBe("");
167
167
  });
168
168
 
169
- it.skip("fades content out when cycle starts", async () => {
170
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
169
+ it("fades content out when cycle starts", async () => {
170
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
171
171
  await nextTick(); // component's await nextTick() resolves → sets opacity=0
172
172
  await nextTick(); // DOM update
173
173
 
174
174
  expect(wrapper.find(".samaritan-prompt__content").attributes("style")).toContain("opacity: 0");
175
175
  });
176
176
 
177
- it.skip("hides cursor when cycle starts", async () => {
178
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
177
+ it("hides cursor when cycle starts", async () => {
178
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
179
179
  await nextTick();
180
180
  await nextTick();
181
181
 
@@ -192,8 +192,8 @@ describe("SamaritanPromptMixed — word-pulse", () => {
192
192
  expect(wrapper.find(".samaritan-prompt__cursor").attributes("style")).toContain("opacity: 1");
193
193
  });
194
194
 
195
- it.skip("shows text and restores opacity after fade duration and settle delay", async () => {
196
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
195
+ it("shows text and restores opacity after fade duration and settle delay", async () => {
196
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
197
197
  await nextTick(); // component's nextTick resolves → opacity=0, await wait(fadeDuration)
198
198
  await nextTick(); // DOM update
199
199
 
@@ -211,8 +211,8 @@ describe("SamaritanPromptMixed — word-pulse", () => {
211
211
  expect(wrapper.find(".samaritan-prompt__content").attributes("style")).toContain("opacity: 1");
212
212
  });
213
213
 
214
- it.skip("fades text back out after word duration", async () => {
215
- wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
214
+ it("fades text back out after word duration", async () => {
215
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
216
216
  await nextTick();
217
217
  await nextTick();
218
218
 
@@ -241,10 +241,11 @@ describe("SamaritanPromptMixed — config resolution", () => {
241
241
  // wrappers are unmounted inline in each test
242
242
  });
243
243
 
244
- it.skip("falls back to global effect prop when not specified per message", async () => {
244
+ it("falls back to global effect prop when not specified per message", async () => {
245
245
  const wrapper = await mountSuspended(SamaritanPromptMixed, {
246
246
  props: {
247
247
  messageConfigs: [{ text: "TEST" }], // no effect
248
+ introDelay: 0,
248
249
  effect: "typewriter",
249
250
  typeSpeed: 100,
250
251
  },
@@ -255,10 +256,11 @@ describe("SamaritanPromptMixed — config resolution", () => {
255
256
  wrapper.unmount();
256
257
  });
257
258
 
258
- it.skip("falls back to global typeSpeed when not specified per message", async () => {
259
+ it("falls back to global typeSpeed when not specified per message", async () => {
259
260
  const wrapper = await mountSuspended(SamaritanPromptMixed, {
260
261
  props: {
261
262
  messageConfigs: [{ text: "HI", effect: "typewriter" }],
263
+ introDelay: 0,
262
264
  typeSpeed: 150,
263
265
  },
264
266
  });
@@ -304,3 +306,79 @@ describe("SamaritanPromptMixed — config resolution", () => {
304
306
  wrapper.unmount();
305
307
  });
306
308
  });
309
+
310
+ // ─── Accessibility, pause and slots ───────────────────────────────────────────
311
+
312
+ describe("SamaritanPromptMixed — accessibility and pause", () => {
313
+ const config: MessageConfig = {
314
+ text: "HI",
315
+ effect: "typewriter",
316
+ typeSpeed: 100,
317
+ deleteSpeed: 50,
318
+ holdDuration: 300,
319
+ pauseDuration: 100,
320
+ };
321
+
322
+ let wrapper: Awaited<ReturnType<typeof mountSuspended>>;
323
+
324
+ afterEach(() => {
325
+ wrapper?.unmount();
326
+ });
327
+
328
+ it("hides the animated content from assistive tech and exposes a polite live region", async () => {
329
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
330
+ expect(wrapper.find(".samaritan-prompt__content").attributes("aria-hidden")).toBe("true");
331
+ const live = wrapper.find(".samaritan-prompt__sr-text");
332
+ expect(live.attributes("aria-live")).toBe("polite");
333
+ expect(live.attributes("aria-atomic")).toBe("true");
334
+ });
335
+
336
+ it("announces the full message once it is typed", async () => {
337
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], introDelay: 0 } });
338
+ await vi.advanceTimersByTimeAsync(200);
339
+ await nextTick();
340
+ expect(wrapper.find(".samaritan-prompt__sr-text").text()).toBe("HI");
341
+ });
342
+
343
+ it("sets data-paused on hover and removes it on leave", async () => {
344
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config] } });
345
+ const root = wrapper.find(".samaritan-prompt");
346
+ await root.trigger("pointerenter");
347
+ expect(root.attributes("data-paused")).toBeDefined();
348
+ await root.trigger("pointerleave");
349
+ expect(root.attributes("data-paused")).toBeUndefined();
350
+ });
351
+
352
+ it("stops typing while hovered and resumes on leave", async () => {
353
+ wrapper = await mountSuspended(SamaritanPromptMixed, {
354
+ props: { messageConfigs: [{ ...config, text: "HELLO" }], introDelay: 0 },
355
+ });
356
+ await vi.advanceTimersByTimeAsync(100);
357
+ await nextTick();
358
+ const typedBeforePause = wrapper.find(".samaritan-prompt__text").text();
359
+
360
+ await wrapper.find(".samaritan-prompt").trigger("pointerenter");
361
+ await vi.advanceTimersByTimeAsync(1000);
362
+ await nextTick();
363
+ expect(wrapper.find(".samaritan-prompt__text").text()).toBe(typedBeforePause);
364
+
365
+ await wrapper.find(".samaritan-prompt").trigger("pointerleave");
366
+ await vi.advanceTimersByTimeAsync(300);
367
+ await nextTick();
368
+ expect(wrapper.find(".samaritan-prompt__text").text().length).toBeGreaterThan(typedBeforePause.length);
369
+ });
370
+
371
+ it("renders a custom cursor from the cursor slot", async () => {
372
+ wrapper = await mountSuspended(SamaritanPromptMixed, {
373
+ props: { messageConfigs: [config] },
374
+ slots: { cursor: () => "_" },
375
+ });
376
+ expect(wrapper.find(".samaritan-prompt__cursor").text()).toBe("_");
377
+ });
378
+
379
+ it("exposes the fade duration as an inline private token", async () => {
380
+ wrapper = await mountSuspended(SamaritanPromptMixed, { props: { messageConfigs: [config], fadeDuration: 900 } });
381
+ const style = (wrapper.find(".samaritan-prompt").element as HTMLElement).style;
382
+ expect(style.getPropertyValue("--_fade-duration")).toBe("900ms");
383
+ });
384
+ });
@@ -54,7 +54,7 @@ global token so it matches the rest of the design system out of the box.
54
54
 
55
55
  ---
56
56
 
57
- ## Global theming — recommended approach
57
+ ## Global theming
58
58
 
59
59
  Create `assets/styles/setup/07.components/select-menu.css` in the consuming app and set tokens
60
60
  on `:root`. This applies to every `SelectMenu` across the site.
@@ -77,7 +77,15 @@ on `:root`. This applies to every `SelectMenu` across the site.
77
77
 
78
78
  ---
79
79
 
80
- ## Per-instance overrides via styleClassPassthrough
80
+ ## Local overrides
81
+
82
+ Set the tokens above on an element you own (a page or section class, or a class added with
83
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
84
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
85
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
86
+ `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
87
+
88
+ ### One instance
81
89
 
82
90
  ```vue
83
91
  <SelectMenu
@@ -166,3 +174,4 @@ story.
166
174
  the bottom of the viewport (`position-try-fallbacks: flip-block`).
167
175
  - **Chevron rotation** is pure CSS via `:has(.select-menu-popover:popover-open)` — no JS state
168
176
  needed for the visual, though `isOpen` is still tracked internally to drive `aria-expanded`.
177
+
@@ -0,0 +1,43 @@
1
+ # SocialIconsList — Consumer Styling Guide
2
+
3
+ ## Public token API
4
+
5
+ | Token | Default | Controls |
6
+ |---|---|---|
7
+ | `--social-icons-list-icon-size` | `2.4rem` | Icon size (applied as `font-size`) |
8
+ | `--social-icons-list-gap` | `1.2rem` | Gap between icons |
9
+ | `--social-icons-list-hover-scale` | `1.15` | Scale on hover/focus (no scaling under `prefers-reduced-motion: reduce`) |
10
+ | `--social-icons-list-hover-opacity` | `0.85` | Opacity on hover/focus |
11
+
12
+ The focus outline uses `--theme-ring`, falling back to `currentColor`. Icon colour is whatever the
13
+ Iconify icon renders (`logos:` icons carry their own brand colours; mono sets follow `color`).
14
+
15
+ > Changed 2026-09-28: `--theme-social-icon-size` and `--theme-social-icon-gap` were renamed to
16
+ > `--social-icons-list-icon-size` and `--social-icons-list-gap`; the old names no longer work. The
17
+ > icon is now sized with `font-size` (it used an inline `width`/`height` style). The hover tokens
18
+ > are new, and the hover scale now respects reduced motion.
19
+
20
+ No private `--_` tokens.
21
+
22
+ ---
23
+
24
+ ## State hooks
25
+
26
+ Inner classes: `.social-icon-item` (each `<li>`), `.social-icon-link` (the `<a>`, opens in a new
27
+ tab), `.social-icon` (the icon, `aria-hidden`).
28
+
29
+ ---
30
+
31
+ ## Local overrides
32
+
33
+ Set the tokens above on an element you own (a page or section class, or a class added with
34
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
35
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
36
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
37
+ `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
38
+
39
+ ---
40
+
41
+ ## Class passthrough
42
+
43
+ `style-class-passthrough` adds classes to the root `<ul>`. Reactive after mount.
@@ -4,15 +4,11 @@
4
4
  <a
5
5
  :href="`${item.baseHref}${item.profileId}`"
6
6
  class="social-icon-link"
7
- :aria-label="`${item.networkName} profile`"
7
+ :aria-label="linkLabel(item)"
8
8
  rel="noopener noreferrer"
9
9
  target="_blank"
10
10
  >
11
- <Icon
12
- :name="item.iconName"
13
- class="social-icon"
14
- :style="{ width: 'var(--_icon-size)', height: 'var(--_icon-size)' }"
15
- />
11
+ <Icon :name="item.iconName" class="social-icon" aria-hidden="true" />
16
12
  </a>
17
13
  </li>
18
14
  </ul>
@@ -24,14 +20,18 @@ import type { ISocialIcon } from "~/types/components/social-icons-list.d";
24
20
  interface Props {
25
21
  items: ISocialIcon[];
26
22
  label?: string;
23
+ linkLabelTemplate?: string;
27
24
  styleClassPassthrough?: string | string[];
28
25
  }
29
26
 
30
27
  const props = withDefaults(defineProps<Props>(), {
31
28
  label: "Social media profiles",
29
+ linkLabelTemplate: "{network} profile (opens in a new tab)",
32
30
  styleClassPassthrough: () => [],
33
31
  });
34
32
 
33
+ const linkLabel = (item: ISocialIcon) => item.label ?? props.linkLabelTemplate.replace("{network}", item.networkName);
34
+
35
35
  const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
36
36
 
37
37
  watch(
@@ -45,12 +45,9 @@ watch(
45
45
  <style lang="css">
46
46
  @layer components {
47
47
  .social-icons-list {
48
- --_icon-size: var(--theme-social-icon-size, 2.4rem);
49
- --_gap: var(--theme-social-icon-gap, 1.2rem);
50
-
51
48
  display: flex;
52
49
  flex-wrap: wrap;
53
- gap: var(--_gap);
50
+ gap: var(--social-icons-list-gap, 1.2rem);
54
51
  list-style: none;
55
52
  padding: 0;
56
53
  margin: 0;
@@ -69,19 +66,22 @@ watch(
69
66
 
70
67
  &:hover,
71
68
  &:focus-visible {
72
- transform: scale(1.15);
73
- opacity: 0.85;
69
+ transform: scale(var(--social-icons-list-hover-scale, 1.15));
70
+ opacity: var(--social-icons-list-hover-opacity, 0.85);
71
+
72
+ @media (prefers-reduced-motion: reduce) {
73
+ transform: none;
74
+ }
74
75
  }
75
76
 
76
77
  &:focus-visible {
77
- outline: 2px solid currentColor;
78
+ outline: 2px solid var(--theme-ring, currentColor);
78
79
  outline-offset: 3px;
79
80
  border-radius: 2px;
80
81
  }
81
82
 
82
83
  .social-icon {
83
- /* width: var(--_icon-size); */
84
- /* height: var(--_icon-size); */
84
+ font-size: var(--social-icons-list-icon-size, 2.4rem);
85
85
  }
86
86
  }
87
87
  }
@@ -48,6 +48,10 @@ const meta: Meta<typeof SocialIconsList> = {
48
48
  control: "text",
49
49
  description: "aria-label for the list element",
50
50
  },
51
+ linkLabelTemplate: {
52
+ control: "text",
53
+ description: "aria-label for each link; {network} is replaced with the item's networkName",
54
+ },
51
55
  styleClassPassthrough: {
52
56
  control: "object",
53
57
  description: "Additional CSS classes applied to the root element",
@@ -56,6 +60,7 @@ const meta: Meta<typeof SocialIconsList> = {
56
60
  args: {
57
61
  items: sampleItems,
58
62
  label: "Social media profiles",
63
+ linkLabelTemplate: "{network} profile (opens in a new tab)",
59
64
  styleClassPassthrough: ["m-40"],
60
65
  },
61
66
  };
@@ -84,7 +89,7 @@ export const LargeIcons: Story = {
84
89
  setup() {
85
90
  return { args };
86
91
  },
87
- template: `<SocialIconsList v-bind="args" style="--theme-social-icon-size: 4rem;" />`,
92
+ template: `<SocialIconsList v-bind="args" style="--social-icons-list-icon-size: 4rem;" />`,
88
93
  }),
89
94
  };
90
95
 
@@ -62,7 +62,7 @@ describe("SocialIconsList", () => {
62
62
  });
63
63
  const links = wrapper.findAll(".social-icon-link");
64
64
  defaultItems.forEach((item, i) => {
65
- expect(links[i]!.attributes("aria-label")).toBe(`${item.networkName} profile`);
65
+ expect(links[i]!.attributes("aria-label")).toBe(`${item.networkName} profile (opens in a new tab)`);
66
66
  });
67
67
  });
68
68
 
@@ -122,3 +122,24 @@ describe("SocialIconsList", () => {
122
122
  expect(wrapper.html()).toMatchSnapshot();
123
123
  });
124
124
  });
125
+
126
+ describe("SocialIconsList link labels", () => {
127
+ it("uses linkLabelTemplate for each link", async () => {
128
+ const wrapper = await mountSuspended(SocialIconsList, {
129
+ props: { items: defaultItems, linkLabelTemplate: "Profil {network}" },
130
+ });
131
+ expect(wrapper.findAll(".social-icon-link")[0]!.attributes("aria-label")).toBe("Profil Facebook");
132
+ });
133
+
134
+ it("lets an item's own label override the template", async () => {
135
+ const wrapper = await mountSuspended(SocialIconsList, {
136
+ props: { items: [{ ...defaultItems[0]!, label: "Our Facebook page" }] },
137
+ });
138
+ expect(wrapper.find(".social-icon-link").attributes("aria-label")).toBe("Our Facebook page");
139
+ });
140
+
141
+ it("hides the icon from assistive tech (the link carries the name)", async () => {
142
+ const wrapper = await mountSuspended(SocialIconsList, { props: { items: defaultItems } });
143
+ expect(wrapper.find(".social-icon").attributes("aria-hidden")).toBe("true");
144
+ });
145
+ });
@@ -2,8 +2,8 @@
2
2
 
3
3
  exports[`SocialIconsList > renders the correct HTML structure 1`] = `
4
4
  "<ul class="social-icons-list" aria-label="Social media profiles">
5
- <li class="social-icon-item"><a href="https://www.facebook.com/testprofile" class="social-icon-link" aria-label="Facebook profile" rel="noopener noreferrer" target="_blank"><span class="iconify i-logos:facebook social-icon" aria-hidden="true" style="width: var(--_icon-size); height: var(--_icon-size);"></span></a></li>
6
- <li class="social-icon-item"><a href="https://www.instagram.com/testhandle" class="social-icon-link" aria-label="Instagram profile" rel="noopener noreferrer" target="_blank"><span class="iconify i-logos:instagram-icon social-icon" aria-hidden="true" style="width: var(--_icon-size); height: var(--_icon-size);"></span></a></li>
7
- <li class="social-icon-item"><a href="https://www.youtube.com/@testchannel" class="social-icon-link" aria-label="YouTube profile" rel="noopener noreferrer" target="_blank"><span class="iconify i-logos:youtube-icon social-icon" aria-hidden="true" style="width: var(--_icon-size); height: var(--_icon-size);"></span></a></li>
5
+ <li class="social-icon-item"><a href="https://www.facebook.com/testprofile" class="social-icon-link" aria-label="Facebook profile (opens in a new tab)" rel="noopener noreferrer" target="_blank"><span class="iconify i-logos:facebook social-icon" aria-hidden="true"></span></a></li>
6
+ <li class="social-icon-item"><a href="https://www.instagram.com/testhandle" class="social-icon-link" aria-label="Instagram profile (opens in a new tab)" rel="noopener noreferrer" target="_blank"><span class="iconify i-logos:instagram-icon social-icon" aria-hidden="true"></span></a></li>
7
+ <li class="social-icon-item"><a href="https://www.youtube.com/@testchannel" class="social-icon-link" aria-label="YouTube profile (opens in a new tab)" rel="noopener noreferrer" target="_blank"><span class="iconify i-logos:youtube-icon social-icon" aria-hidden="true"></span></a></li>
8
8
  </ul>"
9
9
  `;
@@ -50,9 +50,34 @@ file, scoped to a page wrapper, or per-instance via `styleClassPassthrough`.
50
50
  | `--stepper-list-counter-square-border` | `transparent` | Bubble border colour |
51
51
  | `--stepper-list-counter-square-border-radius` | `0.25rem` | Bubble corner rounding |
52
52
 
53
+ The defaults above are the component's own fallbacks. The library's default theme
54
+ (`app/assets/styles/setup/03.theming/_default.css`) sets blue values for the colour tokens on
55
+ `:root`, so that's what you see unless your app replaces that theme file or overrides them.
56
+
57
+ > Changed 2026-09-27: the default theme set `--stepper-list-icon`, a name the component never
58
+ > reads, so custom indicator icons fell back to `currentColor`. It now sets
59
+ > `--stepper-list-icon-color`.
60
+
61
+ Private (not public API): `--_gap`, `--_counter-size` and `--_padding-block`, plus `--_connector-top` and
62
+ `--_connector-height`, which script measures and sets inline on each `<li>`.
63
+
64
+ ---
65
+
66
+ ## State hooks
67
+
68
+ | Hook | Element | When |
69
+ |---|---|---|
70
+ | `.has-connectors` | root | `connected` is on (default) |
71
+ | `.has-indicator` | `<li>` | That item has an `indicator-{n}` slot |
72
+ | `.indicator-top`, `.indicator-center` | `<li>` | `indicator-alignment` |
73
+ | `.indicator-disc`, `.indicator-square`, `.indicator-circle` | `<li>` | `indicator-variant` |
74
+
75
+ Inner classes: `.stepper-list__indicator-counter` (auto-numbered bubble) or
76
+ `.stepper-list__indicator-custom` (wraps a custom `indicator-{n}` slot).
77
+
53
78
  ---
54
79
 
55
- ## Global theming — recommended approach
80
+ ## Global theming
56
81
 
57
82
  Create `assets/styles/setup/07.components/stepper-list.css` in the consuming app and set
58
83
  tokens on `:root`. This applies to every `StepperList` across the site.
@@ -78,7 +103,15 @@ tokens on `:root`. This applies to every `StepperList` across the site.
78
103
 
79
104
  ---
80
105
 
81
- ## Page-scoped overrides
106
+ ## Local overrides
107
+
108
+ Set the tokens above on an element you own (a page or section class, or a class added with
109
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
110
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
111
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
112
+ `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
113
+
114
+ ### Page or section
82
115
 
83
116
  Override tokens for a specific section by scoping them under the page or layout wrapper.
84
117
  No `:deep()` is required (component styles are unscoped).
@@ -96,9 +129,7 @@ No `:deep()` is required (component styles are unscoped).
96
129
  }
97
130
  ```
98
131
 
99
- ---
100
-
101
- ## Per-instance overrides via styleClassPassthrough
132
+ ### One instance
102
133
 
103
134
  Use sparingly — prefer global or page-scoped CSS. When a single instance needs a distinct
104
135
  visual style, pass a modifier class:
@@ -125,6 +156,13 @@ visual style, pass a modifier class:
125
156
 
126
157
  ---
127
158
 
159
+ ## Class passthrough
160
+
161
+ `style-class-passthrough` adds classes to the root `<ul>`/`<ol>`. Tokens set on a passthrough class
162
+ land for the whole list. Reactive after mount.
163
+
164
+ ---
165
+
128
166
  ## Notes
129
167
 
130
168
  - `--stepper-list-counter-size` takes precedence over the `indicatorSize` prop. Use the prop
@@ -136,3 +174,4 @@ visual style, pass a modifier class:
136
174
  - All border tokens (`--stepper-list-counter-*-border`) control the **colour** only — the
137
175
  border is always `2px solid`. Override the border shorthand directly on `.stepper-list li
138
176
  .stepper-list__indicator-counter::before` if you need a different width.
177
+
@@ -46,7 +46,12 @@ const props = withDefaults(defineProps<Props>(), {
46
46
  styleClassPassthrough: () => [],
47
47
  });
48
48
 
49
- const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
49
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
50
+
51
+ watch(
52
+ () => props.styleClassPassthrough,
53
+ () => resetElementClasses(props.styleClassPassthrough)
54
+ );
50
55
 
51
56
  const listEl = ref<HTMLElement | null>(null);
52
57
  let resizeObserver: ResizeObserver | null = null;
@@ -104,31 +109,6 @@ watch(
104
109
  --_padding-block: var(--stepper-list-padding-block, 1.2rem);
105
110
  --_gap: var(--stepper-list-gap, 2.2rem);
106
111
  --_counter-size: var(--stepper-list-counter-size, v-bind(indicatorSize));
107
- --_counter-font-size: var(--stepper-list-counter-font-size, 1.4rem);
108
- --_counter-font-weight: var(--stepper-list-counter-font-weight, 600);
109
- --_connector-width: var(--stepper-list-connector-width, 0.2rem);
110
-
111
- /* Colours */
112
- --_connector-color: var(--stepper-list-connector-color, currentColor);
113
- --_icon-color: var(--stepper-list-icon-color, currentColor);
114
-
115
- /* Circle indicator */
116
- --_counter-circle-background: var(--stepper-list-counter-circle-background, transparent);
117
- --_counter-circle-text: var(--stepper-list-counter-circle-text, currentColor);
118
- --_counter-circle-border-color: var(--stepper-list-counter-circle-border, currentColor);
119
- --_counter-circle-border-radius: var(--stepper-list-counter-circle-border-radius, 100vw);
120
-
121
- /* Disc indicator */
122
- --_counter-disc-background: var(--stepper-list-counter-disc-background, transparent);
123
- --_counter-disc-text: var(--stepper-list-counter-disc-text, currentColor);
124
- --_counter-disc-border-color: var(--stepper-list-counter-disc-border, transparent);
125
- --_counter-disc-border-radius: var(--stepper-list-counter-disc-border-radius, 100vw);
126
-
127
- /* Square indicator */
128
- --_counter-square-background: var(--stepper-list-counter-square-background, transparent);
129
- --_counter-square-text: var(--stepper-list-counter-square-text, currentColor);
130
- --_counter-square-border-color: var(--stepper-list-counter-square-border, transparent);
131
- --_counter-square-border-radius: var(--stepper-list-counter-square-border-radius, 0.25rem);
132
112
 
133
113
  list-style: none;
134
114
  counter-reset: stepper-list;
@@ -158,29 +138,29 @@ watch(
158
138
  place-content: center;
159
139
  width: var(--_counter-size);
160
140
  height: var(--_counter-size);
161
- font-size: var(--_counter-font-size);
162
- font-weight: var(--_counter-font-weight);
141
+ font-size: var(--stepper-list-counter-font-size, 1.4rem);
142
+ font-weight: var(--stepper-list-counter-font-weight, 600);
163
143
  }
164
144
 
165
145
  &.indicator-circle .stepper-list__indicator-counter::before {
166
- background-color: var(--_counter-circle-background);
167
- color: var(--_counter-circle-text);
168
- border: 2px solid var(--_counter-circle-border-color);
169
- border-radius: var(--_counter-circle-border-radius);
146
+ background-color: var(--stepper-list-counter-circle-background, transparent);
147
+ color: var(--stepper-list-counter-circle-text, currentColor);
148
+ border: 2px solid var(--stepper-list-counter-circle-border, currentColor);
149
+ border-radius: var(--stepper-list-counter-circle-border-radius, 100vw);
170
150
  }
171
151
 
172
152
  &.indicator-disc .stepper-list__indicator-counter::before {
173
- background-color: var(--_counter-disc-background);
174
- color: var(--_counter-disc-text);
175
- border: 2px solid var(--_counter-disc-border-color);
176
- border-radius: var(--_counter-disc-border-radius);
153
+ background-color: var(--stepper-list-counter-disc-background, transparent);
154
+ color: var(--stepper-list-counter-disc-text, currentColor);
155
+ border: 2px solid var(--stepper-list-counter-disc-border, transparent);
156
+ border-radius: var(--stepper-list-counter-disc-border-radius, 100vw);
177
157
  }
178
158
 
179
159
  &.indicator-square .stepper-list__indicator-counter::before {
180
- background-color: var(--_counter-square-background);
181
- color: var(--_counter-square-text);
182
- border: 2px solid var(--_counter-square-border-color);
183
- border-radius: var(--_counter-square-border-radius);
160
+ background-color: var(--stepper-list-counter-square-background, transparent);
161
+ color: var(--stepper-list-counter-square-text, currentColor);
162
+ border: 2px solid var(--stepper-list-counter-square-border, transparent);
163
+ border-radius: var(--stepper-list-counter-square-border-radius, 0.25rem);
184
164
  }
185
165
 
186
166
  &.has-indicator::before {
@@ -198,7 +178,7 @@ watch(
198
178
  justify-content: center;
199
179
 
200
180
  .indicator-icon {
201
- color: var(--_icon-color);
181
+ color: var(--stepper-list-icon-color, currentColor);
202
182
  width: var(--_counter-size) !important;
203
183
  height: var(--_counter-size) !important;
204
184
  }
@@ -216,8 +196,8 @@ watch(
216
196
  top: var(--_connector-top, calc(var(--_padding-block) + var(--_counter-size)));
217
197
  height: var(--_connector-height, auto);
218
198
  bottom: calc(-1 * var(--_padding-block));
219
- width: var(--_connector-width);
220
- background-color: var(--_connector-color);
199
+ width: var(--stepper-list-connector-width, 0.2rem);
200
+ background-color: var(--stepper-list-connector-color, currentColor);
221
201
  }
222
202
  }
223
203
  </style>
@@ -118,6 +118,15 @@ describe("StepperList", () => {
118
118
  expect(wrapper.classes()).toContain("class-b");
119
119
  });
120
120
 
121
+ it("updates classes when styleClassPassthrough changes after mount", async () => {
122
+ const wrapper = await mountSuspended(StepperList, {
123
+ props: { itemCount: 1, styleClassPassthrough: ["original"] },
124
+ });
125
+ await wrapper.setProps({ styleClassPassthrough: ["updated"] });
126
+ expect(wrapper.classes()).not.toContain("original");
127
+ expect(wrapper.classes()).toContain("updated");
128
+ });
129
+
121
130
  it("renders cleanly with no styleClassPassthrough prop", async () => {
122
131
  const wrapper = await mountSuspended(StepperList, {
123
132
  props: { itemCount: 1 },
@@ -25,3 +25,17 @@ with a strict priority order between them.
25
25
  --display-toast-provider-z-index: 1000000;
26
26
  }
27
27
  ```
28
+
29
+ ---
30
+
31
+ ## Local overrides
32
+
33
+ The `--display-toast-z-index` and `--display-toast-provider-z-index` tokens above are only read,
34
+ never declared on the toast, so they work from any ancestor, though a global `:root` value is usually
35
+ what you want for a `position: fixed` overlay. Anything else is a direct property, scoped to an
36
+ element you own (a page or section class, or a class added with `:style-class-passthrough`). Keep
37
+ the block **unlayered** (no `@layer` wrapper) so it beats the library's `@layer components`. If your
38
+ own file uses `<style scoped>`, tokens set on your element still work, but selectors that reach
39
+ inside the component need `:deep()`. Patterns and examples:
40
+ `.claude/skills/component-local-style-override.md`.
41
+
@@ -229,7 +229,6 @@ onBeforeRouteLeave(() => {
229
229
  }
230
230
 
231
231
  /* See the matching comment in DisplayToastProvider.vue — same fix, same rationale. */
232
- --_z-index: var(--display-toast-z-index, 999999);
233
232
 
234
233
  display: block;
235
234
  overflow: hidden;
@@ -237,7 +236,7 @@ onBeforeRouteLeave(() => {
237
236
  margin: 0;
238
237
  opacity: 0;
239
238
 
240
- z-index: var(--_z-index);
239
+ z-index: var(--display-toast-z-index, 999999);
241
240
 
242
241
  /* Focus styles for accessibility */
243
242
  &:focus {