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.
- package/.claude/settings.json +2 -4
- package/.claude/settings.local.json +22 -2
- package/.claude/skills/components/card-core.md +205 -0
- package/.claude/skills/components/display-dialog.md +128 -0
- package/.claude/skills/components/page-hero-highlights.md +1 -1
- package/.claude/skills/components/page-row.md +157 -0
- package/.claude/skills/components/services-card-grid.md +4 -4
- package/.claude/skills/components/services-section-grid.md +4 -4
- package/.claude/skills/components/tab-navigation.md +222 -0
- package/.claude/skills/composable-anchor-scroll.md +110 -28
- package/.claude/skills/composable-dialog-controls.md +55 -43
- package/.claude/skills/index.md +5 -2
- package/app/components/01.atoms/card/CONSUMER-STYLING.md +175 -0
- package/app/components/01.atoms/card/CardCore.vue +48 -21
- package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +163 -0
- package/app/components/01.atoms/display-dialog/DisplayDialog.vue +277 -0
- package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +177 -0
- package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +264 -0
- package/app/components/01.atoms/display-dialog/tests/__snapshots__/DisplayDialog.spec.ts.snap +18 -0
- package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +90 -0
- package/app/components/01.atoms/page-row/PageRow.vue +115 -0
- package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +311 -0
- package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +191 -0
- package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +145 -0
- package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +52 -11
- package/app/components/02.molecules/navigation/tab-navigation/tests/__snapshots__/TabNavigation.spec.ts.snap +12 -6
- package/app/components/{forms/ui → 05.forms/form-field}/FormField.vue +12 -19
- package/app/components/{forms/ui → 05.forms/form-wrapper}/FormWrapper.vue +6 -6
- package/app/components/{forms → 05.forms}/input-button/InputButtonCore.vue +2 -0
- package/app/components/{forms → 05.forms}/input-button/stories/InputButtonCore.stories.ts +1 -1
- package/app/components/{forms → 05.forms}/input-text/InputTextCore.vue +73 -73
- package/app/components/{forms → 05.forms}/input-text/variants/InputTextAsNumberWithLabel.vue +29 -29
- package/app/components/carousels/CarouselBasic.vue +99 -99
- package/app/components/carousels/CarouselInfinite.vue +150 -150
- package/app/components/deep-expanding-menu/DeepExpandingMenu.vue +111 -111
- package/app/components/responsive-header/ResponsiveHeader.vue +250 -282
- package/app/components/test-storybook/TestStorybook.vue +16 -16
- package/app/composables/tests/useDialogControls.spec.ts +34 -64
- package/app/composables/useAnchorScroll.ts +16 -3
- package/app/composables/useDialogControls.ts +19 -33
- package/app/composables/useFormControl.ts +0 -2
- package/app/composables/useNavCollapse.ts +5 -1
- package/app/layouts/default.vue +10 -7
- package/app/pages/auto-grid.vue +37 -20
- package/app/pages/banner-video.vue +2 -2
- package/app/pages/forms/examples/buttons/index.vue +189 -215
- package/app/pages/forms/examples/material/text-fields.vue +2 -2
- package/app/pages/grid-stack.vue +10 -10
- package/app/pages/index.vue +20 -20
- package/app/pages/samaritan.vue +4 -4
- package/app/pages/typography/hero-text.vue +6 -6
- package/app/pages/typography/index.vue +4 -4
- package/app/pages/typography/page-body.vue +4 -4
- package/app/pages/typography/page-heading.vue +4 -4
- package/app/pages/typography/page-link.vue +4 -4
- package/app/pages/ui/accordian.vue +4 -4
- package/app/pages/ui/anchor-scroll-tab-navigation.vue +191 -0
- package/app/pages/ui/anchor-scroll.vue +105 -71
- package/app/pages/ui/animated-svg-text.vue +4 -4
- package/app/pages/ui/block-decorators.vue +11 -11
- package/app/pages/ui/card-core.vue +9 -9
- package/app/pages/ui/carousel-basic.vue +4 -4
- package/app/pages/ui/carousel-flip.vue +2 -2
- package/app/pages/ui/carousel-infinite.vue +4 -4
- package/app/pages/ui/clipped-panels.vue +10 -10
- package/app/pages/ui/contact-section.vue +4 -4
- package/app/pages/ui/container-glow.vue +2 -3
- package/app/pages/ui/deep-expanding-menu.vue +138 -0
- package/app/pages/ui/display-avatar.vue +2 -2
- package/app/pages/ui/display-banner.vue +2 -2
- package/app/pages/ui/display-chip.vue +32 -25
- package/app/pages/ui/display-details.vue +6 -10
- package/app/pages/ui/display-dialog.vue +96 -131
- package/app/pages/ui/display-pill.vue +27 -33
- package/app/pages/ui/display-prompt.vue +4 -4
- package/app/pages/ui/display-toast.vue +2 -2
- package/app/pages/ui/expanding-panel.vue +12 -16
- package/app/pages/ui/glowing-border.vue +12 -12
- package/app/pages/ui/layout-grid-a.vue +6 -6
- package/app/pages/ui/layout-grid-b.vue +4 -4
- package/app/pages/ui/magnetic-navigation.vue +6 -6
- package/app/pages/ui/marquee-scroller.vue +2 -2
- package/app/pages/ui/mask-element.vue +2 -2
- package/app/pages/ui/masonry-columns.vue +4 -4
- package/app/pages/ui/masonry-grid-ordered-experiment.vue +4 -4
- package/app/pages/ui/masonry-grid-ordered.vue +4 -4
- package/app/pages/ui/masonry-grid-sorted.vue +4 -4
- package/app/pages/ui/masonry-grid.vue +4 -4
- package/app/pages/ui/navigation/navigation-horizontal.vue +12 -12
- package/app/pages/ui/navigation/tab-navigation.vue +493 -0
- package/app/pages/ui/page-row.vue +127 -0
- package/app/pages/ui/price-list.vue +4 -4
- package/app/pages/ui/profile-section.vue +4 -4
- package/app/pages/ui/qr-code/[componentName].vue +6 -6
- package/app/pages/ui/rotating-carousel.vue +16 -16
- package/app/pages/ui/scroll-reveal-image.vue +20 -20
- package/app/pages/ui/section-parallax.vue +7 -7
- package/app/pages/ui/services/colour-finder.vue +4 -4
- package/app/pages/ui/services/services-cards.vue +4 -4
- package/app/pages/ui/services/services-section/[slug].vue +4 -4
- package/app/pages/ui/services/services-sections-compact.vue +6 -6
- package/app/pages/ui/settings.vue +10 -10
- package/app/pages/ui/simple-grid.vue +2 -2
- package/app/pages/ui/slider-gallery.vue +5 -5
- package/app/pages/ui/tabs-y.vue +2 -3
- package/app/pages/ui/tabs.vue +6 -9
- package/app/pages/ui/tooltips.vue +9 -9
- package/app/pages/ui/wipe-away-vertical.vue +14 -14
- package/package.json +1 -1
- package/.claude/skills/components/layout-row.md +0 -239
- package/app/components/display-dialog/DisplayDialogCore.vue +0 -276
- package/app/components/display-dialog/variants/DisplayDialogConfirm.vue +0 -47
- package/app/components/display-dialog/variants/DisplayDialogScrollableContent.vue +0 -51
- package/app/components/forms/c12/utils.ts +0 -14
- package/app/components/layout-row/LayoutRow.vue +0 -171
- package/app/components/layout-row/stories/LayoutRow.stories.ts +0 -528
- package/app/pages/ui/layout-row.vue +0 -139
- /package/app/components/{forms → 05.forms}/form-errors/InputError.vue +0 -0
- /package/app/components/{forms → 05.forms}/form-errors/tests/InputError.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/form-fieldset/FormFieldset.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-webkit-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-chromium-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-firefox-darwin.png +0 -0
- /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-webkit-darwin.png +0 -0
- /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
- /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
- /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
- /package/app/components/{forms → 05.forms}/input-button/tests/InputButtonCore.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-button/tests/__snapshots__/InputButtonCore.spec.ts.snap +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox/MultipleCheckboxes.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox/SingleCheckbox.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox/tests/MultipleCheckboxes.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox/tests/data/tags.json +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioButton.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-copy/InputCopyCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-copy/stories/InputCopyCore.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-copy/tests/InputCopyCore.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-copy/tests/__snapshots__/InputCopyCore.spec.ts.snap +0 -0
- /package/app/components/{forms → 05.forms}/input-description/InputDescription.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-description/tests/InputDescription.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-label/InputLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-label/tests/InputLabel.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-number/InputNumberCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-number/variants/InputNumberDefault.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-radio/MultipleRadiobuttons.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-radio/tests/MultipleRadioButtons.spec.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-radio/tests/data/tags.json +0 -0
- /package/app/components/{forms → 05.forms}/input-range/InputRangeCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-range/variants/InputRangeDefault.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-select/InputSelectCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-select/variants/InputSelectWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-text/stories/InputPasswordWithLabel.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-text/stories/InputTextAsNumberWithLabel.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-text/stories/InputTextCore.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-text/stories/InputTextWithLabel.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-text/variants/InputPasswordWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-text/variants/InputTextWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-textarea/InputTextareaCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaCore.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaWithLabel.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/input-textarea/variants/InputTextareaWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/pending-effect/PendingEffect.vue +0 -0
- /package/app/components/{forms → 05.forms}/toggle-switch/ToggleSwitchCore.vue +0 -0
- /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchCore.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +0 -0
- /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabel.vue +0 -0
- /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +0 -0
- /package/app/components/{forms → 05.forms}/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -0
- /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
|
-
--
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
--
|
|
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
|
-
|
|
53
|
-
border-radius:
|
|
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(--
|
|
57
|
-
border: var(--
|
|
58
|
-
box-shadow:
|
|
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
|
-
--
|
|
88
|
+
--_card-border: 0 solid transparent;
|
|
89
|
+
--_card-box-shadow: none;
|
|
62
90
|
}
|
|
63
91
|
|
|
64
92
|
&.solid {
|
|
65
|
-
--
|
|
66
|
-
--
|
|
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
|
-
--
|
|
71
|
-
--
|
|
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
|
-
--
|
|
76
|
-
--
|
|
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
|
-
--
|
|
81
|
-
--
|
|
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
|
-
|
|
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
|
+
```
|