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
@@ -1,17 +1,5 @@
1
1
  # DisplayDialog — Consumer Styling Guide
2
2
 
3
- ## Structural class names (2026-08-22)
4
-
5
- `DisplayDialog` renders `<dialog>` inline in the component tree, not via `<Teleport>` — so it's a
6
- genuine descendant of wherever it's used in the page, and any ancestor's CSS selectors reach it.
7
- Before 2026-08-22 its internal sections used bare generic class names (`.inner`, `.header`,
8
- `.footer`, `.col-left`, `.col-right`, `.dialog-content`) — a consumer app with its own `.header`/
9
- `.footer` layout classes (extremely common names) had its unlayered site CSS silently override the
10
- dialog's own footer layout (button alignment, padding) purely by class-name collision, since
11
- unlayered CSS always beats `@layer components` regardless of specificity. All six renamed to
12
- `.display-dialog-*` prefixed variants (`.display-dialog-inner`, `.display-dialog-header`, etc.) —
13
- update any consumer overrides written against the old names.
14
-
15
3
  ## Public token API
16
4
 
17
5
  All `--display-dialog-*` tokens are the stable override surface. Because dialogs are site-wide UI
@@ -32,9 +20,16 @@ file** rather than per-instance via `styleClassPassthrough`.
32
20
  | Token | Default | Controls |
33
21
  |---|---|---|
34
22
  | `--display-dialog-inner-border-radius` | `0.8rem` | Panel corner rounding |
35
- | `--display-dialog-inner-border` | `0.1rem solid light-dark(var(--slate-10), var(--slate-02))` | Panel border shorthand |
36
- | `--display-dialog-inner-outline` | `0.1rem solid light-dark(var(--slate-10), var(--slate-00))` | Panel outer outline (sits outside the border) |
37
- | `--display-dialog-inner-background` | `light-dark(var(--slate-00), var(--slate-10))` | Panel background colour |
23
+ | `--display-dialog-inner-border` | `0.1rem solid var(--colour-text-default)` | Panel border shorthand |
24
+ | `--display-dialog-inner-outline` | `0.1rem solid var(--colour-text-default)` | Panel outer outline (sits outside the border) |
25
+ | `--display-dialog-inner-background` | `var(--page-bg)` | Panel background colour |
26
+
27
+ > Changed 2026-09-27: the four panel tokens are now resolved on `.display-dialog-inner` (they were
28
+ > resolved on the outer `.display-dialog`), so setting them on the panel itself, e.g. per variant
29
+ > with `.display-dialog-inner.alert`, now works. Colour defaults no longer call `light-dark()`
30
+ > (unsupported on older iPad Safari); they use the global scheme-aware `--colour-text-default` and
31
+ > `--page-bg` instead, so they still follow light/dark mode (dark panel is now `--slate-08`, was
32
+ > `--slate-10`).
38
33
 
39
34
  ### Header
40
35
 
@@ -46,9 +41,9 @@ file** rather than per-instance via `styleClassPassthrough`.
46
41
  | `--display-dialog-header-button-border` | `0.1rem solid transparent` | Close button border (resting) |
47
42
  | `--display-dialog-header-button-border-radius` | `0.4rem` | Close button corner rounding |
48
43
  | `--display-dialog-header-button-outline` | `0.1rem solid transparent` | Close button outline (resting) |
49
- | `--display-dialog-header-button-border-hover` | `0.1rem solid light-dark(var(--slate-08), var(--slate-04))` | Close button border on hover/focus |
50
- | `--display-dialog-header-button-outline-hover` | `0.1rem solid light-dark(var(--slate-08), var(--slate-04))` | Close button outline on hover/focus |
51
- | `--display-dialog-header-button-icon-color` | `light-dark(var(--slate-09), var(--slate-02))` | Close button icon colour |
44
+ | `--display-dialog-header-button-border-hover` | `0.1rem solid var(--colour-text-default)` | Close button border on hover/focus |
45
+ | `--display-dialog-header-button-outline-hover` | `0.1rem solid var(--colour-text-default)` | Close button outline on hover/focus |
46
+ | `--display-dialog-header-button-icon-color` | `var(--colour-text-default)` | Close button icon colour |
52
47
  | `--display-dialog-header-button-icon-size` | `2.4rem` | Close button icon size |
53
48
 
54
49
  ### Content & footer
