srcdev-nuxt-components 9.1.48 → 9.1.50

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 (223) hide show
  1. package/.claude/settings.json +2 -4
  2. package/.claude/settings.local.json +22 -2
  3. package/.claude/skills/components/card-core.md +205 -0
  4. package/.claude/skills/components/display-dialog.md +128 -0
  5. package/.claude/skills/components/page-hero-highlights.md +1 -1
  6. package/.claude/skills/components/page-row.md +157 -0
  7. package/.claude/skills/components/services-card-grid.md +4 -4
  8. package/.claude/skills/components/services-section-grid.md +4 -4
  9. package/.claude/skills/components/tab-navigation.md +222 -0
  10. package/.claude/skills/composable-anchor-scroll.md +110 -28
  11. package/.claude/skills/composable-dialog-controls.md +55 -43
  12. package/.claude/skills/index.md +5 -2
  13. package/app/components/01.atoms/card/CONSUMER-STYLING.md +175 -0
  14. package/app/components/01.atoms/card/CardCore.vue +48 -21
  15. package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +163 -0
  16. package/app/components/01.atoms/display-dialog/DisplayDialog.vue +277 -0
  17. package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +177 -0
  18. package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +264 -0
  19. package/app/components/01.atoms/display-dialog/tests/__snapshots__/DisplayDialog.spec.ts.snap +18 -0
  20. package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +90 -0
  21. package/app/components/01.atoms/page-row/PageRow.vue +115 -0
  22. package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +311 -0
  23. package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +191 -0
  24. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +145 -0
  25. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +52 -11
  26. package/app/components/02.molecules/navigation/tab-navigation/tests/__snapshots__/TabNavigation.spec.ts.snap +12 -6
  27. package/app/components/{forms/ui → 05.forms/form-field}/FormField.vue +12 -19
  28. package/app/components/{forms/ui → 05.forms/form-wrapper}/FormWrapper.vue +6 -6
  29. package/app/components/{forms → 05.forms}/input-button/InputButtonCore.vue +2 -0
  30. package/app/components/{forms → 05.forms}/input-button/stories/InputButtonCore.stories.ts +1 -1
  31. package/app/components/{forms → 05.forms}/input-text/InputTextCore.vue +73 -73
  32. package/app/components/{forms → 05.forms}/input-text/variants/InputTextAsNumberWithLabel.vue +29 -29
  33. package/app/components/carousels/CarouselBasic.vue +99 -99
  34. package/app/components/carousels/CarouselInfinite.vue +150 -150
  35. package/app/components/deep-expanding-menu/DeepExpandingMenu.vue +111 -111
  36. package/app/components/responsive-header/ResponsiveHeader.vue +250 -282
  37. package/app/components/test-storybook/TestStorybook.vue +16 -16
  38. package/app/composables/tests/useDialogControls.spec.ts +34 -64
  39. package/app/composables/useAnchorScroll.ts +16 -3
  40. package/app/composables/useDialogControls.ts +19 -33
  41. package/app/composables/useFormControl.ts +0 -2
  42. package/app/composables/useNavCollapse.ts +5 -1
  43. package/app/layouts/default.vue +10 -7
  44. package/app/pages/auto-grid.vue +37 -20
  45. package/app/pages/banner-video.vue +2 -2
  46. package/app/pages/forms/examples/buttons/index.vue +189 -215
  47. package/app/pages/forms/examples/material/text-fields.vue +2 -2
  48. package/app/pages/grid-stack.vue +10 -10
  49. package/app/pages/index.vue +20 -20
  50. package/app/pages/samaritan.vue +4 -4
  51. package/app/pages/typography/hero-text.vue +6 -6
  52. package/app/pages/typography/index.vue +4 -4
  53. package/app/pages/typography/page-body.vue +4 -4
  54. package/app/pages/typography/page-heading.vue +4 -4
  55. package/app/pages/typography/page-link.vue +4 -4
  56. package/app/pages/ui/accordian.vue +4 -4
  57. package/app/pages/ui/anchor-scroll-tab-navigation.vue +191 -0
  58. package/app/pages/ui/anchor-scroll.vue +105 -71
  59. package/app/pages/ui/animated-svg-text.vue +4 -4
  60. package/app/pages/ui/block-decorators.vue +11 -11
  61. package/app/pages/ui/card-core.vue +9 -9
  62. package/app/pages/ui/carousel-basic.vue +4 -4
  63. package/app/pages/ui/carousel-flip.vue +2 -2
  64. package/app/pages/ui/carousel-infinite.vue +4 -4
  65. package/app/pages/ui/clipped-panels.vue +10 -10
  66. package/app/pages/ui/contact-section.vue +4 -4
  67. package/app/pages/ui/container-glow.vue +2 -3
  68. package/app/pages/ui/deep-expanding-menu.vue +138 -0
  69. package/app/pages/ui/display-avatar.vue +2 -2
  70. package/app/pages/ui/display-banner.vue +2 -2
  71. package/app/pages/ui/display-chip.vue +32 -25
  72. package/app/pages/ui/display-details.vue +6 -10
  73. package/app/pages/ui/display-dialog.vue +96 -131
  74. package/app/pages/ui/display-pill.vue +27 -33
  75. package/app/pages/ui/display-prompt.vue +4 -4
  76. package/app/pages/ui/display-toast.vue +2 -2
  77. package/app/pages/ui/expanding-panel.vue +12 -16
  78. package/app/pages/ui/glowing-border.vue +12 -12
  79. package/app/pages/ui/layout-grid-a.vue +6 -6
  80. package/app/pages/ui/layout-grid-b.vue +4 -4
  81. package/app/pages/ui/magnetic-navigation.vue +6 -6
  82. package/app/pages/ui/marquee-scroller.vue +2 -2
  83. package/app/pages/ui/mask-element.vue +2 -2
  84. package/app/pages/ui/masonry-columns.vue +4 -4
  85. package/app/pages/ui/masonry-grid-ordered-experiment.vue +4 -4
  86. package/app/pages/ui/masonry-grid-ordered.vue +4 -4
  87. package/app/pages/ui/masonry-grid-sorted.vue +4 -4
  88. package/app/pages/ui/masonry-grid.vue +4 -4
  89. package/app/pages/ui/navigation/navigation-horizontal.vue +12 -12
  90. package/app/pages/ui/navigation/tab-navigation.vue +493 -0
  91. package/app/pages/ui/page-row.vue +127 -0
  92. package/app/pages/ui/price-list.vue +4 -4
  93. package/app/pages/ui/profile-section.vue +4 -4
  94. package/app/pages/ui/qr-code/[componentName].vue +6 -6
  95. package/app/pages/ui/rotating-carousel.vue +16 -16
  96. package/app/pages/ui/scroll-reveal-image.vue +20 -20
  97. package/app/pages/ui/section-parallax.vue +7 -7
  98. package/app/pages/ui/services/colour-finder.vue +4 -4
  99. package/app/pages/ui/services/services-cards.vue +4 -4
  100. package/app/pages/ui/services/services-section/[slug].vue +4 -4
  101. package/app/pages/ui/services/services-sections-compact.vue +6 -6
  102. package/app/pages/ui/settings.vue +10 -10
  103. package/app/pages/ui/simple-grid.vue +2 -2
  104. package/app/pages/ui/slider-gallery.vue +5 -5
  105. package/app/pages/ui/tabs-y.vue +2 -3
  106. package/app/pages/ui/tabs.vue +6 -9
  107. package/app/pages/ui/tooltips.vue +9 -9
  108. package/app/pages/ui/wipe-away-vertical.vue +14 -14
  109. package/package.json +1 -1
  110. package/.claude/skills/components/layout-row.md +0 -239
  111. package/app/components/display-dialog/DisplayDialogCore.vue +0 -276
  112. package/app/components/display-dialog/variants/DisplayDialogConfirm.vue +0 -47
  113. package/app/components/display-dialog/variants/DisplayDialogScrollableContent.vue +0 -51
  114. package/app/components/forms/c12/utils.ts +0 -14
  115. package/app/components/layout-row/LayoutRow.vue +0 -171
  116. package/app/components/layout-row/stories/LayoutRow.stories.ts +0 -528
  117. package/app/pages/ui/layout-row.vue +0 -139
  118. /package/app/components/{forms → 05.forms}/form-errors/InputError.vue +0 -0
  119. /package/app/components/{forms → 05.forms}/form-errors/tests/InputError.spec.ts +0 -0
  120. /package/app/components/{forms → 05.forms}/form-fieldset/FormFieldset.vue +0 -0
  121. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts +0 -0
  122. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-chromium-darwin.png +0 -0
  123. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-firefox-darwin.png +0 -0
  124. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-webkit-darwin.png +0 -0
  125. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-chromium-darwin.png +0 -0
  126. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-firefox-darwin.png +0 -0
  127. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-webkit-darwin.png +0 -0
  128. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-chromium-darwin.png +0 -0
  129. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-firefox-darwin.png +0 -0
  130. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-webkit-darwin.png +0 -0
  131. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-chromium-darwin.png +0 -0
  132. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-firefox-darwin.png +0 -0
  133. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-webkit-darwin.png +0 -0
  134. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-chromium-darwin.png +0 -0
  135. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-firefox-darwin.png +0 -0
  136. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-webkit-darwin.png +0 -0
  137. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
  138. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
  139. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-chromium-darwin.png +0 -0
  140. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-firefox-darwin.png +0 -0
  141. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-webkit-darwin.png +0 -0
  142. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-chromium-darwin.png +0 -0
  143. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-firefox-darwin.png +0 -0
  144. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-webkit-darwin.png +0 -0
  145. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-chromium-darwin.png +0 -0
  146. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-firefox-darwin.png +0 -0
  147. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-webkit-darwin.png +0 -0
  148. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-chromium-darwin.png +0 -0
  149. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-firefox-darwin.png +0 -0
  150. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-webkit-darwin.png +0 -0
  151. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-chromium-darwin.png +0 -0
  152. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-firefox-darwin.png +0 -0
  153. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-webkit-darwin.png +0 -0
  154. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-chromium-darwin.png +0 -0
  155. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-firefox-darwin.png +0 -0
  156. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-webkit-darwin.png +0 -0
  157. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-chromium-darwin.png +0 -0
  158. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-firefox-darwin.png +0 -0
  159. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-webkit-darwin.png +0 -0
  160. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
  161. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-chromium-darwin.png +0 -0
  162. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-firefox-darwin.png +0 -0
  163. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-webkit-darwin.png +0 -0
  164. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-chromium-darwin.png +0 -0
  165. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-firefox-darwin.png +0 -0
  166. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-webkit-darwin.png +0 -0
  167. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-chromium-darwin.png +0 -0
  168. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-firefox-darwin.png +0 -0
  169. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-webkit-darwin.png +0 -0
  170. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-chromium-darwin.png +0 -0
  171. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-firefox-darwin.png +0 -0
  172. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-webkit-darwin.png +0 -0
  173. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-chromium-darwin.png +0 -0
  174. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-firefox-darwin.png +0 -0
  175. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-webkit-darwin.png +0 -0
  176. /package/app/components/{forms → 05.forms}/input-button/tests/InputButtonCore.spec.ts +0 -0
  177. /package/app/components/{forms → 05.forms}/input-button/tests/__snapshots__/InputButtonCore.spec.ts.snap +0 -0
  178. /package/app/components/{forms → 05.forms}/input-checkbox/MultipleCheckboxes.vue +0 -0
  179. /package/app/components/{forms → 05.forms}/input-checkbox/SingleCheckbox.vue +0 -0
  180. /package/app/components/{forms → 05.forms}/input-checkbox/tests/MultipleCheckboxes.spec.ts +0 -0
  181. /package/app/components/{forms → 05.forms}/input-checkbox/tests/data/tags.json +0 -0
  182. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioButton.vue +0 -0
  183. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -0
  184. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -0
  185. /package/app/components/{forms → 05.forms}/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -0
  186. /package/app/components/{forms → 05.forms}/input-copy/InputCopyCore.vue +0 -0
  187. /package/app/components/{forms → 05.forms}/input-copy/stories/InputCopyCore.stories.ts +0 -0
  188. /package/app/components/{forms → 05.forms}/input-copy/tests/InputCopyCore.spec.ts +0 -0
  189. /package/app/components/{forms → 05.forms}/input-copy/tests/__snapshots__/InputCopyCore.spec.ts.snap +0 -0
  190. /package/app/components/{forms → 05.forms}/input-description/InputDescription.vue +0 -0
  191. /package/app/components/{forms → 05.forms}/input-description/tests/InputDescription.spec.ts +0 -0
  192. /package/app/components/{forms → 05.forms}/input-label/InputLabel.vue +0 -0
  193. /package/app/components/{forms → 05.forms}/input-label/tests/InputLabel.spec.ts +0 -0
  194. /package/app/components/{forms → 05.forms}/input-number/InputNumberCore.vue +0 -0
  195. /package/app/components/{forms → 05.forms}/input-number/variants/InputNumberDefault.vue +0 -0
  196. /package/app/components/{forms → 05.forms}/input-radio/MultipleRadiobuttons.vue +0 -0
  197. /package/app/components/{forms → 05.forms}/input-radio/tests/MultipleRadioButtons.spec.ts +0 -0
  198. /package/app/components/{forms → 05.forms}/input-radio/tests/data/tags.json +0 -0
  199. /package/app/components/{forms → 05.forms}/input-range/InputRangeCore.vue +0 -0
  200. /package/app/components/{forms → 05.forms}/input-range/variants/InputRangeDefault.vue +0 -0
  201. /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyCore.vue +0 -0
  202. /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyWithLabel.vue +0 -0
  203. /package/app/components/{forms → 05.forms}/input-select/InputSelectCore.vue +0 -0
  204. /package/app/components/{forms → 05.forms}/input-select/variants/InputSelectWithLabel.vue +0 -0
  205. /package/app/components/{forms → 05.forms}/input-text/stories/InputPasswordWithLabel.stories.ts +0 -0
  206. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextAsNumberWithLabel.stories.ts +0 -0
  207. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextCore.stories.ts +0 -0
  208. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextWithLabel.stories.ts +0 -0
  209. /package/app/components/{forms → 05.forms}/input-text/variants/InputPasswordWithLabel.vue +0 -0
  210. /package/app/components/{forms → 05.forms}/input-text/variants/InputTextWithLabel.vue +0 -0
  211. /package/app/components/{forms → 05.forms}/input-textarea/InputTextareaCore.vue +0 -0
  212. /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaCore.stories.ts +0 -0
  213. /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaWithLabel.stories.ts +0 -0
  214. /package/app/components/{forms → 05.forms}/input-textarea/variants/InputTextareaWithLabel.vue +0 -0
  215. /package/app/components/{forms → 05.forms}/pending-effect/PendingEffect.vue +0 -0
  216. /package/app/components/{forms → 05.forms}/toggle-switch/ToggleSwitchCore.vue +0 -0
  217. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchCore.stories.ts +0 -0
  218. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +0 -0
  219. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +0 -0
  220. /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabel.vue +0 -0
  221. /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +0 -0
  222. /package/app/components/{forms → 05.forms}/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -0
  223. /package/app/{components/forms/c12/prop-validators/index.ts → utils/prop-validators.ts} +0 -0
