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,54 +1,79 @@
1
1
  <template>
2
- <div ref="sliderGalleryWrapper" class="slider-gallery" :class="[elementClasses]">
3
- <div class="loading-state" :class="[{ galleryLoaded: !galleryLoaded }]">
4
- <div class="loading-spinner"></div>
2
+ <div
3
+ ref="sliderGalleryWrapper"
4
+ class="slider-gallery"
5
+ :class="[elementClasses, { 'has-text-scrim': textScrim }]"
6
+ role="region"
7
+ aria-roledescription="carousel"
8
+ :aria-label="ariaLabel"
9
+ @mouseenter="isPaused = true"
10
+ @mouseleave="isPaused = false"
11
+ @focusin="isPaused = true"
12
+ @focusout="isPaused = false"
13
+ >
14
+ <div class="slider-gallery-loading" :class="[{ 'is-loaded': !isLoading }]" role="status">
15
+ <div class="slider-gallery-spinner" aria-hidden="true"></div>
5
16
  <p>{{ loadingText }}</p>
6
17
  </div>
7
18
 
8
- <div v-if="showGallery" class="gallery-content" :class="[{ galleryLoaded: !galleryLoaded }]">
9
- <div ref="sliderGalleryImagesList" class="list">
10
- <div v-for="(item, index) in galleryData" :key="index" class="item">
19
+ <div v-if="showGallery" class="slider-gallery-content" :class="[{ 'is-loaded': !isLoading }]">
20
+ <div ref="sliderGalleryImagesList" class="slider-gallery-list">
21
+ <div
22
+ v-for="(item, index) in galleryData"
23
+ :key="index"
24
+ class="slider-gallery-item"
25
+ :data-text-brightness="item.textBrightness"
26
+ :data-has-text="hasSlideText(item) ? '' : undefined"
27
+ >
11
28
  <NuxtImg :src="item.src" :alt="item.alt" @load="handleImageLoad(index)" @error="handleImageError(index)" />
12
- <div class="content" :class="item.textBrightness">
13
- <div v-show="item.stylist !== ''" class="author" :class="item.textBrightness">{{ item.stylist }}</div>
14
- <div v-show="item.title !== ''" class="title" :class="item.textBrightness">{{ item.title }}</div>
15
- <div v-show="item.category !== ''" class="topic" :class="item.textBrightness">{{ item.category }}</div>
16
- <div v-show="item.description !== ''" class="description" :class="item.textBrightness">
17
- {{ item.description }}
18
- </div>
19
- <div class="buttons" :class="item.textBrightness">
20
- <button>{{ seeMoreText }}</button>
29
+ <div class="slider-gallery-item-content" :class="item.textBrightness">
30
+ <div v-if="item.stylist" class="slider-gallery-author">{{ item.stylist }}</div>
31
+ <div v-if="item.title" class="slider-gallery-title">{{ item.title }}</div>
32
+ <div v-if="item.category" class="slider-gallery-topic">{{ item.category }}</div>
33
+ <div v-if="item.description" class="slider-gallery-description">{{ item.description }}</div>
34
+ <div v-if="item.href" class="slider-gallery-actions">
35
+ <a :href="item.href" class="slider-gallery-cta">{{ seeMoreText }}</a>
21
36
  </div>
22
37
  </div>
23
38
  </div>
24
39
  </div>
25
40
 
26
- <div ref="sliderGalleryThumbnailsList" class="thumbnail">
27
- <div v-for="(item, index) in galleryData" :key="index" class="item">
28
- <div class="inner">
29
- <NuxtImg :src="item.src" :alt="item.alt" loading="lazy" />
30
- <div class="content" :class="item.textBrightness">
31
- <div v-show="item.thumbnail?.title !== ''" class="title" :class="item.textBrightness">
32
- {{ item.thumbnail?.title }}
33
- </div>
34
- <div v-show="item.thumbnail?.description !== ''" class="description" :class="item.textBrightness">
35
- {{ item.thumbnail?.description }}
41
+ <div ref="sliderGalleryThumbnailsList" class="slider-gallery-thumbnails" aria-hidden="true">
42
+ <div v-for="(item, index) in galleryData" :key="index" class="slider-gallery-item">
43
+ <div class="slider-gallery-thumbnail-overlay">
44
+ <NuxtImg :src="item.src" alt="" loading="lazy" />
45
+ <div class="slider-gallery-item-content" :class="item.textBrightness">
46
+ <div v-if="item.thumbnail?.title" class="slider-gallery-title">{{ item.thumbnail.title }}</div>
47
+ <div v-if="item.thumbnail?.description" class="slider-gallery-description">
48
+ {{ item.thumbnail.description }}
36
49
  </div>
37
50
  </div>
38
51
  </div>
39
52
  </div>
40
53
  </div>
41
54
 
42
- <div class="arrows">
43
- <button id="prev" ref="prevDom" :aria-label="prevAriaLabel" @click.prevent="doPrevious()">
44
- <Icon name="ic:outline-keyboard-arrow-left" class="arrows-icon" />
55
+ <div class="slider-gallery-arrows">
56
+ <button
57
+ ref="prevDom"
58
+ type="button"
59
+ class="slider-gallery-prev"
60
+ :aria-label="prevAriaLabel"
61
+ @click.prevent="doPrevious()"
62
+ >
63
+ <Icon :name="prevIcon" class="slider-gallery-arrow-icon" aria-hidden="true" />
45
64
  </button>
