srcdev-nuxt-components 8.0.3 → 9.0.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 (512) hide show
  1. package/README.md +170 -118
  2. package/app/assets/styles/extends-layer/srcdev-components/components/_display-prompt-core.css +94 -0
  3. package/app/assets/styles/extends-layer/srcdev-components/components/_display-toast.css +5 -0
  4. package/app/assets/styles/extends-layer/srcdev-components/components/_expanding-panel.css +37 -0
  5. package/app/assets/styles/extends-layer/srcdev-components/components/index.css +3 -0
  6. package/app/assets/styles/extends-layer/srcdev-components/index.css +1 -0
  7. package/app/assets/styles/extends-layer/srcdev-forms/components/_form-fieldset.css +38 -0
  8. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-button.css +67 -0
  9. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-core.css +87 -0
  10. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-options-button.css +74 -0
  11. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-with-label.css +14 -0
  12. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-description.css +13 -0
  13. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-error.css +54 -0
  14. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-label.css +21 -0
  15. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-select.css +143 -0
  16. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-text.css +190 -0
  17. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-textarea.css +96 -0
  18. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-toggle-switch.css +68 -0
  19. package/app/assets/styles/extends-layer/srcdev-forms/components/index.css +12 -0
  20. package/app/assets/styles/extends-layer/srcdev-forms/index.css +2 -0
  21. package/app/assets/styles/extends-layer/srcdev-forms/setup/_generic.css +21 -0
  22. package/app/assets/styles/extends-layer/srcdev-forms/setup/index.css +3 -0
  23. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_default.css +13 -0
  24. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_large.css +12 -0
  25. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_medium.css +12 -0
  26. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_small.css +12 -0
  27. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_x-small.css +11 -0
  28. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/index.css +23 -0
  29. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_default.css +62 -0
  30. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_error.css +63 -0
  31. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_ghost.css +63 -0
  32. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_info.css +63 -0
  33. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_primary.css +66 -0
  34. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_secondary.css +64 -0
  35. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_success.css +63 -0
  36. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_tertiary.css +63 -0
  37. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_warning.css +63 -0
  38. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/index.css +7 -0
  39. package/app/assets/styles/main.css +2 -0
  40. package/app/assets/styles/setup/01.config/_basic-resets.css +9 -0
  41. package/app/assets/styles/setup/01.config/_head.css +33 -0
  42. package/app/assets/styles/setup/01.config/_normalise.css +209 -0
  43. package/app/assets/styles/setup/01.config/index.css +3 -0
  44. package/app/assets/styles/setup/02.colours/_amber.css +12 -0
  45. package/app/assets/styles/setup/02.colours/_blue.css +13 -0
  46. package/app/assets/styles/setup/02.colours/_green.css +13 -0
  47. package/app/assets/styles/setup/02.colours/_orange.css +12 -0
  48. package/app/assets/styles/setup/02.colours/_red.css +13 -0
  49. package/app/assets/styles/setup/02.colours/_slate.css +13 -0
  50. package/app/assets/styles/setup/02.colours/_sunset.css +12 -0
  51. package/app/assets/styles/setup/02.colours/index.css +7 -0
  52. package/app/assets/styles/setup/03.theming/default/_dark.css +138 -0
  53. package/app/assets/styles/setup/03.theming/default/_light.css +156 -0
  54. package/app/assets/styles/setup/03.theming/default/index.css +2 -0
  55. package/app/assets/styles/setup/03.theming/error/_dark.css +56 -0
  56. package/app/assets/styles/setup/03.theming/error/_light.css +74 -0
  57. package/app/assets/styles/setup/03.theming/error/index.css +2 -0
  58. package/app/assets/styles/setup/03.theming/index.css +4 -0
  59. package/app/assets/styles/setup/03.theming/success/_dark.css +50 -0
  60. package/app/assets/styles/setup/03.theming/success/_light.css +65 -0
  61. package/app/assets/styles/setup/03.theming/success/index.css +2 -0
  62. package/app/assets/styles/setup/03.theming/warning/_dark.css +50 -0
  63. package/app/assets/styles/setup/03.theming/warning/_light.css +64 -0
  64. package/app/assets/styles/setup/03.theming/warning/index.css +2 -0
  65. package/app/assets/styles/setup/04.elements/forms/00.element-defaults.css +21 -0
  66. package/app/assets/styles/setup/04.elements/forms/01.field-layout-container-level.css +14 -0
  67. package/app/assets/styles/setup/04.elements/forms/02.typography.css +24 -0
  68. package/app/assets/styles/setup/04.elements/forms/03.generic-input-geometry.css +63 -0
  69. package/app/assets/styles/setup/04.elements/forms/04.slot-icon-system.css +14 -0
  70. package/app/assets/styles/setup/04.elements/forms/05.checkbox-radio-geometry.css +17 -0
  71. package/app/assets/styles/setup/04.elements/forms/06.button-geometry.css +17 -0
  72. package/app/assets/styles/setup/04.elements/forms/07.validation-error-block-layout.css +9 -0
  73. package/app/assets/styles/setup/04.elements/forms/09.animation-motion.css +6 -0
  74. package/app/assets/styles/setup/04.elements/forms/index.css +9 -0
  75. package/app/assets/styles/setup/04.elements/index.css +1 -0
  76. package/app/assets/styles/setup/05.typography/01.tokens/_font-family.css +8 -0
  77. package/app/assets/styles/setup/05.typography/01.tokens/_reponsive-font-sizes.css +22 -0
  78. package/app/assets/styles/setup/05.typography/01.tokens/_timing-functions.css +119 -0
  79. package/app/assets/styles/setup/05.typography/01.tokens/index.css +3 -0
  80. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-article.css +30 -0
  81. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-card.css +45 -0
  82. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-page-body.css +146 -0
  83. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-page-heading.css +35 -0
  84. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-page-link.css +116 -0
  85. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-section.css +7 -0
  86. package/app/assets/styles/setup/05.typography/02.utility-classes/_generic-font-classes.css +3 -0
  87. package/app/assets/styles/setup/05.typography/02.utility-classes/_generic-font-variation-settings.css +29 -0
  88. package/app/assets/styles/setup/05.typography/02.utility-classes/_generic-font-weights.css +39 -0
  89. package/app/assets/styles/setup/05.typography/02.utility-classes/index.css +9 -0
  90. package/app/assets/styles/setup/05.typography/index.css +2 -0
  91. package/app/assets/styles/setup/06.utility-classes/_a11y.css +280 -0
  92. package/app/assets/styles/setup/06.utility-classes/animations/_auto-rotate.css +13 -0
  93. package/app/assets/styles/setup/06.utility-classes/animations/_entry-exit-blur.css +16 -0
  94. package/app/assets/styles/setup/06.utility-classes/animations/_entry-slide-in.css +15 -0
  95. package/app/assets/styles/setup/06.utility-classes/animations/_entry-zoom-reveal.css +15 -0
  96. package/app/assets/styles/setup/06.utility-classes/animations/index.css +4 -0
  97. package/app/assets/styles/setup/06.utility-classes/index.css +4 -0
  98. package/app/assets/styles/setup/06.utility-classes/layout/_containers.css +96 -0
  99. package/app/assets/styles/setup/06.utility-classes/layout/_flexbox.css +196 -0
  100. package/app/assets/styles/setup/06.utility-classes/layout/_grid.css +266 -0
  101. package/app/assets/styles/setup/06.utility-classes/layout/_positioning.css +149 -0
  102. package/app/assets/styles/setup/06.utility-classes/layout/index.css +9 -0
  103. package/app/assets/styles/setup/06.utility-classes/spacing/_fluid-spacing.css +13 -0
  104. package/app/assets/styles/setup/06.utility-classes/spacing/_margin.css +334 -0
  105. package/app/assets/styles/setup/06.utility-classes/spacing/_padding.css +308 -0
  106. package/app/assets/styles/setup/06.utility-classes/spacing/index.css +3 -0
  107. package/app/assets/styles/setup/a11y/_variables.css +8 -0
  108. package/app/assets/styles/setup/a11y/index.css +1 -0
  109. package/app/assets/styles/setup/index.css +10 -0
  110. package/app/components/01.atoms/animations/entry/EntryAnimation.vue +22 -0
  111. package/app/components/01.atoms/animations/entry/stories/EntryAnimation.stories.ts +74 -0
  112. package/app/components/01.atoms/glass-panel/GlassPanel.vue +52 -0
  113. package/app/components/01.atoms/text-blocks/eyebrow-text/EyebrowText.vue +42 -0
  114. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts +67 -0
  115. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
  116. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
  117. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
  118. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-large-chromium-darwin.png +0 -0
  119. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-large-firefox-darwin.png +0 -0
  120. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-large-webkit-darwin.png +0 -0
  121. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-medium-chromium-darwin.png +0 -0
  122. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-medium-firefox-darwin.png +0 -0
  123. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-medium-webkit-darwin.png +0 -0
  124. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-small-chromium-darwin.png +0 -0
  125. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-small-firefox-darwin.png +0 -0
  126. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/fontSize-small-webkit-darwin.png +0 -0
  127. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-div-chromium-darwin.png +0 -0
  128. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-div-firefox-darwin.png +0 -0
  129. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-div-webkit-darwin.png +0 -0
  130. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-p-chromium-darwin.png +0 -0
  131. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-p-firefox-darwin.png +0 -0
  132. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-p-webkit-darwin.png +0 -0
  133. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-span-chromium-darwin.png +0 -0
  134. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-span-firefox-darwin.png +0 -0
  135. package/app/components/01.atoms/text-blocks/eyebrow-text/playwright/eyebrow-text.playwright.ts-snapshots/tag-span-webkit-darwin.png +0 -0
  136. package/app/components/01.atoms/text-blocks/eyebrow-text/stories/EyebrowText.stories.ts +49 -0
  137. package/app/components/01.atoms/text-blocks/eyebrow-text/tests/EyebrowText.spec.ts +196 -0
  138. package/app/components/01.atoms/text-blocks/eyebrow-text/tests/__snapshots__/EyebrowText.spec.ts.snap +17 -0
  139. package/app/components/01.atoms/text-blocks/hero-text/HeroText.vue +101 -0
  140. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts +110 -0
  141. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-chromium-darwin.png +0 -0
  142. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-firefox-darwin.png +0 -0
  143. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-display-chromium-darwin.png +0 -0
  144. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-display-firefox-darwin.png +0 -0
  145. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-display-webkit-darwin.png +0 -0
  146. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-heading-chromium-darwin.png +0 -0
  147. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-heading-firefox-darwin.png +0 -0
  148. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-heading-webkit-darwin.png +0 -0
  149. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-label-chromium-darwin.png +0 -0
  150. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-label-firefox-darwin.png +0 -0
  151. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-label-webkit-darwin.png +0 -0
  152. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-subheading-chromium-darwin.png +0 -0
  153. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-subheading-firefox-darwin.png +0 -0
  154. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-subheading-webkit-darwin.png +0 -0
  155. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-title-chromium-darwin.png +0 -0
  156. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-title-firefox-darwin.png +0 -0
  157. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-fontSize-title-webkit-darwin.png +0 -0
  158. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-horizontal-webkit-darwin.png +0 -0
  159. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-chromium-darwin.png +0 -0
  160. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-firefox-darwin.png +0 -0
  161. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-display-chromium-darwin.png +0 -0
  162. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-display-firefox-darwin.png +0 -0
  163. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-display-webkit-darwin.png +0 -0
  164. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-heading-chromium-darwin.png +0 -0
  165. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-heading-firefox-darwin.png +0 -0
  166. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-heading-webkit-darwin.png +0 -0
  167. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-label-chromium-darwin.png +0 -0
  168. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-label-firefox-darwin.png +0 -0
  169. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-label-webkit-darwin.png +0 -0
  170. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-subheading-chromium-darwin.png +0 -0
  171. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-subheading-firefox-darwin.png +0 -0
  172. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-subheading-webkit-darwin.png +0 -0
  173. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-title-chromium-darwin.png +0 -0
  174. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-title-firefox-darwin.png +0 -0
  175. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-fontSize-title-webkit-darwin.png +0 -0
  176. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/axis-vertical-webkit-darwin.png +0 -0
  177. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
  178. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
  179. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
  180. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-display-chromium-darwin.png +0 -0
  181. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-display-firefox-darwin.png +0 -0
  182. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-display-webkit-darwin.png +0 -0
  183. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-heading-chromium-darwin.png +0 -0
  184. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-heading-firefox-darwin.png +0 -0
  185. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-heading-webkit-darwin.png +0 -0
  186. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-label-chromium-darwin.png +0 -0
  187. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-label-firefox-darwin.png +0 -0
  188. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-label-webkit-darwin.png +0 -0
  189. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-subheading-chromium-darwin.png +0 -0
  190. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-subheading-firefox-darwin.png +0 -0
  191. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-subheading-webkit-darwin.png +0 -0
  192. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-title-chromium-darwin.png +0 -0
  193. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-title-firefox-darwin.png +0 -0
  194. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/fontSize-title-webkit-darwin.png +0 -0
  195. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/icon-with-chromium-darwin.png +0 -0
  196. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/icon-with-firefox-darwin.png +0 -0
  197. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/icon-with-webkit-darwin.png +0 -0
  198. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/icon-without-chromium-darwin.png +0 -0
  199. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/icon-without-firefox-darwin.png +0 -0
  200. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/icon-without-webkit-darwin.png +0 -0
  201. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h1-chromium-darwin.png +0 -0
  202. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h1-firefox-darwin.png +0 -0
  203. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h1-webkit-darwin.png +0 -0
  204. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h2-chromium-darwin.png +0 -0
  205. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h2-firefox-darwin.png +0 -0
  206. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h2-webkit-darwin.png +0 -0
  207. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h3-chromium-darwin.png +0 -0
  208. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h3-firefox-darwin.png +0 -0
  209. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h3-webkit-darwin.png +0 -0
  210. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h4-chromium-darwin.png +0 -0
  211. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h4-firefox-darwin.png +0 -0
  212. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h4-webkit-darwin.png +0 -0
  213. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h5-chromium-darwin.png +0 -0
  214. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h5-firefox-darwin.png +0 -0
  215. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h5-webkit-darwin.png +0 -0
  216. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h6-chromium-darwin.png +0 -0
  217. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h6-firefox-darwin.png +0 -0
  218. package/app/components/01.atoms/text-blocks/hero-text/playwright/hero-text.playwright.ts-snapshots/tag-h6-webkit-darwin.png +0 -0
  219. package/app/components/01.atoms/text-blocks/hero-text/stories/HeroText.stories.ts +70 -0
  220. package/app/components/01.atoms/text-blocks/hero-text/tests/HeroText.spec.ts +148 -0
  221. package/app/components/01.atoms/text-blocks/hero-text/tests/__snapshots__/HeroText.spec.ts.snap +7 -0
  222. package/app/components/02.molecules/contact-section/stories/ContactSection.stories.ts +197 -0
  223. package/app/components/02.molecules/contact-section/tests/ContactSection.spec.ts +196 -0
  224. package/app/components/02.molecules/contact-section/tests/ContactSection.vue +87 -0
  225. package/app/components/02.molecules/contact-section/tests/__snapshots__/ContactSection.spec.ts.snap +119 -0
  226. package/app/components/02.molecules/price-list/PriceList.vue +119 -0
  227. package/app/components/02.molecules/price-list/stories/PriceList.stories.ts +103 -0
  228. package/app/components/02.molecules/price-list/tests/PriceList.spec.ts +192 -0
  229. package/app/components/02.molecules/price-list/tests/__snapshots__/PriceList.spec.ts.snap +73 -0
  230. package/app/components/02.molecules/profile-section/ProfileSection.vue +154 -0
  231. package/app/components/02.molecules/profile-section/stories/ProfileSection.stories.ts +154 -0
  232. package/app/components/02.molecules/profile-section/tests/ProfileSection.spec.ts +147 -0
  233. package/app/components/02.molecules/profile-section/tests/__snapshots__/ProfileSection.spec.ts.snap +29 -0
  234. package/app/components/02.molecules/stepper-list/StepperList.vue +158 -0
  235. package/app/components/02.molecules/stepper-list/stories/StepperList.stories.ts +392 -0
  236. package/app/components/02.molecules/stepper-list/tests/StepperList.spec.ts +289 -0
  237. package/app/components/02.molecules/stepper-list/tests/__snapshots__/StepperList.spec.ts.snap +86 -0
  238. package/app/components/03.organisms/colour-finder/ColourFinder.vue +1519 -0
  239. package/app/components/03.organisms/services/services-card/ServicesCard.vue +104 -0
  240. package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +39 -0
  241. package/app/components/03.organisms/services/services-grids/ServicesSectionGrid.vue +52 -0
  242. package/app/components/03.organisms/services/services-section/ServicesSection.vue +307 -0
  243. package/app/components/03.organisms/treatment-consultant/TreatmentConsultant.vue +2221 -0
  244. package/app/components/03.organisms/treatment-consultant/stories/TreatmentConsultant.stories.ts +38 -0
  245. package/app/components/accordian/AccordianCore.vue +26 -21
  246. package/app/components/accordian/stories/AccordianCore.stories.ts +241 -0
  247. package/app/components/accordian/tests/AccordianCore.spec.ts +218 -0
  248. package/app/components/accordian/tests/__snapshots__/AccordianCore.spec.ts.snap +74 -0
  249. package/app/components/alert-mask/AlertMaskCore.vue +35 -33
  250. package/app/components/alert-mask/tests/AlertMaskCore.spec.ts +304 -0
  251. package/app/components/animated-svg-text/AnimatedSvgText.vue +2 -0
  252. package/app/components/canvas-switcher/CanvasSwitcher.vue +10 -8
  253. package/app/components/{carousel-basic → carousels}/CarouselBasic.vue +58 -56
  254. package/app/components/{carousel-basic → carousels}/CarouselFlip.vue +150 -148
  255. package/app/components/{carousel-basic → carousels}/CarouselInfinite.vue +2 -0
  256. package/app/components/carousels/stories/CarouselFlip.stories.ts +637 -0
  257. package/app/components/carousels/tests/CarouselFlip.spec.ts +556 -0
  258. package/app/components/clip-element/ClipElement.vue +2 -0
  259. package/app/components/clipped-panels/ClippedPanel.vue +2 -0
  260. package/app/components/container-glow/ContainerGlowCore.vue +119 -50
  261. package/app/components/container-glow/stories/ContainerGlowCore.stories.ts +337 -0
  262. package/app/components/content-columns/TwoColumns.vue +59 -0
  263. package/app/components/content-columns/stories/TwoColumns.stories.ts +561 -0
  264. package/app/components/content-containers/ContentContainer.vue +89 -0
  265. package/app/components/content-containers/stories/ContentContainer.stories.ts +465 -0
  266. package/app/components/content-grid/ContentGrid.vue +4 -2
  267. package/app/components/deep-expanding-menu/DeepExpandingMenu.vue +18 -16
  268. package/app/components/deep-expanding-menu/DeepExpandingMenuOld.vue +28 -26
  269. package/app/components/display-avatar/DisplayAvatar.vue +15 -13
  270. package/app/components/display-avatar/stories/DisplayAvatar.stories.ts +94 -0
  271. package/app/components/display-banner/DisplayBanner.vue +2 -0
  272. package/app/components/display-card/DisplayCard.vue +16 -14
  273. package/app/components/display-chip/DisplayChip.vue +2 -0
  274. package/app/components/display-chip/stories/DisplayChip.stories.ts +346 -0
  275. package/app/components/display-details/DisplayDetailsCore.vue +2 -0
  276. package/app/components/display-dialog/DisplayDialogCore.vue +24 -17
  277. package/app/components/display-dialog/variants/DisplayDialogConfirm.vue +2 -0
  278. package/app/components/display-dialog/variants/DisplayDialogScrollableContent.vue +2 -0
  279. package/app/components/display-grid/DisplayGridCore.vue +4 -4
  280. package/app/components/display-prompt/DisplayPromptCore.vue +20 -16
  281. package/app/components/display-prompt/variants/DisplayPromptError.vue +6 -4
  282. package/app/components/display-theme-switch/DisplayThemeSwitch.vue +182 -0
  283. package/app/components/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +154 -0
  284. package/app/components/display-toast/DisplayToast.vue +63 -61
  285. package/app/components/display-toast/molecules/DefaultToastContent.vue +21 -45
  286. package/app/components/display-toast/stories/DisplayToast.stories.ts +380 -0
  287. package/app/components/display-tooltip/DisplayTooltip.vue +14 -9
  288. package/app/components/display-tooltip/DisplayTooltipDefined.vue +2 -0
  289. package/app/components/expanding-panel/ExpandingPanel.vue +28 -41
  290. package/app/components/forms/c12/prop-validators/index.ts +48 -0
  291. package/app/components/forms/c12/utils.ts +14 -0
  292. package/app/components/forms/form-errors/InputError.vue +208 -0
  293. package/app/components/forms/form-errors/tests/InputError.spec.ts +66 -0
  294. package/app/components/forms/form-fieldset/FormFieldset.vue +75 -0
  295. package/app/components/forms/input-button/InputButtonCore.vue +219 -0
  296. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts +113 -0
  297. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-chromium-darwin.png +0 -0
  298. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-firefox-darwin.png +0 -0
  299. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-webkit-darwin.png +0 -0
  300. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-chromium-darwin.png +0 -0
  301. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-firefox-darwin.png +0 -0
  302. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-webkit-darwin.png +0 -0
  303. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-chromium-darwin.png +0 -0
  304. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-firefox-darwin.png +0 -0
  305. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-webkit-darwin.png +0 -0
  306. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-chromium-darwin.png +0 -0
  307. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-firefox-darwin.png +0 -0
  308. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-webkit-darwin.png +0 -0
  309. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-chromium-darwin.png +0 -0
  310. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-firefox-darwin.png +0 -0
  311. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-webkit-darwin.png +0 -0
  312. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
  313. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
  314. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-chromium-darwin.png +0 -0
  315. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-firefox-darwin.png +0 -0
  316. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-webkit-darwin.png +0 -0
  317. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-chromium-darwin.png +0 -0
  318. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-firefox-darwin.png +0 -0
  319. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-webkit-darwin.png +0 -0
  320. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-chromium-darwin.png +0 -0
  321. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-firefox-darwin.png +0 -0
  322. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-webkit-darwin.png +0 -0
  323. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-chromium-darwin.png +0 -0
  324. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-firefox-darwin.png +0 -0
  325. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-webkit-darwin.png +0 -0
  326. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-chromium-darwin.png +0 -0
  327. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-firefox-darwin.png +0 -0
  328. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-webkit-darwin.png +0 -0
  329. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-chromium-darwin.png +0 -0
  330. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-firefox-darwin.png +0 -0
  331. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-webkit-darwin.png +0 -0
  332. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-chromium-darwin.png +0 -0
  333. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-firefox-darwin.png +0 -0
  334. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-webkit-darwin.png +0 -0
  335. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
  336. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-chromium-darwin.png +0 -0
  337. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-firefox-darwin.png +0 -0
  338. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-webkit-darwin.png +0 -0
  339. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-chromium-darwin.png +0 -0
  340. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-firefox-darwin.png +0 -0
  341. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-webkit-darwin.png +0 -0
  342. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-chromium-darwin.png +0 -0
  343. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-firefox-darwin.png +0 -0
  344. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-webkit-darwin.png +0 -0
  345. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-chromium-darwin.png +0 -0
  346. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-firefox-darwin.png +0 -0
  347. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-webkit-darwin.png +0 -0
  348. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-chromium-darwin.png +0 -0
  349. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-firefox-darwin.png +0 -0
  350. package/app/components/forms/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-webkit-darwin.png +0 -0
  351. package/app/components/forms/input-button/stories/InputButtonCore.stories.ts +304 -0
  352. package/app/components/forms/input-button/tests/InputButtonCore.spec.ts +269 -0
  353. package/app/components/forms/input-button/tests/__snapshots__/InputButtonCore.spec.ts.snap +72 -0
  354. package/app/components/forms/input-checkbox/MultipleCheckboxes.vue +181 -0
  355. package/app/components/forms/input-checkbox/SingleCheckbox.vue +144 -0
  356. package/app/components/forms/input-checkbox/tests/MultipleCheckboxes.spec.ts +101 -0
  357. package/app/components/forms/input-checkbox/tests/data/tags.json +67 -0
  358. package/app/components/forms/input-checkbox-radio/InputCheckboxRadioButton.vue +174 -0
  359. package/app/components/forms/input-checkbox-radio/InputCheckboxRadioCore.vue +199 -0
  360. package/app/components/forms/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +104 -0
  361. package/app/components/forms/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +320 -0
  362. package/app/components/forms/input-description/InputDescription.vue +55 -0
  363. package/app/components/forms/input-description/tests/InputDescription.spec.ts +429 -0
  364. package/app/components/forms/input-label/InputLabel.vue +66 -0
  365. package/app/components/forms/input-label/tests/InputLabel.spec.ts +431 -0
  366. package/app/components/forms/input-number/InputNumberCore.vue +163 -0
  367. package/app/components/forms/input-number/variants/InputNumberDefault.vue +150 -0
  368. package/app/components/forms/input-radio/MultipleRadiobuttons.vue +180 -0
  369. package/app/components/forms/input-radio/tests/MultipleRadioButtons.spec.ts +90 -0
  370. package/app/components/forms/input-radio/tests/data/tags.json +67 -0
  371. package/app/components/forms/input-range/InputRangeCore.vue +233 -0
  372. package/app/components/forms/input-range/variants/InputRangeDefault.vue +166 -0
  373. package/app/components/forms/input-range-fancy/InputRangeFancyCore.vue +426 -0
  374. package/app/components/forms/input-range-fancy/InputRangeFancyWithLabel.vue +94 -0
  375. package/app/components/forms/input-select/InputSelectCore.vue +171 -0
  376. package/app/components/forms/input-select/variants/InputSelectWithLabel.vue +121 -0
  377. package/app/components/forms/input-text/InputTextCore.vue +222 -0
  378. package/app/components/forms/input-text/stories/InputPasswordWithLabel.stories.ts +339 -0
  379. package/app/components/forms/input-text/stories/InputTextAsNumberWithLabel.stories.ts +461 -0
  380. package/app/components/forms/input-text/stories/InputTextCore.stories.ts +241 -0
  381. package/app/components/forms/input-text/stories/InputTextWithLabel.stories.ts +293 -0
  382. package/app/components/forms/input-text/variants/InputPasswordWithLabel.vue +86 -0
  383. package/app/components/forms/input-text/variants/InputTextAsNumberWithLabel.vue +203 -0
  384. package/app/components/forms/input-text/variants/InputTextWithLabel.vue +149 -0
  385. package/app/components/forms/input-textarea/InputTextareaCore.vue +151 -0
  386. package/app/components/forms/input-textarea/stories/InputTextareaCore.stories.ts +247 -0
  387. package/app/components/forms/input-textarea/stories/InputTextareaWithLabel.stories.ts +452 -0
  388. package/app/components/forms/input-textarea/variants/InputTextareaWithLabel.vue +150 -0
  389. package/app/components/forms/pending-effect/PendingEffect.vue +101 -0
  390. package/app/components/forms/toggle-switch/ToggleSwitchCore.vue +221 -0
  391. package/app/components/forms/toggle-switch/stories/ToggleSwitchCore.stories.ts +236 -0
  392. package/app/components/forms/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +253 -0
  393. package/app/components/forms/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +280 -0
  394. package/app/components/forms/toggle-switch/variants/ToggleSwitchWithLabel.vue +101 -0
  395. package/app/components/forms/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +84 -0
  396. package/app/components/forms/triple-toggle-switch/TripleToggleSwitchCore.vue +290 -0
  397. package/app/components/forms/ui/FormField.vue +81 -0
  398. package/app/components/forms/ui/FormWrapper.vue +37 -0
  399. package/app/components/glowing-border/GlowingBorder.vue +2 -0
  400. package/app/components/glowing-border/stories/GlowingBorder.stories.ts +141 -0
  401. package/app/components/image-galleries/SliderGallery.vue +100 -100
  402. package/app/components/layout-grids/LayoutGridA.vue +2 -0
  403. package/app/components/layout-grids/LayoutGridB.vue +8 -6
  404. package/app/components/layout-grids/stories/LayoutGridA.stories.ts +402 -0
  405. package/app/components/layout-grids/stories/LayoutGridB.stories.ts +420 -0
  406. package/app/components/layout-grids/tests/LayoutGridA.spec.ts +352 -0
  407. package/app/components/layout-grids/tests/LayoutGridB.spec.ts +490 -0
  408. package/app/components/layout-row/LayoutRow.vue +60 -54
  409. package/app/components/layout-row/stories/LayoutRow.stories.ts +528 -0
  410. package/app/components/magnetic-navigation/MagneticNavigation.vue +2 -0
  411. package/app/components/marquee-scroller/MarqueeScroller.vue +35 -33
  412. package/app/components/masonry-grid/MasonryGrid.vue +8 -6
  413. package/app/components/masonry-grid-ordered/MasonryGridOrdered.vue +2 -0
  414. package/app/components/masonry-grid-ordered/MasonryGridOrderedGridExperiment.vue +82 -87
  415. package/app/components/masonry-grid-ordered/stories/MasonryGridOrdered.stories.ts +354 -0
  416. package/app/components/masonry-grid-sorted/MasonryGridSorted.vue +2 -0
  417. package/app/components/parallax/SectionParallax.vue +10 -8
  418. package/app/components/pop-over/PopOver.vue +2 -0
  419. package/app/components/qr-code/CaptureQrCode.vue +2 -0
  420. package/app/components/qr-code/DecodeQrCode.vue +2 -0
  421. package/app/components/qr-code/DisplayQrCode.vue +7 -5
  422. package/app/components/qr-code/stories/QrCode.stories.ts +933 -0
  423. package/app/components/responsive-header/NavigationItems.vue +34 -23
  424. package/app/components/responsive-header/ResponsiveHeader.vue +163 -157
  425. package/app/components/rotating-carousel/RotatingCarouselImage.vue +2 -0
  426. package/app/components/skip-links/SkipLinks.vue +2 -0
  427. package/app/components/tabs/TabsCore.vue +38 -30
  428. package/app/components/test-storybook/TestStorybook.vue +49 -0
  429. package/app/components/test-storybook/stories/TestStorybook.stories.ts +28 -0
  430. package/app/components/ui-block-decorated/UiBlockDecorated.vue +2 -0
  431. package/app/components/view-timeline/WipeAwayVertical.vue +2 -0
  432. package/app/composables/useApiRequest.ts +25 -0
  433. package/app/composables/useAriaDescribedById.ts +19 -0
  434. package/app/composables/useColourScheme.ts +18 -0
  435. package/app/composables/useErrorMessages.ts +62 -0
  436. package/app/composables/useFormControl.ts +264 -0
  437. package/app/composables/useMaxChildWidth.ts +30 -0
  438. package/app/composables/useTabs.ts +207 -117
  439. package/app/composables/useZodValidation.ts +147 -0
  440. package/app/layouts/default.vue +605 -0
  441. package/app/pages/forms/examples/buttons/index.vue +285 -0
  442. package/app/pages/forms/examples/material/checkbox-radio-panels.vue +244 -0
  443. package/app/pages/forms/examples/material/cssbattle.vue +60 -0
  444. package/app/pages/forms/examples/material/text-fields.vue +913 -0
  445. package/app/pages/index.vue +122 -0
  446. package/app/pages/typography/hero-text.vue +97 -0
  447. package/app/pages/typography/index.vue +39 -0
  448. package/app/pages/typography/page-body.vue +171 -0
  449. package/app/pages/typography/page-heading.vue +76 -0
  450. package/app/pages/typography/page-link.vue +103 -0
  451. package/app/pages/ui/accordian.vue +211 -0
  452. package/app/pages/ui/animated-svg-text.vue +85 -0
  453. package/app/pages/ui/block-decorators.vue +142 -0
  454. package/app/pages/ui/carousel-basic.vue +292 -0
  455. package/app/pages/ui/carousel-flip.vue +244 -0
  456. package/app/pages/ui/carousel-infinite.vue +260 -0
  457. package/app/pages/ui/clipped-panels.vue +101 -0
  458. package/app/pages/ui/contact-section.vue +323 -0
  459. package/app/pages/ui/container-glow.vue +107 -0
  460. package/app/pages/ui/content-container.vue +112 -0
  461. package/app/pages/ui/display-avatar.vue +253 -0
  462. package/app/pages/ui/display-banner.vue +78 -0
  463. package/app/pages/ui/display-card.vue +82 -0
  464. package/app/pages/ui/display-chip.vue +225 -0
  465. package/app/pages/ui/display-details.vue +175 -0
  466. package/app/pages/ui/display-dialog.vue +231 -0
  467. package/app/pages/ui/display-prompt.vue +81 -0
  468. package/app/pages/ui/display-toast.vue +332 -0
  469. package/app/pages/ui/expanding-panel.vue +193 -0
  470. package/app/pages/ui/glowing-border.vue +111 -0
  471. package/app/pages/ui/layout-grid-a.vue +149 -0
  472. package/app/pages/ui/layout-grid-b.vue +132 -0
  473. package/app/pages/ui/layout-row.vue +139 -0
  474. package/app/pages/ui/magnetic-navigation.vue +50 -0
  475. package/app/pages/ui/marquee-scroller.vue +99 -0
  476. package/app/pages/ui/mask-element.vue +82 -0
  477. package/app/pages/ui/masonry-columns.vue +55 -0
  478. package/app/pages/ui/masonry-grid-ordered-experiment.vue +79 -0
  479. package/app/pages/ui/masonry-grid-ordered.vue +56 -0
  480. package/app/pages/ui/masonry-grid-sorted.vue +55 -0
  481. package/app/pages/ui/masonry-grid.vue +55 -0
  482. package/app/pages/ui/price-list.vue +65 -0
  483. package/app/pages/ui/profile-section.vue +96 -0
  484. package/app/pages/ui/qr-code/[componentName].vue +218 -0
  485. package/app/pages/ui/rotating-carousel.vue +154 -0
  486. package/app/pages/ui/section-parallax.vue +54 -0
  487. package/app/pages/ui/services/colour-finder.vue +43 -0
  488. package/app/pages/ui/services/services-cards.vue +42 -0
  489. package/app/pages/ui/services/services-section/[slug].vue +59 -0
  490. package/app/pages/ui/services/services-sections-compact.vue +64 -0
  491. package/app/pages/ui/services/treatment-consultant.vue +39 -0
  492. package/app/pages/ui/settings.vue +80 -0
  493. package/app/pages/ui/simple-grid.vue +66 -0
  494. package/app/pages/ui/slider-gallery.vue +261 -0
  495. package/app/pages/ui/tabs-y.vue +108 -0
  496. package/app/pages/ui/tabs.vue +192 -0
  497. package/app/pages/ui/tooltips.vue +104 -0
  498. package/app/pages/ui/wipe-away-vertical.vue +129 -0
  499. package/app/plugins/css-anchor-positioning-polyfill.client.ts +5 -0
  500. package/app/stores/useServicesStore.ts +37 -0
  501. package/app/stores/useSettingsStore.ts +35 -0
  502. package/app/types/components/hero-text.ts +4 -0
  503. package/app/types/components/index.ts +1 -0
  504. package/app/types/forms/types.forms.d.ts +293 -0
  505. package/app/types/forms/types.zodFormControl.d.ts +29 -0
  506. package/app/types/types.posts.ts +21 -0
  507. package/app/types/types.quotes.ts +12 -0
  508. package/app/types/types.services.ts +20 -0
  509. package/app/utils/colour-scheme-init.ts +17 -0
  510. package/nuxt.config.ts +86 -6
  511. package/package.json +51 -14
  512. package/types/components/css-anchor-polyfill.d.ts +1 -0