@@ -0,0 +1,175 @@
1
+ # CardCore — Consumer Styling Guide
2
+
3
+ ## Public token API
4
+
5
+ All `--card-core-*` tokens are the stable override surface. Set them at any scope (global, page,
6
+ or instance) without touching the component itself.
7
+
8
+ | Token | Default | Controls |
9
+ |---|---|---|
10
+ | `--card-core-row-gap` | `1rem` | Gap between card rows |
11
+ | `--card-core-inner-padding` | `1rem` | Internal padding (applied per row by the consumer) |
12
+ | `--card-core-border-radius` | `0.5rem` | Corner rounding |
13
+ | `--card-core-border` | `0.2rem solid var(--slate-08)` | Full border shorthand |
14
+ | `--card-core-box-shadow` | `0.1rem 0.1rem 0.4rem oklch(from var(--slate-08) l c h / 0.45)` | Box shadow shorthand |
15
+ | `--card-core-background-color` | `transparent` | Main background colour |
16
+ | `--card-core-background-image` | `none` | Main background image |
17
+ | `--card-core-lower-background-color` | `transparent` | Blurred backdrop layer colour |
18
+ | `--card-core-lower-background-image` | `none` | Blurred backdrop layer image |
19
+ | `--card-core-lower-background-position` | `center` | Backdrop image position |
20
+ | `--card-core-lower-background-blur` | `16px` | Backdrop blur amount |
21
+ | `--card-core-lower-scale` | `1.1` | Backdrop scale (zoom to hide blur edges) |
22
+
23
+ > **Variant note**: The `solid`, `subtle`, `soft`, and `outline` variants directly override the
24
+ > internal `--_card-background-color` and `--_card-border` tokens, bypassing the public tokens
25
+ > for those properties. To override a variant's colours, target the variant class directly (see
26
+ > [Per-variant overrides](#per-variant-overrides) below).
27
+
28
+ ---
29
+
30
+ ## Global theming — app-level CSS file
31
+
32
+ Create `assets/styles/setup/07.components/card-core.css` in the consuming app and set tokens on
33
+ `:root`. These values apply to every `CardCore` instance across the site.
34
+
35
+ ```css
36
+ /* assets/styles/setup/07.components/card-core.css */
37
+ :root {
38
+ --card-core-border-radius: 1rem;
39
+ --card-core-border: 0.1rem solid var(--brand-border);
40
+ --card-core-box-shadow: 0 0.2rem 1.2rem rgb(0 0 0 / 8%);
41
+ --card-core-row-gap: 0;
42
+ }
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Per-variant overrides
48
+
49
+ Variants override internal tokens directly, so target the variant class to change their colours:
50
+
51
+ ```css
52
+ /* assets/styles/setup/07.components/card-core.css */
53
+ :root {
54
+ /* shared geometry */
55
+ --card-core-border-radius: 0.8rem;
56
+ }
57
+
58
+ /* variant colour overrides — set on the variant class, not :root */
59
+ .card-core {
60
+ &.solid {
61
+ --_card-background-color: var(--brand-surface);
62
+ --_card-border: 0.1rem solid var(--brand-border);
63
+ }
64
+
65
+ &.subtle {
66
+ --_card-background-color: color-mix(in oklab, var(--brand-surface) 50%, transparent);
67
+ --_card-border: 0.1rem solid var(--brand-border);
68
+ }
69
+
70
+ &.outline {
71
+ --_card-border: 0.15rem solid var(--brand-primary);
72
+ }
73
+ }
74
+ ```
75
+
76
+ ---
77
+
78
+ ## Blurred backdrop pattern
79
+
80
+ Set `--card-core-lower-background-image` and `--card-core-lower-background-color` to create a
81
+ blurred translucent layer behind the card content. The `::before` pseudo-element handles the blur
82
+ and the scale hides the blur-edge artefact.
83
+
84
+ ```css
85
+ .card-core {
86
+ &.hero-card {
87
+ --card-core-lower-background-image: url("/images/hero.jpg");
88
+ --card-core-lower-background-blur: 24px;
89
+ --card-core-lower-scale: 1.15;
90
+ --card-core-lower-background-color: rgb(0 0 0 / 30%); /* tint over image */
91
+ --card-core-background-color: transparent;
92
+ }
93
+ }
94
+ ```
95
+
96
+ Or inline for a single instance:
97
+
98
+ ```vue
99
+ <CardCore
100
+ variant="solid"
101
+ style="
102
+ --card-core-lower-background-image: url('/images/hero.jpg');
103
+ --card-core-lower-background-blur: 20px;
104
+ "
105
+ >
106
+ ...
107
+ </CardCore>
108
+ ```
109
+
110
+ ---
111
+
112
+ ## Page-scoped overrides
113
+
114
+ When a card appears in a specific page context, scope overrides under the page wrapper. No
115
+ `:deep()` is required (component styles are unscoped).
116
+
117
+ ```css
118
+ /* In the consuming page's unscoped <style> block */
119
+ .services-page {
120
+ .card-core {
121
+ --card-core-border-radius: 1.2rem;
122
+ --card-core-row-gap: 0;
123
+
124
+ &.solid {
125
+ --_card-background-color: var(--brand-surface-alt);
126
+ }
127
+ }
128
+ }
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Per-instance overrides via styleClassPassthrough
134
+
135
+ ```vue
136
+ <CardCore :style-class-passthrough="['featured']">
137
+ ...
138
+ </CardCore>
139
+ ```
140
+
141
+ ```css
142
+ .card-core {
143
+ &.featured {
144
+ --card-core-border: 0.2rem solid var(--brand-primary);
145
+ --card-core-box-shadow: 0 0.4rem 2rem rgb(0 0 0 / 15%);
146
+ --card-core-border-radius: 1.6rem;
147
+ }
148
+ }
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Card row targeting
154
+
155
+ Slot content is wrapped in `.card-row.card-row-{name}`. Target rows for padding, borders, or
156
+ backgrounds without modifying the component:
157
+
158
+ ```css
159
+ .card-core {
160
+ .card-row-header {
161
+ padding: 1.6rem;
162
+ background-color: var(--brand-primary);
163
+ color: white;
164
+ }
165
+
166
+ .card-row-body {
167
+ padding: 1.6rem;
168
+ }
169
+
170
+ .card-row-footer {
171
+ padding: 1.2rem 1.6rem;
172
+ border-top: 0.1rem solid var(--brand-border);
173
+ }
174
+ }
175
+ ```
@@ -41,50 +41,77 @@ watch(
41
41
  <style lang="css">
42
42
  @layer components {
43
43
  .card-core {
44
- --_inner-padding: 1rem;
45
- --_background-color: white;
46
- --_border-color: green;
47
- --_border-width: 0.2rem;
48
- --_box-shadow-color: transparent;
44
+ --_card-row-gap: var(--card-core-row-gap, 1rem);
45
+ --_card-padding: var(--card-core-inner-padding, 1rem);
46
+ --_card-lower-background-image: var(--card-core-lower-background-image, none);
47
+ --_card-lower-background-position: var(--card-core-lower-background-position, center);
48
+ --_card-lower-background-color: var(--card-core-lower-background-color, transparent);
49
+ --_card-lower-background-blur: var(--card-core-lower-background-blur, 16px);
50
+ --_card-lower-scale: var(--card-core-lower-scale, 1.1);
51
+ --_card-background-image: var(--card-core-background-image, none);
52
+ --_card-background-color: var(--card-core-background-color, transparent);
53
+ --_card-border: var(--card-core-border, 0.2rem solid var(--slate-08));
54
+ --_card-border-radius: var(--card-core-border-radius, 0.5rem);
55
+ --_card-box-shadow: var(--card-core-box-shadow, 0.1rem 0.1rem 0.4rem oklch(from var(--slate-08) l c h / 0.45));
49
56
 
50
57
  display: grid;
51
58
  grid-auto-flow: row;
52
- /* gap: 1rem; */
53
- border-radius: 0.5rem;
59
+ gap: var(--_card-row-gap);
60
+ border-radius: var(--_card-border-radius);
54
61
  overflow: hidden;
62
+ position: relative;
55
63
 
56
- background-color: var(--_background-color, transparent);
57
- border: var(--_border-width) solid var(--_border-color, transparent);
58
- box-shadow: 0 0 0.4rem var(--_border-width) var(--_box-shadow-color, transparent);
64
+ background-color: var(--_card-background-color, transparent);
65
+ border: var(--_card-border);
66
+ box-shadow: var(--_card-box-shadow);
67
+
68
+ &::before {
69
+ content: "";
70
+ position: absolute;
71
+ inset: 0;
72
+ background-color: var(--_card-lower-background-color);
73
+ background-image: var(--_card-lower-background-image);
74
+ background-position: var(--_card-lower-background-position, center);
75
+ background-size: cover;
76
+ background-repeat: no-repeat;
77
+ filter: blur(var(--_card-lower-background-blur));
78
+ scale: var(--_card-lower-scale);
79
+ z-index: 0;
80
+ }
81
+
82
+ > * {
83
+ position: relative;
84
+ z-index: 1;
85
+ }
59
86
 
60
87
  &.no-outline {
61
- --_border-width: 0;
88
+ --_card-border: 0 solid transparent;
89
+ --_card-box-shadow: none;
62
90
  }
63
91
 
64
92
  &.solid {
65
- --_background-color: light-dark(var(--slate-00), var(--slate-10));
66
- --_border-color: red;
93
+ --_card-background-color: light-dark(var(--slate-00), var(--slate-10));
94
+ --_card-border: 0.2rem solid var(--slate-08);
67
95
  }
68
96
 
69
97
  &.subtle {
70
- --_background-color: color-mix(in oklab, light-dark(var(--slate-01), var(--slate-08)) 50%, transparent);
71
- --_border-color: red;
98
+ --_card-background-color: color-mix(in oklab, light-dark(var(--slate-01), var(--slate-08)) 50%, transparent);
99
+ --_card-border: 0.2rem solid var(--slate-08);
72
100
  }
73
101
 
74
102
  &.soft {
75
- --_background-color: color-mix(in oklab, light-dark(var(--slate-01), var(--slate-08)) 20%, transparent);
76
- --_box-shadow-color: color-mix(in oklab, light-dark(var(--slate-02), var(--slate-08)) 80%, transparent);
103
+ --_card-background-color: color-mix(in oklab, light-dark(var(--slate-01), var(--slate-08)) 20%, transparent);
104
+ --_card-box-shadow-color: color-mix(in oklab, light-dark(var(--slate-02), var(--slate-08)) 80%, transparent);
77
105
  }
78
106
 
79
107
  &.outline {
80
- --_background-color: transparent;
81
- --_border-color: green;
108
+ --_card-background-color: transparent;
109
+ --_card-border: 0.2rem solid var(--slate-08);
82
110
  }
83
111
 
84
112
  &.has-dividers {
85
113
  .card-row + .card-row {
86
- /* border-top: 0.2rem solid var(--_border-color); */
87
- border-top: 0.2rem solid green;
114
+ border-top: 0.2rem solid var(--slate-08);
88
115
  }
89
116
  }
90
117
  }
@@ -0,0 +1,163 @@
1
+ # DisplayDialog — Consumer Styling Guide
2
+
3
+ ## Public token API
4
+
5
+ All `--display-dialog-*` tokens are the stable override surface. Because dialogs are site-wide UI
6
+ elements — not inline components — the recommended approach is to set tokens once in a **global CSS
7
+ file** rather than per-instance via `styleClassPassthrough`.
8
+
9
+ ### Overlay
10
+
11
+ | Token | Default | Controls |
12
+ |---|---|---|
13
+ | `--display-dialog-backdrop-blur` | `blur(0.5rem)` | CSS filter applied to content behind the overlay |
14
+ | `--display-dialog-backdrop-background` | `rgba(0, 0, 0, 0.5)` | Overlay scrim colour |
15
+ | `--display-dialog-z-index` | `999999` | Stacking order of the overlay |
16
+ | `--display-dialog-transition-duration` | `200ms` | Open/close transition speed (opacity, display, close-button hover) |
17
+
18
+ ### Dialog panel
19
+
20
+ | Token | Default | Controls |
21
+ |---|---|---|
22
+ | `--display-dialog-inner-border-radius` | `0.8rem` | Panel corner rounding |
23
+ | `--display-dialog-inner-border` | `0.1rem solid light-dark(var(--slate-10), var(--slate-02))` | Panel border shorthand |
24
+ | `--display-dialog-inner-outline` | `0.1rem solid light-dark(var(--slate-10), var(--slate-00))` | Panel outer outline (sits outside the border) |
25
+ | `--display-dialog-inner-background` | `light-dark(var(--slate-00), var(--slate-10))` | Panel background colour |
26
+
27
+ ### Header
28
+
29
+ | Token | Default | Controls |
30
+ |---|---|---|
31
+ | `--display-dialog-header-padding` | `1.2rem` | Header area padding |
32
+ | `--display-dialog-header-button-margin` | `0` | Close button margin |
33
+ | `--display-dialog-header-button-padding` | `0.4rem` | Close button padding |
34
+ | `--display-dialog-header-button-border` | `0.1rem solid transparent` | Close button border (resting) |
35
+ | `--display-dialog-header-button-border-radius` | `0.4rem` | Close button corner rounding |
36
+ | `--display-dialog-header-button-outline` | `0.1rem solid transparent` | Close button outline (resting) |
37
+ | `--display-dialog-header-button-border-hover` | `0.1rem solid light-dark(var(--slate-08), var(--slate-04))` | Close button border on hover/focus |
38
+ | `--display-dialog-header-button-outline-hover` | `0.1rem solid light-dark(var(--slate-08), var(--slate-04))` | Close button outline on hover/focus |
39
+ | `--display-dialog-header-button-icon-color` | `light-dark(var(--slate-09), var(--slate-02))` | Close button icon colour |
40
+ | `--display-dialog-header-button-icon-size` | `2.4rem` | Close button icon size |
41
+
42
+ ### Content & footer
43
+
44
+ | Token | Default | Controls |
45
+ |---|---|---|
46
+ | `--display-dialog-content-padding` | `1.2rem` | Content area padding |
47
+ | `--display-dialog-footer-gap` | `1.2rem` | Gap between footer action buttons |
48
+ | `--display-dialog-footer-padding` | `1.2rem` | Footer area padding |
49
+
50
+ ---
51
+
52
+ ## Global theming — recommended approach
53
+
54
+ Create `assets/styles/setup/07.components/display-dialog.css` in the consuming app and set tokens
55
+ on `:root`. This applies to every `DisplayDialog` across the site.
56
+
57
+ ```css
58
+ /* assets/styles/setup/07.components/display-dialog.css */
59
+ :root {
60
+ --display-dialog-backdrop-background: rgba(0, 0, 0, 0.6);
61
+ --display-dialog-inner-border-radius: 1.2rem;
62
+ --display-dialog-inner-background: var(--brand-surface);
63
+ --display-dialog-inner-border: 0.1rem solid var(--brand-border);
64
+ --display-dialog-inner-outline: none;
65
+ --display-dialog-transition-duration: 250ms;
66
+
67
+ --display-dialog-header-button-icon-color: var(--brand-text-muted);
68
+ --display-dialog-footer-gap: 0.8rem;
69
+ }
70
+ ```
71
+
72
+ ---
73
+
74
+ ## Per-variant overrides
75
+
76
+ The `fullscreen` variant bypasses `--_inner-border-radius`, `--_inner-border`, and
77
+ `--_inner-outline` directly (setting them to `0`/`none`). To restyle the fullscreen panel,
78
+ target the private tokens on `.inner.fullscreen`:
79
+
80
+ ```css
81
+ .display-dialog {
82
+ .inner {
83
+ &.confirm {
84
+ /* e.g. constrain confirm panel width further */
85
+ max-width: 40rem;
86
+ }
87
+
88
+ &.alert {
89
+ --display-dialog-inner-border: 0.2rem solid var(--color-danger);
90
+ }
91
+
92
+ &.fullscreen {
93
+ /* private tokens are the only lever here */
94
+ --_inner-background: var(--brand-surface-alt);
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Section targeting
103
+
104
+ Target `.header`, `.dialog-content`, and `.footer` directly to adjust layout within the panel:
105
+
106
+ ```css
107
+ .display-dialog {
108
+ .header {
109
+ border-bottom: 0.1rem solid var(--brand-border);
110
+ }
111
+
112
+ .dialog-content {
113
+ /* content area uses --display-dialog-content-padding */
114
+ }
115
+
116
+ .footer {
117
+ border-top: 0.1rem solid var(--brand-border);
118
+ justify-content: space-between; /* override default flex-end */
119
+ }
120
+ }
121
+ ```
122
+
123
+ ---
124
+
125
+ ## Page-scoped overrides
126
+
127
+ Because `<DisplayDialog>` renders inside the page's DOM tree (even though it is `position: fixed`),
128
+ you can scope overrides to a specific page without affecting the rest of the site:
129
+
130
+ ```css
131
+ /* In the consuming page's unscoped <style> block */
132
+ .checkout-page {
133
+ .display-dialog {
134
+ --display-dialog-inner-border-radius: 0;
135
+ --display-dialog-backdrop-background: rgba(0, 0, 0, 0.8);
136
+
137
+ .footer {
138
+ justify-content: stretch;
139
+ }
140
+ }
141
+ }
142
+ ```
143
+
144
+ ---
145
+
146
+ ## Per-instance overrides via styleClassPassthrough
147
+
148
+ Use sparingly — prefer global or page-scoped CSS for dialogs. When a single instance genuinely
149
+ needs a different look, pass a modifier class and target it alongside `.display-dialog`:
150
+
151
+ ```vue
152
+ <DisplayDialog :style-class-passthrough="['danger-dialog']" ...>
153
+ ```
154
+
155
+ ```css
156
+ .display-dialog.danger-dialog {
157
+ --display-dialog-backdrop-background: rgba(180, 0, 0, 0.4);
158
+
159
+ .inner {
160
+ --display-dialog-inner-border: 0.2rem solid var(--color-danger);
161
+ }
162
+ }
163
+ ```