srcdev-nuxt-components 9.4.12 → 9.5.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 (624) 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 +25 -6
  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 +36 -17
  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-toggle-switch.code-snippets +3 -1
  132. package/.vscode/srcdev-component-triple-toggle-switch.code-snippets +30 -0
  133. package/README.md +2 -2
  134. package/app/app.config.ts +10 -0
  135. package/app/assets/styles/setup/02.colours/_orange.css +11 -11
  136. package/app/assets/styles/setup/02.colours/_theme-params.css +2 -2
  137. package/app/assets/styles/setup/03.theming/_default.css +1 -22
  138. package/app/assets/styles/setup/03.theming/_theme-slots.css +1 -1
  139. package/app/assets/styles/setup/03.theming/_warning.css +8 -10
  140. package/app/assets/styles/setup/04.elements/forms/02.typography.css +0 -14
  141. package/app/assets/styles/setup/04.elements/forms/06.button-geometry.css +1 -1
  142. package/app/assets/styles/setup/index.css +1 -1
  143. package/app/components/01.atoms/alert-mask/AlertMaskCore.vue +23 -5
  144. package/app/components/01.atoms/alert-mask/CONSUMER-STYLING.md +23 -5
  145. package/app/components/01.atoms/alert-mask/stories/AlertMaskCore.stories.ts +45 -19
  146. package/app/components/01.atoms/alert-mask/tests/AlertMaskCore.spec.ts +35 -1
  147. package/app/components/01.atoms/animations/animated-svg-text/CONSUMER-STYLING.md +13 -0
  148. package/app/components/01.atoms/animations/clip-element/CONSUMER-STYLING.md +13 -0
  149. package/app/components/01.atoms/animations/clip-element/ClipElement.vue +2 -2
  150. package/app/components/01.atoms/animations/container-glow/CONSUMER-STYLING.md +26 -5
  151. package/app/components/01.atoms/animations/entry/.nuxt/app.config.mjs +21 -0
  152. package/app/components/01.atoms/animations/entry/.nuxt/components.d.ts +66 -0
  153. package/app/components/01.atoms/animations/entry/.nuxt/imports.d.ts +30 -0
  154. package/app/components/01.atoms/animations/entry/.nuxt/manifest/meta/test.json +1 -0
  155. package/app/components/01.atoms/animations/entry/.nuxt/types/app.config.d.ts +35 -0
  156. package/app/components/01.atoms/animations/entry/.nuxt/types/build.d.ts +23 -0
  157. package/app/components/01.atoms/animations/entry/.nuxt/types/builder-env.d.ts +1 -0
  158. package/app/components/01.atoms/animations/entry/.nuxt/types/components.d.ts +71 -0
  159. package/app/components/01.atoms/animations/entry/.nuxt/types/imports.d.ts +386 -0
  160. package/app/components/01.atoms/animations/entry/.nuxt/types/middleware.d.ts +11 -0
  161. package/app/components/01.atoms/animations/entry/.nuxt/types/modules.d.ts +79 -0
  162. package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-layouts.d.ts +17 -0
  163. package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-nuxt.d.ts +64 -0
  164. package/app/components/01.atoms/animations/entry/.nuxt/types/plugins.d.ts +29 -0
  165. package/app/components/01.atoms/animations/entry/.nuxt/types/runtime-config.d.ts +32 -0
  166. package/app/components/01.atoms/animations/entry/.nuxt/types/shared-imports.d.ts +10 -0
  167. package/app/components/01.atoms/animations/entry/.nuxt/types/vue-shim.d.ts +0 -0
  168. package/app/components/01.atoms/animations/entry/.nuxtrc +1 -0
  169. package/app/components/01.atoms/animations/entry/CONSUMER-STYLING.md +65 -0
  170. package/app/components/01.atoms/animations/entry/EntryAnimation.vue +6 -5
  171. package/app/components/01.atoms/animations/entry/node_modules/.cache/nuxt/chrome-workspace.json +1 -0
  172. package/app/components/01.atoms/animations/entry/node_modules/.cache/vite/client/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  173. package/app/components/01.atoms/animations/entry/stories/EntryAnimation.stories.ts +1 -1
  174. package/app/components/01.atoms/animations/entry/tests/EntryAnimation.spec.ts +25 -0
  175. package/app/components/01.atoms/animations/glowing-border/CONSUMER-STYLING.md +24 -5
  176. package/app/components/01.atoms/animations/marquee-scroller/CONSUMER-STYLING.md +20 -0
  177. package/app/components/01.atoms/animations/rotating-carousel-image/CONSUMER-STYLING.md +17 -0
  178. package/app/components/01.atoms/animations/scroll-reveal-frame/CONSUMER-STYLING.md +77 -0
  179. package/app/components/01.atoms/animations/scroll-reveal-frame/ScrollRevealFrame.vue +37 -78
  180. package/app/components/01.atoms/animations/scroll-reveal-frame/stories/ScrollRevealFrame.stories.ts +48 -0
  181. package/app/components/01.atoms/animations/scroll-reveal-frame/tests/ScrollRevealFrame.spec.ts +40 -33
  182. package/app/components/01.atoms/animations/scroll-reveal-frame/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +4 -4
  183. package/app/components/01.atoms/animations/scroll-reveal-image/CONSUMER-STYLING.md +74 -0
  184. package/app/components/01.atoms/animations/scroll-reveal-image/ScrollRevealImage.vue +14 -44
  185. package/app/components/01.atoms/animations/scroll-reveal-image/stories/ScrollRevealImage.stories.ts +50 -1
  186. package/app/components/01.atoms/animations/scroll-reveal-image/tests/ScrollRevealImage.spec.ts +27 -20
  187. package/app/components/01.atoms/animations/scroll-reveal-image/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +4 -4
  188. package/app/components/01.atoms/animations/section-parallax/CONSUMER-STYLING.md +21 -4
  189. package/app/components/01.atoms/animations/view-timeline/CONSUMER-STYLING.md +25 -0
  190. package/app/components/01.atoms/banner-video/CONSUMER-STYLING.md +12 -5
  191. package/app/components/01.atoms/canvas-switcher/CONSUMER-STYLING.md +20 -7
  192. package/app/components/01.atoms/canvas-switcher/CanvasSwitcher.vue +12 -7
  193. package/app/components/01.atoms/card/CONSUMER-STYLING.md +47 -42
  194. package/app/components/01.atoms/card/CardCore.vue +7 -17
  195. package/app/components/01.atoms/clipped-panel/CONSUMER-STYLING.md +13 -0
  196. package/app/components/01.atoms/content-wrappers/docs-pages/CONSUMER-STYLING.md +127 -0
  197. package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +44 -77
  198. package/app/components/01.atoms/content-wrappers/docs-pages/stories/ContentDocs.stories.ts +3 -3
  199. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/CONSUMER-STYLING.md +14 -1
  200. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/stories/DashboardQuadGrid.stories.ts +2 -0
  201. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/CONSUMER-STYLING.md +13 -0
  202. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/stories/DashboardStatsGrid.stories.ts +2 -0
  203. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/CONSUMER-STYLING.md +72 -0
  204. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/LayoutGridByCols.vue +26 -25
  205. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/stories/LayoutGridByCols.stories.ts +91 -107
  206. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/LayoutGridByCols.spec.ts +50 -15
  207. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +5 -5
  208. package/app/components/01.atoms/display-banner/CONSUMER-STYLING.md +13 -0
  209. package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +82 -54
  210. package/app/components/01.atoms/display-dialog/DisplayDialog.vue +38 -45
  211. package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +25 -0
  212. package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +21 -0
  213. package/app/components/01.atoms/display-pill/CONSUMER-STYLING.md +112 -0
  214. package/app/components/01.atoms/display-pill/DisplayPill.vue +88 -50
  215. package/app/components/01.atoms/display-pill/stories/DisplayPill.stories.ts +56 -3
  216. package/app/components/01.atoms/display-pill/tests/DisplayPill.spec.ts +104 -4
  217. package/app/components/01.atoms/display-pill/tests/__snapshots__/DisplayPill.spec.ts.snap +3 -3
  218. package/app/components/01.atoms/display-tooltip/CONSUMER-STYLING.md +22 -2
  219. package/app/components/01.atoms/display-tooltip/DisplayTooltip.vue +18 -26
  220. package/app/components/01.atoms/glass-panel/CONSUMER-STYLING.md +91 -0
  221. package/app/components/01.atoms/glass-panel/GlassPanel.vue +34 -30
  222. package/app/components/01.atoms/glass-panel/stories/GlassPanel.stories.ts +121 -0
  223. package/app/components/01.atoms/glass-panel/tests/GlassPanel.spec.ts +61 -0
  224. package/app/components/01.atoms/grids/auto-grid/AutoGrid.vue +5 -10
  225. package/app/components/01.atoms/grids/auto-grid/CONSUMER-STYLING.md +76 -0
  226. package/app/components/01.atoms/grids/auto-grid/stories/AutoGrid.stories.ts +5 -4
  227. package/app/components/01.atoms/grids/auto-grid/tests/AutoGrid.spec.ts +8 -0
  228. package/app/components/01.atoms/grids/column-flow-grid/CONSUMER-STYLING.md +11 -2
  229. package/app/components/01.atoms/grids/grid-stack/CONSUMER-STYLING.md +76 -0
  230. package/app/components/01.atoms/grids/grid-stack/GridStack.vue +6 -1
  231. package/app/components/01.atoms/grids/grid-stack/stories/GridStack.stories.ts +1 -1
  232. package/app/components/01.atoms/grids/grid-stack/tests/GridStack.spec.ts +35 -0
  233. package/app/components/01.atoms/grids/masonry-grid/CONSUMER-STYLING.md +11 -2
  234. package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +5 -10
  235. package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +15 -0
  236. package/app/components/01.atoms/navigation/skip-links/CONSUMER-STYLING.md +13 -0
  237. package/app/components/01.atoms/navigation/tabs/CONSUMER-STYLING.md +21 -0
  238. package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +46 -8
  239. package/app/components/01.atoms/page-row/PageRow.vue +17 -13
  240. package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +8 -0
  241. package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +7 -11
  242. package/app/components/01.atoms/pop-over/CONSUMER-STYLING.md +13 -0
  243. package/app/components/01.atoms/qr-code/CONSUMER-STYLING.md +48 -0
  244. package/app/components/01.atoms/qr-code/DisplayQrCode.vue +5 -1
  245. package/app/components/01.atoms/qr-code/stories/DisplayQrCode.stories.ts +11 -3
  246. package/app/components/01.atoms/qr-code/tests/DisplayQrCode.spec.ts +15 -0
  247. package/app/components/01.atoms/text-block/CONSUMER-STYLING.md +49 -0
  248. package/app/components/01.atoms/text-block/TextBlock.vue +13 -5
  249. package/app/components/01.atoms/text-block/stories/TextBlock.stories.ts +84 -0
  250. package/app/components/01.atoms/text-block/tests/TextBlock.spec.ts +78 -0
  251. package/app/components/01.atoms/text-block/tests/__snapshots__/TextBlock.spec.ts.snap +7 -0
  252. package/app/components/01.atoms/text-blocks/eyebrow-text/CONSUMER-STYLING.md +56 -0
  253. package/app/components/01.atoms/text-blocks/eyebrow-text/EyebrowText.vue +10 -5
  254. package/app/components/01.atoms/text-blocks/eyebrow-text/tests/EyebrowText.spec.ts +11 -0
  255. package/app/components/01.atoms/text-blocks/header-block/CONSUMER-STYLING.md +16 -1
  256. package/app/components/01.atoms/text-blocks/hero-text/CONSUMER-STYLING.md +74 -0
  257. package/app/components/01.atoms/text-blocks/hero-text/HeroText.vue +14 -9
  258. package/app/components/01.atoms/text-blocks/hero-text/tests/HeroText.spec.ts +11 -0
  259. package/app/components/01.atoms/text-blocks/link-text/CONSUMER-STYLING.md +45 -0
  260. package/app/components/01.atoms/text-blocks/link-text/LinkText.vue +15 -8
  261. package/app/components/01.atoms/text-blocks/link-text/tests/LinkText.spec.ts +11 -0
  262. package/app/components/01.atoms/ui-block-decorated/CONSUMER-STYLING.md +13 -0
  263. package/app/components/02.molecules/action-menu/ActionMenu.vue +28 -30
  264. package/app/components/02.molecules/action-menu/{ActionMenuItemCore.vue → ActionMenuItem.vue} +12 -14
  265. package/app/components/02.molecules/action-menu/CONSUMER-STYLING.md +90 -76
  266. package/app/components/02.molecules/action-menu/stories/ActionMenu.stories.ts +48 -41
  267. package/app/components/02.molecules/action-menu/tests/ActionMenu.spec.ts +46 -1
  268. package/app/components/02.molecules/action-menu/tests/{ActionMenuItemCore.spec.ts → ActionMenuItem.spec.ts} +11 -5
  269. package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItem.spec.ts.snap +27 -0
  270. package/app/components/02.molecules/alert-content/AlertContent.vue +17 -8
  271. package/app/components/02.molecules/alert-content/AlertContentInner.vue +57 -30
  272. package/app/components/02.molecules/alert-content/CONSUMER-STYLING.md +84 -0
  273. package/app/components/02.molecules/alert-content/stories/AlertContent.stories.ts +39 -0
  274. package/app/components/02.molecules/alert-content/tests/AlertContent.spec.ts +32 -0
  275. package/app/components/02.molecules/alert-content/tests/AlertContentInner.spec.ts +32 -0
  276. package/app/components/02.molecules/alert-masked-content/AlertMaskedContent.vue +9 -5
  277. package/app/components/02.molecules/alert-masked-content/CONSUMER-STYLING.md +73 -0
  278. package/app/components/02.molecules/alert-masked-content/stories/AlertMaskedContent.stories.ts +91 -10
  279. package/app/components/02.molecules/alert-masked-content/tests/AlertMaskedContent.spec.ts +52 -0
  280. package/app/components/02.molecules/cookie-consent-banner/CONSUMER-STYLING.md +95 -0
  281. package/app/components/02.molecules/cookie-consent-banner/CookieConsentBanner.vue +149 -0
  282. package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/stories/CookieConsentBanner.stories.ts +22 -3
  283. package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/tests/CookieConsentBanner.spec.ts +81 -4
  284. package/app/components/02.molecules/display-avatar/CONSUMER-STYLING.md +63 -0
  285. package/app/components/02.molecules/display-avatar/DisplayAvatar.vue +120 -0
  286. package/app/components/{01.atoms → 02.molecules}/display-avatar/stories/DisplayAvatar.stories.ts +56 -14
  287. package/app/components/{01.atoms → 02.molecules}/display-avatar/tests/DisplayAvatar.spec.ts +43 -11
  288. package/app/components/02.molecules/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +11 -0
  289. package/app/components/02.molecules/display-chip/CONSUMER-STYLING.md +57 -0
  290. package/app/components/02.molecules/display-chip/DisplayChip.vue +50 -83
  291. package/app/components/02.molecules/display-chip/tests/DisplayChip.spec.ts +10 -10
  292. package/app/components/02.molecules/display-chip/tests/__snapshots__/DisplayChip.spec.ts.snap +4 -4
  293. package/app/components/02.molecules/display-theme-switch/CONSUMER-STYLING.md +25 -4
  294. package/app/components/02.molecules/display-theme-switch/DisplayThemeSwitch.vue +9 -6
  295. package/app/components/02.molecules/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +6 -1
  296. package/app/components/02.molecules/display-theme-switch/tests/DisplayThemeSwitch.spec.ts +10 -1
  297. package/app/components/02.molecules/display-tooltip-defined/CONSUMER-STYLING.md +11 -0
  298. package/app/components/02.molecules/expandable/accordian/CONSUMER-STYLING.md +11 -4
  299. package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +12 -5
  300. package/app/components/02.molecules/expandable/expanding-panel-classic/CONSUMER-STYLING.md +12 -5
  301. package/app/components/02.molecules/input-copy/CONSUMER-STYLING.md +12 -5
  302. package/app/components/02.molecules/input-copy/InputCopy.vue +12 -25
  303. package/app/components/02.molecules/input-copy/stories/InputCopy.stories.ts +1 -1
  304. package/app/components/02.molecules/input-copy/tests/InputCopy.spec.ts +1 -1
  305. package/app/components/02.molecules/navigation/deep-expanding-menu/CONSUMER-STYLING.md +13 -0
  306. package/app/components/02.molecules/navigation/deep-expanding-menu-classic/CONSUMER-STYLING.md +11 -0
  307. package/app/components/02.molecules/navigation/site-navigation/CONSUMER-STYLING.md +109 -0
  308. package/app/components/02.molecules/navigation/site-navigation/SiteNavigation.vue +37 -55
  309. package/app/components/02.molecules/navigation/site-navigation/stories/SiteNavigation.stories.ts +22 -1
  310. package/app/components/02.molecules/navigation/site-navigation/tests/SiteNavigation.spec.ts +41 -6
  311. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +13 -8
  312. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +18 -36
  313. package/app/components/02.molecules/navigation/tab-navigation/stories/TabNavigation.stories.ts +1 -1
  314. package/app/components/02.molecules/navigation/tab-navigation/tests/TabNavigation.spec.ts +1 -1
  315. package/app/components/02.molecules/opening-hours/CONSUMER-STYLING.md +134 -0
  316. package/app/components/02.molecules/opening-hours/OpeningHours.vue +352 -0
  317. package/app/components/02.molecules/opening-hours/stories/OpeningHours.stories.ts +127 -0
  318. package/app/components/02.molecules/opening-hours/tests/OpeningHours.spec.ts +228 -0
  319. package/app/components/02.molecules/opening-hours/tests/OpeningHours.structuredData.spec.ts +45 -0
  320. package/app/components/02.molecules/opening-hours/tests/__snapshots__/OpeningHours.spec.ts.snap +23 -0
  321. package/app/components/02.molecules/opening-hours/tests/buildOpeningHoursSpecification.spec.ts +52 -0
  322. package/app/components/02.molecules/price-list/CONSUMER-STYLING.md +106 -0
  323. package/app/components/02.molecules/price-list/PriceList.vue +48 -40
  324. package/app/components/02.molecules/price-list/stories/PriceList.stories.ts +15 -2
  325. package/app/components/02.molecules/price-list/tests/PriceList.spec.ts +39 -2
  326. package/app/components/02.molecules/price-list/tests/__snapshots__/PriceList.spec.ts.snap +4 -16
  327. package/app/components/02.molecules/pricing-card/CONSUMER-STYLING.md +12 -5
  328. package/app/components/02.molecules/pricing-card/PricingCard.vue +28 -60
  329. package/app/components/02.molecules/pricing-card/tests/PricingCard.spec.ts +1 -1
  330. package/app/components/02.molecules/profile-section/CONSUMER-STYLING.md +53 -0
  331. package/app/components/02.molecules/profile-section/ProfileSection.vue +53 -66
  332. package/app/components/02.molecules/profile-section/tests/ProfileSection.spec.ts +4 -4
  333. package/app/components/02.molecules/profile-section/tests/__snapshots__/ProfileSection.spec.ts.snap +6 -12
  334. package/app/components/02.molecules/prompt/CONSUMER-STYLING.md +51 -0
  335. package/app/components/{01.atoms → 02.molecules}/prompt/DisplayPrompt.vue +23 -8
  336. package/app/components/{01.atoms → 02.molecules}/prompt/stories/DisplayPrompt.stories.ts +18 -1
  337. package/app/components/{01.atoms → 02.molecules}/prompt/tests/DisplayPrompt.spec.ts +37 -7
  338. package/app/components/02.molecules/qr-code/CONSUMER-STYLING.md +66 -0
  339. package/app/components/02.molecules/qr-code/CaptureQrCode.vue +31 -12
  340. package/app/components/02.molecules/qr-code/DecodeQrCode.vue +55 -19
  341. package/app/components/02.molecules/qr-code/stories/CaptureQrCode.stories.ts +56 -0
  342. package/app/components/02.molecules/qr-code/stories/DecodeQrCode.stories.ts +53 -0
  343. package/app/components/02.molecules/qr-code/tests/CaptureQrCode.spec.ts +68 -20
  344. package/app/components/02.molecules/qr-code/tests/DecodeQrCode.spec.ts +44 -8
  345. package/app/components/02.molecules/samaritan-prompt/CONSUMER-STYLING.md +118 -0
  346. package/app/components/02.molecules/samaritan-prompt/SamaritanPrompt.vue +108 -51
  347. package/app/components/02.molecules/samaritan-prompt/SamaritanPromptMixed.vue +63 -62
  348. package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPrompt.stories.ts +129 -0
  349. package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPromptMixed.stories.ts +124 -0
  350. package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPrompt.spec.ts +66 -0
  351. package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPromptMixed.spec.ts +95 -17
  352. package/app/components/02.molecules/select-menu/CONSUMER-STYLING.md +11 -2
  353. package/app/components/02.molecules/social-icons-list/CONSUMER-STYLING.md +43 -0
  354. package/app/components/02.molecules/social-icons-list/SocialIconsList.vue +15 -15
  355. package/app/components/02.molecules/social-icons-list/stories/SocialIconsList.stories.ts +6 -1
  356. package/app/components/02.molecules/social-icons-list/tests/SocialIconsList.spec.ts +22 -1
  357. package/app/components/02.molecules/social-icons-list/tests/__snapshots__/SocialIconsList.spec.ts.snap +3 -3
  358. package/app/components/02.molecules/stepper-list/CONSUMER-STYLING.md +44 -5
  359. package/app/components/02.molecules/stepper-list/StepperList.vue +23 -43
  360. package/app/components/02.molecules/stepper-list/tests/StepperList.spec.ts +9 -0
  361. package/app/components/{01.atoms → 02.molecules}/toast/CONSUMER-STYLING.md +14 -0
  362. package/app/components/{01.atoms → 02.molecules}/toast/DisplayToast.vue +1 -2
  363. package/app/components/{01.atoms → 02.molecules}/toast/DisplayToastProvider.vue +1 -2
  364. package/app/components/{01.atoms → 02.molecules}/toast/stories/DisplayToast.stories.ts +1 -1
  365. package/app/components/{01.atoms → 02.molecules}/toast/stories/DisplayToastProvider.stories.ts +1 -1
  366. package/app/components/03.organisms/image-galleries/carousel-flip/CONSUMER-STYLING.md +13 -0
  367. package/app/components/03.organisms/image-galleries/slider-gallery/CONSUMER-STYLING.md +137 -0
  368. package/app/components/03.organisms/image-galleries/slider-gallery/SliderGallery.vue +378 -343
  369. package/app/components/03.organisms/image-galleries/slider-gallery/stories/SliderGallery.stories.ts +26 -1
  370. package/app/components/03.organisms/image-galleries/slider-gallery/tests/SliderGallery.spec.ts +102 -23
  371. package/app/components/03.organisms/image-galleries/slider-gallery/tests/__snapshots__/SliderGallery.spec.ts.snap +44 -44
  372. package/app/components/03.organisms/responsive-header/CONSUMER-STYLING.md +12 -1
  373. package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +0 -4
  374. package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +24 -3
  375. package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +3 -3
  376. package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +13 -13
  377. package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +1 -1
  378. package/app/components/03.organisms/services/service-summary/CONSUMER-STYLING.md +24 -7
  379. package/app/components/03.organisms/services/service-summary/ServiceSummary.vue +3 -3
  380. package/app/components/03.organisms/services/service-summary/stories/ServiceSummary.stories.ts +1 -1
  381. package/app/components/03.organisms/services/service-summary/tests/__snapshots__/ServiceSummary.spec.ts.snap +1 -1
  382. package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +11 -2
  383. package/app/components/03.organisms/services/services-card/ServicesCard.vue +17 -26
  384. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +21 -0
  385. package/app/components/03.organisms/services/services-grids/CONSUMER-STYLING.md +50 -0
  386. package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +9 -16
  387. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +6 -0
  388. package/app/components/03.organisms/services/services-grids/tests/ServicesCardGrid.spec.ts +18 -0
  389. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServiceSummaryGrid.spec.ts.snap +3 -3
  390. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +3 -3
  391. package/app/components/03.organisms/site-header/CONSUMER-STYLING.md +12 -1
  392. package/app/components/04.templates/page-hero-highlights/CONSUMER-STYLING.md +103 -0
  393. package/app/components/04.templates/page-hero-highlights/PageHeroHighlights.vue +144 -193
  394. package/app/components/04.templates/page-hero-highlights/PageHeroHighlightsHeader.vue +27 -37
  395. package/app/components/04.templates/page-hero-highlights/stories/PageHeroHighlights.stories.ts +56 -60
  396. package/app/components/04.templates/page-hero-highlights/stories/PageHeroHighlightsHeader.stories.ts +2 -2
  397. package/app/components/04.templates/page-hero-highlights/tests/PageHeroHighlights.spec.ts +10 -10
  398. package/app/components/04.templates/page-hero-highlights/tests/PageHeroHighlightsHeader.spec.ts +7 -7
  399. package/app/components/04.templates/page-hero-highlights/tests/__snapshots__/PageHeroHighlights.spec.ts.snap +6 -6
  400. package/app/components/05.forms/form-errors/CONSUMER-STYLING.md +112 -0
  401. package/app/components/05.forms/form-errors/InputError.vue +101 -122
  402. package/app/components/05.forms/form-errors/stories/InputError.stories.ts +125 -0
  403. package/app/components/05.forms/form-errors/tests/InputError.spec.ts +82 -31
  404. package/app/components/05.forms/form-field/CONSUMER-STYLING.md +91 -0
  405. package/app/components/05.forms/form-field/FormField.vue +26 -35
  406. package/app/components/05.forms/form-field/stories/FormField.stories.ts +104 -0
  407. package/app/components/05.forms/form-field/tests/FormField.spec.ts +75 -0
  408. package/app/components/05.forms/form-fieldset/CONSUMER-STYLING.md +88 -0
  409. package/app/components/05.forms/form-fieldset/FormFieldset.vue +34 -28
  410. package/app/components/05.forms/form-fieldset/stories/FormFieldset.stories.ts +84 -0
  411. package/app/components/05.forms/form-fieldset/tests/FormFieldset.spec.ts +111 -0
  412. package/app/components/05.forms/form-wrapper/CONSUMER-STYLING.md +101 -0
  413. package/app/components/05.forms/form-wrapper/FormWrapper.vue +32 -15
  414. package/app/components/05.forms/form-wrapper/stories/FormWrapper.stories.ts +75 -0
  415. package/app/components/05.forms/form-wrapper/tests/FormWrapper.spec.ts +57 -0
  416. package/app/components/05.forms/input-button/CONSUMER-STYLING.md +52 -7
  417. package/app/components/05.forms/input-button/{InputButtonCore.vue → InputButton.vue} +60 -18
  418. package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts → input-button.playwright.ts} +5 -5
  419. package/app/components/05.forms/input-button/stories/{InputButtonCore.stories.ts → InputButton.stories.ts} +8 -10
  420. package/app/components/05.forms/input-button/tests/{InputButtonCore.spec.ts → InputButton.spec.ts} +75 -19
  421. package/app/components/05.forms/input-button/tests/__snapshots__/{InputButtonCore.spec.ts.snap → InputButton.spec.ts.snap} +18 -18
  422. package/app/components/05.forms/input-checkbox/CONSUMER-STYLING.md +93 -0
  423. package/app/components/05.forms/input-checkbox/MultipleCheckboxes.vue +19 -25
  424. package/app/components/05.forms/input-checkbox/SingleCheckbox.vue +17 -43
  425. package/app/components/05.forms/input-checkbox/stories/MultipleCheckboxes.stories.ts +104 -0
  426. package/app/components/05.forms/input-checkbox/stories/SingleCheckbox.stories.ts +75 -0
  427. package/app/components/05.forms/input-checkbox/tests/MultipleCheckboxes.spec.ts +91 -53
  428. package/app/components/05.forms/input-checkbox/tests/SingleCheckbox.spec.ts +112 -0
  429. package/app/components/05.forms/input-checkbox-radio/CONSUMER-STYLING.md +115 -35
  430. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadio.vue +158 -0
  431. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioButton.vue +102 -101
  432. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioField.vue +100 -0
  433. package/app/components/05.forms/input-checkbox-radio/stories/{InputCheckboxRadioCore.stories.ts → InputCheckboxRadio.stories.ts} +23 -8
  434. package/app/components/05.forms/input-checkbox-radio/stories/InputCheckboxRadioButton.stories.ts +60 -16
  435. package/app/components/05.forms/input-checkbox-radio/stories/InputCheckboxRadioField.stories.ts +93 -0
  436. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadio.spec.ts +174 -0
  437. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioButton.spec.ts +87 -0
  438. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioField.spec.ts +87 -0
  439. package/app/components/05.forms/input-description/CONSUMER-STYLING.md +177 -0
  440. package/app/components/05.forms/input-description/InputDescription.vue +45 -24
  441. package/app/components/05.forms/input-description/stories/InputDescription.stories.ts +160 -0
  442. package/app/components/05.forms/input-description/tests/InputDescription.spec.ts +62 -386
  443. package/app/components/05.forms/input-label/CONSUMER-STYLING.md +134 -0
  444. package/app/components/05.forms/input-label/InputLabel.vue +99 -38
  445. package/app/components/05.forms/input-label/stories/InputLabel.stories.ts +236 -0
  446. package/app/components/05.forms/input-label/tests/InputLabel.spec.ts +113 -342
  447. package/app/components/05.forms/input-number/CONSUMER-STYLING.md +16 -7
  448. package/app/components/05.forms/input-number/{InputNumberCore.vue → InputNumber.vue} +6 -6
  449. package/app/components/05.forms/input-number/{variants/InputNumberDefault.vue → InputNumberField.vue} +12 -15
  450. package/app/components/05.forms/input-number/stories/{InputNumberCore.stories.ts → InputNumber.stories.ts} +6 -6
  451. package/app/components/05.forms/input-number/{variants/stories/InputNumberDefault.stories.ts → stories/InputNumberField.stories.ts} +5 -5
  452. package/app/components/05.forms/input-number/tests/{InputNumberCore.spec.ts → InputNumber.spec.ts} +2 -2
  453. package/app/components/05.forms/input-number/{variants/tests/InputNumberDefault.spec.ts → tests/InputNumberField.spec.ts} +8 -8
  454. package/app/components/05.forms/input-radio/CONSUMER-STYLING.md +70 -0
  455. package/app/components/05.forms/input-radio/MultipleRadiobuttons.vue +19 -30
  456. package/app/components/05.forms/input-radio/stories/MultipleRadiobuttons.stories.ts +116 -0
  457. package/app/components/05.forms/input-radio/tests/MultipleRadioButtons.spec.ts +125 -74
  458. package/app/components/05.forms/input-range/CONSUMER-STYLING.md +13 -0
  459. package/app/components/05.forms/input-range/InputRangeCore.vue +1 -1
  460. package/app/components/05.forms/input-range/{variants/InputRangeDefault.vue → InputRangeDefault.vue} +7 -11
  461. package/app/components/05.forms/input-range/{variants/tests → tests}/InputRangeDefault.spec.ts +1 -1
  462. package/app/components/05.forms/input-select/CONSUMER-STYLING.md +11 -2
  463. package/app/components/05.forms/input-select/{variants/InputSelectWithLabel.vue → InputSelectWithLabel.vue} +6 -9
  464. package/app/components/05.forms/input-select/stories/InputSelectWithLabel.stories.ts +1 -1
  465. package/app/components/05.forms/input-text/CONSUMER-STYLING.md +12 -3
  466. package/app/components/05.forms/input-text/{variants/InputPasswordWithLabel.vue → InputPasswordWithLabel.vue} +3 -3
  467. package/app/components/05.forms/input-text/{variants/InputTextAsNumberWithLabel.vue → InputTextAsNumberWithLabel.vue} +12 -15
  468. package/app/components/05.forms/input-text/InputTextCore.vue +8 -11
  469. package/app/components/05.forms/input-text/{variants/InputTextWithLabel.vue → InputTextWithLabel.vue} +9 -10
  470. package/app/components/05.forms/input-text/stories/InputPasswordWithLabel.stories.ts +1 -1
  471. package/app/components/05.forms/input-text/stories/InputTextAsNumberWithLabel.stories.ts +1 -1
  472. package/app/components/05.forms/input-text/stories/InputTextWithLabel.stories.ts +1 -1
  473. package/app/components/05.forms/input-text/tests/InputPasswordWithLabel.spec.ts +2 -1
  474. package/app/components/05.forms/input-text/tests/InputTextAsNumberWithLabel.spec.ts +1 -1
  475. package/app/components/05.forms/input-text/tests/InputTextWithLabel.spec.ts +2 -1
  476. package/app/components/05.forms/input-textarea/CONSUMER-STYLING.md +11 -2
  477. package/app/components/05.forms/input-textarea/{variants/InputTextareaWithLabel.vue → InputTextareaWithLabel.vue} +3 -7
  478. package/app/components/05.forms/input-textarea/stories/InputTextareaWithLabel.stories.ts +1 -1
  479. package/app/components/05.forms/patterns/stories/ContactForm.stories.ts +9 -10
  480. package/app/components/05.forms/patterns/stories/LoginForm.stories.ts +10 -10
  481. package/app/components/05.forms/patterns/stories/MigratedFieldsForm.stories.ts +246 -101
  482. package/app/components/05.forms/pending-effect/CONSUMER-STYLING.md +92 -0
  483. package/app/components/05.forms/pending-effect/PendingEffect.vue +52 -45
  484. package/app/components/05.forms/pending-effect/stories/PendingEffect.stories.ts +132 -0
  485. package/app/components/05.forms/pending-effect/tests/PendingEffect.spec.ts +67 -0
  486. package/app/components/05.forms/toggle-switch/CONSUMER-STYLING.md +26 -2
  487. package/app/components/05.forms/toggle-switch/ToggleSwitchCore.vue +10 -29
  488. package/app/components/05.forms/toggle-switch/{variants/ToggleSwitchWithLabel.vue → ToggleSwitchWithLabel.vue} +25 -12
  489. package/app/components/05.forms/toggle-switch/{variants/ToggleSwitchWithLabelInline.vue → ToggleSwitchWithLabelInline.vue} +2 -4
  490. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +2 -4
  491. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +4 -1
  492. package/app/components/05.forms/toggle-switch/tests/ToggleSwitchWithLabel.spec.ts +133 -0
  493. package/app/components/05.forms/triple-toggle-switch/CONSUMER-STYLING.md +75 -62
  494. package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitch.vue +243 -0
  495. package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitch.stories.ts +104 -0
  496. package/app/components/05.forms/triple-toggle-switch/tests/TripleToggleSwitch.spec.ts +138 -0
  497. package/app/composables/tests/useCancellableTimer.spec.ts +48 -0
  498. package/app/composables/tests/useMaxChildWidth.spec.ts +67 -0
  499. package/app/composables/useCancellableTimer.ts +27 -7
  500. package/app/composables/useMaxChildWidth.ts +4 -6
  501. package/app/types/app-config.d.ts +10 -0
  502. package/app/types/components/cookie-consent-banner.d.ts +3 -0
  503. package/app/types/components/index.ts +6 -1
  504. package/app/types/components/opening-hours.d.ts +48 -0
  505. package/app/types/components/price-list.d.ts +11 -0
  506. package/app/types/components/profile-section.d.ts +6 -0
  507. package/app/types/components/samaritan-prompt.d.ts +13 -0
  508. package/app/types/components/services-card.d.ts +9 -0
  509. package/app/types/components/slider-gallery.d.ts +2 -0
  510. package/app/types/components/social-icons-list.d.ts +2 -0
  511. package/app/types/forms/types.forms.d.ts +3 -0
  512. package/app/types/forms/types.zodFormControl.d.ts +0 -3
  513. package/app/utils/opening-hours.ts +44 -0
  514. package/nuxt.config.ts +5 -1
  515. package/package.json +2 -2
  516. package/ramps.config.mjs +1 -1
  517. package/.claude/commands/create-commit-message.md +0 -13
  518. package/.claude/commands/create-release-notes.md +0 -34
  519. package/.claude/commands/migrate-component.md +0 -169
  520. package/.claude/commands/run-commit.md +0 -13
  521. package/.claude/component-ledger/artifact-url.txt +0 -1
  522. package/.claude/component-ledger/audit.json +0 -1
  523. package/.claude/component-ledger/build.mjs +0 -164
  524. package/.claude/component-ledger/output.html +0 -569
  525. package/.claude/component-ledger/template.html +0 -569
  526. package/.claude/hooks/check-component-update.sh +0 -95
  527. package/.claude/hooks/refresh-component-ledger.sh +0 -32
  528. package/.claude/settings.json +0 -134
  529. package/.claude/settings.local.json +0 -38
  530. package/.claude/skills/components/alert-content-inner.md +0 -60
  531. package/.claude/skills/components/navigation-horizontal.md +0 -99
  532. package/.claude/skills/components/samaritan-prompt-mixed.md +0 -139
  533. package/app/components/01.atoms/content-wrappers/content-columns-2/ContentColumns2.vue +0 -51
  534. package/app/components/01.atoms/content-wrappers/content-columns-2/stories/ContentColumns2.stories.ts +0 -110
  535. package/app/components/01.atoms/content-wrappers/content-columns-2/tests/ContentColumns2.spec.ts +0 -105
  536. package/app/components/01.atoms/content-wrappers/content-columns-2/tests/__snapshots__/ContentColumns2.spec.ts.snap +0 -14
  537. package/app/components/01.atoms/content-wrappers/content-width/ContentWidth.vue +0 -88
  538. package/app/components/01.atoms/content-wrappers/content-width/stories/ContentWidth.stories.ts +0 -362
  539. package/app/components/01.atoms/content-wrappers/content-width/tests/ContentWidth.spec.ts +0 -132
  540. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGrid.spec.ts.snap +0 -36
  541. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/LayoutGridByWidth.vue +0 -70
  542. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/stories/LayoutGridByWidth.stories.ts +0 -220
  543. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/LayoutGridByWidth.spec.ts +0 -174
  544. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGrid.spec.ts.snap +0 -36
  545. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +0 -36
  546. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGridByWidth.spec.ts.snap +0 -36
  547. package/app/components/01.atoms/cookie-consent-banner/CookieConsentBanner.vue +0 -148
  548. package/app/components/01.atoms/display-avatar/DisplayAvatar.vue +0 -130
  549. package/app/components/01.atoms/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +0 -11
  550. package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItemCore.spec.ts.snap +0 -27
  551. package/app/components/02.molecules/navigation/navigation-horizontal/NavigationHorizontal.vue +0 -162
  552. package/app/components/02.molecules/navigation/navigation-horizontal/stories/NavigationHorizontal.stories.ts +0 -373
  553. package/app/components/02.molecules/navigation/navigation-horizontal/tests/NavigationHorizontal.spec.ts +0 -152
  554. package/app/components/02.molecules/navigation/navigation-horizontal/tests/__snapshots__/NavigationHorizontal.spec.ts.snap +0 -17
  555. package/app/components/02.molecules/qr-code/stories/QrCode.stories.ts +0 -101
  556. package/app/components/03.organisms/colour-finder/ColourFinder.vue +0 -1519
  557. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -202
  558. package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -105
  559. package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -320
  560. package/app/components/05.forms/toggle-switch/variants/tests/ToggleSwitchWithLabel.spec.ts +0 -77
  561. package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -314
  562. package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitchCore.stories.ts +0 -63
  563. package/.vscode/{srcdev-component-dialog.code-snippets → srcdev-component-display-dialog.code-snippets} +0 -0
  564. package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToast.spec.ts +1 -1
  565. /package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToastProvider.spec.ts +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-chromium-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-secondary-firefox-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-secondary-webkit-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-chromium-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-icons-tertiary-firefox-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-icons-tertiary-webkit-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-chromium-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-primary-pending-firefox-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-primary-pending-webkit-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-chromium-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-secondary-pill-firefox-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-secondary-pill-webkit-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-chromium-darwin.png +0 -0
  579. /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
  580. /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
  581. /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
  582. /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
  583. /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
  584. /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
  585. /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
  586. /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
  587. /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
  588. /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
  589. /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
  590. /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
  591. /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
  592. /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
  593. /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
  594. /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
  595. /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
  596. /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
  597. /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
  598. /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
  599. /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
  600. /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
  601. /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
  602. /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
  603. /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
  604. /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
  605. /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
  606. /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
  607. /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
  608. /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
  609. /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
  610. /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
  611. /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
  612. /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
  613. /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
  614. /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
  615. /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
  616. /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
  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-chromium-darwin.png +0 -0
  618. /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
  619. /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
  620. /package/app/components/05.forms/input-range/{variants/stories → stories}/InputRangeDefault.stories.ts +0 -0
  621. /package/app/components/05.forms/input-select/{variants/tests → tests}/InputSelectWithLabel.spec.ts +0 -0
  622. /package/app/components/05.forms/input-textarea/{variants/tests → tests}/InputTextareaWithLabel.spec.ts +0 -0
  623. /package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabelInline.spec.ts +0 -0
  624. /package/app/types/components/{navigation-horizontal.d.ts → nav-item.d.ts} +0 -0
