srcdev-nuxt-components 9.4.11 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (623) hide show
  1. package/.claude/skills/component-aria-landmark.md +1 -1
  2. package/.claude/skills/component-dynamic-slots.md +0 -1
  3. package/.claude/skills/component-export-types.md +3 -3
  4. package/.claude/skills/component-inline-action-button.md +7 -7
  5. package/.claude/skills/component-local-style-override.md +134 -50
  6. package/.claude/skills/component-naming.md +107 -0
  7. package/.claude/skills/components/action-menu.md +18 -14
  8. package/.claude/skills/components/alert-content.md +110 -0
  9. package/.claude/skills/components/alert-mask-core.md +15 -1
  10. package/.claude/skills/components/alert-masked-content.md +95 -0
  11. package/.claude/skills/components/auto-grid.md +21 -13
  12. package/.claude/skills/components/canvas-switcher.md +3 -3
  13. package/.claude/skills/components/capture-qr-code.md +19 -9
  14. package/.claude/skills/components/carousel-flip.md +3 -3
  15. package/.claude/skills/components/container-glow.md +2 -2
  16. package/.claude/skills/components/content-docs.md +9 -5
  17. package/.claude/skills/components/cookie-consent-banner.md +16 -17
  18. package/.claude/skills/components/dashboard-quad-grid.md +4 -4
  19. package/.claude/skills/components/decode-qr-code.md +15 -9
  20. package/.claude/skills/components/display-avatar.md +16 -31
  21. package/.claude/skills/components/display-chip.md +15 -10
  22. package/.claude/skills/components/display-dialog.md +3 -1
  23. package/.claude/skills/components/display-pill.md +17 -75
  24. package/.claude/skills/components/display-prompt.md +11 -19
  25. package/.claude/skills/components/display-qr-code.md +5 -0
  26. package/.claude/skills/components/display-theme-switch.md +7 -6
  27. package/.claude/skills/components/display-toast.md +5 -6
  28. package/.claude/skills/components/entry-animation.md +2 -5
  29. package/.claude/skills/components/eyebrow-text.md +6 -4
  30. package/.claude/skills/components/form-field.md +79 -0
  31. package/.claude/skills/components/form-fieldset.md +75 -0
  32. package/.claude/skills/components/form-wrapper.md +71 -0
  33. package/.claude/skills/components/glass-panel.md +60 -51
  34. package/.claude/skills/components/grid-stack.md +8 -2
  35. package/.claude/skills/components/header-block.md +1 -1
  36. package/.claude/skills/components/hero-text.md +8 -6
  37. package/.claude/skills/components/input-button.md +72 -0
  38. package/.claude/skills/components/input-checkbox-radio.md +149 -0
  39. package/.claude/skills/components/input-checkbox.md +148 -0
  40. package/.claude/skills/components/input-description.md +102 -0
  41. package/.claude/skills/components/input-error.md +105 -0
  42. package/.claude/skills/components/input-label.md +119 -0
  43. package/.claude/skills/components/{input-number-core.md → input-number.md} +41 -36
  44. package/.claude/skills/components/input-radio.md +95 -0
  45. package/.claude/skills/components/input-range-core.md +4 -4
  46. package/.claude/skills/components/input-select-core.md +1 -1
  47. package/.claude/skills/components/input-text-core.md +8 -6
  48. package/.claude/skills/components/input-textarea-core.md +4 -4
  49. package/.claude/skills/components/layout-grid-by-cols.md +31 -43
  50. package/.claude/skills/components/link-text.md +2 -2
  51. package/.claude/skills/components/opening-hours.md +116 -0
  52. package/.claude/skills/components/page-hero-highlights.md +35 -35
  53. package/.claude/skills/components/page-row.md +1 -1
  54. package/.claude/skills/components/pending-effect.md +63 -0
  55. package/.claude/skills/components/price-list.md +72 -0
  56. package/.claude/skills/components/pricing-card.md +3 -3
  57. package/.claude/skills/components/profile-section.md +6 -4
  58. package/.claude/skills/components/samaritan-prompt.md +140 -0
  59. package/.claude/skills/components/scroll-reveal-frame.md +21 -20
  60. package/.claude/skills/components/scroll-reveal-image.md +31 -21
  61. package/.claude/skills/components/service-detail.md +2 -2
  62. package/.claude/skills/components/services-card-grid.md +5 -4
  63. package/.claude/skills/components/services-card.md +12 -10
  64. package/.claude/skills/components/site-navigation.md +20 -6
  65. package/.claude/skills/components/slider-gallery.md +88 -0
  66. package/.claude/skills/components/social-icons-list.md +12 -6
  67. package/.claude/skills/components/tab-navigation.md +1 -1
  68. package/.claude/skills/components/text-block.md +68 -0
  69. package/.claude/skills/components/toggle-switch-core.md +3 -3
  70. package/.claude/skills/components/triple-toggle-switch.md +85 -0
  71. package/.claude/skills/composable-zod-validation.md +1 -1
  72. package/.claude/skills/consumer-styles-structure.md +153 -0
  73. package/.claude/skills/icon-sets.md +3 -3
  74. package/.claude/skills/icon-sizing.md +66 -0
  75. package/.claude/skills/index.md +35 -16
  76. package/.claude/skills/new-app-scaffold.md +45 -7
  77. package/.claude/skills/pull-request-description.md +1 -0
  78. package/.claude/skills/storybook-add-story.md +53 -5
  79. package/.claude/skills/testing-add-playwright.md +1 -1
  80. package/.claude/skills/theming-colour-ramps.md +25 -3
  81. package/.claude/skills/theming-component-token-pattern.md +16 -16
  82. package/.claude/skills/theming-override-default.md +7 -0
  83. package/.claude/skills/theming-partial-override.md +1 -1
  84. package/.claude/skills/theming-typography-tokens.md +1 -1
  85. package/.claude/skills/vercel-node-version.md +1 -1
  86. package/.vscode/srcdev-component-action-menu.code-snippets +42 -0
  87. package/.vscode/srcdev-component-alert-content.code-snippets +36 -0
  88. package/.vscode/srcdev-component-alert-masked-content.code-snippets +35 -0
  89. package/.vscode/srcdev-component-auto-grid.code-snippets +39 -0
  90. package/.vscode/srcdev-component-capture-decode-qr-code.code-snippets +28 -0
  91. package/.vscode/srcdev-component-content-docs.code-snippets +4 -4
  92. package/.vscode/srcdev-component-cookie-consent-banner.code-snippets +33 -0
  93. package/.vscode/srcdev-component-display-avatar.code-snippets +28 -0
  94. package/.vscode/srcdev-component-display-chip.code-snippets +27 -0
  95. package/.vscode/srcdev-component-display-pill.code-snippets +38 -0
  96. package/.vscode/srcdev-component-display-prompt.code-snippets +10 -54
  97. package/.vscode/srcdev-component-display-qr-code.code-snippets +22 -0
  98. package/.vscode/srcdev-component-eyebrow-text.code-snippets +19 -0
  99. package/.vscode/srcdev-component-form-field.code-snippets +25 -0
  100. package/.vscode/srcdev-component-form-fieldset.code-snippets +36 -0
  101. package/.vscode/srcdev-component-form-wrapper.code-snippets +30 -0
  102. package/.vscode/srcdev-component-glass-panel.code-snippets +38 -0
  103. package/.vscode/srcdev-component-grid-stack.code-snippets +49 -0
  104. package/.vscode/srcdev-component-input-button.code-snippets +27 -0
  105. package/.vscode/srcdev-component-input-checkbox-radio.code-snippets +60 -0
  106. package/.vscode/srcdev-component-input-checkbox.code-snippets +48 -0
  107. package/.vscode/srcdev-component-input-description.code-snippets +44 -0
  108. package/.vscode/srcdev-component-input-error.code-snippets +30 -0
  109. package/.vscode/srcdev-component-input-label.code-snippets +39 -0
  110. package/.vscode/srcdev-component-input-number.code-snippets +11 -11
  111. package/.vscode/srcdev-component-input-radio.code-snippets +58 -0
  112. package/.vscode/srcdev-component-layout-grid-by-cols.code-snippets +46 -0
  113. package/.vscode/srcdev-component-link-text.code-snippets +30 -0
  114. package/.vscode/srcdev-component-opening-hours.code-snippets +40 -0
  115. package/.vscode/srcdev-component-page-hero-highlights.code-snippets +37 -0
  116. package/.vscode/srcdev-component-page-row.code-snippets +47 -0
  117. package/.vscode/srcdev-component-pending-effect.code-snippets +26 -0
  118. package/.vscode/srcdev-component-price-list.code-snippets +37 -0
  119. package/.vscode/srcdev-component-pricing-card.code-snippets +2 -2
  120. package/.vscode/srcdev-component-profile-section.code-snippets +36 -0
  121. package/.vscode/srcdev-component-samaritan-prompt.code-snippets +60 -0
  122. package/.vscode/srcdev-component-scroll-reveal-frame.code-snippets +36 -0
  123. package/.vscode/srcdev-component-scroll-reveal-image.code-snippets +46 -0
  124. package/.vscode/srcdev-component-services-card.code-snippets +4 -4
  125. package/.vscode/srcdev-component-services-grids.code-snippets +36 -0
  126. package/.vscode/srcdev-component-site-navigation.code-snippets +26 -18
  127. package/.vscode/srcdev-component-slider-gallery.code-snippets +9 -0
  128. package/.vscode/srcdev-component-social-icons-list.code-snippets +24 -0
  129. package/.vscode/srcdev-component-stepper-list.code-snippets +39 -0
  130. package/.vscode/srcdev-component-text-block.code-snippets +31 -0
  131. package/.vscode/srcdev-component-triple-toggle-switch.code-snippets +30 -0
  132. package/README.md +2 -2
  133. package/app/app.config.ts +10 -0
  134. package/app/assets/styles/setup/02.colours/_orange.css +11 -11
  135. package/app/assets/styles/setup/02.colours/_theme-params.css +2 -2
  136. package/app/assets/styles/setup/03.theming/_default.css +1 -22
  137. package/app/assets/styles/setup/03.theming/_theme-slots.css +1 -1
  138. package/app/assets/styles/setup/03.theming/_warning.css +8 -10
  139. package/app/assets/styles/setup/04.elements/forms/02.typography.css +0 -14
  140. package/app/assets/styles/setup/04.elements/forms/06.button-geometry.css +1 -1
  141. package/app/assets/styles/setup/index.css +1 -1
  142. package/app/components/01.atoms/alert-mask/AlertMaskCore.vue +23 -5
  143. package/app/components/01.atoms/alert-mask/CONSUMER-STYLING.md +23 -5
  144. package/app/components/01.atoms/alert-mask/stories/AlertMaskCore.stories.ts +45 -19
  145. package/app/components/01.atoms/alert-mask/tests/AlertMaskCore.spec.ts +35 -1
  146. package/app/components/01.atoms/animations/animated-svg-text/CONSUMER-STYLING.md +13 -0
  147. package/app/components/01.atoms/animations/clip-element/CONSUMER-STYLING.md +13 -0
  148. package/app/components/01.atoms/animations/clip-element/ClipElement.vue +2 -2
  149. package/app/components/01.atoms/animations/container-glow/CONSUMER-STYLING.md +26 -5
  150. package/app/components/01.atoms/animations/entry/.nuxt/app.config.mjs +21 -0
  151. package/app/components/01.atoms/animations/entry/.nuxt/components.d.ts +66 -0
  152. package/app/components/01.atoms/animations/entry/.nuxt/imports.d.ts +30 -0
  153. package/app/components/01.atoms/animations/entry/.nuxt/manifest/meta/test.json +1 -0
  154. package/app/components/01.atoms/animations/entry/.nuxt/types/app.config.d.ts +35 -0
  155. package/app/components/01.atoms/animations/entry/.nuxt/types/build.d.ts +23 -0
  156. package/app/components/01.atoms/animations/entry/.nuxt/types/builder-env.d.ts +1 -0
  157. package/app/components/01.atoms/animations/entry/.nuxt/types/components.d.ts +71 -0
  158. package/app/components/01.atoms/animations/entry/.nuxt/types/imports.d.ts +386 -0
  159. package/app/components/01.atoms/animations/entry/.nuxt/types/middleware.d.ts +11 -0
  160. package/app/components/01.atoms/animations/entry/.nuxt/types/modules.d.ts +79 -0
  161. package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-layouts.d.ts +17 -0
  162. package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-nuxt.d.ts +64 -0
  163. package/app/components/01.atoms/animations/entry/.nuxt/types/plugins.d.ts +29 -0
  164. package/app/components/01.atoms/animations/entry/.nuxt/types/runtime-config.d.ts +32 -0
  165. package/app/components/01.atoms/animations/entry/.nuxt/types/shared-imports.d.ts +10 -0
  166. package/app/components/01.atoms/animations/entry/.nuxt/types/vue-shim.d.ts +0 -0
  167. package/app/components/01.atoms/animations/entry/.nuxtrc +1 -0
  168. package/app/components/01.atoms/animations/entry/CONSUMER-STYLING.md +65 -0
  169. package/app/components/01.atoms/animations/entry/EntryAnimation.vue +6 -5
  170. package/app/components/01.atoms/animations/entry/node_modules/.cache/nuxt/chrome-workspace.json +1 -0
  171. package/app/components/01.atoms/animations/entry/node_modules/.cache/vite/client/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  172. package/app/components/01.atoms/animations/entry/stories/EntryAnimation.stories.ts +1 -1
  173. package/app/components/01.atoms/animations/entry/tests/EntryAnimation.spec.ts +25 -0
  174. package/app/components/01.atoms/animations/glowing-border/CONSUMER-STYLING.md +24 -5
  175. package/app/components/01.atoms/animations/marquee-scroller/CONSUMER-STYLING.md +20 -0
  176. package/app/components/01.atoms/animations/rotating-carousel-image/CONSUMER-STYLING.md +17 -0
  177. package/app/components/01.atoms/animations/scroll-reveal-frame/CONSUMER-STYLING.md +77 -0
  178. package/app/components/01.atoms/animations/scroll-reveal-frame/ScrollRevealFrame.vue +37 -78
  179. package/app/components/01.atoms/animations/scroll-reveal-frame/stories/ScrollRevealFrame.stories.ts +48 -0
  180. package/app/components/01.atoms/animations/scroll-reveal-frame/tests/ScrollRevealFrame.spec.ts +40 -33
  181. package/app/components/01.atoms/animations/scroll-reveal-frame/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +4 -4
  182. package/app/components/01.atoms/animations/scroll-reveal-image/CONSUMER-STYLING.md +74 -0
  183. package/app/components/01.atoms/animations/scroll-reveal-image/ScrollRevealImage.vue +14 -44
  184. package/app/components/01.atoms/animations/scroll-reveal-image/stories/ScrollRevealImage.stories.ts +50 -1
  185. package/app/components/01.atoms/animations/scroll-reveal-image/tests/ScrollRevealImage.spec.ts +27 -20
  186. package/app/components/01.atoms/animations/scroll-reveal-image/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +4 -4
  187. package/app/components/01.atoms/animations/section-parallax/CONSUMER-STYLING.md +21 -4
  188. package/app/components/01.atoms/animations/view-timeline/CONSUMER-STYLING.md +25 -0
  189. package/app/components/01.atoms/banner-video/CONSUMER-STYLING.md +12 -5
  190. package/app/components/01.atoms/canvas-switcher/CONSUMER-STYLING.md +20 -7
  191. package/app/components/01.atoms/canvas-switcher/CanvasSwitcher.vue +12 -7
  192. package/app/components/01.atoms/card/CONSUMER-STYLING.md +47 -42
  193. package/app/components/01.atoms/card/CardCore.vue +7 -17
  194. package/app/components/01.atoms/clipped-panel/CONSUMER-STYLING.md +13 -0
  195. package/app/components/01.atoms/content-wrappers/docs-pages/CONSUMER-STYLING.md +127 -0
  196. package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +44 -77
  197. package/app/components/01.atoms/content-wrappers/docs-pages/stories/ContentDocs.stories.ts +3 -3
  198. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/CONSUMER-STYLING.md +14 -1
  199. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/stories/DashboardQuadGrid.stories.ts +2 -0
  200. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/CONSUMER-STYLING.md +13 -0
  201. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/stories/DashboardStatsGrid.stories.ts +2 -0
  202. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/CONSUMER-STYLING.md +72 -0
  203. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/LayoutGridByCols.vue +26 -25
  204. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/stories/LayoutGridByCols.stories.ts +91 -107
  205. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/LayoutGridByCols.spec.ts +50 -15
  206. package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +5 -5
  207. package/app/components/01.atoms/display-banner/CONSUMER-STYLING.md +13 -0
  208. package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +82 -54
  209. package/app/components/01.atoms/display-dialog/DisplayDialog.vue +38 -45
  210. package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +25 -0
  211. package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +21 -0
  212. package/app/components/01.atoms/display-pill/CONSUMER-STYLING.md +112 -0
  213. package/app/components/01.atoms/display-pill/DisplayPill.vue +88 -50
  214. package/app/components/01.atoms/display-pill/stories/DisplayPill.stories.ts +56 -3
  215. package/app/components/01.atoms/display-pill/tests/DisplayPill.spec.ts +104 -4
  216. package/app/components/01.atoms/display-pill/tests/__snapshots__/DisplayPill.spec.ts.snap +3 -3
  217. package/app/components/01.atoms/display-tooltip/CONSUMER-STYLING.md +22 -2
  218. package/app/components/01.atoms/display-tooltip/DisplayTooltip.vue +18 -26
  219. package/app/components/01.atoms/glass-panel/CONSUMER-STYLING.md +91 -0
  220. package/app/components/01.atoms/glass-panel/GlassPanel.vue +34 -30
  221. package/app/components/01.atoms/glass-panel/stories/GlassPanel.stories.ts +121 -0
  222. package/app/components/01.atoms/glass-panel/tests/GlassPanel.spec.ts +61 -0
  223. package/app/components/01.atoms/grids/auto-grid/AutoGrid.vue +5 -10
  224. package/app/components/01.atoms/grids/auto-grid/CONSUMER-STYLING.md +76 -0
  225. package/app/components/01.atoms/grids/auto-grid/stories/AutoGrid.stories.ts +5 -4
  226. package/app/components/01.atoms/grids/auto-grid/tests/AutoGrid.spec.ts +8 -0
  227. package/app/components/01.atoms/grids/column-flow-grid/CONSUMER-STYLING.md +11 -2
  228. package/app/components/01.atoms/grids/grid-stack/CONSUMER-STYLING.md +76 -0
  229. package/app/components/01.atoms/grids/grid-stack/GridStack.vue +6 -1
  230. package/app/components/01.atoms/grids/grid-stack/stories/GridStack.stories.ts +1 -1
  231. package/app/components/01.atoms/grids/grid-stack/tests/GridStack.spec.ts +35 -0
  232. package/app/components/01.atoms/grids/masonry-grid/CONSUMER-STYLING.md +11 -2
  233. package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +5 -10
  234. package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +15 -0
  235. package/app/components/01.atoms/navigation/skip-links/CONSUMER-STYLING.md +13 -0
  236. package/app/components/01.atoms/navigation/tabs/CONSUMER-STYLING.md +21 -0
  237. package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +46 -8
  238. package/app/components/01.atoms/page-row/PageRow.vue +17 -13
  239. package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +8 -0
  240. package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +7 -11
  241. package/app/components/01.atoms/pop-over/CONSUMER-STYLING.md +13 -0
  242. package/app/components/01.atoms/qr-code/CONSUMER-STYLING.md +48 -0
  243. package/app/components/01.atoms/qr-code/DisplayQrCode.vue +5 -1
  244. package/app/components/01.atoms/qr-code/stories/DisplayQrCode.stories.ts +11 -3
  245. package/app/components/01.atoms/qr-code/tests/DisplayQrCode.spec.ts +15 -0
  246. package/app/components/01.atoms/text-block/CONSUMER-STYLING.md +49 -0
  247. package/app/components/01.atoms/text-block/TextBlock.vue +13 -5
  248. package/app/components/01.atoms/text-block/stories/TextBlock.stories.ts +84 -0
  249. package/app/components/01.atoms/text-block/tests/TextBlock.spec.ts +78 -0
  250. package/app/components/01.atoms/text-block/tests/__snapshots__/TextBlock.spec.ts.snap +7 -0
  251. package/app/components/01.atoms/text-blocks/eyebrow-text/CONSUMER-STYLING.md +56 -0
  252. package/app/components/01.atoms/text-blocks/eyebrow-text/EyebrowText.vue +10 -5
  253. package/app/components/01.atoms/text-blocks/eyebrow-text/tests/EyebrowText.spec.ts +11 -0
  254. package/app/components/01.atoms/text-blocks/header-block/CONSUMER-STYLING.md +16 -1
  255. package/app/components/01.atoms/text-blocks/hero-text/CONSUMER-STYLING.md +74 -0
  256. package/app/components/01.atoms/text-blocks/hero-text/HeroText.vue +14 -9
  257. package/app/components/01.atoms/text-blocks/hero-text/tests/HeroText.spec.ts +11 -0
  258. package/app/components/01.atoms/text-blocks/link-text/CONSUMER-STYLING.md +45 -0
  259. package/app/components/01.atoms/text-blocks/link-text/LinkText.vue +15 -8
  260. package/app/components/01.atoms/text-blocks/link-text/tests/LinkText.spec.ts +11 -0
  261. package/app/components/01.atoms/ui-block-decorated/CONSUMER-STYLING.md +13 -0
  262. package/app/components/02.molecules/action-menu/ActionMenu.vue +28 -30
  263. package/app/components/02.molecules/action-menu/{ActionMenuItemCore.vue → ActionMenuItem.vue} +12 -14
  264. package/app/components/02.molecules/action-menu/CONSUMER-STYLING.md +90 -76
  265. package/app/components/02.molecules/action-menu/stories/ActionMenu.stories.ts +48 -41
  266. package/app/components/02.molecules/action-menu/tests/ActionMenu.spec.ts +46 -1
  267. package/app/components/02.molecules/action-menu/tests/{ActionMenuItemCore.spec.ts → ActionMenuItem.spec.ts} +11 -5
  268. package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItem.spec.ts.snap +27 -0
  269. package/app/components/02.molecules/alert-content/AlertContent.vue +17 -8
  270. package/app/components/02.molecules/alert-content/AlertContentInner.vue +57 -30
  271. package/app/components/02.molecules/alert-content/CONSUMER-STYLING.md +84 -0
  272. package/app/components/02.molecules/alert-content/stories/AlertContent.stories.ts +39 -0
  273. package/app/components/02.molecules/alert-content/tests/AlertContent.spec.ts +32 -0
  274. package/app/components/02.molecules/alert-content/tests/AlertContentInner.spec.ts +32 -0
  275. package/app/components/02.molecules/alert-masked-content/AlertMaskedContent.vue +9 -5
  276. package/app/components/02.molecules/alert-masked-content/CONSUMER-STYLING.md +73 -0
  277. package/app/components/02.molecules/alert-masked-content/stories/AlertMaskedContent.stories.ts +91 -10
  278. package/app/components/02.molecules/alert-masked-content/tests/AlertMaskedContent.spec.ts +52 -0
  279. package/app/components/02.molecules/cookie-consent-banner/CONSUMER-STYLING.md +95 -0
  280. package/app/components/02.molecules/cookie-consent-banner/CookieConsentBanner.vue +149 -0
  281. package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/stories/CookieConsentBanner.stories.ts +22 -3
  282. package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/tests/CookieConsentBanner.spec.ts +81 -4
  283. package/app/components/02.molecules/display-avatar/CONSUMER-STYLING.md +63 -0
  284. package/app/components/02.molecules/display-avatar/DisplayAvatar.vue +120 -0
  285. package/app/components/{01.atoms → 02.molecules}/display-avatar/stories/DisplayAvatar.stories.ts +56 -14
  286. package/app/components/{01.atoms → 02.molecules}/display-avatar/tests/DisplayAvatar.spec.ts +43 -11
  287. package/app/components/02.molecules/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +11 -0
  288. package/app/components/02.molecules/display-chip/CONSUMER-STYLING.md +57 -0
  289. package/app/components/02.molecules/display-chip/DisplayChip.vue +50 -83
  290. package/app/components/02.molecules/display-chip/tests/DisplayChip.spec.ts +10 -10
  291. package/app/components/02.molecules/display-chip/tests/__snapshots__/DisplayChip.spec.ts.snap +4 -4
  292. package/app/components/02.molecules/display-theme-switch/CONSUMER-STYLING.md +25 -4
  293. package/app/components/02.molecules/display-theme-switch/DisplayThemeSwitch.vue +9 -6
  294. package/app/components/02.molecules/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +6 -1
  295. package/app/components/02.molecules/display-theme-switch/tests/DisplayThemeSwitch.spec.ts +10 -1
  296. package/app/components/02.molecules/display-tooltip-defined/CONSUMER-STYLING.md +11 -0
  297. package/app/components/02.molecules/expandable/accordian/CONSUMER-STYLING.md +11 -4
  298. package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +12 -5
  299. package/app/components/02.molecules/expandable/expanding-panel-classic/CONSUMER-STYLING.md +12 -5
  300. package/app/components/02.molecules/input-copy/CONSUMER-STYLING.md +12 -5
  301. package/app/components/02.molecules/input-copy/InputCopy.vue +12 -25
  302. package/app/components/02.molecules/input-copy/stories/InputCopy.stories.ts +1 -1
  303. package/app/components/02.molecules/input-copy/tests/InputCopy.spec.ts +1 -1
  304. package/app/components/02.molecules/navigation/deep-expanding-menu/CONSUMER-STYLING.md +13 -0
  305. package/app/components/02.molecules/navigation/deep-expanding-menu-classic/CONSUMER-STYLING.md +11 -0
  306. package/app/components/02.molecules/navigation/site-navigation/CONSUMER-STYLING.md +109 -0
  307. package/app/components/02.molecules/navigation/site-navigation/SiteNavigation.vue +37 -55
  308. package/app/components/02.molecules/navigation/site-navigation/stories/SiteNavigation.stories.ts +22 -1
  309. package/app/components/02.molecules/navigation/site-navigation/tests/SiteNavigation.spec.ts +41 -6
  310. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +13 -8
  311. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +18 -36
  312. package/app/components/02.molecules/navigation/tab-navigation/stories/TabNavigation.stories.ts +1 -1
  313. package/app/components/02.molecules/navigation/tab-navigation/tests/TabNavigation.spec.ts +1 -1
  314. package/app/components/02.molecules/opening-hours/CONSUMER-STYLING.md +134 -0
  315. package/app/components/02.molecules/opening-hours/OpeningHours.vue +352 -0
  316. package/app/components/02.molecules/opening-hours/stories/OpeningHours.stories.ts +127 -0
  317. package/app/components/02.molecules/opening-hours/tests/OpeningHours.spec.ts +228 -0
  318. package/app/components/02.molecules/opening-hours/tests/OpeningHours.structuredData.spec.ts +45 -0
  319. package/app/components/02.molecules/opening-hours/tests/__snapshots__/OpeningHours.spec.ts.snap +23 -0
  320. package/app/components/02.molecules/opening-hours/tests/buildOpeningHoursSpecification.spec.ts +52 -0
  321. package/app/components/02.molecules/price-list/CONSUMER-STYLING.md +106 -0
  322. package/app/components/02.molecules/price-list/PriceList.vue +48 -40
  323. package/app/components/02.molecules/price-list/stories/PriceList.stories.ts +15 -2
  324. package/app/components/02.molecules/price-list/tests/PriceList.spec.ts +39 -2
  325. package/app/components/02.molecules/price-list/tests/__snapshots__/PriceList.spec.ts.snap +4 -16
  326. package/app/components/02.molecules/pricing-card/CONSUMER-STYLING.md +23 -5
  327. package/app/components/02.molecules/pricing-card/PricingCard.vue +31 -61
  328. package/app/components/02.molecules/pricing-card/stories/PricingCard.stories.ts +2 -0
  329. package/app/components/02.molecules/pricing-card/tests/PricingCard.spec.ts +14 -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 +11 -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} +5 -7
  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 +1 -1
  491. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +4 -1
  492. package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabel.spec.ts +26 -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/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -314
  561. package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitchCore.stories.ts +0 -63
  562. package/.vscode/{srcdev-component-dialog.code-snippets → srcdev-component-display-dialog.code-snippets} +0 -0
  563. package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToast.spec.ts +1 -1
  564. /package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToastProvider.spec.ts +0 -0
  565. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-chromium-darwin.png +0 -0
  566. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-firefox-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-webkit-darwin.png +0 -0
  568. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-chromium-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-firefox-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-webkit-darwin.png +0 -0
  571. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-chromium-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-firefox-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-webkit-darwin.png +0 -0
  574. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-chromium-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-firefox-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-webkit-darwin.png +0 -0
  577. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-chromium-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-firefox-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-webkit-darwin.png +0 -0
  580. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-chromium-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-firefox-darwin.png +0 -0
  582. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-chromium-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-firefox-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-webkit-darwin.png +0 -0
  585. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-chromium-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-firefox-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-webkit-darwin.png +0 -0
  588. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-chromium-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-firefox-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-webkit-darwin.png +0 -0
  591. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-chromium-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-firefox-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-webkit-darwin.png +0 -0
  594. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-chromium-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-firefox-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-webkit-darwin.png +0 -0
  597. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-chromium-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-firefox-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-webkit-darwin.png +0 -0
  600. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-chromium-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-firefox-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-webkit-darwin.png +0 -0
  603. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-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}/nuxt-icon-only-component-chromium-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-firefox-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-webkit-darwin.png +0 -0
  607. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-chromium-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-firefox-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-webkit-darwin.png +0 -0
  610. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-chromium-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-firefox-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-webkit-darwin.png +0 -0
  613. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-chromium-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-firefox-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-webkit-darwin.png +0 -0
  616. /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-chromium-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-firefox-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-webkit-darwin.png +0 -0
  619. /package/app/components/05.forms/input-range/{variants/stories → stories}/InputRangeDefault.stories.ts +0 -0
  620. /package/app/components/05.forms/input-select/{variants/tests → tests}/InputSelectWithLabel.spec.ts +0 -0
  621. /package/app/components/05.forms/input-textarea/{variants/tests → tests}/InputTextareaWithLabel.spec.ts +0 -0
  622. /package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabelInline.spec.ts +0 -0
  623. /package/app/types/components/{navigation-horizontal.d.ts → nav-item.d.ts} +0 -0