@@ -0,0 +1,1519 @@
1
+ <template>
2
+ <div class="colour-finder">
3
+ <div class="colour-finder__container">
4
+ <div class="colour-finder__content">
5
+ <!-- Header -->
6
+ <div v-motion :initial="{ opacity: 0, y: 20 }" :enter="{ opacity: 1, y: 0 }" class="colour-finder__header">
7
+ <EyebrowText text-content="Interactive Tool" font-size="large" />
8
+ <p class="colour-finder__label">Interactive Tool</p>
9
+ <h1 class="colour-finder__title">
10
+ Find Your
11
+ <span class="colour-finder__title-highlight">Perfect Colour</span>
12
+ </h1>
13
+ <p class="colour-finder__subtitle">
14
+ Select your hair type, current colour, and dream shade to get personalised recommendations.
15
+ </p>
16
+ </div>
17
+
18
+ <!-- Progress Steps -->
19
+ <div class="colour-finder__progress">
20
+ <template v-for="(s, i) in STEPS" :key="s">
21
+ <div class="colour-finder__progress-step">
22
+ <button
23
+ :class="[
24
+ 'colour-finder__progress-button',
25
+ {
26
+ 'colour-finder__progress-button--active': i === step,
27
+ 'colour-finder__progress-button--completed': i < step,
28
+ 'colour-finder__progress-button--inactive': i > step,
29
+ },
30
+ ]"
31
+ @click="
32
+ () => {
33
+ if (i < step) step = i;
34
+ }
35
+ "
36
+ >
37
+ <span
38
+ :class="[
39
+ 'colour-finder__progress-indicator',
40
+ {
41
+ 'colour-finder__progress-indicator--completed': i < step,
42
+ 'colour-finder__progress-indicator--active': i === step,
43
+ 'colour-finder__progress-indicator--inactive': i > step,
44
+ },
45
+ ]"
46
+ >
47
+ {{ i < step ? "✓" : i + 1 }}
48
+ </span>
49
+ <span class="colour-finder__progress-label">{{ s }}</span>
50
+ </button>
51
+ <div
52
+ v-if="i < STEPS.length - 1"
53
+ :class="[
54
+ 'colour-finder__progress-connector',
55
+ { 'colour-finder__progress-connector--completed': i < step },
56
+ ]"
57
+ ></div>
58
+ </div>
59
+ </template>
60
+ </div>
61
+
62
+ <!-- Step Content -->
63
+ <Transition name="slide" mode="out-in">
64
+ <!-- Step 0: Hair Type -->
65
+ <div v-if="step === 0" key="step0" class="colour-finder__step">
66
+ <h2 class="colour-finder__step-title">What's your hair type?</h2>
67
+ <div class="colour-finder__options colour-finder__options--hair-type">
68
+ <button
69
+ v-for="ht in hairTypes"
70
+ :key="ht.id"
71
+ :class="[
72
+ 'colour-finder__option',
73
+ {
74
+ 'colour-finder__option--selected': hairType === ht.id,
75
+ },
76
+ ]"
77
+ @click="hairType = ht.id"
78
+ >
79
+ <div class="colour-finder__option-pattern">
80
+ {{ ht.pattern }}
81
+ </div>
82
+ <span class="colour-finder__option-label">
83
+ {{ ht.label }}
84
+ </span>
85
+ </button>
86
+ </div>
87
+ </div>
88
+
89
+ <!-- Step 1: Natural Colour -->
90
+ <div v-else-if="step === 1" key="step1" class="colour-finder__step">
91
+ <h2 class="colour-finder__step-title">What's your natural hair colour?</h2>
92
+ <div class="colour-finder__options colour-finder__options--natural-colour">
93
+ <button
94
+ v-for="nc in naturalColours"
95
+ :key="nc.id"
96
+ :class="[
97
+ 'colour-finder__option colour-finder__option--colour',
98
+ {
99
+ 'colour-finder__option--selected': naturalColour === nc.id,
100
+ },
101
+ ]"
102
+ @click="naturalColour = nc.id"
103
+ >
104
+ <div class="colour-finder__option-swatch" :style="{ backgroundColor: nc.colour }">
105
+ <NuxtImg
106
+ v-if="nc.image"
107
+ :src="nc.image"
108
+ alt=""
109
+ width="128"
110
+ height="128"
111
+ class="colour-finder__option-image"
112
+ :class="{ 'colour-finder__option-image--dark': nc.textDark }"
113
+ />
114
+ </div>
115
+ <span
116
+ :class="[
117
+ 'colour-finder__option-label',
118
+ {
119
+ 'colour-finder__option-label--selected': naturalColour === nc.id,
120
+ },
121
+ ]"
122
+ >
123
+ {{ nc.label }}
124
+ </span>
125
+ </button>
126
+ </div>
127
+ </div>
128
+
129
+ <!-- Step 2: Desired Colour -->
130
+ <div v-else-if="step === 2" key="step2" class="colour-finder__step">
131
+ <h2 class="colour-finder__step-title">What colour are you dreaming of?</h2>
132
+ <div class="colour-finder__options colour-finder__options--desired-colour">
133
+ <button
134
+ v-for="dc in desiredColours"
135
+ :key="dc.id"
136
+ :class="[
137
+ 'colour-finder__option colour-finder__option--colour',
138
+ {
139
+ 'colour-finder__option--selected': desiredColour === dc.id,
140
+ },
141
+ ]"
142
+ @click="desiredColour = dc.id"
143
+ >
144
+ <div class="colour-finder__option-swatch" :style="{ background: dc.colour }">
145
+ <NuxtImg
146
+ v-if="dc.image"
147
+ :src="dc.image"
148
+ alt=""
149
+ width="128"
150
+ height="128"
151
+ class="colour-finder__option-image"
152
+ :class="{ 'colour-finder__option-image--dark': dc.textDark }"
153
+ />
154
+ </div>
155
+ <span
156
+ :class="[
157
+ 'colour-finder__option-label',
158
+ {
159
+ 'colour-finder__option-label--selected': desiredColour === dc.id,
160
+ },
161
+ ]"
162
+ >
163
+ {{ dc.label }}
164
+ </span>
165
+ </button>
166
+ </div>
167
+ </div>
168
+
169
+ <!-- Step 3: Results -->
170
+ <div v-else-if="step === 3 && recommendation" key="step3" class="colour-finder__results">
171
+ <div class="colour-finder__results-header">
172
+ <Icon name="ucide:sparkles" class="colour-finder__results-icon" />
173
+ <h2 class="colour-finder__results-title">Your Personalised Recommendation</h2>
174
+ </div>
175
+
176
+ <!-- Suitability Badge -->
177
+ <div :class="['colour-finder__suitability', suitabilityConfig[recommendation.suitability].bg]">
178
+ <Icon
179
+ :name="suitabilityConfig[recommendation.suitability].icon"
180
+ class="colour-finder__suitability-icon"
181
+ />
182
+ <div class="colour-finder__suitability-content">
183
+ <p :class="['colour-finder__suitability-label', suitabilityConfig[recommendation.suitability].colour]">
184
+ {{ suitabilityConfig[recommendation.suitability].label }}
185
+ </p>
186
+ <p class="colour-finder__suitability-notes">
187
+ {{ recommendation.notes }}
188
+ </p>
189
+ </div>
190
+ </div>
191
+
192
+ <!-- Details Card -->
193
+ <div class="colour-finder__details-card">
194
+ <div class="colour-finder__details-header">
195
+ <span class="colour-finder__details-method-label">Recommended Method</span>
196
+ <span class="colour-finder__details-method-badge">
197
+ {{ recommendation.method }}
198
+ </span>
199
+ </div>
200
+ <div class="colour-finder__details-list">
201
+ <div
202
+ v-for="(detail, i) in recommendation.details"
203
+ :key="i"
204
+ v-motion
205
+ :initial="{ opacity: 0, x: -20 }"
206
+ :enter="{ opacity: 1, x: 0, transition: { delay: i * 100 } }"
207
+ class="colour-finder__details-item"
208
+ >
209
+ <div class="colour-finder__details-bullet"></div>
210
+ <p class="colour-finder__details-text">
211
+ {{ detail }}
212
+ </p>
213
+ </div>
214
+ </div>
215
+ </div>
216
+
217
+ <!-- Selections Summary -->
218
+ <div class="colour-finder__summary">
219
+ <div
220
+ v-for="item in [
221
+ {
222
+ label: 'Hair Type',
223
+ value: hairTypes.find((h) => h.id === hairType)?.label,
224
+ swatch: undefined,
225
+ image: undefined,
226
+ textDark: false,
227
+ },
228
+ {
229
+ label: 'Natural Colour',
230
+ value: naturalColours.find((n) => n.id === naturalColour)?.label,
231
+ swatch: naturalColours.find((n) => n.id === naturalColour)?.colour,
232
+ image: naturalColours.find((n) => n.id === naturalColour)?.image,
233
+ textDark: naturalColours.find((n) => n.id === naturalColour)?.textDark,
234
+ },
235
+ {
236
+ label: 'Dream Colour',
237
+ value: desiredColours.find((d) => d.id === desiredColour)?.label,
238
+ swatch: desiredColours.find((d) => d.id === desiredColour)?.colour,
239
+ image: desiredColours.find((d) => d.id === desiredColour)?.image,
240
+ textDark: desiredColours.find((d) => d.id === desiredColour)?.textDark,
241
+ },
242
+ ]"
243
+ :key="item.label"
244
+ class="colour-finder__summary-item"
245
+ >
246
+ <p class="colour-finder__summary-label">
247
+ {{ item.label }}
248
+ </p>
249
+ <div v-if="item.swatch" class="colour-finder__summary-swatch" :style="{ background: item.swatch }">
250
+ <NuxtImg
251
+ v-if="item.image"
252
+ :src="item.image"
253
+ alt=""
254
+ width="96"
255
+ height="96"
256
+ class="colour-finder__summary-image"
257
+ :class="{ 'colour-finder__summary-image--dark': item.textDark }"
258
+ />
259
+ </div>
260
+ <p class="colour-finder__summary-value">{{ item.value }}</p>
261
+ </div>
262
+ </div>
263
+
264
+ <!-- CTA -->
265
+ <div class="colour-finder__cta">
266
+ <p class="colour-finder__cta-disclaimer">
267
+ This is a guide — every head of hair is unique. Book a consultation for tailored advice.
268
+ </p>
269
+ <div class="colour-finder__cta-buttons">
270
+ <a href="/#contact" class="colour-finder__button colour-finder__button--primary">Book Consultation</a>
271
+ <button class="colour-finder__button colour-finder__button--secondary" @click="reset">Try Again</button>
272
+ </div>
273
+ </div>
274
+ </div>
275
+ </Transition>
276
+
277
+ <!-- Navigation Buttons -->
278
+ <div v-if="step < 3" class="colour-finder__navigation">
279
+ <button v-if="step > 0" class="colour-finder__nav-button colour-finder__nav-button--back" @click="back">
280
+ <Icon name="lucide:arrow-left" class="colour-finder__nav-icon" />
281
+ Back
282
+ </button>
283
+ <button
284
+ :disabled="!canProceed"
285
+ :class="[
286
+ 'colour-finder__nav-button colour-finder__nav-button--next',
287
+ {
288
+ 'colour-finder__nav-button--disabled': !canProceed,
289
+ },
290
+ ]"
291
+ @click="next"
292
+ >
293
+ Next
294
+ <Icon name="lucide:arrow-right" class="colour-finder__nav-icon" />
295
+ </button>
296
+ </div>
297
+ </div>
298
+ </div>
299
+ </div>
300
+ </template>
301
+
302
+ <script setup lang="ts">
303
+ // ─── Types ────────────────────────────────────────────────────────────────────
304
+ type HairType = "straight" | "wavy" | "curly" | "coily";
305
+ type NaturalColour = "light-blonde" | "dark-blonde" | "light-brown" | "dark-brown" | "red" | "black" | "grey-white";
306
+ type DesiredColour = "blonde" | "brown" | "red" | "black" | "vivid" | "balayage";
307
+ type Suitability = "great" | "possible" | "difficult" | "not-recommended";
308
+
309
+ interface Recommendation {
310
+ suitability: Suitability;
311
+ method: string;
312
+ notes: string;
313
+ details: string[];
314
+ }
315
+
316
+ // ─── Static Data ──────────────────────────────────────────────────────────────
317
+ const hairTypes: { id: HairType; label: string; pattern: string }[] = [
318
+ { id: "straight", label: "Straight", pattern: "|||" },
319
+ { id: "wavy", label: "Wavy", pattern: "∿∿∿" },
320
+ { id: "curly", label: "Curly", pattern: "⌇⌇⌇" },
321
+ { id: "coily", label: "Coily", pattern: "⌀⌀⌀" },
322
+ ];
323
+
324
+ const naturalColours: { id: NaturalColour; label: string; colour: string; image: string; textDark?: boolean }[] = [
325
+ {
326
+ id: "light-blonde",
327
+ label: "Light Blonde",
328
+ colour: "#F5DEB3",
329
+ image: "/images/colour-finder/swatch-light-blonde.jpeg",
330
+ textDark: true,
331
+ },
332
+ {
333
+ id: "dark-blonde",
334
+ label: "Dark Blonde",
335
+ colour: "#C8A951",
336
+ image: "/images/colour-finder/swatch-dark-blonde.jpeg",
337
+ textDark: true,
338
+ },
339
+ {
340
+ id: "light-brown",
341
+ label: "Light Brown",
342
+ colour: "#8B6914",
343
+ image: "/images/colour-finder/swatch-light-brown.jpeg",
344
+ },
345
+ { id: "dark-brown", label: "Dark Brown", colour: "#4A2912", image: "/images/colour-finder/swatch-dark-brown.jpeg" },
346
+ { id: "red", label: "Natural Red", colour: "#A0522D", image: "/images/colour-finder/swatch-red.jpeg" },
347
+ { id: "black", label: "Black", colour: "#1a1a1a", image: "/images/colour-finder/swatch-black.jpeg" },
348
+ {
349
+ id: "grey-white",
350
+ label: "Grey / White",
351
+ colour: "#C0C0C0",
352
+ image: "/images/colour-finder/swatch-grey-white.jpeg",
353
+ textDark: true,
354
+ },
355
+ ];
356
+
357
+ const desiredColours: { id: DesiredColour; label: string; colour: string; image?: string; textDark?: boolean }[] = [
358
+ {
359
+ id: "blonde",
360
+ label: "Blonde",
361
+ colour: "#F5DEB3",
362
+ image: "/images/colour-finder/swatch-dream-blonde.jpeg",
363
+ textDark: true,
364
+ },
365
+ { id: "brown", label: "Brown", colour: "#6B3A2A", image: "/images/colour-finder/swatch-dream-brown.jpeg" },
366
+ { id: "red", label: "Red", colour: "#B22222", image: "/images/colour-finder/swatch-dream-red.jpeg" },
367
+ { id: "black", label: "Black", colour: "#1a1a1a", image: "/images/colour-finder/swatch-dream-black.jpeg" },
368
+ {
369
+ id: "vivid",
370
+ label: "Vivid / Fashion",
371
+ colour: "linear-gradient(135deg, #FF69B4, #8A2BE2, #00CED1)",
372
+ image: "/images/colour-finder/swatch-dream-vivid.jpeg",
373
+ },
374
+ {
375
+ id: "balayage",
376
+ label: "Balayage",
377
+ colour: "linear-gradient(135deg, #8B6914, #F5DEB3)",
378
+ image: "/images/colour-finder/swatch-dream-balayage.jpeg",
379
+ },
380
+ ];
381
+
382
+ const STEPS = ["Hair Type", "Your Colour", "Dream Colour", "Results"];
383
+
384
+ // ─── Recommendation Matrix ────────────────────────────────────────────────────
385
+ function getRecommendation(natural: NaturalColour, desired: DesiredColour, hairType: HairType): Recommendation {
386
+ const matrix: Record<NaturalColour, Record<DesiredColour, Recommendation>> = {
387
+ "light-blonde": {
388
+ blonde: {
389
+ suitability: "great",
390
+ method: "Semi-Permanent",
391
+ notes: "Your light base is perfect for any blonde shade.",
392
+ details: [
393
+ "Ash, warm, or platinum tones all work beautifully",
394
+ "Semi-permanent colour recommended to maintain condition",
395
+ "Low maintenance — your natural base does the heavy lifting",
396
+ ],
397
+ },
398
+ brown: {
399
+ suitability: "great",
400
+ method: "Semi-Permanent",
401
+ notes: "Light to medium browns will take beautifully.",
402
+ details: [
403
+ "Great for adding depth and richness",
404
+ "Semi-permanent gives a natural fade",
405
+ "Warm chocolate and caramel tones look stunning",
406
+ ],
407
+ },
408
+ red: {
409
+ suitability: "possible",
410
+ method: "Semi-Permanent",
411
+ notes: "Strawberry and copper tones work, but fade quickly on light hair.",
412
+ details: [
413
+ "Strawberry blonde is the most natural-looking option",
414
+ "Copper tones are achievable but fade fast",
415
+ "Regular top-ups needed to maintain vibrancy",
416
+ ],
417
+ },
418
+ black: {
419
+ suitability: "not-recommended",
420
+ method: "N/A",
421
+ notes: "Too harsh a contrast — can look unnatural and is very hard to reverse.",
422
+ details: [
423
+ "Extreme colour change can damage light hair",
424
+ "Very difficult to go back to blonde afterwards",
425
+ "Consider a dark brown instead for depth",
426
+ ],
427
+ },
428
+ vivid: {
429
+ suitability: "possible",
430
+ method: "Semi-Permanent",
431
+ notes: "Pastel vivid shades work well on your light base, but fade fast.",
432
+ details: [
433
+ "Pastels like lilac, rose, and mint are ideal",
434
+ "No bleaching needed — a rare advantage",
435
+ "Colours fade within 4-8 washes typically",
436
+ ],
437
+ },
438
+ balayage: {
439
+ suitability: "great",
440
+ method: "Freehand",
441
+ notes: "Beautiful sun-kissed dimension with minimal effort.",
442
+ details: [
443
+ "Platinum or warm honey tones work perfectly",
444
+ "Natural-looking grow-out",
445
+ "Low maintenance colour option",
446
+ ],
447
+ },
448
+ },
449
+ "dark-blonde": {
450
+ blonde: {
451
+ suitability: "great",
452
+ method: "Semi or Permanent",
453
+ notes: "Golden and honey shades are your perfect match.",
454
+ details: [
455
+ "Warm golden tones complement your base beautifully",
456
+ "Honey blonde gives a natural, sunkissed finish",
457
+ "Can be achieved with gentle lightening",
458
+ ],
459
+ },
460
+ brown: {
461
+ suitability: "great",
462
+ method: "Semi or Permanent",
463
+ notes: "All brown shades work wonderfully on your base.",
464
+ details: [
465
+ "Versatile base for any brown shade",
466
+ "Rich chocolate and chestnut tones are gorgeous",
467
+ "Natural-looking results every time",
468
+ ],
469
+ },
470
+ red: {
471
+ suitability: "great",
472
+ method: "Semi or Permanent",
473
+ notes: "Strawberry and copper tones look stunning.",
474
+ details: [
475
+ "Warm copper and strawberry blonde are ideal",
476
+ "Rich auburn is easily achievable",
477
+ "Beautiful warm results on your base",
478
+ ],
479
+ },
480
+ black: {
481
+ suitability: "possible",
482
+ method: "Permanent",
483
+ notes: "Blue-black can look harsh. Consider a deep espresso instead.",
484
+ details: [
485
+ "Jet black may look too flat",
486
+ "Deep chocolate or espresso is more flattering",
487
+ "Permanent colour needed for lasting results",
488
+ ],
489
+ },
490
+ vivid: {
491
+ suitability: "great",
492
+ method: "Semi-Permanent",
493
+ notes: "Pink, teal, and other vivid shades work brilliantly.",
494
+ details: [
495
+ "May need slight lightening for true vibrancy",
496
+ "Pink and teal are particularly stunning",
497
+ "Great base for fashion colours",
498
+ ],
499
+ },
500
+ balayage: {
501
+ suitability: "great",
502
+ method: "Freehand",
503
+ notes: "The ideal base for beautiful balayage dimension.",
504
+ details: [
505
+ "Honey and caramel tones create gorgeous contrast",
506
+ "Natural-looking grow-out and low maintenance",
507
+ "Works beautifully with warm or cool tones",
508
+ ],
509
+ },
510
+ },
511
+ "light-brown": {
512
+ blonde: {
513
+ suitability: "possible",
514
+ method: "Permanent + Lightening",
515
+ notes: "Needs careful lightening. Risk of brassiness without a toner.",
516
+ details: [
517
+ "Professional lightening recommended",
518
+ "Toner essential to counteract brassiness",
519
+ "Multiple sessions may be needed for platinum",
520
+ ],
521
+ },
522
+ brown: {
523
+ suitability: "great",
524
+ method: "Semi or Permanent",
525
+ notes: "All brown shades are your sweet spot.",
526
+ details: [
527
+ "Enhance your natural colour with deeper tones",
528
+ "Rich mahogany and chestnut are stunning",
529
+ "Easy to maintain and refresh",
530
+ ],
531
+ },
532
+ red: {
533
+ suitability: "great",
534
+ method: "Semi or Permanent",
535
+ notes: "Auburn and mahogany shades look incredible.",
536
+ details: [
537
+ "Your base is ideal for rich red tones",
538
+ "Auburn and copper create beautiful warmth",
539
+ "Mahogany adds luxury and depth",
540
+ ],
541
+ },
542
+ black: {
543
+ suitability: "possible",
544
+ method: "Permanent",
545
+ notes: "Can result in flat tones. Consider depth-adding techniques.",
546
+ details: [
547
+ "Risk of looking too uniform and flat",
548
+ "Consider adding dimension with lowlights",
549
+ "Very dark brown may be more flattering",
550
+ ],
551
+ },
552
+ vivid: {
553
+ suitability: "great",
554
+ method: "Requires Lightening",
555
+ notes: "Teal and purple work well but need pre-lightening.",
556
+ details: [
557
+ "Pre-lightening needed for true vibrancy",
558
+ "Teal and purple are particularly beautiful",
559
+ "Semi-permanent for easy experimentation",
560
+ ],
561
+ },
562
+ balayage: {
563
+ suitability: "great",
564
+ method: "Freehand",
565
+ notes: "Perfect base for dimensional balayage.",
566
+ details: [
567
+ "Caramel and honey ends create gorgeous contrast",
568
+ "Natural root area means low maintenance",
569
+ "Sun-kissed finish looks effortlessly beautiful",
570
+ ],
571
+ },
572
+ },
573
+ "dark-brown": {
574
+ blonde: {
575
+ suitability: "not-recommended",
576
+ method: "Bleach Required",
577
+ notes: "Requires heavy bleaching which can damage hair significantly.",
578
+ details: [
579
+ "Multiple bleaching sessions needed",
580
+ "High risk of damage and breakage",
581
+ "Consider highlights instead for blonde effect",
582
+ ],
583
+ },
584
+ brown: {
585
+ suitability: "great",
586
+ method: "Semi or Permanent",
587
+ notes: "Enhance your natural shade — all but ash tones work.",
588
+ details: [
589
+ "Add warmth with chestnut or chocolate",
590
+ "Golden brown adds beautiful dimension",
591
+ "Easy to enrich and deepen your colour",
592
+ ],
593
+ },
594
+ red: {
595
+ suitability: "great",
596
+ method: "Permanent",
597
+ notes: "Mahogany and red-violet are stunning on your dark base.",
598
+ details: [
599
+ "Mahogany and burgundy are effortlessly achievable",
600
+ "Red-violet adds luxurious dimension",
601
+ "Rich, head-turning colour with minimal lift",
602
+ ],
603
+ },
604
+ black: {
605
+ suitability: "great",
606
+ method: "Semi-Permanent",
607
+ notes: "Enhancing black gloss works beautifully.",
608
+ details: [
609
+ "Blue-black gloss adds gorgeous shine",
610
+ "Minimal processing needed",
611
+ "Semi-permanent for easy maintenance",
612
+ ],
613
+ },
614
+ vivid: {
615
+ suitability: "difficult",
616
+ method: "Bleach Required",
617
+ notes: "Vivid colours need significant lightening first.",
618
+ details: [
619
+ "Heavy bleaching required — multiple sessions",
620
+ "High maintenance with frequent touch-ups",
621
+ "Consider peek-a-boo panels for less damage",
622
+ ],
623
+ },
624
+ balayage: {
625
+ suitability: "great",
626
+ method: "Freehand + Lightening",
627
+ notes: "Gorgeous contrast between dark root and lighter ends.",
628
+ details: [
629
+ "Caramel and honey balayage is incredibly popular",
630
+ "Natural grow-out means lower maintenance",
631
+ "Can be subtle or dramatic — your choice",
632
+ ],
633
+ },
634
+ },
635
+ red: {
636
+ blonde: {
637
+ suitability: "difficult",
638
+ method: "Bleach Required",
639
+ notes: "Risk of clash and unwanted orange tones. Very challenging.",
640
+ details: [
641
+ "Red pigment is extremely stubborn to remove",
642
+ "High risk of orange and brassy tones",
643
+ "Multiple sessions with colour correction needed",
644
+ ],
645
+ },
646
+ brown: {
647
+ suitability: "great",
648
+ method: "Semi or Permanent",
649
+ notes: "Golden and chestnut browns complement red undertones.",
650
+ details: [
651
+ "Warm browns work harmoniously with red base",
652
+ "Chestnut and golden browns are gorgeous",
653
+ "Natural-looking transition from red",
654
+ ],
655
+ },
656
+ red: {
657
+ suitability: "great",
658
+ method: "Semi or Permanent",
659
+ notes: "Deepen or brighten your natural red — stunning results.",
660
+ details: [
661
+ "Enhance your natural colour beautifully",
662
+ "Brighten to vivid copper or deepen to auburn",
663
+ "The easiest and most rewarding option",
664
+ ],
665
+ },
666
+ black: {
667
+ suitability: "not-recommended",
668
+ method: "Permanent",
669
+ notes: "Can dull your beautiful natural vibrancy.",
670
+ details: [
671
+ "Black will mute your natural warmth",
672
+ "Very difficult to return to red afterwards",
673
+ "Consider deep burgundy as an alternative",
674
+ ],
675
+ },
676
+ vivid: {
677
+ suitability: "possible",
678
+ method: "Semi-Permanent",
679
+ notes: "Some vivids may look muddy. Choose carefully.",
680
+ details: [
681
+ "Vivid red and orange work with your base",
682
+ "Blue and green tones may go muddy",
683
+ "Pink can look beautiful on lighter red hair",
684
+ ],
685
+ },
686
+ balayage: {
687
+ suitability: "great",
688
+ method: "Freehand",
689
+ notes: "Copper and rose-gold balayage on red hair is breathtaking.",
690
+ details: [
691
+ "Rose gold tips on red base are stunning",
692
+ "Copper highlights add gorgeous dimension",
693
+ "Low maintenance with natural-looking grow-out",
694
+ ],
695
+ },
696
+ },
697
+ black: {
698
+ blonde: {
699
+ suitability: "not-recommended",
700
+ method: "Heavy Bleach Required",
701
+ notes: "Requires extensive bleaching — high damage risk.",
702
+ details: [
703
+ "Multiple bleaching sessions over months",
704
+ "Severe damage risk to hair integrity",
705
+ "Consider face-framing highlights instead",
706
+ ],
707
+ },
708
+ brown: {
709
+ suitability: "possible",
710
+ method: "Permanent + Lightening",
711
+ notes: "Needs warm undertones. Can look flat without dimension.",
712
+ details: [
713
+ "Warm-toned browns work better than cool",
714
+ "May need multiple sessions for even coverage",
715
+ "Adding highlights creates better dimension",
716
+ ],
717
+ },
718
+ red: {
719
+ suitability: "possible",
720
+ method: "Permanent",
721
+ notes: "Red can pull burgundy on black hair. Rich results though.",
722
+ details: [
723
+ "Expect burgundy/wine rather than true red",
724
+ "Very rich and luxurious results",
725
+ "Works best as all-over colour or highlights",
726
+ ],
727
+ },
728
+ black: {
729
+ suitability: "great",
730
+ method: "Gloss Treatment",
731
+ notes: "Glosses add incredible shine and depth to black hair.",
732
+ details: [
733
+ "Blue-black or violet-black glosses are stunning",
734
+ "Adds mirror-like shine",
735
+ "Gentle treatment with no damage",
736
+ ],
737
+ },
738
+ vivid: {
739
+ suitability: "not-recommended",
740
+ method: "Heavy Bleach Required",
741
+ notes: "Needs heavy lifting for any vivid colour. Very damaging.",
742
+ details: [
743
+ "Extensive bleaching required",
744
+ "Consider peek-a-boo panels or underlights",
745
+ "Temporary colour sprays for events instead",
746
+ ],
747
+ },
748
+ balayage: {
749
+ suitability: "possible",
750
+ method: "Lightening + Freehand",
751
+ notes: "Subtle caramel balayage on black hair is gorgeous when done right.",
752
+ details: [
753
+ "Caramel and toffee tones create beautiful contrast",
754
+ "Requires careful lightening",
755
+ "Low-maintenance once established",
756
+ ],
757
+ },
758
+ },
759
+ "grey-white": {
760
+ blonde: {
761
+ suitability: "great",
762
+ method: "Semi-Permanent",
763
+ notes: "All blonde shades work beautifully — your base is ideal.",
764
+ details: [
765
+ "Champagne and platinum look incredibly natural",
766
+ "Porous hair absorbs colour easily",
767
+ "Semi-permanent for gentle, buildable colour",
768
+ ],
769
+ },
770
+ brown: {
771
+ suitability: "great",
772
+ method: "Semi-Permanent",
773
+ notes: "Soft browns add warmth and youthfulness.",
774
+ details: [
775
+ "Soft brown gives a natural, youthful look",
776
+ "Porous grey absorbs colour beautifully",
777
+ "Demi-permanent for gradual coverage",
778
+ ],
779
+ },
780
+ red: {
781
+ suitability: "great",
782
+ method: "Semi-Permanent",
783
+ notes: "Rose gold and peach tones are absolutely stunning on grey.",
784
+ details: [
785
+ "Rose gold is on-trend and gorgeous",
786
+ "Peach and copper tones add warmth",
787
+ "Fashionable and youthful finish",
788
+ ],
789
+ },
790
+ black: {
791
+ suitability: "great",
792
+ method: "Semi-Permanent",
793
+ notes: "Adds depth and can look very striking.",
794
+ details: [
795
+ "Salt-and-pepper look is very distinguished",
796
+ "Semi-permanent for gradual blending",
797
+ "Adds depth while keeping natural movement",
798
+ ],
799
+ },
800
+ vivid: {
801
+ suitability: "great",
802
+ method: "Semi-Permanent",
803
+ notes: "High vibrancy — grey is the perfect canvas for vivid colours!",
804
+ details: [
805
+ "Grey/white is the ultimate canvas for vivid colours",
806
+ "No bleaching needed whatsoever",
807
+ "Colours appear vibrant and true to tone",
808
+ ],
809
+ },
810
+ balayage: {
811
+ suitability: "great",
812
+ method: "Semi-Permanent",
813
+ notes: "Silver-to-colour gradients look absolutely breathtaking.",
814
+ details: [
815
+ "Reverse balayage with colour at ends is trending",
816
+ "Silver root with coloured tips is stunning",
817
+ "Low maintenance and incredibly fashionable",
818
+ ],
819
+ },
820
+ },
821
+ };
822
+
823
+ const rec = matrix[natural]?.[desired];
824
+ if (!rec) {
825
+ return {
826
+ suitability: "possible",
827
+ method: "Consultation Needed",
828
+ notes: "Book a consultation for personalised advice.",
829
+ details: [],
830
+ };
831
+ }
832
+
833
+ const typeNote =
834
+ hairType === "curly" || hairType === "coily"
835
+ ? "Textured hair may need extra conditioning treatment during the colour process."
836
+ : "";
837
+
838
+ return { ...rec, details: typeNote ? [...rec.details, typeNote] : rec.details };
839
+ }
840
+
841
+ // ─── State ────────────────────────────────────────────────────────────────────
842
+ const step = ref(0);
843
+ const hairType = ref<HairType | null>(null);
844
+ const naturalColour = ref<NaturalColour | null>(null);
845
+ const desiredColour = ref<DesiredColour | null>(null);
846
+
847
+ const recommendation = computed<Recommendation | null>(() => {
848
+ if (hairType.value && naturalColour.value && desiredColour.value) {
849
+ return getRecommendation(naturalColour.value, desiredColour.value, hairType.value);
850
+ }
851
+ return null;
852
+ });
853
+
854
+ const canProceed = computed(
855
+ () =>
856
+ (step.value === 0 && !!hairType.value) ||
857
+ (step.value === 1 && !!naturalColour.value) ||
858
+ (step.value === 2 && !!desiredColour.value) ||
859
+ step.value === 3
860
+ );
861
+
862
+ function next() {
863
+ if (canProceed.value && step.value < 3) step.value++;
864
+ }
865
+ function back() {
866
+ if (step.value > 0) step.value--;
867
+ }
868
+ function reset() {
869
+ step.value = 0;
870
+ hairType.value = null;
871
+ naturalColour.value = null;
872
+ desiredColour.value = null;
873
+ }
874
+
875
+ // ─── Suitability config ───────────────────────────────────────────────────────
876
+ const suitabilityConfig: Record<Suitability, { icon: string; label: string; colour: string; bg: string }> = {
877
+ great: {
878
+ icon: "lucide:check",
879
+ label: "Great Match",
880
+ colour: "text-emerald-400",
881
+ bg: "bg-emerald-400/10 border-emerald-400/30",
882
+ },
883
+ possible: {
884
+ icon: "lucide:alert-triangle",
885
+ label: "Possible with Care",
886
+ colour: "text-amber-400",
887
+ bg: "bg-amber-400/10 border-amber-400/30",
888
+ },
889
+ difficult: {
890
+ icon: "lucide:triangle-alert",
891
+ label: "Challenging",
892
+ colour: "text-orange-400",
893
+ bg: "bg-orange-400/10 border-orange-400/30",
894
+ },
895
+ "not-recommended": {
896
+ icon: "lucide:x",
897
+ label: "Not Recommended",
898
+ colour: "text-red-400",
899
+ bg: "bg-red-400/10 border-red-400/30",
900
+ },
901
+ };
902
+ </script>
903
+
904
+ <style lan="css">
905
+ @layer components {
906
+ /* CSS Custom Properties */
907
+ .colour-finder {
908
+ --_primary-color: hsl(var(--colour-finder-primary-colour));
909
+ --_primary-foreground: hsl(var(--primary-foreground));
910
+ --_background: hsl(var(--background));
911
+ --_foreground: hsl(var(--foreground));
912
+ --_muted: hsl(var(--muted));
913
+ --_muted-foreground: hsl(var(--muted-foreground));
914
+ --_emerald-400: hsl(160 84% 39%);
915
+ --_amber-400: hsl(43 96% 56%);
916
+ --_orange-400: hsl(25 95% 53%);
917
+ --_red-400: hsl(0 84% 60%);
918
+ --_transition-duration: 300ms;
919
+ --_border-radius: 0.5rem;
920
+ --_spacing-xs: 0.25rem;
921
+ --_spacing-sm: 0.5rem;
922
+ --_spacing-md: 1rem;
923
+ --_spacing-lg: 1.5rem;
924
+ --_spacing-xl: 2rem;
925
+ --_spacing-2xl: 3rem;
926
+ --_spacing-3xl: 4rem;
927
+ --_font-display: var(--font-display);
928
+ }
929
+
930
+ /* Main Container */
931
+ .colour-finder {
932
+ background-color: var(--_background);
933
+ color: var(--_foreground);
934
+
935
+ &.colour-finder__container {
936
+ padding-block-start: 7rem;
937
+ padding-block-end: 5rem;
938
+ padding-inline: var(--_spacing-lg);
939
+
940
+ @container (min-width: 1024px) {
941
+ padding-inline: var(--_spacing-2xl);
942
+ }
943
+ }
944
+
945
+ .colour-finder__content {
946
+ /* max-inline-size: 64rem; */
947
+ margin-inline: auto;
948
+ }
949
+ }
950
+
951
+ /* Header Styles */
952
+ .colour-finder__header {
953
+ text-align: center;
954
+ margin-block-end: var(--_spacing-3xl);
955
+
956
+ .colour-finder__label {
957
+ /* font-size: 0.75rem; */
958
+ letter-spacing: 0.4em;
959
+ text-transform: uppercase;
960
+ color: var(--_primary-color);
961
+ margin-block-end: var(--_spacing-md);
962
+ }
963
+
964
+ .colour-finder__title {
965
+ font-family: var(--_font-display);
966
+ font-size: clamp(2.25rem, 5vw, 3.75rem);
967
+ margin-block-end: var(--_spacing-md);
968
+
969
+ @media (min-width: 768px) {
970
+ font-size: clamp(3.75rem, 8vw, 6rem);
971
+ }
972
+
973
+ .colour-finder__title-highlight {
974
+ font-style: italic;
975
+ background: linear-gradient(135deg, #d4af37, #ffd700, #ffed4e);
976
+ background-clip: text;
977
+ -webkit-background-clip: text;
978
+ color: transparent;
979
+ }
980
+ }
981
+
982
+ .colour-finder__subtitle {
983
+ color: var(--_muted-foreground);
984
+ font-weight: 300;
985
+ max-inline-size: 28rem;
986
+ margin-inline: auto;
987
+ }
988
+ }
989
+
990
+ /* Progress Steps */
991
+ .colour-finder__progress {
992
+ display: flex;
993
+ align-items: center;
994
+ justify-content: center;
995
+ gap: var(--_spacing-sm);
996
+ margin-block-end: var(--_spacing-3xl);
997
+
998
+ .colour-finder__progress-step {
999
+ display: flex;
1000
+ align-items: center;
1001
+ gap: var(--_spacing-sm);
1002
+ }
1003
+
1004
+ .colour-finder__progress-button {
1005
+ display: flex;
1006
+ align-items: center;
1007
+ gap: 1rem;
1008
+ padding: 0.8rem 1.2rem;
1009
+ /* font-size: 0.75rem; */
1010
+ /* letter-spacing: 0.15em; */
1011
+ text-transform: uppercase;
1012
+ border: 1px solid var(--colour-finder-border-colour);
1013
+ background: transparent;
1014
+ color: var(--_muted-foreground);
1015
+ transition: all var(--_transition-duration) ease;
1016
+ cursor: pointer;
1017
+
1018
+ &.colour-finder__progress-button--active {
1019
+ border-color: var(--_primary-color);
1020
+ color: var(--_primary-color);
1021
+ }
1022
+
1023
+ &.colour-finder__progress-button--completed {
1024
+ border-color: color-mix(in srgb, var(--_primary-color) 30%, transparent);
1025
+ color: color-mix(in srgb, var(--_primary-color) 60%, transparent);
1026
+ }
1027
+
1028
+ &.colour-finder__progress-button--inactive {
1029
+ border-color: var(--colour-finder-border-colour);
1030
+ color: var(--_muted-foreground);
1031
+ }
1032
+ }
1033
+
1034
+ .colour-finder__progress-indicator {
1035
+ inline-size: 1.25rem;
1036
+ block-size: 1.25rem;
1037
+ display: flex;
1038
+ align-items: center;
1039
+ justify-content: center;
1040
+ /* font-size: 0.625rem; */
1041
+ font-weight: 500;
1042
+ border-radius: 50%;
1043
+
1044
+ &.colour-finder__progress-indicator--completed {
1045
+ background-color: var(--_primary-color);
1046
+ color: var(--_primary-foreground);
1047
+ }
1048
+
1049
+ &.colour-finder__progress-indicator--active {
1050
+ border: 1px solid var(--_primary-color);
1051
+ color: var(--_primary-color);
1052
+ }
1053
+
1054
+ &.colour-finder__progress-indicator--inactive {
1055
+ border: 1px solid var(--_muted-foreground);
1056
+ color: var(--_muted-foreground);
1057
+ }
1058
+ }
1059
+
1060
+ .colour-finder__progress-label {
1061
+ display: none;
1062
+
1063
+ @media (min-width: 640px) {
1064
+ display: inline;
1065
+ }
1066
+ }
1067
+
1068
+ .colour-finder__progress-connector {
1069
+ inline-size: 2rem;
1070
+ block-size: 1px;
1071
+ background-color: var(--colour-finder-border-colour);
1072
+
1073
+ &.colour-finder__progress-connector--completed {
1074
+ background-color: var(--_primary-color);
1075
+ }
1076
+ }
1077
+ }
1078
+
1079
+ /* Steps */
1080
+ .colour-finder__step {
1081
+ .colour-finder__step-title {
1082
+ font-family: var(--_font-display);
1083
+ /* font-size: 1.5rem; */
1084
+ text-align: center;
1085
+ margin-block-end: var(--_spacing-xl);
1086
+ }
1087
+ }
1088
+
1089
+ /* Options Grid */
1090
+ .colour-finder__options {
1091
+ display: grid;
1092
+ gap: var(--_spacing-md);
1093
+ margin-inline: auto;
1094
+
1095
+ &.colour-finder__options--hair-type {
1096
+ grid-template-columns: repeat(2, 1fr);
1097
+ /* max-inline-size: 32rem; */
1098
+
1099
+ @media (min-width: 768px) {
1100
+ grid-template-columns: repeat(4, 1fr);
1101
+ }
1102
+ }
1103
+
1104
+ &.colour-finder__options--natural-colour {
1105
+ grid-template-columns: repeat(2, 1fr);
1106
+ /* max-inline-size: 48rem; */
1107
+
1108
+ @media (min-width: 640px) {
1109
+ grid-template-columns: repeat(3, 1fr);
1110
+ }
1111
+
1112
+ @media (min-width: 1024px) {
1113
+ grid-template-columns: repeat(4, 1fr);
1114
+ }
1115
+ }
1116
+
1117
+ &.colour-finder__options--desired-colour {
1118
+ grid-template-columns: repeat(2, 1fr);
1119
+ /* max-inline-size: 48rem; */
1120
+
1121
+ @media (min-width: 640px) {
1122
+ grid-template-columns: repeat(3, 1fr);
1123
+ }
1124
+ }
1125
+ }
1126
+
1127
+ .colour-finder__option {
1128
+ padding: var(--_spacing-lg);
1129
+ border: 1px solid var(--colour-finder-border-colour);
1130
+ background: transparent;
1131
+ text-align: center;
1132
+ cursor: pointer;
1133
+ transition: all var(--_transition-duration) ease;
1134
+ border-radius: var(--_border-radius);
1135
+
1136
+ &:hover {
1137
+ border-color: color-mix(in srgb, var(--_primary-color) 50%, transparent);
1138
+ }
1139
+
1140
+ &.colour-finder__option--selected {
1141
+ border-color: var(--_primary-color);
1142
+ background-color: color-mix(in srgb, var(--_primary-color) 5%, transparent);
1143
+ box-shadow: 0 4px 20px color-mix(in srgb, var(--_primary-color) 20%, transparent);
1144
+ }
1145
+
1146
+ .colour-finder__option-pattern {
1147
+ /* font-size: 1.875rem; */
1148
+ font-weight: 300;
1149
+ letter-spacing: 0.1em;
1150
+ color: var(--_foreground);
1151
+ margin-block-end: 0.75rem;
1152
+ }
1153
+
1154
+ .colour-finder__option-swatch {
1155
+ aspect-ratio: 1 / 1;
1156
+ block-size: 8rem;
1157
+ border-radius: 50%;
1158
+ margin-inline: auto;
1159
+ margin-block-end: 0.75rem;
1160
+ border: 1px solid color-mix(in srgb, var(--_foreground) 10%, transparent);
1161
+
1162
+ .colour-finder__option-image {
1163
+ inline-size: 100%;
1164
+ block-size: 100%;
1165
+ border-radius: 50%;
1166
+ object-fit: cover;
1167
+ }
1168
+ }
1169
+
1170
+ .colour-finder__option-label {
1171
+ /* font-size: 0.75rem; */
1172
+ letter-spacing: 0.1em;
1173
+ text-transform: uppercase;
1174
+ color: var(--_muted-foreground);
1175
+ transition: color var(--_transition-duration) ease;
1176
+
1177
+ &.colour-finder__option-label--selected {
1178
+ color: var(--_primary-color);
1179
+ }
1180
+ }
1181
+
1182
+ &:hover .colour-finder__option-label {
1183
+ color: var(--_foreground);
1184
+ }
1185
+ }
1186
+
1187
+ /* Results Section */
1188
+ .colour-finder__results {
1189
+ /* max-inline-size: 32rem; */
1190
+ margin-inline: auto;
1191
+
1192
+ .colour-finder__results-header {
1193
+ text-align: center;
1194
+ margin-block-end: 2.5rem;
1195
+
1196
+ .colour-finder__results-icon {
1197
+ inline-size: 2rem;
1198
+ block-size: 2rem;
1199
+ color: var(--_primary-color);
1200
+ margin-inline: auto;
1201
+ margin-block-end: var(--_spacing-md);
1202
+ }
1203
+
1204
+ .colour-finder__results-title {
1205
+ font-family: var(--_font-display);
1206
+ /* font-size: 1.5rem; */
1207
+ margin-block-end: var(--_spacing-sm);
1208
+ }
1209
+ }
1210
+ }
1211
+
1212
+ .colour-finder__suitability {
1213
+ display: flex;
1214
+ align-items: center;
1215
+ gap: 0.75rem;
1216
+ padding: 1.25rem;
1217
+ border: 1px solid;
1218
+ margin-block-end: var(--_spacing-xl);
1219
+ border-radius: var(--_border-radius);
1220
+
1221
+ .colour-finder__suitability-icon {
1222
+ inline-size: 1.5rem;
1223
+ block-size: 1.5rem;
1224
+ }
1225
+
1226
+ .colour-finder__suitability-label {
1227
+ font-family: var(--_font-display);
1228
+ /* font-size: 1.125rem; */
1229
+ }
1230
+
1231
+ .colour-finder__suitability-notes {
1232
+ color: var(--_muted-foreground);
1233
+ /* font-size: 0.875rem; */
1234
+ font-weight: 300;
1235
+ }
1236
+ }
1237
+
1238
+ .colour-finder__details-card {
1239
+ background: rgba(255, 255, 255, 0.05);
1240
+ backdrop-filter: blur(10px);
1241
+ border: 1px solid color-mix(in srgb, var(--_foreground) 10%, transparent);
1242
+ border-radius: var(--_border-radius);
1243
+ padding: var(--_spacing-xl);
1244
+ margin-block-end: var(--_spacing-xl);
1245
+
1246
+ .colour-finder__details-header {
1247
+ display: flex;
1248
+ align-items: center;
1249
+ gap: 0.75rem;
1250
+ margin-block-end: var(--_spacing-lg);
1251
+
1252
+ .colour-finder__details-method-label {
1253
+ /* font-size: 0.75rem; */
1254
+ letter-spacing: 0.2em;
1255
+ text-transform: uppercase;
1256
+ color: var(--_primary-color);
1257
+ }
1258
+
1259
+ .colour-finder__details-method-badge {
1260
+ padding: var(--_spacing-xs) 0.75rem;
1261
+ background-color: color-mix(in srgb, var(--_primary-color) 10%, transparent);
1262
+ color: var(--_primary-color);
1263
+ /* font-size: 0.875rem; */
1264
+ border: 1px solid color-mix(in srgb, var(--_primary-color) 20%, transparent);
1265
+ border-radius: var(--_border-radius);
1266
+ }
1267
+ }
1268
+
1269
+ .colour-finder__details-list {
1270
+ display: flex;
1271
+ flex-direction: column;
1272
+ gap: 0.75rem;
1273
+ }
1274
+
1275
+ .colour-finder__details-item {
1276
+ display: flex;
1277
+ align-items: flex-start;
1278
+ gap: 0.75rem;
1279
+
1280
+ .colour-finder__details-bullet {
1281
+ inline-size: 0.25rem;
1282
+ block-size: 0.25rem;
1283
+ border-radius: 50%;
1284
+ background-color: var(--_primary-color);
1285
+ margin-block-start: 0.5rem;
1286
+ flex-shrink: 0;
1287
+ }
1288
+
1289
+ .colour-finder__details-text {
1290
+ color: color-mix(in srgb, var(--_foreground) 80%, transparent);
1291
+ font-weight: 300;
1292
+ /* font-size: 0.875rem; */
1293
+ /* line-height: 1.6; */
1294
+ }
1295
+ }
1296
+ }
1297
+
1298
+ .colour-finder__summary {
1299
+ display: grid;
1300
+ grid-template-columns: repeat(3, 1fr);
1301
+ gap: var(--_spacing-md);
1302
+ margin-block-end: 2.5rem;
1303
+
1304
+ .colour-finder__summary-item {
1305
+ text-align: center;
1306
+ padding: var(--_spacing-md);
1307
+ border: 1px solid var(--colour-finder-border-colour);
1308
+ border-radius: var(--_border-radius);
1309
+
1310
+ .colour-finder__summary-label {
1311
+ /* font-size: 0.625rem; */
1312
+ letter-spacing: 0.2em;
1313
+ text-transform: uppercase;
1314
+ color: var(--_muted-foreground);
1315
+ margin-block-end: var(--_spacing-sm);
1316
+ }
1317
+
1318
+ .colour-finder__summary-swatch {
1319
+ aspect-ratio: 1 / 1;
1320
+ block-size: 6rem;
1321
+ border-radius: 50%;
1322
+ margin-inline: auto;
1323
+ margin-block-end: var(--_spacing-sm);
1324
+ border: 1px solid color-mix(in srgb, var(--_foreground) 10%, transparent);
1325
+ overflow: hidden;
1326
+
1327
+ .colour-finder__summary-image {
1328
+ inline-size: 100%;
1329
+ block-size: 100%;
1330
+ /* border-radius: 50%; */
1331
+ object-fit: cover;
1332
+
1333
+ &.colour-finder__summary-image--dark {
1334
+ filter: brightness(0.8) contrast(1.1);
1335
+ }
1336
+ }
1337
+ }
1338
+
1339
+ .colour-finder__summary-value {
1340
+ /* font-size: 0.875rem; */
1341
+ color: var(--_foreground);
1342
+ }
1343
+ }
1344
+ }
1345
+
1346
+ .colour-finder__cta {
1347
+ text-align: center;
1348
+
1349
+ .colour-finder__cta-disclaimer {
1350
+ color: var(--_muted-foreground);
1351
+ /* font-size: 0.875rem; */
1352
+ margin-block-end: var(--_spacing-lg);
1353
+ font-weight: 300;
1354
+ }
1355
+
1356
+ .colour-finder__cta-buttons {
1357
+ display: flex;
1358
+ flex-direction: column;
1359
+ gap: var(--_spacing-md);
1360
+ justify-content: center;
1361
+
1362
+ @media (min-width: 640px) {
1363
+ flex-direction: row;
1364
+ }
1365
+ }
1366
+ }
1367
+
1368
+ .colour-finder__button {
1369
+ display: inline-flex;
1370
+ align-items: center;
1371
+ justify-content: center;
1372
+ padding: var(--_spacing-md) var(--_spacing-xl);
1373
+ /* font-size: 0.875rem; */
1374
+ letter-spacing: 0.15em;
1375
+ text-transform: uppercase;
1376
+ text-decoration: none;
1377
+ transition: all var(--_transition-duration) ease;
1378
+ border-radius: var(--_border-radius);
1379
+ cursor: pointer;
1380
+ border: 1px solid transparent;
1381
+
1382
+ &.colour-finder__button--primary {
1383
+ background-color: var(--_primary-color);
1384
+ color: var(--_primary-foreground);
1385
+ box-shadow: 0 4px 20px color-mix(in srgb, var(--_primary-color) 20%, transparent);
1386
+
1387
+ &:hover {
1388
+ background-color: color-mix(in srgb, var(--_primary-color) 90%, transparent);
1389
+ }
1390
+ }
1391
+
1392
+ &.colour-finder__button--secondary {
1393
+ border-color: color-mix(in srgb, var(--_foreground) 20%, transparent);
1394
+ color: var(--_foreground);
1395
+
1396
+ &:hover {
1397
+ border-color: var(--_primary-color);
1398
+ color: var(--_primary-color);
1399
+ }
1400
+ }
1401
+ }
1402
+
1403
+ /* Navigation */
1404
+ .colour-finder__navigation {
1405
+ display: flex;
1406
+ align-items: center;
1407
+ justify-content: center;
1408
+ gap: var(--_spacing-md);
1409
+ margin-block-start: var(--_spacing-2xl);
1410
+
1411
+ .colour-finder__nav-button {
1412
+ display: flex;
1413
+ align-items: center;
1414
+ gap: var(--_spacing-sm);
1415
+ padding: 0.75rem var(--_spacing-lg);
1416
+ /* font-size: 0.875rem; */
1417
+ letter-spacing: 0.1em;
1418
+ text-transform: uppercase;
1419
+ background: transparent;
1420
+ border: 1px solid transparent;
1421
+ cursor: pointer;
1422
+ transition: all var(--_transition-duration) ease;
1423
+ border-radius: var(--_border-radius);
1424
+
1425
+ .colour-finder__nav-icon {
1426
+ inline-size: 1rem;
1427
+ block-size: 1rem;
1428
+ }
1429
+
1430
+ &.colour-finder__nav-button--back {
1431
+ color: var(--_muted-foreground);
1432
+
1433
+ &:hover {
1434
+ color: var(--_foreground);
1435
+ }
1436
+ }
1437
+
1438
+ &.colour-finder__nav-button--next {
1439
+ padding: 0.75rem var(--_spacing-xl);
1440
+ background-color: var(--_primary-color);
1441
+ color: var(--_primary-foreground);
1442
+ box-shadow: 0 4px 20px color-mix(in srgb, var(--_primary-color) 20%, transparent);
1443
+
1444
+ &:hover {
1445
+ background-color: color-mix(in srgb, var(--_primary-color) 90%, transparent);
1446
+ }
1447
+
1448
+ &.colour-finder__nav-button--disabled {
1449
+ background-color: var(--_muted);
1450
+ color: var(--_muted-foreground);
1451
+ cursor: not-allowed;
1452
+ box-shadow: none;
1453
+
1454
+ &:hover {
1455
+ background-color: var(--_muted);
1456
+ }
1457
+ }
1458
+ }
1459
+ }
1460
+ }
1461
+
1462
+ /* Slide transition — replaces framer-motion AnimatePresence */
1463
+ .slide-enter-active,
1464
+ .slide-leave-active {
1465
+ transition:
1466
+ opacity var(--_transition-duration) ease,
1467
+ transform var(--_transition-duration) ease;
1468
+ }
1469
+
1470
+ .slide-enter-from {
1471
+ opacity: 0;
1472
+ transform: translateX(50px);
1473
+ }
1474
+
1475
+ .slide-leave-to {
1476
+ opacity: 0;
1477
+ transform: translateX(-50px);
1478
+ }
1479
+
1480
+ /* Suitability specific styles that reference the suitability config */
1481
+ .colour-finder__suitability {
1482
+ &.bg-emerald-400\/10 {
1483
+ background-color: color-mix(in srgb, var(--_emerald-400) 10%, transparent);
1484
+ border-color: color-mix(in srgb, var(--_emerald-400) 30%, transparent);
1485
+ }
1486
+
1487
+ &.bg-amber-400\/10 {
1488
+ background-color: color-mix(in srgb, var(--_amber-400) 10%, transparent);
1489
+ border-color: color-mix(in srgb, var(--_amber-400) 30%, transparent);
1490
+ }
1491
+
1492
+ &.bg-orange-400\/10 {
1493
+ background-color: color-mix(in srgb, var(--_orange-400) 10%, transparent);
1494
+ border-color: color-mix(in srgb, var(--_orange-400) 30%, transparent);
1495
+ }
1496
+
1497
+ &.bg-red-400\/10 {
1498
+ background-color: color-mix(in srgb, var(--_red-400) 10%, transparent);
1499
+ border-color: color-mix(in srgb, var(--_red-400) 30%, transparent);
1500
+ }
1501
+ }
1502
+
1503
+ .text-emerald-400 {
1504
+ color: var(--_emerald-400);
1505
+ }
1506
+
1507
+ .text-amber-400 {
1508
+ color: var(--_amber-400);
1509
+ }
1510
+
1511
+ .text-orange-400 {
1512
+ color: var(--_orange-400);
1513
+ }
1514
+
1515
+ .text-red-400 {
1516
+ color: var(--_red-400);
1517
+ }
1518
+ }
1519
+ </style>