@@ -18,6 +18,22 @@ const meta: Meta<typeof SliderGallery> = {
18
18
  control: { type: "number", min: 100, step: 100 },
19
19
  description: "Slide transition duration in milliseconds",
20
20
  },
21
+ ariaLabel: {
22
+ control: { type: "text" },
23
+ description: "aria-label on the carousel region",
24
+ },
25
+ seeMoreText: {
26
+ control: { type: "text" },
27
+ description: "Link text for slides that have an href",
28
+ },
29
+ prevAriaLabel: { control: { type: "text" }, description: "Previous button aria-label" },
30
+ nextAriaLabel: { control: { type: "text" }, description: "Next button aria-label" },
31
+ prevIcon: { control: { type: "text" }, description: "Previous button icon" },
32
+ nextIcon: { control: { type: "text" }, description: "Next button icon" },
33
+ textScrim: {
34
+ control: { type: "boolean" },
35
+ description: "Gradient behind the slide text, matched to each slide's textBrightness",
36
+ },
21
37
  styleClassPassthrough: {
22
38
  control: "object",
23
39
  description: "Additional CSS classes applied to the root element",
@@ -27,6 +43,13 @@ const meta: Meta<typeof SliderGallery> = {
27
43
  autoRun: true,
28
44
  autoRunInterval: 7000,
29
45
  animationDuration: 3000,
46
+ textScrim: true,
47
+ ariaLabel: "Image gallery",
48
+ seeMoreText: "SEE MORE",
49
+ prevAriaLabel: "Previous image",
50
+ nextAriaLabel: "Next image",
51
+ prevIcon: "ic:outline-keyboard-arrow-left",
52
+ nextIcon: "ic:outline-keyboard-arrow-right",
30
53
  styleClassPassthrough: [],
31
54
  },
32
55
  parameters: {
@@ -34,7 +57,7 @@ const meta: Meta<typeof SliderGallery> = {
34
57
  docs: {
35
58
  description: {
36
59
  component:
37
- "A full-screen image slider gallery with animated slide transitions, thumbnail navigation, arrow controls, and keyboard support. Gallery data is passed via v-model:galleryData.",
60
+ "A full-screen image slider gallery with animated slide transitions, thumbnail navigation, arrow controls, and keyboard support. Gallery data is passed via v-model:galleryData. Auto-advance pauses on hover/focus and is off under reduced motion; slides with an href get a see-more link.",
38
61
  },
39
62
  },
40
63
  },
@@ -55,6 +78,7 @@ const sampleSlides: IGalleryData[] = [
55
78
  description: "Vast mountain ranges stretching to the horizon at the golden hour of sunrise.",
56
79
  thumbnail: { title: "Into the Wild", description: "Landscape" },
57
80
  textBrightness: "light",
81
+ href: "#into-the-wild",
58
82
  },
59
83
  {
60
84
  src: "https://picsum.photos/seed/gallery2/1920/1080",
@@ -65,6 +89,7 @@ const sampleSlides: IGalleryData[] = [
65
89
  description: "Modern skyscrapers reflecting the warm hues of the setting sun.",
66
90
  thumbnail: { title: "City Lights", description: "Architecture" },
67
91
  textBrightness: "light",
92
+ href: "#city-lights",
68
93
  },
69
94
  {
70
95
  src: "https://picsum.photos/seed/gallery3/1920/1080",
@@ -94,25 +94,55 @@ describe("SliderGallery", () => {
94
94
  expect(wrapper.classes()).toContain("slider-gallery");
95
95
  });
96
96
 
97
+ // ─── Text scrim ───────────────────────────────────────────────────────────
98
+
99
+ it("adds has-text-scrim to the root by default", async () => {
100
+ const wrapper = await mountSuspended(SliderGallery);
101
+ expect(wrapper.classes()).toContain("has-text-scrim");
102
+ });
103
+
104
+ it("omits has-text-scrim when textScrim is false", async () => {
105
+ const wrapper = await mountSuspended(SliderGallery, { props: { galleryData: mockGalleryData, textScrim: false } });
106
+ expect(wrapper.classes()).not.toContain("has-text-scrim");
107
+ });
108
+
109
+ it("toggles has-text-scrim when textScrim changes after mount", async () => {
110
+ const wrapper = await mountSuspended(SliderGallery);
111
+ await wrapper.setProps({ textScrim: false });
112
+ expect(wrapper.classes()).not.toContain("has-text-scrim");
113
+ });
114
+
115
+ it("marks each main slide with its textBrightness", async () => {
116
+ const wrapper = await mountAndLoad(mockGalleryData, mockImage);
117
+ const slides = wrapper.findAll(".slider-gallery-list .slider-gallery-item");
118
+ expect(slides.map((slide) => slide.attributes("data-text-brightness"))).toEqual(["light", "dark", "light"]);
119
+ });
120
+
121
+ it("marks only slides with overlay text as data-has-text", async () => {
122
+ const wrapper = await mountAndLoad(mockGalleryData, mockImage);
123
+ const slides = wrapper.findAll(".slider-gallery-list .slider-gallery-item");
124
+ expect(slides.map((slide) => slide.attributes("data-has-text") !== undefined)).toEqual([true, true, false]);
125
+ });
126
+
97
127
  // ─── Loading state ────────────────────────────────────────────────────────
98
128
 
99
129
  it("shows loading state before images load", async () => {
100
130
  const wrapper = await mountSuspended(SliderGallery, {
101
131
  props: { galleryData: mockGalleryData },
102
132
  });
103
- expect(wrapper.find(".loading-state").exists()).toBe(true);
133
+ expect(wrapper.find(".slider-gallery-loading").exists()).toBe(true);
104
134
  });
105
135
 
106
136
  it("hides gallery content before images load", async () => {
107
137
  const wrapper = await mountSuspended(SliderGallery, {
108
138
  props: { galleryData: mockGalleryData },
109
139
  });
110
- expect(wrapper.find(".gallery-content").exists()).toBe(false);
140
+ expect(wrapper.find(".slider-gallery-content").exists()).toBe(false);
111
141
  });
112
142
 
113
143
  it("shows gallery content after image loads", async () => {
114
144
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
115
- expect(wrapper.find(".gallery-content").exists()).toBe(true);
145
+ expect(wrapper.find(".slider-gallery-content").exists()).toBe(true);
116
146
  });
117
147
 
118
148
  it("dismisses loading state when galleryData is empty", async () => {
@@ -120,8 +150,8 @@ describe("SliderGallery", () => {
120
150
  props: { galleryData: [] },
121
151
  });
122
152
  await nextTick();
123
- // galleryLoaded becomes false → loading-state gains the galleryLoaded class
124
- expect(wrapper.find(".loading-state.galleryLoaded").exists()).toBe(true);
153
+ // loading finishes → the loading block gains is-loaded
154
+ expect(wrapper.find(".slider-gallery-loading.is-loaded").exists()).toBe(true);
125
155
  });
126
156
 
127
157
  it("resolves loading when first image errors", async () => {
@@ -133,31 +163,31 @@ describe("SliderGallery", () => {
133
163
  await nextTick(); // extra tick — onerror → resolve → Promise.race → onMounted resume
134
164
  vi.advanceTimersByTime(500);
135
165
  await nextTick();
136
- expect(wrapper.find(".gallery-content").exists()).toBe(true);
166
+ expect(wrapper.find(".slider-gallery-content").exists()).toBe(true);
137
167
  });
138
168
 
139
169
  // ─── Gallery items ────────────────────────────────────────────────────────
140
170
 
141
171
  it("renders correct number of slide items", async () => {
142
172
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
143
- expect(wrapper.findAll(".list .item")).toHaveLength(mockGalleryData.length);
173
+ expect(wrapper.findAll(".slider-gallery-list .slider-gallery-item")).toHaveLength(mockGalleryData.length);
144
174
  });
145
175
 
146
176
  it("renders correct number of thumbnail items", async () => {
147
177
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
148
- expect(wrapper.findAll(".thumbnail .item")).toHaveLength(mockGalleryData.length);
178
+ expect(wrapper.findAll(".slider-gallery-thumbnails .slider-gallery-item")).toHaveLength(mockGalleryData.length);
149
179
  });
150
180
 
151
181
  it("renders slide image alt text correctly", async () => {
152
182
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
153
- const images = wrapper.findAll(".list .item img");
183
+ const images = wrapper.findAll(".slider-gallery-list .slider-gallery-item img");
154
184
  expect(images[0]?.attributes("alt")).toBe(mockGalleryData[0]?.alt);
155
185
  expect(images[1]?.attributes("alt")).toBe(mockGalleryData[1]?.alt);
156
186
  });
157
187
 
158
188
  it("renders thumbnail images with lazy loading", async () => {
159
189
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
160
- const thumbImages = wrapper.findAll(".thumbnail .item img");
190
+ const thumbImages = wrapper.findAll(".slider-gallery-thumbnails .slider-gallery-item img");
161
191
  thumbImages.forEach((img) => {
162
192
  expect(img.attributes("loading")).toBe("lazy");
163
193
  });
@@ -165,48 +195,48 @@ describe("SliderGallery", () => {
165
195
 
166
196
  it("renders slide content fields when provided", async () => {
167
197
  const wrapper = await mountAndLoad([mockGalleryData[0]!], mockImage);
168
- expect(wrapper.find(".list .item .author").text()).toBe(mockGalleryData[0]!.stylist);
169
- expect(wrapper.find(".list .item .title").text()).toBe(mockGalleryData[0]!.title);
170
- expect(wrapper.find(".list .item .topic").text()).toBe(mockGalleryData[0]!.category);
171
- expect(wrapper.find(".list .item .description").text()).toBe(mockGalleryData[0]!.description);
198
+ expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-author").text()).toBe(mockGalleryData[0]!.stylist);
199
+ expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-title").text()).toBe(mockGalleryData[0]!.title);
200
+ expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-topic").text()).toBe(mockGalleryData[0]!.category);
201
+ expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-description").text()).toBe(mockGalleryData[0]!.description);
172
202
  });
173
203
 
174
204
  it("renders thumbnail content when provided", async () => {
175
205
  const wrapper = await mountAndLoad([mockGalleryData[0]!], mockImage);
176
- expect(wrapper.find(".thumbnail .item .title").text()).toBe(mockGalleryData[0]!.thumbnail?.title);
177
- expect(wrapper.find(".thumbnail .item .description").text()).toBe(mockGalleryData[0]!.thumbnail?.description);
206
+ expect(wrapper.find(".slider-gallery-thumbnails .slider-gallery-item .slider-gallery-title").text()).toBe(mockGalleryData[0]!.thumbnail?.title);
207
+ expect(wrapper.find(".slider-gallery-thumbnails .slider-gallery-item .slider-gallery-description").text()).toBe(mockGalleryData[0]!.thumbnail?.description);
178
208
  });
179
209
 
180
210
  // ─── Navigation buttons ───────────────────────────────────────────────────
181
211
 
182
212
  it("renders prev and next arrow buttons", async () => {
183
213
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
184
- expect(wrapper.find("#prev").exists()).toBe(true);
185
- expect(wrapper.find("#next").exists()).toBe(true);
214
+ expect(wrapper.find(".slider-gallery-prev").exists()).toBe(true);
215
+ expect(wrapper.find(".slider-gallery-next").exists()).toBe(true);
186
216
  });
187
217
 
188
218
  it("prev button has accessible aria-label", async () => {
189
219
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
190
- expect(wrapper.find("#prev").attributes("aria-label")).toBe("Previous image");
220
+ expect(wrapper.find(".slider-gallery-prev").attributes("aria-label")).toBe("Previous image");
191
221
  });
192
222
 
193
223
  it("next button has accessible aria-label", async () => {
194
224
  const wrapper = await mountAndLoad(mockGalleryData, mockImage);
195
- expect(wrapper.find("#next").attributes("aria-label")).toBe("Next image");
225
+ expect(wrapper.find(".slider-gallery-next").attributes("aria-label")).toBe("Next image");
196
226
  });
197
227
 
198
228
  // ─── styleClassPassthrough ────────────────────────────────────────────────
199
229
 
200
230
  it("applies a single styleClassPassthrough string", async () => {
201
231
  const wrapper = await mountSuspended(SliderGallery, {
202
- props: { styleClassPassthrough: "custom-gallery" },
232
+ props: { galleryData: [], styleClassPassthrough: "custom-gallery" },
203
233
  });
204
234
  expect(wrapper.classes()).toContain("custom-gallery");
205
235
  });
206
236
 
207
237
  it("applies multiple styleClassPassthrough classes from an array", async () => {
208
238
  const wrapper = await mountSuspended(SliderGallery, {
209
- props: { styleClassPassthrough: ["class-a", "class-b"] },
239
+ props: { galleryData: [], styleClassPassthrough: ["class-a", "class-b"] },
210
240
  });
211
241
  expect(wrapper.classes()).toContain("class-a");
212
242
  expect(wrapper.classes()).toContain("class-b");
@@ -214,7 +244,7 @@ describe("SliderGallery", () => {
214
244
 
215
245
  it("updates classes when styleClassPassthrough prop changes", async () => {
216
246
  const wrapper = await mountSuspended(SliderGallery, {
217
- props: { styleClassPassthrough: ["original"] },
247
+ props: { galleryData: [], styleClassPassthrough: ["original"] },
218
248
  });
219
249
  expect(wrapper.classes()).toContain("original");
220
250
  await wrapper.setProps({ styleClassPassthrough: ["updated"] });
@@ -231,4 +261,53 @@ describe("SliderGallery", () => {
231
261
  wrapper.unmount();
232
262
  expect(spy).toHaveBeenCalledWith("keydown", expect.any(Function));
233
263
  });
264
+
265
+ // ─── Carousel semantics and a11y ──────────────────────────────────────────
266
+
267
+ it("is a labelled carousel region", async () => {
268
+ const wrapper = await mountSuspended(SliderGallery, { props: { galleryData: [], ariaLabel: "Our work" } });
269
+ expect(wrapper.attributes("role")).toBe("region");
270
+ expect(wrapper.attributes("aria-roledescription")).toBe("carousel");
271
+ expect(wrapper.attributes("aria-label")).toBe("Our work");
272
+ });
273
+
274
+ it("does not use fixed ids on the arrow buttons", async () => {
275
+ const wrapper = await mountAndLoad(mockGalleryData, mockImage);
276
+ expect(wrapper.find(".slider-gallery-prev").attributes("id")).toBeUndefined();
277
+ expect(wrapper.find(".slider-gallery-next").attributes("id")).toBeUndefined();
278
+ });
279
+
280
+ it("hides the decorative thumbnail strip from assistive tech", async () => {
281
+ const wrapper = await mountAndLoad(mockGalleryData, mockImage);
282
+ expect(wrapper.find(".slider-gallery-thumbnails").attributes("aria-hidden")).toBe("true");
283
+ });
284
+
285
+ it("renders the see-more link only for slides with an href", async () => {
286
+ const data: IGalleryData[] = [{ ...mockGalleryData[0]!, href: "/work/1" }, mockGalleryData[1]!];
287
+ const wrapper = await mountAndLoad(data, mockImage);
288
+ const ctas = wrapper.findAll(".slider-gallery-cta");
289
+ expect(ctas).toHaveLength(1);
290
+ expect(ctas[0]!.attributes("href")).toBe("/work/1");
291
+ expect(ctas[0]!.text()).toBe("SEE MORE");
292
+ });
293
+
294
+ it("pauses auto-advance while hovered and resumes on leave", async () => {
295
+ const wrapper = await mountAndLoad(mockGalleryData, mockImage);
296
+ await wrapper.trigger("mouseenter");
297
+ vi.advanceTimersByTime(7000);
298
+ await nextTick();
299
+ expect(wrapper.classes()).not.toContain("is-next");
300
+ await wrapper.trigger("mouseleave");
301
+ vi.advanceTimersByTime(7000);
302
+ await nextTick();
303
+ expect(wrapper.classes()).toContain("is-next");
304
+ });
305
+
306
+ it("does not auto-advance under prefers-reduced-motion", async () => {
307
+ vi.stubGlobal("matchMedia", vi.fn(() => ({ matches: true })));
308
+ const wrapper = await mountAndLoad(mockGalleryData, mockImage);
309
+ vi.advanceTimersByTime(7000);
310
+ await nextTick();
311
+ expect(wrapper.classes()).not.toContain("is-next");
312
+ });
234
313
  });
@@ -1,69 +1,69 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`SliderGallery > renders correct HTML structure after load 1`] = `
4
- "<div class="slider-gallery">
5
- <div class="loading-state">
6
- <div class="loading-spinner"></div>
4
+ "<div class="slider-gallery has-text-scrim" role="region" aria-roledescription="carousel" aria-label="Image gallery">
5
+ <div class="slider-gallery-loading" role="status">
6
+ <div class="slider-gallery-spinner" aria-hidden="true"></div>
7
7
  <p>Loading gallery...</p>
8
8
  </div>
9
- <div class="gallery-content">
10
- <div class="list">
11
- <div class="item"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="Slide 1" src="/_ipx/_/images/slide-1.jpg">
12
- <div class="content light">
13
- <div class="author light">Stylist One</div>
14
- <div class="title light">First Slide</div>
15
- <div class="topic light">Fashion</div>
16
- <div class="description light">Description for first slide</div>
17
- <div class="buttons light"><button>SEE MORE</button></div>
9
+ <div class="slider-gallery-content">
10
+ <div class="slider-gallery-list">
11
+ <div class="slider-gallery-item" data-text-brightness="light" data-has-text=""><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="Slide 1" src="/_ipx/_/images/slide-1.jpg">
12
+ <div class="slider-gallery-item-content light">
13
+ <div class="slider-gallery-author">Stylist One</div>
14
+ <div class="slider-gallery-title">First Slide</div>
15
+ <div class="slider-gallery-topic">Fashion</div>
16
+ <div class="slider-gallery-description">Description for first slide</div>
17
+ <!--v-if-->
18
18
  </div>
19
19
  </div>
20
- <div class="item"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="Slide 2" src="/_ipx/_/images/slide-2.jpg">
21
- <div class="content dark">
22
- <div class="author dark"></div>
23
- <div class="title dark">Second Slide</div>
24
- <div class="topic dark">Style</div>
25
- <div class="description dark"></div>
26
- <div class="buttons dark"><button>SEE MORE</button></div>
20
+ <div class="slider-gallery-item" data-text-brightness="dark" data-has-text=""><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="Slide 2" src="/_ipx/_/images/slide-2.jpg">
21
+ <div class="slider-gallery-item-content dark">
22
+ <!--v-if-->
23
+ <div class="slider-gallery-title">Second Slide</div>
24
+ <div class="slider-gallery-topic">Style</div>
25
+ <!--v-if-->
26
+ <!--v-if-->
27
27
  </div>
28
28
  </div>
29
- <div class="item"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="Slide 3" src="/_ipx/_/images/slide-3.jpg">
30
- <div class="content light">
31
- <div class="author light"></div>
32
- <div class="title light"></div>
33
- <div class="topic light"></div>
34
- <div class="description light"></div>
35
- <div class="buttons light"><button>SEE MORE</button></div>
29
+ <div class="slider-gallery-item" data-text-brightness="light"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="Slide 3" src="/_ipx/_/images/slide-3.jpg">
30
+ <div class="slider-gallery-item-content light">
31
+ <!--v-if-->
32
+ <!--v-if-->
33
+ <!--v-if-->
34
+ <!--v-if-->
35
+ <!--v-if-->
36
36
  </div>
37
37
  </div>
38
38
  </div>
39
- <div class="thumbnail">
40
- <div class="item">
41
- <div class="inner"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="Slide 1" loading="lazy" src="/_ipx/_/images/slide-1.jpg">
42
- <div class="content light">
43
- <div class="title light">Thumb 1</div>
44
- <div class="description light">Thumb desc 1</div>
39
+ <div class="slider-gallery-thumbnails" aria-hidden="true">
40
+ <div class="slider-gallery-item">
41
+ <div class="slider-gallery-thumbnail-overlay"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="" loading="lazy" src="/_ipx/_/images/slide-1.jpg">
42
+ <div class="slider-gallery-item-content light">
43
+ <div class="slider-gallery-title">Thumb 1</div>
44
+ <div class="slider-gallery-description">Thumb desc 1</div>
45
45
  </div>
46
46
  </div>
47
47
  </div>
48
- <div class="item">
49
- <div class="inner"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="Slide 2" loading="lazy" src="/_ipx/_/images/slide-2.jpg">
50
- <div class="content dark">
51
- <div class="title dark">Thumb 2</div>
52
- <div class="description dark">Thumb desc 2</div>
48
+ <div class="slider-gallery-item">
49
+ <div class="slider-gallery-thumbnail-overlay"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="" loading="lazy" src="/_ipx/_/images/slide-2.jpg">
50
+ <div class="slider-gallery-item-content dark">
51
+ <div class="slider-gallery-title">Thumb 2</div>
52
+ <div class="slider-gallery-description">Thumb desc 2</div>
53
53
  </div>
54
54
  </div>
55
55
  </div>
56
- <div class="item">
57
- <div class="inner"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="Slide 3" loading="lazy" src="/_ipx/_/images/slide-3.jpg">
58
- <div class="content light">
59
- <div class="title light"></div>
60
- <div class="description light"></div>
56
+ <div class="slider-gallery-item">
57
+ <div class="slider-gallery-thumbnail-overlay"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="" loading="lazy" src="/_ipx/_/images/slide-3.jpg">
58
+ <div class="slider-gallery-item-content light">
59
+ <!--v-if-->
60
+ <!--v-if-->
61
61
  </div>
62
62
  </div>
63
63
  </div>
64
64
  </div>
65
- <div class="arrows"><button id="prev" aria-label="Previous image"><span class="iconify i-ic:outline-keyboard-arrow-left arrows-icon" aria-hidden="true"></span></button><button id="next" aria-label="Next image"><span class="iconify i-ic:outline-keyboard-arrow-right arrows-icon" aria-hidden="true"></span></button></div>
66
- <div class="time"></div>
65
+ <div class="slider-gallery-arrows"><button type="button" class="slider-gallery-prev" aria-label="Previous image"><span class="iconify i-ic:outline-keyboard-arrow-left slider-gallery-arrow-icon" aria-hidden="true"></span></button><button type="button" class="slider-gallery-next" aria-label="Next image"><span class="iconify i-ic:outline-keyboard-arrow-right slider-gallery-arrow-icon" aria-hidden="true"></span></button></div>
66
+ <div class="slider-gallery-progress" aria-hidden="true"></div>
67
67
  </div>
68
68
  </div>"
69
69
  `;
@@ -28,7 +28,7 @@ are documented alongside it since that's where they're consumed.
28
28
 
29
29
  ---
30
30
 
31
- ## Global theming — recommended approach
31
+ ## Global theming
32
32
 
33
33
  Create `assets/styles/setup/07.components/responsive-header.css` in the consuming app and set
34
34
  tokens on a scope class matching the one passed via `styleClassPassthrough`:
@@ -54,6 +54,16 @@ tokens on a scope class matching the one passed via `styleClassPassthrough`:
54
54
 
55
55
  ---
56
56
 
57
+ ## Local overrides
58
+
59
+ Set the tokens above on an element you own (a page or section class, or a class added with
60
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
61
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
62
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
63
+ `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
64
+
65
+ ---
66
+
57
67
  ## Notes
58
68
 
59
69
  - Anything with async-loaded content (an `iconName` icon on a nav item, a new decorator inside
@@ -64,3 +74,4 @@ tokens on a scope class matching the one passed via `styleClassPassthrough`:
64
74
  - `NavigationItems`' own tokens (`--overflow-nav-*`) are documented in its own skill doc since
65
75
  they style the overflow-panel's *content*, distinct from `ResponsiveHeader`'s own tokens
66
76
  above which style the top bar and the overflow *button*/*container*.
77
+
@@ -717,7 +717,6 @@ watch(
717
717
  Set this token to a fixed value (or a small set of breakpoint-based values)
718
718
  to avoid it. */
719
719
 
720
- --_link-visibility-transition: none;
721
720
  position: relative;
722
721
  color: var(--responsive-header-color, inherit);
723
722
 
@@ -731,7 +730,6 @@ watch(
731
730
  inline-size: var(--responsive-header-inline-size, 100%);
732
731
 
733
732
  &.loaded {
734
- --_link-visibility-transition: all 0.2s ease-in-out;
735
733
  }
736
734
 
737
735
  /* flex-grow: 1; */
@@ -746,7 +744,6 @@ watch(
746
744
  --_link-margin-inline: 0.1rem;
747
745
  --_link-focus-visible-outline-width: 0.2rem;
748
746
  --_link-border-default: 2px solid transparent;
749
- --_link-border-bottom-hover: var(--green-08);
750
747
 
751
748
  grid-area: navStack;
752
749
  display: flex;
@@ -816,7 +813,6 @@ watch(
816
813
  --_icon-transform: scaleY(1);
817
814
 
818
815
  margin-inline-start: 0;
819
- /* transition: var(--_link-visibility-transition); */
820
816
 
821
817
  &[open] {
822
818
  --_icon-transform: scaleY(-1);
@@ -1,3 +1,7 @@
1
+
2
+ > **Changed 2026-09-27**: `--service-detail-hero-pill-bg` (and the hero text colour on the pills)
3
+ > never applied before, because `DisplayPill`'s `neutral` variant ignored the base tokens. It now
4
+ > falls back to them, so the hero pills are transparent with the hero text colour as documented.
1
5
  # ServiceDetail — Consumer Styling Guide
2
6
 
3
7
  ## Layout building blocks
@@ -30,6 +34,8 @@ inside an outer, wider `PageRow` — see
30
34
  notes in [page-row.md](../../../../../.claude/skills/components/page-row.md) for how nested page-rows
31
35
  compose.
32
36
 
37
+ ---
38
+
33
39
  ## Public token API
34
40
 
35
41
  ### Hero banner
@@ -46,7 +52,7 @@ compose.
46
52
  | `--service-detail-hero-text-colour` | `white` | Colour of the breadcrumb, eyebrow, and title over the hero image |
47
53
  | `--service-detail-breadcrumb-margin-block-end` | `0.8rem` | Space below the breadcrumb |
48
54
  | `--service-detail-hero-pills-gap` | `0.8rem` | Gap between the duration and price pills |
49
- | `--service-detail-hero-pill-bg` | `transparent` | Background of the price/duration pills (via `DisplayPill`'s `--theme-pill-bg`) |
55
+ | `--service-detail-hero-pill-bg` | `transparent` | Background of the price/duration pills (via `DisplayPill`'s `--display-pill-background`) |
50
56
  | `--service-detail-hero-pill-border-colour` | `currentColor` | Border colour of the price/duration pills |
51
57
 
52
58
  The hero image is always `object-fit: cover` (not tokened) — only its anchor point changes
@@ -182,7 +188,7 @@ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded stri
182
188
 
183
189
  ---
184
190
 
185
- ## Global theming — recommended approach
191
+ ## Global theming
186
192
 
187
193
  ```css
188
194
  /* assets/styles/setup/07.components/service-detail.css */
@@ -193,7 +199,21 @@ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded stri
193
199
  }
194
200
  ```
195
201
 
196
- ## Page-scoped overrides
202
+ ---
203
+
204
+ ## Local overrides
205
+
206
+ Set the tokens above on an element you own (a page or section class, or a class added with
207
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
208
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
209
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
210
+ `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
211
+
212
+ **Caveat:** `ServiceDetail` re-declares `--display-pill-background`, `--display-pill-text-colour`,
213
+ `--display-pill-border-colour` and `--breadcrumb-colour` inside its hero, so ancestor values of those
214
+ never reach the hero pills or breadcrumb. Use the `--service-detail-hero-*` tokens instead.
215
+
216
+ ### Page or section
197
217
 
198
218
  ```css
199
219
  .our-services-page {
@@ -231,3 +251,4 @@ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded stri
231
251
  `@container` queries against the component's own width, not the viewport — they are not tokens
232
252
  since resizing them would need corresponding `minmax()`/`grid-template-columns` changes too, not
233
253
  just spacing (same rationale as `ServiceSummary`'s `--service-summary-grid-gap-desktop`).
254
+
@@ -326,9 +326,9 @@ watch(
326
326
  flex-wrap: wrap;
327
327
  gap: var(--service-detail-hero-pills-gap, 0.8rem);
328
328
 
329
- --theme-pill-bg: var(--service-detail-hero-pill-bg, transparent);
330
- --theme-pill-color: var(--service-detail-hero-text-colour, white);
331
- --theme-pill-border-color: var(--service-detail-hero-pill-border-colour, currentColor);
329
+ --display-pill-background: var(--service-detail-hero-pill-bg, transparent);
330
+ --display-pill-text-colour: var(--service-detail-hero-text-colour, white);
331
+ --display-pill-border-colour: var(--service-detail-hero-pill-border-colour, currentColor);
332
332
  }
333
333
  }
334
334
  }