@@ -61,7 +56,29 @@ file** rather than per-instance via `styleClassPassthrough`.
61
56
 
62
57
  ---
63
58
 
64
- ## Global theming — recommended approach
59
+ ## State hooks
60
+
61
+ | Hook | Element | When |
62
+ |---|---|---|
63
+ | `[open]` | `.display-dialog` | Dialog is open |
64
+ | `[justify-dialog="start|center|end"]` | `.display-dialog` | Horizontal placement of the panel |
65
+ | `[align-dialog="start|center|end"]` | `.display-dialog` | Vertical placement of the panel |
66
+ | `.dialog`, `.modal`, `.confirm`, `.alert`, `.fullscreen` | `.display-dialog-inner` | The resolved `variant` |
67
+ | `[data-theme]` | `.display-dialog-header` | A `theme` is set: adds a `--theme-accent` bottom border and title colour |
68
+ | `.allow-content-scroll` | `.display-dialog-content` | `allow-content-scroll` is on |
69
+
70
+ Inner classes: `.display-dialog-inner` (panel), `.display-dialog-header`,
71
+ `.display-dialog-col-left` (title), `.display-dialog-col-right`, `.display-dialog-close`,
72
+ `.display-dialog-content`, `.display-dialog-footer`.
73
+
74
+ > Changed 2026-08-22: these used to be bare generic names (`.inner`, `.header`, `.footer`,
75
+ > `.col-left`, `.col-right`, `.dialog-content`). The dialog renders inline, not teleported, so a
76
+ > consumer's own unlayered `.header`/`.footer` CSS silently restyled it. Update any overrides
77
+ > written against the old names.
78
+
79
+ ---
80
+
81
+ ## Global theming
65
82
 
66
83
  Create `assets/styles/setup/07.components/display-dialog.css` in the consuming app and set tokens
67
84
  on `:root`. This applies to every `DisplayDialog` across the site.
@@ -83,17 +100,22 @@ on `:root`. This applies to every `DisplayDialog` across the site.
83
100
 
84
101
  ---
85
102
 
86
- ## Per-variant overrides
103
+ ## Local overrides
104
+
105
+ Set the tokens above on an element you own (a page or section class, or a class added with
106
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
107
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
108
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
109
+ `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
87
110
 
88
- The `fullscreen` variant bypasses `--_inner-border-radius`, `--_inner-border`, and
89
- `--_inner-outline` directly (setting them to `0`/`none`). To restyle the fullscreen panel,
90
- target the private tokens on `.display-dialog-inner.fullscreen`:
111
+ ### Per variant
112
+
113
+ The panel tokens resolve on `.display-dialog-inner`, so set them on the variant class:
91
114
 
92
115
  ```css
93
116
  .display-dialog {
94
117
  .display-dialog-inner {
95
118
  &.confirm {
96
- /* e.g. constrain confirm panel width further */
97
119
  max-width: 40rem;
98
120
  }
99
121
 
@@ -102,39 +124,17 @@ target the private tokens on `.display-dialog-inner.fullscreen`:
102
124
  }
103
125
 
104
126
  &.fullscreen {
105
- /* private tokens are the only lever here */
106
- --_inner-background: var(--brand-surface-alt);
127
+ --display-dialog-inner-background: var(--brand-surface-alt);
107
128
  }
108
129
  }
109
130
  }
110
131
  ```
111
132
 
112
- ---
113
-
114
- ## Section targeting
115
-
116
- Target `.display-dialog-header`, `.display-dialog-content`, and `.display-dialog-footer` directly to adjust layout within the panel:
117
-
118
- ```css
119
- .display-dialog {
120
- .display-dialog-header {
121
- border-bottom: 0.1rem solid var(--brand-border);
122
- }
123
-
124
- .display-dialog-content {
125
- /* content area uses --display-dialog-content-padding */
126
- }
127
-
128
- .display-dialog-footer {
129
- border-top: 0.1rem solid var(--brand-border);
130
- justify-content: space-between; /* override default flex-end */
131
- }
132
- }
133
- ```
134
-
135
- ---
133
+ **Caveat:** `fullscreen` forces its radius, border and outline to `0`/`none` on the panel itself,
134
+ so `--display-dialog-inner-border-radius`, `-border` and `-outline` have no effect on that variant
135
+ (its background still follows `--display-dialog-inner-background`).
136
136
 
137
- ## Page-scoped overrides
137
+ ### Page or section
138
138
 
139
139
  Because `<DisplayDialog>` renders inside the page's DOM tree (even though it is `position: fixed`),
140
140
  you can scope overrides to a specific page without affecting the rest of the site:
@@ -153,9 +153,7 @@ you can scope overrides to a specific page without affecting the rest of the sit
153
153
  }
154
154
  ```