@@ -1,4 +1,5 @@
1
1
  import type { SemanticTheme, DisplayPromptTheme, DisplayToastTheme, DisplayToastPosition, DisplayToastAlignment } from "./components"
2
+ import type { InputLabelIndicator } from "./forms/types.forms"
2
3
 
3
4
  declare module "@nuxt/schema" {
4
5
  interface AppConfigInput {
@@ -12,6 +13,7 @@ declare module "@nuxt/schema" {
12
13
  dismissible?: boolean
13
14
  useAutoFocus?: boolean
14
15
  masked?: boolean
16
+ closeLabel?: string
15
17
  }
16
18
  displayToast?: {
17
19
  appearance?: {
@@ -35,6 +37,14 @@ declare module "@nuxt/schema" {
35
37
  allowContentScroll?: boolean
36
38
  theme?: SemanticTheme
37
39
  closeIcon?: string
40
+ closeLabel?: string
41
+ }
42
+ inputLabel?: {
43
+ indicator?: InputLabelIndicator
44
+ requiredText?: string
45
+ optionalText?: string
46
+ requiredIcon?: string
47
+ optionalIcon?: string
38
48
  }
39
49
  }
40
50
  }
@@ -4,5 +4,8 @@ export type CookieConsentStatus = "unset" | "granted" | "denied"
4
4
 
5
5
  export interface CookieConsentBannerProps {
6
6
  theme?: SemanticTheme
7
+ ariaLabel?: string
8
+ icon?: string
9
+ showIcon?: boolean
7
10
  styleClassPassthrough?: string | string[]
8
11
  }
@@ -11,7 +11,7 @@ export * from "./qr-code.d"
11
11
  export * from "./alert-mask-core.d"
12
12
  export * from "./container-glow.d"
13
13
  export * from "./hero-text"
14
- export * from "./navigation-horizontal.d"
14
+ export * from "./nav-item.d"
15
15
  export * from "./social-icons-list.d"
16
16
  export * from "./content-docs.d"
17
17
  export * from "./breadcrumb"
@@ -21,3 +21,8 @@ export * from "./marquee-scroller.d"
21
21
  export * from "./rotating-carousel-image.d"
22
22
  export * from "./skip-links.d"
23
23
  export * from "./select-menu.d"
24
+ export * from "./price-list.d"
25
+ export * from "./opening-hours.d"
26
+ export * from "./samaritan-prompt.d"
27
+ export * from "./profile-section.d"
28
+ export * from "./services-card.d"
@@ -0,0 +1,48 @@
1
+ /** 0 = Monday ... 6 = Sunday */
2
+ export type OpeningWeekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;
3
+
4
+ export type OpeningStatus = "open" | "closed" | "24-hours" | "by-appointment";
5
+
6
+ export interface OpeningSession {
7
+ /** 24-hour "HH:MM" */
8
+ opens: string;
9
+ /** 24-hour "HH:MM"; earlier than `opens` means it closes after midnight */
10
+ closes: string;
11
+ label?: string;
12
+ }
13
+
14
+ export interface OpeningDay {
15
+ day: OpeningWeekday;
16
+ /** Defaults to "open" when sessions are given, otherwise "closed" */
17
+ status?: OpeningStatus;
18
+ sessions?: OpeningSession[];
19
+ note?: string;
20
+ }
21
+
22
+ export interface OpeningException {
23
+ /** "YYYY-MM-DD" */
24
+ from: string;
25
+ /** "YYYY-MM-DD", inclusive; omit for a single day */
26
+ to?: string;
27
+ label?: string;
28
+ status?: OpeningStatus;
29
+ sessions?: OpeningSession[];
30
+ note?: string;
31
+ }
32
+
33
+ export interface OpeningHoursStructuredData {
34
+ /** schema.org type, e.g. "HairSalon", "Restaurant" */
35
+ type?: string;
36
+ name?: string;
37
+ /** Match the @id of the site's main business JSON-LD so search engines merge them */
38
+ id?: string;
39
+ }
40
+
41
+ export interface OpeningHoursSpecification {
42
+ "@type": "OpeningHoursSpecification";
43
+ dayOfWeek?: string | string[];
44
+ opens: string;
45
+ closes: string;
46
+ validFrom?: string;
47
+ validThrough?: string;
48
+ }
@@ -0,0 +1,11 @@
1
+ export interface PriceItem {
2
+ description: string;
3
+ price: string;
4
+ from?: boolean;
5
+ }
6
+
7
+ export interface PriceListData {
8
+ headingtext: string;
9
+ headingIcon?: string;
10
+ items: PriceItem[];
11
+ }
@@ -0,0 +1,6 @@
1
+ export interface ProfilePicture {
2
+ src: string;
3
+ alt: string;
4
+ width?: number;
5
+ height?: number;
6
+ }
@@ -0,0 +1,13 @@
1
+ export type SamaritanPromptEffect = "typewriter" | "word-pulse";
2
+
3
+ export interface SamaritanPromptMessageConfig {
4
+ text: string;
5
+ effect?: SamaritanPromptEffect;
6
+ typeSpeed?: number;
7
+ deleteSpeed?: number;
8
+ holdDuration?: number;
9
+ pauseDuration?: number;
10
+ wordDuration?: number;
11
+ fadeDuration?: number;
12
+ hideCursorInCycle?: boolean;
13
+ }
@@ -0,0 +1,9 @@
1
+ export interface ServicesCardEyebrowConfig {
2
+ tag?: "p" | "div" | "span";
3
+ fontSize?: "large" | "medium" | "small";
4
+ }
5
+
6
+ export interface ServicesCardHeroConfig {
7
+ tag?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
8
+ fontSize?: "display" | "title" | "heading" | "subheading" | "label";
9
+ }
@@ -10,4 +10,6 @@ export interface IGalleryData {
10
10
  description: string
11
11
  }
12
12
  textBrightness: "light" | "dark"
13
+ /** Link for the slide's call-to-action; no link is rendered without it. */
14
+ href?: string
13
15
  }
@@ -3,4 +3,6 @@ export interface ISocialIcon {
3
3
  iconName: string;
4
4
  baseHref: string;
5
5
  profileId: string;
6
+ /** Accessible name for the link; overrides the list's linkLabelTemplate. */
7
+ label?: string;
6
8
  }
@@ -10,6 +10,9 @@ export type InputButtonVariant = "primary" | "secondary" | "tertiary" | "inline"
10
10
  // Input variant types for form components
11
11
  export type InputUiVariant = "normal" | "outlined" | "underlined";
12
12
 
13
+ // Which fields InputLabel marks: required ones, optional ones, or neither
14
+ export type InputLabelIndicator = "none" | "required" | "optional";
15
+
13
16
  // Other form-specific types
14
17
  export type CheckboxAppearance = null | "with-decorator";
15
18
  export type CheckboxStyle = "check" | "cross";
@@ -2,9 +2,6 @@ import type {
2
2
  IFieldsInitialState,
3
3
  IFormFieldsState,
4
4
  IFormFieldsC12,
5
- IFormFieldC12,
6
- IApiErrorMessages,
7
- ICustomErrorMessage,
8
5
  IErrorMessagesArr,
9
6
  } from "../../app/types/forms/types.forms"
10
7
 
@@ -0,0 +1,44 @@
1
+ import type {
2
+ OpeningDay,
3
+ OpeningException,
4
+ OpeningHoursSpecification,
5
+ OpeningSession,
6
+ OpeningStatus,
7
+ } from "~/types/components/opening-hours";
8
+
9
+ const SCHEMA_DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
10
+
11
+ export const resolveOpeningStatus = (entry: { status?: OpeningStatus; sessions?: OpeningSession[] }): OpeningStatus =>
12
+ entry.status ?? (entry.sessions?.length ? "open" : "closed");
13
+
14
+ const specsFor = (
15
+ entry: { status?: OpeningStatus; sessions?: OpeningSession[] },
16
+ extra: Partial<OpeningHoursSpecification>
17
+ ): OpeningHoursSpecification[] => {
18
+ switch (resolveOpeningStatus(entry)) {
19
+ case "open":
20
+ return (entry.sessions ?? []).map(({ opens, closes }) => ({
21
+ "@type": "OpeningHoursSpecification",
22
+ ...extra,
23
+ opens,
24
+ closes,
25
+ }));
26
+ case "24-hours":
27
+ return [{ "@type": "OpeningHoursSpecification", ...extra, opens: "00:00", closes: "23:59" }];
28
+ case "closed":
29
+ // schema.org marks a closed special date with opens === closes
30
+ return extra.validFrom ? [{ "@type": "OpeningHoursSpecification", ...extra, opens: "00:00", closes: "00:00" }] : [];
31
+ default:
32
+ return [];
33
+ }
34
+ };
35
+
36
+ export const buildOpeningHoursSpecification = (
37
+ days: OpeningDay[],
38
+ exceptions: OpeningException[] = []
39
+ ): OpeningHoursSpecification[] => [
40
+ ...days.flatMap((day) => specsFor(day, { dayOfWeek: `https://schema.org/${SCHEMA_DAYS[day.day]}` })),
41
+ ...exceptions.flatMap((exception) =>
42
+ specsFor(exception, { validFrom: exception.from, validThrough: exception.to ?? exception.from })
43
+ ),
44
+ ];
package/nuxt.config.ts CHANGED
@@ -57,6 +57,10 @@ export default defineNuxtConfig({
57
57
  imports: {
58
58
  dirs: ["./stores"],
59
59
  },
60
+ icon: {
61
+ // Must stay listed before `components` in the @layer order in app/assets/styles/setup/index.css
62
+ cssLayer: "icons",
63
+ },
60
64
  app: {
61
65
  head: {
62
66
  htmlAttrs: {
@@ -146,7 +150,7 @@ export default defineNuxtConfig({
146
150
  // "esbuild". lightningcss has an open bug where it drops the unprefixed `backdrop-filter`
147
151
  // once autoprefixer adds `-webkit-backdrop-filter` alongside it, breaking glass/blur effects
148
152
  // (see https://github.com/vitejs/vite/issues/22649) — this repo relies on backdrop-filter in
149
- // several components (GlassPanel, SiteNavigation, TabNavigation, DisplayDialog, ColourFinder,
153
+ // several components (GlassPanel, SiteNavigation, TabNavigation, DisplayDialog,
150
154
  // MagneticNavigation). Pin back to esbuild until upstream fixes it.
151
155
  build: {
152
156
  cssMinify: "esbuild",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "srcdev-nuxt-components",
3
3
  "type": "module",
4
- "version": "9.4.11",
4
+ "version": "9.5.0",
5
5
  "main": "nuxt.config.ts",
6
6
  "types": "types.d.ts",
7
7
  "license": "MIT",
@@ -35,7 +35,7 @@
35
35
  "playwright:update": "SRCDEV_STANDALONE=true npx playwright test --update-snapshots"
36
36
  },
37
37
  "files": [
38
- ".claude/",
38
+ ".claude/skills/",
39
39
  ".vscode/",
40
40
  "app/",
41
41
  "modules/",
package/ramps.config.mjs CHANGED
@@ -22,7 +22,7 @@ export const ramps = {
22
22
  red: { hue: 30, chroma: 0.24 },
23
23
  green: { hue: 157, chroma: 0.19 },
24
24
  amber: { hue: 75, chroma: 0.19 },
25
- orange: { hue: 60, chroma: 0.15 },
25
+ orange: { hue: 55, chroma: 0.19 },
26
26
  sunset: { hue: 50, chroma: 0.22, drift: -25 },
27
27
  slate: { hue: 260, chroma: 0.02 },
28
28
  };
@@ -1,13 +0,0 @@
1
- ---
2
- description: Draft a commit message from staged changes only — never runs git add/commit/push
3
- ---
4
-
5
- Draft a commit message for the currently staged changes. Do not run `git add`, `git commit`, or `git push` — this command only produces the message text for review.
6
-
7
- Steps:
8
- 1. Run `git status` and `git diff --staged` to see what's staged. If nothing is staged, say so and stop.
9
- 2. Run `git log --oneline -10` to match this repo's existing commit message style (e.g. `type(scope): summary`).
10
- 3. Draft a concise message: a short summary line, plus a body only if the change needs context not obvious from the diff. Focus on *why*, not a restatement of the diff.
11
- 4. Present the message in a fenced code block. Do not commit it.
12
-
13
- If the user's request also explicitly says "commit this" or "run it", that's authorization to act — use the `/run-commit` flow instead of stopping at the draft.
@@ -1,34 +0,0 @@
1
- ---
2
- description: Produce release notes as a fenced markdown block, scoped to commits since the last release
3
- ---
4
-
5
- Produce release notes for the commits since the last `chore(release):` commit. Always output them as a single fenced ` ```markdown ` code block so the content can be copied directly into a git tag, GitHub release, or changelog — never render it as plain markdown.
6
-
7
- Steps:
8
-
9
- 1. **Determine the range.** Run `git log --oneline -20` and find the most recent `chore(release): release vX.Y.Z` commit — that's the boundary. Also check `package.json` for the current version if you need to confirm what's already shipped vs pending.
10
- 2. **Review each commit since that boundary.** Run `git show <commit> --stat` (and the message) for each one to understand what changed. Skip other `chore(release):` commits themselves, and skip purely internal/tooling commits (e.g. adding slash commands, promoting doc gotchas) unless they're user-facing.
11
- 3. **Draft the notes** using the format below. Only include sections that have content — omit empty headings. Keep each bullet to one line where possible. Lead with the most user-facing changes (New, Fixed) before internal ones (Changed, Documentation). Fold minor follow-up commits (e.g. a test/docs completion commit for a feature shipped a commit earlier) into the same bullet as the feature rather than giving them their own line — unless the follow-up is substantial enough to warrant one.
12
- 4. **Output** the result wrapped in a ` ```markdown ` fence. Do not commit, tag, or push anything — this command only produces text for review.
13
-
14
- ## Format
15
-
16
- ```markdown
17
- ## vX.Y.Z
18
-
19
- ### New
20
-
21
- - **`ComponentOrComposableName`** — one-line description of what it does and why it exists
22
-
23
- ### Fixed
24
-
25
- - Short description of what was wrong and what was corrected
26
-
27
- ### Changed
28
-
29
- - Short description of intentional behaviour or API changes
30
-
31
- ### Documentation
32
-
33
- - **`skill-name` skill** — new/updated: what it covers
34
- ```
@@ -1,169 +0,0 @@
1
- ---
2
- description: Bring one component up to the current compliance standard (tier, styling doc, tokens, tests, story, skill doc, snippet)
3
- ---
4
-
5
- Migrate a single component to full compliance with the standard in CLAUDE.md (Development
6
- Workflow, Styling Methodology, Vue Template Conventions) — see also `project_component_compliance_standard`
7
- and `feedback_private_token_convention_clarified` in memory for the token rule specifically.
8
-
9
- ## 1. Pick the component
10
-
11
- If the user gave an argument (a component name or path — e.g. `/migrate-component input-copy`),
12
- resolve it against `app/components/` (match on folder name or `.vue` filename, case-insensitively).
13
- If it doesn't resolve uniquely, ask which one they meant.
14
-
15
- **Check before you migrate.** Whenever a component was named explicitly — or the user's wording is
16
- a status question ("is X done?", "check X", "does X still need work?") rather than an instruction
17
- to migrate — run `node .claude/component-ledger/build.mjs` and look up that component's row in
18
- `.claude/component-ledger/audit.json` first:
19
-
20
- - **Already fully compliant** (`score: 5`, placed in a real tier, `variants: false`,
21
- `legacy_props: false`, `story_args_bug: false`, `eslint_issues: false`): skip straight to
22
- reporting — state its ledger row (tier, score, and confirmation the four non-scored checks are
23
- also clean) and stop. Don't run step 2's `AskUserQuestion` or the step 3 checklist for a
24
- component that already passes every check; that flow is for when there's actual work to decide
25
- about.
26
- - **Not fully compliant, or the user asked to migrate/fix it outright** (not just check): proceed
27
- to step 2 as normal.
28
-
29
- Otherwise, auto-pick the next worst offender:
30
-
31
- 1. Run `node .claude/component-ledger/build.mjs` to refresh the audit data.
32
- 2. Read `.claude/component-ledger/audit.json`. Pick in this priority order, first match wins:
33
- - Any group with `"tier": "NONE"` (unplaced) — pick the one with the lowest `score`, ties broken alphabetically by `compdir`.
34
- - Else any group with `"variants": true` — same tie-break.
35
- - Else any group with `"legacy_props": true` (still options-style `defineProps({...})`, not
36
- `defineProps<Props>()`) — same tie-break. This one doesn't move the 5-point `score`, so it
37
- would otherwise hide forever behind an already-complete-looking component.
38
- - Else any group with `"story_args_bug": true` (a story destructures/refs Storybook's `args` at
39
- setup-time — see checklist item 6a) — same tie-break. Also doesn't move the 5-point `score`,
40
- for the same reason as `legacy_props`.
41
- - Else any group with `"eslint_issues": true` (`npx eslint` reports at least one error or
42
- warning on a `.vue` file in the group) — same tie-break. Also doesn't move the 5-point
43
- `score`, for the same reason as `legacy_props`/`story_args_bug`. Run
44
- `npx eslint <files in the group>` to see the actual finding(s) before deciding the fix — don't
45
- guess. A common one: `const props = withDefaults(defineProps<Props>(), {...})` where nothing
46
- ever reads `.props` because the template uses Vue's automatic prop-shorthand binding
47
- (`:id`, `:name`, etc. resolve directly, no destructuring needed) — fix by dropping the
48
- `props =` assignment, not by inventing a use for it. Another common one on this specific
49
- ruleset: `vue/require-default-prop` firing on a `defineModel()`-declared prop — this is a
50
- known false positive (the rule predates `defineModel` and has no way to exempt model props);
51
- the fix is `defineModel<T>({ required: true })` where the native element genuinely can't be
52
- meaningfully empty (see `InputRangeCore`/`InputRangeDefault`), not a blanket rule disable and
53
- not an artificial default value that would change real behaviour.
54
- - Else the lowest `score` overall — same tie-break.
55
- 3. State which component was picked and why in one line (e.g. "Picked `input-select` — unplaced isn't the issue here, it forks a `variants/` subfolder and scores 2/5.") before doing anything else, so the user can redirect you if they'd rather do a different one next.
56
-
57
- ## 2. Confirm it's still wanted
58
-
59
- Before starting the checklist, confirm with the user that this component should actually be
60
- migrated — a low score isn't proof it's still needed. Use AskUserQuestion with these options:
61
-
62
- - **Migrate it** (recommended default) — proceed to step 3.
63
- - **Leave it untouched** — skip it this run. If it was auto-picked, say so and go back to step 1
64
- to pick the next worst offender instead; if the user named it explicitly, just stop.
65
- - **Delete it** — it's unused, superseded by another component, or otherwise no longer wanted.
66
- Run the `check-component-usage` skill against the component's name first, across every consumer
67
- repo, and report the results before deleting anything. A clean scan is good evidence, not proof
68
- (see the skill's own caveat on dynamic `:is` usage etc.) — if it finds a real consumer, surface
69
- that back to the user with an `AskUserQuestion` rather than auto-aborting or auto-proceeding;
70
- the user may still want it deleted (e.g. the consumer repo is itself defunct or being retired).
71
- Once confirmed, delete the component file(s) and every trace this command would otherwise have
72
- created or touched for it — tests, stories, `CONSUMER-STYLING.md`, skill doc, VS Code snippet,
73
- any `.claude/skills/index.md` entry, and any direct references elsewhere in the repo (e.g. a
74
- `MIGRATION.md` row) — then skip the rest of this command for that component.
75
-
76
- ## 3. Work the checklist
77
-
78
- Go through each point below. Skip a point only when it genuinely doesn't apply (state why,
79
- briefly) — don't skip silently.
80
-
81
- 1. **Tier folder** — if the component lives outside `01.atoms`–`05.forms`, move it with `git mv`
82
- into the tier that fits (see `project_component_tiers` in memory for what each tier means).
83
- If none fits cleanly, ask the user rather than guessing.
84
- 2. **Props pattern** — confirm `interface Props` + `withDefaults(defineProps<Props>(), {...})`,
85
- not options-style `defineProps({...})`. Migrate if needed.
86
- 3. **CSS tokens** — audit every custom property in the component's `<style>` block against the
87
- corrected rule (consumer relevance, not reuse count):
88
- - A value a consumer could plausibly want to override — including a per-state variant like a
89
- hover-only width or a dark-theme colour — must be a **public** token (`--component-name-x`),
90
- consumed directly at its point of use, even if used only once.
91
- - A value with no plausible consumer relevance stays **private** (`--_x`), even if used only
92
- once — don't strip the prefix just because reuse is low.
93
- - Fix the actual bug class this catches: a consumer-relevant value that's currently private
94
- with no public fallback. That's the thing to promote, not every `--_` var you find.
95
- 4. **CONSUMER-STYLING.md** — create or update so every public token the component exposes is
96
- documented, with its default. Skip only if the component genuinely has no override surface at
97
- all (no CSS custom properties, no class passthrough).
98
- 5. **Tests** — create or bring up to date in `tests/`, following the Testing Requirements section
99
- (mountSuspended, fake-timer rules, etc.). Skip only for a trivial presentational component with
100
- no logic worth testing — say so explicitly if you skip.
101
- 6. **Storybook story** — create or update `stories/*.stories.ts` with controls for props/slots
102
- that warrant them (see `.claude/skills/storybook-add-story.md`).
103
- 6a. **Storybook Controls-panel reactivity** — check every story `Template`/`render` function in
104
- the component's `stories/*.stories.ts` files for this bug: `@storybook/vue3` mounts the story
105
- component **once** and, on every Controls-panel change, mutates the same reactive `args`
106
- object in place — it never re-runs `setup()`. A story that destructures or spreads `args` into
107
- local variables/a ref at setup-time (the tell-tale shape: `const { modelValue, ...otherArgs }
108
- = args;`, whether or not it's then fed into a `ref()`) takes a one-time snapshot, so most
109
- Controls silently stop updating the rendered story after first render — often alongside a
110
- prop-name typo in `argTypes` that compounds it (e.g. a control literally named differently
111
- from the real component prop it's meant to drive — check that too). Fix by binding the
112
- template directly to the live object (`v-model="args.modelValue"`, `v-bind="componentArgs"`
113
- where `componentArgs` is a `computed()` that strips only genuinely non-prop extra args) rather
114
- than copying values out in `setup()` — a destructure/spread from `args` is only safe when it's
115
- inside a `computed()`. The ledger's `story_args_bug` column flags this automatically (any
116
- `{...} = args;` spread not wrapped in a `computed()`); still eyeball each story file yourself,
117
- since a differently-shaped variant of the same mistake may not match that exact heuristic.
118
- 7. **Skill doc** — create or update `.claude/skills/components/<component-name>.md`. If the
119
- component still forks `variants/` files, fold each variant's behaviour into this doc as a
120
- "Variants" section per `feedback_variants_deprecated_as_own_skill_docs` — don't delete the
121
- variant files yourself without asking, since consumers may still import them directly; flag it
122
- to the user as a follow-up decision instead.
123
- 8. **VS Code snippet** — create or update `.vscode/srcdev-component-{name}.code-snippets`.
124
- 9. **Accessibility** — check for gaps beyond what already-passing tests would catch:
125
- - Interactive controls (buttons, toggles, custom form-like widgets) have an accessible name —
126
- visible text, `aria-label`, or `aria-labelledby`.
127
- - Keyboard behaviour matches what's actually implemented — no keydown case that only calls
128
- `event.preventDefault()` with a comment like "could add this later", and no screen-reader
129
- copy (visible or `sr-only`) that describes an interaction the component doesn't actually
130
- perform. Cross-check every claim in the copy against the handler that's supposed to back it.
131
- - Focus is visible (`:focus-visible`, not a suppressed outline) on anything focusable.
132
- - Live-updating or auto-advancing content (carousels, marquees, auto-dismissing toasts) has a
133
- way to pause it, per WCAG 2.2.2 — a visible control, or pause-on-hover/focus at minimum.
134
- - `prefers-reduced-motion` is respected for any animation that isn't purely decorative.
135
- 10. **Localisation (no hardcoded consumer-facing text)** — grep the template and script for
136
- user-visible string literals (button copy, `aria-label`/`aria-description` text, placeholder
137
- text, empty-state messages, etc.) that aren't already props. This library has no i18n
138
- framework dependency (see `MarqueeScroller`'s `playLabel`/`pauseLabel`/`ariaLabel`/
139
- `ariaDescription` for the pattern) — promote any hardcoded copy to a string prop with the
140
- existing English text as its default, so a consumer can pass translated strings from their own
141
- i18n solution. Icon-only controls should also get an icon-override prop or slot (see
142
- `playIcon`/`pauseIcon`/`toggle-icon`) alongside the label prop, not just the label.
143
- 11. **No `light-dark()` CSS function in the component's own values** — grep the `<style>` block
144
- (and any `v-bind()`-fed script constants) for `light-dark(`. Older iPads/Safari versions don't
145
- support it, so this library's own default values must never rely on it — use the existing
146
- `--theme-*` token convention (pitfall #14) where one already fits. Where none fits and you're
147
- replacing a literal `light-dark(light-value, dark-value)` call directly, keep the **light**
148
- value only — don't invent a dark-mode fallback scheme, and don't ask which of the two to keep.
149
- The mechanism stays available for consumers: a consumer app is free to define its own public
150
- token overrides using `light-dark()` inside its own CSS, since that's their own browser-support
151
- decision to make, not this library's default.
152
- 12. **Add the component to the Migrated Fields Form story** — once the component reaches 5/5,
153
- add one field for it to
154
- `app/components/05.forms/patterns/stories/MigratedFieldsForm.stories.ts` (import the
155
- component, add a field to the demo form, wire minimal state/error handling matching the
156
- existing fields). This story is a living migration-progress tracker, not just a demo — its own
157
- top-of-file comment lists which components are currently included and must be updated too
158
- (add the new component to the list, bump the "As of `<date>`" note). Skip only if the
159
- component's shape genuinely doesn't fit a form field (e.g. a non-form-input `05.forms` helper
160
- component) — state why if you skip.
161
-
162
- ## 4. Wrap up
163
-
164
- - Run the relevant test file(s), `npx eslint <touched files>`, and `npx vue-tsc` (or the project's
165
- usual type-check command) to confirm nothing broke.
166
- - Summarize what changed and what you deliberately skipped (with reasons).
167
- - Don't stage, commit, or push — that's the user's call. Mention that running
168
- `/create-commit-message` next will trigger the Component Ledger refresh automatically via the
169
- existing hook, since this touches `app/components/`.
@@ -1,13 +0,0 @@
1
- ---
2
- description: Stage named files, commit, and push — the full flow (explicit authorization to act)
3
- ---
4
-
5
- Run the full commit flow: stage, commit, and push. Unlike `/create-commit-message`, this command is explicit authorization to execute git commands, not just draft text.
6
-
7
- Steps:
8
- 1. Run `git status`, `git diff`, and `git diff --staged` to see the full picture before staging anything.
9
- 2. Stage files by name (never `git add -A` or `git add .`) so nothing unexpected — stray build output, `.env`, credentials — gets swept in. Confirm with the user if it's unclear which changed files belong in this commit.
10
- 3. Draft the commit message following the repo's existing style (`git log --oneline -10`), and create the commit with a HEREDOC so formatting is preserved, ending with the `Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>` trailer.
11
- 4. Push to the current branch's tracked remote. If the branch has no upstream yet, ask before setting one with `-u`. Never force-push without explicit user instruction.
12
-
13
- Never use `--no-verify`, `--no-gpg-sign`, or otherwise skip hooks/signing. If a pre-commit hook fails, fix the underlying issue and create a **new** commit — never amend to work around a failed hook.
@@ -1 +0,0 @@
1
- https://claude.ai/code/artifact/d3c33630-20d5-4fda-b9df-2ba2ee7f8256
@@ -1 +0,0 @@
1
- {"auditedAt":"2026-09-23","rows":[{"compdir":"01.atoms/alert-mask","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":5,"score":5},{"compdir":"01.atoms/animations/animated-svg-text","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/animations/clip-element","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"01.atoms/animations/container-glow","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":7,"score":5},{"compdir":"01.atoms/animations/entry","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":4},{"compdir":"01.atoms/animations/glowing-border","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":7,"score":5},{"compdir":"01.atoms/animations/marquee-scroller","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":2,"score":5},{"compdir":"01.atoms/animations/rotating-carousel-image","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":5,"score":5},{"compdir":"01.atoms/animations/scroll-reveal-frame","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":3,"score":3},{"compdir":"01.atoms/animations/scroll-reveal-image","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":1,"score":3},{"compdir":"01.atoms/animations/section-parallax","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/animations/view-timeline","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/banner-video","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":4,"score":5},{"compdir":"01.atoms/canvas-switcher","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/card","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":13,"score":5},{"compdir":"01.atoms/clipped-panel","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"01.atoms/content-wrappers/content-columns-2","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":0,"score":2},{"compdir":"01.atoms/content-wrappers/content-width","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":0,"score":2},{"compdir":"01.atoms/content-wrappers/docs-pages","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":51,"score":4},{"compdir":"01.atoms/content-wrappers/layout-grid/dashboard-quad-grid","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/content-wrappers/layout-grid/dashboard-stats-grid","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/content-wrappers/layout-grid/layout-grid-by-cols","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":1,"score":3},{"compdir":"01.atoms/content-wrappers/layout-grid/layout-grid-by-width","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":1,"score":2},{"compdir":"01.atoms/cookie-consent-banner","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":7,"score":3},{"compdir":"01.atoms/display-avatar","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"01.atoms/display-banner","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/display-dialog","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":21,"score":4},{"compdir":"01.atoms/display-pill","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":14,"score":3},{"compdir":"01.atoms/display-tooltip","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"01.atoms/glass-panel","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":true,"snippet":false,"priv_tokens":4,"score":1},{"compdir":"01.atoms/grids/auto-grid","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"01.atoms/grids/column-flow-grid","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":2,"score":5},{"compdir":"01.atoms/grids/grid-stack","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"01.atoms/grids/masonry-grid","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":5,"score":5},{"compdir":"01.atoms/navigation/breadcrumb","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":7,"score":5},{"compdir":"01.atoms/navigation/skip-links","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/navigation/tabs","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":9,"score":5},{"compdir":"01.atoms/page-row","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":5,"score":4},{"compdir":"01.atoms/pop-over","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"01.atoms/prompt","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":4},{"compdir":"01.atoms/qr-code","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"01.atoms/text-block","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":0},{"compdir":"01.atoms/text-blocks/eyebrow-text","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"01.atoms/text-blocks/header-block","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"01.atoms/text-blocks/hero-text","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":4},{"compdir":"01.atoms/text-blocks/link-text","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"01.atoms/toast","tier":"01.atoms","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":6,"score":5},{"compdir":"01.atoms/ui-block-decorated","tier":"01.atoms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"02.molecules/action-menu","tier":"02.molecules","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":21,"score":4},{"compdir":"02.molecules/alert-content","tier":"02.molecules","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":1,"score":3},{"compdir":"02.molecules/alert-masked-content","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":1,"score":2},{"compdir":"02.molecules/display-chip","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":1,"score":3},{"compdir":"02.molecules/display-theme-switch","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":2,"score":5},{"compdir":"02.molecules/display-tooltip-defined","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"02.molecules/expandable/accordian","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"02.molecules/expandable/expanding-panel","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"02.molecules/expandable/expanding-panel-classic","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"02.molecules/input-copy","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":16,"score":5},{"compdir":"02.molecules/navigation/deep-expanding-menu","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":2,"score":5},{"compdir":"02.molecules/navigation/deep-expanding-menu-classic","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"02.molecules/navigation/navigation-horizontal","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":20,"score":3},{"compdir":"02.molecules/navigation/site-navigation","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":45,"score":4},{"compdir":"02.molecules/navigation/tab-navigation","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":28,"score":5},{"compdir":"02.molecules/price-list","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":8,"score":2},{"compdir":"02.molecules/pricing-card","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":28,"score":5},{"compdir":"02.molecules/profile-section","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"02.molecules/qr-code","tier":"02.molecules","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"02.molecules/samaritan-prompt","tier":"02.molecules","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":false,"skill":true,"snippet":false,"priv_tokens":14,"score":2},{"compdir":"02.molecules/social-icons-list","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":2,"score":3},{"compdir":"02.molecules/stepper-list","tier":"02.molecules","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":22,"score":4},{"compdir":"03.organisms/colour-finder","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":false,"snippet":false,"priv_tokens":20,"score":0},{"compdir":"03.organisms/image-galleries/carousel-flip","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"03.organisms/image-galleries/slider-gallery","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":false,"tests":true,"stories":true,"skill":false,"snippet":true,"priv_tokens":12,"score":3},{"compdir":"03.organisms/responsive-header","tier":"03.organisms","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":18,"score":5},{"compdir":"03.organisms/services/service-detail","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"03.organisms/services/service-summary","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"03.organisms/services/services-card","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"03.organisms/services/services-grids","tier":"03.organisms","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"03.organisms/site-header","tier":"03.organisms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"04.templates/page-hero-highlights","tier":"04.templates","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":true,"skill":true,"snippet":false,"priv_tokens":0,"score":3},{"compdir":"05.forms/form-errors","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":1},{"compdir":"05.forms/form-field","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":false,"snippet":false,"priv_tokens":4,"score":0},{"compdir":"05.forms/form-fieldset","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":0},{"compdir":"05.forms/form-wrapper","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":0},{"compdir":"05.forms/input-button","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":2,"score":3},{"compdir":"05.forms/input-checkbox","tier":"05.forms","n_vue":2,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":false,"tests":true,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":1},{"compdir":"05.forms/input-checkbox-radio","tier":"05.forms","n_vue":3,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":true,"tests":true,"stories":true,"skill":false,"snippet":false,"priv_tokens":3,"score":3},{"compdir":"05.forms/input-description","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":1},{"compdir":"05.forms/input-label","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":true,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":1},{"compdir":"05.forms/input-number","tier":"05.forms","n_vue":2,"variants":true,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":4,"score":5},{"compdir":"05.forms/input-radio","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":false,"tests":true,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":1},{"compdir":"05.forms/input-range","tier":"05.forms","n_vue":2,"variants":true,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":0,"score":5},{"compdir":"05.forms/input-select","tier":"05.forms","n_vue":2,"variants":true,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":2,"score":5},{"compdir":"05.forms/input-text","tier":"05.forms","n_vue":4,"variants":true,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":5,"score":5},{"compdir":"05.forms/input-textarea","tier":"05.forms","n_vue":2,"variants":true,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":1,"score":5},{"compdir":"05.forms/pending-effect","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":false,"tests":false,"stories":false,"skill":false,"snippet":false,"priv_tokens":0,"score":0},{"compdir":"05.forms/toggle-switch","tier":"05.forms","n_vue":3,"variants":true,"legacy_props":false,"story_args_bug":false,"eslint_issues":false,"consumer_styling":true,"tests":true,"stories":true,"skill":true,"snippet":true,"priv_tokens":14,"score":5},{"compdir":"05.forms/triple-toggle-switch","tier":"05.forms","n_vue":1,"variants":false,"legacy_props":false,"story_args_bug":false,"eslint_issues":true,"consumer_styling":true,"tests":false,"stories":true,"skill":false,"snippet":false,"priv_tokens":11,"score":2}]}