46
- <button id="next" ref="nextDom" :aria-label="nextAriaLabel" @click.prevent="doNext()">
47
- <Icon name="ic:outline-keyboard-arrow-right" class="arrows-icon" />
65
+ <button
66
+ ref="nextDom"
67
+ type="button"
68
+ class="slider-gallery-next"
69
+ :aria-label="nextAriaLabel"
70
+ @click.prevent="doNext()"
71
+ >
72
+ <Icon :name="nextIcon" class="slider-gallery-arrow-icon" aria-hidden="true" />
48
73
  </button>
49
74
  </div>
50
75
 
51
- <div class="time"></div>
76
+ <div class="slider-gallery-progress" aria-hidden="true"></div>
52
77
  </div>
53
78
  </div>
54
79
  </template>
@@ -62,12 +87,18 @@ interface Props {
62
87
  animationDuration?: number;
63
88
  /** Loading-state copy — override for localisation. */
64
89
  loadingText?: string;
65
- /** Per-slide call-to-action button copy — override for localisation. */
90
+ /** Per-slide link copy (shown for slides with an href) — override for localisation. */
66
91
  seeMoreText?: string;
67
92
  /** aria-label on the previous-image button — override for localisation. */
68
93
  prevAriaLabel?: string;
69
94
  /** aria-label on the next-image button — override for localisation. */
70
95
  nextAriaLabel?: string;
96
+ /** aria-label on the carousel region — override for localisation. */
97
+ ariaLabel?: string;
98
+ prevIcon?: string;
99
+ nextIcon?: string;
100
+ /** Gradient behind the slide text, keyed to each slide's textBrightness. */
101
+ textScrim?: boolean;
71
102
  styleClassPassthrough?: string | string[];
72
103
  }
73
104
 
@@ -79,35 +110,44 @@ const props = withDefaults(defineProps<Props>(), {
79
110
  seeMoreText: "SEE MORE",
80
111
  prevAriaLabel: "Previous image",
81
112
  nextAriaLabel: "Next image",
113
+ ariaLabel: "Image gallery",
114
+ prevIcon: "ic:outline-keyboard-arrow-left",
115
+ nextIcon: "ic:outline-keyboard-arrow-right",
116
+ textScrim: true,
82
117
  styleClassPassthrough: () => [],
83
118
  });
84
119
 
85
120
  const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
86
- const galleryData = defineModel<IGalleryData[]>("galleryData");
121
+ const galleryData = defineModel<IGalleryData[]>("galleryData", { required: true });
122
+
123
+ const hasSlideText = (item: IGalleryData) =>
124
+ Boolean(item.stylist || item.title || item.category || item.description || item.href);
87
125
 
88
126
  const sliderGalleryWrapper = useTemplateRef("sliderGalleryWrapper");
89
127
  const sliderGalleryImagesList = useTemplateRef("sliderGalleryImagesList");
90
128
  const sliderGalleryThumbnailsList = useTemplateRef("sliderGalleryThumbnailsList");
91
129
 
92
130
  const transitionRunning = ref(false);
93
- const galleryLoaded = ref(true);
131
+ const isLoading = ref(true);
94
132
  const showGallery = ref(false);
133
+ const isPaused = ref(false);
95
134
  const loadedImages = new Set<number>();
96
135
  const preloadedImages: HTMLImageElement[] = [];
97
136
 