155
155
 
156
- ---
157
-
158
- ## Per-instance overrides via styleClassPassthrough
156
+ ### One instance
159
157
 
160
158
  Use sparingly — prefer global or page-scoped CSS for dialogs. When a single instance genuinely
161
159
  needs a different look, pass a modifier class and target it alongside `.display-dialog`:
@@ -173,3 +171,33 @@ needs a different look, pass a modifier class and target it alongside `.display-
173
171
  }
174
172
  }
175
173
  ```
174
+
175
+ ---
176
+
177
+ ## Recipe: section targeting
178
+
179
+ Target `.display-dialog-header`, `.display-dialog-content`, and `.display-dialog-footer` directly to adjust layout within the panel:
180
+
181
+ ```css
182
+ .display-dialog {
183
+ .display-dialog-header {
184
+ border-bottom: 0.1rem solid var(--brand-border);
185
+ }
186
+
187
+ .display-dialog-content {
188
+ /* content area uses --display-dialog-content-padding */
189
+ }
190
+
191
+ .display-dialog-footer {
192
+ border-top: 0.1rem solid var(--brand-border);
193
+ justify-content: space-between; /* override default flex-end */
194
+ }
195
+ }
196
+ ```
197
+
198
+ ---
199
+
200
+ ## Class passthrough
201
+
202
+ `style-class-passthrough` adds classes to the root `<dialog class="display-dialog">`, so tokens
203
+ set on a passthrough class land for the whole dialog (see **One instance** above).
@@ -4,7 +4,7 @@
4
4
  :class="[elementClasses]"
5
5
  :role="isAlert ? 'alertdialog' : undefined"
6
6
  :aria-modal="true"
7
- :aria-labelledby="hasTitle ? dialogTitleId : undefined"
7
+ :aria-labelledby="hasTitle() ? dialogTitleId : undefined"
8
8
  :align-dialog="resolved.alignDialog"
9
9
  :justify-dialog="resolved.justifyDialog"
10
10
  :open
@@ -18,7 +18,7 @@
18
18
  >
19
19
  <div class="display-dialog-inner" :class="[resolved.variant]">
20
20
  <div class="display-dialog-header" :data-theme="resolved.theme">
21
- <div v-if="hasTitle" :id="dialogTitleId" class="display-dialog-col-left">
21
+ <div v-if="hasTitle()" :id="dialogTitleId" class="display-dialog-col-left">
22
22
  <slot name="dialogTitle"></slot>
23
23
  </div>
24
24
 
@@ -29,19 +29,19 @@
29
29
  @click.prevent="closeDialog()"
30
30
  >
31
31
  <Icon :name="resolved.closeIcon" class="icon" />
32
- <span class="sr-only">Close</span>
32
+ <span class="sr-only">{{ resolved.closeLabel }}</span>
33
33
  </button>
34
34
  </div>
35
35
  </div>
36
36
  <div
37
- v-if="hasContent"
37
+ v-if="hasContent()"
38
38
  class="display-dialog-content"
39
39
  :class="[{ 'allow-content-scroll': resolved.allowContentScroll }]"
40
40
  :tabindex="resolved.allowContentScroll ? 0 : undefined"
41
41
  >
42
42
  <slot name="dialogContent"></slot>
43
43
  </div>
44
- <div v-if="hasFooter" class="display-dialog-footer">
44
+ <div v-if="hasFooter()" class="display-dialog-footer">
45
45
  <slot name="actionButtonLeft"></slot>
46
46
  <slot name="actionButtonRight"></slot>
47
47
  </div>
@@ -64,6 +64,7 @@ interface Props {
64
64
  dataDialogId: string;
65
65
  theme?: SemanticTheme;
66
66
  closeIcon?: string;
67
+ closeLabel?: string;
67
68
  }
68
69
 