137
+ const prefersReducedMotion = () =>
138
+ typeof window !== "undefined" && !!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
139
+ const shouldAutoRun = () => props.autoRun && !prefersReducedMotion();
140
+
98
141
  onMounted(async () => {
99
142
  await nextTick();
100
143
 
101
- // If no images or galleryData is empty, stop loading
102
144
  if (!galleryData.value || galleryData.value.length === 0) {
103
- galleryLoaded.value = false;
145
+ isLoading.value = false;
104
146
  return;
105
147
  }
106
148
 
107
- // Create an array to hold image loading promises
108
149
  const imageLoadPromises: Promise<void>[] = [];
109
150
 
110
- // Preload the first image at minimum
111
151
  const firstImageIndex = 0;
112
152
  if (galleryData.value[firstImageIndex]) {
113
153
  const img = new Image();
@@ -119,7 +159,7 @@ onMounted(async () => {
119
159
  resolve();
120
160
  };
121
161
  img.onerror = () => {
122
- loadedImages.add(firstImageIndex); // Count as loaded anyway
162
+ loadedImages.add(firstImageIndex);
123
163
  resolve();
124
164
  };
125
165
  });
@@ -128,11 +168,10 @@ onMounted(async () => {
128
168
  preloadedImages.push(img);
129
169
  }
130
170
 
131
- // Wait for at least the first image to load
132
171
  await Promise.race(imageLoadPromises);
133
172
 
134
173
  setTimeout(() => {
135
- galleryLoaded.value = false;
174
+ isLoading.value = false;
136
175
  }, 500);
137
176
 
138
177
  showGallery.value = true;
@@ -160,78 +199,63 @@ const doPrevious = () => {
160
199
  let runTimeOut: ReturnType<typeof setTimeout> | undefined;
161
200
  let runNextAuto: ReturnType<typeof setTimeout> | null = null;
162
201
 
163
- function showSlider(type: string) {
202
+ function scheduleAutoRun() {
203
+ if (runNextAuto) clearTimeout(runNextAuto);
204
+ runNextAuto = setTimeout(() => {
205
+ if (!shouldAutoRun() || isLoading.value) return;
206
+ if (isPaused.value) {
207
+ scheduleAutoRun();
208
+ return;
209
+ }
210
+ doNext();
211
+ }, props.autoRunInterval);
212
+ }
213
+
214
+ function showSlider(type: "next" | "prev") {
164
215
  transitionRunning.value = true;
165
216
 
166
217
  const currentSliderItems = Array.from(sliderGalleryImagesList.value?.children || []);
167
218
  const currentThumbnailItems = Array.from(sliderGalleryThumbnailsList.value?.children || []);
168
219
 
169
220
  if (type === "next") {
170
- if (currentSliderItems.length) {
171
- const firstItem = currentSliderItems[0];
172
- if (firstItem) {
173
- sliderGalleryImagesList.value?.appendChild(firstItem);
174
- }
175
- }
221
+ const firstItem = currentSliderItems[0];
222
+ if (firstItem) sliderGalleryImagesList.value?.appendChild(firstItem);
176
223
 
177
- if (currentThumbnailItems.length) {
178
- const firstThumb = currentThumbnailItems[0];
179
- if (firstThumb) {
180
- sliderGalleryThumbnailsList.value?.appendChild(firstThumb);
181
- }
182
- }
224
+ const firstThumb = currentThumbnailItems[0];
225
+ if (firstThumb) sliderGalleryThumbnailsList.value?.appendChild(firstThumb);
183
226
 
184
- sliderGalleryWrapper.value?.classList.add("next");
227
+ sliderGalleryWrapper.value?.classList.add("is-next");
185
228
  } else {
186
- if (currentSliderItems.length) {
187
- const lastItem = currentSliderItems[currentSliderItems.length - 1];
188
- if (lastItem) {
189
- lastItem.classList.add("prepend-item");
190
- sliderGalleryImagesList.value?.prepend(lastItem);
191
- }
229
+ const lastItem = currentSliderItems[currentSliderItems.length - 1];
230
+ if (lastItem) {
231
+ lastItem.classList.add("is-prepended");
232
+ sliderGalleryImagesList.value?.prepend(lastItem);
192
233
  }
193
234
 
194
- if (currentThumbnailItems.length) {
195
- const lastThumb = currentThumbnailItems[currentThumbnailItems.length - 1];
196
- if (lastThumb) {
197
- lastThumb.classList.add("prepend-item");
198
- sliderGalleryThumbnailsList.value?.prepend(lastThumb);
199
- }
235
+ const lastThumb = currentThumbnailItems[currentThumbnailItems.length - 1];
236
+ if (lastThumb) {
237
+ lastThumb.classList.add("is-prepended");
238
+ sliderGalleryThumbnailsList.value?.prepend(lastThumb);
200
239
  }
201
240
 
202
- void sliderGalleryWrapper.value?.offsetWidth; // Force reflow
203
- sliderGalleryWrapper.value?.classList.add("prev");
241
+ void sliderGalleryWrapper.value?.offsetWidth; // force reflow so the prev animation restarts
242
+ sliderGalleryWrapper.value?.classList.add("is-prev");
204
243
  }
205
244
 
206
245
  clearTimeout(runTimeOut);
207
246
  runTimeOut = setTimeout(() => {
208
247
  if (sliderGalleryWrapper.value) {
209
- sliderGalleryWrapper.value.classList.remove("next");
210
- sliderGalleryWrapper.value.classList.remove("prev");
211
-
212
- const items = sliderGalleryImagesList.value?.querySelectorAll(".prepend-item");
213
- items?.forEach((item) => item.classList.remove("prepend-item"));
214
-
215
- const thumbs = sliderGalleryThumbnailsList.value?.querySelectorAll(".prepend-item");
216
- thumbs?.forEach((thumb) => thumb.classList.remove("prepend-item"));
248
+ sliderGalleryWrapper.value.classList.remove("is-next", "is-prev");
249
+ sliderGalleryWrapper.value.querySelectorAll(".is-prepended").forEach((el) => el.classList.remove("is-prepended"));
217
250
  }
218
251
  transitionRunning.value = false;
219
252
  }, props.animationDuration);
220
253
 
221
- // Reset auto-run timer
222
- if (runNextAuto) clearTimeout(runNextAuto);
223
- runNextAuto = setTimeout(() => {
224
- if (!props.autoRun || galleryLoaded.value) return;
225
- doNext();
226
- }, props.autoRunInterval);
254
+ scheduleAutoRun();
227
255
  }
228
256
 
229
- // Add keyboard navigation event handlers
230
257
  const handleKeyDown = (event: KeyboardEvent) => {
231
- // Don't process key events if transition is running or gallery isn't loaded
232
- if (transitionRunning.value || galleryLoaded.value) {
233
- return;
234
- }
258
+ if (transitionRunning.value || isLoading.value) return;
235
259
 
236
260
  if (event.key === "ArrowLeft") {
237
261
  doPrevious();
@@ -240,14 +264,8 @@ const handleKeyDown = (event: KeyboardEvent) => {
240
264
  }
241
265
  };
242
266
 
243
- // Initialize auto-run only after loading completes
244
- watch(galleryLoaded, (newValue) => {
245
- if (!newValue && props.autoRun) {
246
- if (runNextAuto) clearTimeout(runNextAuto);
247
- runNextAuto = setTimeout(() => {
248
- doNext();
249
- }, props.autoRunInterval);
250
- }
267
+ watch(isLoading, (loading) => {
268
+ if (!loading && shouldAutoRun()) scheduleAutoRun();
251
269
  });
252
270
 
253
271
  watch(
@@ -268,50 +286,47 @@ onBeforeUnmount(() => {
268
286
  <style lang="css">
269
287
  @layer components {
270
288
  .slider-gallery {
271
- --_animationDuration: v-bind(animationDuration + "ms");
272
-
273
- --_thumbnailAspectRatio: 150 /220;
274
-
275
- --_thumbnailWidth: var(--_thumbnailMobileWidth, 100px);
276
- --_thumbnailHeight: var(--_thumbnailMobileHeight, 165px);
289
+ --_animation-duration: v-bind(animationDuration + "ms");
290
+ --_accent: var(--slider-gallery-accent, #f1683a);
291
+ --_thumbnail-width: var(--slider-gallery-thumbnail-width, 100px);
292
+ --_thumbnail-height: var(--slider-gallery-thumbnail-height, 165px);
277
293
 
278
- height: 100svh;
294
+ height: var(--slider-gallery-height, 100svh);
279
295
  width: 100vw;
280
296
  overflow: hidden;
281
297
  position: absolute;
282
- inset: 0 0 0 0;
283
-
284
- z-index: 9999;
298
+ inset: 0;
299
+ z-index: var(--slider-gallery-z-index, 9999);
285
300
  container-type: inline-size;
286
301
 
287
- .loading-state {
302
+ .slider-gallery-loading {
288
303
  position: absolute;
289
- inset: 0 0 0 0;
304
+ inset: 0;
290
305
  z-index: 1000;
291
306
  display: flex;
292
307
  flex-direction: column;
293
- background-color: var(--page-bg);
308
+ background-color: var(--slider-gallery-loading-background, var(--page-bg));
294
309
  align-items: center;
295
310
  justify-content: center;
296
- color: var(--colour-text-default);
311
+ color: var(--slider-gallery-loading-colour, var(--colour-text-default));
297
312
  opacity: 1;
298
313
  transition:
299
314
  display 0.5s,
300
315
  opacity 0.5s;
301
316
  transition-behavior: allow-discrete;
302
317
 
303
- &.galleryLoaded {
318
+ &.is-loaded {
304
319
  display: none;
305
320
  opacity: 0;
306
321
  }
307
322
 
308
- .loading-spinner {
323
+ .slider-gallery-spinner {
309
324
  width: 50px;
310
325
  height: 50px;
311
326
  border: 5px solid rgba(0, 0, 0, 0.1);
312
327
  border-radius: 50%;
313
- border-top-color: #f1683a;
314
- animation: spinner 1s ease-in-out infinite;
328
+ border-top-color: var(--_accent);
329
+ animation: slider-gallery-spinner 1s ease-in-out infinite;
315
330
  margin-bottom: 20px;
316
331
  }
317
332
 
@@ -321,49 +336,64 @@ onBeforeUnmount(() => {
321
336
  }
322
337
  }
323
338
 
324
- .gallery-content {
339
+ .slider-gallery-content {
325
340
  width: 100%;
326
341
  height: 100%;
327
342
  position: relative;
328
- /* opacity: 0; */
329
- /* transition: opacity 0.5s ease-in-out; */
330
343
 
331
- /* Removed empty ruleset for .galleryLoaded */
344
+ @container (width >= 1024px) {
345
+ --_thumbnail-width: var(--slider-gallery-thumbnail-width-wide, 150px);
346
+ --_thumbnail-height: var(--slider-gallery-thumbnail-height-wide, 220px);
347
+ }
348
+ }
349
+
350
+ .slider-gallery-item-content {
351
+ &.light {
352
+ color: var(--slider-gallery-text-light, #fff);
353
+ }
354
+
355
+ &.dark {
356
+ color: var(--slider-gallery-text-dark, #000);
357
+ }
332
358
  }
333
359
 
334
- .list {
335
- .item {
360
+ .slider-gallery-list {
361
+ .slider-gallery-item {
362
+ isolation: isolate;
336
363
  width: 100%;
337
364
  height: 100%;
338
365
  position: absolute;
339
- inset: 0 0 0 0;
366
+ inset: 0;
340
367
 
341
368
  &:nth-child(1) {
342
369
  z-index: 1;
343
370
 
344
- .content {
345
- .author,
346
- .title,
347
- .topic,
348
- .description,
349
- .buttons {
371
+ .slider-gallery-item-content {
372
+ .slider-gallery-author,
373
+ .slider-gallery-title,
374
+ .slider-gallery-topic,
375
+ .slider-gallery-description,
376
+ .slider-gallery-actions {
350
377
  transform: translateY(50px);
351
378
  filter: blur(20px);
352
379
  opacity: 0;
353
- animation: showContent 0.5s 1s linear 1 forwards;
380
+ animation: slider-gallery-show-content 0.5s 1s linear 1 forwards;
354
381
  }
355
382
 
356
- .title {
357
- animation-delay: 1.2s !important;
383
+ .slider-gallery-title {
384
+ animation-delay: 1.2s;
358
385
  }
359
- .topic {
360
- animation-delay: 1.4s !important;
386
+
387
+ .slider-gallery-topic {
388
+ animation-delay: 1.4s;
361
389
  }
362
- .description {
363
- animation-delay: 1.6s !important;
390
+
391
+ .slider-gallery-description {
392
+ animation-delay: 1.6s;
364
393
  }
365
- .buttons {
366
- animation-delay: 1.8s !important;
394
+
395
+ .slider-gallery-actions {
396
+ animation-delay: 1.8s;
367
397
  }
368
398
  }
369
399
  }
@@ -374,8 +404,29 @@ onBeforeUnmount(() => {
374
404
  object-fit: cover;
375
405
  }
376
406
 
377
- .content {
407
+ &::before {
408
+ content: "";
378
409
  position: absolute;
410
+ inset: 0;
411
+ z-index: 1;
412
+ pointer-events: none;
413
+ opacity: 0;
414
+ background: var(
415
+ --slider-gallery-text-light-scrim,
416
+ linear-gradient(to right, rgb(0 0 0 / 0.6), transparent 70%)
417
+ );
418
+ }
419
+
420
+ &[data-text-brightness="dark"]::before {
421
+ background: var(
422
+ --slider-gallery-text-dark-scrim,
423
+ linear-gradient(to right, rgb(255 255 255 / 0.6), transparent 70%)
424
+ );
425
+ }
426
+
427
+ .slider-gallery-item-content {
428
+ position: absolute;
429
+ z-index: 2;
379
430
  top: 20%;
380
431
  width: 1140px;
381
432
  max-width: 80%;
@@ -385,69 +436,47 @@ onBeforeUnmount(() => {
385
436
  box-sizing: border-box;
386
437
  text-shadow: 0 5px 10px #0004;
387
438
 
388
- &.light {
389
- color: #fff;
390
- }
391
- &.dark {
392
- color: #000;
439
+ @container (width < 678px) {
440
+ padding-right: 0;
393
441
  }
394
442
 
395
- .author {
443
+ .slider-gallery-author {
396
444
  font-weight: bold;
397
445
  letter-spacing: 10px;
398
-
399
- &.light {
400
- color: #fff;
401
- }
402
- &.dark {
403
- color: #000;
404
- }
405
446
  }
406
447
 
407
- .title {
408
- font-size: 5em;
448
+ .slider-gallery-title,
449
+ .slider-gallery-topic {
450
+ font-size: var(--slider-gallery-title-font-size, 5em);
409
451
  font-weight: bold;
410
452
  line-height: 1.3em;
411
-
412
- &.light {
413
- color: #fff;
414
- }
415
- &.dark {
416
- color: #000;
417
- }
418
453
  }
419
- .topic {
420
- font-size: 5em;
421
- font-weight: bold;
422
- line-height: 1.3em;
423
454
 
424
- &.light {
425
- color: #fff;
426
- }
427
- &.dark {
428
- color: #000;
455
+ .slider-gallery-title {
456
+ @container (width < 678px) {
457
+ font-size: var(--slider-gallery-title-font-size-narrow, 30px);
429
458
  }
430
459
  }
431
460
 
432
- .buttons {
433
- display: grid;
434
- grid-template-columns: repeat(2, 130px);
435
- grid-template-rows: 40px;
436
- gap: 5px;
461
+ .slider-gallery-actions {
437
462
  margin-top: 20px;
438
463
 
439
- button {
440
- background-color: #99999975;
441
- border: 1px solid #fff;
442
- color: #fff;
464
+ .slider-gallery-cta {
465
+ display: inline-grid;
466
+ place-items: center;
467
+ min-width: 130px;
468
+ min-height: 40px;
469
+ padding-inline: 1.2rem;
470
+ background-color: var(--slider-gallery-cta-background, #99999975);
471
+ border: 1px solid var(--slider-gallery-cta-border-colour, #fff);
472
+ color: var(--slider-gallery-cta-colour, #fff);
443
473
  letter-spacing: 3px;
444
474
  font-weight: 500;
475
+ text-decoration: none;
445
476
 
446
- &.light {
447
- color: #fff;
448
- }
449
- &.dark {
450
- color: #000;
477
+ &:focus-visible {
478
+ outline: 2px solid var(--theme-ring, currentColor);
479
+ outline-offset: 2px;
451
480
  }
452
481
  }
453
482
  }
@@ -455,35 +484,36 @@ onBeforeUnmount(() => {
455
484
  }
456
485
  }
457
486
 
458
- .thumbnail {
487
+ .slider-gallery-thumbnails {
459
488
  position: absolute;
460
489
  bottom: 50px;
461
490
  left: 50%;
462
491
  width: max-content;
463
492
  z-index: 100;
464
493
  display: flex;
465
- gap: 20px;
466
-
467
- @container (width >= 1024px) {
468
- --_thumbnailWidth: var(--_thumbnailDesktopWidth, 150px);
469
- --_thumbnailHeight: var(--_thumbnailDesktopHeight, 220px);
470
- }
494
+ gap: var(--slider-gallery-thumbnail-gap, 20px);
471
495
 
472
- .item {
473
- width: var(--_thumbnailWidth);
474
- height: var(--_thumbnailHeight);
496
+ .slider-gallery-item {
497
+ width: var(--_thumbnail-width);
498
+ height: var(--_thumbnail-height);
475
499
  flex-shrink: 0;
476
500
  position: relative;
477
-
478
- border: var(--_thumbnailBorder, 1px solid transparent);
479
- outline: var(--_thumbnailOutline, 1px solid transparent);
480
- border-radius: var(--_thumbnailBorderRadius, 20px);
501
+ border: var(--slider-gallery-thumbnail-border, 1px solid transparent);
502
+ outline: var(--slider-gallery-thumbnail-outline, 1px solid transparent);
503
+ outline-offset: var(--slider-gallery-thumbnail-outline-offset, 0rem);
504
+ border-radius: var(--slider-gallery-thumbnail-border-radius, 20px);
481
505
  overflow: hidden;
482
506
 
483
- .inner {
507
+ &:hover {
508
+ border: var(--slider-gallery-thumbnail-border-hover, var(--slider-gallery-thumbnail-border, 1px solid transparent));
509
+ outline: var(--slider-gallery-thumbnail-outline-hover, var(--slider-gallery-thumbnail-outline, 1px solid transparent));
510
+ outline-offset: var(--slider-gallery-thumbnail-outline-offset-hover, var(--slider-gallery-thumbnail-outline-offset, 0rem));
511
+ }
512
+
513
+ .slider-gallery-thumbnail-overlay {
484
514
  position: absolute;
485
- inset: 0 0 0 0;
486
- background-color: #0004;
515
+ inset: 0;
516
+ background-color: var(--slider-gallery-thumbnail-overlay, #0004);
487
517
  z-index: 2;
488
518
  }
489
519
 
@@ -493,209 +523,217 @@ onBeforeUnmount(() => {
493
523
  object-fit: cover;
494
524
  }
495
525
 
496
- .content {
526
+ .slider-gallery-item-content {
497
527
  position: absolute;
498
528
  bottom: 10px;
499
529
  left: 10px;
500
530
  right: 10px;
501
531
 
502
- .title {
532
+ .slider-gallery-title {
503
533
  font-weight: 500;
504
-
505
- &.light {
506
- color: #fff;
507
- }
508
- &.dark {
509
- color: #000;
510
- }
511
534
  }
512
535
 
513
- .description {
536
+ .slider-gallery-description {
514
537
  font-weight: 300;
515
-
516
- &.light {
517
- color: #fff;
518
- }
519
- &.dark {
520
- color: #000;
521
- }
522
538
  }
523
539
  }
524
540
  }
525
541
  }
526
542
 
527
- /* arrows */
528
- .arrows {
543
+ .slider-gallery-arrows {
544
+ --_arrows-top: var(--slider-gallery-arrows-top, 80%);
545
+ --_arrows-right: var(--slider-gallery-arrows-right, 52%);
546
+ --_arrows-width: var(--slider-gallery-arrows-width, 300px);
547
+ --_arrows-max-width: var(--slider-gallery-arrows-max-width, 30%);
548
+
529
549
  position: absolute;
530
- top: 80%;
531
- right: 52%;
550
+ top: var(--_arrows-top);
551
+ right: var(--_arrows-right);
532
552
  z-index: 100;
533
- width: 300px;
534
- max-width: 30%;
553
+ width: var(--_arrows-width);
554
+ max-width: var(--_arrows-max-width);
535
555
  display: flex;
536
- gap: 20px;
556
+ gap: var(--slider-gallery-arrow-gap, 20px);
537
557
  align-items: center;
538
558
 
559
+ @container (width >= 768px) {
560
+ --_arrows-top: var(--slider-gallery-arrows-top-tablet, var(--slider-gallery-arrows-top, 80%));
561
+ --_arrows-right: var(--slider-gallery-arrows-right-tablet, var(--slider-gallery-arrows-right, 52%));
562
+ --_arrows-width: var(--slider-gallery-arrows-width-tablet, var(--slider-gallery-arrows-width, 300px));
563
+ --_arrows-max-width: var(--slider-gallery-arrows-max-width-tablet, var(--slider-gallery-arrows-max-width, 30%));
564
+ }
565
+
566
+ @container (width >= 1024px) {
567
+ --_arrows-top: var(
568
+ --slider-gallery-arrows-top-desktop,
569
+ var(--slider-gallery-arrows-top-tablet, var(--slider-gallery-arrows-top, 80%))
570
+ );
571
+ --_arrows-right: var(
572
+ --slider-gallery-arrows-right-desktop,
573
+ var(--slider-gallery-arrows-right-tablet, var(--slider-gallery-arrows-right, 52%))
574
+ );
575
+ --_arrows-width: var(
576
+ --slider-gallery-arrows-width-desktop,
577
+ var(--slider-gallery-arrows-width-tablet, var(--slider-gallery-arrows-width, 300px))
578
+ );
579
+ --_arrows-max-width: var(
580
+ --slider-gallery-arrows-max-width-desktop,
581
+ var(--slider-gallery-arrows-max-width-tablet, var(--slider-gallery-arrows-max-width, 30%))
582
+ );
583
+ }
584
+
539
585
  button {
586
+ --_arrow-border-width: var(--slider-gallery-arrow-border-width, 0.2rem);
587
+ --_arrow-border-colour: var(--slider-gallery-arrow-border-colour, white);
588
+ --_arrow-outline-width: var(--slider-gallery-arrow-outline-width, 0.1rem);
589
+ --_arrow-outline-colour: var(--slider-gallery-arrow-outline-colour, transparent);
590
+
540
591
  display: grid;
541
- justify-content: center;
542
- align-items: center;
543
- width: 40px;
544
- height: 40px;
545
- border-radius: 50%;
546
- background-color: #eee4;
547
- color: #fff;
548
- font-family: monospace;
549
- font-weight: bold;
550
- transition: 0.5s;
551
-
552
- border-width: 2px;
553
- border-style: solid;
554
- border-color: white;
555
-
556
- &#prev {
557
- --_translateX: -2px;
558
- }
592
+ place-items: center;
593
+ width: var(--slider-gallery-arrow-size, 40px);
594
+ height: var(--slider-gallery-arrow-size, 40px);
595
+ border-radius: var(--slider-gallery-arrow-border-radius, 50%);
596
+ background-color: var(--slider-gallery-arrow-background, #eee4);
597
+ color: var(--slider-gallery-arrow-colour, #fff);
598
+ border: var(--_arrow-border-width) solid var(--_arrow-border-colour);
599
+ outline: var(--_arrow-outline-width) solid var(--_arrow-outline-colour);
600
+ transition: var(--slider-gallery-arrow-transition-duration, 0.5s);
559
601
 
560
- &#next {
561
- --_translateX: 2px;
602
+ &:hover {
603
+ cursor: pointer;
604
+ background-color: var(--slider-gallery-arrow-background-hover, #fff);
605
+ color: var(--slider-gallery-arrow-colour-hover, #000);
606
+ border-width: var(--slider-gallery-arrow-border-width-hover, var(--_arrow-border-width));
607
+ border-color: var(--slider-gallery-arrow-border-colour-hover, var(--_arrow-border-colour));
608
+ outline-width: var(--slider-gallery-arrow-outline-width-hover, var(--_arrow-outline-width));
609
+ outline-color: var(--slider-gallery-arrow-outline-colour-hover, var(--_arrow-outline-colour));
562
610
  }
563
611
 
564
- &:hover {
565
- background-color: #fff;
566
- color: #000;
612
+ &:focus-visible {
613
+ outline: var(--slider-gallery-arrow-outline-width-focus, 2px) solid
614
+ var(--slider-gallery-arrow-outline-colour-focus, var(--theme-ring, currentColor));
615
+ outline-offset: var(--slider-gallery-arrow-outline-offset-focus, 2px);
567
616
  }
568
617
 
569
- .arrows-icon {
570
- color: currentColor;
571
- font-weight: 900;
572
- height: 40px;
573
- width: 40px;
574
- translate: var(--_translateX) -3px;
618
+ .slider-gallery-arrow-icon {
619
+ width: var(--slider-gallery-arrow-icon-size, 24px);
620
+ height: var(--slider-gallery-arrow-icon-size, 24px);
575
621
  }
576
622
  }
577
623
  }
578
624
 
579
- .time {
625
+ .slider-gallery-progress {
580
626
  position: absolute;
581
627
  z-index: 1000;
582
628
  width: 0%;
583
629
  height: 3px;
584
- background-color: #f1683a;
630
+ background-color: var(--_accent);
585
631
  left: 0;
586
632
  top: 0;
587
633
  }
588
634
 
589
- /* Slider carousel animations */
590
- &.next {
591
- .list {
592
- .item {
593
- &:nth-child(1) {
594
- img {
595
- width: var(--_thumbnailWidth);
596
- height: var(--_thumbnailHeight);
597
- position: absolute;
598
- bottom: 50px;
599
- left: 50%;
600
- border-radius: 30px;
601
- animation: showImage 0.5s linear 1 forwards;
602
- }
603
- }
604
- }
635
+ &.has-text-scrim .slider-gallery-list .slider-gallery-item[data-has-text]:nth-child(1)::before {
636
+ animation: slider-gallery-scrim-in 0.5s 0.5s linear forwards;
637
+ }
638
+
639
+ &.is-next {
640
+ .slider-gallery-list .slider-gallery-item:nth-child(1) img {
641
+ width: var(--_thumbnail-width);
642
+ height: var(--_thumbnail-height);
643
+ position: absolute;
644
+ bottom: 50px;
645
+ left: 50%;
646
+ border-radius: 30px;
647
+ animation: slider-gallery-show-image 0.5s linear 1 forwards;
605
648
  }
606
649
 
607
- .arrows {
608
- button {
609
- pointer-events: none;
610
- }
650
+ .slider-gallery-arrows button {
651
+ pointer-events: none;
611
652
  }
612
653
 
613
- .thumbnail {
614
- animation: effectNext 0.5s linear 1 forwards;
654
+ .slider-gallery-thumbnails {
655
+ animation: slider-gallery-effect-next 0.5s linear 1 forwards;
615
656
 
616
- .item {
617
- &:nth-last-child(1) {
618
- overflow: hidden;
619
- animation: showThumbnail 0.5s linear 1 forwards;
620
- }
657
+ .slider-gallery-item:nth-last-child(1) {
658
+ overflow: hidden;
659
+ animation: slider-gallery-show-thumbnail 0.5s linear 1 forwards;
621
660
  }
622
661
  }
623
662
 
624
- .time {
625
- animation: runningTime var(--_animationDuration) linear 1 forwards;
663
+ .slider-gallery-progress {
664
+ animation: slider-gallery-running-time var(--_animation-duration) linear 1 forwards;
626
665
  }
627
666
  }
628
667
 
629
- &.prev {
630
- .list {
631
- .item {
668
+ &.is-prev {
669
+ .slider-gallery-list {
670
+ .slider-gallery-item {
632
671
  &:nth-child(2) {
633
672
  z-index: 2;
634
673
 
635
674
  img {
636
- animation: outFrame 0.5s linear 1 forwards;
675
+ animation: slider-gallery-out-frame 0.5s linear 1 forwards;
637
676
  position: absolute;
638
677
  bottom: 0;
639
678
  left: 0;
640
679
  }
641
680
 
642
- .content {
643
- .author,
644
- .title,
645
- .topic,
646
- .description,
647
- .buttons {
648
- animation: contentOut 1.5s linear 1 forwards !important;
681
+ .slider-gallery-item-content {
682
+ .slider-gallery-author,
683
+ .slider-gallery-title,
684
+ .slider-gallery-topic,
685
+ .slider-gallery-description,
686
+ .slider-gallery-actions {
687
+ animation: slider-gallery-content-out 1.5s linear 1 forwards;
649
688
  }
650
689
  }
651
690
  }
691
+
652
692
  img {
653
693
  z-index: 100;
654
694
  }
655
695
  }
656
696
 
657
- .item.prepend-item {
658
- z-index: 1; /* Ensure it's visible */
659
- /* Any initial styles needed */
697
+ .slider-gallery-item.is-prepended {
698
+ z-index: 1;
660
699
  }
661
700
  }
662
701
 
663
- .arrows {
664
- button {
665
- pointer-events: none;
666
- }
702
+ .slider-gallery-arrows button {
703
+ pointer-events: none;
667
704
  }
668
705
 
669
- .thumbnail {
670
- /* Add a transform to the entire thumbnail container */
671
- animation: effectPrev 0.5s linear 1 forwards;
706
+ .slider-gallery-thumbnails {
707
+ animation: slider-gallery-effect-prev 0.5s linear 1 forwards;
672
708
 
673
- .item {
674
- &:first-child {
675
- /* Add the animated border effect */
676
- &::before {
677
- animation: countdownBorder 7s linear 1 forwards;
678
- }
679
- }
680
- &:nth-child(1) {
681
- overflow: hidden;
682
- animation: showThumbnailPrev 0.5s linear 1 forwards;
683
- }
709
+ .slider-gallery-item:nth-child(1) {
710
+ overflow: hidden;
711
+ animation: slider-gallery-show-thumbnail-prev 0.5s linear 1 forwards;
684
712
  }
685
713
 
686
- .item.prepend-item {
714
+ .slider-gallery-item.is-prepended {
687
715
  opacity: 0;
688
716
  transform: translateX(-20px);
689
- /* Initial state for thumbnail animation */
690
717
  }
691
718
  }
692
- .time {
693
- animation: runningTime var(--_animationDuration) linear 1 forwards;
719
+
720
+ .slider-gallery-progress {
721
+ animation: slider-gallery-running-time var(--_animation-duration) linear 1 forwards;
722
+ }
723
+ }
724
+
725
+ @media (prefers-reduced-motion: reduce) {
726
+ *,
727
+ *::before,
728
+ *::after {
729
+ animation-duration: 1ms !important;
730
+ animation-delay: 0s !important;
731
+ transition-duration: 1ms !important;
694
732
  }
695
733
  }
696
734
  }
697
735
 
698
- @keyframes showContent {
736
+ @keyframes slider-gallery-show-content {
699
737
  to {
700
738
  transform: translateY(0px);
701
739
  filter: blur(0px);
@@ -703,7 +741,7 @@ onBeforeUnmount(() => {
703
741
  }
704
742
  }
705
743
 
706
- @keyframes showImage {
744
+ @keyframes slider-gallery-show-image {
707
745
  to {
708
746
  bottom: 0;
709
747
  left: 0;
@@ -713,20 +751,20 @@ onBeforeUnmount(() => {
713
751
  }
714
752
  }
715
753
 
716
- @keyframes showThumbnail {
754
+ @keyframes slider-gallery-show-thumbnail {
717
755
  from {
718
756
  width: 0;
719
757
  opacity: 0;
720
758
  }
721
759
  }
722
760
 
723
- @keyframes effectNext {
761
+ @keyframes slider-gallery-effect-next {
724
762
  from {
725
- transform: translateX(calc(1 * var(--_thumbnailWidth)));
763
+ transform: translateX(calc(1 * var(--_thumbnail-width)));
726
764
  }
727
765
  }
728
766
 
729
- @keyframes runningTime {
767
+ @keyframes slider-gallery-running-time {
730
768
  from {
731
769
  width: 100%;
732
770
  }
@@ -735,34 +773,34 @@ onBeforeUnmount(() => {
735
773
  }
736
774
  }
737
775
 
738
- @keyframes outFrame {
776
+ @keyframes slider-gallery-out-frame {
739
777
  to {
740
- width: var(--_thumbnailWidth);
741
- height: var(--_thumbnailHeight);
778
+ width: var(--_thumbnail-width);
779
+ height: var(--_thumbnail-height);
742
780
  bottom: 50px;
743
781
  left: 50%;
744
782
  border-radius: 20px;
745
783
  }
746
784
  }
747
785
 
748
- @keyframes contentOut {
786
+ @keyframes slider-gallery-content-out {
749
787
  to {
750
- transform: translateY(calc(-1 * var(--_thumbnailWidth)));
788
+ transform: translateY(calc(-1 * var(--_thumbnail-width)));
751
789
  filter: blur(20px);
752
790
  opacity: 0;
753
791
  }
754
792
  }
755
793
 
756
- @keyframes effectPrev {
794
+ @keyframes slider-gallery-effect-prev {
757
795
  from {
758
- transform: translateX(calc(-1 * var(--_thumbnailWidth)));
796
+ transform: translateX(calc(-1 * var(--_thumbnail-width)));
759
797
  }
760
798
  to {
761
799
  transform: translateX(0);
762
800
  }
763
801
  }
764
802
 
765
- @keyframes showThumbnailPrev {
803
+ @keyframes slider-gallery-show-thumbnail-prev {
766
804
  from {
767
805
  opacity: 0;
768
806
  transform: translateX(-20px);
@@ -773,7 +811,13 @@ onBeforeUnmount(() => {
773
811
  }
774
812
  }
775
813
 
776
- @keyframes spinner {
814
+ @keyframes slider-gallery-scrim-in {
815
+ to {
816
+ opacity: 1;
817
+ }
818
+ }
819
+
820
+ @keyframes slider-gallery-spinner {
777
821
  0% {
778
822
  transform: rotate(0deg);
779
823
  }
@@ -781,14 +825,5 @@ onBeforeUnmount(() => {
781
825
  transform: rotate(360deg);
782
826
  }
783
827
  }
784
-
785
- @media screen and (max-width: 678px) {
786
- .slider-gallery .list .item .content {
787
- padding-right: 0;
788
- }
789
- .slider-gallery .list .item .content .title {
790
- font-size: 30px;
791
- }
792
- }
793
828
  }
794
829
  </style>