69
70
  const props = withDefaults(defineProps<Props>(), {
@@ -75,6 +76,7 @@ const props = withDefaults(defineProps<Props>(), {
75
76
  allowContentScroll: undefined,
76
77
  theme: undefined,
77
78
  closeIcon: undefined,
79
+ closeLabel: undefined,
78
80
  });
79
81
 
80
82
  const appConfig = useAppConfig();
@@ -89,10 +91,16 @@ const resolved = computed(() => {
89
91
  allowContentScroll: props.allowContentScroll ?? config?.allowContentScroll ?? false,
90
92
  theme: props.theme ?? config?.theme,
91
93
  closeIcon: props.closeIcon ?? config?.closeIcon ?? "bitcoin-icons:cross-filled",
94
+ closeLabel: props.closeLabel ?? config?.closeLabel ?? "Close",
92
95
  } as const;
93
96
  });
94
97
 
95
- const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
98
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
99
+
100
+ watch(
101
+ () => props.styleClassPassthrough,
102
+ () => resetElementClasses(props.styleClassPassthrough)
103
+ );
96
104
 
97
105
  const isAlert = computed(() => resolved.value.variant === "alert");
98
106
  const dialogTitleId = useId();
@@ -104,9 +112,9 @@ const closeDialog = () => {
104
112
  };
105
113
 
106
114
  const slots = useSlots();
107
- const hasTitle = computed(() => !!slots.dialogTitle);
108
- const hasContent = computed(() => !!slots.dialogContent);
109
- const hasFooter = computed(() => !!(slots.actionButtonLeft || slots.actionButtonRight));
115
+ const hasTitle = () => !!slots.dialogTitle;
116
+ const hasContent = () => !!slots.dialogContent;
117
+ const hasFooter = () => !!(slots.actionButtonLeft || slots.actionButtonRight);
110
118
 
111
119
  const { lock, unlock } = useBodyLock();
112
120
  let hasLocked = false;
@@ -129,48 +137,29 @@ onUnmounted(() => {
129
137
  <style lang="css">
130
138
  @layer components {
131
139
  .display-dialog {
132
- --_backdrop-blur: var(--display-dialog-backdrop-blur, blur(0.5rem));
133
- --_backdrop-background: var(--display-dialog-backdrop-background, rgba(0, 0, 0, 0.5));
134
- --_z-index: var(--display-dialog-z-index, 999999);
135
140
  --_transition-duration: var(--display-dialog-transition-duration, 200ms);
136
141
 
137
- --_inner-border-radius: var(--display-dialog-inner-border-radius, 0.8rem);
138
- --_inner-border: var(--display-dialog-inner-border, 0.1rem solid light-dark(var(--slate-10), var(--slate-02)));
139
- --_inner-outline: var(--display-dialog-inner-outline, 0.1rem solid light-dark(var(--slate-10), var(--slate-00)));
140
- --_inner-background: var(--display-dialog-inner-background, light-dark(var(--slate-00), var(--slate-10)));
141
-
142
- --_header-padding: var(--display-dialog-header-padding, 1.2rem);
143
- --_header-button-margin: var(--display-dialog-header-button-margin, 0);
144
- --_header-button-padding: var(--display-dialog-header-button-padding, 0.4rem);
145
- --_header-button-border: var(--display-dialog-header-button-border, 0.1rem solid transparent);
146
- --_header-button-border-radius: var(--display-dialog-header-button-border-radius, 0.4rem);
147
- --_header-button-outline: var(--display-dialog-header-button-outline, 0.1rem solid transparent);
148
142
  --_header-button-border-hover: var(
149
143
  --display-dialog-header-button-border-hover,
150
- 0.1rem solid light-dark(var(--slate-08), var(--slate-04))
144
+ 0.1rem solid var(--colour-text-default)
151
145
  );
152
146
  --_header-button-outline-hover: var(
153
147
  --display-dialog-header-button-outline-hover,
154
- 0.1rem solid light-dark(var(--slate-08), var(--slate-04))
148
+ 0.1rem solid var(--colour-text-default)
155
149
  );
156
150
  --_header-button-icon-color: var(
157
151
  --display-dialog-header-button-icon-color,
158
- light-dark(var(--slate-09), var(--slate-02))
152
+ var(--colour-text-default)
159
153
  );
160
- --_header-button-icon-size: var(--display-dialog-header-button-icon-size, 2.4rem);
161
-
162
- --_content-padding: var(--display-dialog-content-padding, 1.2rem);
163
- --_footer-gap: var(--display-dialog-footer-gap, 1.2rem);
164
- --_footer-padding: var(--display-dialog-footer-padding, 1.2rem);
165
154
 
166
155
  position: fixed;
167
156
  left: 0;
168
157
  top: 0;
169
158
  width: 100%;
170
159
  height: 100%;
171
- backdrop-filter: var(--_backdrop-blur);
172
- background-color: var(--_backdrop-background);
173
- z-index: var(--_z-index);
160
+ backdrop-filter: var(--display-dialog-backdrop-blur, blur(0.5rem));
161
+ background-color: var(--display-dialog-backdrop-background, rgba(0, 0, 0, 0.5));
162
+ z-index: var(--display-dialog-z-index, 999999);
174
163
  opacity: 0;
175
164
  border: none;
176
165
  padding: 0;
@@ -217,12 +206,16 @@ onUnmounted(() => {
217
206
  }
218
207
 
219
208
  .display-dialog-inner {
209
+ --_inner-border-radius: var(--display-dialog-inner-border-radius, 0.8rem);
210
+ --_inner-border: var(--display-dialog-inner-border, 0.1rem solid var(--colour-text-default));
211
+ --_inner-outline: var(--display-dialog-inner-outline, 0.1rem solid var(--colour-text-default));
212
+
220
213
  display: grid;
221
214
  grid-template-rows: auto 1fr auto;
222
215
  border-radius: var(--_inner-border-radius);
223
216
  border: var(--_inner-border);
224
217
  outline: var(--_inner-outline);
225
- background-color: var(--_inner-background);
218
+ background-color: var(--display-dialog-inner-background, var(--page-bg));
226
219
  height: initial;
227
220
  width: 100vw;
228
221
  overflow: hidden;
@@ -259,7 +252,7 @@ onUnmounted(() => {
259
252
  .display-dialog-header {
260
253
  display: flex;
261
254
  align-items: center;
262
- padding: var(--_header-padding);
255
+ padding: var(--display-dialog-header-padding, 1.2rem);
263
256
 
264
257
  &[data-theme] {
265
258
  border-block-end: 0.2rem solid var(--theme-accent);
@@ -281,11 +274,11 @@ onUnmounted(() => {
281
274
  display: block flex;
282
275
  align-items: center;
283
276
  justify-content: center;
284
- margin: var(--_header-button-margin);
285
- padding: var(--_header-button-padding);
286
- border: var(--_header-button-border);
287
- border-radius: var(--_header-button-border-radius);
288
- outline: var(--_header-button-outline);
277
+ margin: var(--display-dialog-header-button-margin, 0);
278
+ padding: var(--display-dialog-header-button-padding, 0.4rem);
279
+ border: var(--display-dialog-header-button-border, 0.1rem solid transparent);
280
+ border-radius: var(--display-dialog-header-button-border-radius, 0.4rem);
281
+ outline: var(--display-dialog-header-button-outline, 0.1rem solid transparent);
289
282
 
290
283
  transition:
291
284
  border-color var(--_transition-duration),
@@ -301,7 +294,7 @@ onUnmounted(() => {
301
294
  .icon {
302
295
  color: var(--_header-button-icon-color);
303
296
  display: block;
304
- font-size: var(--_header-button-icon-size);
297
+ font-size: var(--display-dialog-header-button-icon-size, 2.4rem);
305
298
  }
306
299
  }
307
300
  }
@@ -309,7 +302,7 @@ onUnmounted(() => {
309
302
 
310
303
  .display-dialog-content {
311
304
  overflow: hidden;
312
- padding: var(--_content-padding);
305
+ padding: var(--display-dialog-content-padding, 1.2rem);
313
306
 
314
307
  &.allow-content-scroll {
315
308
  overflow-y: auto;
@@ -321,9 +314,9 @@ onUnmounted(() => {
321
314
 
322
315
  .display-dialog-footer {
323
316
  display: flex;
324
- gap: var(--_footer-gap);
317
+ gap: var(--display-dialog-footer-gap, 1.2rem);
325
318
  justify-content: flex-end;
326
- padding: var(--_footer-padding);
319
+ padding: var(--display-dialog-footer-padding, 1.2rem);
327
320
  }
328
321
  }
329
322
  }
@@ -7,6 +7,9 @@ type StoryArgs = {
7
7
  allowContentScroll: boolean;
8
8
  justifyDialog: "start" | "center" | "end";
9
9
  alignDialog: "start" | "center" | "end";
10
+ theme: "" | "info" | "success" | "warning" | "error";
11
+ closeIcon: string;
12
+ closeLabel: string;
10
13
  };
11
14
 
12
15
  export default {
@@ -36,6 +39,22 @@ export default {
36
39
  description: "Vertical position of the dialog panel within the overlay",
37
40
  table: { category: "Layout" },
38
41
  },
42
+ theme: {
43
+ control: { type: "select" },
44
+ options: ["", "info", "success", "warning", "error"],
45
+ description: "Semantic theme: accent border and title colour on the header",
46
+ table: { category: "Appearance" },
47
+ },
48
+ closeIcon: {
49
+ control: { type: "text" },
50
+ description: "Icon name for the close button",
51
+ table: { category: "Appearance" },
52
+ },
53
+ closeLabel: {
54
+ control: { type: "text" },
55
+ description: "Screen-reader label for the close button (override for localisation)",
56
+ table: { category: "Accessibility" },
57
+ },
39
58
  styleClassPassthrough: { table: { disable: true } },
40
59
  lockViewport: { table: { disable: true } },
41
60
  dataDialogId: { table: { disable: true } },
@@ -45,6 +64,9 @@ export default {
45
64
  allowContentScroll: false,
46
65
  justifyDialog: "center",
47
66
  alignDialog: "center",
67
+ theme: "",
68
+ closeIcon: "bitcoin-icons:cross-filled",
69
+ closeLabel: "Close",
48
70
  },
49
71
  parameters: {
50
72
  docs: {
@@ -77,6 +99,9 @@ const Template: StoryFn<StoryArgs> = (args) => ({
77
99
  :allow-content-scroll="args.allowContentScroll"
78
100
  :justify-dialog="args.justifyDialog"
79
101
  :align-dialog="args.alignDialog"
102
+ :theme="args.theme || undefined"
103
+ :close-icon="args.closeIcon"
104
+ :close-label="args.closeLabel"
80
105
  :lock-viewport="false"
81
106
  data-dialog-id="storybook-dialog"
82
107
  >
@@ -230,6 +230,16 @@ describe("DisplayDialog", () => {
230
230
  expect(wrapper.emitted("update:modelValue")?.[0]).toEqual([false]);
231
231
  });
232
232
 
233
+ it("uses \"Close\" as the close button's screen-reader label by default", async () => {
234
+ const wrapper = await mountSuspended(DisplayDialog, { props: { dataDialogId: "test" } });
235
+ expect(wrapper.find(".display-dialog-close .sr-only").text()).toBe("Close");
236
+ });
237
+
238
+ it("uses the closeLabel prop for the close button's screen-reader label", async () => {
239
+ const wrapper = await mountSuspended(DisplayDialog, { props: { dataDialogId: "test", closeLabel: "Fermer" } });
240
+ expect(wrapper.find(".display-dialog-close .sr-only").text()).toBe("Fermer");
241
+ });
242
+
233
243
  // ─── styleClassPassthrough ────────────────────────────────────────────────
234
244
 
235
245
  it("applies a styleClassPassthrough string", async () => {
@@ -239,6 +249,15 @@ describe("DisplayDialog", () => {
239
249
  expect(wrapper.classes()).toContain("my-class");
240
250
  });
241
251
 
252
+ it("updates classes when styleClassPassthrough changes", async () => {
253
+ const wrapper = await mountSuspended(DisplayDialog, {
254
+ props: { dataDialogId: "test", styleClassPassthrough: ["original"] },
255
+ });
256
+ await wrapper.setProps({ styleClassPassthrough: ["updated"] });
257
+ expect(wrapper.classes()).not.toContain("original");
258
+ expect(wrapper.classes()).toContain("updated");
259
+ });
260
+
242
261
  it("applies multiple styleClassPassthrough classes from an array", async () => {
243
262
  const wrapper = await mountSuspended(DisplayDialog, {
244
263
  props: { dataDialogId: "test", styleClassPassthrough: ["class-a", "class-b"] },
@@ -332,6 +351,7 @@ describe("DisplayDialog", () => {
332
351
  lockViewport: false,
333
352
  allowContentScroll: true,
334
353
  theme: "info" as SemanticTheme,
354
+ closeLabel: "Schliessen",
335
355
  closeIcon: "heroicons:x-mark",
336
356
  },
337
357
  },
@@ -340,6 +360,7 @@ describe("DisplayDialog", () => {
340
360
  props: { dataDialogId: "test" },
341
361
  slots: { dialogContent: "<p>Content</p>" },
342
362
  });
363
+ expect(wrapper.find(".display-dialog-close .sr-only").text()).toBe("Schliessen");
343
364
  expect(wrapper.find(".display-dialog-inner").classes()).toContain("modal");
344
365
  expect(wrapper.attributes("align-dialog")).toBe("end");
345
366
  expect(wrapper.attributes("justify-dialog")).toBe("start");
@@ -0,0 +1,112 @@
1
+ # DisplayPill — Consumer Styling Guide
2
+
3
+ > **Changed 2026-09-27**: tokens renamed from `--theme-pill-*` to `--display-pill-*`, and `bg`/`color`
4
+ > to `background`/`text-colour`, and `padding-x`/`padding-y` to `padding-inline`/`padding-block` (`--theme-pill-bg` → `--display-pill-background`,
5
+ > `--theme-pill-primary-color` → `--display-pill-primary-text-colour`, etc.). The `--theme-` prefix
6
+ > read as a global theme slot and clashed with the library's real `--theme-*` tokens.
7
+
8
+ ## Public token API
9
+
10
+ ### Colour
11
+
12
+ Each variant resolves its colour as **variant token → base token → variant default**, so setting
13
+ the base token restyles every variant, and a variant token still wins for that one variant.
14
+
15
+ | Token | Default | Controls |
16
+ |---|---|---|
17
+ | `--display-pill-background` | `var(--slate-01)` | Background (the `default` variant, and the fallback for every other variant) |
18
+ | `--display-pill-text-colour` | `var(--slate-09)` | Text/icon colour (same fallback role) |
19
+ | `--display-pill-primary-background` / `-text-colour` | `var(--blue-01)` / `var(--blue-09)` | `primary` variant |
20
+ | `--display-pill-success-background` / `-text-colour` | `var(--green-01)` / `var(--green-10)` | `success` variant |
21
+ | `--display-pill-warning-background` / `-text-colour` | `var(--orange-01)` / `var(--orange-10)` | `warning` variant |
22
+ | `--display-pill-danger-background` / `-text-colour` | `var(--red-01)` / `var(--red-10)` | `danger` variant |
23
+ | `--display-pill-neutral-background` / `-text-colour` | `var(--slate-08)` / `var(--slate-03)` | `neutral` variant (dark) |
24
+ | `--display-pill-focus-ring` | `var(--theme-border-focus)` | `:focus-visible` outline on `button`/`a` pills |
25
+
26
+ > **Changed 2026-09-27**: variants used to read only their own tokens, so a base `bg`/`color`
27
+ > override never reached a non-default variant. That's why `ServiceSummary`'s and `ServiceDetail`'s
28
+ > pill tokens (their pills are `neutral`) had never applied. The `warning` variant read a
29
+ > `--yellow-*` ramp that doesn't exist, so it always showed its hardcoded hex fallbacks; it now uses
30
+ > the `orange` ramp the warning theme moved to.
31
+
32
+ ### Border, outline and shape
33
+
34
+ | Token | Default | Controls |
35
+ |---|---|---|
36
+ | `--display-pill-border-colour` | `transparent` | Border colour |
37
+ | `--display-pill-border-width` | `0.1rem` | Border width |
38
+ | `--display-pill-border-style` | `solid` | Border style |
39
+ | `--display-pill-border-radius` | `100vw` | Radius (100vw is always a full pill) |
40
+ | `--display-pill-outline` | `none` | Decorative outline (shorthand) on every pill |
41
+ | `--display-pill-outline-offset` | `0` | Offset for that outline |
42
+
43
+ ### Size
44
+
45
+ | Token | Default (`sm` / `md` / `lg`) | Controls |
46
+ |---|---|---|
47
+ | `--display-pill-font-size` / `-sm` / `-lg` | `1rem` / `1.2rem` / `1.4rem` | Text size |
48
+ | `--display-pill-icon-size` / `-sm` / `-lg` | `1.2rem` / `1.4rem` / `1.6rem` | Icon size (`font-size` on `.display-pill-icon`); also the unit all spacing below scales from |
49
+ | `--display-pill-font-weight` | `500` | Text weight |
50
+
51
+ The unsuffixed token is the `md` value; `-sm`/`-lg` apply to those sizes.
52
+
53
+ > **Changed 2026-09-27**: the icon-size tokens were declared but never used, so icons weren't
54
+ > sized. The icon slot is now wrapped in `.display-pill-icon`, which sets its `font-size`.
55
+
56
+ ### Spacing
57
+
58
+ Padding and gap are the pill's icon size times a ratio, so every size (and any custom icon size)
59
+ keeps the same proportions. Tune a **ratio** to change spacing across all sizes, or set the
60
+ **absolute** token to pin one length (it then applies to every size).
61
+
62
+ | Ratio token | Default | Result (`sm` / `md` / `lg`) | Absolute override | Controls |
63
+ |---|---|---|---|---|
64
+ | `--display-pill-padding-inline-ratio` | `0.7` | ≈ `0.84` / `0.98` / `1.12rem` | `--display-pill-padding-inline` | `padding-inline` (both sides of a label-only pill; the non-icon side otherwise) |
65
+ | `--display-pill-padding-inline-icon-ratio` | `0.4` | ≈ `0.48` / `0.56` / `0.64rem` | `--display-pill-padding-inline-icon` | `padding-inline` on the icon side (both sides of an icon-only pill), tighter because icons carry their own whitespace |
66
+ | `--display-pill-padding-block-ratio` | `0.3` | ≈ `0.36` / `0.42` / `0.48rem` | `--display-pill-padding-block` | `padding-block` |
67
+ | `--display-pill-gap-ratio` | `0.35` | ≈ `0.42` / `0.49` / `0.56rem` | `--display-pill-gap` | Gap between icon and label |
68
+
69
+ > **Changed 2026-09-27**: spacing used to be hand-set per size (`--display-pill-padding-inline-sm`,
70
+ > `-lg`, etc., now removed). It's now derived from the icon size; results are within about 0.1rem
71
+ > of the old values, except `lg` block padding (`0.6rem` → `0.48rem`), which was out of proportion.
72
+
73
+ Private tokens (not public API): `--_background`, `--_text-colour`, `--_font-size`, `--_padding-inline`,
74
+ `--_padding-block`, `--_padding-inline-icon` (derived from `--_icon-size`), `--_icon-size`, swapped by the size and variant classes.
75
+
76
+ ## State hooks
77
+
78
+ - Size class: `.sm`, `.md`, `.lg`. Variant class: `.default`, `.primary`, `.success`, `.warning`,
79
+ `.danger`, `.neutral`. `.is-reversed` when `reversed`.
80
+ - `data-icon-position`: `start` (icon before the text), `end` (`reversed`), `only` (icon with no
81
+ label or text), or absent (no icon). It picks which side gets `--display-pill-padding-inline-icon`.
82
+ - Classes: `.display-pill` (root), `.display-pill-icon` (icon slot wrapper, only when used),
83
+ `.display-pill-label` (only with the `label` prop).
84
+ - `button`/`a` roots get a pointer cursor and a `:focus-visible` outline.
85
+
86
+ > **Changed 2026-09-27**: `.pill-label` → `.display-pill-label`.
87
+
88
+ ## Local overrides
89
+
90
+ Set the tokens above on an element you own (a page or section class, or a class added with
91
+ `:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
92
+ `@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
93
+ `<style scoped>`, tokens set on your element still work, but selectors that reach inside the
94
+ component need `:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
95
+
96
+ **Caveat:** components that render pills set some of these tokens themselves, so an ancestor value
97
+ won't reach those pills. `ServiceSummary` and `ServiceDetail` set `--display-pill-background`,
98
+ `-text-colour` and `-border-colour` on their pill rows; use their own `--service-*-pill-*` tokens.
99
+
100
+ ## Recipe: outlined pills
101
+
102
+ ```css
103
+ .tag-list {
104
+ --display-pill-background: transparent;
105
+ --display-pill-text-colour: currentColor;
106
+ --display-pill-border-colour: currentColor;
107
+ }
108
+ ```
109
+
110
+ ## Class passthrough
111
+
112
+ `style-class-passthrough` adds classes to the root. Reachable in normal use.